ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IGE3ZWE4ZTMuLjFkZWIzMzEgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtNTE4LDYgKzUxOCwxNCBAQAogRTogemFiQHphYmJvLm5ldAogRDogbWFlc3RybyBwY2kgc291bmQKIAorTjogRGF2aWQgQnJvd25lbGwKK0Q6IEtlcm5lbCBlbmdpbmVlciwgbWVudG9yLCBhbmQgZnJpZW5kLiAgTWFpbnRhaW5lZCBVU0IgRUhDSSBhbmQKK0Q6IGdhZGdldCBsYXllcnMsIFNQSSBzdWJzeXN0ZW0sIEdQSU8gc3Vic3lzdGVtLCBhbmQgbW9yZSB0aGFuIGEgZmV3CitEOiBkZXZpY2UgZHJpdmVycy4gIEhpcyBlbmNvdXJhZ2VtZW50IGFsc28gaGVscGVkIG1hbnkgZW5naW5lZXJzIGdldAorRDogc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBMaW51eCBrZXJuZWwuICBEYXZpZCBwYXNzZWQgYXdheSBpbiBlYXJseQorRDogMjAxMSwgYW5kIHdpbGwgYmUgZ3JlYXRseSBtaXNzZWQuCitXOiBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxMS80LzUvMzYKKwogTjogR2FyeSBCcnViYWtlcgogRTogeGF2eWVyQGl4Lm5ldGNvbS5jb20KIEQ6IFVTQiBTZXJpYWwgRW1wZWcgRW1wZWctY2FyIE1hcmsgSS9JSSBEcml2ZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtYmFja2xpZ2h0LWRyaXZlci1hZHA4ODcwIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1iYWNrbGlnaHQtZHJpdmVyLWFkcDg4NzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMWRiZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtYmFja2xpZ2h0LWRyaXZlci1hZHA4ODcwCkBAIC0wLDAgKzEsNTYgQEAKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi88YW1iaWVudCBsaWdodCB6b25lPl9tYXgKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9sMV9kYXlsaWdodF9tYXgKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9sMl9icmlnaHRfbWF4CitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDNfb2ZmaWNlX21heAorV2hhdDoJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L2w0X2luZG9vcl9tYXgKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9sNV9kYXJrX21heAorRGF0ZToJCU1haSAyMDExCitLZXJuZWxWZXJzaW9uOgkyLjYuNDAKK0NvbnRhY3Q6CWRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitEZXNjcmlwdGlvbjoKKwkJQ29udHJvbCB0aGUgbWF4aW11bSBicmlnaHRuZXNzIGZvciA8YW1iaWVudCBsaWdodCB6b25lPgorCQlvbiB0aGlzIDxiYWNrbGlnaHQ+LiBWYWx1ZXMgYXJlIGJldHdlZW4gMCBhbmQgMTI3LiBUaGlzIGZpbGUKKwkJd2lsbCBhbHNvIHNob3cgdGhlIGJyaWdodG5lc3MgbGV2ZWwgc3RvcmVkIGZvciB0aGlzCisJCTxhbWJpZW50IGxpZ2h0IHpvbmU+LgorCitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vPGFtYmllbnQgbGlnaHQgem9uZT5fZGltCitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDJfYnJpZ2h0X2RpbQorV2hhdDoJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L2wzX29mZmljZV9kaW0KK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9sNF9pbmRvb3JfZGltCitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDVfZGFya19kaW0KK0RhdGU6CQlNYWkgMjAxMQorS2VybmVsVmVyc2lvbjoJMi42LjQwCitDb250YWN0OglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworRGVzY3JpcHRpb246CisJCUNvbnRyb2wgdGhlIGRpbSBicmlnaHRuZXNzIGZvciA8YW1iaWVudCBsaWdodCB6b25lPgorCQlvbiB0aGlzIDxiYWNrbGlnaHQ+LiBWYWx1ZXMgYXJlIGJldHdlZW4gMCBhbmQgMTI3LCB0eXBpY2FsbHkKKwkJc2V0IHRvIDAuIEZ1bGwgb2ZmIHdoZW4gdGhlIGJhY2tsaWdodCBpcyBkaXNhYmxlZC4KKwkJVGhpcyBmaWxlIHdpbGwgYWxzbyBzaG93IHRoZSBkaW0gYnJpZ2h0bmVzcyBsZXZlbCBzdG9yZWQgZm9yCisJCXRoaXMgPGFtYmllbnQgbGlnaHQgem9uZT4uCisKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9hbWJpZW50X2xpZ2h0X2xldmVsCitEYXRlOgkJTWFpIDIwMTEKK0tlcm5lbFZlcnNpb246CTIuNi40MAorQ29udGFjdDoJZGV2aWNlLWRyaXZlcnMtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlHZXQgY29udmVyc2lvbiB2YWx1ZSBvZiB0aGUgbGlnaHQgc2Vuc29yLgorCQlUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgZXZlcnkgODAgbXMgKHdoZW4gdGhlIGxpZ2h0IHNlbnNvcgorCQlpcyBlbmFibGVkKS4gUmV0dXJucyBpbnRlZ2VyIGJldHdlZW4gMCAoZGFyaykgYW5kCisJCTgwMDAgKG1heCBhbWJpZW50IGJyaWdodG5lc3MpCisKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9hbWJpZW50X2xpZ2h0X3pvbmUKK0RhdGU6CQlNYWkgMjAxMQorS2VybmVsVmVyc2lvbjoJMi42LjQwCitDb250YWN0OglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworRGVzY3JpcHRpb246CisJCUdldC9TZXQgY3VycmVudCBhbWJpZW50IGxpZ2h0IHpvbmUuIFJlYWRpbmcgcmV0dXJucworCQlpbnRlZ2VyIGJldHdlZW4gMS4uNSAoMSA9IGRheWxpZ2h0LCAyID0gYnJpZ2h0LCAuLi4sIDUgPSBkYXJrKS4KKwkJV3JpdGluZyBhIHZhbHVlIGJldHdlZW4gMS4uNSBmb3JjZXMgdGhlIGJhY2tsaWdodCBjb250cm9sbGVyCisJCXRvIGVudGVyIHRoZSBjb3JyZXNwb25kaW5nIGFtYmllbnQgbGlnaHQgem9uZS4KKwkJV3JpdGluZyAwIHJldHVybnMgdG8gbm9ybWFsL2F1dG9tYXRpYyBhbWJpZW50IGxpZ2h0IGxldmVsCisJCW9wZXJhdGlvbi4gVGhlIGFtYmllbnQgbGlnaHQgc2Vuc2luZyBmZWF0dXJlIG9uIHRoZXNlIGRldmljZXMKKwkJaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBBUEkgZG9jdW1lbnRlZCBpbgorCQlEb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtY2xhc3MtYmFja2xpZ2h0LgorCQlJdCBjYW4gYmUgZW5hYmxlZCBieSB3cml0aW5nIHRoZSB2YWx1ZSBzdG9yZWQgaW4KKwkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbWF4X2JyaWdodG5lc3MgdG8KKwkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vYnJpZ2h0bmVzcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMgYi9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKaW5kZXggNWY0ODI4YTAuLmIxNzU4MDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcworKysgYi9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKQEAgLTIsMTMgKzIsNyBAQAogPT09PT0KIAogVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgbGlzdCBvZiB0aGUgbWluaW11bSBsZXZlbHMgb2YKLXNvZnR3YXJlIG5lY2Vzc2FyeSB0byBydW4gdGhlIDIuNiBrZXJuZWxzLCBhcyB3ZWxsIGFzIHByb3ZpZGUgYnJpZWYKLWluc3RydWN0aW9ucyByZWdhcmRpbmcgYW55IG90aGVyICJHb3RjaGFzIiB1c2VycyBtYXkgZW5jb3VudGVyIHdoZW4KLXRyeWluZyBsaWZlIG9uIHRoZSBCbGVlZGluZyBFZGdlLiAgSWYgdXBncmFkaW5nIGZyb20gYSBwcmUtMi40LngKLWtlcm5lbCwgcGxlYXNlIGNvbnN1bHQgdGhlIENoYW5nZXMgZmlsZSBpbmNsdWRlZCB3aXRoIDIuNC54IGtlcm5lbHMgZm9yCi1hZGRpdGlvbmFsIGluZm9ybWF0aW9uOyBtb3N0IG9mIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBub3QgYmUgcmVwZWF0ZWQKLWhlcmUuICBCYXNpY2FsbHksIHRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdXIgc3lzdGVtIGlzIGFscmVhZHkKLWZ1bmN0aW9uYWwgYW5kIHJ1bm5pbmcgYXQgbGVhc3QgMi40Lngga2VybmVscy4KK3NvZnR3YXJlIG5lY2Vzc2FyeSB0byBydW4gdGhlIDMuMCBrZXJuZWxzLgogCiBUaGlzIGRvY3VtZW50IGlzIG9yaWdpbmFsbHkgYmFzZWQgb24gbXkgIkNoYW5nZXMiIGZpbGUgZm9yIDIuMC54IGtlcm5lbHMKIGFuZCB0aGVyZWZvcmUgb3dlcyBjcmVkaXQgdG8gdGhlIHNhbWUgcGVvcGxlIGFzIHRoYXQgZmlsZSAoSmFyZWQgTWF1Y2gsCkBAIC0yMiwxMSArMTYsMTAgQEAKIGVuY291bnRlcmVkIGEgYnVnISAgSWYgeW91J3JlIHVuc3VyZSB3aGF0IHZlcnNpb24geW91J3JlIGN1cnJlbnRseQogcnVubmluZywgdGhlIHN1Z2dlc3RlZCBjb21tYW5kIHNob3VsZCB0ZWxsIHlvdS4KIAotQWdhaW4sIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgbGlzdCBhc3N1bWVzIHlvdSBhcmUgYWxyZWFkeQotZnVuY3Rpb25hbGx5IHJ1bm5pbmcgYSBMaW51eCAyLjQga2VybmVsLiAgQWxzbywgbm90IGFsbCB0b29scyBhcmUKLW5lY2Vzc2FyeSBvbiBhbGwgc3lzdGVtczsgb2J2aW91c2x5LCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgSVNETgotaGFyZHdhcmUsIGZvciBleGFtcGxlLCB5b3UgcHJvYmFibHkgbmVlZG4ndCBjb25jZXJuIHlvdXJzZWxmIHdpdGgKLWlzZG40ay11dGlscy4KK0FnYWluLCBrZWVwIGluIG1pbmQgdGhhdCB0aGlzIGxpc3QgYXNzdW1lcyB5b3UgYXJlIGFscmVhZHkgZnVuY3Rpb25hbGx5CitydW5uaW5nIGEgTGludXgga2VybmVsLiAgQWxzbywgbm90IGFsbCB0b29scyBhcmUgbmVjZXNzYXJ5IG9uIGFsbAorc3lzdGVtczsgb2J2aW91c2x5LCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgSVNETiBoYXJkd2FyZSwgZm9yIGV4YW1wbGUsCit5b3UgcHJvYmFibHkgbmVlZG4ndCBjb25jZXJuIHlvdXJzZWxmIHdpdGggaXNkbjRrLXV0aWxzLgogCiBvICBHbnUgQyAgICAgICAgICAgICAgICAgIDMuMiAgICAgICAgICAgICAgICAgICAgICMgZ2NjIC0tdmVyc2lvbgogbyAgR251IG1ha2UgICAgICAgICAgICAgICAzLjgwICAgICAgICAgICAgICAgICAgICAjIG1ha2UgLS12ZXJzaW9uCkBAIC0xMTQsMTIgKzEwNywxMiBAQAogCiBJZiB0aGUgdW50aGlua2FibGUgaGFwcGVucyBhbmQgeW91ciBrZXJuZWwgb29wc2VzLCB5b3UgbWF5IG5lZWQgdGhlCiBrc3ltb29wcyB0b29sIHRvIGRlY29kZSBpdCwgYnV0IGluIG1vc3QgY2FzZXMgeW91IGRvbid0LgotSW4gdGhlIDIuNiBrZXJuZWwgaXQgaXMgZ2VuZXJhbGx5IHByZWZlcnJlZCB0byBidWlsZCB0aGUga2VybmVsIHdpdGgKLUNPTkZJR19LQUxMU1lNUyBzbyB0aGF0IGl0IHByb2R1Y2VzIHJlYWRhYmxlIGR1bXBzIHRoYXQgY2FuIGJlIHVzZWQgYXMtaXMKLSh0aGlzIGFsc28gcHJvZHVjZXMgYmV0dGVyIG91dHB1dCB0aGFuIGtzeW1vb3BzKS4KLUlmIGZvciBzb21lIHJlYXNvbiB5b3VyIGtlcm5lbCBpcyBub3QgYnVpbGQgd2l0aCBDT05GSUdfS0FMTFNZTVMgYW5kCi15b3UgaGF2ZSBubyB3YXkgdG8gcmVidWlsZCBhbmQgcmVwcm9kdWNlIHRoZSBPb3BzIHdpdGggdGhhdCBvcHRpb24sIHRoZW4KLXlvdSBjYW4gc3RpbGwgZGVjb2RlIHRoYXQgT29wcyB3aXRoIGtzeW1vb3BzLgorSXQgaXMgZ2VuZXJhbGx5IHByZWZlcnJlZCB0byBidWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0tBTExTWU1TIHNvCit0aGF0IGl0IHByb2R1Y2VzIHJlYWRhYmxlIGR1bXBzIHRoYXQgY2FuIGJlIHVzZWQgYXMtaXMgKHRoaXMgYWxzbworcHJvZHVjZXMgYmV0dGVyIG91dHB1dCB0aGFuIGtzeW1vb3BzKS4gIElmIGZvciBzb21lIHJlYXNvbiB5b3VyIGtlcm5lbAoraXMgbm90IGJ1aWxkIHdpdGggQ09ORklHX0tBTExTWU1TIGFuZCB5b3UgaGF2ZSBubyB3YXkgdG8gcmVidWlsZCBhbmQKK3JlcHJvZHVjZSB0aGUgT29wcyB3aXRoIHRoYXQgb3B0aW9uLCB0aGVuIHlvdSBjYW4gc3RpbGwgZGVjb2RlIHRoYXQgT29wcword2l0aCBrc3ltb29wcy4KIAogTW9kdWxlLUluaXQtVG9vbHMKIC0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNjEsOCArMjU0LDggQEAKIE5GUy11dGlscwogLS0tLS0tLS0tCiAKLUluIDIuNCBhbmQgZWFybGllciBrZXJuZWxzLCB0aGUgbmZzIHNlcnZlciBuZWVkZWQgdG8ga25vdyBhYm91dCBhbnkKLWNsaWVudCB0aGF0IGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIGZpbGVzIHZpYSBORlMuICBUaGlzCitJbiBhbmNpZW50ICgyLjQgYW5kIGVhcmxpZXIpIGtlcm5lbHMsIHRoZSBuZnMgc2VydmVyIG5lZWRlZCB0byBrbm93CithYm91dCBhbnkgY2xpZW50IHRoYXQgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgZmlsZXMgdmlhIE5GUy4gIFRoaXMKIGluZm9ybWF0aW9uIHdvdWxkIGJlIGdpdmVuIHRvIHRoZSBrZXJuZWwgYnkgIm1vdW50ZCIgd2hlbiB0aGUgY2xpZW50CiBtb3VudGVkIHRoZSBmaWxlc3lzdGVtLCBvciBieSAiZXhwb3J0ZnMiIGF0IHN5c3RlbSBzdGFydHVwLiAgZXhwb3J0ZnMKIHdvdWxkIHRha2UgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGNsaWVudHMgZnJvbSAvdmFyL2xpYi9uZnMvcm10YWIuCkBAIC0yNzIsMTEgKzI2NSwxMSBAQAogZmFpbC1vdmVyLiAgRXZlbiB3aGVuIHRoZSBzeXN0ZW0gaXMgd29ya2luZyB3ZWxsLCBybXRhYiBzdWZmZXJzIGZyb20KIGdldHRpbmcgbG90cyBvZiBvbGQgZW50cmllcyB0aGF0IG5ldmVyIGdldCByZW1vdmVkLgogCi1XaXRoIDIuNiB3ZSBoYXZlIHRoZSBvcHRpb24gb2YgaGF2aW5nIHRoZSBrZXJuZWwgdGVsbCBtb3VudGQgd2hlbiBpdAotZ2V0cyBhIHJlcXVlc3QgZnJvbSBhbiB1bmtub3duIGhvc3QsIGFuZCBtb3VudGQgY2FuIGdpdmUgYXBwcm9wcmlhdGUKLWV4cG9ydCBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsLiAgVGhpcyByZW1vdmVzIHRoZSBkZXBlbmRlbmN5IG9uCi1ybXRhYiBhbmQgbWVhbnMgdGhhdCB0aGUga2VybmVsIG9ubHkgbmVlZHMgdG8ga25vdyBhYm91dCBjdXJyZW50bHkKLWFjdGl2ZSBjbGllbnRzLgorV2l0aCBtb2Rlcm4ga2VybmVscyB3ZSBoYXZlIHRoZSBvcHRpb24gb2YgaGF2aW5nIHRoZSBrZXJuZWwgdGVsbCBtb3VudGQKK3doZW4gaXQgZ2V0cyBhIHJlcXVlc3QgZnJvbSBhbiB1bmtub3duIGhvc3QsIGFuZCBtb3VudGQgY2FuIGdpdmUKK2FwcHJvcHJpYXRlIGV4cG9ydCBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsLiAgVGhpcyByZW1vdmVzIHRoZQorZGVwZW5kZW5jeSBvbiBybXRhYiBhbmQgbWVhbnMgdGhhdCB0aGUga2VybmVsIG9ubHkgbmVlZHMgdG8ga25vdyBhYm91dAorY3VycmVudGx5IGFjdGl2ZSBjbGllbnRzLgogCiBUbyBlbmFibGUgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG86CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgYi9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCmluZGV4IDU4YjBiZjkuLmZhNmUyNWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQpAQCAtNjgwLDggKzY4MCw4IEBACiAJCUNoYXB0ZXIgMTQ6IEFsbG9jYXRpbmcgbWVtb3J5CiAKIFRoZSBrZXJuZWwgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBnZW5lcmFsIHB1cnBvc2UgbWVtb3J5IGFsbG9jYXRvcnM6Ci1rbWFsbG9jKCksIGt6YWxsb2MoKSwga2NhbGxvYygpLCBhbmQgdm1hbGxvYygpLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBBUEkKLWRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlbS4KK2ttYWxsb2MoKSwga3phbGxvYygpLCBrY2FsbG9jKCksIHZtYWxsb2MoKSwgYW5kIHZ6YWxsb2MoKS4gIFBsZWFzZSByZWZlciB0bwordGhlIEFQSSBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZW0uCiAKIFRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgcGFzc2luZyBhIHNpemUgb2YgYSBzdHJ1Y3QgaXMgdGhlIGZvbGxvd2luZzoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2Nncm91cHN0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9jZ3JvdXBzdGF0cy50eHQKaW5kZXggZWRhNDBmZC4uZDE2YTk4NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2Nncm91cHN0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvY2dyb3Vwc3RhdHMudHh0CkBAIC0yMSw3ICsyMSw3IEBACiBUbyBleHRyYWN0IGNncm91cCBzdGF0aXN0aWNzIGEgdXRpbGl0eSB2ZXJ5IHNpbWlsYXIgdG8gZ2V0ZGVsYXlzLmMKIGhhcyBiZWVuIGRldmVsb3BlZCwgdGhlIHNhbXBsZSBvdXRwdXQgb2YgdGhlIHV0aWxpdHkgaXMgc2hvd24gYmVsb3cKIAotfi9iYWxiaXIvY2dyb3Vwc3RhdHMgIyAuL2dldGRlbGF5cyAgLUMgIi9jZ3JvdXAvYSIKK34vYmFsYmlyL2Nncm91cHN0YXRzICMgLi9nZXRkZWxheXMgIC1DICIvc3lzL2ZzL2Nncm91cC9hIgogc2xlZXBpbmcgMSwgYmxvY2tlZCAwLCBydW5uaW5nIDEsIHN0b3BwZWQgMCwgdW5pbnRlcnJ1cHRpYmxlIDAKLX4vYmFsYmlyL2Nncm91cHN0YXRzICMgLi9nZXRkZWxheXMgIC1DICIvY2dyb3VwIgorfi9iYWxiaXIvY2dyb3Vwc3RhdHMgIyAuL2dldGRlbGF5cyAgLUMgIi9zeXMvZnMvY2dyb3VwIgogc2xlZXBpbmcgMTU1LCBibG9ja2VkIDAsIHJ1bm5pbmcgMSwgc3RvcHBlZCAwLCB1bmludGVycnVwdGlibGUgMgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Jsa2lvLWNvbnRyb2xsZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Jsa2lvLWNvbnRyb2xsZXIudHh0CmluZGV4IDQ2NTM1MWQuLjg0ZjBhMTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9ibGtpby1jb250cm9sbGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvYmxraW8tY29udHJvbGxlci50eHQKQEAgLTI4LDE2ICsyOCwxOSBAQAogLSBFbmFibGUgZ3JvdXAgc2NoZWR1bGluZyBpbiBDRlEKIAlDT05GSUdfQ0ZRX0dST1VQX0lPU0NIRUQ9eQogCi0tIENvbXBpbGUgYW5kIGJvb3QgaW50byBrZXJuZWwgYW5kIG1vdW50IElPIGNvbnRyb2xsZXIgKGJsa2lvKS4KKy0gQ29tcGlsZSBhbmQgYm9vdCBpbnRvIGtlcm5lbCBhbmQgbW91bnQgSU8gY29udHJvbGxlciAoYmxraW8pOyBzZWUKKyAgY2dyb3Vwcy50eHQsIFdoeSBhcmUgY2dyb3VwcyBuZWVkZWQ/LgogCi0JbW91bnQgLXQgY2dyb3VwIC1vIGJsa2lvIG5vbmUgL2Nncm91cAorCW1vdW50IC10IHRtcGZzIGNncm91cF9yb290IC9zeXMvZnMvY2dyb3VwCisJbWtkaXIgL3N5cy9mcy9jZ3JvdXAvYmxraW8KKwltb3VudCAtdCBjZ3JvdXAgLW8gYmxraW8gbm9uZSAvc3lzL2ZzL2Nncm91cC9ibGtpbwogCiAtIENyZWF0ZSB0d28gY2dyb3VwcwotCW1rZGlyIC1wIC9jZ3JvdXAvdGVzdDEvIC9jZ3JvdXAvdGVzdDIKKwlta2RpciAtcCAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0MS8gL3N5cy9mcy9jZ3JvdXAvYmxraW8vdGVzdDIKIAogLSBTZXQgd2VpZ2h0cyBvZiBncm91cCB0ZXN0MSBhbmQgdGVzdDIKLQllY2hvIDEwMDAgPiAvY2dyb3VwL3Rlc3QxL2Jsa2lvLndlaWdodAotCWVjaG8gNTAwID4gL2Nncm91cC90ZXN0Mi9ibGtpby53ZWlnaHQKKwllY2hvIDEwMDAgPiAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0MS9ibGtpby53ZWlnaHQKKwllY2hvIDUwMCA+IC9zeXMvZnMvY2dyb3VwL2Jsa2lvL3Rlc3QyL2Jsa2lvLndlaWdodAogCiAtIENyZWF0ZSB0d28gc2FtZSBzaXplIGZpbGVzIChzYXkgNTEyTUIgZWFjaCkgb24gc2FtZSBkaXNrIChmaWxlMSwgZmlsZTIpIGFuZAogICBsYXVuY2ggdHdvIGRkIHRocmVhZHMgaW4gZGlmZmVyZW50IGNncm91cCB0byByZWFkIHRob3NlIGZpbGVzLgpAQCAtNDYsMTIgKzQ5LDEyIEBACiAJZWNobyAzID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzCiAKIAlkZCBpZj0vbW50L3NkYi96ZXJvZmlsZTEgb2Y9L2Rldi9udWxsICYKLQllY2hvICQhID4gL2Nncm91cC90ZXN0MS90YXNrcwotCWNhdCAvY2dyb3VwL3Rlc3QxL3Rhc2tzCisJZWNobyAkISA+IC9zeXMvZnMvY2dyb3VwL2Jsa2lvL3Rlc3QxL3Rhc2tzCisJY2F0IC9zeXMvZnMvY2dyb3VwL2Jsa2lvL3Rlc3QxL3Rhc2tzCiAKIAlkZCBpZj0vbW50L3NkYi96ZXJvZmlsZTIgb2Y9L2Rldi9udWxsICYKLQllY2hvICQhID4gL2Nncm91cC90ZXN0Mi90YXNrcwotCWNhdCAvY2dyb3VwL3Rlc3QyL3Rhc2tzCisJZWNobyAkISA+IC9zeXMvZnMvY2dyb3VwL2Jsa2lvL3Rlc3QyL3Rhc2tzCisJY2F0IC9zeXMvZnMvY2dyb3VwL2Jsa2lvL3Rlc3QyL3Rhc2tzCiAKIC0gQXQgbWFjcm8gbGV2ZWwsIGZpcnN0IGRkIHNob3VsZCBmaW5pc2ggZmlyc3QuIFRvIGdldCBtb3JlIHByZWNpc2UgZGF0YSwga2VlcAogICBvbiBsb29raW5nIGF0ICh3aXRoIHRoZSBoZWxwIG9mIHNjcmlwdCksIGF0IGJsa2lvLmRpc2tfdGltZSBhbmQKQEAgLTY4LDEzICs3MSwxMyBAQAogLSBFbmFibGUgdGhyb3R0bGluZyBpbiBibG9jayBsYXllcgogCUNPTkZJR19CTEtfREVWX1RIUk9UVExJTkc9eQogCi0tIE1vdW50IGJsa2lvIGNvbnRyb2xsZXIKLSAgICAgICAgbW91bnQgLXQgY2dyb3VwIC1vIGJsa2lvIG5vbmUgL2Nncm91cC9ibGtpbworLSBNb3VudCBibGtpbyBjb250cm9sbGVyIChzZWUgY2dyb3Vwcy50eHQsIFdoeSBhcmUgY2dyb3VwcyBuZWVkZWQ/KQorICAgICAgICBtb3VudCAtdCBjZ3JvdXAgLW8gYmxraW8gbm9uZSAvc3lzL2ZzL2Nncm91cC9ibGtpbwogCiAtIFNwZWNpZnkgYSBiYW5kd2lkdGggcmF0ZSBvbiBwYXJ0aWN1bGFyIGRldmljZSBmb3Igcm9vdCBncm91cC4gVGhlIGZvcm1hdAogICBmb3IgcG9saWN5IGlzICI8bWFqb3I+OjxtaW5vcj4gIDxieWVzX3Blcl9zZWNvbmQ+Ii4KIAotICAgICAgICBlY2hvICI4OjE2ICAxMDQ4NTc2IiA+IC9jZ3JvdXAvYmxraW8vYmxraW8ucmVhZF9icHNfZGV2aWNlCisgICAgICAgIGVjaG8gIjg6MTYgIDEwNDg1NzYiID4gL3N5cy9mcy9jZ3JvdXAvYmxraW8vYmxraW8udGhyb3R0bGUucmVhZF9icHNfZGV2aWNlCiAKICAgQWJvdmUgd2lsbCBwdXQgYSBsaW1pdCBvZiAxTUIvc2Vjb25kIG9uIHJlYWRzIGhhcHBlbmluZyBmb3Igcm9vdCBncm91cAogICBvbiBkZXZpY2UgaGF2aW5nIG1ham9yL21pbm9yIG51bWJlciA4OjE2LgpAQCAtODcsNyArOTAsNyBAQAogICAgICAgICAxMDI0KzAgcmVjb3JkcyBvdXQKICAgICAgICAgNDE5NDMwNCBieXRlcyAoNC4yIE1CKSBjb3BpZWQsIDQuMDAwMSBzLCAxLjAgTUIvcwogCi0gTGltaXRzIGZvciB3cml0ZXMgY2FuIGJlIHB1dCB1c2luZyBibGtpby53cml0ZV9icHNfZGV2aWNlIGZpbGUuCisgTGltaXRzIGZvciB3cml0ZXMgY2FuIGJlIHB1dCB1c2luZyBibGtpby50aHJvdHRsZS53cml0ZV9icHNfZGV2aWNlIGZpbGUuCiAKIEhpZXJhcmNoaWNhbCBDZ3JvdXBzCiA9PT09PT09PT09PT09PT09PT09PQpAQCAtMTA4LDcgKzExMSw3IEBACiAgIENGUSBhbmQgdGhyb3R0bGluZyB3aWxsIHByYWN0aWNhbGx5IHRyZWF0IGFsbCBncm91cHMgYXQgc2FtZSBsZXZlbC4KIAogCQkJCXBpdm90Ci0JCQkgICAgIC8gIHwgICBcICBcCisJCQkgICAgIC8gIC8gICBcICBcCiAJCQlyb290ICB0ZXN0MSB0ZXN0MiAgdGVzdDMKIAogICBEb3duIHRoZSBsaW5lIHdlIGNhbiBpbXBsZW1lbnQgaGllcmFyY2hpY2FsIGFjY291bnRpbmcvY29udHJvbCBzdXBwb3J0CkBAIC0xNDksNyArMTUyLDcgQEAKIAogCSAgRm9sbG93aW5nIGlzIHRoZSBmb3JtYXQuCiAKLQkgICNlY2hvIGRldl9tYWo6ZGV2X21pbm9yIHdlaWdodCA+IC9wYXRoL3RvL2Nncm91cC9ibGtpby53ZWlnaHRfZGV2aWNlCisJICAjIGVjaG8gZGV2X21hajpkZXZfbWlub3Igd2VpZ2h0ID4gYmxraW8ud2VpZ2h0X2RldmljZQogCSAgQ29uZmlndXJlIHdlaWdodD0zMDAgb24gL2Rldi9zZGIgKDg6MTYpIGluIHRoaXMgY2dyb3VwCiAJICAjIGVjaG8gODoxNiAzMDAgPiBibGtpby53ZWlnaHRfZGV2aWNlCiAJICAjIGNhdCBibGtpby53ZWlnaHRfZGV2aWNlCkBAIC0yODMsMjggKzI4NiwyOCBAQAogCSAgc3BlY2lmaWVkIGluIGJ5dGVzIHBlciBzZWNvbmQuIFJ1bGVzIGFyZSBwZXIgZGVpdmNlLiBGb2xsb3dpbmcgaXMKIAkgIHRoZSBmb3JtYXQuCiAKLSAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9ieXRlc19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby5yZWFkX2Jwc19kZXZpY2UKKyAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9ieXRlc19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby50aHJvdHRsZS5yZWFkX2Jwc19kZXZpY2UKIAogLSBibGtpby50aHJvdHRsZS53cml0ZV9icHNfZGV2aWNlCiAJLSBTcGVjaWZpZXMgdXBwZXIgbGltaXQgb24gV1JJVEUgcmF0ZSB0byB0aGUgZGV2aWNlLiBJTyByYXRlIGlzCiAJICBzcGVjaWZpZWQgaW4gYnl0ZXMgcGVyIHNlY29uZC4gUnVsZXMgYXJlIHBlciBkZWl2Y2UuIEZvbGxvd2luZyBpcwogCSAgdGhlIGZvcm1hdC4KIAotICBlY2hvICI8bWFqb3I+OjxtaW5vcj4gIDxyYXRlX2J5dGVzX3Blcl9zZWNvbmQ+IiA+IC9jZ3JwL2Jsa2lvLndyaXRlX2Jwc19kZXZpY2UKKyAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9ieXRlc19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby50aHJvdHRsZS53cml0ZV9icHNfZGV2aWNlCiAKIC0gYmxraW8udGhyb3R0bGUucmVhZF9pb3BzX2RldmljZQogCS0gU3BlY2lmaWVzIHVwcGVyIGxpbWl0IG9uIFJFQUQgcmF0ZSBmcm9tIHRoZSBkZXZpY2UuIElPIHJhdGUgaXMKIAkgIHNwZWNpZmllZCBpbiBJTyBwZXIgc2Vjb25kLiBSdWxlcyBhcmUgcGVyIGRlaXZjZS4gRm9sbG93aW5nIGlzCiAJICB0aGUgZm9ybWF0LgogCi0gIGVjaG8gIjxtYWpvcj46PG1pbm9yPiAgPHJhdGVfaW9fcGVyX3NlY29uZD4iID4gL2NncnAvYmxraW8ucmVhZF9pb3BzX2RldmljZQorICBlY2hvICI8bWFqb3I+OjxtaW5vcj4gIDxyYXRlX2lvX3Blcl9zZWNvbmQ+IiA+IC9jZ3JwL2Jsa2lvLnRocm90dGxlLnJlYWRfaW9wc19kZXZpY2UKIAogLSBibGtpby50aHJvdHRsZS53cml0ZV9pb3BzX2RldmljZQogCS0gU3BlY2lmaWVzIHVwcGVyIGxpbWl0IG9uIFdSSVRFIHJhdGUgdG8gdGhlIGRldmljZS4gSU8gcmF0ZSBpcwogCSAgc3BlY2lmaWVkIGluIGlvIHBlciBzZWNvbmQuIFJ1bGVzIGFyZSBwZXIgZGVpdmNlLiBGb2xsb3dpbmcgaXMKIAkgIHRoZSBmb3JtYXQuCiAKLSAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9pb19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby53cml0ZV9pb3BzX2RldmljZQorICBlY2hvICI8bWFqb3I+OjxtaW5vcj4gIDxyYXRlX2lvX3Blcl9zZWNvbmQ+IiA+IC9jZ3JwL2Jsa2lvLnRocm90dGxlLndyaXRlX2lvcHNfZGV2aWNlCiAKIE5vdGU6IElmIGJvdGggQlcgYW5kIElPUFMgcnVsZXMgYXJlIHNwZWNpZmllZCBmb3IgYSBkZXZpY2UsIHRoZW4gSU8gaXMKICAgICAgIHN1YmplY3RkIHRvIGJvdGggdGhlIGNvbnN0cmFpbnRzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CmluZGV4IDBlZDk5ZjAuLmNkNjdlOTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKQEAgLTEzOCwxMSArMTM4LDExIEBACiB0aGUgYWRtaW4gY2FuIGVhc2lseSBzZXQgdXAgYSBzY3JpcHQgd2hpY2ggcmVjZWl2ZXMgZXhlYyBub3RpZmljYXRpb25zCiBhbmQgZGVwZW5kaW5nIG9uIHdobyBpcyBsYXVuY2hpbmcgdGhlIGJyb3dzZXIgaGUgY2FuCiAKLSAgICAgICAjIGVjaG8gYnJvd3Nlcl9waWQgPiAvbW50LzxyZXN0eXBlPi88dXNlcmNsYXNzPi90YXNrcworICAgICMgZWNobyBicm93c2VyX3BpZCA+IC9zeXMvZnMvY2dyb3VwLzxyZXN0eXBlPi88dXNlcmNsYXNzPi90YXNrcwogCiBXaXRoIG9ubHkgYSBzaW5nbGUgaGllcmFyY2h5LCBoZSBub3cgd291bGQgcG90ZW50aWFsbHkgaGF2ZSB0byBjcmVhdGUKIGEgc2VwYXJhdGUgY2dyb3VwIGZvciBldmVyeSBicm93c2VyIGxhdW5jaGVkIGFuZCBhc3NvY2lhdGUgaXQgd2l0aAotYXBwcm9wIG5ldHdvcmsgYW5kIG90aGVyIHJlc291cmNlIGNsYXNzLiAgVGhpcyBtYXkgbGVhZCB0bworYXBwcm9wcmlhdGUgbmV0d29yayBhbmQgb3RoZXIgcmVzb3VyY2UgY2xhc3MuICBUaGlzIG1heSBsZWFkIHRvCiBwcm9saWZlcmF0aW9uIG9mIHN1Y2ggY2dyb3Vwcy4KIAogQWxzbyBsZXRzIHNheSB0aGF0IHRoZSBhZG1pbmlzdHJhdG9yIHdvdWxkIGxpa2UgdG8gZ2l2ZSBlbmhhbmNlZCBuZXR3b3JrCkBAIC0xNTMsOSArMTUzLDkgQEAKIFdpdGggYWJpbGl0eSB0byB3cml0ZSBwaWRzIGRpcmVjdGx5IHRvIHJlc291cmNlIGNsYXNzZXMsIGl0J3MganVzdCBhCiBtYXR0ZXIgb2YgOgogCi0gICAgICAgIyBlY2hvIHBpZCA+IC9tbnQvbmV0d29yay88bmV3X2NsYXNzPi90YXNrcworICAgICAgICMgZWNobyBwaWQgPiAvc3lzL2ZzL2Nncm91cC9uZXR3b3JrLzxuZXdfY2xhc3M+L3Rhc2tzCiAgICAgICAgKGFmdGVyIHNvbWUgdGltZSkKLSAgICAgICAjIGVjaG8gcGlkID4gL21udC9uZXR3b3JrLzxvcmlnX2NsYXNzPi90YXNrcworICAgICAgICMgZWNobyBwaWQgPiAvc3lzL2ZzL2Nncm91cC9uZXR3b3JrLzxvcmlnX2NsYXNzPi90YXNrcwogCiBXaXRob3V0IHRoaXMgYWJpbGl0eSwgaGUgd291bGQgaGF2ZSB0byBzcGxpdCB0aGUgY2dyb3VwIGludG8KIG11bHRpcGxlIHNlcGFyYXRlIG9uZXMgYW5kIHRoZW4gYXNzb2NpYXRlIHRoZSBuZXcgY2dyb3VwcyB3aXRoIHRoZQpAQCAtMzEwLDIxICszMTAsMjQgQEAKIFRvIHN0YXJ0IGEgbmV3IGpvYiB0aGF0IGlzIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBjZ3JvdXAsIHVzaW5nCiB0aGUgImNwdXNldCIgY2dyb3VwIHN1YnN5c3RlbSwgdGhlIHN0ZXBzIGFyZSBzb21ldGhpbmcgbGlrZToKIAotIDEpIG1rZGlyIC9kZXYvY2dyb3VwCi0gMikgbW91bnQgLXQgY2dyb3VwIC1vY3B1c2V0IGNwdXNldCAvZGV2L2Nncm91cAotIDMpIENyZWF0ZSB0aGUgbmV3IGNncm91cCBieSBkb2luZyBta2RpcidzIGFuZCB3cml0ZSdzIChvciBlY2hvJ3MpIGluCi0gICAgdGhlIC9kZXYvY2dyb3VwIHZpcnR1YWwgZmlsZSBzeXN0ZW0uCi0gNCkgU3RhcnQgYSB0YXNrIHRoYXQgd2lsbCBiZSB0aGUgImZvdW5kaW5nIGZhdGhlciIgb2YgdGhlIG5ldyBqb2IuCi0gNSkgQXR0YWNoIHRoYXQgdGFzayB0byB0aGUgbmV3IGNncm91cCBieSB3cml0aW5nIGl0cyBwaWQgdG8gdGhlCi0gICAgL2Rldi9jZ3JvdXAgdGFza3MgZmlsZSBmb3IgdGhhdCBjZ3JvdXAuCi0gNikgZm9yaywgZXhlYyBvciBjbG9uZSB0aGUgam9iIHRhc2tzIGZyb20gdGhpcyBmb3VuZGluZyBmYXRoZXIgdGFzay4KKyAxKSBtb3VudCAtdCB0bXBmcyBjZ3JvdXBfcm9vdCAvc3lzL2ZzL2Nncm91cAorIDIpIG1rZGlyIC9zeXMvZnMvY2dyb3VwL2NwdXNldAorIDMpIG1vdW50IC10IGNncm91cCAtb2NwdXNldCBjcHVzZXQgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0CisgNCkgQ3JlYXRlIHRoZSBuZXcgY2dyb3VwIGJ5IGRvaW5nIG1rZGlyJ3MgYW5kIHdyaXRlJ3MgKG9yIGVjaG8ncykgaW4KKyAgICB0aGUgL3N5cy9mcy9jZ3JvdXAgdmlydHVhbCBmaWxlIHN5c3RlbS4KKyA1KSBTdGFydCBhIHRhc2sgdGhhdCB3aWxsIGJlIHRoZSAiZm91bmRpbmcgZmF0aGVyIiBvZiB0aGUgbmV3IGpvYi4KKyA2KSBBdHRhY2ggdGhhdCB0YXNrIHRvIHRoZSBuZXcgY2dyb3VwIGJ5IHdyaXRpbmcgaXRzIHBpZCB0byB0aGUKKyAgICAvc3lzL2ZzL2Nncm91cC9jcHVzZXQvdGFza3MgZmlsZSBmb3IgdGhhdCBjZ3JvdXAuCisgNykgZm9yaywgZXhlYyBvciBjbG9uZSB0aGUgam9iIHRhc2tzIGZyb20gdGhpcyBmb3VuZGluZyBmYXRoZXIgdGFzay4KIAogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgY29tbWFuZHMgd2lsbCBzZXR1cCBhIGNncm91cAogbmFtZWQgIkNoYXJsaWUiLCBjb250YWluaW5nIGp1c3QgQ1BVcyAyIGFuZCAzLCBhbmQgTWVtb3J5IE5vZGUgMSwKIGFuZCB0aGVuIHN0YXJ0IGEgc3Vic2hlbGwgJ3NoJyBpbiB0aGF0IGNncm91cDoKIAotICBtb3VudCAtdCBjZ3JvdXAgY3B1c2V0IC1vY3B1c2V0IC9kZXYvY2dyb3VwCi0gIGNkIC9kZXYvY2dyb3VwCisgIG1vdW50IC10IHRtcGZzIGNncm91cF9yb290IC9zeXMvZnMvY2dyb3VwCisgIG1rZGlyIC9zeXMvZnMvY2dyb3VwL2NwdXNldAorICBtb3VudCAtdCBjZ3JvdXAgY3B1c2V0IC1vY3B1c2V0IC9zeXMvZnMvY2dyb3VwL2NwdXNldAorICBjZCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKICAgbWtkaXIgQ2hhcmxpZQogICBjZCBDaGFybGllCiAgIC9iaW4vZWNobyAyLTMgPiBjcHVzZXQuY3B1cwpAQCAtMzQ1LDcgKzM0OCw3IEBACiB2aXJ0dWFsIGZpbGVzeXN0ZW0uCiAKIFRvIG1vdW50IGEgY2dyb3VwIGhpZXJhcmNoeSB3aXRoIGFsbCBhdmFpbGFibGUgc3Vic3lzdGVtcywgdHlwZToKLSMgbW91bnQgLXQgY2dyb3VwIHh4eCAvZGV2L2Nncm91cAorIyBtb3VudCAtdCBjZ3JvdXAgeHh4IC9zeXMvZnMvY2dyb3VwCiAKIFRoZSAieHh4IiBpcyBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlIGNncm91cCBjb2RlLCBidXQgd2lsbCBhcHBlYXIgaW4KIC9wcm9jL21vdW50cyBzbyBtYXkgYmUgYW55IHVzZWZ1bCBpZGVudGlmeWluZyBzdHJpbmcgdGhhdCB5b3UgbGlrZS4KQEAgLTM1NCwyMyArMzU3LDMyIEBACiBpZiBjcHVzZXRzIGFyZSBlbmFibGVkIHRoZSB1c2VyIHdpbGwgaGF2ZSB0byBwb3B1bGF0ZSB0aGUgY3B1cyBhbmQgbWVtcyBmaWxlcwogZm9yIGVhY2ggbmV3IGNncm91cCBjcmVhdGVkIGJlZm9yZSB0aGF0IGdyb3VwIGNhbiBiZSB1c2VkLgogCitBcyBleHBsYWluZWQgaW4gc2VjdGlvbiBgMS4yIFdoeSBhcmUgY2dyb3VwcyBuZWVkZWQ/JyB5b3Ugc2hvdWxkIGNyZWF0ZQorZGlmZmVyZW50IGhpZXJhcmNoaWVzIG9mIGNncm91cHMgZm9yIGVhY2ggc2luZ2xlIHJlc291cmNlIG9yIGdyb3VwIG9mCityZXNvdXJjZXMgeW91IHdhbnQgdG8gY29udHJvbC4gVGhlcmVmb3JlLCB5b3Ugc2hvdWxkIG1vdW50IGEgdG1wZnMgb24KKy9zeXMvZnMvY2dyb3VwIGFuZCBjcmVhdGUgZGlyZWN0b3JpZXMgZm9yIGVhY2ggY2dyb3VwIHJlc291cmNlIG9yIHJlc291cmNlCitncm91cC4KKworIyBtb3VudCAtdCB0bXBmcyBjZ3JvdXBfcm9vdCAvc3lzL2ZzL2Nncm91cAorIyBta2RpciAvc3lzL2ZzL2Nncm91cC9yZzEKKwogVG8gbW91bnQgYSBjZ3JvdXAgaGllcmFyY2h5IHdpdGgganVzdCB0aGUgY3B1c2V0IGFuZCBtZW1vcnkKIHN1YnN5c3RlbXMsIHR5cGU6Ci0jIG1vdW50IC10IGNncm91cCAtbyBjcHVzZXQsbWVtb3J5IGhpZXIxIC9kZXYvY2dyb3VwCisjIG1vdW50IC10IGNncm91cCAtbyBjcHVzZXQsbWVtb3J5IGhpZXIxIC9zeXMvZnMvY2dyb3VwL3JnMQogCiBUbyBjaGFuZ2UgdGhlIHNldCBvZiBzdWJzeXN0ZW1zIGJvdW5kIHRvIGEgbW91bnRlZCBoaWVyYXJjaHksIGp1c3QKIHJlbW91bnQgd2l0aCBkaWZmZXJlbnQgb3B0aW9uczoKLSMgbW91bnQgLW8gcmVtb3VudCxjcHVzZXQsYmxraW8gaGllcjEgL2Rldi9jZ3JvdXAKKyMgbW91bnQgLW8gcmVtb3VudCxjcHVzZXQsYmxraW8gaGllcjEgL3N5cy9mcy9jZ3JvdXAvcmcxCiAKIE5vdyBtZW1vcnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBoaWVyYXJjaHkgYW5kIGJsa2lvIGlzIGFkZGVkLgogCiBOb3RlIHRoaXMgd2lsbCBhZGQgYmxraW8gdG8gdGhlIGhpZXJhcmNoeSBidXQgd29uJ3QgcmVtb3ZlIG1lbW9yeSBvcgogY3B1c2V0LCBiZWNhdXNlIHRoZSBuZXcgb3B0aW9ucyBhcmUgYXBwZW5kZWQgdG8gdGhlIG9sZCBvbmVzOgotIyBtb3VudCAtbyByZW1vdW50LGJsa2lvIC9kZXYvY2dyb3VwCisjIG1vdW50IC1vIHJlbW91bnQsYmxraW8gL3N5cy9mcy9jZ3JvdXAvcmcxCiAKIFRvIFNwZWNpZnkgYSBoaWVyYXJjaHkncyByZWxlYXNlX2FnZW50OgogIyBtb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0LHJlbGVhc2VfYWdlbnQ9Ii9zYmluL2NwdXNldF9yZWxlYXNlX2FnZW50IiBcCi0gIHh4eCAvZGV2L2Nncm91cAorICB4eHggL3N5cy9mcy9jZ3JvdXAvcmcxCiAKIE5vdGUgdGhhdCBzcGVjaWZ5aW5nICdyZWxlYXNlX2FnZW50JyBtb3JlIHRoYW4gb25jZSB3aWxsIHJldHVybiBmYWlsdXJlLgogCkBAIC0zNzksMTcgKzM5MSwxNyBAQAogdGhlIGFiaWxpdHkgdG8gYXJiaXRyYXJpbHkgYmluZC91bmJpbmQgc3Vic3lzdGVtcyBmcm9tIGFuIGV4aXN0aW5nCiBjZ3JvdXAgaGllcmFyY2h5IGlzIGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUuCiAKLVRoZW4gdW5kZXIgL2Rldi9jZ3JvdXAgeW91IGNhbiBmaW5kIGEgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotdHJlZSBvZiB0aGUgY2dyb3VwcyBpbiB0aGUgc3lzdGVtLiBGb3IgaW5zdGFuY2UsIC9kZXYvY2dyb3VwCitUaGVuIHVuZGVyIC9zeXMvZnMvY2dyb3VwL3JnMSB5b3UgY2FuIGZpbmQgYSB0cmVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCit0cmVlIG9mIHRoZSBjZ3JvdXBzIGluIHRoZSBzeXN0ZW0uIEZvciBpbnN0YW5jZSwgL3N5cy9mcy9jZ3JvdXAvcmcxCiBpcyB0aGUgY2dyb3VwIHRoYXQgaG9sZHMgdGhlIHdob2xlIHN5c3RlbS4KIAogSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiByZWxlYXNlX2FnZW50OgotIyBlY2hvICIvc2Jpbi9uZXdfcmVsZWFzZV9hZ2VudCIgPiAvZGV2L2Nncm91cC9yZWxlYXNlX2FnZW50CisjIGVjaG8gIi9zYmluL25ld19yZWxlYXNlX2FnZW50IiA+IC9zeXMvZnMvY2dyb3VwL3JnMS9yZWxlYXNlX2FnZW50CiAKIEl0IGNhbiBhbHNvIGJlIGNoYW5nZWQgdmlhIHJlbW91bnQuCiAKLUlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBjZ3JvdXAgdW5kZXIgL2Rldi9jZ3JvdXA6Ci0jIGNkIC9kZXYvY2dyb3VwCitJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgY2dyb3VwIHVuZGVyIC9zeXMvZnMvY2dyb3VwL3JnMToKKyMgY2QgL3N5cy9mcy9jZ3JvdXAvcmcxCiAjIG1rZGlyIG15X2Nncm91cAogCiBOb3cgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhpcyBjZ3JvdXAuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1YWNjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1YWNjdC50eHQKaW5kZXggOGI5MzA5NC4uOWFkODVkZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdWFjY3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVhY2N0LnR4dApAQCAtMTAsMjYgKzEwLDI1IEBACiAKIEFjY291bnRpbmcgZ3JvdXBzIGNhbiBiZSBjcmVhdGVkIGJ5IGZpcnN0IG1vdW50aW5nIHRoZSBjZ3JvdXAgZmlsZXN5c3RlbS4KIAotIyBta2RpciAvY2dyb3VwcwotIyBtb3VudCAtdCBjZ3JvdXAgLW9jcHVhY2N0IG5vbmUgL2Nncm91cHMKKyMgbW91bnQgLXQgY2dyb3VwIC1vY3B1YWNjdCBub25lIC9zeXMvZnMvY2dyb3VwCiAKLVdpdGggdGhlIGFib3ZlIHN0ZXAsIHRoZSBpbml0aWFsIG9yIHRoZSBwYXJlbnQgYWNjb3VudGluZyBncm91cAotYmVjb21lcyB2aXNpYmxlIGF0IC9jZ3JvdXBzLiBBdCBib290dXAsIHRoaXMgZ3JvdXAgaW5jbHVkZXMgYWxsIHRoZQotdGFza3MgaW4gdGhlIHN5c3RlbS4gL2Nncm91cHMvdGFza3MgbGlzdHMgdGhlIHRhc2tzIGluIHRoaXMgY2dyb3VwLgotL2Nncm91cHMvY3B1YWNjdC51c2FnZSBnaXZlcyB0aGUgQ1BVIHRpbWUgKGluIG5hbm9zZWNvbmRzKSBvYnRhaW5lZCBieQotdGhpcyBncm91cCB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUgQ1BVIHRpbWUgb2J0YWluZWQgYnkgYWxsIHRoZSB0YXNrcworV2l0aCB0aGUgYWJvdmUgc3RlcCwgdGhlIGluaXRpYWwgb3IgdGhlIHBhcmVudCBhY2NvdW50aW5nIGdyb3VwIGJlY29tZXMKK3Zpc2libGUgYXQgL3N5cy9mcy9jZ3JvdXAuIEF0IGJvb3R1cCwgdGhpcyBncm91cCBpbmNsdWRlcyBhbGwgdGhlIHRhc2tzIGluCit0aGUgc3lzdGVtLiAvc3lzL2ZzL2Nncm91cC90YXNrcyBsaXN0cyB0aGUgdGFza3MgaW4gdGhpcyBjZ3JvdXAuCisvc3lzL2ZzL2Nncm91cC9jcHVhY2N0LnVzYWdlIGdpdmVzIHRoZSBDUFUgdGltZSAoaW4gbmFub3NlY29uZHMpIG9idGFpbmVkCitieSB0aGlzIGdyb3VwIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBDUFUgdGltZSBvYnRhaW5lZCBieSBhbGwgdGhlIHRhc2tzCiBpbiB0aGUgc3lzdGVtLgogCi1OZXcgYWNjb3VudGluZyBncm91cHMgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhlIHBhcmVudCBncm91cCAvY2dyb3Vwcy4KK05ldyBhY2NvdW50aW5nIGdyb3VwcyBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGUgcGFyZW50IGdyb3VwIC9zeXMvZnMvY2dyb3VwLgogCi0jIGNkIC9jZ3JvdXBzCisjIGNkIC9zeXMvZnMvY2dyb3VwCiAjIG1rZGlyIGcxCiAjIGVjaG8gJCQgPiBnMQogCiBUaGUgYWJvdmUgc3RlcHMgY3JlYXRlIGEgbmV3IGdyb3VwIGcxIGFuZCBtb3ZlIHRoZSBjdXJyZW50IHNoZWxsCiBwcm9jZXNzIChiYXNoKSBpbnRvIGl0LiBDUFUgdGltZSBjb25zdW1lZCBieSB0aGlzIGJhc2ggYW5kIGl0cyBjaGlsZHJlbgogY2FuIGJlIG9idGFpbmVkIGZyb20gZzEvY3B1YWNjdC51c2FnZSBhbmQgdGhlIHNhbWUgaXMgYWNjdW11bGF0ZWQgaW4KLS9jZ3JvdXBzL2NwdWFjY3QudXNhZ2UgYWxzby4KKy9zeXMvZnMvY2dyb3VwL2NwdWFjY3QudXNhZ2UgYWxzby4KIAogY3B1YWNjdC5zdGF0IGZpbGUgbGlzdHMgYSBmZXcgc3RhdGlzdGljcyB3aGljaCBmdXJ0aGVyIGRpdmlkZSB0aGUKIENQVSB0aW1lIG9idGFpbmVkIGJ5IHRoZSBjZ3JvdXAgaW50byB1c2VyIGFuZCBzeXN0ZW0gdGltZXMuIEN1cnJlbnRseQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0CmluZGV4IDk4YTMwODIuLjViMGQ3OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVzZXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQKQEAgLTY2MSwyMSArNjYxLDIxIEBACiAKIFRvIHN0YXJ0IGEgbmV3IGpvYiB0aGF0IGlzIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBjcHVzZXQsIHRoZSBzdGVwcyBhcmU6CiAKLSAxKSBta2RpciAvZGV2L2NwdXNldAotIDIpIG1vdW50IC10IGNncm91cCAtb2NwdXNldCBjcHVzZXQgL2Rldi9jcHVzZXQKKyAxKSBta2RpciAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKKyAyKSBtb3VudCAtdCBjZ3JvdXAgLW9jcHVzZXQgY3B1c2V0IC9zeXMvZnMvY2dyb3VwL2NwdXNldAogIDMpIENyZWF0ZSB0aGUgbmV3IGNwdXNldCBieSBkb2luZyBta2RpcidzIGFuZCB3cml0ZSdzIChvciBlY2hvJ3MpIGluCi0gICAgdGhlIC9kZXYvY3B1c2V0IHZpcnR1YWwgZmlsZSBzeXN0ZW0uCisgICAgdGhlIC9zeXMvZnMvY2dyb3VwL2NwdXNldCB2aXJ0dWFsIGZpbGUgc3lzdGVtLgogIDQpIFN0YXJ0IGEgdGFzayB0aGF0IHdpbGwgYmUgdGhlICJmb3VuZGluZyBmYXRoZXIiIG9mIHRoZSBuZXcgam9iLgogIDUpIEF0dGFjaCB0aGF0IHRhc2sgdG8gdGhlIG5ldyBjcHVzZXQgYnkgd3JpdGluZyBpdHMgcGlkIHRvIHRoZQotICAgIC9kZXYvY3B1c2V0IHRhc2tzIGZpbGUgZm9yIHRoYXQgY3B1c2V0LgorICAgIC9zeXMvZnMvY2dyb3VwL2NwdXNldCB0YXNrcyBmaWxlIGZvciB0aGF0IGNwdXNldC4KICA2KSBmb3JrLCBleGVjIG9yIGNsb25lIHRoZSBqb2IgdGFza3MgZnJvbSB0aGlzIGZvdW5kaW5nIGZhdGhlciB0YXNrLgogCiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBjb21tYW5kcyB3aWxsIHNldHVwIGEgY3B1c2V0CiBuYW1lZCAiQ2hhcmxpZSIsIGNvbnRhaW5pbmcganVzdCBDUFVzIDIgYW5kIDMsIGFuZCBNZW1vcnkgTm9kZSAxLAogYW5kIHRoZW4gc3RhcnQgYSBzdWJzaGVsbCAnc2gnIGluIHRoYXQgY3B1c2V0OgogCi0gIG1vdW50IC10IGNncm91cCAtb2NwdXNldCBjcHVzZXQgL2Rldi9jcHVzZXQKLSAgY2QgL2Rldi9jcHVzZXQKKyAgbW91bnQgLXQgY2dyb3VwIC1vY3B1c2V0IGNwdXNldCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKKyAgY2QgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0CiAgIG1rZGlyIENoYXJsaWUKICAgY2QgQ2hhcmxpZQogICAvYmluL2VjaG8gMi0zID4gY3B1c2V0LmNwdXMKQEAgLTcxMCwxNCArNzEwLDE0IEBACiB2aXJ0dWFsIGZpbGVzeXN0ZW0uCiAKIFRvIG1vdW50IGl0LCB0eXBlOgotIyBtb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0IGNwdXNldCAvZGV2L2NwdXNldAorIyBtb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0IGNwdXNldCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKIAotVGhlbiB1bmRlciAvZGV2L2NwdXNldCB5b3UgY2FuIGZpbmQgYSB0cmVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi10cmVlIG9mIHRoZSBjcHVzZXRzIGluIHRoZSBzeXN0ZW0uIEZvciBpbnN0YW5jZSwgL2Rldi9jcHVzZXQKK1RoZW4gdW5kZXIgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0IHlvdSBjYW4gZmluZCBhIHRyZWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKK3RyZWUgb2YgdGhlIGNwdXNldHMgaW4gdGhlIHN5c3RlbS4gRm9yIGluc3RhbmNlLCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKIGlzIHRoZSBjcHVzZXQgdGhhdCBob2xkcyB0aGUgd2hvbGUgc3lzdGVtLgogCi1JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgY3B1c2V0IHVuZGVyIC9kZXYvY3B1c2V0OgotIyBjZCAvZGV2L2NwdXNldAorSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGNwdXNldCB1bmRlciAvc3lzL2ZzL2Nncm91cC9jcHVzZXQ6CisjIGNkIC9zeXMvZnMvY2dyb3VwL2NwdXNldAogIyBta2RpciBteV9jcHVzZXQKIAogTm93IHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIHRoaXMgY3B1c2V0LgpAQCAtNzY1LDEyICs3NjUsMTIgQEAKIAogVGhlIGNvbW1hbmQKIAotbW91bnQgLXQgY3B1c2V0IFggL2Rldi9jcHVzZXQKK21vdW50IC10IGNwdXNldCBYIC9zeXMvZnMvY2dyb3VwL2NwdXNldAogCiBpcyBlcXVpdmFsZW50IHRvCiAKLW1vdW50IC10IGNncm91cCAtb2NwdXNldCxub3ByZWZpeCBYIC9kZXYvY3B1c2V0Ci1lY2hvICIvc2Jpbi9jcHVzZXRfcmVsZWFzZV9hZ2VudCIgPiAvZGV2L2NwdXNldC9yZWxlYXNlX2FnZW50Cittb3VudCAtdCBjZ3JvdXAgLW9jcHVzZXQsbm9wcmVmaXggWCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKK2VjaG8gIi9zYmluL2NwdXNldF9yZWxlYXNlX2FnZW50IiA+IC9zeXMvZnMvY2dyb3VwL2NwdXNldC9yZWxlYXNlX2FnZW50CiAKIDIuMiBBZGRpbmcvcmVtb3ZpbmcgY3B1cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZGV2aWNlcy50eHQKaW5kZXggNTdjYTRjOC4uMTY2MjRhN2Y4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2RldmljZXMudHh0CkBAIC0yMiwxNiArMjIsMTYgQEAKIEFuIGVudHJ5IGlzIGFkZGVkIHVzaW5nIGRldmljZXMuYWxsb3csIGFuZCByZW1vdmVkIHVzaW5nCiBkZXZpY2VzLmRlbnkuICBGb3IgaW5zdGFuY2UKIAotCWVjaG8gJ2MgMTozIG1yJyA+IC9jZ3JvdXBzLzEvZGV2aWNlcy5hbGxvdworCWVjaG8gJ2MgMTozIG1yJyA+IC9zeXMvZnMvY2dyb3VwLzEvZGV2aWNlcy5hbGxvdwogCiBhbGxvd3MgY2dyb3VwIDEgdG8gcmVhZCBhbmQgbWtub2QgdGhlIGRldmljZSB1c3VhbGx5IGtub3duIGFzCiAvZGV2L251bGwuICBEb2luZwogCi0JZWNobyBhID4gL2Nncm91cHMvMS9kZXZpY2VzLmRlbnkKKwllY2hvIGEgPiAvc3lzL2ZzL2Nncm91cC8xL2RldmljZXMuZGVueQogCiB3aWxsIHJlbW92ZSB0aGUgZGVmYXVsdCAnYSAqOiogcndtJyBlbnRyeS4gRG9pbmcKIAotCWVjaG8gYSA+IC9jZ3JvdXBzLzEvZGV2aWNlcy5hbGxvdworCWVjaG8gYSA+IC9zeXMvZnMvY2dyb3VwLzEvZGV2aWNlcy5hbGxvdwogCiB3aWxsIGFkZCB0aGUgJ2EgKjoqIHJ3bScgZW50cnkgdG8gdGhlIHdoaXRlbGlzdC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2ZyZWV6ZXItc3Vic3lzdGVtLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9mcmVlemVyLXN1YnN5c3RlbS50eHQKaW5kZXggNDFmMzdmZS4uYzIxZDc3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2ZyZWV6ZXItc3Vic3lzdGVtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0CkBAIC01OSwyOCArNTksMjggQEAKIAogKiBFeGFtcGxlcyBvZiB1c2FnZSA6CiAKLSAgICMgbWtkaXIgL2NvbnRhaW5lcnMKLSAgICMgbW91bnQgLXQgY2dyb3VwIC1vZnJlZXplciBmcmVlemVyICAvY29udGFpbmVycwotICAgIyBta2RpciAvY29udGFpbmVycy8wCi0gICAjIGVjaG8gJHNvbWVfcGlkID4gL2NvbnRhaW5lcnMvMC90YXNrcworICAgIyBta2RpciAvc3lzL2ZzL2Nncm91cC9mcmVlemVyCisgICAjIG1vdW50IC10IGNncm91cCAtb2ZyZWV6ZXIgZnJlZXplciAvc3lzL2ZzL2Nncm91cC9mcmVlemVyCisgICAjIG1rZGlyIC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIvMAorICAgIyBlY2hvICRzb21lX3BpZCA+IC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIvMC90YXNrcwogCiB0byBnZXQgc3RhdHVzIG9mIHRoZSBmcmVlemVyIHN1YnN5c3RlbSA6CiAKLSAgICMgY2F0IC9jb250YWluZXJzLzAvZnJlZXplci5zdGF0ZQorICAgIyBjYXQgL3N5cy9mcy9jZ3JvdXAvZnJlZXplci8wL2ZyZWV6ZXIuc3RhdGUKICAgIFRIQVdFRAogCiB0byBmcmVlemUgYWxsIHRhc2tzIGluIHRoZSBjb250YWluZXIgOgogCi0gICAjIGVjaG8gRlJPWkVOID4gL2NvbnRhaW5lcnMvMC9mcmVlemVyLnN0YXRlCi0gICAjIGNhdCAvY29udGFpbmVycy8wL2ZyZWV6ZXIuc3RhdGUKKyAgICMgZWNobyBGUk9aRU4gPiAvc3lzL2ZzL2Nncm91cC9mcmVlemVyLzAvZnJlZXplci5zdGF0ZQorICAgIyBjYXQgL3N5cy9mcy9jZ3JvdXAvZnJlZXplci8wL2ZyZWV6ZXIuc3RhdGUKICAgIEZSRUVaSU5HCi0gICAjIGNhdCAvY29udGFpbmVycy8wL2ZyZWV6ZXIuc3RhdGUKKyAgICMgY2F0IC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIvMC9mcmVlemVyLnN0YXRlCiAgICBGUk9aRU4KIAogdG8gdW5mcmVlemUgYWxsIHRhc2tzIGluIHRoZSBjb250YWluZXIgOgogCi0gICAjIGVjaG8gVEhBV0VEID4gL2NvbnRhaW5lcnMvMC9mcmVlemVyLnN0YXRlCi0gICAjIGNhdCAvY29udGFpbmVycy8wL2ZyZWV6ZXIuc3RhdGUKKyAgICMgZWNobyBUSEFXRUQgPiAvc3lzL2ZzL2Nncm91cC9mcmVlemVyLzAvZnJlZXplci5zdGF0ZQorICAgIyBjYXQgL3N5cy9mcy9jZ3JvdXAvZnJlZXplci8wL2ZyZWV6ZXIuc3RhdGUKICAgIFRIQVdFRAogCiBUaGlzIGlzIHRoZSBiYXNpYyBtZWNoYW5pc20gd2hpY2ggc2hvdWxkIGRvIHRoZSByaWdodCB0aGluZyBmb3IgdXNlciBzcGFjZSB0YXNrCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CmluZGV4IDdjMTYzNDcuLjA2ZWI2ZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CkBAIC0xLDggKzEsOCBAQAogTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIKIAotTk9URTogVGhlIE1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIGhhcyBiZWVuIGdlbmVyaWNhbGx5IGJlZW4gcmVmZXJyZWQKLSAgICAgIHRvIGFzIHRoZSBtZW1vcnkgY29udHJvbGxlciBpbiB0aGlzIGRvY3VtZW50LiBEbyBub3QgY29uZnVzZSBtZW1vcnkKLSAgICAgIGNvbnRyb2xsZXIgdXNlZCBoZXJlIHdpdGggdGhlIG1lbW9yeSBjb250cm9sbGVyIHRoYXQgaXMgdXNlZCBpbiBoYXJkd2FyZS4KK05PVEU6IFRoZSBNZW1vcnkgUmVzb3VyY2UgQ29udHJvbGxlciBoYXMgZ2VuZXJpY2FsbHkgYmVlbiByZWZlcnJlZCB0byBhcyB0aGUKKyAgICAgIG1lbW9yeSBjb250cm9sbGVyIGluIHRoaXMgZG9jdW1lbnQuIERvIG5vdCBjb25mdXNlIG1lbW9yeSBjb250cm9sbGVyCisgICAgICB1c2VkIGhlcmUgd2l0aCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgdGhhdCBpcyB1c2VkIGluIGhhcmR3YXJlLgogCiAoRm9yIGVkaXRvcnMpCiBJbiB0aGlzIGRvY3VtZW50OgpAQCAtNzAsNiArNzAsNyBAQAogCQkJCSAoU2VlIHN5c2N0bCdzIHZtLnN3YXBwaW5lc3MpCiAgbWVtb3J5Lm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSAjIHNldC9zaG93IGNvbnRyb2xzIG9mIG1vdmluZyBjaGFyZ2VzCiAgbWVtb3J5Lm9vbV9jb250cm9sCQkgIyBzZXQvc2hvdyBvb20gY29udHJvbHMuCisgbWVtb3J5Lm51bWFfc3RhdAkJICMgc2hvdyB0aGUgbnVtYmVyIG9mIG1lbW9yeSB1c2FnZSBwZXIgbnVtYSBub2RlCiAKIDEuIEhpc3RvcnkKIApAQCAtMTgxLDcgKzE4Miw3IEBACiBwYWdlIHdpbGwgZXZlbnR1YWxseSBnZXQgY2hhcmdlZCBmb3IgaXQgKG9uY2UgaXQgaXMgdW5jaGFyZ2VkIGZyb20KIHRoZSBjZ3JvdXAgdGhhdCBicm91Z2h0IGl0IGluIC0tIHRoaXMgd2lsbCBoYXBwZW4gb24gbWVtb3J5IHByZXNzdXJlKS4KIAotRXhjZXB0aW9uOiBJZiBDT05GSUdfQ0dST1VQX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUCBpcyBub3QgdXNlZC4uCitFeGNlcHRpb246IElmIENPTkZJR19DR1JPVVBfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQIGlzIG5vdCB1c2VkLgogV2hlbiB5b3UgZG8gc3dhcG9mZiBhbmQgbWFrZSBzd2FwcGVkLW91dCBwYWdlcyBvZiBzaG1lbSh0bXBmcykgdG8KIGJlIGJhY2tlZCBpbnRvIG1lbW9yeSBpbiBmb3JjZSwgY2hhcmdlcyBmb3IgcGFnZXMgYXJlIGFjY291bnRlZCBhZ2FpbnN0IHRoZQogY2FsbGVyIG9mIHN3YXBvZmYgcmF0aGVyIHRoYW4gdGhlIHVzZXJzIG9mIHNobWVtLgpAQCAtMjEzLDcgKzIxNCw3IEBACiBPUyBwb2ludCBvZiB2aWV3LgogCiAqIFdoYXQgaGFwcGVucyB3aGVuIGEgY2dyb3VwIGhpdHMgbWVtb3J5Lm1lbXN3LmxpbWl0X2luX2J5dGVzCi1XaGVuIGEgY2dyb3VwIGhpcyBtZW1vcnkubWVtc3cubGltaXRfaW5fYnl0ZXMsIGl0J3MgdXNlbGVzcyB0byBkbyBzd2FwLW91dAorV2hlbiBhIGNncm91cCBoaXRzIG1lbW9yeS5tZW1zdy5saW1pdF9pbl9ieXRlcywgaXQncyB1c2VsZXNzIHRvIGRvIHN3YXAtb3V0CiBpbiB0aGlzIGNncm91cC4gVGhlbiwgc3dhcC1vdXQgd2lsbCBub3QgYmUgZG9uZSBieSBjZ3JvdXAgcm91dGluZSBhbmQgZmlsZQogY2FjaGVzIGFyZSBkcm9wcGVkLiBCdXQgYXMgbWVudGlvbmVkIGFib3ZlLCBnbG9iYWwgTFJVIGNhbiBkbyBzd2Fwb3V0IG1lbW9yeQogZnJvbSBpdCBmb3Igc2FuaXR5IG9mIHRoZSBzeXN0ZW0ncyBtZW1vcnkgbWFuYWdlbWVudCBzdGF0ZS4gWW91IGNhbid0IGZvcmJpZApAQCAtMjYzLDE2ICsyNjQsMTcgQEAKIGMuIEVuYWJsZSBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgogZC4gRW5hYmxlIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAgKHRvIHVzZSBzd2FwIGV4dGVuc2lvbikKIAotMS4gUHJlcGFyZSB0aGUgY2dyb3VwcwotIyBta2RpciAtcCAvY2dyb3VwcwotIyBtb3VudCAtdCBjZ3JvdXAgbm9uZSAvY2dyb3VwcyAtbyBtZW1vcnkKKzEuIFByZXBhcmUgdGhlIGNncm91cHMgKHNlZSBjZ3JvdXBzLnR4dCwgV2h5IGFyZSBjZ3JvdXBzIG5lZWRlZD8pCisjIG1vdW50IC10IHRtcGZzIG5vbmUgL3N5cy9mcy9jZ3JvdXAKKyMgbWtkaXIgL3N5cy9mcy9jZ3JvdXAvbWVtb3J5CisjIG1vdW50IC10IGNncm91cCBub25lIC9zeXMvZnMvY2dyb3VwL21lbW9yeSAtbyBtZW1vcnkKIAogMi4gTWFrZSB0aGUgbmV3IGdyb3VwIGFuZCBtb3ZlIGJhc2ggaW50byBpdAotIyBta2RpciAvY2dyb3Vwcy8wCi0jIGVjaG8gJCQgPiAvY2dyb3Vwcy8wL3Rhc2tzCisjIG1rZGlyIC9zeXMvZnMvY2dyb3VwL21lbW9yeS8wCisjIGVjaG8gJCQgPiAvc3lzL2ZzL2Nncm91cC9tZW1vcnkvMC90YXNrcwogCiBTaW5jZSBub3cgd2UncmUgaW4gdGhlIDAgY2dyb3VwLCB3ZSBjYW4gYWx0ZXIgdGhlIG1lbW9yeSBsaW1pdDoKLSMgZWNobyA0TSA+IC9jZ3JvdXBzLzAvbWVtb3J5LmxpbWl0X2luX2J5dGVzCisjIGVjaG8gNE0gPiAvc3lzL2ZzL2Nncm91cC9tZW1vcnkvMC9tZW1vcnkubGltaXRfaW5fYnl0ZXMKIAogTk9URTogV2UgY2FuIHVzZSBhIHN1ZmZpeCAoaywgSywgbSwgTSwgZyBvciBHKSB0byBpbmRpY2F0ZSB2YWx1ZXMgaW4ga2lsbywKIG1lZ2Egb3IgZ2lnYWJ5dGVzLiAoSGVyZSwgS2lsbywgTWVnYSwgR2lnYSBhcmUgS2liaWJ5dGVzLCBNZWJpYnl0ZXMsIEdpYmlieXRlcy4pCkBAIC0yODAsMTEgKzI4MiwxMSBAQAogTk9URTogV2UgY2FuIHdyaXRlICItMSIgdG8gcmVzZXQgdGhlICoubGltaXRfaW5fYnl0ZXModW5saW1pdGVkKS4KIE5PVEU6IFdlIGNhbm5vdCBzZXQgbGltaXRzIG9uIHRoZSByb290IGNncm91cCBhbnkgbW9yZS4KIAotIyBjYXQgL2Nncm91cHMvMC9tZW1vcnkubGltaXRfaW5fYnl0ZXMKKyMgY2F0IC9zeXMvZnMvY2dyb3VwL21lbW9yeS8wL21lbW9yeS5saW1pdF9pbl9ieXRlcwogNDE5NDMwNAogCiBXZSBjYW4gY2hlY2sgdGhlIHVzYWdlOgotIyBjYXQgL2Nncm91cHMvMC9tZW1vcnkudXNhZ2VfaW5fYnl0ZXMKKyMgY2F0IC9zeXMvZnMvY2dyb3VwL21lbW9yeS8wL21lbW9yeS51c2FnZV9pbl9ieXRlcwogMTIxNjUxMgogCiBBIHN1Y2Nlc3NmdWwgd3JpdGUgdG8gdGhpcyBmaWxlIGRvZXMgbm90IGd1YXJhbnRlZSBhIHN1Y2Nlc3NmdWwgc2V0IG9mCkBAIC00NjQsNiArNDY2LDI0IEBACiBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgZXhhY3QgbWVtb3J5IHVzYWdlLCB5b3Ugc2hvdWxkIHVzZSBSU1MrQ0FDSEUoK1NXQVApCiB2YWx1ZSBpbiBtZW1vcnkuc3RhdChzZWUgNS4yKS4KIAorNS42IG51bWFfc3RhdAorCitUaGlzIGlzIHNpbWlsYXIgdG8gbnVtYV9tYXBzIGJ1dCBvcGVyYXRlcyBvbiBhIHBlci1tZW1jZyBiYXNpcy4gIFRoaXMgaXMKK3VzZWZ1bCBmb3IgcHJvdmlkaW5nIHZpc2liaWxpdHkgaW50byB0aGUgbnVtYSBsb2NhbGl0eSBpbmZvcm1hdGlvbiB3aXRoaW4KK2FuIG1lbWNnIHNpbmNlIHRoZSBwYWdlcyBhcmUgYWxsb3dlZCB0byBiZSBhbGxvY2F0ZWQgZnJvbSBhbnkgcGh5c2ljYWwKK25vZGUuICBPbmUgb2YgdGhlIHVzZWNhc2VzIGlzIGV2YWx1YXRpbmcgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UgYnkKK2NvbWJpbmluZyB0aGlzIGluZm9ybWF0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uJ3MgY3B1IGFsbG9jYXRpb24uCisKK1dlIGV4cG9ydCAidG90YWwiLCAiZmlsZSIsICJhbm9uIiBhbmQgInVuZXZpY3RhYmxlIiBwYWdlcyBwZXItbm9kZSBmb3IKK2VhY2ggbWVtY2cuICBUaGUgb3VwdXQgZm9ybWF0IG9mIG1lbW9yeS5udW1hX3N0YXQgaXM6CisKK3RvdGFsPTx0b3RhbCBwYWdlcz4gTjA9PG5vZGUgMCBwYWdlcz4gTjE9PG5vZGUgMSBwYWdlcz4gLi4uCitmaWxlPTx0b3RhbCBmaWxlIHBhZ2VzPiBOMD08bm9kZSAwIHBhZ2VzPiBOMT08bm9kZSAxIHBhZ2VzPiAuLi4KK2Fub249PHRvdGFsIGFub24gcGFnZXM+IE4wPTxub2RlIDAgcGFnZXM+IE4xPTxub2RlIDEgcGFnZXM+IC4uLgordW5ldmljdGFibGU9PHRvdGFsIGFub24gcGFnZXM+IE4wPTxub2RlIDAgcGFnZXM+IE4xPTxub2RlIDEgcGFnZXM+IC4uLgorCitBbmQgd2UgaGF2ZSB0b3RhbCA9IGZpbGUgKyBhbm9uICsgdW5ldmljdGFibGUuCisKIDYuIEhpZXJhcmNoeSBzdXBwb3J0CiAKIFRoZSBtZW1vcnkgY29udHJvbGxlciBzdXBwb3J0cyBhIGRlZXAgaGllcmFyY2h5IGFuZCBoaWVyYXJjaGljYWwgYWNjb3VudGluZy4KQEAgLTQ3MSwxMyArNDkxLDEzIEBACiBjZ3JvdXAgZmlsZXN5c3RlbS4gQ29uc2lkZXIgZm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY2dyb3VwIGZpbGVzeXN0ZW0KIGhpZXJhcmNoeQogCi0JCXJvb3QKKwkgICAgICAgcm9vdAogCSAgICAgLyAgfCAgIFwKLSAgICAgICAgICAgLwl8ICAgIFwKLQkgIGEJYgljCi0JCQl8IFwKLQkJCXwgIFwKLQkJCWQgICBlCisgICAgICAgICAgICAvCXwgICAgXAorCSAgIGEJYiAgICAgYworCQkgICAgICB8IFwKKwkJICAgICAgfCAgXAorCQkgICAgICBkICAgZQogCiBJbiB0aGUgZGlhZ3JhbSBhYm92ZSwgd2l0aCBoaWVyYXJjaGljYWwgYWNjb3VudGluZyBlbmFibGVkLCBhbGwgbWVtb3J5CiB1c2FnZSBvZiBlLCBpcyBhY2NvdW50ZWQgdG8gaXRzIGFuY2VzdG9ycyB1cCB1bnRpbCB0aGUgcm9vdCAoaS5lLCBjIGFuZCByb290KSwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAxYTk0NDZiLi5iMWM5MjFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC00ODEsMjMgKzQ4MSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDogICBuYW1lc3BhY2UgY2dyb3VwIChuc19jZ3JvdXApCi1XaGVuOiAgIDIuNi4zOAotV2h5OiAgICBUaGUgbnNfY2dyb3VwIGxlYWRzIHRvIHNvbWUgcHJvYmxlbXM6Ci0JKiBjZ3JvdXAgY3JlYXRpb24gaXMgb3V0LW9mLWNvbnRyb2wKLQkqIGNncm91cCBuYW1lIGNhbiBjb25mbGljdCB3aGVuIHBpZHMgYXJlIGxvb3BpbmcKLQkqIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGEgc2luZ2xlIHByb2Nlc3MgaGFuZGxpbmcKLQlhIGxvdCBvZiBuYW1lc3BhY2VzIHdpdGhvdXQgZmFsbGluZyBpbiBhIGV4cG9uZW50aWFsIGNyZWF0aW9uIHRpbWUKLQkqIHdlIG1heSB3YW50IHRvIGNyZWF0ZSBhIG5hbWVzcGFjZSB3aXRob3V0IGNyZWF0aW5nIGEgY2dyb3VwCi0KLQlUaGUgbnNfY2dyb3VwIGlzIHJlcGxhY2VkIGJ5IGEgY29tcGF0aWJpbGl0eSBmbGFnICdjbG9uZV9jaGlsZHJlbicsCi0Jd2hlcmUgYSBuZXdseSBjcmVhdGVkIGNncm91cCB3aWxsIGNvcHkgdGhlIHBhcmVudCBjZ3JvdXAgdmFsdWVzLgotCVRoZSB1c2Vyc3BhY2UgaGFzIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIGNncm91cCBhbmQgYWRkIGEgdGFzayB0bwotCXRoZSAndGFza3MnIGZpbGUuCi1XaG86ICAgIERhbmllbCBMZXpjYW5vIDxkYW5pZWwubGV6Y2Fub0BmcmVlLmZyPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CWl3bHdpZmkgZGlzYWJsZV9od19zY2FuIG1vZHVsZSBwYXJhbWV0ZXJzCiBXaGVuOgkyLjYuNDAKIFdoeToJSGFyZXdhcmUgc2NhbiBpcyB0aGUgcHJlZmVyIG1ldGhvZCBmb3IgaXdsd2lmaSBkZXZpY2VzIGZvcgpAQCAtNjAwLDMgKzU4MywyNSBAQAogV2hvOglMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJRm9yIFZJRElPQ19TX0ZSRVFVRU5DWSB0aGUgdHlwZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBkZXZpY2Ugbm9kZSdzIHR5cGUuCisJSWYgbm90LCByZXR1cm4gLUVJTlZBTC4KK1doZW46CTMuMgorV2h5OglJdCBtYWtlcyBubyBzZW5zZSB0byBzd2l0Y2ggdGhlIHR1bmVyIHRvIHJhZGlvIG1vZGUgYnkgY2FsbGluZworCVZJRElPQ19TX0ZSRVFVRU5DWSBvbiBhIHZpZGVvIG5vZGUsIG9yIHRvIHN3aXRjaCB0aGUgdHVuZXIgdG8gdHYgbW9kZSBieQorCWNhbGxpbmcgVklESU9DX1NfRlJFUVVFTkNZIG9uIGEgcmFkaW8gbm9kZS4gVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCBvZiBhCisJbW92ZSB0byBtb3JlIGNvbnNpc3RlbnQgaGFuZGxpbmcgb2YgdHYgYW5kIHJhZGlvIHR1bmVycy4KK1dobzoJSGFucyBWZXJrdWlsIDxoYW5zLnZlcmt1aWxAY2lzY28uY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CU9wZW5pbmcgYSByYWRpbyBkZXZpY2Ugbm9kZSB3aWxsIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0aGUKKwl0dW5lciBtb2RlIGZyb20gdHYgdG8gcmFkaW8uCitXaGVuOgkzLjMKK1doeToJSnVzdCBvcGVuaW5nIGEgVjRMIGRldmljZSBzaG91bGQgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGhhcmR3YXJlCisJbGlrZSB0aGF0LiBJdCdzIHZlcnkgdW5leHBlY3RlZCBhbmQgYWdhaW5zdCB0aGUgVjRMIHNwZWMuIEluc3RlYWQsIHlvdQorCXN3aXRjaCB0byByYWRpbyBtb2RlIGJ5IGNhbGxpbmcgVklESU9DX1NfRlJFUVVFTkNZLiBUaGlzIGlzIHRoZSBzZWNvbmQKKwlhbmQgbGFzdCBzdGVwIG9mIHRoZSBtb3ZlIHRvIGNvbnNpc3RlbnQgaGFuZGxpbmcgb2YgdHYgYW5kIHJhZGlvIHR1bmVycy4KK1dobzoJSGFucyBWZXJrdWlsIDxoYW5zLnZlcmt1aWxAY2lzY28uY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NhY2hpbmcvbmV0ZnMtYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0CmluZGV4IGExNjdhYjguLjdjYzZiZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0CkBAIC02NzMsNiArNjczLDIyIEBACiBpbiB3aGljaCBjYXNlIHRoZSBwYWdlIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgdGhpcyB0aW1lLgogCiAKK0JVTEsgSU5PREUgUEFHRSBVTkNBQ0hFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGNvbnZlbmllbmNlIHJvdXRpbmUgaXMgcHJvdmlkZWQgdG8gcGVyZm9ybSBhbiB1bmNhY2hlIG9uIGFsbCB0aGUgcGFnZXMKK2F0dGFjaGVkIHRvIGFuIGlub2RlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHBhZ2VzIG9uIHRoZSBpbm9kZSBjb3JyZXNwb25kIG9uIGEKKzE6MSBiYXNpcyB3aXRoIHRoZSBwYWdlcyBpbiB0aGUgY2FjaGUuCisKKwl2b2lkIGZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoc3RydWN0IGZzY2FjaGVfY29va2llICpjb29raWUsCisJCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSk7CisKK1RoaXMgdGFrZXMgdGhlIG5ldGZzIGNvb2tpZSB0aGF0IHRoZSBwYWdlcyB3ZXJlIGNhY2hlZCB3aXRoIGFuZCB0aGUgaW5vZGUgdGhhdAordGhlIHBhZ2VzIGFyZSBhdHRhY2hlZCB0by4gIFRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBwYWdlcyB0byBmaW5pc2ggYmVpbmcKK3dyaXR0ZW4gdG8gdGhlIGNhY2hlIGFuZCBmb3IgdGhlIGNhY2hlIHRvIGZpbmlzaCB3aXRoIHRoZSBwYWdlIGdlbmVyYWxseS4gIE5vCitlcnJvciBpcyByZXR1cm5lZC4KKworCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogSU5ERVggQU5EIERBVEEgRklMRSBVUERBVEUKID09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQKaW5kZXggZDVjMGNlZi4uODczYTJhYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmlsZnMyLnR4dApAQCAtNDAsNyArNDAsNiBAQAogCS0gUE9TSVggQUNMcwogCS0gcXVvdGFzCiAJLSBmc2NrCi0JLSByZXNpemUKIAktIGRlZnJhZ21lbnRhdGlvbgogCiBNb3VudCBvcHRpb25zCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCBmNDgxNzgwLi5kYjNiMWFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTg0Myw2ICs4NDMsNyBAQAogIFRBU0tMRVQ6ICAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAyOTAKICAgIFNDSEVEOiAgICAgIDI3MDM1ICAgICAgMjY5ODMgICAgICAyNjk3MSAgICAgIDI2NzQ2CiAgSFJUSU1FUjogICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgMAorICAgICBSQ1U6ICAgICAgIDE2NzggICAgICAgMTc2OSAgICAgICAyMTc4ICAgICAgIDIyNTAKIAogCiAxLjMgSURFIGRldmljZXMgaW4gL3Byb2MvaWRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZwppbmRleCA4NGQyNjIzLi5kZTkxYzBkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKQEAgLTIyLDYgKzIyLDEwIEBACiAgICAgUHJlZml4OiAnZjcxODY5JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCiAgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSB0aGUgRmludGVrIHdlYnNpdGUKKyAgKiBGaW50ZWsgRjcxODY5QQorICAgIFByZWZpeDogJ2Y3MTg2OWEnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKKyAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWMKICAgKiBGaW50ZWsgRjcxODgyRkcgYW5kIEY3MTg4M0ZHCiAgICAgUHJlZml4OiAnZjcxODgyZmcnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vazEwdGVtcCBiL0RvY3VtZW50YXRpb24vaHdtb24vazEwdGVtcAppbmRleCAwMzkzYzg5Li5hMTBmNzM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2sxMHRlbXAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9rMTB0ZW1wCkBAIC05LDggKzksOCBAQAogICBTb2NrZXQgUzFHMzogQXRobG9uIElJLCBTZW1wcm9uLCBUdXJpb24gSUkKICogQU1EIEZhbWlseSAxMWggcHJvY2Vzc29yczoKICAgU29ja2V0IFMxRzI6IEF0aGxvbiAoWDIpLCBTZW1wcm9uIChYMiksIFR1cmlvbiBYMiAoVWx0cmEpCi0qIEFNRCBGYW1pbHkgMTJoIHByb2Nlc3NvcnM6ICJMbGFubyIKLSogQU1EIEZhbWlseSAxNGggcHJvY2Vzc29yczogIkJyYXpvcyIgKEMvRS9HLVNlcmllcykKKyogQU1EIEZhbWlseSAxMmggcHJvY2Vzc29yczogIkxsYW5vIiAoRTIvQTQvQTYvQTgtU2VyaWVzKQorKiBBTUQgRmFtaWx5IDE0aCBwcm9jZXNzb3JzOiAiQnJhem9zIiAoQy9FL0cvWi1TZXJpZXMpCiAqIEFNRCBGYW1pbHkgMTVoIHByb2Nlc3NvcnM6ICJCdWxsZG96ZXIiCiAKICAgUHJlZml4OiAnazEwdGVtcCcKQEAgLTIwLDEyICsyMCwxNiBAQAogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzMxMTE2LnBkZgogICBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIGZvciBBTUQgRmFtaWx5IDExaCBQcm9jZXNzb3JzOgogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQxMjU2LnBkZgorICBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIGZvciBBTUQgRmFtaWx5IDEyaCBQcm9jZXNzb3JzOgorICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQxMTMxLnBkZgogICBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIGZvciBBTUQgRmFtaWx5IDE0aCBNb2RlbHMgMDBoLTBGaCBQcm9jZXNzb3JzOgogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQzMTcwLnBkZgogICBSZXZpc2lvbiBHdWlkZSBmb3IgQU1EIEZhbWlseSAxMGggUHJvY2Vzc29yczoKICAgICBodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy80MTMyMi5wZGYKICAgUmV2aXNpb24gR3VpZGUgZm9yIEFNRCBGYW1pbHkgMTFoIFByb2Nlc3NvcnM6CiAgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDE3ODgucGRmCisgIFJldmlzaW9uIEd1aWRlIGZvciBBTUQgRmFtaWx5IDEyaCBQcm9jZXNzb3JzOgorICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQ0NzM5LnBkZgogICBSZXZpc2lvbiBHdWlkZSBmb3IgQU1EIEZhbWlseSAxNGggTW9kZWxzIDAwaC0wRmggUHJvY2Vzc29yczoKICAgICBodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy80NzUzNC5wZGYKICAgQU1EIEZhbWlseSAxMWggUHJvY2Vzc29yIFBvd2VyIGFuZCBUaGVybWFsIERhdGEgU2hlZXQgZm9yIE5vdGVib29rczoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggNTQzOGEyZC4uYWE0N2JlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTk5OSw3ICs5OTksMTAgQEAKIAkJCVdpdGggdGhpcyBvcHRpb24gb24gZXZlcnkgdW5tYXBfc2luZ2xlIG9wZXJhdGlvbiB3aWxsCiAJCQlyZXN1bHQgaW4gYSBoYXJkd2FyZSBJT1RMQiBmbHVzaCBvcGVyYXRpb24gYXMgb3Bwb3NlZAogCQkJdG8gYmF0Y2hpbmcgdGhlbSBmb3IgcGVyZm9ybWFuY2UuCi0KKwkJc3Bfb2ZmIFtEZWZhdWx0IE9mZl0KKwkJCUJ5IGRlZmF1bHQsIHN1cGVyIHBhZ2Ugd2lsbCBiZSBzdXBwb3J0ZWQgaWYgSW50ZWwgSU9NTVUKKwkJCWhhcyB0aGUgY2FwYWJpbGl0eS4gV2l0aCB0aGlzIG9wdGlvbiwgc3VwZXIgcGFnZSB3aWxsCisJCQlub3QgYmUgc3VwcG9ydGVkLgogCWludHJlbWFwPQlbWDg2LTY0LCBJbnRlbC1JT01NVV0KIAkJCUZvcm1hdDogeyBvbiAoZGVmYXVsdCkgfCBvZmYgfCBub3NpZCB9CiAJCQlvbgllbmFibGUgSW50ZXJydXB0IFJlbWFwcGluZyAoZGVmYXVsdCkKQEAgLTIwMTIsNiArMjAxNSw4IEBACiAJCQkJdGhlIGRlZmF1bHQuCiAJCQkJb2ZmOiBUdXJuIEVDUkMgb2ZmCiAJCQkJb246IFR1cm4gRUNSQyBvbi4KKwkJcmVhbGxvYwkJcmVhbGxvY2F0ZSBQQ0kgcmVzb3VyY2VzIGlmIGFsbG9jYXRpb25zIGRvbmUgYnkgQklPUworCQkJCWFyZSBlcnJvbmVvdXMuCiAKIAlwY2llX2FzcG09CVtQQ0lFXSBGb3JjaWJseSBlbmFibGUgb3IgZGlzYWJsZSBQQ0llIEFjdGl2ZSBTdGF0ZSBQb3dlcgogCQkJTWFuYWdlbWVudC4KQEAgLTI1OTUsNiArMjYwMCw4IEBACiAJCQkJCXVubG9jayBlamVjdGFibGUgbWVkaWEpOwogCQkJCW0gPSBNQVhfU0VDVE9SU182NCAoZG9uJ3QgdHJhbnNmZXIgbW9yZQogCQkJCQl0aGFuIDY0IHNlY3RvcnMgPSAzMiBLQiBhdCBhIHRpbWUpOworCQkJCW4gPSBJTklUSUFMX1JFQUQxMCAoZm9yY2UgYSByZXRyeSBvZiB0aGUKKwkJCQkJaW5pdGlhbCBSRUFEKDEwKSBjb21tYW5kKTsKIAkJCQlvID0gQ0FQQUNJVFlfT0sgKGFjY2VwdCB0aGUgY2FwYWNpdHkKIAkJCQkJcmVwb3J0ZWQgYnkgdGhlIGRldmljZSk7CiAJCQkJciA9IElHTk9SRV9SRVNJRFVFICh0aGUgZGV2aWNlIHJlcG9ydHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va21lbWxlYWsudHh0IGIvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKaW5kZXggMDkwZTZlZS4uNTEwNjNlNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKQEAgLTExLDcgKzExLDkgQEAKIHJlcG9ydGVkIHZpYSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQogVmFsZ3JpbmQgdG9vbCAobWVtY2hlY2sgLS1sZWFrLWNoZWNrKSB0byBkZXRlY3QgdGhlIG1lbW9yeSBsZWFrcyBpbgogdXNlci1zcGFjZSBhcHBsaWNhdGlvbnMuCi1LbWVtbGVhayBpcyBzdXBwb3J0ZWQgb24geDg2LCBhcm0sIHBvd2VycGMsIHNwYXJjLCBzaCwgbWljcm9ibGF6ZSBhbmQgdGlsZS4KKworUGxlYXNlIGNoZWNrIERFQlVHX0tNRU1MRUFLIGRlcGVuZGVuY2llcyBpbiBsaWIvS2NvbmZpZy5kZWJ1ZyBmb3Igc3VwcG9ydGVkCithcmNoaXRlY3R1cmVzLgogCiBVc2FnZQogLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dCBiL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAppbmRleCAxNTY1ZWVmLi42MTgxNTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CkBAIC01MzQsNiArNTM0LDggQEAKIDB4MjQwNAkJU3lzdGVtIGlzIHdha2luZyB1cCBmcm9tIGhpYmVybmF0aW9uIHRvIHVuZG9jawogMHgyNDA1CQlTeXN0ZW0gaXMgd2FraW5nIHVwIGZyb20gaGliZXJuYXRpb24gdG8gZWplY3QgYmF5CiAweDUwMTAJCUJyaWdodG5lc3MgbGV2ZWwgY2hhbmdlZC9jb250cm9sIGV2ZW50CisweDYwMDAJCUtFWUJPQVJEOiBOdW1sb2NrIGtleSBwcmVzc2VkCisweDYwMDUJCUtFWUJPQVJEOiBGbiBrZXkgcHJlc3NlZCAoVE8gQkUgVkVSSUZJRUQpCiAKIEV2ZW50cyB0aGF0IGFyZSBwcm9wYWdhdGVkIGJ5IHRoZSBkcml2ZXIgdG8gdXNlcnNwYWNlOgogCkBAIC01NDUsNiArNTQ3LDggQEAKIDB4MzAwNgkJQmF5IGhvdHBsdWcgcmVxdWVzdCAoaGludCB0byBwb3dlciB1cCBTQVRBIGxpbmsgd2hlbgogCQl0aGUgb3B0aWNhbCBkcml2ZSB0cmF5IGlzIGVqZWN0ZWQpCiAweDQwMDMJCVVuZG9ja2VkIChzZWUgMHgyeDA0KSwgY2FuIHNsZWVwIGFnYWluCisweDQwMTAJCURvY2tlZCBpbnRvIGhvdHBsdWcgcG9ydCByZXBsaWNhdG9yIChub24tQUNQSSBkb2NrKQorMHg0MDExCQlVbmRvY2tlZCBmcm9tIGhvdHBsdWcgcG9ydCByZXBsaWNhdG9yIChub24tQUNQSSBkb2NrKQogMHg1MDBCCQlUYWJsZXQgcGVuIGluc2VydGVkIGludG8gaXRzIHN0b3JhZ2UgYmF5CiAweDUwMEMJCVRhYmxldCBwZW4gcmVtb3ZlZCBmcm9tIGl0cyBzdG9yYWdlIGJheQogMHg2MDExCQlBTEFSTTogYmF0dGVyeSBpcyB0b28gaG90CkBAIC01NTIsNiArNTU2LDcgQEAKIDB4NjAyMQkJQUxBUk06IGEgc2Vuc29yIGlzIHRvbyBob3QKIDB4NjAyMgkJQUxBUk06IGEgc2Vuc29yIGlzIGV4dHJlbWVseSBob3QKIDB4NjAzMAkJU3lzdGVtIHRoZXJtYWwgdGFibGUgY2hhbmdlZAorMHg2MDQwCQlOdmlkaWEgT3B0aW11cy9BQyBhZGFwdGVyIHJlbGF0ZWQgKFRPIEJFIFZFUklGSUVEKQogCiBCYXR0ZXJ5IG5lYXJseSBlbXB0eSBhbGFybXMgYXJlIGEgbGFzdCByZXNvcnQgYXR0ZW1wdCB0byBnZXQgdGhlCiBvcGVyYXRpbmcgc3lzdGVtIHRvIGhpYmVybmF0ZSBvciBzaHV0ZG93biBjbGVhbmx5ICgweDIzMTMpLCBvciBzaHV0ZG93bgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZC50eHQgYi9Eb2N1bWVudGF0aW9uL21kLnR4dAppbmRleCAyMzY2YjFjLi5mMGVlZTgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21kLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21kLnR4dApAQCAtNTU1LDcgKzU1NSw3IEBACiAgICBzeW5jX21pbgogICAgc3luY19tYXgKICAgICAgVGhlIHR3byB2YWx1ZXMsIGdpdmVuIGFzIG51bWJlcnMgb2Ygc2VjdG9ycywgaW5kaWNhdGUgYSByYW5nZQotICAgICB3aXRoaW5nIHRoZSBhcnJheSB3aGVyZSAnY2hlY2snLydyZXBhaXInIHdpbGwgb3BlcmF0ZS4gTXVzdCBiZQorICAgICB3aXRoaW4gdGhlIGFycmF5IHdoZXJlICdjaGVjaycvJ3JlcGFpcicgd2lsbCBvcGVyYXRlLiBNdXN0IGJlCiAgICAgIGEgbXVsdGlwbGUgb2YgY2h1bmtfc2l6ZS4gV2hlbiBpdCByZWFjaGVzICJzeW5jX21heCIgaXQgd2lsbAogICAgICBwYXVzZSwgcmF0aGVyIHRoYW4gY29tcGxldGUuCiAgICAgIFlvdSBjYW4gdXNlICdzZWxlY3QnIG9yICdwb2xsJyBvbiAic3luY19jb21wbGV0ZWQiIHRvIHdhaXQgZm9yCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IGQzZDY1M2EuLmJmZTkyNDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAl3aGVuIFJUTyByZXRyYW5zbWlzc2lvbnMgcmVtYWluIHVuYWNrbm93bGVkZ2VkLgogCVNlZSB0Y3BfcmV0cmllczIgZm9yIG1vcmUgZGV0YWlscy4KIAotCVRoZSBkZWZhdWx0IHZhbHVlIGlzIDcuCisJVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4KIAlJZiB5b3VyIG1hY2hpbmUgaXMgYSBsb2FkZWQgV0VCIHNlcnZlciwKIAl5b3Ugc2hvdWxkIHRoaW5rIGFib3V0IGxvd2VyaW5nIHRoaXMgdmFsdWUsIHN1Y2ggc29ja2V0cwogCW1heSBjb25zdW1lIHNpZ25pZmljYW50IHJlc291cmNlcy4gQ2YuIHRjcF9tYXhfb3JwaGFucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0CmluZGV4IDg4ODgwODMuLjY0NTY1YWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dApAQCAtNTIwLDU5ICs1MjAsMjAgQEAKIGRldmljZS4gIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBvZiB0eXBlIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluLAogZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L3BtLmgsIHByb3ZpZGluZyBhIHNldCBvZiBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrcwogYW5hbG9nb3VzIHRvIHRoZSBzdWJzeXN0ZW0tbGV2ZWwgYW5kIGRldmljZSBkcml2ZXIgY2FsbGJhY2tzIHRoYXQgYXJlIGV4ZWN1dGVkCi1mb3IgdGhlIGdpdmVuIGRldmljZSBkdXJpbmcgYWxsIHBvd2VyIHRyYW5zaXRpb25zLCBpbiBhZGRpdGlvbiB0byB0aGUgcmVzcGVjdGl2ZQotc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcy4gIFNwZWNpZmljYWxseSwgdGhlIHBvd2VyIGRvbWFpbiAic3VzcGVuZCIgY2FsbGJhY2tzCi0oaS5lLiAtPnJ1bnRpbWVfc3VzcGVuZCgpLCAtPnN1c3BlbmQoKSwgLT5mcmVlemUoKSwgLT5wb3dlcm9mZigpLCBldGMuKSBhcmUKLWV4ZWN1dGVkIGFmdGVyIHRoZSBhbmFsb2dvdXMgc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcywgd2hpbGUgdGhlIHBvd2VyIGRvbWFpbgotInJlc3VtZSIgY2FsbGJhY2tzIChpLmUuIC0+cnVudGltZV9yZXN1bWUoKSwgLT5yZXN1bWUoKSwgLT50aGF3KCksIC0+cmVzdG9yZSwKLWV0Yy4pIGFyZSBleGVjdXRlZCBiZWZvcmUgdGhlIGFuYWxvZ291cyBzdWJzeXN0ZW0tbGV2ZWwgY2FsbGJhY2tzLiAgRXJyb3IgY29kZXMKLXJldHVybmVkIGJ5IHRoZSAic3VzcGVuZCIgYW5kICJyZXN1bWUiIHBvd2VyIGRvbWFpbiBjYWxsYmFja3MgYXJlIGlnbm9yZWQuCitmb3IgdGhlIGdpdmVuIGRldmljZSBkdXJpbmcgYWxsIHBvd2VyIHRyYW5zaXRpb25zLCBpbnN0ZWFkIG9mIHRoZSByZXNwZWN0aXZlCitzdWJzeXN0ZW0tbGV2ZWwgY2FsbGJhY2tzLiAgU3BlY2lmaWNhbGx5LCBpZiBhIGRldmljZSdzIHBtX2RvbWFpbiBwb2ludGVyIGlzCitub3QgTlVMTCwgdGhlIC0+c3VzcGVuZCgpIGNhbGxiYWNrIGZyb20gdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IGl0IHdpbGwgYmUKK2V4ZWN1dGVkIGluc3RlYWQgb2YgaXRzIHN1YnN5c3RlbSdzIChlLmcuIGJ1cyB0eXBlJ3MpIC0+c3VzcGVuZCgpIGNhbGxiYWNrIGFuZAorYW5sb2dvdXNseSBmb3IgYWxsIG9mIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzLiAgSW4gb3RoZXIgd29yZHMsIHBvd2VyIG1hbmFnZW1lbnQKK2RvbWFpbiBjYWxsYmFja3MsIGlmIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBkZXZpY2UsIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlcgordGhlIGNhbGxiYWNrcyBwcm92aWRlZCBieSB0aGUgZGV2aWNlJ3Mgc3Vic3lzdGVtIChlLmcuIGJ1cyB0eXBlKS4KIAotUG93ZXIgZG9tYWluIC0+cnVudGltZV9pZGxlKCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBzdWJzeXN0ZW0tbGV2ZWwKLS0+cnVudGltZV9pZGxlKCkgY2FsbGJhY2sgYW5kIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgaXQgaXMgbm90IGlnbm9yZWQuICBOYW1lbHksCi1pZiBpdCByZXR1cm5zIGVycm9yIGNvZGUsIHRoZSBzdWJzeXN0ZW0tbGV2ZWwgLT5ydW50aW1lX2lkbGUoKSBjYWxsYmFjayB3aWxsIG5vdAotYmUgY2FsbGVkIGFuZCB0aGUgaGVscGVyIGZ1bmN0aW9uIHJwbV9pZGxlKCkgZXhlY3V0aW5nIGl0IHdpbGwgcmV0dXJuIGVycm9yCi1jb2RlLiAgVGhpcyBtZWNoYW5pc20gaXMgaW50ZW5kZWQgdG8gaGVscCBwbGF0Zm9ybXMgd2hlcmUgc2F2aW5nIGRldmljZSBzdGF0ZQotaXMgYSB0aW1lIGNvbnN1bWluZyBvcGVyYXRpb24gYW5kIHNob3VsZCBvbmx5IGJlIGNhcnJpZWQgb3V0IGlmIGFsbCBkZXZpY2VzCi1pbiB0aGUgcG93ZXIgZG9tYWluIGFyZSBpZGxlLCBiZWZvcmUgdHVybmluZyBvZmYgdGhlIHNoYXJlZCBwb3dlciByZXNvdXJjZShzKS4KLU5hbWVseSwgdGhlIHBvd2VyIGRvbWFpbiAtPnJ1bnRpbWVfaWRsZSgpIGNhbGxiYWNrIG1heSByZXR1cm4gZXJyb3IgY29kZSB1bnRpbAotdGhlIHBtX3J1bnRpbWVfaWRsZSgpIGhlbHBlciAob3IgaXRzIGFzeWNocm9ub3VzIHZlcnNpb24pIGhhcyBiZWVuIGNhbGxlZCBmb3IKLWFsbCBkZXZpY2VzIGluIHRoZSBwb3dlciBkb21haW4gKGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIHJldHVybmVkIGVycm9yIGNvZGUKLWJlIC1FQlVTWSBpbiB0aG9zZSBjYXNlcyksIHByZXZlbnRpbmcgdGhlIHN1YnN5c3RlbS1sZXZlbCAtPnJ1bnRpbWVfaWRsZSgpCi1jYWxsYmFjayBmcm9tIGJlaW5nIHJ1biBwcmVtYXR1cmVseS4KLQotVGhlIHN1cHBvcnQgZm9yIGRldmljZSBwb3dlciBkb21haW5zIGlzIG9ubHkgcmVsZXZhbnQgdG8gcGxhdGZvcm1zIG5lZWRpbmcgdG8KLXVzZSB0aGUgc2FtZSBzdWJzeXN0ZW0tbGV2ZWwgKGUuZy4gcGxhdGZvcm0gYnVzIHR5cGUpIGFuZCBkZXZpY2UgZHJpdmVyIHBvd2VyCi1tYW5hZ2VtZW50IGNhbGxiYWNrcyBpbiBtYW55IGRpZmZlcmVudCBwb3dlciBkb21haW4gY29uZmlndXJhdGlvbnMgYW5kIHdhbnRpbmcKLXRvIGF2b2lkIGluY29ycG9yYXRpbmcgdGhlIHN1cHBvcnQgZm9yIHBvd2VyIGRvbWFpbnMgaW50byB0aGUgc3Vic3lzdGVtLWxldmVsCi1jYWxsYmFja3MuICBUaGUgb3RoZXIgcGxhdGZvcm1zIG5lZWQgbm90IGltcGxlbWVudCBpdCBvciB0YWtlIGl0IGludG8gYWNjb3VudAotaW4gYW55IHdheS4KLQotCi1TeXN0ZW0gRGV2aWNlcwotLS0tLS0tLS0tLS0tLS0KLVN5c3RlbSBkZXZpY2VzIChzeXNkZXZzKSBmb2xsb3cgYSBzbGlnaHRseSBkaWZmZXJlbnQgQVBJLCB3aGljaCBjYW4gYmUgZm91bmQgaW4KLQotCWluY2x1ZGUvbGludXgvc3lzZGV2LmgKLQlkcml2ZXJzL2Jhc2Uvc3lzLmMKLQotU3lzdGVtIGRldmljZXMgd2lsbCBiZSBzdXNwZW5kZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCBhbmQgYWZ0ZXIgYWxsIG90aGVyCi1kZXZpY2VzIGhhdmUgYmVlbiBzdXNwZW5kZWQuICBPbiByZXN1bWUsIHRoZXkgd2lsbCBiZSByZXN1bWVkIGJlZm9yZSBhbnkgb3RoZXIKLWRldmljZXMsIGFuZCBhbHNvIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gIFRoZXNlIHRoaW5ncyBvY2N1ciBpbiBzcGVjaWFsCi0ic3lzZGV2X2RyaXZlciIgcGhhc2VzLCB3aGljaCBhZmZlY3Qgb25seSBzeXN0ZW0gZGV2aWNlcy4KLQotVGh1cywgYWZ0ZXIgdGhlIHN1c3BlbmRfbm9pcnEgKG9yIGZyZWV6ZV9ub2lycSBvciBwb3dlcm9mZl9ub2lycSkgcGhhc2UsIHdoZW4KLXRoZSBub24tYm9vdCBDUFVzIGFyZSBhbGwgb2ZmbGluZSBhbmQgSVJRcyBhcmUgZGlzYWJsZWQgb24gdGhlIHJlbWFpbmluZyBvbmxpbmUKLUNQVSwgdGhlbiBhIHN5c2Rldl9kcml2ZXIuc3VzcGVuZCBwaGFzZSBpcyBjYXJyaWVkIG91dCwgYW5kIHRoZSBzeXN0ZW0gZW50ZXJzIGEKLXNsZWVwIHN0YXRlIChvciBhIHN5c3RlbSBpbWFnZSBpcyBjcmVhdGVkKS4gIER1cmluZyByZXN1bWUgKG9yIGFmdGVyIHRoZSBpbWFnZQotaGFzIGJlZW4gY3JlYXRlZCBvciBsb2FkZWQpIGEgc3lzZGV2X2RyaXZlci5yZXN1bWUgcGhhc2UgaXMgY2FycmllZCBvdXQsIElSUXMKLWFyZSBlbmFibGVkIG9uIHRoZSBvbmx5IG9ubGluZSBDUFUsIHRoZSBub24tYm9vdCBDUFVzIGFyZSBlbmFibGVkLCBhbmQgdGhlCi1yZXN1bWVfbm9pcnEgKG9yIHRoYXdfbm9pcnEgb3IgcmVzdG9yZV9ub2lycSkgcGhhc2UgYmVnaW5zLgotCi1Db2RlIHRvIGFjdHVhbGx5IGVudGVyIGFuZCBleGl0IHRoZSBzeXN0ZW0td2lkZSBsb3cgcG93ZXIgc3RhdGUgc29tZXRpbWVzCi1pbnZvbHZlcyBoYXJkd2FyZSBkZXRhaWxzIHRoYXQgYXJlIG9ubHkga25vd24gdG8gdGhlIGJvb3QgZmlybXdhcmUsIGFuZAotbWF5IGxlYXZlIGEgQ1BVIHJ1bm5pbmcgc29mdHdhcmUgKGZyb20gU1JBTSBvciBmbGFzaCBtZW1vcnkpIHRoYXQgbW9uaXRvcnMKLXRoZSBzeXN0ZW0gYW5kIG1hbmFnZXMgaXRzIHdha2V1cCBzZXF1ZW5jZS4KK1RoZSBzdXBwb3J0IGZvciBkZXZpY2UgcG93ZXIgbWFuYWdlbWVudCBkb21haW5zIGlzIG9ubHkgcmVsZXZhbnQgdG8gcGxhdGZvcm1zCituZWVkaW5nIHRvIHVzZSB0aGUgc2FtZSBkZXZpY2UgZHJpdmVyIHBvd2VyIG1hbmFnZW1lbnQgY2FsbGJhY2tzIGluIG1hbnkKK2RpZmZlcmVudCBwb3dlciBkb21haW4gY29uZmlndXJhdGlvbnMgYW5kIHdhbnRpbmcgdG8gYXZvaWQgaW5jb3Jwb3JhdGluZyB0aGUKK3N1cHBvcnQgZm9yIHBvd2VyIGRvbWFpbnMgaW50byBzdWJzeXN0ZW0tbGV2ZWwgY2FsbGJhY2tzLCBmb3IgZXhhbXBsZSBieQorbW9kaWZ5aW5nIHRoZSBwbGF0Zm9ybSBidXMgdHlwZS4gIE90aGVyIHBsYXRmb3JtcyBuZWVkIG5vdCBpbXBsZW1lbnQgaXQgb3IgdGFrZQoraXQgaW50byBhY2NvdW50IGluIGFueSB3YXkuCiAKIAogRGV2aWNlIExvdyBQb3dlciAoc3VzcGVuZCkgU3RhdGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAppbmRleCA2NTQwOTdiLi5iMjQ4NzViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKQEAgLTUwMSwxMyArNTAxLDI5IEBACiBzaG91bGQgYmUgdXNlZC4gIE9mIGNvdXJzZSwgZm9yIHRoaXMgcHVycG9zZSB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gaGFzIHRvIGJlCiBlbmFibGVkIGVhcmxpZXIgYnkgY2FsbGluZyBwbV9ydW50aW1lX2VuYWJsZSgpLgogCi1JZiB0aGUgZGV2aWNlIGJ1cyB0eXBlJ3Mgb3IgZHJpdmVyJ3MgLT5wcm9iZSgpIG9yIC0+cmVtb3ZlKCkgY2FsbGJhY2sgcnVucworSWYgdGhlIGRldmljZSBidXMgdHlwZSdzIG9yIGRyaXZlcidzIC0+cHJvYmUoKSBjYWxsYmFjayBydW5zCiBwbV9ydW50aW1lX3N1c3BlbmQoKSBvciBwbV9ydW50aW1lX2lkbGUoKSBvciB0aGVpciBhc3luY2hyb25vdXMgY291bnRlcnBhcnRzLAogdGhleSB3aWxsIGZhaWwgcmV0dXJuaW5nIC1FQUdBSU4sIGJlY2F1c2UgdGhlIGRldmljZSdzIHVzYWdlIGNvdW50ZXIgaXMKLWluY3JlbWVudGVkIGJ5IHRoZSBjb3JlIGJlZm9yZSBleGVjdXRpbmcgLT5wcm9iZSgpIGFuZCAtPnJlbW92ZSgpLiAgU3RpbGwsIGl0Ci1tYXkgYmUgZGVzaXJhYmxlIHRvIHN1c3BlbmQgdGhlIGRldmljZSBhcyBzb29uIGFzIC0+cHJvYmUoKSBvciAtPnJlbW92ZSgpIGhhcwotZmluaXNoZWQsIHNvIHRoZSBQTSBjb3JlIHVzZXMgcG1fcnVudGltZV9pZGxlX3N5bmMoKSB0byBpbnZva2UgdGhlCi1zdWJzeXN0ZW0tbGV2ZWwgaWRsZSBjYWxsYmFjayBmb3IgdGhlIGRldmljZSBhdCB0aGF0IHRpbWUuCitpbmNyZW1lbnRlZCBieSB0aGUgZHJpdmVyIGNvcmUgYmVmb3JlIGV4ZWN1dGluZyAtPnByb2JlKCkuICBTdGlsbCwgaXQgbWF5IGJlCitkZXNpcmFibGUgdG8gc3VzcGVuZCB0aGUgZGV2aWNlIGFzIHNvb24gYXMgLT5wcm9iZSgpIGhhcyBmaW5pc2hlZCwgc28gdGhlIGRyaXZlcgorY29yZSB1c2VzIHBtX3J1bnRpbWVfcHV0X3N5bmMoKSB0byBpbnZva2UgdGhlIHN1YnN5c3RlbS1sZXZlbCBpZGxlIGNhbGxiYWNrIGZvcgordGhlIGRldmljZSBhdCB0aGF0IHRpbWUuCisKK01vcmVvdmVyLCB0aGUgZHJpdmVyIGNvcmUgcHJldmVudHMgcnVudGltZSBQTSBjYWxsYmFja3MgZnJvbSByYWNpbmcgd2l0aCB0aGUgYnVzCitub3RpZmllciBjYWxsYmFjayBpbiBfX2RldmljZV9yZWxlYXNlX2RyaXZlcigpLCB3aGljaCBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlCitub3RpZmllciBpcyB1c2VkIGJ5IHNvbWUgc3Vic3lzdGVtcyB0byBjYXJyeSBvdXQgb3BlcmF0aW9ucyBhZmZlY3RpbmcgdGhlCitydW50aW1lIFBNIGZ1bmN0aW9uYWxpdHkuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcgcG1fcnVudGltZV9nZXRfc3luYygpIGJlZm9yZQorZHJpdmVyX3N5c2ZzX3JlbW92ZSgpIGFuZCB0aGUgQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSIG5vdGlmaWNhdGlvbnMuICBUaGlzCityZXN1bWVzIHRoZSBkZXZpY2UgaWYgaXQncyBpbiB0aGUgc3VzcGVuZGVkIHN0YXRlIGFuZCBwcmV2ZW50cyBpdCBmcm9tCitiZWluZyBzdXNwZW5kZWQgYWdhaW4gd2hpbGUgdGhvc2Ugcm91dGluZXMgYXJlIGJlaW5nIGV4ZWN1dGVkLgorCitUbyBhbGxvdyBidXMgdHlwZXMgYW5kIGRyaXZlcnMgdG8gcHV0IGRldmljZXMgaW50byB0aGUgc3VzcGVuZGVkIHN0YXRlIGJ5CitjYWxsaW5nIHBtX3J1bnRpbWVfc3VzcGVuZCgpIGZyb20gdGhlaXIgLT5yZW1vdmUoKSByb3V0aW5lcywgdGhlIGRyaXZlciBjb3JlCitleGVjdXRlcyBwbV9ydW50aW1lX3B1dF9zeW5jKCkgYWZ0ZXIgcnVubmluZyB0aGUgQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSCitub3RpZmljYXRpb25zIGluIF9fZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCkuICBUaGlzIHJlcXVpcmVzIGJ1cyB0eXBlcyBhbmQKK2RyaXZlcnMgdG8gbWFrZSB0aGVpciAtPnJlbW92ZSgpIGNhbGxiYWNrcyBhdm9pZCByYWNlcyB3aXRoIHJ1bnRpbWUgUE0gZGlyZWN0bHksCitidXQgYWxzbyBpdCBhbGxvd3Mgb2YgbW9yZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2YgZGV2aWNlcyBkdXJpbmcgdGhlCityZW1vdmFsIG9mIHRoZWlyIGRyaXZlcnMuCiAKIFRoZSB1c2VyIHNwYWNlIGNhbiBlZmZlY3RpdmVseSBkaXNhbGxvdyB0aGUgZHJpdmVyIG9mIHRoZSBkZXZpY2UgdG8gcG93ZXIgbWFuYWdlCiBpdCBhdCBydW4gdGltZSBieSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgaXRzIC9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvY29udHJvbApAQCAtNTY2LDExICs1ODIsNiBAQAogCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOwogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CiAKLVRoZSBQTSBjb3JlIGFsd2F5cyBpbmNyZW1lbnRzIHRoZSBydW4tdGltZSB1c2FnZSBjb3VudGVyIGJlZm9yZSBjYWxsaW5nIHRoZQotLT5wcmVwYXJlKCkgY2FsbGJhY2sgYW5kIGRlY3JlbWVudHMgaXQgYWZ0ZXIgY2FsbGluZyB0aGUgLT5jb21wbGV0ZSgpIGNhbGxiYWNrLgotSGVuY2UgZGlzYWJsaW5nIHJ1bi10aW1lIFBNIHRlbXBvcmFyaWx5IGxpa2UgdGhpcyB3aWxsIG5vdCBjYXVzZSBhbnkgcnVuLXRpbWUKLXN1c3BlbmQgY2FsbGJhY2tzIHRvIGJlIGxvc3QuCi0KIDcuIEdlbmVyaWMgc3Vic3lzdGVtIGNhbGxiYWNrcwogCiBTdWJzeXN0ZW1zIG1heSB3aXNoIHRvIGNvbnNlcnZlIGNvZGUgc3BhY2UgYnkgdXNpbmcgdGhlIHNldCBvZiBnZW5lcmljIHBvd2VyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ByaW50ay1mb3JtYXRzLnR4dCBiL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CmluZGV4IDFiNWE1ZGQuLjVkZjE3NmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CkBAIC05LDcgKzksMTIxIEBACiAJCXNpemVfdAkJCSV6dSBvciAlengKIAkJc3NpemVfdAkJCSV6ZCBvciAlengKIAotUmF3IHBvaW50ZXIgdmFsdWUgU0hPVUxEIGJlIHByaW50ZWQgd2l0aCAlcC4KK1JhdyBwb2ludGVyIHZhbHVlIFNIT1VMRCBiZSBwcmludGVkIHdpdGggJXAuIFRoZSBrZXJuZWwgc3VwcG9ydHMKK3RoZSBmb2xsb3dpbmcgZXh0ZW5kZWQgZm9ybWF0IHNwZWNpZmllcnMgZm9yIHBvaW50ZXIgdHlwZXM6CisKK1N5bWJvbHMvRnVuY3Rpb24gUG9pbnRlcnM6CisKKwklcEYJdmVyc2F0aWxlX2luaXQrMHgwLzB4MTEwCisJJXBmCXZlcnNhdGlsZV9pbml0CisJJXBTCXZlcnNhdGlsZV9pbml0KzB4MC8weDExMAorCSVwcwl2ZXJzYXRpbGVfaW5pdAorCSVwQglwcmV2X2ZuX29mX3ZlcnNhdGlsZV9pbml0KzB4ODgvMHg4OAorCisJRm9yIHByaW50aW5nIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLiBUaGUgJ1MnIGFuZCAncycgc3BlY2lmaWVycworCXJlc3VsdCBpbiB0aGUgc3ltYm9sIG5hbWUgd2l0aCAoJ1MnKSBvciB3aXRob3V0ICgncycpIG9mZnNldHMuIFdoZXJlCisJdGhpcyBpcyB1c2VkIG9uIGEga2VybmVsIHdpdGhvdXQgS0FMTFNZTVMgLSB0aGUgc3ltYm9sIGFkZHJlc3MgaXMKKwlwcmludGVkIGluc3RlYWQuCisKKwlUaGUgJ0InIHNwZWNpZmllciByZXN1bHRzIGluIHRoZSBzeW1ib2wgbmFtZSB3aXRoIG9mZnNldHMgYW5kIHNob3VsZCBiZQorCXVzZWQgd2hlbiBwcmludGluZyBzdGFjayBiYWNrdHJhY2VzLiBUaGUgc3BlY2lmaWVyIHRha2VzIGludG8KKwljb25zaWRlcmF0aW9uIHRoZSBlZmZlY3Qgb2YgY29tcGlsZXIgb3B0aW1pc2F0aW9ucyB3aGljaCBtYXkgb2NjdXIKKwl3aGVuIHRhaWwtY2FsbCdzIGFyZSB1c2VkIGFuZCBtYXJrZWQgd2l0aCB0aGUgbm9yZXR1cm4gR0NDIGF0dHJpYnV0ZS4KKworCU9uIGlhNjQsIHBwYzY0IGFuZCBwYXJpc2M2NCBhcmNoaXRlY3R1cmVzIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZQorCWFjdHVhbGx5IGZ1bmN0aW9uIGRlc2NyaXB0b3JzIHdoaWNoIG11c3QgZmlyc3QgYmUgcmVzb2x2ZWQuIFRoZSAnRicgYW5kCisJJ2YnIHNwZWNpZmllcnMgcGVyZm9ybSB0aGlzIHJlc29sdXRpb24gYW5kIHRoZW4gcHJvdmlkZSB0aGUgc2FtZQorCWZ1bmN0aW9uYWxpdHkgYXMgdGhlICdTJyBhbmQgJ3MnIHNwZWNpZmllcnMuCisKK0tlcm5lbCBQb2ludGVyczoKKworCSVwSwkweDAxMjM0NTY3IG9yIDB4MDEyMzQ1Njc4OWFiY2RlZgorCisJRm9yIHByaW50aW5nIGtlcm5lbCBwb2ludGVycyB3aGljaCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdW5wcml2aWxlZ2VkCisJdXNlcnMuIFRoZSBiZWhhdmlvdXIgb2YgJXBLIGRlcGVuZHMgb24gdGhlIGtwdHJfcmVzdHJpY3Qgc3lzY3RsIC0gc2VlCisJRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorCitTdHJ1Y3QgUmVzb3VyY2VzOgorCisJJXByCVttZW0gMHg2MDAwMDAwMC0weDZmZmZmZmZmIGZsYWdzIDB4MjIwMF0gb3IKKwkJW21lbSAweDAwMDAwMDAwNjAwMDAwMDAtMHgwMDAwMDAwMDZmZmZmZmZmIGZsYWdzIDB4MjIwMF0KKwklcFIJW21lbSAweDYwMDAwMDAwLTB4NmZmZmZmZmYgcHJlZl0gb3IKKwkJW21lbSAweDAwMDAwMDAwNjAwMDAwMDAtMHgwMDAwMDAwMDZmZmZmZmZmIHByZWZdCisKKwlGb3IgcHJpbnRpbmcgc3RydWN0IHJlc291cmNlcy4gVGhlICdSJyBhbmQgJ3InIHNwZWNpZmllcnMgcmVzdWx0IGluIGEKKwlwcmludGVkIHJlc291cmNlIHdpdGggKCdSJykgb3Igd2l0aG91dCAoJ3InKSBhIGRlY29kZWQgZmxhZ3MgbWVtYmVyLgorCitNQUMvRkRESSBhZGRyZXNzZXM6CisKKwklcE0JMDA6MDE6MDI6MDM6MDQ6MDUKKwklcE1GCTAwLTAxLTAyLTAzLTA0LTA1CisJJXBtCTAwMDEwMjAzMDQwNQorCisJRm9yIHByaW50aW5nIDYtYnl0ZSBNQUMvRkRESSBhZGRyZXNzZXMgaW4gaGV4IG5vdGF0aW9uLiBUaGUgJ00nIGFuZCAnbScKKwlzcGVjaWZpZXJzIHJlc3VsdCBpbiBhIHByaW50ZWQgYWRkcmVzcyB3aXRoICgnTScpIG9yIHdpdGhvdXQgKCdtJykgYnl0ZQorCXNlcGFyYXRvcnMuIFRoZSBkZWZhdWx0IGJ5dGUgc2VwYXJhdG9yIGlzIHRoZSBjb2xvbiAoJzonKS4KKworCVdoZXJlIEZEREkgYWRkcmVzc2VzIGFyZSBjb25jZXJuZWQgdGhlICdGJyBzcGVjaWZpZXIgY2FuIGJlIHVzZWQgYWZ0ZXIKKwl0aGUgJ00nIHNwZWNpZmllciB0byB1c2UgZGFzaCAoJy0nKSBzZXBhcmF0b3JzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKKwlzZXBhcmF0b3IuCisKK0lQdjQgYWRkcmVzc2VzOgorCisJJXBJNAkxLjIuMy40CisJJXBpNAkwMDEuMDAyLjAwMy4wMDQKKwklcFtJaV1baG5ibF0KKworCUZvciBwcmludGluZyBJUHY0IGRvdC1zZXBhcmF0ZWQgZGVjaW1hbCBhZGRyZXNzZXMuIFRoZSAnSTQnIGFuZCAnaTQnCisJc3BlY2lmaWVycyByZXN1bHQgaW4gYSBwcmludGVkIGFkZHJlc3Mgd2l0aCAoJ2k0Jykgb3Igd2l0aG91dCAoJ0k0JykKKwlsZWFkaW5nIHplcm9zLgorCisJVGhlIGFkZGl0aW9uYWwgJ2gnLCAnbicsICdiJywgYW5kICdsJyBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIHNwZWNpZnkKKwlob3N0LCBuZXR3b3JrLCBiaWcgb3IgbGl0dGxlIGVuZGlhbiBvcmRlciBhZGRyZXNzZXMgcmVzcGVjdGl2ZWx5LiBXaGVyZQorCW5vIHNwZWNpZmllciBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCBuZXR3b3JrL2JpZyBlbmRpYW4gb3JkZXIgaXMgdXNlZC4KKworSVB2NiBhZGRyZXNzZXM6CisKKwklcEk2CTAwMDE6MDAwMjowMDAzOjAwMDQ6MDAwNTowMDA2OjAwMDc6MDAwOAorCSVwaTYJMDAwMTAwMDIwMDAzMDAwNDAwMDUwMDA2MDAwNzAwMDgKKwklcEk2YwkxOjI6Mzo0OjU6Njo3OjgKKworCUZvciBwcmludGluZyBJUHY2IG5ldHdvcmstb3JkZXIgMTYtYml0IGhleCBhZGRyZXNzZXMuIFRoZSAnSTYnIGFuZCAnaTYnCisJc3BlY2lmaWVycyByZXN1bHQgaW4gYSBwcmludGVkIGFkZHJlc3Mgd2l0aCAoJ0k2Jykgb3Igd2l0aG91dCAoJ2k2JykKKwljb2xvbi1zZXBhcmF0b3JzLiBMZWFkaW5nIHplcm9zIGFyZSBhbHdheXMgdXNlZC4KKworCVRoZSBhZGRpdGlvbmFsICdjJyBzcGVjaWZpZXIgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJ0knIHNwZWNpZmllciB0bworCXByaW50IGEgY29tcHJlc3NlZCBJUHY2IGFkZHJlc3MgYXMgZGVzY3JpYmVkIGJ5CisJaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk1MgorCitVVUlEL0dVSUQgYWRkcmVzc2VzOgorCisJJXBVYgkwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYKKwklcFVCCTAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBBMEIwQzBEMEUwRgorCSVwVWwJMDMwMjAxMDAtMDUwNC0wNzA2LTA4MDktMGEwYjBjMGUwZTBmCisJJXBVTAkwMzAyMDEwMC0wNTA0LTA3MDYtMDgwOS0wQTBCMEMwRTBFMEYKKworCUZvciBwcmludGluZyAxNi1ieXRlIFVVSUQvR1VJRHMgYWRkcmVzc2VzLiBUaGUgYWRkaXRpb25hbCAnbCcsICdMJywKKwknYicgYW5kICdCJyBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXR0bGUgZW5kaWFuIG9yZGVyIGluCisJbG93ZXIgKCdsJykgb3IgdXBwZXIgY2FzZSAoJ0wnKSBoZXggY2hhcmFjdGVycyAtIGFuZCBiaWcgZW5kaWFuIG9yZGVyCisJaW4gbG93ZXIgKCdiJykgb3IgdXBwZXIgY2FzZSAoJ0InKSBoZXggY2hhcmFjdGVycy4KKworCVdoZXJlIG5vIGFkZGl0aW9uYWwgc3BlY2lmaWVycyBhcmUgdXNlZCB0aGUgZGVmYXVsdCBsaXR0bGUgZW5kaWFuCisJb3JkZXIgd2l0aCBsb3dlciBjYXNlIGhleCBjaGFyYWN0ZXJzIHdpbGwgYmUgcHJpbnRlZC4KKworc3RydWN0IHZhX2Zvcm1hdDoKKworCSVwVgorCisJRm9yIHByaW50aW5nIHN0cnVjdCB2YV9mb3JtYXQgc3RydWN0dXJlcy4gVGhlc2UgY29udGFpbiBhIGZvcm1hdCBzdHJpbmcKKwlhbmQgdmFfbGlzdCBhcyBmb2xsb3dzOgorCisJc3RydWN0IHZhX2Zvcm1hdCB7CisJCWNvbnN0IGNoYXIgKmZtdDsKKwkJdmFfbGlzdCAqdmE7CisJfTsKKworCURvIG5vdCB1c2UgdGhpcyBmZWF0dXJlIHdpdGhvdXQgc29tZSBtZWNoYW5pc20gdG8gdmVyaWZ5IHRoZQorCWNvcnJlY3RuZXNzIG9mIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCB2YV9saXN0IGFyZ3VtZW50cy4KIAogdTY0IFNIT1VMRCBiZSBwcmludGVkIHdpdGggJWxsdS8lbGx4LCAodW5zaWduZWQgbG9uZyBsb25nKToKIApAQCAtMzIsNCArMTQ2LDUgQEAKIFRoYW5rIHlvdSBmb3IgeW91ciBjb29wZXJhdGlvbiBhbmQgYXR0ZW50aW9uLgogCiAKLUJ5IFJhbmR5IER1bmxhcCA8cmR1bmxhcEB4ZW5vdGltZS5uZXQ+CitCeSBSYW5keSBEdW5sYXAgPHJkdW5sYXBAeGVub3RpbWUubmV0PiBhbmQKK0FuZHJldyBNdXJyYXkgPGFtdXJyYXlAbXBjLWRhdGEuY28udWs+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlc2lnbi1DRlMudHh0CmluZGV4IDk5OTYxOTkuLjkxZWNmZjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlc2lnbi1DRlMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlc2lnbi1DRlMudHh0CkBAIC0yMjMsOSArMjIzLDEwIEBACiBncm91cCBjcmVhdGVkIHVzaW5nIHRoZSBwc2V1ZG8gZmlsZXN5c3RlbS4gIFNlZSBleGFtcGxlIHN0ZXBzIGJlbG93IHRvIGNyZWF0ZQogdGFzayBncm91cHMgYW5kIG1vZGlmeSB0aGVpciBDUFUgc2hhcmUgdXNpbmcgdGhlICJjZ3JvdXBzIiBwc2V1ZG8gZmlsZXN5c3RlbS4KIAotCSMgbWtkaXIgL2Rldi9jcHVjdGwKLQkjIG1vdW50IC10IGNncm91cCAtb2NwdSBub25lIC9kZXYvY3B1Y3RsCi0JIyBjZCAvZGV2L2NwdWN0bAorCSMgbW91bnQgLXQgdG1wZnMgY2dyb3VwX3Jvb3QgL3N5cy9mcy9jZ3JvdXAKKwkjIG1rZGlyIC9zeXMvZnMvY2dyb3VwL2NwdQorCSMgbW91bnQgLXQgY2dyb3VwIC1vY3B1IG5vbmUgL3N5cy9mcy9jZ3JvdXAvY3B1CisJIyBjZCAvc3lzL2ZzL2Nncm91cC9jcHUKIAogCSMgbWtkaXIgbXVsdGltZWRpYQkjIGNyZWF0ZSAibXVsdGltZWRpYSIgZ3JvdXAgb2YgdGFza3MKIAkjIG1rZGlyIGJyb3dzZXIJCSMgY3JlYXRlICJicm93c2VyIiBncm91cCBvZiB0YXNrcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0CmluZGV4IDYwNWIwZDQuLjcxYjU0ZDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQKQEAgLTEyOSw5ICsxMjksOCBAQAogRW5hYmxpbmcgQ09ORklHX1JUX0dST1VQX1NDSEVEIGxldHMgeW91IGV4cGxpY2l0bHkgYWxsb2NhdGUgcmVhbAogQ1BVIGJhbmR3aWR0aCB0byB0YXNrIGdyb3Vwcy4KIAotVGhpcyB1c2VzIHRoZSAvY2dyb3VwIHZpcnR1YWwgZmlsZSBzeXN0ZW0gYW5kCi0iL2Nncm91cC88Y2dyb3VwPi9jcHUucnRfcnVudGltZV91cyIgdG8gY29udHJvbCB0aGUgQ1BVIHRpbWUgcmVzZXJ2ZWQgZm9yIGVhY2gKLWNvbnRyb2wgZ3JvdXAuCitUaGlzIHVzZXMgdGhlIGNncm91cCB2aXJ0dWFsIGZpbGUgc3lzdGVtIGFuZCAiPGNncm91cD4vY3B1LnJ0X3J1bnRpbWVfdXMiCit0byBjb250cm9sIHRoZSBDUFUgdGltZSByZXNlcnZlZCBmb3IgZWFjaCBjb250cm9sIGdyb3VwLgogCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3b3JraW5nIHdpdGggY29udHJvbCBncm91cHMsIHlvdSBzaG91bGQgcmVhZAogRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0IGFzIHdlbGwuCkBAIC0xNTAsNyArMTQ5LDcgQEAKID09PT09PT09PT09PT09PQogCiBUaGVyZSBpcyB3b3JrIGluIHByb2dyZXNzIHRvIG1ha2UgdGhlIHNjaGVkdWxpbmcgcGVyaW9kIGZvciBlYWNoIGdyb3VwCi0oIi9jZ3JvdXAvPGNncm91cD4vY3B1LnJ0X3BlcmlvZF91cyIpIGNvbmZpZ3VyYWJsZSBhcyB3ZWxsLgorKCI8Y2dyb3VwPi9jcHUucnRfcGVyaW9kX3VzIikgY29uZmlndXJhYmxlIGFzIHdlbGwuCiAKIFRoZSBjb25zdHJhaW50IG9uIHRoZSBwZXJpb2QgaXMgdGhhdCBhIHN1Ymdyb3VwIG11c3QgaGF2ZSBhIHNtYWxsZXIgb3IKIGVxdWFsIHBlcmlvZCB0byBpdHMgcGFyZW50LiBCdXQgcmVhbGlzdGljYWxseSBpdHMgbm90IHZlcnkgdXNlZnVsIF95ZXRfCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKaW5kZXggMmUzYzY0Yi4uOWRiZTg4NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dApAQCAtMTMsMTggKzEzLDggQEAKIFRoZSBhYm92ZSBpcyBhbHdheXMgc2FmZS4gSXQgd2lsbCBkaXNhYmxlIGludGVycnVwdHMgX2xvY2FsbHlfLCBidXQgdGhlCiBzcGlubG9jayBpdHNlbGYgd2lsbCBndWFyYW50ZWUgdGhlIGdsb2JhbCBsb2NrLCBzbyBpdCB3aWxsIGd1YXJhbnRlZSB0aGF0CiB0aGVyZSBpcyBvbmx5IG9uZSB0aHJlYWQtb2YtY29udHJvbCB3aXRoaW4gdGhlIHJlZ2lvbihzKSBwcm90ZWN0ZWQgYnkgdGhhdAotbG9jay4gVGhpcyB3b3JrcyB3ZWxsIGV2ZW4gdW5kZXIgVVAuIFRoZSBhYm92ZSBzZXF1ZW5jZSB1bmRlciBVUAotZXNzZW50aWFsbHkgaXMganVzdCB0aGUgc2FtZSBhcyBkb2luZwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKLQkgLi4uIGNyaXRpY2FsIHNlY3Rpb24gLi4uCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLXNvIHRoZSBjb2RlIGRvZXMgX25vdF8gbmVlZCB0byB3b3JyeSBhYm91dCBVUCB2cyBTTVAgaXNzdWVzOiB0aGUgc3BpbmxvY2tzCi13b3JrIGNvcnJlY3RseSB1bmRlciBib3RoIChhbmQgc3BpbmxvY2tzIGFyZSBhY3R1YWxseSBtb3JlIGVmZmljaWVudCBvbgotYXJjaGl0ZWN0dXJlcyB0aGF0IGFsbG93IGRvaW5nIHRoZSAic2F2ZV9mbGFncyArIGNsaSIgaW4gb25lIG9wZXJhdGlvbikuCitsb2NrLiBUaGlzIHdvcmtzIHdlbGwgZXZlbiB1bmRlciBVUCBhbHNvLCBzbyB0aGUgY29kZSBkb2VzIF9ub3RfIG5lZWQgdG8KK3dvcnJ5IGFib3V0IFVQIHZzIFNNUCBpc3N1ZXM6IHRoZSBzcGlubG9ja3Mgd29yayBjb3JyZWN0bHkgdW5kZXIgYm90aC4KIAogICAgTk9URSEgSW1wbGljYXRpb25zIG9mIHNwaW5fbG9ja3MgZm9yIG1lbW9yeSBhcmUgZnVydGhlciBkZXNjcmliZWQgaW46CiAKQEAgLTM2LDI3ICsyNiw3IEBACiBzcGlubG9jayBmb3IgbW9zdCB0aGluZ3MgLSB1c2luZyBtb3JlIHRoYW4gb25lIHNwaW5sb2NrIGNhbiBtYWtlIHRoaW5ncyBhCiBsb3QgbW9yZSBjb21wbGV4IGFuZCBldmVuIHNsb3dlciBhbmQgaXMgdXN1YWxseSB3b3J0aCBpdCBvbmx5IGZvcgogc2VxdWVuY2VzIHRoYXQgeW91IF9rbm93XyBuZWVkIHRvIGJlIHNwbGl0IHVwOiBhdm9pZCBpdCBhdCBhbGwgY29zdCBpZiB5b3UKLWFyZW4ndCBzdXJlKS4gSE9XRVZFUiwgaXQgX2RvZXNfIG1lYW4gdGhhdCBpZiB5b3UgaGF2ZSBzb21lIGNvZGUgdGhhdCBkb2VzCi0KLQljbGkoKTsKLQkuLiBjcml0aWNhbCBzZWN0aW9uIC4uCi0Jc3RpKCk7Ci0KLWFuZCBhbm90aGVyIHNlcXVlbmNlIHRoYXQgZG9lcwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoZmxhZ3MpOwotCS4uIGNyaXRpY2FsIHNlY3Rpb24gLi4KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKLQotdGhlbiB0aGV5IGFyZSBOT1QgbXV0dWFsbHkgZXhjbHVzaXZlLCBhbmQgdGhlIGNyaXRpY2FsIHJlZ2lvbnMgY2FuIGhhcHBlbgotYXQgdGhlIHNhbWUgdGltZSBvbiB0d28gZGlmZmVyZW50IENQVSdzLiBUaGF0J3MgZmluZSBwZXIgc2UsIGJ1dCB0aGUKLWNyaXRpY2FsIHJlZ2lvbnMgaGFkIGJldHRlciBiZSBjcml0aWNhbCBmb3IgZGlmZmVyZW50IHRoaW5ncyAoaWUgdGhleQotY2FuJ3Qgc3RvbXAgb24gZWFjaCBvdGhlcikuCi0KLVRoZSBhYm92ZSBpcyBhIHByb2JsZW0gbWFpbmx5IGlmIHlvdSBlbmQgdXAgbWl4aW5nIGNvZGUgLSBmb3IgZXhhbXBsZSB0aGUKLXJvdXRpbmVzIGluIGxsX3J3X2Jsb2NrKCkgdGVuZCB0byB1c2UgY2xpL3N0aSB0byBwcm90ZWN0IHRoZSBhdG9taWNpdHkgb2YKLXRoZWlyIGFjdGlvbnMsIGFuZCBpZiBhIGRyaXZlciB1c2VzIHNwaW5sb2NrcyBpbnN0ZWFkIHRoZW4geW91IHNob3VsZAotdGhpbmsgYWJvdXQgaXNzdWVzIGxpa2UgdGhlIGFib3ZlLgorYXJlbid0IHN1cmUpLgogCiBUaGlzIGlzIHJlYWxseSB0aGUgb25seSByZWFsbHkgaGFyZCBwYXJ0IGFib3V0IHNwaW5sb2Nrczogb25jZSB5b3Ugc3RhcnQKIHVzaW5nIHNwaW5sb2NrcyB0aGV5IHRlbmQgdG8gZXhwYW5kIHRvIGFyZWFzIHlvdSBtaWdodCBub3QgaGF2ZSBub3RpY2VkCkBAIC0xMjAsMTEgKzkwLDEwIEBACiAKIFRoZSBzaW5nbGUgc3Bpbi1sb2NrIHByaW1pdGl2ZXMgYWJvdmUgYXJlIGJ5IG5vIG1lYW5zIHRoZSBvbmx5IG9uZXMuIFRoZXkKIGFyZSB0aGUgbW9zdCBzYWZlIG9uZXMsIGFuZCB0aGUgb25lcyB0aGF0IHdvcmsgdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMsCi1idXQgcGFydGx5IF9iZWNhdXNlXyB0aGV5IGFyZSBzYWZlIHRoZXkgYXJlIGFsc28gZmFpcmx5IHNsb3cuIFRoZXkgYXJlCi1tdWNoIGZhc3RlciB0aGFuIGEgZ2VuZXJpYyBnbG9iYWwgY2xpL3N0aSBwYWlyLCBidXQgc2xvd2VyIHRoYW4gdGhleSdkCi1uZWVkIHRvIGJlLCBiZWNhdXNlIHRoZXkgZG8gaGF2ZSB0byBkaXNhYmxlIGludGVycnVwdHMgKHdoaWNoIGlzIGp1c3QgYQotc2luZ2xlIGluc3RydWN0aW9uIG9uIGEgeDg2LCBidXQgaXQncyBhbiBleHBlbnNpdmUgb25lIC0gYW5kIG9uIG90aGVyCi1hcmNoaXRlY3R1cmVzIGl0IGNhbiBiZSB3b3JzZSkuCitidXQgcGFydGx5IF9iZWNhdXNlXyB0aGV5IGFyZSBzYWZlIHRoZXkgYXJlIGFsc28gZmFpcmx5IHNsb3cuIFRoZXkgYXJlIHNsb3dlcgordGhhbiB0aGV5J2QgbmVlZCB0byBiZSwgYmVjYXVzZSB0aGV5IGRvIGhhdmUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzCisod2hpY2ggaXMganVzdCBhIHNpbmdsZSBpbnN0cnVjdGlvbiBvbiBhIHg4NiwgYnV0IGl0J3MgYW4gZXhwZW5zaXZlIG9uZSAtCithbmQgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcyBpdCBjYW4gYmUgd29yc2UpLgogCiBJZiB5b3UgaGF2ZSBhIGNhc2Ugd2hlcmUgeW91IGhhdmUgdG8gcHJvdGVjdCBhIGRhdGEgc3RydWN0dXJlIGFjcm9zcwogc2V2ZXJhbCBDUFUncyBhbmQgeW91IHdhbnQgdG8gdXNlIHNwaW5sb2NrcyB5b3UgY2FuIHBvdGVudGlhbGx5IHVzZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvZXJyb3ItY29kZXMudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvZXJyb3ItY29kZXMudHh0CmluZGV4IGQ4MzcwM2UuLmIzZjYwNmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL2Vycm9yLWNvZGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9lcnJvci1jb2Rlcy50eHQKQEAgLTc2LDYgKzc2LDEzIEBACiByZXBvcnRlZC4gIFRoYXQncyBiZWNhdXNlIHRyYW5zZmVycyBvZnRlbiBpbnZvbHZlIHNldmVyYWwgcGFja2V0cywgc28gdGhhdAogb25lIG9yIG1vcmUgcGFja2V0cyBjb3VsZCBmaW5pc2ggYmVmb3JlIGFuIGVycm9yIHN0b3BzIGZ1cnRoZXIgZW5kcG9pbnQgSS9PLgogCitGb3IgaXNvY2hyb25vdXMgVVJCcywgdGhlIHVyYiBzdGF0dXMgdmFsdWUgaXMgbm9uLXplcm8gb25seSBpZiB0aGUgVVJCIGlzCit1bmxpbmtlZCwgdGhlIGRldmljZSBpcyByZW1vdmVkLCB0aGUgaG9zdCBjb250cm9sbGVyIGlzIGRpc2FibGVkLCBvciB0aGUgdG90YWwKK3RyYW5zZmVycmVkIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBsZW5ndGggYW5kIHRoZSBVUkJfU0hPUlRfTk9UX09LCitmbGFnIGlzIHNldC4gIENvbXBsZXRpb24gaGFuZGxlcnMgZm9yIGlzb2Nocm9ub3VzIFVSQnMgc2hvdWxkIG9ubHkgc2VlCit1cmItPnN0YXR1cyBzZXQgdG8gemVybywgLUVOT0VOVCwgLUVDT05OUkVTRVQsIC1FU0hVVERPV04sIG9yIC1FUkVNT1RFSU8uCitJbmRpdmlkdWFsIGZyYW1lIGRlc2NyaXB0b3Igc3RhdHVzIGZpZWxkcyBtYXkgcmVwb3J0IG1vcmUgc3RhdHVzIGNvZGVzLgorCiAKIDAJCQlUcmFuc2ZlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CiAKQEAgLTEzMiw3ICsxMzksNyBAQAogCQkJZGV2aWNlIHJlbW92YWwgZXZlbnRzIGltbWVkaWF0ZWx5LgogCiAtRVhERVYJCQlJU08gdHJhbnNmZXIgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkCi0JCQlsb29rIGF0IGluZGl2aWR1YWwgZnJhbWUgc3RhdHVzIGZvciBkZXRhaWxzCisJCQkob25seSBzZXQgaW4gaXNvX2ZyYW1lX2Rlc2Nbbl0uc3RhdHVzLCBub3QgdXJiLT5zdGF0dXMpCiAKIC1FSU5WQUwJCQlJU08gbWFkbmVzcywgaWYgdGhpcyBoYXBwZW5zOiBMb2cgb2ZmIGFuZCBnbyBob21lCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L01ha2VmaWxlCmluZGV4IGJlYmFjNmIuLjBhYzM0MjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMgVGhpcyBjcmVhdGVzIHRoZSBkZW1vbnN0cmF0aW9uIHV0aWxpdHkgImxndWVzdCIgd2hpY2ggcnVucyBhIExpbnV4IGd1ZXN0LgotIyBNaXNzaW5nIGhlYWRlcnM/ICBBZGQgIi1JLi4vLi4vaW5jbHVkZSAtSS4uLy4uL2FyY2gveDg2L2luY2x1ZGUiCisjIE1pc3NpbmcgaGVhZGVycz8gIEFkZCAiLUkuLi8uLi8uLi9pbmNsdWRlIC1JLi4vLi4vLi4vYXJjaC94ODYvaW5jbHVkZSIKIENGTEFHUzo9LW0zMiAtV2FsbCAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIC1PMyAtVV9GT1JUSUZZX1NPVVJDRQogCiBhbGw6IGxndWVzdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QuYyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvbGd1ZXN0LmMKaW5kZXggZDlkYTdlMS4uY2Q5ZDZhZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC5jCkBAIC00OSw3ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlydGlvX3JuZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19yaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGd1ZXN0X2xhdW5jaGVyLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9saW51eC9sZ3Vlc3RfbGF1bmNoZXIuaCIKIC8qTDoxMTAKICAqIFdlIGNhbiBpZ25vcmUgdGhlIDQyIGluY2x1ZGUgZmlsZXMgd2UgbmVlZCBmb3IgdGhpcyBwcm9ncmFtLCBidXQgSSBkbyB3YW50CiAgKiB0byBkcmF3IGF0dGVudGlvbiB0byB0aGUgdXNlIG9mIGtlcm5lbC1zdHlsZSB0eXBlcy4KQEAgLTEzNSw5ICsxMzUsNiBAQAogCS8qIElzIGl0IG9wZXJhdGlvbmFsICovCiAJYm9vbCBydW5uaW5nOwogCi0JLyogRG9lcyBHdWVzdCB3YW50IGFuIGludHJydXB0IG9uIGVtcHR5PyAqLwotCWJvb2wgaXJxX29uX2VtcHR5OwotCiAJLyogRGV2aWNlLXNwZWNpZmljIGRhdGEuICovCiAJdm9pZCAqcHJpdjsKIH07CkBAIC02MzcsMTAgKzYzNCw3IEBACiAKIAkvKiBJZiB0aGV5IGRvbid0IHdhbnQgYW4gaW50ZXJydXB0LCBkb24ndCBzZW5kIG9uZS4uLiAqLwogCWlmICh2cS0+dnJpbmcuYXZhaWwtPmZsYWdzICYgVlJJTkdfQVZBSUxfRl9OT19JTlRFUlJVUFQpIHsKLQkJLyogLi4uIHVubGVzcyB0aGV5J3ZlIGFza2VkIHVzIHRvIGZvcmNlIG9uZSBvbiBlbXB0eS4gKi8KLQkJaWYgKCF2cS0+ZGV2LT5pcnFfb25fZW1wdHkKLQkJICAgIHx8IGxnX2xhc3RfYXZhaWwodnEpICE9IHZxLT52cmluZy5hdmFpbC0+aWR4KQotCQkJcmV0dXJuOworCQlyZXR1cm47CiAJfQogCiAJLyogU2VuZCB0aGUgR3Vlc3QgYW4gaW50ZXJydXB0IHRlbGwgdGhlbSB3ZSB1c2VkIHNvbWV0aGluZyB1cC4gKi8KQEAgLTEwNTcsMTUgKzEwNTEsNiBAQAogCWNsb3NlKHZxLT5ldmVudGZkKTsKIH0KIAotc3RhdGljIGJvb2wgYWNjZXB0ZWRfZmVhdHVyZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JY29uc3QgdTggKmZlYXR1cmVzID0gZ2V0X2ZlYXR1cmVfYml0cyhkZXYpICsgZGV2LT5mZWF0dXJlX2xlbjsKLQotCWlmIChkZXYtPmZlYXR1cmVfbGVuIDwgYml0IC8gQ0hBUl9CSVQpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gZmVhdHVyZXNbYml0IC8gQ0hBUl9CSVRdICYgKDEgPDwgKGJpdCAlIENIQVJfQklUKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHN0YXJ0X2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0xMDc5LDggKzEwNjQsNiBAQAogCQl2ZXJib3NlKCIgJTAyeCIsIGdldF9mZWF0dXJlX2JpdHMoZGV2KQogCQkJW2Rldi0+ZmVhdHVyZV9sZW4raV0pOwogCi0JZGV2LT5pcnFfb25fZW1wdHkgPSBhY2NlcHRlZF9mZWF0dXJlKGRldiwgVklSVElPX0ZfTk9USUZZX09OX0VNUFRZKTsKLQogCWZvciAodnEgPSBkZXYtPnZxOyB2cTsgdnEgPSB2cS0+bmV4dCkgewogCQlpZiAodnEtPnNlcnZpY2UpCiAJCQljcmVhdGVfdGhyZWFkKHZxKTsKQEAgLTE1NjQsNyArMTU0Nyw2IEBACiAJLyogU2V0IHVwIHRoZSB0dW4gZGV2aWNlLiAqLwogCWNvbmZpZ3VyZV9kZXZpY2UoaXBmZCwgdGFwaWYsIGlwKTsKIAotCWFkZF9mZWF0dXJlKGRldiwgVklSVElPX0ZfTk9USUZZX09OX0VNUFRZKTsKIAkvKiBFeHBlY3QgR3Vlc3QgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgZXhjZXB0IFVGTyAqLwogCWFkZF9mZWF0dXJlKGRldiwgVklSVElPX05FVF9GX0NTVU0pOwogCWFkZF9mZWF0dXJlKGRldiwgVklSVElPX05FVF9GX0dVRVNUX0NTVU0pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9od3BvaXNvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL2h3cG9pc29uLnR4dAppbmRleCAxMmY5YmEyLi41NTAwNjg0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL2h3cG9pc29uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2h3cG9pc29uLnR4dApAQCAtMTI5LDEyICsxMjksMTIgQEAKIG9mIHRoZSBtZW1jZy4KIAogRXhhbXBsZToKLSAgICAgICAgbWtkaXIgL2Nncm91cC9od3BvaXNvbgorICAgICAgICBta2RpciAvc3lzL2ZzL2Nncm91cC9tZW0vaHdwb2lzb24KIAogICAgICAgICB1c2VtZW0gLW0gMTAwIC1zIDEwMDAgJgotICAgICAgICBlY2hvIGBqb2JzIC1wYCA+IC9jZ3JvdXAvaHdwb2lzb24vdGFza3MKKyAgICAgICAgZWNobyBgam9icyAtcGAgPiAvc3lzL2ZzL2Nncm91cC9tZW0vaHdwb2lzb24vdGFza3MKIAotICAgICAgICBtZW1jZ19pbm89JChscyAtaWQgL2Nncm91cC9od3BvaXNvbiB8IGN1dCAtZjEgLWQnICcpCisgICAgICAgIG1lbWNnX2lubz0kKGxzIC1pZCAvc3lzL2ZzL2Nncm91cC9tZW0vaHdwb2lzb24gfCBjdXQgLWYxIC1kJyAnKQogICAgICAgICBlY2hvICRtZW1jZ19pbm8gPiAvZGVidWcvaHdwb2lzb24vY29ycnVwdC1maWx0ZXItbWVtY2cKIAogICAgICAgICBwYWdlLXR5cGVzIC1wIGBwaWRvZiBpbml0YCAgIC0taHdwb2lzb24gICMgc2hhbGwgZG8gbm90aGluZwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyOTgwMWY3Li4xODcyODJkIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNTk0LDYgKzU5NCwxNiBAQAogRjoJYXJjaC9hcm0vbGliL2Zsb3BweWRtYS5TCiBGOglhcmNoL2FybS9pbmNsdWRlL2FzbS9mbG9wcHkuaAogCitBUk0gUE1VIFBST0ZJTElORyBBTkQgREVCVUdHSU5HCitNOglXaWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CWFyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50KgorRjoJYXJjaC9hcm0vb3Byb2ZpbGUvY29tbW9uLmMKK0Y6CWFyY2gvYXJtL2tlcm5lbC9wbXUuYworRjoJYXJjaC9hcm0vaW5jbHVkZS9hc20vcG11LmgKK0Y6CWFyY2gvYXJtL2tlcm5lbC9od19icmVha3BvaW50LmMKK0Y6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAorCiBBUk0gUE9SVAogTToJUnVzc2VsbCBLaW5nIDxsaW51eEBhcm0ubGludXgub3JnLnVrPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTEzNDUsMTYgKzEzNTUsMTggQEAKIEY6CWluY2x1ZGUvbGludXgvY2ZhZzEyODY0Yi5oCiAKIEFWUjMyIEFSQ0hJVEVDVFVSRQotTToJSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGFucy1jaHJpc3RpYW4uZWd0dmVkdEBhdG1lbC5jb20+CitNOglIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGdtYWlsLmNvbT4KK006CUhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGVndHZlZHRAc2FtZnVuZGV0Lm5vPgogVzoJaHR0cDovL3d3dy5hdG1lbC5jb20vcHJvZHVjdHMvQVZSMzIvCiBXOglodHRwOi8vYXZyMzJsaW51eC5vcmcvCiBXOglodHRwOi8vYXZyZnJlYWtzLm5ldC8KLVM6CVN1cHBvcnRlZAorUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9hdnIzMi8KIAogQVZSMzIvQVQzMkFQIE1BQ0hJTkUgU1VQUE9SVAotTToJSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGFucy1jaHJpc3RpYW4uZWd0dmVkdEBhdG1lbC5jb20+Ci1TOglTdXBwb3J0ZWQKK006CUhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AZ21haWwuY29tPgorTToJSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+CitTOglNYWludGFpbmVkCiBGOglhcmNoL2F2cjMyL21hY2gtYXQzMmFwLwogCiBBWC4yNSBORVRXT1JLIExBWUVSCkBAIC0xMzkwLDcgKzE0MDIsNiBAQAogQkFUTUFOIEFEVkFOQ0VECiBNOglNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgogTToJU2ltb24gV3VuZGVybGljaCA8c2l3dUBocnoudHUtY2hlbW5pdHouZGU+Ci1NOglTdmVuIEVja2VsbWFubiA8c3ZlbkBuYXJmYXRpb24ub3JnPgogTDoJYi5hLnQubS5hLm5AbGlzdHMub3Blbi1tZXNoLm9yZwogVzoJaHR0cDovL3d3dy5vcGVuLW1lc2gub3JnLwogUzoJTWFpbnRhaW5lZApAQCAtMTQyMyw3ICsxNDM0LDYgQEAKIEY6CWFyY2gvYmxhY2tmaW4vCiAKIEJMQUNLRklOIEVNQUMgRFJJVkVSCi1NOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KIEw6CXVjbGludXgtZGlzdC1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnCiBTOglTdXBwb3J0ZWQKQEAgLTE2MzksNyArMTY0OSw3IEBACiBNOglPbGl2ZXIgSGFydGtvcHAgPHNvY2tldGNhbkBoYXJ0a29wcC5uZXQ+CiBNOglPbGl2ZXIgSGFydGtvcHAgPG9saXZlci5oYXJ0a29wcEB2b2xrc3dhZ2VuLmRlPgogTToJVXJzIFRodWVybWFubiA8dXJzLnRodWVybWFubkB2b2xrc3dhZ2VuLmRlPgotTDoJc29ja2V0Y2FuLWNvcmVAbGlzdHMuYmVybGlvcy5kZQorTDoJc29ja2V0Y2FuLWNvcmVAbGlzdHMuYmVybGlvcy5kZSAoc3Vic2NyaWJlcnMtb25seSkKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9zb2NrZXRjYW4vCiBTOglNYWludGFpbmVkCkBAIC0xNjUxLDcgKzE2NjEsNyBAQAogCiBDQU4gTkVUV09SSyBEUklWRVJTCiBNOglXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KLUw6CXNvY2tldGNhbi1jb3JlQGxpc3RzLmJlcmxpb3MuZGUKK0w6CXNvY2tldGNhbi1jb3JlQGxpc3RzLmJlcmxpb3MuZGUgKHN1YnNjcmliZXJzLW9ubHkpCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vZGV2ZWxvcGVyLmJlcmxpb3MuZGUvcHJvamVjdHMvc29ja2V0Y2FuLwogUzoJTWFpbnRhaW5lZApAQCAtMTczOSw3ICsxNzQ5LDcgQEAKIEY6CWRyaXZlcnMvbmV0L2VuaWMvCiAKIENJUlJVUyBMT0dJQyBFUDkzWFggRVRIRVJORVQgRFJJVkVSCi1NOglMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgorTToJSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYwpAQCAtMTg4OSw3ICsxODk5LDYgQEAKIFc6CWh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvcHJvamVjdHMvY3B1ZnJlcS8KIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZGF2ZWovY3B1ZnJlcS5naXQKIFM6CU1haW50YWluZWQKLUY6CWFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS8KIEY6CWRyaXZlcnMvY3B1ZnJlcS8KIEY6CWluY2x1ZGUvbGludXgvY3B1ZnJlcS5oCiAKQEAgLTIxOTgsNyArMjIwNyw3IEBACiBET0NVTUVOVEFUSU9OCiBNOglSYW5keSBEdW5sYXAgPHJkdW5sYXBAeGVub3RpbWUubmV0PgogTDoJbGludXgtZG9jQHZnZXIua2VybmVsLm9yZwotVDoJcXVpbHQgb3NzLm9yYWNsZS5jb20vfnJkdW5sYXAva2VybmVsLWRvYy1wYXRjaGVzL2N1cnJlbnQvCitUOglxdWlsdCBodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35yZHVubGFwL2tlcm5lbC1kb2MtcGF0Y2hlcy9jdXJyZW50LwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi8KIApAQCAtMjI5Miw4ICsyMzAxLDcgQEAKIAogRUJUQUJMRVMKIE06CUJhcnQgRGUgU2NodXltZXIgPGJhcnQuZGUuc2NodXltZXJAcGFuZG9yYS5iZT4KLUw6CWVidGFibGVzLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1MOgllYnRhYmxlcy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CW5ldGZpbHRlci1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9lYnRhYmxlcy5zb3VyY2Vmb3JnZS5uZXQvCiBTOglNYWludGFpbmVkCiBGOglpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XyouaApAQCAtMzgyMCw2ICszODI4LDEyIEBACiBGOglkcml2ZXJzL2xlZHMvCiBGOglpbmNsdWRlL2xpbnV4L2xlZHMuaAogCitMRUdBQ1kgRUVQUk9NIERSSVZFUgorTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CitTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9lZXByb20KK0Y6CWRyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMKKwogTEVHTyBVU0IgVG93ZXIgZHJpdmVyCiBNOglKdWVyZ2VuIFN0dWJlciA8c3RhcmJsdWVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogTDoJbGVnb3VzYi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKQEAgLTQxNDUsNyArNDE1OSw3IEBACiBGOgltbS8KIAogTUVNT1JZIFJFU09VUkNFIENPTlRST0xMRVIKLU06CUJhbGJpciBTaW5naCA8YmFsYmlyQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CUJhbGJpciBTaW5naCA8YnNpbmdoYXJvcmFAZ21haWwuY29tPgogTToJRGFpc3VrZSBOaXNoaW11cmEgPG5pc2hpbXVyYUBteHAubmVzLm5lYy5jby5qcD4KIE06CUtBTUVaQVdBIEhpcm95dWtpIDxrYW1lemF3YS5oaXJveXVAanAuZnVqaXRzdS5jb20+CiBMOglsaW51eC1tbUBrdmFjay5vcmcKQEAgLTQyNTIsOCArNDI2Niw3IEBACiBGOglpbmNsdWRlL2xpbnV4L21tYy8KIAogTVVMVElNRURJQSBDQVJEIChNTUMpIEVUQy4gT1ZFUiBTUEkKLU06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotUzoJT2RkIEZpeGVzCitTOglPcnBoYW4KIEY6CWRyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCiBGOglpbmNsdWRlL2xpbnV4L3NwaS9tbWNfc3BpLmgKIApAQCAtNDYwMyw3ICs0NjE2LDYgQEAKIAogT01BUCBVU0IgU1VQUE9SVAogTToJRmVsaXBlIEJhbGJpIDxiYWxiaUB0aS5jb20+Ci1NOglEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LW9tYXBAdmdlci5rZXJuZWwub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2JhbGJpL3VzYi5naXQKQEAgLTQ4OTIsNyArNDkwNCw3IEBACiBGOglhcmNoLyovaW5jbHVkZS9hc20vcGVyY3B1LmgKIAogUEVSLVRBU0sgREVMQVkgQUNDT1VOVElORwotTToJQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorTToJQmFsYmlyIFNpbmdoIDxic2luZ2hhcm9yYUBnbWFpbC5jb20+CiBTOglNYWludGFpbmVkCiBGOglpbmNsdWRlL2xpbnV4L2RlbGF5YWNjdC5oCiBGOglrZXJuZWwvZGVsYXlhY2N0LmMKQEAgLTQ5NDcsNiArNDk1OSw3IEBACiBGOglkcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXVuaWNvcmUzMmlvLmgKIEY6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHV2My5jCiBGOglkcml2ZXJzL3ZpZGVvL2ZiLXB1djMuYworRjoJZHJpdmVycy9ydGMvcnRjLXB1djMuYwogCiBQTUMgU0lFUlJBIE1heFJBSUQgRFJJVkVSCiBNOglBbmlsIFJhdmluZHJhbmF0aCA8YW5pbF9yYXZpbmRyYW5hdGhAcG1jLXNpZXJyYS5jb20+CkBAIC00OTc5LDcgKzQ5OTIsNyBAQAogCiBQTlAgU1VQUE9SVAogTToJQWRhbSBCZWxheSA8YWJlbGF5QG1pdC5lZHU+Ci1NOglCam9ybiBIZWxnYWFzIDxiam9ybi5oZWxnYWFzQGhwLmNvbT4KK006CUJqb3JuIEhlbGdhYXMgPGJoZWxnYWFzQGdvb2dsZS5jb20+CiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3BucC8KIApAQCAtNTE3OCw2ICs1MTkxLDcgQEAKIEY6CWRyaXZlcnMvbmV0L3FsY25pYy8KIAogUUxPR0lDIFFMR0UgMTBHYiBFVEhFUk5FVCBEUklWRVIKK006CUppdGVuZHJhIEthbHNhcmlhIDxqaXRlbmRyYS5rYWxzYXJpYUBxbG9naWMuY29tPgogTToJUm9uIE1lcmNlciA8cm9uLm1lcmNlckBxbG9naWMuY29tPgogTToJbGludXgtZHJpdmVyQHFsb2dpYy5jb20KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTU5ODQsNyArNTk5OCw2IEBACiBGOglkcml2ZXJzL3N0YWdpbmcvdHR5L3NwZWNpYWxpeCoKIAogU1BJIFNVQlNZU1RFTQotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBNOglHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CiBMOglzcGktZGV2ZWwtZ2VuZXJhbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFE6CWh0dHA6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L3NwaS1kZXZlbC1nZW5lcmFsL2xpc3QvCkBAIC02MTAwLDcgKzYxMTMsNyBAQAogRjoJRG9jdW1lbnRhdGlvbi90YXJnZXQvCiAKIFRBU0tTVEFUUyBTVEFUSVNUSUNTIElOVEVSRkFDRQotTToJQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorTToJQmFsYmlyIFNpbmdoIDxic2luZ2hhcm9yYUBnbWFpbC5jb20+CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzKgogRjoJaW5jbHVkZS9saW51eC90YXNrc3RhdHMqCkBAIC02NDMyLDkgKzY0NDUsOSBAQAogRjoJZHJpdmVycy91c2IvbWlzYy9yaW81MDAqCiAKIFVTQiBFSENJIERSSVZFUgotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitNOglBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotUzoJT2RkIEZpeGVzCitTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3VzYi9laGNpLnR4dAogRjoJZHJpdmVycy91c2IvaG9zdC9laGNpKgogCkBAIC02NDQ4LDkgKzY0NjEsMTAgQEAKIEY6CWRyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvCiAKIFVTQiBHQURHRVQvUEVSSVBIRVJBTCBTVUJTWVNURU0KLU06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorTToJRmVsaXBlIEJhbGJpIDxiYWxiaUB0aS5jb20+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvZ2FkZ2V0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2JhbGJpL3VzYi5naXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvdXNiL2dhZGdldC8KIEY6CWluY2x1ZGUvbGludXgvdXNiL2dhZGdldCoKQEAgLTY0NjAsOSArNjQ3NCwxNSBAQAogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qaWtvcy9oaWQuZ2l0CiBTOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL3VzYi9oaWRkZXYudHh0CitGOglEb2N1bWVudGF0aW9uL2hpZC9oaWRkZXYudHh0CiBGOglkcml2ZXJzL2hpZC91c2JoaWQvCiAKK1VTQi9JUCBEUklWRVJTCitNOglNYXR0IE1vb25leSA8bWZtQG11dGVkZGlzay5jb20+CitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvdXNiaXAvCisKIFVTQiBJU1AxMTZYIERSSVZFUgogTToJT2xhdiBLb25nYXMgPG9rQGFydGVjZGVzaWduLmVlPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwpAQCAtNjQ5Miw5ICs2NTEyLDkgQEAKIEY6CXNvdW5kL3VzYi9taWRpLioKIAogVVNCIE9IQ0kgRFJJVkVSCi1NOglEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK006CUFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1TOglPZGQgRml4ZXMKK1M6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vdXNiL29oY2kudHh0CiBGOglkcml2ZXJzL3VzYi9ob3N0L29oY2kqCiAKQEAgLTY3MjAsNiArNjc0MCwxNSBAQAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZmF0LnR4dAogRjoJZnMvZmF0LwogCitWSURFT0JVRjIgRlJBTUVXT1JLCitNOglQYXdlbCBPc2NpYWsgPHBhd2VsQG9zY2lhay5jb20+CitNOglNYXJlayBTenlwcm93c2tpIDxtLnN6eXByb3dza2lAc2Ftc3VuZy5jb20+CitNOglLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi0qCitGOglpbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi0qCisKIFZJUlRJTyBDT05TT0xFIERSSVZFUgogTToJQW1pdCBTaGFoIDxhbWl0LnNoYWhAcmVkaGF0LmNvbT4KIEw6CXZpcnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCkBAIC02OTk3LDYgKzcwMjYsMTMgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvcGxhdGZvcm0veDg2CiAKK1g4NiBNQ0UgSU5GUkFTVFJVQ1RVUkUKK006CVRvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KK006CUJvcmlzbGF2IFBldGtvdiA8YnBAYW1kNjQub3JnPgorTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWFyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrLyoKKwogWEVOIEhZUEVSVklTT1IgSU5URVJGQUNFCiBNOglKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXkuZml0emhhcmRpbmdlQGNpdHJpeC5jb20+CiBNOglLb25yYWQgUnplc3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+CmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IGFmYjhlMGQuLjYwZDkxZjcgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDMKIFBBVENITEVWRUwgPSAwCiBTVUJMRVZFTCA9IDAKLUVYVFJBVkVSU0lPTiA9IC1yYzEKK0VYVFJBVkVSU0lPTiA9IC1yYzcKIE5BTUUgPSBTbmVha3kgV2Vhc2VsCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0zNzgsNyArMzc4LDcgQEAKIAogIyBSZWFkIEtFUk5FTFJFTEVBU0UgZnJvbSBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSAoaWYgaXQgZXhpc3RzKQogS0VSTkVMUkVMRUFTRSA9ICQoc2hlbGwgY2F0IGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlIDI+IC9kZXYvbnVsbCkKLUtFUk5FTFZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKK0tFUk5FTFZFUlNJT04gPSAkKFZFUlNJT04pJChpZiAkKFBBVENITEVWRUwpLC4kKFBBVENITEVWRUwpJChpZiAkKFNVQkxFVkVMKSwuJChTVUJMRVZFTCkpKSQoRVhUUkFWRVJTSU9OKQogCiBleHBvcnQgVkVSU0lPTiBQQVRDSExFVkVMIFNVQkxFVkVMIEtFUk5FTFJFTEVBU0UgS0VSTkVMVkVSU0lPTgogZXhwb3J0IEFSQ0ggU1JDQVJDSCBDT05GSUdfU0hFTEwgSE9TVENDIEhPU1RDRkxBR1MgQ1JPU1NfQ09NUElMRSBBUyBMRCBDQwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIAogZGVmaW5lIGZpbGVjaGtfdmVyc2lvbi5oCiAJKGVjaG8gXCNkZWZpbmUgTElOVVhfVkVSU0lPTl9DT0RFICQoc2hlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlleHByICQoVkVSU0lPTikgXCogNjU1MzYgKyAkKFBBVENITEVWRUwpIFwqIDI1NiArICQoU1VCTEVWRUwpKTsgICAgIFwKKwlleHByICQoVkVSU0lPTikgXCogNjU1MzYgKyAwJChQQVRDSExFVkVMKSBcKiAyNTYgKyAwJChTVUJMRVZFTCkpOyAgICBcCiAJZWNobyAnI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSknOykKIGVuZGVmCiAKQEAgLTExMTAsMTEgKzExMTAsNiBAQAogCiBQSE9OWSArPSBfbW9kaW5zdF8KIF9tb2RpbnN0XzoKLQlAaWYgWyAteiAiYCQoREVQTU9EKSAtViAyPi9kZXYvbnVsbCB8IGdyZXAgbW9kdWxlLWluaXQtdG9vbHNgIiBdOyB0aGVuIFwKLQkJZWNobyAiV2FybmluZzogeW91IG1heSBuZWVkIHRvIGluc3RhbGwgbW9kdWxlLWluaXQtdG9vbHMiOyBcCi0JCWVjaG8gIlNlZSBodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL2RvY3MvcG9zdC1oYWxsb3dlZW4tMi42LnR4dCI7XAotCQlzbGVlcCAxOyBcCi0JZmkKIAlAcm0gLXJmICQoTU9ETElCKS9rZXJuZWwKIAlAcm0gLWYgJChNT0RMSUIpL3NvdXJjZQogCUBta2RpciAtcCAkKE1PRExJQikva2VybmVsCkBAIC0xNTMxLDEyICsxNTI2LDggQEAKIAogIyBSdW4gZGVwbW9kIG9ubHkgaWYgd2UgaGF2ZSBTeXN0ZW0ubWFwIGFuZCBkZXBtb2QgaXMgZXhlY3V0YWJsZQogcXVpZXRfY21kX2RlcG1vZCA9IERFUE1PRCAgJChLRVJORUxSRUxFQVNFKQotICAgICAgY21kX2RlcG1vZCA9IFwKLQlpZiBbIC1yIFN5c3RlbS5tYXAgLWEgLXggJChERVBNT0QpIF07IHRoZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSQoREVQTU9EKSAtYWUgLUYgU3lzdGVtLm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSQoaWYgJChzdHJpcCAkKElOU1RBTExfTU9EX1BBVEgpKSwgLWIgJChJTlNUQUxMX01PRF9QQVRIKSApICAgICBcCi0JCSQoS0VSTkVMUkVMRUFTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZmkKKyAgICAgIGNtZF9kZXBtb2QgPSAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2RlcG1vZC5zaCAkKERFUE1PRCkgXAorICAgICAgICAgICAgICAgICAgICQoS0VSTkVMUkVMRUFTRSkKIAogIyBDcmVhdGUgdGVtcG9yYXJ5IGRpciBmb3IgbW9kdWxlIHN1cHBvcnQgZmlsZXMKICMgY2xlYW4gaXQgdXAgb25seSB3aGVuIGJ1aWxkaW5nIGFsbCBtb2R1bGVzCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggODUxMDAxNy4uMGQ1YTdkZCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw2ICsxLDYgQEAKLQlMaW51eCBrZXJuZWwgcmVsZWFzZSAyLjYueHggPGh0dHA6Ly9rZXJuZWwub3JnLz4KKwlMaW51eCBrZXJuZWwgcmVsZWFzZSAzLnggPGh0dHA6Ly9rZXJuZWwub3JnLz4KIAotVGhlc2UgYXJlIHRoZSByZWxlYXNlIG5vdGVzIGZvciBMaW51eCB2ZXJzaW9uIDIuNi4gIFJlYWQgdGhlbSBjYXJlZnVsbHksCitUaGVzZSBhcmUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIExpbnV4IHZlcnNpb24gMy4gIFJlYWQgdGhlbSBjYXJlZnVsbHksCiBhcyB0aGV5IHRlbGwgeW91IHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQsIGV4cGxhaW4gaG93IHRvIGluc3RhbGwgdGhlCiBrZXJuZWwsIGFuZCB3aGF0IHRvIGRvIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiAKIApAQCAtNjIsMTAgKzYyLDEwIEBACiAgICBkaXJlY3Rvcnkgd2hlcmUgeW91IGhhdmUgcGVybWlzc2lvbnMgKGVnLiB5b3VyIGhvbWUgZGlyZWN0b3J5KSBhbmQKICAgIHVucGFjayBpdDoKIAotCQlnemlwIC1jZCBsaW51eC0yLjYuWFgudGFyLmd6IHwgdGFyIHh2ZiAtCisJCWd6aXAgLWNkIGxpbnV4LTMuWC50YXIuZ3ogfCB0YXIgeHZmIC0KIAogICAgb3IKLQkJYnppcDIgLWRjIGxpbnV4LTIuNi5YWC50YXIuYnoyIHwgdGFyIHh2ZiAtCisJCWJ6aXAyIC1kYyBsaW51eC0zLlgudGFyLmJ6MiB8IHRhciB4dmYgLQogCiAKICAgIFJlcGxhY2UgIlhYIiB3aXRoIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGF0ZXN0IGtlcm5lbC4KQEAgLTc1LDE1ICs3NSwxNSBAQAogICAgZmlsZXMuICBUaGV5IHNob3VsZCBtYXRjaCB0aGUgbGlicmFyeSwgYW5kIG5vdCBnZXQgbWVzc2VkIHVwIGJ5CiAgICB3aGF0ZXZlciB0aGUga2VybmVsLWR1LWpvdXIgaGFwcGVucyB0byBiZS4KIAotIC0gWW91IGNhbiBhbHNvIHVwZ3JhZGUgYmV0d2VlbiAyLjYueHggcmVsZWFzZXMgYnkgcGF0Y2hpbmcuICBQYXRjaGVzIGFyZQorIC0gWW91IGNhbiBhbHNvIHVwZ3JhZGUgYmV0d2VlbiAzLnggcmVsZWFzZXMgYnkgcGF0Y2hpbmcuICBQYXRjaGVzIGFyZQogICAgZGlzdHJpYnV0ZWQgaW4gdGhlIHRyYWRpdGlvbmFsIGd6aXAgYW5kIHRoZSBuZXdlciBiemlwMiBmb3JtYXQuICBUbwogICAgaW5zdGFsbCBieSBwYXRjaGluZywgZ2V0IGFsbCB0aGUgbmV3ZXIgcGF0Y2ggZmlsZXMsIGVudGVyIHRoZQotICAgdG9wIGxldmVsIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZSAobGludXgtMi42Lnh4KSBhbmQgZXhlY3V0ZToKKyAgIHRvcCBsZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2UgKGxpbnV4LTMueCkgYW5kIGV4ZWN1dGU6CiAKLQkJZ3ppcCAtY2QgLi4vcGF0Y2gtMi42Lnh4Lmd6IHwgcGF0Y2ggLXAxCisJCWd6aXAgLWNkIC4uL3BhdGNoLTMueC5neiB8IHBhdGNoIC1wMQogCiAgICBvcgotCQliemlwMiAtZGMgLi4vcGF0Y2gtMi42Lnh4LmJ6MiB8IHBhdGNoIC1wMQorCQliemlwMiAtZGMgLi4vcGF0Y2gtMy54LmJ6MiB8IHBhdGNoIC1wMQogCiAgICAocmVwZWF0IHh4IGZvciBhbGwgdmVyc2lvbnMgYmlnZ2VyIHRoYW4gdGhlIHZlcnNpb24gb2YgeW91ciBjdXJyZW50CiAgICBzb3VyY2UgdHJlZSwgX2luX29yZGVyXykgYW5kIHlvdSBzaG91bGQgYmUgb2suICBZb3UgbWF5IHdhbnQgdG8gcmVtb3ZlCkBAIC05MSw5ICs5MSw5IEBACiAgICBmYWlsZWQgcGF0Y2hlcyAoeHh4IyBvciB4eHgucmVqKS4gSWYgdGhlcmUgYXJlLCBlaXRoZXIgeW91IG9yIG1lIGhhcwogICAgbWFkZSBhIG1pc3Rha2UuCiAKLSAgIFVubGlrZSBwYXRjaGVzIGZvciB0aGUgMi42Lngga2VybmVscywgcGF0Y2hlcyBmb3IgdGhlIDIuNi54Lnkga2VybmVscworICAgVW5saWtlIHBhdGNoZXMgZm9yIHRoZSAzLngga2VybmVscywgcGF0Y2hlcyBmb3IgdGhlIDMueC55IGtlcm5lbHMKICAgIChhbHNvIGtub3duIGFzIHRoZSAtc3RhYmxlIGtlcm5lbHMpIGFyZSBub3QgaW5jcmVtZW50YWwgYnV0IGluc3RlYWQgYXBwbHkKLSAgIGRpcmVjdGx5IHRvIHRoZSBiYXNlIDIuNi54IGtlcm5lbC4gIFBsZWFzZSByZWFkCisgICBkaXJlY3RseSB0byB0aGUgYmFzZSAzLngga2VybmVsLiAgUGxlYXNlIHJlYWQKICAgIERvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKICAgIEFsdGVybmF0aXZlbHksIHRoZSBzY3JpcHQgcGF0Y2gta2VybmVsIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRlIHRoaXMKQEAgLTEwNywxNCArMTA3LDE0IEBACiAgICBhbiBhbHRlcm5hdGl2ZSBkaXJlY3RvcnkgY2FuIGJlIHNwZWNpZmllZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgogCiAgLSBJZiB5b3UgYXJlIHVwZ3JhZGluZyBiZXR3ZWVuIHJlbGVhc2VzIHVzaW5nIHRoZSBzdGFibGUgc2VyaWVzIHBhdGNoZXMKLSAgIChmb3IgZXhhbXBsZSwgcGF0Y2gtMi42Lnh4LnkpLCBub3RlIHRoYXQgdGhlc2UgImRvdC1yZWxlYXNlcyIgYXJlCi0gICBub3QgaW5jcmVtZW50YWwgYW5kIG11c3QgYmUgYXBwbGllZCB0byB0aGUgMi42Lnh4IGJhc2UgdHJlZS4gRm9yCi0gICBleGFtcGxlLCBpZiB5b3VyIGJhc2Uga2VybmVsIGlzIDIuNi4xMiBhbmQgeW91IHdhbnQgdG8gYXBwbHkgdGhlCi0gICAyLjYuMTIuMyBwYXRjaCwgeW91IGRvIG5vdCBhbmQgaW5kZWVkIG11c3Qgbm90IGZpcnN0IGFwcGx5IHRoZQotICAgMi42LjEyLjEgYW5kIDIuNi4xMi4yIHBhdGNoZXMuIFNpbWlsYXJseSwgaWYgeW91IGFyZSBydW5uaW5nIGtlcm5lbAotICAgdmVyc2lvbiAyLjYuMTIuMiBhbmQgd2FudCB0byBqdW1wIHRvIDIuNi4xMi4zLCB5b3UgbXVzdCBmaXJzdAotICAgcmV2ZXJzZSB0aGUgMi42LjEyLjIgcGF0Y2ggKHRoYXQgaXMsIHBhdGNoIC1SKSBfYmVmb3JlXyBhcHBseWluZwotICAgdGhlIDIuNi4xMi4zIHBhdGNoLgorICAgKGZvciBleGFtcGxlLCBwYXRjaC0zLngueSksIG5vdGUgdGhhdCB0aGVzZSAiZG90LXJlbGVhc2VzIiBhcmUKKyAgIG5vdCBpbmNyZW1lbnRhbCBhbmQgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSAzLnggYmFzZSB0cmVlLiBGb3IKKyAgIGV4YW1wbGUsIGlmIHlvdXIgYmFzZSBrZXJuZWwgaXMgMy4wIGFuZCB5b3Ugd2FudCB0byBhcHBseSB0aGUKKyAgIDMuMC4zIHBhdGNoLCB5b3UgZG8gbm90IGFuZCBpbmRlZWQgbXVzdCBub3QgZmlyc3QgYXBwbHkgdGhlCisgICAzLjAuMSBhbmQgMy4wLjIgcGF0Y2hlcy4gU2ltaWxhcmx5LCBpZiB5b3UgYXJlIHJ1bm5pbmcga2VybmVsCisgICB2ZXJzaW9uIDMuMC4yIGFuZCB3YW50IHRvIGp1bXAgdG8gMy4wLjMsIHlvdSBtdXN0IGZpcnN0CisgICByZXZlcnNlIHRoZSAzLjAuMiBwYXRjaCAodGhhdCBpcywgcGF0Y2ggLVIpIF9iZWZvcmVfIGFwcGx5aW5nCisgICB0aGUgMy4wLjMgcGF0Y2guCiAgICBZb3UgY2FuIHJlYWQgbW9yZSBvbiB0aGlzIGluIERvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKIAogIC0gTWFrZSBzdXJlIHlvdSBoYXZlIG5vIHN0YWxlIC5vIGZpbGVzIGFuZCBkZXBlbmRlbmNpZXMgbHlpbmcgYXJvdW5kOgpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIFNPRlRXQVJFIFJFUVVJUkVNRU5UUwogCi0gICBDb21waWxpbmcgYW5kIHJ1bm5pbmcgdGhlIDIuNi54eCBrZXJuZWxzIHJlcXVpcmVzIHVwLXRvLWRhdGUKKyAgIENvbXBpbGluZyBhbmQgcnVubmluZyB0aGUgMy54IGtlcm5lbHMgcmVxdWlyZXMgdXAtdG8tZGF0ZQogICAgdmVyc2lvbnMgb2YgdmFyaW91cyBzb2Z0d2FyZSBwYWNrYWdlcy4gIENvbnN1bHQKICAgIERvY3VtZW50YXRpb24vQ2hhbmdlcyBmb3IgdGhlIG1pbmltdW0gdmVyc2lvbiBudW1iZXJzIHJlcXVpcmVkCiAgICBhbmQgaG93IHRvIGdldCB1cGRhdGVzIGZvciB0aGVzZSBwYWNrYWdlcy4gIEJld2FyZSB0aGF0IHVzaW5nCkBAIC0xNDIsMTEgKzE0MiwxMSBAQAogICAgVXNpbmcgdGhlIG9wdGlvbiAibWFrZSBPPW91dHB1dC9kaXIiIGFsbG93IHlvdSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZQogICAgcGxhY2UgZm9yIHRoZSBvdXRwdXQgZmlsZXMgKGluY2x1ZGluZyAuY29uZmlnKS4KICAgIEV4YW1wbGU6Ci0gICAgIGtlcm5lbCBzb3VyY2UgY29kZToJL3Vzci9zcmMvbGludXgtMi42Lk4KKyAgICAga2VybmVsIHNvdXJjZSBjb2RlOgkvdXNyL3NyYy9saW51eC0zLk4KICAgICAgYnVpbGQgZGlyZWN0b3J5OgkJL2hvbWUvbmFtZS9idWlsZC9rZXJuZWwKIAogICAgVG8gY29uZmlndXJlIGFuZCBidWlsZCB0aGUga2VybmVsIHVzZToKLSAgIGNkIC91c3Ivc3JjL2xpbnV4LTIuNi5OCisgICBjZCAvdXNyL3NyYy9saW51eC0zLk4KICAgIG1ha2UgTz0vaG9tZS9uYW1lL2J1aWxkL2tlcm5lbCBtZW51Y29uZmlnCiAgICBtYWtlIE89L2hvbWUvbmFtZS9idWlsZC9rZXJuZWwKICAgIHN1ZG8gbWFrZSBPPS9ob21lL25hbWUvYnVpbGQva2VybmVsIG1vZHVsZXNfaW5zdGFsbCBpbnN0YWxsCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9tbXpvbmUuaAppbmRleCA4YWY1NmNlLi40NDVkYzQyIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTU2LDcgKzU2LDYgQEAKICAqIEdpdmVuIGEga2VybmVsIGFkZHJlc3MsIGZpbmQgdGhlIGhvbWUgbm9kZSBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkuCiAgKi8KICNkZWZpbmUga3ZhZGRyX3RvX25pZChrYWRkcikJcGFfdG9fbmlkKF9fcGEoa2FkZHIpKQotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCiAKIC8qCiAgKiBHaXZlbiBhIGthZGRyLCBMT0NBTF9CQVNFX0FERFIgZmluZHMgdGhlIG93bmluZyBub2RlIG9mIHRoZSBtZW1vcnkKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYwppbmRleCAzNzZmMjIxLi4zMjZmMGEyIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC00MDksNyArNDA5LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsZW4gPSBuYW1lbGVuOwotCWlmIChuYW1lbGVuID4gMzIpCisJaWYgKGxlbiA+IDMyKQogCQlsZW4gPSAzMjsKIAogCWRvd25fcmVhZCgmdXRzX3NlbSk7CkBAIC01OTQsNyArNTk0LDcgQEAKIAlkb3duX3JlYWQoJnV0c19zZW0pOwogCXJlcyA9IHN5c2luZm9fdGFibGVbb2Zmc2V0XTsKIAlsZW4gPSBzdHJsZW4ocmVzKSsxOwotCWlmIChsZW4gPiBjb3VudCkKKwlpZiAoKHVuc2lnbmVkIGxvbmcpbGVuID4gKHVuc2lnbmVkIGxvbmcpY291bnQpCiAJCWxlbiA9IGNvdW50OwogCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByZXMsIGxlbikpCiAJCWVyciA9IC1FRkFVTFQ7CkBAIC02NDksNyArNjQ5LDcgQEAKIAkJcmV0dXJuIDE7CiAKIAljYXNlIEdTSV9HRVRfSFdSUEI6Ci0JCWlmIChuYnl0ZXMgPCBzaXplb2YoKmh3cnBiKSkKKwkJaWYgKG5ieXRlcyA+IHNpemVvZigqaHdycGIpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBod3JwYiwgbmJ5dGVzKSAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMDA4LDYgKzEwMDgsNyBAQAogewogCXN0cnVjdCBydXNhZ2UgcjsKIAlsb25nIHJldCwgZXJyOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOwogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKIAlpZiAoIXVyKQpAQCAtMTAxNiwxMyArMTAxNywxNSBAQAogCW9sZF9mcyA9IGdldF9mcygpOwogCQkKIAlzZXRfZnMgKEtFUk5FTF9EUyk7Ci0JcmV0ID0gc3lzX3dhaXQ0KHBpZCwgdXN0YXR1cywgb3B0aW9ucywgKHN0cnVjdCBydXNhZ2UgX191c2VyICopICZyKTsKKwlyZXQgPSBzeXNfd2FpdDQocGlkLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSAmc3RhdHVzLCBvcHRpb25zLAorCQkJKHN0cnVjdCBydXNhZ2UgX191c2VyICopICZyKTsKIAlzZXRfZnMgKG9sZF9mcyk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVyLCBzaXplb2YoKnVyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJZXJyID0gMDsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdHVzLCB1c3RhdHVzKTsKIAllcnIgfD0gX19wdXRfdXNlcihyLnJ1X3V0aW1lLnR2X3NlYywgJnVyLT5ydV91dGltZS50dl9zZWMpOwogCWVyciB8PSBfX3B1dF91c2VyKHIucnVfdXRpbWUudHZfdXNlYywgJnVyLT5ydV91dGltZS50dl91c2VjKTsKIAllcnIgfD0gX19wdXRfdXNlcihyLnJ1X3N0aW1lLnR2X3NlYywgJnVyLT5ydV9zdGltZS50dl9zZWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggZjlkYTQxOS4uOTQwYjIwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC01OTcsNiArNTk3LDggQEAKIAkJc3ViCXBjLCBsciwgcjAsIGxzciAjMzIJQCBwcm9wZXJseSBmbHVzaCBwaXBlbGluZQogI2VuZGlmCiAKKyNkZWZpbmUgUFJPQ19FTlRSWV9TSVpFICg0KjUpCisKIC8qCiAgKiBIZXJlIGZvbGxvdyB0aGUgcmVsb2NhdGFibGUgY2FjaGUgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZQogICogdmFyaW91cyBwcm9jZXNzb3JzLiAgVGhpcyBpcyBhIGdlbmVyaWMgaG9vayBmb3IgbG9jYXRpbmcgYW4KQEAgLTYyNCw3ICs2MjYsNyBAQAogIEFSTSgJCWFkZGVxCXBjLCByMTIsIHIzCQkpIEAgY2FsbCBjYWNoZSBmdW5jdGlvbgogIFRIVU1CKAkJYWRkZXEJcjEyLCByMwkJCSkKICBUSFVNQigJCW1vdmVxCXBjLCByMTIJCQkpIEAgY2FsbCBjYWNoZSBmdW5jdGlvbgotCQlhZGQJcjEyLCByMTIsICM0KjUKKwkJYWRkCXIxMiwgcjEyLCAjUFJPQ19FTlRSWV9TSVpFCiAJCWIJMWIKIAogLyoKQEAgLTY5MSw5ICs2OTMsOSBAQAogCiAJCS53b3JkCTB4NDEwNjkyNjAJCUAgQVJNOTI2RUotUyAodjVURUopCiAJCS53b3JkCTB4ZmYwZmZmZjAKLQkJYglfX2FybTkyNmVqc19tbXVfY2FjaGVfb24KLQkJYglfX2FybXY0X21tdV9jYWNoZV9vZmYKLQkJYglfX2FybXY1dGVqX21tdV9jYWNoZV9mbHVzaAorCQlXKGIpCV9fYXJtOTI2ZWpzX21tdV9jYWNoZV9vbgorCQlXKGIpCV9fYXJtdjRfbW11X2NhY2hlX29mZgorCQlXKGIpCV9fYXJtdjV0ZWpfbW11X2NhY2hlX2ZsdXNoCiAKIAkJLndvcmQJMHgwMDAwNzAwMAkJQCBBUk03IElEcwogCQkud29yZAkweDAwMDBmMDAwCkBAIC03OTQsNiArNzk2LDE2IEBACiAKIAkJLnNpemUJcHJvY190eXBlcywgLiAtIHByb2NfdHlwZXMKIAorCQkvKgorCQkgKiBJZiB5b3UgZ2V0IGEgIm5vbi1jb25zdGFudCBleHByZXNzaW9uIGluICIuaWYiIHN0YXRlbWVudCIKKwkJICogZXJyb3IgZnJvbSB0aGUgYXNzZW1ibGVyIG9uIHRoaXMgbGluZSwgY2hlY2sgdGhhdCB5b3UgaGF2ZQorCQkgKiBub3QgYWNjaWRlbnRhbGx5IHdyaXR0ZW4gYSAiYiIgaW5zdHJ1Y3Rpb24gd2hlcmUgeW91IHNob3VsZAorCQkgKiBoYXZlIHdyaXR0ZW4gVyhiKS4KKwkJICovCisJCS5pZiAoLiAtIHByb2NfdHlwZXMpICUgUFJPQ19FTlRSWV9TSVpFICE9IDAKKwkJLmVycm9yICJUaGUgc2l6ZSBvZiBvbmUgb3IgbW9yZSBwcm9jX3R5cGVzIGVudHJpZXMgaXMgd3JvbmcuIgorCQkuZW5kaWYKKwogLyoKICAqIFR1cm4gb2ZmIHRoZSBDYWNoZSBhbmQgTU1VLiAgQVJNdjMgZG9lcyBub3Qgc3VwcG9ydAogICogcmVhZGluZyB0aGUgY29udHJvbCByZWdpc3RlciwgYnV0IEFSTXY0IGRvZXMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMgYi9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMKaW5kZXggZTU2ODE2My4uODQxZGY3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCWlmIChidWYgPT0gMCkgewogCQkJZGV2X2VycihkZXYsICIlczogdW5hYmxlIHRvIG1hcCB1bnNhZmUgYnVmZmVyICVwIVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgcHRyKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIH4wOwogCQl9CiAKIAkJZGV2X2RiZyhkZXYsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZGF2aW5jaV9hbGxfZGVmY29uZmlnCmluZGV4IDg4OTkyMmEuLjY3YjVhYmI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZwpAQCAtMTU3LDcgKzE1Nyw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSUz15CiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPW0KIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfWEZTX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL25ldHhfZGVmY29uZmlnCmluZGV4IDMxNmFmNTQuLjljMGFkNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZwpAQCAtNjAsNyArNjAsNyBAQAogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQogQ09ORklHX0xPR089eQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfSkZGUzJfRlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy92aXBlcl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZwppbmRleCA4YjBjNzE3Li4xZDAxZGRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZwpAQCAtMTQyLDcgKzE0Miw3IEBACiBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCiBDT05GSUdfVVNCX0dfU0VSSUFMPW0KIENPTkZJR19VU0JfR19QUklOVEVSPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9EUzEzMDc9bQogQ09ORklHX1JUQ19EUlZfU0ExMTAwPW0KIENPTkZJR19FWFQyX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3hjZXBfZGVmY29uZmlnCmluZGV4IDViNTUwNDEuLjcyMTgzMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy94Y2VwX2RlZmNvbmZpZwpAQCAtNzMsNyArNzMsNyBAQAogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX1NBMTEwMD1tCiBDT05GSUdfRE1BREVWSUNFUz15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3pldXNfZGVmY29uZmlnCmluZGV4IDk2MGY2NTUuLjU5NTc3YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy96ZXVzX2RlZmNvbmZpZwpAQCAtMTU4LDcgKzE1OCw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSX0JBQ0tMSUdIVD1tCiBDT05GSUdfTEVEU19UUklHR0VSX0dQSU89bQogQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9JU0wxMjA4PW0KIENPTkZJR19SVENfRFJWX1BYQT1tCiBDT05GSUdfRVhUMl9GUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCmluZGV4IGJjMmQyZDcuLjY1YzNmMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCkBAIC0xMyw2ICsxMyw5IEBACiAgKiAgRG8gbm90IGluY2x1ZGUgYW55IEMgZGVjbGFyYXRpb25zIGluIHRoaXMgZmlsZSAtIGl0IGlzIGluY2x1ZGVkIGJ5CiAgKiAgYXNzZW1ibGVyIHNvdXJjZS4KICAqLworI2lmbmRlZiBfX0FTTV9BU1NFTUJMRVJfSF9fCisjZGVmaW5lIF9fQVNNX0FTU0VNQkxFUl9IX18KKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNlcnJvciAiT25seSBpbmNsdWRlIHRoaXMgZnJvbSBhc3NlbWJseSBjb2RlIgogI2VuZGlmCkBAIC0yOTAsMyArMjkzLDQgQEAKIAkubWFjcm8JbGRydXNyLCByZWcsIHB0ciwgaW5jLCBjb25kPWFsLCByZXB0PTEsIGFib3J0PTkwMDFmCiAJdXNyYWNjCWxkciwgXHJlZywgXHB0ciwgXGluYywgXGNvbmQsIFxyZXB0LCBcYWJvcnQKIAkuZW5kbQorI2VuZGlmIC8qIF9fQVNNX0FTU0VNQkxFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TCmluZGV4IGVjMGJiZjcuLjJkYTg1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxpbmcuICBQcmVzZXJ2ZXMgcjcsIHI4LCByOQogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jIGIvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYwppbmRleCBhNzAxZTQyLi4wY2RkN2I0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKQEAgLTc2LDYgKzc2LDkgQEAKIAl1bnNpZ25lZCBsb25nIGR0X3Jvb3Q7CiAJY29uc3QgY2hhciAqbW9kZWw7CiAKKwlpZiAoIWR0X3BoeXMpCisJCXJldHVybiBOVUxMOworCiAJZGV2dHJlZSA9IHBoeXNfdG9fdmlydChkdF9waHlzKTsKIAogCS8qIGNoZWNrIGRldmljZSB0cmVlIHZhbGlkaXR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCBlOGQ4ODU2Li45MGM2MmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTQzNSw2ICs0MzUsMTAgQEAKIAl1c3JfZW50cnkKIAlrdXNlcl9jbXB4Y2hnX2NoZWNrCiAKKyNpZmRlZiBDT05GSUdfSVJRU09GRl9UUkFDRVIKKwlibAl0cmFjZV9oYXJkaXJxc19vZmYKKyNlbmRpZgorCiAJZ2V0X3RocmVhZF9pbmZvIHRzawogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJbGRyCXI4LCBbdHNrLCAjVElfUFJFRU1QVF0JCUAgZ2V0IHByZWVtcHQgY291bnQKQEAgLTQ1Myw3ICs0NTcsNyBAQAogI2VuZGlmCiAKIAltb3YJd2h5LCAjMAotCWIJcmV0X3RvX3VzZXIKKwliCXJldF90b191c2VyX2Zyb21faXJxCiAgVU5XSU5EKC5mbmVuZAkJKQogRU5EUFJPQyhfX2lycV91c3IpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwppbmRleCAxZTdiMDRhLi5iMmEyN2I2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCkBAIC02NCw2ICs2NCw3IEBACiBFTlRSWShyZXRfdG9fdXNlcikKIHJldF9zbG93X3N5c2NhbGw6CiAJZGlzYWJsZV9pcnEJCQkJQCBkaXNhYmxlIGludGVycnVwdHMKK0VOVFJZKHJldF90b191c2VyX2Zyb21faXJxKQogCWxkcglyMSwgW3RzaywgI1RJX0ZMQUdTXQogCXRzdAlyMSwgI19USUZfV09SS19NQVNLCiAJYm5lCXdvcmtfcGVuZGluZwpAQCAtNzUsNiArNzYsNyBAQAogCWFyY2hfcmV0X3RvX3VzZXIgcjEsIGxyCiAKIAlyZXN0b3JlX3VzZXJfcmVncyBmYXN0ID0gMCwgb2Zmc2V0ID0gMAorRU5EUFJPQyhyZXRfdG9fdXNlcl9mcm9tX2lycSkKIEVORFBST0MocmV0X3RvX3VzZXIpCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZmVlN2MzNi4uMDE2ZDZhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTkzLDggKzE5MywxNyBAQAogCQkJCW9mZnNldCAtPSAweDAyMDAwMDAwOwogCQkJb2Zmc2V0ICs9IHN5bS0+c3RfdmFsdWUgLSBsb2M7CiAKLQkJCS8qIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFsbG93ZWQgKG5vIGludGVyd29ya2luZykgKi8KLQkJCWlmICghKG9mZnNldCAmIDEpIHx8CisJCQkvKgorCQkJICogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFyZQorCQkJICogYWxsb3dlZCAobm8gaW50ZXJ3b3JraW5nKS4KKwkJCSAqCisJCQkgKiBGb3Igbm9uLWZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBkZXN0aW5hdGlvbgorCQkJICogaGFzIG5vIHNwZWNpZmljIEFSTS9UaHVtYiBkaXNwb3NpdGlvbiwgc28KKwkJCSAqIHRoZSBicmFuY2ggaXMgcmVzb2x2ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24KKwkJCSAqIHRoYXQgaW50ZXJ3b3JraW5nIGlzIG5vdCByZXF1aXJlZC4KKwkJCSAqLworCQkJaWYgKChFTEYzMl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMgJiYKKwkJCQkhKG9mZnNldCAmIDEpKSB8fAogCQkJICAgIG9mZnNldCA8PSAoczMyKTB4ZmYwMDAwMDAgfHwKIAkJCSAgICBvZmZzZXQgPj0gKHMzMikweDAxMDAwMDAwKSB7CiAJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogcmVsb2NhdGlvbiAldSBvdXQgb2YgcmFuZ2UgKCUjbHggLT4gJSN4KVxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IGQ1M2MwYWIuLjJiNWIxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtNTgzLDcgKzU4Myw3IEBACiBzdGF0aWMgdm9pZCBhcm1wbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKIHsKIAkvKiBFbmFibGUgYWxsIG9mIHRoZSBwZXJmIGV2ZW50cyBvbiBoYXJkd2FyZS4gKi8KLQlpbnQgaWR4OworCWludCBpZHgsIGVuYWJsZWQgPSAwOwogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKIAlpZiAoIWFybXBtdSkKQEAgLTU5Niw5ICs1OTYsMTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWFybXBtdS0+ZW5hYmxlKCZldmVudC0+aHcsIGlkeCk7CisJCWVuYWJsZWQgPSAxOwogCX0KIAotCWFybXBtdS0+c3RhcnQoKTsKKwlpZiAoZW5hYmxlZCkKKwkJYXJtcG11LT5zdGFydCgpOwogfQogCiBzdGF0aWMgdm9pZCBhcm1wbXVfZGlzYWJsZShzdHJ1Y3QgcG11ICpwbXUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IGVkMTFmYjAuLmFjYmI0NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC03Myw2ICs3Myw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYyk7CitleHRlcm4gdm9pZCBzYW5pdHlfY2hlY2tfbWVtaW5mbyh2b2lkKTsKIGV4dGVybiB2b2lkIHJlYm9vdF9zZXR1cChjaGFyICpzdHIpOwogCiB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOwpAQCAtOTAwLDYgKzkwMSw3IEBACiAKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCisJc2FuaXR5X2NoZWNrX21lbWluZm8oKTsKIAlhcm1fbWVtYmxvY2tfaW5pdCgmbWVtaW5mbywgbWRlc2MpOwogCiAJcGFnaW5nX2luaXQobWRlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IDM0NGU1MmIuLmU3ZjkyYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTMxOCw5ICszMTgsMTMgQEAKIAlzbXBfc3RvcmVfY3B1X2luZm8oY3B1KTsKIAogCS8qCi0JICogT0ssIG5vdyBpdCdzIHNhZmUgdG8gbGV0IHRoZSBib290IENQVSBjb250aW51ZQorCSAqIE9LLCBub3cgaXQncyBzYWZlIHRvIGxldCB0aGUgYm9vdCBDUFUgY29udGludWUuICBXYWl0IGZvcgorCSAqIHRoZSBDUFUgbWlncmF0aW9uIGNvZGUgdG8gbm90aWNlIHRoYXQgdGhlIENQVSBpcyBvbmxpbmUKKwkgKiBiZWZvcmUgd2UgY29udGludWUuCiAJICovCiAJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKKwl3aGlsZSAoIWNwdV9hY3RpdmUoY3B1KSkKKwkJY3B1X3JlbGF4KCk7CiAKIAkvKgogCSAqIE9LLCBpdCdzIG9mZiB0byB0aGUgaWRsZSB0aHJlYWQgZm9yIHVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwppbmRleCA2MDYzNmY0Li4yYzI3N2Q0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCQl0d2RfdGltZXJfcmF0ZSA9ICgweEZGRkZGRkZGVSAtIGNvdW50KSAqIChIWiAvIDUpOwogCiAJCXByaW50aygiJWx1LiUwMmx1TUh6LlxuIiwgdHdkX3RpbWVyX3JhdGUgLyAxMDAwMDAwLAotCQkJKHR3ZF90aW1lcl9yYXRlIC8gMTAwMDAwMCkgJSAxMDApOworCQkJKHR3ZF90aW1lcl9yYXRlIC8gMTAwMDApICUgMTAwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggZDUyZWVjMi4uNjgwN2NiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCWZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAKLQlmb3IgKGkgPSAtNDsgaSA8IDE7IGkrKykgeworCWZvciAoaSA9IC00OyBpIDwgMSArICEhdGh1bWI7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgdmFsLCBiYWQ7CiAKIAkJaWYgKHRodW1iKQpAQCAtNTYzLDcgKzU2Myw3IEBACiAJCWlmICghcG1kX3ByZXNlbnQoKnBtZCkpCiAJCQlnb3RvIGJhZF9hY2Nlc3M7CiAJCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7Ci0JCWlmICghcHRlX3ByZXNlbnQoKnB0ZSkgfHwgIXB0ZV9kaXJ0eSgqcHRlKSkgeworCQlpZiAoIXB0ZV9wcmVzZW50KCpwdGUpIHx8ICFwdGVfd3JpdGUoKnB0ZSkgfHwgIXB0ZV9kaXJ0eSgqcHRlKSkgewogCQkJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJCQlnb3RvIGJhZF9hY2Nlc3M7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKaW5kZXggMTdmYWU0YS4uZjEwMTNkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKQEAgLTIyMywxNSArMjIzLDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcGVyaXBoX2Nsb2Nrc19sb29rdXBzW10gPSB7Ci0JQ0xLREVWX0NPTl9ERVZfSUQoImhjbGsiLCAiYXRtZWxfdXNiYV91ZGMuMCIsICZ1dG1pX2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAiYXRtZWxfdXNiYV91ZGMuMCIsICZ1ZHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjIiwgJnV0bWlfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1ZHBoc19jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0OTFfbWNpLjAiLCAmbW1jMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0OTFfbWNpLjEiLCAmbW1jMV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4wIiwgJnNwaTBfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgic3BpX2NsayIsICJhdG1lbF9zcGkuMSIsICZzcGkxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQwX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0Y2JfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHVzYXJ0X2Nsb2Nrc19sb29rdXBzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYwppbmRleCBjZDg1MGVkLi5kYmEwZDhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKQEAgLTEyMjAsNyArMTIyMCw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggYjIyOGNlOS4uODNhMWEzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0xOTksOSArMTk5LDkgQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjM19jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjEiLCAmdGM0X2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzVfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jCmluZGV4IGEwYmE0NzUuLjcyMjc3NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKQEAgLTExMzUsNyArMTEzNSw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFybTkyMDBfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXJtOTIwMF9zZXRfY29uc29sZV9jbG9jayhhdDkxX3VhcnRzW3BvcnRucl0tPmlkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCmluZGV4IDFmZGViOTAuLjM5ZjgxZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYwpAQCAtMTE3Myw3ICsxMTczLDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTkyNjBfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXNhbTkyNjBfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYwppbmRleCAzZWI0NTM4Li41MDA0YmYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKQEAgLTEwMTMsNyArMTAxMyw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFzYW05MjYxX3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFzYW05MjYxX3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKaW5kZXggZmZlMDgxYi4uYTA1MGY0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCkBAIC0xMzk1LDcgKzEzOTUsNyBAQAogewogCWlmIChwb3J0bnIgPCBBVE1FTF9NQVhfVUFSVCkgewogCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1twb3J0bnJdOwotCQlhdDkxc2FtOTI2M19zZXRfY29uc29sZV9jbG9jayhwb3J0bnIpOworCQlhdDkxc2FtOTI2M19zZXRfY29uc29sZV9jbG9jayhhdDkxX3VhcnRzW3BvcnRucl0tPmlkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKaW5kZXggMmJiNmZmOS4uMTFlMjE0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKQEAgLTIxNywxMSArMjE3LDExIEBACiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcGVyaXBoX2Nsb2Nrc19sb29rdXBzW10gPSB7CiAJLyogT25lIGFkZGl0aW9uYWwgZmFrZSBjbG9jayBmb3Igb2hjaSAqLwogCUNMS0RFVl9DT05fSUQoIm9oY2lfY2xrIiwgJnVocGhzX2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoImVoY2lfY2xrIiwgImF0bWVsLWVoY2kuMCIsICZ1aHBoc19jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdXRtaV9jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdWRwaHNfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdDkxX21jaS4wIiwgJm1tYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdDkxX21jaS4xIiwgJm1tYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiZWhjaV9jbGsiLCAiYXRtZWwtZWhjaSIsICZ1aHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjIiwgJnV0bWlfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1ZHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0bWVsX21jaS4wIiwgJm1tYzBfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdG1lbF9tY2kuMSIsICZtbWMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInNwaV9jbGsiLCAiYXRtZWxfc3BpLjAiLCAmc3BpMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4xIiwgJnNwaTFfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjYjBfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCmluZGV4IDA1Njc0ODYuLjYwMGJmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwpAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAxYTQwZjE2Li4yOWRmZjE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTE5MSw4ICsxOTEsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHBlcmlwaF9jbG9ja3NfbG9va3Vwc1tdID0gewotCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdXRtaV9jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdWRwaHNfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1dG1pX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAiYXRtZWxfdXNiYV91ZGMiLCAmdWRwaHNfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjAiLCAmdGMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0YzJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwppbmRleCBjMjk2MDQ1Li5hYWNiMTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCkBAIC0xMTY4LDcgKzExNjgsNyBAQAogewogCWlmIChwb3J0bnIgPCBBVE1FTF9NQVhfVUFSVCkgewogCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1twb3J0bnJdOwotCQlhdDkxc2FtOXJsX3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFzYW05cmxfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwppbmRleCAxOTA0ZmRmLi5jZGI2NWQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9NQVRSSVhfRUJJQ1NBKTsKIAlhdDkxX3N5c193cml0ZShBVDkxX01BVFJJWF9FQklDU0EsIGNzYSB8IEFUOTFfTUFUUklYX0VCSV9WRERJT01TRUxfM18zVik7CiAKLQljYXA5YWRrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSAhYm9hcmRfaGF2ZV9uYW5kXzhiaXQoKTsKKwljYXA5YWRrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGNhcDlhZGtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJY2FwOWFka19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKaW5kZXggZDYwMGRjMS4uNWMyNDA3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKIHsKLQlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gIWJvYXJkX2hhdmVfbmFuZF84Yml0KCk7CisJZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9IGJvYXJkX2hhdmVfbmFuZF8xNmJpdCgpOwogCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KIAlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCmluZGV4IGY4OTdmODQuLmI2MGMyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCiB7Ci0JZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9ICFib2FyZF9oYXZlX25hbmRfOGJpdCgpOworCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwppbmRleCA2MDViMjZmLi45YmJkYzkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQogewotCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSAhYm9hcmRfaGF2ZV9uYW5kXzhiaXQoKTsKKwlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KCk7CiAJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLwogCWlmIChla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQogCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKaW5kZXggNzYyNGNmMC4uMTMyNWE1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKIHsKLQlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gIWJvYXJkX2hhdmVfbmFuZF84Yml0KCk7CisJZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9IGJvYXJkX2hhdmVfbmFuZF8xNmJpdCgpOwogCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KIAlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCmluZGV4IDA2M2M5NWQuLjMzZWFhMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCiB7Ci0JZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9ICFib2FyZF9oYXZlX25hbmRfOGJpdCgpOworCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9zeXN0ZW1fcmV2LmgKaW5kZXggYjg1NWVlNy4uOGY0ODY2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9zeXN0ZW1fcmV2LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9zeXN0ZW1fcmV2LmgKQEAgLTEzLDEzICsxMywxMyBAQAogICogdGhlIDE2LTMxIGJpdCBhcmUgcmVzZXJ2ZWQgZm9yIGF0OTEgZ2VuZXJpYyBpbmZvcm1hdGlvbgogICoKICAqIGJpdCAzMToKLSAqCTAgPT4gbmFuZCAxNiBiaXQKLSAqCTEgPT4gbmFuZCA4IGJpdAorICoJMCA9PiBuYW5kIDggYml0CisgKgkxID0+IG5hbmQgMTYgYml0CiAgKi8KLSNkZWZpbmUgQk9BUkRfSEFWRV9OQU5EXzhCSVQJKDEgPDwgMzEpCi1zdGF0aWMgaW50IGlubGluZSBib2FyZF9oYXZlX25hbmRfOGJpdCh2b2lkKQorI2RlZmluZSBCT0FSRF9IQVZFX05BTkRfMTZCSVQJKDEgPDwgMzEpCitzdGF0aWMgaW5saW5lIGludCBib2FyZF9oYXZlX25hbmRfMTZiaXQodm9pZCkKIHsKLQlyZXR1cm4gc3lzdGVtX3JldiAmIEJPQVJEX0hBVkVfTkFORF84QklUOworCXJldHVybiBzeXN0ZW1fcmV2ICYgQk9BUkRfSEFWRV9OQU5EXzE2QklUOwogfQogCiAjZW5kaWYgLyogX19BUkNIX1NZU1RFTV9SRVZfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwppbmRleCA0ZTY2ODgxLi5mYzRlOThlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCS5yZXNvdXJjZQk9IGRhODUwX21jYXNwX3Jlc291cmNlcywKIH07CiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9wY21fZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9wY21fZGV2aWNlID0gewogCS5uYW1lCT0gImRhdmluY2ktcGNtLWF1ZGlvIiwKIAkuaWQJPSAtMSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYwppbmRleCA4ZjRmNzM2Li44MDZhMmYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhdmluY2lfcGNtX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhdmluY2lfcGNtX2RldmljZSA9IHsKIAkubmFtZQkJPSAiZGF2aW5jaS1wY20tYXVkaW8iLAogCS5pZAkJPSAtMSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYwppbmRleCBhMGI4Mzg4Li5lNzIyMTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMKQEAgLTI1Miw5ICsyNTIsMTEgQEAKIHN0YXRpYyB2b2lkCiBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gaXJxMnJlZ3MoaXJxKTsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZzsKIAl1MzIgbWFzayA9IDB4ZmZmZjsKIAorCWcgPSAoX19mb3JjZSBzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqKSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCiAJLyogd2Ugb25seSBjYXJlIGFib3V0IG9uZSBiYW5rICovCiAJaWYgKGlycSAmIDEpCiAJCW1hc2sgPDw9IDE2OwpAQCAtNDIyLDggKzQyNCw3IEBACiAKIAkJLyogc2V0IHVwIGFsbCBpcnFzIGluIHRoaXMgYmFuayAqLwogCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihiYW5rX2lycSwgZ3Bpb19pcnFfaGFuZGxlcik7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGJhbmtfaXJxLCAoX19mb3JjZSB2b2lkICopZyk7Ci0JCWlycV9zZXRfaGFuZGxlcl9kYXRhKGJhbmtfaXJxLCAodm9pZCAqKWlycSk7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGJhbmtfaXJxLCAoX19mb3JjZSB2b2lkICopZyk7CiAKIAkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGdwaW8gPCBuZ3BpbzsgaSsrLCBpcnErKywgZ3BpbysrKSB7CiAJCQlpcnFfc2V0X2NoaXAoaXJxLCAmZ3Bpb19pcnFjaGlwKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pcnEuYwppbmRleCBiZmU2OGVjLi5kOGMxYWYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lycS5jCkBAIC01Myw3ICs1Myw3IEBACiAKIAlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoIkFJTlRDIiwgMSwgaXJxX3N0YXJ0LCBiYXNlLCBoYW5kbGVfZWRnZV9pcnEpOwogCWN0ID0gZ2MtPmNoaXBfdHlwZXM7Ci0JY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2s7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCA4MjA3OTU0Li42NjU5YTBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC0yNTEsOSArMjUxLDkgQEAKIAl1bnNpZ25lZCBpbnQgbWNyOwogCiAJbWNyID0gMDsKLQlpZiAoIShtY3RybCAmIFRJT0NNX1JUUykpCisJaWYgKG1jdHJsICYgVElPQ01fUlRTKQogCQltY3IgfD0gMjsKLQlpZiAoIShtY3RybCAmIFRJT0NNX0RUUikpCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQogCQltY3IgfD0gMTsKIAogCV9fcmF3X3dyaXRlbChtY3IsIGJhc2UgKyBFUDkzWFhfVUFSVF9NQ1JfT0ZGU0VUKTsKQEAgLTQwMiwxMSArNDAyLDE1IEBACiAJfQogfTsKIAorc3RhdGljIHU2NCBlcDkzeHhfZXRoX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXA5M3h4X2V0aF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImVwOTN4eC1ldGgiLAogCS5pZAkJPSAtMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X2V0aF9kYXRhLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmZXA5M3h4X2V0aF9kYXRhLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkuZG1hX21hc2sJCT0gJmVwOTN4eF9ldGhfZG1hX21hc2ssCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXA5M3h4X2V0aF9yZXNvdXJjZSksCiAJLnJlc291cmNlCT0gZXA5M3h4X2V0aF9yZXNvdXJjZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKaW5kZXggYjkyYzFlNS4uMTQzNWZjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKQEAgLTkxLDYgKzkxLDExIEBACiAJaGVscAogCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIHRoZSBjYW1lcmEgaW50ZXJmYWNlcy4KIAorY29uZmlnIEVYWU5PUzRfU0VUVVBfVVNCX1BIWQorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgVVNCIFBIWSBjb250cm9sbGVyCisKICMgbWFjaGluZSBzdXBwb3J0CiAKIG1lbnUgIkVYWU5PUzQgTWFjaGluZXMiCkBAIC0xNzYsNiArMTgxLDcgQEAKIAlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCiAJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNQogCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfVVNCX1BIWQogCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KIAloZWxwCiAJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgTW9iaWxlIE5VUkkgQm9hcmQuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUKaW5kZXggYTliYjk0Zi4uNjBmZTVlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9NYWtlZmlsZQpAQCAtNTYsNCArNTYsNCBAQAogb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfU0RIQ0kpCSs9IHNldHVwLXNkaGNpLm8KIG9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1NESENJX0dQSU8pCSs9IHNldHVwLXNkaGNpLWdwaW8ubwogCi1vYmotJChDT05GSUdfVVNCX1NVUFBPUlQpCQkrPSB1c2ItcGh5Lm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1VTQl9QSFkpCSs9IHNldHVwLXVzYi1waHkubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jCmluZGV4IDA4ODEzYTYuLmJmZDYyMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9maW1jLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CiAKQEAgLTk4LDcgKzk5LDcgQEAKIAkJLmxlbmd0aAkJPSBTWl80SywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfVVNCX0hTUEhZLAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVMzQ19WQV9VU0JfSFNQSFksCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0hTUEhZKSwKIAkJLmxlbmd0aAkJPSBTWl80SywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLApAQCAtMTMyLDYgKzEzMywxMSBAQAogCXMzY19maW1jX3NldG5hbWUoMSwgImV4eW5vczQtZmltYyIpOwogCXMzY19maW1jX3NldG5hbWUoMiwgImV4eW5vczQtZmltYyIpOwogCXMzY19maW1jX3NldG5hbWUoMywgImV4eW5vczQtZmltYyIpOworCisJLyogVGhlIEkyQyBidXMgY29udHJvbGxlcnMgYXJlIGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCBzM2MyNDQwICovCisJczNjX2kyYzBfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKKwlzM2NfaTJjMV9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOworCXMzY19pMmMyX3NldG5hbWUoInMzYzI0NDAtaTJjIik7CiB9CiAKIHZvaWQgX19pbml0IGV4eW5vczRfaW5pdF9jbG9ja3MoaW50IHh0YWwpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWF1ZGlvLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWF1ZGlvLmMKaW5kZXggMWVlZDVmOS4uOTgzMDY5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1hdWRpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYXVkaW8uYwpAQCAtMzMwLDcgKzMzMCw3IEBACiAKIHN0YXRpYyBpbnQgZXh5bm9zNF9zcGRpZl9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShFWFlOT1M0X0dQQzEoMCksIDIsIFMzQ19HUElPX1NGTigzKSk7CisJczNjX2dwaW9fY2ZncGluX3JhbmdlKEVYWU5PUzRfR1BDMSgwKSwgMiwgUzNDX0dQSU9fU0ZOKDQpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2hlYWRzbXAuUyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9oZWFkc21wLlMKaW5kZXggNmM2Y2ZjNS4uM2NkZWIzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2hlYWRzbXAuUworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaGVhZHNtcC5TCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotCV9fSU5JVAorCV9fQ1BVSU5JVAogCiAvKgogICogZXh5bm9zNCBzcGVjaWZpYyBlbnRyeSBwb2ludCBmb3Igc2Vjb25kYXJ5IENQVXMuICBUaGlzIHByb3ZpZGVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaAppbmRleCA3MDMxMThkLi5jMzM3Y2YzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy11c2ItcGh5LmgKQEAgLTExLDcgKzExLDcgQEAKICNpZm5kZWYgX19QTEFUX1M1UF9SRUdTX1VTQl9QSFlfSAogI2RlZmluZSBfX1BMQVRfUzVQX1JFR1NfVVNCX1BIWV9ICiAKLSNkZWZpbmUgRVhZTk9TNF9IU09UR19QSFlSRUcoeCkJCSgoeCkgKyBTNVBfVkFfVVNCX0hTUEhZKQorI2RlZmluZSBFWFlOT1M0X0hTT1RHX1BIWVJFRyh4KQkJKCh4KSArIFMzQ19WQV9VU0JfSFNQSFkpCiAKICNkZWZpbmUgRVhZTk9TNF9QSFlQV1IJCQlFWFlOT1M0X0hTT1RHX1BIWVJFRygweDAwKQogI2RlZmluZSBQSFkxX0hTSUNfTk9STUFMX01BU0sJCSgweGYgPDwgOSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5pdC5jCmluZGV4IGNmOTFmNTAuLmE4YTgzZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYwpAQCAtMzUsNiArMzUsNyBAQAogCQkJdGNmZy0+Y2xvY2tzID0gZXh5bm9zNF9zZXJpYWxfY2xvY2tzOwogCQkJdGNmZy0+Y2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKGV4eW5vczRfc2VyaWFsX2Nsb2Nrcyk7CiAJCX0KKwkJdGNmZy0+ZmxhZ3MgfD0gTk9fTkVFRF9DSEVDS19DTEtTUkM7CiAJfQogCiAJczNjMjR4eF9pbml0X3VhcnRkZXZzKCJzNXB2MjEwLXVhcnQiLCBzNXBfdWFydF9yZXNvdXJjZXMsIGNmZywgbm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMKaW5kZXggMTUyNjc2NC4uZWRkODE0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrdjMxMC5jCkBAIC03OCw5ICs3OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrdjMxMF9oc21tYzBfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUEswKDIpLAotCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAorCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKIAkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCiAjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKIAkubWF4X3dpZHRoCQk9IDgsCkBAIC05Niw5ICs5NCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrdjMxMF9oc21tYzJfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUEsyKDIpLAotCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAorCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKIAkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCiAjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gyXzhCSVQKIAkubWF4X3dpZHRoCQk9IDgsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvdXNiLXBoeS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXVzYi1waHkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3VzYi1waHkuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXVzYi1waHkuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC90aW1lLmMKaW5kZXggODZiOWZhMC4uZWJiOGYzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvdGltZS5jCkBAIC0yMDYsNiArMjA2LDcgQEAKIAlyZXR1cm4gKGN5Y2xlX3QpIH5fX3Jhd19yZWFkbChTM0NfVElNRVJSRUcoMHg0MCkpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgdm9pZCBleHlub3M0X3B3bTRfcmVzdW1lKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwY2xrOwpAQCAtMjE4LDYgKzIxOSw3IEBACiAJZXh5bm9zNF9wd21faW5pdCg0LCB+MCk7CiAJZXh5bm9zNF9wd21fc3RhcnQoNCwgMSk7CiB9CisjZW5kaWYKIAogc3RydWN0IGNsb2Nrc291cmNlIHB3bV9jbG9ja3NvdXJjZSA9IHsKIAkubmFtZQkJPSAicHdtX3RpbWVyNCIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYwppbmRleCA1ZjFmOTg2Li4xMjFhZDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdChjZSwgbWVtX2ZjbGtfMjEyODUsIDUpOwogCWNlLT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmLCBjZSk7CiAJY2UtPm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgwMDAwMDQsIGNlKTsKKwljZS0+Y3B1bWFzayA9IGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShjZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMzBiOTcxZC4uMWJlMmVlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWJ1Zy04MjUwLlM+CiAKICNlbHNlCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCS8qIEZvciBFQlNBMjg1IGRlYnVnZ2luZyAqLwogCQkuZXF1CWRjMjEyODVfaGlnaCwgQVJNQ1NSX0JBU0UgJiAweGZmMDAwMDAwCiAJCS5lcXUJZGMyMTI4NV9sb3csICBBUk1DU1JfQkFTRSAmIDB4MDBmZmZmZmYKQEAgLTM2LDggKzM3LDggQEAKIAkJLmVsc2UKIAkJbW92CVxycCwgIzAKIAkJLmVuZGlmCi0JCW9ycglccnYsIFxycCwgIzB4NDIwMDAwMDAKLQkJb3JyCVxycCwgXHJwLCAjZGMyMTI4NV9oaWdoCisJCW9ycglccnYsIFxycCwgI2RjMjEyODVfaGlnaAorCQlvcnIJXHJwLCBccnAsICMweDQyMDAwMDAwCiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWcKaW5kZXggOWI2OTgyZS4uYWJmMzU2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvS2NvbmZpZwpAQCAtNiwxMiArNiwxNCBAQAogCWJvb2wgImdtczMwYzcyMDEiCiAJZGVwZW5kcyBvbiBBUkNIX0g3MjBYCiAJc2VsZWN0IENQVV9INzIwMQorCXNlbGVjdCBaT05FX0RNQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSHluaXggR01TMzBDNzIwMSBSZWZlcmVuY2UgQm9hcmQKIAogY29uZmlnIEFSQ0hfSDcyMDIKIAlib29sICJobXMzMGM3MjAyIgogCXNlbGVjdCBDUFVfSDcyMDIKKwlzZWxlY3QgWk9ORV9ETUEKIAlkZXBlbmRzIG9uIEFSQ0hfSDcyMFgKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEh5bml4IEhNUzMwQzcyMDIgUmVmZXJlbmNlIEJvYXJkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IDc0ZWQ4MWEuLjA3NzcyNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC00MTksMTQgKzQxOSwyMCBAQAogLyoKICAqIGNsb2Nrc291cmNlCiAgKi8KKworc3RhdGljIGN5Y2xlX3QgaXhwNHh4X2Nsb2Nrc291cmNlX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjKQoreworCXJldHVybiAqSVhQNFhYX09TVFM7Cit9CisKIHVuc2lnbmVkIGxvbmcgaXhwNHh4X3RpbWVyX2ZyZXEgPSBJWFA0WFhfVElNRVJfRlJFUTsKIEVYUE9SVF9TWU1CT0woaXhwNHh4X3RpbWVyX2ZyZXEpOwogc3RhdGljIHZvaWQgX19pbml0IGl4cDR4eF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpCiB7CiAJaW5pdF9zY2hlZF9jbG9jaygmY2QsIGl4cDR4eF91cGRhdGVfc2NoZWRfY2xvY2ssIDMyLCBpeHA0eHhfdGltZXJfZnJlcSk7CiAKLQljbG9ja3NvdXJjZV9tbWlvX2luaXQoJklYUDRYWF9PU1RTLCAiT1NUUyIsIGl4cDR4eF90aW1lcl9mcmVxLCAyMDAsIDMyLAotCQkJY2xvY2tzb3VyY2VfbW1pb19yZWFkbF91cCk7CisJY2xvY2tzb3VyY2VfbW1pb19pbml0KE5VTEwsICJPU1RTIiwgaXhwNHh4X3RpbWVyX2ZyZXEsIDIwMCwgMzIsCisJCQlpeHA0eHhfY2xvY2tzb3VyY2VfcmVhZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9weGExNjguYyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCmluZGV4IDcyYjRlNzYuLmFiOWY5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCkBAIC03OSw3ICs3OSw3IEBACiBzdGF0aWMgQVBCQ19DTEsoc3NwNSwgUFhBMTY4X1NTUDUsIDQsIDApOwogc3RhdGljIEFQQkNfQ0xLKGtleXBhZCwgUFhBMTY4X0tQQywgMCwgMzIwMDApOwogCi1zdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgwMWRiLCAyMDgwMDAwMDApOworc3RhdGljIEFQTVVfQ0xLKG5hbmQsIE5BTkQsIDB4MTliLCAxNTYwMDAwMDApOwogc3RhdGljIEFQTVVfQ0xLKGxjZCwgTENELCAweDdmLCAzMTIwMDAwMDApOwogCiAvKiBkZXZpY2UgYW5kIGNsb2NrIGJpbmRpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9weGE5MTAuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCmluZGV4IDhmOTJjY2QuLjE0NjQ2MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIHN0YXRpYyBBUEJDX0NMSyhwd20zLCBQWEE5MTBfUFdNMywgMSwgMTMwMDAwMDApOwogc3RhdGljIEFQQkNfQ0xLKHB3bTQsIFBYQTkxMF9QV000LCAxLCAxMzAwMDAwMCk7CiAKLXN0YXRpYyBBUE1VX0NMSyhuYW5kLCBOQU5ELCAweDAxZGIsIDIwODAwMDAwMCk7CitzdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgxOWIsIDE1NjAwMDAwMCk7CiBzdGF0aWMgQVBNVV9DTEsodTJvLCBVU0IsIDB4MWIsIDQ4MDAwMDAwMCk7CiAKIC8qIGRldmljZSBhbmQgY2xvY2sgYmluZGluZ3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCmluZGV4IDM4Yjk1ZTkuLjYzNjIxZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYwpAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorCiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCkBAIC01NSwxMCArNTcsMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCiAjZGVmaW5lIERHVF9IWiAoMTkyMDAwMDAgLyA0KSAvKiAxOS4yIE1IeiAvIDQgYnkgZGVmYXVsdCAqLwogI2RlZmluZSBNU01fREdUX1NISUZUICgwKQotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX01TTThYNjApIHx8IFwKLQkJCQkgICAgICBkZWZpbmVkKENPTkZJR19BUkNIX01TTTg5NjApCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApCiAjZGVmaW5lIERHVF9IWiAoMjQ1NzYwMDAgLyA0KSAvKiAyNC41NzYgTUh6IChMUFhPKSAvIDQgYnkgZGVmYXVsdCAqLwogI2RlZmluZSBNU01fREdUX1NISUZUICgwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU004WDYwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX01TTTg5NjApCisjZGVmaW5lIERHVF9IWiAoMjcwMDAwMDAgLyA0KSAvKiAyNyBNSHogKFBYTykgLyA0IGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgTVNNX0RHVF9TSElGVCAoMCkKICNlbHNlCiAjZGVmaW5lIERHVF9IWiAxOTIwMDAwMCAvKiAxOS4yIE1IeiBvciA2MDAgS0h6IGFmdGVyIHNoaWZ0ICovCiAjZGVmaW5lIE1TTV9ER1RfU0hJRlQgKDUpCkBAIC0xMDAsNyArMTA0LDExIEBACiB7CiAJc3RydWN0IG1zbV9jbG9jayAqY2xrID0gY29udGFpbmVyX29mKGNzLCBzdHJ1Y3QgbXNtX2Nsb2NrLCBjbG9ja3NvdXJjZSk7CiAKLQlyZXR1cm4gcmVhZGwoY2xrLT5nbG9iYWxfY291bnRlcik7CisJLyoKKwkgKiBTaGlmdCB0aW1lciBjb3VudCBkb3duIGJ5IGEgY29uc3RhbnQgZHVlIHRvIHVucmVsaWFibGUgbG93ZXIgYml0cworCSAqIG9uIHNvbWUgdGFyZ2V0cy4KKwkgKi8KKwlyZXR1cm4gcmVhZGwoY2xrLT5nbG9iYWxfY291bnRlcikgPj4gY2xrLT5zaGlmdDsKIH0KIAogc3RhdGljIHN0cnVjdCBtc21fY2xvY2sgKmNsb2NrZXZlbnRfdG9fY2xvY2soc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvb2NvdHAuYyBiL2FyY2gvYXJtL21hY2gtbXhzL29jb3RwLmMKaW5kZXggNjUxNTdhMy4uNTRhZGQ2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvb2NvdHAuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9vY290cC5jCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogZm9yIGNwdV9yZWxheCgpICovCisKICNpbmNsdWRlIDxtYWNoL214cy5oPgogCiAjZGVmaW5lIE9DT1RQX1dPUkRfT0ZGU0VUCQkweDIwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQppbmRleCBhZjk4MTE3Li41YjExNGQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKQEAgLTQsMTQgKzQsMTQgQEAKIAogIyBDb21tb24gc3VwcG9ydAogb2JqLXkgOj0gaW8ubyBpZC5vIHNyYW0ubyB0aW1lLm8gaXJxLm8gbXV4Lm8gZmxhc2gubyBzZXJpYWwubyBkZXZpY2VzLm8gZG1hLm8KLW9iai15ICs9IGNsb2NrLm8gY2xvY2tfZGF0YS5vIG9wcF9kYXRhLm8gcmVzZXQubworb2JqLXkgKz0gY2xvY2subyBjbG9ja19kYXRhLm8gb3BwX2RhdGEubyByZXNldC5vIHBtX2J1cy5vCiAKIG9iai0kKENPTkZJR19PTUFQX01DQlNQKSArPSBtY2JzcC5vCiAKIG9iai0kKENPTkZJR19PTUFQXzMyS19USU1FUikJKz0gdGltZXIzMmsubwogCiAjIFBvd2VyIE1hbmFnZW1lbnQKLW9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vIHBtX2J1cy5vCitvYmotJChDT05GSUdfUE0pICs9IHBtLm8gc2xlZXAubwogCiAjIERTUAogb2JqLSQoQ09ORklHX09NQVBfTUJPWF9GV0spCSs9IG1haWxib3hfbWFjaC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwppbmRleCBkZTg4YzkyLi5mNDljZTg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCS5kZWxheQkJPSA5LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2twX2RldmljZSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2twX2RldmljZSA9IHsKIAkubmFtZQkJPSAib21hcC1rZXlwYWQiLAogCS5pZAkJPSAtMSwKIAkuZGV2CQk9IHsKQEAgLTIyNSwxMiArMjI1LDEyIEBACiAJLnJlc291cmNlCT0gYW1zX2RlbHRhX2twX3Jlc291cmNlcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sY2RfZGV2aWNlIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfbGNkX2RldmljZSA9IHsKIAkubmFtZQk9ICJsY2RfYW1zX2RlbHRhIiwKIAkuaWQJPSAtMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sZWRfZGV2aWNlIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfbGVkX2RldmljZSA9IHsKIAkubmFtZQk9ICJhbXMtZGVsdGEtbGVkIiwKIAkuaWQJPSAtMQogfTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCS5wb3dlcgkJPSBhbXNfZGVsdGFfY2FtZXJhX3Bvd2VyLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2NhbWVyYV9kZXZpY2UgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9jYW1lcmFfZGV2aWNlID0gewogCS5uYW1lICAgPSAic29jLWNhbWVyYS1wZHJ2IiwKIAkuaWQgICAgID0gMCwKIAkuZGV2ICAgID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kbWEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZG1hLmMKaW5kZXggZDg1NTkzNC4uZjVhNTIyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RtYS5jCkBAIC0yODQsMTQgKzI4NCwxNSBAQAogCWRtYV9iYXNlID0gaW9yZW1hcChyZXNbMF0uc3RhcnQsIHJlc291cmNlX3NpemUoJnJlc1swXSkpOwogCWlmICghZG1hX2Jhc2UpIHsKIAkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGlvcmVtYXBcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHJlcywgQVJSQVlfU0laRShyZXMpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gYWRkIHJlc291cmNlcyBmb3IgJXMlZFxuIiwKIAkJCV9fZnVuY19fLCBwZGV2LT5uYW1lLCBwZGV2LT5pZCk7Ci0JCWdvdG8gZXhpdF9kZXZpY2VfZGVsOworCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfc3lzdGVtX2RtYV9wbGF0X2luZm8pLCBHRlBfS0VSTkVMKTsKQEAgLTI5OSw3ICszMDAsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVW5hYmxlIHRvIGFsbG9jYXRlICdwJyBmb3IgJXNcbiIsCiAJCQlfX2Z1bmNfXywgcGRldi0+bmFtZSk7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCQlnb3RvIGV4aXRfZGV2aWNlX2RlbDsKIAl9CiAKIAlkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfZG1hX2Rldl9hdHRyKSwgR0ZQX0tFUk5FTCk7CkBAIC0zODAsMTAgKzM4MSwxMCBAQAogCWtmcmVlKGQpOwogZXhpdF9yZWxlYXNlX3A6CiAJa2ZyZWUocCk7Ci1leGl0X2RldmljZV9wdXQ6Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKIGV4aXRfZGV2aWNlX2RlbDoKIAlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBkZXYpOworZXhpdF9kZXZpY2VfcHV0OgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTV4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTV4eC5jCmluZGV4IDA0YzRiMDQuLjM2NDEzN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE1eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNXh4LmMKQEAgLTQxLDcgKzQxLDcgQEAKIAkuYmFua19zdHJpZGUJCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE1eHhfbXB1X2dwaW8gPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMTV4eF9tcHVfZ3BpbyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTcwLDcgKzcwLDcgQEAKIAkuYmFua193aWR0aAkJPSAxNiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE1eHhfZ3BpbyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNXh4X2dwaW8gPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMSwKIAkuZGV2ICAgICAgICAgICAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNnh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNnh4LmMKaW5kZXggNWRkMGQ0Yy4uMjkzYTI0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTZ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE2eHguYwpAQCAtNDQsNyArNDQsNyBAQAogCS5iYW5rX3N0cmlkZQkJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9tcHVfZ3BpbyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X21wdV9ncGlvID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDAsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtNzMsNyArNzMsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDE2LAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvMSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW8xID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDEsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtMTAyLDcgKzEwMiw3IEBACiAJLmJhbmtfd2lkdGgJCT0gMTYsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW8yID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzIgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMiwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkuYmFua193aWR0aAkJPSAxNiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzMgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvMyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAzLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDE2LAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvNCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW80ID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDQsCiAJLmRldiAgICAgICAgICAgID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvN3h4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW83eHguYwppbmRleCAxMjA0YzhiLi5jNmFkMjQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW83eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW83eHguYwpAQCAtNDYsNyArNDYsNyBAQAogCS5iYW5rX3N0cmlkZQkJPSAyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X21wdV9ncGlvID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9tcHVfZ3BpbyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTc1LDcgKzc1LDcgQEAKIAkuYmFua193aWR0aAkJPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzEgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMSwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkuYmFua193aWR0aAkJPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMiA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzIgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMiwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkuYmFua193aWR0aAkJPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzMgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMywKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xNjIsNyArMTYyLDcgQEAKIAkuYmFua193aWR0aAkJPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzQgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gNCwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xOTEsNyArMTkxLDcgQEAKIAkuYmFua193aWR0aAkJPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzUgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gNSwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAkuYmFua193aWR0aAkJPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNiA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzYgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gNiwKIAkuZGV2ICAgICAgICAgICAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtX2J1cy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbV9idXMuYwppbmRleCBmZTMxZDkzLi4zMzRmYjg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtX2J1cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG1fYnVzLmMKQEAgLTU2LDkgKzU2LDEzIEBACiAJCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKIAl9LAogfTsKKyNkZWZpbmUgT01BUDFfUFdSX0RPTUFJTiAoJmRlZmF1bHRfcG93ZXJfZG9tYWluKQorI2Vsc2UKKyNkZWZpbmUgT01BUDFfUFdSX0RPTUFJTiBOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KIAogc3RhdGljIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgcGxhdGZvcm1fYnVzX25vdGlmaWVyID0gewotCS5wd3JfZG9tYWluID0gJmRlZmF1bHRfcG93ZXJfZG9tYWluLAorCS5wd3JfZG9tYWluID0gT01BUDFfUFdSX0RPTUFJTiwKIAkuY29uX2lkcyA9IHsgImljayIsICJmY2siLCBOVUxMLCB9LAogfTsKIApAQCAtNzIsNCArNzYsNCBAQAogCXJldHVybiAwOwogfQogY29yZV9pbml0Y2FsbChvbWFwMV9wbV9ydW50aW1lX2luaXQpOwotI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMKaW5kZXggZDU0OTY5Yi4uNWRlNmVhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMKQEAgLTI2LDEzICsyNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCmluZGV4IGFlMjk2M2EuLjVkYWM5NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCkBAIC02MjIsMTkgKzYyMiwxOSBAQAogCQkJIE9NQVBfTVVYX01PREUwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDFfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDFfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZAkJPSAwLAogCS5wYWRzCQk9IHNlcmlhbDFfcGFkcywKIAkucGFkc19jbnQJPSBBUlJBWV9TSVpFKHNlcmlhbDFfcGFkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwyX2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwyX2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gMSwKIAkucGFkcwkJPSBzZXJpYWwyX3BhZHMsCiAJLnBhZHNfY250CT0gQVJSQVlfU0laRShzZXJpYWwyX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9IDIsCiAJLnBhZHMJCT0gc2VyaWFsM19wYWRzLAogCS5wYWRzX2NudAk9IEFSUkFZX1NJWkUoc2VyaWFsM19wYWRzKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKaW5kZXggNzNmYTkwYi4uNjNkZTJkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCXsgRVRIX0tTODg1MV9JUlEsCUdQSU9GX0lOLAkJImV0aF9pcnEiCX0sCiB9OwogCi1zdGF0aWMgaW50IG9tYXBfZXRoZXJuZXRfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgb21hcF9ldGhlcm5ldF9pbml0KHZvaWQpCiB7CiAJaW50IHN0YXR1czsKIApAQCAtMzIyLDYgKzMyMiw3IEBACiAJCS5ncGlvX3dwCT0gLUVJTlZBTCwKIAkJLm5vbnJlbW92YWJsZSAgID0gdHJ1ZSwKIAkJLm9jcl9tYXNrCT0gTU1DX1ZERF8yOV8zMCwKKwkJLm5vX29mZl9pbml0CT0gdHJ1ZSwKIAl9LAogCXsKIAkJLm1tYwkJPSAxLApAQCAtNjgxLDE5ICs2ODIsMTkgQEAKIAkJCSBPTUFQX1BJTl9PVVRQVVQgfCBPTUFQX01VWF9NT0RFMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwyX2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwyX2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gMSwKIAkucGFkcwkJPSBzZXJpYWwyX3BhZHMsCiAJLnBhZHNfY250CT0gQVJSQVlfU0laRShzZXJpYWwyX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9IDIsCiAJLnBhZHMJCT0gc2VyaWFsM19wYWRzLAogCS5wYWRzX2NudAk9IEFSUkFZX1NJWkUoc2VyaWFsM19wYWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDRfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDRfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZAkJPSAzLAogCS5wYWRzCQk9IHNlcmlhbDRfcGFkcywKIAkucGFkc19jbnQJPSBBUlJBWV9TSVpFKHNlcmlhbDRfcGFkcyksCkBAIC03MjksNyArNzMwLDcgQEAKIAogCWlmIChvbWFwX3JldigpID09IE9NQVA0NDMwX1JFVl9FUzFfMCkKIAkJcGFja2FnZSA9IE9NQVBfUEFDS0FHRV9DQkw7Ci0Jb21hcDRfbXV4X2luaXQoYm9hcmRfbXV4LCBwYWNrYWdlKTsKKwlvbWFwNF9tdXhfaW5pdChib2FyZF9tdXgsIE5VTEwsIHBhY2thZ2UpOwogCiAJb21hcF9ib2FyZF9jb25maWcgPSBzZHA0NDMwX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShzZHA0NDMwX2NvbmZpZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFwb2xsb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCmluZGV4IGYzYmViOGUuLmIxMjRiZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCkBAIC0yNywxMyArMjcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbGVkLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwppbmRleCBjNjMxMTViLi43NzQ1NmRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKQEAgLTYzLDggKzYzLDYgQEAKICNkZWZpbmUgU0JfVDM1X1NNU0M5MTFYX0NTCTQKICNkZWZpbmUgU0JfVDM1X1NNU0M5MTFYX0dQSU8JNjUKIAotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCVNaXzEyOEsKLQogI2lmIGRlZmluZWQoQ09ORklHX1NNU0M5MTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTVNDOTExWF9NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMtc21zYzkxMXguaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYwppbmRleCAwOGYwOGU4Li5jM2E5ZmQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNTE3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jCkBAIC00OCw2ICs0OCw3IEBACiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX0xFRFNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfTEVEU19HUElPX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgY21fdDM1MTdfbGVkc1tdID0gewpAQCAtMTc3LDcgKzE3OCw3IEBACiAJLnJlc2V0X2dwaW9fcG9ydFsyXSAgPSAtRUlOVkFMLAogfTsKIAotc3RhdGljIGludCBjbV90MzUxN19pbml0X3VzYmgodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNtX3QzNTE3X2luaXRfdXNiaCh2b2lkKQogewogCWludCBlcnI7CiAKQEAgLTIwMyw4ICsyMDQsNiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfT01BUDJfTU9EVUxFKQotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCVNaXzEyOEsKLQogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGNtX3QzNTE3X25hbmRfcGFydGl0aW9uc1tdID0gewogCXsKIAkJLm5hbWUgICAgICAgICAgID0gInhsb2FkZXIiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYwppbmRleCBjZjUyMGQ3Li4zNDk1NmVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYwpAQCAtNjEsOCArNjEsNiBAQAogI2luY2x1ZGUgInRpbWVyLWdwLmgiCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIAotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCVNaXzEyOEsKLQogI2RlZmluZSBPTUFQX0RNOTAwMF9HUElPX0lSUQkyNQogI2RlZmluZSBPTUFQM19ERVZLSVRfVFNfR1BJTwkyNwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKaW5kZXggYmU3MTQyNi4uN2YyMWQyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwpAQCAtNTQsOCArNTQsNiBAQAogI2luY2x1ZGUgInBtLmgiCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIAotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCVNaXzEyOEsKLQogLyoKICAqIE9NQVAzIEJlYWdsZSByZXZpc2lvbgogICogUnVuIHRpbWUgZGV0ZWN0aW9uIG9mIEJlYWdsZSByZXZpc2lvbiBpcyBkb25lIGJ5IHJlYWRpbmcgR1BJTy4KQEAgLTEwNiw2ICsxMDQsOSBAQAogCWJlYWdsZV9yZXYgPSBncGlvX2dldF92YWx1ZSgxNzEpIHwgKGdwaW9fZ2V0X3ZhbHVlKDE3MikgPDwgMSkKIAkJCXwgKGdwaW9fZ2V0X3ZhbHVlKDE3MykgPDwgMik7CiAKKwlncGlvX2ZyZWVfYXJyYXkob21hcDNfYmVhZ2xlX3Jldl9ncGlvcywKKwkJCUFSUkFZX1NJWkUob21hcDNfYmVhZ2xlX3Jldl9ncGlvcykpOworCiAJc3dpdGNoIChiZWFnbGVfcmV2KSB7CiAJY2FzZSA3OgogCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMyBCZWFnbGUgUmV2OiBBeC9CeFxuIik7CkBAIC01NzksNiArNTgwLDkgQEAKIAlvbWFwX25hbmRfZmxhc2hfaW5pdChOQU5EX0JVU1dJRFRIXzE2LCBvbWFwM2JlYWdsZV9uYW5kX3BhcnRpdGlvbnMsCiAJCQkgICAgIEFSUkFZX1NJWkUob21hcDNiZWFnbGVfbmFuZF9wYXJ0aXRpb25zKSk7CiAKKwkvKiBFbnN1cmUgbXNlY3VyZSBpcyBtdXgnZCB0byBiZSBhYmxlIHRvIHNldCB0aGUgUlRDLiAqLworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzeXNfZHJtX21zZWN1cmUiLCBPTUFQX1BJTl9PRkZfT1VUUFVUX0hJR0gpOworCiAJLyogRW5zdXJlIFNEUkMgcGlucyBhcmUgbXV4J2QgZm9yIHNlbGYtcmVmcmVzaCAqLwogCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTAiLCBPTUFQX1BJTl9PVVRQVVQpOwogCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTEiLCBPTUFQX1BJTl9PVVRQVVQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKaW5kZXggMWQxMDczNi4uMjNmNzFkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CkBAIC00MSw3ICs0Miw2IEBACiAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CkBAIC01Nyw4ICs1Nyw2IEBACiAjZGVmaW5lIFBBTkRPUkFfV0lGSV9OUkVTRVRfR1BJTwkyMwogI2RlZmluZSBPTUFQM19QQU5ET1JBX1RTX0dQSU8JCTk0CiAKLSNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQkJU1pfMTI4SwotCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gb21hcDNwYW5kb3JhX25hbmRfcGFydGl0aW9uc1tdID0gewogCXsKIAkJLm5hbWUgICAgICAgICAgID0gInhsb2FkZXIiLApAQCAtODYsNyArODQsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIHBhbmRvcmFfbmFuZF9kYXRhID0gewogCS5jcwkJPSAwLAotCS5kZXZzaXplCT0gMSwJLyogJzAnIGZvciA4LWJpdCwgJzEnIGZvciAxNi1iaXQgZGV2aWNlICovCisJLmRldnNpemUJPSBOQU5EX0JVU1dJRFRIXzE2LAorCS54ZmVyX3R5cGUJPSBOQU5EX09NQVBfUFJFRkVUQ0hfRE1BLAogCS5wYXJ0cwkJPSBvbWFwM3BhbmRvcmFfbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUob21hcDNwYW5kb3JhX25hbmRfcGFydGl0aW9ucyksCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCmluZGV4IDgyODcyZDcuLjVmNjQ5ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMKQEAgLTU2LDggKzU2LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiAjZGVmaW5lIE9NQVAzX0FDX0dQSU8JCTEzNgogI2RlZmluZSBPTUFQM19UU19HUElPCQkxNjIKICNkZWZpbmUgVEJfQkxfUFdNX1RJTUVSCQk5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jCmluZGV4IDkwNDg1ZmMuLjBjZmUyMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jCkBAIC01MjYsMTkgKzUyNiwxOSBAQAogCQkJIE9NQVBfUElOX09VVFBVVCB8IE9NQVBfTVVYX01PREUwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDJfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDJfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZCAgICAgICAgICAgICA9IDEsCiAJLnBhZHMgICAgICAgICAgID0gc2VyaWFsMl9wYWRzLAogCS5wYWRzX2NudCAgICAgICA9IEFSUkFZX1NJWkUoc2VyaWFsMl9wYWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDNfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDNfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZCAgICAgICAgICAgICA9IDIsCiAJLnBhZHMgICAgICAgICAgID0gc2VyaWFsM19wYWRzLAogCS5wYWRzX2NudCAgICAgICA9IEFSUkFZX1NJWkUoc2VyaWFsM19wYWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDRfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDRfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZCAgICAgICAgICAgICA9IDMsCiAJLnBhZHMgICAgICAgICAgID0gc2VyaWFsNF9wYWRzLAogCS5wYWRzX2NudCAgICAgICA9IEFSUkFZX1NJWkUoc2VyaWFsNF9wYWRzKSwKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCiAJaWYgKG9tYXBfcmV2KCkgPT0gT01BUDQ0MzBfUkVWX0VTMV8wKQogCQlwYWNrYWdlID0gT01BUF9QQUNLQUdFX0NCTDsKLQlvbWFwNF9tdXhfaW5pdChib2FyZF9tdXgsIHBhY2thZ2UpOworCW9tYXA0X211eF9pbml0KGJvYXJkX211eCwgTlVMTCwgcGFja2FnZSk7CiAKIAlpZiAod2wxMnh4X3NldF9wbGF0Zm9ybV9kYXRhKCZvbWFwX3BhbmRhX3dsYW5fZGF0YSkpCiAJCXByX2VycigiZXJyb3Igc2V0dGluZyB3bDEyeHggZGF0YVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKaW5kZXggMTU1NTkxOC4uMTc1ZTFhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CkBAIC00NSw3ICs0Niw2IEBACiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KQEAgLTY1LDggKzY1LDYgQEAKICNkZWZpbmUgT1ZFUk9fR1BJT19VU0JIX0NQRU4JMTY4CiAjZGVmaW5lIE9WRVJPX0dQSU9fVVNCSF9OUkVTRVQJMTgzCiAKLSNkZWZpbmUgTkFORF9CTE9DS19TSVpFIFNaXzEyOEsKLQogI2RlZmluZSBPVkVST19TTVNDOTExWF9DUyAgICAgIDUKICNkZWZpbmUgT1ZFUk9fU01TQzkxMVhfR1BJTyAgICAxNzYKICNkZWZpbmUgT1ZFUk9fU01TQzkxMVgyX0NTICAgICA0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IGY2MjQ3ZTcuLjg4YmQ2ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC00ODgsNiArNDg4LDcgQEAKIAkJLm5hbWUJCQk9ICJWMjhfQSIsCiAJCS5taW5fdVYJCQk9IDI4MDAwMDAsCiAJCS5tYXhfdVYJCQk9IDMwMDAwMDAsCisJCS5hbHdheXNfb24JCT0gdHJ1ZSwgLyogZHVlIFZJTyBsZWFrIHRvIEFJQzM0IFZERHMgKi8KIAkJLmFwcGx5X3VWCQk9IHRydWUsCiAJCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCiAJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKQEAgLTU1Nyw3ICs1NTgsNyBAQAogCS5zdWJkZXZfYm9hcmRfaW5mbyA9ICZyeDUxX3NpNDcxM19ib2FyZF9pbmZvLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugcng1MV9zaTQ3MTNfZGV2IF9faW5pdGRhdGFfb3JfbW9kdWxlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugcng1MV9zaTQ3MTNfZGV2ID0gewogCS5uYW1lCT0gInJhZGlvLXNpNDcxMyIsCiAJLmlkCT0gLTEsCiAJLmRldgk9IHsKQEAgLTU4Miw3ICs1ODMsNyBAQAogewogCS8qIEZJWE1FIHRoaXMgZ3BpbyBzZXR1cCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIG5vdyAqLwogCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbyArIDYsIEdQSU9GX09VVF9JTklUX0xPVywgImJhY2tsaWdodF9wd20iKTsKLQlncGlvX3JlcXVlc3Rfb25lKGdwaW8gKyA3LCBHUElPRl9PVVRfSU5JVF9ISUdILCAic3BlYWtlcl9lbiIpOworCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbyArIDcsIEdQSU9GX09VVF9JTklUX0xPVywgInNwZWFrZXJfZW4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLWRpc3BsYXkuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1kaXNwbGF5LmMKaW5kZXggYzdjNmJlYi4uZDQ2ODNiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLWRpc3BsYXkuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jCkBAIC0yNiw3ICsyNiw3IEBACiAJeyBMQ0RfUEFORUxfUVZHQV9HUElPLAlHUElPRl9PVVRfSU5JVF9ISUdILCAibGNkIHF2Z2EiCSB9LAogfTsKIAotc3RhdGljIHZvaWQgem9vbV9sY2RfcGFuZWxfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHpvb21fbGNkX3BhbmVsX2luaXQodm9pZCkKIHsKIAl6b29tX2xjZF9ncGlvc1swXS5ncGlvID0gKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMzXzApID8KIAkJCUxDRF9QQU5FTF9SRVNFVF9HUElPX1BST0QgOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5jCmluZGV4IGU5NDkwM2IuLjk0Y2NmNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmMKQEAgLTg1LDE4ICs4NSwxOCBAQAogCXN0cnVjdCBzcGlfYm9hcmRfaW5mbyAqc3BpX2JpID0gJmFkczc4NDZfc3BpX2JvYXJkX2luZm87CiAJaW50IGVycjsKIAotCWVyciA9IGdwaW9fcmVxdWVzdChncGlvX3BlbmRvd24sICJUUyBQZW5Eb3duIik7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBvYnRhaW4gZ3BpbyBmb3IgVFMgUGVuRG93bjogJWRcbiIsIGVycik7Ci0JCXJldHVybjsKKwlpZiAoYm9hcmRfcGRhdGEgJiYgYm9hcmRfcGRhdGEtPmdldF9wZW5kb3duX3N0YXRlKSB7CisJCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoZ3Bpb19wZW5kb3duLCBHUElPRl9JTiwgIlRTUGVuRG93biIpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIkNvdWxkbid0IG9idGFpbiBncGlvIGZvciBUU1BlbkRvd246ICVkXG4iLCBlcnIpOworCQkJcmV0dXJuOworCQl9CisJCWdwaW9fZXhwb3J0KGdwaW9fcGVuZG93biwgMCk7CisKKwkJaWYgKGdwaW9fZGVib3VuY2UpCisJCQlncGlvX3NldF9kZWJvdW5jZShncGlvX3BlbmRvd24sIGdwaW9fZGVib3VuY2UpOwogCX0KIAotCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW9fcGVuZG93bik7Ci0JZ3Bpb19leHBvcnQoZ3Bpb19wZW5kb3duLCAwKTsKLQotCWlmIChncGlvX2RlYm91bmNlKQotCQlncGlvX3NldF9kZWJvdW5jZShncGlvX3BlbmRvd24sIGdwaW9fZGVib3VuY2UpOwotCiAJYWRzNzg0Nl9jb25maWcuZ3Bpb19wZW5kb3duID0gZ3Bpb19wZW5kb3duOwogCiAJc3BpX2JpLT5idXNfbnVtCT0gYnVzX251bTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuaAppbmRleCBlYjgwYjNiLi42Nzk3MTkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX09NQVBfQ09NTU9OX0JPQVJEX0RFVklDRVNfXwogI2RlZmluZSBfX09NQVBfQ09NTU9OX0JPQVJEX0RFVklDRVNfXwogCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQlTWl8xMjhLCisKIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGE7CiBzdHJ1Y3QgbXRkX3BhcnRpdGlvbjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwppbmRleCA3Yjg1NTg1Li41YjhjYTY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwpAQCAtOTcsNyArOTcsNyBAQAogCiAJV0FSTihJU19FUlIob2QpLCAiY291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwgb2hfbmFtZSk7CiAKLQlyZXR1cm4gUFRSX0VSUihvZCk7CisJcmV0dXJuIElTX0VSUihvZCkgPyBQVFJfRVJSKG9kKSA6IDA7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChvbWFwNF9sM19pbml0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCmluZGV4IGIyZjMwYmUuLjY2ODY4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKQEAgLTE0NSw2ICsxNDUsNyBAQAogCQkJCSBpbnQgcG93ZXJfb24sIGludCB2ZGQpCiB7CiAJdTMyIHJlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAlpZiAocG93ZXJfb24pIHsKIAkJcmVnID0gb21hcDRfY3RybF9wYWRfcmVhZGwoY29udHJvbF9wYmlhc19vZmZzZXQpOwpAQCAtMTU3LDkgKzE1OCwxNSBAQAogCQkJT01BUDRfTU1DMV9QV1JETlpfTUFTSyB8CiAJCQlPTUFQNF9VU0JDMV9JQ1VTQl9QV1JETlpfTUFTSyk7CiAJCW9tYXA0X2N0cmxfcGFkX3dyaXRlbChyZWcsIGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKLQkJLyogNCBtaWNyb3NlYyBkZWxheSBmb3IgY29tcGFyYXRvciB0byBnZW5lcmF0ZSBhbiBlcnJvciovCi0JCXVkZWxheSg0KTsKLQkJcmVnID0gb21hcDRfY3RybF9wYWRfcmVhZGwoY29udHJvbF9wYmlhc19vZmZzZXQpOworCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1KTsKKwkJZG8geworCQkJcmVnID0gb21hcDRfY3RybF9wYWRfcmVhZGwoY29udHJvbF9wYmlhc19vZmZzZXQpOworCQkJaWYgKCEocmVnICYgT01BUDRfTU1DMV9QQklBU0xJVEVfVk1PREVfRVJST1JfTUFTSykpCisJCQkJYnJlYWs7CisJCQl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCQl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisKIAkJaWYgKHJlZyAmIE9NQVA0X01NQzFfUEJJQVNMSVRFX1ZNT0RFX0VSUk9SX01BU0spIHsKIAkJCXByX2VycigiUGJpYXMgVm9sdGFnZSBpcyBub3Qgc2FtZSBhcyBMRE9cbiIpOwogCQkJLyogQ2F1dGlvbiA6IE9uIFZNT0RFX0VSUk9SIFBvd2VyIERvd24gTU1DIElPICovCkBAIC0zMzEsNiArMzM4LDkgQEAKIAlpZiAoYy0+bm9fb2ZmKQogCQltbWMtPnNsb3RzWzBdLm5vX29mZiA9IDE7CiAKKwlpZiAoYy0+bm9fb2ZmX2luaXQpCisJCW1tYy0+c2xvdHNbMF0ubm9fcmVndWxhdG9yX29mZl9pbml0ID0gYy0+bm9fb2ZmX2luaXQ7CisKIAlpZiAoYy0+dmNjX2F1eF9kaXNhYmxlX2lzX3NsZWVwKQogCQltbWMtPnNsb3RzWzBdLnZjY19hdXhfZGlzYWJsZV9pc19zbGVlcCA9IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuaAppbmRleCBmMTE5MzQ4Li5mNzU3ZTc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5oCkBAIC0xOCw2ICsxOCw3IEBACiAJYm9vbAlub25yZW1vdmFibGU7CS8qIE5vbnJlbW92YWJsZSBlLmcuIGVNTUMgKi8KIAlib29sCXBvd2VyX3NhdmluZzsJLyogVHJ5IHRvIHNsZWVwIG9yIHBvd2VyIG9mZiB3aGVuIHBvc3NpYmxlICovCiAJYm9vbAlub19vZmY7CQkvKiBwb3dlcl9zYXZpbmcgYW5kIHBvd2VyIGlzIG5vdCB0byBnbyBvZmYgKi8KKwlib29sCW5vX29mZl9pbml0OwkvKiBubyBwb3dlciBvZmYgd2hlbiBub3QgaW4gTU1DIHNsZWVwIHN0YXRlICovCiAJYm9vbAl2Y2NfYXV4X2Rpc2FibGVfaXNfc2xlZXA7IC8qIFJlZ3VsYXRvciBvZmYgcmVtYXBwZWQgdG8gc2xlZXAgKi8KIAlpbnQJZ3Bpb19jZDsJLyogb3IgLUVJTlZBTCAqLwogCWludAlncGlvX3dwOwkvKiBvciAtRUlOVkFMICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYwppbmRleCBhNGFiMWUzLi5jN2ZiMjJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKQEAgLTgzLDYgKzgzLDkgQEAKIHZvaWQgb21hcF9tdXhfd3JpdGVfYXJyYXkoc3RydWN0IG9tYXBfbXV4X3BhcnRpdGlvbiAqcGFydGl0aW9uLAogCQkJCSBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX211eCkKIHsKKwlpZiAoIWJvYXJkX211eCkKKwkJcmV0dXJuOworCiAJd2hpbGUgKGJvYXJkX211eC0+cmVnX29mZnNldCAhPSBPTUFQX01VWF9URVJNSU5BVE9SKSB7CiAJCW9tYXBfbXV4X3dyaXRlKHBhcnRpdGlvbiwgYm9hcmRfbXV4LT52YWx1ZSwKIAkJCSAgICAgICBib2FyZF9tdXgtPnJlZ19vZmZzZXQpOwpAQCAtOTA2LDcgKzkwOSw3IEBACiB1MTYgb21hcF9tdXhfZ2V0X2dwaW8oaW50IGdwaW8pCiB7CiAJc3RydWN0IG9tYXBfbXV4X3BhcnRpdGlvbiAqcGFydGl0aW9uOwotCXN0cnVjdCBvbWFwX211eCAqbTsKKwlzdHJ1Y3Qgb21hcF9tdXggKm0gPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJ0aXRpb24sICZtdXhfcGFydGl0aW9ucywgbm9kZSkgewogCQltID0gb21hcF9tdXhfZ2V0X2J5X2dwaW8ocGFydGl0aW9uLCBncGlvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5oCmluZGV4IDEzN2YzMjEuLjIxMzIzMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguaApAQCAtMzIzLDEwICszMjMsMTIgQEAKIAogLyoqCiAgKiBvbWFwNF9tdXhfaW5pdCgpIC0gaW5pdGlhbGl6ZSBtdXggc3lzdGVtIHdpdGggYm9hcmQgc3BlY2lmaWMgc2V0Ci0gKiBAYm9hcmRfbXV4OgkJQm9hcmQgc3BlY2lmaWMgbXV4IHRhYmxlCisgKiBAYm9hcmRfc3Vic2V0OglCb2FyZCBzcGVjaWZpYyBtdXggdGFibGUKKyAqIEBib2FyZF93a3VwX3N1YnNldDoJQm9hcmQgc3BlY2lmaWMgbXV4IHRhYmxlIGZvciB3YWtldXAgaW5zdGFuY2UKICAqIEBmbGFnczoJCU9NQVAgcGFja2FnZSB0eXBlIHVzZWQgZm9yIHRoZSBib2FyZAogICovCi1pbnQgb21hcDRfbXV4X2luaXQoc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9tdXgsIGludCBmbGFncyk7CitpbnQgb21hcDRfbXV4X2luaXQoc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9zdWJzZXQsCisJc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF93a3VwX3N1YnNldCwgaW50IGZsYWdzKTsKIAogLyoqCiAgKiBvbWFwX211eF9pbml0IC0gcHJpdmF0ZSBtdXggaW5pdCBmdW5jdGlvbiwgZG8gbm90IGNhbGwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXg0NHh4LmMKaW5kZXggOWE2NjQ0NS4uZjVhNzRkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXg0NHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXg0NHh4LmMKQEAgLTEzMDksNyArMTMwOSw4IEBACiAjZGVmaW5lIG9tYXA0X3drdXBfY2JsX2Nic19iYWxsICBOVUxMCiAjZW5kaWYKIAotaW50IF9faW5pdCBvbWFwNF9tdXhfaW5pdChzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX3N1YnNldCwgaW50IGZsYWdzKQoraW50IF9faW5pdCBvbWFwNF9tdXhfaW5pdChzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX3N1YnNldCwKKwlzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX3drdXBfc3Vic2V0LCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG9tYXBfYmFsbCAqcGFja2FnZV9iYWxsc19jb3JlOwogCXN0cnVjdCBvbWFwX2JhbGwgKnBhY2thZ2VfYmFsbHNfd2t1cCA9IG9tYXA0X3drdXBfY2JsX2Nic19iYWxsOwpAQCAtMTM0Nyw3ICsxMzQ4LDcgQEAKIAkJCSAgICBPTUFQX01VWF9HUElPX0lOX01PREUzLAogCQkJICAgIE9NQVA0X0NUUkxfTU9EVUxFX1BBRF9XS1VQX01VWF9QQkFTRSwKIAkJCSAgICBPTUFQNF9DVFJMX01PRFVMRV9QQURfV0tVUF9NVVhfU0laRSwKLQkJCSAgICBvbWFwNF93a3VwX211eG1vZGVzLCBOVUxMLCBib2FyZF9zdWJzZXQsCisJCQkgICAgb21hcDRfd2t1cF9tdXhtb2RlcywgTlVMTCwgYm9hcmRfd2t1cF9zdWJzZXQsCiAJCQkgICAgcGFja2FnZV9iYWxsc193a3VwKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jCmluZGV4IGUwMzQyOTQuLjI5M2ZhNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jCkBAIC0xNjI4LDcgKzE2MjgsNyBAQAogCQkJdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqdGVtcF9vaDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKCFmbikKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMKaW5kZXggYWJjNTQ4YS4uZTFjNjlmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzQ0eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF80NHh4X2RhdGEuYwpAQCAtNTEwOSw3ICs1MTA5LDcgQEAKIAkmb21hcDQ0eHhfaXZhX3NlcTFfaHdtb2QsCiAKIAkvKiBrYmQgY2xhc3MgKi8KLS8qCSZvbWFwNDR4eF9rYmRfaHdtb2QsICovCisJJm9tYXA0NHh4X2tiZF9od21vZCwKIAogCS8qIG1haWxib3ggY2xhc3MgKi8KIAkmb21hcDQ0eHhfbWFpbGJveF9od21vZCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9waHlfaW50ZXJuYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9waHlfaW50ZXJuYWwuYwppbmRleCBmNDc4MTNlLi41ODc3NWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfcGh5X2ludGVybmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3BoeV9pbnRlcm5hbC5jCkBAIC01Niw4ICs1NiwxMCBAQAogCS8qIFBvd2VyIGRvd24gdGhlIHBoeSAqLwogCV9fcmF3X3dyaXRlbChQSFlfUEQsIGN0cmxfYmFzZSArIENPTlRST0xfREVWX0NPTkYpOwogCi0JaWYgKCFkZXYpCisJaWYgKCFkZXYpIHsKKwkJaW91bm1hcChjdHJsX2Jhc2UpOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlwaHljbGsgPSBjbGtfZ2V0KGRldiwgIm9jcDJzY3BfdXNiX3BoeV9pY2siKTsKIAlpZiAoSVNfRVJSKHBoeWNsaykpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0tZGVidWcuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0tZGVidWcuYwppbmRleCBhNWE4M2IzLi5lMDFkYTQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLWRlYnVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jCkBAIC0xODksNyArMTg5LDcgQEAKIAogc3RhdGljIGludCBwbV9kYmdfaW5pdF9kb25lOwogCi1zdGF0aWMgaW50IF9faW5pdCBwbV9kYmdfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgcG1fZGJnX2luaXQodm9pZCk7CiAKIGVudW0gewogCURFQlVHX0ZJTEVfQ09VTlRFUlMgPSAwLApAQCAtNTk1LDcgKzU5NSw3IEBACiAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHBtX2RiZ19vcHRpb25fZm9wcywgb3B0aW9uX2dldCwgb3B0aW9uX3NldCwgIiVsbHVcbiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBwbV9kYmdfaW5pdCh2b2lkKQorc3RhdGljIGludCBwbV9kYmdfaW5pdCh2b2lkKQogewogCWludCBpOwogCXN0cnVjdCBkZW50cnkgKmQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKaW5kZXggODdhZTMxMi4uYjI3NTQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwpAQCAtMzQ3LDkgKzM0Nyw5IEBACiAJCWlmICgoZ3Bpb19kZXNjW2ldLmNvbmZpZyAmIE1GUF9MUE1fS0VFUF9PVVRQVVQpICYmCiAJCSAgICAoR1BEUihpKSAmIEdQSU9fYml0KGkpKSkgewogCQkJaWYgKEdQTFIoaSkgJiBHUElPX2JpdChpKSkKLQkJCQlQR1NSKGkpIHw9IEdQSU9fYml0KGkpOworCQkJCVBHU1IoZ3Bpb190b19iYW5rKGkpKSB8PSBHUElPX2JpdChpKTsKIAkJCWVsc2UKLQkJCQlQR1NSKGkpICY9IH5HUElPX2JpdChpKTsKKwkJCQlQR1NSKGdwaW9fdG9fYmFuayhpKSkgJj0gfkdQSU9fYml0KGkpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYwppbmRleCBkMTMwZjc3Li4yZjM3ZDQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKQEAgLTU3MywxMCArNTczLDEwIEBACiAJLnhyZXMJCT0gNDgwLAogCS55cmVzCQk9IDI3MiwKIAkuYnBwCQk9IDE2LAotCS5oc3luY19sZW4JPSA0LAorCS5oc3luY19sZW4JPSA0MSwKIAkubGVmdF9tYXJnaW4JPSAyLAogCS5yaWdodF9tYXJnaW4JPSAxLAotCS52c3luY19sZW4JPSAxLAorCS52c3luY19sZW4JPSAxMCwKIAkudXBwZXJfbWFyZ2luCT0gMywKIAkubG93ZXJfbWFyZ2luCT0gMSwKIAkuc3luYwkJPSAwLApAQCAtNTk2LDI5ICs1OTYsMzEgQEAKIHsKIAlpbnQgcmV0OwogCi0JcHhhX3NldF9mYl9pbmZvKE5VTEwsICZyYXVtZmVsZF9zaGFycF9sY2RfaW5mbyk7Ci0KLQkvKiBFYXJsaWVyIGRldmljZXMgaGFkIHRoZSBiYWNrbGlnaHQgcmVndWxhdG9yIGNvbnRyb2xsZWQKLQkgKiB2aWEgUFdNLCBsYXRlciB2ZXJzaW9ucyB1c2UgYW5vdGhlciBjb250cm9sbGVyIGZvciB0aGF0ICovCi0JaWYgKChzeXN0ZW1fcmV2ICYgMHhmZikgPCAyKSB7Ci0JCW1mcF9jZmdfdCByYXVtZmVsZF9wd21fcGluX2NvbmZpZyA9IEdQSU8xN19QV00wX09VVDsKLQkJcHhhM3h4X21mcF9jb25maWcoJnJhdW1mZWxkX3B3bV9waW5fY29uZmlnLCAxKTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyYXVtZmVsZF9wd21fYmFja2xpZ2h0X2RldmljZSk7Ci0JfSBlbHNlCi0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmF1bWZlbGRfbHQzNTkzX2RldmljZSk7Ci0KIAlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19URlRfVkFfRU4sICJkaXNwbGF5IFZBIGVuYWJsZSIpOwogCWlmIChyZXQgPCAwKQogCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gcmVxdWVzdCBHUElPX1RGVF9WQV9FTlxuIik7CiAJZWxzZQogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19URlRfVkFfRU4sIDEpOwogCisJbXNsZWVwKDEwMCk7CisKIAlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19ESVNQTEFZX0VOQUJMRSwgImRpc3BsYXkgZW5hYmxlIik7CiAJaWYgKHJldCA8IDApCiAJCXByX3dhcm5pbmcoIlVuYWJsZSB0byByZXF1ZXN0IEdQSU9fRElTUExBWV9FTkFCTEVcbiIpOwogCWVsc2UKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fRElTUExBWV9FTkFCTEUsIDEpOwogCisJLyogSGFyZHdhcmUgcmV2aXNpb24gMiBoYXMgdGhlIGJhY2tsaWdodCByZWd1bGF0b3IgY29udHJvbGxlZAorCSAqIGJ5IGFuIExUMzU5MywgZWFybGllciBhbmQgbGF0ZXIgZGV2aWNlcyB1c2UgUFdNIGZvciB0aGF0LiAqLworCWlmICgoc3lzdGVtX3JldiAmIDB4ZmYpID09IDIpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyYXVtZmVsZF9sdDM1OTNfZGV2aWNlKTsKKwl9IGVsc2UgeworCQltZnBfY2ZnX3QgcmF1bWZlbGRfcHdtX3Bpbl9jb25maWcgPSBHUElPMTdfUFdNMF9PVVQ7CisJCXB4YTN4eF9tZnBfY29uZmlnKCZyYXVtZmVsZF9wd21fcGluX2NvbmZpZywgMSk7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmF1bWZlbGRfcHdtX2JhY2tsaWdodF9kZXZpY2UpOworCX0KKworCXB4YV9zZXRfZmJfaW5mbyhOVUxMLCAmcmF1bWZlbGRfc2hhcnBfbGNkX2luZm8pOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcHhhM3h4X2RldmljZV9nY3UpOwogfQogCkBAIC02NTcsMTAgKzY1OSwxMCBAQAogCiAjZGVmaW5lIFNQSV9BSzQxMDQJXAogewkJCVwKLQkubW9kYWxpYXMJPSAiYWs0MTA0IiwJXAotCS5tYXhfc3BlZWRfaHoJPSAxMDAwMCwJXAotCS5idXNfbnVtCT0gMCwJCVwKLQkuY2hpcF9zZWxlY3QJPSAwLAkJXAorCS5tb2RhbGlhcwk9ICJhazQxMDQtY29kZWMiLAlcCisJLm1heF9zcGVlZF9oegk9IDEwMDAwLAkJXAorCS5idXNfbnVtCT0gMCwJCQlcCisJLmNoaXBfc2VsZWN0CT0gMCwJCQlcCiAJLmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopIEdQSU9fU1BESUZfQ1MsCVwKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6X3BtLmMKaW5kZXggN2ZlNzQwNi4uMDk0Mjc5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0el9wbS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FwbS1lbXVsYXRpb24uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQppbmRleCAwZDQ2OGU5Li44MTY5NTM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCkBAIC0xMCw3ICsxMCw2IEBACiBvYmotCQkJCTo9CiAKIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMCkJKz0gczNjMjQxMC5vCi1vYmotJChDT05GSUdfQ1BVX1MzQzI0MTApCSs9IGlycS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTBfRE1BKQkrPSBkbWEubwogb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEwX0RNQSkJKz0gZG1hLm8KIG9iai0kKENPTkZJR19TM0MyNDEwX1BNKQkrPSBwbS5vIHNsZWVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NDEyOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICoKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KLQotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9wbS5oPgotCi1zdHJ1Y3Qgc3lzY29yZV9vcHMgczNjMjR4eF9pcnFfc3lzY29yZV9vcHMgPSB7Ci0JLnN1c3BlbmQJPSBzM2MyNHh4X2lycV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjR4eF9pcnFfcmVzdW1lLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jCmluZGV4IGRkMzEyMGQuLmZjMmRjMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYwpAQCAtNTUyLDcgKzU1Miw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3B0aW9uYWxbOF07CiB9OwogCi1zdGF0aWMgdm9pZCBtaW5pMjQ0MF9wYXJzZV9mZWF0dXJlcygKK3N0YXRpYyB2b2lkIF9faW5pdCBtaW5pMjQ0MF9wYXJzZV9mZWF0dXJlcygKIAkJc3RydWN0IG1pbmkyNDQwX2ZlYXR1cmVzX3QgKiBmZWF0dXJlcywKIAkJY29uc3QgY2hhciAqIGZlYXR1cmVzX3N0ciApCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1zcGkuYwppbmRleCA4MmRiMDcyLi41ZTZiNDIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtc3BpLmMKQEAgLTg4LDYgKzg4LDcgQEAKIAkuY2ZnX2dwaW8gPSBzM2M2NHh4X3NwaV9jZmdfZ3BpbywKIAkuZmlmb19sdmxfbWFzayA9IDB4N2YsCiAJLnJ4X2x2bF9vZmZzZXQgPSAxMywKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xMzIsNiArMTMzLDcgQEAKIAkuY2ZnX2dwaW8gPSBzM2M2NHh4X3NwaV9jZmdfZ3BpbywKIAkuZmlmb19sdmxfbWFzayA9IDB4N2YsCiAJLnJ4X2x2bF9vZmZzZXQgPSAxMywKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9zcGkxID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jCmluZGV4IGIxOTcxNzEuLjIwNGJmYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXJldHVybiBjaGFuOwogfQogCi1pbnQgczNjMjQxMF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLCBpbnQgeGZlcnVuaXQpCitpbnQgczNjMjQxMF9kbWFfY29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsIGludCB4ZmVydW5pdCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgczNjMjQxMF9kbWFfY3RybCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApCitpbnQgczNjMjQxMF9kbWFfY3RybChlbnVtIGRtYV9jaCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTMzMSw3ICszMzEsNyBAQAogICoKICAqLwogCi1pbnQgczNjMjQxMF9kbWFfZW5xdWV1ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdm9pZCAqaWQsCitpbnQgczNjMjQxMF9kbWFfZW5xdWV1ZShlbnVtIGRtYV9jaCBjaGFubmVsLCB2b2lkICppZCwKIAkJCWRtYV9hZGRyX3QgZGF0YSwgaW50IHNpemUpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwpAQCAtNDE1LDcgKzQxNSw3IEBACiBFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2VucXVldWUpOwogCiAKLWludCBzM2MyNDEwX2RtYV9kZXZjb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCitpbnQgczNjMjQxMF9kbWFfZGV2Y29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkgIGVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlLAogCQkJICB1bnNpZ25lZCBsb25nIGRldmFkZHIpCiB7CkBAIC00NjMsNyArNDYzLDcgQEAKIEVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfZGV2Y29uZmlnKTsKIAogCi1pbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24odW5zaWduZWQgaW50IGNoYW5uZWwsCitpbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24oZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCSAgICBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRzdCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CkBAIC00ODcsNyArNDg3LDcgQEAKICAqIGdldCBjb250cm9sIG9mIGFuIGRtYSBjaGFubmVsCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfcmVxdWVzdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQsCiAJCQl2b2lkICpkZXYpCiB7CkBAIC01MzMsNyArNTMzLDcgQEAKICAqIGFsbG93ZWQgdG8gZ28gdGhyb3VnaC4KICovCiAKLWludCBzM2MyNDEwX2RtYV9mcmVlKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCitpbnQgczNjMjQxMF9kbWFfZnJlZShlbnVtIGRtYV9jaCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1zcGkuYwppbmRleCBlNzhlZTE4Li5hYzgyNWU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMKQEAgLTExMiwxMiArMTEyLDE0IEBACiAJLmNmZ19ncGlvCT0gczVwNjQ0MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDFmZiwKIAkucnhfbHZsX29mZnNldAk9IDE1LAorCS50eF9zdF9kb25lCT0gMjUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gczVwNjQ1MF9zcGkwX3BkYXRhID0gewogCS5jZmdfZ3Bpbwk9IHM1cDY0NTBfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrCT0gMHgxZmYsCiAJLnJ4X2x2bF9vZmZzZXQJPSAxNSwKKwkudHhfc3RfZG9uZQk9IDI1LAogfTsKIAogc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xNjAsMTIgKzE2MiwxNCBAQAogCS5jZmdfZ3Bpbwk9IHM1cDY0NDBfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrCT0gMHg3ZiwKIAkucnhfbHZsX29mZnNldAk9IDE1LAorCS50eF9zdF9kb25lCT0gMjUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gczVwNjQ1MF9zcGkxX3BkYXRhID0gewogCS5jZmdfZ3Bpbwk9IHM1cDY0NTBfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrCT0gMHg3ZiwKIAkucnhfbHZsX29mZnNldAk9IDE1LAorCS50eF9zdF9kb25lCT0gMjUsCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3NwaTEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Rldi1zcGkuYwppbmRleCA1N2IxOTc5Li5lNWQ2YzRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kZXYtc3BpLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGktY2xvY2tzLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKICNpbmNsdWRlIDxwbGF0L3MzYzY0eHgtc3BpLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgpAQCAtOTAsNiArOTEsNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xMzQsNiArMTM2LDcgQEAKIAkuZmlmb19sdmxfbWFzayA9IDB4N2YsCiAJLnJ4X2x2bF9vZmZzZXQgPSAxMywKIAkuaGlnaF9zcGVlZCA9IDEsCisJLnR4X3N0X2RvbmUgPSAyMSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMSA9IHsKQEAgLTE3Niw2ICsxNzksNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkyID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdWZyZXEuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jcHVmcmVxLmMKaW5kZXggMjIwNDZlMi4uMTUzYWY4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdWZyZXEuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1ZnJlcS5jCkBAIC0xMDEsMTIgKzEwMSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgdG1wLCB0bXAxOwogCXZvaWQgX19pb21lbSAqcmVnID0gTlVMTDsKIAotCWlmIChjaCA9PSBETUMwKQorCWlmIChjaCA9PSBETUMwKSB7CiAJCXJlZyA9IChTNVBfVkFfRE1DMCArIDB4MzApOwotCWVsc2UgaWYgKGNoID09IERNQzEpCisJfSBlbHNlIGlmIChjaCA9PSBETUMxKSB7CiAJCXJlZyA9IChTNVBfVkFfRE1DMSArIDB4MzApOwotCWVsc2UKKwl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBmaW5kIERNQyBwb3J0XG4iKTsKKwkJcmV0dXJuOworCX0KIAogCS8qIEZpbmQgY3VycmVudCBEUkFNIGZyZXF1ZW5jeSAqLwogCXRtcCA9IHM1cHYyMTBfZHJhbV9jb25mW2NoXS5mcmVxOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Rldi1zcGkuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kZXYtc3BpLmMKaW5kZXggZTMyNDlhNC4uZWFmOWE3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Rldi1zcGkuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZGV2LXNwaS5jCkBAIC04NSw2ICs4NSw3IEBACiAJLmZpZm9fbHZsX21hc2sgPSAweDFmZiwKIAkucnhfbHZsX29mZnNldCA9IDE1LAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDI1LAogfTsKIAogc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xMjksNiArMTMwLDcgQEAKIAkuZmlmb19sdmxfbWFzayA9IDB4N2YsCiAJLnJ4X2x2bF9vZmZzZXQgPSAxNSwKIAkuaGlnaF9zcGVlZCA9IDEsCisJLnR4X3N0X2RvbmUgPSAyNSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BpMSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jCmluZGV4IGM5NTI1OGMuLmNlNWMyNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYwpAQCAtMzgxLDExICszODEsOSBAQAogCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUE9SVDExNCwgc3RhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gc2hfc2RoaTFfcGxhdGRhdGEgPSB7Ci0JLmRtYV9zbGF2ZV90eAk9IFNIRE1BX1NMQVZFX1NESEkxX1RYLAotCS5kbWFfc2xhdmVfcngJPSBTSERNQV9TTEFWRV9TREhJMV9SWCwKK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzaF9zZGhpMV9pbmZvID0gewogCS50bWlvX2ZsYWdzCT0gVE1JT19NTUNfV1JQUk9URUNUX0RJU0FCTEUsCi0JLnRtaW9fY2Fwcwk9IE1NQ19DQVBfTk9OUkVNT1ZBQkxFLAorCS50bWlvX2NhcHMJPSBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8IE1NQ19DQVBfU0RJT19JUlEsCiAJLnRtaW9fb2NyX21hc2sJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKIAkuc2V0X3B3cgk9IGFnNWV2bV9zZGhpMV9zZXRfcHdyLAogfTsKQEAgLTQxNSw3ICs0MTMsNyBAQAogCS5uYW1lCQk9ICJzaF9tb2JpbGVfc2RoaSIsCiAJLmlkCQk9IDEsCiAJLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNoX3NkaGkxX3BsYXRkYXRhLAorCQkucGxhdGZvcm1fZGF0YQk9ICZzaF9zZGhpMV9pbmZvLAogCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNkaGkxX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gc2RoaTFfcmVzb3VyY2VzLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKaW5kZXggMDhhY2I2ZS4uODAzYmM2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCkBAIC0yNDksNiArMjQ5LDI5IEBACiB7CiAJcmV0dXJuICFncGlvX2dldF92YWx1ZShHUElPX1BPUlQ0MSk7CiB9CisvKiBNRVJBTSAqLworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1faW5mbyBtZXJhbV9pbmZvID0geworCS5hZGRyX21vZGUgICAgICA9IFNIX01PQklMRV9NRVJBTV9NT0RFMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbWVyYW1fcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZSAgID0gIk1FUkFNIiwKKwkJLnN0YXJ0ICA9IDB4ZTgwMDAwMDAsCisJCS5lbmQgICAgPSAweGU4MWZmZmZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1lcmFtX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAic2hfbW9iaWxlX21lcmFtIiwKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUobWVyYW1fcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBtZXJhbV9yZXNvdXJjZXMsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZtZXJhbV9pbmZvLAorCX0sCit9OwogCiAvKiBTSF9NTUNJRiAqLwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaF9tbWNpZl9yZXNvdXJjZXNbXSA9IHsKQEAgLTQ0NywxMyArNDcwLDI5IEBACiAjZW5kaWYKIAl9LAogfTsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2NmZyBsY2RfbWVyYW1fY2ZnID0geworCS5pY2JbMF0gPSB7CisJCS5tYXJrZXJfaWNiICAgICA9IDI4LAorCQkuY2FjaGVfaWNiICAgICAgPSAyNCwKKwkJLm1lcmFtX29mZnNldCAgID0gMHgwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDQwLAorCX0sCisJLmljYlsxXSA9IHsKKwkJLm1hcmtlcl9pY2IgICAgID0gMjksCisJCS5jYWNoZV9pY2IgICAgICA9IDI1LAorCQkubWVyYW1fb2Zmc2V0ICAgPSAweDQwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDQwLAorCX0sCit9OwogCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9sY2RjX2luZm8gbGNkY19pbmZvID0geworCS5tZXJhbV9kZXYgPSAmbWVyYW1faW5mbywKIAkuY2hbMF0gPSB7CiAJCS5jaGFuID0gTENEQ19DSEFOX01BSU5MQ0QsCiAJCS5icHAgPSAxNiwKIAkJLmxjZF9jZmcgPSBhcDRldmJfbGNkY19tb2RlcywKIAkJLm51bV9jZmcgPSBBUlJBWV9TSVpFKGFwNGV2Yl9sY2RjX21vZGVzKSwKKwkJLm1lcmFtX2NmZyA9ICZsY2RfbWVyYW1fY2ZnLAogCX0KIH07CiAKQEAgLTcyNCwxNSArNzYzLDMxIEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmc2lfYWs0NjQzX2RldmljZSA9IHsKIAkubmFtZQkJPSAic2hfZnNpMl9hX2FrNDY0MyIsCiB9Oworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnIGhkbWlfbWVyYW1fY2ZnID0geworCS5pY2JbMF0gPSB7CisJCS5tYXJrZXJfaWNiICAgICA9IDMwLAorCQkuY2FjaGVfaWNiICAgICAgPSAyNiwKKwkJLm1lcmFtX29mZnNldCAgID0gMHg4MCwKKwkJLm1lcmFtX3NpemUgICAgID0gMHgxMDAsCisJfSwKKwkuaWNiWzFdID0geworCQkubWFya2VyX2ljYiAgICAgPSAzMSwKKwkJLmNhY2hlX2ljYiAgICAgID0gMjcsCisJCS5tZXJhbV9vZmZzZXQgICA9IDB4MTgwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDEwMCwKKwl9LAorfTsKIAogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19pbmZvIHNoX21vYmlsZV9sY2RjMV9pbmZvID0gewogCS5jbG9ja19zb3VyY2UgPSBMQ0RDX0NMS19FWFRFUk5BTCwKKwkubWVyYW1fZGV2ID0gJm1lcmFtX2luZm8sCiAJLmNoWzBdID0gewogCQkuY2hhbiA9IExDRENfQ0hBTl9NQUlOTENELAogCQkuYnBwID0gMTYsCiAJCS5pbnRlcmZhY2VfdHlwZSA9IFJHQjI0LAogCQkuY2xvY2tfZGl2aWRlciA9IDEsCiAJCS5mbGFncyA9IExDRENfRkxBR1NfRFdQT0wsCisJCS5tZXJhbV9jZmcgPSAmaGRtaV9tZXJhbV9jZmcsCiAJfQogfTsKIApAQCAtODU4LDcgKzkxMyw3IEBACiAJSTJDX0JPQVJEX0lORk8oImlteDA3NCIsIDB4MWEpLAogfTsKIAotc3RydWN0IHNvY19jYW1lcmFfbGluayBpbXgwNzRfbGluayA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGlteDA3NF9saW5rID0gewogCS5idXNfaWQJCT0gMCwKIAkuYm9hcmRfaW5mbwk9ICZpbXgwNzRfaW5mbywKIAkuaTJjX2FkYXB0ZXJfaWQJPSAwLApAQCAtOTYxLDYgKzEwMTYsNyBAQAogCSZjc2kyX2RldmljZSwKIAkmY2V1X2RldmljZSwKIAkmYXA0ZXZiX2NhbWVyYSwKKwkmbWVyYW1fZGV2aWNlLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGhkbWlfaW5pdF9wbV9jbG9jayh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCmluZGV4IDQ0OGRkYmUuLjM4MDJmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2ludGMuaD4KICNpbmNsdWRlIDxsaW51eC90Y2E2NDE2X2tleXBhZC5oPgpAQCAtMTI1LDcgKzEyNiw3IEBACiAgKiAtLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLQogICogSVJRMCAgfCBJQ1IxQS5JUlEwU0E9MDAxMCAgfCBTREhJMiBjYXJkIGRldGVjdCAgfCBMb3cKICAqIElSUTYgIHwgSUNSMUEuSVJRNlNBPTAwMTEgIHwgRXRoZXIoTEFOOTIyMCkgICAgIHwgSGlnaAotICogSVJRNyAgfCBJQ1IxQS5JUlE3U0E9MDAxMCAgfCBMQ0QgVHVjaCBQYW5lbCAgICAgfCBMb3cKKyAqIElSUTcgIHwgSUNSMUEuSVJRN1NBPTAwMTAgIHwgTENEIFRvdWNoIFBhbmVsICAgIHwgTG93CiAgKiBJUlE4ICB8IElDUjJBLklSUThTQT0wMDEwICB8IE1NQy9TRCBjYXJkIGRldGVjdCB8IExvdwogICogSVJROSAgfCBJQ1IyQS5JUlE5U0E9MDAxMCAgfCBLRVkoVENBNjQwOCkgICAgICAgfCBMb3cKICAqIElSUTIxIHwgSUNSNEEuSVJRMjFTQT0wMDExIHwgU2Vuc29yKEFEWEwzNDUpICAgIHwgSGlnaApAQCAtMTY0LDEwICsxNjUsMTAgQEAKICAqIFVTQjEgY2FuIGJlY29tZSBIb3N0IGJ5IHI4YTY2NTk3LCBhbmQgYmVjb21lIEZ1bmN0aW9uIGJ5IHJlbmVzYXNfdXNiaHMuCiAgKiBCdXQgZG9uJ3Qgc2VsZWN0IGJvdGggZHJpdmVycyBpbiBzYW1lIHRpbWUuCiAgKiBUaGVzZSB1c2VzIHNhbWUgSVJRIG51bWJlciBmb3IgcmVxdWVzdF9pcnEoKSwgYW5kIGFyZW4ndCBzdXBwb3J0aW5nCi0gKiBJUlFGX1NIQVJEIC8gSU9SRVNPVVJDRV9JUlFfU0hBUkVBQkxFLgorICogSVJRRl9TSEFSRUQgLyBJT1JFU09VUkNFX0lSUV9TSEFSRUFCTEUuCiAgKgogICogQWN0dWFsbHkgdGhlc2UgYXJlIG9sZC9uZXcgdmVyc2lvbiBvZiBVU0IgZHJpdmVyLgotICogVGhpcyBtZWFuIGl0cyByZWdpc3RlciB3aWxsIGJlIGJyb2tlbiBpZiBpdCBzdXBwb3J0cyBTSEFSRCBJUlEsCisgKiBUaGlzIG1lYW4gaXRzIHJlZ2lzdGVyIHdpbGwgYmUgYnJva2VuIGlmIGl0IHN1cHBvcnRzIHNoYXJlZCBJUlEsCiAgKi8KIAogLyoKQEAgLTMxNCw2ICszMTUsMzAgQEAKIAl9LAogfTsKIAorLyogTUVSQU0gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2luZm8gbWFja2VyZWxfbWVyYW1faW5mbyA9IHsKKwkuYWRkcl9tb2RlCT0gU0hfTU9CSUxFX01FUkFNX01PREUxLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtZXJhbV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1FUkFNIiwKKwkJLnN0YXJ0CT0gMHhlODAwMDAwMCwKKwkJLmVuZAk9IDB4ZTgxZmZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtZXJhbV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX21vYmlsZV9tZXJhbSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG1lcmFtX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbWVyYW1fcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZtYWNrZXJlbF9tZXJhbV9pbmZvLAorCX0sCit9OworCiAvKiBMQ0RDICovCiBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBtYWNrZXJlbF9sY2RjX21vZGVzW10gPSB7CiAJewpAQCAtMzQyLDcgKzM2NywyMyBAQAogCXJldHVybiBncGlvX2dldF92YWx1ZShHUElPX1BPUlQzMSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2NmZyBsY2RfbWVyYW1fY2ZnID0geworCS5pY2JbMF0gPSB7CisJCS5tYXJrZXJfaWNiICAgICA9IDI4LAorCQkuY2FjaGVfaWNiICAgICAgPSAyNCwKKwkJLm1lcmFtX29mZnNldCAgID0gMHgwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDQwLAorCX0sCisJLmljYlsxXSA9IHsKKwkJLm1hcmtlcl9pY2IgICAgID0gMjksCisJCS5jYWNoZV9pY2IgICAgICA9IDI1LAorCQkubWVyYW1fb2Zmc2V0ICAgPSAweDQwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDQwLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9sY2RjX2luZm8gbGNkY19pbmZvID0geworCS5tZXJhbV9kZXYgPSAmbWFja2VyZWxfbWVyYW1faW5mbywKIAkuY2xvY2tfc291cmNlID0gTENEQ19DTEtfQlVTLAogCS5jaFswXSA9IHsKIAkJLmNoYW4gPSBMQ0RDX0NIQU5fTUFJTkxDRCwKQEAgLTM2Miw2ICs0MDMsNyBAQAogCQkJLm5hbWUgPSAic2hfbW9iaWxlX2xjZGNfYmwiLAogCQkJLm1heF9icmlnaHRuZXNzID0gMSwKIAkJfSwKKwkJLm1lcmFtX2NmZyA9ICZsY2RfbWVyYW1fY2ZnLAogCX0KIH07CiAKQEAgLTM4OCw4ICs0MzAsMjMgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnIGhkbWlfbWVyYW1fY2ZnID0geworCS5pY2JbMF0gPSB7CisJCS5tYXJrZXJfaWNiICAgICA9IDMwLAorCQkuY2FjaGVfaWNiICAgICAgPSAyNiwKKwkJLm1lcmFtX29mZnNldCAgID0gMHg4MCwKKwkJLm1lcmFtX3NpemUgICAgID0gMHgxMDAsCisJfSwKKwkuaWNiWzFdID0geworCQkubWFya2VyX2ljYiAgICAgPSAzMSwKKwkJLmNhY2hlX2ljYiAgICAgID0gMjcsCisJCS5tZXJhbV9vZmZzZXQgICA9IDB4MTgwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDEwMCwKKwl9LAorfTsKIC8qIEhETUkgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfaW5mbyBoZG1pX2xjZGNfaW5mbyA9IHsKKwkubWVyYW1fZGV2ID0gJm1hY2tlcmVsX21lcmFtX2luZm8sCiAJLmNsb2NrX3NvdXJjZSA9IExDRENfQ0xLX0VYVEVSTkFMLAogCS5jaFswXSA9IHsKIAkJLmNoYW4gPSBMQ0RDX0NIQU5fTUFJTkxDRCwKQEAgLTM5Nyw2ICs0NTQsNyBAQAogCQkuaW50ZXJmYWNlX3R5cGUgPSBSR0IyNCwKIAkJLmNsb2NrX2RpdmlkZXIgPSAxLAogCQkuZmxhZ3MgPSBMQ0RDX0ZMQUdTX0RXUE9MLAorCQkubWVyYW1fY2ZnID0gJmhkbWlfbWVyYW1fY2ZnLAogCX0KIH07CiAKQEAgLTUwNCw3ICs1NjIsMTIxIEBACiAJCWNsa19wdXQoaGRtaV9pY2spOwogfQogCi0vKiBVU0IxIChIb3N0KSAqLworLyogVVNCSFMwIGlzIGNvbm5lY3RlZCB0byBDTjIyIHdoaWNoIHRha2VzIGEgVVNCIE1pbmktQiBwbHVnCisgKgorICogVGhlIHNoNzM3MiBTb0MgaGFzIElSUTcgc2V0IGFzaWRlIGZvciBVU0JIUzAgaG90cGx1ZywKKyAqIGJ1dCBvbiB0aGlzIHBhcnRpY3VsYXIgYm9hcmQgSVJRNyBpcyBhbHJlYWR5IHVzZWQgYnkKKyAqIHRoZSB0b3VjaCBzY3JlZW4uIFRoaXMgbGVhdmVzIHVzIHdpdGggc29mdHdhcmUgcG9sbGluZy4KKyAqLworI2RlZmluZSBVU0JIUzBfUE9MTF9JTlRFUlZBTCAoSFogKiA1KQorCitzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSB7CisJdW5zaWduZWQgaW50IHVzYnBoeWFkZHI7CisJdW5zaWduZWQgaW50IHVzYmNyY2FkZHI7CisJc3RydWN0IHJlbmVzYXNfdXNiaHNfcGxhdGZvcm1faW5mbyBpbmZvOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworfTsKKworI2RlZmluZSB1c2Joc19nZXRfcHJpdihwZGV2KQkJCQlcCisJY29udGFpbmVyX29mKHJlbmVzYXNfdXNiaHNfZ2V0X2luZm8ocGRldiksCVwKKwkJICAgICBzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSwgaW5mbykKKworI2RlZmluZSB1c2Joc19pc19jb25uZWN0ZWQocHJpdikJCQlcCisJKCEoKDEgPDwgNykgJiBfX3Jhd19yZWFkdyhwcml2LT51c2JjcmNhZGRyKSkpCisKK3N0YXRpYyBpbnQgdXNiaHNfZ2V0X3ZidXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gdXNiaHNfaXNfY29ubmVjdGVkKHVzYmhzX2dldF9wcml2KHBkZXYpKTsKK30KKworc3RhdGljIHZvaWQgdXNiaHNfcGh5X3Jlc2V0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKKworCS8qIGluaXQgcGh5ICovCisJX19yYXdfd3JpdGV3KDB4OGEwYSwgcHJpdi0+dXNiY3JjYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgdXNiaHMwX2dldF9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBVU0JIU19HQURHRVQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzMF93b3JrX2Z1bmN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSwKKwkJCQkJCSAgd29yay53b3JrKTsKKworCXJlbmVzYXNfdXNiaHNfY2FsbF9ub3RpZnlfaG90cGx1Zyhwcml2LT5wZGV2KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPndvcmssIFVTQkhTMF9QT0xMX0lOVEVSVkFMKTsKK30KKworc3RhdGljIGludCB1c2JoczBfaGFyZHdhcmVfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gdXNiaHNfZ2V0X3ByaXYocGRldik7CisKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+d29yaywgdXNiaHMwX3dvcmtfZnVuY3Rpb24pOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+d29yaywgVVNCSFMwX1BPTExfSU5URVJWQUwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2JoczBfaGFyZHdhcmVfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gdXNiaHNfZ2V0X3ByaXYocGRldik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPndvcmspOworfQorCitzdGF0aWMgc3RydWN0IHVzYmhzX3ByaXZhdGUgdXNiaHMwX3ByaXZhdGUgPSB7CisJLnVzYmNyY2FkZHIJPSAweGU2MDU4MTBjLAkJLyogVVNCQ1IyICovCisJLmluZm8gPSB7CisJCS5wbGF0Zm9ybV9jYWxsYmFjayA9IHsKKwkJCS5oYXJkd2FyZV9pbml0CT0gdXNiaHMwX2hhcmR3YXJlX2luaXQsCisJCQkuaGFyZHdhcmVfZXhpdAk9IHVzYmhzMF9oYXJkd2FyZV9leGl0LAorCQkJLnBoeV9yZXNldAk9IHVzYmhzX3BoeV9yZXNldCwKKwkJCS5nZXRfaWQJCT0gdXNiaHMwX2dldF9pZCwKKwkJCS5nZXRfdmJ1cwk9IHVzYmhzX2dldF92YnVzLAorCQl9LAorCQkuZHJpdmVyX3BhcmFtID0geworCQkJLmJ1c3dhaXRfYndhaXQJPSA0LAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmhzMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlVTQkhTMCIsCisJCS5zdGFydAk9IDB4ZTY4OTAwMDAsCisJCS5lbmQJPSAweGU2ODkwMGU2IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IGV2dDJpcnEoMHgxY2EwKSAvKiBVU0IwX1VTQjBJMCAqLywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVzYmhzMF9kZXZpY2UgPSB7CisJLm5hbWUJPSAicmVuZXNhc191c2JocyIsCisJLmlkCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQkJPSAmdXNiaHMwX3ByaXZhdGUuaW5mbywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2JoczBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB1c2JoczBfcmVzb3VyY2VzLAorfTsKKworLyogVVNCSFMxIGlzIGNvbm5lY3RlZCB0byBDTjMxIHdoaWNoIHRha2VzIGEgVVNCIE1pbmktQUIgcGx1ZworICoKKyAqIFVzZSBKMzAgdG8gc2VsZWN0IGJldHdlZW4gSG9zdCBhbmQgRnVuY3Rpb24uIFRoaXMgc2V0dGluZworICogY2FuIGhvd2V2ZXIgbm90IGJlIGRldGVjdGVkIGJ5IHNvZnR3YXJlLiBIb3RwbHVnIG9mIFVTQkhTMQorICogaXMgcHJvdmlkZWQgdmlhIElSUTguCisgKi8KKyNkZWZpbmUgSVJROCBldnQyaXJxKDB4MDMwMCkKKworLyogVVNCSFMxIFVTQiBIb3N0IHN1cHBvcnQgdmlhIHI4YTY2NTk3X2hjZCAqLwogc3RhdGljIHZvaWQgdXNiMV9ob3N0X3BvcnRfcG93ZXIoaW50IHBvcnQsIGludCBwb3dlcikKIHsKIAlpZiAoIXBvd2VyKSAvKiBvbmx5IHBvd2VyLW9uIGlzIHN1cHBvcnRlZCBmb3Igbm93ICovCkBAIC01MjEsOSArNjkzLDkgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2IxX2hvc3RfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJVU0JIUyIsCi0JCS5zdGFydAk9IDB4RTY4QjAwMDAsCi0JCS5lbmQJPSAweEU2OEIwMEU2IC0gMSwKKwkJLm5hbWUJPSAiVVNCSFMxIiwKKwkJLnN0YXJ0CT0gMHhlNjhiMDAwMCwKKwkJLmVuZAk9IDB4ZTY4YjAwZTYgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTU0NCwzNyArNzE2LDE0IEBACiAJLnJlc291cmNlCT0gdXNiMV9ob3N0X3Jlc291cmNlcywKIH07CiAKLS8qIFVTQjEgKEZ1bmN0aW9uKSAqLworLyogVVNCSFMxIFVTQiBGdW5jdGlvbiBzdXBwb3J0IHZpYSByZW5lc2FzX3VzYmhzICovCisKICNkZWZpbmUgVVNCX1BIWV9NT0RFCQkoMSA8PCA0KQogI2RlZmluZSBVU0JfUEhZX0lOVF9FTgkJKCgxIDw8IDMpIHwgKDEgPDwgMikpCiAjZGVmaW5lIFVTQl9QSFlfT04JCSgxIDw8IDEpCiAjZGVmaW5lIFVTQl9QSFlfT0ZGCQkoMSA8PCAwKQogI2RlZmluZSBVU0JfUEhZX0lOVF9DTFIJCShVU0JfUEhZX09OIHwgVVNCX1BIWV9PRkYpCiAKLXN0cnVjdCB1c2Joc19wcml2YXRlIHsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCXVuc2lnbmVkIGludCB1c2JwaHlhZGRyOwotCXVuc2lnbmVkIGludCB1c2JjcmNhZGRyOwotCXN0cnVjdCByZW5lc2FzX3VzYmhzX3BsYXRmb3JtX2luZm8gaW5mbzsKLX07Ci0KLSNkZWZpbmUgdXNiaHNfZ2V0X3ByaXYocGRldikJCQkJXAotCWNvbnRhaW5lcl9vZihyZW5lc2FzX3VzYmhzX2dldF9pbmZvKHBkZXYpLAlcCi0JCSAgICAgc3RydWN0IHVzYmhzX3ByaXZhdGUsIGluZm8pCi0KLSNkZWZpbmUgdXNiaHNfaXNfY29ubmVjdGVkKHByaXYpCQkJXAotCSghKCgxIDw8IDcpICYgX19yYXdfcmVhZHcocHJpdi0+dXNiY3JjYWRkcikpKQotCi1zdGF0aWMgaW50IHVzYmhzMV9nZXRfaWQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gVVNCSFNfR0FER0VUOwotfQotCi1zdGF0aWMgaW50IHVzYmhzMV9nZXRfdmJ1cyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiB1c2Joc19pc19jb25uZWN0ZWQodXNiaHNfZ2V0X3ByaXYocGRldikpOwotfQotCiBzdGF0aWMgaXJxcmV0dXJuX3QgdXNiaHMxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBkYXRhOwpAQCAtNTk2LDEyICs3NDUsMTAgQEAKIAlzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSAqcHJpdiA9IHVzYmhzX2dldF9wcml2KHBkZXYpOwogCWludCByZXQ7CiAKLQlpcnFfc2V0X2lycV90eXBlKHByaXYtPmlycSwgSVJRX1RZUEVfTEVWRUxfSElHSCk7Ci0KIAkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCiAJX19yYXdfd3JpdGV3KFVTQl9QSFlfTU9ERSB8IFVTQl9QSFlfSU5UX0NMUiwgcHJpdi0+dXNicGh5YWRkcik7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShwcml2LT5pcnEsIHVzYmhzMV9pbnRlcnJ1cHQsIDAsCisJcmV0ID0gcmVxdWVzdF9pcnEoSVJROCwgdXNiaHMxX2ludGVycnVwdCwgSVJRRl9UUklHR0VSX0hJR0gsCiAJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBwZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfaXJxIGVyclxuIik7CkBAIC02MjEsMTUgKzc2OCwxMiBAQAogCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KIAlfX3Jhd193cml0ZXcoVVNCX1BIWV9NT0RFIHwgVVNCX1BIWV9JTlRfQ0xSLCBwcml2LT51c2JwaHlhZGRyKTsKIAotCWZyZWVfaXJxKHByaXYtPmlycSwgcGRldik7CisJZnJlZV9pcnEoSVJROCwgcGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYmhzMV9waHlfcmVzZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgdXNiaHMxX2dldF9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gdXNiaHNfZ2V0X3ByaXYocGRldik7Ci0KLQkvKiBpbml0IHBoeSAqLwotCV9fcmF3X3dyaXRldygweDhhMGEsIHByaXYtPnVzYmNyY2FkZHIpOworCXJldHVybiBVU0JIU19HQURHRVQ7CiB9CiAKIHN0YXRpYyB1MzIgdXNiaHMxX3BpcGVfY2ZnW10gPSB7CkBAIC02NTIsMTYgKzc5NiwxNSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2Joc19wcml2YXRlIHVzYmhzMV9wcml2YXRlID0gewotCS5pcnEJCT0gZXZ0MmlycSgweDAzMDApLAkvKiBJUlE4ICovCi0JLnVzYnBoeWFkZHIJPSAweEU2MDU4MUUyLAkJLyogVVNCUEhZMUlOVEFQICovCi0JLnVzYmNyY2FkZHIJPSAweEU2MDU4MTMwLAkJLyogVVNCQ1I0ICovCisJLnVzYnBoeWFkZHIJPSAweGU2MDU4MWUyLAkJLyogVVNCUEhZMUlOVEFQICovCisJLnVzYmNyY2FkZHIJPSAweGU2MDU4MTMwLAkJLyogVVNCQ1I0ICovCiAJLmluZm8gPSB7CiAJCS5wbGF0Zm9ybV9jYWxsYmFjayA9IHsKIAkJCS5oYXJkd2FyZV9pbml0CT0gdXNiaHMxX2hhcmR3YXJlX2luaXQsCiAJCQkuaGFyZHdhcmVfZXhpdAk9IHVzYmhzMV9oYXJkd2FyZV9leGl0LAotCQkJLnBoeV9yZXNldAk9IHVzYmhzMV9waHlfcmVzZXQsCiAJCQkuZ2V0X2lkCQk9IHVzYmhzMV9nZXRfaWQsCi0JCQkuZ2V0X3ZidXMJPSB1c2JoczFfZ2V0X3ZidXMsCisJCQkucGh5X3Jlc2V0CT0gdXNiaHNfcGh5X3Jlc2V0LAorCQkJLmdldF92YnVzCT0gdXNiaHNfZ2V0X3ZidXMsCiAJCX0sCiAJCS5kcml2ZXJfcGFyYW0gPSB7CiAJCQkuYnVzd2FpdF9id2FpdAk9IDQsCkBAIC02NzMsOSArODE2LDkgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JoczFfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJVU0JIUyIsCi0JCS5zdGFydAk9IDB4RTY4QjAwMDAsCi0JCS5lbmQJPSAweEU2OEIwMEU2IC0gMSwKKwkJLm5hbWUJPSAiVVNCSFMxIiwKKwkJLnN0YXJ0CT0gMHhlNjhiMDAwMCwKKwkJLmVuZAk9IDB4ZTY4YjAwZTYgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTY5NCw3ICs4MzcsNiBAQAogCS5yZXNvdXJjZQk9IHVzYmhzMV9yZXNvdXJjZXMsCiB9OwogCi0KIC8qIExFRCAqLwogc3RhdGljIHN0cnVjdCBncGlvX2xlZCBtYWNrZXJlbF9sZWRzW10gPSB7CiAJewpAQCAtODU2LDYgKzk5OCwxNyBAQAogfQogCiAvKiBTREhJMCAqLworc3RhdGljIGlycXJldHVybl90IG1hY2tlcmVsX3NkaGkwX2dwaW9fY2QoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFyZzsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyAqaW5mbyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBpbmZvLT5wZGF0YTsKKworCXRtaW9fbW1jX2NkX3dha2V1cChwZGF0YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMF9pbmZvID0gewogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTBfUlgsCkBAIC0xMTM2LDYgKzEyODksNyBAQAogCSZsY2RjX2RldmljZSwKIAkmdXNiMV9ob3N0X2RldmljZSwKIAkmdXNiaHMxX2RldmljZSwKKwkmdXNiaHMwX2RldmljZSwKIAkmbGVkc19kZXZpY2UsCiAJJmZzaV9kZXZpY2UsCiAJJmZzaV9hazQ2NDNfZGV2aWNlLApAQCAtMTE1MCw2ICsxMzA0LDcgQEAKIAkmbWFja2VyZWxfY2FtZXJhLAogCSZoZG1pX2xjZGNfZGV2aWNlLAogCSZoZG1pX2RldmljZSwKKwkmbWVyYW1fZGV2aWNlLAogfTsKIAogLyogS2V5cGFkIEluaXRpYWxpemF0aW9uICovCkBAIC0xMjMxLDYgKzEzODYsNyBAQAogCiAjZGVmaW5lIEdQSU9fUE9SVDlDUgkweEU2MDUxMDA5CiAjZGVmaW5lIEdQSU9fUE9SVDEwQ1IJMHhFNjA1MTAwQQorI2RlZmluZSBHUElPX1BPUlQxNjdDUgkweEU2MDUyMEE3CiAjZGVmaW5lIEdQSU9fUE9SVDE2OENSCTB4RTYwNTIwQTgKICNkZWZpbmUgU1JDUjQJCTB4ZTYxNTgwYmMKICNkZWZpbmUgVVNDQ1IxCQkweEU2MDU4MTQ0CkBAIC0xMjM4LDYgKzEzOTQsNyBAQAogewogCXUzMiBzcmNyNDsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IHJldDsKIAogCXNoNzM3Ml9waW5tdXhfaW5pdCgpOwogCkBAIC0xMjgzLDE3ICsxNDQwLDE3IEBACiAJZ3Bpb19yZXF1ZXN0KEdQSU9fUE9SVDE1MSwgTlVMTCk7IC8qIExDRERPTiAqLwogCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BPUlQxNTEsIDEpOwogCi0JLyogVVNCIGVuYWJsZSAqLwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZCVVMwXzEsICAgIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX0lESU5fMV8xOCwgIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX1BXRU5fMV8xMTUsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX09WQ05fMV8xMTQsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX0VYVExQXzEsICAgIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX09WQ04yXzEsICAgIE5VTEwpOwotCWdwaW9fcHVsbF9kb3duKEdQSU9fUE9SVDE2OENSKTsKKwkvKiBVU0JIUzAgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WQlVTMF8wLCBOVUxMKTsKKwlncGlvX3B1bGxfZG93bihHUElPX1BPUlQxNjhDUik7IC8qIFZCVVMwXzAgcHVsbCBkb3duICovCiAKLQkvKiBzZXR1cCBVU0IgcGh5ICovCi0JX19yYXdfd3JpdGV3KDB4OGEwYSwgMHhFNjA1ODEzMCk7CS8qIFVTQkNSNCAqLworCS8qIFVTQkhTMSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZCVVMwXzEsIE5VTEwpOworCWdwaW9fcHVsbF9kb3duKEdQSU9fUE9SVDE2N0NSKTsgLyogVkJVUzBfMSBwdWxsIGRvd24gKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9JRElOXzFfMTEzLCBOVUxMKTsKKworCS8qIFVTQiBwaHkgdHdlYWsgdG8gbWFrZSB0aGUgcjhhNjY1OTdfaGNkIGhvc3QgZHJpdmVyIHdvcmsgKi8KKwlfX3Jhd193cml0ZXcoMHg4YTBhLCAweGU2MDU4MTMwKTsgICAgICAgLyogVVNCQ1I0ICovCiAKIAkvKiBlbmFibGUgRlNJMiBwb3J0IEEgKGFrNDY0MykgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9GU0lBSUJULAlOVUxMKTsKQEAgLTEzNDMsNiArMTUwMCwxMyBAQAogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMF8xLCBOVUxMKTsKIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDBfMCwgTlVMTCk7CiAKKwlyZXQgPSByZXF1ZXN0X2lycShldnQyaXJxKDB4MzM0MCksIG1hY2tlcmVsX3NkaGkwX2dwaW9fY2QsCisJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HLCAic2RoaTAgY2QiLCAmc2RoaTBfZGV2aWNlLmRldik7CisJaWYgKCFyZXQpCisJCXNkaGkwX2luZm8udG1pb19mbGFncyB8PSBUTUlPX01NQ19IQVNfQ09MRF9DRDsKKwllbHNlCisJCXByX2VycigiQ2Fubm90IGdldCBJUlEgIyVkOiAlZFxuIiwgZXZ0MmlycSgweDMzNDApLCByZXQpOworCiAjaWYgIWRlZmluZWQoQ09ORklHX01NQ19TSF9NTUNJRikgJiYgIWRlZmluZWQoQ09ORklHX01NQ19TSF9NTUNJRl9NT0RVTEUpCiAJLyogZW5hYmxlIFNESEkxICovCiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUNNRDEsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKaW5kZXggZDE3ZWI2Ni4uYzA4MDBkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCkBAIC01MDksNiArNTA5LDcgQEAKICAgICAgICBNU1RQMTE4LCBNU1RQMTE3LCBNU1RQMTE2LCBNU1RQMTEzLAogICAgICAgIE1TVFAxMDYsIE1TVFAxMDEsIE1TVFAxMDAsCiAgICAgICAgTVNUUDIyMywKKyAgICAgICBNU1RQMjE4LCBNU1RQMjE3LCBNU1RQMjE2LAogICAgICAgIE1TVFAyMDcsIE1TVFAyMDYsIE1TVFAyMDQsIE1TVFAyMDMsIE1TVFAyMDIsIE1TVFAyMDEsIE1TVFAyMDAsCiAgICAgICAgTVNUUDMyOSwgTVNUUDMyOCwgTVNUUDMyMywgTVNUUDMyMiwgTVNUUDMxNCwgTVNUUDMxMywgTVNUUDMxMiwKICAgICAgICBNU1RQNDIzLCBNU1RQNDE1LCBNU1RQNDEzLCBNU1RQNDExLCBNU1RQNDEwLCBNU1RQNDA2LCBNU1RQNDAzLApAQCAtNTM0LDYgKzUzNSw5IEBACiAJW01TVFAxMDFdID0gTVNUUCgmZGl2NF9jbGtzW0RJVjRfTTFdLCBTTVNUUENSMSwgMSwgMCksIC8qIFZQVSAqLwogCVtNU1RQMTAwXSA9IE1TVFAoJmRpdjRfY2xrc1tESVY0X0JdLCBTTVNUUENSMSwgMCwgMCksIC8qIExDREMwICovCiAJW01TVFAyMjNdID0gTVNUUCgmZGl2Nl9jbGtzW0RJVjZfU1BVXSwgU01TVFBDUjIsIDIzLCAwKSwgLyogU1BVMiAqLworCVtNU1RQMjE4XSA9IE1TVFAoJmRpdjRfY2xrc1tESVY0X0hQXSwgU01TVFBDUjIsIDE4LCAwKSwgLyogRE1BQzEgKi8KKwlbTVNUUDIxN10gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9IUF0sIFNNU1RQQ1IyLCAxNywgMCksIC8qIERNQUMyICovCisJW01TVFAyMTZdID0gTVNUUCgmZGl2NF9jbGtzW0RJVjRfSFBdLCBTTVNUUENSMiwgMTYsIDApLCAvKiBETUFDMyAqLwogCVtNU1RQMjA3XSA9IE1TVFAoJmRpdjZfY2xrc1tESVY2X1NVQl0sIFNNU1RQQ1IyLCA3LCAwKSwgLyogU0NJRkE1ICovCiAJW01TVFAyMDZdID0gTVNUUCgmZGl2Nl9jbGtzW0RJVjZfU1VCXSwgU01TVFBDUjIsIDYsIDApLCAvKiBTQ0lGQiAqLwogCVtNU1RQMjA0XSA9IE1TVFAoJmRpdjZfY2xrc1tESVY2X1NVQl0sIFNNU1RQQ1IyLCA0LCAwKSwgLyogU0NJRkEwICovCkBAIC02MjYsNiArNjMwLDkgQEAKIAlDTEtERVZfREVWX0lEKCJzaF9tb2JpbGVfbGNkY19mYi4wIiwgJm1zdHBfY2xrc1tNU1RQMTAwXSksIC8qIExDREMwICovCiAJQ0xLREVWX0RFVl9JRCgidWlvX3BkcnZfZ2VuaXJxLjYiLCAmbXN0cF9jbGtzW01TVFAyMjNdKSwgLyogU1BVMkRTUDAgKi8KIAlDTEtERVZfREVWX0lEKCJ1aW9fcGRydl9nZW5pcnEuNyIsICZtc3RwX2Nsa3NbTVNUUDIyM10pLCAvKiBTUFUyRFNQMSAqLworCUNMS0RFVl9ERVZfSUQoInNoLWRtYS1lbmdpbmUuMCIsICZtc3RwX2Nsa3NbTVNUUDIxOF0pLCAvKiBETUFDMSAqLworCUNMS0RFVl9ERVZfSUQoInNoLWRtYS1lbmdpbmUuMSIsICZtc3RwX2Nsa3NbTVNUUDIxN10pLCAvKiBETUFDMiAqLworCUNMS0RFVl9ERVZfSUQoInNoLWRtYS1lbmdpbmUuMiIsICZtc3RwX2Nsa3NbTVNUUDIxNl0pLCAvKiBETUFDMyAqLwogCUNMS0RFVl9ERVZfSUQoInNoLXNjaS41IiwgJm1zdHBfY2xrc1tNU1RQMjA3XSksIC8qIFNDSUZBNSAqLwogCUNMS0RFVl9ERVZfSUQoInNoLXNjaS42IiwgJm1zdHBfY2xrc1tNU1RQMjA2XSksIC8qIFNDSUZCICovCiAJQ0xLREVWX0RFVl9JRCgic2gtc2NpLjAiLCAmbXN0cF9jbGtzW01TVFAyMDRdKSwgLyogU0NJRkEwICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMKaW5kZXggNWQwZTE1MC4uYTkxMWE2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYwpAQCAtMjUwLDYgKzI1MCwxMSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCBzaDczYTBfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCit7CisJcmV0dXJuIDA7IC8qIGFsd2F5cyBhbGxvdyB3YWtldXAgKi8KK30KKwogdm9pZCBfX2luaXQgc2g3M2EwX2luaXRfaXJxKHZvaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpnaWNfZGlzdF9iYXNlID0gX19pbygweGYwMDAxMDAwKTsKQEAgLTI1Nyw2ICsyNjIsNyBAQAogCXZvaWQgX19pb21lbSAqaW50ZXZ0c2EgPSBpb3JlbWFwX25vY2FjaGUoMHhmZmQyMDEwMCwgUEFHRV9TSVpFKTsKIAogCWdpY19pbml0KDAsIDI5LCBnaWNfZGlzdF9iYXNlLCBnaWNfY3B1X2Jhc2UpOworCWdpY19hcmNoX2V4dG4uaXJxX3NldF93YWtlID0gc2g3M2EwX3NldF93YWtlOwogCiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjc19kZXNjKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzY3LmMKaW5kZXggMmMxMDE5MC4uZTU0NjAxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM2Ny5jCkBAIC0zOCw3ICszOCw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGMwMCksIGV2dDJpcnEoMHhjMDApLAogCQkJICAgIGV2dDJpcnEoMHhjMDApLCBldnQyaXJxKDB4YzAwKSB9LAogfTsKQEAgLTU3LDcgKzU3LDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzIwKSwgZXZ0MmlycSgweGMyMCksCiAJCQkgICAgZXZ0MmlycSgweGMyMCksIGV2dDJpcnEoMHhjMjApIH0sCiB9OwpAQCAtNzYsNyArNzYsNyBAQAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKLQkudHlwZQkJPSBQT1JUX1NDSUYsCisJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhjNDApLCBldnQyaXJxKDB4YzQwKSwKIAkJCSAgICBldnQyaXJxKDB4YzQwKSwgZXZ0MmlycSgweGM0MCkgfSwKIH07CkBAIC05NSw3ICs5NSw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGM2MCksIGV2dDJpcnEoMHhjNjApLAogCQkJICAgIGV2dDJpcnEoMHhjNjApLCBldnQyaXJxKDB4YzYwKSB9LAogfTsKQEAgLTExNCw3ICsxMTQsNyBAQAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKLQkudHlwZQkJPSBQT1JUX1NDSUYsCisJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhkMjApLCBldnQyaXJxKDB4ZDIwKSwKIAkJCSAgICBldnQyaXJxKDB4ZDIwKSwgZXZ0MmlycSgweGQyMCkgfSwKIH07CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4ZDQwKSwgZXZ0MmlycSgweGQ0MCksCiAJCQkgICAgZXZ0MmlycSgweGQ0MCksIGV2dDJpcnEoMHhkNDApIH0sCiB9OwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZCLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGQ2MCksIGV2dDJpcnEoMHhkNjApLAogCQkJICAgIGV2dDJpcnEoMHhkNjApLCBldnQyaXJxKDB4ZDYwKSB9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wb3dlci5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBvd2VyLmMKaW5kZXggYzg0NDQyYy4uNWFkOGIyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBvd2VyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBvd2VyLmMKQEAgLTI0LDYgKzI0LDggQEAKIAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCisjaW5jbHVkZSAiYm9hcmQtaGFybW9ueS5oIgorCiAjZGVmaW5lIFBNQ19DVFJMCQkweDAKICNkZWZpbmUgUE1DX0NUUkxfSU5UUl9MT1cJKDEgPDwgMTcpCiAKQEAgLTk4LDcgKzEwMCw3IEBACiAJLmlycV9iYXNlCT0gVEVHUkFfTlJfSVJRUywKIAkubnVtX3N1YmRldnMJPSBBUlJBWV9TSVpFKHRwc19kZXZzKSwKIAkuc3ViZGV2cwk9IHRwc19kZXZzLAotCS5ncGlvX2Jhc2UJPSBURUdSQV9OUl9HUElPUywKKwkuZ3Bpb19iYXNlCT0gSEFSTU9OWV9HUElPX1RQUzY1ODZYKDApLAogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGhhcm1vbnlfcmVndWxhdG9yc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuaAppbmRleCAxZTU3YjA3Li5kODUxNDJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBfTUFDSF9URUdSQV9CT0FSRF9IQVJNT05ZX0gKICNkZWZpbmUgX01BQ0hfVEVHUkFfQk9BUkRfSEFSTU9OWV9ICiAKLSNkZWZpbmUgSEFSTU9OWV9HUElPX1dNODkwMyhfeF8pCShURUdSQV9OUl9HUElPUyArIChfeF8pKQorI2RlZmluZSBIQVJNT05ZX0dQSU9fVFBTNjU4NlgoX3hfKQkoVEVHUkFfTlJfR1BJT1MgKyAoX3hfKSkKKyNkZWZpbmUgSEFSTU9OWV9HUElPX1dNODkwMyhfeF8pCShIQVJNT05ZX0dQSU9fVFBTNjU4NlgoNCkgKyAoX3hfKSkKIAogI2RlZmluZSBURUdSQV9HUElPX1NEMl9DRAkJVEVHUkFfR1BJT19QSTUKICNkZWZpbmUgVEVHUkFfR1BJT19TRDJfV1AJCVRFR1JBX0dQSU9fUEgxCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oCmluZGV4IGMzNGYzZWEuLjRmNTBjYTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oCkBAIC0zMSw3ICszMSw3IEBACiAJYm9vbCByZXNldDsKIAlfX3UxNiBjbGtfdmFsOwogCV9fczggdXNlY291bnQ7Ci0JX191MzIgcmVzX3JlZzsKKwl2b2lkIF9faW9tZW0gKiByZXNfcmVnOwogCV9fdTE2IHJlc19tYXNrOwogCiAJYm9vbCBod19jdHJsZDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvdTMwMC1yZWdzLmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3UzMDAtcmVncy5oCmluZGV4IDhiODVkZjQuLjAzNWZkYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvdTMwMC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC91MzAwLXJlZ3MuaApAQCAtMTgsNiArMTgsMTIgQEAKICAqIHRoZSBkZWZpbmVzIGFyZSB1c2VkIGZvciBzZXR0aW5nIHVwIHRoZSBJL08gbWVtb3J5IG1hcHBpbmcuCiAgKi8KIAorI2lmZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgSU9NRU0oYSkgKGEpCisjZWxzZQorI2RlZmluZSBJT01FTShhKSAodm9pZCBfX2lvbWVtICopIGEKKyNlbmRpZgorCiAvKiBOQU5EIEZsYXNoIENTMCAqLwogI2RlZmluZSBVMzAwX05BTkRfQ1MwX1BIWVNfQkFTRQkJMHg4MDAwMDAwMAogCkBAIC00OCwxMyArNTQsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBBbGwgdGhlIGZvbGxvd2luZyBwZXJpcGhlcmFscyBhcmUgc3BlY2lmaWVkIGF0IHRoZWlyIFBIWVNJQ0FMIGFkZHJlc3MsCi0gKiBzbyBpZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlbSAoaW4gdGhlIGtlcm5lbCksIHlvdSBNVVNUIHVzZSB0aGUgbWFjcm9zCi0gKiBkZWZpbmVkIGluIDxhc20vaW8uaD4gdG8gbWFwIHRvIHRoZSBJT19BRERSRVNTX0FIQigpIElPX0FERFJFU1NfRkFTVCgpCi0gKiBldGMuCi0gKi8KLQotLyoKICAqIEFIQiBwZXJpcGhlcmFscwogICovCiAKQEAgLTYzLDExICs2MiwxMSBAQAogCiAvKiBWZWN0b3JlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAwLCBzZXJ2aWNpbmcgMzIgaW50ZXJydXB0cyAqLwogI2RlZmluZSBVMzAwX0lOVENPTjBfQkFTRQkJKFUzMDBfQUhCX1BFUl9QSFlTX0JBU0UrMHgxMDAwKQotI2RlZmluZSBVMzAwX0lOVENPTjBfVkJBU0UJCShVMzAwX0FIQl9QRVJfVklSVF9CQVNFKzB4MTAwMCkKKyNkZWZpbmUgVTMwMF9JTlRDT04wX1ZCQVNFCQlJT01FTShVMzAwX0FIQl9QRVJfVklSVF9CQVNFKzB4MTAwMCkKIAogLyogVmVjdG9yZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgMSwgc2VydmljaW5nIDMyIGludGVycnVwdHMgKi8KICNkZWZpbmUgVTMwMF9JTlRDT04xX0JBU0UJCShVMzAwX0FIQl9QRVJfUEhZU19CQVNFKzB4MjAwMCkKLSNkZWZpbmUgVTMwMF9JTlRDT04xX1ZCQVNFCQkoVTMwMF9BSEJfUEVSX1ZJUlRfQkFTRSsweDIwMDApCisjZGVmaW5lIFUzMDBfSU5UQ09OMV9WQkFTRQkJSU9NRU0oVTMwMF9BSEJfUEVSX1ZJUlRfQkFTRSsweDIwMDApCiAKIC8qIE1lbW9yeSBTdGljayBQcm8gKE1TUFJPKSBjb250cm9sbGVyICovCiAjZGVmaW5lIFUzMDBfTVNQUk9fQkFTRQkJCShVMzAwX0FIQl9QRVJfUEhZU19CQVNFKzB4MzAwMCkKQEAgLTExNSw3ICsxMTQsNyBAQAogCiAvKiBTWVNDT04gKi8KICNkZWZpbmUgVTMwMF9TWVNDT05fQkFTRQkJKFUzMDBfU0xPV19QRVJfUEhZU19CQVNFKzB4MTAwMCkKLSNkZWZpbmUgVTMwMF9TWVNDT05fVkJBU0UJCShVMzAwX1NMT1dfUEVSX1ZJUlRfQkFTRSsweDEwMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1ZCQVNFCQlJT01FTShVMzAwX1NMT1dfUEVSX1ZJUlRfQkFTRSsweDEwMDApCiAKIC8qIFdhdGNoZG9nICovCiAjZGVmaW5lIFUzMDBfV0RPR19CQVNFCQkJKFUzMDBfU0xPV19QRVJfUEhZU19CQVNFKzB4MjAwMCkKQEAgLTEyNSw3ICsxMjQsNyBAQAogCiAvKiBBUFAgc2lkZSBzcGVjaWFsIHRpbWVyICovCiAjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0JBU0UJCShVMzAwX1NMT1dfUEVSX1BIWVNfQkFTRSsweDQwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1ZCQVNFCQkoVTMwMF9TTE9XX1BFUl9WSVJUX0JBU0UrMHg0MDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9WQkFTRQkJSU9NRU0oVTMwMF9TTE9XX1BFUl9WSVJUX0JBU0UrMHg0MDAwKQogCiAvKiBLZXlwYWQgKi8KICNkZWZpbmUgVTMwMF9LRVlQQURfQkFTRQkJKFUzMDBfU0xPV19QRVJfUEhZU19CQVNFKzB4NTAwMCkKQEAgLTE4MSw1ICsxODAsNCBAQAogICogVmlydHVhbCBhY2Nlc3NvciBtYWNyb3MgZm9yIHN0YXRpYyBkZXZpY2VzCiAgKi8KIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jIGIvYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKaW5kZXggODkxY2Y0NC4uMThkN2ZhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKQEAgLTQxMSw4ICs0MTEsNyBAQAogCS8qIFVzZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgMiBhcyBjbG9jayBzb3VyY2UgKi8KIAlpZiAoY2xvY2tzb3VyY2VfbW1pb19pbml0KFUzMDBfVElNRVJfQVBQX1ZCQVNFICsgVTMwMF9USU1FUl9BUFBfR1BUMkNDLAogCQkJIkdQVDIiLCByYXRlLCAzMDAsIDMyLCBjbG9ja3NvdXJjZV9tbWlvX3JlYWRsX3VwKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJ0aW1lcjogZmFpbGVkIHRvIGluaXRpYWxpemUgY2xvY2sgIgotCQkgICAgICAgInNvdXJjZSAlc1xuIiwgY2xvY2tzb3VyY2VfdTMwMF8xbWh6Lm5hbWUpOworCQlwcl9lcnIoInRpbWVyOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBVMzAwIGNsb2NrIHNvdXJjZVxuIik7CiAKIAljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoJmNsb2NrZXZlbnRfdTMwMF8xbWh6LAogCQkJCSAgICByYXRlLCBBUFBUSU1FUl9NSU5fUkFOR0UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jCmluZGV4IGZkNGNmMWMuLjcwY2RiZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1waW5zLmMKQEAgLTExMCwxMCArMTEwLDE4IEBACiAJR1BJTzE2OF9LUF9PMCwKIAogCS8qIFVBUlQgKi8KLQlHUElPMF9VMF9DVFNuCXwgUElOX0lOUFVUX1BVTExVUCwKLQlHUElPMV9VMF9SVFNuCXwgUElOX09VVFBVVF9ISUdILAotCUdQSU8yX1UwX1JYRAl8IFBJTl9JTlBVVF9QVUxMVVAsCi0JR1BJTzNfVTBfVFhECXwgUElOX09VVFBVVF9ISUdILAorCS8qIHVhcnQtMCBwaW5zIGdwaW8gY29uZmlndXJhdGlvbiBzaG91bGQgYmUKKwkgKiBrZXB0IGludGFjdCB0byBwcmV2ZW50IGdsaXRjaCBpbiB0eCBsaW5lCisJICogd2hlbiB0dHkgZGV2IGlzIG9wZW5lZC4gTGF0ZXIgdGhlc2UgcGlucworCSAqIGFyZSBjb25maWd1cmVkIHRvIHVhcnQgbW9wNTAwX3BpbnNfdWFydDAKKwkgKgorCSAqIEl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB1YXJ0IGNvbmZpZ3VyYXRpb24KKwkgKiBvbmNlIHRoZSBpc3N1ZSBpcyBzb2x2ZWQuCisJICovCisJR1BJTzBfR1BJTwl8IFBJTl9JTlBVVF9QVUxMVVAsCisJR1BJTzFfR1BJTwl8IFBJTl9PVVRQVVRfSElHSCwKKwlHUElPMl9HUElPCXwgUElOX0lOUFVUX1BVTExVUCwKKwlHUElPM19HUElPCXwgUElOX09VVFBVVF9ISUdILAogCiAJR1BJTzI5X1UyX1JYRAl8IFBJTl9JTlBVVF9QVUxMVVAsCiAJR1BJTzMwX1UyX1RYRAl8IFBJTl9PVVRQVVRfSElHSCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCmluZGV4IGJiMjZmNDAuLjJhMDhjMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYwpAQCAtMjcsMTggKzI3LDIxIEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy1scDU1MjEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgPHBsYXQvaTJjLmg+CiAjaW5jbHVkZSA8cGxhdC9zdGVfZG1hNDAuaD4KKyNpbmNsdWRlIDxwbGF0L3BpbmNmZy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAorI2luY2x1ZGUgInBpbnMtZGI4NTAwLmgiCiAjaW5jbHVkZSAic3RlLWRtYTQwLWRiODUwMC5oIgogI2luY2x1ZGUgImRldmljZXMtZGI4NTAwLmgiCiAjaW5jbHVkZSAiYm9hcmQtbW9wNTAwLmgiCkBAIC0zOTMsMTIgKzM5Niw2MyBAQAogfTsKICNlbmRpZgogCisKK3N0YXRpYyBwaW5fY2ZnX3QgbW9wNTAwX3BpbnNfdWFydDBbXSA9IHsKKwlHUElPMF9VMF9DVFNuICAgfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8xX1UwX1JUU24gICB8IFBJTl9PVVRQVVRfSElHSCwKKwlHUElPMl9VMF9SWEQgICAgfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8zX1UwX1RYRCAgICB8IFBJTl9PVVRQVVRfSElHSCwKK307CisKKyNkZWZpbmUgUFJDQ19LX1NPRlRSU1RfU0VUICAgICAgMHgxOAorI2RlZmluZSBQUkNDX0tfU09GVFJTVF9DTEVBUiAgICAweDFDCitzdGF0aWMgdm9pZCB1eDUwMF91YXJ0MF9yZXNldCh2b2lkKQoreworCXZvaWQgX19pb21lbSAqcHJjY19yc3Rfc2V0LCAqcHJjY19yc3RfY2xyOworCisJcHJjY19yc3Rfc2V0ID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoVTg1MDBfQ0xLUlNUMV9CQVNFICsKKwkJCVBSQ0NfS19TT0ZUUlNUX1NFVCk7CisJcHJjY19yc3RfY2xyID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoVTg1MDBfQ0xLUlNUMV9CQVNFICsKKwkJCVBSQ0NfS19TT0ZUUlNUX0NMRUFSKTsKKworCS8qIEFjdGl2YXRlIHNvZnQgcmVzZXQgUFJDQ19LX1NPRlRSU1RfQ0xFQVIgKi8KKwl3cml0ZWwoKHJlYWRsKHByY2NfcnN0X2NscikgfCAweDEpLCBwcmNjX3JzdF9jbHIpOworCXVkZWxheSgxKTsKKworCS8qIFJlbGVhc2Ugc29mdCByZXNldCBQUkNDX0tfU09GVFJTVF9TRVQgKi8KKwl3cml0ZWwoKHJlYWRsKHByY2NfcnN0X3NldCkgfCAweDEpLCBwcmNjX3JzdF9zZXQpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQgdXg1MDBfdWFydDBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBubWtfY29uZmlnX3BpbnMobW9wNTAwX3BpbnNfdWFydDAsCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX3VhcnQwKSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigicGwwMTE6IHVhcnQgcGluc19lbmFibGUgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgdXg1MDBfdWFydDBfZXhpdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBubWtfY29uZmlnX3BpbnNfc2xlZXAobW9wNTAwX3BpbnNfdWFydDAsCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX3VhcnQwKSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigicGwwMTE6IHVhcnQgcGluc19kaXNhYmxlIGZhaWxlZFxuIik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhIHVhcnQwX3BsYXQgPSB7CiAjaWZkZWYgQ09ORklHX1NURV9ETUE0MAogCS5kbWFfZmlsdGVyID0gc3RlZG1hNDBfZmlsdGVyLAogCS5kbWFfcnhfcGFyYW0gPSAmdWFydDBfZG1hX2NmZ19yeCwKIAkuZG1hX3R4X3BhcmFtID0gJnVhcnQwX2RtYV9jZmdfdHgsCiAjZW5kaWYKKwkuaW5pdCA9IHV4NTAwX3VhcnQwX2luaXQsCisJLmV4aXQgPSB1eDUwMF91YXJ0MF9leGl0LAorCS5yZXNldCA9IHV4NTAwX3VhcnQwX3Jlc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBhbWJhX3BsMDExX2RhdGEgdWFydDFfcGxhdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMKaW5kZXggYzNjNDE3Ni4uNDU5OGIwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMKQEAgLTE1OSw2ICsxNTksOSBAQAogCQkvKiBObyBjdXN0b20gZGF0YSB5ZXQgKi8KIAl9OwogCisJaWYgKGNwdV9pc191ODUwMHYyKCkpCisJCXBkYXRhLnN1cHBvcnRzX3NsZWVwbW9kZSA9IHRydWU7CisKIAlkYng1MDBfYWRkX2dwaW9zKEFSUkFZX0FORF9TSVpFKGRiODUwMF9ncGlvX2Jhc2UpLAogCQkJIElSUV9EQjg1MDBfR1BJTzAsICZwZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYwppbmRleCAyODVlZGNkLi45ZTZiOTNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMKQEAgLTQ2LDEyICs0Niw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB2Mm1faW5pdF9lYXJseSh2b2lkKQotewotCWN0X2Rlc2MtPmluaXRfZWFybHkoKTsKLQl2ZXJzYXRpbGVfc2NoZWRfY2xvY2tfaW5pdChNTUlPX1AyVihWMk1fU1lTXzI0TUhaKSwgMjQwMDAwMDApOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgdjJtX3RpbWVyX2luaXQodm9pZCkKIHsKIAl1MzIgc2NjdHJsOwpAQCAtMzY1LDYgKzM1OSwxMyBAQAogCX0sCiB9OwogCitzdGF0aWMgdm9pZCBfX2luaXQgdjJtX2luaXRfZWFybHkodm9pZCkKK3sKKwljdF9kZXNjLT5pbml0X2Vhcmx5KCk7CisJY2xrZGV2X2FkZF90YWJsZSh2Mm1fbG9va3VwcywgQVJSQVlfU0laRSh2Mm1fbG9va3VwcykpOworCXZlcnNhdGlsZV9zY2hlZF9jbG9ja19pbml0KE1NSU9fUDJWKFYyTV9TWVNfMjRNSFopLCAyNDAwMDAwMCk7Cit9CisKIHN0YXRpYyB2b2lkIHYybV9wb3dlcl9vZmYodm9pZCkKIHsKIAlpZiAodjJtX2NmZ193cml0ZShTWVNfQ0ZHX1NIVVRET1dOIHwgU1lTX0NGR19TSVRFX01CLCAwKSkKQEAgLTQxOCw4ICs0MTksNiBAQAogewogCWludCBpOwogCi0JY2xrZGV2X2FkZF90YWJsZSh2Mm1fbG9va3VwcywgQVJSQVlfU0laRSh2Mm1fbG9va3VwcykpOwotCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ2Mm1fcGNpZV9pMmNfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnYybV9kZGNfaTJjX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ2Mm1fZmxhc2hfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaXJxLmMKaW5kZXggMjQ1MTQwYy4uNjQyZGUwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaXJxLmMKQEAgLTM5LDkgKzM5LDEwIEBACiBzdGF0aWMgdm9pZCBfX2lvbWVtICppY19yZWdiYXNlOwogc3RhdGljIHZvaWQgX19pb21lbSAqc2ljX3JlZ2Jhc2U7CiAKLXN0YXRpYyB2b2lkIHZ0ODUwMF9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdnQ4NTAwX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBpY19yZWdiYXNlOworCXVuc2lnbmVkIGlycSA9IGQtPmlycTsKIAl1OCBlZGdlOwogCiAJaWYgKGlycSA+PSA2NCkgewpAQCAtNjQsOSArNjUsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHZ0ODUwMF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB2dDg1MDBfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gaWNfcmVnYmFzZTsKKwl1bnNpZ25lZCBpcnEgPSBkLT5pcnE7CiAJdTggZGN0cjsKIAogCWlmIChpcnEgPj0gNjQpIHsKQEAgLTc4LDEwICs4MCwxMSBAQAogCXdyaXRlYihkY3RyLCBiYXNlICsgVlQ4NTAwX0lDX0RDVFIgKyBpcnEpOwogfQogCi1zdGF0aWMgaW50IHZ0ODUwMF9pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3N0YXRpYyBpbnQgdnQ4NTAwX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gaWNfcmVnYmFzZTsKLQl1bnNpZ25lZCBpbnQgb3JpZ19pcnEgPSBpcnE7CisJdW5zaWduZWQgaXJxID0gZC0+aXJxOworCXVuc2lnbmVkIG9yaWdfaXJxID0gaXJxOwogCXU4IGRjdHI7CiAKIAlpZiAoaXJxID49IDY0KSB7CkBAIC0xMTQsMTEgKzExNywxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHZ0ODUwMF9pcnFfY2hpcCA9IHsKLQkubmFtZSAgICAgID0gInZ0ODUwMCIsCi0JLmFjayAgICAgICA9IHZ0ODUwMF9pcnFfbWFzaywKLQkubWFzayAgICAgID0gdnQ4NTAwX2lycV9tYXNrLAotCS51bm1hc2sgICAgPSB2dDg1MDBfaXJxX3VubWFzaywKLQkuc2V0X3R5cGUgID0gdnQ4NTAwX2lycV9zZXRfdHlwZSwKKwkubmFtZSA9ICJ2dDg1MDAiLAorCS5pcnFfYWNrID0gdnQ4NTAwX2lycV9tYXNrLAorCS5pcnFfbWFzayA9IHZ0ODUwMF9pcnFfbWFzaywKKwkuaXJxX3VubWFzayA9IHZ0ODUwMF9pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUgPSB2dDg1MDBfaXJxX3NldF90eXBlLAogfTsKIAogdm9pZCBfX2luaXQgdnQ4NTAwX2luaXRfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKaW5kZXggZWY1OTA5OS4uNDRjMDg2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYwpAQCAtMTIwLDE3ICsxMjAsMjIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMngwX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgX19sMngwX2ZsdXNoX2FsbCh2b2lkKQoreworCWRlYnVnX3dyaXRlbCgweDAzKTsKKwl3cml0ZWxfcmVsYXhlZChsMngwX3dheV9tYXNrLCBsMngwX2Jhc2UgKyBMMlgwX0NMRUFOX0lOVl9XQVkpOworCWNhY2hlX3dhaXRfd2F5KGwyeDBfYmFzZSArIEwyWDBfQ0xFQU5fSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7CisJY2FjaGVfc3luYygpOworCWRlYnVnX3dyaXRlbCgweDAwKTsKK30KKwogc3RhdGljIHZvaWQgbDJ4MF9mbHVzaF9hbGwodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogY2xlYW4gYWxsIHdheXMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbDJ4MF9sb2NrLCBmbGFncyk7Ci0JZGVidWdfd3JpdGVsKDB4MDMpOwotCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGwyeDBfYmFzZSArIEwyWDBfQ0xFQU5fSU5WX1dBWSk7Ci0JY2FjaGVfd2FpdF93YXkobDJ4MF9iYXNlICsgTDJYMF9DTEVBTl9JTlZfV0FZLCBsMngwX3dheV9tYXNrKTsKLQljYWNoZV9zeW5jKCk7Ci0JZGVidWdfd3JpdGVsKDB4MDApOworCV9fbDJ4MF9mbHVzaF9hbGwoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMngwX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjY2LDcgKzI3MSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsMngwX2xvY2ssIGZsYWdzKTsKLQl3cml0ZWwoMCwgbDJ4MF9iYXNlICsgTDJYMF9DVFJMKTsKKwlfX2wyeDBfZmx1c2hfYWxsKCk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgbDJ4MF9iYXNlICsgTDJYMF9DVFJMKTsKKwlkc2IoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMngwX2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29udGV4dC5jIGIvYXJjaC9hcm0vbW0vY29udGV4dC5jCmluZGV4IDhiZmFlOTYuLmIwZWU5YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvbnRleHQuYworKysgYi9hcmNoL2FybS9tbS9jb250ZXh0LmMKQEAgLTI0LDcgKzI0LDkgQEAKIAogLyoKICAqIFdlIGZvcmsoKWVkIGEgcHJvY2VzcywgYW5kIHdlIG5lZWQgYSBuZXcgY29udGV4dCBmb3IgdGhlIGNoaWxkCi0gKiB0byBydW4gaW4uCisgKiB0byBydW4gaW4uICBXZSByZXNlcnZlIHZlcnNpb24gMCBmb3IgaW5pdGlhbCB0YXNrcyBzbyB3ZSB3aWxsCisgKiBhbHdheXMgYWxsb2NhdGUgYW4gQVNJRC4gVGhlIEFTSUQgMCBpcyByZXNlcnZlZCBmb3IgdGhlIFRUQlIKKyAqIHJlZ2lzdGVyIGNoYW5naW5nIHNlcXVlbmNlLgogICovCiB2b2lkIF9faW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CkBAIC0zNCwxMSArMzYsOCBAQAogCiBzdGF0aWMgdm9pZCBmbHVzaF9jb250ZXh0KHZvaWQpCiB7Ci0JdTMyIHR0YjsKLQkvKiBDb3B5IFRUQlIxIGludG8gVFRCUjAgKi8KLQlhc20gdm9sYXRpbGUoIm1yYwlwMTUsIDAsICUwLCBjMiwgYzAsIDFcbiIKLQkJICAgICAibWNyCXAxNSwgMCwgJTAsIGMyLCBjMCwgMCIKLQkJICAgICA6ICI9ciIgKHR0YikpOworCS8qIHNldCB0aGUgcmVzZXJ2ZWQgQVNJRCBiZWZvcmUgZmx1c2hpbmcgdGhlIFRMQiAqLworCWFzbSgibWNyCXAxNSwgMCwgJTAsIGMxMywgYzAsIDFcbiIgOiA6ICJyIiAoMCkpOwogCWlzYigpOwogCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKIAlpZiAoaWNhY2hlX2lzX3ZpdnRfYXNpZF90YWdnZWQoKSkgewpAQCAtOTQsNyArOTMsNyBAQAogCQlyZXR1cm47CiAKIAlzbXBfcm1iKCk7Ci0JYXNpZCA9IGNwdV9sYXN0X2FzaWQgKyBjcHU7CisJYXNpZCA9IGNwdV9sYXN0X2FzaWQgKyBjcHUgKyAxOwogCiAJZmx1c2hfY29udGV4dCgpOwogCXNldF9tbV9jb250ZXh0KG1tLCBhc2lkKTsKQEAgLTE0NCwxMyArMTQzLDEzIEBACiAJICogdG8gc3RhcnQgYSBuZXcgdmVyc2lvbiBhbmQgZmx1c2ggdGhlIFRMQi4KIAkgKi8KIAlpZiAodW5saWtlbHkoKGFzaWQgJiB+QVNJRF9NQVNLKSA9PSAwKSkgewotCQlhc2lkID0gY3B1X2xhc3RfYXNpZCArIHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJYXNpZCA9IGNwdV9sYXN0X2FzaWQgKyBzbXBfcHJvY2Vzc29yX2lkKCkgKyAxOwogCQlmbHVzaF9jb250ZXh0KCk7CiAjaWZkZWYgQ09ORklHX1NNUAogCQlzbXBfd21iKCk7CiAJCXNtcF9jYWxsX2Z1bmN0aW9uKHJlc2V0X2NvbnRleHQsIE5VTEwsIDEpOwogI2VuZGlmCi0JCWNwdV9sYXN0X2FzaWQgKz0gTlJfQ1BVUyAtIDE7CisJCWNwdV9sYXN0X2FzaWQgKz0gTlJfQ1BVUzsKIAl9CiAKIAlzZXRfbW1fY29udGV4dChtbSwgYXNpZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pbml0LmMgYi9hcmNoL2FybS9tbS9pbml0LmMKaW5kZXggMmMyY2NlOS4uYzE5NTcxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtL21tL2luaXQuYwpAQCAtMzMxLDYgKzMzMSwxMiBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAJaWYgKHBoeXNfaW5pdHJkX3NpemUgJiYKKwkgICAgIW1lbWJsb2NrX2lzX3JlZ2lvbl9tZW1vcnkocGh5c19pbml0cmRfc3RhcnQsIHBoeXNfaW5pdHJkX3NpemUpKSB7CisJCXByX2VycigiSU5JVFJEOiAweCUwOGx4KzB4JTA4bHggaXMgbm90IGEgbWVtb3J5IHJlZ2lvbiAtIGRpc2FibGluZyBpbml0cmRcbiIsCisJCSAgICAgICBwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSk7CisJCXBoeXNfaW5pdHJkX3N0YXJ0ID0gcGh5c19pbml0cmRfc2l6ZSA9IDA7CisJfQorCWlmIChwaHlzX2luaXRyZF9zaXplICYmCiAJICAgIG1lbWJsb2NrX2lzX3JlZ2lvbl9yZXNlcnZlZChwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSkpIHsKIAkJcHJfZXJyKCJJTklUUkQ6IDB4JTA4bHgrMHglMDhseCBvdmVybGFwcyBpbi11c2UgbWVtb3J5IHJlZ2lvbiAtIGRpc2FibGluZyBpbml0cmRcbiIsCiAJCSAgICAgICBwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSk7CkBAIC02MzUsNyArNjQxLDggQEAKIAkJCSIgICAgbW9kdWxlcyA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQgTUIpXG4iCiAJCQkiICAgICAgLmluaXQgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iCiAJCQkiICAgICAgLnRleHQgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iCi0JCQkiICAgICAgLmRhdGEgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iLAorCQkJIiAgICAgIC5kYXRhIDogMHglcCIgIiAtIDB4JXAiICIgICAoJTRkIGtCKVxuIgorCQkJIiAgICAgICAuYnNzIDogMHglcCIgIiAtIDB4JXAiICIgICAoJTRkIGtCKVxuIiwKIAogCQkJTUxLKFVMKENPTkZJR19WRUNUT1JTX0JBU0UpLCBVTChDT05GSUdfVkVDVE9SU19CQVNFKSArCiAJCQkJKFBBR0VfU0laRSkpLApAQCAtNjU3LDcgKzY2NCw4IEBACiAKIAkJCU1MS19ST1VORFVQKF9faW5pdF9iZWdpbiwgX19pbml0X2VuZCksCiAJCQlNTEtfUk9VTkRVUChfdGV4dCwgX2V0ZXh0KSwKLQkJCU1MS19ST1VORFVQKF9zZGF0YSwgX2VkYXRhKSk7CisJCQlNTEtfUk9VTkRVUChfc2RhdGEsIF9lZGF0YSksCisJCQlNTEtfUk9VTkRVUChfX2Jzc19zdGFydCwgX19ic3Nfc3RvcCkpOwogCiAjdW5kZWYgTUxLCiAjdW5kZWYgTUxNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDlkOWU3MzYuLjU5NGQ2NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC03NTksNyArNzU5LDcgQEAKIAogc3RhdGljIHBoeXNfYWRkcl90IGxvd21lbV9saW1pdCBfX2luaXRkYXRhID0gMDsKIAotc3RhdGljIHZvaWQgX19pbml0IHNhbml0eV9jaGVja19tZW1pbmZvKHZvaWQpCit2b2lkIF9faW5pdCBzYW5pdHlfY2hlY2tfbWVtaW5mbyh2b2lkKQogewogCWludCBpLCBqLCBoaWdobWVtID0gMDsKIApAQCAtMTAzMiw4ICsxMDMyLDkgQEAKIHsKIAl2b2lkICp6ZXJvX3BhZ2U7CiAKKwltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChsb3dtZW1fbGltaXQpOworCiAJYnVpbGRfbWVtX3R5cGVfdGFibGUoKTsKLQlzYW5pdHlfY2hlY2tfbWVtaW5mbygpOwogCXByZXBhcmVfcGFnZV90YWJsZSgpOwogCW1hcF9sb3dtZW0oKTsKIAlkZXZpY2VtYXBzX2luaXQobWRlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbm9tbXUuYyBiL2FyY2gvYXJtL21tL25vbW11LmMKaW5kZXggNjg3ZDAyMy4uOTQxYTk4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbm9tbXUuYworKysgYi9hcmNoL2FybS9tbS9ub21tdS5jCkBAIC0yNyw2ICsyNywxMCBAQAogCW1lbWJsb2NrX3Jlc2VydmUoQ09ORklHX1ZFQ1RPUlNfQkFTRSwgUEFHRV9TSVpFKTsKIH0KIAordm9pZCBfX2luaXQgc2FuaXR5X2NoZWNrX21lbWluZm8odm9pZCkKK3sKK30KKwogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMsIGluaXRpYWxpc2VzIHRoZSB6b25lIG1lbW9yeQogICogbWFwcywgYW5kIHNldHMgdXAgdGhlIHplcm8gcGFnZSwgYmFkIHBhZ2UgYW5kIGJhZCBwYWdlIHRhYmxlcy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUwppbmRleCBlNGMxNjVjLi41MzdmZmNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJLmxvbmcJMAogCQkubG9uZwkwCiAJCS5sb25nCXY0X2NhY2hlX2ZucwotCQkuc2l6ZQlfX2FybTd0ZG1pX3Byb2NfaW5mbywgLiAtIF9fYXJtN2RtaV9wcm9jX2luZm8KKwkJLnNpemUJX19hcm03dGRtaV9wcm9jX2luZm8sIC4gLSBfX2FybTd0ZG1pX3Byb2NfaW5mbwogCiAJCS50eXBlCV9fdHJpc2NlbmRhN19wcm9jX2luZm8sICNvYmplY3QKIF9fdHJpc2NlbmRhN19wcm9jX2luZm86CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKaW5kZXggN2I3ZWJkNC4uNTQ2YjU0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCS5sb25nCTAKIAkJLmxvbmcJMAogCQkubG9uZwl2NF9jYWNoZV9mbnMKLQkJLnNpemUJX19hcm05dGRtaV9wcm9jX2luZm8sIC4gLSBfX2FybTlkbWlfcHJvY19pbmZvCisJCS5zaXplCV9fYXJtOXRkbWlfcHJvY19pbmZvLCAuIC0gX19hcm05dGRtaV9wcm9jX2luZm8KIAogCQkudHlwZQlfX3AyMDAxX3Byb2NfaW5mbywgI29iamVjdAogX19wMjAwMV9wcm9jX2luZm86CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMgYi9hcmNoL2FybS9tbS9wcm9jLXY3LlMKaW5kZXggYjNiNTY2ZS4uMDg5YzBiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwpAQCAtMTA4LDE2ICsxMDgsMTggQEAKICNpZmRlZiBDT05GSUdfQVJNX0VSUkFUQV80MzA5NzMKIAltY3IJcDE1LCAwLCByMiwgYzcsIGM1LCA2CQlAIGZsdXNoIEJUQUMvQlRCCiAjZW5kaWYKLQltcmMJcDE1LCAwLCByMiwgYzIsIGMwLCAxCQlAIGxvYWQgVFRCIDEKLQltY3IJcDE1LCAwLCByMiwgYzIsIGMwLCAwCQlAIGludG8gVFRCIDAKKyNpZmRlZiBDT05GSUdfQVJNX0VSUkFUQV83NTQzMjIKKwlkc2IKKyNlbmRpZgorCW1jcglwMTUsIDAsIHIyLCBjMTMsIGMwLCAxCQlAIHNldCByZXNlcnZlZCBjb250ZXh0IElECisJaXNiCisxOgltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIHNldCBUVEIgMAogCWlzYgogI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzc1NDMyMgogCWRzYgogI2VuZGlmCiAJbWNyCXAxNSwgMCwgcjEsIGMxMywgYzAsIDEJCUAgc2V0IGNvbnRleHQgSUQKIAlpc2IKLQltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIHNldCBUVEIgMAotCWlzYgogI2VuZGlmCiAJbW92CXBjLCBscgogRU5EUFJPQyhjcHVfdjdfc3dpdGNoX21tKQpAQCAtMjA4LDE5ICsyMTAsMjEgQEAKIAogLyogU3VzcGVuZC9yZXN1bWUgc3VwcG9ydDogZGVyaXZlZCBmcm9tIGFyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TICovCiAuZ2xvYmwJY3B1X3Y3X3N1c3BlbmRfc2l6ZQotLmVxdQljcHVfdjdfc3VzcGVuZF9zaXplLCA0ICogOAorLmVxdQljcHVfdjdfc3VzcGVuZF9zaXplLCA0ICogOQogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X3Y3X2RvX3N1c3BlbmQpCiAJc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgRkNTRS9QSUQKIAltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMQlAIENvbnRleHQgSUQKKwltcmMJcDE1LCAwLCByNiwgYzEzLCBjMCwgMwlAIFVzZXIgci9vIHRocmVhZCBJRAorCXN0bWlhCXIwISwge3I0IC0gcjZ9CiAJbXJjCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAogCW1yYwlwMTUsIDAsIHI3LCBjMiwgYzAsIDAJQCBUVEIgMAogCW1yYwlwMTUsIDAsIHI4LCBjMiwgYzAsIDEJQCBUVEIgMQogCW1yYwlwMTUsIDAsIHI5LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCiAJbXJjCXAxNSwgMCwgcjEwLCBjMSwgYzAsIDEJQCBBdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgogCW1yYwlwMTUsIDAsIHIxMSwgYzEsIGMwLCAyCUAgQ28tcHJvY2Vzc29yIGFjY2VzcyBjb250cm9sCi0Jc3RtaWEJcjAsIHtyNCAtIHIxMX0KKwlzdG1pYQlyMCwge3I2IC0gcjExfQogCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KIEVORFBST0MoY3B1X3Y3X2RvX3N1c3BlbmQpCiAKQEAgLTIyOCw5ICsyMzIsMTEgQEAKIAltb3YJaXAsICMwCiAJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAlAIGludmFsaWRhdGUgVExCcwogCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJQCBpbnZhbGlkYXRlIEkgY2FjaGUKLQlsZG1pYQlyMCwge3I0IC0gcjExfQorCWxkbWlhCXIwISwge3I0IC0gcjZ9CiAJbWNyCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBGQ1NFL1BJRAogCW1jcglwMTUsIDAsIHI1LCBjMTMsIGMwLCAxCUAgQ29udGV4dCBJRAorCW1jcglwMTUsIDAsIHI2LCBjMTMsIGMwLCAzCUAgVXNlciByL28gdGhyZWFkIElECisJbGRtaWEJcjAsIHtyNiAtIHIxMX0KIAltY3IJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECiAJbWNyCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRUQiAwCiAJbWNyCXAxNSwgMCwgcjgsIGMyLCBjMCwgMQlAIFRUQiAxCkBAIC00MTYsOSArNDIyLDkgQEAKIAkud29yZAljcHVfdjdfZGNhY2hlX2NsZWFuX2FyZWEKIAkud29yZAljcHVfdjdfc3dpdGNoX21tCiAJLndvcmQJY3B1X3Y3X3NldF9wdGVfZXh0Ci0JLndvcmQJMAotCS53b3JkCTAKLQkud29yZAkwCisJLndvcmQJY3B1X3Y3X3N1c3BlbmRfc2l6ZQorCS53b3JkCWNwdV92N19kb19zdXNwZW5kCisJLndvcmQJY3B1X3Y3X2RvX3Jlc3VtZQogCS5zaXplCXY3X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSB2N19wcm9jZXNzb3JfZnVuY3Rpb25zCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL2NwNi5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMKaW5kZXggOTYxMmE4Ny4uYmFiNzNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIHN0YXRpYyBpbnQgY3A2X3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKaW5kZXggMzUzOGI4NWUuLmIxMzBmNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCkBAIC0xMzksNyArMTM5LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVg1MQotc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBhZGRyX2lteDUxX3RvMSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgYWRkcl9pbXg1MSA9IHsKIAkuYXBfMl9hcF9hZGRyID0gNjQyLAogCS51YXJ0XzJfbWN1X2FkZHIgPSA4MTcsCiAJLm1jdV8yX2FwcF9hZGRyID0gNzQ3LApAQCAtMTk2LDcgKzE5Niw5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YNTEpCiAJaWYgKGNwdV9pc19teDUxKCkpIHsKLQkJaW14NTFfaW14X3NkbWFfZGF0YS5wZGF0YS5zY3JpcHRfYWRkcnMgPSAmYWRkcl9pbXg1MV90bzE7CisJCWludCB0b192ZXJzaW9uID0gbXg1MV9yZXZpc2lvbigpID4+IDQ7CisJCWlteDUxX2lteF9zZG1hX2RhdGEucGRhdGEudG9fdmVyc2lvbiA9IHRvX3ZlcnNpb247CisJCWlteDUxX2lteF9zZG1hX2RhdGEucGRhdGEuc2NyaXB0X2FkZHJzID0gJmFkZHJfaW14NTE7CiAJCXJldCA9IGlteF9hZGRfaW14X3NkbWEoJmlteDUxX2lteF9zZG1hX2RhdGEpOwogCX0gZWxzZQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8uaCBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby5oCmluZGV4IGVhMTlhNWIuLmQ1ZDdlNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby5oCkBAIC05MCw2ICs5MCw3IEBACiAJaW50IG51bV9ncGlvOwogCXUzMiAoKmdldF9zZWNvbmRhcnlfc3RhdHVzKSh1bnNpZ25lZCBpbnQgYmFuayk7CiAJdm9pZCAoKnNldF9pb2ZvcmNlKShib29sIGVuYWJsZSk7CisJYm9vbCBzdXBwb3J0c19zbGVlcG1vZGU7CiB9OwogCiAjZW5kaWYgLyogX19BU01fUExBVF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZmxhc2guaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZmxhc2guaAppbmRleCAzMDgzMTk1Li4wZDg4NDk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2ZsYXNoLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9mbGFzaC5oCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CiBleHRlcm4gdm9pZCBvbWFwMV9zZXRfdnBwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBlbmFibGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaAppbmRleCAzMmEyZjZjLi5lOTkyYjk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvdm1tLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oCkBAIC0yOSw5ICsyOSw2IEBACiAgKiBsb3dlciAxNiBiaXQgaXMgdXNlZCBmb3IgaC93IGFuZCB1cHBlciAxNiBiaXQgaXMgZm9yIHMvdy4KICAqLwogI2RlZmluZSBJT1ZNRl9TV19TSElGVAkJMTYKLSNkZWZpbmUgSU9WTUZfSFdfU0laRQkJKDEgPDwgSU9WTUZfU1dfU0hJRlQpCi0jZGVmaW5lIElPVk1GX0hXX01BU0sJCShJT1ZNRl9IV19TSVpFIC0gMSkKLSNkZWZpbmUgSU9WTUZfU1dfTUFTSwkJKH5JT1ZNRl9IV19NQVNLKVVMCiAKIC8qCiAgKiBpb3ZtYTogaC93IGZsYWdzIGRlcml2ZWQgZnJvbSBjYW0gYW5kIHJhbSBhdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21tYy5oCmluZGV4IGYzOGZlZjkuLmM3Yjg3NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaApAQCAtMTAxLDYgKzEwMSw5IEBACiAJCS8qIElmIHVzaW5nIHBvd2VyX3NhdmluZyBhbmQgdGhlIE1NQyBwb3dlciBpcyBub3QgdG8gZ28gb2ZmICovCiAJCXVuc2lnbmVkIG5vX29mZjoxOwogCisJCS8qIGVNTUMgZG9lcyBub3QgaGFuZGxlIHBvd2VyIG9mZiB3aGVuIG5vdCBpbiBzbGVlcCBzdGF0ZSAqLworCQl1bnNpZ25lZCBub19yZWd1bGF0b3Jfb2ZmX2luaXQ6MTsKKwogCQkvKiBSZWd1bGF0b3Igb2ZmIHJlbWFwcGVkIHRvIHNsZWVwICovCiAJCXVuc2lnbmVkIHZjY19hdXhfZGlzYWJsZV9pc19zbGVlcDoxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jCmluZGV4IDUxZWY0M2UuLjgzYTM3YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jCkBAIC02NDgsNyArNjQ4LDYgQEAKIAkJCXJldHVybiBQVFJfRVJSKHZhKTsKIAl9CiAKLQlmbGFncyAmPSBJT1ZNRl9IV19NQVNLOwogCWZsYWdzIHw9IElPVk1GX0RJU0NPTlQ7CiAJZmxhZ3MgfD0gSU9WTUZfTU1JTzsKIApAQCAtNzA2LDcgKzcwNSw2IEBACiAJaWYgKCF2YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmbGFncyAmPSBJT1ZNRl9IV19NQVNLOwogCWZsYWdzIHw9IElPVk1GX0RJU0NPTlQ7CiAJZmxhZ3MgfD0gSU9WTUZfQUxMT0M7CiAKQEAgLTc5NSw3ICs3OTMsNiBAQAogCWlmICghdmEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZmxhZ3MgJj0gSU9WTUZfSFdfTUFTSzsKIAlmbGFncyB8PSBJT1ZNRl9MSU5FQVI7CiAJZmxhZ3MgfD0gSU9WTUZfTU1JTzsKIApAQCAtODUzLDcgKzg1MCw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBhID0gdmlydF90b19waHlzKHZhKTsKIAotCWZsYWdzICY9IElPVk1GX0hXX01BU0s7CiAJZmxhZ3MgfD0gSU9WTUZfTElORUFSOwogCWZsYWdzIHw9IElPVk1GX0FMTE9DOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCmluZGV4IGEzN2I4ZWIuLjQ5ZmMwZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CkBAIC01MzksMjAgKzU0MCwzNCBAQAogc3RhdGljIGludCBfb2RfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJaW50IHJldDsKIAotCXJldHVybiBvbWFwX2RldmljZV9pZGxlKHBkZXYpOworCXJldCA9IHBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kKGRldik7CisKKwlpZiAoIXJldCkKKwkJb21hcF9kZXZpY2VfaWRsZShwZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX29kX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBtX2dlbmVyaWNfcnVudGltZV9pZGxlKGRldik7CiB9CiAKIHN0YXRpYyBpbnQgX29kX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAKLQlyZXR1cm4gb21hcF9kZXZpY2VfZW5hYmxlKHBkZXYpOworCW9tYXBfZGV2aWNlX2VuYWJsZShwZGV2KTsKKworCXJldHVybiBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2X3Bvd2VyX2RvbWFpbiBvbWFwX2RldmljZV9wb3dlcl9kb21haW4gPSB7CiAJLm9wcyA9IHsKIAkJLnJ1bnRpbWVfc3VzcGVuZCA9IF9vZF9ydW50aW1lX3N1c3BlbmQsCisJCS5ydW50aW1lX2lkbGUgPSBfb2RfcnVudGltZV9pZGxlLAogCQkucnVudGltZV9yZXN1bWUgPSBfb2RfcnVudGltZV9yZXN1bWUsCiAJCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwppbmRleCBhM2Y1MGIzLi42YWYzZDBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQllbHNlIGlmIChjcHVfaXNfb21hcDE2MTEoKSkKIAkJCW9tYXBfc3JhbV9zaXplID0gU1pfMjU2SzsKIAkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBkZXRlY3QgU1JBTSBzaXplXG4iKTsKKwkJCXByX2VycigiQ291bGQgbm90IGRldGVjdCBTUkFNIHNpemVcbiIpOwogCQkJb21hcF9zcmFtX3NpemUgPSAweDQwMDA7CiAJCX0KIAl9CkBAIC0yMjEsMTAgKzIyMSwxMCBAQAogCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCA9IFJPVU5EX0RPV04ob21hcF9zcmFtX3NpemUsIFBBR0VfU0laRSk7CiAJaW90YWJsZV9pbml0KG9tYXBfc3JhbV9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfc3JhbV9pb19kZXNjKSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTUkFNOiBNYXBwZWQgcGEgMHglMDhseCB0byB2YSAweCUwOGx4IHNpemU6IDB4JWx4XG4iLAotCV9fcGZuX3RvX3BoeXMob21hcF9zcmFtX2lvX2Rlc2NbMF0ucGZuKSwKLQlvbWFwX3NyYW1faW9fZGVzY1swXS52aXJ0dWFsLAotCSAgICAgICBvbWFwX3NyYW1faW9fZGVzY1swXS5sZW5ndGgpOworCXByX2luZm8oIlNSQU06IE1hcHBlZCBwYSAweCUwOGxseCB0byB2YSAweCUwOGx4IHNpemU6IDB4JWx4XG4iLAorCQkobG9uZyBsb25nKSBfX3Bmbl90b19waHlzKG9tYXBfc3JhbV9pb19kZXNjWzBdLnBmbiksCisJCW9tYXBfc3JhbV9pb19kZXNjWzBdLnZpcnR1YWwsCisJCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCk7CiAKIAkvKgogCSAqIE5vcm1hbGx5IGRldmljZW1hcHNfaW5pdCgpIHdvdWxkIGZsdXNoIGNhY2hlcyBhbmQgdGxiIGFmdGVyCkBAIC0yNTIsNyArMjUyLDcgQEAKIHZvaWQgKm9tYXBfc3JhbV9wdXNoX2FkZHJlc3ModW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmIChzaXplID4gKG9tYXBfc3JhbV9jZWlsIC0gKG9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJOb3QgZW5vdWdoIHNwYWNlIGluIFNSQU1cbiIpOworCQlwcl9lcnIoIk5vdCBlbm91Z2ggc3BhY2UgaW4gU1JBTVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW9yaW9uL2dwaW8uYwppbmRleCA1YjRmZmZhLi40MWFiOTdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9yaW9uL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LW9yaW9uL2dwaW8uYwpAQCAtNDMyLDcgKzQzMiw3IEBACiAJY3QtPnJlZ3MubWFzayA9IG9jaGlwLT5tYXNrX29mZnNldCArIEdQSU9fRURHRV9NQVNLX09GRjsKIAljdC0+cmVncy5hY2sgPSBHUElPX0VER0VfQ0FVU0VfT0ZGOwogCWN0LT50eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7Ci0JY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2s7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfY2xyX2JpdDsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX3NldF90eXBlID0gZ3Bpb19pcnFfc2V0X3R5cGU7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKaW5kZXggNDhlYmI5NC4uYTExZGMzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYwpAQCAtNTAsNyArNTAsNyBAQAogCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IHB4YV9ncGlvX2NoaXAsIGNoaXApLT5yZWdiYXNlOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBweGFfZ3Bpb19jaGlwICpncGlvX3RvX2NoaXAodW5zaWduZWQgZ3BpbykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHB4YV9ncGlvX2NoaXAgKmdwaW9fdG9fcHhhY2hpcCh1bnNpZ25lZCBncGlvKQogewogCXJldHVybiAmcHhhX2dwaW9fY2hpcHNbZ3Bpb190b19iYW5rKGdwaW8pXTsKIH0KQEAgLTE2MSw3ICsxNjEsNyBAQAogCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKIAl1bnNpZ25lZCBsb25nIGdwZHIsIG1hc2sgPSBHUElPX2JpdChncGlvKTsKIAotCWMgPSBncGlvX3RvX2NoaXAoZ3Bpbyk7CisJYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKIAogCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7CiAJCS8qIERvbid0IG1lc3Mgd2l0aCBlbmFibGVkIEdQSU9zIHVzaW5nIHByZWNvbmZpZ3VyZWQgZWRnZXMgb3IKQEAgLTIzMCw3ICsyMzAsNyBAQAogc3RhdGljIHZvaWQgcHhhX2Fja19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX2NoaXAoZ3Bpbyk7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CiAKIAlfX3Jhd193cml0ZWwoR1BJT19iaXQoZ3BpbyksIGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7CiB9CkBAIC0yMzgsNyArMjM4LDcgQEAKIHN0YXRpYyB2b2lkIHB4YV9tYXNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQogewogCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fY2hpcChncGlvKTsKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKIAl1aW50MzJfdCBncmVyLCBnZmVyOwogCiAJYy0+aXJxX21hc2sgJj0gfkdQSU9fYml0KGdwaW8pOwpAQCAtMjUyLDcgKzI1Miw3IEBACiBzdGF0aWMgdm9pZCBweGFfdW5tYXNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQogewogCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fY2hpcChncGlvKTsKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKIAogCWMtPmlycV9tYXNrIHw9IEdQSU9fYml0KGdwaW8pOwogCXVwZGF0ZV9lZGdlX2RldGVjdChjKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYwppbmRleCBjMTBkMTBjLi41MzliZDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCkBAIC03MTIsNyArNzEyLDcgQEAKICAqIGdldCBjb250cm9sIG9mIGFuIGRtYSBjaGFubmVsCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfcmVxdWVzdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQsCiAJCQl2b2lkICpkZXYpCiB7CkBAIC03ODMsNyArNzgzLDcgQEAKICAqIGFsbG93ZWQgdG8gZ28gdGhyb3VnaC4KICovCiAKLWludCBzM2MyNDEwX2RtYV9mcmVlKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCitpbnQgczNjMjQxMF9kbWFfZnJlZShlbnVtIGRtYV9jaCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC05NzQsNyArOTc0LDcgQEAKIH0KIAogaW50Ci1zM2MyNDEwX2RtYV9jdHJsKHVuc2lnbmVkIGludCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKK3MzYzI0MTBfZG1hX2N0cmwoZW51bSBkbWFfY2ggY2hhbm5lbCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCkBAIC0xMDIxLDIzICsxMDIxLDE5IEBACiAgKiB4ZmVyc2l6ZTogICAgIHNpemUgb2YgdW5pdCBpbiBieXRlcyAoMSwyLDQpCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLAoraW50IHMzYzI0MTBfZG1hX2NvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLAogCQkgICAgICAgaW50IHhmZXJ1bml0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIAl1bnNpZ25lZCBpbnQgZGNvbjsKIAotCXByX2RlYnVnKCIlczogY2hhbj0lZCwgeGZlcl91bml0PSVkLCBkY29uPSUwOHhcbiIsCi0JCSBfX2Z1bmNfXywgY2hhbm5lbCwgeGZlcnVuaXQsIGRjb24pOworCXByX2RlYnVnKCIlczogY2hhbj0lZCwgeGZlcl91bml0PSVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbCwgeGZlcnVuaXQpOwogCiAJaWYgKGNoYW4gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcl9kZWJ1ZygiJXM6IEluaXRpYWwgZGNvbiBpcyAlMDh4XG4iLCBfX2Z1bmNfXywgZGNvbik7Ci0KIAlkY29uID0gY2hhbi0+ZGNvbiAmIGRtYV9zZWwuZGNvbl9tYXNrOwotCi0JcHJfZGVidWcoIiVzOiBOZXcgZGNvbiBpcyAlMDh4XG4iLCBfX2Z1bmNfXywgZGNvbik7CisJcHJfZGVidWcoIiVzOiBkY29uIGlzICUwOHhcbiIsIF9fZnVuY19fLCBkY29uKTsKIAogCXN3aXRjaCAoY2hhbi0+cmVxX2NoKSB7CiAJY2FzZSBETUFDSF9JMlNfSU46CkBAIC0xMTA0LDcgKzExMDAsNyBAQAogICogZGV2YWRkcjogICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzb3VyY2UKICovCiAKLWludCBzM2MyNDEwX2RtYV9kZXZjb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCitpbnQgczNjMjQxMF9kbWFfZGV2Y29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkgIGVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlLAogCQkJICB1bnNpZ25lZCBsb25nIGRldmFkZHIpCiB7CkBAIC0xMTc3LDcgKzExNzMsNyBAQAogICogcmV0dXJucyB0aGUgY3VycmVudCB0cmFuc2ZlciBwb2ludHMgZm9yIHRoZSBkbWEgc291cmNlIGFuZCBkZXN0aW5hdGlvbgogKi8KIAotaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKHVuc2lnbmVkIGludCBjaGFubmVsLCBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRzdCkKK2ludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbihlbnVtIGRtYV9jaCBjaGFubmVsLCBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRzdCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTExOTksNyArMTE5NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAotc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfc3VzcGVuZF9jaGFuKHMzYzI0MTBfZG1hX2NoYW4gKmNwKQorc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfc3VzcGVuZF9jaGFuKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjcCkKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAic3VzcGVuZGluZyBkbWEgY2hhbm5lbCAlZFxuIiwgY3AtPm51bWJlcik7CiAKQEAgLTEyMzUsNyArMTIzMSw3IEBACiAJLyogcmVzdG9yZSBjaGFubmVsJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiAqLwogCiAJaWYgKCFjcC0+aW5fdXNlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZG1hJWQ6IHJlc3RvcmluZyBjb25maWd1cmF0aW9uXG4iLCBjcC0+bnVtYmVyKTsKIApAQCAtMTI0Niw4ICsxMjQyLDYgQEAKIAogCWlmIChjcC0+bWFwICE9IE5VTEwpCiAJCWRtYV9zZWwuc2VsZWN0KGNwLCBjcC0+bWFwKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzM2MyNDEwX2RtYV9yZXN1bWUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYwppbmRleCA5YWVlN2UxLi5mYzhjNWY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KQEAgLTY2OCwzICs2NjksOCBAQAogCiAJaXJxZGJmKCJzM2MyNDEwOiByZWdpc3RlcmVkIGludGVycnVwdCBoYW5kbGVyc1xuIik7CiB9CisKK3N0cnVjdCBzeXNjb3JlX29wcyBzM2MyNHh4X2lycV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IHMzYzI0eHhfaXJxX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNHh4X2lycV9yZXN1bWUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1vbmVuYW5kLmMKaW5kZXggNmRiOTI2Mi4uMjAzMzZjOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jCkBAIC0xNSw4ICsxNSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CkBAIC00NSwxMyArNDMsMyBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfb25lbmFuZF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IHM1cF9vbmVuYW5kX3Jlc291cmNlcywKIH07Ci0KLXZvaWQgczVwX29uZW5hbmRfc2V0X3BsYXRkYXRhKHN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQotewotCXN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEgKnBkOwotCi0JcGQgPSBrbWVtZHVwKHBkYXRhLCBzaXplb2Yoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCXM1cF9kZXZpY2Vfb25lbmFuZC5kZXYucGxhdGZvcm1fZGF0YSA9IHBkOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9tYXAtczVwLmgKaW5kZXggYTZjM2QzMi4uZDk3M2QzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaAorKysgYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIFM1UF9WQV9UV0QJCVM1UF9WQV9DT1JFUEVSSSgweDYwMCkKICNkZWZpbmUgUzVQX1ZBX0dJQ19ESVNUCQlTNVBfVkFfQ09SRVBFUkkoMHgxMDAwKQogCi0jZGVmaW5lIFM1UF9WQV9VU0JfSFNQSFkJUzNDX0FERFIoMHgwMjkwMDAwMCkKKyNkZWZpbmUgUzNDX1ZBX1VTQl9IU1BIWQlTM0NfQUREUigweDAyOTAwMDAwKQogCiAjZGVmaW5lIFZBX1ZJQyh4KQkJKFMzQ19WQV9JUlEgKyAoKHgpICogMHgxMDAwMCkpCiAjZGVmaW5lIFZBX1ZJQzAJCQlWQV9WSUMoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMgYi9hcmNoL2FybS9wbGF0LXM1cC9pcnEtZ3Bpb2ludC5jCmluZGV4IDEzNWFiZGEuLjMyN2FiOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJaWYgKCFnYykKIAkJcmV0dXJuIC1FTk9NRU07CiAJY3QgPSBnYy0+Y2hpcF90eXBlczsKLQljdC0+Y2hpcC5pcnFfYWNrID0gaXJxX2djX2FjazsKKwljdC0+Y2hpcC5pcnFfYWNrID0gaXJxX2djX2Fja19zZXRfYml0OwogCWN0LT5jaGlwLmlycV9tYXNrID0gaXJxX2djX21hc2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfdW5tYXNrID0gaXJxX2djX21hc2tfY2xyX2JpdDsKIAljdC0+Y2hpcC5pcnFfc2V0X3R5cGUgPSBzNXBfZ3Bpb2ludF9zZXRfdHlwZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL3M1cC10aW1lLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9zNXAtdGltZS5jCmluZGV4IDg5OWE4Y2MuLjYxMjkzNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL3M1cC10aW1lLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXAvczVwLXRpbWUuYwpAQCAtMzcwLDExICszNzAsMTEgQEAKIAogCWNsb2NrX3JhdGUgPSBjbGtfZ2V0X3JhdGUodGluX3NvdXJjZSk7CiAKLQlpbml0X3NjaGVkX2Nsb2NrKCZjZCwgczVwX3VwZGF0ZV9zY2hlZF9jbG9jaywgMzIsIGNsb2NrX3JhdGUpOwotCiAJczVwX3RpbWVfc2V0dXAodGltZXJfc291cmNlLnNvdXJjZV9pZCwgVENOVF9NQVgpOwogCXM1cF90aW1lX3N0YXJ0KHRpbWVyX3NvdXJjZS5zb3VyY2VfaWQsIFBFUklPRElDKTsKIAorCWluaXRfc2NoZWRfY2xvY2soJmNkLCBzNXBfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgY2xvY2tfcmF0ZSk7CisKIAlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJnRpbWVfY2xvY2tzb3VyY2UsIGNsb2NrX3JhdGUpKQogCQlwYW5pYygiJXM6IGNhbid0IHJlZ2lzdGVyIGNsb2Nrc291cmNlXG4iLCB0aW1lX2Nsb2Nrc291cmNlLm5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYwppbmRleCA0NWVjNzMyLi5mNTRhZTcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYwpAQCAtMTMsOCArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9vbmVuYW5kLmg+CiAKICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgpAQCAtNDMsMTMgKzQxLDMgQEAKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX29uZW5hbmRfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzM2Nfb25lbmFuZF9yZXNvdXJjZXMsCiB9OwotCi12b2lkIHMzY19vbmVuYW5kX3NldF9wbGF0ZGF0YShzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKLXsKLQlzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhICpwZDsKLQotCXBkID0ga21lbWR1cChwZGF0YSwgc2l6ZW9mKHN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQlzM2NfZGV2aWNlX29uZW5hbmQuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEuYwppbmRleCBjYjQ1OWRkLi42MTQzYWExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS5jCkBAIC00MSw3ICs0MSw3IEBACiAgKiBpcnE/CiAqLwogCi1pbnQgczNjMjQxMF9kbWFfc2V0X29wZm4odW5zaWduZWQgaW50IGNoYW5uZWwsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pCitpbnQgczNjMjQxMF9kbWFfc2V0X29wZm4oZW51bSBkbWFfY2ggY2hhbm5lbCwgczNjMjQxMF9kbWFfb3Bmbl90IHJ0bikKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTU2LDcgKzU2LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfc2V0X29wZm4pOwogCi1pbnQgczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKHVuc2lnbmVkIGludCBjaGFubmVsLCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKQoraW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihlbnVtIGRtYV9jaCBjaGFubmVsLCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtNzEsNyArNzEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4pOwogCi1pbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3ModW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBzM2MyNDEwX2RtYV9zZXRmbGFncyhlbnVtIGRtYV9jaCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oCmluZGV4IGI2MWI4ZWUuLmUzYjMxYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oCkBAIC0xMiw2ICsxMiwxMCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KKworI2lmbmRlZiBfX1BMQVRfREVWU19ICisjZGVmaW5lIF9fUExBVF9ERVZTX0ggX19GSUxFX18KKwogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiBzdHJ1Y3QgczNjMjR4eF91YXJ0X3Jlc291cmNlcyB7CkBAIC03NSwxMCArNzksOCBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTA7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9zcGkxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0MF9kZXZpY2Vfc3BpMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NDBfZGV2aWNlX3NwaTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDUwX2RldmljZV9zcGkwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ1MF9kZXZpY2Vfc3BpMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3NwaTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NHgwX2RldmljZV9zcGkxOwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2h3bW9uOwogCkBAIC0xNjEsMyArMTYzLDUgQEAKICAqLwogZXh0ZXJuIHZvaWQgKnMzY19zZXRfcGxhdGRhdGEodm9pZCAqcGQsIHNpemVfdCBwZHNpemUsCiAJCQkgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworI2VuZGlmIC8qIF9fUExBVF9ERVZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS5oCmluZGV4IDJlOGY4YzYuLjhjMjczYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaApAQCAtNDIsNiArNDIsNyBAQAogfTsKIAogc3RydWN0IHMzYzI0MTBfZG1hX2NoYW47CitlbnVtIGRtYV9jaDsKIAogLyogczNjMjQxMF9kbWFfY2Jmbl90CiAgKgpAQCAtNjIsNyArNjMsNyBAQAogICogcmVxdWVzdCBhIGRtYSBjaGFubmVsIGV4Y2x1c2l2bGV5CiAqLwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX3JlcXVlc3QodW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3JlcXVlc3QoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCSAgICAgICBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICosIHZvaWQgKmRldik7CiAKIApAQCAtNzEsMTQgKzcyLDE0IEBACiAgKiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkbWEgY2hhbm5lbAogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9jdHJsKHVuc2lnbmVkIGludCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCk7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2N0cmwoZW51bSBkbWFfY2ggY2hhbm5lbCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApOwogCiAvKiBzM2MyNDEwX2RtYV9zZXRmbGFncwogICoKICAqIHNldCB0aGUgY2hhbm5lbCdzIGZsYWdzIHRvIGEgZ2l2ZW4gc3RhdGUKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3ModW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldGZsYWdzKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKIAogLyogczNjMjQxMF9kbWFfZnJlZQpAQCAtODYsNyArODcsNyBAQAogICogZnJlZSB0aGUgZG1hIGNoYW5uZWwgKHdpbGwgYWxzbyBhYm9ydCBhbnkgb3V0c3RhbmRpbmcgb3BlcmF0aW9ucykKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZnJlZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqKTsKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfZnJlZShlbnVtIGRtYV9jaCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICopOwogCiAvKiBzM2MyNDEwX2RtYV9lbnF1ZXVlCiAgKgpAQCAtOTUsNyArOTYsNyBAQAogICogZHJhaW5lZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBnaXZlbiB0byB0aGUgRE1BIHN5c3RlbS4KICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZW5xdWV1ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdm9pZCAqaWQsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2VucXVldWUoZW51bSBkbWFfY2ggY2hhbm5lbCwgdm9pZCAqaWQsCiAJCQkgICAgICAgZG1hX2FkZHJfdCBkYXRhLCBpbnQgc2l6ZSk7CiAKIC8qIHMzYzI0MTBfZG1hX2NvbmZpZwpAQCAtMTAzLDE0ICsxMDQsMTQgQEAKICAqIGNvbmZpZ3VyZSB0aGUgZG1hIGNoYW5uZWwKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLCBpbnQgeGZlcnVuaXQpOworZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9jb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwgaW50IHhmZXJ1bml0KTsKIAogLyogczNjMjQxMF9kbWFfZGV2Y29uZmlnCiAgKgogICogY29uZmlndXJlIHRoZSBkZXZpY2Ugd2UncmUgdGFsa2luZyB0bwogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9kZXZjb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLAogCQllbnVtIHMzYzI0MTBfZG1hc3JjIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXZhZGRyKTsKIAogLyogczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24KQEAgLTExOCwxMCArMTE5LDEwIEBACiAgKiBnZXQgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIGRtYSB0cmFuc2ZlciBpcyBjdXJyZW50bHkgYXQKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24odW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkJICAgZG1hX2FkZHJfdCAqc3JjLCBkbWFfYWRkcl90ICpkZXN0KTsKIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfb3Bmbih1bnNpZ25lZCBpbnQsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pOwotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4odW5zaWduZWQgaW50LCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKTsKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0X29wZm4oZW51bSBkbWFfY2gsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pOworZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oZW51bSBkbWFfY2gsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pOwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaAppbmRleCBjMTUxYzVmLi4xMTZlZGZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oCkBAIC0yMjQsNiArMjI0LDggQEAKICNkZWZpbmUgUzVQVjIxMF9VRlNUQVRfUlhNQVNLCSgyNTU8PDApCiAjZGVmaW5lIFM1UFYyMTBfVUZTVEFUX1JYU0hJRlQJKDApCiAKKyNkZWZpbmUgTk9fTkVFRF9DSEVDS19DTEtTUkMJMQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKiBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NHh4LXNwaS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NHh4LXNwaS5oCmluZGV4IDBmZmUzNGEuLjRjMTZmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjR4eC1zcGkuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0eHgtc3BpLmgKQEAgLTM5LDYgKzM5LDcgQEAKICAqIEBmaWZvX2x2bF9tYXNrOiBBbGwgdHggZmlmb19sdmwgZmllbGRzIHN0YXJ0IGF0IG9mZnNldC02CiAgKiBAcnhfbHZsX29mZnNldDogRGVwZW5kcyBvbiB0eCBmaWZvX2x2bCBmaWVsZCBhbmQgYnVzIG51bWJlcgogICogQGhpZ2hfc3BlZWQ6IElmIHRoZSBjb250cm9sbGVyIHN1cHBvcnRzIEhJR0hfU1BFRURfRU4gYml0CisgKiBAdHhfc3RfZG9uZTogRGVwZW5kcyBvbiB0eCBmaWZvX2x2bCBmaWVsZAogICovCiBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyB7CiAJaW50IHNyY19jbGtfbnI7CkBAIC01Myw2ICs1NCw3IEBACiAJaW50IGZpZm9fbHZsX21hc2s7CiAJaW50IHJ4X2x2bF9vZmZzZXQ7CiAJaW50IGhpZ2hfc3BlZWQ7CisJaW50IHR4X3N0X2RvbmU7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pcnEtdWFydC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMKaW5kZXggMzI1ODJjMC4uNjU3NDA1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMKQEAgLTU0LDggKzU0LDE1IEBACiAKIAlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoInMzYy11YXJ0IiwgMSwgdWlycS0+YmFzZV9pcnEsIHJlZ19iYXNlLAogCQkJCSAgICBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCWlmICghZ2MpIHsKKwkJcHJfZXJyKCIlczogaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCBmb3IgSVJRICV1IGZhaWxlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCB1aXJxLT5iYXNlX2lycSk7CisJCXJldHVybjsKKwl9CisKIAljdCA9IGdjLT5jaGlwX3R5cGVzOwotCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrOworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OwogCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OwogCWN0LT5yZWdzLmFjayA9IFMzQzY0WFhfVUlOVFA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXZpYy10aW1lci5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS12aWMtdGltZXIuYwppbmRleCBhNjA3NTQ2Li5mNzE0ZDA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXZpYy10aW1lci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pcnEtdmljLXRpbWVyLmMKQEAgLTU0LDYgKzU0LDEzIEBACiAKIAlzM2NfdGdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgiczNjLXRpbWVyIiwgMSwgdGltZXJfaXJxLAogCQkJCQkgUzNDNjRYWF9USU5UX0NTVEFULCBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCWlmICghczNjX3RnYykgeworCQlwcl9lcnIoIiVzOiBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwIGZvciBJUlEgJWQgZmFpbGVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHRpbWVyX2lycSk7CisJCXJldHVybjsKKwl9CisKIAljdCA9IHMzY190Z2MtPmNoaXBfdHlwZXM7CiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OwogCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKaW5kZXggNmY5Y2E1Ni4uYTA2YmZjYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDBfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMF9kZWZjb25maWcKaW5kZXggN2VlY2UwYS4uZDhmMWZlOCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMF9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZwppbmRleCAzODdlYjlkLi5kNGM1YjE5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfbXJtdF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfbXJtdF9kZWZjb25maWcKaW5kZXggMTlmNmNlZS4uNzdjYTRmOSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX21ybXRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9tcm10X2RlZmNvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTFVCX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTEwOSw3ICsxMTAsNyBAQAogQ09ORklHX0xFRFNfVFJJR0dFUlM9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CiBDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15Ci1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfUzM1MzkwQT1tCiBDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYPW0KIENPTkZJR19ETUFERVZJQ0VTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9kZWZjb25maWcKaW5kZXggZjBmZTIzNy4uNmUwZGNhNCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDBfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDBfZGVmY29uZmlnCmluZGV4IGU0YTdjMWQuLjdmMmEzNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDFfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDFfZGVmY29uZmlnCmluZGV4IDZmMzdmNzAuLjA4NWVlYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAxX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMV9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZwppbmRleCA0ZmIwMWY1Li5kMWE4ODdlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAzX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCmluZGV4IDlmYWFmOWIuLjk1NmYyODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDRfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcKaW5kZXggM2QyYTVkOC4uNDBjNjlmMyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZwppbmRleCAxZWQ4ZjIyLi41MTFlYjhhIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvZmF2ci0zMl9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvZmF2ci0zMl9kZWZjb25maWcKaW5kZXggYWVhZGM5NS4uMTk5NzNiMCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2ZhdnItMzJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9mYXZyLTMyX2RlZmNvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZwppbmRleCAxNjkyYmVlLi42ZjQ1NjgxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL21lcmlzY19kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvbWVyaXNjX2RlZmNvbmZpZwppbmRleCA4YjY3MGE2Li4zYmVmYWI5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvbWVyaXNjX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvbWVyaXNjX2RlZmNvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvbWltYzIwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvbWltYzIwMF9kZWZjb25maWcKaW5kZXggNWE1MWYyZS4uMWJlZTUxZiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL21pbWMyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9taW1jMjAwX2RlZmNvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDQ5YTg4ZjUuLjEwODUwMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTMxLDcgKzEzMSw2IEBACiAgKi8KICNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wYywgbmV3X3NwKQkgXAogCWRvIHsJCQkJCSBcCi0JCXNldF9mcyhVU0VSX0RTKTsJCSBcCiAJCW1lbXNldChyZWdzLCAwLCBzaXplb2YoKnJlZ3MpKTsJIFwKIAkJcmVncy0+c3IgPSBNT0RFX1VTRVI7CQkgXAogCQlyZWdzLT5wYyA9IG5ld19wYyAmIH4xOwkJIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKaW5kZXggYWE2NzdlMi4uN2ZiZjBkYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKQEAgLTEwNDMsOCArMTA0Myw5IEBACiAJCWRhdGEtPnJlZ3MgPSAodm9pZCBfX2lvbWVtICopcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CiAJfQogCisJcGRldi0+aWQgPSBsaW5lOwogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JcGRhdGEtPm51bSA9IHBvcnRucjsKKwlwZGF0YS0+bnVtID0gbGluZTsKIAlhdDMyX3VzYXJ0c1tsaW5lXSA9IHBkZXY7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmgKaW5kZXggOWM5NmExMy4uODE4MTI5MyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTMxLDggKzMxLDIwIEBACiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MygpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlybCgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDkoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkIoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkMoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzEwKCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyMCgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDUoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1ZXMoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTEwKCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NigpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTEoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDUoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzE1KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWczNSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4MzUoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzI1KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXgyNSgpCSgwKQogCiAjZW5kaWYgLyogX19BU01fQVJDSF9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwppbmRleCAzZTM2NDYxLi5jOWFjMmY4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwpAQCAtMTY3LDE0ICsxNjcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbnRjX3Jlc3VtZSh2b2lkKQorc3RhdGljIHZvaWQgaW50Y19yZXN1bWUodm9pZCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQogCQlpbnRjX3dyaXRlbCgmaW50YzAsIElOVFBSMCArIDQgKiBpLCBpbnRjMC5zYXZlZF9pcHJbaV0pOwotCi0JcmV0dXJuIDA7CiB9CiAjZWxzZQogI2RlZmluZSBpbnRjX3N1c3BlbmQJTlVMTApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKaW5kZXggMzFkOTU0Mi4uOWYxZDA4NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCkBAIC0xMTIsNyArMTEyLDcgQEAKIENPTkZJR19VU0JfR19QUklOVEVSPW0KIENPTkZJR19NTUM9bQogQ09ORklHX1NESF9CRklOPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9CRklOPW0KIENPTkZJR19FWFQyX0ZTPW0KICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvc3RybmNweS5TIGIvYXJjaC9ibGFja2Zpbi9saWIvc3RybmNweS5TCmluZGV4IGYzOTMxZDUuLjJjMDdkZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL3N0cm5jcHkuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9zdHJuY3B5LlMKQEAgLTI1LDcgKzI1LDcgQEAKIAogRU5UUlkoX3N0cm5jcHkpCiAJQ0MgPSBSMiA9PSAwOwotCWlmIENDIEpVTVAgNGY7CisJaWYgQ0MgSlVNUCA2ZjsKIAogCVAyID0gUjIgOyAgICAgICAvKiBzaXplICovCiAJUDAgPSBSMCA7ICAgICAgIC8qIGRzdCovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggMWNmMGY0OS4uN2M5MjhkYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMzIwLDExICszMjAsMTIgQEAKICNkZWZpbmUgX19OUl9jbG9ja19hZGp0aW1lCQkxMzI4CiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkJMTMyOQogI2RlZmluZSBfX05SX3NldG5zCQkJMTMzMAorI2RlZmluZSBfX05SX3NlbmRtbXNnCQkJMTMzMQogCiAjaWZkZWYgX19LRVJORUxfXwogCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCQkzMDcgLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KKyNkZWZpbmUgTlJfc3lzY2FsbHMJCQkzMDggLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBzdG9wIHNjcmlwdHMvY2hlY2tzeXNjYWxscy5zaCBmcm9tIGNvbXBsYWluaW5nIGFib3V0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKaW5kZXggOWNhODAxOS4uOTdkZDJhYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwpAQCAtMTc3Niw2ICsxNzc2LDcgQEAKIAlkYXRhOCBzeXNfY2xvY2tfYWRqdGltZQogCWRhdGE4IHN5c19zeW5jZnMKIAlkYXRhOCBzeXNfc2V0bnMJCQkJLy8gMTMzMAorCWRhdGE4IHN5c19zZW5kbW1zZwogCiAJLm9yZyBzeXNfY2FsbF90YWJsZSArIDgqTlJfc3lzY2FsbHMJLy8gZ3VhcmQgYWdhaW5zdCBmYWlsdXJlcyB0byBpbmNyZWFzZSBOUl9zeXNjYWxscwogI2VuZGlmIC8qIF9fSUE2NF9BU01fUEFSQVZJUlRVQUxJWkVEX05BVElWRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IDlmM2I1YWMuLjExNWNlZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTE0LDEyICsxNCw2IEBACiAjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCiAKICNkZWZpbmUgbm9kZV9sb2NhbG5yKHBmbiwgbmlkKQkoKHBmbikgLSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlwZ19kYXRhX3QgKl9fcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsJCQkJXAotCV9fcGdkYXQtPm5vZGVfc3RhcnRfcGZuICsgX19wZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzIC0gMTsJXAotfSkKIAogI2RlZmluZSBwbWRfcGFnZShwbWQpCQkocGZuX3RvX3BhZ2UocG1kX3ZhbChwbWQpID4+IFBBR0VfU0hJRlQpKQogLyoKQEAgLTQ0LDcgKzM4LDcgQEAKIAlpbnQgbm9kZTsKIAogCWZvciAobm9kZSA9IDAgOyBub2RlIDwgTUFYX05VTU5PREVTIDsgbm9kZSsrKQotCQlpZiAocGZuID49IG5vZGVfc3RhcnRfcGZuKG5vZGUpICYmIHBmbiA8PSBub2RlX2VuZF9wZm4obm9kZSkpCisJCWlmIChwZm4gPj0gbm9kZV9zdGFydF9wZm4obm9kZSkgJiYgcGZuIDwgbm9kZV9lbmRfcGZuKG5vZGUpKQogCQkJYnJlYWs7CiAKIAlyZXR1cm4gbm9kZTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnLm5vbW11IGIvYXJjaC9tNjhrL0tjb25maWcubm9tbXUKaW5kZXggZmM5OGY5Yi4uYjAwNGRjMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcubm9tbXUKKysrIGIvYXJjaC9tNjhrL0tjb25maWcubm9tbXUKQEAgLTE0LDYgKzE0LDMzIEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgTTY4MDAwCisJYm9vbAorCWhlbHAKKwkgIFRoZSBGcmVlc2NhbGUgKHdhcyBNb3Rvcm9sYSkgNjgwMDAgQ1BVIGlzIHRoZSBmaXJzdCBnZW5lcmF0aW9uIG9mCisJICB0aGUgd2VsbCBrbm93biBNNjhLIGZhbWlseSBvZiBwcm9jZXNzb3JzLiBUaGUgQ1BVIGNvcmUgYXMgd2VsbCBhcworCSAgYmVpbmcgYXZhaWxhYmxlIGFzIGEgc3RhbmQgYWxvbmUgQ1BVIHdhcyBhbHNvIHVzZWQgaW4gbWFueQorCSAgU3lzdGVtLU9uLUNoaXAgZGV2aWNlcyAoZWcgNjgzMjgsIDY4MzAyLCBldGMpLiBJdCBkb2VzIG5vdCBjb250YWluCisJICBhIHBhZ2luZyBNTVUuCisKK2NvbmZpZyBNQ1BVMzIKKwlib29sCisJaGVscAorCSAgVGhlIEZyZWVzY2FsZSAod2FzIHRoZW4gTW90b3JvbGEpIENQVTMyIGlzIGEgQ1BVIGNvcmUgdGhhdCBpcworCSAgYmFzZWQgb24gdGhlIDY4MDIwIHByb2Nlc3Nvci4gRm9yIHRoZSBtb3N0IHBhcnQgaXQgaXMgdXNlZCBpbgorCSAgU3lzdGVtLU9uLUNoaXAgcGFydHMsIGFuZCBkb2VzIG5vdCBjb250YWluIGEgcGFnaW5nIE1NVS4KKworY29uZmlnIENPTERGSVJFCisJYm9vbAorCXNlbGVjdCBHRU5FUklDX0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwloZWxwCisJICBUaGUgRnJlZXNjYWxlIENvbGRGaXJlIGZhbWlseSBvZiBwcm9jZXNzb3JzIGlzIGEgbW9kZXJuIGRlcml2aXRpdmUKKwkgIG9mIHRoZSA2ODAwMCBwcm9jZXNzb3IgZmFtaWx5LiBUaGV5IGFyZSBtYWlubHkgdGFyZ2V0ZWQgYXQgZW1iZWRkZWQKKwkgIGFwcGxpY2F0aW9ucywgYW5kIGFyZSBhbGwgU3lzdGVtLU9uLUNoaXAgKFNPQykgZGV2aWNlcywgYXMgb3Bwb3NlZAorCSAgdG8gc3RhbmQgYWxvbmUgQ1BVcy4gVGhleSBpbXBsZW1lbnQgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIDY4MDAwCisJICBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gc2V0LgorCiBjb25maWcgQ09MREZJUkVfU1dfQTcKIAlib29sCiAJZGVmYXVsdCBuCkBAIC0zNiwyNiArNjMsMzEgQEAKIAogY29uZmlnIE02ODMyOAogCWJvb2wgIk1DNjgzMjgiCisJc2VsZWN0IE02ODAwMAogCWhlbHAKIAkgIE1vdG9yb2xhIDY4MzI4IHByb2Nlc3NvciBzdXBwb3J0LgogCiBjb25maWcgTTY4RVozMjgKIAlib29sICJNQzY4RVozMjgiCisJc2VsZWN0IE02ODAwMAogCWhlbHAKIAkgIE1vdG9yb2xhIDY4RVgzMjggcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNjhWWjMyOAogCWJvb2wgIk1DNjhWWjMyOCIKKwlzZWxlY3QgTTY4MDAwCiAJaGVscAogCSAgTW90b3JvbGEgNjhWWjMyOCBwcm9jZXNzb3Igc3VwcG9ydC4KIAogY29uZmlnIE02ODM2MAogCWJvb2wgIk1DNjgzNjAiCisJc2VsZWN0IE1DUFUzMgogCWhlbHAKIAkgIE1vdG9yb2xhIDY4MzYwIHByb2Nlc3NvciBzdXBwb3J0LgogCiBjb25maWcgTTUyMDYKIAlib29sICJNQ0Y1MjA2IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC02Myw2ICs5NSw3IEBACiAKIGNvbmZpZyBNNTIwNmUKIAlib29sICJNQ0Y1MjA2ZSIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgQ09MREZJUkVfU1dfQTcKIAlzZWxlY3QgSEFWRV9NQkFSCiAJaGVscApAQCAtNzAsNiArMTAzLDcgQEAKIAogY29uZmlnIE01MjB4CiAJYm9vbCAiTUNGNTIweCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBIQVZFX0NBQ0hFX1NQTElUCiAJaGVscApAQCAtNzcsNiArMTExLDcgQEAKIAogY29uZmlnIE01MjN4CiAJYm9vbCAiTUNGNTIzeCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBIQVZFX0NBQ0hFX1NQTElUCiAJc2VsZWN0IEhBVkVfSVBTQkFSCkBAIC04NSw2ICsxMjAsNyBAQAogCiBjb25maWcgTTUyNDkKIAlib29sICJNQ0Y1MjQ5IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC05Miw2ICsxMjgsNyBAQAogCiBjb25maWcgTTUyNzEKIAlib29sICJNQ0Y1MjcxIgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBIQVZFX0NBQ0hFX1NQTElUCiAJc2VsZWN0IEhBVkVfSVBTQkFSCiAJaGVscApAQCAtOTksNiArMTM2LDcgQEAKIAogY29uZmlnIE01MjcyCiAJYm9vbCAiTUNGNTI3MiIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgQ09MREZJUkVfU1dfQTcKIAlzZWxlY3QgSEFWRV9NQkFSCiAJaGVscApAQCAtMTA2LDYgKzE0NCw3IEBACiAKIGNvbmZpZyBNNTI3NQogCWJvb2wgIk1DRjUyNzUiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKIAloZWxwCkBAIC0xMTMsNiArMTUyLDcgQEAKIAogY29uZmlnIE01Mjh4CiAJYm9vbCAiTUNGNTI4eCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBIQVZFX0NBQ0hFX1NQTElUCiAJc2VsZWN0IEhBVkVfSVBTQkFSCkBAIC0xMjEsNiArMTYxLDcgQEAKIAogY29uZmlnIE01MzA3CiAJYm9vbCAiTUNGNTMwNyIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgQ09MREZJUkVfU1dfQTcKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKQEAgLTEyOSwxMiArMTcwLDE0IEBACiAKIGNvbmZpZyBNNTMyeAogCWJvb2wgIk1DRjUzMngiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAloZWxwCiAJICBGcmVlc2NhbGUgKE1vdG9yb2xhKSBDb2xkRmlyZSA1MzJ4IHByb2Nlc3NvciBzdXBwb3J0LgogCiBjb25maWcgTTU0MDcKIAlib29sICJNQ0Y1NDA3IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX0NBQ0hFX0NCCiAJc2VsZWN0IEhBVkVfTUJBUgpAQCAtMTQzLDYgKzE4Niw3IEBACiAKIGNvbmZpZyBNNTQ3eAogCWJvb2wgIk1DRjU0N3giCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCiAJaGVscApAQCAtMTUwLDYgKzE5NCw3IEBACiAKIGNvbmZpZyBNNTQ4eAogCWJvb2wgIk1DRjU0OHgiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCiAJaGVscApAQCAtMTY4LDEzICsyMTMsNiBAQAogCWRlcGVuZHMgb24gKE01NDh4IHx8IE01NDd4KQogCWRlZmF1bHQgeQogCi1jb25maWcgQ09MREZJUkUKLQlib29sCi0JZGVwZW5kcyBvbiAoTTUyMDYgfHwgTTUyMDZlIHx8IE01MjB4IHx8IE01MjN4IHx8IE01MjQ5IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MzA3IHx8IE01MzJ4IHx8IE01NDA3IHx8IE01NHh4KQotCXNlbGVjdCBHRU5FUklDX0dQSU8KLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKLQlkZWZhdWx0IHkKLQogY29uZmlnIENMT0NLX1NFVAogCWJvb2wgIkVuYWJsZSBzZXR0aW5nIHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5IgogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMgYi9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYwppbmRleCAzM2Y4Mjc2Li4xYjdhMTRkIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYworKysgYi9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYwpAQCAtMTQsOCArMTQsNyBAQAogRVhQT1JUX1NZTUJPTChfX2xzaHJkaTMpOwogRVhQT1JUX1NZTUJPTChfX211bGRpMyk7CiAKLSNpZiAhZGVmaW5lZChfX21jNjgwMjBfXykgJiYgIWRlZmluZWQoX19tYzY4MDMwX18pICYmIFwKLSAgICAhZGVmaW5lZChfX21jNjgwNDBfXykgJiYgIWRlZmluZWQoX19tYzY4MDYwX18pICYmICFkZWZpbmVkKF9fbWNwdTMyX18pCisjaWYgZGVmaW5lZChDT05GSUdfTTY4MDAwKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKIC8qCiAgKiBTaW1wbGVyIDY4ayBhbmQgQ29sZEZpcmUgcGFydHMgYWxzbyBuZWVkIGEgZmV3IG90aGVyIGdjYyBmdW5jdGlvbnMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHNfbm8uUyBiL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHNfbm8uUwppbmRleCBmNGQ3MTVjLi43ZGM0MDg3IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX25vLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkc19uby5TCkBAIC04NCw1MiArODQsNTIgQEAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogTm9ybWFsIHN5bWJvbHMgKi8KIAkJLiA9IEFMSUdOKDQpOwogCQlfX3N0YXJ0X19fa3N5bXRhYiA9IC47Ci0JCSooX19rc3ltdGFiKQorCQkqKFNPUlQoX19fa3N5bXRhYisqKSkKIAkJX19zdG9wX19fa3N5bXRhYiA9IC47CiAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl9ncGwgPSAuOwotCQkqKF9fa3N5bXRhYl9ncGwpCisJCSooU09SVChfX19rc3ltdGFiX2dwbCsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl91bnVzZWQgPSAuOwotCQkqKF9fa3N5bXRhYl91bnVzZWQpCisJCSooU09SVChfX19rc3ltdGFiX3VudXNlZCsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl91bnVzZWQgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCiAJCV9fc3RhcnRfX19rc3ltdGFiX3VudXNlZF9ncGwgPSAuOwotCQkqKF9fa3N5bXRhYl91bnVzZWRfZ3BsKQorCQkqKFNPUlQoX19fa3N5bXRhYl91bnVzZWRfZ3BsKyopKQogCQlfX3N0b3BfX19rc3ltdGFiX3VudXNlZF9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1mdXR1cmUgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsKLQkJKihfX2tzeW10YWJfZ3BsX2Z1dHVyZSkKKwkJKihTT1JUKF9fX2tzeW10YWJfZ3BsX2Z1dHVyZSsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsKIAogCQkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBOb3JtYWwgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYiA9IC47Ci0JCSooX19rY3JjdGFiKQorCQkqKFNPUlQoX19fa2NyY3RhYisqKSkKIAkJX19zdG9wX19fa2NyY3RhYiA9IC47CiAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl9ncGwgPSAuOwotCQkqKF9fa2NyY3RhYl9ncGwpCisJCSooU09SVChfX19rY3JjdGFiX2dwbCsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl91bnVzZWQgPSAuOwotCQkqKF9fa2NyY3RhYl91bnVzZWQpCisJCSooU09SVChfX19rY3JjdGFiX3VudXNlZCsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl91bnVzZWQgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCiAJCV9fc3RhcnRfX19rY3JjdGFiX3VudXNlZF9ncGwgPSAuOwotCQkqKF9fa2NyY3RhYl91bnVzZWRfZ3BsKQorCQkqKFNPUlQoX19fa2NyY3RhYl91bnVzZWRfZ3BsKyopKQogCQlfX3N0b3BfX19rY3JjdGFiX3VudXNlZF9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1mdXR1cmUgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl9ncGxfZnV0dXJlID0gLjsKLQkJKihfX2tjcmN0YWJfZ3BsX2Z1dHVyZSkKKwkJKihTT1JUKF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl9ncGxfZnV0dXJlID0gLjsKIAogCQkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBzdHJpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21lbWNweS5jIGIvYXJjaC9tNjhrL2xpYi9tZW1jcHkuYwppbmRleCA2MjE4MmM4Li4wNjQ4ODkzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21lbWNweS5jCisrKyBiL2FyY2gvbTY4ay9saWIvbWVtY3B5LmMKQEAgLTM0LDggKzM0LDEwIEBACiAJaWYgKHRlbXApIHsKIAkJbG9uZyAqbHRvID0gdG87CiAJCWNvbnN0IGxvbmcgKmxmcm9tID0gZnJvbTsKLSNpZiBkZWZpbmVkKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKF9fbWM2ODAzMF9fKSB8fCBcCi0gICAgZGVmaW5lZChfX21jNjgwNDBfXykgfHwgZGVmaW5lZChfX21jNjgwNjBfXykgfHwgZGVmaW5lZChfX21jcHUzMl9fKQorI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisJCWZvciAoOyB0ZW1wOyB0ZW1wLS0pCisJCQkqbHRvKysgPSAqbGZyb20rKzsKKyNlbHNlCiAJCWFzbSB2b2xhdGlsZSAoCiAJCQkiCW1vdmVsICUyLCUzXG4iCiAJCQkiCWFuZHcgICM3LCUzXG4iCkBAIC01Niw5ICs1OCw2IEBACiAJCQkiCWpwbCAgIDRiIgogCQkJOiAiPWEiIChsZnJvbSksICI9YSIgKGx0byksICI9ZCIgKHRlbXApLCAiPSZkIiAodGVtcDEpCiAJCQk6ICIwIiAobGZyb20pLCAiMSIgKGx0byksICIyIiAodGVtcCkpOwotI2Vsc2UKLQkJZm9yICg7IHRlbXA7IHRlbXAtLSkKLQkJCSpsdG8rKyA9ICpsZnJvbSsrOwogI2VuZGlmCiAJCXRvID0gbHRvOwogCQlmcm9tID0gbGZyb207CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21lbXNldC5jIGIvYXJjaC9tNjhrL2xpYi9tZW1zZXQuYwppbmRleCBmNjQ5ZTZhLi44YTc2MzlmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21lbXNldC5jCisrKyBiL2FyY2gvbTY4ay9saWIvbWVtc2V0LmMKQEAgLTMyLDggKzMyLDEwIEBACiAJdGVtcCA9IGNvdW50ID4+IDI7CiAJaWYgKHRlbXApIHsKIAkJbG9uZyAqbHMgPSBzOwotI2lmIGRlZmluZWQoX19tYzY4MDIwX18pIHx8IGRlZmluZWQoX19tYzY4MDMwX18pIHx8IFwKLSAgICBkZWZpbmVkKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVkKF9fbWM2ODA2MF9fKSB8fCBkZWZpbmVkKF9fbWNwdTMyX18pCisjaWYgZGVmaW5lZChDT05GSUdfTTY4MDAwKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKwkJZm9yICg7IHRlbXA7IHRlbXAtLSkKKwkJCSpscysrID0gYzsKKyNlbHNlCiAJCXNpemVfdCB0ZW1wMTsKIAkJYXNtIHZvbGF0aWxlICgKIAkJCSIJbW92ZWwgJTEsJTJcbiIKQEAgLTU1LDkgKzU3LDYgQEAKIAkJCSIJanBsICAgMWIiCiAJCQk6ICI9YSIgKGxzKSwgIj1kIiAodGVtcCksICI9JmQiICh0ZW1wMSkKIAkJCTogImQiIChjKSwgIjAiIChscyksICIxIiAodGVtcCkpOwotI2Vsc2UKLQkJZm9yICg7IHRlbXA7IHRlbXAtLSkKLQkJCSpscysrID0gYzsKICNlbmRpZgogCQlzID0gbHM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYyBiL2FyY2gvbTY4ay9saWIvbXVsZGkzLmMKaW5kZXggMDc5YmFmYy4uNzllOTI4YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYworKysgYi9hcmNoL202OGsvbGliL211bGRpMy5jCkBAIC0xOSwxNyArMTksNyBAQAogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwogCi0jaWYgZGVmaW5lZChfX21jNjgwMjBfXykgfHwgZGVmaW5lZChfX21jNjgwMzBfXykgfHwgXAotICAgIGRlZmluZWQoX19tYzY4MDQwX18pIHx8IGRlZmluZWQoX19tYzY4MDYwX18pIHx8IGRlZmluZWQoX19tY3B1MzJfXykKLQotI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCi0gIF9fYXNtX18gKCJtdWx1JS5sICUzLCUxOiUwIgkJCQkJCVwKLSAgICAgICAgICAgOiAiPWQiICgoVVNJdHlwZSkodzApKSwJCQkJCVwKLSAgICAgICAgICAgICAiPWQiICgoVVNJdHlwZSkodzEpKQkJCQkJXAotICAgICAgICAgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksCQkJCQlcCi0gICAgICAgICAgICAgImRtaSIgKChVU0l0eXBlKSh2KSkpCi0KLSNlbHNlCisjaWYgZGVmaW5lZChDT05GSUdfTTY4MDAwKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKIAogI2RlZmluZSBTSV9UWVBFX1NJWkUgMzIKICNkZWZpbmUgX19CSVRTNCAoU0lfVFlQRV9TSVpFIC8gNCkKQEAgLTYxLDYgKzUxLDE1IEBACiAgICAgKHcwKSA9IF9fbGxfbG93cGFydCAoX194MSkgKiBfX2xsX0IgKyBfX2xsX2xvd3BhcnQgKF9feDApOwkJXAogICB9IHdoaWxlICgwKQogCisjZWxzZQorCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoIm11bHUlLmwgJTMsJTE6JTAiCQkJCQkJXAorICAgICAgICAgICA6ICI9ZCIgKChVU0l0eXBlKSh3MCkpLAkJCQkJXAorICAgICAgICAgICAgICI9ZCIgKChVU0l0eXBlKSh3MSkpCQkJCQlcCisgICAgICAgICAgIDogIiUwIiAoKFVTSXR5cGUpKHUpKSwJCQkJCVwKKyAgICAgICAgICAgICAiZG1pIiAoKFVTSXR5cGUpKHYpKSkKKwogI2VuZGlmCiAKICNkZWZpbmUgX191bXVsc2lkaTModSwgdikgXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZwppbmRleCAzNzg2MmIyLi44MDdjOTdlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZwpAQCAtNjc4LDcgKzY3OCw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj15Ci1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTD15CiBDT05GSUdfUlRDX0RSVl9URVNUPW0KIENPTkZJR19SVENfRFJWX0RTMTMwNz1tCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMgYi9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKaW5kZXggYzAxODY5Ni4uNWM3NGViNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgpAQCAtMjE1LDE0ICsyMTUsMTMgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgaTgyNTlBX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaTgyNTlBX3Jlc3VtZSh2b2lkKQogewogCWlmIChpODI1OUFfYXV0b19lb2kgPj0gMCkKIAkJaW5pdF84MjU5QShpODI1OUFfYXV0b19lb2kpOwotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MjU5QV9zaHV0ZG93bihzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaTgyNTlBX3NodXRkb3duKHZvaWQpCiB7CiAJLyogUHV0IHRoZSBpODI1OUEgaW50byBhIHF1aWVzY2VudCBzdGF0ZSB0aGF0CiAJICogdGhlIGtlcm5lbCBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBnZXQgaXQKQEAgLTIzMiwyNiArMjMxLDE3IEBACiAJCW91dGIoMHhmZiwgUElDX01BU1RFUl9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCiAJCW91dGIoMHhmZiwgUElDX1NMQVZFX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KIAl9Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGk4MjU5X3N5c2Rldl9jbGFzcyA9IHsKLQkubmFtZSA9ICJpODI1OSIsCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGk4MjU5X3N5c2NvcmVfb3BzID0gewogCS5yZXN1bWUgPSBpODI1OUFfcmVzdW1lLAogCS5zaHV0ZG93biA9IGk4MjU5QV9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfaTgyNTlBID0gewotCS5pZAk9IDAsCi0JLmNscwk9ICZpODI1OV9zeXNkZXZfY2xhc3MsCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBpODI1OUFfaW5pdF9zeXNmcyh2b2lkKQogewotCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmaTgyNTlfc3lzZGV2X2NsYXNzKTsKLQlpZiAoIWVycm9yKQotCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX2k4MjU5QSk7Ci0JcmV0dXJuIGVycm9yOworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZpODI1OV9zeXNjb3JlX29wcyk7CisJcmV0dXJuIDA7CiB9CiAKIGRldmljZV9pbml0Y2FsbChpODI1OUFfaW5pdF9zeXNmcyk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAzZDZlNjBkLi43ODA1NjBiIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE1LDYgKzE1LDcgQEAKICAqIFVzZXIgc3BhY2UgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMKICAqLwogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC90cmFwcy5jCmluZGV4IGYwM2NiMjcuLmJkM2U1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3RyYXBzLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CkBAIC0xNTYsNyArMTU2LDcgQEAKIAogCWNhc2UgRVhDRVBfVFJBUDoKIAljYXNlIEVYQ0VQX1VOSU1QSU5TOgotCQlpZiAoZ2V0X3VzZXIob3Bjb2RlLCAodWludDhfdCBfX3VzZXIgKilyZWdzLT5wYykgIT0gMCkKKwkJaWYgKHByb2JlX2tlcm5lbF9yZWFkKCZvcGNvZGUsICh1OCAqKXJlZ3MtPnBjLCAxKSA8IDApCiAJCQlicmVhazsKIAkJaWYgKG9wY29kZSA9PSAweGZmKSB7CiAJCQlpZiAobm90aWZ5X2RpZShESUVfQlJFQUtQT0lOVCwgc3RyLCByZWdzLCBjb2RlLCAwLCAwKSkKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA2ZjcwMmE2Li4xM2M0ODE0IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC00NCw2ICs0NCw3IEBACiAgIFJPX0RBVEEoUEFHRV9TSVpFKQogCiAgIC8qIHdyaXRlYWJsZSAqLworICBfc2RhdGEgPSAuOyAgICAgLyogU3RhcnQgb2YgcncgZGF0YSBzZWN0aW9uICovCiAgIFJXX0RBVEFfU0VDVElPTigzMiwgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKICAgX2VkYXRhID0gLjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL21tL2NhY2hlLWRiZy1mbHVzaC1ieS1yZWcuUyBiL2FyY2gvbW4xMDMwMC9tbS9jYWNoZS1kYmctZmx1c2gtYnktcmVnLlMKaW5kZXggNjY1OTE5Zi4uYTc3NWVhNSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL21tL2NhY2hlLWRiZy1mbHVzaC1ieS1yZWcuUworKysgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtZGJnLWZsdXNoLWJ5LXJlZy5TCkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogCSMgY29uZGl0aW9uYWxseSBwdXJnZSB0aGlzIGxpbmUgaW4gYWxsIHdheXMKIAltb3YJZDEsKEwxX0NBQ0hFX1dBWURJU1AqMCxhMCkKIAotZGVidWdnZXJfbG9jYWxfY2FjaGVfZmx1c2hpbnZfbm9fZGNhY2hlOgorZGVidWdnZXJfbG9jYWxfY2FjaGVfZmx1c2hpbnZfb25lX25vX2RjYWNoZToKIAkjCiAJIyBub3cgdHJ5IHRvIGZsdXNoIHRoZSBpY2FjaGUKIAkjCiAJbW92CUNIQ1RSLGEwCiAJbW92aHUJKGEwKSxkMAogCWJ0c3QJQ0hDVFJfSUNFTixkMAotCWJlcQltbjEwMzAwX2xvY2FsX2ljYWNoZV9pbnZfcmFuZ2VfcmVnX2VuZAorCWJlcQlkZWJ1Z2dlcl9sb2NhbF9jYWNoZV9mbHVzaGludl9vbmVfZW5kCiAKIAlMT0NBTF9DTElfU0FWRShkMSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW16b25lLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAppbmRleCA5NjA4ZDJjLi5lNjdlYjljIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tbXpvbmUuaApAQCAtMTQsMTMgKzE0LDYgQEAKIAogI2RlZmluZSBOT0RFX0RBVEEobmlkKSAgICAgICAgICAoJm5vZGVfZGF0YVtuaWRdLnBnX2RhdGEpCiAKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXBnX2RhdGFfdCAqX19wZ2RhdCA9IE5PREVfREFUQShuaWQpOwkJCQlcCi0JX19wZ2RhdC0+bm9kZV9zdGFydF9wZm4gKyBfX3BnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXM7CQlcCi19KQotCiAvKiBXZSBoYXZlIHRoZXNlIHBvc3NpYmxlIG1lbW9yeSBtYXAgbGF5b3V0czoKICAqIEFzdHJvOiAwLTMuNzUsIDY3Ljc1LTY4LCA0LTY0CiAgKiB6eDE6IDAtMSwgMjU3LTI2MCwgNC0yNTYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUgYi9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCmluZGV4IDNkODBjM2UuLjEyZGE3N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZQpAQCAtMSw1ICsxLDQgQEAKIGFkZG5vdGUKLWR0YwogZW1wdHkuYwogaGFjay1jb2ZmCiBpbmZibG9jay5jCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjLy5naXRpZ25vcmUgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzNmOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1kdGMtbGV4ZXIubGV4LmMKLWR0Yy1wYXJzZXIudGFiLmMKLWR0Yy1wYXJzZXIudGFiLmgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwppbmRleCA0ZjY4NWE3Li45OGQ5NDI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCkBAIC0yMDksOCArMjA5LDEwIEBACiAJCQl3bTg3NzY6Y29kZWNAMWEgewogCQkJCWNvbXBhdGlibGUgPSAid2xmLHdtODc3NiI7CiAJCQkJcmVnID0gPDB4MWE+OwotCQkJCS8qIE1DTEsgc291cmNlIGlzIGEgc3RhbmQtYWxvbmUgb3NjaWxsYXRvciAqLwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMjI4ODAwMD47CisJCQkJLyoKKwkJCQkgKiBjbG9jay1mcmVxdWVuY3kgd2lsbCBiZSBzZXQgYnkgVS1Cb290IGlmCisJCQkJICogdGhlIGNsb2NrIGlzIGVuYWJsZWQuCisJCQkJICovCiAJCQl9OwogCQl9OwogCkBAIC0yODAsNyArMjgyLDggQEAKIAkJCWNvZGVjLWhhbmRsZSA9IDwmd204Nzc2PjsKIAkJCWZzbCxwbGF5YmFjay1kbWEgPSA8JmRtYTAwPjsKIAkJCWZzbCxjYXB0dXJlLWRtYSA9IDwmZG1hMDE+OwotCQkJZnNsLGZpZm8tZGVwdGggPSA8MTY+OworCQkJZnNsLGZpZm8tZGVwdGggPSA8MTU+OworCQkJZnNsLHNzaS1hc3luY2hyb25vdXM7CiAJCX07CiAKIAkJZG1hQGMzMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnCmluZGV4IDdmN2U0YTguLjIyZTcxOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcKQEAgLTg1LDcgKzg1LDcgQEAKIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0JFPXkKICMgQ09ORklHX1VTQl9PSENJX0hDRF9QQ0kgaXMgbm90IHNldAogQ09ORklHX1VTQl9TVE9SQUdFPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzPW0KIENPTkZJR19FWFQyX0ZTPW0KIENPTkZJR19FWFQzX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCmluZGV4IDY0NzIzMjIuLjE4NWMyOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwpAQCAtMTQxLDcgKzE0MSw3IEBACiAjIENPTkZJR19VU0JfRUhDSV9IQ0RfUFBDX09GIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9bQogQ09ORklHX1VTQl9TVE9SQUdFPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9QUzM9bQogQ09ORklHX0VYVDJfRlM9bQogQ09ORklHX0VYVDNfRlM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwppbmRleCBjOWYyMTJiLi44MGJjNWRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwpAQCAtMTQ4LDcgKzE0OCw2IEBACiBDT05GSUdfU0NTSV9DWEdCM19JU0NTST1tCiBDT05GSUdfU0NTSV9DWEdCNF9JU0NTST1tCiBDT05GSUdfU0NTSV9CTlgyX0lTQ1NJPW0KLUNPTkZJR19TQ1NJX0JOWDJfSVNDU0k9bQogQ09ORklHX0JFMklTQ1NJPW0KIENPTkZJR19TQ1NJX0lCTVZTQ1NJPXkKIENPTkZJR19TQ1NJX0lCTVZGQz1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW16b25lLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggZmQzZmQ1OC4uN2I1ODkxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXpvbmUuaApAQCAtMzgsMTMgKzM4LDYgQEAKICNkZWZpbmUgbWVtb3J5X2hvdHBsdWdfbWF4KCkgbWVtYmxvY2tfZW5kX29mX0RSQU0oKQogI2VuZGlmCiAKLS8qCi0gKiBGb2xsb3dpbmcgYXJlIG1hY3JvcyB0aGF0IGVhY2ggbnVtYSBpbXBsbWVudGF0aW9uIG11c3QgZGVmaW5lLgotICovCi0KLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfZW5kX3BmbikKLQogI2Vsc2UKICNkZWZpbmUgbWVtb3J5X2hvdHBsdWdfbWF4KCkgbWVtYmxvY2tfZW5kX29mX0RSQU0oKQogI2VuZGlmIC8qIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmlvLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmlvLmgKaW5kZXggZDkwMmFiZC4uYjFkMmRlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Jpby5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yaW8uaApAQCAtMTQsNyArMTQsNyBAQAogI2RlZmluZSBBU01fUFBDX1JJT19ICiAKIGV4dGVybiB2b2lkIHBsYXRmb3JtX3Jpb19pbml0KHZvaWQpOwotI2lmZGVmIENPTkZJR19SQVBJRElPCisjaWZkZWYgQ09ORklHX0ZTTF9SSU8KIGV4dGVybiBpbnQgZnNsX3Jpb19tY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICopOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGZzbF9yaW9fbWNoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykge3JldHVybiAwOyB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggMzRkMjcyMi4uOWZiOTMzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMTk3OSw3ICsxOTc5LDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMjQwMDAwLAogCQkuY3B1X25hbWUJCT0gImU1NTAwIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19FNTUwMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFIHwgUFBDX0ZFQVRVUkVfSEFTX0ZQVSwKIAkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSX1RZUEVfRlNMX0UgfCBNTVVfRlRSX0JJR19QSFlTIHwKIAkJCU1NVV9GVFJfVVNFX1RMQklMWCwKIAkJLmljYWNoZV9ic2l6ZQkJPSA2NCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggZjJjOTA2Yi4uOGMzMTEyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTgyLDExICs4MiwyOSBAQAogfQogZWFybHlfcGFyYW0oIm1lbSIsIGVhcmx5X3BhcnNlX21lbSk7CiAKKy8qCisgKiBvdmVybGFwc19pbml0cmQgLSBjaGVjayBmb3Igb3ZlcmxhcCB3aXRoIHBhZ2UgYWxpZ25lZCBleHRlbnNpb24gb2YKKyAqIGluaXRyZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb3ZlcmxhcHNfaW5pdHJkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwlpZiAoIWluaXRyZF9zdGFydCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4JKHN0YXJ0ICsgc2l6ZSkgPiBfQUxJR05fRE9XTihpbml0cmRfc3RhcnQsIFBBR0VfU0laRSkgJiYKKwkJCXN0YXJ0IDw9IF9BTElHTl9VUChpbml0cmRfZW5kLCBQQUdFX1NJWkUpOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiAvKioKICAqIG1vdmVfZGV2aWNlX3RyZWUgLSBtb3ZlIHRyZWUgdG8gYW4gdW51c2VkIGFyZWEsIGlmIG5lZWRlZC4KICAqCiAgKiBUaGUgZGV2aWNlIHRyZWUgbWF5IGJlIGFsbG9jYXRlZCBiZXlvbmQgb3VyIG1lbW9yeSBsaW1pdCwgb3IgaW5zaWRlIHRoZQotICogY3Jhc2gga2VybmVsIHJlZ2lvbiBmb3Iga2R1bXAuIElmIHNvLCBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5LgorICogY3Jhc2gga2VybmVsIHJlZ2lvbiBmb3Iga2R1bXAsIG9yIHdpdGhpbiB0aGUgcGFnZSBhbGlnbmVkIHJhbmdlIG9mIGluaXRyZC4KKyAqIElmIHNvLCBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5LgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbW92ZV9kZXZpY2VfdHJlZSh2b2lkKQogewpAQCAtOTksNyArMTE3LDggQEAKIAlzaXplID0gYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplKTsKIAogCWlmICgobWVtb3J5X2xpbWl0ICYmIChzdGFydCArIHNpemUpID4gUEhZU0lDQUxfU1RBUlQgKyBtZW1vcnlfbGltaXQpIHx8Ci0JCQlvdmVybGFwc19jcmFzaGtlcm5lbChzdGFydCwgc2l6ZSkpIHsKKwkJCW92ZXJsYXBzX2NyYXNoa2VybmVsKHN0YXJ0LCBzaXplKSB8fAorCQkJb3ZlcmxhcHNfaW5pdHJkKHN0YXJ0LCBzaXplKSkgewogCQlwID0gX192YShtZW1ibG9ja19hbGxvYyhzaXplLCBQQUdFX1NJWkUpKTsKIAkJbWVtY3B5KHAsIGluaXRpYWxfYm9vdF9wYXJhbXMsIHNpemUpOwogCQlpbml0aWFsX2Jvb3RfcGFyYW1zID0gKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqKXA7CkBAIC01NTUsNyArNTc0LDkgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAkvKiB0aGVuIHJlc2VydmUgdGhlIGluaXRyZCwgaWYgYW55ICovCiAJaWYgKGluaXRyZF9zdGFydCAmJiAoaW5pdHJkX2VuZCA+IGluaXRyZF9zdGFydCkpCi0JCW1lbWJsb2NrX3Jlc2VydmUoX19wYShpbml0cmRfc3RhcnQpLCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0KTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShfQUxJR05fRE9XTihfX3BhKGluaXRyZF9zdGFydCksIFBBR0VfU0laRSksCisJCQlfQUxJR05fVVAoaW5pdHJkX2VuZCwgUEFHRV9TSVpFKSAtCisJCQlfQUxJR05fRE9XTihpbml0cmRfc3RhcnQsIFBBR0VfU0laRSkpOwogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lOSVRSRCAqLwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMtcnRjLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMtcnRjLmMKaW5kZXggNzc1NzhjMC4uYzU3YzE5MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLXJ0Yy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KQEAgLTI5LDkgKzMwLDEwIEBACiAJCX0KIAl9IHdoaWxlICh3YWl0X3RpbWUgJiYgKGdldF90YigpIDwgbWF4X3dhaXRfdGIpKTsKIAotCWlmIChlcnJvciAhPSAwICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlcnJvcjogcmVhZGluZyB0aGUgY2xvY2sgZmFpbGVkICglZClcbiIsCi0JCQllcnJvcik7CisJaWYgKGVycm9yICE9IDApIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORworCQkJCSAgICJlcnJvcjogcmVhZGluZyB0aGUgY2xvY2sgZmFpbGVkICglZClcbiIsCisJCQkJICAgZXJyb3IpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU1LDE5ICs1NywyMSBAQAogCiAJCXdhaXRfdGltZSA9IHJ0YXNfYnVzeV9kZWxheV90aW1lKGVycm9yKTsKIAkJaWYgKHdhaXRfdGltZSkgewotCQkJaWYgKGluX2ludGVycnVwdCgpICYmIHByaW50a19yYXRlbGltaXQoKSkgeworCQkJaWYgKGluX2ludGVycnVwdCgpKSB7CiAJCQkJbWVtc2V0KHJ0Y190bSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOwotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVycm9yOiByZWFkaW5nIGNsb2NrIgotCQkJCSAgICAgICAiIHdvdWxkIGRlbGF5IGludGVycnVwdFxuIik7CisJCQkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORworCQkJCQkJICAgImVycm9yOiByZWFkaW5nIGNsb2NrICIKKwkJCQkJCSAgICJ3b3VsZCBkZWxheSBpbnRlcnJ1cHRcbiIpOwogCQkJCXJldHVybjsJLyogZGVsYXkgbm90IGFsbG93ZWQgKi8KIAkJCX0KIAkJCW1zbGVlcCh3YWl0X3RpbWUpOwogCQl9CiAJfSB3aGlsZSAod2FpdF90aW1lICYmIChnZXRfdGIoKSA8IG1heF93YWl0X3RiKSk7CiAKLSAgICAgICAgaWYgKGVycm9yICE9IDAgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3I6IHJlYWRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyb3IpOworCWlmIChlcnJvciAhPSAwKSB7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcKKwkJCQkgICAiZXJyb3I6IHJlYWRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLAorCQkJCSAgIGVycm9yKTsKIAkJcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTk5LDkgKzEwMywxMCBAQAogCQl9CiAJfSB3aGlsZSAod2FpdF90aW1lICYmIChnZXRfdGIoKSA8IG1heF93YWl0X3RiKSk7CiAKLSAgICAgICAgaWYgKGVycm9yICE9IDAgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImVycm9yOiBzZXR0aW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycm9yKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORworCQkJCSAgICJlcnJvcjogc2V0dGluZyB0aGUgY2xvY2sgZmFpbGVkICglZClcbiIsCisJCQkJICAgZXJyb3IpOwogCiAgICAgICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKaW5kZXggYjk2YTNhMC4uNzhiNzZkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtODkyLDExICs4OTMsMTIgQEAKIAlwcmludGsoImJhZGZyYW1lIGluIGhhbmRsZV9ydF9zaWduYWwsIHJlZ3M9JXAgZnJhbWU9JXAgbmV3c3A9JWx4XG4iLAogCSAgICAgICByZWdzLCBmcmFtZSwgbmV3c3ApOwogI2VuZGlmCi0JaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiBoYW5kbGVfcnRfc2lnbmFsMzI6ICIKLQkJCSIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCi0JCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCi0JCQlhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCisJCQkJICAgIiVzWyVkXTogYmFkIGZyYW1lIGluIGhhbmRsZV9ydF9zaWduYWwzMjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIGFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC0xMDU4LDExICsxMDYwLDEyIEBACiAJcmV0dXJuIDA7CiAKICBiYWQ6Ci0JaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiBzeXNfcnRfc2lncmV0dXJuOiAiCi0JCQkiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJcnRfc2YsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkgICAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3J0X3NpZ3JldHVybjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIHJ0X3NmLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtMTE0OSwxMiArMTE1MiwxMiBAQAogCSAqIFdlIGtpbGwgdGhlIHRhc2sgd2l0aCBhIFNJR1NFR1YgaW4gdGhpcyBzaXR1YXRpb24uCiAJICovCiAJaWYgKGRvX3NldGNvbnRleHQoY3R4LCByZWdzLCAxKSkgewotCQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiAiCi0JCQkJInN5c19kZWJ1Z19zZXRjb250ZXh0OiAlcCBuaXAgJTA4bHggIgotCQkJCSJsciAlMDhseFxuIiwKLQkJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCi0JCQkJY3R4LCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKKwkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8gIiVzWyVkXTogYmFkIGZyYW1lIGluICIKKwkJCQkJICAgInN5c19kZWJ1Z19zZXRjb250ZXh0OiAlcCBuaXAgJTA4bHggIgorCQkJCQkgICAibHIgJTA4bHhcbiIsCisJCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkJICAgY3R4LCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAkJZ290byBvdXQ7CkBAIC0xMjM2LDExICsxMjM5LDEyIEBACiAJcHJpbnRrKCJiYWRmcmFtZSBpbiBoYW5kbGVfc2lnbmFsLCByZWdzPSVwIGZyYW1lPSVwIG5ld3NwPSVseFxuIiwKIAkgICAgICAgcmVncywgZnJhbWUsIG5ld3NwKTsKICNlbmRpZgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gaGFuZGxlX3NpZ25hbDMyOiAiCi0JCQkiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkgICAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gaGFuZGxlX3NpZ25hbDMyOiAiCisJCQkJICAgIiVwIG5pcCAlMDhseCBsciAlMDhseFxuIiwKKwkJCQkgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkJICAgZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC0xMjg4LDExICsxMjkyLDEyIEBACiAJcmV0dXJuIDA7CiAKIGJhZGZyYW1lOgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3NpZ3JldHVybjogIgotCQkJIiVwIG5pcCAlMDhseCBsciAlMDhseFxuIiwKLQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKLQkJCWFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkgICAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3NpZ3JldHVybjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIGFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwppbmRleCBkYTk4OWZmLi5lOTFjNzM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CkBAIC0zODAsMTAgKzM4MSwxMCBAQAogCXByaW50aygiYmFkZnJhbWUgaW4gc3lzX3J0X3NpZ3JldHVybiwgcmVncz0lcCB1Yz0lcCAmdWMtPnVjX21jb250ZXh0PSVwXG4iLAogCSAgICAgICByZWdzLCB1YywgJnVjLT51Y19tY29udGV4dCk7CiAjZW5kaWYKLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAicnRfc2lncmV0dXJuIiwKLQkJCShsb25nKXVjLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQocmVncy0+bXNyICYgTVNSXzY0QklUID8gZm10NjQgOiBmbXQzMiwKKwkJCQkgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsICJydF9zaWdyZXR1cm4iLAorCQkJCSAgIChsb25nKXVjLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtNDY4LDEwICs0NjksMTAgQEAKIAlwcmludGsoImJhZGZyYW1lIGluIHNldHVwX3J0X2ZyYW1lLCByZWdzPSVwIGZyYW1lPSVwIG5ld3NwPSVseFxuIiwKIAkgICAgICAgcmVncywgZnJhbWUsIG5ld3NwKTsKICNlbmRpZgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCi0JCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsICJzZXR1cF9ydF9mcmFtZSIsCi0JCQkobG9uZylmcmFtZSwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKKwlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAic2V0dXBfcnRfZnJhbWUiLAorCQkJCSAgIChsb25nKWZyYW1lLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnc2VndihzaWduciwgY3VycmVudCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggMGZmNGFiOS4uMWEwMTQxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9lbXVsYXRlZF9vcHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMTk3LDEyICsxOTgsMTEgQEAKIAkJaWYgKGRpZSgiRXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlIiwgcmVncywgc2lnbnIpKQogCQkJcmV0dXJuOwogCX0gZWxzZSBpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJgotCQkgICAgdW5oYW5kbGVkX3NpZ25hbChjdXJyZW50LCBzaWducikgJiYKLQkJICAgIHByaW50a19yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCi0JCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBzaWduciwKLQkJCQlhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmssIGNvZGUpOwotCQl9CisJCSAgIHVuaGFuZGxlZF9zaWduYWwoY3VycmVudCwgc2lnbnIpKSB7CisJCXByaW50a19yYXRlbGltaXRlZChyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAorCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc2lnbnIsCisJCQkJICAgYWRkciwgcmVncy0+bmlwLCByZWdzLT5saW5rLCBjb2RlKTsKKwl9CiAKIAltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CiAJaW5mby5zaV9zaWdubyA9IHNpZ25yOwpAQCAtNDI1LDcgKzQyNSw3IEBACiAJdW5zaWduZWQgbG9uZyByZWFzb24gPSBtY3NyOwogCWludCByZWNvdmVyYWJsZSA9IDE7CiAKLQlpZiAocmVhc29uICYgTUNTUl9CVVNfUkJFUlIpIHsKKwlpZiAocmVhc29uICYgTUNTUl9MRCkgewogCQlyZWNvdmVyYWJsZSA9IGZzbF9yaW9fbWNoZWNrX2V4Y2VwdGlvbihyZWdzKTsKIAkJaWYgKHJlY292ZXJhYmxlID09IDEpCiAJCQlnb3RvIHNpbGVudF9vdXQ7CkBAIC0xMzQyLDkgKzEzNDIsOCBAQAogCX0gZWxzZSB7CiAJCS8qIGRpZG4ndCByZWNvZ25pemUgdGhlIGluc3RydWN0aW9uICovCiAJCS8qIFhYWCBxdWljayBoYWNrIGZvciBub3c6IHNldCB0aGUgbm9uLUphdmEgYml0IGluIHRoZSBWU0NSICovCi0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgIlVucmVjb2duaXplZCBhbHRpdmVjIGluc3RydWN0aW9uICIKLQkJCSAgICAgICAiaW4gJXMgYXQgJWx4XG4iLCBjdXJyZW50LT5jb21tLCByZWdzLT5uaXApOworCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9FUlIgIlVucmVjb2duaXplZCBhbHRpdmVjIGluc3RydWN0aW9uICIKKwkJCQkgICAiaW4gJXMgYXQgJWx4XG4iLCBjdXJyZW50LT5jb21tLCByZWdzLT5uaXApOwogCQljdXJyZW50LT50aHJlYWQudnNjci51WzNdIHw9IDB4MTAwMDA7CiAJfQogfQpAQCAtMTU0OCw5ICsxNTQ3LDggQEAKIAogdm9pZCBwcGNfd2Fybl9lbXVsYXRlZF9wcmludChjb25zdCBjaGFyICp0eXBlKQogewotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByX3dhcm5pbmcoIiVzIHVzZWQgZW11bGF0ZWQgJXMgaW5zdHJ1Y3Rpb25cbiIsIGN1cnJlbnQtPmNvbW0sCi0JCQkgICB0eXBlKTsKKwlwcl93YXJuX3JhdGVsaW1pdGVkKCIlcyB1c2VkIGVtdWxhdGVkICVzIGluc3RydWN0aW9uXG4iLCBjdXJyZW50LT5jb21tLAorCQkJICAgIHR5cGUpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwcGNfd2Fybl9lbXVsYXRlZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCmluZGV4IDU0ZjRmYjkuLmFkMzVmNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMzQ2LDExICszNDcsMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGlzX2V4ZWMgJiYgKGVycm9yX2NvZGUgJiBEU0lTUl9QUk9URkFVTFQpCi0JICAgICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fQ1JJVCAia2VybmVsIHRyaWVkIHRvIGV4ZWN1dGUgTlgtcHJvdGVjdGVkIgotCQkgICAgICAgIiBwYWdlICglbHgpIC0gZXhwbG9pdCBhdHRlbXB0PyAodWlkOiAlZClcbiIsCi0JCSAgICAgICBhZGRyZXNzLCBjdXJyZW50X3VpZCgpKTsKKwlpZiAoaXNfZXhlYyAmJiAoZXJyb3JfY29kZSAmIERTSVNSX1BST1RGQVVMVCkpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0NSSVQgImtlcm5lbCB0cmllZCB0byBleGVjdXRlIE5YLXByb3RlY3RlZCIKKwkJCQkgICAiIHBhZ2UgKCVseCkgLSBleHBsb2l0IGF0dGVtcHQ/ICh1aWQ6ICVkKVxuIiwKKwkJCQkgICBhZGRyZXNzLCBjdXJyZW50X3VpZCgpKTsKIAogCXJldHVybiBTSUdTRUdWOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCBkNjViNTkxLi41ZGUwZjI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTIyMywyMSArMjIzLDYgQEAKICN1bmRlZiBGUkVFU0VDCiB9CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLXZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCWlmIChzdGFydCA8IGVuZCkKLQkJcHJpbnRrICgiRnJlZWluZyBpbml0cmQgbWVtb3J5OiAlbGRrIGZyZWVkXG4iLCAoZW5kIC0gc3RhcnQpID4+IDEwKTsKLQlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkgewotCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKLQkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShzdGFydCkpOwotCQlmcmVlX3BhZ2Uoc3RhcnQpOwotCQl0b3RhbHJhbV9wYWdlcysrOwotCX0KLX0KLSNlbmRpZgotCi0KICNpZmRlZiBDT05GSUdfOHh4IC8qIE5vIDh4eCBzcGVjaWZpYyAuYyBmaWxlIHRvIHB1dCB0aGF0IGluIC4uLiAqLwogdm9pZCBzZXR1cF9pbml0aWFsX21lbW9yeV9saW1pdChwaHlzX2FkZHJfdCBmaXJzdF9tZW1ibG9ja19iYXNlLAogCQkJCXBoeXNfYWRkcl90IGZpcnN0X21lbWJsb2NrX3NpemUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwppbmRleCA2Mzc0YjIxLi5mNmRiYjRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKQEAgLTk5LDIwICs5OSw2IEBACiAJCSgodW5zaWduZWQgbG9uZylfX2luaXRfZW5kIC0gKHVuc2lnbmVkIGxvbmcpX19pbml0X2JlZ2luKSA+PiAxMCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLXZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCWlmIChzdGFydCA8IGVuZCkKLQkJcHJpbnRrICgiRnJlZWluZyBpbml0cmQgbWVtb3J5OiAlbGRrIGZyZWVkXG4iLCAoZW5kIC0gc3RhcnQpID4+IDEwKTsKLQlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkgewotCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKLQkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShzdGFydCkpOwotCQlmcmVlX3BhZ2Uoc3RhcnQpOwotCQl0b3RhbHJhbV9wYWdlcysrOwotCX0KLX0KLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBwZ2RfY3Rvcih2b2lkICphZGRyKQogewogCW1lbXNldChhZGRyLCAwLCBQR0RfVEFCTEVfU0laRSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggNTdlNTQ1Yi4uMjlkNGRkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtMzgyLDYgKzM4MiwyNSBAQAogCW1lbV9pbml0X2RvbmUgPSAxOwogfQogCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECit2b2lkIF9faW5pdCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaWYgKHN0YXJ0ID49IGVuZCkKKwkJcmV0dXJuOworCisJc3RhcnQgPSBfQUxJR05fRE9XTihzdGFydCwgUEFHRV9TSVpFKTsKKwllbmQgPSBfQUxJR05fVVAoZW5kLCBQQUdFX1NJWkUpOworCXByX2luZm8oIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisKKwlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKKwkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShzdGFydCkpOworCQlmcmVlX3BhZ2Uoc3RhcnQpOworCQl0b3RhbHJhbV9wYWdlcysrOworCX0KK30KKyNlbmRpZgorCiAvKgogICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHBhZ2UgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIGtlcm5lbC4KICAqIEl0IGp1c3QgbWFya3MgdGhlIHBhZ2UgYXMgbm90IGktY2FjaGUgY2xlYW4uICBXZSBkbyB0aGUgaS1jYWNoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKaW5kZXggOTA4OWIwNC4uNzY2N2RiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCkBAIC03MTUsNyArNzE1LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9wbWFjcGljX3N5c2NvcmUodm9pZCkKIHsKLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcG1hY3BpY19zeXNjb3JlX29wcyk7CisJaWYgKHBtYWNfaXJxX2h3WzBdKQorCQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcG1hY3BpY19zeXNjb3JlX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMKaW5kZXggMzM4NjdlYy4uOWQ2YThlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vcFNlcmllc19yZWNvbmZpZy5oPgpAQCAtMjAsMjQgKzIyLDI1IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbWVtYmxvY2tfc2l6ZSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdW5zaWduZWQgaW50IG1lbWJsb2NrX3NpemUgPSAwOworCXVuc2lnbmVkIGludCBtZW1ibG9ja19zaXplID0gTUlOX01FTU9SWV9CTE9DS19TSVpFOworCXN0cnVjdCByZXNvdXJjZSByOwogCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkiKTsKIAlpZiAobnApIHsKLQkJY29uc3QgdW5zaWduZWQgbG9uZyAqc2l6ZTsKKwkJY29uc3QgX19iZTY0ICpzaXplOwogCiAJCXNpemUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0sbG1iLXNpemUiLCBOVUxMKTsKLQkJbWVtYmxvY2tfc2l6ZSA9IHNpemUgPyAqc2l6ZSA6IDA7Ci0KKwkJaWYgKHNpemUpCisJCQltZW1ibG9ja19zaXplID0gYmU2NF90b19jcHVwKHNpemUpOwogCQlvZl9ub2RlX3B1dChucCk7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgIGlmIChtYWNoaW5lX2lzKHBzZXJpZXMpKSB7CisJCS8qIFRoaXMgZmFsbGJhY2sgcmVhbGx5IG9ubHkgYXBwbGllcyB0byBwc2VyaWVzICovCiAJCXVuc2lnbmVkIGludCBtZW16ZXJvX3NpemUgPSAwOwotCQljb25zdCB1bnNpZ25lZCBpbnQgKnJlZ3M7CiAKIAkJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL21lbW9yeUAwIik7CiAJCWlmIChucCkgewotCQkJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQkJbWVtemVyb19zaXplID0gcmVncyA/IHJlZ3NbM10gOiAwOworCQkJaWYgKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpCisJCQkJbWVtemVyb19zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcik7CiAJCQlvZl9ub2RlX3B1dChucCk7CiAJCX0KIApAQCAtNTAsMTYgKzUzLDIxIEBACiAJCQlzcHJpbnRmKGJ1ZiwgIi9tZW1vcnlAJXgiLCBtZW16ZXJvX3NpemUpOwogCQkJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChidWYpOwogCQkJaWYgKG5wKSB7Ci0JCQkJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQkJCW1lbWJsb2NrX3NpemUgPSByZWdzID8gcmVnc1szXSA6IDA7CisJCQkJaWYgKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpCisJCQkJCW1lbWJsb2NrX3NpemUgPSByZXNvdXJjZV9zaXplKCZyKTsKIAkJCQlvZl9ub2RlX3B1dChucCk7CiAJCQl9CiAJCX0KIAl9Ci0KIAlyZXR1cm4gbWVtYmxvY2tfc2l6ZTsKIH0KIAorLyogV0FSTklORzogVGhpcyBpcyBnb2luZyB0byBvdmVycmlkZSB0aGUgZ2VuZXJpYyBkZWZpbml0aW9uIHdoZW5ldmVyCisgKiBwc2VyaWVzIGlzIGJ1aWx0LWluIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBwbGF0Zm9ybSBpcyBhY3RpdmUgYXQgYm9vdAorICogdGltZS4gVGhpcyBpcyBmaW5lIGZvciBub3cgYXMgdGhpcyBpcyB0aGUgb25seSAib3B0aW9uIiBhbmQgaXQKKyAqIHNob3VsZCB3b3JrIGV2ZXJ5d2hlcmUuIElmIG5vdCwgd2UnbGwgaGF2ZSB0byB0dXJuIHRoaXMgaW50byBhCisgKiBwcGNfbWQuIGNhbGxiYWNrCisgKi8KIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2Jsb2NrX3NpemVfYnl0ZXModm9pZCkKIHsKIAlyZXR1cm4gZ2V0X21lbWJsb2NrX3NpemUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKaW5kZXggMDYwOGIxNi4uZDkxNzU3MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKQEAgLTE5Niw5ICsxOTYsNiBAQAogCW91dF9iZTMyKCZsYmMtPmx0ZWNjciwgTFRFQ0NSX0NMRUFSKTsKIAlvdXRfYmUzMigmbGJjLT5sdGVkciwgTFRFRFJfRU5BQkxFKTsKIAotCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBhbnkgZGV0ZWN0ZWQgZXZlbnRzICovCi0Jb3V0X2JlMzIoJmxiYy0+bHRlaXIsIExURUlSX0VOQUJMRSk7Ci0KIAkvKiBTZXQgdGhlIG1vbml0b3IgdGltZW91dCB2YWx1ZSB0byB0aGUgbWF4aW11bSBmb3IgZXJyYXR1bSBBMDAxICovCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJmc2wsZWxiYyIpKQogCQljbHJzZXRiaXRzX2JlMzIoJmxiYy0+bGJjciwgTEJDUl9CTVQsIExCQ1JfQk1UUFMpOwpAQCAtMzIyLDYgKzMxOSw5IEBACiAJCWdvdG8gZXJyOwogCX0KIAorCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBhbnkgZGV0ZWN0ZWQgZXZlbnRzICovCisJb3V0X2JlMzIoJmZzbF9sYmNfY3RybF9kZXYtPnJlZ3MtPmx0ZWlyLCBMVEVJUl9FTkFCTEUpOworCiAJcmV0dXJuIDA7CiAKIGVycjoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKaW5kZXggNWIyMDZhMi4uYjNmZDA4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKQEAgLTI4MywyMyArMjgzLDI0IEBACiAjaWZkZWYgQ09ORklHX0U1MDAKIGludCBmc2xfcmlvX21jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZW50cnkgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcmVhc29uID0gbWZzcHIoU1BSTl9NQ1NSKTsKKwljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIHJlYXNvbjsKIAotCWlmIChyZWFzb24gJiBNQ1NSX0JVU19SQkVSUikgewotCQlyZWFzb24gPSBpbl9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKSk7Ci0JCWlmIChyZWFzb24gJiAoUklPX0xUTEVEQ1NSX0lFUiB8IFJJT19MVExFRENTUl9QUlQpKSB7Ci0JCQkvKiBDaGVjayBpZiB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMgZmF1bHQgKi8KLQkJCWVudHJ5ID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+bmlwKTsKLQkJCWlmIChlbnRyeSkgewotCQkJCXByX2RlYnVnKCJSSU86ICVzIC0gTUMgRXhjZXB0aW9uIGhhbmRsZWRcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJb3V0X2JlMzIoKHUzMiAqKShyaW9fcmVnc193aW4gKyBSSU9fTFRMRURDU1IpLAotCQkJCQkgMCk7Ci0JCQkJcmVncy0+bXNyIHw9IE1TUl9SSTsKLQkJCQlyZWdzLT5uaXAgPSBlbnRyeS0+Zml4dXA7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9CisJaWYgKCFyaW9fcmVnc193aW4pCisJCXJldHVybiAwOworCisJcmVhc29uID0gaW5fYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19MVExFRENTUikpOworCWlmIChyZWFzb24gJiAoUklPX0xUTEVEQ1NSX0lFUiB8IFJJT19MVExFRENTUl9QUlQpKSB7CisJCS8qIENoZWNrIGlmIHdlIGFyZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBmYXVsdCAqLworCQllbnRyeSA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPm5pcCk7CisJCWlmIChlbnRyeSkgeworCQkJcHJfZGVidWcoIlJJTzogJXMgLSBNQyBFeGNlcHRpb24gaGFuZGxlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJb3V0X2JlMzIoKHUzMiAqKShyaW9fcmVnc193aW4gKyBSSU9fTFRMRURDU1IpLAorCQkJCSAwKTsKKwkJCXJlZ3MtPm1zciB8PSBNU1JfUkk7CisJCQlyZWdzLT5uaXAgPSBlbnRyeS0+Zml4dXA7CisJCQlyZXR1cm4gMTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwppbmRleCAzYThkZTViLi41OGQ3YTUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KQEAgLTE2NDgsOSArMTY0OSw4IEBACiAJCXJldHVybiBOT19JUlE7CiAJfQogCWlmICh1bmxpa2VseShtcGljLT5wcm90ZWN0ZWQgJiYgdGVzdF9iaXQoc3JjLCBtcGljLT5wcm90ZWN0ZWQpKSkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEdvdCBwcm90ZWN0ZWQgc291cmNlICVkICFcbiIsCi0JCQkgICAgICAgbXBpYy0+bmFtZSwgKGludClzcmMpOworCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HICIlczogR290IHByb3RlY3RlZCBzb3VyY2UgJWQgIVxuIiwKKwkJCQkgICBtcGljLT5uYW1lLCAoaW50KXNyYyk7CiAJCW1waWNfZW9pKG1waWMpOwogCQlyZXR1cm4gTk9fSVJROwogCX0KQEAgLTE2ODgsOSArMTY4OCw4IEBACiAJCXJldHVybiBOT19JUlE7CiAJfQogCWlmICh1bmxpa2VseShtcGljLT5wcm90ZWN0ZWQgJiYgdGVzdF9iaXQoc3JjLCBtcGljLT5wcm90ZWN0ZWQpKSkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEdvdCBwcm90ZWN0ZWQgc291cmNlICVkICFcbiIsCi0JCQkgICAgICAgbXBpYy0+bmFtZSwgKGludClzcmMpOworCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HICIlczogR290IHByb3RlY3RlZCBzb3VyY2UgJWQgIVxuIiwKKwkJCQkgICBtcGljLT5uYW1lLCAoaW50KXNyYyk7CiAJCXJldHVybiBOT19JUlE7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDlmYWIyYWEuLmMwM2ZlZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC04OSw2ICs4OSw3IEBACiAJc2VsZWN0IEhBVkVfR0VUX1VTRVJfUEFHRVNfRkFTVAogCXNlbGVjdCBIQVZFX0FSQ0hfTVVURVhfQ1BVX1JFTEFYCiAJc2VsZWN0IEhBVkVfQVJDSF9KVU1QX0xBQkVMIGlmICFNQVJDSF9HNQorCXNlbGVjdCBIQVZFX1JDVV9UQUJMRV9GUkVFIGlmIFNNUAogCXNlbGVjdCBBUkNIX0lOTElORV9TUElOX1RSWUxPQ0sKIAlzZWxlY3QgQVJDSF9JTkxJTkVfU1BJTl9UUllMT0NLX0JICiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1NQSU5fTE9DSwpAQCAtNTc4LDYgKzU3OSw3IEBACiAJZGVmX2Jvb2wgeQogCXByb21wdCAiczM5MCBndWVzdCBzdXBwb3J0IGZvciBLVk0gKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiA2NEJJVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgVklSVFVBTElaQVRJT04KIAlzZWxlY3QgVklSVElPCiAJc2VsZWN0IFZJUlRJT19SSU5HCiAJc2VsZWN0IFZJUlRJT19DT05TT0xFCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCBmNjMxNGFmLi4zOGU3MWViIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTE3LDE1ICsxNywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKLSNkZWZpbmUgY2hlY2tfcGd0X2NhY2hlKCkJZG8ge30gd2hpbGUgKDApCi0KIHVuc2lnbmVkIGxvbmcgKmNyc3RfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqKTsKIHZvaWQgY3JzdF90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyAqKTsKLXZvaWQgY3JzdF90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7CiAKIHVuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqKTsKIHZvaWQgcGFnZV90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyAqKTsKLXZvaWQgcGFnZV90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKK3ZvaWQgcGFnZV90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW11X2dhdGhlciAqLCB1bnNpZ25lZCBsb25nICopOwordm9pZCBfX3RsYl9yZW1vdmVfdGFibGUodm9pZCAqX3RhYmxlKTsKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfdGFibGUodW5zaWduZWQgbG9uZyAqcywgdW5zaWduZWQgbG9uZyB2YWwsIHNpemVfdCBuKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggZTRlZmFjZi4uODAxZmJlMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yOTMsMTkgKzI5Myw2IEBACiAgKiBzd2FwIHB0ZSBpcyAxMDExIGFuZCAwMDAxLCAwMDExLCAwMTAxLCAwMTExIGFyZSBpbnZhbGlkLgogICovCiAKLS8qIFBhZ2Ugc3RhdHVzIHRhYmxlIGJpdHMgZm9yIHZpcnR1YWxpemF0aW9uICovCi0jZGVmaW5lIFJDUF9BQ0NfQklUUwkweGYwMDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfRlBfQklUCTB4MDgwMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFJDUF9QQ0xfQklUCTB4MDA4MDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFJDUF9IUl9CSVQJMHgwMDQwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgUkNQX0hDX0JJVAkweDAwMjAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfR1JfQklUCTB4MDAwNDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFJDUF9HQ19CSVQJMHgwMDAyMDAwMDAwMDAwMDAwVUwKLQotLyogVXNlciBkaXJ0eSAvIHJlZmVyZW5jZWQgYml0IGZvciBLVk0ncyBtaWdyYXRpb24gZmVhdHVyZSAqLwotI2RlZmluZSBLVk1fVVJfQklUCTB4MDAwMDgwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIEtWTV9VQ19CSVQJMHgwMDAwNDAwMDAwMDAwMDAwVUwKLQogI2lmbmRlZiBfX3MzOTB4X18KIAogLyogQml0cyBpbiB0aGUgc2VnbWVudCB0YWJsZSBhZGRyZXNzLXNwYWNlLWNvbnRyb2wtZWxlbWVudCAqLwpAQCAtMzI1LDYgKzMxMiwxOSBAQAogI2RlZmluZSBfU0VHTUVOVF9FTlRSWQkJKF9TRUdNRU5UX0VOVFJZX1BUTCkKICNkZWZpbmUgX1NFR01FTlRfRU5UUllfRU1QVFkJKF9TRUdNRU5UX0VOVFJZX0lOVikKIAorLyogUGFnZSBzdGF0dXMgdGFibGUgYml0cyBmb3IgdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgUkNQX0FDQ19CSVRTCTB4ZjAwMDAwMDBVTAorI2RlZmluZSBSQ1BfRlBfQklUCTB4MDgwMDAwMDBVTAorI2RlZmluZSBSQ1BfUENMX0JJVAkweDAwODAwMDAwVUwKKyNkZWZpbmUgUkNQX0hSX0JJVAkweDAwNDAwMDAwVUwKKyNkZWZpbmUgUkNQX0hDX0JJVAkweDAwMjAwMDAwVUwKKyNkZWZpbmUgUkNQX0dSX0JJVAkweDAwMDQwMDAwVUwKKyNkZWZpbmUgUkNQX0dDX0JJVAkweDAwMDIwMDAwVUwKKworLyogVXNlciBkaXJ0eSAvIHJlZmVyZW5jZWQgYml0IGZvciBLVk0ncyBtaWdyYXRpb24gZmVhdHVyZSAqLworI2RlZmluZSBLVk1fVVJfQklUCTB4MDAwMDgwMDBVTAorI2RlZmluZSBLVk1fVUNfQklUCTB4MDAwMDQwMDBVTAorCiAjZWxzZSAvKiBfX3MzOTB4X18gKi8KIAogLyogQml0cyBpbiB0aGUgc2VnbWVudC9yZWdpb24gdGFibGUgYWRkcmVzcy1zcGFjZS1jb250cm9sLWVsZW1lbnQgKi8KQEAgLTM2Nyw2ICszNjcsMTkgQEAKICNkZWZpbmUgX1NFR01FTlRfRU5UUllfTEFSR0UJMHg0MDAJLyogU1RFLWZvcm1hdCBjb250cm9sLCBsYXJnZSBwYWdlICAgKi8KICNkZWZpbmUgX1NFR01FTlRfRU5UUllfQ08JMHgxMDAJLyogY2hhbmdlLXJlY29yZGluZyBvdmVycmlkZSAgICovCiAKKy8qIFBhZ2Ugc3RhdHVzIHRhYmxlIGJpdHMgZm9yIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIFJDUF9BQ0NfQklUUwkweGYwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfRlBfQklUCTB4MDgwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFJDUF9QQ0xfQklUCTB4MDA4MDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFJDUF9IUl9CSVQJMHgwMDQwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0hDX0JJVAkweDAwMjAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfR1JfQklUCTB4MDAwNDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFJDUF9HQ19CSVQJMHgwMDAyMDAwMDAwMDAwMDAwVUwKKworLyogVXNlciBkaXJ0eSAvIHJlZmVyZW5jZWQgYml0IGZvciBLVk0ncyBtaWdyYXRpb24gZmVhdHVyZSAqLworI2RlZmluZSBLVk1fVVJfQklUCTB4MDAwMDgwMDAwMDAwMDAwMFVMCisjZGVmaW5lIEtWTV9VQ19CSVQJMHgwMDAwNDAwMDAwMDAwMDAwVUwKKwogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKaW5kZXggMzUwZTdlZS4uMTVjOTc2MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCkBAIC0xMzksMTEwICsxMzksNDcgQEAKIAlzdHJ1Y3Qgc2xpYmUgc2xpYmVbUURJT19NQVhfQlVGRkVSU19QRVJfUV07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoMjA0OCkpKTsKIAotLyoqCi0gKiBzdHJ1Y3Qgc2JhbF9mbGFncyAtIHN0b3JhZ2UgYmxvY2sgYWRkcmVzcyBsaXN0IGZsYWdzCi0gKiBAbGFzdDogbGFzdCBlbnRyeQotICogQGNvbnQ6IGNvbnRpZ3VvdXMgc3RvcmFnZQotICogQGZyYWc6IGZyYWdtZW50YXRpb24KLSAqLwotc3RydWN0IHNiYWxfZmxhZ3MgewotCXU4CTogMTsKLQl1OCBsYXN0IDogMTsKLQl1OCBjb250IDogMTsKLQl1OAk6IDE7Ci0JdTggZnJhZyA6IDI7Ci0JdTgJOiAyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZGVmaW5lIFNCQUxfRUZMQUdTX0xBU1RfRU5UUlkJCTB4NDAKKyNkZWZpbmUgU0JBTF9FRkxBR1NfQ09OVElHVU9VUwkJMHgyMAorI2RlZmluZSBTQkFMX0VGTEFHU19GSVJTVF9GUkFHCQkweDA0CisjZGVmaW5lIFNCQUxfRUZMQUdTX01JRERMRV9GUkFHCQkweDA4CisjZGVmaW5lIFNCQUxfRUZMQUdTX0xBU1RfRlJBRwkJMHgwYworI2RlZmluZSBTQkFMX0VGTEFHU19NQVNLCQkweDZmCiAKLSNkZWZpbmUgU0JBTF9GTEFHU19GSVJTVF9GUkFHCQkweDA0MDAwMDAwVUwKLSNkZWZpbmUgU0JBTF9GTEFHU19NSURETEVfRlJBRwkJMHgwODAwMDAwMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1NfTEFTVF9GUkFHCQkweDBjMDAwMDAwVUwKLSNkZWZpbmUgU0JBTF9GTEFHU19MQVNUX0VOVFJZCQkweDQwMDAwMDAwVUwKLSNkZWZpbmUgU0JBTF9GTEFHU19DT05USUdVT1VTCQkweDIwMDAwMDAwVUwKLQotI2RlZmluZSBTQkFMX0ZMQUdTMF9EQVRBX0NPTlRJTlVBVElPTgkweDIwVUwKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX1BDSV9SRVEJCTB4NDAKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX0RBVEFfQ09OVElOVUFUSU9OCTB4MjAKIAogLyogQXdlc29tZSBPcGVuRkNQIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgU0JBTF9GTEFHUzBfVFlQRV9TVEFUVVMJCTB4MDBVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFCQkweDA4VUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfVFlQRV9SRUFECQkweDEwVUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfVFlQRV9XUklURV9SRUFECTB4MThVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9NT1JFX1NCQUxTCQkweDA0VUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfQ09NTUFORAkJMHgwMlVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX0xBU1RfU0JBTAkJMHgwMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX09OTFlfU0JBTAkJU0JBTF9GTEFHUzBfQ09NTUFORAotI2RlZmluZSBTQkFMX0ZMQUdTMF9NSURETEVfU0JBTAkJU0JBTF9GTEFHUzBfTU9SRV9TQkFMUwotI2RlZmluZSBTQkFMX0ZMQUdTMF9GSVJTVF9TQkFMIFNCQUxfRkxBR1MwX01PUkVfU0JBTFMgfCBTQkFMX0ZMQUdTMF9DT01NQU5ECi0jZGVmaW5lIFNCQUxfRkxBR1MwX1BDSQkJCTB4NDAKLQotLyoqCi0gKiBzdHJ1Y3Qgc2JhbF9zYmFsZl8wIC0gc2JhbCBmbGFncyBmb3Igc2JhbGUgMAotICogQHBjaTogUENJIGluZGljYXRvcgotICogQGNvbnQ6IGRhdGEgY29udGludWF0aW9uCi0gKiBAc2J0eXBlOiBzdG9yYWdlLWJsb2NrIHR5cGUgKEZDUCkKLSAqLwotc3RydWN0IHNiYWxfc2JhbGZfMCB7Ci0JdTgJICA6IDE7Ci0JdTggcGNpCSAgOiAxOwotCXU4IGNvbnQgICA6IDE7Ci0JdTggc2J0eXBlIDogMjsKLQl1OAkgIDogMzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKioKLSAqIHN0cnVjdCBzYmFsX3NiYWxmXzEgLSBzYmFsIGZsYWdzIGZvciBzYmFsZSAxCi0gKiBAa2V5OiBzdG9yYWdlIGtleQotICovCi1zdHJ1Y3Qgc2JhbF9zYmFsZl8xIHsKLQl1OCAgICAgOiA0OwotCXU4IGtleSA6IDQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc2JhbF9zYmFsZl8xNCAtIHNiYWwgZmxhZ3MgZm9yIHNiYWxlIDE0Ci0gKiBAZXJyaWR4OiBlcnJvciBpbmRleAotICovCi1zdHJ1Y3Qgc2JhbF9zYmFsZl8xNCB7Ci0JdTgJICA6IDQ7Ci0JdTggZXJyaWR4IDogNDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKioKLSAqIHN0cnVjdCBzYmFsX3NiYWxmXzE1IC0gc2JhbCBmbGFncyBmb3Igc2JhbGUgMTUKLSAqIEByZWFzb246IHJlYXNvbiBmb3IgZXJyb3Igc3RhdGUKLSAqLwotc3RydWN0IHNiYWxfc2JhbGZfMTUgewotCXU4IHJlYXNvbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKioKLSAqIHVuaW9uIHNiYWxfc2JhbGYgLSBzdG9yYWdlIGJsb2NrIGFkZHJlc3MgbGlzdCBmbGFncwotICogQGkwOiBzYmFsZjAKLSAqIEBpMTogc2JhbGYxCi0gKiBAaTE0OiBzYmFsZjE0Ci0gKiBAaTE1OiBzYmxhZjE1Ci0gKiBAdmFsdWU6IHJhdyB2YWx1ZQotICovCi11bmlvbiBzYmFsX3NiYWxmIHsKLQlzdHJ1Y3Qgc2JhbF9zYmFsZl8wICBpMDsKLQlzdHJ1Y3Qgc2JhbF9zYmFsZl8xICBpMTsKLQlzdHJ1Y3Qgc2JhbF9zYmFsZl8xNCBpMTQ7Ci0Jc3RydWN0IHNiYWxfc2JhbGZfMTUgaTE1OwotCXU4IHZhbHVlOwotfTsKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX1RZUEVfU1RBVFVTCTB4MDAKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEUJCTB4MDgKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRAkJMHgxMAorI2RlZmluZSBTQkFMX1NGTEFHUzBfVFlQRV9XUklURV9SRUFECTB4MTgKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX01PUkVfU0JBTFMJCTB4MDQKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX0NPTU1BTkQJCTB4MDIKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX0xBU1RfU0JBTAkJMHgwMAorI2RlZmluZSBTQkFMX1NGTEFHUzBfT05MWV9TQkFMCQlTQkFMX1NGTEFHUzBfQ09NTUFORAorI2RlZmluZSBTQkFMX1NGTEFHUzBfTUlERExFX1NCQUwJU0JBTF9TRkxBR1MwX01PUkVfU0JBTFMKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX0ZJUlNUX1NCQUwgKFNCQUxfU0ZMQUdTMF9NT1JFX1NCQUxTIHwgU0JBTF9TRkxBR1MwX0NPTU1BTkQpCiAKIC8qKgogICogc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgLSBTQkFMIGVudHJ5Ci0gKiBAZmxhZ3M6IGZsYWdzCisgKiBAZWZsYWdzOiBTQkFMIGVudHJ5IGZsYWdzCisgKiBAc2NvdW50OiBTQkFMIGNvdW50CisgKiBAc2ZsYWdzOiB3aG9sZSBTQkFMIGZsYWdzCiAgKiBAbGVuZ3RoOiBsZW5ndGgKICAqIEBhZGRyOiBhZGRyZXNzCiAqLwogc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgewotCXUzMiBmbGFnczsKKwl1OCBlZmxhZ3M7CisJLyogcHJpdmF0ZTogKi8KKwl1OCByZXMxOworCS8qIHB1YmxpYzogKi8KKwl1OCBzY291bnQ7CisJdTggc2ZsYWdzOwogCXUzMiBsZW5ndGg7CiAjaWZkZWYgQ09ORklHXzMyQklUCiAJLyogcHJpdmF0ZTogKi8KLQl2b2lkICpyZXNlcnZlZDsKKwl2b2lkICpyZXMyOwogCS8qIHB1YmxpYzogKi8KICNlbmRpZgogCXZvaWQgKmFkZHI7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiLmgKaW5kZXggNzdlZWU1NC4uYzY4N2EyYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGIuaApAQCAtMjYsNjcgKzI2LDYwIEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAogc3RydWN0IG1tdV9nYXRoZXIgewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCisJc3RydWN0IG1tdV90YWJsZV9iYXRjaCAqYmF0Y2g7CisjZW5kaWYKIAl1bnNpZ25lZCBpbnQgZnVsbG1tOwotCXVuc2lnbmVkIGludCBucl9wdGVzOwotCXVuc2lnbmVkIGludCBucl9weGRzOwotCXVuc2lnbmVkIGludCBtYXg7Ci0Jdm9pZCAqKmFycmF5OwotCXZvaWQgKmxvY2FsWzhdOworCXVuc2lnbmVkIGludCBuZWVkX2ZsdXNoOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2FsbG9jX3BhZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYikKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9OT1dBSVQgfCBfX0dGUF9OT1dBUk4sIDApOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCitzdHJ1Y3QgbW11X3RhYmxlX2JhdGNoIHsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKwl1bnNpZ25lZCBpbnQJCW5yOworCXZvaWQJCQkqdGFibGVzWzBdOworfTsKIAotCWlmIChhZGRyKSB7Ci0JCXRsYi0+YXJyYXkgPSAodm9pZCAqKSBhZGRyOwotCQl0bGItPm1heCA9IFBBR0VfU0laRSAvIHNpemVvZih2b2lkICopOwotCX0KLX0KKyNkZWZpbmUgTUFYX1RBQkxFX0JBVENICQlcCisJKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IG1tdV90YWJsZV9iYXRjaCkpIC8gc2l6ZW9mKHZvaWQgKikpCisKK2V4dGVybiB2b2lkIHRsYl90YWJsZV9mbHVzaChzdHJ1Y3QgbW11X2dhdGhlciAqdGxiKTsKK2V4dGVybiB2b2lkIHRsYl9yZW1vdmVfdGFibGUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgdm9pZCAqdGFibGUpOworI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfZ2F0aGVyX21tdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLAogCQkJCSAgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICB1bnNpZ25lZCBpbnQgZnVsbF9tbV9mbHVzaCkKIHsKIAl0bGItPm1tID0gbW07Ci0JdGxiLT5tYXggPSBBUlJBWV9TSVpFKHRsYi0+bG9jYWwpOwotCXRsYi0+YXJyYXkgPSB0bGItPmxvY2FsOwogCXRsYi0+ZnVsbG1tID0gZnVsbF9tbV9mbHVzaDsKKwl0bGItPm5lZWRfZmx1c2ggPSAwOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCisJdGxiLT5iYXRjaCA9IE5VTEw7CisjZW5kaWYKIAlpZiAodGxiLT5mdWxsbW0pCiAJCV9fdGxiX2ZsdXNoX21tKG1tKTsKLQllbHNlCi0JCV9fdGxiX2FsbG9jX3BhZ2UodGxiKTsKLQl0bGItPm5yX3B0ZXMgPSAwOwotCXRsYi0+bnJfcHhkcyA9IHRsYi0+bWF4OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoX21tdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiKQogewotCWlmICghdGxiLT5mdWxsbW0gJiYgKHRsYi0+bnJfcHRlcyA+IDAgfHwgdGxiLT5ucl9weGRzIDwgdGxiLT5tYXgpKQotCQlfX3RsYl9mbHVzaF9tbSh0bGItPm1tKTsKLQl3aGlsZSAodGxiLT5ucl9wdGVzID4gMCkKLQkJcGFnZV90YWJsZV9mcmVlX3JjdSh0bGItPm1tLCB0bGItPmFycmF5Wy0tdGxiLT5ucl9wdGVzXSk7Ci0Jd2hpbGUgKHRsYi0+bnJfcHhkcyA8IHRsYi0+bWF4KQotCQljcnN0X3RhYmxlX2ZyZWVfcmN1KHRsYi0+bW0sIHRsYi0+YXJyYXlbdGxiLT5ucl9weGRzKytdKTsKKwlpZiAoIXRsYi0+bmVlZF9mbHVzaCkKKwkJcmV0dXJuOworCXRsYi0+bmVlZF9mbHVzaCA9IDA7CisJX190bGJfZmx1c2hfbW0odGxiLT5tbSk7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKKwl0bGJfdGFibGVfZmx1c2godGxiKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZpbmlzaF9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXRsYl9mbHVzaF9tbXUodGxiKTsKLQotCXJjdV90YWJsZV9mcmVlbGlzdF9maW5pc2goKTsKLQotCS8qIGtlZXAgdGhlIHBhZ2UgdGFibGUgY2FjaGUgd2l0aGluIGJvdW5kcyAqLwotCWNoZWNrX3BndF9jYWNoZSgpOwotCi0JaWYgKHRsYi0+YXJyYXkgIT0gdGxiLT5sb2NhbCkKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGxiLT5hcnJheSwgMCk7CiB9CiAKIC8qCkBAIC0xMTIsMTIgKzEwNSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwZ3RhYmxlX3QgcHRlLAogCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlpZiAoIXRsYi0+ZnVsbG1tKSB7Ci0JCXRsYi0+YXJyYXlbdGxiLT5ucl9wdGVzKytdID0gcHRlOwotCQlpZiAodGxiLT5ucl9wdGVzID49IHRsYi0+bnJfcHhkcykKLQkJCXRsYl9mbHVzaF9tbXUodGxiKTsKLQl9IGVsc2UKLQkJcGFnZV90YWJsZV9mcmVlKHRsYi0+bW0sICh1bnNpZ25lZCBsb25nICopIHB0ZSk7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKKwlpZiAoIXRsYi0+ZnVsbG1tKQorCQlyZXR1cm4gcGFnZV90YWJsZV9mcmVlX3JjdSh0bGIsICh1bnNpZ25lZCBsb25nICopIHB0ZSk7CisjZW5kaWYKKwlwYWdlX3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcHRlKTsKIH0KIAogLyoKQEAgLTEzMywxMiArMTI1LDExIEBACiAjaWZkZWYgX19zMzkweF9fCiAJaWYgKHRsYi0+bW0tPmNvbnRleHQuYXNjZV9saW1pdCA8PSAoMVVMIDw8IDMxKSkKIAkJcmV0dXJuOwotCWlmICghdGxiLT5mdWxsbW0pIHsKLQkJdGxiLT5hcnJheVstLXRsYi0+bnJfcHhkc10gPSBwbWQ7Ci0JCWlmICh0bGItPm5yX3B0ZXMgPj0gdGxiLT5ucl9weGRzKQotCQkJdGxiX2ZsdXNoX21tdSh0bGIpOwotCX0gZWxzZQotCQljcnN0X3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcG1kKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorCWlmICghdGxiLT5mdWxsbW0pCisJCXJldHVybiB0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgcG1kKTsKKyNlbmRpZgorCWNyc3RfdGFibGVfZnJlZSh0bGItPm1tLCAodW5zaWduZWQgbG9uZyAqKSBwbWQpOwogI2VuZGlmCiB9CiAKQEAgLTE1NSwxMiArMTQ2LDExIEBACiAjaWZkZWYgX19zMzkweF9fCiAJaWYgKHRsYi0+bW0tPmNvbnRleHQuYXNjZV9saW1pdCA8PSAoMVVMIDw8IDQyKSkKIAkJcmV0dXJuOwotCWlmICghdGxiLT5mdWxsbW0pIHsKLQkJdGxiLT5hcnJheVstLXRsYi0+bnJfcHhkc10gPSBwdWQ7Ci0JCWlmICh0bGItPm5yX3B0ZXMgPj0gdGxiLT5ucl9weGRzKQotCQkJdGxiX2ZsdXNoX21tdSh0bGIpOwotCX0gZWxzZQotCQljcnN0X3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcHVkKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorCWlmICghdGxiLT5mdWxsbW0pCisJCXJldHVybiB0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgcHVkKTsKKyNlbmRpZgorCWNyc3RfdGFibGVfZnJlZSh0bGItPm1tLCAodW5zaWduZWQgbG9uZyAqKSBwdWQpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCmluZGV4IDUyNDIwZDIuLjFkNTVjOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAKIAltZW1zZXQoJnBhcm1zLm9ydmFscywgMCwgc2l6ZW9mKHBhcm1zLm9ydmFscykpOwogCW1lbXNldCgmcGFybXMuYW5kdmFscywgMHhmZiwgc2l6ZW9mKHBhcm1zLmFuZHZhbHMpKTsKLQlwYXJtcy5vcnZhbHNbY3JdID0gMSA8PCBiaXQ7CisJcGFybXMub3J2YWxzW2NyXSA9IDFVTCA8PCBiaXQ7CiAJb25fZWFjaF9jcHUoc21wX2N0bF9iaXRfY2FsbGJhY2ssICZwYXJtcywgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKHNtcF9jdGxfc2V0X2JpdCk7CkBAIC0yNzYsNyArMjc2LDcgQEAKIAogCW1lbXNldCgmcGFybXMub3J2YWxzLCAwLCBzaXplb2YocGFybXMub3J2YWxzKSk7CiAJbWVtc2V0KCZwYXJtcy5hbmR2YWxzLCAweGZmLCBzaXplb2YocGFybXMuYW5kdmFscykpOwotCXBhcm1zLmFuZHZhbHNbY3JdID0gfigxTCA8PCBiaXQpOworCXBhcm1zLmFuZHZhbHNbY3JdID0gfigxVUwgPDwgYml0KTsKIAlvbl9lYWNoX2NwdShzbXBfY3RsX2JpdF9jYWxsYmFjaywgJnBhcm1zLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woc21wX2N0bF9jbGVhcl9iaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCmluZGV4IDMwY2E4NWMuLjY3MzQ1YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYworKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKQEAgLTczMSw2ICs3MzEsNyBAQAogCX0KIAltZW1jcHkoZmFjaWxpdGllcywgUzM5MF9sb3djb3JlLnN0ZmxlX2ZhY19saXN0LCAxNik7CiAJZmFjaWxpdGllc1swXSAmPSAweGZmMDBmZmYzZjQ3YzAwMDBVTEw7CisJZmFjaWxpdGllc1sxXSAmPSAweDIwMWMwMDAwMDAwMDAwMDBVTEw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vc2llNjRhLlMgYi9hcmNoL3MzOTAva3ZtL3NpZTY0YS5TCmluZGV4IGFiMGUwNDEuLjVmYWExYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vc2llNjRhLlMKKysrIGIvYXJjaC9zMzkwL2t2bS9zaWU2NGEuUwpAQCAtOTMsNCArOTMsNiBAQAogCiAJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKIAkucXVhZAlzaWVfaW5zdCxzaWVfZXJyCisJLnF1YWQJc2llX2V4aXQsc2llX2VycgorCS5xdWFkCXNpZV9yZWVudGVyLHNpZV9lcnIKIAkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IGIwOTc2M2YuLjM3YTIzYzIyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKQEAgLTI0LDk0ICsyNCwxMiBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogCi1zdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0IHsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXVuc2lnbmVkIGludCBwZ3RfaW5kZXg7Ci0JdW5zaWduZWQgaW50IGNyc3RfaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyAqdGFibGVbMF07Ci19OwotCi0jZGVmaW5lIFJDVV9GUkVFTElTVF9TSVpFIFwKLQkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0KSkgXAotCSAgLyBzaXplb2YodW5zaWduZWQgbG9uZykpCi0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICosIHJjdV90YWJsZV9mcmVlbGlzdCk7Ci0KLXN0YXRpYyB2b2lkIF9fcGFnZV90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpyY3VfdGFibGVfZnJlZWxpc3RfZ2V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKipiYXRjaHAgPSAmX19nZXRfY3B1X3ZhcihyY3VfdGFibGVfZnJlZWxpc3QpOwotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKmJhdGNoID0gKmJhdGNocDsKLQotCWlmIChiYXRjaCkKLQkJcmV0dXJuIGJhdGNoOwotCWJhdGNoID0gKHN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOwotCWlmIChiYXRjaCkgewotCQliYXRjaC0+bW0gPSBtbTsKLQkJYmF0Y2gtPnBndF9pbmRleCA9IDA7Ci0JCWJhdGNoLT5jcnN0X2luZGV4ID0gUkNVX0ZSRUVMSVNUX1NJWkU7Ci0JCSpiYXRjaHAgPSBiYXRjaDsKLQl9Ci0JcmV0dXJuIGJhdGNoOwotfQotCi1zdGF0aWMgdm9pZCByY3VfdGFibGVfZnJlZWxpc3RfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKmJhdGNoID0KLQkJY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QsIHJjdSk7Ci0KLQl3aGlsZSAoYmF0Y2gtPnBndF9pbmRleCA+IDApCi0JCV9fcGFnZV90YWJsZV9mcmVlKGJhdGNoLT5tbSwgYmF0Y2gtPnRhYmxlWy0tYmF0Y2gtPnBndF9pbmRleF0pOwotCXdoaWxlIChiYXRjaC0+Y3JzdF9pbmRleCA8IFJDVV9GUkVFTElTVF9TSVpFKQotCQljcnN0X3RhYmxlX2ZyZWUoYmF0Y2gtPm1tLCBiYXRjaC0+dGFibGVbYmF0Y2gtPmNyc3RfaW5kZXgrK10pOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYmF0Y2gpOwotfQotCi12b2lkIHJjdV90YWJsZV9mcmVlbGlzdF9maW5pc2godm9pZCkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICoqYmF0Y2hwID0gJmdldF9jcHVfdmFyKHJjdV90YWJsZV9mcmVlbGlzdCk7Ci0Jc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqYmF0Y2ggPSAqYmF0Y2hwOwotCi0JaWYgKCFiYXRjaCkKLQkJZ290byBvdXQ7Ci0JY2FsbF9yY3UoJmJhdGNoLT5yY3UsIHJjdV90YWJsZV9mcmVlbGlzdF9jYWxsYmFjayk7Ci0JKmJhdGNocCA9IE5VTEw7Ci1vdXQ6Ci0JcHV0X2NwdV92YXIocmN1X3RhYmxlX2ZyZWVsaXN0KTsKLX0KLQotc3RhdGljIHZvaWQgc21wX3N5bmModm9pZCAqYXJnKQotewotfQotCiAjaWZuZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBBTExPQ19PUkRFUgkxCi0jZGVmaW5lIFRBQkxFU19QRVJfUEFHRQk0Ci0jZGVmaW5lIEZSQUdfTUFTSwkxNVVMCi0jZGVmaW5lIFNFQ09ORF9IQUxWRVMJMTBVTAotCi12b2lkIGNsZWFyX3RhYmxlX3Bnc3Rlcyh1bnNpZ25lZCBsb25nICp0YWJsZSkKLXsKLQljbGVhcl90YWJsZSh0YWJsZSwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFLzQpOwotCW1lbXNldCh0YWJsZSArIDI1NiwgMCwgUEFHRV9TSVpFLzQpOwotCWNsZWFyX3RhYmxlKHRhYmxlICsgNTEyLCBfUEFHRV9UWVBFX0VNUFRZLCBQQUdFX1NJWkUvNCk7Ci0JbWVtc2V0KHRhYmxlICsgNzY4LCAwLCBQQUdFX1NJWkUvNCk7Ci19Ci0KKyNkZWZpbmUgRlJBR19NQVNLCTB4MGYKICNlbHNlCiAjZGVmaW5lIEFMTE9DX09SREVSCTIKLSNkZWZpbmUgVEFCTEVTX1BFUl9QQUdFCTIKLSNkZWZpbmUgRlJBR19NQVNLCTNVTAotI2RlZmluZSBTRUNPTkRfSEFMVkVTCTJVTAotCi12b2lkIGNsZWFyX3RhYmxlX3Bnc3Rlcyh1bnNpZ25lZCBsb25nICp0YWJsZSkKLXsKLQljbGVhcl90YWJsZSh0YWJsZSwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFLzIpOwotCW1lbXNldCh0YWJsZSArIDI1NiwgMCwgUEFHRV9TSVpFLzIpOwotfQotCisjZGVmaW5lIEZSQUdfTUFTSwkweDAzCiAjZW5kaWYKIAogdW5zaWduZWQgbG9uZyBWTUFMTE9DX1NUQVJUID0gVk1BTExPQ19FTkQgLSBWTUFMTE9DX1NJWkU7CkBAIC0xNDAsMjkgKzU4LDYgQEAKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB0YWJsZSwgQUxMT0NfT1JERVIpOwogfQogCi12b2lkIGNyc3RfdGFibGVfZnJlZV9yY3Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQotewotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKmJhdGNoOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpIDwgMiAmJgotCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sobW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKSB7Ci0JCWNyc3RfdGFibGVfZnJlZShtbSwgdGFibGUpOwotCQlnb3RvIG91dDsKLQl9Ci0JYmF0Y2ggPSByY3VfdGFibGVfZnJlZWxpc3RfZ2V0KG1tKTsKLQlpZiAoIWJhdGNoKSB7Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uKHNtcF9zeW5jLCBOVUxMLCAxKTsKLQkJY3JzdF90YWJsZV9mcmVlKG1tLCB0YWJsZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQliYXRjaC0+dGFibGVbLS1iYXRjaC0+Y3JzdF9pbmRleF0gPSB0YWJsZTsKLQlpZiAoYmF0Y2gtPnBndF9pbmRleCA+PSBiYXRjaC0+Y3JzdF9pbmRleCkKLQkJcmN1X3RhYmxlX2ZyZWVsaXN0X2ZpbmlzaCgpOwotb3V0OgotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfNjRCSVQKIGludCBjcnN0X3RhYmxlX3VwZ3JhZGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgbGltaXQpCiB7CkBAIC0yMzgsMTI0ICsxMzMsMTc1IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRvbWljX3hvcl9iaXRzKGF0b21pY190ICp2LCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgb2xkLCBuZXc7CisKKwlkbyB7CisJCW9sZCA9IGF0b21pY19yZWFkKHYpOworCQluZXcgPSBvbGQgXiBiaXRzOworCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKHYsIG9sZCwgbmV3KSAhPSBvbGQpOworCXJldHVybiBuZXc7Cit9CisKIC8qCiAgKiBwYWdlIHRhYmxlIGVudHJ5IGFsbG9jYXRpb24vZnJlZSByb3V0aW5lcy4KICAqLworI2lmZGVmIENPTkZJR19QR1NURQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpwYWdlX3RhYmxlX2FsbG9jX3Bnc3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgKnRhYmxlOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisJcGd0YWJsZV9wYWdlX2N0b3IocGFnZSk7CisJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAzKTsKKwl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKKwljbGVhcl90YWJsZSh0YWJsZSwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFLzIpOworCWNsZWFyX3RhYmxlKHRhYmxlICsgUFRSU19QRVJfUFRFLCAwLCBQQUdFX1NJWkUvMik7CisJcmV0dXJuIHRhYmxlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFnZV90YWJsZV9mcmVlX3Bnc3RlKHVuc2lnbmVkIGxvbmcgKnRhYmxlKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHBmbl90b19wYWdlKF9fcGEodGFibGUpID4+IFBBR0VfU0hJRlQpOworCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgLTEpOworCV9fZnJlZV9wYWdlKHBhZ2UpOworfQorI2VuZGlmCisKIHVuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyAqdGFibGU7Ci0JdW5zaWduZWQgbG9uZyBiaXRzOworCXVuc2lnbmVkIGludCBtYXNrLCBiaXQ7CiAKLQliaXRzID0gKG1tLT5jb250ZXh0Lmhhc19wZ3N0ZSkgPyAzVUwgOiAxVUw7CisjaWZkZWYgQ09ORklHX1BHU1RFCisJaWYgKG1tX2hhc19wZ3N0ZShtbSkpCisJCXJldHVybiBwYWdlX3RhYmxlX2FsbG9jX3Bnc3RlKG1tKTsKKyNlbmRpZgorCS8qIEFsbG9jYXRlIGZyYWdtZW50cyBvZiBhIDRLIHBhZ2UgYXMgMUsvMksgcGFnZSB0YWJsZSAqLwogCXNwaW5fbG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKLQlwYWdlID0gTlVMTDsKKwltYXNrID0gRlJBR19NQVNLOwogCWlmICghbGlzdF9lbXB0eSgmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KSkgewogCQlwYWdlID0gbGlzdF9maXJzdF9lbnRyeSgmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0LAogCQkJCQlzdHJ1Y3QgcGFnZSwgbHJ1KTsKLQkJaWYgKChwYWdlLT5mbGFncyAmIEZSQUdfTUFTSykgPT0gKCgxVUwgPDwgVEFCTEVTX1BFUl9QQUdFKSAtIDEpKQotCQkJcGFnZSA9IE5VTEw7CisJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgcGFnZV90b19waHlzKHBhZ2UpOworCQltYXNrID0gYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCk7CisJCW1hc2sgPSBtYXNrIHwgKG1hc2sgPj4gNCk7CiAJfQotCWlmICghcGFnZSkgeworCWlmICgobWFzayAmIEZSQUdfTUFTSykgPT0gRlJBR19NQVNLKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwogCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiBOVUxMOwogCQlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKLQkJcGFnZS0+ZmxhZ3MgJj0gfkZSQUdfTUFTSzsKKwkJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAxKTsKIAkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7Ci0JCWlmIChtbS0+Y29udGV4dC5oYXNfcGdzdGUpCi0JCQljbGVhcl90YWJsZV9wZ3N0ZXModGFibGUpOwotCQllbHNlCi0JCQljbGVhcl90YWJsZSh0YWJsZSwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFKTsKKwkJY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRSk7CiAJCXNwaW5fbG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCk7CisJfSBlbHNlIHsKKwkJZm9yIChiaXQgPSAxOyBtYXNrICYgYml0OyBiaXQgPDw9IDEpCisJCQl0YWJsZSArPSBQVFJTX1BFUl9QVEU7CisJCW1hc2sgPSBhdG9taWNfeG9yX2JpdHMoJnBhZ2UtPl9tYXBjb3VudCwgYml0KTsKKwkJaWYgKChtYXNrICYgRlJBR19NQVNLKSA9PSBGUkFHX01BU0spCisJCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIAl9Ci0JdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7Ci0Jd2hpbGUgKHBhZ2UtPmZsYWdzICYgYml0cykgewotCQl0YWJsZSArPSAyNTY7Ci0JCWJpdHMgPDw9IDE7Ci0JfQotCXBhZ2UtPmZsYWdzIHw9IGJpdHM7Ci0JaWYgKChwYWdlLT5mbGFncyAmIEZSQUdfTUFTSykgPT0gKCgxVUwgPDwgVEFCTEVTX1BFUl9QQUdFKSAtIDEpKQotCQlsaXN0X21vdmVfdGFpbCgmcGFnZS0+bHJ1LCAmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKIAlyZXR1cm4gdGFibGU7CiB9CiAKLXN0YXRpYyB2b2lkIF9fcGFnZV90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGJpdHM7Ci0KLQliaXRzID0gKCh1bnNpZ25lZCBsb25nKSB0YWJsZSkgJiAxNTsKLQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopKCgodW5zaWduZWQgbG9uZykgdGFibGUpIF4gYml0cyk7Ci0JcGFnZSA9IHBmbl90b19wYWdlKF9fcGEodGFibGUpID4+IFBBR0VfU0hJRlQpOwotCXBhZ2UtPmZsYWdzIF49IGJpdHM7Ci0JaWYgKCEocGFnZS0+ZmxhZ3MgJiBGUkFHX01BU0spKSB7Ci0JCXBndGFibGVfcGFnZV9kdG9yKHBhZ2UpOwotCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQl9Ci19Ci0KIHZvaWQgcGFnZV90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGJpdHM7CisJdW5zaWduZWQgaW50IGJpdCwgbWFzazsKIAotCWJpdHMgPSAobW0tPmNvbnRleHQuaGFzX3Bnc3RlKSA/IDNVTCA6IDFVTDsKLQliaXRzIDw8PSAoX19wYSh0YWJsZSkgJiAoUEFHRV9TSVpFIC0gMSkpIC8gMjU2IC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworI2lmZGVmIENPTkZJR19QR1NURQorCWlmIChtbV9oYXNfcGdzdGUobW0pKQorCQlyZXR1cm4gcGFnZV90YWJsZV9mcmVlX3Bnc3RlKHRhYmxlKTsKKyNlbmRpZgorCS8qIEZyZWUgMUsvMksgcGFnZSB0YWJsZSBmcmFnbWVudCBvZiBhIDRLIHBhZ2UgKi8KIAlwYWdlID0gcGZuX3RvX3BhZ2UoX19wYSh0YWJsZSkgPj4gUEFHRV9TSElGVCk7CisJYml0ID0gMSA8PCAoKF9fcGEodGFibGUpICYgflBBR0VfTUFTSykvKFBUUlNfUEVSX1BURSpzaXplb2YocHRlX3QpKSk7CiAJc3Bpbl9sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCXBhZ2UtPmZsYWdzIF49IGJpdHM7Ci0JaWYgKHBhZ2UtPmZsYWdzICYgRlJBR19NQVNLKSB7Ci0JCS8qIFBhZ2Ugbm93IGhhcyBzb21lIGZyZWUgcGd0YWJsZSBmcmFnbWVudHMuICovCi0JCWlmICghbGlzdF9lbXB0eSgmcGFnZS0+bHJ1KSkKLQkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCAmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KTsKLQkJcGFnZSA9IE5VTEw7Ci0JfSBlbHNlCi0JCS8qIEFsbCBmcmFnbWVudHMgb2YgdGhlIDRLIHBhZ2UgaGF2ZSBiZWVuIGZyZWVkLiAqLworCWlmICgoYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgJiBGUkFHX01BU0spICE9IEZSQUdfTUFTSykKIAkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJbWFzayA9IGF0b21pY194b3JfYml0cygmcGFnZS0+X21hcGNvdW50LCBiaXQpOworCWlmIChtYXNrICYgRlJBR19NQVNLKQorCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKLQlpZiAocGFnZSkgeworCWlmIChtYXNrID09IDApIHsKIAkJcGd0YWJsZV9wYWdlX2R0b3IocGFnZSk7CisJCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgLTEpOwogCQlfX2ZyZWVfcGFnZShwYWdlKTsKIAl9CiB9CiAKLXZvaWQgcGFnZV90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqdGFibGUpCi17Ci0Jc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqYmF0Y2g7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBiaXRzOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCiAKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPCAyICYmCi0JICAgIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayhtbSksIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpIHsKLQkJcGFnZV90YWJsZV9mcmVlKG1tLCB0YWJsZSk7Ci0JCWdvdG8gb3V0Oworc3RhdGljIHZvaWQgX19wYWdlX3RhYmxlX2ZyZWVfcmN1KHZvaWQgKnRhYmxlLCB1bnNpZ25lZCBiaXQpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKyNpZmRlZiBDT05GSUdfUEdTVEUKKwlpZiAoYml0ID09IEZSQUdfTUFTSykKKwkJcmV0dXJuIHBhZ2VfdGFibGVfZnJlZV9wZ3N0ZSh0YWJsZSk7CisjZW5kaWYKKwkvKiBGcmVlIDFLLzJLIHBhZ2UgdGFibGUgZnJhZ21lbnQgb2YgYSA0SyBwYWdlICovCisJcGFnZSA9IHBmbl90b19wYWdlKF9fcGEodGFibGUpID4+IFBBR0VfU0hJRlQpOworCWlmIChhdG9taWNfeG9yX2JpdHMoJnBhZ2UtPl9tYXBjb3VudCwgYml0KSA9PSAwKSB7CisJCXBndGFibGVfcGFnZV9kdG9yKHBhZ2UpOworCQlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CiAJfQotCWJhdGNoID0gcmN1X3RhYmxlX2ZyZWVsaXN0X2dldChtbSk7Ci0JaWYgKCFiYXRjaCkgewotCQlzbXBfY2FsbF9mdW5jdGlvbihzbXBfc3luYywgTlVMTCwgMSk7Ci0JCXBhZ2VfdGFibGVfZnJlZShtbSwgdGFibGUpOwotCQlnb3RvIG91dDsKK30KKwordm9pZCBwYWdlX3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBiaXQsIG1hc2s7CisKKwltbSA9IHRsYi0+bW07CisjaWZkZWYgQ09ORklHX1BHU1RFCisJaWYgKG1tX2hhc19wZ3N0ZShtbSkpIHsKKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSAoX19wYSh0YWJsZSkgfCBGUkFHX01BU0spOworCQl0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgdGFibGUpOworCQlyZXR1cm47CiAJfQotCWJpdHMgPSAobW0tPmNvbnRleHQuaGFzX3Bnc3RlKSA/IDNVTCA6IDFVTDsKLQliaXRzIDw8PSAoX19wYSh0YWJsZSkgJiAoUEFHRV9TSVpFIC0gMSkpIC8gMjU2IC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCisJYml0ID0gMSA8PCAoKF9fcGEodGFibGUpICYgflBBR0VfTUFTSykgLyAoUFRSU19QRVJfUFRFKnNpemVvZihwdGVfdCkpKTsKIAlwYWdlID0gcGZuX3RvX3BhZ2UoX19wYSh0YWJsZSkgPj4gUEFHRV9TSElGVCk7CiAJc3Bpbl9sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCS8qIERlbGF5ZWQgZnJlZWluZyB3aXRoIHJjdSBwcmV2ZW50cyByZXVzZSBvZiBwZ3RhYmxlIGZyYWdtZW50cyAqLwotCWxpc3RfZGVsX2luaXQoJnBhZ2UtPmxydSk7CisJaWYgKChhdG9taWNfcmVhZCgmcGFnZS0+X21hcGNvdW50KSAmIEZSQUdfTUFTSykgIT0gRlJBR19NQVNLKQorCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwltYXNrID0gYXRvbWljX3hvcl9iaXRzKCZwYWdlLT5fbWFwY291bnQsIGJpdCB8IChiaXQgPDwgNCkpOworCWlmIChtYXNrICYgRlJBR19NQVNLKQorCQlsaXN0X2FkZF90YWlsKCZwYWdlLT5scnUsICZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKCh1bnNpZ25lZCBsb25nKSB0YWJsZSkgfCBiaXRzKTsKLQliYXRjaC0+dGFibGVbYmF0Y2gtPnBndF9pbmRleCsrXSA9IHRhYmxlOwotCWlmIChiYXRjaC0+cGd0X2luZGV4ID49IGJhdGNoLT5jcnN0X2luZGV4KQotCQlyY3VfdGFibGVfZnJlZWxpc3RfZmluaXNoKCk7Ci1vdXQ6Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIChfX3BhKHRhYmxlKSB8IChiaXQgPDwgNCkpOworCXRsYl9yZW1vdmVfdGFibGUodGxiLCB0YWJsZSk7CiB9CiAKK3ZvaWQgX190bGJfcmVtb3ZlX3RhYmxlKHZvaWQgKl90YWJsZSkKK3sKKwl2b2lkICp0YWJsZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSBfdGFibGUgJiBQQUdFX01BU0spOworCXVuc2lnbmVkIHR5cGUgPSAodW5zaWduZWQgbG9uZykgX3RhYmxlICYgflBBR0VfTUFTSzsKKworCWlmICh0eXBlKQorCQlfX3BhZ2VfdGFibGVfZnJlZV9yY3UodGFibGUsIHR5cGUpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGFibGUsIEFMTE9DX09SREVSKTsKK30KKworI2VuZGlmCisKIC8qCiAgKiBzd2l0Y2ggb24gcGdzdGVzIGZvciBpdHMgdXNlcnNwYWNlIHByb2Nlc3MgKGZvciBrdm0pCiAgKi8KQEAgLTM2OSw3ICszMTUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIERvIHdlIGhhdmUgcGdzdGVzPyBpZiB5ZXMsIHdlIGFyZSBkb25lICovCi0JaWYgKHRzay0+bW0tPmNvbnRleHQuaGFzX3Bnc3RlKQorCWlmIChtbV9oYXNfcGdzdGUodHNrLT5tbSkpCiAJCXJldHVybiAwOwogCiAJLyogbGV0cyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byByZXBsYWNlIHRoZSBtbSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYyBiL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMKaW5kZXggNTk5NWU5Yi4uMGUzNThjMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYworKysgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvaW5pdC5jCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlICJod3NhbXBsZXIuaCIKIAotI2RlZmluZSBERUZBVUxUX0lOVEVSVkFMCTQwOTYKKyNkZWZpbmUgREVGQVVMVF9JTlRFUlZBTAk0MTI3NTE4CiAKICNkZWZpbmUgREVGQVVMVF9TREJUX0JMT0NLUwkxCiAjZGVmaW5lIERFRkFVTFRfU0RCX0JMT0NLUwk1MTEKQEAgLTE1MSw2ICsxNTEsMTIgQEAKIAlpZiAob3Byb2ZpbGVfbWF4X2ludGVydmFsID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogVGhlIGluaXRpYWwgdmFsdWUgc2hvdWxkIGJlIHNhbmUgKi8KKwlpZiAob3Byb2ZpbGVfaHdfaW50ZXJ2YWwgPCBvcHJvZmlsZV9taW5faW50ZXJ2YWwpCisJCW9wcm9maWxlX2h3X2ludGVydmFsID0gb3Byb2ZpbGVfbWluX2ludGVydmFsOworCWlmIChvcHJvZmlsZV9od19pbnRlcnZhbCA+IG9wcm9maWxlX21heF9pbnRlcnZhbCkKKwkJb3Byb2ZpbGVfaHdfaW50ZXJ2YWwgPSBvcHJvZmlsZV9tYXhfaW50ZXJ2YWw7CisKIAlpZiAob3Byb2ZpbGVfdGltZXJfaW5pdChvcHMpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IDc0NDk1YTUuLmJiZGViNDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZworKysgYi9hcmNoL3NoL0tjb25maWcKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiBjb25maWcgTk9fSU9QT1JUCiAJZGVmX2Jvb2wgIVBDSQotCWRlcGVuZHMgb24gIVNIX0NBWU1BTiAmJiAhU0hfU0g0MjAyX01JQ1JPREVWCisJZGVwZW5kcyBvbiAhU0hfQ0FZTUFOICYmICFTSF9TSDQyMDJfTUlDUk9ERVYgJiYgIVNIX1NITUlOCiAKIGNvbmZpZyBJT19UUkFQUEVECiAJYm9vbApAQCAtMzQ4LDYgKzM0OCw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzcyMCBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzIwIENQVS4KIApAQCAtMzU3LDYgKzM1OCw3IEBACiAJc2VsZWN0IENQVV9IQVNfRFNQCiAJc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzcyMSBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzIxIENQVS4KIApAQCAtNDQwLDYgKzQ0Miw3IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3NjMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0QQogCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQorCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAloZWxwCiAJICBTZWxlY3QgU0g3NzYzIGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3NjMoUjVTNzc2MzEpIENQVS4KIApAQCAtNDY3LDcgKzQ3MCw5IEBACiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUIGlmIFNNUAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQorCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKKwlzZWxlY3QgVVNCX0VIQ0lfU0ggaWYgVVNCX0VIQ0lfSENECiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSFgzCiAJYm9vbCAiU3VwcG9ydCBTSC1YMyBwcm9jZXNzb3IiCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKaW5kZXggNjE4YmQ1Ni4uOTY5NDIxZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMzU5LDM3ICszNTksMzEgQEAKIAkucHJpdgkJPSAmY2FtZXJhX2luZm8sCiB9OwogCi1zdGF0aWMgdm9pZCBkdW1teV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLX0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjYW1lcmFfZGV2aWNlOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjYW1lcmFfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzb2NfY2FtZXJhX3BsYXRmb3JtIiwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmY2FtZXJhX2luZm8sCi0JCS5yZWxlYXNlCT0gZHVtbXlfcmVsZWFzZSwKLQl9LAotfTsKK3N0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzb2NfY2FtZXJhX3BsYXRmb3JtX3JlbGVhc2UoJmNhbWVyYV9kZXZpY2UpOworfQogCiBzdGF0aWMgaW50IGFwMzI1cnhhX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAogCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoaWNsICE9ICZjYW1lcmFfbGluayB8fCBjYW1lcmFfcHJvYmUoKSA8PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpbnQgcmV0ID0gc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoaWNsLCBkZXYsICZjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmssCisJCQkJCSAgYXAzMjVyeGFfY2FtZXJhX3JlbGVhc2UsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCi0JY2FtZXJhX2luZm8uZGV2ID0gZGV2OworCXJldCA9IGNhbWVyYV9wcm9iZSgpOworCWlmIChyZXQgPCAwKQorCQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CiAKLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjYW1lcmFfZGV2aWNlKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhcDMyNXJ4YV9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCkKIHsKLQlpZiAoaWNsICE9ICZjYW1lcmFfbGluaykKLQkJcmV0dXJuOwotCi0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmNhbWVyYV9kZXZpY2UpOwotCW1lbXNldCgmY2FtZXJhX2RldmljZS5kZXYua29iaiwgMCwKLQkgICAgICAgc2l6ZW9mKGNhbWVyYV9kZXZpY2UuZGV2LmtvYmopKTsKKwlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CiB9CiAjZW5kaWYgLyogQ09ORklHX0kyQyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKaW5kZXggYmIxM2QwZS4uNTEzY2IxYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcjhhNjY1OTcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvcmVuZXNhc191c2Jocy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90c2MyMDA3Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpAQCAtMjMyLDYgKzIzMyw1MiBAQAogCS5yZXNvdXJjZQk9IHVzYjFfY29tbW9uX3Jlc291cmNlcywKIH07CiAKKy8qCisgKiBVU0JIUworICovCitzdGF0aWMgaW50IHVzYmhzX2dldF9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShHUElPX1BUQjMpOworfQorCitzdGF0aWMgc3RydWN0IHJlbmVzYXNfdXNiaHNfcGxhdGZvcm1faW5mbyB1c2Joc19pbmZvID0geworCS5wbGF0Zm9ybV9jYWxsYmFjayA9IHsKKwkJLmdldF9pZAkJPSB1c2Joc19nZXRfaWQsCisJfSwKKwkuZHJpdmVyX3BhcmFtID0geworCQkuYnVzd2FpdF9id2FpdAkJPSA0LAorCQkuZGV0ZWN0aW9uX2RlbGF5CT0gNSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2Joc19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4YTRkOTAwMDAsCisJCS5lbmQJPSAweGE0ZDkwMTI0IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDY2LAorCQkuZW5kCT0gNjYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1c2Joc19kZXZpY2UgPSB7CisJLm5hbWUJPSAicmVuZXNhc191c2JocyIsCisJLmlkCT0gMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gTlVMTCwgICAgICAgICAvKiAgbm90IHVzZSBkbWEgKi8KKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnVzYmhzX2luZm8sCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiaHNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB1c2Joc19yZXNvdXJjZXMsCisJLmFyY2hkYXRhID0geworCQkuaHdibGtfaWQgPSBIV0JMS19VU0IxLAorCX0sCit9OworCiAvKiBMQ0RDICovCiBjb25zdCBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBlY292ZWNfbGNkX21vZGVzW10gPSB7CiAJewpAQCAtODg1LDYgKzkzMiw5IEBACiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2hfbW1jaWZfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzaF9tbWNpZl9yZXNvdXJjZXMsCisJLmFyY2hkYXRhID0geworCQkuaHdibGtfaWQgPSBIV0JMS19NTUMsCisJfSwKIH07CiAjZW5kaWYKIApAQCAtODk0LDYgKzk0NCw3IEBACiAJJnNoX2V0aF9kZXZpY2UsCiAJJnVzYjBfaG9zdF9kZXZpY2UsCiAJJnVzYjFfY29tbW9uX2RldmljZSwKKwkmdXNiaHNfZGV2aWNlLAogCSZsY2RjX2RldmljZSwKIAkmY2V1MF9kZXZpY2UsCiAJJmNldTFfZGV2aWNlLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCA3ODBlMDgzLi4yM2JjODQ5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMjcsOCArMjcsNiBAQAogCQkJJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldJykKIGVuZGlmCiAKLUxJQkdDQwk6PSAkKHNoZWxsICQoQ0MpICQoS0JVSUxEX0NGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCi0KIGlmZXEgKCQoQ09ORklHX01DT1VOVCkseSkKIE9SSUdfQ0ZMQUdTIDo9ICQoS0JVSUxEX0NGTEFHUykKIEtCVUlMRF9DRkxBR1MgPSAkKHN1YnN0IC1wZywgLCAkKE9SSUdfQ0ZMQUdTKSkKQEAgLTM3LDcgKzM1LDI1IEBACiBMREZMQUdTX3ZtbGludXggOj0gLS1vZm9ybWF0ICQobGQtYmZkKSAtVHRleHQgJChJTUFHRV9PRkZTRVQpIC1lIHN0YXJ0dXAgXAogCQkgICAtVCAkKG9iaikvLi4vLi4va2VybmVsL3ZtbGludXgubGRzCiAKLSQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vICQoTElCR0NDKSBGT1JDRQorIworIyBQdWxsIGluIHRoZSBuZWNlc3NhcnkgbGliZ2NjIGJpdHMgZnJvbSB0aGUgaW4ta2VybmVsIGltcGxlbWVudGF0aW9uLgorIworbGliMWZ1bmNzLSQoQ09ORklHX1NVUEVSSDMyKQk6PSBhc2hpZnRydC5TIGFzaGxkaTMuYyBhc2hyc2kzLlMgYXNobHNpMy5TIFwKKwkJCQkgICBsc2hyc2kzLlMKK2xpYjFmdW5jcy1vYmoJCQk6PSBcCisJJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChhZGRwcmVmaXggJChvYmopLywgJChsaWIxZnVuY3MteSkpKSkKKworbGliMWZ1bmNzLWRpcgkJOj0gJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvbGliCitpZmVxICgkKEJJVFMpLDY0KQorCWxpYjFmdW5jcy1kaXIgCTo9ICQoYWRkc3VmZml4ICQoQklUUyksICQobGliMWZ1bmNzLWRpcikpCitlbmRpZgorCitLQlVJTERfQ0ZMQUdTICs9IC1JJChsaWIxZnVuY3MtZGlyKQorCiskKGFkZHByZWZpeCAkKG9iaikvLCQobGliMWZ1bmNzLXkpKTogJChvYmopLyU6ICQobGliMWZ1bmNzLWRpcikvJSBGT1JDRQorCSQoY2FsbCBjbWQsc2hpcHBlZCkKKworJChvYmopL3ZtbGludXg6ICQoT0JKRUNUUykgJChvYmopL3BpZ2d5Lm8gJChsaWIxZnVuY3Mtb2JqKSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQogCUA6CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDc3NTdsY3JfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcKaW5kZXggMzNkZGIxMy4uY2ZkZTk4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcKQEAgLTksNyArOSw2IEBACiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TX0FMTD15CiBDT05GSUdfU0xBQj15CkBAIC0zOSw4ICszOCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfTTI1UDgwPXkKQEAgLTU2LDE4ICs1MywxOSBAQAogIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfU0hfU0NJPXkKIENPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTMKIENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9TSD15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci1DT05GSUdfTUZEX1NIX01PQklMRV9TREhJPXkKIENPTkZJR19VU0I9eQogQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfU0g9eQogQ09ORklHX1VTQl9PSENJX0hDRD15CitDT05GSUdfVVNCX09IQ0lfU0g9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19NTUM9eQogQ09ORklHX01NQ19TREhJPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCmluZGV4IDBmNTU4OTEuLmUyY2JkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZwpAQCAtMjI3LDcgKzIyNyw3IEBACiBDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKIENPTkZJR19VU0JfU0VSSUFMX0FSSzMxMTY9bQogQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9TSD1tCiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctZ3JiLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctZ3JiLmgKaW5kZXggNDY3NmJmNS4uZjg0OGRlYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9jbXB4Y2hnLWdyYi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vY21weGNoZy1ncmIuaApAQCAtMTUsOCArMTUsOSBAQAogCQkiICAgbW92LmwgICAlMiwgICBAJTEgICAgIFxuXHQiIC8qIHN0b3JlIG5ldyB2YWx1ZSAqLwogCQkiMTogbW92ICAgICByMSwgICByMTUgICAgIFxuXHQiIC8qIExPR09VVCAqLwogCQk6ICI9JnIiIChyZXR2YWwpLAotCQkgICIrciIgIChtKQotCQk6ICJyIiAgICh2YWwpCisJCSAgIityIiAgKG0pLAorCQkgICIrciIgICh2YWwpCQkvKiBpbmhpYml0IHIxNSBvdmVybG9hZGluZyAqLworCQk6CiAJCTogIm1lbW9yeSIsICJyMCIsICJyMSIpOwogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTM2LDggKzM3LDkgQEAKIAkJIiAgIG1vdi5iICAgJTIsICAgQCUxICAgICBcblx0IiAvKiBzdG9yZSBuZXcgdmFsdWUgKi8KIAkJIjE6IG1vdiAgICAgcjEsICAgcjE1ICAgICBcblx0IiAvKiBMT0dPVVQgKi8KIAkJOiAiPSZyIiAocmV0dmFsKSwKLQkJICAiK3IiICAobSkKLQkJOiAiciIgICAodmFsKQorCQkgICIrciIgIChtKSwKKwkJICAiK3IiICAodmFsKQkJLyogaW5oaWJpdCByMTUgb3ZlcmxvYWRpbmcgKi8KKwkJOgogCQk6ICJtZW1vcnkiICwgInIwIiwgInIxIik7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNTQsMTMgKzU2LDE0IEBACiAJCSIgICBub3AgICAgICAgICAgICAgICAgICAgXG5cdCIKIAkJIiAgIG1vdiAgICByMTUsICAgcjEgICAgICBcblx0IiAvKiByMSA9IHNhdmVkIHNwICovCiAJCSIgICBtb3YgICAgIy04LCAgIHIxNSAgICAgXG5cdCIgLyogTE9HSU4gKi8KLQkJIiAgIG1vdi5sICBAJTEsICAgJTAgICAgICBcblx0IiAvKiBsb2FkICBvbGQgdmFsdWUgKi8KLQkJIiAgIGNtcC9lcSAgJTAsICAgJTIgICAgICBcblx0IgorCQkiICAgbW92LmwgIEAlMywgICAlMCAgICAgIFxuXHQiIC8qIGxvYWQgIG9sZCB2YWx1ZSAqLworCQkiICAgY21wL2VxICAlMCwgICAlMSAgICAgIFxuXHQiCiAJCSIgICBiZiAgICAgICAgICAgIDFmICAgICAgXG5cdCIgLyogaWYgbm90IGVxdWFsICovCi0JCSIgICBtb3YubCAgICUzLCAgIEAlMSAgICAgXG5cdCIgLyogc3RvcmUgbmV3IHZhbHVlICovCisJCSIgICBtb3YubCAgICUyLCAgIEAlMyAgICAgXG5cdCIgLyogc3RvcmUgbmV3IHZhbHVlICovCiAJCSIxOiBtb3YgICAgIHIxLCAgIHIxNSAgICAgXG5cdCIgLyogTE9HT1VUICovCi0JCTogIj0mciIgKHJldHZhbCkKLQkJOiAgInIiICAobSksICJyIiAgKG9sZCksICJyIiAgKG5ldykKKwkJOiAiPSZyIiAocmV0dmFsKSwKKwkJICAiK3IiICAob2xkKSwgIityIiAgKG5ldykgLyogb2xkIG9yIG5ldyBjYW4gYmUgcjE1ICovCisJCTogICJyIiAgKG0pCiAJCTogIm1lbW9yeSIgLCAicjAiLCAicjEiLCAidCIpOwogCiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbW16b25lLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IDg4ODdiYWYuLjE1YTg0OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbW16b25lLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9tbXpvbmUuaApAQCAtOSwxMCArOSw2IEBACiBleHRlcm4gc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbXTsKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKIAotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4gKyBcCi0JCQkJIE5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMpCi0KIHN0YXRpYyBpbmxpbmUgaW50IHBmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJaW50IG5pZDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggZGI4NTkxNi4uOTIxMGU5MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS0ybGV2ZWwuaD4KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzY0LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl82NC5oCmluZGV4IDJhNTQxZGQuLmUyNWM0YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzY0LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfNjQuaApAQCAtMTUwLDcgKzE1MCw2IEBACiAjZGVmaW5lIFNSX1VTRVIgKFNSX01NVSB8IFNSX0ZEKQogCiAjZGVmaW5lIHN0YXJ0X3RocmVhZChfcmVncywgbmV3X3BjLCBuZXdfc3ApCQkJXAotCXNldF9mcyhVU0VSX0RTKTsJCQkJCVwKIAlfcmVncy0+c3IgPSBTUl9VU0VSOwkvKiBVc2VyIG1vZGUuICovCQlcCiAJX3JlZ3MtPnBjID0gbmV3X3BjIC0gNDsJLyogQ29tcGVuc2F0ZSBzeXNjYWxsIGV4aXQgKi8JXAogCV9yZWdzLT5wYyB8PSAxOwkJLyogU2V0IFNIbWVkaWEgISAqLwkJXApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggNDA3MjViNC4uODhiZDZiZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC00MSw3ICs0MSw5IEBACiAKICNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpCQkJKCgocmVncyktPnNyICYgMHg0MDAwMDAwMCk9PTApCiAjZGVmaW5lIGtlcm5lbF9zdGFja19wb2ludGVyKF9yZWdzKQkoKHVuc2lnbmVkIGxvbmcpKF9yZWdzKS0+cmVnc1sxNV0pCi0jZGVmaW5lIEdFVF9VU1AocmVncykgKChyZWdzKS0+cmVnc1sxNV0pCisKKyNkZWZpbmUgR0VUX0ZQKHJlZ3MpCSgocmVncyktPnJlZ3NbMTRdKQorI2RlZmluZSBHRVRfVVNQKHJlZ3MpCSgocmVncyktPnJlZ3NbMTVdKQogCiBleHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7CiAKQEAgLTEzMSw3ICsxMzMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKwl1bnNpZ25lZCBsb25nIHBjID0gcmVncy0+cGM7CiAKIAlpZiAodmlydF9hZGRyX3VuY2FjaGVkKHBjKSkKIAkJcmV0dXJuIENBQ19BRERSKHBjKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3RsYi5oCmluZGV4IDZjMzA4ZDguLmVjODhiZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdGxiLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS90bGIuaApAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAKICNpZmRlZiBDT05GSUdfTU1VCisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzIyLmggYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzIyLmgKaW5kZXggN2E1YjhhMy4uYmQwNjIyNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyMi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjIuaApAQCAtMjM2LDYgKzIzNiw3IEBACiB9OwogCiBlbnVtIHsKKwlTSERNQV9TTEFWRV9JTlZBTElELAogCVNIRE1BX1NMQVZFX1NDSUYwX1RYLAogCVNIRE1BX1NMQVZFX1NDSUYwX1JYLAogCVNIRE1BX1NMQVZFX1NDSUYxX1RYLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyNC5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyNC5oCmluZGV4IDdlYjQzNTkuLmNiYzQ3ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjQuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzI0LmgKQEAgLTI4NSw2ICsyODUsNyBAQAogfTsKIAogZW51bSB7CisJU0hETUFfU0xBVkVfSU5WQUxJRCwKIAlTSERNQV9TTEFWRV9TQ0lGMF9UWCwKIAlTSERNQV9TTEFWRV9TQ0lGMF9SWCwKIAlTSERNQV9TTEFWRV9TQ0lGMV9UWCwKQEAgLTI5Nyw2ICsyOTgsMTQgQEAKIAlTSERNQV9TTEFWRV9TQ0lGNF9SWCwKIAlTSERNQV9TTEFWRV9TQ0lGNV9UWCwKIAlTSERNQV9TTEFWRV9TQ0lGNV9SWCwKKwlTSERNQV9TTEFWRV9VU0IwRDBfVFgsCisJU0hETUFfU0xBVkVfVVNCMEQwX1JYLAorCVNIRE1BX1NMQVZFX1VTQjBEMV9UWCwKKwlTSERNQV9TTEFWRV9VU0IwRDFfUlgsCisJU0hETUFfU0xBVkVfVVNCMUQwX1RYLAorCVNIRE1BX1NMQVZFX1VTQjFEMF9SWCwKKwlTSERNQV9TTEFWRV9VU0IxRDFfVFgsCisJU0hETUFfU0xBVkVfVVNCMUQxX1JYLAogCVNIRE1BX1NMQVZFX1NESEkwX1RYLAogCVNIRE1BX1NMQVZFX1NESEkwX1JYLAogCVNIRE1BX1NMQVZFX1NESEkxX1RYLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzc1Ny5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzc1Ny5oCmluZGV4IDA1YjgxOTYuLjQxZjlmOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3NTcuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzU3LmgKQEAgLTI1Miw2ICsyNTIsNyBAQAogfTsKIAogZW51bSB7CisJU0hETUFfU0xBVkVfSU5WQUxJRCwKIAlTSERNQV9TTEFWRV9TREhJX1RYLAogCVNIRE1BX1NMQVZFX1NESElfUlgsCiAJU0hETUFfU0xBVkVfTU1DSUZfVFgsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCmluZGV4IDAzMzNmZTkuLjEzNGEzOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCkBAIC05Myw2ICs5Myw0NiBAQAogCQkuY2hjcgkJPSBETV9JTkMgfCBTTV9GSVggfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MzYsCiAJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDBfVFgsCisJCS5hZGRyCQk9IDB4QTREODAxMDAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzMsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDBfUlgsCisJCS5hZGRyCQk9IDB4QTREODAxMDAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzMsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDFfVFgsCisJCS5hZGRyCQk9IDB4QTREODAxMjAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzcsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDFfUlgsCisJCS5hZGRyCQk9IDB4QTREODAxMjAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzcsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDBfVFgsCisJCS5hZGRyCQk9IDB4QTREOTAxMDAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWIsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDBfUlgsCisJCS5hZGRyCQk9IDB4QTREOTAxMDAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWIsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDFfVFgsCisJCS5hZGRyCQk9IDB4QTREOTAxMjAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWYsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDFfUlgsCisJCS5hZGRyCQk9IDB4QTREOTAxMjAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWYsCisJfSwgewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkJLmFkZHIJCT0gMHgwNGNlMDAzMCwKIAkJLmNoY3IJCT0gRE1fRklYIHwgU01fSU5DIHwgMHg4MDAgfCBUU19JTkRFWDJWQUwoWE1JVF9TWl8xNkJJVCksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NTcuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jCmluZGV4IDQyM2RhYmYuLmU5MTVkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1NDSUYyX1JYLAogCQkuYWRkcgkJPSAweDFmNGIwMDE0LAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHgyMiwKIAl9LApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9TQ0lGM19SWCwKIAkJLmFkZHIJCT0gMHgxZjRjMDAxNCwKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MmEsCiAJfSwKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfU0NJRjRfUlgsCiAJCS5hZGRyCQk9IDB4MWY0ZDAwMTQsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDQyLAogCX0sCkBAIC0yMjgsNyArMjI4LDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUMwX1JYLAogCQkuYWRkcgkJPSAweDFlNTAwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHgyMiwKIAl9LApAQCAtMjQyLDcgKzI0Miw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDMV9SWCwKIAkJLmFkZHIJCT0gMHgxZTUxMDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MmEsCiAJfSwKQEAgLTI1Niw3ICsyNTYsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzJfUlgsCiAJCS5hZGRyCQk9IDB4MWU1MjAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweGEyLAogCX0sCkBAIC0yNjUsMTIgKzI2NSwxMiBAQAogCQkuYWRkcgkJPSAweDFlNTMwMDEyLAogCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCi0JCS5taWRfcmlkCT0gMHhhYiwKKwkJLm1pZF9yaWQJPSAweGE5LAogCX0sCiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDM19SWCwKIAkJLmFkZHIJCT0gMHgxZTUzMDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4YWYsCiAJfSwKQEAgLTI3OSwxNCArMjc5LDE0IEBACiAJCS5hZGRyCQk9IDB4MWU1NDAwMTIsCiAJCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKLQkJLm1pZF9yaWQJPSAweGMxLAorCQkubWlkX3JpZAk9IDB4YzUsCiAJfSwKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM0X1JYLAogCQkuYWRkcgkJPSAweDFlNTQwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCi0JCS5taWRfcmlkCT0gMHhjMiwKKwkJLm1pZF9yaWQJPSAweGM2LAogCX0sCiB9OwogCkBAIC0zMDEsNyArMzAxLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM1X1JYLAogCQkuYWRkcgkJPSAweDFlNTUwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHgyMiwKIAl9LApAQCAtMzE1LDcgKzMxNSw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDNl9SWCwKIAkJLmFkZHIJCT0gMHgxZTU2MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MmEsCiAJfSwKQEAgLTMyOSw3ICszMjksNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzdfUlgsCiAJCS5hZGRyCQk9IDB4MWU1NzAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDQyLAogCX0sCkBAIC0zNDMsNyArMzQzLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM4X1JYLAogCQkuYWRkcgkJPSAweDFlNTgwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHg0NiwKIAl9LApAQCAtMzU3LDcgKzM1Nyw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDOV9SWCwKIAkJLmFkZHIJCT0gMHgxZTU5MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4NTIsCiAJfSwKQEAgLTY1OSw2ICs2NTksNTQgQEAKIAkucmVzb3VyY2UJPSBzcGkwX3Jlc291cmNlcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiX2VoY2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGZlNGYxMDAwLAorCQkuZW5kCT0gMHhmZTRmMTBmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDU3LAorCQkuZW5kCT0gNTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1c2JfZWhjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2VoY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmdXNiX2VoY2lfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2JfZWhjaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYl9laGNpX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiX29oY2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGZlNGYxODAwLAorCQkuZW5kCT0gMHhmZTRmMThmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDU3LAorCQkuZW5kCT0gNTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1c2Jfb2hjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX29oY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmdXNiX29oY2lfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2Jfb2hjaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYl9vaGNpX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3NTdfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaWYyX2RldmljZSwKIAkmc2NpZjNfZGV2aWNlLApAQCAtNjcwLDYgKzcxOCw4IEBACiAJJmRtYTJfZGV2aWNlLAogCSZkbWEzX2RldmljZSwKIAkmc3BpMF9kZXZpY2UsCisJJnVzYl9laGNpX2RldmljZSwKKwkmdXNiX29oY2lfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g3NzU3X2RldmljZXNfc2V0dXAodm9pZCkKQEAgLTEwMzksMTMgKzEwODksMTMgQEAKIAogLyogU3VwcG9ydCBmb3IgZXh0ZXJuYWwgaW50ZXJydXB0IHBpbnMgaW4gSVJRIG1vZGUgKi8KIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJxMDEyM1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSUTAsIDB4MjQwKSwgSU5UQ19WRUNUKElSUTEsIDB4MjgwKSwKLQlJTlRDX1ZFQ1QoSVJRMiwgMHgyYzApLCBJTlRDX1ZFQ1QoSVJRMywgMHgzMDApLAorCUlOVENfVkVDVChJUlEwLCAweDIwMCksIElOVENfVkVDVChJUlExLCAweDI0MCksCisJSU5UQ19WRUNUKElSUTIsIDB4MjgwKSwgSU5UQ19WRUNUKElSUTMsIDB4MmMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJxNDU2N1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSUTQsIDB4MzQwKSwgSU5UQ19WRUNUKElSUTUsIDB4MzgwKSwKLQlJTlRDX1ZFQ1QoSVJRNiwgMHgzYzApLCBJTlRDX1ZFQ1QoSVJRNywgMHgyMDApLAorCUlOVENfVkVDVChJUlE0LCAweDMwMCksIElOVENfVkVDVChJUlE1LCAweDM0MCksCisJSU5UQ19WRUNUKElSUTYsIDB4MzgwKSwgSU5UQ19WRUNUKElSUTcsIDB4M2MwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgc2Vuc2VfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKQEAgLTEwNzksMTQgKzExMjksMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJsNDU2N1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSTDRfTExMTCwgMHhiMDApLCBJTlRDX1ZFQ1QoSVJMNF9MTExILCAweGIyMCksCi0JSU5UQ19WRUNUKElSTDRfTExITCwgMHhiNDApLCBJTlRDX1ZFQ1QoSVJMNF9MTEhILCAweGI2MCksCi0JSU5UQ19WRUNUKElSTDRfTEhMTCwgMHhiODApLCBJTlRDX1ZFQ1QoSVJMNF9MSExILCAweGJhMCksCi0JSU5UQ19WRUNUKElSTDRfTEhITCwgMHhiYzApLCBJTlRDX1ZFQ1QoSVJMNF9MSEhILCAweGJlMCksCi0JSU5UQ19WRUNUKElSTDRfSExMTCwgMHhjMDApLCBJTlRDX1ZFQ1QoSVJMNF9ITExILCAweGMyMCksCi0JSU5UQ19WRUNUKElSTDRfSExITCwgMHhjNDApLCBJTlRDX1ZFQ1QoSVJMNF9ITEhILCAweGM2MCksCi0JSU5UQ19WRUNUKElSTDRfSEhMTCwgMHhjODApLCBJTlRDX1ZFQ1QoSVJMNF9ISExILCAweGNhMCksCi0JSU5UQ19WRUNUKElSTDRfSEhITCwgMHhjYzApLAorCUlOVENfVkVDVChJUkw0X0xMTEwsIDB4MjAwKSwgSU5UQ19WRUNUKElSTDRfTExMSCwgMHgyMjApLAorCUlOVENfVkVDVChJUkw0X0xMSEwsIDB4MjQwKSwgSU5UQ19WRUNUKElSTDRfTExISCwgMHgyNjApLAorCUlOVENfVkVDVChJUkw0X0xITEwsIDB4MjgwKSwgSU5UQ19WRUNUKElSTDRfTEhMSCwgMHgyYTApLAorCUlOVENfVkVDVChJUkw0X0xISEwsIDB4MmMwKSwgSU5UQ19WRUNUKElSTDRfTEhISCwgMHgyZTApLAorCUlOVENfVkVDVChJUkw0X0hMTEwsIDB4MzAwKSwgSU5UQ19WRUNUKElSTDRfSExMSCwgMHgzMjApLAorCUlOVENfVkVDVChJUkw0X0hMSEwsIDB4MzQwKSwgSU5UQ19WRUNUKElSTDRfSExISCwgMHgzNjApLAorCUlOVENfVkVDVChJUkw0X0hITEwsIDB4MzgwKSwgSU5UQ19WRUNUKElSTDRfSEhMSCwgMHgzYTApLAorCUlOVENfVkVDVChJUkw0X0hISEwsIDB4M2MwKSwKIH07CiAKIHN0YXRpYyBERUNMQVJFX0lOVENfREVTQyhpbnRjX2Rlc2NfaXJsMDEyMywgInNoNzc1Ny1pcmwwMTIzIiwgdmVjdG9yc19pcmwwMTIzLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCA5MTk3MTEwLi5hM2VlOTE5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjY4LDkgKzI2OSw4IEBACiAJCQl1bnNpZ25lZCBpbnQgbmV3Y3B1ID0gY3B1bWFza19hbnlfYW5kKGRhdGEtPmFmZmluaXR5LAogCQkJCQkJCSAgICAgIGNwdV9vbmxpbmVfbWFzayk7CiAJCQlpZiAobmV3Y3B1ID49IG5yX2NwdV9pZHMpIHsKLQkJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoS0VSTl9JTkZPICJJUlEldSBubyBsb25nZXIgYWZmaW5lIHRvIENQVSV1XG4iLAotCQkJCQkgICAgICAgaXJxLCBjcHUpOworCQkJCXByX2luZm9fcmF0ZWxpbWl0ZWQoIklSUSV1IG5vIGxvbmdlciBhZmZpbmUgdG8gQ1BVJXVcbiIsCisJCQkJCQkgICAgaXJxLCBjcHUpOwogCiAJCQkJY3B1bWFza19zZXRhbGwoZGF0YS0+YWZmaW5pdHkpOwogCQkJCW5ld2NwdSA9IGNwdW1hc2tfYW55X2FuZChkYXRhLT5hZmZpbml0eSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCA3NjJhMTM5Li5hYWY2ZDU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTEwMSw4ICsxMDIsNiBAQAogdm9pZCBzdGFydF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X3BjLAogCQkgIHVuc2lnbmVkIGxvbmcgbmV3X3NwKQogewotCXNldF9mcyhVU0VSX0RTKTsKLQogCXJlZ3MtPnByID0gMDsKIAlyZWdzLT5zciA9IFNSX0ZEOwogCXJlZ3MtPnBjID0gbmV3X3BjOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9hbGlnbm1lbnQuYyBiL2FyY2gvc2gvbW0vYWxpZ25tZW50LmMKaW5kZXggYjI1OTViOC4uNjIwZmE3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9hbGlnbm1lbnQuYworKysgYi9hcmNoL3NoL21tL2FsaWdubWVudC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGFzbS9hbGlnbm1lbnQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKQEAgLTk1LDEzICs5NiwxMyBAQAogdm9pZCB1bmFsaWduZWRfZml4dXBzX25vdGlmeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW5zbl9zaXplX3QgaW5zbiwKIAkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaWYgKHVzZXJfbW9kZShyZWdzKSAmJiAoc2VfdXNlcm1vZGUgJiBVTV9XQVJOKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByX25vdGljZSgiRml4aW5nIHVwIHVuYWxpZ25lZCB1c2Vyc3BhY2UgYWNjZXNzICIKKwlpZiAodXNlcl9tb2RlKHJlZ3MpICYmIChzZV91c2VybW9kZSAmIFVNX1dBUk4pKQorCQlwcl9ub3RpY2VfcmF0ZWxpbWl0ZWQoIkZpeGluZyB1cCB1bmFsaWduZWQgdXNlcnNwYWNlIGFjY2VzcyAiCiAJCQkgICJpbiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCiAJCQkgIHRzay0+Y29tbSwgdGFza19waWRfbnIodHNrKSwKIAkJCSAgKHZvaWQgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLCBpbnNuKTsKLQllbHNlIGlmIChzZV9rZXJubW9kZV93YXJuICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJfbm90aWNlKCJGaXhpbmcgdXAgdW5hbGlnbmVkIGtlcm5lbCBhY2Nlc3MgIgorCWVsc2UgaWYgKHNlX2tlcm5tb2RlX3dhcm4pCisJCXByX25vdGljZV9yYXRlbGltaXRlZCgiRml4aW5nIHVwIHVuYWxpZ25lZCBrZXJuZWwgYWNjZXNzICIKIAkJCSAgImluIFwiJXNcIiBwaWQ9JWQgcGM9MHglcCBpbnM9MHglMDRoeFxuIiwKIAkJCSAgdHNrLT5jb21tLCB0YXNrX3BpZF9ucih0c2spLAogCQkJICAodm9pZCAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncyksIGluc24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMgYi9hcmNoL3NoL21tL2NhY2hlLWRlYnVnZnMuYwppbmRleCA1MjQxMTQ2Li4xMTU3MjUxIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NhY2hlLWRlYnVnZnMuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLWRlYnVnZnMuYwpAQCAtMjYsOSArMjYsOSBAQAogewogCXVuc2lnbmVkIGludCBjYWNoZV90eXBlID0gKHVuc2lnbmVkIGludClmaWxlLT5wcml2YXRlOwogCXN0cnVjdCBjYWNoZV9pbmZvICpjYWNoZTsKLQl1bnNpZ25lZCBpbnQgd2F5c2l6ZSwgd2F5LCBjYWNoZV9zaXplOwotCXVuc2lnbmVkIGxvbmcgY2NyLCBiYXNlOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGFkZHJzdGFydCA9IDA7CisJdW5zaWduZWQgaW50IHdheXNpemUsIHdheTsKKwl1bnNpZ25lZCBsb25nIGNjcjsKKwl1bnNpZ25lZCBsb25nIGFkZHJzdGFydCA9IDA7CiAKIAkvKgogCSAqIEdvIHVuY2FjaGVkIGltbWVkaWF0ZWx5IHNvIHdlIGRvbid0IHNrZXcgdGhlIHJlc3VsdHMgYW55CkBAIC00NSwyOCArNDUsMTMgQEAKIAl9CiAKIAlpZiAoY2FjaGVfdHlwZSA9PSBDQUNIRV9UWVBFX0RDQUNIRSkgewotCQliYXNlID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKKwkJYWRkcnN0YXJ0ID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKIAkJY2FjaGUgPSAmY3VycmVudF9jcHVfZGF0YS5kY2FjaGU7CiAJfSBlbHNlIHsKLQkJYmFzZSA9IENBQ0hFX0lDX0FERFJFU1NfQVJSQVk7CisJCWFkZHJzdGFydCA9IENBQ0hFX0lDX0FERFJFU1NfQVJSQVk7CiAJCWNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlOwogCX0KIAotCS8qCi0JICogRHVlIHRvIHRoZSBhbW91bnQgb2YgZGF0YSB3cml0dGVuIG91dCAoZGVwZW5kaW5nIG9uIHRoZSBjYWNoZSBzaXplKSwKLQkgKiB3ZSBtYXkgYmUgaXRlcmF0ZWQgb3ZlciBtdWx0aXBsZSB0aW1lcy4gSW4gdGhpcyBjYXNlLCBrZWVwIHRyYWNrIG9mCi0JICogdGhlIGVudHJ5IHBvc2l0aW9uIGluIGFkZHJzdGFydCwgYW5kIHJld2luZCBpdCB3aGVuIHdlJ3ZlIGhpdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGNhY2hlLgotCSAqCi0JICogTGlrZXdpc2UsIHRoZSBzYW1lIGNvZGUgaXMgdXNlZCBmb3IgbXVsdGlwbGUgY2FjaGVzLCBzbyBjYXJlIG11c3QKLQkgKiBiZSB0YWtlbiBmb3IgYm91bmNpbmcgYWRkcnN0YXJ0IGJhY2sgYW5kIGZvcnRoIHNvIHRoZSBhcHByb3ByaWF0ZQotCSAqIGNhY2hlIGlzIGhpdC4KLQkgKi8KLQljYWNoZV9zaXplID0gY2FjaGUtPndheXMgKiBjYWNoZS0+c2V0cyAqIGNhY2hlLT5saW5lc3o7Ci0JaWYgKCgoYWRkcnN0YXJ0ICYgMHhmZjAwMDAwMCkgIT0gYmFzZSkgfHwKLQkgICAgIChhZGRyc3RhcnQgJiAweDAwZmZmZmZmKSA+IGNhY2hlX3NpemUpCi0JCWFkZHJzdGFydCA9IGJhc2U7Ci0KIAl3YXlzaXplID0gY2FjaGUtPnNldHM7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMgYi9hcmNoL3NoL21tL2NvbnNpc3RlbnQuYwppbmRleCA0MDczM2E5Li5mMjUxYjVmIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NvbnNpc3RlbnQuYworKysgYi9hcmNoL3NoL21tL2NvbnNpc3RlbnQuYwpAQCAtODIsNyArODIsNyBAQAogCXZvaWQgKmFkZHI7CiAKIAlhZGRyID0gX19pbl8yOWJpdF9tb2RlKCkgPwotCSAgICAgICAodm9pZCAqKVAxU0VHQUREUigodW5zaWduZWQgbG9uZyl2YWRkcikgOiB2YWRkcjsKKwkgICAgICAgKHZvaWQgKilDQUNfQUREUigodW5zaWduZWQgbG9uZyl2YWRkcikgOiB2YWRkcjsKIAogCXN3aXRjaCAoZGlyZWN0aW9uKSB7CiAJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CQkvKiBpbnZhbGlkYXRlIG9ubHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCBhZjMyZTE3Li4yNTM5ODZiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTAogCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMKLQlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19ERVBSRUNBVEVECiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKIAlzZWxlY3QgVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaWYgU01QCiAKQEAgLTUyOCw2ICs1MjcsMjMgQEAKIGNvbmZpZyBQQ0lfU1lTQ0FMTAogCWRlZl9ib29sIFBDSQogCitjb25maWcgUENJQ19QQ0kKKwlib29sCisJZGVwZW5kcyBvbiBQQ0kgJiYgU1BBUkMzMiAmJiAhU1BBUkNfTEVPTgorCWRlZmF1bHQgeQorCitjb25maWcgTEVPTl9QQ0kKKwlib29sCisJZGVwZW5kcyBvbiBQQ0kgJiYgU1BBUkNfTEVPTgorCWRlZmF1bHQgeQorCitjb25maWcgR1JQQ0kyCisJYm9vbCAiR1JQQ0kyIEhvc3QgQnJpZGdlIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBMRU9OX1BDSQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSB0aGUgR1JQQ0kyIEhvc3QgQnJpZGdlIERyaXZlci4KKwogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaAppbmRleCA0ODJjNzllLi43NDQwOTE1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzMyLmgKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlyZXR1cm4gc3VuX2ZkYy0+ZGF0YV84MjA3MjsKIAljYXNlIDc6IC8qIEZEX0RJUiAqLwogCQlyZXR1cm4gc3VuX3JlYWRfZGlyKCk7Ci0JfTsKKwl9CiAJcGFuaWMoInN1bl84MjA3Ml9mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KIApAQCAtMTYxLDcgKzE2MSw3IEBACiAJY2FzZSA0OiAvKiBGRF9TVEFUVVMgKi8KIAkJc3VuX2ZkYy0+c3RhdHVzXzgyMDcyID0gdmFsdWU7CiAJCWJyZWFrOwotCX07CisJfQogCXJldHVybjsKIH0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAJCXJldHVybiBzdW5fZmRjLT5kYXRhXzgyMDc3OwogCWNhc2UgNzogLyogRkRfRElSICovCiAJCXJldHVybiBzdW5fcmVhZF9kaXIoKTsKLQl9OworCX0KIAlwYW5pYygic3VuXzgyMDc3X2ZkX2luYjogSG93IGRpZCBJIGdldCBoZXJlPyIpOwogfQogCkBAIC0yMTIsNyArMjEyLDcgQEAKIAljYXNlIDM6IC8qIEZEX1REUiAqLwogCQlzdW5fZmRjLT50YXBlY3RsXzgyMDc3ID0gdmFsdWU7CiAJCWJyZWFrOwotCX07CisJfQogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmgKaW5kZXggNjU5N2NlOC4uYmNlZjFmNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV82NC5oCkBAIC0xMTEsNyArMTExLDcgQEAKIAljYXNlIDc6IC8qIEZEX0RJUiAqLwogCQkvKiBYWFg6IElzIERDTCBvbiAweDgwIGluIHN1bjRtPyAqLwogCQlyZXR1cm4gc2J1c19yZWFkYigmc3VuX2ZkYy0+ZGlyXzgyMDc3KTsKLQl9OworCX0KIAlwYW5pYygic3VuXzgyMDcyX2ZkX2luYjogSG93IGRpZCBJIGdldCBoZXJlPyIpOwogfQogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAljYXNlIDQ6IC8qIEZEX1NUQVRVUyAqLwogCQlzYnVzX3dyaXRlYih2YWx1ZSwgJnN1bl9mZGMtPnN0YXR1c184MjA3Nyk7CiAJCWJyZWFrOwotCX07CisJfQogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc18zMi5oCmluZGV4IGQ0ZDA3MTEuLjE0ODQ4OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzMyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCk7CiBleHRlcm4gdm9pZCBhcmNoX2xvY2FsX2lycV9lbmFibGUodm9pZCk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI2LDE3ICsyNiwxNyBAQAogCXJldHVybiBmbGFnczsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAlhcmNoX2xvY2FsX2lycV9zYXZlKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXJldHVybiAoZmxhZ3MgJiBQU1JfUElMKSAhPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgYm9vbCBhcmNoX2lycXNfZGlzYWJsZWQodm9pZCkKIHsKIAlyZXR1cm4gYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGFyY2hfbG9jYWxfc2F2ZV9mbGFncygpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaAppbmRleCBhYWI5NjljLi4yM2NkMjdmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc182NC5oCkBAIC0xNCw3ICsxNCw3IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI2LDcgKzI2LDcgQEAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBhcmNoX2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJ3cnByCSUwLCAlJXBpbCIKQEAgLTM2LDcgKzM2LDcgQEAKIAkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkid3JwcgklMCwgJSVwaWwiCkBAIC00Niw3ICs0Niw3IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJ3cnByCTAsICUlcGlsIgpAQCAtNTYsMTcgKzU2LDE3IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgaW50IGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXJldHVybiAoZmxhZ3MgPiAwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgaW50IGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQogewogCXJldHVybiBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3MoYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRtcDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb24uaAppbmRleCA2YmRhZjFlLi5hNGU0NTdmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb24uaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb24uaApAQCAtMzE4LDYgKzMxOCw5IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGxlb25fYnVpbGRfZGV2aWNlX2lycSh1bnNpZ25lZCBpbnQgcmVhbF9pcnEsCiAJCQkJCSAgIGlycV9mbG93X2hhbmRsZXJfdCBmbG93X2hhbmRsZXIsCiAJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkb19hY2spOworZXh0ZXJuIHZvaWQgbGVvbl91cGRhdGVfdmlycV9oYW5kbGluZyh1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICAgIGlycV9mbG93X2hhbmRsZXJfdCBmbG93X2hhbmRsZXIsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZG9fYWNrKTsKIGV4dGVybiB2b2lkIGxlb25fY2xlYXJfY2xvY2tfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgbGVvbl9sb2FkX3Byb2ZpbGVfaXJxKGludCBjcHUsIHVuc2lnbmVkIGludCBsaW1pdCk7CiBleHRlcm4gdm9pZCBsZW9uX2luaXRfdGltZXJzKGlycV9oYW5kbGVyX3QgY291bnRlcl9mbik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb25fcGNpLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb25fcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiNGIzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbGVvbl9wY2kuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogYXNtL2xlb25fcGNpLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQWVyb2ZsZXggR2Fpc2xlciBBQiwgRGFuaWVsIEhlbGxzdHJvbQorICovCisKKyNpZm5kZWYgX0FTTV9MRU9OX1BDSV9IXworI2RlZmluZSBfQVNNX0xFT05fUENJX0hfCisKKy8qIFBDSSByZWxhdGVkIGRlZmluaXRpb25zICovCitzdHJ1Y3QgbGVvbl9wY2lfaW5mbyB7CisJc3RydWN0IHBjaV9vcHMgKm9wczsKKwlzdHJ1Y3QgcmVzb3VyY2UJaW9fc3BhY2U7CisJc3RydWN0IHJlc291cmNlCW1lbV9zcGFjZTsKKwlpbnQgKCptYXBfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOworfTsKKworZXh0ZXJuIHZvaWQgbGVvbl9wY2lfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldiwKKwkJCQlzdHJ1Y3QgbGVvbl9wY2lfaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfQVNNX0xFT05fUENJX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAppbmRleCBlOGM2NDg3Li45OWQ5YjlmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTgsOCArOCw2IEBACiBleHRlcm4gc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbXTsKIAogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkJKG5vZGVfZGF0YVtuaWRdKQotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9lbmRfcGZuKQogCiBleHRlcm4gaW50IG51bWFfY3B1X2xvb2t1cF90YWJsZVtdOwogZXh0ZXJuIGNwdW1hc2tfdCBudW1hX2NwdW1hc2tfbG9va3VwX3RhYmxlW107CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaAppbmRleCAzMzJhYzlhLi44NjJlM2NlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzMyLmgKQEAgLTQ3LDcgKzQ3LDMxIEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNpZm5kZWYgQ09ORklHX0xFT05fUENJCiAvKiBnZW5lcmljIHBjaSBzdHVmZiAqLwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS5oPgorI2Vsc2UKKy8qCisgKiBPbiBMRU9OIFBDSSBNZW1vcnkgc3BhY2UgaXMgbWFwcGVkIDE6MSB3aXRoIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuCisgKgorICogSS9PIHNwYWNlIGlzIGxvY2F0ZWQgYXQgbG93IDY0S2J5dGVzIGluIFBDSSBJL08gc3BhY2UuIFRoZSBJL08gYWRkcmVzc2VzCisgKiBhcmUgY29udmVydGVkIGludG8gQ1BVIGFkZHJlc3NlcyB0byB2aXJ0dWFsIGFkZHJlc3NlcyB0aGF0IGFyZSBtYXBwZWQgd2l0aAorICogTU1VIHRvIHRoZSBQQ0kgSG9zdCBQQ0kgSS9PIHNwYWNlIHdpbmRvdyB3aGljaCBhcmUgdHJhbnNsYXRlZCB0byB0aGUgbG93CisgKiA2NEtieXRlcyBieSB0aGUgSG9zdCBjb250cm9sbGVyLgorICovCisKK2V4dGVybiB2b2lkCitwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKKwkJCXN0cnVjdCByZXNvdXJjZSAqcmVzKTsKKworZXh0ZXJuIHZvaWQKK3BjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24pOworCitzdGF0aWMgaW5saW5lIGludCBwY2lfZ2V0X2xlZ2FjeV9pZGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBjaGFubmVsKQoreworCXJldHVybiBQQ0lfSVJRX05PTkU7Cit9CisjZW5kaWYKIAogI2VuZGlmIC8qIF9fU1BBUkNfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpYy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2ljLmgKaW5kZXggN2ViNWQ3OC4uNjY3NmNiYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2ljLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2ljLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAlpbnQJCQlwY2ljX2ltZGltOwogfTsKIAotI2lmZGVmIENPTkZJR19QQ0kKKyNpZmRlZiBDT05GSUdfUENJQ19QQ0kKIGV4dGVybiBpbnQgcGNpY19wcmVzZW50KHZvaWQpOwogZXh0ZXJuIGludCBwY2ljX3Byb2JlKHZvaWQpOwogZXh0ZXJuIHZvaWQgcGNpX3RpbWVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCmluZGV4IDQ3YTdlODYuLmFiYTE2MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaApAQCAtMjIwLDcgKzIyMCw3IEBACiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSA0OgogCQlyZXR1cm4geGNoZ191MzIocHRyLCB4KTsKLQl9OworCX0KIAlfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKIAlyZXR1cm4geDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oCmluZGV4IDNjOTZkM2IuLjEwYmNhYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fNjQuaApAQCAtMjM0LDcgKzIzNCw3IEBACiAJCXJldHVybiB4Y2hnMzIocHRyLCB4KTsKIAljYXNlIDg6CiAJCXJldHVybiB4Y2hnNjQocHRyLCB4KTsKLQl9OworCX0KIAlfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKIAlyZXR1cm4geDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggOWNmZjI3MC4uYjkwYjRhMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTczLDcgKzczLDkgQEAKIAogb2JqLXkgICAgICAgICAgICAgICAgICAgICArPSBkbWEubwogCi1vYmotJChDT05GSUdfU1BBUkMzMl9QQ0kpICs9IHBjaWMubworb2JqLSQoQ09ORklHX1BDSUNfUENJKSAgICArPSBwY2ljLm8KK29iai0kKENPTkZJR19MRU9OX1BDSSkgICAgKz0gbGVvbl9wY2kubworb2JqLSQoQ09ORklHX0dSUENJMikgICAgICArPSBsZW9uX3BjaV9ncnBjaTIubwogCiBvYmotJChDT05GSUdfU01QKSAgICAgICAgICs9IHRyYW1wb2xpbmVfJChCSVRTKS5vIHNtcF8kKEJJVFMpLm8KIG9iai0kKENPTkZJR19TUEFSQzMyX1NNUCkgKz0gc3VuNG1fc21wLm8gc3VuNGRfc21wLm8gbGVvbl9zbXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXBjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYwppbmRleCAxZTM0ZjI5Li5jYWVmOWRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQl9OworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKaW5kZXggODUwNWUwYS4uYWNmNTE1MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcGFuaWMoIkNhbid0IHNldCBBVVhJTyByZWdpc3RlciBvbiB0aGlzIG1hY2hpbmUuIik7Ci0JfTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXV4aW9fbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChzZXRfYXV4aW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvY2htYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2htYy5jCmluZGV4IDY2OGM3YmUuLjVmNDUwMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2NobWMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMKQEAgLTY2NCw3ICs2NjQsNyBAQAogCWNhc2UgMHgwOgogCQlicC0+aW50ZXJsZWF2ZSA9IDE2OwogCQlicmVhazsKLQl9OworCX0KIAogCS8qIFVLWzEwXSBpcyByZXNlcnZlZCwgYW5kIFVLWzExXSBpcyBub3Qgc2V0IGZvciB0aGUgU0RSQU0KIAkgKiBiYW5rIHNpemUgZGVmaW5pdGlvbi4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCmluZGV4IDgzNDE5NjMuLmY0NDVlOTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwpAQCAtMjI5LDcgKzIyOSw3IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCS5nbG9ibAlwYXRjaG1lX21heWJlX3NtcF9tc2cKIAotCWNtcAklbDcsIDEyCisJY21wCSVsNywgMTEKIHBhdGNobWVfbWF5YmVfc21wX21zZzoKIAliZ3UJbWF5YmVfc21wNG1fbXNnCiAJIG5vcApAQCAtMjkzLDcgKzI5Myw3IEBACiAJV1JJVEVfUEFVU0UKIAl3cgklbDQsIFBTUl9FVCwgJXBzcgogCVdSSVRFX1BBVVNFCi0Jc2xsCSVvMiwgMjgsICVvMgkJISBzaGlmdCBmb3Igc2ltcGxlciBjaGVja3MgYmVsb3cKKwlzcmwJJW8zLCAyOCwgJW8yCQkhIHNoaWZ0IGZvciBzaW1wbGVyIGNoZWNrcyBiZWxvdwogbWF5YmVfc21wNG1fbXNnX2NoZWNrX3NpbmdsZToKIAlhbmRjYwklbzIsIDB4MSwgJWcwCiAJYmVxLGEJbWF5YmVfc21wNG1fbXNnX2NoZWNrX21hc2sKQEAgLTE2MDQsNyArMTYwNCw3IEBACiAJcmV0bAogCSBub3AKIAotI2lmZGVmIENPTkZJR19QQ0kKKyNpZmRlZiBDT05GSUdfUENJQ19QQ0kKICNpbmNsdWRlIDxhc20vcGNpYy5oPgogCiAJLmFsaWduCTQKQEAgLTE2NTAsNyArMTY1MCw3IEBACiAJIHJkCSVwc3IsICVsMAogCS53b3JkCTAKIAotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKyNlbmRpZiAvKiBDT05GSUdfUENJQ19QQ0kgKi8KIAogCS5nbG9ibAlmbHVzaHdfYWxsCiBmbHVzaHdfYWxsOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fa2VybmVsLmMKaW5kZXggMmY1MzhhYy4uZDE3MjU1YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX2tlcm5lbC5jCkBAIC0yMzYsNiArMjM2LDIxIEBACiAJcmV0dXJuIGxlb25fYnVpbGRfZGV2aWNlX2lycShyZWFsX2lycSwgaGFuZGxlX3NpbXBsZV9pcnEsICJlZGdlIiwgMCk7CiB9CiAKK3ZvaWQgbGVvbl91cGRhdGVfdmlycV9oYW5kbGluZyh1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICAgIGlycV9mbG93X2hhbmRsZXJfdCBmbG93X2hhbmRsZXIsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZG9fYWNrKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICh1bnNpZ25lZCBsb25nKWlycV9nZXRfY2hpcF9kYXRhKHZpcnEpOworCisJbWFzayAmPSB+TEVPTl9ET19BQ0tfSFc7CisJaWYgKGRvX2FjaykKKwkJbWFzayB8PSBMRU9OX0RPX0FDS19IVzsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHZpcnEsICZsZW9uX2lycSwKKwkJCQkgICAgICBmbG93X2hhbmRsZXIsIG5hbWUpOworCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsICh2b2lkICopbWFzayk7Cit9CisKIHZvaWQgX19pbml0IGxlb25faW5pdF90aW1lcnMoaXJxX2hhbmRsZXJfdCBjb3VudGVyX2ZuKQogewogCWludCBpcnEsIGVpcnE7CkBAIC0zNjEsNiArMzc2LDIyIEBACiAJCXByb21faGFsdCgpOwogCX0KIAorI2lmZGVmIENPTkZJR19TTVAKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyoKKwkJICogSW4gU01QLCBzdW40bSBhZGRzIGEgSVBJIGhhbmRsZXIgdG8gSVJRIHRyYXAgaGFuZGxlciB0aGF0CisJCSAqIExFT04gbmV2ZXIgbXVzdCB0YWtlLCBzdW40ZCBhbmQgTEVPTiBvdmVyd3JpdGVzIHRoZSBicmFuY2gKKwkJICogd2l0aCBhIE5PUC4KKwkJICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJcGF0Y2htZV9tYXliZV9zbXBfbXNnWzBdID0gMHgwMTAwMDAwMDsgLyogTk9QIG91dCB0aGUgYnJhbmNoICovCisJCWxvY2FsX2ZsdXNoX2NhY2hlX2FsbCgpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorI2VuZGlmCisKIAlMRU9OM19CWVBBU1NfU1RPUkVfUEEoJmxlb24zX2dwdGltZXJfcmVncy0+ZVtsZW9uM19ncHRpbWVyX2lkeF0uY3RybCwKIAkJCSAgICAgIExFT04zX0dQVElNRVJfRU4gfAogCQkJICAgICAgTEVPTjNfR1BUSU1FUl9STCB8CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE5YTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIGxlb25fcGNpLmM6IExFT04gSG9zdCBQQ0kgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBZXJvZmxleCBHYWlzbGVyIEFCLCBEYW5pZWwgSGVsbHN0cm9tCisgKgorICogQ29kZSBpcyBwYXJ0aWFsbHkgZGVyaXZlZCBmcm9tIHBjaWMuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbGVvbi5oPgorI2luY2x1ZGUgPGFzbS9sZW9uX3BjaS5oPgorCisvKiBUaGUgTEVPTiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgcmVseSBvbiBhIEJJT1Mgb3IgYm9vdGxvYWRlciB0byBzZXR1cAorICogUENJIGZvciB1cy4gVGhlIExpbnV4IGdlbmVyaWMgcm91dGluZXMgYXJlIHVzZWQgdG8gc2V0dXAgcmVzb3VyY2VzLAorICogcmVzZXQgdmFsdWVzIG9mIGNvbmZ1cmF0aW9uLXNwYWNlIHJlZ2lzdGVycyBzZXR0aW5ncyBhZSBwcmVzZXZlZC4KKyAqLwordm9pZCBsZW9uX3BjaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2LCBzdHJ1Y3QgbGVvbl9wY2lfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcm9vdF9idXM7CisKKwlyb290X2J1cyA9IHBjaV9zY2FuX2J1c19wYXJlbnRlZCgmb2ZkZXYtPmRldiwgMCwgaW5mby0+b3BzLCBpbmZvKTsKKwlpZiAocm9vdF9idXMpIHsKKwkJcm9vdF9idXMtPnJlc291cmNlWzBdID0gJmluZm8tPmlvX3NwYWNlOworCQlyb290X2J1cy0+cmVzb3VyY2VbMV0gPSAmaW5mby0+bWVtX3NwYWNlOworCQlyb290X2J1cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJCS8qIEluaXQgYWxsIFBDSSBkZXZpY2VzIGludG8gUENJIHRyZWUgKi8KKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhyb290X2J1cyk7CisKKwkJLyogU2V0dXAgSVJRcyBvZiBhbGwgZGV2aWNlcyB1c2luZyBjdXN0b20gcm91dGluZXMgKi8KKwkJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBpbmZvLT5tYXBfaXJxKTsKKworCQkvKiBBc3NpZ24gZGV2aWNlcyB3aXRoIHJlc291cmNlcyAqLworCQlwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCk7CisJfQorfQorCisvKiBQQ0kgTWVtb3J5IGFuZCBQcmVmZXRjaGFibGUgTWVtb3J5IGlzIGRpcmVjdC1tYXBwZWQuIEhvd2V2ZXIgSS9PIFNwYWNlIGlzCisgKiBhY2Nlc3NlZCB0aHJvdWdoIGEgV2luZG93IHdoaWNoIGlzIHRyYW5zbGF0ZWQgdG8gbG93IDY0S0IgaW4gUENJIHNwYWNlLCB0aGUKKyAqIGZpcnN0IDRLQiBpcyBub3QgdXNlZCBzbyA2MEtCIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZ2VuZXJpYyBjb2RlIHRvIHRyYW5zbGF0ZSByZXNvdXJjZSBhZGRyZXNzZXMgaW50bworICogUENJIGFkZHJlc3Nlcy4KKyAqLwordm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKKwkJCSAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IGxlb25fcGNpX2luZm8gKmluZm8gPSBkZXYtPmJ1cy0+c3lzZGF0YTsKKworCXJlZ2lvbi0+c3RhcnQgPSByZXMtPnN0YXJ0OworCXJlZ2lvbi0+ZW5kID0gcmVzLT5lbmQ7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJcmVnaW9uLT5zdGFydCAtPSAoaW5mby0+aW9fc3BhY2Uuc3RhcnQgLSAweDEwMDApOworCQlyZWdpb24tPmVuZCAtPSAoaW5mby0+aW9fc3BhY2Uuc3RhcnQgLSAweDEwMDApOworCX0KK30KK0VYUE9SVF9TWU1CT0wocGNpYmlvc19yZXNvdXJjZV90b19idXMpOworCisvKiBzZWUgcGNpYmlvc19yZXNvdXJjZV90b19idXMoKSBjb21tZW50ICovCit2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbikKK3sKKwlzdHJ1Y3QgbGVvbl9wY2lfaW5mbyAqaW5mbyA9IGRldi0+YnVzLT5zeXNkYXRhOworCisJcmVzLT5zdGFydCA9IHJlZ2lvbi0+c3RhcnQ7CisJcmVzLT5lbmQgPSByZWdpb24tPmVuZDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlyZXMtPnN0YXJ0ICs9IChpbmZvLT5pb19zcGFjZS5zdGFydCAtIDB4MTAwMCk7CisJCXJlcy0+ZW5kICs9IChpbmZvLT5pb19zcGFjZS5zdGFydCAtIDB4MTAwMCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CisKK3ZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpwYnVzKQoreworCXN0cnVjdCBsZW9uX3BjaV9pbmZvICppbmZvID0gcGJ1cy0+c3lzZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBpLCBoYXNfaW8sIGhhc19tZW07CisJdTE2IGNtZDsKKworCS8qIEdlbmVyaWMgUENJIGJ1cyBwcm9iaW5nIHNldHMgdGhlc2UgdG8gcG9pbnQgYXQKKwkgKiAmaW97cG9ydCxtZW19X3Jlc291Y2Ugd2hpY2ggaXMgd3JvbmcgZm9yIHVzLgorCSAqLworCWlmIChwYnVzLT5zZWxmID09IE5VTEwpIHsKKwkJcGJ1cy0+cmVzb3VyY2VbMF0gPSAmaW5mby0+aW9fc3BhY2U7CisJCXBidXMtPnJlc291cmNlWzFdID0gJmluZm8tPm1lbV9zcGFjZTsKKwkJcGJ1cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJLyoKKwkJICogV2UgY2FuIG5vdCByZWx5IG9uIHRoYXQgdGhlIGJvb3Rsb2FkZXIgaGFzIGVuYWJsZWQgSS9PCisJCSAqIG9yIG1lbW9yeSBhY2Nlc3MgdG8gUENJIGRldmljZXMuIEluc3RlYWQgd2UgZW5hYmxlIGl0IGhlcmUKKwkJICogaWYgdGhlIGRldmljZSBoYXMgQkFScyBvZiByZXNwZWN0aXZlIHR5cGUuCisJCSAqLworCQloYXNfaW8gPSBoYXNfbWVtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBmID0gZGV2LT5yZXNvdXJjZVtpXS5mbGFnczsKKwkJCWlmIChmICYgSU9SRVNPVVJDRV9JTykKKwkJCQloYXNfaW8gPSAxOworCQkJZWxzZSBpZiAoZiAmIElPUkVTT1VSQ0VfTUVNKQorCQkJCWhhc19tZW0gPSAxOworCQl9CisJCS8qIFJPTSBCQVJzIGFyZSBtYXBwZWQgaW50byAzMi1iaXQgbWVtb3J5IHNwYWNlICovCisJCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmVuZCAhPSAwKSB7CisJCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9CisJCQkJCQkJSU9SRVNPVVJDRV9ST01fRU5BQkxFOworCQkJaGFzX21lbSA9IDE7CisJCX0KKwkJcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBidXMsIGRldi0+ZGV2Zm4sIFBDSV9DT01NQU5ELCAmY21kKTsKKwkJaWYgKGhhc19pbyAmJiAhKGNtZCAmIFBDSV9DT01NQU5EX0lPKSkgeworI2lmZGVmIENPTkZJR19QQ0lfREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIkxFT05QQ0k6IEVuYWJsaW5nIEkvTyBmb3IgZGV2ICVzXG4iLAorCQkJCQkgcGNpX25hbWUoZGV2KSk7CisjZW5kaWYKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQocGJ1cywgZGV2LT5kZXZmbiwgUENJX0NPTU1BTkQsCisJCQkJCQkJCQljbWQpOworCQl9CisJCWlmIChoYXNfbWVtICYmICEoY21kICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworI2lmZGVmIENPTkZJR19QQ0lfREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIkxFT05QQ0k6IEVuYWJsaW5nIE1FTU9SWSBmb3IgZGV2IgorCQkJCQkgIiVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKyNlbmRpZgorCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwkJCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQocGJ1cywgZGV2LT5kZXZmbiwgUENJX0NPTU1BTkQsCisJCQkJCQkJCQljbWQpOworCQl9CisJfQorfQorCisvKgorICogT3RoZXIgYXJjaHMgcGFyc2UgYXJndW1lbnRzIGhlcmUuCisgKi8KK2NoYXIgKiBfX2RldmluaXQgcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCit7CisJcmV0dXJuIHN0cjsKK30KKworcmVzb3VyY2Vfc2l6ZV90IHBjaWJpb3NfYWxpZ25fcmVzb3VyY2Uodm9pZCAqZGF0YSwgY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJcmVzb3VyY2Vfc2l6ZV90IHNpemUsIHJlc291cmNlX3NpemVfdCBhbGlnbikKK3sKKwlyZXR1cm4gcmVzLT5zdGFydDsKK30KKworaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKK30KKworc3RydWN0IGRldmljZV9ub2RlICpwY2lfZGV2aWNlX3RvX09GX25vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgdGhlIE9wZW5Cb290IG5vZGVzIGFyZSBub3QgY29ubmVjdGVkIHdpdGggdGhlIFBDSSBkZXZpY2UsCisJICogdGhpcyBpcyBiZWNhdXNlIHRoZSBMRU9OIFBST00gZG9lcyBub3QgY3JlYXRlIFBDSSBub2Rlcy4gRXZlbnR1YWxseQorCSAqIHRoaXMgd2lsbCBjaGFuZ2UgYW5kIHRoZSBzYW1lIGFwcHJvYWNoIGFzIHBjaWMuYyBjYW4gYmUgdXNlZCB0bworCSAqIG1hdGNoIFBST00gbm9kZXMgd2l0aCBwY2kgZGV2aWNlcy4KKwkgKi8KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2RldmljZV90b19PRl9ub2RlKTsKKwordm9pZCBfX2RldmluaXQgcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEpCit7CisjaWZkZWYgQ09ORklHX1BDSV9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJMRU9OUENJOiBBc3NpZ25pbmcgSVJRICUwMmQgdG8gJXNcbiIsIGlycSwKKwkJcGNpX25hbWUoZGV2KSk7CisjZW5kaWYKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Cit9CisKKy8qIGluL291dCByb3V0aW5lcyB0YWtlbiBmcm9tIHBjaWMuYworICoKKyAqIFRoaXMgcHJvYmFibHkgYmVsb25ncyBoZXJlIHJhdGhlciB0aGFuIGlvcG9ydC5jIGJlY2F1c2UKKyAqIHdlIGRvIG5vdCB3YW50IHRoaXMgY3J1ZCBsaW5rZWQgaW50byBTQnVzIGtlcm5lbHMuCisgKiBBbHNvLCB0aGluayBmb3IgYSBtb21lbnQgYWJvdXQgbGlrZXMgb2YgZmxvcHB5LmMgdGhhdAorICogaW5jbHVkZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgcGFydHMuIFRoZXkgbWF5IHdhbnQgdG8gcmVkZWZpbmUgaW5zL291dHMuCisgKgorICogV2UgZG8gbm90IHVzZSBob3JyaWJsZSBtYWNyb3MgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8KKyAqIGFkdmFuY2UgcG9pbnRlciBieSBzaXplb2Yoc2l6ZSkuCisgKi8KK3ZvaWQgb3V0c2IodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50IC09IDE7CisJCW91dGIoKihjb25zdCBjaGFyICopc3JjLCBhZGRyKTsKKwkJc3JjICs9IDE7CisJCS8qIGFkZHIgKz0gMTsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKG91dHNiKTsKKwordm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQpIHsKKwkJY291bnQgLT0gMjsKKwkJb3V0dygqKGNvbnN0IHNob3J0ICopc3JjLCBhZGRyKTsKKwkJc3JjICs9IDI7CisJCS8qIGFkZHIgKz0gMjsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKG91dHN3KTsKKwordm9pZCBvdXRzbCh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQpIHsKKwkJY291bnQgLT0gNDsKKwkJb3V0bCgqKGNvbnN0IGxvbmcgKilzcmMsIGFkZHIpOworCQlzcmMgKz0gNDsKKwkJLyogYWRkciArPSA0OyAqLworCX0KK30KK0VYUE9SVF9TWU1CT0wob3V0c2wpOworCit2b2lkIGluc2IodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50IC09IDE7CisJCSoodW5zaWduZWQgY2hhciAqKWRzdCA9IGluYihhZGRyKTsKKwkJZHN0ICs9IDE7CisJCS8qIGFkZHIgKz0gMTsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGluc2IpOworCit2b2lkIGluc3codW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50IC09IDI7CisJCSoodW5zaWduZWQgc2hvcnQgKilkc3QgPSBpbncoYWRkcik7CisJCWRzdCArPSAyOworCQkvKiBhZGRyICs9IDI7ICovCisJfQorfQorRVhQT1JUX1NZTUJPTChpbnN3KTsKKwordm9pZCBpbnNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXdoaWxlIChjb3VudCkgeworCQljb3VudCAtPSA0OworCQkvKgorCQkgKiBYWFggSSBhbSBzdXJlIHdlIGFyZSBpbiBmb3IgYW4gdW5hbGlnbmVkIHRyYXAgaGVyZS4KKwkJICovCisJCSoodW5zaWduZWQgbG9uZyAqKWRzdCA9IGlubChhZGRyKTsKKwkJZHN0ICs9IDQ7CisJCS8qIGFkZHIgKz0gNDsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGluc2wpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2lfZ3JwY2kyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRjMDkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2lfZ3JwY2kyLmMKQEAgLTAsMCArMSw4OTcgQEAKKy8qCisgKiBsZW9uX3BjaV9ncnBjaTIuYzogR1JQQ0kyIEhvc3QgUENJIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBZXJvZmxleCBHYWlzbGVyIEFCLCBEYW5pZWwgSGVsbHN0cm9tCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZW9uLmg+CisjaW5jbHVkZSA8YXNtL3ZhZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9sZW9uX3BjaS5oPgorCisjaW5jbHVkZSAiaXJxLmgiCisKK3N0cnVjdCBncnBjaTJfYmFyY2ZnIHsKKwl1bnNpZ25lZCBsb25nIHBjaWFkcjsJLyogUENJIFNwYWNlIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIGFoYmFkcjsJLyogUENJIEJhc2UgYWRkcmVzcyBtYXBwZWQgdG8gdGhpcyBBSEIgYWRkciAqLworfTsKKworLyogRGV2aWNlIE5vZGUgQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICogIC0gYmFyY2ZncyAgICA6IEN1c3RvbSBDb25maWd1cmF0aW9uIG9mIEhvc3QncyA2IHRhcmdldCBCQVJzCisgKiAgLSBpcnFfbWFzayAgIDogTGltaXQgd2hpY2ggUENJIGludGVycnVwdHMgYXJlIGVuYWJsZWQKKyAqICAtIGRvX3Jlc2V0ICAgOiBGb3JjZSBQQ0kgUmVzZXQgb24gc3RhcnR1cAorICoKKyAqIGJhcmNmZ3MKKyAqID09PT09PT0KKyAqCisgKiBPcHRpb25hbCBjdXN0b20gVGFyZ2V0IEJBUiBjb25maWd1cmF0aW9uIChzZWUgc3RydWN0IGdycGNpMl9iYXJjZmcpLiBBbGwKKyAqIGFkZHJlc3NlcyBhcmUgcGh5c2ljYWwuIEFycmF5IGFsd2F5cyBjb250YWlucyA2IGVsZW1lbnRzIChsZW49Mio0KjYgYnl0ZXMpCisgKgorICogLTEgbWVhbnMgbm90IGNvbmZpZ3VyZWQgKGxldCBob3N0IGRyaXZlciBkbyBkZWZhdWx0IHNldHVwKS4KKyAqCisgKiBbaSoyKzBdID0gUENJIEFkZHJlc3Mgb2YgQkFSW2ldIG9uIHRhcmdldCBpbnRlcmZhY2UKKyAqIFtpKjIrMV0gPSBBY2Nlc3NpbmcgUENJIGFkZHJlc3Mgb2YgQkFSW2ldIHJlc3VsdCBpbiB0aGlzIEFNQkEgYWRkcmVzcworICoKKyAqCisgKiBpcnFfbWFzaworICogPT09PT09PT0KKyAqCisgKiBMaW1pdCB3aGljaCBQQ0kgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4gMD1EaXNhYmxlLCAxPUVuYWJsZS4gQnkgZGVmYXVsdAorICogYWxsIGFyZSBlbmFibGVkLiBVc2UgdGhpcyB3aGVuIFBDSSBpbnRlcnJ1cHQgcGlucyBhcmUgZmxvYXRpbmcgb24gUENCLgorICogaW50LCBsZW49NC4KKyAqICBiaXQwID0gUENJIElOVEEjCisgKiAgYml0MSA9IFBDSSBJTlRCIworICogIGJpdDIgPSBQQ0kgSU5UQyMKKyAqICBiaXQzID0gUENJIElOVEQjCisgKgorICoKKyAqIHJlc2V0CisgKiA9PT09PQorICoKKyAqIEZvcmNlIFBDSSByZXNldCBvbiBzdGFydHVwLiBpbnQsIGxlbj00CisgKi8KKworLyogRW5hYmxlIERlYnVnZ2luZyBDb25maWd1cmF0aW9uIFNwYWNlIEFjY2VzcyAqLworI3VuZGVmIEdSUENJMl9ERUJVR19DRkdBQ0NFU1MKKworLyoKKyAqIEdSUENJMiBBUEIgUmVnaXN0ZXIgTUFQCisgKi8KK3N0cnVjdCBncnBjaTJfcmVncyB7CisJdW5zaWduZWQgaW50IGN0cmw7CQkvKiAweDAwIENvbnRyb2wgKi8KKwl1bnNpZ25lZCBpbnQgc3RzX2NhcDsJCS8qIDB4MDQgU3RhdHVzIC8gQ2FwYWJpbGl0aWVzICovCisJaW50IHJlczE7CQkJLyogMHgwOCAqLworCXVuc2lnbmVkIGludCBpb19tYXA7CQkvKiAweDBDIEkvTyBNYXAgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBkbWFfY3RybDsJCS8qIDB4MTAgRE1BICovCisJdW5zaWduZWQgaW50IGRtYV9iZGJhc2U7CS8qIDB4MTQgRE1BICovCisJaW50IHJlczJbMl07CQkJLyogMHgxOCAqLworCXVuc2lnbmVkIGludCBiYXJzWzZdOwkJLyogMHgyMCByZWFkLW9ubHkgUENJIEJBUnMgKi8KKwlpbnQgcmVzM1syXTsJCQkvKiAweDM4ICovCisJdW5zaWduZWQgaW50IGFoYm1zdF9tYXBbMTZdOwkvKiAweDQwIEFIQi0+UENJIE1hcCBwZXIgQUhCIE1hc3RlciAqLworCisJLyogUENJIFRyYWNlIEJ1ZmZlciBSZWdpc3RlcnMgKE9QVElPTkFMKSAqLworCXVuc2lnbmVkIGludCB0X2N0cmw7CQkvKiAweDgwICovCisJdW5zaWduZWQgaW50IHRfY250OwkJLyogMHg4NCAqLworCXVuc2lnbmVkIGludCB0X2FkcGF0OwkJLyogMHg4OCAqLworCXVuc2lnbmVkIGludCB0X2FkbWFzazsJCS8qIDB4OEMgKi8KKwl1bnNpZ25lZCBpbnQgdF9zaWdwYXQ7CQkvKiAweDkwICovCisJdW5zaWduZWQgaW50IHRfc2lnbWFzazsJCS8qIDB4OTQgKi8KKwl1bnNpZ25lZCBpbnQgdF9hZHN0YXRlOwkJLyogMHg5OCAqLworCXVuc2lnbmVkIGludCB0X3NpZ3N0YXRlOwkvKiAweDlDICovCit9OworCisjZGVmaW5lIFJFR0xPQUQoYSkJKGJlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKCYoYSkpKSkKKyNkZWZpbmUgUkVHU1RPUkUoYSwgdikJKF9fcmF3X3dyaXRlbChjcHVfdG9fYmUzMih2KSwgJihhKSkpCisKKyNkZWZpbmUgQ1RSTF9CVVNfQklUIDE2CisKKyNkZWZpbmUgQ1RSTF9SRVNFVCAoMTw8MzEpCisjZGVmaW5lIENUUkxfU0kgKDE8PDI3KQorI2RlZmluZSBDVFJMX1BFICgxPDwyNikKKyNkZWZpbmUgQ1RSTF9FSSAoMTw8MjUpCisjZGVmaW5lIENUUkxfRVIgKDE8PDI0KQorI2RlZmluZSBDVFJMX0JVUyAoMHhmZjw8Q1RSTF9CVVNfQklUKQorI2RlZmluZSBDVFJMX0hPU1RJTlQgMHhmCisKKyNkZWZpbmUgU1RTX0hPU1RfQklUCTMxCisjZGVmaW5lIFNUU19NU1RfQklUCTMwCisjZGVmaW5lIFNUU19UQVJfQklUCTI5CisjZGVmaW5lIFNUU19ETUFfQklUCTI4CisjZGVmaW5lIFNUU19ESV9CSVQJMjcKKyNkZWZpbmUgU1RTX0hJX0JJVAkyNgorI2RlZmluZSBTVFNfSVJRTU9ERV9CSVQJMjQKKyNkZWZpbmUgU1RTX1RSQUNFX0JJVAkyMworI2RlZmluZSBTVFNfQ0ZHRVJSVkFMSURfQklUIDIwCisjZGVmaW5lIFNUU19DRkdFUlJfQklUCTE5CisjZGVmaW5lIFNUU19JTlRUWVBFX0JJVAkxMgorI2RlZmluZSBTVFNfSU5UU1RTX0JJVAk4CisjZGVmaW5lIFNUU19GREVQVEhfQklUCTIKKyNkZWZpbmUgU1RTX0ZOVU1fQklUCTAKKworI2RlZmluZSBTVFNfSE9TVAkoMTw8U1RTX0hPU1RfQklUKQorI2RlZmluZSBTVFNfTVNUCQkoMTw8U1RTX01TVF9CSVQpCisjZGVmaW5lIFNUU19UQVIJCSgxPDxTVFNfVEFSX0JJVCkKKyNkZWZpbmUgU1RTX0RNQQkJKDE8PFNUU19ETUFfQklUKQorI2RlZmluZSBTVFNfREkJCSgxPDxTVFNfRElfQklUKQorI2RlZmluZSBTVFNfSEkJCSgxPDxTVFNfSElfQklUKQorI2RlZmluZSBTVFNfSVJRTU9ERQkoMHgzPDxTVFNfSVJRTU9ERV9CSVQpCisjZGVmaW5lIFNUU19UUkFDRQkoMTw8U1RTX1RSQUNFX0JJVCkKKyNkZWZpbmUgU1RTX0NGR0VSUlZBTElECSgxPDxTVFNfQ0ZHRVJSVkFMSURfQklUKQorI2RlZmluZSBTVFNfQ0ZHRVJSCSgxPDxTVFNfQ0ZHRVJSX0JJVCkKKyNkZWZpbmUgU1RTX0lOVFRZUEUJKDB4M2Y8PFNUU19JTlRUWVBFX0JJVCkKKyNkZWZpbmUgU1RTX0lOVFNUUwkoMHhmPDxTVFNfSU5UU1RTX0JJVCkKKyNkZWZpbmUgU1RTX0ZERVBUSAkoMHg3PDxTVFNfRkRFUFRIX0JJVCkKKyNkZWZpbmUgU1RTX0ZOVU0JKDB4Mzw8U1RTX0ZOVU1fQklUKQorCisjZGVmaW5lIFNUU19JU1lTRVJSCSgxPDwxNykKKyNkZWZpbmUgU1RTX0lETUEJKDE8PDE2KQorI2RlZmluZSBTVFNfSURNQUVSUgkoMTw8MTUpCisjZGVmaW5lIFNUU19JTVNUQUJSVAkoMTw8MTQpCisjZGVmaW5lIFNUU19JVEdUQUJSVAkoMTw8MTMpCisjZGVmaW5lIFNUU19JUEFSRVJSCSgxPDwxMikKKworI2RlZmluZSBTVFNfRVJSX0lSUSAoU1RTX0lTWVNFUlIgfCBTVFNfSU1TVEFCUlQgfCBTVFNfSVRHVEFCUlQgfCBTVFNfSVBBUkVSUikKKworc3RydWN0IGdycGNpMl9iZF9jaGFuIHsKKwl1bnNpZ25lZCBpbnQgY3RybDsJLyogMHgwMCBETUEgQ29udHJvbCAqLworCXVuc2lnbmVkIGludCBuY2hhbjsJLyogMHgwNCBOZXh0IERNQSBDaGFubmVsIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgbmJkOwkvKiAweDA4IE5leHQgRGF0YSBEZXNjcmlwdG9yIGluIGNoYW4gKi8KKwl1bnNpZ25lZCBpbnQgcmVzOwkvKiAweDBDIFJlc2VydmVkICovCit9OworCisjZGVmaW5lIEJEX0NIQU5fRU4JCTB4ODAwMDAwMDAKKyNkZWZpbmUgQkRfQ0hBTl9UWVBFCQkweDAwMzAwMDAwCisjZGVmaW5lIEJEX0NIQU5fQkRDTlQJCTB4MDAwMGZmZmYKKyNkZWZpbmUgQkRfQ0hBTl9FTl9CSVQJCTMxCisjZGVmaW5lIEJEX0NIQU5fVFlQRV9CSVQJMjAKKyNkZWZpbmUgQkRfQ0hBTl9CRENOVF9CSVQJMAorCitzdHJ1Y3QgZ3JwY2kyX2JkX2RhdGEgeworCXVuc2lnbmVkIGludCBjdHJsOwkvKiAweDAwIERNQSBEYXRhIENvbnRyb2wgKi8KKwl1bnNpZ25lZCBpbnQgcGNpX2FkcjsJLyogMHgwNCBQQ0kgU3RhcnQgQWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBhaGJfYWRyOwkvKiAweDA4IEFIQiBTdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IG5leHQ7CS8qIDB4MEMgTmV4dCBEYXRhIERlc2NyaXB0b3IgaW4gY2hhbiAqLworfTsKKworI2RlZmluZSBCRF9EQVRBX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIEJEX0RBVEFfSUUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQkRfREFUQV9EUgkJMHgyMDAwMDAwMAorI2RlZmluZSBCRF9EQVRBX1RZUEUJCTB4MDAzMDAwMDAKKyNkZWZpbmUgQkRfREFUQV9FUgkJMHgwMDA4MDAwMAorI2RlZmluZSBCRF9EQVRBX0xFTgkJMHgwMDAwZmZmZgorI2RlZmluZSBCRF9EQVRBX0VOX0JJVAkJMzEKKyNkZWZpbmUgQkRfREFUQV9JRV9CSVQJCTMwCisjZGVmaW5lIEJEX0RBVEFfRFJfQklUCQkyOQorI2RlZmluZSBCRF9EQVRBX1RZUEVfQklUCTIwCisjZGVmaW5lIEJEX0RBVEFfRVJfQklUCQkxOQorI2RlZmluZSBCRF9EQVRBX0xFTl9CSVQJCTAKKworLyogR1JQQ0kyIENhcGFiaWxpdHkgKi8KK3N0cnVjdCBncnBjaTJfY2FwX2ZpcnN0IHsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKwl1bnNpZ25lZCBpbnQgcGNpMmFoYl9tYXBbNl07CisJdW5zaWduZWQgaW50IGV4dDJhaGJfbWFwOworCXVuc2lnbmVkIGludCBpb19tYXA7CisJdW5zaWduZWQgaW50IHBjaWJhcl9zaXplWzZdOworfTsKKyNkZWZpbmUgQ0FQOV9DVFJMX09GUyAwCisjZGVmaW5lIENBUDlfQkFSX09GUyAweDQKKyNkZWZpbmUgQ0FQOV9JT01BUF9PRlMgMHgyMAorI2RlZmluZSBDQVA5X0JBUlNJWkVfT0ZTIDB4MjQKKworc3RydWN0IGdycGNpMl9wcml2IHsKKwlzdHJ1Y3QgbGVvbl9wY2lfaW5mbwlpbmZvOyAvKiBtdXN0IGJlIG9uIHRvcCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCBncnBjaTJfcmVncwkqcmVnczsKKwljaGFyCQkJaXJxOworCWNoYXIJCQlpcnFfbW9kZTsgLyogSVJRIE1vZGUgZnJvbSBDQVBTVFMgUkVHICovCisJY2hhcgkJCWJ0X2VuYWJsZWQ7CisJY2hhcgkJCWRvX3Jlc2V0OworCWNoYXIJCQlpcnFfbWFzazsKKwl1MzIJCQlwY2lpZDsgLyogUENJIElEIG9mIEhvc3QgKi8KKwl1bnNpZ25lZCBjaGFyCQlpcnFfbWFwWzRdOworCisJLyogVmlydHVhbCBJUlEgbnVtYmVycyAqLworCXVuc2lnbmVkIGludAkJdmlycV9lcnI7CisJdW5zaWduZWQgaW50CQl2aXJxX2RtYTsKKworCS8qIEFIQiBQQ0kgV2luZG93cyAqLworCXVuc2lnbmVkIGxvbmcJCXBjaV9hcmVhOwkvKiBNRU1PUlkgKi8KKwl1bnNpZ25lZCBsb25nCQlwY2lfYXJlYV9lbmQ7CisJdW5zaWduZWQgbG9uZwkJcGNpX2lvOwkJLyogSS9PICovCisJdW5zaWduZWQgbG9uZwkJcGNpX2NvbmY7CS8qIENPTkZJR1VSQVRJT04gKi8KKwl1bnNpZ25lZCBsb25nCQlwY2lfY29uZl9lbmQ7CisJdW5zaWduZWQgbG9uZwkJcGNpX2lvX3ZhOworCisJc3RydWN0IGdycGNpMl9iYXJjZmcJdGd0YmFyc1s2XTsKK307CisKK0RFRklORV9TUElOTE9DSyhncnBjaTJfZGV2X2xvY2spOworc3RydWN0IGdycGNpMl9wcml2ICpncnBjaTJwcml2OworCitpbnQgZ3JwY2kyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiA9IGRldi0+YnVzLT5zeXNkYXRhOworCWludCBpcnFfZ3JvdXA7CisKKwkvKiBVc2UgZGVmYXVsdCBJUlEgZGVjb2Rpbmcgb24gUENJIEJVUzAgYWNjb3JkaW5nIHNsb3QgbnVtYmVyaW5nICovCisJaXJxX2dyb3VwID0gc2xvdCAmIDB4MzsKKwlwaW4gPSAoKHBpbiAtIDEpICsgaXJxX2dyb3VwKSAmIDB4MzsKKworCXJldHVybiBwcml2LT5pcnFfbWFwW3Bpbl07Cit9CisKK3N0YXRpYyBpbnQgZ3JwY2kyX2NmZ19yMzIoc3RydWN0IGdycGNpMl9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCB1MzIgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgKnBjaV9jb25mOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRtcDsKKworCWlmICh3aGVyZSAmIDB4MykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pICE9IDApCisJCWRldmZuICs9ICgweDggKiA2KTsKKworCS8qIFNlbGVjdCBidXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3JwY2kyX2Rldl9sb2NrLCBmbGFncyk7CisJUkVHU1RPUkUocHJpdi0+cmVncy0+Y3RybCwgKFJFR0xPQUQocHJpdi0+cmVncy0+Y3RybCkgJiB+KDB4ZmYgPDwgMTYpKSB8CisJCQkJICAgKGJ1cyA8PCAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworCisJLyogY2xlYXIgb2xkIHN0YXR1cyAqLworCVJFR1NUT1JFKHByaXYtPnJlZ3MtPnN0c19jYXAsIChTVFNfQ0ZHRVJSIHwgU1RTX0NGR0VSUlZBTElEKSk7CisKKwlwY2lfY29uZiA9ICh1bnNpZ25lZCBpbnQgKikgKHByaXYtPnBjaV9jb25mIHwKKwkJCQkJCShkZXZmbiA8PCA4KSB8ICh3aGVyZSAmIDB4ZmMpKTsKKwl0bXAgPSBMRU9OM19CWVBBU1NfTE9BRF9QQShwY2lfY29uZik7CisKKwkvKiBXYWl0IHVudGlsIEdSUENJMiBzaWduYWxzIHRoYXQgQ0ZHIGFjY2VzcyBpcyBkb25lLCBpdCBzaG91bGQgYmUKKwkgKiBkb25lIGluc3RhbnRhbmVvdXNseSB1bmxlc3MgYSBETUEgb3BlcmF0aW9uIGlzIG9uZ29pbmcuLi4KKwkgKi8KKwl3aGlsZSAoKFJFR0xPQUQocHJpdi0+cmVncy0+c3RzX2NhcCkgJiBTVFNfQ0ZHRVJSVkFMSUQpID09IDApCisJCTsKKworCWlmIChSRUdMT0FEKHByaXYtPnJlZ3MtPnN0c19jYXApICYgU1RTX0NGR0VSUikgeworCQkqdmFsID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQkvKiBCdXMgYWx3YXlzIGxpdHRsZSBlbmRpYW4gKHVuYWZmZWN0ZWQgYnkgYnl0ZS1zd2FwcGluZykgKi8KKwkJKnZhbCA9IGZsaXBfZHdvcmQodG1wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncnBjaTJfY2ZnX3IxNihzdHJ1Y3QgZ3JwY2kyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBidXMsCisJCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIHUzMiAqdmFsKQoreworCXUzMiB2OworCWludCByZXQ7CisKKwlpZiAod2hlcmUgJiAweDEpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGdycGNpMl9jZmdfcjMyKHByaXYsIGJ1cywgZGV2Zm4sIHdoZXJlICYgfjB4MywgJnYpOworCSp2YWwgPSAweGZmZmYgJiAodiA+PiAoOCAqICh3aGVyZSAmIDB4MykpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdycGNpMl9jZmdfcjgoc3RydWN0IGdycGNpMl9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCB1MzIgKnZhbCkKK3sKKwl1MzIgdjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3JwY2kyX2NmZ19yMzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUgJiB+MHgzLCAmdik7CisJKnZhbCA9IDB4ZmYgJiAodiA+PiAoOCAqICh3aGVyZSAmIDMpKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdycGNpMl9jZmdfdzMyKHN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgKnBjaV9jb25mOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAod2hlcmUgJiAweDMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSAhPSAwKQorCQlkZXZmbiArPSAoMHg4ICogNik7CisKKwkvKiBTZWxlY3QgYnVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworCVJFR1NUT1JFKHByaXYtPnJlZ3MtPmN0cmwsIChSRUdMT0FEKHByaXYtPnJlZ3MtPmN0cmwpICYgfigweGZmIDw8IDE2KSkgfAorCQkJCSAgIChidXMgPDwgMTYpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncnBjaTJfZGV2X2xvY2ssIGZsYWdzKTsKKworCS8qIGNsZWFyIG9sZCBzdGF0dXMgKi8KKwlSRUdTVE9SRShwcml2LT5yZWdzLT5zdHNfY2FwLCAoU1RTX0NGR0VSUiB8IFNUU19DRkdFUlJWQUxJRCkpOworCisJcGNpX2NvbmYgPSAodW5zaWduZWQgaW50ICopIChwcml2LT5wY2lfY29uZiB8CisJCQkJCQkoZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiAweGZjKSk7CisJTEVPTjNfQllQQVNTX1NUT1JFX1BBKHBjaV9jb25mLCBmbGlwX2R3b3JkKHZhbCkpOworCisJLyogV2FpdCB1bnRpbCBHUlBDSTIgc2lnbmFscyB0aGF0IENGRyBhY2Nlc3MgaXMgZG9uZSwgaXQgc2hvdWxkIGJlCisJICogZG9uZSBpbnN0YW50YW5lb3VzbHkgdW5sZXNzIGEgRE1BIG9wZXJhdGlvbiBpcyBvbmdvaW5nLi4uCisJICovCisJd2hpbGUgKChSRUdMT0FEKHByaXYtPnJlZ3MtPnN0c19jYXApICYgU1RTX0NGR0VSUlZBTElEKSA9PSAwKQorCQk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncnBjaTJfY2ZnX3cxNihzdHJ1Y3QgZ3JwY2kyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBidXMsCisJCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIHUzMiB2YWwpCit7CisJaW50IHJldDsKKwl1MzIgdjsKKworCWlmICh3aGVyZSAmIDB4MSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gZ3JwY2kyX2NmZ19yMzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUmfjMsICZ2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXYgPSAodiAmIH4oMHhmZmZmIDw8ICg4ICogKHdoZXJlICYgMHgzKSkpKSB8CisJICAgICgoMHhmZmZmICYgdmFsKSA8PCAoOCAqICh3aGVyZSAmIDB4MykpKTsKKwlyZXR1cm4gZ3JwY2kyX2NmZ193MzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUgJiB+MHgzLCB2KTsKK30KKworc3RhdGljIGludCBncnBjaTJfY2ZnX3c4KHN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgdTMyIHZhbCkKK3sKKwlpbnQgcmV0OworCXUzMiB2OworCisJcmV0ID0gZ3JwY2kyX2NmZ19yMzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUgJiB+MHgzLCAmdik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCXYgPSAodiAmIH4oMHhmZiA8PCAoOCAqICh3aGVyZSAmIDB4MykpKSkgfAorCSAgICAoKDB4ZmYgJiB2YWwpIDw8ICg4ICogKHdoZXJlICYgMHgzKSkpOworCXJldHVybiBncnBjaTJfY2ZnX3czMihwcml2LCBidXMsIGRldmZuLCB3aGVyZSAmIH4weDMsIHYpOworfQorCisvKiBSZWFkIGZyb20gQ29uZmlndXJhdGlvbiBTcGFjZS4gV2hlbiBlbnRlcmluZyBoZXJlIHRoZSBQQ0kgbGF5ZXIgaGFzIHRha2VuCisgKiB0aGUgcGNpX2xvY2sgc3BpbmxvY2sgYW5kIElSUSBpcyBvZmYuCisgKi8KK3N0YXRpYyBpbnQgZ3JwY2kyX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiA9IGdycGNpMnByaXY7CisJdW5zaWduZWQgaW50IGJ1c25vID0gYnVzLT5udW1iZXI7CisJaW50IHJldDsKKworCWlmIChQQ0lfU0xPVChkZXZmbikgPiAxNSB8fCAoUENJX1NMT1QoZGV2Zm4pID09IDAgJiYgYnVzbm8gPT0gMCkpIHsKKwkJKnZhbCA9IH4wOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCXJldCA9IGdycGNpMl9jZmdfcjgocHJpdiwgYnVzbm8sIGRldmZuLCB3aGVyZSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZXQgPSBncnBjaTJfY2ZnX3IxNihwcml2LCBidXNubywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJldCA9IGdycGNpMl9jZmdfcjMyKHByaXYsIGJ1c25vLCBkZXZmbiwgd2hlcmUsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworI2lmZGVmIEdSUENJMl9ERUJVR19DRkdBQ0NFU1MKKwlwcmludGsoS0VSTl9JTkZPICJncnBjaTJfcmVhZF9jb25maWc6IFslMDJ4OiUwMng6JXhdIG9mcz0lZCB2YWw9JXggIgorCQkic2l6ZT0lZFxuIiwgYnVzbm8sIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pLCB3aGVyZSwKKwkJKnZhbCwgc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFdyaXRlIHRvIENvbmZpZ3VyYXRpb24gU3BhY2UuIFdoZW4gZW50ZXJpbmcgaGVyZSB0aGUgUENJIGxheWVyIGhhcyB0YWtlbgorICogdGhlIHBjaV9sb2NrIHNwaW5sb2NrIGFuZCBJUlEgaXMgb2ZmLgorICovCitzdGF0aWMgaW50IGdycGNpMl93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCit7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKwl1bnNpZ25lZCBpbnQgYnVzbm8gPSBidXMtPm51bWJlcjsKKworCWlmIChQQ0lfU0xPVChkZXZmbikgPiAxNSB8fCAoUENJX1NMT1QoZGV2Zm4pID09IDAgJiYgYnVzbm8gPT0gMCkpCisJCXJldHVybiAwOworCisjaWZkZWYgR1JQQ0kyX0RFQlVHX0NGR0FDQ0VTUworCXByaW50ayhLRVJOX0lORk8gImdycGNpMl93cml0ZV9jb25maWc6IFslMDJ4OiUwMng6JXhdIG9mcz0lZCBzaXplPSVkICIKKwkJInZhbD0leFxuIiwgYnVzbm8sIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pLAorCQl3aGVyZSwgc2l6ZSwgdmFsKTsKKyNlbmRpZgorCisJc3dpdGNoIChzaXplKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAxOgorCQlyZXR1cm4gZ3JwY2kyX2NmZ193OChwcml2LCBidXNubywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCWNhc2UgMjoKKwkJcmV0dXJuIGdycGNpMl9jZmdfdzE2KHByaXYsIGJ1c25vLCBkZXZmbiwgd2hlcmUsIHZhbCk7CisJY2FzZSA0OgorCQlyZXR1cm4gZ3JwY2kyX2NmZ193MzIocHJpdiwgYnVzbm8sIGRldmZuLCB3aGVyZSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBncnBjaTJfb3BzID0geworCS5yZWFkID0JCWdycGNpMl9yZWFkX2NvbmZpZywKKwkud3JpdGUgPQlncnBjaTJfd3JpdGVfY29uZmlnLAorfTsKKworLyogR0VOSVJRIElSUSBjaGlwIGltcGxlbWVudGF0aW9uIGZvciBHUlBDSTIgaXJxbW9kZT0wLi4yLiBJbiBjb25maWd1cmF0aW9uCisgKiAzIHdoZXJlIGFsbCBQQ0kgSW50ZXJydXB0cyBoYXMgYSBzZXBhcmF0ZSBJUlEgb24gdGhlIHN5c3RlbSBJUlEgY29udHJvbGxlcgorICogdGhpcyBpcyBub3QgbmVlZGVkIGFuZCB0aGUgc3RhbmRhcmQgSVJRIGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQuCisgKi8KKworc3RhdGljIHZvaWQgZ3JwY2kyX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnFpZHg7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKworCWlycWlkeCA9ICh1bnNpZ25lZCBpbnQpZGF0YS0+Y2hpcF9kYXRhIC0gMTsKKwlpZiAoaXJxaWR4ID4gMykgLyogb25seSBtYXNrIFBDSSBpbnRlcnJ1cHRzIGhlcmUgKi8KKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworCVJFR1NUT1JFKHByaXYtPnJlZ3MtPmN0cmwsIFJFR0xPQUQocHJpdi0+cmVncy0+Y3RybCkgJiB+KDEgPDwgaXJxaWR4KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3JwY2kyX2Rldl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdycGNpMl91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnFpZHg7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKworCWlycWlkeCA9ICh1bnNpZ25lZCBpbnQpZGF0YS0+Y2hpcF9kYXRhIC0gMTsKKwlpZiAoaXJxaWR4ID4gMykgLyogb25seSB1bm1hc2sgUENJIGludGVycnVwdHMgaGVyZSAqLworCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3JwY2kyX2Rldl9sb2NrLCBmbGFncyk7CisJUkVHU1RPUkUocHJpdi0+cmVncy0+Y3RybCwgUkVHTE9BRChwcml2LT5yZWdzLT5jdHJsKSB8ICgxIDw8IGlycWlkeCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdycGNpMl9zdGFydHVwX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJZ3JwY2kyX3VubWFza19pcnEoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdycGNpMl9zaHV0ZG93bl9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWdycGNpMl9tYXNrX2lycShkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncnBjaTJfaXJxID0geworCS5uYW1lCQk9ICJncnBjaTIiLAorCS5pcnFfc3RhcnR1cAk9IGdycGNpMl9zdGFydHVwX2lycSwKKwkuaXJxX3NodXRkb3duCT0gZ3JwY2kyX3NodXRkb3duX2lycSwKKwkuaXJxX21hc2sJPSBncnBjaTJfbWFza19pcnEsCisJLmlycV91bm1hc2sJPSBncnBjaTJfdW5tYXNrX2lycSwKK307CisKKy8qIEhhbmRsZSBvbmUgb3IgbXVsdGlwbGUgSVJRcyBmcm9tIHRoZSBQQ0kgY29yZSAqLworc3RhdGljIHZvaWQgZ3JwY2kyX3BjaV9mbG93X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKwlpbnQgaSwgYWNrID0gMDsKKwl1bnNpZ25lZCBpbnQgY3RybCwgc3RzX2NhcCwgcGNpX2ludHM7CisKKwljdHJsID0gUkVHTE9BRChwcml2LT5yZWdzLT5jdHJsKTsKKwlzdHNfY2FwID0gUkVHTE9BRChwcml2LT5yZWdzLT5zdHNfY2FwKTsKKworCS8qIEVycm9yIEludGVycnVwdD8gKi8KKwlpZiAoc3RzX2NhcCAmIFNUU19FUlJfSVJRKSB7CisJCWdlbmVyaWNfaGFuZGxlX2lycShwcml2LT52aXJxX2Vycik7CisJCWFjayA9IDE7CisJfQorCisJLyogUENJIEludGVycnVwdD8gKi8KKwlwY2lfaW50cyA9ICgofnN0c19jYXApID4+IFNUU19JTlRTVFNfQklUKSAmIGN0cmwgJiBDVFJMX0hPU1RJTlQ7CisJaWYgKHBjaV9pbnRzKSB7CisJCS8qIENhbGwgcmVzcGVjdGl2ZSBQQ0kgSW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKHBjaV9pbnRzICYgKDEgPDwgaSkpCisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHByaXYtPmlycV9tYXBbaV0pOworCQl9CisJCWFjayA9IDE7CisJfQorCisJLyoKKwkgKiBEZWNvZGUgRE1BIEludGVycnVwdCBvbmx5IHdoZW4gc2hhcmVkIHdpdGggRXJyIGFuZCBQQ0kgSU5UWCMsIHdoZW4KKwkgKiB0aGUgRE1BIGlzIGEgdW5pcXVlIElSUSB0aGUgRE1BIGludGVycnVwdHMgZG9lc24ndCBlbmQgdXAgaGVyZSwgdGhleQorCSAqIGdvZXMgZGlyZWN0bHkgdG8gRE1BIElTUi4KKwkgKi8KKwlpZiAoKHByaXYtPmlycV9tb2RlID09IDApICYmIChzdHNfY2FwICYgKFNUU19JRE1BIHwgU1RTX0lETUFFUlIpKSkgeworCQlnZW5lcmljX2hhbmRsZV9pcnEocHJpdi0+dmlycV9kbWEpOworCQlhY2sgPSAxOworCX0KKworCS8qCisJICogQ2FsbCAiZmlyc3QgbGV2ZWwiIElSUSBjaGlwIGVuZC1vZi1pcnEgaGFuZGxlci4gSXQgd2lsbCBBQ0sgTEVPTiBJUlEKKwkgKiBDb250cm9sbGVyLCB0aGlzIG11c3QgYmUgZG9uZSBhZnRlciBJUlEgc291cmNlcyBoYXZlIGJlZW4gaGFuZGxlZCB0bworCSAqIGF2b2lkIGRvdWJsZSBJUlEgZ2VuZXJhdGlvbgorCSAqLworCWlmIChhY2spCisJCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKK30KKworLyogQ3JlYXRlIGEgdmlydHVhbCBJUlEgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3JwY2kyX2J1aWxkX2RldmljZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmlycSA9IDAsIHBpbDsKKworCXBpbCA9IDEgPDwgODsKKwl2aXJxID0gaXJxX2FsbG9jKGlycSwgcGlsKTsKKwlpZiAodmlycSA9PSAwKQorCQlnb3RvIG91dDsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHZpcnEsICZncnBjaTJfaXJxLCBoYW5kbGVfc2ltcGxlX2lycSwKKwkJCQkgICAgICAicGNpbHZsIik7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgKHZvaWQgKilpcnEpOworCitvdXQ6CisJcmV0dXJuIHZpcnE7Cit9CisKK3ZvaWQgZ3JwY2kyX2h3X2luaXQoc3RydWN0IGdycGNpMl9wcml2ICpwcml2KQoreworCXUzMiBhaGJhZHIsIHBjaWFkciwgYmFyX3N6LCBjYXBwdHIsIGlvX21hcCwgZGF0YTsKKwlzdHJ1Y3QgZ3JwY2kyX3JlZ3MgKnJlZ3MgPSBwcml2LT5yZWdzOworCWludCBpOworCXN0cnVjdCBncnBjaTJfYmFyY2ZnICpiYXJjZmcgPSBwcml2LT50Z3RiYXJzOworCisJLyogUmVzZXQgYW55IGVhcmxpZXIgc2V0dXAgKi8KKwlpZiAocHJpdi0+ZG9fcmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiR1JQQ0kyOiBSZXNldHRpbmcgUENJIGJ1c1xuIik7CisJCVJFR1NUT1JFKHJlZ3MtPmN0cmwsIENUUkxfUkVTRVQpOworCQlzc2xlZXAoMSk7IC8qIFdhaXQgZm9yIGJvYXJkcyB0byBzZXR0bGUgKi8KKwl9CisJUkVHU1RPUkUocmVncy0+Y3RybCwgMCk7CisJUkVHU1RPUkUocmVncy0+c3RzX2NhcCwgfjApOyAvKiBDbGVhciBTdGF0dXMgKi8KKwlSRUdTVE9SRShyZWdzLT5kbWFfY3RybCwgMCk7CisJUkVHU1RPUkUocmVncy0+ZG1hX2JkYmFzZSwgMCk7CisKKwkvKiBUcmFuc2xhdGUgSS9PIGFjY2Vzc2VzIHRvIDAsIEkvTyBTcGFjZSBhbHdheXMgQCBQQ0kgbG93IDY0S2J5dGVzICovCisJUkVHU1RPUkUocmVncy0+aW9fbWFwLCBSRUdMT0FEKHJlZ3MtPmlvX21hcCkgJiAweDAwMDBmZmZmKTsKKworCS8qIHNldCAxOjEgbWFwcGluZyBiZXR3ZWVuIEFIQiAtPiBQQ0kgbWVtb3J5IHNwYWNlLCBmb3IgYWxsIE1hc3RlcnMKKwkgKiBFYWNoIEFIQiBtYXN0ZXIgaGFzIGl0J3Mgb3duIG1hcHBpbmcgcmVnaXN0ZXJzLiBNYXggMTYgQUhCIG1hc3RlcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCVJFR1NUT1JFKHJlZ3MtPmFoYm1zdF9tYXBbaV0sIHByaXYtPnBjaV9hcmVhKTsKKworCS8qIEdldCB0aGUgR1JQQ0kyIEhvc3QgUENJIElEICovCisJZ3JwY2kyX2NmZ19yMzIocHJpdiwgMCwgMCwgUENJX1ZFTkRPUl9JRCwgJnByaXYtPnBjaWlkKTsKKworCS8qIEdldCBhZGRyZXNzIHRvIGZpcnN0IChhbHdheXMgZGVmaW5lZCkgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KKwlncnBjaTJfY2ZnX3I4KHByaXYsIDAsIDAsIFBDSV9DQVBBQklMSVRZX0xJU1QsICZjYXBwdHIpOworCisJLyogRW5hYmxlL0Rpc2FibGUgQnl0ZSB0d2lzdGluZyAqLworCWdycGNpMl9jZmdfcjMyKHByaXYsIDAsIDAsIGNhcHB0citDQVA5X0lPTUFQX09GUywgJmlvX21hcCk7CisJaW9fbWFwID0gKGlvX21hcCAmIH4weDEpIHwgKHByaXYtPmJ0X2VuYWJsZWQgPyAxIDogMCk7CisJZ3JwY2kyX2NmZ193MzIocHJpdiwgMCwgMCwgY2FwcHRyK0NBUDlfSU9NQVBfT0ZTLCBpb19tYXApOworCisJLyogU2V0dXAgdGhlIEhvc3QncyBQQ0kgVGFyZ2V0IEJBUnMgZm9yIG90aGVyIHBlcmlwaGVyYWxzIHRvIGFjY2VzcywKKwkgKiBhbmQgZG8gRE1BIHRvIHRoZSBob3N0J3MgbWVtb3J5LiBUaGUgdGFyZ2V0IEJBUnMgY2FuIGJlIHNpemVkIGFuZAorCSAqIGVuYWJsZWQgaW5kaXZpZHVhbGx5LgorCSAqCisJICogVXNlciBtYXkgc2V0IGN1c3RvbSB0YXJnZXQgQkFScywgYnV0IGRlZmF1bHQgaXM6CisJICogVGhlIGZpcnN0IEJBUnMgaXMgdXNlZCB0byBtYXAga2VybmVsIGxvdyAoRE1BIGlzIHBhcnQgb2Ygbm9ybWFsCisJICogcmVnaW9uIG9uIHNwYXJjIHdoaWNoIGlzIFNSTU1VX01BWE1FTSBiaWcpIG1haW4gbWVtb3J5IDE6MSB0byB0aGUKKwkgKiBQQ0kgYnVzLCB0aGUgb3RoZXIgQkFScyBhcmUgZGlzYWJsZWQuIFdlIGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBCQVIKKwkgKiBpcyBhbHdheXMgYXZhaWxhYmxlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKGJhcmNmZ1tpXS5wY2lhZHIgIT0gfjAgJiYgYmFyY2ZnW2ldLmFoYmFkciAhPSB+MCkgeworCQkJLyogVGFyZ2V0IEJBUnMgbXVzdCBoYXZlIHRoZSBwcm9wZXIgYWxpZ25tZW50ICovCisJCQlhaGJhZHIgPSBiYXJjZmdbaV0uYWhiYWRyOworCQkJcGNpYWRyID0gYmFyY2ZnW2ldLnBjaWFkcjsKKwkJCWJhcl9zeiA9ICgocGNpYWRyIC0gMSkgJiB+cGNpYWRyKSArIDE7CisJCX0gZWxzZSB7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJLyogTWFwIG1haW4gbWVtb3J5ICovCisJCQkJYmFyX3N6ID0gMHhmMDAwMDAwODsgLyogMjU2TUIgcHJlZmV0Y2hhYmxlICovCisJCQkJYWhiYWRyID0gMHhmMDAwMDAwMCAmICh1MzIpX19wYShQQUdFX0FMSUdOKAorCQkJCQkodW5zaWduZWQgbG9uZykgJl9lbmQpKTsKKwkJCQlwY2lhZHIgPSBhaGJhZHI7CisJCQl9IGVsc2UgeworCQkJCWJhcl9zeiA9IDA7CisJCQkJYWhiYWRyID0gMDsKKwkJCQlwY2lhZHIgPSAwOworCQkJfQorCQl9CisJCWdycGNpMl9jZmdfdzMyKHByaXYsIDAsIDAsIGNhcHB0citDQVA5X0JBUlNJWkVfT0ZTK2kqNCwgYmFyX3N6KTsKKwkJZ3JwY2kyX2NmZ193MzIocHJpdiwgMCwgMCwgUENJX0JBU0VfQUREUkVTU18wK2kqNCwgcGNpYWRyKTsKKwkJZ3JwY2kyX2NmZ193MzIocHJpdiwgMCwgMCwgY2FwcHRyK0NBUDlfQkFSX09GUytpKjQsIGFoYmFkcik7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgVEdUIEJBUlslZF06IDB4JTA4eCAoUENJKS0+IDB4JTA4eFxuIiwKKwkJCWksIHBjaWFkciwgYWhiYWRyKTsKKwl9CisKKwkvKiBzZXQgYXMgYnVzIG1hc3RlciBhbmQgZW5hYmxlIHBjaSBtZW1vcnkgcmVzcG9uc2VzICovCisJZ3JwY2kyX2NmZ19yMzIocHJpdiwgMCwgMCwgUENJX0NPTU1BTkQsICZkYXRhKTsKKwlkYXRhIHw9IChQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCWdycGNpMl9jZmdfdzMyKHByaXYsIDAsIDAsIFBDSV9DT01NQU5ELCBkYXRhKTsKKworCS8qIEVuYWJsZSBFcnJvciByZXNwb25lIChDUFUtVFJBUCkgb24gaWxsZWdhbCBtZW1vcnkgYWNjZXNzLiAqLworCVJFR1NUT1JFKHJlZ3MtPmN0cmwsIENUUkxfRVIgfCBDVFJMX1BFKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGdycGNpMl9qdW1wX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcpCit7CisJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IEp1bXAgSVJRIGhhcHBlbmVkXG4iKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qIEhhbmRsZSBHUlBDSTIgRXJyb3IgSW50ZXJydXB0ICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZ3JwY2kyX2Vycl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiA9IGFyZzsKKwlzdHJ1Y3QgZ3JwY2kyX3JlZ3MgKnJlZ3MgPSBwcml2LT5yZWdzOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBSRUdMT0FEKHJlZ3MtPnN0c19jYXApOworCWlmICgoc3RhdHVzICYgU1RTX0VSUl9JUlEpID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmIChzdGF0dXMgJiBTVFNfSVBBUkVSUikKKwkJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IFBhcml0eSBFcnJvclxuIik7CisKKwlpZiAoc3RhdHVzICYgU1RTX0lUR1RBQlJUKQorCQlwcmludGsoS0VSTl9FUlIgIkdSUENJMjogVGFyZ2V0IEFib3J0XG4iKTsKKworCWlmIChzdGF0dXMgJiBTVFNfSU1TVEFCUlQpCisJCXByaW50ayhLRVJOX0VSUiAiR1JQQ0kyOiBNYXN0ZXIgQWJvcnRcbiIpOworCisJaWYgKHN0YXR1cyAmIFNUU19JU1lTRVJSKQorCQlwcmludGsoS0VSTl9FUlIgIkdSUENJMjogU3lzdGVtIEVycm9yXG4iKTsKKworCS8qIENsZWFyIGhhbmRsZWQgSU5UIFRZUEUgSVJRcyAqLworCVJFR1NUT1JFKHJlZ3MtPnN0c19jYXAsIHN0YXR1cyAmIFNUU19FUlJfSVJRKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ3JwY2kyX29mX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQoreworCXN0cnVjdCBncnBjaTJfcmVncyAqcmVnczsKKwlzdHJ1Y3QgZ3JwY2kyX3ByaXYgKnByaXY7CisJaW50IGVyciwgaSwgbGVuOworCWNvbnN0IGludCAqdG1wOworCXVuc2lnbmVkIGludCBjYXBhYmlsaXR5OworCisJaWYgKGdycGNpMnByaXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IG9ubHkgb25lIEdSUENJMiBjb3JlIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChvZmRldi0+bnVtX3Jlc291cmNlcyA8IDMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IG5vdCBlbm91Z2ggQVBCL0FIQiByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBGaW5kIERldmljZSBBZGRyZXNzICovCisJcmVncyA9IG9mX2lvcmVtYXAoJm9mZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgcmVzb3VyY2Vfc2l6ZSgmb2ZkZXYtPnJlc291cmNlWzBdKSwKKwkJCSAgImdybGliLWdycGNpMiByZWdzIik7CisJaWYgKHJlZ3MgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkdSUENJMjogaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgd2UncmUgaW4gSG9zdCBTbG90IGFuZCB0aGF0IHdlIGNhbiBhY3QgYXMgYSBIb3N0IEJyaWRnZQorCSAqIGFuZCBub3Qgb25seSBhcyB0YXJnZXQuCisJICovCisJY2FwYWJpbGl0eSA9IFJFR0xPQUQocmVncy0+c3RzX2NhcCk7CisJaWYgKChjYXBhYmlsaXR5ICYgU1RTX0hPU1QpIHx8ICEoY2FwYWJpbGl0eSAmIFNUU19NU1QpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkdSUENJMjogbm90IGluIGhvc3Qgc3lzdGVtIHNsb3RcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycjE7CisJfQorCisJcHJpdiA9IGdycGNpMnByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JwY2kyX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZ3JwY2kycHJpdiA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisJbWVtc2V0KGdycGNpMnByaXYsIDAsIHNpemVvZigqZ3JwY2kycHJpdikpOworCXByaXYtPnJlZ3MgPSByZWdzOworCXByaXYtPmlycSA9IG9mZGV2LT5hcmNoZGF0YS5pcnFzWzBdOyAvKiBCQVNFIElSUSAqLworCXByaXYtPmlycV9tb2RlID0gKGNhcGFiaWxpdHkgJiBTVFNfSVJRTU9ERSkgPj4gU1RTX0lSUU1PREVfQklUOworCisJcHJpbnRrKEtFUk5fSU5GTyAiR1JQQ0kyOiBob3N0IGZvdW5kIGF0ICVwLCBpcnElZFxuIiwgcmVncywgcHJpdi0+aXJxKTsKKworCS8qIEJ5dGUgdHdpc3Rpbmcgc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlIGZyb20ga2VybmVsIGNvbW1hbmQgbGluZSAqLworCXByaXYtPmJ0X2VuYWJsZWQgPSAxOworCisJLyogTGV0IHVzZXIgZG8gY3VzdG9tIFRhcmdldCBCQVIgYXNzaWdubWVudCAqLworCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsICJiYXJjZmciLCAmbGVuKTsKKwlpZiAodG1wICYmIChsZW4gPT0gMio0KjYpKQorCQltZW1jcHkocHJpdi0+dGd0YmFycywgdG1wLCAyKjQqNik7CisJZWxzZQorCQltZW1zZXQocHJpdi0+dGd0YmFycywgLTEsIDIqNCo2KTsKKworCS8qIExpbWl0IElSUSB1bm1hc2tpbmcgaW4gaXJxX21vZGUgMiBhbmQgMyAqLworCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsICJpcnFfbWFzayIsICZsZW4pOworCWlmICh0bXAgJiYgKGxlbiA9PSA0KSkKKwkJcHJpdi0+ZG9fcmVzZXQgPSAqdG1wOworCWVsc2UKKwkJcHJpdi0+aXJxX21hc2sgPSAweGY7CisKKwkvKiBPcHRpb25hbCBQQ0kgcmVzZXQuIEZvcmNlIFBDSSByZXNldCBvbiBzdGFydHVwICovCisJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5kZXYub2Zfbm9kZSwgInJlc2V0IiwgJmxlbik7CisJaWYgKHRtcCAmJiAobGVuID09IDQpKQorCQlwcml2LT5kb19yZXNldCA9ICp0bXA7CisJZWxzZQorCQlwcml2LT5kb19yZXNldCA9IDA7CisKKwkvKiBGaW5kIFBDSSBNZW1vcnksIEkvTyBhbmQgQ29uZmlndXJhdGlvbiBTcGFjZSBXaW5kb3dzICovCisJcHJpdi0+cGNpX2FyZWEgPSBvZmRldi0+cmVzb3VyY2VbMV0uc3RhcnQ7CisJcHJpdi0+cGNpX2FyZWFfZW5kID0gb2ZkZXYtPnJlc291cmNlWzFdLmVuZCsxOworCXByaXYtPnBjaV9pbyA9IG9mZGV2LT5yZXNvdXJjZVsyXS5zdGFydDsKKwlwcml2LT5wY2lfY29uZiA9IG9mZGV2LT5yZXNvdXJjZVsyXS5zdGFydCArIDB4MTAwMDA7CisJcHJpdi0+cGNpX2NvbmZfZW5kID0gcHJpdi0+cGNpX2NvbmYgKyAweDEwMDAwOworCXByaXYtPnBjaV9pb192YSA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAocHJpdi0+cGNpX2lvLCAweDEwMDAwKTsKKwlpZiAoIXByaXYtPnBjaV9pb192YSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycjI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTworCQkiR1JQQ0kyOiBNRU1PUlkgU1BBQ0UgWzB4JTA4bHggLSAweCUwOGx4XVxuIgorCQkiICAgICAgICBJL08gICAgU1BBQ0UgWzB4JTA4bHggLSAweCUwOGx4XVxuIgorCQkiICAgICAgICBDT05GSUcgU1BBQ0UgWzB4JTA4bHggLSAweCUwOGx4XVxuIiwKKwkJcHJpdi0+cGNpX2FyZWEsIHByaXYtPnBjaV9hcmVhX2VuZC0xLAorCQlwcml2LT5wY2lfaW8sIHByaXYtPnBjaV9jb25mLTEsCisJCXByaXYtPnBjaV9jb25mLCBwcml2LT5wY2lfY29uZl9lbmQtMSk7CisKKwkvKgorCSAqIEkvTyBTcGFjZSByZXNvdXJjZXMgaW4gSS9PIFdpbmRvdyBtYXBwZWQgaW50byBWaXJ0dWFsIEFkciBTcGFjZQorCSAqIFdlIG5ldmVyIHVzZSBsb3cgNEtCIGJlY2F1c2Ugc29tZSBkZXZpY2VzIHNlZW0gaGF2ZSBwcm9ibGVtcyB1c2luZworCSAqIGFkZHJlc3MgMC4KKwkgKi8KKwltZW1zZXQoJnByaXYtPmluZm8uaW9fc3BhY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwlwcml2LT5pbmZvLmlvX3NwYWNlLm5hbWUgPSAiR1JQQ0kyIFBDSSBJL08gU3BhY2UiOworCXByaXYtPmluZm8uaW9fc3BhY2Uuc3RhcnQgPSBwcml2LT5wY2lfaW9fdmEgKyAweDEwMDA7CisJcHJpdi0+aW5mby5pb19zcGFjZS5lbmQgPSBwcml2LT5wY2lfaW9fdmEgKyAweDEwMDAwIC0gMTsKKwlwcml2LT5pbmZvLmlvX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKworCS8qCisJICogR1JQQ0kyIGhhcyBubyBwcmVmZXRjaGFibGUgbWVtb3J5LCBtYXAgZXZlcnl0aGluZyBhcworCSAqIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5CisJICovCisJbWVtc2V0KCZwcml2LT5pbmZvLm1lbV9zcGFjZSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCXByaXYtPmluZm8ubWVtX3NwYWNlLm5hbWUgPSAiR1JQQ0kyIFBDSSBNRU0gU3BhY2UiOworCXByaXYtPmluZm8ubWVtX3NwYWNlLnN0YXJ0ID0gcHJpdi0+cGNpX2FyZWE7CisJcHJpdi0+aW5mby5tZW1fc3BhY2UuZW5kID0gcHJpdi0+cGNpX2FyZWFfZW5kIC0gMTsKKwlwcml2LT5pbmZvLm1lbV9zcGFjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcHJpdi0+aW5mby5tZW1fc3BhY2UpIDwgMCkKKwkJZ290byBlcnIzOworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwcml2LT5pbmZvLmlvX3NwYWNlKSA8IDApCisJCWdvdG8gZXJyNDsKKworCWdycGNpMl9od19pbml0KHByaXYpOworCisJLyoKKwkgKiBHZXQgUENJIEludGVycnVwdCB0byBTeXN0ZW0gSVJRIG1hcHBpbmcgYW5kIHNldHVwIElSUSBoYW5kbGluZworCSAqIEVycm9yIElSUSBhbHdheXMgb24gUENJIElOVEEuCisJICovCisJaWYgKHByaXYtPmlycV9tb2RlIDwgMikgeworCQkvKiBBbGwgUENJIGludGVycnVwdHMgYXJlIHNoYXJlZCB1c2luZyB0aGUgc2FtZSBzeXN0ZW0gSVJRICovCisJCWxlb25fdXBkYXRlX3ZpcnFfaGFuZGxpbmcocHJpdi0+aXJxLCBncnBjaTJfcGNpX2Zsb3dfaXJxLAorCQkJCQkgInBjaWx2bCIsIDApOworCisJCXByaXYtPmlycV9tYXBbMF0gPSBncnBjaTJfYnVpbGRfZGV2aWNlX2lycSgxKTsKKwkJcHJpdi0+aXJxX21hcFsxXSA9IGdycGNpMl9idWlsZF9kZXZpY2VfaXJxKDIpOworCQlwcml2LT5pcnFfbWFwWzJdID0gZ3JwY2kyX2J1aWxkX2RldmljZV9pcnEoMyk7CisJCXByaXYtPmlycV9tYXBbM10gPSBncnBjaTJfYnVpbGRfZGV2aWNlX2lycSg0KTsKKworCQlwcml2LT52aXJxX2VyciA9IGdycGNpMl9idWlsZF9kZXZpY2VfaXJxKDUpOworCQlpZiAocHJpdi0+aXJxX21vZGUgJiAxKQorCQkJcHJpdi0+dmlycV9kbWEgPSBvZmRldi0+YXJjaGRhdGEuaXJxc1sxXTsKKwkJZWxzZQorCQkJcHJpdi0+dmlycV9kbWEgPSBncnBjaTJfYnVpbGRfZGV2aWNlX2lycSg2KTsKKworCQkvKiBFbmFibGUgSVJRcyBvbiBMRU9OIElSUSBjb250cm9sbGVyICovCisJCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPmlycSwgZ3JwY2kyX2p1bXBfaW50ZXJydXB0LCAwLAorCQkJCQkiR1JQQ0kyX0pVTVAiLCBwcml2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiR1JQQ0kyOiBFUlIgSVJRIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQkvKiBBbGwgUENJIGludGVycnVwdHMgaGF2ZSBhbiB1bmlxdWUgSVJRIGludGVycnVwdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkvKiBNYWtlIExFT04gSVJRIGxheWVyIGhhbmRsZSBsZXZlbCBJUlEgYnkgYWNraW5nICovCisJCQlsZW9uX3VwZGF0ZV92aXJxX2hhbmRsaW5nKG9mZGV2LT5hcmNoZGF0YS5pcnFzW2ldLAorCQkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSwgInBjaWx2bCIsCisJCQkJCQkgMSk7CisJCQlwcml2LT5pcnFfbWFwW2ldID0gb2ZkZXYtPmFyY2hkYXRhLmlycXNbaV07CisJCX0KKwkJcHJpdi0+dmlycV9lcnIgPSBwcml2LT5pcnFfbWFwWzBdOworCQlpZiAocHJpdi0+aXJxX21vZGUgJiAxKQorCQkJcHJpdi0+dmlycV9kbWEgPSBvZmRldi0+YXJjaGRhdGEuaXJxc1s0XTsKKwkJZWxzZQorCQkJcHJpdi0+dmlycV9kbWEgPSBwcml2LT5pcnFfbWFwWzBdOworCisJCS8qIFVubWFzayBhbGwgUENJIGludGVycnVwdHMsIHJlcXVlc3RfaXJxIHdpbGwgbm90IGRvIHRoYXQgKi8KKwkJUkVHU1RPUkUocmVncy0+Y3RybCwgUkVHTE9BRChyZWdzLT5jdHJsKXwocHJpdi0+aXJxX21hc2smMHhmKSk7CisJfQorCisJLyogU2V0dXAgSVJRIGhhbmRsZXIgZm9yIG5vbi1jb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBlcnJvcnMgKi8KKwllcnIgPSByZXF1ZXN0X2lycShwcml2LT52aXJxX2VyciwgZ3JwY2kyX2Vycl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSJHUlBDSTJfRVJSIiwgcHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiR1JQQ0kyOiBFUlIgVklSUSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsIGVycik7CisJCWdvdG8gZXJyNTsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHRzLiBQQ0kgaW50ZXJydXB0cyBhcmUgdW5tYXNrZWQgb25jZSByZXF1ZXN0X2lycQorCSAqIGlzIGNhbGxlZCBieSB0aGUgUENJIERldmljZSBkcml2ZXJzCisJICovCisJUkVHU1RPUkUocmVncy0+Y3RybCwgUkVHTE9BRChyZWdzLT5jdHJsKSB8IENUUkxfRUkgfCBDVFJMX1NJKTsKKworCS8qIEluaXQgY29tbW9uIGxheWVyIGFuZCBzY2FuIGJ1c2VzICovCisJcHJpdi0+aW5mby5vcHMgPSAmZ3JwY2kyX29wczsKKwlwcml2LT5pbmZvLm1hcF9pcnEgPSBncnBjaTJfbWFwX2lycTsKKwlsZW9uX3BjaV9pbml0KG9mZGV2LCAmcHJpdi0+aW5mbyk7CisKKwlyZXR1cm4gMDsKKworZXJyNToKKwlyZWxlYXNlX3Jlc291cmNlKCZwcml2LT5pbmZvLmlvX3NwYWNlKTsKK2VycjQ6CisJcmVsZWFzZV9yZXNvdXJjZSgmcHJpdi0+aW5mby5tZW1fc3BhY2UpOworZXJyMzoKKwllcnIgPSAtRU5PTUVNOworCWlvdW5tYXAoKHZvaWQgKilwcml2LT5wY2lfaW9fdmEpOworZXJyMjoKKwlrZnJlZShwcml2KTsKK2VycjE6CisJb2ZfaW91bm1hcCgmb2ZkZXYtPnJlc291cmNlWzBdLCByZWdzLAorCQlyZXNvdXJjZV9zaXplKCZvZmRldi0+cmVzb3VyY2VbMF0pKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBncnBjaTJfb2ZfbWF0Y2hbXSA9IHsKKwl7CisJIC5uYW1lID0gIkdBSVNMRVJfR1JQQ0kyIiwKKwkgfSwKKwl7CisJIC5uYW1lID0gIjAxXzA3YyIsCisJIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncnBjaTJfb2ZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImdycGNpMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBncnBjaTJfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBncnBjaTJfb2ZfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBncnBjaTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdycGNpMl9vZl9kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoZ3JwY2kyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYwppbmRleCA4ZDM0OGM0Li45OWJhNWJhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCQkgICAgICAgbWUtPm5hbWUsCiAJCQkgICAgICAgKGludCkgKEVMRl9SX1RZUEUocmVsW2ldLnJfaW5mbykgJiAweGZmKSk7CiAJCQlyZXR1cm4gLUVOT0VYRUM7Ci0JCX07CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMKaW5kZXggNmUzODc0Yi4uYTY4OTU5OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJY2FzZSA0OgogCQkqdmFsdWUgPSByZXQgJiAweGZmZmZmZmZmOwogCQlicmVhazsKLQl9OworCX0KIAogCiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCX0KIAogCWlmICghc2F3X2lvIHx8ICFzYXdfbWVtKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKaW5kZXggMjgzZmJjMy4uZjAzMGIwMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCWRlZmF1bHQ6CiAJCQl0eXBlX3N0cmluZyA9ICJFQ0MgRXJyb3IiOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAkJcHJpbnRrKCIlczogSU9NTVUgRXJyb3IsIHR5cGVbJXNdXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCB0eXBlX3N0cmluZyk7CiAKQEAgLTMxOSw3ICszMTksNyBAQAogCQkJZGVmYXVsdDoKIAkJCQl0eXBlX3N0cmluZyA9ICJFQ0MgRXJyb3IiOwogCQkJCWJyZWFrOwotCQkJfTsKKwkJCX0KIAkJCXByaW50aygiJXM6IElPTU1VIFRBRyglZClbZXJyb3IoJXMpIGN0eCgleCkgd3IoJWQpIHN0ciglZCkgIgogCQkJICAgICAgICJzeiglZEspIHZwZyglMDhseCldXG4iLAogCQkJICAgICAgIHBibS0+bmFtZSwgaSwgdHlwZV9zdHJpbmcsCkBAIC0xMzI4LDcgKzEzMjgsNyBAQAogCWRlZmF1bHQ6CiAJCWNoaXBzZXRfbmFtZSA9ICJTQ0hJWk8iOwogCQlicmVhazsKLQl9OworCX0KIAogCS8qIEZvciBTQ0hJWk8sIHRocmVlIE9CUCByZWdzOgogCSAqIDEpIFBCTSBjb250cm9sbGVyIHJlZ3MKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYwppbmRleCA1NzBiOThmLi40MGU0OTM2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jCkBAIC02OTQsNyArNjk0LDcgQEAKIAkJY2FzZSAzOgogCQkJaWNsciA9IHJlZ19iYXNlICsgU1lTSU9fSUNMUl9TTE9UMzsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJaWNsciArPSAoKHVuc2lnbmVkIGxvbmcpc2J1c19sZXZlbCAtIDFVTCkgKiA4VUw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCmluZGV4IGZlMmFmNjYuLjhkYjQ4ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogCQlkZWZhdWx0OgogCQkJdHlwZV9zdHIgPSAiRUNDIEVycm9yIjsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IElPTU1VIEVycm9yLCB0eXBlWyVzXVxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwgdHlwZV9zdHIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMKaW5kZXggMmNhMzJkMS4uYTE2MWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYwpAQCAtOTcsNyArOTcsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuOwotCX07CisJfQogCiAJdmFsID0gdXBhX3JlYWRxKGNmZ19yZWcpOwogCWlmICh2YWwgJiAoMVVMIDw8IDE0VUwpKSB7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJY2FzZSAzOgogCQkJaWNsciA9IHJlZ19iYXNlICsgU1lTSU9fSUNMUl9TTE9UMzsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJaWNsciArPSAoKHVuc2lnbmVkIGxvbmcpc2J1c19sZXZlbCAtIDFVTCkgKiA4VUw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMKaW5kZXggMzI0OWQzZi4uZDI2ZTFmNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAlkZWZhdWx0OgogCQlwcmludGsoIlVOS05PV04hXG4iKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggZjNiNjg1MC4uYzRkZDA5OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCXByb21fcHJpbnRmKCJVbmtub3duIGNwdSB0eXBlLCBoYWx0aW5nLlxuIik7CiAJCQlwcm9tX2hhbHQoKTsKLQkJfTsKKwkJfQogCiAJCSoodW5zaWduZWQgaW50ICopIChhZGRyICsgIDApID0gaW5zbnNbMF07CiAJCXdtYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYwppbmRleCBkNWIzOTU4Li4yMWIxMjUzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCXByaW50aygiVU5LTk9XTiFcbiIpOwogCQlCVUcoKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiB9CiAKIHZvaWQgY3B1X3BhbmljKHZvaWQpCkBAIC0zNzQsNyArMzc0LDcgQEAKIAkJcHJpbnRrKCJVTktOT1dOIVxuIik7CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIH0KIAogLyogU2V0IHRoaXMgdXAgZWFybHkgc28gdGhhdCB0aGluZ3MgbGlrZSB0aGUgc2NoZWR1bGVyIGNhbiBpbml0CkBAIC00NDcsNyArNDQ3LDcgQEAKIAkJcHJpbnRrKCJVTktOT1dOIVxuIik7CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIAogCWlmICghcmV0KSB7CiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzbXBfY29tbWVuY2VkX21hc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfaXJxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYwppbmRleCBhOWVhNjBlLi4xZDEzYzViIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYwpAQCAtMTAzLDEwICsxMDMsOSBAQAogCiAJc2JpbCA9IChzYnVzbCA8PCAyKTsKIAkvKiBMb29wIGZvciBlYWNoIHBlbmRpbmcgU0JJICovCi0JZm9yIChzYmlubyA9IDA7IGJ1c19tYXNrOyBzYmlubysrKSB7CisJZm9yIChzYmlubyA9IDA7IGJ1c19tYXNrOyBzYmlubysrLCBidXNfbWFzayA+Pj0gMSkgewogCQl1bnNpZ25lZCBpbnQgaWR4LCBtYXNrOwogCi0JCWJ1c19tYXNrID4+PSAxOwogCQlpZiAoIShidXNfbWFzayAmIDEpKQogCQkJY29udGludWU7CiAJCS8qIFhYWCBUaGlzIHNlZW1zIHRvIEFDSyB0aGUgaXJxIHR3aWNlLiAgYWNxdWlyZV9zYmkoKQpAQCAtMTE4LDE5ICsxMTcsMTYgQEAKIAkJbWFzayAmPSAoMHhmIDw8IHNiaWwpOwogCiAJCS8qIExvb3AgZm9yIGVhY2ggcGVuZGluZyBTQkkgc2xvdCAqLwotCQlpZHggPSAwOwogCQlzbG90ID0gKDEgPDwgc2JpbCk7Ci0JCXdoaWxlIChtYXNrICE9IDApIHsKKwkJZm9yIChpZHggPSAwOyBtYXNrICE9IDA7IGlkeCsrLCBzbG90IDw8PSAxKSB7CiAJCQl1bnNpZ25lZCBpbnQgcGlsOwogCQkJc3RydWN0IGlycV9idWNrZXQgKnA7CiAKLQkJCWlkeCsrOwotCQkJc2xvdCA8PD0gMTsKIAkJCWlmICghKG1hc2sgJiBzbG90KSkKIAkJCQljb250aW51ZTsKIAogCQkJbWFzayAmPSB+c2xvdDsKLQkJCXBpbCA9IHN1bjRkX2VuY29kZV9pcnEoc2Jpbm8sIHNiaWwsIGlkeCk7CisJCQlwaWwgPSBzdW40ZF9lbmNvZGVfaXJxKHNiaW5vLCBzYnVzbCwgaWR4KTsKIAogCQkJcCA9IGlycV9tYXBbcGlsXTsKIAkJCXdoaWxlIChwKSB7CkBAIC0yMTgsMTAgKzIxNCwxMCBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCXNwaW5fbG9ja19pcnFzYXZlKCZzdW40ZF9pbXNrX2xvY2ssIGZsYWdzKTsKLQljY19zZXRfaW1za19vdGhlcihjcHVpZCwgY2NfZ2V0X2ltc2tfb3RoZXIoY3B1aWQpIHwgfigxIDw8IHJlYWxfaXJxKSk7CisJY2Nfc2V0X2ltc2tfb3RoZXIoY3B1aWQsIGNjX2dldF9pbXNrX290aGVyKGNwdWlkKSAmIH4oMSA8PCByZWFsX2lycSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN1bjRkX2ltc2tfbG9jaywgZmxhZ3MpOwogI2Vsc2UKLQljY19zZXRfaW1zayhjY19nZXRfaW1zaygpIHwgfigxIDw8IHJlYWxfaXJxKSk7CisJY2Nfc2V0X2ltc2soY2NfZ2V0X2ltc2soKSAmIH4oMSA8PCByZWFsX2lycSkpOwogI2VuZGlmCiB9CiAKQEAgLTI5OSw1OCArMjk1LDE5IEBACiAJfQogfQogCi11bnNpZ25lZCBpbnQgc3VuNGRfYnVpbGRfZGV2aWNlX2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZWFsX2lycSkKK3Vuc2lnbmVkIGludCBfc3VuNGRfYnVpbGRfZGV2aWNlX2lycSh1bnNpZ25lZCBpbnQgcmVhbF9pcnEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYm9hcmQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmlvX3VuaXQsICpzYmkgPSBkcC0+cGFyZW50OwotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAlzdHJ1Y3Qgc3VuNGRfaGFuZGxlcl9kYXRhICpoYW5kbGVyX2RhdGE7Ci0JdW5zaWduZWQgaW50IHBpbDsKIAl1bnNpZ25lZCBpbnQgaXJxOwotCWludCBib2FyZCwgc2xvdDsKLQlpbnQgc2J1c2w7Ci0KLQlpcnEgPSAwOwotCXdoaWxlIChzYmkpIHsKLQkJaWYgKCFzdHJjbXAoc2JpLT5uYW1lLCAic2JpIikpCi0JCQlicmVhazsKLQotCQlzYmkgPSBzYmktPnBhcmVudDsKLQl9Ci0JaWYgKCFzYmkpCi0JCWdvdG8gZXJyX291dDsKLQotCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXJlZ3MpCi0JCWdvdG8gZXJyX291dDsKLQotCXNsb3QgPSByZWdzLT53aGljaF9pbzsKLQotCS8qCi0JICogIElmIFNCSSdzIHBhcmVudCBpcyBub3QgaW8tdW5pdCBvciB0aGUgaW8tdW5pdCBsYWNrcwotCSAqIGEgImJvYXJkIyIgcHJvcGVydHksIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLgotCSAqLwotCWlmICghc2JpLT5wYXJlbnQgfHwgc3RyY21wKHNiaS0+cGFyZW50LT5uYW1lLCAiaW8tdW5pdCIpKSB7Ci0JCXByaW50aygiJXM6IEVycm9yLCBwYXJlbnQgaXMgbm90IGlvLXVuaXQuXG4iLCBzYmktPmZ1bGxfbmFtZSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JaW9fdW5pdCA9IHNiaS0+cGFyZW50OwotCWJvYXJkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGlvX3VuaXQsICJib2FyZCMiLCAtMSk7Ci0JaWYgKGJvYXJkID09IC0xKSB7Ci0JCXByaW50aygiJXM6IEVycm9yLCBsYWNrcyBib2FyZCMgcHJvcGVydHkuXG4iLCBpb191bml0LT5mdWxsX25hbWUpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0Jc2J1c2wgPSBwaWxfdG9fc2J1c1tyZWFsX2lycV07Ci0JaWYgKHNidXNsKQotCQlwaWwgPSBzdW40ZF9lbmNvZGVfaXJxKGJvYXJkLCBzYnVzbCwgc2xvdCk7Ci0JZWxzZQotCQlwaWwgPSByZWFsX2lycTsKIAogCWlycSA9IGlycV9hbGxvYyhyZWFsX2lycSwgcGlsKTsKLQlpZiAoaXJxID09IDApCisJaWYgKGlycSA9PSAwKSB7CisJCXByb21fcHJpbnRmKCJJUlE6IGFsbG9jYXRlIGZvciAlZCAlZCAlZCBmYWlsZWRcbiIsCisJCQlyZWFsX2lycSwgcGlsLCBib2FyZCk7CiAJCWdvdG8gZXJyX291dDsKKwl9CiAKIAloYW5kbGVyX2RhdGEgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOwogCWlmICh1bmxpa2VseShoYW5kbGVyX2RhdGEpKQpAQCAtMzY4LDkgKzMyNSw4MCBAQAogCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgaGFuZGxlcl9kYXRhKTsKIAogZXJyX291dDoKLQlyZXR1cm4gcmVhbF9pcnE7CisJcmV0dXJuIGlycTsKIH0KIAorCisKK3Vuc2lnbmVkIGludCBzdW40ZF9idWlsZF9kZXZpY2VfaXJxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlYWxfaXJxKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpib2FyZF9wYXJlbnQsICpidXMgPSBkcC0+cGFyZW50OworCWNoYXIgKmJ1c19jb25uZWN0aW9uOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKKwl1bnNpZ25lZCBpbnQgcGlsOworCXVuc2lnbmVkIGludCBpcnE7CisJaW50IGJvYXJkLCBzbG90OworCWludCBzYnVzbDsKKworCWlycSA9IHJlYWxfaXJxOworCXdoaWxlIChidXMpIHsKKwkJaWYgKCFzdHJjbXAoYnVzLT5uYW1lLCAic2JpIikpIHsKKwkJCWJ1c19jb25uZWN0aW9uID0gImlvLXVuaXQiOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXN0cmNtcChidXMtPm5hbWUsICJib290YnVzIikpIHsKKwkJCWJ1c19jb25uZWN0aW9uID0gImNwdS11bml0IjsKKwkJCWJyZWFrOworCQl9CisKKwkJYnVzID0gYnVzLT5wYXJlbnQ7CisJfQorCWlmICghYnVzKQorCQlnb3RvIGVycl9vdXQ7CisKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFyZWdzKQorCQlnb3RvIGVycl9vdXQ7CisKKwlzbG90ID0gcmVncy0+d2hpY2hfaW87CisKKwkvKgorCSAqIElmIEJ1cyBub2RlcyBwYXJlbnQgaXMgbm90IGlvLXVuaXQvY3B1LXVuaXQgb3IgdGhlIGlvLXVuaXQvY3B1LXVuaXQKKwkgKiBsYWNrcyBhICJib2FyZCMiIHByb3BlcnR5LCBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4KKwkgKi8KKwlpZiAoIWJ1cy0+cGFyZW50IHx8IHN0cmNtcChidXMtPnBhcmVudC0+bmFtZSwgYnVzX2Nvbm5lY3Rpb24pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yLCBwYXJlbnQgaXMgbm90ICVzLlxuIiwKKwkJCWJ1cy0+ZnVsbF9uYW1lLCBidXNfY29ubmVjdGlvbik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJYm9hcmRfcGFyZW50ID0gYnVzLT5wYXJlbnQ7CisJYm9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoYm9hcmRfcGFyZW50LCAiYm9hcmQjIiwgLTEpOworCWlmIChib2FyZCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciwgbGFja3MgYm9hcmQjIHByb3BlcnR5LlxuIiwKKwkJCWJvYXJkX3BhcmVudC0+ZnVsbF9uYW1lKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXNidXNsID0gcGlsX3RvX3NidXNbcmVhbF9pcnFdOworCWlmIChzYnVzbCkKKwkJcGlsID0gc3VuNGRfZW5jb2RlX2lycShib2FyZCwgc2J1c2wsIHNsb3QpOworCWVsc2UKKwkJcGlsID0gcmVhbF9pcnE7CisKKwlpcnEgPSBfc3VuNGRfYnVpbGRfZGV2aWNlX2lycShyZWFsX2lycSwgcGlsLCBib2FyZCk7CitlcnJfb3V0OgorCXJldHVybiBpcnE7Cit9CisKK3Vuc2lnbmVkIGludCBzdW40ZF9idWlsZF90aW1lcl9pcnEodW5zaWduZWQgaW50IGJvYXJkLCB1bnNpZ25lZCBpbnQgcmVhbF9pcnEpCit7CisJcmV0dXJuIF9zdW40ZF9idWlsZF9kZXZpY2VfaXJxKHJlYWxfaXJxLCByZWFsX2lycSwgYm9hcmQpOworfQorCisKIHN0YXRpYyB2b2lkIF9faW5pdCBzdW40ZF9maXh1cF90cmFwX3RhYmxlKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNDAyLDYgKzQzMCw3IEBACiAJdW5zaWduZWQgaW50IGlycTsKIAljb25zdCB1MzIgKnJlZzsKIAlpbnQgZXJyOworCWludCBib2FyZDsKIAogCWRwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNwdS11bml0Iik7CiAJaWYgKCFkcCkgewpAQCAtNDE0LDEyICs0NDMsMTkgQEAKIAkgKiBib290YnVzLgogCSAqLwogCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCW9mX25vZGVfcHV0KGRwKTsKIAlpZiAoIXJlZykgewogCQlwcm9tX3ByaW50Zigic3VuNGRfaW5pdF90aW1lcnM6IE5vIHJlZyBwcm9wZXJ0eVxuIik7CiAJCXByb21faGFsdCgpOwogCX0KIAorCWJvYXJkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiYm9hcmQjIiwgLTEpOworCWlmIChib2FyZCA9PSAtMSkgeworCQlwcm9tX3ByaW50Zigic3VuNGRfaW5pdF90aW1lcnM6IE5vIGJvYXJkIyBwcm9wZXJ0eSBvbiBjcHUtdW5pdFxuIik7CisJCXByb21faGFsdCgpOworCX0KKworCW9mX25vZGVfcHV0KGRwKTsKKwogCXJlcy5zdGFydCA9IHJlZ1sxXTsKIAlyZXMuZW5kID0gcmVnWzJdIC0gMTsKIAlyZXMuZmxhZ3MgPSByZWdbMF0gJiAweGZmOwpAQCAtNDM0LDcgKzQ3MCw3IEBACiAKIAltYXN0ZXJfbDEwX2NvdW50ZXIgPSAmc3VuNGRfdGltZXJzLT5sMTBfY3VyX2NvdW50OwogCi0JaXJxID0gc3VuNGRfYnVpbGRfZGV2aWNlX2lycShOVUxMLCBTVU40RF9USU1FUl9JUlEpOworCWlycSA9IHN1bjRkX2J1aWxkX3RpbWVyX2lycShib2FyZCwgU1VONERfVElNRVJfSVJRKTsKIAllcnIgPSByZXF1ZXN0X2lycShpcnEsIGNvdW50ZXJfZm4sIElSUUZfVElNRVIsICJ0aW1lciIsIE5VTEwpOwogCWlmIChlcnIpIHsKIAkJcHJvbV9wcmludGYoInN1bjRkX2luaXRfdGltZXJzOiByZXF1ZXN0X2lycSgpIGZhaWxlZCB3aXRoICVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKaW5kZXggNmRiMThjNi4uMTcwY2Q4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PU1lTOwotCX07CisJfQogCiAJcmV0dXJuIC1FTk9TWVM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCmluZGV4IDk2MDgyZDMuLjkwOGI0N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCkBAIC00NjAsNyArNDYwLDcgQEAKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FTk9TWVM7CiAJCQlnb3RvIG91dDsKLQkJfTsKKwkJfQogCX0KIAlpZiAoY2FsbCA8PSBNU0dDVEwpIHsKIAkJc3dpdGNoIChjYWxsKSB7CkBAIC00ODEsNyArNDgxLDcgQEAKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FTk9TWVM7CiAJCQlnb3RvIG91dDsKLQkJfTsKKwkJfQogCX0KIAlpZiAoY2FsbCA8PSBTSE1DVEwpIHsKIAkJc3dpdGNoIChjYWxsKSB7CkBAIC01MDcsNyArNTA3LDcgQEAKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FTk9TWVM7CiAJCQlnb3RvIG91dDsKLQkJfTsKKwkJfQogCX0gZWxzZSB7CiAJCWVyciA9IC1FTk9TWVM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCmluZGV4IDJiOGQ1NGIuLjFkYjZiMTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKQEAgLTcwOCw3ICs3MDgsNyBAQAogCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgogCQlXQVJOX09OKDEpOwogCQlicmVhazsKLQl9OworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2Ugc3BhcmM2NF9jbG9ja2V2ZW50ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKaW5kZXggMWVkNTQ3Yi4uMGNiZGFhNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCkBAIC0xODA0LDcgKzE4MDQsNyBAQAogCQlyZXR1cm4gIndhcm5pbmcgcmVzdW1hYmxlIjsKIAlkZWZhdWx0OgogCQlyZXR1cm4gInVua25vd24iOwotCX07CisJfQogfQogCiBzdGF0aWMgdm9pZCBzdW40dl9sb2dfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzdW40dl9lcnJvcl9lbnRyeSAqZW50LCBpbnQgY3B1LCBjb25zdCBjaGFyICpwZngsIGF0b21pY190ICpvY250KQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwppbmRleCBjNzUyYzRjLi5iMmIwMTllIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJfQogCXJldHVybiBfX2RvX2ludF9zdG9yZShkc3RfYWRkciwgc2l6ZSwgc3JjX3ZhbCwgYXNpKTsKIH0KQEAgLTMyOCw3ICszMjgsNyBAQAogCQljYXNlIEFTSV9TTkZMOgogCQkJYXNpICY9IH4weDA4OwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAkJc3dpdGNoIChkaXIpIHsKIAkJY2FzZSBsb2FkOgogCQkJcmVnX2FkZHIgPSBmZXRjaF9yZWdfYWRkcigoKGluc24+PjI1KSYweDFmKSwgcmVncyk7CkBAIC0zNTEsNyArMzUxLDcgQEAKIAkJCQlkZWZhdWx0OgogCQkJCQlCVUcoKTsKIAkJCQkJYnJlYWs7Ci0JCQkJfTsKKwkJCQl9CiAJCQkJKnJlZ19hZGRyID0gdmFsX2luOwogCQkJfQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC91czJlX2NwdWZyZXEuYyBiL2FyY2gvc3BhcmMva2VybmVsL3VzMmVfY3B1ZnJlcS5jCmluZGV4IDUzMWQ1NGYuLjQ4OWZjMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3VzMmVfY3B1ZnJlcS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3VzMmVfY3B1ZnJlcS5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogCWRlZmF1bHQ6CiAJCUJVRygpOwotCX07CisJfQogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbmRleF90b19kaXZpc29yKHVuc2lnbmVkIGludCBpbmRleCkKQEAgLTE5OSw3ICsxOTksNyBAQAogCiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVzdGFyX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyBlc3RhcikKQEAgLTIyNCw3ICsyMjQsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKLQl9OworCX0KIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC91czNfY3B1ZnJlcS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdXMzX2NwdWZyZXEuYwppbmRleCA5YThjZWI3Li5lYjE2MjRiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC91czNfY3B1ZnJlcS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3VzM19jcHVmcmVxLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTI1LDcgKzEyNSw3IEBACiAKIAlkZWZhdWx0OgogCQlCVUcoKTsKLQl9OworCX0KIAogCXJlZyA9IHJlYWRfc2FmYXJpX2NmZygpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYwppbmRleCBhYTZhYzcwLi4yOTM0OGVhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKQEAgLTM2Myw3ICszNjMsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Zpc2VtdWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpc2VtdWwuYwppbmRleCA5ZGZkMmViLi4zNjM1NzcxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC92aXNlbXVsLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJbGVmdCA9IGVkZ2UzMl90YWJfbFsocnMxID4+IDIpICYgMHgxXS5sZWZ0OwogCQlyaWdodCA9IGVkZ2UzMl90YWJfbFsocnMyID4+IDIpICYgMHgxXS5yaWdodDsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlpZiAoKHJzMSAmIH4weDdVTCkgPT0gKHJzMiAmIH4weDdVTCkpCiAJCXJkX3ZhbCA9IHJpZ2h0ICYgbGVmdDsKQEAgLTM2MCw3ICszNjAsNyBAQAogCQl0c3RhdGUgPSByZWdzLT50c3RhdGUgJiB+KFRTVEFURV9YQ0MgfCBUU1RBVEVfSUNDKTsKIAkJcmVncy0+dHN0YXRlID0gdHN0YXRlIHwgKGNjciA8PCAzMlVMKTsKIAl9Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGFycmF5KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgaW5zbiwgdW5zaWduZWQgaW50IG9wZikKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJY2FzZSBBUlJBWTMyX09QRjoKIAkJcmRfdmFsIDw8PSAyOwotCX07CisJfQogCiAJc3RvcmVfcmVnKHJlZ3MsIHJkX3ZhbCwgUkQoaW5zbikpOwogfQpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJCSpmcGRfcmVnYWRkcihmLCBSRChpbnNuKSkgPSByZF92YWw7CiAJCWJyZWFrOwogCX0KLQl9OworCX0KIH0KIAogc3RhdGljIHZvaWQgcG11bChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc24sIHVuc2lnbmVkIGludCBvcGYpCkBAIC02OTMsNyArNjkzLDcgQEAKIAkJKmZwZF9yZWdhZGRyKGYsIFJEKGluc24pKSA9IHJkX3ZhbDsKIAkJYnJlYWs7CiAJfQotCX07CisJfQogfQogCiBzdGF0aWMgdm9pZCBwY21wKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgaW5zbiwgdW5zaWduZWQgaW50IG9wZikKQEAgLTc4Niw3ICs3ODYsNyBAQAogCQkJCXJkX3ZhbCB8PSAxIDw8IGk7CiAJCX0KIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAltYXliZV9mbHVzaF93aW5kb3dzKDAsIDAsIFJEKGluc24pLCAwKTsKIAlzdG9yZV9yZWcocmVncywgcmRfdmFsLCBSRChpbnNuKSk7CkBAIC04ODUsNyArODg1LDcgQEAKIAljYXNlIEJTSFVGRkxFX09QRjoKIAkJYnNodWZmbGUocmVncywgaW5zbik7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmVncy0+dHBjID0gcmVncy0+dG5wYzsKIAlyZWdzLT50bnBjICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMgYi9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKaW5kZXggYjEwYWM0ZC4uNzU0M2RkYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAKIAlkZWZhdWx0OgogCQlicmVhazsKLQl9OworCX0KIAogCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mIChyZWdzKSk7CiAJcmVncy5wYyA9IHBjOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pbml0XzMyLmMgYi9hcmNoL3NwYXJjL21tL2luaXRfMzIuYwppbmRleCBjYTIxNzMyLi43YjAwZGU2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXRfMzIuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfMzIuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJCXByb21fcHJpbnRmKCJwYWdpbmdfaW5pdDogc3BhcmNfY3B1X21vZGVsID0gJWRcbiIsIHNwYXJjX2NwdV9tb2RlbCk7CiAJCXByb21fcHJpbnRmKCJwYWdpbmdfaW5pdDogSGFsdGluZy4uLlxuIik7CiAJCXByb21faGFsdCgpOwotCX07CisJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcHJvdGVjdGlvbiBtYXAgd2l0aCBub24tY29uc3RhbnQsIE1NVSBkZXBlbmRlbnQgdmFsdWVzLiAqLwogCXByb3RlY3Rpb25fbWFwWzBdID0gUEFHRV9OT05FOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwppbmRleCBlMTBjZDAzLi4zZmQ4ZTE4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIAkJa3RzYl9kZXNjclswXS5wZ3N6X2lkeCA9IEhWX1BHU1pfSURYXzRNQjsKIAkJa3RzYl9kZXNjclswXS5wZ3N6X21hc2sgPSBIVl9QR1NaX01BU0tfNE1COwogCQlicmVhazsKLQl9OworCX0KIAogCWt0c2JfZGVzY3JbMF0uYXNzb2MgPSAxOwogCWt0c2JfZGVzY3JbMF0ubnVtX3R0ZXMgPSBLRVJORUxfVFNCX05FTlRSSUVTOwpAQCAtMjI2Niw3ICsyMjY2LDcgQEAKIAkJCXJldHVybiBfUEFHRV9TWjUxMktfNFY7CiAJCWNhc2UgNCAqIDEwMjQgKiAxMDI0OgogCQkJcmV0dXJuIF9QQUdFX1NaNE1CXzRWOwotCQl9OworCQl9CiAJfSBlbHNlIHsKIAkJc3dpdGNoIChzeikgewogCQljYXNlIDggKiAxMDI0OgpAQCAtMjI3OCw3ICsyMjc4LDcgQEAKIAkJCXJldHVybiBfUEFHRV9TWjUxMktfNFU7CiAJCWNhc2UgNCAqIDEwMjQgKiAxMDI0OgogCQkJcmV0dXJuIF9QQUdFX1NaNE1CXzRVOwotCQl9OworCQl9CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2xlb25fbW0uYyBiL2FyY2gvc3BhcmMvbW0vbGVvbl9tbS5jCmluZGV4IGMwZTAxMjkuLmU0ODVhNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vbGVvbl9tbS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vbGVvbl9tbS5jCkBAIC0yMjYsNyArMjI2LDcgQEAKICAqIExlb24yIGFuZCBMZW9uMyBkaWZmZXIgaW4gdGhlaXIgd2F5IG9mIHRlbGxpbmcgY2FjaGUgaW5mb3JtYXRpb24KICAqCiAgKi8KLWludCBsZW9uX2ZsdXNoX25lZWRlZCh2b2lkKQoraW50IF9faW5pdCBsZW9uX2ZsdXNoX25lZWRlZCh2b2lkKQogewogCWludCBmbHVzaF9uZWVkZWQgPSAtMTsKIAl1bnNpZ25lZCBpbnQgc3NpemUsIHNldHM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3NybW11LmMgYi9hcmNoL3NwYXJjL21tL3NybW11LmMKaW5kZXggZmUwOWZkOC4uY2JlZjc0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwpAQCAtMTY2NSw3ICsxNjY1LDcgQEAKIAlkZWZhdWx0OgogCQlzcm1tdV9tb2R0eXBlID0gU3dpZnRfb2s7CiAJCWJyZWFrOwotCX07CisJfQogCiAJQlRGSVhVUFNFVF9DQUxMKGZsdXNoX2NhY2hlX2FsbCwgc3dpZnRfZmx1c2hfY2FjaGVfYWxsLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZmx1c2hfY2FjaGVfbW0sIHN3aWZ0X2ZsdXNoX2NhY2hlX21tLCBCVEZJWFVQQ0FMTF9OT1JNKTsKQEAgLTIwNjksNyArMjA2OSw3IEBACiAJCQkvKiBTb21lIG90aGVyIEN5cHJlc3MgcmV2aXNpb24sIGFzc3VtZSBhIDYwNS4gKi8KIAkJCWluaXRfY3lwcmVzc182MDUobW9kX3Jldik7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCQlyZXR1cm47CiAJfQogCQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IGEyMzUwYjUuLjFjZjRmMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCQlwcm9tX3ByaW50ZigicHJvYmVfdmFjOiBEaWRuJ3QgZXhwZWN0IHZhYy1saW5lc2l6ZSBvZiAlZCwgaGFsdGluZ1xuIiwKIAkJCSAgICBzdW40Y192YWNpbmZvLmxpbmVzaXplKTsKIAkJcHJvbV9oYWx0KCk7Ci0JfTsKKwl9CiAKIAlzdW40Y19mbHVzaF9hbGwoKTsKIAlzdW40Y19lbmFibGVfdmFjKCk7CkBAIC0zNjQsNyArMzY0LDcgQEAKIAkJCXByb21fcHJpbnRmKCJVbmhhbmRsZWQgbnVtYmVyIG9mIHNlZ21hcHM6ICVkXG4iLAogCQkJCSAgICBudW1fc2VnbWFwcyk7CiAJCQlwcm9tX2hhbHQoKTsKLQl9OworCX0KIAlzd2l0Y2ggKG51bV9jb250ZXh0cykgewogCQljYXNlIDg6CiAJCQkvKiBEZWZhdWx0LCBub3RoaW5nIHRvIGRvLiAqLwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJCQlwcm9tX3ByaW50ZigiVW5oYW5kbGVkIG51bWJlciBvZiBjb250ZXh0czogJWRcbiIsCiAJCQkJICAgIG51bV9jb250ZXh0cyk7CiAJCQlwcm9tX2hhbHQoKTsKLQl9OworCX0KIAogCWlmIChzdW40Y192YWNpbmZvLmRvX2h3Zmx1c2hlcyAhPSAwKSB7CiAJCVBBVENIX0lOU04odmFjX2h3Zmx1c2hfcGF0Y2gxX29uLCB2YWNfaHdmbHVzaF9wYXRjaDEpOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJCQlwcm9tX3ByaW50ZigiSW1wb3NzaWJsZSBWQUMgbGluZXNpemUgJWQsIGhhbHRpbmcuLi5cbiIsCiAJCQkJICAgIHN1bjRjX3ZhY2luZm8ubGluZXNpemUpOwogCQkJcHJvbV9oYWx0KCk7Ci0JCX07CisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vdHNiLmMgYi9hcmNoL3NwYXJjL21tL3RzYi5jCmluZGV4IDk0ODQ2MTUuLmE1ZjUxYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vdHNiLmMKKysrIGIvYXJjaC9zcGFyYy9tbS90c2IuYwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiVFNCWyVzOiVkXTogSW1wb3NzaWJsZSBUU0Igc2l6ZSAlbHUsIGtpbGxpbmcgcHJvY2Vzcy5cbiIsCiAJCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHRzYl9ieXRlcyk7CiAJCWRvX2V4aXQoU0lHU0VHVik7Ci0JfTsKKwl9CiAJdHRlIHw9IHB0ZV9zel9iaXRzKHBhZ2Vfc3opOwogCiAJaWYgKHRsYl90eXBlID09IGNoZWV0YWhfcGx1cyB8fCB0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CkBAIC0yMTUsNyArMjE1LDcgQEAKICNlbmRpZgogCQlkZWZhdWx0OgogCQkJQlVHKCk7Ci0JCX07CisJCX0KIAkJaHAtPmFzc29jID0gMTsKIAkJaHAtPm51bV90dGVzID0gdHNiX2J5dGVzIC8gMTY7CiAJCWhwLT5jdHhfaWR4ID0gMDsKQEAgLTIzMCw3ICsyMzAsNyBAQAogI2VuZGlmCiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKLQkJfTsKKwkJfQogCQlocC0+dHNiX2Jhc2UgPSB0c2JfcGFkZHI7CiAJCWhwLT5yZXN2ID0gMDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vY29uc29sZV8zMi5jIGIvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGVfMzIuYwppbmRleCBiMDVlM2RiLi5hMDBmNDdiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vY29uc29sZV8zMi5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9jb25zb2xlXzMyLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7Ci0JfTsKKwl9CiAJcmVzdG9yZV9jdXJyZW50KCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJvbV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGk7IC8qIFVnaCwgd2UgY291bGQgc3BpbiBmb3JldmVyIG9uIHVuc3VwcG9ydGVkIHByb21zIDsoICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jIGIvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYwppbmRleCAwYTYwMWIzLi4yNmM2NGNlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJCSAgICByb212ZWMtPnB2X3JvbXZlcnMpOwogCQlwcm9tX2hhbHQoKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlwcm9tX3JldiA9IHJvbXZlYy0+cHZfcGx1Z2luX3JldmlzaW9uOwogCXByb21fcHJldiA9IHJvbXZlYy0+cHZfcHJpbnRyZXY7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vbXAuYyBiL2FyY2gvc3BhcmMvcHJvbS9tcC5jCmluZGV4IDk3YzQ0YzkuLjBkYTgyNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9tcC5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9tcC5jCkBAIC0zNSw3ICszNSw3IEBACiAJY2FzZSBQUk9NX1YzOgogCQlyZXQgPSAoKihyb212ZWMtPnYzX2NwdXN0YXJ0KSkoY3B1bm9kZSwgKGludCkgY3RhYmxlX3JlZywgY3R4LCBwYyk7CiAJCWJyZWFrOwotCX07CisJfQogCXJlc3RvcmVfY3VycmVudCgpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbW16b25lLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggYzYzNDRjNC4uOWQzZGJjZSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9tbXpvbmUuaApAQCAtNDAsMTcgKzQwLDYgQEAKIAlyZXR1cm4gaGlnaGJpdHNfdG9fbm9kZVtfX3Bmbl90b19oaWdoYml0cyhwZm4pXTsKIH0KIAotLyoKLSAqIEZvbGxvd2luZyBhcmUgbWFjcm9zIHRoYXQgZWFjaCBudW1hIGltcGxtZW50YXRpb24gbXVzdCBkZWZpbmUuCi0gKi8KLQotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JcGdfZGF0YV90ICpfX3BnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CQkJCVwKLQlfX3BnZGF0LT5ub2RlX3N0YXJ0X3BmbiArIF9fcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsJCVwKLX0pCi0KICNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGthZGRyKQl2aXJ0X2FkZHJfdmFsaWQoKHZvaWQgKilrYWRkcikKIAogc3RhdGljIGlubGluZSBpbnQgcGZuX3ZhbGlkKGludCBwZm4pCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmU3NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19VTV9QRVJDUFVfSAorI2RlZmluZSBfX1VNX1BFUkNQVV9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KKworI2VuZGlmIC8qIF9fVU1fUEVSQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL0tjb25maWcgYi9hcmNoL3VuaWNvcmUzMi9LY29uZmlnCmluZGV4IGQzYTMwMzIuLmU1N2RjY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL0tjb25maWcKKysrIGIvYXJjaC91bmljb3JlMzIvS2NvbmZpZwpAQCAtMjMxLDEwICsyMzEsNiBAQAogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBOQjA5MTYgUFdNIGNvbnRyb2xsZXJzCiAKLWNvbmZpZyBQVVYzX1JUQwotCXRyaXN0YXRlICJQS1VuaXR5IHYzIFJUQyBTdXBwb3J0IgotCWRlcGVuZHMgb24gIUFSQ0hfRlBHQQotCiBpZiBQVVYzX05CMDkxNgogCiBtZW51ICJQS1VuaXR5IE5ldEJvb2stMDkxNiBGZWF0dXJlcyIKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL01ha2VmaWxlIGIvYXJjaC91bmljb3JlMzIvTWFrZWZpbGUKaW5kZXggNzZhOGJlZS4uNmFmNGJjNCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvTWFrZWZpbGUKKysrIGIvYXJjaC91bmljb3JlMzIvTWFrZWZpbGUKQEAgLTQwLDQyICs0MCwxMCBAQAogCiBsaWJzLXkJCQkrPSBhcmNoL3VuaWNvcmUzMi9saWIvCiAKLUFTTV9HRU5FUkFURURfRElSCTo9ICQoc3JjdHJlZSkvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9nZW5lcmF0ZWQKLUxJTlVYSU5DTFVERQkJKz0gLUkkKEFTTV9HRU5FUkFURURfRElSKQotCi1BU01fR0VORVJJQ19IRUFERVJTCTo9IGF0b21pYy5oIGF1eHZlYy5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IGJpdHNwZXJsb25nLmggYnVnLmggYnVncy5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IGNwdXRpbWUuaCBjdXJyZW50LmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gZGV2aWNlLmggZGl2NjQuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBlbWVyZ2VuY3ktcmVzdGFydC5oIGVycm5vLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gZmIuaCBmY250bC5oIGZ0cmFjZS5oIGZ1dGV4LmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gaGFyZGlycS5oIGh3X2lycS5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IGlvY3RsLmggaW9jdGxzLmggaXBjYnVmLmggaXJxX3JlZ3MuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBrZGVidWcuaCBrbWFwX3R5cGVzLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gbG9jYWwuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBtbWFuLmggbW9kdWxlLmggbXNnYnVmLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gcGFyYW0uaCBwYXJwb3J0LmggcGVyY3B1LmggcG9sbC5oIHBvc2l4X3R5cGVzLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gcmVzb3VyY2UuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBzY2F0dGVybGlzdC5oIHNlY3Rpb25zLmggc2VnbWVudC5oIHNlbWJ1Zi5oIHNlcmlhbC5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHNldHVwLmggc2htYnVmLmggc2htcGFyYW0uaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBzaWdpbmZvLmggc2lnbmFsLmggc2l6ZXMuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBzb2NrZXQuaCBzb2NraW9zLmggc3RhdC5oIHN0YXRmcy5oIHN3YWIuaCBzeXNjYWxscy5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHRlcm1iaXRzLmggdGVybWlvcy5oIHRvcG9sb2d5LmggdHlwZXMuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSB1Y29udGV4dC5oIHVuYWxpZ25lZC5oIHVzZXIuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSB2Z2EuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSB4b3IuaAotCi1hcmNocHJlcGFyZToKLWlmbmVxICgkKEFTTV9HRU5FUkFURURfRElSKSwgJCh3aWxkY2FyZCAkKEFTTV9HRU5FUkFURURfRElSKSkpCi0JJChRKW1rZGlyIC1wICQoQVNNX0dFTkVSQVRFRF9ESVIpL2FzbQotCSQoUSkkKGZvcmVhY2ggYSwgJChBU01fR0VORVJJQ19IRUFERVJTKSwJXAotCQllY2hvICcjaW5jbHVkZSA8YXNtLWdlbmVyaWMvJGE+JwlcCi0JCQk+ICQoQVNNX0dFTkVSQVRFRF9ESVIpL2FzbS8kYTsgKQotZW5kaWYKLQogYm9vdAkJCTo9IGFyY2gvdW5pY29yZTMyL2Jvb3QKIAotIyBEZWZhdWx0IHRhcmdldCB3aGVuIGV4ZWN1dGluZyBwbGFpbiBtYWtlCisjIERlZmF1bHQgZGVmY29uZmlnIGFuZCB0YXJnZXQgd2hlbiBleGVjdXRpbmcgcGxhaW4gbWFrZQorS0JVSUxEX0RFRkNPTkZJRwk6PSAkKEFSQ0gpX2RlZmNvbmZpZwogS0JVSUxEX0lNQUdFCQk6PSB6SW1hZ2UKIAogYWxsOgkkKEtCVUlMRF9JTUFHRSkKQEAgLTgzLDggKzUxLDYgQEAKIHpJbWFnZSBJbWFnZSB1SW1hZ2U6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAotTVJQUk9QRVJfRElSUwkJKz0gJChBU01fR0VORVJBVEVEX0RJUikKLQogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC91bmljb3JlMzIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDk1MzczNDIuLmIwOTU0YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3VuaWNvcmUzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTU5LDcgKzU5LDcgQEAKICMgV2Ugbm93IGhhdmUgYSBQSUMgZGVjb21wcmVzc29yIGltcGxlbWVudGF0aW9uLiAgRGVjb21wcmVzc29ycyBydW5uaW5nCiAjIGZyb20gUkFNIHNob3VsZCBub3QgZGVmaW5lIFpURVhUQUREUi4gIERlY29tcHJlc3NvcnMgcnVubmluZyBkaXJlY3RseQogIyBmcm9tIFJPTSBvciBGbGFzaCBtdXN0IGRlZmluZSBaVEVYVEFERFIgKHByZWZlcmFibHkgdmlhIHRoZSBjb25maWcpCi1aVEVYVEFERFIJOj0gMAorWlRFWFRBRERSCTo9IDB4MDMwMDAwMDAKIFpCU1NBRERSCTo9IEFMSUdOKDQpCiAKIFNFREZMQUdTX2xkcwk9IHMvVEVYVF9TVEFSVC8kKFpURVhUQUREUikvO3MvQlNTX1NUQVJULyQoWkJTU0FERFIpLwpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvY29uZmlncy9kZWJ1Z19kZWZjb25maWcgYi9hcmNoL3VuaWNvcmUzMi9jb25maWdzL3VuaWNvcmUzMl9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC91bmljb3JlMzIvY29uZmlncy9kZWJ1Z19kZWZjb25maWcKcmVuYW1lIHRvIGFyY2gvdW5pY29yZTMyL2NvbmZpZ3MvdW5pY29yZTMyX2RlZmNvbmZpZwppbmRleCBiNWZiZGU5Li5jOWRkMzE5IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9jb25maWdzL2RlYnVnX2RlZmNvbmZpZworKysgYi9hcmNoL3VuaWNvcmUzMi9jb25maWdzL3VuaWNvcmUzMl9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjIyMgR2VuZXJhbCBzZXR1cAogQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DQUxWRVJTSU9OPSItZGVidWciCitDT05GSUdfTE9DQUxWRVJTSU9OPSItdW5pY29yZTMyIgogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CkBAIC02NCw3ICs2NCw2IEBACiBDT05GSUdfSTJDX0VFUFJPTV9BVDI0PW4KIENPTkZJR19MQ0RfQkFDS0xJR0hUPW4KIAotQ09ORklHX1BVVjNfUlRDPXkKIENPTkZJR19QVVYzX1VNQUw9eQogQ09ORklHX1BVVjNfTVVTQj1uCiBDT05GSUdfUFVWM19BQzk3PW4KQEAgLTE2Nyw4ICsxNjYsOSBAQAogQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQogCiAjCVJlYWwgVGltZSBDbG9jawotQ09ORklHX1JUQ19MSUI9bQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX1BVVjM9eQogCiAjIyMgRmlsZSBzeXN0ZW1zCiBDT05GSUdfRVhUMl9GUz1tCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYjIwMGZkYS4uY2ExMTNkNiAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwyICsxLDYxIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCitnZW5lcmljLXkgKz0gYXRvbWljLmgKK2dlbmVyaWMteSArPSBhdXh2ZWMuaAorZ2VuZXJpYy15ICs9IGJpdHNwZXJsb25nLmgKK2dlbmVyaWMteSArPSBidWcuaAorZ2VuZXJpYy15ICs9IGJ1Z3MuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAorZ2VuZXJpYy15ICs9IGRldmljZS5oCitnZW5lcmljLXkgKz0gZGl2NjQuaAorZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKK2dlbmVyaWMteSArPSBlcnJuby5oCitnZW5lcmljLXkgKz0gZmIuaAorZ2VuZXJpYy15ICs9IGZjbnRsLmgKK2dlbmVyaWMteSArPSBmdHJhY2UuaAorZ2VuZXJpYy15ICs9IGZ1dGV4LmgKK2dlbmVyaWMteSArPSBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBod19pcnEuaAorZ2VuZXJpYy15ICs9IGlvY3RsLmgKK2dlbmVyaWMteSArPSBpb2N0bHMuaAorZ2VuZXJpYy15ICs9IGlwY2J1Zi5oCitnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAorZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCitnZW5lcmljLXkgKz0ga21hcF90eXBlcy5oCitnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IG1tYW4uaAorZ2VuZXJpYy15ICs9IG1vZHVsZS5oCitnZW5lcmljLXkgKz0gbXNnYnVmLmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGFycG9ydC5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwb2xsLmgKK2dlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAorZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKK2dlbmVyaWMteSArPSBzZWN0aW9ucy5oCitnZW5lcmljLXkgKz0gc2VnbWVudC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzZXJpYWwuaAorZ2VuZXJpYy15ICs9IHNldHVwLmgKK2dlbmVyaWMteSArPSBzaG1idWYuaAorZ2VuZXJpYy15ICs9IHNobXBhcmFtLmgKK2dlbmVyaWMteSArPSBzaWdpbmZvLmgKK2dlbmVyaWMteSArPSBzaWduYWwuaAorZ2VuZXJpYy15ICs9IHNpemVzLmgKK2dlbmVyaWMteSArPSBzb2NrZXQuaAorZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAorZ2VuZXJpYy15ICs9IHN0YXQuaAorZ2VuZXJpYy15ICs9IHN0YXRmcy5oCitnZW5lcmljLXkgKz0gc3dhYi5oCitnZW5lcmljLXkgKz0gc3lzY2FsbHMuaAorZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKK2dlbmVyaWMteSArPSB0ZXJtaW9zLmgKK2dlbmVyaWMteSArPSB0b3BvbG9neS5oCitnZW5lcmljLXkgKz0gdHlwZXMuaAorZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKK2dlbmVyaWMteSArPSB1bmFsaWduZWQuaAorZ2VuZXJpYy15ICs9IHVzZXIuaAorZ2VuZXJpYy15ICs9IHZnYS5oCitnZW5lcmljLXkgKz0geG9yLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlYzIzYTJmLi5hZWIwZjE4IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw2IEBACiBvYmotJChDT05GSUdfQVJDSF9QVVYzKQkJKz0gY2xvY2subyBpcnEubyB0aW1lLm8KIAogb2JqLSQoQ09ORklHX1BVVjNfR1BJTykJCSs9IGdwaW8ubwotb2JqLSQoQ09ORklHX1BVVjNfUlRDKQkJKz0gcnRjLm8KIG9iai0kKENPTkZJR19QVVYzX1BXTSkJCSs9IHB3bS5vCiBvYmotJChDT05GSUdfUFVWM19QTSkJCSs9IHBtLm8gc2xlZXAubwogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBoaWJlcm5hdGUubyBoaWJlcm5hdGVfYXNtLm8KZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggOWJmN2Y3YS4uNzdlNDA3ZSAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMwLDcgKzMwLDcgQEAKIAlIRUFEX1RFWFRfU0VDVElPTgogCUlOSVRfVEVYVF9TRUNUSU9OKFBBR0VfU0laRSkKIAlJTklUX0RBVEFfU0VDVElPTigxNikKLQlQRVJDUFUoTDFfQ0FDSEVfQllURVMsIFBBR0VfU0laRSkKKwlQRVJDUFVfU0VDVElPTihMMV9DQUNIRV9CWVRFUykKIAlfX2luaXRfZW5kID0gLjsKIAogCV9zdGV4dCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGJfdGltZXIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCmluZGV4IDJmZWZhNTAuLmFmNjBkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCkBAIC02Miw3ICs2Miw3IEBACiAjZWxzZSAvKiBDT05GSUdfQVBCX1RJTUVSICovCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcGJ0X3F1aWNrX2NhbGlicmF0ZSh2b2lkKSB7cmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcGJ0X3RpbWVfaW5pdCh2b2lkKSB7cmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcGJ0X3RpbWVfaW5pdCh2b2lkKSB7IH0KIAogI2VuZGlmCiAjZW5kaWYgLyogQVNNX1g4Nl9BUEJUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21lbWJsb2NrLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tZW1ibG9jay5oCmluZGV4IDE5YWUxNGIuLjBjZDM4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWVtYmxvY2suaApAQCAtNCw3ICs0LDYgQEAKICNkZWZpbmUgQVJDSF9ESVNDQVJEX01FTUJMT0NLCiAKIHU2NCBtZW1ibG9ja194ODZfZmluZF9pbl9yYW5nZV9zaXplKHU2NCBzdGFydCwgdTY0ICpzaXplcCwgdTY0IGFsaWduKTsKLXZvaWQgbWVtYmxvY2tfeDg2X3RvX2Jvb3RtZW0odTY0IHN0YXJ0LCB1NjQgZW5kKTsKIAogdm9pZCBtZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZSh1NjQgc3RhcnQsIHU2NCBlbmQsIGNoYXIgKm5hbWUpOwogdm9pZCBtZW1ibG9ja194ODZfZnJlZV9yYW5nZSh1NjQgc3RhcnQsIHU2NCBlbmQpOwpAQCAtMTksNSArMTgsNiBAQAogdTY0IG1lbWJsb2NrX3g4Nl9maW5kX2luX3JhbmdlX25vZGUoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgZW5kLCB1NjQgc2l6ZSwgdTY0IGFsaWduKTsKIHU2NCBtZW1ibG9ja194ODZfZnJlZV9tZW1vcnlfaW5fcmFuZ2UodTY0IGFkZHIsIHU2NCBsaW1pdCk7CiB1NjQgbWVtYmxvY2tfeDg2X21lbW9yeV9pbl9yYW5nZSh1NjQgYWRkciwgdTY0IGxpbWl0KTsKK2Jvb2wgbWVtYmxvY2tfeDg2X2NoZWNrX3Jlc2VydmVkX3NpemUodTY0ICphZGRycCwgdTY0ICpzaXplcCwgdTY0IGFsaWduKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCmluZGV4IDVlODNhNDEuLmZmYTAzN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCkBAIC00OCwxNyArNDgsNiBAQAogI2VuZGlmCiB9CiAKLS8qCi0gKiBGb2xsb3dpbmcgYXJlIG1hY3JvcyB0aGF0IGVhY2ggbnVtYSBpbXBsbWVudGF0aW9uIG11c3QgZGVmaW5lLgotICovCi0KLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXBnX2RhdGFfdCAqX19wZ2RhdCA9IE5PREVfREFUQShuaWQpOwkJCQlcCi0JX19wZ2RhdC0+bm9kZV9zdGFydF9wZm4gKyBfX3BnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXM7CQlcCi19KQotCiBzdGF0aWMgaW5saW5lIGludCBwZm5fdmFsaWQoaW50IHBmbikKIHsKIAlpbnQgbmlkID0gcGZuX3RvX25pZChwZm4pOwpAQCAtNjgsNiArNTcsOCBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIGVhcmx5X3Bmbl92YWxpZChwZm4pCXBmbl92YWxpZCgocGZuKSkKKwogI2VuZGlmIC8qIENPTkZJR19ESVNDT05USUdNRU0gKi8KIAogI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV82NC5oCmluZGV4IGIzZjg4ZDcuLjEyOWQ5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV82NC5oCkBAIC0xMyw4ICsxMyw1IEBACiAKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKIAotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpICAgICAgIChOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4gKwlcCi0JCQkJIE5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMpCiAjZW5kaWYKICNlbmRpZiAvKiBfQVNNX1g4Nl9NTVpPTkVfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCmluZGV4IDMxZDg0YWMuLmE1MThjMGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKQEAgLTIyLDYgKzIyLDggQEAKIAl1NjQgcHJvZHVjdDsKICNpZmRlZiBfX2kzODZfXwogCXUzMiB0bXAxLCB0bXAyOworI2Vsc2UKKwl1bG9uZyB0bXA7CiAjZW5kaWYKIAogCWlmIChzaGlmdCA8IDApCkBAIC00Miw4ICs0NCwxMSBAQAogCQk6ICJhIiAoKHUzMilkZWx0YSksICIxIiAoKHUzMikoZGVsdGEgPj4gMzIpKSwgIjIiIChtdWxfZnJhYykgKTsKICNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKIAlfX2FzbV9fICgKLQkJIm11bCAlJXJkeCA7IHNocmQgJDMyLCUlcmR4LCUlcmF4IgotCQk6ICI9YSIgKHByb2R1Y3QpIDogIjAiIChkZWx0YSksICJkIiAoKHU2NCltdWxfZnJhYykgKTsKKwkJIm11bCAlW211bF9mcmFjXSA7IHNocmQgJDMyLCAlW2hpXSwgJVtsb10iCisJCTogW2xvXSI9YSIocHJvZHVjdCksCisJCSAgW2hpXSI9ZCIodG1wKQorCQk6ICIwIihkZWx0YSksCisJCSAgW211bF9mcmFjXSJybSIoKHU2NCltdWxfZnJhYykpOwogI2Vsc2UKICNlcnJvciBpbXBsZW1lbnQgbWUhCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCBmNWFiZTNhLi45MGIwNmQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogCiBpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCiAjIERvIG5vdCBwcm9maWxlIGRlYnVnIGFuZCBsb3dsZXZlbCB1dGlsaXRpZXMKK0NGTEFHU19SRU1PVkVfdHNjLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfcnRjLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfcGFyYXZpcnQtc3BpbmxvY2tzLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfcHZjbG9jay5vID0gLXBnCkBAIC0yOCw2ICsyOSw3IEBACiBHQ09WX1BST0ZJTEVfdnN5c2NhbGxfNjQubwk6PSBuCiBHQ09WX1BST0ZJTEVfaHBldC5vCQk6PSBuCiBHQ09WX1BST0ZJTEVfdHNjLm8JCTo9IG4KK0dDT1ZfUFJPRklMRV92cmVhZF90c2NfNjQubwk6PSBuCiBHQ09WX1BST0ZJTEVfcGFyYXZpcnQubwkJOj0gbgogCiAjIHZyZWFkX3RzY182NCBpcyBob3QgYW5kIHNob3VsZCBiZSBmdWxseSBvcHRpbWl6ZWQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5TCmluZGV4IGVhZDIxYjYuLmI0ZmQ4MzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5TCkBAIC0yOCw2ICsyOCw4IEBACiBwbW9kZV9jcjQ6CS5sb25nCTAJLyogU2F2ZWQgJWNyNCAqLwogcG1vZGVfZWZlcjoJLnF1YWQJMAkvKiBTYXZlZCBFRkVSICovCiBwbW9kZV9nZHQ6CS5xdWFkCTAKK3Btb2RlX21pc2NfZW46CS5xdWFkCTAJLyogU2F2ZWQgTUlTQ19FTkFCTEUgTVNSICovCitwbW9kZV9iZWhhdmlvcjoJLmxvbmcJMAkvKiBXYWtldXAgYmVoYXZpb3IgZmxhZ3MgKi8KIHJlYWxtb2RlX2ZsYWdzOgkubG9uZwkwCiByZWFsX21hZ2ljOgkubG9uZwkwCiB0cmFtcG9saW5lX3NlZ21lbnQ6CS53b3JkIDAKQEAgLTkxLDYgKzkzLDE4IEBACiAJLyogQ2FsbCB0aGUgQyBjb2RlICovCiAJY2FsbGwJbWFpbgogCisJLyogUmVzdG9yZSBNSVNDX0VOQUJMRSBiZWZvcmUgZW50ZXJpbmcgcHJvdGVjdGVkIG1vZGUsIGluIGNhc2UKKwkgICBCSU9TIGRlY2lkZWQgdG8gY2xlYXIgWERfRElTQUJMRSBkdXJpbmcgUzMuICovCisJbW92bAlwbW9kZV9iZWhhdmlvciwgJWVheAorCWJ0bAkkV0FLRVVQX0JFSEFWSU9SX1JFU1RPUkVfTUlTQ19FTkFCTEUsICVlYXgKKwlqbmMJMWYKKworCW1vdmwJcG1vZGVfbWlzY19lbiwgJWVheAorCW1vdmwJcG1vZGVfbWlzY19lbiArIDQsICVlZHgKKwltb3ZsCSRNU1JfSUEzMl9NSVNDX0VOQUJMRSwgJWVjeAorCXdybXNyCisxOgorCiAJLyogRG8gYW55IG90aGVyIHN0dWZmLi4uICovCiAKICNpZm5kZWYgQ09ORklHXzY0QklUCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaCBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5oCmluZGV4IGUxODI4YzAuLjk3YTI5ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5oCkBAIC0yMSw2ICsyMSw5IEBACiAJdTMyIHBtb2RlX2VmZXJfbG93OwkvKiBQcm90ZWN0ZWQgbW9kZSBFRkVSICovCiAJdTMyIHBtb2RlX2VmZXJfaGlnaDsKIAl1NjQgcG1vZGVfZ2R0OworCXUzMiBwbW9kZV9taXNjX2VuX2xvdzsJLyogUHJvdGVjdGVkIG1vZGUgTUlTQ19FTkFCTEUgKi8KKwl1MzIgcG1vZGVfbWlzY19lbl9oaWdoOworCXUzMiBwbW9kZV9iZWhhdmlvcjsJLyogV2FrZXVwIHJvdXRpbmUgYmVoYXZpb3IgZmxhZ3MgKi8KIAl1MzIgcmVhbG1vZGVfZmxhZ3M7CiAJdTMyIHJlYWxfbWFnaWM7CiAJdTE2IHRyYW1wb2xpbmVfc2VnbWVudDsJLyogc2VnbWVudCB3aXRoIHRyYW1wb2xpbmUgY29kZSwgNjQtYml0IG9ubHkgKi8KQEAgLTM5LDQgKzQyLDcgQEAKICNkZWZpbmUgV0FLRVVQX0hFQURFUl9TSUdOQVRVUkUgMHg1MWVlMTExMQogI2RlZmluZSBXQUtFVVBfRU5EX1NJR05BVFVSRQkweDY1YTIyYzgyCiAKKy8qIFdha2V1cCBiZWhhdmlvciBiaXRzICovCisjZGVmaW5lIFdBS0VVUF9CRUhBVklPUl9SRVNUT1JFX01JU0NfRU5BQkxFICAgICAwCisKICNlbmRpZiAvKiBBUkNIX1g4Nl9LRVJORUxfQUNQSV9STV9XQUtFVVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKaW5kZXggMThhODU3Yi4uMTAzYjZhYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC03Nyw2ICs3NywxMiBAQAogCiAJaGVhZGVyLT5wbW9kZV9jcjAgPSByZWFkX2NyMCgpOwogCWhlYWRlci0+cG1vZGVfY3I0ID0gcmVhZF9jcjRfc2FmZSgpOworCWhlYWRlci0+cG1vZGVfYmVoYXZpb3IgPSAwOworCWlmICghcmRtc3Jfc2FmZShNU1JfSUEzMl9NSVNDX0VOQUJMRSwKKwkJCSZoZWFkZXItPnBtb2RlX21pc2NfZW5fbG93LAorCQkJJmhlYWRlci0+cG1vZGVfbWlzY19lbl9oaWdoKSkKKwkJaGVhZGVyLT5wbW9kZV9iZWhhdmlvciB8PQorCQkJKDEgPDwgV0FLRVVQX0JFSEFWSU9SX1JFU1RPUkVfTUlTQ19FTkFCTEUpOwogCWhlYWRlci0+cmVhbG1vZGVfZmxhZ3MgPSBhY3BpX3JlYWxtb2RlX2ZsYWdzOwogCWhlYWRlci0+cmVhbF9tYWdpYyA9IDB4MTIzNDU2Nzg7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwppbmRleCBjZDhjYmViLi43YzNhOTVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2dhcnQuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2FtZF9pb21tdV9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXVfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYW1kX2lvbW11Lmg+CkBAIC0xNTQsNiArMTU1LDEwIEBACiAJcGRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KFBDSV9CVVMoYWxpYXMpLCBhbGlhcyAmIDB4ZmYpOwogCWlmIChwZGV2KQogCQlkZXZfZGF0YS0+YWxpYXMgPSAmcGRldi0+ZGV2OworCWVsc2UgeworCQlrZnJlZShkZXZfZGF0YSk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQogCiAJYXRvbWljX3NldCgmZGV2X2RhdGEtPmJpbmQsIDApOwogCkBAIC0xNjMsNiArMTY4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGlvbW11X2lnbm9yZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXUxNiBkZXZpZCwgYWxpYXM7CisKKwlkZXZpZCA9IGdldF9kZXZpY2VfaWQoZGV2KTsKKwlhbGlhcyA9IGFtZF9pb21tdV9hbGlhc190YWJsZVtkZXZpZF07CisKKwltZW1zZXQoJmFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLCAwLCBzaXplb2Yoc3RydWN0IGRldl90YWJsZV9lbnRyeSkpOworCW1lbXNldCgmYW1kX2lvbW11X2Rldl90YWJsZVthbGlhc10sIDAsIHNpemVvZihzdHJ1Y3QgZGV2X3RhYmxlX2VudHJ5KSk7CisKKwlhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF0gPSBOVUxMOworCWFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2FsaWFzXSA9IE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGlvbW11X3VuaW5pdF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCWtmcmVlKGRldi0+YXJjaGRhdGEuaW9tbXUpOwpAQCAtMTkyLDcgKzIxMSw5IEBACiAJCQljb250aW51ZTsKIAogCQlyZXQgPSBpb21tdV9pbml0X2RldmljZSgmcGRldi0+ZGV2KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCA9PSAtRU5PVFNVUFApCisJCQlpb21tdV9pZ25vcmVfZGV2aWNlKCZwZGV2LT5kZXYpOworCQllbHNlIGlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KIApAQCAtMjM4Myw2ICsyNDA0LDIzIEBACiAJLmRtYV9zdXBwb3J0ZWQgPSBhbWRfaW9tbXVfZG1hX3N1cHBvcnRlZCwKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBkZXZpY2VfZG1hX29wc19pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXVuc2lnbmVkIHVuaGFuZGxlZCA9IDA7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJaWYgKCFjaGVja19kZXZpY2UoJnBkZXYtPmRldikpIHsKKwkJCXVuaGFuZGxlZCArPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlwZGV2LT5kZXYuYXJjaGRhdGEuZG1hX29wcyA9ICZhbWRfaW9tbXVfZG1hX29wczsKKwl9CisKKwlyZXR1cm4gdW5oYW5kbGVkOworfQorCiAvKgogICogVGhlIGZ1bmN0aW9uIHdoaWNoIGNsdWVzIHRoZSBBTUQgSU9NTVUgZHJpdmVyIGludG8gZG1hX29wcy4KICAqLwpAQCAtMjM5NSw3ICsyNDMzLDcgQEAKIGludCBfX2luaXQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKQogewogCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCWludCByZXQ7CisJaW50IHJldCwgdW5oYW5kbGVkOwogCiAJLyoKIAkgKiBmaXJzdCBhbGxvY2F0ZSBhIGRlZmF1bHQgcHJvdGVjdGlvbiBkb21haW4gZm9yIGV2ZXJ5IElPTU1VIHdlCkBAIC0yNDIxLDcgKzI0NTksMTEgQEAKIAlzd2lvdGxiID0gMDsKIAogCS8qIE1ha2UgdGhlIGRyaXZlciBmaW5hbGx5IHZpc2libGUgdG8gdGhlIGRyaXZlcnMgKi8KLQlkbWFfb3BzID0gJmFtZF9pb21tdV9kbWFfb3BzOworCXVuaGFuZGxlZCA9IGRldmljZV9kbWFfb3BzX2luaXQoKTsKKwlpZiAodW5oYW5kbGVkICYmIG1heF9wZm4gPiBNQVhfRE1BMzJfUEZOKSB7CisJCS8qIFRoZXJlIGFyZSB1bmhhbmRsZWQgZGV2aWNlcyAtIGluaXRpYWxpemUgc3dpb3RsYiBmb3IgdGhlbSAqLworCQlzd2lvdGxiID0gMTsKKwl9CiAKIAlhbWRfaW9tbXVfc3RhdHNfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCmluZGV4IDkxNzljMjEuLmJmYzg0NTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCkBAIC03MzEsOCArNzMxLDggQEAKIHsKIAl1OCAqcCA9ICh1OCAqKWg7CiAJdTggKmVuZCA9IHAsIGZsYWdzID0gMDsKLQl1MTYgZGV2X2ksIGRldmlkID0gMCwgZGV2aWRfc3RhcnQgPSAwLCBkZXZpZF90byA9IDA7Ci0JdTMyIGV4dF9mbGFncyA9IDA7CisJdTE2IGRldmlkID0gMCwgZGV2aWRfc3RhcnQgPSAwLCBkZXZpZF90byA9IDA7CisJdTMyIGRldl9pLCBleHRfZmxhZ3MgPSAwOwogCWJvb2wgYWxpYXMgPSBmYWxzZTsKIAlzdHJ1Y3QgaXZoZF9lbnRyeSAqZTsKIApAQCAtODg3LDcgKzg4Nyw3IEBACiAvKiBJbml0aWFsaXplcyB0aGUgZGV2aWNlLT5pb21tdSBtYXBwaW5nIGZvciB0aGUgZHJpdmVyICovCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2lvbW11X2RldmljZXMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7Ci0JdTE2IGk7CisJdTMyIGk7CiAKIAlmb3IgKGkgPSBpb21tdS0+Zmlyc3RfZGV2aWNlOyBpIDw9IGlvbW11LT5sYXN0X2RldmljZTsgKytpKQogCQlzZXRfaW9tbXVfZm9yX2RldmljZShpb21tdSwgaSk7CkBAIC0xMTc3LDcgKzExNzcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBpbml0X2RldmljZV90YWJsZSh2b2lkKQogewotCXUxNiBkZXZpZDsKKwl1MzIgZGV2aWQ7CiAKIAlmb3IgKGRldmlkID0gMDsgZGV2aWQgPD0gYW1kX2lvbW11X2xhc3RfYmRmOyArK2RldmlkKSB7CiAJCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfVkFMSUQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCmluZGV4IGI5NjFhZjguLmI5MzM4YjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKQEAgLTM5MCw3ICszOTAsOCBAQAogCiAvKgogICogSWYgbWFzaz0xLCB0aGUgTFZUIGVudHJ5IGRvZXMgbm90IGdlbmVyYXRlIGludGVycnVwdHMgd2hpbGUgbWFzaz0wCi0gKiBlbmFibGVzIHRoZSB2ZWN0b3IuIFNlZSBhbHNvIHRoZSBCS0RHcy4KKyAqIGVuYWJsZXMgdGhlIHZlY3Rvci4gU2VlIGFsc28gdGhlIEJLREdzLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBwcmVlbXB0aW9uIGRpc2FibGVkLgogICovCiAKIGludCBzZXR1cF9BUElDX2VpbHZ0KHU4IG9mZnNldCwgdTggdmVjdG9yLCB1OCBtc2dfdHlwZSwgdTggbWFzaykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IGI1MTFhMDEuLmFkYzY2YzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtNjMyLDE0ICs2MzIsMTQgQEAKIAogLyogRGlyZWN0IExlZ2FjeSBWR0EgSS9PIHRyYWZmaWMgdG8gZGVzaWduYXRlZCBJT0ggKi8KIGludCB1dl9zZXRfdmdhX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sIGRlY29kZSwKLQkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgYm9vbCBjaGFuZ2VfYnJpZGdlKQorCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCB1MzIgZmxhZ3MpCiB7CiAJaW50IGRvbWFpbiwgYnVzLCByYzsKIAotCVBSX0RFVkVMKCJkZXZmbiAleCBkZWNvZGUgJWQgY21kICV4IGNoZ19icmRnICVkXG4iLAotCQkJcGRldi0+ZGV2Zm4sIGRlY29kZSwgY29tbWFuZF9iaXRzLCBjaGFuZ2VfYnJpZGdlKTsKKwlQUl9ERVZFTCgiZGV2Zm4gJXggZGVjb2RlICVkIGNtZCAleCBmbGFncyAlZFxuIiwKKwkJCXBkZXYtPmRldmZuLCBkZWNvZGUsIGNvbW1hbmRfYml0cywgZmxhZ3MpOwogCi0JaWYgKCFjaGFuZ2VfYnJpZGdlKQorCWlmICghKGZsYWdzICYgUENJX1ZHQV9TVEFURV9DSEFOR0VfQlJJREdFKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKGNvbW1hbmRfYml0cyAmIFBDSV9DT01NQU5EX0lPKSA9PSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYyBiL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKaW5kZXggNjkwYmM4NC4uOWFlYjc4YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogCiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vaXJxX2NvbnRyb2xsZXIuaD4KQEAgLTk4LDYgKzk5LDE2IEBACiAJcmV0dXJuIF9fYWxsb2NfYm9vdG1lbShzaXplLCBhbGlnbiwgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKIH0KIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBfX2luaXQgZWFybHlfaW5pdF9kdF9zZXR1cF9pbml0cmRfYXJjaCh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShzdGFydCk7CisJaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoZW5kKTsKKwlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOworfQorI2VuZGlmCisKIHZvaWQgX19pbml0IGFkZF9kdGIodTY0IGRhdGEpCiB7CiAJaW5pdGlhbF9kdGIgPSBkYXRhICsgb2Zmc2V0b2Yoc3RydWN0IHNldHVwX2RhdGEsIGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNDI2YTViNi4uZTFiYThjYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMzcsNyArMzM3LDcgQEAKICAqIFBvd2VybWFuYWdlbWVudCBpZGxlIGZ1bmN0aW9uLCBpZiBhbnkuLgogICovCiB2b2lkICgqcG1faWRsZSkodm9pZCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVBNX01PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfQVBNX0NQVV9JRExFKQorI2lmZGVmIENPTkZJR19BUE1fTU9EVUxFCiBFWFBPUlRfU1lNQk9MKHBtX2lkbGUpOwogI2VuZGlmCiAKQEAgLTM5OSw3ICszOTksNyBAQAogCQljcHVfcmVsYXgoKTsKIAl9CiB9Ci0jaWYgZGVmaW5lZChDT05GSUdfQVBNX01PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfQVBNX0NQVV9JRExFKQorI2lmZGVmIENPTkZJR19BUE1fTU9EVUxFCiBFWFBPUlRfU1lNQk9MKGRlZmF1bHRfaWRsZSk7CiAjZW5kaWYKIApAQCAtNjQyLDcgKzY0Miw3IEBACiAJCWJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSBJRExFX1BPTEw7CiAJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm13YWl0IikpIHsKIAkJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfRk9SQ0VfTVdBSVQ7Ci0JCVdBUk5fT05DRSgxLCAiXGlkbGU9bXdhaXRcIiB3aWxsIGJlIHJlbW92ZWQgaW4gMjAxMlwiXG4iKTsKKwkJV0FSTl9PTkNFKDEsICJcImlkbGU9bXdhaXRcIiB3aWxsIGJlIHJlbW92ZWQgaW4gMjAxMlxuIik7CiAJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImhhbHQiKSkgewogCQkvKgogCQkgKiBXaGVuIHRoZSBib290IG9wdGlvbiBvZiBpZGxlPWhhbHQgaXMgYWRkZWQsIGhhbHQgaXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDhkMTI4NzguLmEzZDBkYzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMjQ1LDcgKzI0NSw2IEBACiB7CiAJc2V0X3VzZXJfZ3MocmVncywgMCk7CiAJcmVncy0+ZnMJCT0gMDsKLQlzZXRfZnMoVVNFUl9EUyk7CiAJcmVncy0+ZHMJCT0gX19VU0VSX0RTOwogCXJlZ3MtPmVzCQk9IF9fVVNFUl9EUzsKIAlyZWdzLT5zcwkJPSBfX1VTRVJfRFM7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCA2YzlkZDkyLi5jYTZmN2FiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTMzOCw3ICszMzgsNiBAQAogCXJlZ3MtPmNzCQk9IF9jczsKIAlyZWdzLT5zcwkJPSBfc3M7CiAJcmVncy0+ZmxhZ3MJCT0gWDg2X0VGTEFHU19JRjsKLQlzZXRfZnMoVVNFUl9EUyk7CiAJLyoKIAkgKiBGcmVlIHRoZSBvbGQgRlAgYW5kIG90aGVyIGV4dGVuZGVkIHN0YXRlCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggMGMwMTZmNy4uNGYwZDQ2ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMjk0LDYgKzI5NCwxNCBAQAogCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVmVyc2FMb2dpYyBNZW5sb3cgYm9hcmQiKSwKIAkJfSwKIAl9LAorCXsgLyogSGFuZGxlIHJlYm9vdCBpc3N1ZSBvbiBBY2VyIEFzcGlyZSBvbmUgKi8KKwkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAorCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUgT25lIEExMTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQU9BMTEwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGVlZmQ5NjcuLjlmZDMxMzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMjg1LDYgKzI4NSwxOSBAQAogCXBlcl9jcHUoY3B1X3N0YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gQ1BVX09OTElORTsKIAl4ODZfcGxhdGZvcm0ubm1pX2luaXQoKTsKIAorCS8qCisJICogV2FpdCB1bnRpbCB0aGUgY3B1IHdoaWNoIGJyb3VnaHQgdGhpcyBvbmUgdXAgbWFya2VkIGl0CisJICogb25saW5lIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzLiBJZiB3ZSBkb24ndCBkbyB0aGF0IHRoZW4KKwkgKiB3ZSBjYW4gZW5kIHVwIHdha2luZyB1cCB0aGUgc29mdGlycSB0aHJlYWQgYmVmb3JlIHRoaXMgY3B1CisJICogcmVhY2hlZCB0aGUgYWN0aXZlIHN0YXRlLCB3aGljaCBtYWtlcyB0aGUgc2NoZWR1bGVyIHVuaGFwcHkKKwkgKiBhbmQgc2NoZWR1bGUgdGhlIHNvZnRpcnEgdGhyZWFkIG9uIHRoZSB3cm9uZyBjcHUuIFRoaXMgaXMKKwkgKiBvbmx5IG9ic2VydmFibGUgd2l0aCBmb3JjZWQgdGhyZWFkZWQgaW50ZXJydXB0cywgYnV0IGluCisJICogdGhlb3J5IGl0IGNvdWxkIGFsc28gaGFwcGVuIHcvbyB0aGVtLiBJdCdzIGp1c3Qgd2F5IGhhcmRlcgorCSAqIHRvIGFjaGlldmUuCisJICovCisJd2hpbGUgKCFjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2FjdGl2ZV9tYXNrKSkKKwkJY3B1X3JlbGF4KCk7CisKIAkvKiBlbmFibGUgbG9jYWwgaW50ZXJydXB0cyAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApAQCAtMTMzMiw3ICsxMzQ1LDcgQEAKIAl2b2lkICptd2FpdF9wdHI7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gX190aGlzX2NwdV9wdHIoJmNwdV9pbmZvKTsKIAotCWlmICghdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX01XQUlUKSAmJiBtd2FpdF91c2FibGUoYykpCisJaWYgKCEodGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX01XQUlUKSAmJiBtd2FpdF91c2FibGUoYykpKQogCQlyZXR1cm47CiAJaWYgKCF0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFNIKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYyBiL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKaW5kZXggZDZlMjQ3Ny4uYWRjOTg2NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jCkBAIC00NywzOCArNDcsNDAgQEAKICNkZWZpbmUgRHN0REkgICAgICAgKDU8PDEpCS8qIERlc3RpbmF0aW9uIGlzIGluIEVTOihFKURJICovCiAjZGVmaW5lIERzdE1lbTY0ICAgICg2PDwxKQkvKiA2NGJpdCBtZW1vcnkgb3BlcmFuZCAqLwogI2RlZmluZSBEc3RJbW1VQnl0ZSAoNzw8MSkJLyogOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSNkZWZpbmUgRHN0TWFzayAgICAgKDc8PDEpCisjZGVmaW5lIERzdERYICAgICAgICg4PDwxKQkvKiBEZXN0aW5hdGlvbiBpcyBpbiBEWCByZWdpc3RlciAqLworI2RlZmluZSBEc3RNYXNrICAgICAoMHhmPDwxKQogLyogU291cmNlIG9wZXJhbmQgdHlwZS4gKi8KLSNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDQpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNSZWcgICAgICAoMTw8NCkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjTWVtICAgICAgKDI8PDQpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNZW0xNiAgICAoMzw8NCkJLyogTWVtb3J5IG9wZXJhbmQgKDE2LWJpdCkuICovCi0jZGVmaW5lIFNyY01lbTMyICAgICg0PDw0KQkvKiBNZW1vcnkgb3BlcmFuZCAoMzItYml0KS4gKi8KLSNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDQpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NCkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjT25lICAgICAgKDc8PDQpCS8qIEltcGxpZWQgJzEnICovCi0jZGVmaW5lIFNyY0ltbVVCeXRlICg4PDw0KSAgICAgIC8qIDgtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNJbW1VICAgICAoOTw8NCkgICAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQgKi8KLSNkZWZpbmUgU3JjU0kgICAgICAgKDB4YTw8NCkJLyogU291cmNlIGlzIGluIHRoZSBEUzpSU0kgKi8KLSNkZWZpbmUgU3JjSW1tRkFkZHIgKDB4Yjw8NCkJLyogU291cmNlIGlzIGltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLwotI2RlZmluZSBTcmNNZW1GQWRkciAoMHhjPDw0KQkvKiBTb3VyY2UgaXMgZmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCi0jZGVmaW5lIFNyY0FjYyAgICAgICgweGQ8PDQpCS8qIFNvdXJjZSBBY2N1bXVsYXRvciAqLwotI2RlZmluZSBTcmNJbW1VMTYgICAoMHhlPDw0KSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQsIDE2IGJpdHMgKi8KLSNkZWZpbmUgU3JjTWFzayAgICAgKDB4Zjw8NCkKKyNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDUpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNSZWcgICAgICAoMTw8NSkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjTWVtICAgICAgKDI8PDUpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNNZW0xNiAgICAoMzw8NSkJLyogTWVtb3J5IG9wZXJhbmQgKDE2LWJpdCkuICovCisjZGVmaW5lIFNyY01lbTMyICAgICg0PDw1KQkvKiBNZW1vcnkgb3BlcmFuZCAoMzItYml0KS4gKi8KKyNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDUpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NSkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjT25lICAgICAgKDc8PDUpCS8qIEltcGxpZWQgJzEnICovCisjZGVmaW5lIFNyY0ltbVVCeXRlICg4PDw1KSAgICAgIC8qIDgtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbW1VICAgICAoOTw8NSkgICAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQgKi8KKyNkZWZpbmUgU3JjU0kgICAgICAgKDB4YTw8NSkJLyogU291cmNlIGlzIGluIHRoZSBEUzpSU0kgKi8KKyNkZWZpbmUgU3JjSW1tRkFkZHIgKDB4Yjw8NSkJLyogU291cmNlIGlzIGltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLworI2RlZmluZSBTcmNNZW1GQWRkciAoMHhjPDw1KQkvKiBTb3VyY2UgaXMgZmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCisjZGVmaW5lIFNyY0FjYyAgICAgICgweGQ8PDUpCS8qIFNvdXJjZSBBY2N1bXVsYXRvciAqLworI2RlZmluZSBTcmNJbW1VMTYgICAoMHhlPDw1KSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQsIDE2IGJpdHMgKi8KKyNkZWZpbmUgU3JjRFggICAgICAgKDB4Zjw8NSkJLyogU291cmNlIGlzIGluIERYIHJlZ2lzdGVyICovCisjZGVmaW5lIFNyY01hc2sgICAgICgweGY8PDUpCiAvKiBHZW5lcmljIE1vZFJNIGRlY29kZS4gKi8KLSNkZWZpbmUgTW9kUk0gICAgICAgKDE8PDgpCisjZGVmaW5lIE1vZFJNICAgICAgICgxPDw5KQogLyogRGVzdGluYXRpb24gaXMgb25seSB3cml0dGVuOyBuZXZlciByZWFkLiAqLwotI2RlZmluZSBNb3YgICAgICAgICAoMTw8OSkKLSNkZWZpbmUgQml0T3AgICAgICAgKDE8PDEwKQotI2RlZmluZSBNZW1BYnMgICAgICAoMTw8MTEpICAgICAgLyogTWVtb3J5IG9wZXJhbmQgaXMgYWJzb2x1dGUgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIFN0cmluZyAgICAgICgxPDwxMikgICAgIC8qIFN0cmluZyBpbnN0cnVjdGlvbiAocmVwIGNhcGFibGUpICovCi0jZGVmaW5lIFN0YWNrICAgICAgICgxPDwxMykgICAgIC8qIFN0YWNrIGluc3RydWN0aW9uIChwdXNoL3BvcCkgKi8KLSNkZWZpbmUgR3JvdXBNYXNrICAgKDc8PDE0KSAgICAgLyogT3Bjb2RlIHVzZXMgb25lIG9mIHRoZSBncm91cCBtZWNoYW5pc21zICovCi0jZGVmaW5lIEdyb3VwICAgICAgICgxPDwxNCkgICAgIC8qIEJpdHMgMzo1IG9mIG1vZHJtIGJ5dGUgZXh0ZW5kIG9wY29kZSAqLwotI2RlZmluZSBHcm91cER1YWwgICAoMjw8MTQpICAgICAvKiBBbHRlcm5hdGUgZGVjb2Rpbmcgb2YgbW9kID09IDMgKi8KLSNkZWZpbmUgUHJlZml4ICAgICAgKDM8PDE0KSAgICAgLyogSW5zdHJ1Y3Rpb24gdmFyaWVzIHdpdGggNjYvZjIvZjMgcHJlZml4ICovCi0jZGVmaW5lIFJNRXh0ICAgICAgICg0PDwxNCkgICAgIC8qIE9wY29kZSBleHRlbnNpb24gaW4gTW9kUk0gci9tIGlmIG1vZCA9PSAzICovCi0jZGVmaW5lIFNzZSAgICAgICAgICgxPDwxNykgICAgIC8qIFNTRSBWZWN0b3IgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTW92ICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBCaXRPcCAgICAgICAoMTw8MTEpCisjZGVmaW5lIE1lbUFicyAgICAgICgxPDwxMikgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEzKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KKyNkZWZpbmUgU3RhY2sgICAgICAgKDE8PDE0KSAgICAgLyogU3RhY2sgaW5zdHJ1Y3Rpb24gKHB1c2gvcG9wKSAqLworI2RlZmluZSBHcm91cE1hc2sgICAoNzw8MTUpICAgICAvKiBPcGNvZGUgdXNlcyBvbmUgb2YgdGhlIGdyb3VwIG1lY2hhbmlzbXMgKi8KKyNkZWZpbmUgR3JvdXAgICAgICAgKDE8PDE1KSAgICAgLyogQml0cyAzOjUgb2YgbW9kcm0gYnl0ZSBleHRlbmQgb3Bjb2RlICovCisjZGVmaW5lIEdyb3VwRHVhbCAgICgyPDwxNSkgICAgIC8qIEFsdGVybmF0ZSBkZWNvZGluZyBvZiBtb2QgPT0gMyAqLworI2RlZmluZSBQcmVmaXggICAgICAoMzw8MTUpICAgICAvKiBJbnN0cnVjdGlvbiB2YXJpZXMgd2l0aCA2Ni9mMi9mMyBwcmVmaXggKi8KKyNkZWZpbmUgUk1FeHQgICAgICAgKDQ8PDE1KSAgICAgLyogT3Bjb2RlIGV4dGVuc2lvbiBpbiBNb2RSTSByL20gaWYgbW9kID09IDMgKi8KKyNkZWZpbmUgU3NlICAgICAgICAgKDE8PDE4KSAgICAgLyogU1NFIFZlY3RvciBpbnN0cnVjdGlvbiAqLwogLyogTWlzYyBmbGFncyAqLwogI2RlZmluZSBQcm90ICAgICAgICAoMTw8MjEpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjVUQgaWYgbm90IGluIHByb3QtbW9kZSAqLwogI2RlZmluZSBWZW5kb3JTcGVjaWZpYyAoMTw8MjIpIC8qIFZlbmRvciBzcGVjaWZpYyBpbnN0cnVjdGlvbiAqLwpAQCAtMzE1NCw4ICszMTU2LDggQEAKIAlJKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgU3JjMkltbSwgZW1faW11bF8zb3ApLAogCUkoU3JjSW1tQnl0ZSB8IE1vdiB8IFN0YWNrLCBlbV9wdXNoKSwKIAlJKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgU3JjMkltbUJ5dGUsIGVtX2ltdWxfM29wKSwKLQlEMmJ2SVAoRHN0REkgfCBNb3YgfCBTdHJpbmcsIGlucywgY2hlY2tfcGVybV9pbiksIC8qIGluc2IsIGluc3cvaW5zZCAqLwotCUQyYnZJUChTcmNTSSB8IEltcGxpY2l0T3BzIHwgU3RyaW5nLCBvdXRzLCBjaGVja19wZXJtX291dCksIC8qIG91dHNiLCBvdXRzdy9vdXRzZCAqLworCUQyYnZJUChEc3RESSB8IFNyY0RYIHwgTW92IHwgU3RyaW5nLCBpbnMsIGNoZWNrX3Blcm1faW4pLCAvKiBpbnNiLCBpbnN3L2luc2QgKi8KKwlEMmJ2SVAoU3JjU0kgfCBEc3REWCB8IFN0cmluZywgb3V0cywgY2hlY2tfcGVybV9vdXQpLCAvKiBvdXRzYiwgb3V0c3cvb3V0c2QgKi8KIAkvKiAweDcwIC0gMHg3RiAqLwogCVgxNihEKFNyY0ltbUJ5dGUpKSwKIAkvKiAweDgwIC0gMHg4NyAqLwpAQCAtMzIxMiw4ICszMjE0LDggQEAKIAkvKiAweEU4IC0gMHhFRiAqLwogCUQoU3JjSW1tIHwgU3RhY2spLCBEKFNyY0ltbSB8IEltcGxpY2l0T3BzKSwKIAlEKFNyY0ltbUZBZGRyIHwgTm82NCksIEQoU3JjSW1tQnl0ZSB8IEltcGxpY2l0T3BzKSwKLQlEMmJ2SVAoU3JjTm9uZSB8IERzdEFjYywgICAgIGluLCAgY2hlY2tfcGVybV9pbiksCi0JRDJidklQKFNyY0FjYyB8IEltcGxpY2l0T3BzLCBvdXQsIGNoZWNrX3Blcm1fb3V0KSwKKwlEMmJ2SVAoU3JjRFggfCBEc3RBY2MsIGluLCAgY2hlY2tfcGVybV9pbiksCisJRDJidklQKFNyY0FjYyB8IERzdERYLCBvdXQsIGNoZWNrX3Blcm1fb3V0KSwKIAkvKiAweEYwIC0gMHhGNyAqLwogCU4sIERJKEltcGxpY2l0T3BzLCBpY2VicCksIE4sIE4sCiAJREkoSW1wbGljaXRPcHMgfCBQcml2LCBobHQpLCBEKEltcGxpY2l0T3BzKSwKQEAgLTMzNzAsNyArMzM3Miw3IEBACiAJaW50IGRlZl9vcF9ieXRlcywgZGVmX2FkX2J5dGVzLCBnb2Zmc2V0LCBzaW1kX3ByZWZpeDsKIAlib29sIG9wX3ByZWZpeCA9IGZhbHNlOwogCXN0cnVjdCBvcGNvZGUgb3Bjb2RlOwotCXN0cnVjdCBvcGVyYW5kIG1lbW9wID0geyAudHlwZSA9IE9QX05PTkUgfTsKKwlzdHJ1Y3Qgb3BlcmFuZCBtZW1vcCA9IHsgLnR5cGUgPSBPUF9OT05FIH0sICptZW1vcHAgPSBOVUxMOwogCiAJYy0+ZWlwID0gY3R4dC0+ZWlwOwogCWMtPmZldGNoLnN0YXJ0ID0gYy0+ZWlwOwpAQCAtMzU0NSw5ICszNTQ3LDYgQEAKIAlpZiAobWVtb3AudHlwZSA9PSBPUF9NRU0gJiYgYy0+YWRfYnl0ZXMgIT0gOCkKIAkJbWVtb3AuYWRkci5tZW0uZWEgPSAodTMyKW1lbW9wLmFkZHIubWVtLmVhOwogCi0JaWYgKG1lbW9wLnR5cGUgPT0gT1BfTUVNICYmIGMtPnJpcF9yZWxhdGl2ZSkKLQkJbWVtb3AuYWRkci5tZW0uZWEgKz0gYy0+ZWlwOwotCiAJLyoKIAkgKiBEZWNvZGUgYW5kIGZldGNoIHRoZSBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQogCSAqIG9yIGltbWVkaWF0ZS4KQEAgLTM1NjksNiArMzU2OCw3IEBACiAJCQkJCQkJICAgYy0+b3BfYnl0ZXM7CiAJc3JjbWVtX2NvbW1vbjoKIAkJYy0+c3JjID0gbWVtb3A7CisJCW1lbW9wcCA9ICZjLT5zcmM7CiAJCWJyZWFrOwogCWNhc2UgU3JjSW1tVTE2OgogCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmMtPnNyYywgMiwgZmFsc2UpOwpAQCAtMzYxMyw2ICszNjEzLDEyIEBACiAJCW1lbW9wLmJ5dGVzID0gYy0+b3BfYnl0ZXMgKyAyOwogCQlnb3RvIHNyY21lbV9jb21tb247CiAJCWJyZWFrOworCWNhc2UgU3JjRFg6CisJCWMtPnNyYy50eXBlID0gT1BfUkVHOworCQljLT5zcmMuYnl0ZXMgPSAyOworCQljLT5zcmMuYWRkci5yZWcgPSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwkJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZCgmYy0+c3JjKTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCkBAIC0zNjU5LDYgKzM2NjUsNyBAQAogCWNhc2UgRHN0TWVtOgogCWNhc2UgRHN0TWVtNjQ6CiAJCWMtPmRzdCA9IG1lbW9wOworCQltZW1vcHAgPSAmYy0+ZHN0OwogCQlpZiAoKGMtPmQgJiBEc3RNYXNrKSA9PSBEc3RNZW02NCkKIAkJCWMtPmRzdC5ieXRlcyA9IDg7CiAJCWVsc2UKQEAgLTM2ODIsMTQgKzM2ODksMjMgQEAKIAkJYy0+ZHN0LmFkZHIubWVtLnNlZyA9IFZDUFVfU1JFR19FUzsKIAkJYy0+ZHN0LnZhbCA9IDA7CiAJCWJyZWFrOworCWNhc2UgRHN0RFg6CisJCWMtPmRzdC50eXBlID0gT1BfUkVHOworCQljLT5kc3QuYnl0ZXMgPSAyOworCQljLT5kc3QuYWRkci5yZWcgPSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwkJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZCgmYy0+ZHN0KTsKKwkJYnJlYWs7CiAJY2FzZSBJbXBsaWNpdE9wczoKIAkJLyogU3BlY2lhbCBpbnN0cnVjdGlvbnMgZG8gdGhlaXIgb3duIG9wZXJhbmQgZGVjb2RpbmcuICovCiAJZGVmYXVsdDoKIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KLQkJcmV0dXJuIDA7CisJCWJyZWFrOwogCX0KIAogZG9uZToKKwlpZiAobWVtb3BwICYmIG1lbW9wcC0+dHlwZSA9PSBPUF9NRU0gJiYgYy0+cmlwX3JlbGF0aXZlKQorCQltZW1vcHAtPmFkZHIubWVtLmVhICs9IGMtPmVpcDsKKwogCXJldHVybiAocmMgPT0gWDg2RU1VTF9VTkhBTkRMRUFCTEUpID8gRU1VTEFUSU9OX0ZBSUxFRCA6IEVNVUxBVElPTl9PSzsKIH0KIApAQCAtNDAyNyw3ICs0MDQzLDYgQEAKIAkJYnJlYWs7CiAJY2FzZSAweGVjOiAvKiBpbiBhbCxkeCAqLwogCWNhc2UgMHhlZDogLyogaW4gKGUvcilheCxkeCAqLwotCQljLT5zcmMudmFsID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKIAlkb19pb19pbjoKIAkJaWYgKCFwaW9faW5fZW11bGF0ZWQoY3R4dCwgb3BzLCBjLT5kc3QuYnl0ZXMsIGMtPnNyYy52YWwsCiAJCQkJICAgICAmYy0+ZHN0LnZhbCkpCkBAIC00MDM1LDcgKzQwNTAsNiBAQAogCQlicmVhazsKIAljYXNlIDB4ZWU6IC8qIG91dCBkeCxhbCAqLwogCWNhc2UgMHhlZjogLyogb3V0IGR4LChlL3IpYXggKi8KLQkJYy0+ZHN0LnZhbCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CiAJZG9faW9fb3V0OgogCQlvcHMtPnBpb19vdXRfZW11bGF0ZWQoY3R4dCwgYy0+c3JjLmJ5dGVzLCBjLT5kc3QudmFsLAogCQkJCSAgICAgICZjLT5zcmMudmFsLCAxKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9tbXUuYyBiL2FyY2gveDg2L2t2bS9tbXUuYwppbmRleCBiZDE0YmI0Li5hZWUzODYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbW11LmMKKysrIGIvYXJjaC94ODYva3ZtL21tdS5jCkBAIC01NjUsNyArNTY1LDcgQEAKIAogc3RhdGljIGJvb2wgbWFwcGluZ19sZXZlbF9kaXJ0eV9iaXRtYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBsYXJnZV9nZm4pCiB7Ci0JcmV0dXJuIGdmbl90b19tZW1zbG90X2RpcnR5X2JpdG1hcCh2Y3B1LCBsYXJnZV9nZm4sIHRydWUpOworCXJldHVybiAhZ2ZuX3RvX21lbXNsb3RfZGlydHlfYml0bWFwKHZjcHUsIGxhcmdlX2dmbiwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgbWFwcGluZ19sZXZlbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGxhcmdlX2dmbikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggNmM0ZGMwMS4uOWQwM2FkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKKysrIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJCSAgICBndmFfdCBhZGRyLCB1MzIgYWNjZXNzKQogewogCXB0X2VsZW1lbnRfdCBwdGU7Ci0JcHRfZWxlbWVudF90IF9fdXNlciAqcHRlcF91c2VyOworCXB0X2VsZW1lbnRfdCBfX3VzZXIgKnVuaW5pdGlhbGl6ZWRfdmFyKHB0ZXBfdXNlcik7CiAJZ2ZuX3QgdGFibGVfZ2ZuOwogCXVuc2lnbmVkIGluZGV4LCBwdF9hY2Nlc3MsIHVuaW5pdGlhbGl6ZWRfdmFyKHB0ZV9hY2Nlc3MpOwogCWdwYV90IHB0ZV9ncGE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggNGMzZmEwZi4uZDQ4ZWM2MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtMjA0Nyw3ICsyMDQ3LDggQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBjcjAsCiAJCQkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl2bXhfZGVjYWNoZV9jcjModmNwdSk7CisJaWYgKCF0ZXN0X2JpdChWQ1BVX0VYUkVHX0NSMywgKHVsb25nICopJnZjcHUtPmFyY2gucmVnc19hdmFpbCkpCisJCXZteF9kZWNhY2hlX2NyMyh2Y3B1KTsKIAlpZiAoIShjcjAgJiBYODZfQ1IwX1BHKSkgewogCQkvKiBGcm9tIHBhZ2luZy9zdGFydGluZyB0byBub25wYWdpbmcgKi8KIAkJdm1jc193cml0ZTMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jIGIvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYwppbmRleCBlMTkxYzA5Li5kYjgzMmZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCisrKyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKQEAgLTk5Myw2ICs5OTMsNyBAQAogc3RhdGljIHZvaWQgbGd1ZXN0X3RpbWVfaW5pdCh2b2lkKQogewogCS8qIFNldCB1cCB0aGUgdGltZXIgaW50ZXJydXB0ICgwKSB0byBnbyB0byBvdXIgc2ltcGxlIHRpbWVyIHJvdXRpbmUgKi8KKwlsZ3Vlc3Rfc2V0dXBfaXJxKDApOwogCWlycV9zZXRfaGFuZGxlcigwLCBsZ3Vlc3RfdGltZV9pcnEpOwogCiAJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmxndWVzdF9jbG9jaywgTlNFQ19QRVJfU0VDKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfNjQuYyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwppbmRleCBkODY1YzRhLi5iYmFhYTAwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpAQCAtODk1LDggKzg5Niw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfWDg2X1VWCi0jZGVmaW5lIE1JTl9NRU1PUllfQkxPQ0tfU0laRSAgICgxIDw8IFNFQ1RJT05fU0laRV9CSVRTKQotCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKHZvaWQpCiB7CiAJaWYgKGlzX3V2X3N5c3RlbSgpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9tZW1ibG9jay5jIGIvYXJjaC94ODYvbW0vbWVtYmxvY2suYwppbmRleCBhYTExNjkzLi45OTJkYTVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tZW1ibG9jay5jCisrKyBiL2FyY2gveDg2L21tL21lbWJsb2NrLmMKQEAgLTgsNyArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZ2UuaD4KIAogLyogQ2hlY2sgZm9yIGFscmVhZHkgcmVzZXJ2ZWQgYXJlYXMgKi8KLXN0YXRpYyBib29sIF9faW5pdCBjaGVja193aXRoX21lbWJsb2NrX3Jlc2VydmVkX3NpemUodTY0ICphZGRycCwgdTY0ICpzaXplcCwgdTY0IGFsaWduKQorYm9vbCBfX2luaXQgbWVtYmxvY2tfeDg2X2NoZWNrX3Jlc2VydmVkX3NpemUodTY0ICphZGRycCwgdTY0ICpzaXplcCwgdTY0IGFsaWduKQogewogCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7CiAJdTY0IGFkZHIgPSAqYWRkcnAsIGxhc3Q7CkBAIC01OSw3ICs1OSw3IEBACiAJCWlmIChhZGRyID49IGVpX2xhc3QpCiAJCQljb250aW51ZTsKIAkJKnNpemVwID0gZWlfbGFzdCAtIGFkZHI7Ci0JCXdoaWxlIChjaGVja193aXRoX21lbWJsb2NrX3Jlc2VydmVkX3NpemUoJmFkZHIsIHNpemVwLCBhbGlnbikpCisJCXdoaWxlIChtZW1ibG9ja194ODZfY2hlY2tfcmVzZXJ2ZWRfc2l6ZSgmYWRkciwgc2l6ZXAsIGFsaWduKSkKIAkJCTsKIAogCQlpZiAoKnNpemVwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jIGIvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCmluZGV4IGNmOTc1MDAuLjY4ODk0ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYworKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKQEAgLTExMiw4ICsxMTIsMTAgQEAKIHN0YXRpYyBpbnQgbm1pX3N0YXJ0KHZvaWQpCiB7CiAJZ2V0X29ubGluZV9jcHVzKCk7Ci0Jb25fZWFjaF9jcHUobm1pX2NwdV9zdGFydCwgTlVMTCwgMSk7CiAJY3RyX3J1bm5pbmcgPSAxOworCS8qIG1ha2UgY3RyX3J1bm5pbmcgdmlzaWJsZSB0byB0aGUgbm1pIGhhbmRsZXI6ICovCisJc21wX21iKCk7CisJb25fZWFjaF9jcHUobm1pX2NwdV9zdGFydCwgTlVMTCwgMSk7CiAJcHV0X29ubGluZV9jcHVzKCk7CiAJcmV0dXJuIDA7CiB9CkBAIC01MDQsMTUgKzUwNiwxOCBAQAogCiAJbm1pX2VuYWJsZWQgPSAwOwogCWN0cl9ydW5uaW5nID0gMDsKLQliYXJyaWVyKCk7CisJLyogbWFrZSB2YXJpYWJsZXMgdmlzaWJsZSB0byB0aGUgbm1pIGhhbmRsZXI6ICovCisJc21wX21iKCk7CiAJZXJyID0gcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZwcm9maWxlX2V4Y2VwdGlvbnNfbmIpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDsKIAogCWdldF9vbmxpbmVfY3B1cygpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmb3Byb2ZpbGVfY3B1X25iKTsKLQlvbl9lYWNoX2NwdShubWlfY3B1X3NldHVwLCBOVUxMLCAxKTsKIAlubWlfZW5hYmxlZCA9IDE7CisJLyogbWFrZSBubWlfZW5hYmxlZCB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKKwlvbl9lYWNoX2NwdShubWlfY3B1X3NldHVwLCBOVUxMLCAxKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIAogCXJldHVybiAwOwpAQCAtNTMxLDcgKzUzNiw4IEBACiAJbm1pX2VuYWJsZWQgPSAwOwogCWN0cl9ydW5uaW5nID0gMDsKIAlwdXRfb25saW5lX2NwdXMoKTsKLQliYXJyaWVyKCk7CisJLyogbWFrZSB2YXJpYWJsZXMgdmlzaWJsZSB0byB0aGUgbm1pIGhhbmRsZXI6ICovCisJc21wX21iKCk7CiAJdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnByb2ZpbGVfZXhjZXB0aW9uc19uYik7CiAJbXNycyA9ICZnZXRfY3B1X3ZhcihjcHVfbXNycyk7CiAJbW9kZWwtPnNodXRkb3duKG1zcnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvb3BfbW9kZWxfYW1kLmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYwppbmRleCA5ZmQ4YTU2Li45Y2JiNzEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYworKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYwpAQCAtNjA5LDE2ICs2MDksMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoaXMgcnVucyBvbmx5IG9uIHRoZSBjdXJyZW50IGNwdS4gV2UgdHJ5IHRvIGZpbmQgYW4gTFZUIG9mZnNldCBhbmQKKyAqIHNldHVwIHRoZSBsb2NhbCBBUElDLiBGb3IgdGhpcyB3ZSBtdXN0IGRpc2FibGUgcHJlZW1wdGlvbi4gT24KKyAqIHN1Y2Nlc3Mgd2UgaW5pdGlhbGl6ZSBhbGwgbm9kZXMgd2l0aCB0aGlzIG9mZnNldC4gVGhpcyB1cGRhdGVzIHRoZW4KKyAqIHRoZSBvZmZzZXQgaW4gdGhlIElCU19DVEwgcGVyLW5vZGUgbXNyLiBUaGUgcGVyLWNvcmUgQVBJQyBzZXR1cCBvZgorICogdGhlIElCUyBpbnRlcnJ1cHQgdmVjdG9yIGlzIGNhbGxlZCBmcm9tIG9wX2FtZF9zZXR1cF9jdHJzKCkvb3BfLQorICogYW1kX2NwdV9zaHV0ZG93bigpIHVzaW5nIHRoZSBuZXcgb2Zmc2V0LgorICovCiBzdGF0aWMgaW50IGZvcmNlX2lic19laWx2dF9zZXR1cCh2b2lkKQogewogCWludCBvZmZzZXQ7CiAJaW50IHJldDsKIAotCS8qCi0JICogZmluZCB0aGUgbmV4dCBmcmVlIGF2YWlsYWJsZSBFSUxWVCBlbnRyeSwgc2tpcCBvZmZzZXQgMCwKLQkgKiBwaW4gc2VhcmNoIHRvIHRoaXMgY3B1Ci0JICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyogZmluZCB0aGUgbmV4dCBmcmVlIGF2YWlsYWJsZSBFSUxWVCBlbnRyeSwgc2tpcCBvZmZzZXQgMCAqLwogCWZvciAob2Zmc2V0ID0gMTsgb2Zmc2V0IDwgQVBJQ19FSUxWVF9OUl9NQVg7IG9mZnNldCsrKSB7CiAJCWlmIChnZXRfZWlsdnQob2Zmc2V0KSkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2FjcGkuYyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKaW5kZXggMDk3MjMxNS4uNjhjM2MxMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2FjcGkuYworKysgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCkBAIC0xODgsNyArMTg4LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIGNvYWxlc2NlX3dpbmRvd3Moc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sIGludCB0eXBlKQorc3RhdGljIHZvaWQgY29hbGVzY2Vfd2luZG93cyhzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyB0eXBlKQogewogCWludCBpLCBqOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzMSwgKnJlczI7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kveGVuLmMgYi9hcmNoL3g4Ni9wY2kveGVuLmMKaW5kZXggODIxNDcyNC4uZjU2Nzk2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3hlbi5jCisrKyBiL2FyY2gveDg2L3BjaS94ZW4uYwpAQCAtMzI3LDcgKzMyNyw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfWEVOX0RPTTAKLXN0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX3BpcnEodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcpCitzdGF0aWMgaW50IHhlbl9yZWdpc3Rlcl9waXJxKHUzMiBnc2ksIGludCBnc2lfb3ZlcnJpZGUsIGludCB0cmlnZ2VyaW5nKQogewogCWludCByYywgcGlycSwgaXJxID0gLTE7CiAJc3RydWN0IHBoeXNkZXZfbWFwX3BpcnEgbWFwX2lycTsKQEAgLTM0NCwxNiArMzQ0LDE4IEBACiAJCXNoYXJlYWJsZSA9IDE7CiAJCW5hbWUgPSAiaW9hcGljLWxldmVsIjsKIAl9Ci0KIAlwaXJxID0geGVuX2FsbG9jYXRlX3BpcnFfZ3NpKGdzaSk7CiAJaWYgKHBpcnEgPCAwKQogCQlnb3RvIG91dDsKIAotCWlycSA9IHhlbl9iaW5kX3BpcnFfZ3NpX3RvX2lycShnc2ksIHBpcnEsIHNoYXJlYWJsZSwgbmFtZSk7CisJaWYgKGdzaV9vdmVycmlkZSA+PSAwKQorCQlpcnEgPSB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEoZ3NpX292ZXJyaWRlLCBwaXJxLCBzaGFyZWFibGUsIG5hbWUpOworCWVsc2UKKwkJaXJxID0geGVuX2JpbmRfcGlycV9nc2lfdG9faXJxKGdzaSwgcGlycSwgc2hhcmVhYmxlLCBuYW1lKTsKIAlpZiAoaXJxIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAieGVuOiAtLT4gcGlycT0lZCAtPiBpcnE9JWRcbiIsIHBpcnEsIGlycSk7CisJcHJpbnRrKEtFUk5fREVCVUcgInhlbjogLS0+IHBpcnE9JWQgLT4gaXJxPSVkIChnc2k9JWQpXG4iLCBwaXJxLCBpcnEsIGdzaSk7CiAKIAltYXBfaXJxLmRvbWlkID0gRE9NSURfU0VMRjsKIAltYXBfaXJxLnR5cGUgPSBNQVBfUElSUV9UWVBFX0dTSTsKQEAgLTM3MCw3ICszNzIsNyBAQAogCXJldHVybiBpcnE7CiB9CiAKLXN0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQorc3RhdGljIGludCB4ZW5fcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBnc2lfb3ZlcnJpZGUsIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCiB7CiAJaW50IHJjLCBpcnE7CiAJc3RydWN0IHBoeXNkZXZfc2V0dXBfZ3NpIHNldHVwX2dzaTsKQEAgLTM4MSw3ICszODMsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICJ4ZW46IHJlZ2lzdGVyaW5nIGdzaSAldSB0cmlnZ2VyaW5nICVkIHBvbGFyaXR5ICVkXG4iLAogCQkJZ3NpLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CiAKLQlpcnEgPSB4ZW5fcmVnaXN0ZXJfcGlycShnc2ksIHRyaWdnZXJpbmcpOworCWlycSA9IHhlbl9yZWdpc3Rlcl9waXJxKGdzaSwgZ3NpX292ZXJyaWRlLCB0cmlnZ2VyaW5nKTsKIAogCXNldHVwX2dzaS5nc2kgPSBnc2k7CiAJc2V0dXBfZ3NpLnRyaWdnZXJpbmcgPSAodHJpZ2dlcmluZyA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gMCA6IDEpOwpAQCAtNDAzLDYgKzQwNSw4IEBACiAJaW50IHJjOwogCWludCB0cmlnZ2VyLCBwb2xhcml0eTsKIAlpbnQgZ3NpID0gYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpOworCWludCBpcnEgPSAtMTsKKwlpbnQgZ3NpX292ZXJyaWRlID0gLTE7CiAKIAlpZiAoIWdzaSkKIAkJcmV0dXJuOwpAQCAtNDE5LDcgKzQyMywyNSBAQAogCXByaW50ayhLRVJOX0lORk8gInhlbjogc2NpIG92ZXJyaWRlOiBnbG9iYWxfaXJxPSVkIHRyaWdnZXI9JWQgIgogCQkJInBvbGFyaXR5PSVkXG4iLCBnc2ksIHRyaWdnZXIsIHBvbGFyaXR5KTsKIAotCWdzaSA9IHhlbl9yZWdpc3Rlcl9nc2koZ3NpLCB0cmlnZ2VyLCBwb2xhcml0eSk7CisJLyogQmVmb3JlIHdlIGJpbmQgdGhlIEdTSSB0byBhIExpbnV4IElSUSwgY2hlY2sgd2hldGhlcgorCSAqIHdlIG5lZWQgdG8gb3ZlcnJpZGUgaXQgd2l0aCBidXNfaXJxIChJUlEpIHZhbHVlLiBVc3VhbGx5IGZvcgorCSAqIElSUXMgYmVsb3cgSVJRX0xFR0FDWV9JUlEgdGhpcyBob2xkcyBJUlEgPT0gR1NJLCBhcyBzbzoKKwkgKiAgQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgOSBnbG9iYWxfaXJxIDkgbG93IGxldmVsKQorCSAqIGJ1dCB0aGVyZSBhcmUgb2RkYmFsbHMgd2hlcmUgdGhlIElSUSAhPSBHU0k6CisJICogIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSAyMCBsb3cgbGV2ZWwpCisJICogd2hpY2ggZW5kcyB1cCBiZWluZzogZ3NpX3RvX2lycVs5XSA9PSAyMAorCSAqICh3aGljaCBpcyB3aGF0IGFjcGlfZ3NpX3RvX2lycSBlbmRzIHVwIGNhbGxpbmcgd2hlbiBzdGFydGluZyB0aGUKKwkgKiB0aGUgQUNQSSBpbnRlcnByZXRlciBhbmQga2VlbHMgb3ZlciBzaW5jZSBJUlEgOSBoYXMgbm90IGJlZW4KKwkgKiBzZXR1cCBhcyB3ZSBoYWQgc2V0dXAgSVJRIDIwIGZvciBpdCkuCisJICovCisJLyogQ2hlY2sgd2hldGhlciB0aGUgR1NJICE9IElSUSAqLworCWlmIChhY3BpX2dzaV90b19pcnEoZ3NpLCAmaXJxKSA9PSAwKSB7CisJCWlmIChpcnEgPj0gMCAmJiBpcnEgIT0gZ3NpKQorCQkJLyogQnVnZ2VyLCB3ZSBNVVNUIGhhdmUgdGhhdCBJUlEuICovCisJCQlnc2lfb3ZlcnJpZGUgPSBpcnE7CisJfQorCisJZ3NpID0geGVuX3JlZ2lzdGVyX2dzaShnc2ksIGdzaV9vdmVycmlkZSwgdHJpZ2dlciwgcG9sYXJpdHkpOwogCXByaW50ayhLRVJOX0lORk8gInhlbjogYWNwaSBzY2kgJWRcbiIsIGdzaSk7CiAKIAlyZXR1cm47CkBAIC00MjgsNyArNDUwLDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9yZWdpc3Rlcl9nc2lfeGVuKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwKIAkJCQkgaW50IHRyaWdnZXIsIGludCBwb2xhcml0eSkKIHsKLQlyZXR1cm4geGVuX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXIsIHBvbGFyaXR5KTsKKwlyZXR1cm4geGVuX3JlZ2lzdGVyX2dzaShnc2ksIC0xIC8qIG5vIEdTSSBvdmVycmlkZSAqLywgdHJpZ2dlciwgcG9sYXJpdHkpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwY2lfeGVuX2luaXRpYWxfZG9tYWluKHZvaWQpCkBAIC00NjcsNyArNDg5LDcgQEAKIAkJaWYgKGFjcGlfZ2V0X292ZXJyaWRlX2lycShpcnEsICZ0cmlnZ2VyLCAmcG9sYXJpdHkpID09IC0xKQogCQkJY29udGludWU7CiAKLQkJeGVuX3JlZ2lzdGVyX3BpcnEoaXJxLAorCQl4ZW5fcmVnaXN0ZXJfcGlycShpcnEsIC0xIC8qIG5vIEdTSSBvdmVycmlkZSAqLywKIAkJCXRyaWdnZXIgPyBBQ1BJX0xFVkVMX1NFTlNJVElWRSA6IEFDUElfRURHRV9TRU5TSVRJVkUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAwZDNhNGZhLi44OTllMzkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC0zMTAsMTQgKzMxMCwzMSBAQAogCiAJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKIAkJZWZpX21lbW9yeV9kZXNjX3QgKm1kID0gcDsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSBtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUOworCQl1NjQgc3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQl1NjQgc2l6ZSA9IG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQ7CiAKIAkJaWYgKG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgJiYKIAkJICAgIG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0RBVEEpCiAJCQljb250aW51ZTsKLQotCQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShzdGFydCwgc3RhcnQgKyBzaXplLCAiRUZJIEJvb3QiKTsKKwkJLyogT25seSByZXNlcnZlIHdoZXJlIHBvc3NpYmxlOgorCQkgKiAtIE5vdCB3aXRoaW4gYW55IGFscmVhZHkgYWxsb2NhdGVkIGFyZWFzCisJCSAqIC0gTm90IG92ZXIgYW55IG1lbW9yeSBhcmVhIChyZWFsbHkgbmVlZGVkLCBpZiBhYm92ZT8pCisJCSAqIC0gTm90IHdpdGhpbiBhbnkgcGFydCBvZiB0aGUga2VybmVsCisJCSAqIC0gTm90IHRoZSBiaW9zIHJlc2VydmVkIGFyZWEKKwkJKi8KKwkJaWYgKChzdGFydCtzaXplID49IHZpcnRfdG9fcGh5cyhfdGV4dCkKKwkJCQkmJiBzdGFydCA8PSB2aXJ0X3RvX3BoeXMoX2VuZCkpIHx8CisJCQkhZTgyMF9hbGxfbWFwcGVkKHN0YXJ0LCBzdGFydCtzaXplLCBFODIwX1JBTSkgfHwKKwkJCW1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKCZzdGFydCwgJnNpemUsCisJCQkJCQkJMTw8RUZJX1BBR0VfU0hJRlQpKSB7CisJCQkvKiBDb3VsZCBub3QgcmVzZXJ2ZSwgc2tpcCBpdCAqLworCQkJbWQtPm51bV9wYWdlcyA9IDA7CisJCQltZW1ibG9ja19kYmcoUEZYICJDb3VsZCBub3QgcmVzZXJ2ZSBib290IHJhbmdlICIKKwkJCQkJIlsweCUwMTBsbHgtMHglMDEwbGx4XVxuIiwKKwkJCQkJCXN0YXJ0LCBzdGFydCtzaXplLTEpOworCQl9IGVsc2UKKwkJCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHN0YXJ0LCBzdGFydCtzaXplLAorCQkJCQkJCSJFRkkgQm9vdCIpOwogCX0KIH0KIApAQCAtMzM0LDYgKzM1MSwxMCBAQAogCQkgICAgbWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkKIAkJCWNvbnRpbnVlOwogCisJCS8qIENvdWxkIG5vdCByZXNlcnZlIGJvb3QgYXJlYSAqLworCQlpZiAoIXNpemUpCisJCQljb250aW51ZTsKKwogCQlmcmVlX2Jvb3RtZW1fbGF0ZShzdGFydCwgc2l6ZSk7CiAJfQogfQpAQCAtNDgzLDkgKzUwNCw2IEBACiAJeDg2X3BsYXRmb3JtLnNldF93YWxsY2xvY2sgPSBlZmlfc2V0X3J0Y19tbXNzOwogI2VuZGlmCiAKLQkvKiBTZXR1cCBmb3IgRUZJIHJ1bnRpbWUgc2VydmljZSAqLwotCXJlYm9vdF90eXBlID0gQk9PVF9FRkk7Ci0KICNpZiBFRklfREVCVUcKIAlwcmludF9lZmlfbWVtbWFwKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCBkZDdiODhmLi41NTI1MTYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMDMzLDYgKzEwMzMsMTMgQEAKIAl4ZW5fcmVib290KFNIVVRET1dOX3Bvd2Vyb2ZmKTsKIH0KIAorc3RhdGljIHZvaWQgeGVuX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJaWYgKHBtX3Bvd2VyX29mZikKKwkJcG1fcG93ZXJfb2ZmKCk7CisJeGVuX3JlYm9vdChTSFVURE9XTl9wb3dlcm9mZik7Cit9CisKIHN0YXRpYyB2b2lkIHhlbl9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl4ZW5fcmVib290KFNIVVRET1dOX2NyYXNoKTsKQEAgLTEwNTgsNyArMTA2NSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hpbmVfb3BzIHhlbl9tYWNoaW5lX29wcyBfX2luaXRjb25zdCA9IHsKIAkucmVzdGFydCA9IHhlbl9yZXN0YXJ0LAogCS5oYWx0ID0geGVuX21hY2hpbmVfaGFsdCwKLQkucG93ZXJfb2ZmID0geGVuX21hY2hpbmVfaGFsdCwKKwkucG93ZXJfb2ZmID0geGVuX21hY2hpbmVfcG93ZXJfb2ZmLAogCS5zaHV0ZG93biA9IHhlbl9tYWNoaW5lX2hhbHQsCiAJLmNyYXNoX3NodXRkb3duID0geGVuX2NyYXNoX3NodXRkb3duLAogCS5lbWVyZ2VuY3lfcmVzdGFydCA9IHhlbl9lbWVyZ2VuY3lfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRleCBkYzcwOGRjLi4wY2NjY2I2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIvYXJjaC94ODYveGVuL21tdS5jCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9wYXQuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CiAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgpAQCAtMTIzMSw3ICsxMjMyLDExIEBACiB7CiAJc3RydWN0IHsKIAkJc3RydWN0IG1tdWV4dF9vcCBvcDsKKyNpZmRlZiBDT05GSUdfU01QCisJCURFQ0xBUkVfQklUTUFQKG1hc2ssIG51bV9wcm9jZXNzb3JzKTsKKyNlbHNlCiAJCURFQ0xBUkVfQklUTUFQKG1hc2ssIE5SX0NQVVMpOworI2VuZGlmCiAJfSAqYXJnczsKIAlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKIApAQCAtMTU5OSw2ICsxNjA0LDExIEBACiAJCWZvciAocHRlaWR4ID0gMDsgcHRlaWR4IDwgUFRSU19QRVJfUFRFOyBwdGVpZHgrKywgcGZuKyspIHsKIAkJCXB0ZV90IHB0ZTsKIAorI2lmZGVmIENPTkZJR19YODZfMzIKKwkJCWlmIChwZm4gPiBtYXhfcGZuX21hcHBlZCkKKwkJCQltYXhfcGZuX21hcHBlZCA9IHBmbjsKKyNlbmRpZgorCiAJCQlpZiAoIXB0ZV9ub25lKHB0ZV9wYWdlW3B0ZWlkeF0pKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xNzY2LDcgKzE3NzYsOSBAQAogCWluaXRpYWxfa2VybmVsX3BtZCA9CiAJCWV4dGVuZF9icmsoc2l6ZW9mKHBtZF90KSAqIFBUUlNfUEVSX1BNRCwgUEFHRV9TSVpFKTsKIAotCW1heF9wZm5fbWFwcGVkID0gUEZOX0RPV04oX19wYSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpKTsKKwltYXhfcGZuX21hcHBlZCA9IFBGTl9ET1dOKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpICsKKwkJCQkgIHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXMgKiBQQUdFX1NJWkUgKworCQkJCSAgNTEyKjEwMjQpOwogCiAJa2VybmVsX3BtZCA9IG0ydihwZ2RbS0VSTkVMX1BHRF9CT1VOREFSWV0ucGdkKTsKIAltZW1jcHkoaW5pdGlhbF9rZXJuZWxfcG1kLCBrZXJuZWxfcG1kLCBzaXplb2YocG1kX3QpICogUFRSU19QRVJfUE1EKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMgYi9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5jCmluZGV4IDhiZmY3ZTcuLjFiMmI3M2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMKKysrIGIvYXJjaC94ODYveGVuL211bHRpY2FsbHMuYwpAQCAtMTg5LDEwICsxODksMTAgQEAKIAl1bnNpZ25lZCBhcmdpZHggPSByb3VuZHVwKGItPmFyZ2lkeCwgc2l6ZW9mKHU2NCkpOwogCiAJQlVHX09OKHByZWVtcHRpYmxlKCkpOwotCUJVR19PTihiLT5hcmdpZHggPiBNQ19BUkdTKTsKKwlCVUdfT04oYi0+YXJnaWR4ID49IE1DX0FSR1MpOwogCiAJaWYgKGItPm1jaWR4ID09IE1DX0JBVENIIHx8Ci0JICAgIChhcmdpZHggKyBhcmdzKSA+IE1DX0FSR1MpIHsKKwkgICAgKGFyZ2lkeCArIGFyZ3MpID49IE1DX0FSR1MpIHsKIAkJbWNfc3RhdHNfZmx1c2goYi0+bWNpZHggPT0gTUNfQkFUQ0ggPyBGTF9TTE9UUyA6IEZMX0FSR1MpOwogCQl4ZW5fbWNfZmx1c2goKTsKIAkJYXJnaWR4ID0gcm91bmR1cChiLT5hcmdpZHgsIHNpemVvZih1NjQpKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCXJldC5hcmdzID0gJmItPmFyZ3NbYXJnaWR4XTsKIAliLT5hcmdpZHggPSBhcmdpZHggKyBhcmdzOwogCi0JQlVHX09OKGItPmFyZ2lkeCA+IE1DX0FSR1MpOworCUJVR19PTihiLT5hcmdpZHggPj0gTUNfQVJHUyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjE2LDcgKzIxNiw3IEBACiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSByZXQgPSB7IE5VTEwsIE5VTEwgfTsKIAogCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKLQlCVUdfT04oYi0+YXJnaWR4ID4gTUNfQVJHUyk7CisJQlVHX09OKGItPmFyZ2lkeCA+PSBNQ19BUkdTKTsKIAogCWlmIChiLT5tY2lkeCA9PSAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMjI0LDE0ICsyMjQsMTQgQEAKIAlpZiAoYi0+ZW50cmllc1tiLT5tY2lkeCAtIDFdLm9wICE9IG9wKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChiLT5hcmdpZHggKyBzaXplKSA+IE1DX0FSR1MpCisJaWYgKChiLT5hcmdpZHggKyBzaXplKSA+PSBNQ19BUkdTKQogCQlyZXR1cm4gcmV0OwogCiAJcmV0Lm1jID0gJmItPmVudHJpZXNbYi0+bWNpZHggLSAxXTsKIAlyZXQuYXJncyA9ICZiLT5hcmdzW2ItPmFyZ2lkeF07CiAJYi0+YXJnaWR4ICs9IHNpemU7CiAKLQlCVUdfT04oYi0+YXJnaWR4ID4gTUNfQVJHUyk7CisJQlVHX09OKGItPmFyZ2lkeCA+PSBNQ19BUkdTKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IGJlMWE0NjQuLjYwYWVlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC0yMjcsMTEgKzIyNyw3IEBACiAKIAltZW1jcHkobWFwX3JhdywgbWFwLCBzaXplb2YobWFwKSk7CiAJZTgyMC5ucl9tYXAgPSAwOwotI2lmZGVmIENPTkZJR19YODZfMzIKIAl4ZW5fZXh0cmFfbWVtX3N0YXJ0ID0gbWVtX2VuZDsKLSNlbHNlCi0JeGVuX2V4dHJhX21lbV9zdGFydCA9IG1heCgoMVVMTCA8PCAzMiksIG1lbV9lbmQpOwotI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9lbnRyaWVzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIGVuZDsKIApAQCAtMjY2LDYgKzI2MiwxMiBAQAogCQlpZiAobWFwW2ldLnNpemUgPiAwKQogCQkJZTgyMF9hZGRfcmVnaW9uKG1hcFtpXS5hZGRyLCBtYXBbaV0uc2l6ZSwgbWFwW2ldLnR5cGUpOwogCX0KKwkvKiBBbGlnbiB0aGUgYmFsbG9vbiBhcmVhIHNvIHRoYXQgbWF4X2xvd19wZm4gZG9lcyBub3QgZ2V0IHNldAorCSAqIHRvIGJlIGF0IHRoZSBfZW5kXyBvZiB0aGUgUENJIGdhcCBhdCB0aGUgZmFyIGVuZCAoZmVlMDEwMDApLgorCSAqIE5vdGUgdGhhdCB4ZW5fZXh0cmFfbWVtX3N0YXJ0IGdldHMgc2V0IGluIHRoZSBsb29wIGFib3ZlIHRvIGJlCisJICogcGFzdCB0aGUgbGFzdCBFODIwIHJlZ2lvbi4gKi8KKwlpZiAoeGVuX2luaXRpYWxfZG9tYWluKCkgJiYgKHhlbl9leHRyYV9tZW1fc3RhcnQgPCAoMVVMTDw8MzIpKSkKKwkJeGVuX2V4dHJhX21lbV9zdGFydCA9ICgxVUxMPDwzMik7CiAKIAkvKgogCSAqIEluIGRvbVUsIHRoZSBJU0EgcmVnaW9uIGlzIG5vcm1hbCwgdXNhYmxlIG1lbW9yeSwgYnV0IHdlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc21wLmMgYi9hcmNoL3g4Ni94ZW4vc21wLmMKaW5kZXggNDEwMzhjMC4uYjQ1MzNhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NtcC5jCisrKyBiL2FyY2gveDg2L3hlbi9zbXAuYwpAQCAtMjA1LDExICsyMDUsMTggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CiAJdW5zaWduZWQgY3B1OworCXVuc2lnbmVkIGludCBpOwogCiAJeGVuX2luaXRfbG9ja19jcHUoMCk7CiAKIAlzbXBfc3RvcmVfY3B1X2luZm8oMCk7CiAJY3B1X2RhdGEoMCkueDg2X21heF9jb3JlcyA9IDE7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CisJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfY29yZV9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKKwkJemFsbG9jX2NwdW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9sbGNfc2hhcmVkX21hcCwgaSksIEdGUF9LRVJORUwpOworCX0KIAlzZXRfY3B1X3NpYmxpbmdfbWFwKDApOwogCiAJaWYgKHhlbl9zbXBfaW50cl9pbml0KDApKQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvYy5jIGIvYmxvY2svYmxrLWlvYy5jCmluZGV4IGM4OTgwNDkuLjM0MmVhZTkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1pb2MuYworKysgYi9ibG9jay9ibGstaW9jLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAlpZiAoIWhsaXN0X2VtcHR5KCZpb2MtPmNpY19saXN0KSkgewogCQlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAotCQljaWMgPSBsaXN0X2VudHJ5KGlvYy0+Y2ljX2xpc3QuZmlyc3QsIHN0cnVjdCBjZnFfaW9fY29udGV4dCwKKwkJY2ljID0gaGxpc3RfZW50cnkoaW9jLT5jaWNfbGlzdC5maXJzdCwgc3RydWN0IGNmcV9pb19jb250ZXh0LAogCQkJCQkJCQljaWNfbGlzdCk7CiAJCWNpYy0+ZHRvcihpb2MpOwogCX0KQEAgLTU3LDcgKzU3LDcgQEAKIAlpZiAoIWhsaXN0X2VtcHR5KCZpb2MtPmNpY19saXN0KSkgewogCQlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAotCQljaWMgPSBsaXN0X2VudHJ5KGlvYy0+Y2ljX2xpc3QuZmlyc3QsIHN0cnVjdCBjZnFfaW9fY29udGV4dCwKKwkJY2ljID0gaGxpc3RfZW50cnkoaW9jLT5jaWNfbGlzdC5maXJzdCwgc3RydWN0IGNmcV9pb19jb250ZXh0LAogCQkJCQkJCQljaWNfbGlzdCk7CiAJCWNpYy0+ZXhpdChpb2MpOwogCX0KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10aHJvdHRsZS5jIGIvYmxvY2svYmxrLXRocm90dGxlLmMKaW5kZXggYTYyYmU4ZC4uMzY4OWY4MyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXRocm90dGxlLmMKKysrIGIvYmxvY2svYmxrLXRocm90dGxlLmMKQEAgLTkyNyw3ICs5MjcsNyBAQAogCiAJYmlvX2xpc3RfaW5pdCgmYmlvX2xpc3Rfb25fc3RhY2spOwogCi0JdGhyb3RsX2xvZyh0ZCwgImRpc3BhdGNoIG5yX3F1ZXVlZD0lbHUgcmVhZD0ldSB3cml0ZT0ldSIsCisJdGhyb3RsX2xvZyh0ZCwgImRpc3BhdGNoIG5yX3F1ZXVlZD0lZCByZWFkPSV1IHdyaXRlPSV1IiwKIAkJCXRvdGFsX25yX3F1ZXVlZCh0ZCksIHRkLT5ucl9xdWV1ZWRbUkVBRF0sCiAJCQl0ZC0+bnJfcXVldWVkW1dSSVRFXSk7CiAKQEAgLTEyMDQsNyArMTIwNCw3IEBACiAJfQogCiBxdWV1ZV9iaW86Ci0JdGhyb3RsX2xvZ190Zyh0ZCwgdGcsICJbJWNdIGJpby4gYmRpc3A9JXUgc3o9JXUgYnBzPSVsbHUiCisJdGhyb3RsX2xvZ190Zyh0ZCwgdGcsICJbJWNdIGJpby4gYmRpc3A9JWxsdSBzej0ldSBicHM9JWxsdSIKIAkJCSIgaW9kaXNwPSV1IGlvcHM9JXUgcXVldWVkPSVkLyVkIiwKIAkJCXJ3ID09IFJFQUQgPyAnUicgOiAnVycsCiAJCQl0Zy0+Ynl0ZXNfZGlzcFtyd10sIGJpby0+Ymlfc2l6ZSwgdGctPmJwc1tyd10sCmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCA3YzUyZDY4Li5hZTIxOTE5IDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTE4NSw3ICsxODUsNyBAQAogCWludCBucl9jZnFxOwogCiAJLyoKLQkgKiBQZXIgZ3JvdXAgYnVzeSBxdWV1cyBhdmVyYWdlLiBVc2VmdWwgZm9yIHdvcmtsb2FkIHNsaWNlIGNhbGMuIFdlCisJICogUGVyIGdyb3VwIGJ1c3kgcXVldWVzIGF2ZXJhZ2UuIFVzZWZ1bCBmb3Igd29ya2xvYWQgc2xpY2UgY2FsYy4gV2UKIAkgKiBjcmVhdGUgdGhlIGFycmF5IGZvciBlYWNoIHByaW8gY2xhc3MgYnV0IGF0IHJ1biB0aW1lIGl0IGlzIHVzZWQKIAkgKiBvbmx5IGZvciBSVCBhbmQgQkUgY2xhc3MgYW5kIHNsb3QgZm9yIElETEUgY2xhc3MgcmVtYWlucyB1bnVzZWQuCiAJICogVGhpcyBpcyBwcmltYXJpbHkgZG9uZSB0byBhdm9pZCBjb25mdXNpb24gYW5kIGEgZ2NjIHdhcm5pbmcuCkBAIC0zNjksMTYgKzM2OSwxNiBAQAogI2RlZmluZSBjZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgZm10LCBhcmdzLi4uKQlcCiAJYmxrX2FkZF90cmFjZV9tc2coKGNmcWQpLT5xdWV1ZSwgImNmcSVkJWMgJXMgIiBmbXQsIChjZnFxKS0+cGlkLCBcCiAJCQljZnFfY2ZxcV9zeW5jKChjZnFxKSkgPyAnUycgOiAnQScsIFwKLQkJCWJsa2dfcGF0aCgmKGNmcXEpLT5jZnFnLT5ibGtnKSwgIyNhcmdzKTsKKwkJCWJsa2dfcGF0aCgmKGNmcXEpLT5jZnFnLT5ibGtnKSwgIyNhcmdzKQogCiAjZGVmaW5lIGNmcV9sb2dfY2ZxZyhjZnFkLCBjZnFnLCBmbXQsIGFyZ3MuLi4pCQkJCVwKIAlibGtfYWRkX3RyYWNlX21zZygoY2ZxZCktPnF1ZXVlLCAiJXMgIiBmbXQsCQkJXAotCQkJCWJsa2dfcGF0aCgmKGNmcWcpLT5ibGtnKSwgIyNhcmdzKTsgICAgICBcCisJCQkJYmxrZ19wYXRoKCYoY2ZxZyktPmJsa2cpLCAjI2FyZ3MpICAgICAgIFwKIAogI2Vsc2UKICNkZWZpbmUgY2ZxX2xvZ19jZnFxKGNmcWQsIGNmcXEsIGZtdCwgYXJncy4uLikJXAogCWJsa19hZGRfdHJhY2VfbXNnKChjZnFkKS0+cXVldWUsICJjZnElZCAiIGZtdCwgKGNmcXEpLT5waWQsICMjYXJncykKLSNkZWZpbmUgY2ZxX2xvZ19jZnFnKGNmcWQsIGNmcWcsIGZtdCwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKTsKKyNkZWZpbmUgY2ZxX2xvZ19jZnFnKGNmcWQsIGNmcWcsIGZtdCwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAjZGVmaW5lIGNmcV9sb2coY2ZxZCwgZm10LCBhcmdzLi4uKQlcCiAJYmxrX2FkZF90cmFjZV9tc2coKGNmcWQpLT5xdWV1ZSwgImNmcSAiIGZtdCwgIyNhcmdzKQpAQCAtOTg4LDkgKzk4OCwxMCBAQAogCiAJY2ZxX2xvZ19jZnFnKGNmcWQsIGNmcWcsICJzZXJ2ZWQ6IHZ0PSVsbHUgbWluX3Z0PSVsbHUiLCBjZnFnLT52ZGlza3RpbWUsCiAJCQkJCXN0LT5taW5fdmRpc2t0aW1lKTsKLQljZnFfbG9nX2NmcXEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgInNsX3VzZWQ9JXUgZGlzcD0ldSBjaGFyZ2U9JXUgaW9wcz0ldSIKLQkJCSIgc2VjdD0ldSIsIHVzZWRfc2wsIGNmcXEtPnNsaWNlX2Rpc3BhdGNoLCBjaGFyZ2UsCi0JCQlpb3BzX21vZGUoY2ZxZCksIGNmcXEtPm5yX3NlY3RvcnMpOworCWNmcV9sb2dfY2ZxcShjZnFxLT5jZnFkLCBjZnFxLAorCQkgICAgICJzbF91c2VkPSV1IGRpc3A9JXUgY2hhcmdlPSV1IGlvcHM9JXUgc2VjdD0lbHUiLAorCQkgICAgIHVzZWRfc2wsIGNmcXEtPnNsaWNlX2Rpc3BhdGNoLCBjaGFyZ2UsCisJCSAgICAgaW9wc19tb2RlKGNmcWQpLCBjZnFxLT5ucl9zZWN0b3JzKTsKIAljZnFfYmxraW9jZ191cGRhdGVfdGltZXNsaWNlX3VzZWQoJmNmcWctPmJsa2csIHVzZWRfc2wsCiAJCQkJCSAgdW5hY2NvdW50ZWRfc2wpOwogCWNmcV9ibGtpb2NnX3NldF9zdGFydF9lbXB0eV90aW1lKCZjZnFnLT5ibGtnKTsKQEAgLTIwMjMsOCArMjAyNCw4IEBACiAJICovCiAJaWYgKHNhbXBsZV92YWxpZChjaWMtPnR0aW1lX3NhbXBsZXMpICYmCiAJICAgIChjZnFxLT5zbGljZV9lbmQgLSBqaWZmaWVzIDwgY2ljLT50dGltZV9tZWFuKSkgewotCQljZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgIk5vdCBpZGxpbmcuIHRoaW5rX3RpbWU6JWQiLAotCQkJCWNpYy0+dHRpbWVfbWVhbik7CisJCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiTm90IGlkbGluZy4gdGhpbmtfdGltZTolbHUiLAorCQkJICAgICBjaWMtPnR0aW1lX21lYW4pOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNzcyLDggKzI3NzMsMTQgQEAKIAlzbXBfd21iKCk7CiAJY2ljLT5rZXkgPSBjZnFkX2RlYWRfa2V5KGNmcWQpOwogCi0JaWYgKGlvYy0+aW9jX2RhdGEgPT0gY2ljKQorCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAocmN1X2RlcmVmZXJlbmNlKGlvYy0+aW9jX2RhdGEpID09IGNpYykgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc3Bpbl9sb2NrKCZpb2MtPmxvY2spOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jLT5pb2NfZGF0YSwgTlVMTCk7CisJCXNwaW5fdW5sb2NrKCZpb2MtPmxvY2spOworCX0gZWxzZQorCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChjaWMtPmNmcXFbQkxLX1JXX0FTWU5DXSkgewogCQljZnFfZXhpdF9jZnFxKGNmcWQsIGNpYy0+Y2ZxcVtCTEtfUldfQVNZTkNdKTsKQEAgLTMwODAsNyArMzA4Nyw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5sb2NrLCBmbGFncyk7CiAKLQlCVUdfT04oaW9jLT5pb2NfZGF0YSA9PSBjaWMpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2VfY2hlY2soaW9jLT5pb2NfZGF0YSwKKwkJbG9ja2RlcF9pc19oZWxkKCZpb2MtPmxvY2spKSA9PSBjaWMpOwogCiAJcmFkaXhfdHJlZV9kZWxldGUoJmlvYy0+cmFkaXhfcm9vdCwgY2ZxZC0+Y2ljX2luZGV4KTsKIAlobGlzdF9kZWxfcmN1KCZjaWMtPmNpY19saXN0KTsKQEAgLTM3ODYsOSArMzc5NCw2IEBACiAJcmV0dXJuIDA7CiAKIHF1ZXVlX2ZhaWw6Ci0JaWYgKGNpYykKLQkJcHV0X2lvX2NvbnRleHQoY2ljLT5pb2MpOwotCiAJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCWNmcV9sb2coY2ZxZCwgInNldF9yZXF1ZXN0IGZhaWwiKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IDk1ODIyYWUuLjM2MDgyODkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMTM3MSw2ICsxMzcxLDcgQEAKIAlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CQkvKiB0aGUgYXNzb2NpYXRlZCBkaXNrICovCiAJc3BpbmxvY2tfdAkJbG9jazsKIAorCXN0cnVjdCBtdXRleAkJYmxvY2tfbXV0ZXg7CS8qIHByb3RlY3RzIGJsb2NraW5nICovCiAJaW50CQkJYmxvY2s7CQkvKiBldmVudCBibG9ja2luZyBkZXB0aCAqLwogCXVuc2lnbmVkIGludAkJcGVuZGluZzsJLyogZXZlbnRzIGFscmVhZHkgc2VudCBvdXQgKi8KIAl1bnNpZ25lZCBpbnQJCWNsZWFyaW5nOwkvKiBldmVudHMgYmVpbmcgY2xlYXJlZCAqLwpAQCAtMTQxNCwyMiArMTQxNSw0NCBAQAogCXJldHVybiBtc2Vjc190b19qaWZmaWVzKGludHZfbXNlY3MpOwogfQogCi1zdGF0aWMgdm9pZCBfX2Rpc2tfYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBib29sIHN5bmMpCisvKioKKyAqIGRpc2tfYmxvY2tfZXZlbnRzIC0gYmxvY2sgYW5kIGZsdXNoIGRpc2sgZXZlbnQgY2hlY2tpbmcKKyAqIEBkaXNrOiBkaXNrIHRvIGJsb2NrIGV2ZW50cyBmb3IKKyAqCisgKiBPbiByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgZXZlbnQgY2hlY2tpbmcKKyAqIGlzbid0IGluIHByb2dyZXNzIGFuZCB3b24ndCBoYXBwZW4gdW50aWwgdW5ibG9ja2VkIGJ5CisgKiBkaXNrX3VuYmxvY2tfZXZlbnRzKCkuICBFdmVudHMgYmxvY2tpbmcgaXMgY291bnRlZCBhbmQgdGhlIGFjdHVhbAorICogdW5ibG9ja2luZyBoYXBwZW5zIGFmdGVyIHRoZSBtYXRjaGluZyBudW1iZXIgb2YgdW5ibG9ja3MgYXJlIGRvbmUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBibG9jayBldmVudCBjaGVja2luZyBmcm9tCisgKiBkaXNrX2NsZWFyX2V2ZW50cygpLgorICoKKyAqIENPTlRFWFQ6CisgKiBNaWdodCBzbGVlcC4KKyAqLwordm9pZCBkaXNrX2Jsb2NrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKIAlzdHJ1Y3QgZGlza19ldmVudHMgKmV2ID0gZGlzay0+ZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGNhbmNlbDsKIAorCWlmICghZXYpCisJCXJldHVybjsKKworCS8qCisJICogT3V0ZXIgbXV0ZXggZW5zdXJlcyB0aGF0IHRoZSBmaXJzdCBibG9ja2VyIGNvbXBsZXRlcyBjYW5jZWxpbmcKKwkgKiB0aGUgZXZlbnQgd29yayBiZWZvcmUgZnVydGhlciBibG9ja2VycyBhcmUgYWxsb3dlZCB0byBmaW5pc2guCisJICovCisJbXV0ZXhfbG9jaygmZXYtPmJsb2NrX211dGV4KTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZldi0+bG9jaywgZmxhZ3MpOwogCWNhbmNlbCA9ICFldi0+YmxvY2srKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGNhbmNlbCkgewotCQlpZiAoc3luYykKLQkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGlzay0+ZXYtPmR3b3JrKTsKLQkJZWxzZQotCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZGlzay0+ZXYtPmR3b3JrKTsKLQl9CisJaWYgKGNhbmNlbCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaXNrLT5ldi0+ZHdvcmspOworCisJbXV0ZXhfdW5sb2NrKCZldi0+YmxvY2tfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2Rpc2tfdW5ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGJvb2wgY2hlY2tfbm93KQpAQCAtMTQ2MSwyNyArMTQ4NCw2IEBACiB9CiAKIC8qKgotICogZGlza19ibG9ja19ldmVudHMgLSBibG9jayBhbmQgZmx1c2ggZGlzayBldmVudCBjaGVja2luZwotICogQGRpc2s6IGRpc2sgdG8gYmxvY2sgZXZlbnRzIGZvcgotICoKLSAqIE9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24sIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBldmVudCBjaGVja2luZwotICogaXNuJ3QgaW4gcHJvZ3Jlc3MgYW5kIHdvbid0IGhhcHBlbiB1bnRpbCB1bmJsb2NrZWQgYnkKLSAqIGRpc2tfdW5ibG9ja19ldmVudHMoKS4gIEV2ZW50cyBibG9ja2luZyBpcyBjb3VudGVkIGFuZCB0aGUgYWN0dWFsCi0gKiB1bmJsb2NraW5nIGhhcHBlbnMgYWZ0ZXIgdGhlIG1hdGNoaW5nIG51bWJlciBvZiB1bmJsb2NrcyBhcmUgZG9uZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGJsb2NrIGV2ZW50IGNoZWNraW5nIGZyb20KLSAqIGRpc2tfY2xlYXJfZXZlbnRzKCkuCi0gKgotICogQ09OVEVYVDoKLSAqIE1pZ2h0IHNsZWVwLgotICovCi12b2lkIGRpc2tfYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQotewotCWlmIChkaXNrLT5ldikKLQkJX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKLX0KLQotLyoqCiAgKiBkaXNrX3VuYmxvY2tfZXZlbnRzIC0gdW5ibG9jayBkaXNrIGV2ZW50IGNoZWNraW5nCiAgKiBAZGlzazogZGlzayB0byB1bmJsb2NrIGV2ZW50cyBmb3IKICAqCkBAIC0xNTA4LDEwICsxNTEwLDE4IEBACiAgKi8KIHZvaWQgZGlza19jaGVja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JaWYgKGRpc2stPmV2KSB7Ci0JCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgZmFsc2UpOwotCQlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisJc3RydWN0IGRpc2tfZXZlbnRzICpldiA9IGRpc2stPmV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWV2KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWV2LT5ibG9jaykgeworCQljYW5jZWxfZGVsYXllZF93b3JrKCZldi0+ZHdvcmspOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX25ydF93cSwgJmV2LT5kd29yaywgMCk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2LT5sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkaXNrX2NoZWNrX2V2ZW50cyk7CiAKQEAgLTE1NDYsNyArMTU1Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZldi0+bG9jayk7CiAKIAkvKiB1bmNvbmR0aW9uYWxseSBzY2hlZHVsZSBldmVudCBjaGVjayBhbmQgd2FpdCBmb3IgaXQgdG8gZmluaXNoICovCi0JX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKwlkaXNrX2Jsb2NrX2V2ZW50cyhkaXNrKTsKIAlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX25ydF93cSwgJmV2LT5kd29yaywgMCk7CiAJZmx1c2hfZGVsYXllZF93b3JrKCZldi0+ZHdvcmspOwogCV9fZGlza191bmJsb2NrX2V2ZW50cyhkaXNrLCBmYWxzZSk7CkBAIC0xNjY0LDcgKzE2NzQsNyBAQAogCWlmIChpbnR2IDwgMCAmJiBpbnR2ICE9IC0xKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisJZGlza19ibG9ja19ldmVudHMoZGlzayk7CiAJZGlzay0+ZXYtPnBvbGxfbXNlY3MgPSBpbnR2OwogCV9fZGlza191bmJsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKIApAQCAtMTc1MCw2ICsxNzYwLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmZXYtPm5vZGUpOwogCWV2LT5kaXNrID0gZGlzazsKIAlzcGluX2xvY2tfaW5pdCgmZXYtPmxvY2spOworCW11dGV4X2luaXQoJmV2LT5ibG9ja19tdXRleCk7CiAJZXYtPmJsb2NrID0gMTsKIAlldi0+cG9sbF9tc2VjcyA9IC0xOwogCUlOSVRfREVMQVlFRF9XT1JLKCZldi0+ZHdvcmssIGRpc2tfZXZlbnRzX3dvcmtmbik7CkBAIC0xNzcwLDcgKzE3ODEsNyBAQAogCWlmICghZGlzay0+ZXYpCiAJCXJldHVybjsKIAotCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisJZGlza19ibG9ja19ldmVudHMoZGlzayk7CiAKIAltdXRleF9sb2NrKCZkaXNrX2V2ZW50c19tdXRleCk7CiAJbGlzdF9kZWxfaW5pdCgmZGlzay0+ZXYtPm5vZGUpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RlZmxhdGUuYyBiL2NyeXB0by9kZWZsYXRlLmMKaW5kZXggYjVjY2FlMi4uYjAxNjVlYyAxMDA2NDQKLS0tIGEvY3J5cHRvL2RlZmxhdGUuYworKysgYi9jcnlwdG8vZGVmbGF0ZS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNkZWZpbmUgREVGTEFURV9ERUZfTEVWRUwJCVpfREVGQVVMVF9DT01QUkVTU0lPTgogI2RlZmluZSBERUZMQVRFX0RFRl9XSU5CSVRTCQkxMQpAQCAtNzMsNyArNzIsNyBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCB6X3N0cmVhbV9zICpzdHJlYW0gPSAmY3R4LT5kZWNvbXBfc3RyZWFtOwogCi0Jc3RyZWFtLT53b3Jrc3BhY2UgPSBremFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksIEdGUF9LRVJORUwpOworCXN0cmVhbS0+d29ya3NwYWNlID0gdnphbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTsKIAlpZiAoIXN0cmVhbS0+d29ya3NwYWNlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtODYsNyArODUsNyBAQAogb3V0OgogCXJldHVybiByZXQ7CiBvdXRfZnJlZToKLQlrZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CisJdmZyZWUoc3RyZWFtLT53b3Jrc3BhY2UpOwogCWdvdG8gb3V0OwogfQogCkBAIC05OSw3ICs5OCw3IEBACiBzdGF0aWMgdm9pZCBkZWZsYXRlX2RlY29tcF9leGl0KHN0cnVjdCBkZWZsYXRlX2N0eCAqY3R4KQogewogCXpsaWJfaW5mbGF0ZUVuZCgmY3R4LT5kZWNvbXBfc3RyZWFtKTsKLQlrZnJlZShjdHgtPmRlY29tcF9zdHJlYW0ud29ya3NwYWNlKTsKKwl2ZnJlZShjdHgtPmRlY29tcF9zdHJlYW0ud29ya3NwYWNlKTsKIH0KIAogc3RhdGljIGludCBkZWZsYXRlX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKZGlmZiAtLWdpdCBhL2NyeXB0by96bGliLmMgYi9jcnlwdG8vemxpYi5jCmluZGV4IGQxMWQ3NjEuLjA2YjYyZTUgMTAwNjQ0Ci0tLSBhL2NyeXB0by96bGliLmMKKysrIGIvY3J5cHRvL3psaWIuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2NvbXByZXNzLmg+CiAKQEAgLTYwLDcgKzU5LDcgQEAKIAogCWlmIChzdHJlYW0tPndvcmtzcGFjZSkgewogCQl6bGliX2luZmxhdGVFbmQoc3RyZWFtKTsKLQkJa2ZyZWUoc3RyZWFtLT53b3Jrc3BhY2UpOworCQl2ZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CiAJCXN0cmVhbS0+d29ya3NwYWNlID0gTlVMTDsKIAl9CiB9CkBAIC0yMjgsMTMgKzIyNywxMyBAQAogCQkJCSA/IG5sYV9nZXRfdTMyKHRiW1pMSUJfREVDT01QX1dJTkRPV0JJVFNdKQogCQkJCSA6IERFRl9XQklUUzsKIAotCXN0cmVhbS0+d29ya3NwYWNlID0ga3phbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpLCBHRlBfS0VSTkVMKTsKKwlzdHJlYW0tPndvcmtzcGFjZSA9IHZ6YWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CiAJaWYgKCFzdHJlYW0tPndvcmtzcGFjZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSB6bGliX2luZmxhdGVJbml0MihzdHJlYW0sIGN0eC0+ZGVjb21wX3dpbmRvd0JpdHMpOwogCWlmIChyZXQgIT0gWl9PSykgewotCQlrZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CisJCXZmcmVlKHN0cmVhbS0+d29ya3NwYWNlKTsKIAkJc3RyZWFtLT53b3Jrc3BhY2UgPSBOVUxMOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKaW5kZXggYWJkYTM3OC4uMTgxYmMyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYwpAQCAtMTM5LDEzICsxMzksMjMgQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpnaGVzX2RldjsKIAlzdHJ1Y3QgZ2hlc19hcnIgKmdoZXNfYXJyID0gZGF0YTsKLQlpbnQgcmM7CisJaW50IHJjLCBpOwogCiAJaWYgKGhlc3RfaGRyLT50eXBlICE9IEFDUElfSEVTVF9UWVBFX0dFTkVSSUNfRVJST1IpCiAJCXJldHVybiAwOwogCiAJaWYgKCEoKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqKWhlc3RfaGRyKS0+ZW5hYmxlZCkKIAkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IGdoZXNfYXJyLT5jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBhY3BpX2hlc3RfaGVhZGVyICpoZHI7CisJCWdoZXNfZGV2ID0gZ2hlc19hcnItPmdoZXNfZGV2c1tpXTsKKwkJaGRyID0gKihzdHJ1Y3QgYWNwaV9oZXN0X2hlYWRlciAqKilnaGVzX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJCWlmIChoZHItPnNvdXJjZV9pZCA9PSBoZXN0X2hkci0+c291cmNlX2lkKSB7CisJCQlwcl93YXJuaW5nKEZXX1dBUk4gSEVTVF9QRlggIkR1cGxpY2F0ZWQgaGFyZHdhcmUgZXJyb3Igc291cmNlIElEOiAlZC5cbiIsCisJCQkJICAgaGRyLT5zb3VyY2VfaWQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CiAJZ2hlc19kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIkdIRVMiLCBoZXN0X2hkci0+c291cmNlX2lkKTsKIAlpZiAoIWdoZXNfZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCA1MmNhOTY0Li4zNzJmOWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC0xMzMzLDIzICsxMzMzLDYgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV9yZXNvdXJjZXNfYXJlX2VuZm9yY2VkKTsKIAogLyoKLSAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNwaW5sb2NrLgotICovCi1hY3BpX3N0YXR1cwotYWNwaV9vc19jcmVhdGVfbG9jayhhY3BpX3NwaW5sb2NrICpvdXRfaGFuZGxlKQotewotCXNwaW5sb2NrX3QgKmxvY2s7Ci0KLQlsb2NrID0gQUNQSV9BTExPQ0FURShzaXplb2Yoc3BpbmxvY2tfdCkpOwotCWlmICghbG9jaykKLQkJcmV0dXJuIEFFX05PX01FTU9SWTsKLQlzcGluX2xvY2tfaW5pdChsb2NrKTsKLQkqb3V0X2hhbmRsZSA9IGxvY2s7Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLS8qCiAgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGEgc3BpbmxvY2suCiAgKi8KIHZvaWQgYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX3NwaW5sb2NrIGhhbmRsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwppbmRleCBkMzhjNDBmLi40MTIyM2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCkBAIC00NTIsNyArNDUyLDcgQEAKIAl9CiAKIAlpZiAobWFza19wb3J0X21hcCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsICJtYXNraW5nIHBvcnRfbWFwIDB4JXggLT4gMHgleFxuIiwKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGRldiwgIm1hc2tpbmcgcG9ydF9tYXAgMHgleCAtPiAweCV4XG4iLAogCQkJICAgcG9ydF9tYXAsCiAJCQkgICBwb3J0X21hcCAmIG1hc2tfcG9ydF9tYXApOwogCQlwb3J0X21hcCAmPSBtYXNrX3BvcnRfbWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggNzM2YmVlNS4uMDAwZDAzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC00MTQzLDkgKzQxNDMsOSBAQAogCSAqIERldmljZXMgd2hpY2ggY2hva2Ugb24gU0VUWEZFUi4gIEFwcGxpZXMgb25seSBpZiBib3RoIHRoZQogCSAqIGRldmljZSBhbmQgY29udHJvbGxlciBhcmUgU0FUQS4KIAkgKi8KLQl7ICJQSU9ORUVSIERWRC1SVyAgRFZSVEQwOCIsCSIxLjAwIiwJQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCi0JeyAiUElPTkVFUiBEVkQtUlcgIERWUi0yMTJEIiwJIjEuMjgiLCBBVEFfSE9SS0FHRV9OT1NFVFhGRVIgfSwKLQl7ICJQSU9ORUVSIERWRC1SVyAgRFZSLTIxNkQiLAkiMS4wOCIsIEFUQV9IT1JLQUdFX05PU0VUWEZFUiB9LAorCXsgIlBJT05FRVIgRFZELVJXICBEVlJURDA4IiwJTlVMTCwJQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCisJeyAiUElPTkVFUiBEVkQtUlcgIERWUi0yMTJEIiwJTlVMTCwJQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCisJeyAiUElPTkVFUiBEVkQtUlcgIERWUi0yMTZEIiwJTlVMTCwJQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCiAKIAkvKiBFbmQgTWFya2VyICovCiAJeyB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCmluZGV4IGRmYjZlOWQuLjdmMDk5ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCkBAIC0yODAyLDEwICsyODAyLDExIEBACiAJfQogCiAJLyoKLQkgKiBTb21lIGNvbnRyb2xsZXJzIGNhbid0IGJlIGZyb3plbiB2ZXJ5IHdlbGwgYW5kIG1heSBzZXQKLQkgKiBzcHVydWlvdXMgZXJyb3IgY29uZGl0aW9ucyBkdXJpbmcgcmVzZXQuICBDbGVhciBhY2N1bXVsYXRlZAotCSAqIGVycm9yIGluZm9ybWF0aW9uLiAgQXMgcmVzZXQgaXMgdGhlIGZpbmFsIHJlY292ZXJ5IGFjdGlvbiwKLQkgKiBub3RoaW5nIGlzIGxvc3QgYnkgZG9pbmcgdGhpcy4KKwkgKiBTb21lIGNvbnRyb2xsZXJzIGNhbid0IGJlIGZyb3plbiB2ZXJ5IHdlbGwgYW5kIG1heSBzZXQgc3B1cmlvdXMKKwkgKiBlcnJvciBjb25kaXRpb25zIGR1cmluZyByZXNldC4gIENsZWFyIGFjY3VtdWxhdGVkIGVycm9yCisJICogaW5mb3JtYXRpb24gYW5kIHJlLXRoYXcgdGhlIHBvcnQgaWYgZnJvemVuLiAgQXMgcmVzZXQgaXMgdGhlCisJICogZmluYWwgcmVjb3ZlcnkgYWN0aW9uIGFuZCB3ZSBjcm9zcyBjaGVjayBsaW5rIG9ubGluZW5lc3MgYWdhaW5zdAorCSAqIGRldmljZSBjbGFzc2lmaWNhdGlvbiBsYXRlciwgbm8gaG90cGx1ZyBldmVudCBpcyBsb3N0IGJ5IHRoaXMuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUobGluay0+YXAtPmxvY2ssIGZsYWdzKTsKIAltZW1zZXQoJmxpbmstPmVoX2luZm8sIDAsIHNpemVvZihsaW5rLT5laF9pbmZvKSk7CkBAIC0yODE0LDYgKzI4MTUsOSBAQAogCWFwLT5wZmxhZ3MgJj0gfkFUQV9QRkxBR19FSF9QRU5ESU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobGluay0+YXAtPmxvY2ssIGZsYWdzKTsKIAorCWlmIChhcC0+cGZsYWdzICYgQVRBX1BGTEFHX0ZST1pFTikKKwkJYXRhX2VoX3RoYXdfcG9ydChhcCk7CisKIAkvKgogCSAqIE1ha2Ugc3VyZSBvbmxpbmVuZXNzIGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQgY29ycmVzcG9uZC4KIAkgKiBIb3RwbHVnIGNvdWxkIGhhdmUgaGFwcGVuZWQgZHVyaW5nIHJlc2V0IGFuZCBzb21lCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCBkNTFmOTc5Li45MjdmOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTM3OTcsNiArMzc5NywxMiBAQAogICovCiBpbnQgYXRhX3Nhc19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJLyoKKwkgKiB0aGUgcG9ydCBpcyBtYXJrZWQgYXMgZnJvemVuIGF0IGFsbG9jYXRpb24gdGltZSwgYnV0IGlmIHdlIGRvbid0CisJICogaGF2ZSBuZXcgZWgsIHdlIHdvbid0IHRoYXcgaXQKKwkgKi8KKwlpZiAoIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpCisJCWFwLT5wZmxhZ3MgJj0gfkFUQV9QRkxBR19GUk9aRU47CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2FzX3BvcnRfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMgYi9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYwppbmRleCA3NWE2YTBjLi41ZDdmNThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYwpAQCAtMTYxLDYgKzE2MSw5IEBACiAJeyBQQ0lfREVWSUNFKDB4MTFBQiwgMHg2MTIxKSwgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxMUFCLCAweDYxMjMpLCB9LAogCXsgUENJX0RFVklDRSgweDExQUIsIDB4NjE0NSksIH0sCisJeyBQQ0lfREVWSUNFKDB4MUI0QiwgMHg5MUEwKSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxQjRCLCAweDkxQTQpLCB9LAorCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwppbmRleCAxYzRiM2FhLi5kYzg4YTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMKQEAgLTM4OSw3ICszODksNyBAQAogLyoKICAqIEZ1bmN0aW9uOiBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZQogICogYXJndW1lbnRzOiBkYXRhbGVuZ3RoOiBsZW5ndGggaW4gYnl0ZXMgb2YgZGF0YQotICogcmV0dXJucyB2YWx1ZSB0byBiZSBwcm9ncmFtbWVkIGluIHJlZ2lzdGVyIGNvcnJyZXNwb25kaW5nIHRvIGRhdGEgbGVuZ3RoCisgKiByZXR1cm5zIHZhbHVlIHRvIGJlIHByb2dyYW1tZWQgaW4gcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byBkYXRhIGxlbmd0aAogICogVGhpcyB2YWx1ZSBpcyBlZmZlY3RpdmVseSB0aGUgbG9nKGJhc2UgMikgb2YgdGhlIGxlbmd0aAogICovCiBzdGF0aWMgIGludCBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZShpbnQgZGF0YWxlbmd0aCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwppbmRleCA5ZjliMjM1Li40NWQ3YzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKKysrIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCkBAIC0zMCw3ICszMCw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKG1lbV9zeXNmc19tdXRleCk7CiAKICNkZWZpbmUgTUVNT1JZX0NMQVNTX05BTUUJIm1lbW9yeSIKLSNkZWZpbmUgTUlOX01FTU9SWV9CTE9DS19TSVpFCSgxIDw8IFNFQ1RJT05fU0laRV9CSVRTKQogCiBzdGF0aWMgaW50IHNlY3Rpb25zX3Blcl9ibG9jazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwppbmRleCAxYzI5MWFmLi42MDQwNzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgKgogICogUmV0dXJucyAmc3RydWN0IHBsYXRmb3JtX2RldmljZSBwb2ludGVyIG9uIHN1Y2Nlc3MsIG9yIEVSUl9QVFIoKSBvbiBlcnJvci4KICAqLwotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0X29yX21vZHVsZSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEoCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEoCiAJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJY29uc3QgY2hhciAqbmFtZSwgaW50IGlkLAogCQljb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IG51bSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYwppbmRleCBjMGRkMDlkLi5hZDM2N2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCkBAIC0yOTEsNyArMjkxLDcgQEAKIHsKIAlzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrICpjbGtuYjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOwotCWNoYXIgKmNvbl9pZDsKKwljaGFyICoqY29uX2lkOwogCWludCBlcnJvcjsKIAogCWRldl9kYmcoZGV2LCAiJXMoKSAlbGRcbiIsIF9fZnVuY19fLCBhY3Rpb24pOwpAQCAtMzA5LDggKzMwOSw4IEBACiAKIAkJZGV2LT5wd3JfZG9tYWluID0gY2xrbmItPnB3cl9kb21haW47CiAJCWlmIChjbGtuYi0+Y29uX2lkc1swXSkgewotCQkJZm9yIChjb25faWQgPSBjbGtuYi0+Y29uX2lkc1swXTsgKmNvbl9pZDsgY29uX2lkKyspCi0JCQkJcG1fcnVudGltZV9jbGtfYWRkKGRldiwgY29uX2lkKTsKKwkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHM7ICpjb25faWQ7IGNvbl9pZCsrKQorCQkJCXBtX3J1bnRpbWVfY2xrX2FkZChkZXYsICpjb25faWQpOwogCQl9IGVsc2UgewogCQkJcG1fcnVudGltZV9jbGtfYWRkKGRldiwgTlVMTCk7CiAJCX0KQEAgLTM4MCwyNSArMzgwLDI1IEBACiB7CiAJc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayAqY2xrbmI7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQljaGFyICpjb25faWQ7CisJY2hhciAqKmNvbl9pZDsKIAogCWRldl9kYmcoZGV2LCAiJXMoKSAlbGRcbiIsIF9fZnVuY19fLCBhY3Rpb24pOwogCiAJY2xrbmIgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2ssIG5iKTsKIAogCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBCVVNfTk9USUZZX0FERF9ERVZJQ0U6CisJY2FzZSBCVVNfTk9USUZZX0JJTkRfRFJJVkVSOgogCQlpZiAoY2xrbmItPmNvbl9pZHNbMF0pIHsKLQkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHNbMF07ICpjb25faWQ7IGNvbl9pZCsrKQotCQkJCWVuYWJsZV9jbG9jayhkZXYsIGNvbl9pZCk7CisJCQlmb3IgKGNvbl9pZCA9IGNsa25iLT5jb25faWRzOyAqY29uX2lkOyBjb25faWQrKykKKwkJCQllbmFibGVfY2xvY2soZGV2LCAqY29uX2lkKTsKIAkJfSBlbHNlIHsKIAkJCWVuYWJsZV9jbG9jayhkZXYsIE5VTEwpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgQlVTX05PVElGWV9ERUxfREVWSUNFOgorCWNhc2UgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUjoKIAkJaWYgKGNsa25iLT5jb25faWRzWzBdKSB7Ci0JCQlmb3IgKGNvbl9pZCA9IGNsa25iLT5jb25faWRzWzBdOyAqY29uX2lkOyBjb25faWQrKykKLQkJCQlkaXNhYmxlX2Nsb2NrKGRldiwgY29uX2lkKTsKKwkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHM7ICpjb25faWQ7IGNvbl9pZCsrKQorCQkJCWRpc2FibGVfY2xvY2soZGV2LCAqY29uX2lkKTsKIAkJfSBlbHNlIHsKIAkJCWRpc2FibGVfY2xvY2soZGV2LCBOVUxMKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggYWE2MzIwMjAuLjA2ZjA5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwpAQCAtNTcsNyArNTcsOCBAQAogICovCiB2b2lkIGRldmljZV9wbV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwlkZXYtPnBvd2VyLmlzX3ByZXBhcmVkID0gZmFsc2U7CisJZGV2LT5wb3dlci5pc19zdXNwZW5kZWQgPSBmYWxzZTsKIAlpbml0X2NvbXBsZXRpb24oJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCWRldi0+cG93ZXIud2FrZXVwID0gTlVMTDsKQEAgLTkxLDcgKzkyLDcgQEAKIAlwcl9kZWJ1ZygiUE06IEFkZGluZyBpbmZvIGZvciAlczolc1xuIiwKIAkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2KSk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2LT5wYXJlbnQtPnBvd2VyLmluX3N1c3BlbmQpCisJaWYgKGRldi0+cGFyZW50ICYmIGRldi0+cGFyZW50LT5wb3dlci5pc19wcmVwYXJlZCkKIAkJZGV2X3dhcm4oZGV2LCAicGFyZW50ICVzIHNob3VsZCBub3QgYmUgc2xlZXBpbmdcbiIsCiAJCQlkZXZfbmFtZShkZXYtPnBhcmVudCkpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fbGlzdCk7CkBAIC01MTEsNyArNTEyLDE0IEBACiAJZHBtX3dhaXQoZGV2LT5wYXJlbnQsIGFzeW5jKTsKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CisJLyoKKwkgKiBUaGlzIGlzIGEgZmliLiAgQnV0IHdlJ2xsIGFsbG93IG5ldyBjaGlsZHJlbiB0byBiZSBhZGRlZCBiZWxvdworCSAqIGEgcmVzdW1lZCBkZXZpY2UsIGV2ZW4gaWYgdGhlIGRldmljZSBoYXNuJ3QgYmVlbiBjb21wbGV0ZWQgeWV0LgorCSAqLworCWRldi0+cG93ZXIuaXNfcHJlcGFyZWQgPSBmYWxzZTsKKworCWlmICghZGV2LT5wb3dlci5pc19zdXNwZW5kZWQpCisJCWdvdG8gVW5sb2NrOwogCiAJaWYgKGRldi0+cHdyX2RvbWFpbikgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwb3dlciBkb21haW4gIik7CkBAIC01NDgsNiArNTU2LDkgQEAKIAl9CiAKICBFbmQ6CisJZGV2LT5wb3dlci5pc19zdXNwZW5kZWQgPSBmYWxzZTsKKworIFVubG9jazoKIAlkZXZpY2VfdW5sb2NrKGRldik7CiAJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCkBAIC02NzAsNyArNjgxLDcgQEAKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9wcmVwYXJlZF9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CisJCWRldi0+cG93ZXIuaXNfcHJlcGFyZWQgPSBmYWxzZTsKIAkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CiAJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIApAQCAtODM1LDExICs4NDYsMTEgQEAKIAlkZXZpY2VfbG9jayhkZXYpOwogCiAJaWYgKGFzeW5jX2Vycm9yKQotCQlnb3RvIEVuZDsKKwkJZ290byBVbmxvY2s7CiAKIAlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewogCQlhc3luY19lcnJvciA9IC1FQlVTWTsKLQkJZ290byBFbmQ7CisJCWdvdG8gVW5sb2NrOwogCX0KIAogCWlmIChkZXYtPnB3cl9kb21haW4pIHsKQEAgLTg3Nyw2ICs4ODgsOSBAQAogCX0KIAogIEVuZDoKKwlkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCA9ICFlcnJvcjsKKworIFVubG9jazoKIAlkZXZpY2VfdW5sb2NrKGRldik7CiAJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCkBAIC0xMDQyLDcgKzEwNTYsNyBAQAogCQkJcHV0X2RldmljZShkZXYpOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gdHJ1ZTsKKwkJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IHRydWU7CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCiAJCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9wcmVwYXJlZF9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3N5c2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9zeXNjb3JlLmMKaW5kZXggYzEyNmRiMy4uZThkMTFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3N5c2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2Uvc3lzY29yZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogc3RhdGljIExJU1RfSEVBRChzeXNjb3JlX29wc19saXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc3lzY29yZV9vcHNfbG9jayk7CkBAIC00OCw2ICs0OSwxMyBAQAogCXN0cnVjdCBzeXNjb3JlX29wcyAqb3BzOwogCWludCByZXQgPSAwOwogCisJcHJfZGVidWcoIkNoZWNraW5nIHdha2V1cCBpbnRlcnJ1cHRzXG4iKTsKKworCS8qIFJldHVybiBlcnJvciBjb2RlIGlmIHRoZXJlIGFyZSBhbnkgd2FrZXVwIGludGVycnVwdHMgcGVuZGluZy4gKi8KKwlyZXQgPSBjaGVja193YWtldXBfaXJxcygpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlXQVJOX09OQ0UoIWlycXNfZGlzYWJsZWQoKSwKIAkJIkludGVycnVwdHMgZW5hYmxlZCBiZWZvcmUgc3lzdGVtIGNvcmUgc3VzcGVuZC5cbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9hY3Rsb2cuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCmluZGV4IDA5ZWY5YTguLmNmMGU2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCkBAIC03OSw3ICs3OSw3IEBACiAJbWRfaW8uZXJyb3IgPSAwOwogCiAJaWYgKChydyAmIFdSSVRFKSAmJiAhdGVzdF9iaXQoTURfTk9fRlVBLCAmbWRldi0+ZmxhZ3MpKQotCQlydyB8PSBSRVFfRlVBOworCQlydyB8PSBSRVFfRlVBIHwgUkVRX0ZMVVNIOwogCXJ3IHw9IFJFUV9TWU5DOwogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKaW5kZXggZjQ0MGEwMi4uN2I5NzYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKQEAgLTExMiw5ICsxMTIsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqYm1fdGFzazsKIH07CiAKLXN0YXRpYyBpbnQgX19ibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsLCBjb25zdCBlbnVtIGttX3R5cGUga20pOwotCiAjZGVmaW5lIGJtX3ByaW50X2xvY2tfaW5mbyhtKSBfX2JtX3ByaW50X2xvY2tfaW5mbyhtLCBfX2Z1bmNfXykKIHN0YXRpYyB2b2lkIF9fYm1fcHJpbnRfbG9ja19pbmZvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMpCiB7CkBAIC05OTQsNiArOTkxLDkgQEAKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJfSBlbHNlIHsKIAkJc3VibWl0X2JpbyhydywgYmlvKTsKKwkJLyogdGhpcyBzaG91bGQgbm90IGNvdW50IGFzIHVzZXIgYWN0aXZpdHkgYW5kIGNhdXNlIHRoZQorCQkgKiByZXN5bmMgdG8gdGhyb3R0bGUgLS0gc2VlIGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bigpLiAqLworCQlhdG9taWNfYWRkKGxlbiA+PiA5LCAmbWRldi0+cnNfc2VjdF9ldik7CiAJfQogfQogCkBAIC0xMjU2LDcgKzEyNTYsNyBAQAogICogZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGZvciBvbmx5IGEgZmV3IGJpdHMgKGUgLSBzIGFib3V0IEJJVFNfUEVSX0xPTkcpLgogICogTXVzdCBob2xkIGJpdG1hcCBsb2NrIGFscmVhZHkuICovCiBzdGF0aWMgaW50IF9fYm1fY2hhbmdlX2JpdHNfdG8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3QgdW5zaWduZWQgbG9uZyBzLAotCXVuc2lnbmVkIGxvbmcgZSwgaW50IHZhbCwgY29uc3QgZW51bSBrbV90eXBlIGttKQorCXVuc2lnbmVkIGxvbmcgZSwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyAqcF9hZGRyID0gTlVMTDsKQEAgLTEyNzQsMTQgKzEyNzQsMTQgQEAKIAkJdW5zaWduZWQgaW50IHBhZ2VfbnIgPSBibV9iaXRfdG9fcGFnZV9pZHgoYiwgYml0bnIpOwogCQlpZiAocGFnZV9uciAhPSBsYXN0X3BhZ2VfbnIpIHsKIAkJCWlmIChwX2FkZHIpCi0JCQkJX19ibV91bm1hcChwX2FkZHIsIGttKTsKKwkJCQlfX2JtX3VubWFwKHBfYWRkciwgS01fSVJRMSk7CiAJCQlpZiAoYyA8IDApCiAJCQkJYm1fc2V0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tsYXN0X3BhZ2VfbnJdKTsKIAkJCWVsc2UgaWYgKGMgPiAwKQogCQkJCWJtX3NldF9wYWdlX25lZWRfd3JpdGVvdXQoYi0+Ym1fcGFnZXNbbGFzdF9wYWdlX25yXSk7CiAJCQljaGFuZ2VkX3RvdGFsICs9IGM7CiAJCQljID0gMDsKLQkJCXBfYWRkciA9IF9fYm1fbWFwX3BpZHgoYiwgcGFnZV9uciwga20pOworCQkJcF9hZGRyID0gX19ibV9tYXBfcGlkeChiLCBwYWdlX25yLCBLTV9JUlExKTsKIAkJCWxhc3RfcGFnZV9uciA9IHBhZ2VfbnI7CiAJCX0KIAkJaWYgKHZhbCkKQEAgLTEyOTAsNyArMTI5MCw3IEBACiAJCQljIC09ICgwICE9IF9fdGVzdF9hbmRfY2xlYXJfYml0X2xlKGJpdG5yICYgQklUU19QRVJfUEFHRV9NQVNLLCBwX2FkZHIpKTsKIAl9CiAJaWYgKHBfYWRkcikKLQkJX19ibV91bm1hcChwX2FkZHIsIGttKTsKKwkJX19ibV91bm1hcChwX2FkZHIsIEtNX0lSUTEpOwogCWlmIChjIDwgMCkKIAkJYm1fc2V0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tsYXN0X3BhZ2VfbnJdKTsKIAllbHNlIGlmIChjID4gMCkKQEAgLTEzMTgsNyArMTMxOCw3IEBACiAJaWYgKCh2YWwgPyBCTV9ET05UX1NFVCA6IEJNX0RPTlRfQ0xFQVIpICYgYi0+Ym1fZmxhZ3MpCiAJCWJtX3ByaW50X2xvY2tfaW5mbyhtZGV2KTsKIAotCWMgPSBfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIHZhbCwgS01fSVJRMSk7CisJYyA9IF9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgdmFsKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmItPmJtX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gYzsKQEAgLTEzNDMsMTYgKzEzNDMsMTcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgYml0czsKLQl1bnNpZ25lZCBsb25nICpwYWRkciA9IGttYXBfYXRvbWljKGItPmJtX3BhZ2VzW3BhZ2VfbnJdLCBLTV9VU0VSMCk7CisJdW5zaWduZWQgbG9uZyAqcGFkZHIgPSBrbWFwX2F0b21pYyhiLT5ibV9wYWdlc1twYWdlX25yXSwgS01fSVJRMSk7CiAJZm9yIChpID0gZmlyc3Rfd29yZDsgaSA8IGxhc3Rfd29yZDsgaSsrKSB7CiAJCWJpdHMgPSBod2VpZ2h0X2xvbmcocGFkZHJbaV0pOwogCQlwYWRkcltpXSA9IH4wVUw7CiAJCWItPmJtX3NldCArPSBCSVRTX1BFUl9MT05HIC0gYml0czsKIAl9Ci0Ja3VubWFwX2F0b21pYyhwYWRkciwgS01fVVNFUjApOworCWt1bm1hcF9hdG9taWMocGFkZHIsIEtNX0lSUTEpOwogfQogCi0vKiBTYW1lIHRoaW5nIGFzIGRyYmRfYm1fc2V0X2JpdHMsIGJ1dCB3aXRob3V0IHRha2luZyB0aGUgc3Bpbl9sb2NrX2lycXNhdmUuCisvKiBTYW1lIHRoaW5nIGFzIGRyYmRfYm1fc2V0X2JpdHMsCisgKiBidXQgbW9yZSBlZmZpY2llbnQgZm9yIGEgbGFyZ2UgYml0IHJhbmdlLgogICogWW91IG11c3QgZmlyc3QgZHJiZF9ibV9sb2NrKCkuCiAgKiBDYW4gYmUgY2FsbGVkIHRvIHNldCB0aGUgd2hvbGUgYml0bWFwIGluIG9uZSBnby4KICAqIFNldHMgYml0cyBmcm9tIHMgdG8gZSBfaW5jbHVzaXZlXy4gKi8KQEAgLTEzNjYsNiArMTM2Nyw3IEBACiAJICogRG8gbm90IHVzZSBtZW1zZXQsIGJlY2F1c2Ugd2UgbXVzdCBhY2NvdW50IGZvciBjaGFuZ2VzLAogCSAqIHNvIHdlIG5lZWQgdG8gbG9vcCBvdmVyIHRoZSB3b3JkcyB3aXRoIGh3ZWlnaHQoKSBhbnl3YXlzLgogCSAqLworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIHNsID0gQUxJR04ocyxCSVRTX1BFUl9MT05HKTsKIAl1bnNpZ25lZCBsb25nIGVsID0gKGUrMSkgJiB+KCh1bnNpZ25lZCBsb25nKUJJVFNfUEVSX0xPTkctMSk7CiAJaW50IGZpcnN0X3BhZ2U7CkBAIC0xMzc2LDE1ICsxMzc4LDE5IEBACiAKIAlpZiAoZSAtIHMgPD0gMypCSVRTX1BFUl9MT05HKSB7CiAJCS8qIGRvbid0IGJvdGhlcjsgZWwgYW5kIHNsIG1heSBldmVuIGJlIHdyb25nLiAqLwotCQlfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIDEsIEtNX1VTRVIwKTsKKwkJc3Bpbl9sb2NrX2lycSgmYi0+Ym1fbG9jayk7CisJCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJCXNwaW5fdW5sb2NrX2lycSgmYi0+Ym1fbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBkaWZmZXJlbmNlIGlzIGxhcmdlIGVub3VnaCB0aGF0IHdlIGNhbiB0cnVzdCBzbCBhbmQgZWwgKi8KIAorCXNwaW5fbG9ja19pcnEoJmItPmJtX2xvY2spOworCiAJLyogYml0cyBmaWxsaW5nIHRoZSBjdXJyZW50IGxvbmcgKi8KIAlpZiAoc2wpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgc2wtMSwgMSwgS01fVVNFUjApOworCQlfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIHNsLTEsIDEpOwogCiAJZmlyc3RfcGFnZSA9IHNsID4+ICgzICsgUEFHRV9TSElGVCk7CiAJbGFzdF9wYWdlID0gZWwgPj4gKDMgKyBQQUdFX1NISUZUKTsKQEAgLTEzOTcsOCArMTQwMywxMCBAQAogCS8qIGZpcnN0IGFuZCBmdWxsIHBhZ2VzLCB1bmxlc3MgZmlyc3QgcGFnZSA9PSBsYXN0IHBhZ2UgKi8KIAlmb3IgKHBhZ2VfbnIgPSBmaXJzdF9wYWdlOyBwYWdlX25yIDwgbGFzdF9wYWdlOyBwYWdlX25yKyspIHsKIAkJYm1fc2V0X2Z1bGxfd29yZHNfd2l0aGluX29uZV9wYWdlKG1kZXYtPmJpdG1hcCwgcGFnZV9uciwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWZpcnN0X3dvcmQgPSAwOworCQlzcGluX2xvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAl9CiAKIAkvKiBsYXN0IHBhZ2UgKHJlc3BlY3RpdmVseSBvbmx5IHBhZ2UsIGZvciBmaXJzdCBwYWdlID09IGxhc3QgcGFnZSkgKi8KQEAgLTE0MTEsNyArMTQxOSw4IEBACiAJICogaXQgd291bGQgdHJpZ2dlciBhbiBhc3NlcnQgaW4gX19ibV9jaGFuZ2VfYml0c190bygpCiAJICovCiAJaWYgKGVsIDw9IGUpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgZWwsIGUsIDEsIEtNX1VTRVIwKTsKKwkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBlbCwgZSwgMSk7CisJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIH0KIAogLyogcmV0dXJucyBiaXQgc3RhdGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCmluZGV4IDI1ZDMyYzUuLjQzYmVhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYwpAQCAtNDYwMiw2ICs0NjAyLDExIEBACiAJCQlkZXZfZXJyKERFViwgIm1ldGEgY29ubmVjdGlvbiBzaHV0IGRvd24gYnkgcGVlci5cbiIpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0gZWxzZSBpZiAocnYgPT0gLUVBR0FJTikgeworCQkJLyogSWYgdGhlIGRhdGEgc29ja2V0IHJlY2VpdmVkIHNvbWV0aGluZyBtZWFud2hpbGUsCisJCQkgKiB0aGF0IGlzIGdvb2QgZW5vdWdoOiBwZWVyIGlzIHN0aWxsIGFsaXZlLiAqLworCQkJaWYgKHRpbWVfYWZ0ZXIobWRldi0+bGFzdF9yZWNlaXZlZCwKKwkJCQlqaWZmaWVzIC0gbWRldi0+bWV0YS5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbykpCisJCQkJY29udGludWU7CiAJCQlpZiAocGluZ190aW1lb3V0X2FjdGl2ZSkgewogCQkJCWRldl9lcnIoREVWLCAiUGluZ0FjayBkaWQgbm90IGFycml2ZSBpbiB0aW1lLlxuIik7CiAJCQkJZ290byByZWNvbm5lY3Q7CkBAIC00NjM3LDYgKzQ2NDIsNyBAQAogCQkJCWdvdG8gcmVjb25uZWN0OwogCQl9CiAJCWlmIChyZWNlaXZlZCA9PSBleHBlY3QpIHsKKwkJCW1kZXYtPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOwogCQkJRF9BU1NFUlQoY21kICE9IE5VTEwpOwogCQkJaWYgKCFjbWQtPnByb2Nlc3MobWRldiwgaCkpCiAJCQkJZ290byByZWNvbm5lY3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93b3JrZXIuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCmluZGV4IDRkNzZiMDYuLjRkM2U2ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCkBAIC01MzYsMTIgKzUzNiw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCS8qIHN0YXJ0aW5nIHdpdGggZHJiZCA4LjMuOCwgd2UgY2FuIGhhbmRsZSBtdWx0aS1iaW8gRUVzLAotCSAqIGlmIGl0IHNob3VsZCBiZSBuZWNlc3NhcnkgKi8KLQltYXhfYmlvX3NpemUgPQotCQltZGV2LT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NCA/IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPnJxX3F1ZXVlKSA8PCA5IDoKLQkJbWRldi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTUgPwlEUkJEX01BWF9TSVpFX0g4MF9QQUNLRVQgOiBEUkJEX01BWF9CSU9fU0laRTsKLQorCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPnJxX3F1ZXVlKSA8PCA5OwogCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKG1kZXYpOwogCWlmIChudW1iZXIgPT0gMCkKIAkJZ290byByZXF1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggZTZmYzcxNi4uZjUzM2YzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0xOTIsNyArMTkyLDggQEAKIAkJCWlmIChsby0+eG1pdF90aW1lb3V0KQogCQkJCWRlbF90aW1lcl9zeW5jKCZ0aSk7CiAJCX0gZWxzZQotCQkJcmVzdWx0ID0ga2VybmVsX3JlY3Ztc2coc29jaywgJm1zZywgJmlvdiwgMSwgc2l6ZSwgMCk7CisJCQlyZXN1bHQgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBzaXplLAorCQkJCQkJbXNnLm1zZ19mbGFncyk7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlzaWdpbmZvX3QgaW5mbzsKQEAgLTc1Myw5ICs3NTQsMjYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXJ0X3NoaWZ0ID0gMDsKLQlpZiAobWF4X3BhcnQgPiAwKQorCWlmIChtYXhfcGFydCA+IDApIHsKIAkJcGFydF9zaGlmdCA9IGZscyhtYXhfcGFydCk7CiAKKwkJLyoKKwkJICogQWRqdXN0IG1heF9wYXJ0IGFjY29yZGluZyB0byBwYXJ0X3NoaWZ0IGFzIGl0IGlzIGV4cG9ydGVkCisJCSAqIHRvIHVzZXIgc3BhY2Ugc28gdGhhdCB1c2VyIGNhbiBrbm93IHRoZSBtYXggbnVtYmVyIG9mCisJCSAqIHBhcnRpdGlvbiBrZXJuZWwgc2hvdWxkIGJlIGFibGUgdG8gbWFuYWdlLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgLTEgaXMgcmVxdWlyZWQgYmVjYXVzZSBwYXJ0aXRpb24gMCBpcyByZXNlcnZlZAorCQkgKiBmb3IgdGhlIHdob2xlIGRpc2suCisJCSAqLworCQltYXhfcGFydCA9ICgxVUwgPDwgcGFydF9zaGlmdCkgLSAxOworCX0KKworCWlmICgoMVVMIDw8IHBhcnRfc2hpZnQpID4gRElTS19NQVhfUEFSVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5iZHNfbWF4ID4gMVVMIDw8IChNSU5PUkJJVFMgLSBwYXJ0X3NoaWZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlmb3IgKGkgPSAwOyBpIDwgbmJkc19tYXg7IGkrKykgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGFsbG9jX2Rpc2soMSA8PCBwYXJ0X3NoaWZ0KTsKIAkJaWYgKCFkaXNrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYwppbmRleCBhMGFhYmQ5Li40NmI4MTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYwpAQCAtMzIxLDcgKzMyMSw2IEBACiAJCXN0cmNweShkaXNrLT5kaXNrX25hbWUsIGNkLT5uYW1lKTsJLyogdW1tLi4uICovCiAJCWRpc2stPmZvcHMgPSAmcGNkX2Jkb3BzOwogCQlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFOwotCQlkaXNrLT5ldmVudHMgPSBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKaW5kZXggNmVjZjg5Yy4uMDc5YzA4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKQEAgLTYsMTAgKzYsMTMgQEAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fYmxrLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKICNkZWZpbmUgUEFSVF9CSVRTIDQKIAogc3RhdGljIGludCBtYWpvciwgaW5kZXg7CitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdmlydGJsa193cTsKIAogc3RydWN0IHZpcnRpb19ibGsKIHsKQEAgLTI2LDYgKzI5LDkgQEAKIAogCW1lbXBvb2xfdCAqcG9vbDsKIAorCS8qIFByb2Nlc3MgY29udGV4dCBmb3IgY29uZmlnIHNwYWNlIHVwZGF0ZXMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29uZmlnX3dvcms7CisKIAkvKiBXaGF0IGhvc3QgdGVsbHMgdXMsIHBsdXMgMiBmb3IgaGVhZGVyICYgdGFpbGVyLiAqLwogCXVuc2lnbmVkIGludCBzZ19lbGVtczsKIApAQCAtMTQxLDcgKzE0Nyw3IEBACiAJbnVtID0gYmxrX3JxX21hcF9zZyhxLCB2YnItPnJlcSwgdmJsay0+c2cgKyBvdXQpOwogCiAJaWYgKHZici0+cmVxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9CTE9DS19QQykgewotCQlzZ19zZXRfYnVmKCZ2YmxrLT5zZ1tudW0gKyBvdXQgKyBpbisrXSwgdmJyLT5yZXEtPnNlbnNlLCA5Nik7CisJCXNnX3NldF9idWYoJnZibGstPnNnW251bSArIG91dCArIGluKytdLCB2YnItPnJlcS0+c2Vuc2UsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CiAJCXNnX3NldF9idWYoJnZibGstPnNnW251bSArIG91dCArIGluKytdLCAmdmJyLT5pbl9oZHIsCiAJCQkgICBzaXplb2YodmJyLT5pbl9oZHIpKTsKIAl9CkBAIC0yOTEsNiArMjk3LDQ2IEBACiB9CiBERVZJQ0VfQVRUUihzZXJpYWwsIFNfSVJVR08sIHZpcnRibGtfc2VyaWFsX3Nob3csIE5VTEwpOwogCitzdGF0aWMgdm9pZCB2aXJ0YmxrX2NvbmZpZ19jaGFuZ2VkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2aXJ0aW9fYmxrLCBjb25maWdfd29yayk7CisJc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYgPSB2YmxrLT52ZGV2OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gdmJsay0+ZGlzay0+cXVldWU7CisJY2hhciBjYXBfc3RyXzJbMTBdLCBjYXBfc3RyXzEwWzEwXTsKKwl1NjQgY2FwYWNpdHksIHNpemU7CisKKwkvKiBIb3N0IG11c3QgYWx3YXlzIHNwZWNpZnkgdGhlIGNhcGFjaXR5LiAqLworCXZkZXYtPmNvbmZpZy0+Z2V0KHZkZXYsIG9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fYmxrX2NvbmZpZywgY2FwYWNpdHkpLAorCQkJICAmY2FwYWNpdHksIHNpemVvZihjYXBhY2l0eSkpOworCisJLyogSWYgY2FwYWNpdHkgaXMgdG9vIGJpZywgdHJ1bmNhdGUgd2l0aCB3YXJuaW5nLiAqLworCWlmICgoc2VjdG9yX3QpY2FwYWNpdHkgIT0gY2FwYWNpdHkpIHsKKwkJZGV2X3dhcm4oJnZkZXYtPmRldiwgIkNhcGFjaXR5ICVsbHUgdG9vIGxhcmdlOiB0cnVuY2F0aW5nXG4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpY2FwYWNpdHkpOworCQljYXBhY2l0eSA9IChzZWN0b3JfdCktMTsKKwl9CisKKwlzaXplID0gY2FwYWNpdHkgKiBxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUocSk7CisJc3RyaW5nX2dldF9zaXplKHNpemUsIFNUUklOR19VTklUU18yLCBjYXBfc3RyXzIsIHNpemVvZihjYXBfc3RyXzIpKTsKKwlzdHJpbmdfZ2V0X3NpemUoc2l6ZSwgU1RSSU5HX1VOSVRTXzEwLCBjYXBfc3RyXzEwLCBzaXplb2YoY2FwX3N0cl8xMCkpOworCisJZGV2X25vdGljZSgmdmRldi0+ZGV2LAorCQkgICJuZXcgc2l6ZTogJWxsdSAlZC1ieXRlIGxvZ2ljYWwgYmxvY2tzICglcy8lcylcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyljYXBhY2l0eSwKKwkJICBxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUocSksCisJCSAgY2FwX3N0cl8xMCwgY2FwX3N0cl8yKTsKKworCXNldF9jYXBhY2l0eSh2YmxrLT5kaXNrLCBjYXBhY2l0eSk7Cit9CisKK3N0YXRpYyB2b2lkIHZpcnRibGtfY29uZmlnX2NoYW5nZWQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19ibGsgKnZibGsgPSB2ZGV2LT5wcml2OworCisJcXVldWVfd29yayh2aXJ0YmxrX3dxLCAmdmJsay0+Y29uZmlnX3dvcmspOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB2aXJ0YmxrX3Byb2JlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewogCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrOwpAQCAtMzI3LDYgKzM3Myw3IEBACiAJdmJsay0+dmRldiA9IHZkZXY7CiAJdmJsay0+c2dfZWxlbXMgPSBzZ19lbGVtczsKIAlzZ19pbml0X3RhYmxlKHZibGstPnNnLCB2YmxrLT5zZ19lbGVtcyk7CisJSU5JVF9XT1JLKCZ2YmxrLT5jb25maWdfd29yaywgdmlydGJsa19jb25maWdfY2hhbmdlZF93b3JrKTsKIAogCS8qIFdlIGV4cGVjdCBvbmUgdmlydHF1ZXVlLCBmb3Igb3V0cHV0LiAqLwogCXZibGstPnZxID0gdmlydGlvX2ZpbmRfc2luZ2xlX3ZxKHZkZXYsIGJsa19kb25lLCAicmVxdWVzdHMiKTsKQEAgLTQ3Nyw2ICs1MjQsOCBAQAogewogCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrID0gdmRldi0+cHJpdjsKIAorCWZsdXNoX3dvcmsoJnZibGstPmNvbmZpZ193b3JrKTsKKwogCS8qIE5vdGhpbmcgc2hvdWxkIGJlIHBlbmRpbmcuICovCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZ2YmxrLT5yZXFzKSk7CiAKQEAgLTUwOCwyNyArNTU3LDQ3IEBACiAgKiBVc2UgX19yZWZkYXRhIHRvIGF2b2lkIHRoaXMgd2FybmluZy4KICAqLwogc3RhdGljIHN0cnVjdCB2aXJ0aW9fZHJpdmVyIF9fcmVmZGF0YSB2aXJ0aW9fYmxrID0gewotCS5mZWF0dXJlX3RhYmxlID0gZmVhdHVyZXMsCi0JLmZlYXR1cmVfdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoZmVhdHVyZXMpLAotCS5kcml2ZXIubmFtZSA9CUtCVUlMRF9NT0ROQU1FLAotCS5kcml2ZXIub3duZXIgPQlUSElTX01PRFVMRSwKLQkuaWRfdGFibGUgPQlpZF90YWJsZSwKLQkucHJvYmUgPQl2aXJ0YmxrX3Byb2JlLAotCS5yZW1vdmUgPQlfX2RldmV4aXRfcCh2aXJ0YmxrX3JlbW92ZSksCisJLmZlYXR1cmVfdGFibGUJCT0gZmVhdHVyZXMsCisJLmZlYXR1cmVfdGFibGVfc2l6ZQk9IEFSUkFZX1NJWkUoZmVhdHVyZXMpLAorCS5kcml2ZXIubmFtZQkJPSBLQlVJTERfTU9ETkFNRSwKKwkuZHJpdmVyLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZF90YWJsZQkJPSBpZF90YWJsZSwKKwkucHJvYmUJCQk9IHZpcnRibGtfcHJvYmUsCisJLnJlbW92ZQkJCT0gX19kZXZleGl0X3AodmlydGJsa19yZW1vdmUpLAorCS5jb25maWdfY2hhbmdlZAkJPSB2aXJ0YmxrX2NvbmZpZ19jaGFuZ2VkLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogeworCWludCBlcnJvcjsKKworCXZpcnRibGtfd3EgPSBhbGxvY193b3JrcXVldWUoInZpcnRpby1ibGsiLCAwLCAwKTsKKwlpZiAoIXZpcnRibGtfd3EpCisJCXJldHVybiAtRU5PTUVNOworCiAJbWFqb3IgPSByZWdpc3Rlcl9ibGtkZXYoMCwgInZpcnRibGsiKTsKLQlpZiAobWFqb3IgPCAwKQotCQlyZXR1cm4gbWFqb3I7Ci0JcmV0dXJuIHJlZ2lzdGVyX3ZpcnRpb19kcml2ZXIoJnZpcnRpb19ibGspOworCWlmIChtYWpvciA8IDApIHsKKwkJZXJyb3IgPSBtYWpvcjsKKwkJZ290byBvdXRfZGVzdHJveV93b3JrcXVldWU7CisJfQorCisJZXJyb3IgPSByZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fYmxrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfYmxrZGV2OworCXJldHVybiAwOworCitvdXRfdW5yZWdpc3Rlcl9ibGtkZXY6CisJdW5yZWdpc3Rlcl9ibGtkZXYobWFqb3IsICJ2aXJ0YmxrIik7CitvdXRfZGVzdHJveV93b3JrcXVldWU6CisJZGVzdHJveV93b3JrcXVldWUodmlydGJsa193cSk7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewogCXVucmVnaXN0ZXJfYmxrZGV2KG1ham9yLCAidmlydGJsayIpOwogCXVucmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX2Jsayk7CisJZGVzdHJveV93b3JrcXVldWUodmlydGJsa193cSk7CiB9CiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYwppbmRleCBjNzM5MTBjLi41Y2YyOTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYwpAQCAtODA5LDExICs4MDksMTMgQEAKICBmYWlsZWRfaW5pdDoKIAlrZnJlZShibGtiay0+cGVuZGluZ19yZXFzKTsKIAlrZnJlZShibGtiay0+cGVuZGluZ19ncmFudF9oYW5kbGVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbW1hcF9wYWdlczsgaSsrKSB7Ci0JCWlmIChibGtiay0+cGVuZGluZ19wYWdlc1tpXSkKLQkJCV9fZnJlZV9wYWdlKGJsa2JrLT5wZW5kaW5nX3BhZ2VzW2ldKTsKKwlpZiAoYmxrYmstPnBlbmRpbmdfcGFnZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1tYXBfcGFnZXM7IGkrKykgeworCQkJaWYgKGJsa2JrLT5wZW5kaW5nX3BhZ2VzW2ldKQorCQkJCV9fZnJlZV9wYWdlKGJsa2JrLT5wZW5kaW5nX3BhZ2VzW2ldKTsKKwkJfQorCQlrZnJlZShibGtiay0+cGVuZGluZ19wYWdlcyk7CiAJfQotCWtmcmVlKGJsa2JrLT5wZW5kaW5nX3BhZ2VzKTsKIAlrZnJlZShibGtiayk7CiAJYmxrYmsgPSBOVUxMOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jCmluZGV4IDM0NTcwODIuLjZjYzBkYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYwpAQCAtMzU3LDE0ICszNTcsMTMgQEAKIAl9CiAKIAl2YmQtPmJkZXYgPSBiZGV2OwotCXZiZC0+c2l6ZSA9IHZiZF9zeih2YmQpOwotCiAJaWYgKHZiZC0+YmRldi0+YmRfZGlzayA9PSBOVUxMKSB7CiAJCURQUklOVEsoInhlbl92YmRfY3JlYXRlOiBkZXZpY2UgJTA4eCBkb2Vzbid0IGV4aXN0LlxuIiwKIAkJCXZiZC0+cGRldmljZSk7CiAJCXhlbl92YmRfZnJlZSh2YmQpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CisJdmJkLT5zaXplID0gdmJkX3N6KHZiZCk7CiAKIAlpZiAodmJkLT5iZGV2LT5iZF9kaXNrLT5mbGFncyAmIEdFTkhEX0ZMX0NEIHx8IGNkcm9tKQogCQl2YmQtPnR5cGUgfD0gVkRJU0tfQ0RST007CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZGVidWdmcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2RlYnVnZnMuYwppbmRleCBmZDYzMDViLi44ZWNmNGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kZWJ1Z2ZzLmMKQEAgLTY0LDYgKzY0LDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmhzY2ZnY21kID0gcmVzdWx0OwogCkBAIC0xMDgsNiArMTEwLDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LnBzbW9kZSA9IHJlc3VsdDsKIApAQCAtMTQ3LDYgKzE1MSw4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmcmVzdWx0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcHJpdi0+YnRtcnZsX2Rldi5wc2NtZCA9IHJlc3VsdDsKIApAQCAtMTkxLDYgKzE5Nyw4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDE2LCAmcmVzdWx0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcHJpdi0+YnRtcnZsX2Rldi5ncGlvX2dhcCA9IHJlc3VsdDsKIApAQCAtMjMwLDYgKzIzOCw4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmcmVzdWx0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcHJpdi0+YnRtcnZsX2Rldi5oc2NtZCA9IHJlc3VsdDsKIAlpZiAocHJpdi0+YnRtcnZsX2Rldi5oc2NtZCkgewpAQCAtMjcyLDYgKzI4Miw4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmcmVzdWx0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcHJpdi0+YnRtcnZsX2Rldi5oc21vZGUgPSByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKaW5kZXggYjNmMDE5OS4uNDhhZDJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKQEAgLTM1NSwyOSArMzU1LDI0IEBACiAgKiAgICAgICAgICAgICBmbGFncyAgICAgICAgcG9pbnRlciB0byBmbGFncyBmb3IgZGF0YQogICogICAgICAgICAgICAgY291bnQgICAgICAgIGNvdW50IG9mIHJlY2VpdmVkIGRhdGEgaW4gYnl0ZXMKICAqICAgICAKLSAqIFJldHVybiBWYWx1ZTogICAgTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkCisgKiBSZXR1cm4gVmFsdWU6ICAgIE5vbmUKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBoY2lfdWFydF90dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1OCAqZGF0YSwgY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGhjaV91YXJ0X3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHU4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQogewogCXN0cnVjdCBoY2lfdWFydCAqaHUgPSAodm9pZCAqKXR0eS0+ZGlzY19kYXRhOwotCWludCByZWNlaXZlZDsKIAogCWlmICghaHUgfHwgdHR5ICE9IGh1LT50dHkpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncykpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm47CiAKIAlzcGluX2xvY2soJmh1LT5yeF9sb2NrKTsKLQlyZWNlaXZlZCA9IGh1LT5wcm90by0+cmVjdihodSwgKHZvaWQgKikgZGF0YSwgY291bnQpOwotCWlmIChyZWNlaXZlZCA+IDApCi0JCWh1LT5oZGV2LT5zdGF0LmJ5dGVfcnggKz0gcmVjZWl2ZWQ7CisJaHUtPnByb3RvLT5yZWN2KGh1LCAodm9pZCAqKSBkYXRhLCBjb3VudCk7CisJaHUtPmhkZXYtPnN0YXQuYnl0ZV9yeCArPSBjb3VudDsKIAlzcGluX3VubG9jaygmaHUtPnJ4X2xvY2spOwogCiAJdHR5X3VudGhyb3R0bGUodHR5KTsKLQotCXJldHVybiByZWNlaXZlZDsKIH0KIAogc3RhdGljIGludCBoY2lfdWFydF9yZWdpc3Rlcl9kZXYoc3RydWN0IGhjaV91YXJ0ICpodSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYyBiL2RyaXZlcnMvY2Ryb20vdmlvY2QuYwppbmRleCBhZTE1YTRkLi43ODc4ZGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKKysrIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCkBAIC02MjcsNyArNjI3LDYgQEAKIAlnZW5kaXNrLT5mb3BzID0gJnZpb2NkX2ZvcHM7CiAJZ2VuZGlzay0+ZmxhZ3MgPSBHRU5IRF9GTF9DRCB8IEdFTkhEX0ZMX1JFTU9WQUJMRSB8CiAJCQkgR0VOSERfRkxfQkxPQ0tfRVZFTlRTX09OX0VYQ0xfV1JJVEU7Ci0JZ2VuZGlzay0+ZXZlbnRzID0gRElTS19FVkVOVF9NRURJQV9DSEFOR0U7CiAJc2V0X2NhcGFjaXR5KGdlbmRpc2ssIDApOwogCWdlbmRpc2stPnByaXZhdGVfZGF0YSA9IGQ7CiAJZC0+dmlvY2RfZGlzayA9IGdlbmRpc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaAppbmRleCA5OTk4MDNjLi41ZGE2N2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmgKQEAgLTkwLDkgKzkwLDEwIEBACiAjZGVmaW5lIEc0eF9HTUNIX1NJWkVfTUFTSwkoMHhmIDw8IDgpCiAjZGVmaW5lIEc0eF9HTUNIX1NJWkVfMU0JKDB4MSA8PCA4KQogI2RlZmluZSBHNHhfR01DSF9TSVpFXzJNCSgweDMgPDwgOCkKLSNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8xTQkoMHg5IDw8IDgpCi0jZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMV81TQkoMHhhIDw8IDgpCi0jZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMk0JKDB4YyA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUX0VOCSgweDggPDwgOCkKKyNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8xTQkoRzR4X0dNQ0hfU0laRV8xTSB8IEc0eF9HTUNIX1NJWkVfVlRfRU4pCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMV81TQkoKDB4MiA8PCA4KSB8IEc0eF9HTUNIX1NJWkVfVlRfRU4pCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMk0JKEc0eF9HTUNIX1NJWkVfMk0gfCBHNHhfR01DSF9TSVpFX1ZUX0VOKQogCiAjZGVmaW5lIEdGWF9GTFNIX0NOVEwJCTB4MjE3MCAvKiA5MTUrICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ocGV0LmMgYi9kcml2ZXJzL2NoYXIvaHBldC5jCmluZGV4IDA1MTQ3NGMuLjM0ZDZhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ocGV0LmMKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtMTYzLDExICsxNjMsMzIgQEAKIAkgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHRyZWF0aW5nIG5vbi1wZXJpb2RpYyBsaWtlIHBlcmlvZGljLgogCSAqLwogCWlmICgoZGV2cC0+aGRfZmxhZ3MgJiAoSFBFVF9JRSB8IEhQRVRfUEVSSU9ESUMpKSA9PSBIUEVUX0lFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbSwgdDsKKwkJdW5zaWduZWQgbG9uZyBtLCB0LCBtYywgYmFzZSwgazsKKwkJc3RydWN0IGhwZXQgX19pb21lbSAqaHBldCA9IGRldnAtPmhkX2hwZXQ7CisJCXN0cnVjdCBocGV0cyAqaHBldHAgPSBkZXZwLT5oZF9ocGV0czsKIAogCQl0ID0gZGV2cC0+aGRfaXJlcWZyZXE7CiAJCW0gPSByZWFkX2NvdW50ZXIoJmRldnAtPmhkX3RpbWVyLT5ocGV0X2NvbXBhcmUpOwotCQl3cml0ZV9jb3VudGVyKHQgKyBtLCAmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7CisJCW1jID0gcmVhZF9jb3VudGVyKCZocGV0LT5ocGV0X21jKTsKKwkJLyogVGhlIHRpbWUgZm9yIHRoZSBuZXh0IGludGVycnVwdCB3b3VsZCBsb2dpY2FsbHkgYmUgdCArIG0sCisJCSAqIGhvd2V2ZXIsIGlmIHdlIGFyZSB2ZXJ5IHVubHVja3kgYW5kIHRoZSBpbnRlcnJ1cHQgaXMgZGVsYXllZAorCQkgKiBmb3IgbG9uZ2VyIHRoYW4gdCB0aGVuIHdlIHdpbGwgY29tcGxldGVseSBtaXNzIHRoZSBuZXh0CisJCSAqIGludGVycnVwdCBpZiB3ZSBzZXQgdCArIG0gYW5kIGFuIGFwcGxpY2F0aW9uIHdpbGwgaGFuZy4KKwkJICogVGhlcmVmb3JlIHdlIG5lZWQgdG8gbWFrZSBhIG1vcmUgY29tcGxleCBjb21wdXRhdGlvbiBhc3N1bWluZworCQkgKiB0aGF0IHRoZXJlIGV4aXN0cyBhIGsgZm9yIHdoaWNoIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKwkJICogayAqIHQgKyBiYXNlIDwgbWMgKyBkZWx0YQorCQkgKiAoayArIDEpICogdCArIGJhc2UgPiBtYyArIGRlbHRhCisJCSAqIHdoZXJlIHQgaXMgdGhlIGludGVydmFsIGluIGhwZXQgdGlja3MgZm9yIHRoZSBnaXZlbiBmcmVxLAorCQkgKiBiYXNlIGlzIHRoZSB0aGVvcmV0aWNhbCBzdGFydCB2YWx1ZSAwIDwgYmFzZSA8IHQsCisJCSAqIG1jIGlzIHRoZSBtYWluIGNvdW50ZXIgdmFsdWUgYXQgdGhlIHRpbWUgb2YgdGhlIGludGVycnVwdCwKKwkJICogZGVsdGEgaXMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gd3JpdGUgdGhlIGEgdmFsdWUgdG8gdGhlCisJCSAqIGNvbXBhcmF0b3IuCisJCSAqIGsgbWF5IHRoZW4gYmUgY29tcHV0ZWQgYXMgKG1jIC0gYmFzZSArIGRlbHRhKSAvIHQgLgorCQkgKi8KKwkJYmFzZSA9IG1jICUgdDsKKwkJayA9IChtYyAtIGJhc2UgKyBocGV0cC0+aHBfZGVsdGEpIC8gdDsKKwkJd3JpdGVfY291bnRlcih0ICogKGsgKyAxKSArIGJhc2UsCisJCQkgICAgICAmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7CiAJfQogCiAJaWYgKGRldnAtPmhkX2ZsYWdzICYgSFBFVF9TSEFSRURfSVJRKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwppbmRleCA4Mzg1NjhhLi5mYjY4YjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwpAQCAtMTY3NywxNyArMTY3NywxMiBAQAogCXBvcnRkZXYtPmNvbmZpZy5tYXhfbnJfcG9ydHMgPSAxOwogCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX0NPTlNPTEVfRl9NVUxUSVBPUlQpKSB7CiAJCW11bHRpcG9ydCA9IHRydWU7Ci0JCXZkZXYtPmZlYXR1cmVzWzBdIHw9IDEgPDwgVklSVElPX0NPTlNPTEVfRl9NVUxUSVBPUlQ7Ci0KIAkJdmRldi0+Y29uZmlnLT5nZXQodmRldiwgb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbmZpZywKIAkJCQkJCSBtYXhfbnJfcG9ydHMpLAogCQkJCSAgJnBvcnRkZXYtPmNvbmZpZy5tYXhfbnJfcG9ydHMsCiAJCQkJICBzaXplb2YocG9ydGRldi0+Y29uZmlnLm1heF9ucl9wb3J0cykpOwogCX0KIAotCS8qIExldCB0aGUgSG9zdCBrbm93IHdlIHN1cHBvcnQgbXVsdGlwbGUgcG9ydHMuKi8KLQl2ZGV2LT5jb25maWctPmZpbmFsaXplX2ZlYXR1cmVzKHZkZXYpOwotCiAJZXJyID0gaW5pdF92cXMocG9ydGRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycigmdmRldi0+ZGV2LCAiRXJyb3IgJWQgaW5pdGlhbGl6aW5nIHZxc1xuIiwgZXJyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jCmluZGV4IDAzNmU1ODYuLmRjN2MwMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CkBAIC0xNTMsMTIgKzE1MiwxMCBAQAogewogCWludCByZXQ7CiAKLQkvKiB3YWtlIHVwIGRldmljZSBhbmQgZW5hYmxlIGNsb2NrICovCi0JcG1fcnVudGltZV9nZXRfc3luYygmcC0+cGRldi0+ZGV2KTsKKwkvKiBlbmFibGUgY2xvY2sgKi8KIAlyZXQgPSBjbGtfZW5hYmxlKHAtPmNsayk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwLT5wZGV2LT5kZXYsICJjYW5ub3QgZW5hYmxlIGNsb2NrXG4iKTsKLQkJcG1fcnVudGltZV9wdXRfc3luYygmcC0+cGRldi0+ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE5MCw5ICsxODcsOCBAQAogCS8qIGRpc2FibGUgaW50ZXJydXB0cyBpbiBDTVQgYmxvY2sgKi8KIAlzaF9jbXRfd3JpdGUocCwgQ01DU1IsIDApOwogCi0JLyogc3RvcCBjbG9jayBhbmQgbWFyayBkZXZpY2UgYXMgaWRsZSAqLworCS8qIHN0b3AgY2xvY2sgKi8KIAljbGtfZGlzYWJsZShwLT5jbGspOwotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnAtPnBkZXYtPmRldik7CiB9CiAKIC8qIHByaXZhdGUgZmxhZ3MgKi8KQEAgLTY2NCw3ICs2NjAsNiBAQAogCiAJaWYgKHApIHsKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgImtlcHQgYXMgZWFybHl0aW1lclxuIik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY3OSw5ICs2NzQsNiBAQAogCQlrZnJlZShwKTsKIAkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJfQotCi0JaWYgKCFpc19lYXJseV9wbGF0Zm9ybV9kZXZpY2UocGRldikpCi0JCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfdG11LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jCmluZGV4IDE3Mjk2MjguLjgwODEzNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfdG11LmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KQEAgLTExMCwxMiArMTA5LDEwIEBACiB7CiAJaW50IHJldDsKIAotCS8qIHdha2UgdXAgZGV2aWNlIGFuZCBlbmFibGUgY2xvY2sgKi8KLQlwbV9ydW50aW1lX2dldF9zeW5jKCZwLT5wZGV2LT5kZXYpOworCS8qIGVuYWJsZSBjbG9jayAqLwogCXJldCA9IGNsa19lbmFibGUocC0+Y2xrKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnAtPnBkZXYtPmRldiwgImNhbm5vdCBlbmFibGUgY2xvY2tcbiIpOwotCQlwbV9ydW50aW1lX3B1dF9zeW5jKCZwLT5wZGV2LT5kZXYpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTQ0LDkgKzE0MSw4IEBACiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGluIFRNVSBibG9jayAqLwogCXNoX3RtdV93cml0ZShwLCBUQ1IsIDB4MDAwMCk7CiAKLQkvKiBzdG9wIGNsb2NrIGFuZCBtYXJrIGRldmljZSBhcyBpZGxlICovCisJLyogc3RvcCBjbG9jayAqLwogCWNsa19kaXNhYmxlKHAtPmNsayk7Ci0JcG1fcnVudGltZV9wdXRfc3luYygmcC0+cGRldi0+ZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgc2hfdG11X3NldF9uZXh0KHN0cnVjdCBzaF90bXVfcHJpdiAqcCwgdW5zaWduZWQgbG9uZyBkZWx0YSwKQEAgLTQxNSw3ICs0MTEsNiBAQAogCiAJaWYgKHApIHsKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgImtlcHQgYXMgZWFybHl0aW1lclxuIik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQzMCw5ICs0MjUsNiBAQAogCQlrZnJlZShwKTsKIAkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJfQotCi0JaWYgKCFpc19lYXJseV9wbGF0Zm9ybV9kZXZpY2UocGRldikpCi0JCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKaW5kZXggMjE5ZDg4YS4uZGRlNmEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKQEAgLTEzOSw2ICsxMzksNyBAQAogCXNwaW5fdW5sb2NrX2JoKCZkZXYtPmNiZGV2LT5xdWV1ZV9sb2NrKTsKIAogCWlmIChjYnEgIT0gTlVMTCkgeworCQllcnIgPSAwOwogCQljYnEtPmNhbGxiYWNrKG1zZywgbnNwKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWNuX3F1ZXVlX3JlbGVhc2VfY2FsbGJhY2soY2JxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCA0ZTA0ZTEyLi41OTZkNWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC03NTksNyArNzU5LDcgQEAKIAogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOwogCi0JZnJlZV9wZXJjcHUoYWNwaV9wZXJmX2RhdGEpOworCWZyZWVfYWNwaV9wZXJmX2RhdGEoKTsKIH0KIAogbW9kdWxlX3BhcmFtKGFjcGlfcHN0YXRlX3N0cmljdCwgdWludCwgMDY0NCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwppbmRleCBiNjBhNGMyLi5mYWY3YzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKQEAgLTI5OCwxMSArMjk4LDEzIEBACiAJb2xkX2luZGV4ID0gc3RhdC0+bGFzdF9pbmRleDsKIAluZXdfaW5kZXggPSBmcmVxX3RhYmxlX2dldF9pbmRleChzdGF0LCBmcmVxLT5uZXcpOwogCi0JY3B1ZnJlcV9zdGF0c191cGRhdGUoZnJlcS0+Y3B1KTsKLQlpZiAob2xkX2luZGV4ID09IG5ld19pbmRleCkKKwkvKiBXZSBjYW4ndCBkbyBzdGF0LT50aW1lX2luX3N0YXRlWy0xXT0gLi4gKi8KKwlpZiAob2xkX2luZGV4ID09IC0xIHx8IG5ld19pbmRleCA9PSAtMSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAob2xkX2luZGV4ID09IC0xIHx8IG5ld19pbmRleCA9PSAtMSkKKwljcHVmcmVxX3N0YXRzX3VwZGF0ZShmcmVxLT5jcHUpOworCisJaWYgKG9sZF9pbmRleCA9PSBuZXdfaW5kZXgpCiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZjcHVmcmVxX3N0YXRzX2xvY2spOwpAQCAtMzg3LDYgKzM4OSw3IEBACiAJdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdWZyZXFfc3RhdF9jcHVfbm90aWZpZXIpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWNwdWZyZXFfc3RhdHNfZnJlZV90YWJsZShjcHUpOworCQljcHVmcmVxX3N0YXRzX2ZyZWVfc3lzZnMoY3B1KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jIGIvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggODM0NzliNi4uYmNlNTc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKQEAgLTEwNzksNiArMTA3OSw5IEBACiAJfQogCiAJcmVzID0gdHJhbnNpdGlvbl9maWRfdmlkKGRhdGEsIGZpZCwgdmlkKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCiAJZnJlcXMubmV3ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChkYXRhLT5jdXJyZmlkKTsKIAogCWZvcl9lYWNoX2NwdShpLCBkYXRhLT5hdmFpbGFibGVfY29yZXMpIHsKQEAgLTExMDEsNyArMTEwNCw4IEBACiAJLyogZ2V0IE1TUiBpbmRleCBmb3IgaGFyZHdhcmUgcHN0YXRlIHRyYW5zaXRpb24gKi8KIAlwc3RhdGUgPSBpbmRleCAmIEhXX1BTVEFURV9NQVNLOwogCWlmIChwc3RhdGUgPiBkYXRhLT5tYXhfaHdfcHN0YXRlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlmcmVxcy5vbGQgPSBmaW5kX2toel9mcmVxX2Zyb21fcHN0YXRlKGRhdGEtPnBvd2Vybm93X3RhYmxlLAogCQkJZGF0YS0+Y3VycnBzdGF0ZSk7CiAJZnJlcXMubmV3ID0gZmluZF9raHpfZnJlcV9mcm9tX3BzdGF0ZShkYXRhLT5wb3dlcm5vd190YWJsZSwgcHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWFsZy5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKaW5kZXggZDBlNjVkNi4uNjc2ZDk1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKQEAgLTIzOCw5ICsyMzgsOSBAQAogCiAJLyogYnVpbGQgc2hhcmVkIGRlc2NyaXB0b3IgZm9yIHRoaXMgc2Vzc2lvbiAqLwogCXNoX2Rlc2MgPSBrbWFsbG9jKENBQU1fQ01EX1NaICogREVTQ19BRUFEX1NIQVJFRF9URVhUX0xFTiArCi0JCQkgIGtleXNfZml0X2lubGluZSA/Ci0JCQkgIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBjdHgtPmVuY2tleWxlbiA6Ci0JCQkgIENBQU1fUFRSX1NaICogMiwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCQkJICAoa2V5c19maXRfaW5saW5lID8KKwkJCSAgIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBjdHgtPmVuY2tleWxlbiA6CisJCQkgICBDQUFNX1BUUl9TWiAqIDIpLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzaF9kZXNjKSB7CiAJCWRldl9lcnIoanJkZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgc2hhcmVkIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoZG1hLmMgYi9kcml2ZXJzL2RtYS9zaGRtYS5jCmluZGV4IDYzNmU0MDkuLjAyODMzMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3NoZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvc2hkbWEuYwpAQCAtMzQzLDcgKzM0Myw3IEBACiAKIAkJZG1hZV9zZXRfZG1hcnMoc2hfY2hhbiwgY2ZnLT5taWRfcmlkKTsKIAkJZG1hZV9zZXRfY2hjcihzaF9jaGFuLCBjZmctPmNoY3IpOwotCX0gZWxzZSBpZiAoKHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgQ0hDUikgJiAweGYwMCkgIT0gMHg0MDApIHsKKwl9IGVsc2UgewogCQlkbWFlX2luaXQoc2hfY2hhbik7CiAJfQogCkBAIC0xMTQ0LDYgKzExNDQsOCBAQAogCS8qIHBsYXRmb3JtIGRhdGEgKi8KIAlzaGRldi0+cGRhdGEgPSBwZGF0YTsKIAorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNoZGV2KTsKKwogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CiAKQEAgLTEyMTksNiArMTIyMSwxMSBAQAogCX0gZWxzZSB7CiAJCWRvIHsKIAkJCWZvciAoaSA9IGNoYW5pcnFfcmVzLT5zdGFydDsgaSA8PSBjaGFuaXJxX3Jlcy0+ZW5kOyBpKyspIHsKKwkJCQlpZiAoaXJxX2NudCA+PSBTSF9ETUFDX01BWF9DSEFOTkVMUykgeworCQkJCQlpcnFfY2FwID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCiAJCQkJaWYgKChlcnJpcnFfcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUykgPT0KIAkJCQkgICAgSU9SRVNPVVJDRV9JUlFfU0hBUkVBQkxFKQogCQkJCQljaGFuX2ZsYWdbaXJxX2NudF0gPSBJUlFGX1NIQVJFRDsKQEAgLTEyMjgsMTUgKzEyMzUsMTEgQEAKIAkJCQkJIkZvdW5kIElSUSAlZCBmb3IgY2hhbm5lbCAlZFxuIiwKIAkJCQkJaSwgaXJxX2NudCk7CiAJCQkJY2hhbl9pcnFbaXJxX2NudCsrXSA9IGk7Ci0KLQkJCQlpZiAoaXJxX2NudCA+PSBTSF9ETUFDX01BWF9DSEFOTkVMUykKLQkJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWlmIChpcnFfY250ID49IFNIX0RNQUNfTUFYX0NIQU5ORUxTKSB7Ci0JCQkJaXJxX2NhcCA9IDE7CisJCQlpZiAoaXJxX2NudCA+PSBTSF9ETUFDX01BWF9DSEFOTkVMUykKIAkJCQlicmVhazsKLQkJCX0KKwogCQkJY2hhbmlycV9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwKIAkJCQkJCUlPUkVTT1VSQ0VfSVJRLCArK2lycXJlcyk7CiAJCX0gd2hpbGUgKGlycV9jbnQgPCBwZGF0YS0+Y2hhbm5lbF9udW0gJiYgY2hhbmlycV9yZXMpOwpAQCAtMTI1Niw3ICsxMjU5LDYgQEAKIAogCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2hkZXYpOwogCWRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIoJnNoZGV2LT5jb21tb24pOwogCiAJcmV0dXJuIGVycjsKQEAgLTEyNzgsNiArMTI4MCw4IEBACiAKIAlpZiAoZG1hcnMpCiAJCWlvdW5tYXAoc2hkZXYtPmRtYXJzKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogZW1hcGRtYXJzOgogCWlvdW5tYXAoc2hkZXYtPmNoYW5fcmVnKTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKQEAgLTEzMTYsNiArMTMyMCw4IEBACiAJCWlvdW5tYXAoc2hkZXYtPmRtYXJzKTsKIAlpb3VubWFwKHNoZGV2LT5jaGFuX3JlZyk7CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwogCXN5bmNocm9uaXplX3JjdSgpOwogCWtmcmVlKHNoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9vaGNpLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYwppbmRleCA0MzhlNmM4Li5lYmI4OTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYwpAQCAtMjY0LDYgKzI2NCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUdFUkVfRlc2NDMJMHg1OTAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfRlcJMHgyMzgwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfVFNCMTJMVjIyCTB4ODAwOQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BJTk5BQ0xFX1NZU1RFTVMJMHgxMWJkCiAKICNkZWZpbmUgUVVJUktfQ1lDTEVfVElNRVIJCTEKICNkZWZpbmUgUVVJUktfUkVTRVRfUEFDS0VUCQkyCkBAIC0zMTkwLDYgKzMxOTEsMTEgQEAKIAlpbnQgaSwgZXJyOwogCXNpemVfdCBzaXplOwogCisJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUElOTkFDTEVfU1lTVEVNUykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIlBpbm5hY2xlIE1vdmllQm9hcmQgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKIAlvaGNpID0ga3phbGxvYyhzaXplb2YoKm9oY2kpLCBHRlBfS0VSTkVMKTsKIAlpZiAob2hjaSA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvS2NvbmZpZwppbmRleCA4NzA5NmI2Li4yZjIxYjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL0tjb25maWcKQEAgLTEzLDYgKzEzLDcgQEAKIGNvbmZpZyBHT09HTEVfU01JCiAJdHJpc3RhdGUgIlNNSSBpbnRlcmZhY2UgZm9yIEdvb2dsZSBwbGF0Zm9ybXMiCiAJZGVwZW5kcyBvbiBBQ1BJICYmIERNSQorCXNlbGVjdCBFRkkKIAlzZWxlY3QgRUZJX1ZBUlMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBTTUkgY2FsbGJhY2tzIGZvciBHb29nbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCmluZGV4IGYwMzJlNDQuLmJmZTcyMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYwpAQCAtMTA4LDcgKzEwOCw5IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgX19pbml0IGZpbmRfaWJmdF9yZWdpb24odW5zaWduZWQgbG9uZyAqc2l6ZXApCiB7CisjaWZkZWYgQ09ORklHX0FDUEkKIAlpbnQgaTsKKyNlbmRpZgogCWliZnRfYWRkciA9IE5VTEw7CiAKICNpZmRlZiBDT05GSUdfQUNQSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0YTdmNjMxLi4yOTY3MDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtODcsMzIgKzg3LDIwIEBACiAJICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBHUElPIGZ1bmN0aW9uYWxpdHkgb2YgSVQ4NzYxRSBzdXBlciBJL08gY2hpcC4KIAogY29uZmlnIEdQSU9fRVhZTk9TNAotCWJvb2wgIlNhbXN1bmcgRXh5bm9zNCBHUElPIGxpYnJhcnkgc3VwcG9ydCIKLQlkZWZhdWx0IHkgaWYgQ1BVX0VYWU5PUzQyMTAKLQlkZXBlbmRzIG9uIEFSTQotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IFNhbXN1bmcgRXh5bm9zNCBzZXJpZXMgU29DcyBHUElPIGxpYnJhcnkKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBDUFVfRVhZTk9TNDIxMAogCiBjb25maWcgR1BJT19QTEFUX1NBTVNVTkcKLQlib29sICJTYW1zdW5nIFNvQ3MgR1BJTyBsaWJyYXJ5IHN1cHBvcnQiCi0JZGVmYXVsdCB5IGlmIFNBTVNVTkdfR1BJT0xJQl80QklUCi0JZGVwZW5kcyBvbiBBUk0KLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBTYW1zdW5nIFNvQ3MgR1BJTyBsaWJyYXJ5CisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gU0FNU1VOR19HUElPTElCXzRCSVQKIAogY29uZmlnIEdQSU9fUzVQQzEwMAotCWJvb2wgIlNhbXN1bmcgUzVQQzEwMCBHUElPIGxpYnJhcnkgc3VwcG9ydCIKLQlkZWZhdWx0IHkgaWYgQ1BVX1M1UEMxMDAKLQlkZXBlbmRzIG9uIEFSTQotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IFNhbXN1bmcgUzVQQzEwMCBTb0NzIEdQSU8gbGlicmFyeQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIENQVV9TNVBDMTAwCiAKIGNvbmZpZyBHUElPX1M1UFYyMTAKLQlib29sICJTYW1zdW5nIFM1UFYyMTAvUzVQQzExMCBHUElPIGxpYnJhcnkgc3VwcG9ydCIKLQlkZWZhdWx0IHkgaWYgQ1BVX1M1UFYyMTAKLQlkZXBlbmRzIG9uIEFSTQotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IFNhbXN1bmcgUzVQVjIxMC9TNVBDMTEwIFNvQ3MgR1BJTyBsaWJyYXJ5CisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQ1BVX1M1UFYyMTAKIAogY29uZmlnIEdQSU9fUEwwNjEKIAlib29sICJQcmltZUNlbGwgUEwwNjEgR1BJTyBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tZXh5bm9zNC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZXh5bm9zNC5jCmluZGV4IGQ1NGNhNmEuLjkwMjk4MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1leHlub3M0LmMKQEAgLTIxLDE2ICsyMSwzNyBAQAogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KIAoraW50IHMzY19ncGlvX3NldHB1bGxfZXh5bm9zNChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwlpZiAocHVsbCA9PSBTM0NfR1BJT19QVUxMX1VQKQorCQlwdWxsID0gMzsKKworCXJldHVybiBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93bihjaGlwLCBvZmYsIHB1bGwpOworfQorCitzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbF9leHlub3M0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJdW5zaWduZWQgaW50IG9mZikKK3sKKwlzM2NfZ3Bpb19wdWxsX3QgcHVsbDsKKworCXB1bGwgPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93bihjaGlwLCBvZmYpOworCWlmIChwdWxsID09IDMpCisJCXB1bGwgPSBTM0NfR1BJT19QVUxMX1VQOworCisJcmV0dXJuIHB1bGw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIGdwaW9fY2ZnID0gewogCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKKwkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX2V4eW5vczQsCisJLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF9leHlub3M0LAogfTsKIAogc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmdfbm9pbnQgPSB7CiAJLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAorCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfZXh5bm9zNCwKKwkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX2V4eW5vczQsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jCmluZGV4IDQ5NjFlZjkuLjJjMjEyYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW5vbWFkaWsuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMKQEAgLTQsNiArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAwOSBTVE1pY3JvZWxlY3Ryb25pY3MKICAqIENvcHlyaWdodCAoQykgMjAwOSBBbGVzc2FuZHJvIFJ1YmluaSA8cnViaW5pQHVuaXB2Lml0PgogICogICBSZXdyaXR0ZW4gYmFzZWQgb24gd29yayBieSBQcmFmdWxsYSBXQURBU0tBUiA8cHJhZnVsbGEud2FkYXNrYXJAc3QuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExIExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTQ5LDYgKzUwLDcgQEAKIAl1MzIgKCpnZXRfc2Vjb25kYXJ5X3N0YXR1cykodW5zaWduZWQgaW50IGJhbmspOwogCXZvaWQgKCpzZXRfaW9mb3JjZSkoYm9vbCBlbmFibGUpOwogCXNwaW5sb2NrX3QgbG9jazsKKwlib29sIHNsZWVwbW9kZTsKIAkvKiBLZWVwIHRyYWNrIG9mIGNvbmZpZ3VyZWQgZWRnZXMgKi8KIAl1MzIgZWRnZV9yaXNpbmc7CiAJdTMyIGVkZ2VfZmFsbGluZzsKQEAgLTM5MywxNCArMzk1LDI1IEBACiAgKiBAZ3BpbzogcGluIG51bWJlcgogICogQG1vZGU6IE5NS19HUElPX1NMUE1fSU5QVVQgb3IgTk1LX0dQSU9fU0xQTV9OT0NIQU5HRSwKICAqCi0gKiBTZXRzIHRoZSBzbGVlcCBtb2RlIG9mIGEgcGluLiAgSWYgQG1vZGUgaXMgTk1LX0dQSU9fU0xQTV9JTlBVVCwgdGhlIHBpbiBpcwotICogY2hhbmdlZCB0byBhbiBpbnB1dCAod2l0aCBwdWxsdXAvZG93biBlbmFibGVkKSBpbiBzbGVlcCBhbmQgZGVlcCBzbGVlcC4gIElmCi0gKiBAbW9kZSBpcyBOTUtfR1BJT19TTFBNX05PQ0hBTkdFLCB0aGUgcGluIHJlbWFpbnMgaW4gdGhlIHN0YXRlIGl0IHdhcwotICogY29uZmlndXJlZCBldmVuIHdoZW4gaW4gc2xlZXAgYW5kIGRlZXAgc2xlZXAuCisgKiBUaGlzIHJlZ2lzdGVyIGlzIGFjdHVhbGx5IGluIHRoZSBwaW5tdXggbGF5ZXIsIG5vdCB0aGUgR1BJTyBibG9jayBpdHNlbGYuCisgKiBUaGUgR1BJTzFCX1NMUE0gcmVnaXN0ZXIgZGVmaW5lcyB0aGUgR1BJTyBtb2RlIHdoZW4gU0xFRVAvREVFUC1TTEVFUAorICogbW9kZSBpcyBlbnRlcmVkIChpLmUuIHdoZW4gc2lnbmFsIElPRk9SQ0UgaXMgSElHSCBieSB0aGUgcGxhdGZvcm0gY29kZSkuCisgKiBFYWNoIEdQSU8gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUgZm9yY2VkIGludG8gR1BJTyBtb2RlIHdoZW4gSU9GT1JDRSBpcworICogSElHSCwgb3ZlcnJpZGluZyB0aGUgbm9ybWFsIHNldHRpbmcgZGVmaW5lZCBieSBHUElPX0FGU0VMeCByZWdpc3RlcnMuCisgKiBXaGVuIElPRk9SQ0UgcmV0dXJucyBMT1cgKGJ5IHNvZnR3YXJlLCBhZnRlciBTTEVFUC9ERUVQLVNMRUVQIGV4aXQpLAorICogdGhlIEdQSU9zIHJldHVybiB0byB0aGUgbm9ybWFsIHNldHRpbmcgZGVmaW5lZCBieSBHUElPX0FGU0VMeCByZWdpc3RlcnMuCiAgKgotICogT24gREI4NTAwdjIgb253YXJkcywgdGhpcyBzZXR0aW5nIGxvc2VzIHRoZSBwcmV2aW91cyBtZWFuaW5nIGFuZCBpbnN0ZWFkCi0gKiBpbmRpY2F0ZXMgaWYgd2FrZXVwIGRldGVjdGlvbiBpcyBlbmFibGVkIG9uIHRoZSBwaW4uICBOb3RlIHRoYXQKLSAqIGVuYWJsZV9pcnFfd2FrZSgpIHdpbGwgYXV0b21hdGljYWxseSBlbmFibGUgd2FrZXVwIGRldGVjdGlvbi4KKyAqIElmIEBtb2RlIGlzIE5NS19HUElPX1NMUE1fSU5QVVQsIHRoZSBjb3JyZXNwb25kaW5nIEdQSU8gaXMgc3dpdGNoZWQgdG8gR1BJTworICogbW9kZSB3aGVuIHNpZ25hbCBJT0ZPUkNFIGlzIEhJR0ggKGkuZS4gd2hlbiBTTEVFUC9ERUVQLVNMRUVQIG1vZGUgaXMKKyAqIGVudGVyZWQpIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsdGZ1bmN0aW9uIHNlbGVjdGVkLiBBbHNvIHdha2UtdXAgZGV0ZWN0aW9uIGlzCisgKiBFTkFCTEVELgorICoKKyAqIElmIEBtb2RlIGlzIE5NS19HUElPX1NMUE1fTk9DSEFOR0UsIHRoZSBjb3JyZXNwb25kaW5nIEdQSU8gcmVtYWlucworICogY29udHJvbGxlZCBieSBOTUtfR1BJT19EQVRDLCBOTUtfR1BJT19EQVRTLCBOTUtfR1BJT19ESVIsIE5NS19HUElPX1BESVMKKyAqIChmb3IgYWx0ZnVuY3Rpb24gR1BJTykgb3IgcmVzcGVjdGl2ZSBvbi1jaGlwIHBlcmlwaGVyYWxzIChmb3Igb3RoZXIKKyAqIGFsdGZ1bmNzKSB3aGVuIElPRk9SQ0UgaXMgSElHSC4gQWxzbyB3YWtlLXVwIGRldGVjdGlvbiBESVNBQkxFRC4KKyAqCisgKiBOb3RlIHRoYXQgZW5hYmxlX2lycV93YWtlKCkgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSB3YWtldXAgZGV0ZWN0aW9uLgogICovCiBpbnQgbm1rX2dwaW9fc2V0X3NscG0oaW50IGdwaW8sIGVudW0gbm1rX2dwaW9fc2xwbSBtb2RlKQogewpAQCAtNTUxLDYgKzU2NCwxMiBAQAogc3RhdGljIHZvaWQgX19ubWtfZ3Bpb19zZXRfd2FrZShzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAsCiAJCQkJaW50IGdwaW8sIGJvb2wgb24pCiB7CisJaWYgKG5ta19jaGlwLT5zbGVlcG1vZGUpIHsKKwkJX19ubWtfZ3Bpb19zZXRfc2xwbShubWtfY2hpcCwgZ3BpbyAtIG5ta19jaGlwLT5jaGlwLmJhc2UsCisJCQkJICAgIG9uID8gTk1LX0dQSU9fU0xQTV9XQUtFVVBfRU5BQkxFCisJCQkJICAgIDogTk1LX0dQSU9fU0xQTV9XQUtFVVBfRElTQUJMRSk7CisJfQorCiAJX19ubWtfZ3Bpb19pcnFfbW9kaWZ5KG5ta19jaGlwLCBncGlvLCBXQUtFLCBvbik7CiB9CiAKQEAgLTkwMSw3ICs5MjAsNyBAQAogCQl3cml0ZWwoY2hpcC0+ZndpbXNjICYgY2hpcC0+cmVhbF93YWtlLAogCQkgICAgICAgY2hpcC0+YWRkciArIE5NS19HUElPX0ZXSU1TQyk7CiAKLQkJaWYgKGNwdV9pc191ODUwMHYyKCkpIHsKKwkJaWYgKGNoaXAtPnNsZWVwbW9kZSkgewogCQkJY2hpcC0+c2xwbSA9IHJlYWRsKGNoaXAtPmFkZHIgKyBOTUtfR1BJT19TTFBDKTsKIAogCQkJLyogMCAtPiB3YWtldXAgZW5hYmxlICovCkBAIC05MjMsNyArOTQyLDcgQEAKIAkJd3JpdGVsKGNoaXAtPnJ3aW1zYywgY2hpcC0+YWRkciArIE5NS19HUElPX1JXSU1TQyk7CiAJCXdyaXRlbChjaGlwLT5md2ltc2MsIGNoaXAtPmFkZHIgKyBOTUtfR1BJT19GV0lNU0MpOwogCi0JCWlmIChjcHVfaXNfdTg1MDB2MigpKQorCQlpZiAoY2hpcC0+c2xlZXBtb2RlKQogCQkJd3JpdGVsKGNoaXAtPnNscG0sIGNoaXAtPmFkZHIgKyBOTUtfR1BJT19TTFBDKTsKIAl9CiB9CkBAIC0xMDEwLDYgKzEwMjksNyBAQAogCW5ta19jaGlwLT5zZWNvbmRhcnlfcGFyZW50X2lycSA9IHNlY29uZGFyeV9pcnE7CiAJbm1rX2NoaXAtPmdldF9zZWNvbmRhcnlfc3RhdHVzID0gcGRhdGEtPmdldF9zZWNvbmRhcnlfc3RhdHVzOwogCW5ta19jaGlwLT5zZXRfaW9mb3JjZSA9IHBkYXRhLT5zZXRfaW9mb3JjZTsKKwlubWtfY2hpcC0+c2xlZXBtb2RlID0gcGRhdGEtPnN1cHBvcnRzX3NsZWVwbW9kZTsKIAlzcGluX2xvY2tfaW5pdCgmbm1rX2NoaXAtPmxvY2spOwogCiAJY2hpcCA9ICZubWtfY2hpcC0+Y2hpcDsKQEAgLTEwNjUsNSArMTA4NSwzIEBACiBNT0RVTEVfQVVUSE9SKCJQcmFmdWxsYSBXQURBU0tBUiBhbmQgQWxlc3NhbmRybyBSdWJpbmkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTm9tYWRpayBHUElPIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW9tYXAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW9tYXAuYwppbmRleCA2YzUxMTkxLi4zNWJlYmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1vbWFwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jCkBAIC00MzIsNyArNDMyLDYgQEAKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBiYW5rLT5iYXNlOwogCXUzMiBncGlvX2JpdCA9IDEgPDwgZ3BpbzsKLQl1MzIgdmFsOwogCiAJaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CiAJCU1PRF9SRUdfQklUKE9NQVA0X0dQSU9fTEVWRUxERVRFQ1QwLCBncGlvX2JpdCwKQEAgLTQ1NSwxNSArNDU0LDggQEAKIAl9CiAJaWYgKGxpa2VseSghKGJhbmstPm5vbl93YWtldXBfZ3Bpb3MgJiBncGlvX2JpdCkpKSB7CiAJCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQkJaWYgKHRyaWdnZXIgIT0gMCkKLQkJCQlfX3Jhd193cml0ZWwoMSA8PCBncGlvLCBiYW5rLT5iYXNlKwotCQkJCQkJT01BUDRfR1BJT19JUlFXQUtFTjApOwotCQkJZWxzZSB7Ci0JCQkJdmFsID0gX19yYXdfcmVhZGwoYmFuay0+YmFzZSArCi0JCQkJCQkJT01BUDRfR1BJT19JUlFXQUtFTjApOwotCQkJCV9fcmF3X3dyaXRlbCh2YWwgJiAofigxIDw8IGdwaW8pKSwgYmFuay0+YmFzZSArCi0JCQkJCQkJIE9NQVA0X0dQSU9fSVJRV0FLRU4wKTsKLQkJCX0KKwkJCU1PRF9SRUdfQklUKE9NQVA0X0dQSU9fSVJRV0FLRU4wLCBncGlvX2JpdCwKKwkJCQl0cmlnZ2VyICE9IDApOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIEdQSU8gd2FrZXVwIHJlcXVlc3QgY2FuIG9ubHkgYmUgZ2VuZXJhdGVkIG9uIGVkZ2UKQEAgLTQ3Nyw4ICs0NjksOSBAQAogCQkJCQkrIE9NQVAyNFhYX0dQSU9fQ0xFQVJXS1VFTkEpOwogCQl9CiAJfQotCS8qIFRoaXMgcGFydCBuZWVkcyB0byBiZSBleGVjdXRlZCBhbHdheXMgZm9yIE9NQVAzNHh4ICovCi0JaWYgKGNwdV9pc19vbWFwMzR4eCgpIHx8IChiYW5rLT5ub25fd2FrZXVwX2dwaW9zICYgZ3Bpb19iaXQpKSB7CisJLyogVGhpcyBwYXJ0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGFsd2F5cyBmb3IgT01BUHszNHh4LCA0NHh4fSAqLworCWlmIChjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSB8fAorCQkJKGJhbmstPm5vbl93YWtldXBfZ3Bpb3MgJiBncGlvX2JpdCkpIHsKIAkJLyoKIAkJICogTG9nIHRoZSBlZGdlIGdwaW8gYW5kIG1hbnVhbGx5IHRyaWdnZXIgdGhlIElSUQogCQkgKiBhZnRlciByZXN1bWUgaWYgdGhlIGlucHV0IGxldmVsIGNoYW5nZXMKQEAgLTExMzQsOCArMTEyNywxMSBAQAogewogCXVuc2lnbmVkIGludCBncGlvID0gZC0+aXJxIC0gSUhfR1BJT19CQVNFOwogCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAlfcmVzZXRfZ3BpbyhiYW5rLCBncGlvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdwaW9fYWNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCkBAIC0xMTUwLDkgKzExNDYsMTIgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZ3BpbyA9IGQtPmlycSAtIElIX0dQSU9fQkFTRTsKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiAJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKIAlfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgSVJRX1RZUEVfTk9ORSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBncGlvX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQpAQCAtMTE2MSw3ICsxMTYwLDkgQEAKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJdW5zaWduZWQgaW50IGlycV9tYXNrID0gMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKTsKIAl1MzIgdHJpZ2dlciA9IGlycWRfZ2V0X3RyaWdnZXJfdHlwZShkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAlpZiAodHJpZ2dlcikKIAkJX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHRyaWdnZXIpOwogCkBAIC0xMTczLDYgKzExNzQsNyBAQAogCX0KIAogCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdwaW9faXJxX2NoaXAgPSB7CkBAIC0xNTI0LDcgKzE1MjYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ3Bpb19jaGlwX2luaXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBvbWFwX2dwaW9fY2hpcF9pbml0KHN0cnVjdCBncGlvX2JhbmsgKmJhbmspCiB7CiAJaW50IGo7CiAJc3RhdGljIGludCBncGlvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2xhbmd3ZWxsX2dwaW8uYyBiL2RyaXZlcnMvZ3Bpby9sYW5nd2VsbF9ncGlvLmMKaW5kZXggYmQ2NTcxZS4uNjQ0YmExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2xhbmd3ZWxsX2dwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vbGFuZ3dlbGxfZ3Bpby5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAkJZ2VkciA9IGdwaW9fcmVnKCZsbnctPmNoaXAsIGJhc2UsIEdFRFIpOwogCQlwZW5kaW5nID0gcmVhZGwoZ2Vkcik7CiAJCXdoaWxlIChwZW5kaW5nKSB7Ci0JCQlncGlvID0gX19mZnMocGVuZGluZykgLSAxOworCQkJZ3BpbyA9IF9fZmZzKHBlbmRpbmcpOwogCQkJbWFzayA9IEJJVChncGlvKTsKIAkJCXBlbmRpbmcgJj0gfm1hc2s7CiAJCQkvKiBDbGVhciBiZWZvcmUgaGFuZGxpbmcgc28gd2UgY2FuJ3QgbG9zZSBhbiBlZGdlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vdHBzNjU5MTAtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3RwczY1OTEwLWdwaW8uYwppbmRleCA4ZDFkZGZkLi4xNTA5N2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vdHBzNjU5MTAtZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3Bpby90cHM2NTkxMC1ncGlvLmMKQEAgLTgxLDggKzgxLDEwIEBACiAJc3dpdGNoKHRwczY1OTEwX2NoaXBfaWQodHBzNjU5MTApKSB7CiAJY2FzZSBUUFM2NTkxMDoKIAkJdHBzNjU5MTAtPmdwaW8ubmdwaW8JPSA2OworCQlicmVhazsKIAljYXNlIFRQUzY1OTExOgogCQl0cHM2NTkxMC0+Z3Bpby5uZ3Bpbwk9IDk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vd204MzF4LWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jCmluZGV4IDMwOTY0NGMuLjJiY2ZiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jCkBAIC0xODAsNiArMTgwLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFdNODMxWF9HUElPX1BVTExfVVA6CiAJCQlwdWxsID0gInB1bGx1cCI7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXB1bGwgPSAiSU5WQUxJRCBQVUxMIjsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYwppbmRleCAzZTI1N2E1Li42MWUxZWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYwpAQCAtNDYsMTAgKzQ2LDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQkvKgogCQkgKiBCZWNhdXNlIHRoZSBrZXJuZWwtdXNlcnNwYWNlIEFCSSBpcyBmaXhlZCBhdCBhIDMyLWJpdCBvZmZzZXQKLQkJICogd2hpbGUgUENJIHJlc291cmNlcyBtYXkgbGl2ZSBhYm92ZSB0aGF0LCB3ZSBpZ25vcmUgdGhlIG1hcAotCQkgKiBvZmZzZXQgZm9yIG1hcHMgb2YgdHlwZSBfRFJNX0ZSQU1FQlVGRkVSIG9yIF9EUk1fUkVHSVNURVJTLgotCQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgZWFjaCBkcml2ZXIgd2lsbCBoYXZlIG9ubHkgb25lIHJlc291cmNlIG9mCi0JCSAqIGVhY2ggdHlwZS4KKwkJICogd2hpbGUgUENJIHJlc291cmNlcyBtYXkgbGl2ZSBhYm92ZSB0aGF0LCB3ZSBvbmx5IGNvbXBhcmUgdGhlCisJCSAqIGxvd2VyIDMyIGJpdHMgb2YgdGhlIG1hcCBvZmZzZXQgZm9yIG1hcHMgb2YgdHlwZQorCQkgKiBfRFJNX0ZSQU1FQlVGRkVSIG9yIF9EUk1fUkVHSVNURVJTLgorCQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgYSBkcml2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIHJlc291cmNlCisJCSAqIG9mIGVhY2ggdHlwZSwgdGhlIGxvd2VyIDMyIGJpdHMgYXJlIGRpZmZlcmVudC4KIAkJICovCiAJCWlmICghZW50cnktPm1hcCB8fAogCQkgICAgbWFwLT50eXBlICE9IGVudHJ5LT5tYXAtPnR5cGUgfHwKQEAgLTU5LDkgKzYwLDEyIEBACiAJCWNhc2UgX0RSTV9TSE06CiAJCQlpZiAobWFwLT5mbGFncyAhPSBfRFJNX0NPTlRBSU5TX0xPQ0spCiAJCQkJYnJlYWs7CisJCQlyZXR1cm4gZW50cnk7CiAJCWNhc2UgX0RSTV9SRUdJU1RFUlM6CiAJCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6Ci0JCQlyZXR1cm4gZW50cnk7CisJCQlpZiAoKGVudHJ5LT5tYXAtPm9mZnNldCAmIDB4ZmZmZmZmZmYpID09CisJCQkgICAgKG1hcC0+b2Zmc2V0ICYgMHhmZmZmZmZmZikpCisJCQkJcmV0dXJuIGVudHJ5OwogCQlkZWZhdWx0OiAvKiBNYWtlIGdjYyBoYXBweSAqLwogCQkJOwogCQl9CkBAIC0xODMsOSArMTg3LDYgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAjZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLQkJbWFwLT5vZmZzZXQgKz0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OwotI2VuZGlmCiAJCS8qIFNvbWUgZHJpdmVycyBwcmVpbml0aWFsaXplIHNvbWUgbWFwcywgd2l0aG91dCB0aGUgWCBTZXJ2ZXIKIAkJICogbmVlZGluZyB0byBiZSBhd2FyZSBvZiBpdC4gIFRoZXJlZm9yZSwgd2UganVzdCByZXR1cm4gc3VjY2VzcwogCQkgKiB3aGVuIHRoZSBzZXJ2ZXIgdHJpZXMgdG8gY3JlYXRlIGEgZHVwbGljYXRlIG1hcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKaW5kZXggODcyNzQ3Yy4uODJkYjE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKQEAgLTg4Niw5ICs4ODYsNiBAQAogCXRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yOwogCXRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fZW5jb2RlcjsKIAotCWlmICh0b3RhbF9vYmplY3RzID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJZ3JvdXAtPmlkX2xpc3QgPSBremFsbG9jKHRvdGFsX29iamVjdHMgKiBzaXplb2YodWludDMyX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdyb3VwLT5pZF9saXN0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExMTMsNyArMTExMCw3IEBACiAJaWYgKGNhcmRfcmVzLT5jb3VudF9mYnMgPj0gZmJfY291bnQpIHsKIAkJY29waWVkID0gMDsKIAkJZmJfaWQgPSAodWludDMyX3QgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY2FyZF9yZXMtPmZiX2lkX3B0cjsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmYiwgJmZpbGVfcHJpdi0+ZmJzLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmIsICZmaWxlX3ByaXYtPmZicywgZmlscF9oZWFkKSB7CiAJCQlpZiAocHV0X3VzZXIoZmItPmJhc2UuaWQsIGZiX2lkICsgY29waWVkKSkgewogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCmluZGV4IDBhOTM1N2MuLjA5MjkyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCkBAIC0xODQsOSArMTg0LDkgQEAKIAogYmFkOgogCWlmIChyYXdfZWRpZCkgewotCQlEUk1fRVJST1IoIlJhdyBFRElEOlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiUmF3IEVESUQ6XG4iKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoS0VSTl9FUlIsIERVTVBfUFJFRklYX05PTkUsIHJhd19lZGlkLCBFRElEX0xFTkdUSCk7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI1OCw2ICsyNTgsMTcgQEAKIAlyZXR1cm4gcmV0ID09IDIgPyAwIDogLTE7CiB9CiAKK3N0YXRpYyBib29sIGRybV9lZGlkX2lzX3plcm8odTggKmluX2VkaWQsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisJdTMyICpyYXdfZWRpZCA9ICh1MzIgKilpbl9lZGlkOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aCAvIDQ7IGkrKykKKwkJaWYgKCoocmF3X2VkaWQgKyBpKSAhPSAwKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdTggKgogZHJtX2RvX2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTI3Myw2ICsyODQsMTAgQEAKIAkJCWdvdG8gb3V0OwogCQlpZiAoZHJtX2VkaWRfYmxvY2tfdmFsaWQoYmxvY2spKQogCQkJYnJlYWs7CisJCWlmIChpID09IDAgJiYgZHJtX2VkaWRfaXNfemVybyhibG9jaywgRURJRF9MRU5HVEgpKSB7CisJCQljb25uZWN0b3ItPm51bGxfZWRpZF9jb3VudGVyKys7CisJCQlnb3RvIGNhcnA7CisJCX0KIAl9CiAJaWYgKGkgPT0gNCkKIAkJZ290byBjYXJwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKaW5kZXggNzRlNGZmNS4uNDAxMmZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogLyoqIEBmaWxlIGRybV9nZW0uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCmluZGV4IGQ2MWQxODUuLjRhMDU4YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICAqIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCkBAIC0yNTMsMTAgKzI1NCwxMCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW0zMi5oYW5kbGUgPSAodW5zaWduZWQgbG9uZyloYW5kbGU7Ci0JaWYgKG0zMi5oYW5kbGUgIT0gKHVuc2lnbmVkIGxvbmcpaGFuZGxlICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJjb21wYXRfZHJtX2FkZG1hcCB0cnVuY2F0ZWQgaGFuZGxlIgotCQkgICAgICAgIiAlcCBmb3IgdHlwZSAlZCBvZmZzZXQgJXhcbiIsCi0JCSAgICAgICBoYW5kbGUsIG0zMi50eXBlLCBtMzIub2Zmc2V0KTsKKwlpZiAobTMyLmhhbmRsZSAhPSAodW5zaWduZWQgbG9uZyloYW5kbGUpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiY29tcGF0X2RybV9hZGRtYXAgdHJ1bmNhdGVkIGhhbmRsZSIKKwkJCQkgICAiICVwIGZvciB0eXBlICVkIG9mZnNldCAleFxuIiwKKwkJCQkgICBoYW5kbGUsIG0zMi50eXBlLCBtMzIub2Zmc2V0KTsKIAogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm0zMiwgc2l6ZW9mKG0zMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCmluZGV4IGUxYWVlNGYuLmI2YTE5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiB9CiAKIAotaW50IGRybV9wY2lfaXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKQorc3RhdGljIGludCBkcm1fcGNpX2lycV9ieV9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2lycV9idXNpZCAqcCkKIHsKIAlpZiAoKHAtPmJ1c251bSA+PiA4KSAhPSBkcm1fZ2V0X3BjaV9kb21haW4oZGV2KSB8fAogCSAgICAocC0+YnVzbnVtICYgMHhmZikgIT0gZGV2LT5wZGV2LT5idXMtPm51bWJlciB8fApAQCAtMjkyLDYgKzI5Miw3IEBACiAJLmdldF9uYW1lID0gZHJtX3BjaV9nZXRfbmFtZSwKIAkuc2V0X2J1c2lkID0gZHJtX3BjaV9zZXRfYnVzaWQsCiAJLnNldF91bmlxdWUgPSBkcm1fcGNpX3NldF91bmlxdWUsCisJLmlycV9ieV9idXNpZCA9IGRybV9wY2lfaXJxX2J5X2J1c2lkLAogCS5hZ3BfaW5pdCA9IGRybV9wY2lfYWdwX2luaXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKaW5kZXggMmMzZmNiZC4uNWRiOTZkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKQEAgLTUyNiw3ICs1MjYsNyBAQAogc3RhdGljIHJlc291cmNlX3NpemVfdCBkcm1fY29yZV9nZXRfcmVnX29mcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogI2lmZGVmIF9fYWxwaGFfXwotCXJldHVybiBkZXYtPmhvc2UtPmRlbnNlX21lbV9iYXNlIC0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OworCXJldHVybiBkZXYtPmhvc2UtPmRlbnNlX21lbV9iYXNlOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwppbmRleCA1MWMyMjU3Li4wYTg5M2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJc2VxX3ByaW50ZihtLCAiICBJTlNUUE06IDB4JTA4eFxuIiwgZXJyb3ItPmluc3RwbSk7CiAJc2VxX3ByaW50ZihtLCAiICBzZXFubzogMHglMDh4XG4iLCBlcnJvci0+c2Vxbm8pOwogCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5udW1fZmVuY2VfcmVnczsgaSsrKQogCQlzZXFfcHJpbnRmKG0sICIgIGZlbmNlWyVkXSA9ICUwOGxseFxuIiwgaSwgZXJyb3ItPmZlbmNlW2ldKTsKIAogCWlmIChlcnJvci0+YWN0aXZlX2JvKQpAQCAtMTIwNywxMyArMTIwNywxNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzZXFfcHJpbnRmKG0sICJwb3dlciBjb250ZXh0ICIpOwotCWRlc2NyaWJlX29iaihtLCBkZXZfcHJpdi0+cHdyY3R4KTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOworCWlmIChkZXZfcHJpdi0+cHdyY3R4KSB7CisJCXNlcV9wcmludGYobSwgInBvd2VyIGNvbnRleHQgIik7CisJCWRlc2NyaWJlX29iaihtLCBkZXZfcHJpdi0+cHdyY3R4KTsKKwkJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwl9CiAKLQlzZXFfcHJpbnRmKG0sICJyZW5kZXIgY29udGV4dCAiKTsKLQlkZXNjcmliZV9vYmoobSwgZGV2X3ByaXYtPnJlbmRlcmN0eCk7Ci0Jc2VxX3ByaW50ZihtLCAiXG4iKTsKKwlpZiAoZGV2X3ByaXYtPnJlbmRlcmN0eCkgeworCQlzZXFfcHJpbnRmKG0sICJyZW5kZXIgY29udGV4dCAiKTsKKwkJZGVzY3JpYmVfb2JqKG0sIGRldl9wcml2LT5yZW5kZXJjdHgpOworCQlzZXFfcHJpbnRmKG0sICJcbiIpOworCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCmluZGV4IDAyMzllOTkuLjI5NmZiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwpAQCAtMTI2NiwzMCArMTI2Niw2IEBACiAKIAlpbnRlbF9tb2Rlc2V0X2dlbV9pbml0KGRldik7CiAKLQlpZiAoSVNfSVZZQlJJREdFKGRldikpIHsKLQkJLyogU2hhcmUgcHJlICYgdW5pbnN0YWxsIGhhbmRsZXJzIHdpdGggSUxLL1NOQiAqLwotCQlkZXYtPmRyaXZlci0+aXJxX2hhbmRsZXIgPSBpdnlicmlkZ2VfaXJxX2hhbmRsZXI7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9wcmVpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXZ5YnJpZGdlX2lycV9wb3N0aW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBpcm9ubGFrZV9pcnFfdW5pbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayA9IGl2eWJyaWRnZV9lbmFibGVfdmJsYW5rOwotCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbms7Ci0JfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKLQkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaXJvbmxha2VfaXJxX2hhbmRsZXI7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9wcmVpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbCA9IGlyb25sYWtlX2lycV91bmluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaXJvbmxha2VfZW5hYmxlX3ZibGFuazsKLQkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rID0gaXJvbmxha2VfZGlzYWJsZV92Ymxhbms7Ci0JfSBlbHNlIHsKLQkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXI7Ci0JCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaTkxNV9lbmFibGVfdmJsYW5rOwotCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpOTE1X2Rpc2FibGVfdmJsYW5rOwotCX0KLQogCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gY2xlYW51cF9nZW07CkBAIC0xOTY3LDcgKzE5NDMsNyBAQAogCWlmICghZGV2X3ByaXYtPm1tLmd0dCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXplIEdUVFxuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2lvbWFwZnJlZTsKKwkJZ290byBvdXRfcm1tYXA7CiAJfQogCiAJYWdwX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfbWFwcGFibGVfZW50cmllcyA8PCBQQUdFX1NISUZUOwpAQCAtMjAxMSwxOCArMTk4NywxMyBAQAogCWlmIChkZXZfcHJpdi0+d3EgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgb3VyIHdvcmtxdWV1ZS5cbiIpOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9pb21hcGZyZWU7CisJCWdvdG8gb3V0X210cnJmcmVlOwogCX0KIAogCS8qIGVuYWJsZSBHRU0gYnkgZGVmYXVsdCAqLwogCWRldl9wcml2LT5oYXNfZ2VtID0gMTsKIAotCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIgPSBpOTE1X2dldF92YmxhbmtfY291bnRlcjsKLQlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweGZmZmZmZjsgLyogb25seSAyNCBiaXRzIG9mIGZyYW1lIGNvdW50ICovCi0JaWYgKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSB8fCBJU19HRU42KGRldikgfHwgSVNfSVZZQlJJREdFKGRldikpIHsKLQkJZGV2LT5tYXhfdmJsYW5rX2NvdW50ID0gMHhmZmZmZmZmZjsgLyogZnVsbCAzMiBiaXQgY291bnRlciAqLwotCQlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyID0gZ200NV9nZXRfdmJsYW5rX2NvdW50ZXI7Ci0JfQorCWludGVsX2lycV9pbml0KGRldik7CiAKIAkvKiBUcnkgdG8gbWFrZSBzdXJlIE1DSEJBUiBpcyBlbmFibGVkIGJlZm9yZSBwb2tpbmcgYXQgaXQgKi8KIAlpbnRlbF9zZXR1cF9tY2hiYXIoZGV2KTsKQEAgLTIxMDMsMTMgKzIwNzQsMjEgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2dlbV91bmxvYWQ6CisJaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zaHJpbmspCisJCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisKIAlpZiAoZGV2LT5wZGV2LT5tc2lfZW5hYmxlZCkKIAkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CiAKIAlpbnRlbF90ZWFyZG93bl9nbWJ1cyhkZXYpOwogCWludGVsX3RlYXJkb3duX21jaGJhcihkZXYpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGRldl9wcml2LT53cSk7Ci1vdXRfaW9tYXBmcmVlOgorb3V0X210cnJmcmVlOgorCWlmIChkZXZfcHJpdi0+bW0uZ3R0X210cnIgPj0gMCkgeworCQltdHJyX2RlbChkZXZfcHJpdi0+bW0uZ3R0X210cnIsIGRldi0+YWdwLT5iYXNlLAorCQkJIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX3NpemUgKiAxMDI0ICogMTAyNCk7CisJCWRldl9wcml2LT5tbS5ndHRfbXRyciA9IC0xOworCX0KIAlpb19tYXBwaW5nX2ZyZWUoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nKTsKIG91dF9ybW1hcDoKIAlwY2lfaW91bm1hcChkZXYtPnBkZXYsIGRldl9wcml2LT5yZWdzKTsKQEAgLTIxODIsOSArMjE2MSw4IEBACiAJCS8qIEZsdXNoIGFueSBvdXRzdGFuZGluZyB1bnBpbl93b3JrLiAqLwogCQlmbHVzaF93b3JrcXVldWUoZGV2X3ByaXYtPndxKTsKIAotCQlpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChkZXYpOwotCiAJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJaTkxNV9nZW1fZnJlZV9hbGxfcGh5c19vYmplY3QoZGV2KTsKIAkJaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKGRldik7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlpZiAoSTkxNV9IQVNfRkJDKGRldikgJiYgaTkxNV9wb3dlcnNhdmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCAwZGVmZDQyLi5lYjkxZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTUyLDcgKzUyLDcgQEAKIHVuc2lnbmVkIGludCBpOTE1X3NlbWFwaG9yZXMgPSAwOwogbW9kdWxlX3BhcmFtX25hbWVkKHNlbWFwaG9yZXMsIGk5MTVfc2VtYXBob3JlcywgaW50LCAwNjAwKTsKIAotdW5zaWduZWQgaW50IGk5MTVfZW5hYmxlX3JjNiA9IDE7Cit1bnNpZ25lZCBpbnQgaTkxNV9lbmFibGVfcmM2ID0gMDsKIG1vZHVsZV9wYXJhbV9uYW1lZChpOTE1X2VuYWJsZV9yYzYsIGk5MTVfZW5hYmxlX3JjNiwgaW50LCAwNjAwKTsKIAogdW5zaWduZWQgaW50IGk5MTVfZW5hYmxlX2ZiYyA9IDA7CkBAIC01NzcsOCArNTc3LDEyIEBACiAJaWYgKGdldF9zZWNvbmRzKCkgLSBkZXZfcHJpdi0+bGFzdF9ncHVfcmVzZXQgPCA1KSB7CiAJCURSTV9FUlJPUigiR1BVIGhhbmdpbmcgdG9vIGZhc3QsIGRlY2xhcmluZyB3ZWRnZWQhXG4iKTsKIAl9IGVsc2Ugc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgNzoKIAljYXNlIDY6CiAJCXJldCA9IGdlbjZfZG9fcmVzZXQoZGV2LCBmbGFncyk7CisJCS8qIElmIHJlc2V0IHdpdGggYSB1c2VyIGZvcmNld2FrZSwgdHJ5IHRvIHJlc3RvcmUgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+Zm9yY2V3YWtlX2NvdW50KSkKKwkJCV9fZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CiAJCWJyZWFrOwogCWNhc2UgNToKIAkJcmV0ID0gaXJvbmxha2VfZG9fcmVzZXQoZGV2LCBmbGFncyk7CkBAIC03NjIsMTQgKzc2Niw2IEBACiAJLnJlc3VtZSA9IGk5MTVfcmVzdW1lLAogCiAJLmRldmljZV9pc19hZ3AgPSBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwLAotCS5lbmFibGVfdmJsYW5rID0gaTkxNV9lbmFibGVfdmJsYW5rLAotCS5kaXNhYmxlX3ZibGFuayA9IGk5MTVfZGlzYWJsZV92YmxhbmssCi0JLmdldF92YmxhbmtfdGltZXN0YW1wID0gaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcCwKLQkuZ2V0X3NjYW5vdXRfcG9zaXRpb24gPSBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3MsCi0JLmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCi0JLmlycV9wb3N0aW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKLQkuaXJxX3VuaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwsCi0JLmlycV9oYW5kbGVyID0gaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIsCiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkubWFzdGVyX2NyZWF0ZSA9IGk5MTVfbWFzdGVyX2NyZWF0ZSwKIAkubWFzdGVyX2Rlc3Ryb3kgPSBpOTE1X21hc3Rlcl9kZXN0cm95LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggZWU2NjAzNS4uZjI0NWM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0yMTEsNiArMjExLDkgQEAKIAl2b2lkICgqZmRpX2xpbmtfdHJhaW4pKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAJdm9pZCAoKmluaXRfY2xvY2tfZ2F0aW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAl2b2lkICgqaW5pdF9wY2hfY2xvY2tfZ2F0aW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwlpbnQgKCpxdWV1ZV9mbGlwKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAkvKiBjbG9jayB1cGRhdGVzIGZvciBtb2RlIHNldCAqLwogCS8qIGN1cnNvciB1cGRhdGVzICovCiAJLyogcmVuZGVyIGNsb2NrIGluY3JlYXNlL2RlY3JlYXNlICovCkBAIC03MTYsNiArNzE5LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfZmJkZXYgKmZiZGV2OwogCiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpmb3JjZV9hdWRpb19wcm9wZXJ0eTsKIAogCWF0b21pY190IGZvcmNld2FrZV9jb3VudDsKIH0gZHJtX2k5MTVfcHJpdmF0ZV90OwpAQCAtOTA5LDEzICs5MTMsNiBAQAogCX0gbW07CiB9OwogCi1lbnVtIGludGVsX2NoaXBfZmFtaWx5IHsKLQlDSElQX0k4WFggPSAweDAxLAotCUNISVBfSTlYWCA9IDB4MDIsCi0JQ0hJUF9JOTE1ID0gMHgwNCwKLQlDSElQX0k5NjUgPSAweDA4LAotfTsKLQogI2RlZmluZSBJTlRFTF9JTkZPKGRldikJKCgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikgKGRldiktPmRldl9wcml2YXRlKS0+aW5mbykKIAogI2RlZmluZSBJU19JODMwKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDM1NzcpCkBAIC0xMDAwLDggKzk5Nyw2IEBACiAKIGV4dGVybiBpbnQgaTkxNV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50IGk5MTVfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9zYXZlX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBpOTE1X3Jlc3RvcmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaTkxNV9tYXN0ZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpOwogZXh0ZXJuIHZvaWQgaTkxNV9tYXN0ZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIApAQCAtMTAzNiwzMyArMTAzMSwxMiBAQAogZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCi1leHRlcm4gaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLWV4dGVybiBpbnQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0KLWV4dGVybiBpcnFyZXR1cm5fdCBpcm9ubGFrZV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgaXJvbmxha2VfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGlyb25sYWtlX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0KLWV4dGVybiBpcnFyZXR1cm5fdCBpdnlicmlkZ2VfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGl2eWJyaWRnZV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgaXZ5YnJpZGdlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGl2eWJyaWRnZV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfaXJxX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBpbnQgaTkxNV92YmxhbmtfcGlwZV9zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwotZXh0ZXJuIGludCBpOTE1X2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHZvaWQgaTkxNV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gaW50IGlyb25sYWtlX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHZvaWQgaXJvbmxha2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIGludCBpdnlicmlkZ2VfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gdm9pZCBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHUzMiBpOTE1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gdTMyIGdtNDVfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiBpbnQgaTkxNV92Ymxhbmtfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIApAQCAtMTA3MywxMyArMTA0Nyw2IEBACiBpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKIAogdm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pbnQgaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKLQkJCSAgICAgIGludCAqbWF4X2Vycm9yLAotCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAotCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpOwotCi1pbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAotCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcyk7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIGV4dGVybiB2b2lkIGk5MTVfZGVzdHJveV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IDBiMmUxNjcuLjVjMGQxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgorI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTM1NCwxMyArMzU1LDEyIEBACiAJCSAqIHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUtMSk7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgocGFnZV9vZmZzZXQgKyByZW1haW4pID4gUEFHRV9TSVpFKQogCQkJcGFnZV9sZW5ndGggPSBQQUdFX1NJWkUgLSBwYWdlX29mZnNldDsKIAotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlwYWdlID0gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQogCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAKQEAgLTQ1Myw5ICs0NTMsOSBAQAogCQkgKiBkYXRhX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGggZGF0YV9wYWdlX2luZGV4IHBhZ2UuCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldCAmIH5QQUdFX01BU0s7CisJCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKIAkJZGF0YV9wYWdlX2luZGV4ID0gZGF0YV9wdHIgLyBQQUdFX1NJWkUgLSBmaXJzdF9kYXRhX3BhZ2U7Ci0JCWRhdGFfcGFnZV9vZmZzZXQgPSBkYXRhX3B0ciAmIH5QQUdFX01BU0s7CisJCWRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhX3B0cik7CiAKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgoc2htZW1fcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCkBAIC00NjMsMTAgKzQ2MywxMSBAQAogCQlpZiAoKGRhdGFfcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIGRhdGFfcGFnZV9vZmZzZXQ7CiAKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKLQkJaWYgKElTX0VSUihwYWdlKSkKLQkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCQlwYWdlID0gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOworCQkJZ290byBvdXQ7CisJCX0KIAogCQlpZiAoZG9fYml0MTdfc3dpenpsaW5nKSB7CiAJCQlzbG93X3NobWVtX2JpdDE3X2NvcHkocGFnZSwKQEAgLTYzOCw4ICs2MzksOCBAQAogCQkgKiBwYWdlX29mZnNldCA9IG9mZnNldCB3aXRoaW4gcGFnZQogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJcGFnZV9iYXNlID0gKG9mZnNldCAmIH4oUEFHRV9TSVpFLTEpKTsKLQkJcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiAoUEFHRV9TSVpFLTEpOworCQlwYWdlX2Jhc2UgPSBvZmZzZXQgJiBQQUdFX01BU0s7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgocGFnZV9vZmZzZXQgKyByZW1haW4pID4gUEFHRV9TSVpFKQogCQkJcGFnZV9sZW5ndGggPSBQQUdFX1NJWkUgLSBwYWdlX29mZnNldDsKQEAgLTY1MCw3ICs2NTEsNiBAQAogCQkgKi8KIAkJaWYgKGZhc3RfdXNlcl93cml0ZShkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcsIHBhZ2VfYmFzZSwKIAkJCQkgICAgcGFnZV9vZmZzZXQsIHVzZXJfZGF0YSwgcGFnZV9sZW5ndGgpKQotCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlyZW1haW4gLT0gcGFnZV9sZW5ndGg7CkBAIC03MzAsOSArNzMwLDkgQEAKIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCiAJCWd0dF9wYWdlX2Jhc2UgPSBvZmZzZXQgJiBQQUdFX01BU0s7Ci0JCWd0dF9wYWdlX29mZnNldCA9IG9mZnNldCAmIH5QQUdFX01BU0s7CisJCWd0dF9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CiAJCWRhdGFfcGFnZV9pbmRleCA9IGRhdGFfcHRyIC8gUEFHRV9TSVpFIC0gZmlyc3RfZGF0YV9wYWdlOwotCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gZGF0YV9wdHIgJiB+UEFHRV9NQVNLOworCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YV9wdHIpOwogCiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKGd0dF9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKQEAgLTc5MSwxMyArNzkxLDEyIEBACiAJCSAqIHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUtMSk7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgocGFnZV9vZmZzZXQgKyByZW1haW4pID4gUEFHRV9TSVpFKQogCQkJcGFnZV9sZW5ndGggPSBQQUdFX1NJWkUgLSBwYWdlX29mZnNldDsKIAotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlwYWdlID0gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQogCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAKQEAgLTg5Niw5ICs4OTUsOSBAQAogCQkgKiBkYXRhX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGggZGF0YV9wYWdlX2luZGV4IHBhZ2UuCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldCAmIH5QQUdFX01BU0s7CisJCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKIAkJZGF0YV9wYWdlX2luZGV4ID0gZGF0YV9wdHIgLyBQQUdFX1NJWkUgLSBmaXJzdF9kYXRhX3BhZ2U7Ci0JCWRhdGFfcGFnZV9vZmZzZXQgPSBkYXRhX3B0ciAmIH5QQUdFX01BU0s7CisJCWRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhX3B0cik7CiAKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgoc2htZW1fcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCkBAIC05MDYsOCArOTA1LDcgQEAKIAkJaWYgKChkYXRhX3BhZ2Vfb2Zmc2V0ICsgcGFnZV9sZW5ndGgpID4gUEFHRV9TSVpFKQogCQkJcGFnZV9sZW5ndGggPSBQQUdFX1NJWkUgLSBkYXRhX3BhZ2Vfb2Zmc2V0OwogCi0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZULAotCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIG91dDsKQEAgLTEyMTgsMTEgKzEyMTYsMTEgQEAKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgMCwgdHJ1ZSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHVubG9jazsKLQl9CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB3cml0ZSk7Ci0JaWYgKHJldCkKLQkJZ290byB1bmxvY2s7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHdyaXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5sb2NrOworCX0KIAogCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uob2JqKTsKQEAgLTE0NTAsOCArMTQ0OCw5IEBACiAJICogZWRnZSBvZiBhbiBldmVuIHRpbGUgcm93ICh3aGVyZSB0aWxlIHJvd3MgYXJlIGNvdW50ZWQgYXMgaWYgdGhlIGJvIGlzCiAJICogcGxhY2VkIGluIGEgZmVuY2VkIGd0dCByZWdpb24pLgogCSAqLwotCWlmIChJU19HRU4yKGRldikgfHwKLQkgICAgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSAmJiBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSkpCisJaWYgKElTX0dFTjIoZGV2KSkKKwkJdGlsZV9oZWlnaHQgPSAxNjsKKwllbHNlIGlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kgJiYgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGRldikpCiAJCXRpbGVfaGVpZ2h0ID0gMzI7CiAJZWxzZQogCQl0aWxlX2hlaWdodCA9IDg7CkBAIC0xNTU2LDEyICsxNTU1LDEwIEBACiAKIAlpbm9kZSA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWdmcG1hc2sgfD0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKKwogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaSwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwKLQkJCQkJICAgX19HRlBfQ09MRCB8Ci0JCQkJCSAgIF9fR0ZQX1JFQ0xBSU1BQkxFIHwKLQkJCQkJICAgZ2ZwbWFzayk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAobWFwcGluZywgaSwgZ2ZwbWFzayk7CiAJCWlmIChJU19FUlIocGFnZSkpCiAJCQlnb3RvIGVycl9wYWdlczsKIApAQCAtMTY5OSwxMyArMTY5NiwxMCBAQAogCS8qIE91ciBnb2FsIGhlcmUgaXMgdG8gcmV0dXJuIGFzIG11Y2ggb2YgdGhlIG1lbW9yeSBhcwogCSAqIGlzIHBvc3NpYmxlIGJhY2sgdG8gdGhlIHN5c3RlbSBhcyB3ZSBhcmUgY2FsbGVkIGZyb20gT09NLgogCSAqIFRvIGRvIHRoaXMgd2UgbXVzdCBpbnN0cnVjdCB0aGUgc2htZnMgdG8gZHJvcCBhbGwgb2YgaXRzCi0JICogYmFja2luZyBwYWdlcywgKm5vdyouIEhlcmUgd2UgbWlycm9yIHRoZSBhY3Rpb25zIHRha2VuCi0JICogd2hlbiBieSBzaG1lbV9kZWxldGVfaW5vZGUoKSB0byByZWxlYXNlIHRoZSBiYWNraW5nIHN0b3JlLgorCSAqIGJhY2tpbmcgcGFnZXMsICpub3cqLgogCSAqLwogCWlub2RlID0gb2JqLT5iYXNlLmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7Ci0JaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKLQkJaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKGlub2RlLCAwLCAobG9mZl90KS0xKTsKKwlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgMCwgKGxvZmZfdCktMSk7CiAKIAlvYmotPm1hZHYgPSBfX0k5MTVfTUFEVl9QVVJHRUQ7CiB9CkBAIC0yMDc4LDggKzIwNzIsOCBAQAogCQlpZiAoIWllcikgewogCQkJRFJNX0VSUk9SKCJzb21ldGhpbmcgKGxpa2VseSB2YmV0b29sKSBkaXNhYmxlZCAiCiAJCQkJICAiaW50ZXJydXB0cywgcmUtZW5hYmxpbmdcbiIpOwotCQkJaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwocmluZy0+ZGV2KTsKLQkJCWk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChyaW5nLT5kZXYpOworCQkJcmluZy0+ZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsKHJpbmctPmRldik7CisJCQlyaW5nLT5kZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsKHJpbmctPmRldik7CiAJCX0KIAogCQl0cmFjZV9pOTE1X2dlbV9yZXF1ZXN0X3dhaXRfYmVnaW4ocmluZywgc2Vxbm8pOwpAQCAtMjkyNCw4ICsyOTE4LDYgQEAKIAkgKi8KIAl3bWIoKTsKIAotCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOwotCiAJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+YmFzZS53cml0ZV9kb21haW47CiAJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7CiAKQEAgLTM1NjUsNiArMzU1Nyw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwogCiAJb2JqID0ga3phbGxvYyhzaXplb2YoKm9iaiksIEdGUF9LRVJORUwpOwogCWlmIChvYmogPT0gTlVMTCkKQEAgLTM1NzUsNiArMzU2OCw5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCW1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwogCWk5MTVfZ2VtX2luZm9fYWRkX29iaihkZXZfcHJpdiwgc2l6ZSk7CiAKIAlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKQEAgLTM5NTAsOCArMzk0Niw3IEBACiAKIAlwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaSwKLQkJCQkJCQlHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgaSk7CiAJCWlmICghSVNfRVJSKHBhZ2UpKSB7CiAJCQljaGFyICpkc3QgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAkJCW1lbWNweShkc3QsIHZhZGRyICsgaSpQQUdFX1NJWkUsIFBBR0VfU0laRSk7CkBAIC00MDEyLDggKzQwMDcsNyBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAkJY2hhciAqZHN0LCAqc3JjOwogCi0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIGkpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQogCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwppbmRleCAyMGE0Y2M1Li40OTM0Y2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCkBAIC0xODcsMTAgKzE4Nyw2IEBACiAJaWYgKChmbHVzaF9kb21haW5zIHwgaW52YWxpZGF0ZV9kb21haW5zKSAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpCiAJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7CiAKLQkvKiBibG93IGF3YXkgbWFwcGluZ3MgaWYgbWFwcGVkIHRocm91Z2ggR1RUICovCi0JaWYgKChmbHVzaF9kb21haW5zIHwgaW52YWxpZGF0ZV9kb21haW5zKSAmIEk5MTVfR0VNX0RPTUFJTl9HVFQpCi0JCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOwotCiAJaWYgKG9iai0+YmFzZS5wZW5kaW5nX3dyaXRlX2RvbWFpbikKIAkJY2QtPmZsaXBzIHw9IGF0b21pY19yZWFkKCZvYmotPnBlbmRpbmdfZmxpcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCmluZGV4IGI3OTYxOWEuLjNiMDNmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAvKiBDYWxsZWQgZnJvbSBkcm0gZ2VuZXJpYyBjb2RlLCBwYXNzZWQgYSAnY3J0YycsIHdoaWNoCiAgKiB3ZSB1c2UgYXMgYSBwaXBlIGluZGV4CiAgKi8KLXUzMiBpOTE1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyB1MzIgaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGhpZ2hfZnJhbWU7CkBAIC0xODQsNyArMTg0LDcgQEAKIAlyZXR1cm4gKGhpZ2gxIDw8IDgpIHwgbG93OwogfQogCi11MzIgZ200NV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCitzdGF0aWMgdTMyIGdtNDVfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJlZyA9IFBJUEVfRlJNQ09VTlRfR000NShwaXBlKTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXJldHVybiBJOTE1X1JFQUQocmVnKTsKIH0KIAotaW50IGk5MTVfZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSwKK3N0YXRpYyBpbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAogCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcykKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGk5MTVfZ2V0X3ZibGFua190aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCitzdGF0aWMgaW50IGk5MTVfZ2V0X3ZibGFua190aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCiAJCQkgICAgICBpbnQgKm1heF9lcnJvciwKIAkJCSAgICAgIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKIAkJCSAgICAgIHVuc2lnbmVkIGZsYWdzKQpAQCAtNDYyLDcgKzQ2Miw3IEBACiAJCURSTV9ERUJVR19EUklWRVIoIlBDSCB0cmFuc2NvZGVyIEEgdW5kZXJydW4gaW50ZXJydXB0XG4iKTsKIH0KIAotaXJxcmV0dXJuX3QgaXZ5YnJpZGdlX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKK3N0YXRpYyBpcnFyZXR1cm5fdCBpdnlicmlkZ2VfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC01MTcsNyArNTE3LDcgQEAKIAlpZiAoZGVfaWlyICYgREVfUElQRUFfVkJMQU5LX0lWQikKIAkJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCAwKTsKIAotCWlmIChkZV9paXIgJiBERV9QSVBFQl9WQkxBTktfSVZCKTsKKwlpZiAoZGVfaWlyICYgREVfUElQRUJfVkJMQU5LX0lWQikKIAkJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCAxKTsKIAogCS8qIGNoZWNrIGV2ZW50IGZyb20gUENIICovCkBAIC01NTAsNyArNTUwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pcnFyZXR1cm5fdCBpcm9ubGFrZV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCitzdGF0aWMgaXJxcmV0dXJuX3QgaXJvbmxha2VfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMjA5LDcgKzEyMDksNyBAQAogCX0KIH0KIAotaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQorc3RhdGljIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTQ1NCw3ICsxNDU0LDcgQEAKIC8qIENhbGxlZCBmcm9tIGRybSBnZW5lcmljIGNvZGUsIHBhc3NlZCAnY3J0Yycgd2hpY2gKICAqIHdlIHVzZSBhcyBhIHBpcGUgaW5kZXgKICAqLwotaW50IGk5MTVfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyBpbnQgaTkxNV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTE0NzgsNyArMTQ3OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpcm9ubGFrZV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQorc3RhdGljIGludCBpcm9ubGFrZV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTE0OTQsNyArMTQ5NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpdnlicmlkZ2VfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyBpbnQgaXZ5YnJpZGdlX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwpAQCAtMTUxMyw3ICsxNTEzLDcgQEAKIC8qIENhbGxlZCBmcm9tIGRybSBnZW5lcmljIGNvZGUsIHBhc3NlZCAnY3J0Yycgd2hpY2gKICAqIHdlIHVzZSBhcyBhIHBpcGUgaW5kZXgKICAqLwotdm9pZCBpOTE1X2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQorc3RhdGljIHZvaWQgaTkxNV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CkBAIC0xNTI5LDcgKzE1MjksNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogfQogCi12b2lkIGlyb25sYWtlX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQorc3RhdGljIHZvaWQgaXJvbmxha2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwpAQCAtMTU0MCw3ICsxNTQwLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIH0KIAotdm9pZCBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCitzdGF0aWMgdm9pZCBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwpAQCAtMTcyOCw3ICsxNzI4LDcgQEAKIAogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotdm9pZCBpcm9ubGFrZV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaXJvbmxha2VfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xNzQwLDYgKzE3NDAsMTcgQEAKIAkJSU5JVF9XT1JLKCZkZXZfcHJpdi0+cnBzX3dvcmssIGdlbjZfcG1fcnBzX3dvcmspOwogCiAJSTkxNV9XUklURShIV1NUQU0sIDB4ZWZmZSk7CisJaWYgKElTX0dFTjYoZGV2KSB8fCBJU19HRU43KGRldikpIHsKKwkJLyogV29ya2Fyb3VuZCBzdGFsbHMgb2JzZXJ2ZWQgb24gU2FuZHkgQnJpZGdlIEdQVXMgYnkKKwkJICogbWFraW5nIHRoZSBibGl0dGVyIGNvbW1hbmQgc3RyZWFtZXIgZ2VuZXJhdGUgYQorCQkgKiB3cml0ZSB0byB0aGUgSGFyZHdhcmUgU3RhdHVzIFBhZ2UgZm9yCisJCSAqIE1JX1VTRVJfSU5URVJSVVBULiAgVGhpcyBhcHBlYXJzIHRvIHNlcmlhbGl6ZSB0aGUKKwkJICogcHJldmlvdXMgc2Vxbm8gd3JpdGUgb3V0IGJlZm9yZSB0aGUgaW50ZXJydXB0CisJCSAqIGhhcHBlbnMuCisJCSAqLworCQlJOTE1X1dSSVRFKEdFTjZfQkxJVFRFUl9IV1NUQU0sIH5HRU42X0JMSVRURVJfVVNFUl9JTlRFUlJVUFQpOworCQlJOTE1X1dSSVRFKEdFTjZfQlNEX0hXU1RBTSwgfkdFTjZfQlNEX1VTRVJfSU5URVJSVVBUKTsKKwl9CiAKIAkvKiBYWFggaG90cGx1ZyBmcm9tIFBDSCAqLwogCkBAIC0xNzU4LDcgKzE3NjksNyBAQAogCVBPU1RJTkdfUkVBRChTREVJRVIpOwogfQogCi1pbnQgaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJLyogZW5hYmxlIGtpbmQgb2YgaW50ZXJydXB0cyBhbHdheXMgZW5hYmxlZCAqLwpAQCAtMTgzMCw3ICsxODQxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGl2eWJyaWRnZV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaXZ5YnJpZGdlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJLyogZW5hYmxlIGtpbmQgb2YgaW50ZXJydXB0cyBhbHdheXMgZW5hYmxlZCAqLwpAQCAtMTg4MCw3ICsxODkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBpcGU7CkBAIC0xOTA3LDcgKzE5MTgsNyBAQAogICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgaW50ZWxfbW9kZXNldF9pbml0IG9yIGhvdHBsdWcgaW50ZXJydXB0cyB3b24ndCBiZQogICogZW5hYmxlZCBjb3JyZWN0bHkuCiAgKi8KLWludCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgZW5hYmxlX21hc2sgPSBJOTE1X0lOVEVSUlVQVF9FTkFCTEVfRklYIHwgSTkxNV9JTlRFUlJVUFRfRU5BQkxFX1ZBUjsKQEAgLTE5ODMsNyArMTk5NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXJvbmxha2VfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaXJvbmxha2VfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTIwMDMsNyArMjAxNCw3IEBACiAJSTkxNV9XUklURShHVElJUiwgSTkxNV9SRUFEKEdUSUlSKSk7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcGlwZTsKQEAgLTIwMjksMyArMjA0MCw0MSBAQAogCQkJICAgSTkxNV9SRUFEKFBJUEVTVEFUKHBpcGUpKSAmIDB4ODAwMGZmZmYpOwogCUk5MTVfV1JJVEUoSUlSLCBJOTE1X1JFQUQoSUlSKSk7CiB9CisKK3ZvaWQgaW50ZWxfaXJxX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyID0gaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXI7CisJZGV2LT5tYXhfdmJsYW5rX2NvdW50ID0gMHhmZmZmZmY7IC8qIG9ubHkgMjQgYml0cyBvZiBmcmFtZSBjb3VudCAqLworCWlmIChJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpIHx8IElTX0lWWUJSSURHRShkZXYpKSB7CisJCWRldi0+bWF4X3ZibGFua19jb3VudCA9IDB4ZmZmZmZmZmY7IC8qIGZ1bGwgMzIgYml0IGNvdW50ZXIgKi8KKwkJZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlciA9IGdtNDVfZ2V0X3ZibGFua19jb3VudGVyOworCX0KKworCisJZGV2LT5kcml2ZXItPmdldF92YmxhbmtfdGltZXN0YW1wID0gaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcDsKKwlkZXYtPmRyaXZlci0+Z2V0X3NjYW5vdXRfcG9zaXRpb24gPSBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3M7CisKKwlpZiAoSVNfSVZZQlJJREdFKGRldikpIHsKKwkJLyogU2hhcmUgcHJlICYgdW5pbnN0YWxsIGhhbmRsZXJzIHdpdGggSUxLL1NOQiAqLworCQlkZXYtPmRyaXZlci0+aXJxX2hhbmRsZXIgPSBpdnlicmlkZ2VfaXJxX2hhbmRsZXI7CisJCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9wcmVpbnN0YWxsOworCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXZ5YnJpZGdlX2lycV9wb3N0aW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBpcm9ubGFrZV9pcnFfdW5pbnN0YWxsOworCQlkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayA9IGl2eWJyaWRnZV9lbmFibGVfdmJsYW5rOworCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbms7CisJfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaXJvbmxha2VfaXJxX2hhbmRsZXI7CisJCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9wcmVpbnN0YWxsOworCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsOworCQlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbCA9IGlyb25sYWtlX2lycV91bmluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaXJvbmxha2VfZW5hYmxlX3ZibGFuazsKKwkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rID0gaXJvbmxha2VfZGlzYWJsZV92Ymxhbms7CisJfSBlbHNlIHsKKwkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXI7CisJCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaTkxNV9lbmFibGVfdmJsYW5rOworCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpOTE1X2Rpc2FibGVfdmJsYW5rOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IDJmOTY3YWYuLjVkNWRlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtNTMxLDYgKzUzMSw3IEBACiAjZGVmaW5lICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9FTkFCTEUJCTAKICNkZWZpbmUgICBHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfSURMRV9JTkRJQ0FUT1IJCQkoMSA8PCAzKQogCisjZGVmaW5lIEdFTjZfQlNEX0hXU1RBTQkJCTB4MTIwOTgKICNkZWZpbmUgR0VONl9CU0RfSU1SCQkJMHgxMjBhOAogI2RlZmluZSAgIEdFTjZfQlNEX1VTRVJfSU5URVJSVVBUCSgxIDw8IDEyKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCmluZGV4IDYwYTk0ZDIuLjUyNTdjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgaTkxNV9zYXZlX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGk5MTVfc2F2ZV9kaXNwbGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNjg5LDcgKzY4OSw3IEBACiAJaTkxNV9zYXZlX3ZnYShkZXYpOwogfQogCi12b2lkIGk5MTVfcmVzdG9yZV9kaXNwbGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpOTE1X3Jlc3RvcmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTc4MCw2ICs3ODAsNyBAQAogCQlJOTE1X1dSSVRFKENQVV9WR0FDTlRSTCwgZGV2X3ByaXYtPnNhdmVWR0FDTlRSTCk7CiAJZWxzZQogCQlJOTE1X1dSSVRFKFZHQUNOVFJMLCBkZXZfcHJpdi0+c2F2ZVZHQUNOVFJMKTsKKwogCUk5MTVfV1JJVEUoVkdBMCwgZGV2X3ByaXYtPnNhdmVWR0EwKTsKIAlJOTE1X1dSSVRFKFZHQTEsIGRldl9wcml2LT5zYXZlVkdBMSk7CiAJSTkxNV9XUklURShWR0FfUEQsIGRldl9wcml2LT5zYXZlVkdBX1BEKTsKQEAgLTc5Niw2ICs3OTcsOCBAQAogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LT5wZGV2LCBMQkIsICZkZXZfcHJpdi0+c2F2ZUxCQik7CiAKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKIAkvKiBIYXJkd2FyZSBzdGF0dXMgcGFnZSAqLwogCWRldl9wcml2LT5zYXZlSFdTID0gSTkxNV9SRUFEKEhXU19QR0EpOwogCkBAIC04MzUsNiArODM4LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQlkZXZfcHJpdi0+c2F2ZVNXRjJbaV0gPSBJOTE1X1JFQUQoU1dGMzAgKyAoaSA8PCAyKSk7CiAKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwogCXJldHVybiAwOwogfQogCkBAIC04NDUsNiArODUwLDggQEAKIAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYtPnBkZXYsIExCQiwgZGV2X3ByaXYtPnNhdmVMQkIpOwogCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCiAJLyogSGFyZHdhcmUgc3RhdHVzIHBhZ2UgKi8KIAlJOTE1X1dSSVRFKEhXU19QR0EsIGRldl9wcml2LT5zYXZlSFdTKTsKIApAQCAtODYyLDYgKzg2OSw3IEBACiAJCUk5MTVfV1JJVEUoSUVSLCBkZXZfcHJpdi0+c2F2ZUlFUik7CiAJCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+c2F2ZUlNUik7CiAJfQorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoZGV2KTsKIApAQCAtODczLDYgKzg4MSw4IEBACiAJaWYgKElTX0dFTjYoZGV2KSkKIAkJZ2VuNl9lbmFibGVfcnBzKGRldl9wcml2KTsKIAorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwogCS8qIENhY2hlIG1vZGUgc3RhdGUgKi8KIAlJOTE1X1dSSVRFIChDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CiAKQEAgLTg4Niw2ICs4OTYsOCBAQAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAJCUk5MTVfV1JJVEUoU1dGMzAgKyAoaSA8PCAyKSwgZGV2X3ByaXYtPnNhdmVTV0YyW2ldKTsKIAorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCiAJaW50ZWxfaTJjX3Jlc2V0KGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKaW5kZXggZTkzZjkzYy4uMDk3OWQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKQEAgLTI4OCw2ICsyODgsOCBAQAogCQkgKiBUaGlzIG1heSBiZSBhIERWSS1JIGNvbm5lY3RvciB3aXRoIGEgc2hhcmVkIEREQwogCQkgKiBsaW5rIGJldHdlZW4gYW5hbG9nIGFuZCBkaWdpdGFsIG91dHB1dHMsIHNvIHdlCiAJCSAqIGhhdmUgdG8gY2hlY2sgdGhlIEVESUQgaW5wdXQgc3BlYyBvZiB0aGUgYXR0YWNoZWQgZGV2aWNlLgorCQkgKgorCQkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgd2hhdCBzaG91bGQgd2UgZG8gaWYgaXQgaXMgYSBicm9rZW4gRURJRD8KIAkJICovCiAJCWlmIChlZGlkICE9IE5VTEwpIHsKIAkJCWlzX2RpZ2l0YWwgPSBlZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUw7CkBAIC0yOTgsNiArMzAwLDggQEAKIAkJaWYgKCFpc19kaWdpdGFsKSB7CiAJCQlEUk1fREVCVUdfS01TKCJDUlQgZGV0ZWN0ZWQgdmlhIEREQzoweDUwIFtFRElEXVxuIik7CiAJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCURSTV9ERUJVR19LTVMoIkNSVCBub3QgZGV0ZWN0ZWQgdmlhIEREQzoweDUwIFtFRElEIHJlcG9ydHMgYSBkaWdpdGFsIHBhbmVsXVxuIik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBmNTUzZGRmZC4uMjFiNmY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMzk4Myw1NCArMzk4Myw2IEBACiAjZGVmaW5lIElMS19MUDBfUExBTkVfTEFURU5DWQkJNzAwCiAjZGVmaW5lIElMS19MUDBfQ1VSU09SX0xBVEVOQ1kJCTEzMDAKIAotc3RhdGljIGJvb2wgaXJvbmxha2VfY29tcHV0ZV93bTAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgaW50IHBpcGUsCi0JCQkJIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpkaXNwbGF5LAotCQkJCSBpbnQgZGlzcGxheV9sYXRlbmN5X25zLAotCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yLAotCQkJCSBpbnQgY3Vyc29yX2xhdGVuY3lfbnMsCi0JCQkJIGludCAqcGxhbmVfd20sCi0JCQkJIGludCAqY3Vyc29yX3dtKQotewotCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKLQlpbnQgaHRvdGFsLCBoZGlzcGxheSwgY2xvY2ssIHBpeGVsX3NpemU7Ci0JaW50IGxpbmVfdGltZV91cywgbGluZV9jb3VudDsKLQlpbnQgZW50cmllcywgdGxiX21pc3M7Ci0KLQljcnRjID0gaW50ZWxfZ2V0X2NydGNfZm9yX3BpcGUoZGV2LCBwaXBlKTsKLQlpZiAoY3J0Yy0+ZmIgPT0gTlVMTCB8fCAhY3J0Yy0+ZW5hYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaHRvdGFsID0gY3J0Yy0+bW9kZS5odG90YWw7Ci0JaGRpc3BsYXkgPSBjcnRjLT5tb2RlLmhkaXNwbGF5OwotCWNsb2NrID0gY3J0Yy0+bW9kZS5jbG9jazsKLQlwaXhlbF9zaXplID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKLQotCS8qIFVzZSB0aGUgc21hbGwgYnVmZmVyIG1ldGhvZCB0byBjYWxjdWxhdGUgcGxhbmUgd2F0ZXJtYXJrICovCi0JZW50cmllcyA9ICgoY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiBkaXNwbGF5X2xhdGVuY3lfbnMpIC8gMTAwMDsKLQl0bGJfbWlzcyA9IGRpc3BsYXktPmZpZm9fc2l6ZSpkaXNwbGF5LT5jYWNoZWxpbmVfc2l6ZSAtIGhkaXNwbGF5ICogODsKLQlpZiAodGxiX21pc3MgPiAwKQotCQllbnRyaWVzICs9IHRsYl9taXNzOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgZGlzcGxheS0+Y2FjaGVsaW5lX3NpemUpOwotCSpwbGFuZV93bSA9IGVudHJpZXMgKyBkaXNwbGF5LT5ndWFyZF9zaXplOwotCWlmICgqcGxhbmVfd20gPiAoaW50KWRpc3BsYXktPm1heF93bSkKLQkJKnBsYW5lX3dtID0gZGlzcGxheS0+bWF4X3dtOwotCi0JLyogVXNlIHRoZSBsYXJnZSBidWZmZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBjdXJzb3Igd2F0ZXJtYXJrICovCi0JbGluZV90aW1lX3VzID0gKChodG90YWwgKiAxMDAwKSAvIGNsb2NrKTsKLQlsaW5lX2NvdW50ID0gKGN1cnNvcl9sYXRlbmN5X25zIC8gbGluZV90aW1lX3VzICsgMTAwMCkgLyAxMDAwOwotCWVudHJpZXMgPSBsaW5lX2NvdW50ICogNjQgKiBwaXhlbF9zaXplOwotCXRsYl9taXNzID0gY3Vyc29yLT5maWZvX3NpemUqY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSAtIGhkaXNwbGF5ICogODsKLQlpZiAodGxiX21pc3MgPiAwKQotCQllbnRyaWVzICs9IHRsYl9taXNzOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSk7Ci0JKmN1cnNvcl93bSA9IGVudHJpZXMgKyBjdXJzb3ItPmd1YXJkX3NpemU7Ci0JaWYgKCpjdXJzb3Jfd20gPiAoaW50KWN1cnNvci0+bWF4X3dtKQotCQkqY3Vyc29yX3dtID0gKGludCljdXJzb3ItPm1heF93bTsKLQotCXJldHVybiB0cnVlOwotfQotCiAvKgogICogQ2hlY2sgdGhlIHdtIHJlc3VsdC4KICAqCkBAIC00MTM5LDEyICs0MDkxLDEyIEBACiAJdW5zaWduZWQgaW50IGVuYWJsZWQ7CiAKIAllbmFibGVkID0gMDsKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLAotCQkJCSAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAotCQkJCSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1ksCi0JCQkJICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKLQkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKLQkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCAwLAorCQkJICAgICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCisJCQkgICAgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAorCQkJICAgICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKKwkJCSAgICBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZLAorCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKIAkJSTkxNV9XUklURShXTTBfUElQRUFfSUxLLAogCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CiAJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBBIC0iCkBAIC00MTUzLDEyICs0MTA1LDEyIEBACiAJCWVuYWJsZWQgfD0gMTsKIAl9CiAKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAxLAotCQkJCSAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAotCQkJCSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1ksCi0JCQkJICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKLQkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKLQkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCAxLAorCQkJICAgICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCisJCQkgICAgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAorCQkJICAgICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKKwkJCSAgICBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZLAorCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKIAkJSTkxNV9XUklURShXTTBfUElQRUJfSUxLLAogCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CiAJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBCIC0iCkBAIC00MjIzLDEwICs0MTc1LDEwIEBACiAJdW5zaWduZWQgaW50IGVuYWJsZWQ7CiAKIAllbmFibGVkID0gMDsKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLAotCQkJCSAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAotCQkJCSAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCi0JCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgMCwKKwkJCSAgICAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAorCQkJICAgICZzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CiAJCUk5MTVfV1JJVEUoV00wX1BJUEVBX0lMSywKIAkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOwogCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQSAtIgpAQCAtNDIzNSwxMCArNDE4NywxMCBAQAogCQllbmFibGVkIHw9IDE7CiAJfQogCi0JaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMSwKLQkJCQkgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKLQkJCQkgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAotCQkJCSAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CisJaWYgKGc0eF9jb21wdXRlX3dtMChkZXYsIDEsCisJCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCisJCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewogCQlJOTE1X1dSSVRFKFdNMF9QSVBFQl9JTEssCiAJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKIAkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKQEAgLTQ3MzUsNiArNDY4Nyw3IEBACiAKIAlJOTE1X1dSSVRFKERTUENOVFIocGxhbmUpLCBkc3BjbnRyKTsKIAlQT1NUSU5HX1JFQUQoRFNQQ05UUihwbGFuZSkpOworCWludGVsX2VuYWJsZV9wbGFuZShkZXZfcHJpdiwgcGxhbmUsIHBpcGUpOwogCiAJcmV0ID0gaW50ZWxfcGlwZV9zZXRfYmFzZShjcnRjLCB4LCB5LCBvbGRfZmIpOwogCkBAIC01MjY1LDggKzUyMTgsNiBAQAogCiAJSTkxNV9XUklURShEU1BDTlRSKHBsYW5lKSwgZHNwY250cik7CiAJUE9TVElOR19SRUFEKERTUENOVFIocGxhbmUpKTsKLQlpZiAoIUhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJaW50ZWxfZW5hYmxlX3BsYW5lKGRldl9wcml2LCBwbGFuZSwgcGlwZSk7CiAKIAlyZXQgPSBpbnRlbF9waXBlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYik7CiAKQEAgLTYzMTAsNiArNjI2MSwxOTcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBpbnRlbF9nZW4yX3F1ZXVlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1MzIgZmxpcF9tYXNrOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgTFBfUklORyhkZXZfcHJpdikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogT2Zmc2V0IGludG8gdGhlIG5ldyBidWZmZXIgZm9yIGNhc2VzIG9mIHNoYXJlZCBmYnMgYmV0d2VlbiBDUlRDcyAqLworCW9mZnNldCA9IGNydGMtPnkgKiBmYi0+cGl0Y2ggKyBjcnRjLT54ICogZmItPmJpdHNfcGVyX3BpeGVsLzg7CisKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogQ2FuJ3QgcXVldWUgbXVsdGlwbGUgZmxpcHMsIHNvIHdhaXQgZm9yIHRoZSBwcmV2aW91cworCSAqIG9uZSB0byBmaW5pc2ggYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dC4KKwkgKi8KKwlpZiAoaW50ZWxfY3J0Yy0+cGxhbmUpCisJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0JfRkxJUDsKKwllbHNlCisJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUDsKKwlPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IGZsaXBfbWFzayk7CisJT1VUX1JJTkcoTUlfTk9PUCk7CisJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKKwkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOworCU9VVF9SSU5HKGZiLT5waXRjaCk7CisJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKKwlPVVRfUklORyhNSV9OT09QKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX2dlbjNfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXUzMiBmbGlwX21hc2s7CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBMUF9SSU5HKGRldl9wcml2KSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBPZmZzZXQgaW50byB0aGUgbmV3IGJ1ZmZlciBmb3IgY2FzZXMgb2Ygc2hhcmVkIGZicyBiZXR3ZWVuIENSVENzICovCisJb2Zmc2V0ID0gY3J0Yy0+eSAqIGZiLT5waXRjaCArIGNydGMtPnggKiBmYi0+Yml0c19wZXJfcGl4ZWwvODsKKworCXJldCA9IEJFR0lOX0xQX1JJTkcoNik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW50ZWxfY3J0Yy0+cGxhbmUpCisJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0JfRkxJUDsKKwllbHNlCisJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUDsKKwlPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IGZsaXBfbWFzayk7CisJT1VUX1JJTkcoTUlfTk9PUCk7CisJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQX0k5MTUgfAorCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CisJT1VUX1JJTkcoZmItPnBpdGNoKTsKKwlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOworCU9VVF9SSU5HKE1JX05PT1ApOworCisJQURWQU5DRV9MUF9SSU5HKCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbF9nZW40X3F1ZXVlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwl1aW50MzJfdCBwZiwgcGlwZXNyYzsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIExQX1JJTkcoZGV2X3ByaXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBpOTY1KyB1c2VzIHRoZSBsaW5lYXIgb3IgdGlsZWQgb2Zmc2V0cyBmcm9tIHRoZQorCSAqIERpc3BsYXkgUmVnaXN0ZXJzICh3aGljaCBkbyBub3QgY2hhbmdlIGFjcm9zcyBhIHBhZ2UtZmxpcCkKKwkgKiBzbyB3ZSBuZWVkIG9ubHkgcmVwcm9ncmFtIHRoZSBiYXNlIGFkZHJlc3MuCisJICovCisJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKKwkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOworCU9VVF9SSU5HKGZiLT5waXRjaCk7CisJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0IHwgb2JqLT50aWxpbmdfbW9kZSk7CisKKwkvKiBYWFggRW5hYmxpbmcgdGhlIHBhbmVsLWZpdHRlciBhY3Jvc3MgcGFnZS1mbGlwIGlzIHNvIGZhcgorCSAqIHVudGVzdGVkIG9uIG5vbi1uYXRpdmUgbW9kZXMsIHNvIGlnbm9yZSBpdCBmb3Igbm93LgorCSAqIHBmID0gSTkxNV9SRUFEKHBpcGUgPT0gMCA/IFBGQV9DVExfMSA6IFBGQl9DVExfMSkgJiBQRl9FTkFCTEU7CisJICovCisJcGYgPSAwOworCXBpcGVzcmMgPSBJOTE1X1JFQUQoUElQRVNSQyhpbnRlbF9jcnRjLT5waXBlKSkgJiAweDBmZmYwZmZmOworCU9VVF9SSU5HKHBmIHwgcGlwZXNyYyk7CisJQURWQU5DRV9MUF9SSU5HKCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbF9nZW42X3F1ZXVlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwl1aW50MzJfdCBwZiwgcGlwZXNyYzsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIExQX1JJTkcoZGV2X3ByaXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAorCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CisJT1VUX1JJTkcoZmItPnBpdGNoIHwgb2JqLT50aWxpbmdfbW9kZSk7CisJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0KTsKKworCXBmID0gSTkxNV9SRUFEKFBGX0NUTChpbnRlbF9jcnRjLT5waXBlKSkgJiBQRl9FTkFCTEU7CisJcGlwZXNyYyA9IEk5MTVfUkVBRChQSVBFU1JDKGludGVsX2NydGMtPnBpcGUpKSAmIDB4MGZmZjBmZmY7CisJT1VUX1JJTkcocGYgfCBwaXBlc3JjKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogT24gZ2VuNyB3ZSBjdXJyZW50bHkgdXNlIHRoZSBibGl0IHJpbmcgYmVjYXVzZSAoaW4gZWFybHkgc2lsaWNvbiBhdCBsZWFzdCkKKyAqIHRoZSByZW5kZXIgcmluZyBkb2Vzbid0IGdpdmUgdXMgaW50ZXJycHRzIGZvciBwYWdlIGZsaXAgY29tcGxldGlvbiwgd2hpY2gKKyAqIG1lYW5zIGNsaWVudHMgd2lsbCBoYW5nIGFmdGVyIHRoZSBmaXJzdCBmbGlwIGlzIHF1ZXVlZC4gIEZvcnR1bmF0ZWx5IHRoZQorICogYmxpdCByaW5nIGdlbmVyYXRlcyBpbnRlcnJ1cHRzIHByb3Blcmx5LCBzbyB1c2UgaXQgaW5zdGVhZC4KKyAqLworc3RhdGljIGludCBpbnRlbF9nZW43X3F1ZXVlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbQkNTXTsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIHJpbmcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9ESVNQTEFZX0ZMSVBfSTkxNSB8IChpbnRlbF9jcnRjLT5wbGFuZSA8PCAxOSkpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAoZmItPnBpdGNoIHwgb2JqLT50aWxpbmdfbW9kZSkpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAob2JqLT5ndHRfb2Zmc2V0KSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIChNSV9OT09QKSk7CisJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZGVmYXVsdF9xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKIHN0YXRpYyBpbnQgaW50ZWxfY3J0Y19wYWdlX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50KQpAQCAtNjMyMCw5ICs2NDYyLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlzdHJ1Y3QgaW50ZWxfdW5waW5fd29yayAqd29yazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBvZmZzZXQ7Ci0JaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCXUzMiBwZiwgcGlwZXNyYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAl3b3JrID0ga3phbGxvYyhzaXplb2YgKndvcmssIEdGUF9LRVJORUwpOwpAQCAtNjM1MSw5ICs2NDkxLDYgQEAKIAlvYmogPSBpbnRlbF9mYi0+b2JqOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBMUF9SSU5HKGRldl9wcml2KSk7Ci0JaWYgKHJldCkKLQkJZ290byBjbGVhbnVwX3dvcms7CiAKIAkvKiBSZWZlcmVuY2UgdGhlIG9iamVjdHMgZm9yIHRoZSBzY2hlZHVsZWQgd29yay4gKi8KIAlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJndvcmstPm9sZF9mYl9vYmotPmJhc2UpOwpAQCAtNjM2NSw5MSArNjUwMiwxOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gY2xlYW51cF9vYmpzOwogCi0JaWYgKElTX0dFTjMoZGV2KSB8fCBJU19HRU4yKGRldikpIHsKLQkJdTMyIGZsaXBfbWFzazsKLQotCQkvKiBDYW4ndCBxdWV1ZSBtdWx0aXBsZSBmbGlwcywgc28gd2FpdCBmb3IgdGhlIHByZXZpb3VzCi0JCSAqIG9uZSB0byBmaW5pc2ggYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dC4KLQkJICovCi0JCXJldCA9IEJFR0lOX0xQX1JJTkcoMik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGNsZWFudXBfb2JqczsKLQotCQlpZiAoaW50ZWxfY3J0Yy0+cGxhbmUpCi0JCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVA7Ci0JCWVsc2UKLQkJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUDsKLQkJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBmbGlwX21hc2spOwotCQlPVVRfUklORyhNSV9OT09QKTsKLQkJQURWQU5DRV9MUF9SSU5HKCk7Ci0JfQotCiAJd29yay0+cGVuZGluZ19mbGlwX29iaiA9IG9iajsKIAogCXdvcmstPmVuYWJsZV9zdGFsbF9jaGVjayA9IHRydWU7CiAKLQkvKiBPZmZzZXQgaW50byB0aGUgbmV3IGJ1ZmZlciBmb3IgY2FzZXMgb2Ygc2hhcmVkIGZicyBiZXR3ZWVuIENSVENzICovCi0Jb2Zmc2V0ID0gY3J0Yy0+eSAqIGZiLT5waXRjaCArIGNydGMtPnggKiBmYi0+Yml0c19wZXJfcGl4ZWwvODsKLQotCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7Ci0JaWYgKHJldCkKLQkJZ290byBjbGVhbnVwX29ianM7Ci0KIAkvKiBCbG9jayBjbGllbnRzIGZyb20gcmVuZGVyaW5nIHRvIHRoZSBuZXcgYmFjayBidWZmZXIgdW50aWwKIAkgKiB0aGUgZmxpcCBvY2N1cnMgYW5kIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIHZpc2libGUuCiAJICovCiAJYXRvbWljX2FkZCgxIDw8IGludGVsX2NydGMtPnBsYW5lLCAmd29yay0+b2xkX2ZiX29iai0+cGVuZGluZ19mbGlwKTsKIAotCXN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKLQljYXNlIDI6Ci0JCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8Ci0JCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7Ci0JCU9VVF9SSU5HKGZiLT5waXRjaCk7Ci0JCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCArIG9mZnNldCk7Ci0JCU9VVF9SSU5HKE1JX05PT1ApOwotCQlicmVhazsKLQotCWNhc2UgMzoKLQkJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQX0k5MTUgfAotCQkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwotCQlPVVRfUklORyhmYi0+cGl0Y2gpOwotCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOwotCQlPVVRfUklORyhNSV9OT09QKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDQ6Ci0JY2FzZSA1OgotCQkvKiBpOTY1KyB1c2VzIHRoZSBsaW5lYXIgb3IgdGlsZWQgb2Zmc2V0cyBmcm9tIHRoZQotCQkgKiBEaXNwbGF5IFJlZ2lzdGVycyAod2hpY2ggZG8gbm90IGNoYW5nZSBhY3Jvc3MgYSBwYWdlLWZsaXApCi0JCSAqIHNvIHdlIG5lZWQgb25seSByZXByb2dyYW0gdGhlIGJhc2UgYWRkcmVzcy4KLQkJICovCi0JCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8Ci0JCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7Ci0JCU9VVF9SSU5HKGZiLT5waXRjaCk7Ci0JCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCB8IG9iai0+dGlsaW5nX21vZGUpOwotCi0JCS8qIFhYWCBFbmFibGluZyB0aGUgcGFuZWwtZml0dGVyIGFjcm9zcyBwYWdlLWZsaXAgaXMgc28gZmFyCi0JCSAqIHVudGVzdGVkIG9uIG5vbi1uYXRpdmUgbW9kZXMsIHNvIGlnbm9yZSBpdCBmb3Igbm93LgotCQkgKiBwZiA9IEk5MTVfUkVBRChwaXBlID09IDAgPyBQRkFfQ1RMXzEgOiBQRkJfQ1RMXzEpICYgUEZfRU5BQkxFOwotCQkgKi8KLQkJcGYgPSAwOwotCQlwaXBlc3JjID0gSTkxNV9SRUFEKFBJUEVTUkMocGlwZSkpICYgMHgwZmZmMGZmZjsKLQkJT1VUX1JJTkcocGYgfCBwaXBlc3JjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDY6Ci0JY2FzZSA3OgotCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAotCQkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwotCQlPVVRfUklORyhmYi0+cGl0Y2ggfCBvYmotPnRpbGluZ19tb2RlKTsKLQkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0KTsKLQotCQlwZiA9IEk5MTVfUkVBRChQRl9DVEwocGlwZSkpICYgUEZfRU5BQkxFOwotCQlwaXBlc3JjID0gSTkxNV9SRUFEKFBJUEVTUkMocGlwZSkpICYgMHgwZmZmMGZmZjsKLQkJT1VUX1JJTkcocGYgfCBwaXBlc3JjKTsKLQkJYnJlYWs7Ci0JfQotCUFEVkFOQ0VfTFBfUklORygpOworCXJldCA9IGRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAoZGV2LCBjcnRjLCBmYiwgb2JqKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFudXBfcGVuZGluZzsKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCkBAIC02NDU3LDEwICs2NTIxLDExIEBACiAKIAlyZXR1cm4gMDsKIAorY2xlYW51cF9wZW5kaW5nOgorCWF0b21pY19zdWIoMSA8PCBpbnRlbF9jcnRjLT5wbGFuZSwgJndvcmstPm9sZF9mYl9vYmotPnBlbmRpbmdfZmxpcCk7CiBjbGVhbnVwX29ianM6CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJndvcmstPm9sZF9mYl9vYmotPmJhc2UpOwogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwotY2xlYW51cF93b3JrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwpAQCAtNzY3NSw2ICs3NzQwLDcgQEAKIAkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJCX0gZWxzZQogCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gcGluZXZpZXdfdXBkYXRlX3dtOworCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGdlbjNfaW5pdF9jbG9ja19nYXRpbmc7CiAJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkgewogCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBnNHhfdXBkYXRlX3dtOwogCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGc0eF9pbml0X2Nsb2NrX2dhdGluZzsKQEAgLTc3MDQsNiArNzc3MCwzMSBAQAogCQllbHNlCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplID0gaTgzMF9nZXRfZmlmb19zaXplOwogCX0KKworCS8qIERlZmF1bHQganVzdCByZXR1cm5zIC1FTk9ERVYgdG8gaW5kaWNhdGUgdW5zdXBwb3J0ZWQgKi8KKwlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZGVmYXVsdF9xdWV1ZV9mbGlwOworCisJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgMjoKKwkJZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcCA9IGludGVsX2dlbjJfcXVldWVfZmxpcDsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCWRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAgPSBpbnRlbF9nZW4zX3F1ZXVlX2ZsaXA7CisJCWJyZWFrOworCisJY2FzZSA0OgorCWNhc2UgNToKKwkJZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcCA9IGludGVsX2dlbjRfcXVldWVfZmxpcDsKKwkJYnJlYWs7CisKKwljYXNlIDY6CisJCWRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAgPSBpbnRlbF9nZW42X3F1ZXVlX2ZsaXA7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcCA9IGludGVsX2dlbjdfcXVldWVfZmxpcDsKKwkJYnJlYWs7CisJfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggYTRkODAzMS4uZTJhY2VkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC01MCw3ICs1MCw2IEBACiAJYm9vbCBoYXNfYXVkaW87CiAJaW50IGZvcmNlX2F1ZGlvOwogCXVpbnQzMl90IGNvbG9yX3JhbmdlOwotCWludCBkcG1zX21vZGU7CiAJdWludDhfdCBsaW5rX2J3OwogCXVpbnQ4X3QgbGFuZV9jb3VudDsKIAl1aW50OF90IGRwY2RbNF07CkBAIC01OSw4ICs1OCw2IEBACiAJYm9vbCBpc19wY2hfZWRwOwogCXVpbnQ4X3QJdHJhaW5fc2V0WzRdOwogCXVpbnQ4X3QgbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV07Ci0KLQlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpmb3JjZV9hdWRpb19wcm9wZXJ0eTsKIH07CiAKIC8qKgpAQCAtMTQwLDggKzEzNyw4IEBACiB7CiAJaW50IG1heF9sYW5lX2NvdW50ID0gNDsKIAotCWlmIChpbnRlbF9kcC0+ZHBjZFswXSA+PSAweDExKSB7Ci0JCW1heF9sYW5lX2NvdW50ID0gaW50ZWxfZHAtPmRwY2RbMl0gJiAweDFmOworCWlmIChpbnRlbF9kcC0+ZHBjZFtEUF9EUENEX1JFVl0gPj0gMHgxMSkgeworCQltYXhfbGFuZV9jb3VudCA9IGludGVsX2RwLT5kcGNkW0RQX01BWF9MQU5FX0NPVU5UXSAmIDB4MWY7CiAJCXN3aXRjaCAobWF4X2xhbmVfY291bnQpIHsKIAkJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDoKIAkJCWJyZWFrOwpAQCAtMTU1LDcgKzE1Miw3IEBACiBzdGF0aWMgaW50CiBpbnRlbF9kcF9tYXhfbGlua19idyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogewotCWludCBtYXhfbGlua19idyA9IGludGVsX2RwLT5kcGNkWzFdOworCWludCBtYXhfbGlua19idyA9IGludGVsX2RwLT5kcGNkW0RQX01BWF9MSU5LX1JBVEVdOwogCiAJc3dpdGNoIChtYXhfbGlua19idykgewogCWNhc2UgRFBfTElOS19CV18xXzYyOgpAQCAtNzc2LDcgKzc3Myw4IEBACiAJLyoKIAkgKiBDaGVjayBmb3IgRFBDRCB2ZXJzaW9uID4gMS4xIGFuZCBlbmhhbmNlZCBmcmFtaW5nIHN1cHBvcnQKIAkgKi8KLQlpZiAoaW50ZWxfZHAtPmRwY2RbMF0gPj0gMHgxMSAmJiAoaW50ZWxfZHAtPmRwY2RbMl0gJiBEUF9FTkhBTkNFRF9GUkFNRV9DQVApKSB7CisJaWYgKGludGVsX2RwLT5kcGNkW0RQX0RQQ0RfUkVWXSA+PSAweDExICYmCisJICAgIChpbnRlbF9kcC0+ZHBjZFtEUF9NQVhfTEFORV9DT1VOVF0gJiBEUF9FTkhBTkNFRF9GUkFNRV9DQVApKSB7CiAJCWludGVsX2RwLT5saW5rX2NvbmZpZ3VyYXRpb25bMV0gfD0gRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTjsKIAkJaW50ZWxfZHAtPkRQIHw9IERQX0VOSEFOQ0VEX0ZSQU1JTkc7CiAJfQpAQCAtOTQ0LDExICs5NDIsNDQgQEAKIAl1ZGVsYXkoMjAwKTsKIH0KIAorLyogSWYgdGhlIHNpbmsgc3VwcG9ydHMgaXQsIHRyeSB0byBzZXQgdGhlIHBvd2VyIHN0YXRlIGFwcHJvcHJpYXRlbHkgKi8KK3N0YXRpYyB2b2lkIGludGVsX2RwX3NpbmtfZHBtcyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0LCBpOworCisJLyogU2hvdWxkIGhhdmUgYSB2YWxpZCBEUENEIGJ5IHRoaXMgcG9pbnQgKi8KKwlpZiAoaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdIDwgMHgxMSkKKwkJcmV0dXJuOworCisJaWYgKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTikgeworCQlyZXQgPSBpbnRlbF9kcF9hdXhfbmF0aXZlX3dyaXRlXzEoaW50ZWxfZHAsIERQX1NFVF9QT1dFUiwKKwkJCQkJCSAgRFBfU0VUX1BPV0VSX0QzKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRvIHdyaXRlIHNpbmsgcG93ZXIgc3RhdGVcbiIpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdoZW4gdHVybmluZyBvbiwgd2UgbmVlZCB0byByZXRyeSBmb3IgMW1zIHRvIGdpdmUgdGhlIHNpbmsKKwkJICogdGltZSB0byB3YWtlIHVwLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmV0ID0gaW50ZWxfZHBfYXV4X25hdGl2ZV93cml0ZV8xKGludGVsX2RwLAorCQkJCQkJCSAgRFBfU0VUX1BPV0VSLAorCQkJCQkJCSAgRFBfU0VUX1BPV0VSX0QwKTsKKwkJCWlmIChyZXQgPT0gMSkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCX0KK30KKwogc3RhdGljIHZvaWQgaW50ZWxfZHBfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCisJLyogV2FrZSB1cCB0aGUgc2luayBmaXJzdCAqLworCWludGVsX2RwX3NpbmtfZHBtcyhpbnRlbF9kcCwgRFJNX01PREVfRFBNU19PTik7CisKIAlpZiAoaXNfZWRwKGludGVsX2RwKSkgewogCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihkZXYpOwogCQlpcm9ubGFrZV9lZHBfcGFuZWxfb2ZmKGRldik7CkBAIC05OTIsNiArMTAyMyw3IEBACiAJaWYgKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTikgewogCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKIAkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGRldik7CisJCWludGVsX2RwX3NpbmtfZHBtcyhpbnRlbF9kcCwgbW9kZSk7CiAJCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CiAJCWlmIChpc19lZHAoaW50ZWxfZHApKQogCQkJaXJvbmxha2VfZWRwX3BhbmVsX29mZihkZXYpOwpAQCAtMTAwMCw2ICsxMDMyLDcgQEAKIAl9IGVsc2UgewogCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKIAkJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOworCQlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIG1vZGUpOwogCQlpZiAoIShkcF9yZWcgJiBEUF9QT1JUX0VOKSkgewogCQkJaW50ZWxfZHBfc3RhcnRfbGlua190cmFpbihpbnRlbF9kcCk7CiAJCQlpZiAoaXNfZWRwKGludGVsX2RwKSkgewpAQCAtMTAxMSw3ICsxMDQ0LDMxIEBACiAJCWlmIChpc19lZHAoaW50ZWxfZHApKQogCQkJaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vbihkZXYpOwogCX0KLQlpbnRlbF9kcC0+ZHBtc19tb2RlID0gbW9kZTsKK30KKworLyoKKyAqIE5hdGl2ZSByZWFkIHdpdGggcmV0cnkgZm9yIGxpbmsgc3RhdHVzIGFuZCByZWNlaXZlciBjYXBhYmlsaXR5IHJlYWRzIGZvcgorICogY2FzZXMgd2hlcmUgdGhlIHNpbmsgbWF5IHN0aWxsIGJlIGFzbGVlcC4KKyAqLworc3RhdGljIGJvb2wKK2ludGVsX2RwX2F1eF9uYXRpdmVfcmVhZF9yZXRyeShzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCB1aW50MTZfdCBhZGRyZXNzLAorCQkJICAgICAgIHVpbnQ4X3QgKnJlY3YsIGludCByZWN2X2J5dGVzKQoreworCWludCByZXQsIGk7CisKKwkvKgorCSAqIFNpbmtzIGFyZSAqc3VwcG9zZWQqIHRvIGNvbWUgdXAgd2l0aGluIDFtcyBmcm9tIGFuIG9mZiBzdGF0ZSwKKwkgKiBidXQgd2UncmUgYWxzbyBzdXBwb3NlZCB0byByZXRyeSAzIHRpbWVzIHBlciB0aGUgc3BlYy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldCA9IGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZChpbnRlbF9kcCwgYWRkcmVzcywgcmVjdiwKKwkJCQkJICAgICAgIHJlY3ZfYnl0ZXMpOworCQlpZiAocmV0ID09IHJlY3ZfYnl0ZXMpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJbXNsZWVwKDEpOworCX0KKworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKQEAgLTEwMjEsMTQgKzEwNzgsMTAgQEAKIHN0YXRpYyBib29sCiBpbnRlbF9kcF9nZXRfbGlua19zdGF0dXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaW50ZWxfZHBfYXV4X25hdGl2ZV9yZWFkKGludGVsX2RwLAotCQkJCSAgICAgICBEUF9MQU5FMF8xX1NUQVRVUywKLQkJCQkgICAgICAgaW50ZWxfZHAtPmxpbmtfc3RhdHVzLCBEUF9MSU5LX1NUQVRVU19TSVpFKTsKLQlpZiAocmV0ICE9IERQX0xJTktfU1RBVFVTX1NJWkUpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gaW50ZWxfZHBfYXV4X25hdGl2ZV9yZWFkX3JldHJ5KGludGVsX2RwLAorCQkJCQkgICAgICBEUF9MQU5FMF8xX1NUQVRVUywKKwkJCQkJICAgICAgaW50ZWxfZHAtPmxpbmtfc3RhdHVzLAorCQkJCQkgICAgICBEUF9MSU5LX1NUQVRVU19TSVpFKTsKIH0KIAogc3RhdGljIHVpbnQ4X3QKQEAgLTE1MTcsNiArMTU3MCw4IEBACiBzdGF0aWMgdm9pZAogaW50ZWxfZHBfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKKwlpbnQgcmV0OworCiAJaWYgKCFpbnRlbF9kcC0+YmFzZS5iYXNlLmNydGMpCiAJCXJldHVybjsKIApAQCAtMTUyNSw2ICsxNTgwLDE1IEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBUcnkgdG8gcmVhZCByZWNlaXZlciBzdGF0dXMgaWYgdGhlIGxpbmsgYXBwZWFycyB0byBiZSB1cCAqLworCXJldCA9IGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZChpbnRlbF9kcCwKKwkJCQkgICAgICAgMHgwMDAsIGludGVsX2RwLT5kcGNkLAorCQkJCSAgICAgICBzaXplb2YgKGludGVsX2RwLT5kcGNkKSk7CisJaWYgKHJldCAhPSBzaXplb2YoaW50ZWxfZHAtPmRwY2QpKSB7CisJCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoIWludGVsX2NoYW5uZWxfZXFfb2soaW50ZWxfZHApKSB7CiAJCWludGVsX2RwX3N0YXJ0X2xpbmtfdHJhaW4oaW50ZWxfZHApOwogCQlpbnRlbF9kcF9jb21wbGV0ZV9saW5rX3RyYWluKGludGVsX2RwKTsKQEAgLTE1MzUsNiArMTU5OSw3IEBACiBpcm9ubGFrZV9kcF9kZXRlY3Qoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKIAllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1czsKKwlib29sIHJldDsKIAogCS8qIENhbid0IGRpc2Nvbm5lY3QgZURQLCBidXQgeW91IGNhbiBjbG9zZSB0aGUgbGlkLi4uICovCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKQEAgLTE1NDUsMTMgKzE2MTAsMTEgQEAKIAl9CiAKIAlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKLQlpZiAoaW50ZWxfZHBfYXV4X25hdGl2ZV9yZWFkKGludGVsX2RwLAotCQkJCSAgICAgMHgwMDAsIGludGVsX2RwLT5kcGNkLAotCQkJCSAgICAgc2l6ZW9mIChpbnRlbF9kcC0+ZHBjZCkpCi0JICAgID09IHNpemVvZihpbnRlbF9kcC0+ZHBjZCkpIHsKLQkJaWYgKGludGVsX2RwLT5kcGNkWzBdICE9IDApCi0JCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLQl9CisJcmV0ID0gaW50ZWxfZHBfYXV4X25hdGl2ZV9yZWFkX3JldHJ5KGludGVsX2RwLAorCQkJCQkgICAgIDB4MDAwLCBpbnRlbF9kcC0+ZHBjZCwKKwkJCQkJICAgICBzaXplb2YgKGludGVsX2RwLT5kcGNkKSk7CisJaWYgKHJldCAmJiBpbnRlbF9kcC0+ZHBjZFtEUF9EUENEX1JFVl0gIT0gMCkKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJRFJNX0RFQlVHX0tNUygiRFBDRDogJWh4JWh4JWh4JWh4XG4iLCBpbnRlbF9kcC0+ZHBjZFswXSwKIAkJICAgICAgaW50ZWxfZHAtPmRwY2RbMV0sIGludGVsX2RwLT5kcGNkWzJdLCBpbnRlbF9kcC0+ZHBjZFszXSk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE1ODgsNyArMTY1MSw3IEBACiAJaWYgKGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZChpbnRlbF9kcCwgMHgwMDAsIGludGVsX2RwLT5kcGNkLAogCQkJCSAgICAgc2l6ZW9mIChpbnRlbF9kcC0+ZHBjZCkpID09IHNpemVvZiAoaW50ZWxfZHAtPmRwY2QpKQogCXsKLQkJaWYgKGludGVsX2RwLT5kcGNkWzBdICE9IDApCisJCWlmIChpbnRlbF9kcC0+ZHBjZFtEUF9EUENEX1JFVl0gIT0gMCkKIAkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogCX0KIApAQCAtMTcwMiw3ICsxNzY1LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHByb3BlcnR5ID09IGludGVsX2RwLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgeworCWlmIChwcm9wZXJ0eSA9PSBkZXZfcHJpdi0+Zm9yY2VfYXVkaW9fcHJvcGVydHkpIHsKIAkJaW50IGkgPSB2YWw7CiAJCWJvb2wgaGFzX2F1ZGlvOwogCkBAIC0xNzkyLDggKzE4NTUsNyBAQAogewogCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBjb250YWluZXJfb2YoaW50ZWxfZW5jb2Rlciwgc3RydWN0IGludGVsX2RwLCBiYXNlKTsKIAotCWlmIChpbnRlbF9kcC0+ZHBtc19tb2RlID09IERSTV9NT0RFX0RQTVNfT04pCi0JCWludGVsX2RwX2NoZWNrX2xpbmtfc3RhdHVzKGludGVsX2RwKTsKKwlpbnRlbF9kcF9jaGVja19saW5rX3N0YXR1cyhpbnRlbF9kcCk7CiB9CiAKIC8qIFJldHVybiB3aGljaCBEUCBQb3J0IHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgVHJhbnNjb2RlciBEUCBjb250cm9sICovCkBAIC0xODQxLDE2ICsxOTAzLDcgQEAKIHN0YXRpYyB2b2lkCiBpbnRlbF9kcF9hZGRfcHJvcGVydGllcyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKLQotCWludGVsX2RwLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSA9Ci0JCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLCAiZm9yY2VfYXVkaW8iLCAyKTsKLQlpZiAoaW50ZWxfZHAtPmZvcmNlX2F1ZGlvX3Byb3BlcnR5KSB7Ci0JCWludGVsX2RwLT5mb3JjZV9hdWRpb19wcm9wZXJ0eS0+dmFsdWVzWzBdID0gLTE7Ci0JCWludGVsX2RwLT5mb3JjZV9hdWRpb19wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMTsKLQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBpbnRlbF9kcC0+Zm9yY2VfYXVkaW9fcHJvcGVydHksIDApOwotCX0KLQorCWludGVsX2F0dGFjaF9mb3JjZV9hdWRpb19wcm9wZXJ0eShjb25uZWN0b3IpOwogCWludGVsX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5KGNvbm5lY3Rvcik7CiB9CiAKQEAgLTE4NzAsNyArMTkyMyw2IEBACiAJCXJldHVybjsKIAogCWludGVsX2RwLT5vdXRwdXRfcmVnID0gb3V0cHV0X3JlZzsKLQlpbnRlbF9kcC0+ZHBtc19tb2RlID0gLTE7CiAKIAlpbnRlbF9jb25uZWN0b3IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnRlbF9jb25uZWN0b3IpIHsKQEAgLTE5NjUsOCArMjAxNyw5IEBACiAJCQkJCSAgICAgICBzaXplb2YoaW50ZWxfZHAtPmRwY2QpKTsKIAkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoaW50ZWxfZHApOwogCQlpZiAocmV0ID09IHNpemVvZihpbnRlbF9kcC0+ZHBjZCkpIHsKLQkJCWlmIChpbnRlbF9kcC0+ZHBjZFswXSA+PSAweDExKQotCQkJCWRldl9wcml2LT5ub19hdXhfaGFuZHNoYWtlID0gaW50ZWxfZHAtPmRwY2RbM10gJgorCQkJaWYgKGludGVsX2RwLT5kcGNkW0RQX0RQQ0RfUkVWXSA+PSAweDExKQorCQkJCWRldl9wcml2LT5ub19hdXhfaGFuZHNoYWtlID0KKwkJCQkJaW50ZWxfZHAtPmRwY2RbRFBfTUFYX0RPV05TUFJFQURdICYKIAkJCQkJRFBfTk9fQVVYX0hBTkRTSEFLRV9MSU5LX1RSQUlOSU5HOwogCQl9IGVsc2UgewogCQkJLyogaWYgdGhpcyBmYWlscywgcHJlc3VtZSB0aGUgZGV2aWNlIGlzIGEgZ2hvc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggODMxZDdhNC4uOWZmYTYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTIzNiw2ICsyMzYsNyBAQAogaW50IGludGVsX2RkY19nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmMsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gYm9vbCBpbnRlbF9kZGNfcHJvYmUoc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIsIGludCBkZGNfYnVzKTsKIAorZXh0ZXJuIHZvaWQgaW50ZWxfYXR0YWNoX2ZvcmNlX2F1ZGlvX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogZXh0ZXJuIHZvaWQgaW50ZWxfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CiAKIGV4dGVybiB2b2lkIGludGVsX2NydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCmluZGV4IGYyODliODYuLmFhMGE4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKIAlib29sIGhhc19oZG1pX3Npbms7CiAJYm9vbCBoYXNfYXVkaW87CiAJaW50IGZvcmNlX2F1ZGlvOwotCXN0cnVjdCBkcm1fcHJvcGVydHkgKmZvcmNlX2F1ZGlvX3Byb3BlcnR5OwogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRlbF9oZG1pICplbmNfdG9faW50ZWxfaGRtaShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC0xOTQsNyArMTkzLDcgQEAKIAlpZiAobW9kZS0+Y2xvY2sgPiAxNjUwMDApCiAJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CiAJaWYgKG1vZGUtPmNsb2NrIDwgMjAwMDApCi0JCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisJCXJldHVybiBNT0RFX0NMT0NLX0xPVzsKIAogCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikKIAkJcmV0dXJuIE1PREVfTk9fREJMRVNDQU47CkBAIC0yODcsNyArMjg2LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHByb3BlcnR5ID09IGludGVsX2hkbWktPmZvcmNlX2F1ZGlvX3Byb3BlcnR5KSB7CisJaWYgKHByb3BlcnR5ID09IGRldl9wcml2LT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgewogCQlpbnQgaSA9IHZhbDsKIAkJYm9vbCBoYXNfYXVkaW87CiAKQEAgLTM2NSwxNiArMzY0LDcgQEAKIHN0YXRpYyB2b2lkCiBpbnRlbF9oZG1pX2FkZF9wcm9wZXJ0aWVzKHN0cnVjdCBpbnRlbF9oZG1pICppbnRlbF9oZG1pLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKLQotCWludGVsX2hkbWktPmZvcmNlX2F1ZGlvX3Byb3BlcnR5ID0KLQkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsICJmb3JjZV9hdWRpbyIsIDIpOwotCWlmIChpbnRlbF9oZG1pLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgewotCQlpbnRlbF9oZG1pLT5mb3JjZV9hdWRpb19wcm9wZXJ0eS0+dmFsdWVzWzBdID0gLTE7Ci0JCWludGVsX2hkbWktPmZvcmNlX2F1ZGlvX3Byb3BlcnR5LT52YWx1ZXNbMV0gPSAxOwotCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGludGVsX2hkbWktPmZvcmNlX2F1ZGlvX3Byb3BlcnR5LCAwKTsKLQl9Ci0KKwlpbnRlbF9hdHRhY2hfZm9yY2VfYXVkaW9fcHJvcGVydHkoY29ubmVjdG9yKTsKIAlpbnRlbF9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eShjb25uZWN0b3IpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCmluZGV4IGQzYjkwM2IuLmQ5OGNlZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCkBAIC00MDEsOCArNDAxLDcgQEAKIAkJYnVzLT5yZWcwID0gaSB8IEdNQlVTX1JBVEVfMTAwS0haOwogCiAJCS8qIFhYWCBmb3JjZSBiaXQgYmFuZ2luZyB1bnRpbCBHTUJVUyBpcyBmdWxseSBkZWJ1Z2dlZCAqLwotCQlpZiAoSVNfR0VOMihkZXYpKQotCQkJYnVzLT5mb3JjZV9iaXQgPSBpbnRlbF9ncGlvX2NyZWF0ZShkZXZfcHJpdiwgaSk7CisJCWJ1cy0+Zm9yY2VfYml0ID0gaW50ZWxfZ3Bpb19jcmVhdGUoZGV2X3ByaXYsIGkpOwogCX0KIAogCWludGVsX2kyY19yZXNldChkZXZfcHJpdi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCA2N2NiMDc2Li5iMjhmN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC03MjcsNiArNzI3LDE0IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlU4MDAiKSwKIAkJfSwKIAl9LAorCXsKKwkJLmNhbGxiYWNrID0gaW50ZWxfbm9fbHZkc19kbWlfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJBc3VzIEVlZUJveCBQQyBFQjEwMDciLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJFQjEwMDciKSwKKwkJfSwKKwl9LAogCiAJeyB9CS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMKaW5kZXggOTAzNGRkOGYuLjNiMjZhM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbW9kZXMuYwpAQCAtODEsNiArODEsMzYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZm9yY2VfYXVkaW9fbmFtZXNbXSA9IHsKKwkib2ZmIiwKKwkiYXV0byIsCisJIm9uIiwKK307CisKK3ZvaWQKK2ludGVsX2F0dGFjaF9mb3JjZV9hdWRpb19wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7CisJaW50IGk7CisKKwlwcm9wID0gZGV2X3ByaXYtPmZvcmNlX2F1ZGlvX3Byb3BlcnR5OworCWlmIChwcm9wID09IE5VTEwpIHsKKwkJcHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX0VOVU0sCisJCQkJCSAgICJhdWRpbyIsCisJCQkJCSAgIEFSUkFZX1NJWkUoZm9yY2VfYXVkaW9fbmFtZXMpKTsKKwkJaWYgKHByb3AgPT0gTlVMTCkKKwkJCXJldHVybjsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JjZV9hdWRpb19uYW1lcyk7IGkrKykKKwkJCWRybV9wcm9wZXJ0eV9hZGRfZW51bShwcm9wLCBpLCBpLTEsIGZvcmNlX2F1ZGlvX25hbWVzW2ldKTsKKworCQlkZXZfcHJpdi0+Zm9yY2VfYXVkaW9fcHJvcGVydHkgPSBwcm9wOworCX0KKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIHByb3AsIDApOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqYnJvYWRjYXN0X3JnYl9uYW1lc1tdID0gewogCSJGdWxsIiwKIAkiTGltaXRlZCAxNjoyMzUiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCmluZGV4IGE2NzBjMDAuLjllMjk1OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKQEAgLTE0MDksNiArMTQwOSwxMSBAQAogCW92ZXJsYXkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3ZlcmxheSksIEdGUF9LRVJORUwpOwogCWlmICghb3ZlcmxheSkKIAkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlmIChXQVJOX09OKGRldl9wcml2LT5vdmVybGF5KSkKKwkJZ290byBvdXRfZnJlZTsKKwogCW92ZXJsYXktPmRldiA9IGRldjsKIAogCXJlZ19ibyA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIFBBR0VfU0laRSk7CkBAIC0xNDQ4LDcgKzE0NTMsNyBAQAogCiAJcmVncyA9IGludGVsX292ZXJsYXlfbWFwX3JlZ3Mob3ZlcmxheSk7CiAJaWYgKCFyZWdzKQotCQlnb3RvIG91dF9mcmVlX2JvOworCQlnb3RvIG91dF91bnBpbl9ibzsKIAogCW1lbXNldChyZWdzLCAwLCBzaXplb2Yoc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzKSk7CiAJdXBkYXRlX3BvbHlwaGFzZV9maWx0ZXIocmVncyk7CkBAIC0xNDU3LDE0ICsxNDYyLDE3IEBACiAJaW50ZWxfb3ZlcmxheV91bm1hcF9yZWdzKG92ZXJsYXksIHJlZ3MpOwogCiAJZGV2X3ByaXYtPm92ZXJsYXkgPSBvdmVybGF5OworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCURSTV9JTkZPKCJpbml0aWFsaXplZCBvdmVybGF5IHN1cHBvcnRcbiIpOwogCXJldHVybjsKIAogb3V0X3VucGluX2JvOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbihyZWdfYm8pOworCWlmICghT1ZFUkxBWV9ORUVEU19QSFlTSUNBTChkZXYpKQorCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ocmVnX2JvKTsKIG91dF9mcmVlX2JvOgogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZyZWdfYm8tPmJhc2UpOwogb3V0X2ZyZWU6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJa2ZyZWUob3ZlcmxheSk7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCmluZGV4IGMwZTBlZTYuLjM5YWMyYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKQEAgLTE2NSw3ICsxNjUsNyBAQAogaW50IF9fbXVzdF9jaGVjayBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgaW50IG4pOwogc3RhdGljIGlubGluZSBpbnQgaW50ZWxfd2FpdF9yaW5nX2lkbGUoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCXJldHVybiBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHJpbmcsIHJpbmctPnNwYWNlIC0gOCk7CisJcmV0dXJuIGludGVsX3dhaXRfcmluZ19idWZmZXIocmluZywgcmluZy0+c2l6ZSAtIDgpOwogfQogCiBpbnQgX19tdXN0X2NoZWNrIGludGVsX3JpbmdfYmVnaW4oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggNzU0MDg2Zi4uMzBmZTU1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMTQ4LDggKzE0OCw2IEBACiAJaW50ICAgZm9ybWF0X3N1cHBvcnRlZF9udW07CiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqdHZfZm9ybWF0OwogCi0Jc3RydWN0IGRybV9wcm9wZXJ0eSAqZm9yY2VfYXVkaW9fcHJvcGVydHk7Ci0KIAkvKiBhZGQgdGhlIHByb3BlcnR5IGZvciB0aGUgU0RWTy1UViAqLwogCXN0cnVjdCBkcm1fcHJvcGVydHkgKmxlZnQ7CiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqcmlnaHQ7CkBAIC0xNzEyLDcgKzE3MTAsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocHJvcGVydHkgPT0gaW50ZWxfc2R2b19jb25uZWN0b3ItPmZvcmNlX2F1ZGlvX3Byb3BlcnR5KSB7CisJaWYgKHByb3BlcnR5ID09IGRldl9wcml2LT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgewogCQlpbnQgaSA9IHZhbDsKIAkJYm9vbCBoYXNfYXVkaW87CiAKQEAgLTIwMzcsMTUgKzIwMzUsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuYmFzZS5kZXY7CiAKLQljb25uZWN0b3ItPmZvcmNlX2F1ZGlvX3Byb3BlcnR5ID0KLQkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsICJmb3JjZV9hdWRpbyIsIDIpOwotCWlmIChjb25uZWN0b3ItPmZvcmNlX2F1ZGlvX3Byb3BlcnR5KSB7Ci0JCWNvbm5lY3Rvci0+Zm9yY2VfYXVkaW9fcHJvcGVydHktPnZhbHVlc1swXSA9IC0xOwotCQljb25uZWN0b3ItPmZvcmNlX2F1ZGlvX3Byb3BlcnR5LT52YWx1ZXNbMV0gPSAxOwotCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLmJhc2UsCi0JCQkJCSAgICAgIGNvbm5lY3Rvci0+Zm9yY2VfYXVkaW9fcHJvcGVydHksIDApOwotCX0KLQorCWludGVsX2F0dGFjaF9mb3JjZV9hdWRpb19wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLmJhc2UpOwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0ICYmIElTX01PQklMRShkZXYpKQogCQlpbnRlbF9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLmJhc2UpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuaAppbmRleCAxMDg0ZmE0Li41NDU1OGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuaApAQCAtMTk1LDI5ICsxOTUsMTAgQEAKIAogI2RlZmluZSBtZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpCURSTV9XUklURU1FTU9SWUJBUlJJRVIoKQogCi0jaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX19hbHBoYV9fKQotI2RlZmluZSBNR0FfQkFTRShyZWcpCQkoKHVuc2lnbmVkIGxvbmcpKGRldl9wcml2LT5tbWlvLT5oYW5kbGUpKQotI2RlZmluZSBNR0FfQUREUihyZWcpCQkoTUdBX0JBU0UocmVnKSArIHJlZykKLQotI2RlZmluZSBNR0FfREVSRUYocmVnKQkJKCoodm9sYXRpbGUgdTMyICopTUdBX0FERFIocmVnKSkKLSNkZWZpbmUgTUdBX0RFUkVGOChyZWcpCQkoKih2b2xhdGlsZSB1OCAqKU1HQV9BRERSKHJlZykpCi0KLSNkZWZpbmUgTUdBX1JFQUQocmVnKQkJKF9NR0FfUkVBRCgodTMyICopTUdBX0FERFIocmVnKSkpCi0jZGVmaW5lIE1HQV9SRUFEOChyZWcpCQkoX01HQV9SRUFEKCh1OCAqKU1HQV9BRERSKHJlZykpKQotI2RlZmluZSBNR0FfV1JJVEUocmVnLCB2YWwpCWRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgTUdBX1dSSVRFOChyZWcsIHZhbCkJZG8geyBEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCk7IE1HQV9ERVJFRjgocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSB1MzIgX01HQV9SRUFEKHUzMiAqYWRkcikKLXsKLQlEUk1fTUVNT1JZQkFSUklFUigpOwotCXJldHVybiAqKHZvbGF0aWxlIHUzMiAqKWFkZHI7Ci19Ci0jZWxzZQogI2RlZmluZSBNR0FfUkVBRDgocmVnKQkJRFJNX1JFQUQ4KGRldl9wcml2LT5tbWlvLCAocmVnKSkKICNkZWZpbmUgTUdBX1JFQUQocmVnKQkJRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pbywgKHJlZykpCiAjZGVmaW5lIE1HQV9XUklURTgocmVnLCB2YWwpCURSTV9XUklURTgoZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSkKICNkZWZpbmUgTUdBX1dSSVRFKHJlZywgdmFsKQlEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpKQotI2VuZGlmCiAKICNkZWZpbmUgRFdHUkVHMAkJMHgxYzAwCiAjZGVmaW5lIERXR1JFRzBfRU5ECTB4MWRmZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYwppbmRleCBmMGQ0NTliLi41MjU3NDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYwpAQCAtMjYyLDcgKzI2Miw2IEBACiAJCXZnYV9jb3VudCsrOwogCiAJCXJldHZhbCA9IG5vdXZlYXVfZHNtX3BjaV9wcm9iZShwZGV2KTsKLQkJcHJpbnRrKCJyZXQgdmFsIGlzICVkXG4iLCByZXR2YWwpOwogCQlpZiAocmV0dmFsICYgTk9VVkVBVV9EU01fSEFTX01VWCkKIAkJCWhhc19kc20gfD0gMTsKIAkJaWYgKHJldHZhbCAmIE5PVVZFQVVfRFNNX0hBU19PUFQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKaW5kZXggNGI5ZjQ0OS4uNzM0NzA3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYwpAQCAtMzM5LDExICszMzksMTIgQEAKIAlpbnQgcmV0OwogCiAJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg4NCkgewotCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDMpOworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDQpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX1NFTUFQSE9SRV9PRkZTRVQsIDIpOworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX0RNQV9TRU1BUEhPUkUsIDMpOworCQlPVVRfUklORyAgKGNoYW4sIE52U2VtYSk7CiAJCU9VVF9SSU5HICAoY2hhbiwgc2VtYS0+bWVtLT5zdGFydCk7CiAJCU9VVF9SSU5HICAoY2hhbiwgMSk7CiAJfSBlbHNlCkBAIC0zNTEsMTAgKzM1MiwxMiBAQAogCQlzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSA9ICZkZXZfcHJpdi0+ZmVuY2UuYm8tPnZtYTsKIAkJdTY0IG9mZnNldCA9IHZtYS0+b2Zmc2V0ICsgc2VtYS0+bWVtLT5zdGFydDsKIAotCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDUpOworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDcpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAorCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX0RNQV9TRU1BUEhPUkUsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIGNoYW4tPnZyYW1faGFuZGxlKTsKIAkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCAweDAwMTAsIDQpOwogCQlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMob2Zmc2V0KSk7CiAJCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhvZmZzZXQpKTsKQEAgLTM5NCwxMSArMzk3LDEyIEBACiAJaW50IHJldDsKIAogCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4ODQpIHsKLQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA0KTsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA1KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19TRU1BUEhPUkVfT0ZGU0VULCAxKTsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19ETUFfU0VNQVBIT1JFLCAyKTsKKwkJT1VUX1JJTkcgIChjaGFuLCBOdlNlbWEpOwogCQlPVVRfUklORyAgKGNoYW4sIHNlbWEtPm1lbS0+c3RhcnQpOwogCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX1NFTUFQSE9SRV9SRUxFQVNFLCAxKTsKIAkJT1VUX1JJTkcgIChjaGFuLCAxKTsKQEAgLTQwNywxMCArNDExLDEyIEBACiAJCXN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hID0gJmRldl9wcml2LT5mZW5jZS5iby0+dm1hOwogCQl1NjQgb2Zmc2V0ID0gdm1hLT5vZmZzZXQgKyBzZW1hLT5tZW0tPnN0YXJ0OwogCi0JCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNSk7CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgTlZfU1dfRE1BX1NFTUFQSE9SRSwgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgY2hhbi0+dnJhbV9oYW5kbGUpOwogCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIDB4MDAxMCwgNCk7CiAJCU9VVF9SSU5HICAoY2hhbiwgdXBwZXJfMzJfYml0cyhvZmZzZXQpKTsKIAkJT1VUX1JJTkcgIChjaGFuLCBsb3dlcl8zMl9iaXRzKG9mZnNldCkpOwpAQCAtNTA0LDIyICs1MTAsMjIgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiA9IE5VTEw7CiAJaW50IHJldDsKIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKQotCQlnb3RvIG91dF9pbml0aWFsaXNlZDsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0MwKSB7CisJCS8qIENyZWF0ZSBhbiBOVl9TVyBvYmplY3QgZm9yIHZhcmlvdXMgc3luYyBwdXJwb3NlcyAqLworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZTdywgTlZfU1cpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAotCS8qIENyZWF0ZSBhbiBOVl9TVyBvYmplY3QgZm9yIHZhcmlvdXMgc3luYyBwdXJwb3NlcyAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBOdlN3LCBOVl9TVyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQkvKiB3ZSBsZWF2ZSBzdWJjaGFubmVsIGVtcHR5IGZvciBudmMwICovCi0JcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMCwgMSk7Ci0JT1VUX1JJTkcoY2hhbiwgTnZTdyk7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMCwgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgTnZTdyk7CisJCUZJUkVfUklORyAoY2hhbik7CisJfQogCi0JLyogQ3JlYXRlIGEgRE1BIG9iamVjdCBmb3IgdGhlIHNoYXJlZCBjcm9zcy1jaGFubmVsIHN5bmMgYXJlYS4gKi8KKwkvKiBTZXR1cCBhcmVhIG9mIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBhbGwgY2hhbm5lbHMgZm9yIHgtY2hhbiBzeW5jICovCiAJaWYgKFVTRV9TRU1BKGRldikgJiYgZGV2X3ByaXYtPmNoaXBzZXQgPCAweDg0KSB7CiAJCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtID0gJmRldl9wcml2LT5mZW5jZS5iby0+Ym8ubWVtOwogCkBAIC01MzQsMjMgKzU0MCw4IEBACiAJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgTlZfU1dfRE1BX1NFTUFQSE9SRSwgMSk7Ci0JCU9VVF9SSU5HKGNoYW4sIE52U2VtYSk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgTlZfU1dfRE1BX1NFTUFQSE9SRSwgMSk7Ci0JCU9VVF9SSU5HICAoY2hhbiwgY2hhbi0+dnJhbV9oYW5kbGUpOyAvKiB3aG9sZSBWTSAqLwogCX0KIAotCUZJUkVfUklORyhjaGFuKTsKLQotb3V0X2luaXRpYWxpc2VkOgogCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKIAlzcGluX2xvY2tfaW5pdCgmY2hhbi0+ZmVuY2UubG9jayk7CiAJYXRvbWljX3NldCgmY2hhbi0+ZmVuY2UubGFzdF9zZXF1ZW5jZV9pcnEsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5jCmluZGV4IDA1M2VkZjkuLmJhODk2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmMKQEAgLTkwMCw2ICs5MDAsNyBAQAogCX0KIAkvKiBOVjExIGFuZCBOVjIwIGRvbid0IGhhdmUgdGhpcywgdGhleSBzdG9wIGF0IDB4NTIuICovCiAJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkgeworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzQyKTsKIAkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Myk7CiAJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTQpOwogCkBAIC0xMDAzLDYgKzEwMDQsNyBAQAogCQkJbm91dmVhdV93YWl0X2VxKGRldiwgNjUwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsIDB4OCwgMHgwKTsKIAkJfQogCisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNDIpOwogCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzUzKTsKIAkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81NCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCmluZGV4IDI5NjBmNTguLjVlZTE0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCWlmIChwY2lfZG1hX3N1cHBvcnRlZChkZXYtPnBkZXYsIERNQV9CSVRfTUFTSyg0MCkpKQogCQkJZG1hX2JpdHMgPSA0MDsKIAl9IGVsc2UKLQlpZiAoZHJtX3BjaV9kZXZpY2VfaXNfcGNpZShkZXYpICYmCisJaWYgKDAgJiYgZHJtX3BjaV9kZXZpY2VfaXNfcGNpZShkZXYpICYmCiAJICAgIGRldl9wcml2LT5jaGlwc2V0ICA+IDB4NDAgJiYKIAkgICAgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg0NSkgewogCQlpZiAocGNpX2RtYV9zdXBwb3J0ZWQoZGV2LT5wZGV2LCBETUFfQklUX01BU0soMzkpKSkKQEAgLTg2OCw3ICs4NjgsOSBAQAogCQlub3V2ZWF1X3ZtX3VubWFwKCZub2RlLT50bXBfdm1hKTsKIAkJbm91dmVhdV92bV9wdXQoJm5vZGUtPnRtcF92bWEpOwogCX0KKwogCW1lbS0+bW1fbm9kZSA9IE5VTEw7CisJa2ZyZWUobm9kZSk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wZXJmLmMKaW5kZXggOTIyZmI2Yi4uZWY5ZGVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wZXJmLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wZXJmLmMKQEAgLTE4Miw2ICsxODIsMTEgQEAKIAkJZW50cmllcyAgID0gcGVyZlsyXTsKIAl9CiAKKwlpZiAoZW50cmllcyA+IE5PVVZFQVVfUE1fTUFYX0xFVkVMKSB7CisJCU5WX0RFQlVHKGRldiwgInBlcmYgdGFibGUgaGFzIHRvbyBtYW55IGVudHJpZXMgLSBidWdneSB2Ymlvcz9cbiIpOworCQllbnRyaWVzID0gTk9VVkVBVV9QTV9NQVhfTEVWRUw7CisJfQorCiAJZW50cnkgPSBwZXJmICsgaGVhZGVybGVuOwogCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKIAkJc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKnBlcmZsdmwgPSAmcG0tPnBlcmZsdmxbcG0tPm5yX3BlcmZsdmxdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCmluZGV4IGM3NzExMWUuLjgyZmFkOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCQlkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPSBOT1VWRUFVX0dBUlRfSFc7CiAJCWRldl9wcml2LT5nYXJ0X2luZm8uZnVuYyA9ICZudjUwX3NnZG1hX2JhY2tlbmQ7CiAJfSBlbHNlCi0JaWYgKGRybV9wY2lfZGV2aWNlX2lzX3BjaWUoZGV2KSAmJgorCWlmICgwICYmIGRybV9wY2lfZGV2aWNlX2lzX3BjaWUoZGV2KSAmJgogCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA+IDB4NDAgJiYgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg0NSkgewogCQlpZiAobnY0NF9ncmFwaF9jbGFzcyhkZXYpKSB7CiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmZ1bmMgPSAmbnY0NF9zZ2RtYV9iYWNrZW5kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCmluZGV4IDM4ZWE2NjIuLjczMWFjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKQEAgLTU2Myw2OCArNTYzLDY4IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfdGltZXI7CiAKLQlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKLQljYXNlIE5WXzA0OgotCQludjA0X2dyYXBoX2NyZWF0ZShkZXYpOwotCQlicmVhazsKLQljYXNlIE5WXzEwOgotCQludjEwX2dyYXBoX2NyZWF0ZShkZXYpOwotCQlicmVhazsKLQljYXNlIE5WXzIwOgotCWNhc2UgTlZfMzA6Ci0JCW52MjBfZ3JhcGhfY3JlYXRlKGRldik7Ci0JCWJyZWFrOwotCWNhc2UgTlZfNDA6Ci0JCW52NDBfZ3JhcGhfY3JlYXRlKGRldik7Ci0JCWJyZWFrOwotCWNhc2UgTlZfNTA6Ci0JCW52NTBfZ3JhcGhfY3JlYXRlKGRldik7Ci0JCWJyZWFrOwotCWNhc2UgTlZfQzA6Ci0JCW52YzBfZ3JhcGhfY3JlYXRlKGRldik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKLQljYXNlIDB4ODQ6Ci0JY2FzZSAweDg2OgotCWNhc2UgMHg5MjoKLQljYXNlIDB4OTQ6Ci0JY2FzZSAweDk2OgotCWNhc2UgMHhhMDoKLQkJbnY4NF9jcnlwdF9jcmVhdGUoZGV2KTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7Ci0JY2FzZSBOVl81MDoKLQkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewotCQljYXNlIDB4YTM6Ci0JCWNhc2UgMHhhNToKLQkJY2FzZSAweGE4OgotCQljYXNlIDB4YWY6Ci0JCQludmEzX2NvcHlfY3JlYXRlKGRldik7CisJaWYgKCFub3V2ZWF1X25vYWNjZWwpIHsKKwkJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7CisJCWNhc2UgTlZfMDQ6CisJCQludjA0X2dyYXBoX2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgTlZfMTA6CisJCQludjEwX2dyYXBoX2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgTlZfMjA6CisJCWNhc2UgTlZfMzA6CisJCQludjIwX2dyYXBoX2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgTlZfNDA6CisJCQludjQwX2dyYXBoX2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgTlZfNTA6CisJCQludjUwX2dyYXBoX2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgTlZfQzA6CisJCQludmMwX2dyYXBoX2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQotCQlicmVhazsKLQljYXNlIE5WX0MwOgotCQludmMwX2NvcHlfY3JlYXRlKGRldiwgMCk7Ci0JCW52YzBfY29weV9jcmVhdGUoZGV2LCAxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQogCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCi0JCW52NDBfbXBlZ19jcmVhdGUoZGV2KTsKLQllbHNlCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTAgJiYKLQkgICAgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg5OCB8fCBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGEwKSkKLQkJbnY1MF9tcGVnX2NyZWF0ZShkZXYpOworCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJCWNhc2UgMHg4NDoKKwkJY2FzZSAweDg2OgorCQljYXNlIDB4OTI6CisJCWNhc2UgMHg5NDoKKwkJY2FzZSAweDk2OgorCQljYXNlIDB4YTA6CisJCQludjg0X2NyeXB0X2NyZWF0ZShkZXYpOworCQkJYnJlYWs7CisJCX0KIAotCWlmICghbm91dmVhdV9ub2FjY2VsKSB7CisJCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgeworCQljYXNlIE5WXzUwOgorCQkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCQkJY2FzZSAweGEzOgorCQkJY2FzZSAweGE1OgorCQkJY2FzZSAweGE4OgorCQkJY2FzZSAweGFmOgorCQkJCW52YTNfY29weV9jcmVhdGUoZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5WX0MwOgorCQkJbnZjMF9jb3B5X2NyZWF0ZShkZXYsIDApOworCQkJbnZjMF9jb3B5X2NyZWF0ZShkZXYsIDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQkJbnY0MF9tcGVnX2NyZWF0ZShkZXYpOworCQllbHNlCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwICYmCisJCSAgICAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDk4IHx8IGRldl9wcml2LT5jaGlwc2V0ID09IDB4YTApKQorCQkJbnY1MF9tcGVnX2NyZWF0ZShkZXYpOworCiAJCWZvciAoZSA9IDA7IGUgPCBOVk9CSl9FTkdJTkVfTlI7IGUrKykgewogCQkJaWYgKGRldl9wcml2LT5lbmdbZV0pIHsKIAkJCQlyZXQgPSBkZXZfcHJpdi0+ZW5nW2VdLT5pbml0KGRldiwgZSk7CkBAIC04ODAsOCArODgwLDggQEAKIAogI2lmZGVmIF9fQklHX0VORElBTgogCS8qIFB1dCB0aGUgY2FyZCBpbiBCRSBtb2RlIGlmIGl0J3Mgbm90ICovCi0JaWYgKG52X3JkMzIoZGV2LCBOVjAzX1BNQ19CT09UXzEpKQotCQludl93cjMyKGRldiwgTlYwM19QTUNfQk9PVF8xLCAweDAwMDAwMDAxKTsKKwlpZiAobnZfcmQzMihkZXYsIE5WMDNfUE1DX0JPT1RfMSkgIT0gMHgwMTAwMDAwMSkKKwkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0JPT1RfMSwgMHgwMTAwMDAwMSk7CiAKIAlEUk1fTUVNT1JZQkFSUklFUigpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmMKaW5kZXggMDA1OWU2Zi4uNTE5YTZiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYwpAQCAtNTgsNiArNTgsNyBAQAogCQkJbnVtIC09IGxlbjsKIAkJCXB0ZSArPSBsZW47CiAJCQlpZiAodW5saWtlbHkoZW5kID49IG1heCkpIHsKKwkJCQlwaHlzICs9IGxlbiA8PCAoYml0cyArIDEyKTsKIAkJCQlwZGUrKzsKIAkJCQlwdGUgPSAwOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2NydGMuYwppbmRleCAzYzc4YmM4Li5mMWEzYWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2NydGMuYwpAQCAtMzc2LDcgKzM3NiwxMCBAQAogCSAqLwogCiAJLyogZnJhbWVidWZmZXIgY2FuIGJlIGxhcmdlciB0aGFuIGNydGMgc2Nhbm91dCBhcmVhLiAqLwotCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9SUEMwX0lOREVYXSA9IFhMQVRFKGZiLT5waXRjaCAvIDgsIDgsIE5WX0NJT19DUkVfUlBDMF9PRkZTRVRfMTBfOCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1JQQzBfSU5ERVhdID0KKwkJWExBVEUoZmItPnBpdGNoIC8gOCwgOCwgTlZfQ0lPX0NSRV9SUEMwX09GRlNFVF8xMF84KTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfNDJdID0KKwkJWExBVEUoZmItPnBpdGNoIC8gOCwgMTEsIE5WX0NJT19DUkVfNDJfT0ZGU0VUXzExKTsKIAlyZWdwLT5DUlRDW05WX0NJT19DUkVfUlBDMV9JTkRFWF0gPSBtb2RlLT5jcnRjX2hkaXNwbGF5IDwgMTI4MCA/CiAJCQkJCSAgICBNQVNLKE5WX0NJT19DUkVfUlBDMV9MQVJHRSkgOiAweDAwOwogCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9MU1JfSU5ERVhdID0gWExBVEUoaG9yaXpCbGFua0VuZCwgNiwgTlZfQ0lPX0NSRV9MU1JfSEJFXzYpIHwKQEAgLTgyNCw4ICs4MjcsMTEgQEAKIAlyZWdwLT5DUlRDW05WX0NJT19DUl9PRkZTRVRfSU5ERVhdID0gZHJtX2ZiLT5waXRjaCA+PiAzOwogCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9SUEMwX0lOREVYXSA9CiAJCVhMQVRFKGRybV9mYi0+cGl0Y2ggPj4gMywgOCwgTlZfQ0lPX0NSRV9SUEMwX09GRlNFVF8xMF84KTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfNDJdID0KKwkJWExBVEUoZHJtX2ZiLT5waXRjaCAvIDgsIDExLCBOVl9DSU9fQ1JFXzQyX09GRlNFVF8xMSk7CiAJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSRV9SUEMwX0lOREVYKTsKIAljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JfT0ZGU0VUX0lOREVYKTsKKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFXzQyKTsKIAogCS8qIFVwZGF0ZSB0aGUgZnJhbWVidWZmZXIgbG9jYXRpb24uICovCiAJcmVncC0+ZmJfc3RhcnQgPSBudl9jcnRjLT5mYi5vZmZzZXQgJiB+MzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKaW5kZXggNzRhM2Y2OC4uMDhkYTQ3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKQEAgLTQwOSw3ICs0MDksNyBAQAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRpc3BjLT5zeW5jOwogCWludCByZXQ7CiAKLQlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMjQpOworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCBjaGFuID8gMjUgOiAyNyk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldHVybiByZXQ7CiAKQEAgLTQ1OCw4ICs0NTgsMTkgQEAKIAkvKiBxdWV1ZSB0aGUgZmxpcCBvbiB0aGUgY3J0YydzICJkaXNwbGF5IHN5bmMiIGNoYW5uZWwgKi8KIAlCRUdJTl9SSU5HKGV2bywgMCwgMHgwMTAwLCAxKTsKIAlPVVRfUklORyAgKGV2bywgMHhmZmZlMDAwMCk7Ci0JQkVHSU5fUklORyhldm8sIDAsIDB4MDA4NCwgNSk7Ci0JT1VUX1JJTkcgIChldm8sIGNoYW4gPyAweDAwMDAwMTAwIDogMHgwMDAwMDAxMCk7CisJaWYgKGNoYW4pIHsKKwkJQkVHSU5fUklORyhldm8sIDAsIDB4MDA4NCwgMSk7CisJCU9VVF9SSU5HICAoZXZvLCAweDAwMDAwMTAwKTsKKwl9IGVsc2UgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgMHgwMDg0LCAxKTsKKwkJT1VUX1JJTkcgIChldm8sIDB4MDAwMDAwMTApOworCQkvKiBhbGxvd3MgZ2FtbWEgc29tZWhvdywgUERJU1Agd2lsbCBiaXRjaCBhdCB5b3UgaWYKKwkJICogeW91IGRvbid0IHdhaXQgZm9yIHZibGFuayBiZWZvcmUgY2hhbmdpbmcgdGhpcy4uCisJCSAqLworCQlCRUdJTl9SSU5HKGV2bywgMCwgMHgwMGUwLCAxKTsKKwkJT1VUX1JJTkcgIChldm8sIDB4NDAwMDAwMDApOworCX0KKwlCRUdJTl9SSU5HKGV2bywgMCwgMHgwMDg4LCA0KTsKIAlPVVRfUklORyAgKGV2bywgZGlzcGMtPnNlbS5vZmZzZXQpOwogCU9VVF9SSU5HICAoZXZvLCAweGYwMGQwMDAwIHwgZGlzcGMtPnNlbS52YWx1ZSk7CiAJT1VUX1JJTkcgIChldm8sIDB4NzRiMWUwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKaW5kZXggZmUwZjI1My4uYmJmYjFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oCkBAIC0yNzcsNiArMjc3LDggQEAKICMJCWRlZmluZSBOVl9DSU9fQ1JFX0VCUl9WREVfMTEJCTI6MgogIwkJZGVmaW5lIE5WX0NJT19DUkVfRUJSX1ZSU18xMQkJNDo0CiAjCQlkZWZpbmUgTlZfQ0lPX0NSRV9FQlJfVkJTXzExCQk2OjYKKyMJZGVmaW5lIE5WX0NJT19DUkVfNDIJCQkweDQyCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV80Ml9PRkZTRVRfMTEJCTY6NgogIwlkZWZpbmUgTlZfQ0lPX0NSRV80MwkJCTB4NDMKICMJZGVmaW5lIE5WX0NJT19DUkVfNDQJCQkweDQ0CS8qIGhlYWQgY29udHJvbCAqLwogIwlkZWZpbmUgTlZfQ0lPX0NSRV9DU0IJCQkweDQ1CS8qIGNvbG91ciBzYXR1cmF0aW9uIGJvb3N0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL0tjb25maWcKaW5kZXggOTc0NmZlZS4uZWE5MmJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vS2NvbmZpZwpAQCAtMjgsMTEgKzI4LDQgQEAKIAkgIFRoZSBrZXJuZWwgd2lsbCBhbHNvIHBlcmZvcm0gc2VjdXJpdHkgY2hlY2sgb24gY29tbWFuZCBzdHJlYW0KIAkgIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLCB3ZSB3YW50IHRvIGNhdGNoIGFuZCBmb3JiaWQgYW55IGlsbGVnYWwgdXNlCiAJICBvZiB0aGUgR1BVIHN1Y2ggYXMgRE1BIGludG8gcmFuZG9tIHN5c3RlbSBtZW1vcnkgb3IgaW50byBtZW1vcnkKLQkgIG5vdCBvd25lZCBieSB0aGUgcHJvY2VzcyBzdXBwbHlpbmcgdGhlIGNvbW1hbmQgc3RyZWFtLiBUaGlzIHBhcnQKLQkgIG9mIHRoZSBjb2RlIGlzIHN0aWxsIGluY29tcGxldGUgYW5kIHRoaXMgd2h5IHdlIHByb3Bvc2UgdGhhdCBwYXRjaAotCSAgYXMgYSBzdGFnaW5nIGRyaXZlciBhZGRpdGlvbiwgZnV0dXJlIHNlY3VyaXR5IG1pZ2h0IGZvcmJpZCBjdXJyZW50Ci0JICBleHBlcmltZW50YWwgdXNlcnNwYWNlIHRvIHJ1bi4KLQotCSAgVGhpcyBjb2RlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBoYXJkd2FyZSA6IFIxWFgsUjJYWCxSM1hYLFI0WFgsUjVYWAotCSAgKHJhZGVvbiB1cCB0byBYMTk1MCkuIFdvcmtzIGlzIHVuZGVyd2F5IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgUjZYWCwKLQkgIFI3WFggYW5kIG5ld2VyIGhhcmR3YXJlIChyYWRlb24gZnJvbSBIRDJYWFggdG8gSEQ0WFhYKS4KKwkgIG5vdCBvd25lZCBieSB0aGUgcHJvY2VzcyBzdXBwbHlpbmcgdGhlIGNvbW1hbmQgc3RyZWFtLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oCmluZGV4IDQ5NjExZTIuLjFiNTBhZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmgKQEAgLTEyMDAsNiArMTIwMCw3IEBACiAjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkdfT0ZGICAgMHgxMAogI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HICAgICAgIDB4MTEKICNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfREFDTE9BRF9ERVRFQ1RJT04gICAgICAweDEyCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0REQ19TRVRVUCAgICAgICAgICAgICAgMHgxNAogCiAvLyB1Y0NvbmZpZwogI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFX01BU0sJCQkJMHgwMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwppbmRleCBlYzg0ODc4Li45NTQxOTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwpAQCAtNjcxLDYgKzY3MSwxMyBAQAogCQkJCQkJCQlESVNQUExMX0NPTkZJR19EVUFMX0xJTks7CiAJCQkJCX0KIAkJCQl9CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkgeworCQkJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisJCQkJCXN0cnVjdCByYWRlb25fZW5jb2RlciAqZXh0X3JhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZXh0X2VuY29kZXIpOworCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0V4dFRyYW5zbWl0dGVySUQgPSBleHRfcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQ7CisJCQkJfSBlbHNlCisJCQkJCWFyZ3MudjMuc0lucHV0LnVjRXh0VHJhbnNtaXR0ZXJJRCA9IDA7CisKIAkJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwKIAkJCQkJCSAgIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CiAJCQkJYWRqdXN0ZWRfY2xvY2sgPSBsZTMyX3RvX2NwdShhcmdzLnYzLnNPdXRwdXQudWxEaXNwUGxsRnJlcSkgKiAxMDsKQEAgLTEwNDUsNyArMTA1Miw3IEBACiAJdWludDY0X3QgZmJfbG9jYXRpb247CiAJdWludDMyX3QgZmJfZm9ybWF0LCBmYl9waXRjaF9waXhlbHMsIHRpbGluZ19mbGFnczsKIAl1MzIgZmJfc3dhcCA9IEVWRVJHUkVFTl9HUlBIX0VORElBTl9TV0FQKEVWRVJHUkVFTl9HUlBIX0VORElBTl9OT05FKTsKLQl1MzIgdG1wOworCXUzMiB0bXAsIHZpZXdwb3J0X3csIHZpZXdwb3J0X2g7CiAJaW50IHI7CiAKIAkvKiBubyBmYiBib3VuZCAqLwpAQCAtMTE3MSw4ICsxMTc4LDEwIEBACiAJeSAmPSB+MTsKIAlXUkVHMzIoRVZFUkdSRUVOX1ZJRVdQT1JUX1NUQVJUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAogCSAgICAgICAoeCA8PCAxNikgfCB5KTsKKwl2aWV3cG9ydF93ID0gY3J0Yy0+bW9kZS5oZGlzcGxheTsKKwl2aWV3cG9ydF9oID0gKGNydGMtPm1vZGUudmRpc3BsYXkgKyAxKSAmIH4xOwogCVdSRUczMihFVkVSR1JFRU5fVklFV1BPUlRfU0laRSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKLQkgICAgICAgKGNydGMtPm1vZGUuaGRpc3BsYXkgPDwgMTYpIHwgY3J0Yy0+bW9kZS52ZGlzcGxheSk7CisJICAgICAgICh2aWV3cG9ydF93IDw8IDE2KSB8IHZpZXdwb3J0X2gpOwogCiAJLyogcGFnZWZsaXAgc2V0dXAgKi8KIAkvKiBtYWtlIHN1cmUgZmxpcCBpcyBhdCB2YiByYXRoZXIgdGhhbiBoYiAqLwpAQCAtMTIxMyw3ICsxMjIyLDcgQEAKIAl1aW50NjRfdCBmYl9sb2NhdGlvbjsKIAl1aW50MzJfdCBmYl9mb3JtYXQsIGZiX3BpdGNoX3BpeGVscywgdGlsaW5nX2ZsYWdzOwogCXUzMiBmYl9zd2FwID0gUjYwMF9EMUdSUEhfU1dBUF9FTkRJQU5fTk9ORTsKLQl1MzIgdG1wOworCXUzMiB0bXAsIHZpZXdwb3J0X3csIHZpZXdwb3J0X2g7CiAJaW50IHI7CiAKIAkvKiBubyBmYiBib3VuZCAqLwpAQCAtMTMzOCw4ICsxMzQ3LDEwIEBACiAJeSAmPSB+MTsKIAlXUkVHMzIoQVZJVk9fRDFNT0RFX1ZJRVdQT1JUX1NUQVJUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAogCSAgICAgICAoeCA8PCAxNikgfCB5KTsKKwl2aWV3cG9ydF93ID0gY3J0Yy0+bW9kZS5oZGlzcGxheTsKKwl2aWV3cG9ydF9oID0gKGNydGMtPm1vZGUudmRpc3BsYXkgKyAxKSAmIH4xOwogCVdSRUczMihBVklWT19EMU1PREVfVklFV1BPUlRfU0laRSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKLQkgICAgICAgKGNydGMtPm1vZGUuaGRpc3BsYXkgPDwgMTYpIHwgY3J0Yy0+bW9kZS52ZGlzcGxheSk7CisJICAgICAgICh2aWV3cG9ydF93IDw8IDE2KSB8IHZpZXdwb3J0X2gpOwogCiAJLyogcGFnZWZsaXAgc2V0dXAgKi8KIAkvKiBtYWtlIHN1cmUgZmxpcCBpcyBhdCB2YiByYXRoZXIgdGhhbiBoYiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuYwppbmRleCBlMTQ4YWIwLi43YjRlZWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuYwpAQCAtMzksMTcgKzM5LDMzNSBAQAogCiBjb25zdCB1MzIgY2F5bWFuX2RlZmF1bHRfc3RhdGVbXSA9CiB7Ci0JLyogWFhYIGZpbGwgaW4gYWRkaXRpb25hbCBibGl0IHN0YXRlICovCisJMHhjMDA2NjkwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwNjAsIC8qIERCX1JFTkRFUl9DT05UUk9MICovCisJMHgwMDAwMDAwMCwgLyogREJfQ09VTlRfQ09OVFJPTCAqLworCTB4MDAwMDAwMDAsIC8qIERCX0RFUFRIX1ZJRVcgKi8KKwkweDAwMDAwMDJhLCAvKiBEQl9SRU5ERVJfT1ZFUlJJREUgKi8KKwkweDAwMDAwMDAwLCAvKiBEQl9SRU5ERVJfT1ZFUlJJREUyICovCisJMHgwMDAwMDAwMCwgLyogREJfSFRJTEVfREFUQV9CQVNFICovCiAKIAkweGMwMDI2OTAwLAotCTB4MDAwMDAzMTYsCi0JMHgwMDAwMDAwZSwgLyogVkdUX1ZFUlRFWF9SRVVTRV9CTE9DS19DTlRMICovCi0JMHgwMDAwMDAxMCwgLyogICovCisJMHgwMDAwMDAwYSwKKwkweDAwMDAwMDAwLCAvKiBEQl9TVEVOQ0lMX0NMRUFSICovCisJMHgwMDAwMDAwMCwgLyogREJfREVQVEhfQ0xFQVIgKi8KKworCTB4YzAwMzY5MDAsCisJMHgwMDAwMDAwZiwKKwkweDAwMDAwMDAwLCAvKiBEQl9ERVBUSF9JTkZPICovCisJMHgwMDAwMDAwMCwgLyogREJfWl9JTkZPICovCisJMHgwMDAwMDAwMCwgLyogREJfU1RFTkNJTF9JTkZPICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAwODAsCisJMHgwMDAwMDAwMCwgLyogUEFfU0NfV0lORE9XX09GRlNFVCAqLworCisJMHhjMDBkNjkwMCwKKwkweDAwMDAwMDgzLAorCTB4MDAwMGZmZmYsIC8qIFBBX1NDX0NMSVBSRUNUX1JVTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19DTElQUkVDVF8wX1RMICovCisJMHgyMDAwMjAwMCwgLyogUEFfU0NfQ0xJUFJFQ1RfMF9CUiAqLworCTB4MDAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDAwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHgwMDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4YWFhYWFhYWEsIC8qIFBBX1NDX0VER0VSVUxFICovCisJMHgwMDAwMDAwMCwgLyogUEFfU1VfSEFSRFdBUkVfU0NSRUVOX09GRlNFVCAqLworCTB4MDAwMDAwMGYsIC8qIENCX1RBUkdFVF9NQVNLICovCisJMHgwMDAwMDAwZiwgLyogQ0JfU0hBREVSX01BU0sgKi8KKworCTB4YzAyMjY5MDAsCisJMHgwMDAwMDA5NCwKKwkweDgwMDAwMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzBfVEwgKi8KKwkweDIwMDAyMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzBfQlIgKi8KKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19WUE9SVF9aTUlOXzAgKi8KKwkweDNmODAwMDAwLCAvKiBQQV9TQ19WUE9SVF9aTUFYXzAgKi8KKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDBkNCwKKwkweDAwMDAwMDAwLCAvKiBTWF9NSVNDICovCiAKIAkweGMwMDI2OTAwLAogCTB4MDAwMDAwZDksCiAJMHgwMDAwMDAwMCwgLyogQ1BfUklOR0lEICovCiAJMHgwMDAwMDAwMCwgLyogQ1BfVk1JRCAqLworCisJMHhjMDA5NjkwMCwKKwkweDAwMDAwMTAwLAorCTB4MDBmZmZmZmYsIC8qIFZHVF9NQVhfVlRYX0lORFggKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfTUlOX1ZUWF9JTkRYICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0lORFhfT0ZGU0VUICovCisJMHgwMDAwMDAwMCwgLyogVkdUX01VTFRJX1BSSU1fSUJfUkVTRVRfSU5EWCAqLworCTB4MDAwMDAwMDAsIC8qIFNYX0FMUEhBX1RFU1RfQ09OVFJPTCAqLworCTB4MDAwMDAwMDAsIC8qIENCX0JMRU5EX1JFRCAqLworCTB4MDAwMDAwMDAsIC8qIENCX0JMRU5EX0dSRUVOICovCisJMHgwMDAwMDAwMCwgLyogQ0JfQkxFTkRfQkxVRSAqLworCTB4MDAwMDAwMDAsIC8qIENCX0JMRU5EX0FMUEhBICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAxODcsCisJMHgwMDAwMDEwMCwgLyogU1BJX1ZTX09VVF9JRF8wICovCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAxOTEsCisJMHgwMDAwMDEwMCwgLyogU1BJX1BTX0lOUFVUX0NOVExfMCAqLworCTB4MDAwMDAxMDEsIC8qIFNQSV9QU19JTlBVVF9DTlRMXzEgKi8KKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDFiMSwKKwkweDAwMDAwMDAwLCAvKiBTUElfVlNfT1VUX0NPTkZJRyAqLworCisJMHhjMDEwNjkwMCwKKwkweDAwMDAwMWIzLAorCTB4MjAwMDAwMDEsIC8qIFNQSV9QU19JTl9DT05UUk9MXzAgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfUFNfSU5fQ09OVFJPTF8xICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0lOVEVSUF9DT05UUk9MXzAgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfSU5QVVRfWiAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9GT0dfQ05UTCAqLworCTB4MDAxMDAwMDAsIC8qIFNQSV9CQVJZQ19DTlRMICovCisJMHgwMDAwMDAwMCwgLyogU1BJX1BTX0lOX0NPTlRST0xfMiAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9DT01QVVRFX0lOUFVUX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfQ09NUFVURV9OVU1fVEhSRUFEX1ggKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfQ09NUFVURV9OVU1fVEhSRUFEX1kgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfQ09NUFVURV9OVU1fVEhSRUFEX1ogKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfR1BSX01HTVQgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfTERTX01HTVQgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfU1RBQ0tfTUdNVCAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9XQVZFX01HTVRfMSAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9XQVZFX01HTVRfMiAqLworCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMWUwLAorCTB4MDAwMDAwMDAsIC8qIENCX0JMRU5EMF9DT05UUk9MICovCisKKwkweGMwMGU2OTAwLAorCTB4MDAwMDAyMDAsCisJMHgwMDAwMDAwMCwgLyogREJfREVQVEhfQ09OVFJPTCAqLworCTB4MDAwMDAwMDAsIC8qIERCX0VRQUEgKi8KKwkweDAwY2MwMDEwLCAvKiBDQl9DT0xPUl9DT05UUk9MICovCisJMHgwMDAwMDIxMCwgLyogREJfU0hBREVSX0NPTlRST0wgKi8KKwkweDAwMDEwMDAwLCAvKiBQQV9DTF9DTElQX0NOVEwgKi8KKwkweDAwMDAwMDA0LCAvKiBQQV9TVV9TQ19NT0RFX0NOVEwgKi8KKwkweDAwMDAwMTAwLCAvKiBQQV9DTF9WVEVfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX0NMX1ZTX09VVF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogUEFfQ0xfTkFOSU5GX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9MSU5FX1NUSVBQTEVfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX0xJTkVfU1RJUFBMRV9TQ0FMRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BSSU1fRklMVEVSX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiAgKi8KKwkweDAwMDAwMDAwLCAvKiAgKi8KKworCTB4YzAwMjY5MDAsCisJMHgwMDAwMDIyOSwKKwkweDAwMDAwMDAwLCAvKiBTUV9QR01fU1RBUlRfRlMgKi8KKwkweDAwMDAwMDAwLAorCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMjNiLAorCTB4MDAwMDAwMDAsIC8qIFNRX0xEU19BTExPQ19QUyAqLworCisJMHhjMDA2NjkwMCwKKwkweDAwMDAwMjQwLAorCTB4MDAwMDAwMDAsIC8qIFNRX0VTR1NfUklOR19JVEVNU0laRSAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKworCTB4YzAwNDY5MDAsCisJMHgwMDAwMDI0NywKKwkweDAwMDAwMDAwLCAvKiBTUV9HU19WRVJUX0lURU1TSVpFICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisKKwkweGMwMTE2OTAwLAorCTB4MDAwMDAyODAsCisJMHgwMDAwMDAwMCwgLyogUEFfU1VfUE9JTlRfU0laRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPSU5UX01JTk1BWCAqLworCTB4MDAwMDAwMDgsIC8qIFBBX1NVX0xJTkVfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX0xJTkVfU1RJUFBMRSAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9PVVRQVVRfUEFUSF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0hPU19DTlRMICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBWR1RfR1NfTU9ERSAqLworCisJMHhjMDAyNjkwMCwKKwkweDAwMDAwMjkyLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX01PREVfQ05UTF8wICovCisJMHgwMDAwMDAwMCwgLyogUEFfU0NfTU9ERV9DTlRMXzEgKi8KKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDJhMSwKKwkweDAwMDAwMDAwLCAvKiBWR1RfUFJJTUlUSVZFSURfRU4gKi8KKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDJhNSwKKwkweDAwMDAwMDAwLCAvKiBWR1RfTVVMVElfUFJJTV9JQl9SRVNFVF9FTiAqLworCisJMHhjMDAyNjkwMCwKKwkweDAwMDAwMmE4LAorCTB4MDAwMDAwMDAsIC8qIFZHVF9JTlNUQU5DRV9TVEVQX1JBVEVfMCAqLworCTB4MDAwMDAwMDAsCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAyYWQsCisJMHgwMDAwMDAwMCwgLyogVkdUX1JFVVNFX09GRiAqLworCTB4MDAwMDAwMDAsCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAyZDUsCisJMHgwMDAwMDAwMCwgLyogVkdUX1NIQURFUl9TVEFHRVNfRU4gKi8KKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDJkYywKKwkweDAwMDBhYTAwLCAvKiBEQl9BTFBIQV9UT19NQVNLICovCisKKwkweGMwMDY2OTAwLAorCTB4MDAwMDAyZGUsCisJMHgwMDAwMDAwMCwgLyogUEFfU1VfUE9MWV9PRkZTRVRfREJfRk1UX0NOVEwgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAyZTUsCisJMHgwMDAwMDAwMCwgLyogVkdUX1NUUk1PVVRfQ09ORklHICovCisJMHgwMDAwMDAwMCwKKworCTB4YzAxYjY5MDAsCisJMHgwMDAwMDJmNSwKKwkweDc2NTQzMjEwLCAvKiBQQV9TQ19DRU5UUk9JRF9QUklPUklUWV8wICovCisJMHhmZWRjYmE5OCwgLyogUEFfU0NfQ0VOVFJPSURfUFJJT1JJVFlfMSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX0xJTkVfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX0FBX0NPTkZJRyAqLworCTB4MDAwMDAwMDUsIC8qIFBBX1NVX1ZUWF9DTlRMICovCisJMHgzZjgwMDAwMCwgLyogUEFfQ0xfR0JfVkVSVF9DTElQX0FESiAqLworCTB4M2Y4MDAwMDAsIC8qIFBBX0NMX0dCX1ZFUlRfRElTQ19BREogKi8KKwkweDNmODAwMDAwLCAvKiBQQV9DTF9HQl9IT1JaX0NMSVBfQURKICovCisJMHgzZjgwMDAwMCwgLyogUEFfQ0xfR0JfSE9SWl9ESVNDX0FESiAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX0FBX1NBTVBMRV9MT0NTX1BJWEVMX1gwWTBfMCAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4ZmZmZmZmZmYsIC8qIFBBX1NDX0FBX01BU0tfWDBZMF9YMVkwICovCisJMHhmZmZmZmZmZiwKKworCTB4YzAwMjY5MDAsCisJMHgwMDAwMDMxNiwKKwkweDAwMDAwMDBlLCAvKiBWR1RfVkVSVEVYX1JFVVNFX0JMT0NLX0NOVEwgKi8KKwkweDAwMDAwMDEwLCAvKiAgKi8KIH07CiAKK2NvbnN0IHUzMiBjYXltYW5fdnNbXSA9Cit7CisJMHgwMDAwMDAwNCwKKwkweDgwNDAwNDAwLAorCTB4MDAwMGEwM2MsCisJMHg5NTAwMDY4OCwKKwkweDAwMDA0MDAwLAorCTB4MTUwMDA2ODgsCisJMHgwMDAwMDAwMCwKKwkweDg4MDAwMDAwLAorCTB4MDQwMDAwMDAsCisJMHg2Nzk2MTAwMSwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkweDAwMDIwMDAwLAorI2Vsc2UKKwkweDAwMDAwMDAwLAorI2VuZGlmCisJMHgwMDAwMDAwMCwKKwkweDA0MDAwMDAwLAorCTB4Njc5NjEwMDAsCisjaWZkZWYgX19CSUdfRU5ESUFOCisJMHgwMDAyMDAwOCwKKyNlbHNlCisJMHgwMDAwMDAwOCwKKyNlbmRpZgorCTB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzIgY2F5bWFuX3BzW10gPQoreworCTB4MDAwMDAwMDQsCisJMHhhMDBjMDAwMCwKKwkweDAwMDAwMDA4LAorCTB4ODA0MDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDk1MDAwNjg4LAorCTB4MDAwMDAwMDAsCisJMHg4ODAwMDAwMCwKKwkweDAwMzgwNDAwLAorCTB4MDAxNDZiMTAsCisJMHgwMDM4MDAwMCwKKwkweDIwMTQ2YjEwLAorCTB4MDAzODA0MDAsCisJMHg0MDE0NmIwMCwKKwkweDgwMzgwMDAwLAorCTB4NjAxNDZiMDAsCisJMHgwMDAwMDAxMCwKKwkweDAwMGQxMDAwLAorCTB4YjA4MDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK2NvbnN0IHUzMiBjYXltYW5fcHNfc2l6ZSA9IEFSUkFZX1NJWkUoY2F5bWFuX3BzKTsKK2NvbnN0IHUzMiBjYXltYW5fdnNfc2l6ZSA9IEFSUkFZX1NJWkUoY2F5bWFuX3ZzKTsKIGNvbnN0IHUzMiBjYXltYW5fZGVmYXVsdF9zaXplID0gQVJSQVlfU0laRShjYXltYW5fZGVmYXVsdF9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2F5bWFuX2JsaXRfc2hhZGVycy5oCmluZGV4IDMzYjc1ZTVkLi5mNWQwZTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuaApAQCAtMjUsOCArMjUsMTEgQEAKICNpZm5kZWYgQ0FZTUFOX0JMSVRfU0hBREVSU19ICiAjZGVmaW5lIENBWU1BTl9CTElUX1NIQURFUlNfSAogCitleHRlcm4gY29uc3QgdTMyIGNheW1hbl9wc1tdOworZXh0ZXJuIGNvbnN0IHUzMiBjYXltYW5fdnNbXTsKIGV4dGVybiBjb25zdCB1MzIgY2F5bWFuX2RlZmF1bHRfc3RhdGVbXTsKIAorZXh0ZXJuIGNvbnN0IHUzMiBjYXltYW5fcHNfc2l6ZSwgY2F5bWFuX3ZzX3NpemU7CiBleHRlcm4gY29uc3QgdTMyIGNheW1hbl9kZWZhdWx0X3NpemU7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKaW5kZXggN2MzNzYzOC4uMTViZDA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCkBAIC04OCwyMSArODgsNDAgQEAKIC8qIGdldCB0ZW1wZXJhdHVyZSBpbiBtaWxsaWRlZ3JlZXMgKi8KIGludCBldmVyZ3JlZW5fZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdTMyIHRlbXAgPSAoUlJFRzMyKENHX01VTFRfVEhFUk1BTF9TVEFUVVMpICYgQVNJQ19UX01BU0spID4+Ci0JCUFTSUNfVF9TSElGVDsKLQl1MzIgYWN0dWFsX3RlbXAgPSAwOworCXUzMiB0ZW1wLCB0b2Zmc2V0OworCWludCBhY3R1YWxfdGVtcCA9IDA7CiAKLQlpZiAodGVtcCAmIDB4NDAwKQotCQlhY3R1YWxfdGVtcCA9IC0yNTY7Ci0JZWxzZSBpZiAodGVtcCAmIDB4MjAwKQotCQlhY3R1YWxfdGVtcCA9IDI1NTsKLQllbHNlIGlmICh0ZW1wICYgMHgxMDApIHsKLQkJYWN0dWFsX3RlbXAgPSB0ZW1wICYgMHgxZmY7Ci0JCWFjdHVhbF90ZW1wIHw9IH4weDFmZjsKLQl9IGVsc2UKLQkJYWN0dWFsX3RlbXAgPSB0ZW1wICYgMHhmZjsKKwlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfSlVOSVBFUikgeworCQl0b2Zmc2V0ID0gKFJSRUczMihDR19USEVSTUFMX0NUUkwpICYgVE9GRlNFVF9NQVNLKSA+PgorCQkJVE9GRlNFVF9TSElGVDsKKwkJdGVtcCA9IChSUkVHMzIoQ0dfVFMwX1NUQVRVUykgJiBUUzBfQURDX0RPVVRfTUFTSykgPj4KKwkJCVRTMF9BRENfRE9VVF9TSElGVDsKIAotCXJldHVybiAoYWN0dWFsX3RlbXAgKiAxMDAwKSAvIDI7CisJCWlmICh0b2Zmc2V0ICYgMHgxMDApCisJCQlhY3R1YWxfdGVtcCA9IHRlbXAgLyAyIC0gKDB4MjAwIC0gdG9mZnNldCk7CisJCWVsc2UKKwkJCWFjdHVhbF90ZW1wID0gdGVtcCAvIDIgKyB0b2Zmc2V0OworCisJCWFjdHVhbF90ZW1wID0gYWN0dWFsX3RlbXAgKiAxMDAwOworCisJfSBlbHNlIHsKKwkJdGVtcCA9IChSUkVHMzIoQ0dfTVVMVF9USEVSTUFMX1NUQVRVUykgJiBBU0lDX1RfTUFTSykgPj4KKwkJCUFTSUNfVF9TSElGVDsKKworCQlpZiAodGVtcCAmIDB4NDAwKQorCQkJYWN0dWFsX3RlbXAgPSAtMjU2OworCQllbHNlIGlmICh0ZW1wICYgMHgyMDApCisJCQlhY3R1YWxfdGVtcCA9IDI1NTsKKwkJZWxzZSBpZiAodGVtcCAmIDB4MTAwKSB7CisJCQlhY3R1YWxfdGVtcCA9IHRlbXAgJiAweDFmZjsKKwkJCWFjdHVhbF90ZW1wIHw9IH4weDFmZjsKKwkJfSBlbHNlCisJCQlhY3R1YWxfdGVtcCA9IHRlbXAgJiAweGZmOworCisJCWFjdHVhbF90ZW1wID0gKGFjdHVhbF90ZW1wICogMTAwMCkgLyAyOworCX0KKworCXJldHVybiBhY3R1YWxfdGVtcDsKIH0KIAogaW50IHN1bW9fZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0xMjEsMTEgKzE0MCwxNyBAQAogCXN0cnVjdCByYWRlb25fdm9sdGFnZSAqdm9sdGFnZSA9ICZwcy0+Y2xvY2tfaW5mb1tyZXFfY21faWR4XS52b2x0YWdlOwogCiAJaWYgKHZvbHRhZ2UtPnR5cGUgPT0gVk9MVEFHRV9TVykgeworCQkvKiAweGZmMDEgaXMgYSBmbGFnIHJhdGhlciB0aGVuIGFuIGFjdHVhbCB2b2x0YWdlICovCisJCWlmICh2b2x0YWdlLT52b2x0YWdlID09IDB4ZmYwMSkKKwkJCXJldHVybjsKIAkJaWYgKHZvbHRhZ2UtPnZvbHRhZ2UgJiYgKHZvbHRhZ2UtPnZvbHRhZ2UgIT0gcmRldi0+cG0uY3VycmVudF92ZGRjKSkgewogCQkJcmFkZW9uX2F0b21fc2V0X3ZvbHRhZ2UocmRldiwgdm9sdGFnZS0+dm9sdGFnZSwgU0VUX1ZPTFRBR0VfVFlQRV9BU0lDX1ZEREMpOwogCQkJcmRldi0+cG0uY3VycmVudF92ZGRjID0gdm9sdGFnZS0+dm9sdGFnZTsKIAkJCURSTV9ERUJVRygiU2V0dGluZzogdmRkYzogJWRcbiIsIHZvbHRhZ2UtPnZvbHRhZ2UpOwogCQl9CisJCS8qIDB4ZmYwMSBpcyBhIGZsYWcgcmF0aGVyIHRoZW4gYW4gYWN0dWFsIHZvbHRhZ2UgKi8KKwkJaWYgKHZvbHRhZ2UtPnZkZGNpID09IDB4ZmYwMSkKKwkJCXJldHVybjsKIAkJaWYgKHZvbHRhZ2UtPnZkZGNpICYmICh2b2x0YWdlLT52ZGRjaSAhPSByZGV2LT5wbS5jdXJyZW50X3ZkZGNpKSkgewogCQkJcmFkZW9uX2F0b21fc2V0X3ZvbHRhZ2UocmRldiwgdm9sdGFnZS0+dmRkY2ksIFNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDSSk7CiAJCQlyZGV2LT5wbS5jdXJyZW50X3ZkZGNpID0gdm9sdGFnZS0+dmRkY2k7CkBAIC05NjAsMTcgKzk4NSwxOSBAQAogewogCXNhdmUtPnZnYV9jb250cm9sWzBdID0gUlJFRzMyKEQxVkdBX0NPTlRST0wpOwogCXNhdmUtPnZnYV9jb250cm9sWzFdID0gUlJFRzMyKEQyVkdBX0NPTlRST0wpOwotCXNhdmUtPnZnYV9jb250cm9sWzJdID0gUlJFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MKTsKLQlzYXZlLT52Z2FfY29udHJvbFszXSA9IFJSRUczMihFVkVSR1JFRU5fRDRWR0FfQ09OVFJPTCk7Ci0Jc2F2ZS0+dmdhX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wpOwotCXNhdmUtPnZnYV9jb250cm9sWzVdID0gUlJFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MKTsKIAlzYXZlLT52Z2FfcmVuZGVyX2NvbnRyb2wgPSBSUkVHMzIoVkdBX1JFTkRFUl9DT05UUk9MKTsKIAlzYXZlLT52Z2FfaGRwX2NvbnRyb2wgPSBSUkVHMzIoVkdBX0hEUF9DT05UUk9MKTsKIAlzYXZlLT5jcnRjX2NvbnRyb2xbMF0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOwogCXNhdmUtPmNydGNfY29udHJvbFsxXSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CisJCXNhdmUtPnZnYV9jb250cm9sWzJdID0gUlJFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MKTsKKwkJc2F2ZS0+dmdhX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wpOwogCQlzYXZlLT5jcnRjX2NvbnRyb2xbMl0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOwogCQlzYXZlLT5jcnRjX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlzYXZlLT52Z2FfY29udHJvbFs0XSA9IFJSRUczMihFVkVSR1JFRU5fRDVWR0FfQ09OVFJPTCk7CisJCXNhdmUtPnZnYV9jb250cm9sWzVdID0gUlJFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MKTsKIAkJc2F2ZS0+Y3J0Y19jb250cm9sWzRdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VUKTsKIAkJc2F2ZS0+Y3J0Y19jb250cm9sWzVdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAl9CkBAIC05NzksMzUgKzEwMDYsNDUgQEAKIAlXUkVHMzIoVkdBX1JFTkRFUl9DT05UUk9MLCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDEpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJfQogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOwogCX0KIAogCVdSRUczMihEMVZHQV9DT05UUk9MLCAwKTsKIAlXUkVHMzIoRDJWR0FfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MLCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wsIDApOwotCVdSRUczMihFVkVSR1JFRU5fRDVWR0FfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MLCAwKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0QzVkdBX0NPTlRST0wsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wsIDApOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlXUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsIDApOworCX0KIH0KIAogdm9pZCBldmVyZ3JlZW5fbWNfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgZXZlcmdyZWVuX21jX3NhdmUgKnNhdmUpCkBAIC0xMDMwLDcgKzEwNjcsNyBAQAogCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwKIAkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKIAotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsCiAJCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsCkBAIC0xMDQ4LDcgKzEwODUsOCBAQAogCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULAogCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKLQorCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCiAJCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCkBAIC0xMDc2LDMxICsxMTE0LDQxIEBACiAJLyogUmVzdG9yZSB2aWRlbyBzdGF0ZSAqLwogCVdSRUczMihEMVZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFswXSk7CiAJV1JFRzMyKEQyVkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzFdKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0QzVkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzJdKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzNdKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzRdKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzVdKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0QzVkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzJdKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9ENFZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFszXSk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CisJCVdSRUczMihFVkVSR1JFRU5fRDVWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbNF0pOworCQlXUkVHMzIoRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzVdKTsKKwl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFswXSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbMV0pOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFsyXSk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzNdKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbNF0pOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFs1XSk7CiAJfQogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CkBAIC0xNDE1LDYgKzE0NjMsOCBAQAogCWNhc2UgQ0hJUF9DRURBUjoKIAljYXNlIENISVBfUkVEV09PRDoKIAljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfU1VNTzoKKwljYXNlIENISVBfU1VNTzI6CiAJY2FzZSBDSElQX1RVUktTOgogCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCWZvcmNlX25vX3N3aXp6bGUgPSBmYWxzZTsKQEAgLTE1NDQsNiArMTU5NCw4IEBACiAJY2FzZSBDSElQX1JFRFdPT0Q6CiAJY2FzZSBDSElQX0NFREFSOgogCWNhc2UgQ0hJUF9QQUxNOgorCWNhc2UgQ0hJUF9TVU1POgorCWNhc2UgQ0hJUF9TVU1PMjoKIAljYXNlIENISVBfVFVSS1M6CiAJY2FzZSBDSElQX0NBSUNPUzoKIAlkZWZhdWx0OgpAQCAtMTY4OSw2ICsxNzQxLDU0IEBACiAJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfaGl6X3RpbGVfZmlmb19zaXplID0gMHgzMDsKIAkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19lYXJseXpfdGlsZV9maWZvX3NpemUgPSAweDEzMDsKIAkJYnJlYWs7CisJY2FzZSBDSElQX1NVTU86CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlcyA9IDE7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3BpcGVzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGlsZV9waXBlcyA9IDI7CisJCWlmIChyZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NjQ4KQorCQkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSAzOworCQllbHNlIGlmICgocmRldi0+cGRldi0+ZGV2aWNlID09IDB4OTY0NykgfHwKKwkJCSAocmRldi0+cGRldi0+ZGV2aWNlID09IDB4OTY0YSkpCisJCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDQ7CisJCWVsc2UKKwkJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3NpbWRzID0gNTsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfYmFja2VuZHMgPSAyICogcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9ncHJzID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF90aHJlYWRzID0gMjQ4OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9nc190aHJlYWRzID0gMzI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3N0YWNrX2VudHJpZXMgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbnVtX29mX3NldHMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc2l6ZSA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3Bvc19zaXplID0gNjQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9zbXhfc2l6ZSA9IDE5MjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfaHdfY29udGV4dHMgPSA4OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNxX251bV9jZl9pbnN0cyA9IDI7CisKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19wcmltX2ZpZm9fc2l6ZSA9IDB4NDA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfaGl6X3RpbGVfZmlmb19zaXplID0gMHgzMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19lYXJseXpfdGlsZV9maWZvX3NpemUgPSAweDEzMDsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1NVTU8yOgorCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXMgPSAxOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9waXBlcyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RpbGVfcGlwZXMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2JhY2tlbmRzID0gMSAqIHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlczsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3BycyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyA9IDI0ODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3NfdGhyZWFkcyA9IDMyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zdGFja19lbnRyaWVzID0gNTEyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X251bV9vZl9zZXRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NpemUgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9wb3Nfc2l6ZSA9IDY0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc214X3NpemUgPSAxOTI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2h3X2NvbnRleHRzID0gODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zcV9udW1fY2ZfaW5zdHMgPSAyOworCisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfcHJpbV9maWZvX3NpemUgPSAweDQwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2hpel90aWxlX2ZpZm9fc2l6ZSA9IDB4MzA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfZWFybHl6X3RpbGVfZmlmb19zaXplID0gMHgxMzA7CisJCWJyZWFrOwogCWNhc2UgQ0hJUF9CQVJUUzoKIAkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzID0gMjsKIAkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfcGlwZXMgPSA0OwpAQCAtMTkwMCw3ICsyMDAwLDcgQEAKIAkJCWdiX2JhY2tlbmRfbWFwID0gMHg2NjQ0MjIwMDsKIAkJCWJyZWFrOwogCQljYXNlIENISVBfSlVOSVBFUjoKLQkJCWdiX2JhY2tlbmRfbWFwID0gMHgwMDAwNjQyMDsKKwkJCWdiX2JhY2tlbmRfbWFwID0gMHgwMDAwMjIwMDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZ2JfYmFja2VuZF9tYXAgPQpAQCAtMTkzNiw5ICsyMDM2LDkgQEAKIAkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi50aWxlX2NvbmZpZyB8PSAoMyA8PCAwKTsKIAkJYnJlYWs7CiAJfQotCS8qIG51bSBiYW5rcyBpcyA4IG9uIGFsbCBmdXNpb24gYXNpY3MgKi8KKwkvKiBudW0gYmFua3MgaXMgOCBvbiBhbGwgZnVzaW9uIGFzaWNzLiAwID0gNCwgMSA9IDgsIDIgPSAxNiAqLwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCi0JCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4udGlsZV9jb25maWcgfD0gOCA8PCA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnRpbGVfY29uZmlnIHw9IDEgPDwgNDsKIAllbHNlCiAJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4udGlsZV9jb25maWcgfD0KIAkJCSgobWNfYXJiX3JhbWNmZyAmIE5PT0ZCQU5LX01BU0spID4+IE5PT0ZCQU5LX1NISUZUKSA8PCA0OwpAQCAtMjAzOSw2ICsyMTM5LDggQEAKIAlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCWNhc2UgQ0hJUF9DRURBUjoKIAljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfU1VNTzoKKwljYXNlIENISVBfU1VNTzI6CiAJY2FzZSBDSElQX0NBSUNPUzoKIAkJLyogbm8gdmVydGV4IGNhY2hlICovCiAJCXNxX2NvbmZpZyAmPSB+VkNfRU5BQkxFOwpAQCAtMjA2MCw2ICsyMTYyLDggQEAKIAlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCWNhc2UgQ0hJUF9DRURBUjoKIAljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfU1VNTzoKKwljYXNlIENISVBfU1VNTzI6CiAJCXBzX3RocmVhZF9jb3VudCA9IDk2OwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjA5OSw2ICsyMjAzLDggQEAKIAlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCWNhc2UgQ0hJUF9DRURBUjoKIAljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfU1VNTzoKKwljYXNlIENISVBfU1VNTzI6CiAJY2FzZSBDSElQX0NBSUNPUzoKIAkJdmd0X2NhY2hlX2ludmFsaWRhdGlvbiA9IENBQ0hFX0lOVkFMSURBVElPTihUQ19PTkxZKTsKIAkJYnJlYWs7CkBAIC0yMTY1LDcgKzIyNzEsMTAgQEAKIAogCS8qIEdldCBWUkFNIGluZm9ybWF0aW9ucyAqLwogCXJkZXYtPm1jLnZyYW1faXNfZGRyID0gdHJ1ZTsKLQl0bXAgPSBSUkVHMzIoTUNfQVJCX1JBTUNGRyk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKKwkJdG1wID0gUlJFRzMyKEZVU19NQ19BUkJfUkFNQ0ZHKTsKKwllbHNlCisJCXRtcCA9IFJSRUczMihNQ19BUkJfUkFNQ0ZHKTsKIAlpZiAodG1wICYgQ0hBTlNJWkVfT1ZFUlJJREUpIHsKIAkJY2hhbnNpemUgPSAxNjsKIAl9IGVsc2UgaWYgKHRtcCAmIENIQU5TSVpFX01BU0spIHsKQEAgLTIzMzEsMTggKzI0NDAsMjIgQEAKIAlXUkVHMzIoR1JCTV9JTlRfQ05UTCwgMCk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOwogCX0KIAogCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CkBAIC0yNDYxLDE5ICsyNTc0LDI1IEBACiAKIAlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBjcnRjMSk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgY3J0YzIpOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBjcnRjMyk7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIGNydGM0KTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgY3J0YzUpOwogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBjcnRjNik7CiAJfQogCiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBncnBoMSk7CiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBncnBoMik7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBncnBoMyk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBncnBoNCk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBncnBoNSk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBncnBoNik7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKKwkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBncnBoMyk7CisJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDQpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIGdycGg1KTsKKwkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBncnBoNik7CisJfQogCiAJV1JFRzMyKERDX0hQRDFfSU5UX0NPTlRST0wsIGhwZDEpOwogCVdSRUczMihEQ19IUEQyX0lOVF9DT05UUk9MLCBocGQyKTsKQEAgLTI0OTcsNTMgKzI2MTYsNTcgQEAKIAlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1KTsKIAlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOwogCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7Ci0JcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKLQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOwotCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7Ci0JcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kM2dycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNmdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQpOworCX0KIAogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCiAJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKIAkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQotCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCi0JCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKLQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQotCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOwotCiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKIAlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBMQl9EMV9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOwotCiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKQogCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgTEJfRDJfVkxJTkVfSU5URVJSVVBUKQogCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKIAotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ0Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZCTEFOS19JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBMQl9EM19WTElORV9JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkJMQU5LX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOworCX0KIAotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKLQotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgTEJfRDVfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKLQotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDVncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ2Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WTElORV9JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkJMQU5LX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOworCX0KIAogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7CiAJCXRtcCA9IFJSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MKTsKQEAgLTI2MTgsMjggKzI3NDEsMjUgQEAKIAogaW50IGV2ZXJncmVlbl9pcnFfcHJvY2VzcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1MzIgd3B0ciA9IGV2ZXJncmVlbl9nZXRfaWhfd3B0cihyZGV2KTsKLQl1MzIgcnB0ciA9IHJkZXYtPmloLnJwdHI7CisJdTMyIHdwdHI7CisJdTMyIHJwdHI7CiAJdTMyIHNyY19pZCwgc3JjX2RhdGE7CiAJdTMyIHJpbmdfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHF1ZXVlX2hvdHBsdWcgPSBmYWxzZTsKIAotCURSTV9ERUJVRygicjYwMF9pcnFfcHJvY2VzcyBzdGFydDogcnB0ciAlZCwgd3B0ciAlZFxuIiwgcnB0ciwgd3B0cik7Ci0JaWYgKCFyZGV2LT5paC5lbmFibGVkKQorCWlmICghcmRldi0+aWguZW5hYmxlZCB8fCByZGV2LT5zaHV0ZG93bikKIAkJcmV0dXJuIElSUV9OT05FOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKKwl3cHRyID0gZXZlcmdyZWVuX2dldF9paF93cHRyKHJkZXYpOworCXJwdHIgPSByZGV2LT5paC5ycHRyOworCURSTV9ERUJVRygicjYwMF9pcnFfcHJvY2VzcyBzdGFydDogcnB0ciAlZCwgd3B0ciAlZFxuIiwgcnB0ciwgd3B0cik7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOwogCWlmIChycHRyID09IHdwdHIpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQotCWlmIChyZGV2LT5zaHV0ZG93bikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5paC5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KIHJlc3RhcnRfaWg6CiAJLyogZGlzcGxheSBpbnRlcnJ1cHRzICovCiAJZXZlcmdyZWVuX2lycV9hY2socmRldik7CkBAIC0yODY4LDcgKzI5ODgsNyBAQAogCQkJcmFkZW9uX2ZlbmNlX3Byb2Nlc3MocmRldik7CiAJCQlicmVhazsKIAkJY2FzZSAyMzM6IC8qIEdVSSBJRExFICovCi0JCQlEUk1fREVCVUcoIklIOiBDUCBFT1BcbiIpOworCQkJRFJNX0RFQlVHKCJJSDogR1VJIGlkbGVcbiIpOwogCQkJcmRldi0+cG0uZ3VpX2lkbGUgPSB0cnVlOwogCQkJd2FrZV91cCgmcmRldi0+aXJxLmlkbGVfcXVldWUpOwogCQkJYnJlYWs7CkBAIC0zMTU0LDYgKzMyNzQsNyBAQAogCXI3MDBfY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOworCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlldmVyZ3JlZW5fcGNpZV9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMKaW5kZXggYmEwNmE2OS4uMmViMjUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlICJldmVyZ3JlZW5kLmgiCiAjaW5jbHVkZSAiZXZlcmdyZWVuX2JsaXRfc2hhZGVycy5oIgorI2luY2x1ZGUgImNheW1hbl9ibGl0X3NoYWRlcnMuaCIKIAogI2RlZmluZSBESV9QVF9SRUNUTElTVCAgICAgICAgMHgxMQogI2RlZmluZSBESV9JTkRFWF9TSVpFXzE2X0JJVCAgMHgwCkBAIC0xNTIsNiArMTUzLDggQEAKIAogCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpIHx8CiAJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB8fAorCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfU1VNTykgfHwKKwkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1NVTU8yKSB8fAogCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKSkKIAkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAogCQkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIDQ4LCBncHVfYWRkcik7CkBAIC0xOTksNiArMjAyLDE2IEBACiBzZXRfc2Npc3NvcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCB4MSwgaW50IHkxLAogCSAgICAgaW50IHgyLCBpbnQgeTIpCiB7CisJLyogd29ya2Fyb3VuZCBzb21lIGh3IGJ1Z3MgKi8KKwlpZiAoeDIgPT0gMCkKKwkJeDEgPSAxOworCWlmICh5MiA9PSAwKQorCQl5MSA9IDE7CisJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NBWU1BTikgeworCQlpZiAoKHgyID09IDEpICYmICh5MiA9PSAxKSkKKwkJCXgyID0gMjsKKwl9CisKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTlRFWFRfUkVHLCAyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKFBBX1NDX1NDUkVFTl9TQ0lTU09SX1RMIC0gUEFDS0VUM19TRVRfQ09OVEVYVF9SRUdfU1RBUlQpID4+IDIpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsICh4MSA8PCAwKSB8ICh5MSA8PCAxNikpOwpAQCAtMjM5LDcgKzI1Miw3IEBACiAKIH0KIAotLyogZW1pdHMgMzYgKi8KKy8qIGVtaXRzIDM5ICovCiBzdGF0aWMgdm9pZAogc2V0X2RlZmF1bHRfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CkBAIC0yNTUsMjM4ICsyNjgsMjg5IEBACiAJdTY0IGdwdV9hZGRyOwogCWludCBkd29yZHM7CiAKLQlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewotCWNhc2UgQ0hJUF9DRURBUjoKLQlkZWZhdWx0OgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSA5NjsKLQkJbnVtX3ZzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2dzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2VzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2hzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2xzX3RocmVhZHMgPSAxNjsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX1JFRFdPT0Q6Ci0JCW51bV9wc19ncHJzID0gOTM7Ci0JCW51bV92c19ncHJzID0gNDY7Ci0JCW51bV90ZW1wX2dwcnMgPSA0OwotCQludW1fZ3NfZ3BycyA9IDMxOwotCQludW1fZXNfZ3BycyA9IDMxOwotCQludW1faHNfZ3BycyA9IDIzOwotCQludW1fbHNfZ3BycyA9IDIzOwotCQludW1fcHNfdGhyZWFkcyA9IDEyODsKLQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2dzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2xzX3RocmVhZHMgPSAyMDsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0pVTklQRVI6Ci0JCW51bV9wc19ncHJzID0gOTM7Ci0JCW51bV92c19ncHJzID0gNDY7Ci0JCW51bV90ZW1wX2dwcnMgPSA0OwotCQludW1fZ3NfZ3BycyA9IDMxOwotCQludW1fZXNfZ3BycyA9IDMxOwotCQludW1faHNfZ3BycyA9IDIzOwotCQludW1fbHNfZ3BycyA9IDIzOwotCQludW1fcHNfdGhyZWFkcyA9IDEyODsKLQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2dzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2xzX3RocmVhZHMgPSAyMDsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0NZUFJFU1M6Ci0JY2FzZSBDSElQX0hFTUxPQ0s6Ci0JCW51bV9wc19ncHJzID0gOTM7Ci0JCW51bV92c19ncHJzID0gNDY7Ci0JCW51bV90ZW1wX2dwcnMgPSA0OwotCQludW1fZ3NfZ3BycyA9IDMxOwotCQludW1fZXNfZ3BycyA9IDMxOwotCQludW1faHNfZ3BycyA9IDIzOwotCQludW1fbHNfZ3BycyA9IDIzOwotCQludW1fcHNfdGhyZWFkcyA9IDEyODsKLQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2dzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2xzX3RocmVhZHMgPSAyMDsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX1BBTE06Ci0JCW51bV9wc19ncHJzID0gOTM7Ci0JCW51bV92c19ncHJzID0gNDY7Ci0JCW51bV90ZW1wX2dwcnMgPSA0OwotCQludW1fZ3NfZ3BycyA9IDMxOwotCQludW1fZXNfZ3BycyA9IDMxOwotCQludW1faHNfZ3BycyA9IDIzOwotCQludW1fbHNfZ3BycyA9IDIzOwotCQludW1fcHNfdGhyZWFkcyA9IDk2OwotCQludW1fdnNfdGhyZWFkcyA9IDE2OwotCQludW1fZ3NfdGhyZWFkcyA9IDE2OwotCQludW1fZXNfdGhyZWFkcyA9IDE2OwotCQludW1faHNfdGhyZWFkcyA9IDE2OwotCQludW1fbHNfdGhyZWFkcyA9IDE2OwotCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1faHNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOwotCQlicmVhazsKLQljYXNlIENISVBfQkFSVFM6Ci0JCW51bV9wc19ncHJzID0gOTM7Ci0JCW51bV92c19ncHJzID0gNDY7Ci0JCW51bV90ZW1wX2dwcnMgPSA0OwotCQludW1fZ3NfZ3BycyA9IDMxOwotCQludW1fZXNfZ3BycyA9IDMxOwotCQludW1faHNfZ3BycyA9IDIzOwotCQludW1fbHNfZ3BycyA9IDIzOwotCQludW1fcHNfdGhyZWFkcyA9IDEyODsKLQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2dzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKLQkJbnVtX2xzX3RocmVhZHMgPSAyMDsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA4NTsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX1RVUktTOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7Ci0JCW51bV92c190aHJlYWRzID0gMjA7Ci0JCW51bV9nc190aHJlYWRzID0gMjA7Ci0JCW51bV9lc190aHJlYWRzID0gMjA7Ci0JCW51bV9oc190aHJlYWRzID0gMjA7Ci0JCW51bV9sc190aHJlYWRzID0gMjA7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9DQUlDT1M6Ci0JCW51bV9wc19ncHJzID0gOTM7Ci0JCW51bV92c19ncHJzID0gNDY7Ci0JCW51bV90ZW1wX2dwcnMgPSA0OwotCQludW1fZ3NfZ3BycyA9IDMxOwotCQludW1fZXNfZ3BycyA9IDMxOwotCQludW1faHNfZ3BycyA9IDIzOwotCQludW1fbHNfZ3BycyA9IDIzOwotCQludW1fcHNfdGhyZWFkcyA9IDEyODsKLQkJbnVtX3ZzX3RocmVhZHMgPSAxMDsKLQkJbnVtX2dzX3RocmVhZHMgPSAxMDsKLQkJbnVtX2VzX3RocmVhZHMgPSAxMDsKLQkJbnVtX2hzX3RocmVhZHMgPSAxMDsKLQkJbnVtX2xzX3RocmVhZHMgPSAxMDsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikgfHwKLQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1BBTE0pIHx8Ci0JICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DQUlDT1MpKQotCQlzcV9jb25maWcgPSAwOwotCWVsc2UKLQkJc3FfY29uZmlnID0gVkNfRU5BQkxFOwotCi0Jc3FfY29uZmlnIHw9IChFWFBPUlRfU1JDX0MgfAotCQkgICAgICBDU19QUklPKDApIHwKLQkJICAgICAgTFNfUFJJTygwKSB8Ci0JCSAgICAgIEhTX1BSSU8oMCkgfAotCQkgICAgICBQU19QUklPKDApIHwKLQkJICAgICAgVlNfUFJJTygxKSB8Ci0JCSAgICAgIEdTX1BSSU8oMikgfAotCQkgICAgICBFU19QUklPKDMpKTsKLQotCXNxX2dwcl9yZXNvdXJjZV9tZ210XzEgPSAoTlVNX1BTX0dQUlMobnVtX3BzX2dwcnMpIHwKLQkJCQkgIE5VTV9WU19HUFJTKG51bV92c19ncHJzKSB8Ci0JCQkJICBOVU1fQ0xBVVNFX1RFTVBfR1BSUyhudW1fdGVtcF9ncHJzKSk7Ci0Jc3FfZ3ByX3Jlc291cmNlX21nbXRfMiA9IChOVU1fR1NfR1BSUyhudW1fZ3NfZ3BycykgfAotCQkJCSAgTlVNX0VTX0dQUlMobnVtX2VzX2dwcnMpKTsKLQlzcV9ncHJfcmVzb3VyY2VfbWdtdF8zID0gKE5VTV9IU19HUFJTKG51bV9oc19ncHJzKSB8Ci0JCQkJICBOVU1fTFNfR1BSUyhudW1fbHNfZ3BycykpOwotCXNxX3RocmVhZF9yZXNvdXJjZV9tZ210ID0gKE5VTV9QU19USFJFQURTKG51bV9wc190aHJlYWRzKSB8Ci0JCQkJICAgTlVNX1ZTX1RIUkVBRFMobnVtX3ZzX3RocmVhZHMpIHwKLQkJCQkgICBOVU1fR1NfVEhSRUFEUyhudW1fZ3NfdGhyZWFkcykgfAotCQkJCSAgIE5VTV9FU19USFJFQURTKG51bV9lc190aHJlYWRzKSk7Ci0Jc3FfdGhyZWFkX3Jlc291cmNlX21nbXRfMiA9IChOVU1fSFNfVEhSRUFEUyhudW1faHNfdGhyZWFkcykgfAotCQkJCSAgICAgTlVNX0xTX1RIUkVBRFMobnVtX2xzX3RocmVhZHMpKTsKLQlzcV9zdGFja19yZXNvdXJjZV9tZ210XzEgPSAoTlVNX1BTX1NUQUNLX0VOVFJJRVMobnVtX3BzX3N0YWNrX2VudHJpZXMpIHwKLQkJCQkgICAgTlVNX1ZTX1NUQUNLX0VOVFJJRVMobnVtX3ZzX3N0YWNrX2VudHJpZXMpKTsKLQlzcV9zdGFja19yZXNvdXJjZV9tZ210XzIgPSAoTlVNX0dTX1NUQUNLX0VOVFJJRVMobnVtX2dzX3N0YWNrX2VudHJpZXMpIHwKLQkJCQkgICAgTlVNX0VTX1NUQUNLX0VOVFJJRVMobnVtX2VzX3N0YWNrX2VudHJpZXMpKTsKLQlzcV9zdGFja19yZXNvdXJjZV9tZ210XzMgPSAoTlVNX0hTX1NUQUNLX0VOVFJJRVMobnVtX2hzX3N0YWNrX2VudHJpZXMpIHwKLQkJCQkgICAgTlVNX0xTX1NUQUNLX0VOVFJJRVMobnVtX2xzX3N0YWNrX2VudHJpZXMpKTsKLQogCS8qIHNldCBjbGVhciBjb250ZXh0IHN0YXRlICovCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX0NMRUFSX1NUQVRFLCAwKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAKLQkvKiBkaXNhYmxlIGR5biBncHJzICovCi0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NFVF9DT05GSUdfUkVHLCAxKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKFNRX0RZTl9HUFJfQ05UTF9QU19GTFVTSF9SRVEgLSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX1NUQVJUKSA+PiAyKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKKwlpZiAocmRldi0+ZmFtaWx5IDwgQ0hJUF9DQVlNQU4pIHsKKwkJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKKwkJY2FzZSBDSElQX0NFREFSOgorCQlkZWZhdWx0OgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDk2OworCQkJbnVtX3ZzX3RocmVhZHMgPSAxNjsKKwkJCW51bV9nc190aHJlYWRzID0gMTY7CisJCQludW1fZXNfdGhyZWFkcyA9IDE2OworCQkJbnVtX2hzX3RocmVhZHMgPSAxNjsKKwkJCW51bV9sc190aHJlYWRzID0gMTY7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX1JFRFdPT0Q6CisJCQludW1fcHNfZ3BycyA9IDkzOworCQkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJCW51bV90ZW1wX2dwcnMgPSA0OworCQkJbnVtX2dzX2dwcnMgPSAzMTsKKwkJCW51bV9lc19ncHJzID0gMzE7CisJCQludW1faHNfZ3BycyA9IDIzOworCQkJbnVtX2xzX2dwcnMgPSAyMzsKKwkJCW51bV9wc190aHJlYWRzID0gMTI4OworCQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9nc190aHJlYWRzID0gMjA7CisJCQludW1fZXNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9sc190aHJlYWRzID0gMjA7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX0pVTklQRVI6CisJCQludW1fcHNfZ3BycyA9IDkzOworCQkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJCW51bV90ZW1wX2dwcnMgPSA0OworCQkJbnVtX2dzX2dwcnMgPSAzMTsKKwkJCW51bV9lc19ncHJzID0gMzE7CisJCQludW1faHNfZ3BycyA9IDIzOworCQkJbnVtX2xzX2dwcnMgPSAyMzsKKwkJCW51bV9wc190aHJlYWRzID0gMTI4OworCQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9nc190aHJlYWRzID0gMjA7CisJCQludW1fZXNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9sc190aHJlYWRzID0gMjA7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gODU7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX0NZUFJFU1M6CisJCWNhc2UgQ0hJUF9IRU1MT0NLOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJCW51bV92c190aHJlYWRzID0gMjA7CisJCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9oc190aHJlYWRzID0gMjA7CisJCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9QQUxNOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDk2OworCQkJbnVtX3ZzX3RocmVhZHMgPSAxNjsKKwkJCW51bV9nc190aHJlYWRzID0gMTY7CisJCQludW1fZXNfdGhyZWFkcyA9IDE2OworCQkJbnVtX2hzX3RocmVhZHMgPSAxNjsKKwkJCW51bV9sc190aHJlYWRzID0gMTY7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX1NVTU86CisJCQludW1fcHNfZ3BycyA9IDkzOworCQkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJCW51bV90ZW1wX2dwcnMgPSA0OworCQkJbnVtX2dzX2dwcnMgPSAzMTsKKwkJCW51bV9lc19ncHJzID0gMzE7CisJCQludW1faHNfZ3BycyA9IDIzOworCQkJbnVtX2xzX2dwcnMgPSAyMzsKKwkJCW51bV9wc190aHJlYWRzID0gOTY7CisJCQludW1fdnNfdGhyZWFkcyA9IDI1OworCQkJbnVtX2dzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9lc190aHJlYWRzID0gMjU7CisJCQludW1faHNfdGhyZWFkcyA9IDI1OworCQkJbnVtX2xzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1faHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCWJyZWFrOworCQljYXNlIENISVBfU1VNTzI6CisJCQludW1fcHNfZ3BycyA9IDkzOworCQkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJCW51bV90ZW1wX2dwcnMgPSA0OworCQkJbnVtX2dzX2dwcnMgPSAzMTsKKwkJCW51bV9lc19ncHJzID0gMzE7CisJCQludW1faHNfZ3BycyA9IDIzOworCQkJbnVtX2xzX2dwcnMgPSAyMzsKKwkJCW51bV9wc190aHJlYWRzID0gOTY7CisJCQludW1fdnNfdGhyZWFkcyA9IDI1OworCQkJbnVtX2dzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9lc190aHJlYWRzID0gMjU7CisJCQludW1faHNfdGhyZWFkcyA9IDI1OworCQkJbnVtX2xzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9wc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9lc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1faHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCWJyZWFrOworCQljYXNlIENISVBfQkFSVFM6CisJCQludW1fcHNfZ3BycyA9IDkzOworCQkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJCW51bV90ZW1wX2dwcnMgPSA0OworCQkJbnVtX2dzX2dwcnMgPSAzMTsKKwkJCW51bV9lc19ncHJzID0gMzE7CisJCQludW1faHNfZ3BycyA9IDIzOworCQkJbnVtX2xzX2dwcnMgPSAyMzsKKwkJCW51bV9wc190aHJlYWRzID0gMTI4OworCQkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9nc190aHJlYWRzID0gMjA7CisJCQludW1fZXNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2hzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9sc190aHJlYWRzID0gMjA7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gODU7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX1RVUktTOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJCW51bV92c190aHJlYWRzID0gMjA7CisJCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9oc190aHJlYWRzID0gMjA7CisJCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9DQUlDT1M6CisJCQludW1fcHNfZ3BycyA9IDkzOworCQkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJCW51bV90ZW1wX2dwcnMgPSA0OworCQkJbnVtX2dzX2dwcnMgPSAzMTsKKwkJCW51bV9lc19ncHJzID0gMzE7CisJCQludW1faHNfZ3BycyA9IDIzOworCQkJbnVtX2xzX2dwcnMgPSAyMzsKKwkJCW51bV9wc190aHJlYWRzID0gMTI4OworCQkJbnVtX3ZzX3RocmVhZHMgPSAxMDsKKwkJCW51bV9nc190aHJlYWRzID0gMTA7CisJCQludW1fZXNfdGhyZWFkcyA9IDEwOworCQkJbnVtX2hzX3RocmVhZHMgPSAxMDsKKwkJCW51bV9sc190aHJlYWRzID0gMTA7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCQlicmVhazsKKwkJfQogCi0JLyogU1EgY29uZmlnICovCi0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NFVF9DT05GSUdfUkVHLCAxMSkpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIChTUV9DT05GSUcgLSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX1NUQVJUKSA+PiAyKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9jb25maWcpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX2dwcl9yZXNvdXJjZV9tZ210XzEpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX2dwcl9yZXNvdXJjZV9tZ210XzIpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX2dwcl9yZXNvdXJjZV9tZ210XzMpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3RocmVhZF9yZXNvdXJjZV9tZ210KTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV90aHJlYWRfcmVzb3VyY2VfbWdtdF8yKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9zdGFja19yZXNvdXJjZV9tZ210XzEpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8zKTsKKwkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikgfHwKKwkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1NVTU8pIHx8CisJCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfU1VNTzIpIHx8CisJCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKSkKKwkJCXNxX2NvbmZpZyA9IDA7CisJCWVsc2UKKwkJCXNxX2NvbmZpZyA9IFZDX0VOQUJMRTsKKworCQlzcV9jb25maWcgfD0gKEVYUE9SVF9TUkNfQyB8CisJCQkgICAgICBDU19QUklPKDApIHwKKwkJCSAgICAgIExTX1BSSU8oMCkgfAorCQkJICAgICAgSFNfUFJJTygwKSB8CisJCQkgICAgICBQU19QUklPKDApIHwKKwkJCSAgICAgIFZTX1BSSU8oMSkgfAorCQkJICAgICAgR1NfUFJJTygyKSB8CisJCQkgICAgICBFU19QUklPKDMpKTsKKworCQlzcV9ncHJfcmVzb3VyY2VfbWdtdF8xID0gKE5VTV9QU19HUFJTKG51bV9wc19ncHJzKSB8CisJCQkJCSAgTlVNX1ZTX0dQUlMobnVtX3ZzX2dwcnMpIHwKKwkJCQkJICBOVU1fQ0xBVVNFX1RFTVBfR1BSUyhudW1fdGVtcF9ncHJzKSk7CisJCXNxX2dwcl9yZXNvdXJjZV9tZ210XzIgPSAoTlVNX0dTX0dQUlMobnVtX2dzX2dwcnMpIHwKKwkJCQkJICBOVU1fRVNfR1BSUyhudW1fZXNfZ3BycykpOworCQlzcV9ncHJfcmVzb3VyY2VfbWdtdF8zID0gKE5VTV9IU19HUFJTKG51bV9oc19ncHJzKSB8CisJCQkJCSAgTlVNX0xTX0dQUlMobnVtX2xzX2dwcnMpKTsKKwkJc3FfdGhyZWFkX3Jlc291cmNlX21nbXQgPSAoTlVNX1BTX1RIUkVBRFMobnVtX3BzX3RocmVhZHMpIHwKKwkJCQkJICAgTlVNX1ZTX1RIUkVBRFMobnVtX3ZzX3RocmVhZHMpIHwKKwkJCQkJICAgTlVNX0dTX1RIUkVBRFMobnVtX2dzX3RocmVhZHMpIHwKKwkJCQkJICAgTlVNX0VTX1RIUkVBRFMobnVtX2VzX3RocmVhZHMpKTsKKwkJc3FfdGhyZWFkX3Jlc291cmNlX21nbXRfMiA9IChOVU1fSFNfVEhSRUFEUyhudW1faHNfdGhyZWFkcykgfAorCQkJCQkgICAgIE5VTV9MU19USFJFQURTKG51bV9sc190aHJlYWRzKSk7CisJCXNxX3N0YWNrX3Jlc291cmNlX21nbXRfMSA9IChOVU1fUFNfU1RBQ0tfRU5UUklFUyhudW1fcHNfc3RhY2tfZW50cmllcykgfAorCQkJCQkgICAgTlVNX1ZTX1NUQUNLX0VOVFJJRVMobnVtX3ZzX3N0YWNrX2VudHJpZXMpKTsKKwkJc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8yID0gKE5VTV9HU19TVEFDS19FTlRSSUVTKG51bV9nc19zdGFja19lbnRyaWVzKSB8CisJCQkJCSAgICBOVU1fRVNfU1RBQ0tfRU5UUklFUyhudW1fZXNfc3RhY2tfZW50cmllcykpOworCQlzcV9zdGFja19yZXNvdXJjZV9tZ210XzMgPSAoTlVNX0hTX1NUQUNLX0VOVFJJRVMobnVtX2hzX3N0YWNrX2VudHJpZXMpIHwKKwkJCQkJICAgIE5VTV9MU19TVEFDS19FTlRSSUVTKG51bV9sc19zdGFja19lbnRyaWVzKSk7CisKKwkJLyogZGlzYWJsZSBkeW4gZ3BycyAqLworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTkZJR19SRUcsIDEpKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKFNRX0RZTl9HUFJfQ05UTF9QU19GTFVTSF9SRVEgLSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX1NUQVJUKSA+PiAyKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CisKKwkJLyogc2V0dXAgTERTICovCisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfQ09ORklHX1JFRywgMSkpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAoU1FfTERTX1JFU09VUkNFX01HTVQgLSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX1NUQVJUKSA+PiAyKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMHgxMDAwMTAwMCk7CisKKwkJLyogU1EgY29uZmlnICovCisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfQ09ORklHX1JFRywgMTEpKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKFNRX0NPTkZJRyAtIFBBQ0tFVDNfU0VUX0NPTkZJR19SRUdfU1RBUlQpID4+IDIpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9jb25maWcpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9ncHJfcmVzb3VyY2VfbWdtdF8xKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3FfZ3ByX3Jlc291cmNlX21nbXRfMik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX2dwcl9yZXNvdXJjZV9tZ210XzMpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3RocmVhZF9yZXNvdXJjZV9tZ210KTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3FfdGhyZWFkX3Jlc291cmNlX21nbXRfMik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMyk7CisJfQogCiAJLyogQ09OVEVYVF9DT05UUk9MICovCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMHhjMDAxMjgwMCk7CkBAIC01NjAsNyArNjI0LDEwIEBACiAJbXV0ZXhfaW5pdCgmcmRldi0+cjYwMF9ibGl0Lm11dGV4KTsKIAlyZGV2LT5yNjAwX2JsaXQuc3RhdGVfb2Zmc2V0ID0gMDsKIAotCXJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gPSBldmVyZ3JlZW5fZGVmYXVsdF9zaXplOworCWlmIChyZGV2LT5mYW1pbHkgPCBDSElQX0NBWU1BTikKKwkJcmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiA9IGV2ZXJncmVlbl9kZWZhdWx0X3NpemU7CisJZWxzZQorCQlyZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuID0gY2F5bWFuX2RlZmF1bHRfc2l6ZTsKIAogCWR3b3JkcyA9IHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW47CiAJd2hpbGUgKGR3b3JkcyAmIDB4ZikgewpAQCAtNTcyLDExICs2MzksMTcgQEAKIAlvYmpfc2l6ZSA9IEFMSUdOKG9ial9zaXplLCAyNTYpOwogCiAJcmRldi0+cjYwMF9ibGl0LnZzX29mZnNldCA9IG9ial9zaXplOwotCW9ial9zaXplICs9IGV2ZXJncmVlbl92c19zaXplICogNDsKKwlpZiAocmRldi0+ZmFtaWx5IDwgQ0hJUF9DQVlNQU4pCisJCW9ial9zaXplICs9IGV2ZXJncmVlbl92c19zaXplICogNDsKKwllbHNlCisJCW9ial9zaXplICs9IGNheW1hbl92c19zaXplICogNDsKIAlvYmpfc2l6ZSA9IEFMSUdOKG9ial9zaXplLCAyNTYpOwogCiAJcmRldi0+cjYwMF9ibGl0LnBzX29mZnNldCA9IG9ial9zaXplOwotCW9ial9zaXplICs9IGV2ZXJncmVlbl9wc19zaXplICogNDsKKwlpZiAocmRldi0+ZmFtaWx5IDwgQ0hJUF9DQVlNQU4pCisJCW9ial9zaXplICs9IGV2ZXJncmVlbl9wc19zaXplICogNDsKKwllbHNlCisJCW9ial9zaXplICs9IGNheW1hbl9wc19zaXplICogNDsKIAlvYmpfc2l6ZSA9IEFMSUdOKG9ial9zaXplLCAyNTYpOwogCiAJciA9IHJhZGVvbl9ib19jcmVhdGUocmRldiwgb2JqX3NpemUsIFBBR0VfU0laRSwgdHJ1ZSwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKQEAgLTU5OSwxNiArNjcyLDI5IEBACiAJCXJldHVybiByOwogCX0KIAotCW1lbWNweV90b2lvKHB0ciArIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9vZmZzZXQsCi0JCSAgICBldmVyZ3JlZW5fZGVmYXVsdF9zdGF0ZSwgcmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiAqIDQpOworCWlmIChyZGV2LT5mYW1pbHkgPCBDSElQX0NBWU1BTikgeworCQltZW1jcHlfdG9pbyhwdHIgKyByZGV2LT5yNjAwX2JsaXQuc3RhdGVfb2Zmc2V0LAorCQkJICAgIGV2ZXJncmVlbl9kZWZhdWx0X3N0YXRlLCByZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuICogNCk7CiAKLQlpZiAobnVtX3BhY2tldDJzKQotCQltZW1jcHlfdG9pbyhwdHIgKyByZGV2LT5yNjAwX2JsaXQuc3RhdGVfb2Zmc2V0ICsgKHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gKiA0KSwKLQkJCSAgICBwYWNrZXQycywgbnVtX3BhY2tldDJzICogNCk7Ci0JZm9yIChpID0gMDsgaSA8IGV2ZXJncmVlbl92c19zaXplOyBpKyspCi0JCSoodTMyICopKCh1bnNpZ25lZCBsb25nKXB0ciArIHJkZXYtPnI2MDBfYmxpdC52c19vZmZzZXQgKyBpICogNCkgPSBjcHVfdG9fbGUzMihldmVyZ3JlZW5fdnNbaV0pOwotCWZvciAoaSA9IDA7IGkgPCBldmVyZ3JlZW5fcHNfc2l6ZTsgaSsrKQotCQkqKHUzMiAqKSgodW5zaWduZWQgbG9uZylwdHIgKyByZGV2LT5yNjAwX2JsaXQucHNfb2Zmc2V0ICsgaSAqIDQpID0gY3B1X3RvX2xlMzIoZXZlcmdyZWVuX3BzW2ldKTsKKwkJaWYgKG51bV9wYWNrZXQycykKKwkJCW1lbWNweV90b2lvKHB0ciArIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9vZmZzZXQgKyAocmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiAqIDQpLAorCQkJCSAgICBwYWNrZXQycywgbnVtX3BhY2tldDJzICogNCk7CisJCWZvciAoaSA9IDA7IGkgPCBldmVyZ3JlZW5fdnNfc2l6ZTsgaSsrKQorCQkJKih1MzIgKikoKHVuc2lnbmVkIGxvbmcpcHRyICsgcmRldi0+cjYwMF9ibGl0LnZzX29mZnNldCArIGkgKiA0KSA9IGNwdV90b19sZTMyKGV2ZXJncmVlbl92c1tpXSk7CisJCWZvciAoaSA9IDA7IGkgPCBldmVyZ3JlZW5fcHNfc2l6ZTsgaSsrKQorCQkJKih1MzIgKikoKHVuc2lnbmVkIGxvbmcpcHRyICsgcmRldi0+cjYwMF9ibGl0LnBzX29mZnNldCArIGkgKiA0KSA9IGNwdV90b19sZTMyKGV2ZXJncmVlbl9wc1tpXSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5X3RvaW8ocHRyICsgcmRldi0+cjYwMF9ibGl0LnN0YXRlX29mZnNldCwKKwkJCSAgICBjYXltYW5fZGVmYXVsdF9zdGF0ZSwgcmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiAqIDQpOworCisJCWlmIChudW1fcGFja2V0MnMpCisJCQltZW1jcHlfdG9pbyhwdHIgKyByZGV2LT5yNjAwX2JsaXQuc3RhdGVfb2Zmc2V0ICsgKHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gKiA0KSwKKwkJCQkgICAgcGFja2V0MnMsIG51bV9wYWNrZXQycyAqIDQpOworCQlmb3IgKGkgPSAwOyBpIDwgY2F5bWFuX3ZzX3NpemU7IGkrKykKKwkJCSoodTMyICopKCh1bnNpZ25lZCBsb25nKXB0ciArIHJkZXYtPnI2MDBfYmxpdC52c19vZmZzZXQgKyBpICogNCkgPSBjcHVfdG9fbGUzMihjYXltYW5fdnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgY2F5bWFuX3BzX3NpemU7IGkrKykKKwkJCSoodTMyICopKCh1bnNpZ25lZCBsb25nKXB0ciArIHJkZXYtPnI2MDBfYmxpdC5wc19vZmZzZXQgKyBpICogNCkgPSBjcHVfdG9fbGUzMihjYXltYW5fcHNbaV0pOworCX0KIAlyYWRlb25fYm9fa3VubWFwKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKIAlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKIApAQCAtNjkyLDcgKzc3OCw3IEBACiAJLyogY2FsY3VsYXRlIG51bWJlciBvZiBsb29wcyBjb3JyZWN0bHkgKi8KIAlyaW5nX3NpemUgPSBudW1fbG9vcHMgKiBkd29yZHNfcGVyX2xvb3A7CiAJLyogc2V0IGRlZmF1bHQgICsgc2hhZGVycyAqLwotCXJpbmdfc2l6ZSArPSA1MjsgLyogc2hhZGVycyArIGRlZiBzdGF0ZSAqLworCXJpbmdfc2l6ZSArPSA1NTsgLyogc2hhZGVycyArIGRlZiBzdGF0ZSAqLwogCXJpbmdfc2l6ZSArPSAxMDsgLyogZmVuY2UgZW1pdCBmb3IgVkIgSUIgKi8KIAlyaW5nX3NpemUgKz0gNTsgLyogZG9uZSBjb3B5ICovCiAJcmluZ19zaXplICs9IDEwOyAvKiBmZW5jZSBlbWl0IGZvciBkb25lIGNvcHkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKaW5kZXggZjM3ZTkxZS4uYjdiMjcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKQEAgLTE2OCwxMCArMTY4LDE2IEBACiAjZGVmaW5lCQlTRV9EQl9CVVNZCQkJCQkoMSA8PCAzMCkKICNkZWZpbmUJCVNFX0NCX0JVU1kJCQkJCSgxIDw8IDMxKQogLyogZXZlcmdyZWVuICovCisjZGVmaW5lCUNHX1RIRVJNQUxfQ1RSTAkJCQkJMHg3MmMKKyNkZWZpbmUJCVRPRkZTRVRfTUFTSwkJCSAgICAgICAgMHgwMDAwM0ZFMAorI2RlZmluZQkJVE9GRlNFVF9TSElGVAkJCSAgICAgICAgNQogI2RlZmluZQlDR19NVUxUX1RIRVJNQUxfU1RBVFVTCQkJCTB4NzQwCiAjZGVmaW5lCQlBU0lDX1QoeCkJCQkgICAgICAgICgoeCkgPDwgMTYpCi0jZGVmaW5lCQlBU0lDX1RfTUFTSwkJCSAgICAgICAgMHg3RkYwMDAwCisjZGVmaW5lCQlBU0lDX1RfTUFTSwkJCSAgICAgICAgMHgwN0ZGMDAwMAogI2RlZmluZQkJQVNJQ19UX1NISUZUCQkJICAgICAgICAxNgorI2RlZmluZQlDR19UUzBfU1RBVFVTCQkJCQkweDc2MAorI2RlZmluZQkJVFMwX0FEQ19ET1VUX01BU0sJCQkweDAwMDAwM0ZGCisjZGVmaW5lCQlUUzBfQURDX0RPVVRfU0hJRlQJCQkwCiAvKiBBUFUgKi8KICNkZWZpbmUJQ0dfVEhFUk1BTF9TVEFUVVMJCQkgICAgICAgIDB4Njc4CiAKQEAgLTQ2MCw3ICs0NjYsNyBAQAogI2RlZmluZSBJSF9SQl9XUFRSX0FERFJfTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2UxNAogI2RlZmluZSBJSF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2UxOAogIyAgICAgICBkZWZpbmUgRU5BQkxFX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCi0jICAgICAgIGRlZmluZSBJSF9NQ19TV0FQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAyKQorIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMSkKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzE2QklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF8zMkJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKQEAgLTU0MSw3ICs1NDcsNyBAQAogIyAgICAgICBkZWZpbmUgTEJfRDVfVkJMQU5LX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQogIyAgICAgICBkZWZpbmUgRENfSFBENV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNykKICMgICAgICAgZGVmaW5lIERDX0hQRDVfUlhfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTgpCi0jZGVmaW5lIERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTUgICAgICAgICAgICAgICAgIDB4NjA1MAorI2RlZmluZSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1ICAgICAgICAgICAgICAgICAweDYxNTAKICMgICAgICAgZGVmaW5lIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKICMgICAgICAgZGVmaW5lIExCX0Q2X1ZCTEFOS19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKICMgICAgICAgZGVmaW5lIERDX0hQRDZfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKaW5kZXggYjIwNWJhMS4uNTU5ZGJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwpAQCAtMTM4NywxNCArMTM4NywxMiBAQAogCQlyZXR1cm4gcjsKIAljYXltYW5fZ3B1X2luaXQocmRldik7CiAKLSNpZiAwCi0JciA9IGNheW1hbl9ibGl0X2luaXQocmRldik7CisJciA9IGV2ZXJncmVlbl9ibGl0X2luaXQocmRldik7CiAJaWYgKHIpIHsKLQkJY2F5bWFuX2JsaXRfZmluaShyZGV2KTsKKwkJZXZlcmdyZWVuX2JsaXRfZmluaShyZGV2KTsKIAkJcmRldi0+YXNpYy0+Y29weSA9IE5VTEw7CiAJCWRldl93YXJuKHJkZXYtPmRldiwgImZhaWxlZCBibGl0dGVyICglZCkgZmFsbGluZyBiYWNrIHRvIG1lbWNweVxuIiwgcik7CiAJfQotI2VuZGlmCiAKIAkvKiBhbGxvY2F0ZSB3YiBidWZmZXIgKi8KIAlyID0gcmFkZW9uX3diX2luaXQocmRldik7CkBAIC0xNDUyLDcgKzE0NTAsNyBAQAogCiBpbnQgY2F5bWFuX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JLyogaW50IHI7ICovCisJaW50IHI7CiAKIAkvKiBGSVhNRTogd2Ugc2hvdWxkIHdhaXQgZm9yIHJpbmcgdG8gYmUgZW1wdHkgKi8KIAljYXltYW5fY3BfZW5hYmxlKHJkZXYsIGZhbHNlKTsKQEAgLTE0NjEsMTQgKzE0NTksMTMgQEAKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAljYXltYW5fcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CiAKLSNpZiAwCiAJLyogdW5waW4gc2hhZGVycyBibyAqLwogCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOwogCWlmIChsaWtlbHkociA9PSAwKSkgewogCQlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwogCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKIAl9Ci0jZW5kaWYKKwogCXJldHVybiAwOwogfQogCkBAIC0xNTgwLDEwICsxNTc3LDExIEBACiAKIHZvaWQgY2F5bWFuX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JLyogY2F5bWFuX2JsaXRfZmluaShyZGV2KTsgKi8KKwlldmVyZ3JlZW5fYmxpdF9maW5pKHJkZXYpOwogCWNheW1hbl9jcF9maW5pKHJkZXYpOwogCXI2MDBfaXJxX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CisJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCWNheW1hbl9wY2llX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25fZ2VtX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaAppbmRleCA5NzM2NzQ2Li40NjcyODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKQEAgLTMyMCw3ICszMjAsNyBAQAogI2RlZmluZQlDR1RTX1VTRVJfVENDX0RJU0FCTEUJCQkJMHg5MTRDCiAjZGVmaW5lCQlUQ0NfRElTQUJMRV9NQVNLCQkJCTB4RkZGRjAwMDAKICNkZWZpbmUJCVRDQ19ESVNBQkxFX1NISUZUCQkJCTE2Ci0jZGVmaW5lCUNHVFNfU01fQ1RSTF9SRUcJCQkJMHg5MTVDCisjZGVmaW5lCUNHVFNfU01fQ1RSTF9SRUcJCQkJMHg5MTUwCiAjZGVmaW5lCQlPVkVSUklERQkJCQkoMSA8PCAyMSkKIAogI2RlZmluZQlUQV9DTlRMX0FVWAkJCQkJMHg5NTA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCmluZGV4IDJmZWY5ZGUuLjY4NmY5ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCkBAIC02Myw3ICs2Myw3IEBACiAJdW5zaWduZWQJCQludW1fYXJyYXlzOwogCXVuc2lnbmVkCQkJbWF4X2luZHg7CiAJdW5zaWduZWQJCQljb2xvcl9jaGFubmVsX21hc2s7Ci0Jc3RydWN0IHIxMDBfY3NfdHJhY2tfYXJyYXkJYXJyYXlzWzExXTsKKwlzdHJ1Y3QgcjEwMF9jc190cmFja19hcnJheQlhcnJheXNbMTZdOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrX2NiIAljYltSMzAwX01BWF9DQl07CiAJc3RydWN0IHIxMDBfY3NfdHJhY2tfY2IgCXpiOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrX2NiIAlhYTsKQEAgLTE0Niw2ICsxNDYsMTIgQEAKIAlpYiA9IHAtPmliLT5wdHI7CiAJdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKIAljID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrKykgJiAweDFGOworCWlmIChjID4gMTYpIHsKKwkgICAgRFJNX0VSUk9SKCJPbmx5IDE2IHZlcnRleCBidWZmZXJzIGFyZSBhbGxvd2VkICVkXG4iLAorCQkgICAgICBwa3QtPm9wY29kZSk7CisJICAgIHIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQogCXRyYWNrLT5udW1fYXJyYXlzID0gYzsKIAlmb3IgKGkgPSAwOyBpIDwgKGMgLSAxKTsgaSs9MiwgaWR4Kz0zKSB7CiAJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCmluZGV4IDZmMjc1OTMuLmJjNTRiMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCkBAIC04Nyw2ICs4NywxMCBAQAogTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vUEFMTV9wZnAuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9QQUxNX21lLmJpbiIpOwogTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vU1VNT19ybGMuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9TVU1PX3BmcC5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1NVTU9fbWUuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9TVU1PMl9wZnAuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9TVU1PMl9tZS5iaW4iKTsKIAogaW50IHI2MDBfZGVidWdmc19tY19pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCkBAIC01ODYsNiArNTkwLDkgQEAKIAlzdHJ1Y3QgcmFkZW9uX3ZvbHRhZ2UgKnZvbHRhZ2UgPSAmcHMtPmNsb2NrX2luZm9bcmVxX2NtX2lkeF0udm9sdGFnZTsKIAogCWlmICgodm9sdGFnZS0+dHlwZSA9PSBWT0xUQUdFX1NXKSAmJiB2b2x0YWdlLT52b2x0YWdlKSB7CisJCS8qIDB4ZmYwMSBpcyBhIGZsYWcgcmF0aGVyIHRoZW4gYW4gYWN0dWFsIHZvbHRhZ2UgKi8KKwkJaWYgKHZvbHRhZ2UtPnZvbHRhZ2UgPT0gMHhmZjAxKQorCQkJcmV0dXJuOwogCQlpZiAodm9sdGFnZS0+dm9sdGFnZSAhPSByZGV2LT5wbS5jdXJyZW50X3ZkZGMpIHsKIAkJCXJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHJkZXYsIHZvbHRhZ2UtPnZvbHRhZ2UsIFNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDKTsKIAkJCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHZvbHRhZ2UtPnZvbHRhZ2U7CkBAIC0yMDI0LDYgKzIwMzEsMTQgQEAKIAkJY2hpcF9uYW1lID0gIlBBTE0iOwogCQlybGNfY2hpcF9uYW1lID0gIlNVTU8iOwogCQlicmVhazsKKwljYXNlIENISVBfU1VNTzoKKwkJY2hpcF9uYW1lID0gIlNVTU8iOworCQlybGNfY2hpcF9uYW1lID0gIlNVTU8iOworCQlicmVhazsKKwljYXNlIENISVBfU1VNTzI6CisJCWNoaXBfbmFtZSA9ICJTVU1PMiI7CisJCXJsY19jaGlwX25hbWUgPSAiU1VNTyI7CisJCWJyZWFrOwogCWRlZmF1bHQ6IEJVRygpOwogCX0KIApAQCAtMjYxMyw2ICsyNjI4LDcgQEAKIAlyNjAwX2NwX2ZpbmkocmRldik7CiAJcjYwMF9pcnFfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKKwlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwogCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJcjYwMF9wY2llX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25fYWdwX2ZpbmkocmRldik7CkBAIC0zMjgyLDI3ICszMjk4LDI2IEBACiAKIGludCByNjAwX2lycV9wcm9jZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXUzMiB3cHRyID0gcjYwMF9nZXRfaWhfd3B0cihyZGV2KTsKLQl1MzIgcnB0ciA9IHJkZXYtPmloLnJwdHI7CisJdTMyIHdwdHI7CisJdTMyIHJwdHI7CiAJdTMyIHNyY19pZCwgc3JjX2RhdGE7CiAJdTMyIHJpbmdfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHF1ZXVlX2hvdHBsdWcgPSBmYWxzZTsKIAotCURSTV9ERUJVRygicjYwMF9pcnFfcHJvY2VzcyBzdGFydDogcnB0ciAlZCwgd3B0ciAlZFxuIiwgcnB0ciwgd3B0cik7Ci0JaWYgKCFyZGV2LT5paC5lbmFibGVkKQorCWlmICghcmRldi0+aWguZW5hYmxlZCB8fCByZGV2LT5zaHV0ZG93bikKIAkJcmV0dXJuIElSUV9OT05FOwogCisJd3B0ciA9IHI2MDBfZ2V0X2loX3dwdHIocmRldik7CisJcnB0ciA9IHJkZXYtPmloLnJwdHI7CisJRFJNX0RFQlVHKCJyNjAwX2lycV9wcm9jZXNzIHN0YXJ0OiBycHRyICVkLCB3cHRyICVkXG4iLCBycHRyLCB3cHRyKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5paC5sb2NrLCBmbGFncyk7CiAKIAlpZiAocnB0ciA9PSB3cHRyKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KLQlpZiAocmRldi0+c2h1dGRvd24pIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQogCiByZXN0YXJ0X2loOgogCS8qIGRpc3BsYXkgaW50ZXJydXB0cyAqLwpAQCAtMzQzMiw3ICszNDQ3LDcgQEAKIAkJCXJhZGVvbl9mZW5jZV9wcm9jZXNzKHJkZXYpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjMzOiAvKiBHVUkgSURMRSAqLwotCQkJRFJNX0RFQlVHKCJJSDogQ1AgRU9QXG4iKTsKKwkJCURSTV9ERUJVRygiSUg6IEdVSSBpZGxlXG4iKTsKIAkJCXJkZXYtPnBtLmd1aV9pZGxlID0gdHJ1ZTsKIAkJCXdha2VfdXAoJnJkZXYtPmlycS5pZGxlX3F1ZXVlKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3MuYwppbmRleCBmZDE4YmU5Li45MDliZGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3MuYwpAQCAtNzEsMjAgKzcxLDIxIEBACiAJdTY0CQkJZGJfYm9fbWM7CiB9OwogCi0jZGVmaW5lIEZNVF84X0JJVChmbXQsIHZjKSBbZm10XSA9IHsgMSwgMSwgMSwgdmMgfQotI2RlZmluZSBGTVRfMTZfQklUKGZtdCwgdmMpIFtmbXRdID0geyAxLCAxLCAyLCB2YyB9Ci0jZGVmaW5lIEZNVF8yNF9CSVQoZm10KSBbZm10XSA9IHsgMSwgMSwgMywgMCB9Ci0jZGVmaW5lIEZNVF8zMl9CSVQoZm10LCB2YykgW2ZtdF0gPSB7IDEsIDEsIDQsIHZjIH0KLSNkZWZpbmUgRk1UXzQ4X0JJVChmbXQpIFtmbXRdID0geyAxLCAxLCA2LCAwIH0KLSNkZWZpbmUgRk1UXzY0X0JJVChmbXQsIHZjKSBbZm10XSA9IHsgMSwgMSwgOCwgdmMgfQotI2RlZmluZSBGTVRfOTZfQklUKGZtdCkgW2ZtdF0gPSB7IDEsIDEsIDEyLCAwIH0KLSNkZWZpbmUgRk1UXzEyOF9CSVQoZm10LCB2YykgW2ZtdF0gPSB7IDEsIDEsIDE2LCB2YyB9CisjZGVmaW5lIEZNVF84X0JJVChmbXQsIHZjKSAgIFtmbXRdID0geyAxLCAxLCAxLCB2YywgQ0hJUF9SNjAwIH0KKyNkZWZpbmUgRk1UXzE2X0JJVChmbXQsIHZjKSAgW2ZtdF0gPSB7IDEsIDEsIDIsIHZjLCBDSElQX1I2MDAgfQorI2RlZmluZSBGTVRfMjRfQklUKGZtdCkgICAgICBbZm10XSA9IHsgMSwgMSwgMywgIDAsIENISVBfUjYwMCB9CisjZGVmaW5lIEZNVF8zMl9CSVQoZm10LCB2YykgIFtmbXRdID0geyAxLCAxLCA0LCB2YywgQ0hJUF9SNjAwIH0KKyNkZWZpbmUgRk1UXzQ4X0JJVChmbXQpICAgICAgW2ZtdF0gPSB7IDEsIDEsIDYsICAwLCBDSElQX1I2MDAgfQorI2RlZmluZSBGTVRfNjRfQklUKGZtdCwgdmMpICBbZm10XSA9IHsgMSwgMSwgOCwgdmMsIENISVBfUjYwMCB9CisjZGVmaW5lIEZNVF85Nl9CSVQoZm10KSAgICAgIFtmbXRdID0geyAxLCAxLCAxMiwgMCwgQ0hJUF9SNjAwIH0KKyNkZWZpbmUgRk1UXzEyOF9CSVQoZm10LCB2YykgW2ZtdF0gPSB7IDEsIDEsIDE2LHZjLCBDSElQX1I2MDAgfQogCiBzdHJ1Y3QgZ3B1X2Zvcm1hdHMgewogCXVuc2lnbmVkIGJsb2Nrd2lkdGg7CiAJdW5zaWduZWQgYmxvY2toZWlnaHQ7CiAJdW5zaWduZWQgYmxvY2tzaXplOwogCXVuc2lnbmVkIHZhbGlkX2NvbG9yOworCWVudW0gcmFkZW9uX2ZhbWlseSBtaW5fZmFtaWx5OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBncHVfZm9ybWF0cyBjb2xvcl9mb3JtYXRzX3RhYmxlW10gPSB7CkBAIC0xNTQsNyArMTU1LDExIEBACiAJW1ZfMDM4MDA0X0ZNVF9CQzNdID0geyA0LCA0LCAxNiwgMCB9LAogCVtWXzAzODAwNF9GTVRfQkM0XSA9IHsgNCwgNCwgOCwgMCB9LAogCVtWXzAzODAwNF9GTVRfQkM1XSA9IHsgNCwgNCwgMTYsIDB9LAorCVtWXzAzODAwNF9GTVRfQkM2XSA9IHsgNCwgNCwgMTYsIDAsIENISVBfQ0VEQVJ9LCAvKiBFdmVyZ3JlZW4tb25seSAqLworCVtWXzAzODAwNF9GTVRfQkM3XSA9IHsgNCwgNCwgMTYsIDAsIENISVBfQ0VEQVJ9LCAvKiBFdmVyZ3JlZW4tb25seSAqLwogCisJLyogVGhlIG90aGVyIEV2ZXJncmVlbiBmb3JtYXRzICovCisJW1ZfMDM4MDA0X0ZNVF8zMl9BU18zMl8zMl8zMl8zMl0gPSB7IDEsIDEsIDQsIDAsIENISVBfQ0VEQVJ9LAogfTsKIAogc3RhdGljIGlubGluZSBib29sIGZtdF9pc192YWxpZF9jb2xvcih1MzIgZm9ybWF0KQpAQCAtMTY4LDExICsxNzMsMTQgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBmbXRfaXNfdmFsaWRfdGV4dHVyZSh1MzIgZm9ybWF0KQorc3RhdGljIGlubGluZSBib29sIGZtdF9pc192YWxpZF90ZXh0dXJlKHUzMiBmb3JtYXQsIGVudW0gcmFkZW9uX2ZhbWlseSBmYW1pbHkpCiB7CiAJaWYgKGZvcm1hdCA+PSBBUlJBWV9TSVpFKGNvbG9yX2Zvcm1hdHNfdGFibGUpKQogCQlyZXR1cm4gZmFsc2U7CiAJCisJaWYgKGZhbWlseSA8IGNvbG9yX2Zvcm1hdHNfdGFibGVbZm9ybWF0XS5taW5fZmFtaWx5KQorCQlyZXR1cm4gZmFsc2U7CisKIAlpZiAoY29sb3JfZm9ybWF0c190YWJsZVtmb3JtYXRdLmJsb2Nrd2lkdGggPiAwKQogCQlyZXR1cm4gdHJ1ZTsKIApAQCAtMTMyNSw3ICsxMzMzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZvcm1hdCA9IEdfMDM4MDA0X0RBVEFfRk9STUFUKHdvcmQxKTsKLQlpZiAoIWZtdF9pc192YWxpZF90ZXh0dXJlKGZvcm1hdCkpIHsKKwlpZiAoIWZtdF9pc192YWxpZF90ZXh0dXJlKGZvcm1hdCwgcC0+ZmFtaWx5KSkgewogCQlkZXZfd2FybihwLT5kZXYsICIlczolZCB0ZXh0dXJlIGludmFsaWQgZm9ybWF0ICVkXG4iLAogCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKaW5kZXggYjJiOTQ0Yi4uMDI0NWFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaApAQCAtNTM2LDcgKzUzNiw3IEBACiAjZGVmaW5lIElIX1JCX1dQVFJfQUREUl9MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZTE0CiAjZGVmaW5lIElIX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZTE4CiAjICAgICAgIGRlZmluZSBFTkFCTEVfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKLSMgICAgICAgZGVmaW5lIElIX01DX1NXQVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDIpCisjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAxKQogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfMTZCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzMyQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgpAQCAtMTMwOSw2ICsxMzA5LDkgQEAKICNkZWZpbmUgICAgIFZfMDM4MDA0X0ZNVF9CQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDMzCiAjZGVmaW5lICAgICBWXzAzODAwNF9GTVRfQkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzNAogI2RlZmluZSAgICAgVl8wMzgwMDRfRk1UX0JDNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzUKKyNkZWZpbmUgICAgIFZfMDM4MDA0X0ZNVF9CQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM2CisjZGVmaW5lICAgICBWXzAzODAwNF9GTVRfQkM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzNworI2RlZmluZSAgICAgVl8wMzgwMDRfRk1UXzMyX0FTXzMyXzMyXzMyXzMyICAgICAgICAgICAgIDB4MDAwMDAwMzgKICNkZWZpbmUgUl8wMzgwMTBfU1FfVEVYX1JFU09VUkNFX1dPUkQ0XzAgICAgICAgICAgICAgMHgwMzgwMTAKICNkZWZpbmUgICBTXzAzODAxMF9GT1JNQVRfQ09NUF9YKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMCkKICNkZWZpbmUgICBHXzAzODAxMF9GT1JNQVRfQ09NUF9YKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCmluZGV4IGJhNjQzYjUuLmVmMGUwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaApAQCAtMTY1LDYgKzE2NSw3IEBACiAJdWludDMyX3QgZGVmYXVsdF9zY2xrOwogCXVpbnQzMl90IGRlZmF1bHRfZGlzcGNsazsKIAl1aW50MzJfdCBkcF9leHRjbGs7CisJdWludDMyX3QgbWF4X3BpeGVsX2Nsb2NrOwogfTsKIAogLyoKQEAgLTE3OCw2ICsxNzksNyBAQAogdm9pZCByYWRlb25fY29tYmlvc19nZXRfcG93ZXJfbW9kZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25fYXRvbWJpb3NfZ2V0X3Bvd2VyX21vZGVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcmFkZW9uX2F0b21fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUxNiB2b2x0YWdlX2xldmVsLCB1OCB2b2x0YWdlX3R5cGUpOworaW50IHJhZGVvbl9hdG9tX2dldF9tYXhfdmRkYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTE2ICp2b2x0YWdlKTsKIHZvaWQgcnM2OTBfcG1faW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHJ2Nnh4X2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcnY3NzBfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCmluZGV4IGQ5NDgyNjUuLmIyNDQ5NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKQEAgLTkwNiw5ICs5MDYsOSBAQAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSAmZXZlcmdyZWVuX2dldF92YmxhbmtfY291bnRlciwKIAkuZmVuY2VfcmluZ19lbWl0ID0gJnI2MDBfZmVuY2VfcmluZ19lbWl0LAogCS5jc19wYXJzZSA9ICZldmVyZ3JlZW5fY3NfcGFyc2UsCi0JLmNvcHlfYmxpdCA9IE5VTEwsCi0JLmNvcHlfZG1hID0gTlVMTCwKLQkuY29weSA9IE5VTEwsCisJLmNvcHlfYmxpdCA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5X2RtYSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCiAJLmdldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X2VuZ2luZV9jbG9jaywKIAkuc2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfZW5naW5lX2Nsb2NrLAogCS5nZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9tZW1vcnlfY2xvY2ssCkBAIC05MzgsNiArOTM4LDEzIEBACiBpbnQgcmFkZW9uX2FzaWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlyYWRlb25fcmVnaXN0ZXJfYWNjZXNzb3JfaW5pdChyZGV2KTsKKworCS8qIHNldCB0aGUgbnVtYmVyIG9mIGNydGNzICovCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKQorCQlyZGV2LT5udW1fY3J0YyA9IDE7CisJZWxzZQorCQlyZGV2LT5udW1fY3J0YyA9IDI7CisKIAlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCWNhc2UgQ0hJUF9SMTAwOgogCWNhc2UgQ0hJUF9SVjEwMDoKQEAgLTEwMTcsMTggKzEwMjQsMzIgQEAKIAljYXNlIENISVBfSlVOSVBFUjoKIAljYXNlIENISVBfQ1lQUkVTUzoKIAljYXNlIENISVBfSEVNTE9DSzoKKwkJLyogc2V0IG51bSBjcnRjcyAqLworCQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpCisJCQlyZGV2LT5udW1fY3J0YyA9IDQ7CisJCWVsc2UKKwkJCXJkZXYtPm51bV9jcnRjID0gNjsKIAkJcmRldi0+YXNpYyA9ICZldmVyZ3JlZW5fYXNpYzsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1NVTU86CisJY2FzZSBDSElQX1NVTU8yOgogCQlyZGV2LT5hc2ljID0gJnN1bW9fYXNpYzsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX0JBUlRTOgogCWNhc2UgQ0hJUF9UVVJLUzoKIAljYXNlIENISVBfQ0FJQ09TOgorCQkvKiBzZXQgbnVtIGNydGNzICovCisJCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DQUlDT1MpCisJCQlyZGV2LT5udW1fY3J0YyA9IDQ7CisJCWVsc2UKKwkJCXJkZXYtPm51bV9jcnRjID0gNjsKIAkJcmRldi0+YXNpYyA9ICZidGNfYXNpYzsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX0NBWU1BTjoKIAkJcmRldi0+YXNpYyA9ICZjYXltYW5fYXNpYzsKKwkJLyogc2V0IG51bSBjcnRjcyAqLworCQlyZGV2LT5udW1fY3J0YyA9IDY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIEZJWE1FOiBub3Qgc3VwcG9ydGVkIHlldCAqLwpAQCAtMTA0MCwxOCArMTA2MSw2IEBACiAJCXJkZXYtPmFzaWMtPnNldF9tZW1vcnlfY2xvY2sgPSBOVUxMOwogCX0KIAotCS8qIHNldCB0aGUgbnVtYmVyIG9mIGNydGNzICovCi0JaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKQotCQlyZGV2LT5udW1fY3J0YyA9IDE7Ci0JZWxzZSB7Ci0JCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKQotCQkJcmRldi0+bnVtX2NydGMgPSAyOwotCQllbHNlIGlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQlyZGV2LT5udW1fY3J0YyA9IDY7Ci0JCWVsc2UKLQkJCXJkZXYtPm51bV9jcnRjID0gMjsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKaW5kZXggOTBkZmIyYi4uYmYyYjYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCkBAIC0xMjQ2LDYgKzEyNDYsMTAgQEAKIAkJfQogCQkqZGNwbGwgPSAqcDFwbGw7CiAKKwkJcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID0gbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mby51c01heFBpeGVsQ2xvY2spOworCQlpZiAocmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID09IDApCisJCQlyZGV2LT5jbG9jay5tYXhfcGl4ZWxfY2xvY2sgPSA0MDAwMDsKKwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTIzMTYsNiArMjMyMCwxNCBAQAogCQkJbGUxNl90b19jcHUoY2xvY2tfaW5mby0+cjYwMC51c1ZEREMpOwogCX0KIAorCS8qIHBhdGNoIHVwIHZkZGMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnZvbHRhZ2Uudm9sdGFnZSA9PSAweGZmMDEpIHsKKwkJdTE2IHZkZGM7CisKKwkJaWYgKHJhZGVvbl9hdG9tX2dldF9tYXhfdmRkYyhyZGV2LCAmdmRkYykgPT0gMCkKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnZvbHRhZ2Uudm9sdGFnZSA9IHZkZGM7CisJfQorCiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgewogCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KIAkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPT0gMCkKQEAgLTI2MDMsNiArMjYxNSwxMCBAQAogCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQogCQlyZXR1cm47CiAKKwkvKiAweGZmMDEgaXMgYSBmbGFnIHJhdGhlciB0aGVuIGFuIGFjdHVhbCB2b2x0YWdlICovCisJaWYgKHZvbHRhZ2VfbGV2ZWwgPT0gMHhmZjAxKQorCQlyZXR1cm47CisKIAlzd2l0Y2ggKGNyZXYpIHsKIAljYXNlIDE6CiAJCWFyZ3MudjEudWNWb2x0YWdlVHlwZSA9IHZvbHRhZ2VfdHlwZTsKQEAgLTI2MjIsNyArMjYzOCwzNSBAQAogCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwogfQogCitpbnQgcmFkZW9uX2F0b21fZ2V0X21heF92ZGRjKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgICB1MTYgKnZvbHRhZ2UpCit7CisJdW5pb24gc2V0X3ZvbHRhZ2UgYXJnczsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBTZXRWb2x0YWdlKTsKKwl1OCBmcmV2LCBjcmV2OwogCisJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjcmV2KSB7CisJY2FzZSAxOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIDI6CisJCWFyZ3MudjIudWNWb2x0YWdlVHlwZSA9IFNFVF9WT0xUQUdFX0dFVF9NQVhfVk9MVEFHRTsKKwkJYXJncy52Mi51Y1ZvbHRhZ2VNb2RlID0gMDsKKwkJYXJncy52Mi51c1ZvbHRhZ2VMZXZlbCA9IDA7CisKKwkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKKwkJKnZvbHRhZ2UgPSBsZTE2X3RvX2NwdShhcmdzLnYyLnVzVm9sdGFnZUxldmVsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIHZvaWQgcmFkZW9uX2F0b21faW5pdGlhbGl6ZV9iaW9zX3NjcmF0Y2hfcmVncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCmluZGV4IDFhYmE4NWMuLjIyOWEyMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogc3RhdGljIGJvb2wgcmFkZW9uX2F0cm1fZ2V0X2Jpb3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHJldDsKLQlpbnQgc2l6ZSA9IDY0ICogMTAyNDsKKwlpbnQgc2l6ZSA9IDI1NiAqIDEwMjQ7CiAJaW50IGk7CiAKIAlpZiAoIXJhZGVvbl9hdHJtX3N1cHBvcnRlZChyZGV2LT5wZGV2KSkKQEAgLTMzMSw3ICszMzEsNyBAQAogCiAJc2Vwcm9tX2NudGwxID0gUlJFRzMyKFJBREVPTl9TRVBST01fQ05UTDEpOwogCXZpcGhfY29udHJvbCA9IFJSRUczMihSQURFT05fVklQSF9DT05UUk9MKTsKLQlidXNfY250bCA9IFJSRUczMihSQURFT05fQlVTX0NOVEwpOworCWJ1c19jbnRsID0gUlJFRzMyKFJWMzcwX0JVU19DTlRMKTsKIAlkMXZnYV9jb250cm9sID0gUlJFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wpOwogCWQydmdhX2NvbnRyb2wgPSBSUkVHMzIoQVZJVk9fRDJWR0FfQ09OVFJPTCk7CiAJdmdhX3JlbmRlcl9jb250cm9sID0gUlJFRzMyKEFWSVZPX1ZHQV9SRU5ERVJfQ09OVFJPTCk7CkBAIC0zNTAsNyArMzUwLDcgQEAKIAlXUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCwgKHZpcGhfY29udHJvbCAmIH5SQURFT05fVklQSF9FTikpOwogCiAJLyogZW5hYmxlIHRoZSByb20gKi8KLQlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCAoYnVzX2NudGwgJiB+UkFERU9OX0JVU19CSU9TX0RJU19ST00pKTsKKwlXUkVHMzIoUlYzNzBfQlVTX0NOVEwsIChidXNfY250bCAmIH5SVjM3MF9CVVNfQklPU19ESVNfUk9NKSk7CiAKIAkvKiBEaXNhYmxlIFZHQSBtb2RlICovCiAJV1JFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wsCkBAIC0zNjcsNyArMzY3LDcgQEAKIAkvKiByZXN0b3JlIHJlZ3MgKi8KIAlXUkVHMzIoUkFERU9OX1NFUFJPTV9DTlRMMSwgc2Vwcm9tX2NudGwxKTsKIAlXUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCwgdmlwaF9jb250cm9sKTsKLQlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCBidXNfY250bCk7CisJV1JFRzMyKFJWMzcwX0JVU19DTlRMLCBidXNfY250bCk7CiAJV1JFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wsIGQxdmdhX2NvbnRyb2wpOwogCVdSRUczMihBVklWT19EMlZHQV9DT05UUk9MLCBkMnZnYV9jb250cm9sKTsKIAlXUkVHMzIoQVZJVk9fVkdBX1JFTkRFUl9DT05UUk9MLCB2Z2FfcmVuZGVyX2NvbnRyb2wpOwpAQCAtMzkwLDcgKzM5MCwxMCBAQAogCiAJc2Vwcm9tX2NudGwxID0gUlJFRzMyKFJBREVPTl9TRVBST01fQ05UTDEpOwogCXZpcGhfY29udHJvbCA9IFJSRUczMihSQURFT05fVklQSF9DT05UUk9MKTsKLQlidXNfY250bCA9IFJSRUczMihSQURFT05fQlVTX0NOVEwpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKQorCQlidXNfY250bCA9IFJSRUczMihSVjM3MF9CVVNfQ05UTCk7CisJZWxzZQorCQlidXNfY250bCA9IFJSRUczMihSQURFT05fQlVTX0NOVEwpOwogCWNydGNfZ2VuX2NudGwgPSBSUkVHMzIoUkFERU9OX0NSVENfR0VOX0NOVEwpOwogCWNydGMyX2dlbl9jbnRsID0gMDsKIAljcnRjX2V4dF9jbnRsID0gUlJFRzMyKFJBREVPTl9DUlRDX0VYVF9DTlRMKTsKQEAgLTQxMiw3ICs0MTUsMTAgQEAKIAlXUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCwgKHZpcGhfY29udHJvbCAmIH5SQURFT05fVklQSF9FTikpOwogCiAJLyogZW5hYmxlIHRoZSByb20gKi8KLQlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCAoYnVzX2NudGwgJiB+UkFERU9OX0JVU19CSU9TX0RJU19ST00pKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJV1JFRzMyKFJWMzcwX0JVU19DTlRMLCAoYnVzX2NudGwgJiB+UlYzNzBfQlVTX0JJT1NfRElTX1JPTSkpOworCWVsc2UKKwkJV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJBREVPTl9CVVNfQklPU19ESVNfUk9NKSk7CiAKIAkvKiBUdXJuIG9mZiBtZW0gcmVxdWVzdHMgYW5kIENSVEMgZm9yIGJvdGggY29udHJvbGxlcnMgKi8KIAlXUkVHMzIoUkFERU9OX0NSVENfR0VOX0NOVEwsCkBAIC00MzksNyArNDQ1LDEwIEBACiAJLyogcmVzdG9yZSByZWdzICovCiAJV1JFRzMyKFJBREVPTl9TRVBST01fQ05UTDEsIHNlcHJvbV9jbnRsMSk7CiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsIHZpcGhfY29udHJvbCk7Ci0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgYnVzX2NudGwpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKQorCQlXUkVHMzIoUlYzNzBfQlVTX0NOVEwsIGJ1c19jbnRsKTsKKwllbHNlCisJCVdSRUczMihSQURFT05fQlVTX0NOVEwsIGJ1c19jbnRsKTsKIAlXUkVHMzIoUkFERU9OX0NSVENfR0VOX0NOVEwsIGNydGNfZ2VuX2NudGwpOwogCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKSkgewogCQlXUkVHMzIoUkFERU9OX0NSVEMyX0dFTl9DTlRMLCBjcnRjMl9nZW5fY250bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nsb2Nrcy5jCmluZGV4IDUyNDlhZjguLjJkNDhlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nsb2Nrcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nsb2Nrcy5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwMXBsbC0+cmVmZXJlbmNlX2RpdiA9IFJSRUczMl9QTEwoUkFERU9OX1BQTExfUkVGX0RJVikgJiAweDNmZjsKIAlpZiAocDFwbGwtPnJlZmVyZW5jZV9kaXYgPCAyKQogCQlwMXBsbC0+cmVmZXJlbmNlX2RpdiA9IDEyOwotCXAycGxsLT5yZWZlcmVuY2VfZGl2ID0gcDFwbGwtPnJlZmVyZW5jZV9kaXY7CQorCXAycGxsLT5yZWZlcmVuY2VfZGl2ID0gcDFwbGwtPnJlZmVyZW5jZV9kaXY7CiAKIAkvKiBUaGVzZSBhcmVuJ3QgaW4gdGhlIGRldmljZS10cmVlICovCiAJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I0MjApIHsKQEAgLTEzOSw2ICsxMzksOCBAQAogCQlwMnBsbC0+cGxsX291dF9taW4gPSAxMjUwMDsKIAkJcDJwbGwtPnBsbF9vdXRfbWF4ID0gMzUwMDA7CiAJfQorCS8qIG5vdCBzdXJlIHdoYXQgdGhlIG1heCBzaG91bGQgYmUgaW4gYWxsIGNhc2VzICovCisJcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID0gMzUwMDA7CiAKIAlzcGxsLT5yZWZlcmVuY2VfZnJlcSA9IG1wbGwtPnJlZmVyZW5jZV9mcmVxID0gcDFwbGwtPnJlZmVyZW5jZV9mcmVxOwogCXNwbGwtPnJlZmVyZW5jZV9kaXYgPSBtcGxsLT5yZWZlcmVuY2VfZGl2ID0KQEAgLTE1MSw3ICsxNTMsNyBAQAogCWVsc2UKIAkJcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrID0KIAkJCXJhZGVvbl9sZWdhY3lfZ2V0X2VuZ2luZV9jbG9jayhyZGV2KTsKLQkJCQorCiAJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiQVRZLE1DTEsiLCBOVUxMKTsKIAlpZiAodmFsICYmICp2YWwpCiAJCXJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsayA9ICgqdmFsKSAvIDEwOwpAQCAtMTYwLDcgKzE2Miw3IEBACiAJCQlyYWRlb25fbGVnYWN5X2dldF9tZW1vcnlfY2xvY2socmRldik7CiAKIAlEUk1fSU5GTygiVXNpbmcgZGV2aWNlLXRyZWUgY2xvY2sgaW5mb1xuIik7Ci0JCisKIAlyZXR1cm4gdHJ1ZTsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKaW5kZXggNWI5OTFmNy4uZTQ1OTQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwpAQCAtODY2LDYgKzg2NiwxMSBAQAogCQlyZGV2LT5jbG9jay5kZWZhdWx0X3NjbGsgPSBzY2xrOwogCQlyZGV2LT5jbG9jay5kZWZhdWx0X21jbGsgPSBtY2xrOwogCisJCWlmIChSQklPUzMyKHBsbF9pbmZvICsgMHgxNikpCisJCQlyZGV2LT5jbG9jay5tYXhfcGl4ZWxfY2xvY2sgPSBSQklPUzMyKHBsbF9pbmZvICsgMHgxNik7CisJCWVsc2UKKwkJCXJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9IDM1MDAwOyAvKiBtaWdodCBuZWVkIHNvbWV0aGluZyBhc2ljIHNwZWNpZmljICovCisKIAkJcmV0dXJuIHRydWU7CiAJfQogCXJldHVybiBmYWxzZTsKQEAgLTE1NDgsMTAgKzE1NTMsMTIgQEAKIAkJCSAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4NGE0OCkpIHsKIAkJCS8qIE1hYyBYODAwICovCiAJCQlyZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlID0gQ1RfTUFDX1g4MDA7Ci0JCX0gZWxzZSBpZiAoKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDQxNTApICYmCisJCX0gZWxzZSBpZiAoKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM3LDIiKSB8fAorCQkJICAgIG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM3LDMiKSkgJiYKKwkJCSAgIChyZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg0MTUwKSAmJgogCQkJICAgKHJkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDAyKSAmJgogCQkJICAgKHJkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHg0MTUwKSkgewotCQkJLyogTWFjIEc1IDk2MDAgKi8KKwkJCS8qIE1hYyBHNSB0b3dlciA5NjAwICovCiAJCQlyZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlID0gQ1RfTUFDX0c1Xzk2MDA7CiAJCX0gZWxzZQogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCmluZGV4IGVlMWRjY2IuLjk3OTJkNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKQEAgLTQ0LDEyICs0NCwyMCBAQAogcmFkZW9uX2xlZ2FjeV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyLAogCQkJICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX2Nvbm5lY3Rvcik7CiAKK2Jvb2wgcmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2RwX2JyaWRnZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKwogdm9pZCByYWRlb25fY29ubmVjdG9yX2hvdHBsdWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCisJLyogYmFpbCBpZiB0aGUgY29ubmVjdG9yIGRvZXMgbm90IGhhdmUgaHBkIHBpbiwgZS5nLiwKKwkgKiBWR0EsIFRWLCBldGMuCisJICovCisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQgPT0gUkFERU9OX0hQRF9OT05FKQorCQlyZXR1cm47CisKIAlyYWRlb25faHBkX3NldF9wb2xhcml0eShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKTsKIAogCS8qIHBvd2VyaW5nIHVwL2Rvd24gdGhlIGVEUCBwYW5lbCBnZW5lcmF0ZXMgaHBkIGV2ZW50cyB3aGljaApAQCAtNjI2LDggKzYzNCwxNCBAQAogc3RhdGljIGludCByYWRlb25fdmdhX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKIAkvKiBYWFggY2hlY2sgbW9kZSBiYW5kd2lkdGggKi8KLQkvKiBYWFggdmVyaWZ5IGFnYWluc3QgbWF4IERBQyBvdXRwdXQgZnJlcXVlbmN5ICovCisKKwlpZiAoKG1vZGUtPmNsb2NrIC8gMTApID4gcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCiAJcmV0dXJuIE1PREVfT0s7CiB9CiAKQEAgLTgzMCw2ICs4NDQsMTMgQEAKIAkJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CiAJCQlEUk1fRVJST1IoIiVzOiBwcm9iZWQgYSBtb25pdG9yIGJ1dCBub3xpbnZhbGlkIEVESURcbiIsCiAJCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkvKiByczY5MCBzZWVtcyB0byBoYXZlIGEgcHJvYmxlbSB3aXRoIGNvbm5lY3RvcnMgbm90IGV4aXN0aW5nIGFuZCBhbHdheXMKKwkJCSAqIHJldHVybiBhIGJsb2NrIG9mIDAncy4gSWYgd2Ugc2VlIHRoaXMganVzdCBzdG9wIHBvbGxpbmcgb24gdGhpcyBvdXRwdXQgKi8KKwkJCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlM2OTAgfHwgcmRldi0+ZmFtaWx5ID09IENISVBfUlM3NDApICYmIHJhZGVvbl9jb25uZWN0b3ItPmJhc2UubnVsbF9lZGlkX2NvdW50ZXIpIHsKKwkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJCQlEUk1fRVJST1IoIiVzOiBkZXRlY3RlZCBSUzY5MCBmbG9hdGluZyBidXMgYnVnLCBzdG9wcGluZyBkZGMgZGV0ZWN0XG4iLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMgPSBOVUxMOworCQkJfQogCQl9IGVsc2UgewogCQkJcmFkZW9uX2Nvbm5lY3Rvci0+dXNlX2RpZ2l0YWwgPSAhIShyYWRlb25fY29ubmVjdG9yLT5lZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUwpOwogCkBAIC0xMDE1LDYgKzEwMzYsMTEgQEAKIAkJfSBlbHNlCiAJCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOwogCX0KKworCS8qIGNoZWNrIGFnYWluc3QgdGhlIG1heCBwaXhlbCBjbG9jayAqLworCWlmICgobW9kZS0+Y2xvY2sgLyAxMCkgPiByZGV2LT5jbG9jay5tYXhfcGl4ZWxfY2xvY2spCisJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisKIAlyZXR1cm4gTU9ERV9PSzsKIH0KIApAQCAtMTA1MiwxMCArMTA3OCwxMSBAQAogewogCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpyYWRlb25fZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IHJhZGVvbl9iZXN0X3NpbmdsZV9lbmNvZGVyKGNvbm5lY3Rvcik7CiAJaW50IHJldDsKIAotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHsKLQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWlmICgoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB8fAorCSAgICAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykpIHsKIAkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CiAKIAkJaWYgKCFyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZWRwX29uKQpAQCAtMTA2Nyw3ICsxMDk0LDYgQEAKIAkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKTsKIAogCQlpZiAocmV0ID4gMCkgewotCQkJZW5jb2RlciA9IHJhZGVvbl9iZXN0X3NpbmdsZV9lbmNvZGVyKGNvbm5lY3Rvcik7CiAJCQlpZiAoZW5jb2RlcikgewogCQkJCXJhZGVvbl9maXh1cF9sdmRzX25hdGl2ZV9tb2RlKGVuY29kZXIsIGNvbm5lY3Rvcik7CiAJCQkJLyogYWRkIHNjYWxlZCBtb2RlcyAqLwpAQCAtMTA5MSw4ICsxMTE3LDE0IEBACiAJCQkvKiBhZGQgc2NhbGVkIG1vZGVzICovCiAJCQlyYWRlb25fYWRkX2NvbW1vbl9tb2RlcyhlbmNvZGVyLCBjb25uZWN0b3IpOwogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJLyogbmVlZCB0byBzZXR1cCBkZGMgb24gdGhlIGJyaWRnZSAqLworCQlpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2RwX2JyaWRnZShjb25uZWN0b3IpKSB7CisJCQlpZiAoZW5jb2RlcikKKwkJCQlyYWRlb25fYXRvbV9leHRfZW5jb2Rlcl9zZXR1cF9kZGMoZW5jb2Rlcik7CisJCX0KIAkJcmV0ID0gcmFkZW9uX2RkY19nZXRfbW9kZXMocmFkZW9uX2Nvbm5lY3Rvcik7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNzYsMTQgKzEyMDgsMTUgQEAKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwogCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpyYWRlb25fZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IHJhZGVvbl9iZXN0X3NpbmdsZV9lbmNvZGVyKGNvbm5lY3Rvcik7CiAKIAlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQlrZnJlZShyYWRlb25fY29ubmVjdG9yLT5lZGlkKTsKIAkJcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCA9IE5VTEw7CiAJfQogCi0JaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgewotCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOworCWlmICgoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB8fAorCSAgICAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykpIHsKIAkJaWYgKGVuY29kZXIpIHsKIAkJCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKIAkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuYXRpdmVfbW9kZSA9ICZyYWRlb25fZW5jb2Rlci0+bmF0aXZlX21vZGU7CkBAIC0xMjAzLDYgKzEyMzYsMTEgQEAKIAkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAogCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PRkYpOwogCX0gZWxzZSB7CisJCS8qIG5lZWQgdG8gc2V0dXAgZGRjIG9uIHRoZSBicmlkZ2UgKi8KKwkJaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2UoY29ubmVjdG9yKSkgeworCQkJaWYgKGVuY29kZXIpCisJCQkJcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKGVuY29kZXIpOworCQl9CiAJCXJhZGVvbl9kaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPSByYWRlb25fZHBfZ2V0c2lua3R5cGUocmFkZW9uX2Nvbm5lY3Rvcik7CiAJCWlmIChyYWRlb25faHBkX3NlbnNlKHJkZXYsIHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpKSB7CiAJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKQEAgLTEyMTcsNiArMTI1NSwxNiBAQAogCQkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJCX0KIAkJfQorCisJCWlmICgocmV0ID09IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKSAmJgorCQkgICAgcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0KSB7CisJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOworCQkJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jczsKKwkJCWlmIChlbmNvZGVyKSB7CisJCQkJZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCQkJCXJldCA9IGVuY29kZXJfZnVuY3MtPmRldGVjdChlbmNvZGVyLCBjb25uZWN0b3IpOworCQkJfQorCQl9CiAJfQogCiAJcmFkZW9uX2Nvbm5lY3Rvcl91cGRhdGVfc2NyYXRjaF9yZWdzKGNvbm5lY3RvciwgcmV0KTsKQEAgLTEyMzEsNyArMTI3OSw4IEBACiAKIAkvKiBYWFggY2hlY2sgbW9kZSBiYW5kd2lkdGggKi8KIAotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHsKKwlpZiAoKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgfHwKKwkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpKSB7CiAJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IHJhZGVvbl9iZXN0X3NpbmdsZV9lbmNvZGVyKGNvbm5lY3Rvcik7CiAKIAkJaWYgKChtb2RlLT5oZGlzcGxheSA8IDMyMCkgfHwgKG1vZGUtPnZkaXNwbGF5IDwgMjQwKSkKQEAgLTEyNDEsNyArMTI5MCw3IEBACiAJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CiAJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmF0aXZlX21vZGUgPSAmcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlOwogCi0JCS8qIEFWSVZPIGhhcmR3YXJlIHN1cHBvcnRzIGRvd25zY2FsaW5nIG1vZGVzIGxhcmdlciB0aGFuIHRoZSBwYW5lbAorCQkJLyogQVZJVk8gaGFyZHdhcmUgc3VwcG9ydHMgZG93bnNjYWxpbmcgbW9kZXMgbGFyZ2VyIHRoYW4gdGhlIHBhbmVsCiAJCQkgKiB0byB0aGUgcGFuZWwgc2l6ZSwgYnV0IEknbSBub3Qgc3VyZSB0aGlzIGlzIGRlc2lyYWJsZS4KIAkJCSAqLwogCQkJaWYgKChtb2RlLT5oZGlzcGxheSA+IG5hdGl2ZV9tb2RlLT5oZGlzcGxheSkgfHwKQEAgLTEzOTAsNiArMTQzOSwxMCBAQAogCQlkZWZhdWx0OgogCQkJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IHRydWU7CiAJCQljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IHRydWU7CisJCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCisJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCisJCQkJCQkgICAgICAxKTsKIAkJCWJyZWFrOwogCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOgogCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgpAQCAtMTQxMSw2ICsxNDY0LDEyIEBACiAJCQkJY29ubmVjdG9yLT5kb3VibGVzY2FuX2FsbG93ZWQgPSB0cnVlOwogCQkJZWxzZQogCQkJCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gZmFsc2U7CisJCQlpZiAoY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpIHsKKwkJCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOworCQkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAorCQkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby5sb2FkX2RldGVjdF9wcm9wZXJ0eSwKKwkJCQkJCQkgICAgICAxKTsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgogCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9lRFA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYwppbmRleCA4YzE5MTY5Li5mYWUwMGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKQEAgLTIyOCw2ICsyMjgsNyBAQAogCXBhcnNlci5maWxwID0gZmlscDsKIAlwYXJzZXIucmRldiA9IHJkZXY7CiAJcGFyc2VyLmRldiA9IHJkZXYtPmRldjsKKwlwYXJzZXIuZmFtaWx5ID0gcmRldi0+ZmFtaWx5OwogCXIgPSByYWRlb25fY3NfcGFyc2VyX2luaXQoJnBhcnNlciwgZGF0YSk7CiAJaWYgKHIpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwYXJzZXIgIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCmluZGV4IDViNjEzNjQuLjdjZmFhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCkBAIC04Miw2ICs4Miw4IEBACiAJIkNZUFJFU1MiLAogCSJIRU1MT0NLIiwKIAkiUEFMTSIsCisJIlNVTU8iLAorCSJTVU1PMiIsCiAJIkJBUlRTIiwKIAkiVFVSS1MiLAogCSJDQUlDT1MiLApAQCAtMjEzLDYgKzIxNSw4IEBACiAJCXJldHVybiByOwogCX0KIAorCS8qIGNsZWFyIHdiIG1lbW9yeSAqLworCW1lbXNldCgoY2hhciAqKXJkZXYtPndiLndiLCAwLCBSQURFT05fR1BVX1BBR0VfU0laRSk7CiAJLyogZGlzYWJsZSBldmVudF93cml0ZSBmZW5jZXMgKi8KIAlyZGV2LT53Yi51c2VfZXZlbnQgPSBmYWxzZTsKIAkvKiBkaXNhYmxlZCB2aWEgbW9kdWxlIHBhcmFtICovCkBAIC03NTIsNiArNzU2LDcgQEAKIAlkbWFfYml0cyA9IHJkZXYtPm5lZWRfZG1hMzIgPyAzMiA6IDQwOwogCXIgPSBwY2lfc2V0X2RtYV9tYXNrKHJkZXYtPnBkZXYsIERNQV9CSVRfTUFTSyhkbWFfYml0cykpOwogCWlmIChyKSB7CisJCXJkZXYtPm5lZWRfZG1hMzIgPSB0cnVlOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYWRlb246IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwppbmRleCBhZTI0N2VlLi4yOTJmNzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCkBAIC0yNjQsNiArMjY0LDggQEAKIAkJcmFkZW9uX2JvX3VucmVzZXJ2ZSh3b3JrLT5vbGRfcmJvKTsKIAl9IGVsc2UKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVzZXJ2ZSBidWZmZXIgYWZ0ZXIgZmxpcFxuIik7CisKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmd29yay0+b2xkX3Jiby0+Z2VtX2Jhc2UpOwogCWtmcmVlKHdvcmspOwogfQogCkBAIC0zNzEsNiArMzczLDggQEAKIAluZXdfcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKGZiKTsKIAkvKiBzY2hlZHVsZSB1bnBpbiBvZiB0aGUgb2xkIGJ1ZmZlciAqLwogCW9iaiA9IG9sZF9yYWRlb25fZmItPm9iajsKKwkvKiB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgb2JqZWN0ICovCisJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7CiAJcmJvID0gZ2VtX3RvX3JhZGVvbl9ibyhvYmopOwogCXdvcmstPm9sZF9yYm8gPSByYm87CiAJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCByYWRlb25fdW5waW5fd29ya19mdW5jKTsKQEAgLTM3OCwxMiArMzgyLDkgQEAKIAkvKiBXZSBib3Jyb3cgdGhlIGV2ZW50IHNwaW4gbG9jayBmb3IgcHJvdGVjdGluZyB1bnBpbl93b3JrICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCWlmIChyYWRlb25fY3J0Yy0+dW5waW5fd29yaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQkJa2ZyZWUod29yayk7Ci0JCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOwotCiAJCURSTV9ERUJVR19EUklWRVIoImZsaXAgcXVldWU6IGNydGMgYWxyZWFkeSBidXN5XG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJciA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2tfZnJlZTsKIAl9CiAJcmFkZW9uX2NydGMtPnVucGluX3dvcmsgPSB3b3JrOwogCXJhZGVvbl9jcnRjLT5kZWZlcnJlZF9mbGlwX2NvbXBsZXRpb24gPSAwOwpAQCAtNDk3LDYgKzQ5OCw4IEBACiBwZmxpcF9jbGVhbnVwOgogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlyYWRlb25fY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7Cit1bmxvY2tfZnJlZToKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvbGRfcmFkZW9uX2ZiLT5vYmopOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOwogCWtmcmVlKHdvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwppbmRleCAxZDMzMDYwLi43M2RmYmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwpAQCAtMTEzLDcgKzExMyw3IEBACiBpbnQgcmFkZW9uX3Rlc3RpbmcgPSAwOwogaW50IHJhZGVvbl9jb25uZWN0b3JfdGFibGUgPSAwOwogaW50IHJhZGVvbl90diA9IDE7Ci1pbnQgcmFkZW9uX2F1ZGlvID0gMTsKK2ludCByYWRlb25fYXVkaW8gPSAwOwogaW50IHJhZGVvbl9kaXNwX3ByaW9yaXR5ID0gMDsKIGludCByYWRlb25faHdfaTJjID0gMDsKIGludCByYWRlb25fcGNpZV9nZW4yID0gMDsKQEAgLTE1MSw3ICsxNTEsNyBAQAogTU9EVUxFX1BBUk1fREVTQyh0diwgIlRWIGVuYWJsZSAoMCA9IGRpc2FibGUpIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQodHYsIHJhZGVvbl90diwgaW50LCAwNDQ0KTsKIAotTU9EVUxFX1BBUk1fREVTQyhhdWRpbywgIkF1ZGlvIGVuYWJsZSAoMCA9IGRpc2FibGUpIik7CitNT0RVTEVfUEFSTV9ERVNDKGF1ZGlvLCAiQXVkaW8gZW5hYmxlICgxID0gZW5hYmxlKSIpOwogbW9kdWxlX3BhcmFtX25hbWVkKGF1ZGlvLCByYWRlb25fYXVkaW8sIGludCwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0MoZGlzcF9wcmlvcml0eSwgIkRpc3BsYXkgUHJpb3JpdHkgKDAgPSBhdXRvLCAxID0gbm9ybWFsLCAyID0gaGlnaCkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCmluZGV4IDFiNTU3NTUuLmIyOTM0ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYwpAQCAtMzY3LDcgKzM2Nyw4IEBACiAJfQogCiAJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSAmJgotCSAgICAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpKSB7CisJICAgICgocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHx8CisJICAgICByYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpKSB7CiAJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKIAkJcmFkZW9uX2RwX3NldF9saW5rX2NvbmZpZyhjb25uZWN0b3IsIG1vZGUpOwogCX0KQEAgLTY2MCwyMSArNjYxLDE2IEBACiAJaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkKIAkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOwogCisJLyogRFZPIGlzIGFsd2F5cyBEVk8gKi8KKwlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gQVRPTV9FTkNPREVSX01PREVfRFZPKQorCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZPOworCiAJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7Ci0JaWYgKCFjb25uZWN0b3IpIHsKLQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9DUlQ7Ci0JCX0KLQl9CisJLyogaWYgd2UgZG9uJ3QgaGF2ZSBhbiBhY3RpdmUgZGV2aWNlIHlldCwganVzdCB1c2Ugb25lIG9mCisJICogdGhlIGNvbm5lY3RvcnMgdGllZCB0byB0aGUgZW5jb2Rlci4KKwkgKi8KKwlpZiAoIWNvbm5lY3RvcikKKwkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChlbmNvZGVyKTsKIAlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCiAJc3dpdGNoIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7CkBAIC05NTQsMTAgKzk1MCwxNSBAQAogCWludCBkcF9sYW5lX2NvdW50ID0gMDsKIAlpbnQgY29ubmVjdG9yX29iamVjdF9pZCA9IDA7CiAJaW50IGlncF9sYW5lX2luZm8gPSAwOworCWludCBkaWdfZW5jb2RlciA9IGRpZy0+ZGlnX2VuY29kZXI7CiAKLQlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQpCisJaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7CiAJCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoZW5jb2Rlcik7Ci0JZWxzZQorCQkvKiBqdXN0IG5lZWRlZCB0byBhdm9pZCBiYWlsaW5nIGluIHRoZSBlbmNvZGVyIGNoZWNrLiAgdGhlIGVuY29kZXIKKwkJICogaXNuJ3QgdXNlZCBmb3IgaW5pdAorCQkgKi8KKwkJZGlnX2VuY29kZXIgPSAwOworCX0gZWxzZQogCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKIAogCWlmIChjb25uZWN0b3IpIHsKQEAgLTk3Myw3ICs5NzQsNyBAQAogCX0KIAogCS8qIG5vIGRpZyBlbmNvZGVyIGFzc2lnbmVkICovCi0JaWYgKGRpZy0+ZGlnX2VuY29kZXIgPT0gLTEpCisJaWYgKGRpZ19lbmNvZGVyID09IC0xKQogCQlyZXR1cm47CiAKIAlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkKQEAgLTEwMjMsNyArMTAyNCw3IEBACiAKIAkJaWYgKGRpZy0+bGlua2IpCiAJCQlhcmdzLnYzLmFjQ29uZmlnLnVjTGlua1NlbCA9IDE7Ci0JCWlmIChkaWctPmRpZ19lbmNvZGVyICYgMSkKKwkJaWYgKGRpZ19lbmNvZGVyICYgMSkKIAkJCWFyZ3MudjMuYWNDb25maWcudWNFbmNvZGVyU2VsID0gMTsKIAogCQkvKiBTZWxlY3QgdGhlIFBMTCBmb3IgdGhlIFBIWQpAQCAtMTA3Myw3ICsxMDc0LDcgQEAKIAkJCQlhcmdzLnYzLmFjQ29uZmlnLmZEdWFsTGlua0Nvbm5lY3RvciA9IDE7CiAJCX0KIAl9IGVsc2UgaWYgKEFTSUNfSVNfRENFMzIocmRldikpIHsKLQkJYXJncy52Mi5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSBkaWctPmRpZ19lbmNvZGVyOworCQlhcmdzLnYyLmFjQ29uZmlnLnVjRW5jb2RlclNlbCA9IGRpZ19lbmNvZGVyOwogCQlpZiAoZGlnLT5saW5rYikKIAkJCWFyZ3MudjIuYWNDb25maWcudWNMaW5rU2VsID0gMTsKIApAQCAtMTA4OSw5ICsxMDkwLDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChpc19kcCkKKwkJaWYgKGlzX2RwKSB7CiAJCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOwotCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKKwkJCWFyZ3MudjIuYWNDb25maWcuZkRQQ29ubmVjdG9yID0gMTsKKwkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKIAkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCiAJCQkJYXJncy52Mi5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKIAkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCkBAIC0xMTAwLDcgKzExMDIsNyBAQAogCX0gZWxzZSB7CiAJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19DTEtTUkNfUFBMTDsKIAotCQlpZiAoZGlnLT5kaWdfZW5jb2RlcikKKwkJaWYgKGRpZ19lbmNvZGVyKQogCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19ESUcyX0VOQ09ERVI7CiAJCWVsc2UKIAkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMV9FTkNPREVSOwpAQCAtMTQzMCw3ICsxNDMyLDExIEBACiAJaWYgKGlzX2RpZykgewogCQlzd2l0Y2ggKG1vZGUpIHsKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRV9PVVRQVVQsIDAsIDApOworCQkJLyogc29tZSBlYXJseSBkY2UzLjIgYm9hcmRzIGhhdmUgYSBidWcgaW4gdGhlaXIgdHJhbnNtaXR0ZXIgY29udHJvbCB0YWJsZSAqLworCQkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjcxMCkgfHwgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNzMwKSkKKwkJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKKwkJCWVsc2UKKwkJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFX09VVFBVVCwgMCwgMCk7CiAJCQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgewogCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKIApAQCAtMTUyMSwyNiArMTUyNywyOSBAQAogCX0KIAogCWlmIChleHRfZW5jb2RlcikgewotCQlpbnQgYWN0aW9uOwotCiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIERSTV9NT0RFX0RQTVNfT046CiAJCWRlZmF1bHQ6Ci0JCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKLQkJCQlhY3Rpb24gPSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkFCTEVfT1VUUFVUOwotCQkJZWxzZQotCQkJCWFjdGlvbiA9IEFUT01fRU5BQkxFOworCQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKKwkJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkFCTEVfT1VUUFVUKTsKKwkJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HX09GRik7CisJCQl9IGVsc2UKKwkJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBBVE9NX0VOQUJMRSk7CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CiAJCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgogCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpCi0JCQkJYWN0aW9uID0gRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRElTQUJMRV9PVVRQVVQ7Ci0JCQllbHNlCi0JCQkJYWN0aW9uID0gQVRPTV9ESVNBQkxFOworCQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKKwkJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HKTsKKwkJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ESVNBQkxFX09VVFBVVCk7CisJCQl9IGVsc2UKKwkJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwogCQkJYnJlYWs7CiAJCX0KLQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgYWN0aW9uKTsKIAl9CiAKIAlyYWRlb25fYXRvbWJpb3NfZW5jb2Rlcl9kcG1zX3NjcmF0Y2hfcmVncyhlbmNvZGVyLCAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSA/IHRydWUgOiBmYWxzZSk7CkBAIC0xOTk5LDYgKzIwMDgsNjUgQEAKIAlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiB9CiAKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCityYWRlb25fYXRvbV9kaWdfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCXUzMiBiaW9zXzBfc2NyYXRjaDsKKworCWlmICghQVNJQ19JU19EQ0U0KHJkZXYpKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworCisJaWYgKCFleHRfZW5jb2RlcikKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKworCWlmICgocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVF9TVVBQT1JUKSA9PSAwKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworCisJLyogbG9hZCBkZXRlY3Qgb24gdGhlIGRwIGJyaWRnZSAqLworCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RBQ0xPQURfREVURUNUSU9OKTsKKworCWJpb3NfMF9zY3JhdGNoID0gUlJFRzMyKFI2MDBfQklPU18wX1NDUkFUQ0gpOworCisJRFJNX0RFQlVHX0tNUygiQmlvcyAwIHNjcmF0Y2ggJXggJTA4eFxuIiwgYmlvc18wX3NjcmF0Y2gsIHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzKTsKKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDFfTUFTSykKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQyX01BU0spCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9DVl9NQVNLfEFUT01fUzBfQ1ZfTUFTS19BKSkKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9UVjFfQ09NUE9TSVRFIHwgQVRPTV9TMF9UVjFfQ09NUE9TSVRFX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOyAvKiBDVFYgKi8KKwkJZWxzZSBpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9UVjFfU1ZJREVPIHwgQVRPTV9TMF9UVjFfU1ZJREVPX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOyAvKiBTVFYgKi8KKwl9CisJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCit2b2lkCityYWRlb25fYXRvbV9leHRfZW5jb2Rlcl9zZXR1cF9kZGMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKKworCWlmIChleHRfZW5jb2RlcikKKwkJLyogZGRjX3NldHVwIG9uIHRoZSBkcCBicmlkZ2UgKi8KKwkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0REQ19TRVRVUCk7CisKK30KKwogc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CkBAIC0yMTYyLDcgKzIyMzAsNyBAQAogCS5tb2RlX3NldCA9IHJhZGVvbl9hdG9tX2VuY29kZXJfbW9kZV9zZXQsCiAJLmNvbW1pdCA9IHJhZGVvbl9hdG9tX2VuY29kZXJfY29tbWl0LAogCS5kaXNhYmxlID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9kaXNhYmxlLAotCS8qIG5vIGRldGVjdCBmb3IgVE1EUy9MVkRTIHlldCAqLworCS5kZXRlY3QgPSByYWRlb25fYXRvbV9kaWdfZGV0ZWN0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZGFjX2hlbHBlcl9mdW5jcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKaW5kZXggNmYxZDllNS4uZWMyZjFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKQEAgLTgxLDYgKzgxLDggQEAKIAlDSElQX0NZUFJFU1MsCiAJQ0hJUF9IRU1MT0NLLAogCUNISVBfUEFMTSwKKwlDSElQX1NVTU8sCisJQ0hJUF9TVU1PMiwKIAlDSElQX0JBUlRTLAogCUNISVBfVFVSS1MsCiAJQ0hJUF9DQUlDT1MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYwppbmRleCAxZjgyMjk0Li4wMjFkMmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKQEAgLTQwLDYgKzQwLDM1IEBACiAjaW5jbHVkZSAicmFkZW9uLmgiCiAjaW5jbHVkZSAicmFkZW9uX3RyYWNlLmgiCiAKK3N0YXRpYyB2b2lkIHJhZGVvbl9mZW5jZV93cml0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHNlcSkKK3sKKwlpZiAocmRldi0+d2IuZW5hYmxlZCkgeworCQl1MzIgc2NyYXRjaF9pbmRleDsKKwkJaWYgKHJkZXYtPndiLnVzZV9ldmVudCkKKwkJCXNjcmF0Y2hfaW5kZXggPSBSNjAwX1dCX0VWRU5UX09GRlNFVCArIHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2U7CisJCWVsc2UKKwkJCXNjcmF0Y2hfaW5kZXggPSBSQURFT05fV0JfU0NSQVRDSF9PRkZTRVQgKyByZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlOworCQlyZGV2LT53Yi53YltzY3JhdGNoX2luZGV4LzRdID0gY3B1X3RvX2xlMzIoc2VxKTs7CisJfSBlbHNlCisJCVdSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcsIHNlcSk7Cit9CisKK3N0YXRpYyB1MzIgcmFkZW9uX2ZlbmNlX3JlYWQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHNlcTsKKworCWlmIChyZGV2LT53Yi5lbmFibGVkKSB7CisJCXUzMiBzY3JhdGNoX2luZGV4OworCQlpZiAocmRldi0+d2IudXNlX2V2ZW50KQorCQkJc2NyYXRjaF9pbmRleCA9IFI2MDBfV0JfRVZFTlRfT0ZGU0VUICsgcmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnIC0gcmRldi0+c2NyYXRjaC5yZWdfYmFzZTsKKwkJZWxzZQorCQkJc2NyYXRjaF9pbmRleCA9IFJBREVPTl9XQl9TQ1JBVENIX09GRlNFVCArIHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2U7CisJCXNlcSA9IGxlMzJfdG9fY3B1KHJkZXYtPndiLndiW3NjcmF0Y2hfaW5kZXgvNF0pOworCX0gZWxzZQorCQlzZXEgPSBSUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnKTsKKwlyZXR1cm4gc2VxOworfQorCiBpbnQgcmFkZW9uX2ZlbmNlX2VtaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKQogewogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwpAQCAtNTAsMTIgKzc5LDEyIEBACiAJCXJldHVybiAwOwogCX0KIAlmZW5jZS0+c2VxID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJnJkZXYtPmZlbmNlX2Rydi5zZXEpOwotCWlmICghcmRldi0+Y3AucmVhZHkpIHsKKwlpZiAoIXJkZXYtPmNwLnJlYWR5KQogCQkvKiBGSVhNRTogY3AgaXMgbm90IHJ1bm5pbmcgYXNzdW1lIGV2ZXJ5dGhpbmdzIGlzIGRvbmUgcmlnaHQKIAkJICogYXdheQogCQkgKi8KLQkJV1JFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZywgZmVuY2UtPnNlcSk7Ci0JfSBlbHNlCisJCXJhZGVvbl9mZW5jZV93cml0ZShyZGV2LCBmZW5jZS0+c2VxKTsKKwllbHNlCiAJCXJhZGVvbl9mZW5jZV9yaW5nX2VtaXQocmRldiwgZmVuY2UpOwogCiAJdHJhY2VfcmFkZW9uX2ZlbmNlX2VtaXQocmRldi0+ZGRldiwgZmVuY2UtPnNlcSk7CkBAIC03MywxNSArMTAyLDcgQEAKIAlib29sIHdha2UgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGNqaWZmaWVzOwogCi0JaWYgKHJkZXYtPndiLmVuYWJsZWQpIHsKLQkJdTMyIHNjcmF0Y2hfaW5kZXg7Ci0JCWlmIChyZGV2LT53Yi51c2VfZXZlbnQpCi0JCQlzY3JhdGNoX2luZGV4ID0gUjYwMF9XQl9FVkVOVF9PRkZTRVQgKyByZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlOwotCQllbHNlCi0JCQlzY3JhdGNoX2luZGV4ID0gUkFERU9OX1dCX1NDUkFUQ0hfT0ZGU0VUICsgcmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnIC0gcmRldi0+c2NyYXRjaC5yZWdfYmFzZTsKLQkJc2VxID0gbGUzMl90b19jcHUocmRldi0+d2Iud2Jbc2NyYXRjaF9pbmRleC80XSk7Ci0JfSBlbHNlCi0JCXNlcSA9IFJSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcpOworCXNlcSA9IHJhZGVvbl9mZW5jZV9yZWFkKHJkZXYpOwogCWlmIChzZXEgIT0gcmRldi0+ZmVuY2VfZHJ2Lmxhc3Rfc2VxKSB7CiAJCXJkZXYtPmZlbmNlX2Rydi5sYXN0X3NlcSA9IHNlcTsKIAkJcmRldi0+ZmVuY2VfZHJ2Lmxhc3RfamlmZmllcyA9IGppZmZpZXM7CkBAIC0yNTEsNyArMjcyLDcgQEAKIAkJCXIgPSByYWRlb25fZ3B1X3Jlc2V0KHJkZXYpOwogCQkJaWYgKHIpCiAJCQkJcmV0dXJuIHI7Ci0JCQlXUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnLCBmZW5jZS0+c2VxKTsKKwkJCXJhZGVvbl9mZW5jZV93cml0ZShyZGV2LCBmZW5jZS0+c2VxKTsKIAkJCXJkZXYtPmdwdV9sb2NrdXAgPSBmYWxzZTsKIAkJfQogCQl0aW1lb3V0ID0gUkFERU9OX0ZFTkNFX0pJRkZJRVNfVElNRU9VVDsKQEAgLTM1MSw3ICszNzIsNyBAQAogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+ZmVuY2VfZHJ2LmxvY2ssIGlycV9mbGFncyk7CiAJCXJldHVybiByOwogCX0KLQlXUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnLCAwKTsKKwlyYWRlb25fZmVuY2Vfd3JpdGUocmRldiwgMCk7CiAJYXRvbWljX3NldCgmcmRldi0+ZmVuY2VfZHJ2LnNlcSwgMCk7CiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmZlbmNlX2Rydi5jcmVhdGVkKTsKIAlJTklUX0xJU1RfSEVBRCgmcmRldi0+ZmVuY2VfZHJ2LmVtaXRlZCk7CkBAIC0zOTEsNyArNDEyLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZTsKIAogCXNlcV9wcmludGYobSwgIkxhc3Qgc2lnbmFsZWQgZmVuY2UgMHglMDhYXG4iLAotCQkgICBSUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnKSk7CisJCSAgIHJhZGVvbl9mZW5jZV9yZWFkKHJkZXYpKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnJkZXYtPmZlbmNlX2Rydi5lbWl0ZWQpKSB7CiAJCSAgIGZlbmNlID0gbGlzdF9lbnRyeShyZGV2LT5mZW5jZV9kcnYuZW1pdGVkLnByZXYsCiAJCQkJICAgICAgc3RydWN0IHJhZGVvbl9mZW5jZSwgbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKaW5kZXggOTc3YTM0MS4uNmRmNGUzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaApAQCAtNDgzLDYgKzQ4Myw4IEBACiBleHRlcm4gdm9pZCBhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQkJCQkgICBpbnQgYWN0aW9uLCB1aW50OF90IGxhbmVfbnVtLAogCQkJCQkgICB1aW50OF90IGxhbmVfc2V0KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIGV4dGVybiBpbnQgcmFkZW9uX2RwX2kyY19hdXhfY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgbW9kZSwKIAkJCQl1OCB3cml0ZV9ieXRlLCB1OCAqcmVhZF9ieXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKaW5kZXggODZlZGExZS4uYWFhMTlkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCkBAIC00ODcsNiArNDg3LDcgQEAKIAljYXNlIFRIRVJNQUxfVFlQRV9SVjZYWDoKIAljYXNlIFRIRVJNQUxfVFlQRV9SVjc3MDoKIAljYXNlIFRIRVJNQUxfVFlQRV9FVkVSR1JFRU46CisJY2FzZSBUSEVSTUFMX1RZUEVfTkk6CiAJY2FzZSBUSEVSTUFMX1RZUEVfU1VNTzoKIAkJcmRldi0+cG0uaW50X2h3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihyZGV2LT5kZXYpOwogCQlpZiAoSVNfRVJSKHJkZXYtPnBtLmludF9od21vbl9kZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oCmluZGV4IGVjOTNhNzUuLmJjNDRhM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oCkBAIC0zMDAsNiArMzAwLDggQEAKICMgICAgICAgZGVmaW5lIFJBREVPTl9CVVNfUkVBRF9CVVJTVCAgICAgICAgICgxIDw8IDMwKQogI2RlZmluZSBSQURFT05fQlVTX0NOVEwxICAgICAgICAgICAgICAgICAgICAweDAwMzQKICMgICAgICAgZGVmaW5lIFJBREVPTl9CVVNfV0FJVF9PTl9MT0NLX0VOICAgICgxIDw8IDQpCisjZGVmaW5lIFJWMzcwX0JVU19DTlRMICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YworIyAgICAgICBkZWZpbmUgUlYzNzBfQlVTX0JJT1NfRElTX1JPTSAgICAgICAgKDEgPDwgMikKIC8qIHJ2MzcwL3J2MzgwLCBydjQxMCwgcjQyMy9yNDMwL3I0ODAsIHI1eHggKi8KICNkZWZpbmUgUkFERU9OX01TSV9SRUFSTV9FTgkJICAgIDB4MDE2MAogIwlkZWZpbmUgUlYzNzBfTVNJX1JFQVJNX0VOCSAgICAgKDEgPDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjYwMCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjYwMAppbmRleCA5MmYxOTAwLi5lYTQ5NzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I2MDAKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNjAwCkBAIC03NTgsNiArNzU4LDUgQEAKIDB4MDAwMDk3MTQgVkNfRU5IQU5DRQogMHgwMDAwOTgzMCBEQl9ERUJVRwogMHgwMDAwOTgzOCBEQl9XQVRFUk1BUktTCi0weDAwMDI4RDI4IERCX1NSRVNVTFRTX0NPTVBBUkVfU1RBVEUwCiAweDAwMDI4RDQ0IERCX0FMUEhBX1RPX01BU0sKIDB4MDAwMDk3MDAgVkNfQ05UTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCmluZGV4IDZlM2IxMWUuLjFmNTg1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTQyNiw3ICs0MjYsNyBAQAogCXJldHVybiByYWRlb25fZ2FydF90YWJsZV92cmFtX2FsbG9jKHJkZXYpOwogfQogCi1pbnQgcnM2MDBfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgaW50IHJzNjAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7CiAJaW50IHIsIGk7CkBAIC00NDAsOCArNDQwLDggQEAKIAkJcmV0dXJuIHI7CiAJcmFkZW9uX2dhcnRfcmVzdG9yZShyZGV2KTsKIAkvKiBFbmFibGUgYnVzIG1hc3RlciAqLwotCXRtcCA9IFJSRUczMihSXzAwMDA0Q19CVVNfQ05UTCkgJiBDXzAwMDA0Q19CVVNfTUFTVEVSX0RJUzsKLQlXUkVHMzIoUl8wMDAwNENfQlVTX0NOVEwsIHRtcCk7CisJdG1wID0gUlJFRzMyKFJBREVPTl9CVVNfQ05UTCkgJiB+UlM2MDBfQlVTX01BU1RFUl9ESVM7CisJV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgdG1wKTsKIAkvKiBGSVhNRTogc2V0dXAgZGVmYXVsdCBwYWdlICovCiAJV1JFRzMyX01DKFJfMDAwMTAwX01DX1BUMF9DTlRMLAogCQkgIChTXzAwMDEwMF9FRkZFQ1RJVkVfTDJfQ0FDSEVfU0laRSg2KSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKaW5kZXggZWY4YTViYS4uNGRlNTE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwpAQCAtMTA1LDYgKzEwNSw5IEBACiAJc3RydWN0IHJhZGVvbl92b2x0YWdlICp2b2x0YWdlID0gJnBzLT5jbG9ja19pbmZvW3JlcV9jbV9pZHhdLnZvbHRhZ2U7CiAKIAlpZiAoKHZvbHRhZ2UtPnR5cGUgPT0gVk9MVEFHRV9TVykgJiYgdm9sdGFnZS0+dm9sdGFnZSkgeworCQkvKiAweGZmMDEgaXMgYSBmbGFnIHJhdGhlciB0aGVuIGFuIGFjdHVhbCB2b2x0YWdlICovCisJCWlmICh2b2x0YWdlLT52b2x0YWdlID09IDB4ZmYwMSkKKwkJCXJldHVybjsKIAkJaWYgKHZvbHRhZ2UtPnZvbHRhZ2UgIT0gcmRldi0+cG0uY3VycmVudF92ZGRjKSB7CiAJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCB2b2x0YWdlLT52b2x0YWdlLCBTRVRfVk9MVEFHRV9UWVBFX0FTSUNfVkREQyk7CiAJCQlyZGV2LT5wbS5jdXJyZW50X3ZkZGMgPSB2b2x0YWdlLT52b2x0YWdlOwpAQCAtNTcyLDYgKzU3NSwxMiBAQAogCWVsc2UKIAkJdGNwX2NoYW5fc3RlZXIgPSAweDAwZmFjNjg4OwogCisJLyogUlY3NzAgQ0UgaGFzIHNwZWNpYWwgY2hyZW1hcCBzZXR1cCAqLworCWlmIChyZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NDRlKSB7CisJCXRjcF9jaGFuX3N0ZWVyID0gMHgwMGIwOGIwODsKKwkJbWNfc2hhcmVkX2NocmVtYXAgPSAweDAwYjA4YjA4OworCX0KKwogCVdSRUczMihUQ1BfQ0hBTl9TVEVFUiwgdGNwX2NoYW5fc3RlZXIpOwogCVdSRUczMihNQ19TSEFSRURfQ0hSRU1BUCwgbWNfc2hhcmVkX2NocmVtYXApOwogfQpAQCAtMTM1OSw2ICsxMzY4LDcgQEAKIAlyNzAwX2NwX2ZpbmkocmRldik7CiAJcjYwMF9pcnFfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKKwlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwogCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJcnY3NzBfcGNpZV9nYXJ0X2ZpbmkocmRldik7CiAJcnY3NzBfdnJhbV9zY3JhdGNoX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2JjaS5jCmluZGV4IGJmNWY4M2UuLmNiMWVlNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2JjaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2JjaS5jCkBAIC02NDcsOSArNjQ3LDYgQEAKIAlyZXQgPSBkcm1fYWRkbWFwKGRldiwgYXBlcnR1cmVfYmFzZSwgU0FWQUdFX0FQRVJUVVJFX1NJWkUsCiAJCQkgX0RSTV9GUkFNRV9CVUZGRVIsIF9EUk1fV1JJVEVfQ09NQklOSU5HLAogCQkJICZkZXZfcHJpdi0+YXBlcnR1cmUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwppbmRleCA5MGUyM2UwLi41OGMyNzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ4NCw3ICs0ODUsNyBAQAogCXN3YXBfc3BhY2UgPSBzd2FwX3N0b3JhZ2UtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKIAogCWZvciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgKytpKSB7Ci0JCWZyb21fcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKHN3YXBfc3BhY2UsIGksIE5VTEwpOworCQlmcm9tX3BhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShzd2FwX3NwYWNlLCBpKTsKIAkJaWYgKElTX0VSUihmcm9tX3BhZ2UpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGZyb21fcGFnZSk7CiAJCQlnb3RvIG91dF9lcnI7CkBAIC01NTcsNyArNTU4LDcgQEAKIAkJZnJvbV9wYWdlID0gdHRtLT5wYWdlc1tpXTsKIAkJaWYgKHVubGlrZWx5KGZyb21fcGFnZSA9PSBOVUxMKSkKIAkJCWNvbnRpbnVlOwotCQl0b19wYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2Uoc3dhcF9zcGFjZSwgaSwgTlVMTCk7CisJCXRvX3BhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShzd2FwX3NwYWNlLCBpKTsKIAkJaWYgKHVubGlrZWx5KElTX0VSUih0b19wYWdlKSkpIHsKIAkJCXJldCA9IFBUUl9FUlIodG9fcGFnZSk7CiAJCQlnb3RvIG91dF9lcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9LY29uZmlnIGIvZHJpdmVycy9oaWQvS2NvbmZpZwppbmRleCA2N2QyYTc1Li4zNmNhNDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaGlkL0tjb25maWcKQEAgLTMwNSw2ICszMDUsNyBAQAogCSAgLSAzTSBQQ1QgdG91Y2ggc2NyZWVucwogCSAgLSBBY3Rpb25TdGFyIGR1YWwgdG91Y2ggcGFuZWxzCiAJICAtIENhbmRvIGR1YWwgdG91Y2ggcGFuZWxzCisJICAtIENodW5naHdhIHBhbmVscwogCSAgLSBDVlRvdWNoIHBhbmVscwogCSAgLSBDeXByZXNzIFRydWVUb3VjaCBwYW5lbHMKIAkgIC0gRWxvIFRvdWNoU3lzdGVtcyBJbnRlbGxpVG91Y2ggUGx1cyBwYW5lbHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IGM5NTdjNGIuLjZmMzI4OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMTM1OSw2ICsxMzU5LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTl9TT0xBUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSFVOR0hXQVQsIFVTQl9ERVZJQ0VfSURfQ0hVTkdIV0FUX01VTFRJVE9VQ0gpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NSRUFUSVZFTEFCUywgVVNCX0RFVklDRV9JRF9QUk9ESUtFWVNfUENNSURJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DVlRPVUNILCBVU0JfREVWSUNFX0lEX0NWVE9VQ0hfU0NSRUVOKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSB9LApAQCAtMTQyMiw2ICsxNDIzLDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfU1BBQ0VUUkFWRUxMRVIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1NQQUNFTkFWSUdBVE9SKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MVU1JTywgVVNCX0RFVklDRV9JRF9DUllTVEFMVE9VQ0gpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xVTUlPLCBVU0JfREVWSUNFX0lEX0NSWVNUQUxUT1VDSF9EVUFMKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST0NISVAsIFVTQl9ERVZJQ0VfSURfUElDT0xDRCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9DSElQLCBVU0JfREVWSUNFX0lEX1BJQ09MQ0RfQk9PVExPQURFUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX1NJREVXSU5ERVJfR1YpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMGIzNzRhNi4uYTc1NmVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtMTczLDYgKzE3Myw5IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9NVUxUSV9UT1VDSAkweGIxOWQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTCTB4MDYxOAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hVTkdIV0FUCQkweDIyNDcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSFVOR0hXQVRfTVVMVElUT1VDSAkweDAwMDEKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NJREMJCTB4MTY3NwogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ01FRElBCQkweDBkOGMKQEAgLTQ0Niw2ICs0NDksNyBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTFVNSU8JCTB4MjAyZQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NSWVNUQUxUT1VDSAkweDAwMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DUllTVEFMVE9VQ0hfRFVBTAkweDAwMDcKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX01DQwkJMHgwOWRiCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUwkweDAwNzYKQEAgLTYyMiw2ICs2MjYsNyBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1VDTE9HSUMJCTB4NTU0MwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOQkweDAwNDIKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9LTkE1CTB4NjAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1RXQTYwCTB4MDA2NAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQNDAzMFUJMHgwMDAzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A1NTQwVQkweDAwMDQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDgwNjBVCTB4MDAwNQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYyBiL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKaW5kZXggYTVlZGE0Yy4uMGVjOTFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCkBAIC01MDEsMTcgKzUwMSw5IEBACiAJfQogCXJlcG9ydC0+c2l6ZSA9IDY7CiAKLQkvKgotCSAqIFRoZSBkZXZpY2UgcmVwb25kcyB3aXRoICdpbnZhbGlkIHJlcG9ydCBpZCcgd2hlbiBmZWF0dXJlCi0JICogcmVwb3J0IHN3aXRjaGluZyBpdCBpbnRvIG11bHRpdG91Y2ggbW9kZSBpcyBzZW50IHRvIGl0LgotCSAqCi0JICogVGhpcyByZXN1bHRzIGluIC1FSU8gZnJvbSB0aGUgX3JhdyBsb3ctbGV2ZWwgdHJhbnNwb3J0IGNhbGxiYWNrLAotCSAqIGJ1dCB0aGVyZSBzZWVtcyB0byBiZSBubyBvdGhlciB3YXkgb2Ygc3dpdGNoaW5nIHRoZSBtb2RlLgotCSAqIFRodXMgdGhlIHN1cGVyLXVnbHkgaGFja3kgc3VjY2VzcyBjaGVjayBiZWxvdy4KLQkgKi8KIAlyZXQgPSBoZGV2LT5oaWRfb3V0cHV0X3Jhd19yZXBvcnQoaGRldiwgZmVhdHVyZSwgc2l6ZW9mKGZlYXR1cmUpLAogCQkJSElEX0ZFQVRVUkVfUkVQT1JUKTsKLQlpZiAocmV0ICE9IC1FSU8pIHsKKwlpZiAocmV0ICE9IHNpemVvZihmZWF0dXJlKSkgewogCQloaWRfZXJyKGhkZXYsICJ1bmFibGUgdG8gcmVxdWVzdCB0b3VjaCBkYXRhICglZClcbiIsIHJldCk7CiAJCWdvdG8gZXJyX3N0b3BfaHc7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYyBiL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMKaW5kZXggZWNkNGQyZC4uNjJjYWM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCkBAIC02NCw2ICs2NCw3IEBACiAJc3RydWN0IG10X2NsYXNzICptdGNsYXNzOwkvKiBvdXIgbXQgZGV2aWNlIGNsYXNzICovCiAJdW5zaWduZWQgbGFzdF9maWVsZF9pbmRleDsJLyogbGFzdCBmaWVsZCBpbmRleCBvZiB0aGUgcmVwb3J0ICovCiAJdW5zaWduZWQgbGFzdF9zbG90X2ZpZWxkOwkvKiB0aGUgbGFzdCBmaWVsZCBvZiBhIHNsb3QgKi8KKwlpbnQgbGFzdF9tdF9jb2xsZWN0aW9uOwkvKiBsYXN0IGtub3duIG10LXJlbGF0ZWQgY29sbGVjdGlvbiAqLwogCV9fczggaW5wdXRtb2RlOwkJLyogSW5wdXRNb2RlIEhJRCBmZWF0dXJlLCAtMSBpZiBub24tZXhpc3RlbnQgKi8KIAlfX3U4IG51bV9yZWNlaXZlZDsJLyogaG93IG1hbnkgY29udGFjdHMgd2UgcmVjZWl2ZWQgKi8KIAlfX3U4IG51bV9leHBlY3RlZDsJLyogZXhwZWN0ZWQgbGFzdCBjb250YWN0IGluZGV4ICovCkBAIC0yMjUsOCArMjI2LDEwIEBACiAJCQkJY2xzLT5zbl9tb3ZlKTsKIAkJCS8qIHRvdWNoc2NyZWVuIGVtdWxhdGlvbiAqLwogCQkJc2V0X2FicyhoaS0+aW5wdXQsIEFCU19YLCBmaWVsZCwgY2xzLT5zbl9tb3ZlKTsKLQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkgeworCQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJfQogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0dEX1k6CiAJCQlpZiAocXVpcmtzICYgTVRfUVVJUktfRUdBTEFYX1hZWl9GSVhVUCkKQEAgLTIzNyw4ICsyNDAsMTAgQEAKIAkJCQljbHMtPnNuX21vdmUpOwogCQkJLyogdG91Y2hzY3JlZW4gZW11bGF0aW9uICovCiAJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX1ksIGZpZWxkLCBjbHMtPnNuX21vdmUpOwotCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7Ci0JCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCWlmICh0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID09IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4KSB7CisJCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQl9CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlyZXR1cm4gMDsKQEAgLTI0NiwzMSArMjUxLDQyIEBACiAJY2FzZSBISURfVVBfRElHSVRJWkVSOgogCQlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKIAkJY2FzZSBISURfREdfSU5SQU5HRToKLQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkgeworCQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJfQogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX0NPTkZJREVOQ0U6Ci0JCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpIHsKKwkJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCX0KIAkJCXJldHVybiAxOwogCQljYXNlIEhJRF9ER19USVBTV0lUQ0g6CiAJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX0tFWSwgQlROX1RPVUNIKTsKIAkJCWlucHV0X3NldF9jYXBhYmlsaXR5KGhpLT5pbnB1dCwgRVZfS0VZLCBCVE5fVE9VQ0gpOwotCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7Ci0JCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCWlmICh0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID09IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4KSB7CisJCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQl9CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfREdfQ09OVEFDVElEOgorCQkJaWYgKCF0ZC0+bWF4Y29udGFjdHMpCisJCQkJdGQtPm1heGNvbnRhY3RzID0gTVRfREVGQVVMVF9NQVhDT05UQUNUOwogCQkJaW5wdXRfbXRfaW5pdF9zbG90cyhoaS0+aW5wdXQsIHRkLT5tYXhjb250YWN0cyk7CiAJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKIAkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJdGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4OwogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX1dJRFRIOgogCQkJaGlkX21hcF91c2FnZShoaSwgdXNhZ2UsIGJpdCwgbWF4LAogCQkJCQlFVl9BQlMsIEFCU19NVF9UT1VDSF9NQUpPUik7CiAJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX01UX1RPVUNIX01BSk9SLCBmaWVsZCwKIAkJCQljbHMtPnNuX3dpZHRoKTsKLQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkgeworCQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJfQogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX0hFSUdIVDoKIAkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwKQEAgLTI3OSw4ICsyOTUsMTAgQEAKIAkJCQljbHMtPnNuX2hlaWdodCk7CiAJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhoaS0+aW5wdXQsCiAJCQkJCUFCU19NVF9PUklFTlRBVElPTiwgMCwgMSwgMCwgMCk7Ci0JCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpIHsKKwkJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCX0KIAkJCXJldHVybiAxOwogCQljYXNlIEhJRF9ER19USVBQUkVTU1VSRToKIAkJCWlmIChxdWlya3MgJiBNVF9RVUlSS19FR0FMQVhfWFlaX0ZJWFVQKQpAQCAtMjkyLDE2ICszMTAsMjAgQEAKIAkJCS8qIHRvdWNoc2NyZWVuIGVtdWxhdGlvbiAqLwogCQkJc2V0X2FicyhoaS0+aW5wdXQsIEFCU19QUkVTU1VSRSwgZmllbGQsCiAJCQkJY2xzLT5zbl9wcmVzc3VyZSk7Ci0JCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpIHsKKwkJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCX0KIAkJCXJldHVybiAxOwogCQljYXNlIEhJRF9ER19DT05UQUNUQ09VTlQ6Ci0JCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCWlmICh0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID09IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4KQorCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OwogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX0NPTlRBQ1RNQVg6CiAJCQkvKiB3ZSBkb24ndCBzZXQgdGQtPmxhc3Rfc2xvdF9maWVsZCBhcyBjb250YWN0Y291bnQgYW5kCiAJCQkgKiBjb250YWN0IG1heCBhcmUgZ2xvYmFsIHRvIHRoZSByZXBvcnQgKi8KLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpCisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJLyogbGV0IGhpZC1pbnB1dCBkZWNpZGUgZm9yIHRoZSBvdGhlcnMgKi8KQEAgLTUxNiw2ICs1MzgsNyBAQAogCX0KIAl0ZC0+bXRjbGFzcyA9IG10Y2xhc3M7CiAJdGQtPmlucHV0bW9kZSA9IC0xOworCXRkLT5sYXN0X210X2NvbGxlY3Rpb24gPSAtMTsKIAloaWRfc2V0X2RydmRhdGEoaGRldiwgdGQpOwogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwpAQCAtNTI2LDkgKzU0OSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwogCi0JaWYgKCF0ZC0+bWF4Y29udGFjdHMpCi0JCXRkLT5tYXhjb250YWN0cyA9IE1UX0RFRkFVTFRfTUFYQ09OVEFDVDsKLQogCXRkLT5zbG90cyA9IGt6YWxsb2ModGQtPm1heGNvbnRhY3RzICogc2l6ZW9mKHN0cnVjdCBtdF9zbG90KSwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXRkLT5zbG90cykgewpAQCAtNTkzLDYgKzYxMywxMSBAQAogCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NBTkRPLAogCQkJVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xNV82KSB9LAogCisJLyogQ2h1bmdod2EgVGVsZWNvbSB0b3VjaCBwYW5lbHMgKi8KKwl7ICAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfREVGQVVMVCwKKwkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSFVOR0hXQVQsCisJCQlVU0JfREVWSUNFX0lEX0NIVU5HSFdBVF9NVUxUSVRPVUNIKSB9LAorCiAJLyogQ1ZUb3VjaCBwYW5lbHMgKi8KIAl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19ERUZBVUxULAogCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NWVE9VQ0gsCkBAIC02NTEsNiArNjc2LDkgQEAKIAl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19DT05GSURFTkNFX01JTlVTX09ORSwKIAkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MVU1JTywKIAkJCVVTQl9ERVZJQ0VfSURfQ1JZU1RBTFRPVUNIKSB9LAorCXsgLmRyaXZlcl9kYXRhID0gTVRfQ0xTX0NPTkZJREVOQ0VfTUlOVVNfT05FLAorCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xVTUlPLAorCQkJVVNCX0RFVklDRV9JRF9DUllTVEFMVE9VQ0hfRFVBTCkgfSwKIAogCS8qIE1vc0FydCBwYW5lbHMgKi8KIAl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19DT05GSURFTkNFX01JTlVTX09ORSwKQEAgLTY4MSwxMCArNzA5LDEwIEBACiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU1RBTlRVTSwKIAkJCVVTQl9ERVZJQ0VfSURfTVRQKX0sCiAJeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfQ09ORklERU5DRSwKLQkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TVEFOVFVNLAorCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NUQU5UVU1fU1RNLAogCQkJVVNCX0RFVklDRV9JRF9NVFBfU1RNKX0sCiAJeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfQ09ORklERU5DRSwKLQkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TVEFOVFVNLAorCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NUQU5UVU1fU0lUUk9OSVgsCiAJCQlVU0JfREVWSUNFX0lEX01UUF9TSVRST05JWCl9LAogCiAJLyogVG91Y2ggSW50ZXJuYXRpb25hbCBwYW5lbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCmluZGV4IDBlMzBiMTQuLjYyMTk1OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwpAQCAtNzQsNiArNzQsNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A0MDMwVSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfS05BNSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCisJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfVFdBNjAsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQNTU0MFUsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQODA2MFUsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XQUxUT1AsIFVTQl9ERVZJQ0VfSURfV0FMVE9QX01FRElBX1RBQkxFVF8xMF82X0lOQ0gsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCmluZGV4IGZmM2M2NDQuLjdjMTE4OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKQEAgLTI0OCwxMiArMjQ4LDE1IEBACiAJCQl1c2JoaWRfY2xvc2UobGlzdC0+aGlkZGV2LT5oaWQpOwogCQkJdXNiaGlkX3B1dF9wb3dlcihsaXN0LT5oaWRkZXYtPmhpZCk7CiAJCX0gZWxzZSB7CisJCQltdXRleF91bmxvY2soJmxpc3QtPmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CiAJCQlrZnJlZShsaXN0LT5oaWRkZXYpOworCQkJa2ZyZWUobGlzdCk7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCWtmcmVlKGxpc3QpOwogCW11dGV4X3VubG9jaygmbGlzdC0+aGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwlrZnJlZShsaXN0KTsKIAogCXJldHVybiAwOwogfQpAQCAtOTIzLDEwICs5MjYsMTEgQEAKIAl1c2JfZGVyZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKIAogCWlmIChoaWRkZXYtPm9wZW4pIHsKKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwogCQl1c2JoaWRfY2xvc2UoaGlkZGV2LT5oaWQpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZGRldi0+d2FpdCk7CiAJfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwogCQlrZnJlZShoaWRkZXYpOwogCX0KLQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggMTZkYjgzYy4uNWY4ODhmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJICAgIEY3MTg1OEZHCiAJICAgIEY3MTg2MkZHCiAJICAgIEY3MTg2M0ZHCi0JICAgIEY3MTg2OUYvRQorCSAgICBGNzE4NjlGL0UvQQogCSAgICBGNzE4ODJGRwogCSAgICBGNzE4ODNGRwogCSAgICBGNzE4ODlGRy9FRC9BCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTI3NS5jCmluZGV4IGMyZWUyMDQuLjhiYzFiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRtMTI3NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRtMTI3NS5jCkBAIC0zMiw2ICszMiw3IEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCWludCBjb25maWc7CisJaW50IHJldDsKIAlzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm87CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKQEAgLTQzLDMwICs0NCwzMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEyNzVfUE1PTl9DT05GSUcpOwotCWlmIChjb25maWcgPCAwKQotCQlyZXR1cm4gY29uZmlnOworCWlmIChjb25maWcgPCAwKSB7CisJCXJldCA9IGNvbmZpZzsKKwkJZ290byBlcnJfbWVtOworCX0KIAogCWluZm8tPnBhZ2VzID0gMTsKIAlpbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZTsKIAlpbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSA9IHRydWU7CiAJaW5mby0+ZGlyZWN0W1BTQ19DVVJSRU5UX09VVF0gPSB0cnVlOwotCWluZm8tPm1bUFNDX0NVUlJFTlRfT1VUXSA9IDgwMDsKKwlpbmZvLT5tW1BTQ19DVVJSRU5UX09VVF0gPSA4MDc7CiAJaW5mby0+YltQU0NfQ1VSUkVOVF9PVVRdID0gMjA0NzU7CiAJaW5mby0+UltQU0NfQ1VSUkVOVF9PVVRdID0gLTE7CiAJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfSU9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX0lPVVQ7CiAKIAlpZiAoY29uZmlnICYgQURNMTI3NV9WUkFOR0UpIHsKLQkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSAxOTA0NTsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSAxOTE5OTsKIAkJaW5mby0+YltQU0NfVk9MVEFHRV9JTl0gPSAwOwogCQlpbmZvLT5SW1BTQ19WT0xUQUdFX0lOXSA9IC0yOwotCQlpbmZvLT5tW1BTQ19WT0xUQUdFX09VVF0gPSAxOTA0NTsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9PVVRdID0gMTkxOTk7CiAJCWluZm8tPmJbUFNDX1ZPTFRBR0VfT1VUXSA9IDA7CiAJCWluZm8tPlJbUFNDX1ZPTFRBR0VfT1VUXSA9IC0yOwogCX0gZWxzZSB7Ci0JCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gNjY2NjsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSA2NzIwOwogCQlpbmZvLT5iW1BTQ19WT0xUQUdFX0lOXSA9IDA7CiAJCWluZm8tPlJbUFNDX1ZPTFRBR0VfSU5dID0gLTE7Ci0JCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDY2NjY7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDY3MjA7CiAJCWluZm8tPmJbUFNDX1ZPTFRBR0VfT1VUXSA9IDA7CiAJCWluZm8tPlJbUFNDX1ZPTFRBR0VfT1VUXSA9IC0xOwogCX0KQEAgLTc2LDcgKzc5LDE0IEBACiAJZWxzZQogCQlpbmZvLT5mdW5jWzBdIHw9IFBNQlVTX0hBVkVfVklOIHwgUE1CVVNfSEFWRV9TVEFUVVNfSU5QVVQ7CiAKLQlyZXR1cm4gcG1idXNfZG9fcHJvYmUoY2xpZW50LCBpZCwgaW5mbyk7CisJcmV0ID0gcG1idXNfZG9fcHJvYmUoY2xpZW50LCBpZCwgaW5mbyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbWVtOworCXJldHVybiAwOworCitlcnJfbWVtOgorCWtmcmVlKGluZm8pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYWRtMTI3NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMgYi9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCmluZGV4IGI1ZTg5MjAuLjAwZTk4NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYwpAQCAtMjY4LDYgKzI2OCw3IEBACiBzdGF0aWMgdm9pZCBhdGtfaW5pdF9hdHRyaWJ1dGUoc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKm5hbWUsCiAJCXN5c2ZzX3Nob3dfZnVuYyBzaG93KQogeworCXN5c2ZzX2F0dHJfaW5pdCgmYXR0ci0+YXR0cik7CiAJYXR0ci0+YXR0ci5uYW1lID0gbmFtZTsKIAlhdHRyLT5hdHRyLm1vZGUgPSAwNDQ0OwogCWF0dHItPnNob3cgPSBzaG93OwpAQCAtNjczLDYgKzY3NCw3IEBACiAJZWxzZQogCQllcnIgPSAtRUlPOwogCisJQUNQSV9GUkVFKHJldCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTE4OCwxOSArMTE5MCwxNSBAQAogCWludCBlcnI7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZkYXRhLT5zZW5zb3JfbGlzdCwgbGlzdCkgewotCQlzeXNmc19hdHRyX2luaXQoJnMtPmlucHV0X2F0dHIuYXR0cik7CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkYXRhLT5od21vbl9kZXYsICZzLT5pbnB1dF9hdHRyKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCXN5c2ZzX2F0dHJfaW5pdCgmcy0+bGFiZWxfYXR0ci5hdHRyKTsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRhdGEtPmh3bW9uX2RldiwgJnMtPmxhYmVsX2F0dHIpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQkJc3lzZnNfYXR0cl9pbml0KCZzLT5saW1pdDFfYXR0ci5hdHRyKTsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRhdGEtPmh3bW9uX2RldiwgJnMtPmxpbWl0MV9hdHRyKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCXN5c2ZzX2F0dHJfaW5pdCgmcy0+bGltaXQyX2F0dHIuYXR0cik7CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkYXRhLT5od21vbl9kZXYsICZzLT5saW1pdDJfYXR0cik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IGRlM2QyNDYuLjAwNzBkNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTk3LDkgKzk3LDcgQEAKIHN0cnVjdCBwZGV2X2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQl1bnNpZ25lZCBpbnQgY3B1OwogCXUxNiBwaHlzX3Byb2NfaWQ7Ci0JdTE2IGNwdV9jb3JlX2lkOwogfTsKIAogc3RhdGljIExJU1RfSEVBRChwZGV2X2xpc3QpOwpAQCAtMjk2LDcgKzI5NCw3IEBACiAJCSAqIElmIHRoZSBUak1heCBpcyBub3QgcGxhdXNpYmxlLCBhbiBhc3N1bXB0aW9uCiAJCSAqIHdpbGwgYmUgdXNlZAogCQkgKi8KLQkJaWYgKHZhbCA+IDgwICYmIHZhbCA8IDEyMCkgeworCQlpZiAodmFsKSB7CiAJCQlkZXZfaW5mbyhkZXYsICJUak1heCBpcyAlZCBDLlxuIiwgdmFsKTsKIAkJCXJldHVybiB2YWwgKiAxMDAwOwogCQl9CkBAIC0zMDQsMjQgKzMwMiw5IEBACiAKIAkvKgogCSAqIEFuIGFzc3VtcHRpb24gaXMgbWFkZSBmb3IgZWFybHkgQ1BVcyBhbmQgdW5yZWFkYWJsZSBNU1IuCi0JICogTk9URTogdGhlIGdpdmVuIHZhbHVlIG1heSBub3QgYmUgY29ycmVjdC4KKwkgKiBOT1RFOiB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBtYXkgbm90IGJlIGNvcnJlY3QuCiAJICovCi0KLQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewotCWNhc2UgMHhlOgotCWNhc2UgMHhmOgotCWNhc2UgMHgxNjoKLQljYXNlIDB4MWE6Ci0JCWRldl93YXJuKGRldiwgIlRqTWF4IGlzIGFzc3VtZWQgYXMgMTAwIEMhXG4iKTsKLQkJcmV0dXJuIDEwMDAwMDsKLQljYXNlIDB4MTc6Ci0JY2FzZSAweDFjOgkJLyogQXRvbSBDUFVzICovCi0JCXJldHVybiBhZGp1c3RfdGptYXgoYywgaWQsIGRldik7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oZGV2LCAiQ1BVIChtb2RlbD0weCV4KSBpcyBub3Qgc3VwcG9ydGVkIHlldCwiCi0JCQkiIHVzaW5nIGRlZmF1bHQgVGpNYXggb2YgMTAwQy5cbiIsIGMtPng4Nl9tb2RlbCk7Ci0JCXJldHVybiAxMDAwMDA7Ci0JfQorCXJldHVybiBhZGp1c3RfdGptYXgoYywgaWQsIGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfdWNvZGVfcmV2X29uX2NwdSh2b2lkICplZHgpCkBAIC0zNDEsNyArMzI0LDcgQEAKIAllcnIgPSByZG1zcl9zYWZlX29uX2NwdShjcHUsIE1TUl9JQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCwgJmVheCwgJmVkeCk7CiAJaWYgKCFlcnIpIHsKIAkJdmFsID0gKGVheCA+PiAxNikgJiAweGZmOwotCQlpZiAodmFsID4gODAgJiYgdmFsIDwgMTIwKQorCQlpZiAodmFsKQogCQkJcmV0dXJuIHZhbCAqIDEwMDA7CiAJfQogCWRldl93YXJuKGRldiwgIlVuYWJsZSB0byByZWFkIFBrZy1Uak1heCBmcm9tIENQVToldVxuIiwgY3B1KTsKQEAgLTY2OCw5ICs2NTEsNyBAQAogCX0KIAogCXBkZXZfZW50cnktPnBkZXYgPSBwZGV2OwotCXBkZXZfZW50cnktPmNwdSA9IGNwdTsKIAlwZGV2X2VudHJ5LT5waHlzX3Byb2NfaWQgPSBUT19QSFlTX0lEKGNwdSk7Ci0JcGRldl9lbnRyeS0+Y3B1X2NvcmVfaWQgPSBUT19DT1JFX0lEKGNwdSk7CiAKIAlsaXN0X2FkZF90YWlsKCZwZGV2X2VudHJ5LT5saXN0LCAmcGRldl9saXN0KTsKIAltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2VtYzZ3MjAxLmMgYi9kcml2ZXJzL2h3bW9uL2VtYzZ3MjAxLmMKaW5kZXggZTBlZjMyMy4uMDA2NDQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9lbWM2dzIwMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vZW1jNncyMDEuYwpAQCAtNzgsOCArNzgsOSBAQAogCiAJbHNiID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIAltc2IgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcgKyAxKTsKLQlpZiAobHNiIDwgMCB8fCBtc2IgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiMTYtYml0IHJlYWQgZmFpbGVkIGF0IDB4JTAyeFxuIiwgcmVnKTsKKwlpZiAodW5saWtlbHkobHNiIDwgMCB8fCBtc2IgPCAwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVkLWJpdCAlcyBmYWlsZWQgYXQgMHglMDJ4XG4iLAorCQkJMTYsICJyZWFkIiwgcmVnKTsKIAkJcmV0dXJuIDB4RkZGRjsJLyogQXJiaXRyYXJ5IHZhbHVlICovCiAJfQogCkBAIC05NSwxMCArOTYsMzkgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsICYgMHhmZik7Ci0JaWYgKCFlcnIpCisJaWYgKGxpa2VseSghZXJyKSkKIAkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZyArIDEsIHZhbCA+PiA4KTsKLQlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIxNi1iaXQgd3JpdGUgZmFpbGVkIGF0IDB4JTAyeFxuIiwgcmVnKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJWQtYml0ICVzIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQkxNiwgIndyaXRlIiwgcmVnKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFJlYWQgOC1iaXQgdmFsdWUgZnJvbSByZWdpc3RlciAqLworc3RhdGljIHU4IGVtYzZ3MjAxX3JlYWQ4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgdmFsOworCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlZC1iaXQgJXMgZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCTgsICJyZWFkIiwgcmVnKTsKKwkJcmV0dXJuIDB4MDA7CS8qIEFyYml0cmFyeSB2YWx1ZSAqLworCX0KKworCXJldHVybiB2YWw7Cit9CisKKy8qIFdyaXRlIDgtYml0IHZhbHVlIHRvIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IGVtYzZ3MjAxX3dyaXRlOChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJWQtYml0ICVzIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQk4LCAid3JpdGUiLCByZWcpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTExNCwyNSArMTQ0LDI1IEBACiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewogCQlmb3IgKG5yID0gMDsgbnIgPCA2OyBucisrKSB7CiAJCQlkYXRhLT5pbltpbnB1dF1bbnJdID0KLQkJCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCWVtYzZ3MjAxX3JlYWQ4KGNsaWVudCwKIAkJCQkJCUVNQzZXMjAxX1JFR19JTihucikpOwogCQkJZGF0YS0+aW5bbWluXVtucl0gPQotCQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJZW1jNncyMDFfcmVhZDgoY2xpZW50LAogCQkJCQkJRU1DNlcyMDFfUkVHX0lOX0xPVyhucikpOwogCQkJZGF0YS0+aW5bbWF4XVtucl0gPQotCQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJZW1jNncyMDFfcmVhZDgoY2xpZW50LAogCQkJCQkJRU1DNlcyMDFfUkVHX0lOX0hJR0gobnIpKTsKIAkJfQogCiAJCWZvciAobnIgPSAwOyBuciA8IDY7IG5yKyspIHsKIAkJCWRhdGEtPnRlbXBbaW5wdXRdW25yXSA9Ci0JCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQllbWM2dzIwMV9yZWFkOChjbGllbnQsCiAJCQkJCQlFTUM2VzIwMV9SRUdfVEVNUChucikpOwogCQkJZGF0YS0+dGVtcFttaW5dW25yXSA9Ci0JCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQllbWM2dzIwMV9yZWFkOChjbGllbnQsCiAJCQkJCQlFTUM2VzIwMV9SRUdfVEVNUF9MT1cobnIpKTsKIAkJCWRhdGEtPnRlbXBbbWF4XVtucl0gPQotCQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJZW1jNncyMDFfcmVhZDgoY2xpZW50LAogCQkJCQkJRU1DNlcyMDFfUkVHX1RFTVBfSElHSChucikpOwogCQl9CiAKQEAgLTE5Miw3ICsyMjIsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPmluW3NmXVtucl0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhLT5pbltzZl1bbnJdKTsKKwllcnIgPSBlbWM2dzIwMV93cml0ZTgoY2xpZW50LCByZWcsIGRhdGEtPmluW3NmXVtucl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsKQEAgLTIyOSw3ICsyNTksNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXBbc2ZdW25yXSA9IFNFTlNPUlNfTElNSVQodmFsLCAtMTI3LCAxMjgpOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIGRhdGEtPnRlbXBbc2ZdW25yXSk7CisJZXJyID0gZW1jNncyMDFfd3JpdGU4KGNsaWVudCwgcmVnLCBkYXRhLT50ZW1wW3NmXVtucl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsKQEAgLTQ0NCw3ICs0NzQsNyBAQAogCiAJLyogQ2hlY2sgY29uZmlndXJhdGlvbiAqLwogCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEVNQzZXMjAxX1JFR19DT05GSUcpOwotCWlmICgoY29uZmlnICYgMHhGNCkgIT0gMHgwNCkKKwlpZiAoY29uZmlnIDwgMCB8fCAoY29uZmlnICYgMHhGNCkgIT0gMHgwNCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKCEoY29uZmlnICYgMHgwMSkpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNb25pdG9yaW5nIG5vdCBlbmFibGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCBhNGE5NGEwLi4yZDk2ZWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC01Miw2ICs1Miw3IEBACiAjZGVmaW5lIFNJT19GNzE4NThfSUQJCTB4MDUwNyAgLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjcxODYyX0lECQkweDA2MDEJLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjcxODY5X0lECQkweDA4MTQJLyogQ2hpcHNldCBJRCAqLworI2RlZmluZSBTSU9fRjcxODY5QV9JRAkJMHgxMDA3CS8qIENoaXBzZXQgSUQgKi8KICNkZWZpbmUgU0lPX0Y3MTg4Ml9JRAkJMHgwNTQxCS8qIENoaXBzZXQgSUQgKi8KICNkZWZpbmUgU0lPX0Y3MTg4OV9JRAkJMHgwNzIzCS8qIENoaXBzZXQgSUQgKi8KICNkZWZpbmUgU0lPX0Y3MTg4OUVfSUQJCTB4MDkwOQkvKiBDaGlwc2V0IElEICovCkBAIC0xMDgsOCArMTA5LDggQEAKIG1vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaWQsICJPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgZGV2aWNlIElEIik7CiAKLWVudW0gY2hpcHMgeyBmNzE4MDhlLCBmNzE4MDhhLCBmNzE4NThmZywgZjcxODYyZmcsIGY3MTg2OSwgZjcxODgyZmcsIGY3MTg4OWZnLAotCSAgICAgZjcxODg5ZWQsIGY3MTg4OWEsIGY4MDAwLCBmODE4NjVmIH07CitlbnVtIGNoaXBzIHsgZjcxODA4ZSwgZjcxODA4YSwgZjcxODU4ZmcsIGY3MTg2MmZnLCBmNzE4NjksIGY3MTg2OWEsIGY3MTg4MmZnLAorCSAgICAgZjcxODg5ZmcsIGY3MTg4OWVkLCBmNzE4ODlhLCBmODAwMCwgZjgxODY1ZiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZjcxODgyZmdfbmFtZXNbXSA9IHsKIAkiZjcxODA4ZSIsCkBAIC0xMTcsNiArMTE4LDcgQEAKIAkiZjcxODU4ZmciLAogCSJmNzE4NjJmZyIsCiAJImY3MTg2OSIsIC8qIEJvdGggZjcxODY5ZiBhbmQgZjcxODY5ZSwgcmVnLiBjb21wYXRpYmxlIGFuZCBzYW1lIGlkICovCisJImY3MTg2OWEiLAogCSJmNzE4ODJmZyIsCiAJImY3MTg4OWZnIiwgLyogZjgxODAxdSB0b28sIHNhbWUgaWQgKi8KIAkiZjcxODg5ZWQiLApAQCAtMTMxLDYgKzEzMyw3IEBACiAJW2Y3MTg1OGZnXQk9IHsgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCB9LAogCVtmNzE4NjJmZ10JPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKIAlbZjcxODY5XQk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LAorCVtmNzE4NjlhXQk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LAogCVtmNzE4ODJmZ10JPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKIAlbZjcxODg5ZmddCT0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCiAJW2Y3MTg4OWVkXQk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LApAQCAtMTQ1LDYgKzE0OCw3IEBACiAJW2Y3MTg1OGZnXQk9IDAsCiAJW2Y3MTg2MmZnXQk9IDAsCiAJW2Y3MTg2OV0JPSAwLAorCVtmNzE4NjlhXQk9IDAsCiAJW2Y3MTg4MmZnXQk9IDEsCiAJW2Y3MTg4OWZnXQk9IDEsCiAJW2Y3MTg4OWVkXQk9IDEsCkBAIC0xNTksNiArMTYzLDcgQEAKIAlbZjcxODU4ZmddCT0gMCwKIAlbZjcxODYyZmddCT0gMSwKIAlbZjcxODY5XQk9IDEsCisJW2Y3MTg2OWFdCT0gMSwKIAlbZjcxODgyZmddCT0gMSwKIAlbZjcxODg5ZmddCT0gMSwKIAlbZjcxODg5ZWRdCT0gMSwKQEAgLTE3Myw2ICsxNzgsNyBAQAogCVtmNzE4NThmZ10JPSAzLAogCVtmNzE4NjJmZ10JPSAzLAogCVtmNzE4NjldCT0gMywKKwlbZjcxODY5YV0JPSAzLAogCVtmNzE4ODJmZ10JPSA0LAogCVtmNzE4ODlmZ10JPSAzLAogCVtmNzE4ODllZF0JPSAzLApAQCAtMTg3LDYgKzE5Myw3IEBACiAJW2Y3MTg1OGZnXQk9IDAsCiAJW2Y3MTg2MmZnXQk9IDEsCiAJW2Y3MTg2OV0JPSAxLAorCVtmNzE4NjlhXQk9IDEsCiAJW2Y3MTg4MmZnXQk9IDEsCiAJW2Y3MTg4OWZnXQk9IDEsCiAJW2Y3MTg4OWVkXQk9IDEsCkBAIC0yMDEsNiArMjA4LDcgQEAKIAlbZjcxODU4ZmddCT0gMywKIAlbZjcxODYyZmddCT0gMywKIAlbZjcxODY5XQk9IDMsCisJW2Y3MTg2OWFdCT0gMywKIAlbZjcxODgyZmddCT0gMywKIAlbZjcxODg5ZmddCT0gMywKIAlbZjcxODg5ZWRdCT0gMywKQEAgLTIyNDMsNiArMjI1MSw3IEBACiAJCWNhc2UgZjcxODA4ZToKIAkJY2FzZSBmNzE4MDhhOgogCQljYXNlIGY3MTg2OToKKwkJY2FzZSBmNzE4NjlhOgogCQkJLyogVGhlc2UgYWx3YXlzIGhhdmUgc2lnbmVkIGF1dG8gcG9pbnQgdGVtcHMgKi8KIAkJCWRhdGEtPmF1dG9fcG9pbnRfdGVtcF9zaWduZWQgPSAxOwogCQkJLyogRmFsbCB0aHJvdWdoIHRvIHNlbGVjdCBjb3JyZWN0IGZhbi9wd20gcmVnIGJhbmshICovCkBAIC0yMzA1LDYgKzIzMTQsNyBAQAogCQljYXNlIGY3MTgwOGU6CiAJCWNhc2UgZjcxODA4YToKIAkJY2FzZSBmNzE4Njk6CisJCWNhc2UgZjcxODY5YToKIAkJY2FzZSBmNzE4ODlmZzoKIAkJY2FzZSBmNzE4ODllZDoKIAkJY2FzZSBmNzE4ODlhOgpAQCAtMjUyOCw2ICsyNTM4LDkgQEAKIAljYXNlIFNJT19GNzE4NjlfSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gZjcxODY5OwogCQlicmVhazsKKwljYXNlIFNJT19GNzE4NjlBX0lEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGY3MTg2OWE7CisJCWJyZWFrOwogCWNhc2UgU0lPX0Y3MTg4Ml9JRDoKIAkJc2lvX2RhdGEtPnR5cGUgPSBmNzE4ODJmZzsKIAkJYnJlYWs7CkBAIC0yNjYyLDcgKzI2NzUsNyBAQAogfQogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkY3MTg4MkZHIEhhcmR3YXJlIE1vbml0b3JpbmcgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJIYW5zIEVkZ2luZ3RvbiwgSGFucyBkZSBHb2VkZSAoaGRlZ29lZGVAcmVkaGF0LmNvbSkiKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgRWRnaW5ndG9uLCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBtb2R1bGVfaW5pdChmNzE4ODJmZ19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCmluZGV4IDI1ODJiZmUuLmM4MTk1YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi12aWQuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAKIAl7WDg2X1ZFTkRPUl9DRU5UQVVSLCAweDYsIDB4NywgQU5ZLCA4NX0sCS8qIEVkZW4gRVNQL0V6cmEgKi8KIAl7WDg2X1ZFTkRPUl9DRU5UQVVSLCAweDYsIDB4OCwgMHg3LCA4NX0sCS8qIEV6cmEgVCAqLwotCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHg5LCAweDcsIDg1fSwJLyogTmVtaWFoICovCisJe1g4Nl9WRU5ET1JfQ0VOVEFVUiwgMHg2LCAweDksIDB4NywgODV9LAkvKiBOZWhlbWlhaCAqLwogCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHg5LCBBTlksIDE3fSwJLyogQzMtTSwgRWRlbi1OICovCiAJe1g4Nl9WRU5ET1JfQ0VOVEFVUiwgMHg2LCAweEEsIDB4NywgMH0sCQkvKiBObyBpbmZvcm1hdGlvbiAqLwogCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHhBLCBBTlksIDEzfSwJLyogQzcsIEVzdGhlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1hZW0uYyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKaW5kZXggNTM3NDA5ZC4uMWE0MDljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pYm1hZW0uYworKysgYi9kcml2ZXJzL2h3bW9uL2libWFlbS5jCkBAIC05NDcsNiArOTQ3LDcgQEAKIAogCS8qIFNldCB1cCByZWFkLW9ubHkgc2Vuc29ycyAqLwogCXdoaWxlIChyby0+bGFiZWwpIHsKKwkJc3lzZnNfYXR0cl9pbml0KCZzZW5zb3JzLT5kZXZfYXR0ci5hdHRyKTsKIAkJc2Vuc29ycy0+ZGV2X2F0dHIuYXR0ci5uYW1lID0gcm8tPmxhYmVsOwogCQlzZW5zb3JzLT5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCQlzZW5zb3JzLT5kZXZfYXR0ci5zaG93ID0gcm8tPnNob3c7CkBAIC05NjMsNiArOTY0LDcgQEAKIAogCS8qIFNldCB1cCByZWFkLXdyaXRlIHNlbnNvcnMgKi8KIAl3aGlsZSAocnctPmxhYmVsKSB7CisJCXN5c2ZzX2F0dHJfaW5pdCgmc2Vuc29ycy0+ZGV2X2F0dHIuYXR0cik7CiAJCXNlbnNvcnMtPmRldl9hdHRyLmF0dHIubmFtZSA9IHJ3LT5sYWJlbDsKIAkJc2Vuc29ycy0+ZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1I7CiAJCXNlbnNvcnMtPmRldl9hdHRyLnNob3cgPSBydy0+c2hvdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMgYi9kcml2ZXJzL2h3bW9uL2libXBleC5jCmluZGV4IDA2ZDRlYWYuLjQxZGJmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwpAQCAtMzU4LDYgKzM1OCw3IEBACiAJZWxzZSBpZiAodHlwZSA9PSBQT1dFUl9TRU5TT1IpCiAJCXNwcmludGYobiwgcG93ZXJfc2Vuc29yX25hbWVfdGVtcGxhdGVzW2Z1bmNdLCAicG93ZXIiLCBjb3VudGVyKTsKIAorCXN5c2ZzX2F0dHJfaW5pdCgmZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuYXR0cik7CiAJZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuYXR0ci5uYW1lID0gbjsKIAlkYXRhLT5zZW5zb3JzW3NlbnNvcl0uYXR0cltmdW5jXS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWRhdGEtPnNlbnNvcnNbc2Vuc29yXS5hdHRyW2Z1bmNdLmRldl9hdHRyLnNob3cgPSBpYm1wZXhfc2hvd19zZW5zb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2l0ODcuYyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCmluZGV4IGJiNjQwNWIuLjVmNTI0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCkBAIC0xNTM4LDcgKzE1MzgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXQ4N19ncm91cF9sYWJlbCA9IHsKLQkuYXR0cnMgPSBpdDg3X2F0dHJpYnV0ZXNfdmlkLAorCS5hdHRycyA9IGl0ODdfYXR0cmlidXRlc19sYWJlbCwKIH07CiAKIC8qIFN1cGVySU8gZGV0ZWN0aW9uIC0gd2lsbCBjaGFuZ2UgaXNhX2FkZHJlc3MgaWYgYSBjaGlwIGlzIGZvdW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IDFhNmRmYjYuLmQzYjQ2NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC05OCwxMSArOTgsMTYgQEAKIH07CiAKIC8qIENvbnZlcnNpb25zICovCi1zdGF0aWMgaW50IFRlbXBGcm9tUmVnKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3N0YXRpYyBpbnQgdGVtcF9mcm9tX3JlZ19zaWduZWQodTggdmFsX2gsIHU4IHZhbF9sKQogewotCWlmICh2YWxfaCAmIDB4ODApCi0JCXJldHVybiB2YWxfaCAtIDB4MTAwOwotCXJldHVybiB2YWxfaCAqIDEwMDAgKyB2YWxfbCAqIDEwMDAgLyAyNTY7CisJczE2IHZhbF9obCA9ICh2YWxfaCA8PCA4KSB8IHZhbF9sOworCXJldHVybiB2YWxfaGwgKiAxMDAwIC8gMjU2OworfQorCitzdGF0aWMgaW50IHRlbXBfZnJvbV9yZWdfdW5zaWduZWQodTggdmFsX2gsIHU4IHZhbF9sKQoreworCXUxNiB2YWxfaGwgPSAodmFsX2ggPDwgOCkgfCB2YWxfbDsKKwlyZXR1cm4gdmFsX2hsICogMTAwMCAvIDI1NjsKIH0KIAogc3RhdGljIHN0cnVjdCBsbTk1MjQxX2RhdGEgKmxtOTUyNDFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0xMzUsMTAgKzE0MCwxMyBAQAogCQkJICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsCi0JCVRlbXBGcm9tUmVnKGRhdGEtPnRlbXBbdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleF0sCi0JCQkgICAgZGF0YS0+dGVtcFt0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ICsgMV0pKTsKKwkJCWluZGV4ID09IDAgfHwgKGRhdGEtPmNvbmZpZyAmICgxIDw8IChpbmRleCAvIDIpKSkgPworCQl0ZW1wX2Zyb21fcmVnX3NpZ25lZChkYXRhLT50ZW1wW2luZGV4XSwgZGF0YS0+dGVtcFtpbmRleCArIDFdKSA6CisJCXRlbXBfZnJvbV9yZWdfdW5zaWduZWQoZGF0YS0+dGVtcFtpbmRleF0sCisJCQkJICAgICAgIGRhdGEtPnRlbXBbaW5kZXggKyAxXSkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTMzOSw3ICszNDcsNyBAQAogCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfTUFOX0lEKQogCSAgICAgPT0gTUFOVUZBQ1RVUkVSX0lEKQogCSAgICAmJiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCkKLQkJPj0gREVGQVVMVF9SRVZJU0lPTikpIHsKKwkJPT0gREVGQVVMVF9SRVZJU0lPTikpIHsKIAkJbmFtZSA9IERFVk5BTUU7CiAJfSBlbHNlIHsKIAkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiTE05NTI0MSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MTExMS5jIGIvZHJpdmVycy9od21vbi9tYXgxMTExLmMKaW5kZXggMTJhNTRhYS4uMTQzMzViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgxMTExLmMKKysrIGIvZHJpdmVycy9od21vbi9tYXgxMTExLmMKQEAgLTQwLDYgKzQwLDggQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhmZXJbMl07CiAJdWludDhfdCAqdHhfYnVmOwogCXVpbnQ4X3QgKnJ4X2J1ZjsKKwlzdHJ1Y3QgbXV0ZXgJCWRydmRhdGFfbG9jazsKKwkvKiBwcm90ZWN0IG1zZywgeGZlciBhbmQgYnVmZmVycyBmcm9tIG11bHRpcGxlIGFjY2VzcyAqLwogfTsKIAogc3RhdGljIGludCBtYXgxMTExX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKQEAgLTQ4LDYgKzUwLDkgQEAKIAl1aW50OF90IHYxLCB2MjsKIAlpbnQgZXJyOwogCisJLyogd3JpdGluZyB0byBkcnZkYXRhIHN0cnVjdCBpcyBub3QgdGhyZWFkIHNhZmUsIHdhaXQgb24gbXV0ZXggKi8KKwltdXRleF9sb2NrKCZkYXRhLT5kcnZkYXRhX2xvY2spOworCiAJZGF0YS0+dHhfYnVmWzBdID0gKGNoYW5uZWwgPDwgTUFYMTExMV9DVFJMX1NFTF9TSCkgfAogCQlNQVgxMTExX0NUUkxfUEQwIHwgTUFYMTExMV9DVFJMX1BEMSB8CiAJCU1BWDExMTFfQ1RSTF9TR0wgfCBNQVgxMTExX0NUUkxfVU5JIHwgTUFYMTExMV9DVFJMX1NUUjsKQEAgLTU1LDEyICs2MCwxNSBAQAogCWVyciA9IHNwaV9zeW5jKGRhdGEtPnNwaSwgJmRhdGEtPm1zZyk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycihkZXYsICJzcGlfc3luYyBmYWlsZWQgd2l0aCAlZFxuIiwgZXJyKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5kcnZkYXRhX2xvY2spOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCXYxID0gZGF0YS0+cnhfYnVmWzBdOwogCXYyID0gZGF0YS0+cnhfYnVmWzFdOwogCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5kcnZkYXRhX2xvY2spOworCiAJaWYgKCh2MSAmIDB4YzApIHx8ICh2MiAmIDB4M2YpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTc2LDYgKzE4NCw4IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfZnJlZV9kYXRhOwogCisJbXV0ZXhfaW5pdCgmZGF0YS0+ZHJ2ZGF0YV9sb2NrKTsKKwogCWRhdGEtPnNwaSA9IHNwaTsKIAlzcGlfc2V0X2RydmRhdGEoc3BpLCBkYXRhKTsKIApAQCAtMjEzLDYgKzIyMyw3IEBACiAKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3BpLT5kZXYua29iaiwgJm1heDExMTFfYXR0cl9ncm91cCk7CisJbXV0ZXhfZGVzdHJveSgmZGF0YS0+ZHJ2ZGF0YV9sb2NrKTsKIAlrZnJlZShkYXRhLT5yeF9idWYpOwogCWtmcmVlKGRhdGEtPnR4X2J1Zik7CiAJa2ZyZWUoZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDY2NDIuYyBiL2RyaXZlcnMvaHdtb24vbWF4NjY0Mi5jCmluZGV4IDBmOWZjNDAuLmU4NTVkM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4NjY0Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWF4NjY0Mi5jCkBAIC0xMzYsMTUgKzEzNiwyOSBAQAogCWlmIChtYW5faWQgIT0gMHg0RCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgMHgwNCkgIT0gMHg0RAorCSAgICB8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAweDA2KSAhPSAweDRECisJICAgIHx8IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIDB4ZmYpICE9IDB4NEQpCisJCXJldHVybiAtRU5PREVWOworCiAJLyoKIAkgKiBXZSByZWFkIHRoZSBjb25maWcgYW5kIHN0YXR1cyByZWdpc3RlciwgdGhlIDQgbG93ZXIgYml0cyBpbiB0aGUKIAkgKiBjb25maWcgcmVnaXN0ZXIgc2hvdWxkIGJlIHplcm8gYW5kIGJpdCA1LCAzLCAxIGFuZCAwIHNob3VsZCBiZQogCSAqIHplcm8gaW4gdGhlIHN0YXR1cyByZWdpc3Rlci4KIAkgKi8KIAlyZWdfY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY0Ml9SRUdfUl9DT05GSUcpOworCWlmICgocmVnX2NvbmZpZyAmIDB4MGYpICE9IDB4MDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogaW4gYmV0d2VlbiwgYW5vdGhlciByb3VuZCBvZiBzYW5pdHkgY2hlY2tzICovCisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIDB4MDQpICE9IHJlZ19jb25maWcKKwkgICAgfHwgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgMHgwNikgIT0gcmVnX2NvbmZpZworCSAgICB8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAweGZmKSAhPSByZWdfY29uZmlnKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJlZ19zdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjQyX1JFR19SX1NUQVRVUyk7Ci0JaWYgKCgocmVnX2NvbmZpZyAmIDB4MGYpICE9IDB4MDApIHx8Ci0JICAgICgocmVnX3N0YXR1cyAmIDB4MmIpICE9IDB4MDApKQorCWlmICgocmVnX3N0YXR1cyAmIDB4MmIpICE9IDB4MDApCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3RybGNweShpbmZvLT50eXBlLCAibWF4NjY0MiIsIEkyQ19OQU1FX1NJWkUpOwpAQCAtMjQ2LDcgKzI2MCw3IEBACiAJCQkgICAgc2V0X3RlbXBfbWF4LCAwLCBNQVg2NjQyX1JFR19XX0xPQ0FMX0hJR0gpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9tYXgsCiAJCQkgICAgc2V0X3RlbXBfbWF4LCAxLCBNQVg2NjQyX1JFR19XX1JFTU9URV9ISUdIKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcF9mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKIApAQCAtMjU2LDcgKzI3MCw3IEBACiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLAogCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzLmMKaW5kZXggOThlMmUyOC4uOWIxZjBjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMuYwpAQCAtNDcsMjIgKzQ3LDI5IEBACiAJaWYgKGluZm8tPmZ1bmNbMF0KIAkgICAgJiYgcG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1NUQVRVU19JTlBVVCkpCiAJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9TVEFUVVNfSU5QVVQ7Ci0JaWYgKHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19SRUFEX0ZBTl9TUEVFRF8xKSkgeworCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfRkFOX0NPTkZJR18xMikgJiYKKwkgICAgcG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfRkFOX1NQRUVEXzEpKSB7CiAJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9GQU4xMjsKIAkJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19TVEFUVVNfRkFOXzEyKSkKIAkJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9TVEFUVVNfRkFOMTI7CiAJfQotCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9GQU5fU1BFRURfMykpIHsKKwlpZiAocG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX0ZBTl9DT05GSUdfMzQpICYmCisJICAgIHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19SRUFEX0ZBTl9TUEVFRF8zKSkgewogCQlpbmZvLT5mdW5jWzBdIHw9IFBNQlVTX0hBVkVfRkFOMzQ7CiAJCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfU1RBVFVTX0ZBTl8zNCkpCiAJCQlpbmZvLT5mdW5jWzBdIHw9IFBNQlVTX0hBVkVfU1RBVFVTX0ZBTjM0OwogCX0KLQlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMSkpIHsKKwlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMSkpCiAJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9URU1QOwotCQlpZiAocG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsCi0JCQkJCSAgICAgIFBNQlVTX1NUQVRVU19URU1QRVJBVFVSRSkpCisJaWYgKHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19SRUFEX1RFTVBFUkFUVVJFXzIpKQorCQlpbmZvLT5mdW5jWzBdIHw9IFBNQlVTX0hBVkVfVEVNUDI7CisJaWYgKHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19SRUFEX1RFTVBFUkFUVVJFXzMpKQorCQlpbmZvLT5mdW5jWzBdIHw9IFBNQlVTX0hBVkVfVEVNUDM7CisJaWYgKGluZm8tPmZ1bmNbMF0gJiAoUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9URU1QMgorCQkJICAgICB8IFBNQlVTX0hBVkVfVEVNUDMpCisJICAgICYmIHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLAorCQkJCQkgUE1CVVNfU1RBVFVTX1RFTVBFUkFUVVJFKSkKIAkJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9TVEFUVVNfVEVNUDsKLQl9CiAKIAkvKiBTZW5zb3JzIGRldGVjdGVkIG9uIGFsbCBwYWdlcyAqLwogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBpbmZvLT5wYWdlczsgcGFnZSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzX2NvcmUuYyBiL2RyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jCmluZGV4IDM1NDc3MGUuLjhlMzFhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jCkBAIC0zNjIsOCArMzYyLDggQEAKICAqIENvbnZlcnQgbGluZWFyIHNlbnNvciB2YWx1ZXMgdG8gbWlsbGktIG9yIG1pY3JvLXVuaXRzCiAgKiBkZXBlbmRpbmcgb24gc2Vuc29yIHR5cGUuCiAgKi8KLXN0YXRpYyBpbnQgcG1idXNfcmVnMmRhdGFfbGluZWFyKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAotCQkJCSBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IpCitzdGF0aWMgbG9uZyBwbWJ1c19yZWcyZGF0YV9saW5lYXIoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCisJCQkJICBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IpCiB7CiAJczE2IGV4cG9uZW50OwogCXMzMiBtYW50aXNzYTsKQEAgLTM5NywxNSArMzk3LDE1IEBACiAJZWxzZQogCQl2YWwgPj49IC1leHBvbmVudDsKIAotCXJldHVybiAoaW50KXZhbDsKKwlyZXR1cm4gdmFsOwogfQogCiAvKgogICogQ29udmVydCBkaXJlY3Qgc2Vuc29yIHZhbHVlcyB0byBtaWxsaS0gb3IgbWljcm8tdW5pdHMKICAqIGRlcGVuZGluZyBvbiBzZW5zb3IgdHlwZS4KICAqLwotc3RhdGljIGludCBwbWJ1c19yZWcyZGF0YV9kaXJlY3Qoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCi0JCQkJIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKK3N0YXRpYyBsb25nIHBtYnVzX3JlZzJkYXRhX2RpcmVjdChzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKKwkJCQkgIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKIHsKIAlsb25nIHZhbCA9IChzMTYpIHNlbnNvci0+ZGF0YTsKIAlsb25nIG0sIGIsIFI7CkBAIC00NDAsMTIgKzQ0MCwxMiBAQAogCQlSKys7CiAJfQogCi0JcmV0dXJuIChpbnQpKCh2YWwgLSBiKSAvIG0pOworCXJldHVybiAodmFsIC0gYikgLyBtOwogfQogCi1zdGF0aWMgaW50IHBtYnVzX3JlZzJkYXRhKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLCBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IpCitzdGF0aWMgbG9uZyBwbWJ1c19yZWcyZGF0YShzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQogewotCWludCB2YWw7CisJbG9uZyB2YWw7CiAKIAlpZiAoZGF0YS0+aW5mby0+ZGlyZWN0W3NlbnNvci0+Y2xhc3NdKQogCQl2YWwgPSBwbWJ1c19yZWcyZGF0YV9kaXJlY3QoZGF0YSwgc2Vuc29yKTsKQEAgLTYxOSw3ICs2MTksNyBAQAogCWlmICghczEgJiYgIXMyKQogCQkqdmFsID0gISFyZWd2YWw7CiAJZWxzZSB7Ci0JCWludCB2MSwgdjI7CisJCWxvbmcgdjEsIHYyOwogCQlzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IxLCAqc2Vuc29yMjsKIAogCQlzZW5zb3IxID0gJmRhdGEtPnNlbnNvcnNbczFdOwpAQCAtNjYxLDcgKzY2MSw3IEBACiAJaWYgKHNlbnNvci0+ZGF0YSA8IDApCiAJCXJldHVybiBzZW5zb3ItPmRhdGE7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcG1idXNfcmVnMmRhdGEoZGF0YSwgc2Vuc29yKSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBwbWJ1c19yZWcyZGF0YShkYXRhLCBzZW5zb3IpKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcG1idXNfc2V0X3NlbnNvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xNDMwLDE0ICsxNDMwLDkgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQkvKgotCSAqIEJhaWwgb3V0IGlmIHN0YXR1cyByZWdpc3RlciBvciBQTUJ1cyByZXZpc2lvbiByZWdpc3RlcgotCSAqIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBQTUJVU19TVEFUVVNfQllURSkgPCAwCi0JICAgIHx8IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFBNQlVTX1JFVklTSU9OKSA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiU3RhdHVzIG9yIHJldmlzaW9uIHJlZ2lzdGVyIG5vdCBmb3VuZFxuIik7CisJLyogQmFpbCBvdXQgaWYgUE1CdXMgc3RhdHVzIHJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0LiAqLworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBQTUJVU19TVEFUVVNfQllURSkgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUE1CdXMgc3RhdHVzIHJlZ2lzdGVyIG5vdCBmb3VuZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X2RhdGE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zM2MtaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vczNjLWh3bW9uLmMKaW5kZXggOTJiNDJkYi4uYjM5ZjUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zM2MtaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL3MzYy1od21vbi5jCkBAIC0yMzIsNiArMjMyLDcgQEAKIAogCWF0dHIgPSAmYXR0cnMtPmluOwogCWF0dHItPmluZGV4ID0gY2hhbm5lbDsKKwlzeXNmc19hdHRyX2luaXQoJmF0dHItPmRldl9hdHRyLmF0dHIpOwogCWF0dHItPmRldl9hdHRyLmF0dHIubmFtZSAgPSBhdHRycy0+aW5fbmFtZTsKIAlhdHRyLT5kZXZfYXR0ci5hdHRyLm1vZGUgID0gU19JUlVHTzsKIAlhdHRyLT5kZXZfYXR0ci5zaG93ID0gczNjX2h3bW9uX2NoX3Nob3c7CkBAIC0yNDksNiArMjUwLDcgQEAKIAogCQlhdHRyID0gJmF0dHJzLT5sYWJlbDsKIAkJYXR0ci0+aW5kZXggPSBjaGFubmVsOworCQlzeXNmc19hdHRyX2luaXQoJmF0dHItPmRldl9hdHRyLmF0dHIpOwogCQlhdHRyLT5kZXZfYXR0ci5hdHRyLm5hbWUgID0gYXR0cnMtPmxhYmVsX25hbWU7CiAJCWF0dHItPmRldl9hdHRyLmF0dHIubW9kZSAgPSBTX0lSVUdPOwogCQlhdHRyLT5kZXZfYXR0ci5zaG93ID0gczNjX2h3bW9uX2xhYmVsX3Nob3c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NjaDU2MjcuYyBiL2RyaXZlcnMvaHdtb24vc2NoNTYyNy5jCmluZGV4IDAyMGM4NzIuLjM0OTRhNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc2NoNTYyNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vc2NoNTYyNy5jCkBAIC04ODcsNyArODg3LDcgQEAKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTTVNDIFNDSDU2MjcgSGFyZHdhcmUgTW9uaXRvcmluZyBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgKGhkZWdvZWRlQHJlZGhhdC5jb20pIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBtb2R1bGVfaW5pdChzY2g1NjI3X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCmluZGV4IDUyYjU0NWEuLmNiYzk4YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKQEAgLTE5Myw3ICsxOTMsMTMgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodHdpX2ludF9zdGF0dXMgJiBNQ09NUCkgewotCQlpZiAoaWZhY2UtPmN1cl9tb2RlID09IFRXSV9JMkNfTU9ERV9DT01CSU5FRCkgeworCQlpZiAoKHJlYWRfTUFTVEVSX0NUTChpZmFjZSkgJiBNRU4pID09IDAgJiYKKwkJCShpZmFjZS0+Y3VyX21vZGUgPT0gVFdJX0kyQ19NT0RFX1JFUEVBVCB8fAorCQkJaWZhY2UtPmN1cl9tb2RlID09IFRXSV9JMkNfTU9ERV9DT01CSU5FRCkpIHsKKwkJCWlmYWNlLT5yZXN1bHQgPSAtMTsKKwkJCXdyaXRlX0lOVF9NQVNLKGlmYWNlLCAwKTsKKwkJCXdyaXRlX01BU1RFUl9DVEwoaWZhY2UsIDApOworCQl9IGVsc2UgaWYgKGlmYWNlLT5jdXJfbW9kZSA9PSBUV0lfSTJDX01PREVfQ09NQklORUQpIHsKIAkJCWlmIChpZmFjZS0+cmVhZE51bSA9PSAwKSB7CiAJCQkJLyogc2V0IHRoZSByZWFkIG51bWJlciB0byAxIGFuZCBhc2sgZm9yIG1hbnVhbAogCQkJCSAqIHN0b3AgaW4gYmxvY2sgY29tYmluZSBtb2RlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCmluZGV4IDZjMDBjMTAuLmY4NGE2M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCkBAIC0yNDgsMTIgKzI0OCwxMiBAQAogCXJldHVybiBpMmMtPm1zZ19wdHIgPj0gaTJjLT5tc2ctPmxlbjsKIH0KIAotLyogaTJzX3MzY19pcnFfbmV4dGJ5dGUKKy8qIGkyY19zM2NfaXJxX25leHRieXRlCiAgKgogICogcHJvY2VzcyBhbiBpbnRlcnJ1cHQgYW5kIHdvcmsgb3V0IHdoYXQgdG8gZG8KICAqLwogCi1zdGF0aWMgaW50IGkyc19zM2NfaXJxX25leHRieXRlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjLCB1bnNpZ25lZCBsb25nIGlpY3N0YXQpCitzdGF0aWMgaW50IGkyY19zM2NfaXJxX25leHRieXRlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjLCB1bnNpZ25lZCBsb25nIGlpY3N0YXQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJdW5zaWduZWQgY2hhciBieXRlOwpAQCAtMjY0LDcgKzI2NCw2IEBACiAJY2FzZSBTVEFURV9JRExFOgogCQlkZXZfZXJyKGkyYy0+ZGV2LCAiJXM6IGNhbGxlZCBpbiBTVEFURV9JRExFXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0OwotCQlicmVhazsKIAogCWNhc2UgU1RBVEVfU1RPUDoKIAkJZGV2X2VycihpMmMtPmRldiwgIiVzOiBjYWxsZWQgaW4gU1RBVEVfU1RPUFxuIiwgX19mdW5jX18pOwpAQCAtNDQ0LDcgKzQ0Myw3IEBACiAJLyogcHJldHR5IG11Y2ggdGhpcyBsZWF2ZXMgdXMgd2l0aCB0aGUgZmFjdCB0aGF0IHdlJ3ZlCiAJICogdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgd2hhdGV2ZXIgYnl0ZSB3ZSBsYXN0IHNlbnQgKi8KIAotCWkyc19zM2NfaXJxX25leHRieXRlKGkyYywgc3RhdHVzKTsKKwlpMmNfczNjX2lycV9uZXh0Ynl0ZShpMmMsIHN0YXR1cyk7CiAKICBvdXQ6CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bS5jCmluZGV4IGRkMzljMWUuLjI2YzM1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGFvcy1ldm0uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtLmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiAJaWYgKHRhb3MtPnN0YXRlICE9IFRBT1NfU1RBVEVfSURMRSkgewogCQllcnIgPSAtRU5PREVWOwotCQlkZXZfZGJnKCZzZXJpby0+ZGV2LCAiVEFPUyBFVk0gcmVzZXQgZmFpbGVkIChzdGF0ZT0lZCwgIgorCQlkZXZfZXJyKCZzZXJpby0+ZGV2LCAiVEFPUyBFVk0gcmVzZXQgZmFpbGVkIChzdGF0ZT0lZCwgIgogCQkJInBvcz0lZClcbiIsIHRhb3MtPnN0YXRlLCB0YW9zLT5wb3MpOwogCQlnb3RvIGV4aXRfY2xvc2U7CiAJfQpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDI1MCkpOwogCWlmICh0YW9zLT5zdGF0ZSAhPSBUQU9TX1NUQVRFX0lETEUpIHsKIAkJZXJyID0gLUVOT0RFVjsKLQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiRWNobyBvZmYgZmFpbGVkICIKKwkJZGV2X2Vycigmc2VyaW8tPmRldiwgIlRBT1MgRVZNIGVjaG8gb2ZmIGZhaWxlZCAiCiAJCQkiKHN0YXRlPSVkKVxuIiwgdGFvcy0+c3RhdGUpOwogCQlnb3RvIGV4aXRfY2xvc2U7CiAJfQpAQCAtMjYzLDcgKzI2Myw3IEBACiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKGFkYXB0ZXIpOwogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9jbG9zZTsKLQlkZXZfZGJnKCZzZXJpby0+ZGV2LCAiQ29ubmVjdGVkIHRvIFRBT1MgRVZNXG4iKTsKKwlkZXZfaW5mbygmc2VyaW8tPmRldiwgIkNvbm5lY3RlZCB0byBUQU9TIEVWTVxuIik7CiAKIAl0YW9zLT5jbGllbnQgPSB0YW9zX2luc3RhbnRpYXRlX2RldmljZShhZGFwdGVyKTsKIAlyZXR1cm4gMDsKQEAgLTI4OCw3ICsyODgsNyBAQAogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKIAlrZnJlZSh0YW9zKTsKIAotCWRldl9kYmcoJnNlcmlvLT5kZXYsICJEaXNjb25uZWN0ZWQgZnJvbSBUQU9TIEVWTVxuIik7CisJZGV2X2luZm8oJnNlcmlvLT5kZXYsICJEaXNjb25uZWN0ZWQgZnJvbSBUQU9TIEVWTVxuIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkIHRhb3Nfc2VyaW9faWRzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKaW5kZXggNGQ5MzE5Ni4uZmIzYjRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYwpAQCAtNDAsOCArNDAsMTAgQEAKICNkZWZpbmUgSTJDX0NORkdfTkVXX01BU1RFUl9GU00JCQkoMTw8MTEpCiAjZGVmaW5lIEkyQ19TVEFUVVMJCQkJMHgwMUMKICNkZWZpbmUgSTJDX1NMX0NORkcJCQkJMHgwMjAKKyNkZWZpbmUgSTJDX1NMX0NORkdfTkFDSwkJCSgxPDwxKQogI2RlZmluZSBJMkNfU0xfQ05GR19ORVdTTAkJCSgxPDwyKQogI2RlZmluZSBJMkNfU0xfQUREUjEJCQkJMHgwMmMKKyNkZWZpbmUgSTJDX1NMX0FERFIyCQkJCTB4MDMwCiAjZGVmaW5lIEkyQ19UWF9GSUZPCQkJCTB4MDUwCiAjZGVmaW5lIEkyQ19SWF9GSUZPCQkJCTB4MDU0CiAjZGVmaW5lIEkyQ19QQUNLRVRfVFJBTlNGRVJfU1RBVFVTCQkweDA1OApAQCAtMzM3LDcgKzMzOSwxMSBAQAogCiAJaWYgKCFpMmNfZGV2LT5pc19kdmMpIHsKIAkJdTMyIHNsX2NmZyA9IGkyY19yZWFkbChpMmNfZGV2LCBJMkNfU0xfQ05GRyk7Ci0JCWkyY193cml0ZWwoaTJjX2Rldiwgc2xfY2ZnIHwgSTJDX1NMX0NORkdfTkVXU0wsIEkyQ19TTF9DTkZHKTsKKwkJc2xfY2ZnIHw9IEkyQ19TTF9DTkZHX05BQ0sgfCBJMkNfU0xfQ05GR19ORVdTTDsKKwkJaTJjX3dyaXRlbChpMmNfZGV2LCBzbF9jZmcsIEkyQ19TTF9DTkZHKTsKKwkJaTJjX3dyaXRlbChpMmNfZGV2LCAweGZjLCBJMkNfU0xfQUREUjEpOworCQlpMmNfd3JpdGVsKGkyY19kZXYsIDB4MDAsIEkyQ19TTF9BRERSMik7CisKIAl9CiAKIAl2YWwgPSA3IDw8IEkyQ19GSUZPX0NPTlRST0xfVFhfVFJJR19TSElGVCB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9wY2E5NTR4LmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9wY2E5NTR4LmMKaW5kZXggNTRlMWNlNy4uNmY4OTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvcGNhOTU0eC5jCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL3BjYTk1NHguYwpAQCAtMjAxLDEwICsyMDEsMTEgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCi0JLyogUmVhZCB0aGUgbXV4IHJlZ2lzdGVyIGF0IGFkZHIgdG8gdmVyaWZ5Ci0JICogdGhhdCB0aGUgbXV4IGlzIGluIGZhY3QgcHJlc2VudC4KKwkvKiBXcml0ZSB0aGUgbXV4IHJlZ2lzdGVyIGF0IGFkZHIgdG8gdmVyaWZ5CisJICogdGhhdCB0aGUgbXV4IGlzIGluIGZhY3QgcHJlc2VudC4gVGhpcyBhbHNvCisJICogaW5pdGlhbGl6ZXMgdGhlIG11eCB0byBkaXNjb25uZWN0ZWQgc3RhdGUuCiAJICovCi0JaWYgKGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KSA8IDApIHsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAwKSA8IDApIHsKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAicHJvYmUgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCA2ZTUxMjNiLi4wNGIwOTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtNzc4LDcgKzc3OCw4IEBACiAJCQkJCXNlY3Rvcl90IGJsb2NrKQogewogCXN0cnVjdCBpZGVfY21kIGNtZDsKLQlpbnQgdXB0b2RhdGUgPSAwLCBuc2VjdG9yczsKKwlpbnQgdXB0b2RhdGUgPSAwOworCXVuc2lnbmVkIGludCBuc2VjdG9yczsKIAogCWlkZV9kZWJ1Z19sb2coSURFX0RCR19SUSwgImNtZDogMHgleCwgYmxvY2s6ICVsbHUiLAogCQkJCSAgcnEtPmNtZFswXSwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jayk7CkBAIC0xNzgyLDcgKzE3ODMsNiBAQAogCWlkZV9jZF9yZWFkX3RvYyhkcml2ZSwgJnNlbnNlKTsKIAlnLT5mb3BzID0gJmlkZWNkX29wczsKIAlnLT5mbGFncyB8PSBHRU5IRF9GTF9SRU1PVkFCTEUgfCBHRU5IRF9GTF9CTE9DS19FVkVOVFNfT05fRVhDTF9XUklURTsKLQlnLT5ldmVudHMgPSBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKIAlhZGRfZGlzayhnKTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggZjYyZjUyZi4uZmMwZjJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0zNjQxLDcgKzM2NDEsOCBAQAogCiBzdGF0aWMgY2hhciAqY21fZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIG1vZGVfdCAqbW9kZSkKIHsKLQkqbW9kZSA9IDA2NjY7CisJaWYgKG1vZGUpCisJCSptb2RlID0gMDY2NjsKIAlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJpbmZpbmliYW5kLyVzIiwgZGV2X25hbWUoZGV2KSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCmluZGV4IGU0OWE4NWYuLjU2ODk4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwpAQCAtODI2LDcgKzgyNiw4IEBACiAKIHN0YXRpYyBjaGFyICp1dmVyYnNfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIG1vZGVfdCAqbW9kZSkKIHsKLQkqbW9kZSA9IDA2NjY7CisJaWYgKG1vZGUpCisJCSptb2RlID0gMDY2NjsKIAlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJpbmZpbmliYW5kLyVzIiwgZGV2X25hbWUoZGV2KSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKaW5kZXggZjY2MGNkMC4uMzFmYjQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKQEAgLTE0NjMsOSArMTQ2Myw5IEBACiAJc3RydWN0IGM0aXdfcXBfYXR0cmlidXRlcyBhdHRyczsKIAlpbnQgZGlzY29ubmVjdCA9IDE7CiAJaW50IHJlbGVhc2UgPSAwOwotCWludCBhYm9ydCA9IDA7CiAJc3RydWN0IHRpZF9pbmZvICp0ID0gZGV2LT5yZGV2LmxsZGkudGlkczsKIAl1bnNpZ25lZCBpbnQgdGlkID0gR0VUX1RJRChoZHIpOworCWludCByZXQ7CiAKIAllcCA9IGxvb2t1cF90aWQodCwgdGlkKTsKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKQEAgLTE1MDEsMTAgKzE1MDEsMTIgQEAKIAkJc3RhcnRfZXBfdGltZXIoZXApOwogCQlfX3N0YXRlX3NldCgmZXAtPmNvbSwgQ0xPU0lORyk7CiAJCWF0dHJzLm5leHRfc3RhdGUgPSBDNElXX1FQX1NUQVRFX0NMT1NJTkc7Ci0JCWFib3J0ID0gYzRpd19tb2RpZnlfcXAoZXAtPmNvbS5xcC0+cmhwLCBlcC0+Y29tLnFwLAorCQlyZXQgPSBjNGl3X21vZGlmeV9xcChlcC0+Y29tLnFwLT5yaHAsIGVwLT5jb20ucXAsCiAJCQkJICAgICAgIEM0SVdfUVBfQVRUUl9ORVhUX1NUQVRFLCAmYXR0cnMsIDEpOwotCQlwZWVyX2Nsb3NlX3VwY2FsbChlcCk7Ci0JCWRpc2Nvbm5lY3QgPSAxOworCQlpZiAocmV0ICE9IC1FQ09OTlJFU0VUKSB7CisJCQlwZWVyX2Nsb3NlX3VwY2FsbChlcCk7CisJCQlkaXNjb25uZWN0ID0gMTsKKwkJfQogCQlicmVhazsKIAljYXNlIEFCT1JUSU5HOgogCQlkaXNjb25uZWN0ID0gMDsKQEAgLTIxMDksMTUgKzIxMTEsMTYgQEAKIAkJYnJlYWs7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZlcC0+Y29tLm11dGV4KTsKIAlpZiAoY2xvc2UpIHsKLQkJaWYgKGFicnVwdCkKLQkJCXJldCA9IGFib3J0X2Nvbm5lY3Rpb24oZXAsIE5VTEwsIGdmcCk7Ci0JCWVsc2UKKwkJaWYgKGFicnVwdCkgeworCQkJY2xvc2VfY29tcGxldGVfdXBjYWxsKGVwKTsKKwkJCXJldCA9IHNlbmRfYWJvcnQoZXAsIE5VTEwsIGdmcCk7CisJCX0gZWxzZQogCQkJcmV0ID0gc2VuZF9oYWxmY2xvc2UoZXAsIGdmcCk7CiAJCWlmIChyZXQpCiAJCQlmYXRhbCA9IDE7CiAJfQorCW11dGV4X3VubG9jaygmZXAtPmNvbS5tdXRleCk7CiAJaWYgKGZhdGFsKQogCQlyZWxlYXNlX2VwX3Jlc291cmNlcyhlcCk7CiAJcmV0dXJuIHJldDsKQEAgLTIzMDEsNiArMjMwNCwzMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBlZXJfYWJvcnRfaW50cihzdHJ1Y3QgYzRpd19kZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3BsX2Fib3J0X3JlcV9yc3MgKnJlcSA9IGNwbGhkcihza2IpOworCXN0cnVjdCBjNGl3X2VwICplcDsKKwlzdHJ1Y3QgdGlkX2luZm8gKnQgPSBkZXYtPnJkZXYubGxkaS50aWRzOworCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKHJlcSk7CisKKwllcCA9IGxvb2t1cF90aWQodCwgdGlkKTsKKwlpZiAoaXNfbmVnX2Fkdl9hYm9ydChyZXEtPnN0YXR1cykpIHsKKwkJUERCRygiJXMgbmVnX2Fkdl9hYm9ydCBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwKKwkJICAgICBlcC0+aHd0aWQpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCVBEQkcoIiVzIGVwICVwIHRpZCAldSBzdGF0ZSAldVxuIiwgX19mdW5jX18sIGVwLCBlcC0+aHd0aWQsCisJICAgICBlcC0+Y29tLnN0YXRlKTsKKworCS8qCisJICogV2FrZSB1cCBhbnkgdGhyZWFkcyBpbiByZG1hX2luaXQoKSBvciByZG1hX2ZpbmkoKS4KKwkgKi8KKwljNGl3X3dha2VfdXAoJmVwLT5jb20ud3Jfd2FpdCwgLUVDT05OUkVTRVQpOworCXNjaGVkKGRldiwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIE1vc3QgdXBjYWxscyBmcm9tIHRoZSBUNCBDb3JlIGdvIHRvIHNjaGVkKCkgdG8KICAqIHNjaGVkdWxlIHRoZSBwcm9jZXNzaW5nIG9uIGEgd29yayBxdWV1ZS4KQEAgLTIzMTcsNyArMjM0NSw3IEBACiAJW0NQTF9QQVNTX0VTVEFCTElTSF0gPSBzY2hlZCwKIAlbQ1BMX1BFRVJfQ0xPU0VdID0gc2NoZWQsCiAJW0NQTF9DTE9TRV9DT05fUlBMXSA9IHNjaGVkLAotCVtDUExfQUJPUlRfUkVRX1JTU10gPSBzY2hlZCwKKwlbQ1BMX0FCT1JUX1JFUV9SU1NdID0gcGVlcl9hYm9ydF9pbnRyLAogCVtDUExfUkRNQV9URVJNSU5BVEVdID0gc2NoZWQsCiAJW0NQTF9GVzRfQUNLXSA9IHNjaGVkLAogCVtDUExfU0VUX1RDQl9SUExdID0gc2V0X3RjYl9ycGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCmluZGV4IDhkOGY4YWQuLjE3MjBkYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCkBAIC04MDEsNiArODAxLDEwIEBACiAJaWYgKHVjb250ZXh0KSB7CiAJCW1lbXNpemUgPSByb3VuZHVwKG1lbXNpemUsIFBBR0VfU0laRSk7CiAJCWh3ZW50cmllcyA9IG1lbXNpemUgLyBzaXplb2YgKmNocC0+Y3EucXVldWU7CisJCXdoaWxlIChod2VudHJpZXMgPiBUNF9NQVhfSVFfU0laRSkgeworCQkJbWVtc2l6ZSAtPSBQQUdFX1NJWkU7CisJCQlod2VudHJpZXMgPSBtZW1zaXplIC8gc2l6ZW9mICpjaHAtPmNxLnF1ZXVlOworCQl9CiAJfQogCWNocC0+Y3Euc2l6ZSA9IGh3ZW50cmllczsKIAljaHAtPmNxLm1lbXNpemUgPSBtZW1zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L21lbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L21lbS5jCmluZGV4IDI3M2ZmZTQuLjAzNDdlZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9tZW0uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvbWVtLmMKQEAgLTYyNSw3ICs2MjUsNyBAQAogCW1ocC0+YXR0ci5wZXJtcyA9IGM0aXdfaWJfdG9fdHB0X2FjY2VzcyhhY2MpOwogCW1ocC0+YXR0ci52YV9mYm8gPSB2aXJ0OwogCW1ocC0+YXR0ci5wYWdlX3NpemUgPSBzaGlmdCAtIDEyOwotCW1ocC0+YXR0ci5sZW4gPSAodTMyKSBsZW5ndGg7CisJbWhwLT5hdHRyLmxlbiA9IGxlbmd0aDsKIAogCWVyciA9IHJlZ2lzdGVyX21lbShyaHAsIHBocCwgbWhwLCBzaGlmdCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKaW5kZXggM2I3NzNiMC4uYTQxNTc4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKQEAgLTEyMDcsMTEgKzEyMDcsOCBAQAogCQkJCWM0aXdfZ2V0X2VwKCZxaHAtPmVwLT5jb20pOwogCQkJfQogCQkJcmV0ID0gcmRtYV9maW5pKHJocCwgcWhwLCBlcCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJaWYgKGludGVybmFsKQotCQkJCQljNGl3X2dldF9lcCgmcWhwLT5lcC0+Y29tKTsKKwkJCWlmIChyZXQpCiAJCQkJZ290byBlcnI7Ci0JCQl9CiAJCQlicmVhazsKIAkJY2FzZSBDNElXX1FQX1NUQVRFX1RFUk1JTkFURToKIAkJCXNldF9zdGF0ZShxaHAsIEM0SVdfUVBfU1RBVEVfVEVSTUlOQVRFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYwppbmRleCA5ZjUzZTY4Li44ZWM1MjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCkBAIC00NjksNiArNDY5LDggQEAKICNkZWZpbmUgSUJfNzMyMl9MVF9TVEFURV9SRUNPVkVSSURMRSAgICAgMHgwZgogI2RlZmluZSBJQl83MzIyX0xUX1NUQVRFX0NGR0VOSCAgICAgICAgICAweDEwCiAjZGVmaW5lIElCXzczMjJfTFRfU1RBVEVfQ0ZHVEVTVCAgICAgICAgIDB4MTEKKyNkZWZpbmUgSUJfNzMyMl9MVF9TVEFURV9DRkdXQUlUUk1UVEVTVCAgMHgxMgorI2RlZmluZSBJQl83MzIyX0xUX1NUQVRFX0NGR1dBSVRFTkggICAgICAweDEzCiAKIC8qIGxpbmsgc3RhdGUgbWFjaGluZSBzdGF0ZXMgZnJvbSBJQkMgKi8KICNkZWZpbmUgSUJfNzMyMl9MX1NUQVRFX0RPV04gICAgICAgICAgICAgMHgwCkBAIC00OTgsOCArNTAwLDEwIEBACiAJCUlCX1BIWVNQT1JUU1RBVEVfTElOS19FUlJfUkVDT1ZFUiwKIAlbSUJfNzMyMl9MVF9TVEFURV9DRkdFTkhdID0gSUJfUEhZU1BPUlRTVEFURV9DRkdfRU5ILAogCVtJQl83MzIyX0xUX1NUQVRFX0NGR1RFU1RdID0gSUJfUEhZU1BPUlRTVEFURV9DRkdfVFJBSU4sCi0JWzB4MTJdID0gSUJfUEhZU1BPUlRTVEFURV9DRkdfVFJBSU4sCi0JWzB4MTNdID0gSUJfUEhZU1BPUlRTVEFURV9DRkdfV0FJVF9FTkgsCisJW0lCXzczMjJfTFRfU1RBVEVfQ0ZHV0FJVFJNVFRFU1RdID0KKwkJSUJfUEhZU1BPUlRTVEFURV9DRkdfVFJBSU4sCisJW0lCXzczMjJfTFRfU1RBVEVfQ0ZHV0FJVEVOSF0gPQorCQlJQl9QSFlTUE9SVFNUQVRFX0NGR19XQUlUX0VOSCwKIAlbMHgxNF0gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19UUkFJTiwKIAlbMHgxNV0gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19UUkFJTiwKIAlbMHgxNl0gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19UUkFJTiwKQEAgLTE2OTIsNyArMTY5Niw5IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChpYmNsdCA9PSBJQl83MzIyX0xUX1NUQVRFX0NGR1RFU1QgJiYKKwlpZiAoKChpYmNsdCA+PSBJQl83MzIyX0xUX1NUQVRFX0NGR1RFU1QgJiYKKwkgICAgICBpYmNsdCA8PSBJQl83MzIyX0xUX1NUQVRFX0NGR1dBSVRFTkgpIHx8CisJICAgICBpYmNsdCA9PSBJQl83MzIyX0xUX1NUQVRFX0xJTktVUCkgJiYKIAkgICAgKGliY3N0ICYgU1lNX01BU0soSUJDU3RhdHVzQV8wLCBMaW5rU3BlZWRRRFIpKSkgewogCQlmb3JjZV9oMShwcGQpOwogCQlwcGQtPmNwc3BlYy0+cWRyX3JlZm9yY2UgPSAxOwpAQCAtNzMwMSwxMiArNzMwNywxNyBAQAogc3RhdGljIHZvaWQgc2VyZGVzXzczMjJfbG9zX2VuYWJsZShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkLCBpbnQgZW5hYmxlKQogewogCXU2NCBkYXRhID0gcWliX3JlYWRfa3JlZ19wb3J0KHBwZCwga3JwX3NlcmRlc2N0cmwpOwotCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FICIgSUIldToldSBUdXJuaW5nIExPUyAlc1xuIiwKLQkJcHBkLT5kZC0+dW5pdCwgcHBkLT5wb3J0LCAoZW5hYmxlID8gIm9uIiA6ICJvZmYiKSk7Ci0JaWYgKGVuYWJsZSkKKwl1OCBzdGF0ZSA9IFNZTV9GSUVMRChkYXRhLCBJQlNlcmRlc0N0cmxfMCwgUlhMT1NFTik7CisKKwlpZiAoZW5hYmxlICYmICFzdGF0ZSkgeworCQlwcmludGsoS0VSTl9JTkZPIFFJQl9EUlZfTkFNRSAiIElCJXU6JXUgVHVybmluZyBMT1Mgb25cbiIsCisJCQlwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQpOwogCQlkYXRhIHw9IFNZTV9NQVNLKElCU2VyZGVzQ3RybF8wLCBSWExPU0VOKTsKLQllbHNlCisJfSBlbHNlIGlmICghZW5hYmxlICYmIHN0YXRlKSB7CisJCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FICIgSUIldToldSBUdXJuaW5nIExPUyBvZmZcbiIsCisJCQlwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQpOwogCQlkYXRhICY9IH5TWU1fTUFTSyhJQlNlcmRlc0N0cmxfMCwgUlhMT1NFTik7CisJfQogCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfc2VyZGVzY3RybCwgZGF0YSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYwppbmRleCBhNjkzYzU2Li42YWU1N2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbnRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW50ci5jCkBAIC05Niw4ICs5NiwxMiBAQAogCSAqIHN0YXRlcywgb3IgaWYgaXQgdHJhbnNpdGlvbnMgZnJvbSBhbnkgb2YgdGhlIHVwIChJTklUIG9yIGJldHRlcikKIAkgKiBzdGF0ZXMgaW50byBhbnkgb2YgdGhlIGRvd24gc3RhdGVzIChleGNlcHQgbGluayByZWNvdmVyeSksIHRoZW4KIAkgKiBjYWxsIHRoZSBjaGlwLXNwZWNpZmljIGNvZGUgdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb25zLgorCSAqCisJICogcHBkLT5sZmxhZ3MgY291bGQgYmUgMCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBpbnRlcnJ1cHQKKwkgKiBoYW5kbGVycyBoYXMgYmVlbiBjYWxsZWQgYnV0IHRoZSBsaW5rIGlzIGFscmVhZHkgdXAuCiAJICovCi0JaWYgKGxzdGF0ZSA+PSBJQl9QT1JUX0lOSVQgJiYgKHBwZC0+bGZsYWdzICYgUUlCTF9MSU5LRE9XTikgJiYKKwlpZiAobHN0YXRlID49IElCX1BPUlRfSU5JVCAmJgorCSAgICAoIXBwZC0+bGZsYWdzIHx8IChwcGQtPmxmbGFncyAmIFFJQkxfTElOS0RPV04pKSAmJgogCSAgICBsdHN0YXRlID09IElCX1BIWVNQT1JUU1RBVEVfTElOS1VQKSB7CiAJCS8qIHRyYW5zaXRpb25lZCB0byBVUCAqLwogCQlpZiAoZGQtPmZfaWJfdXBkb3duKHBwZCwgMSwgaWJjcykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKaW5kZXggYmUwOTIxZS4uNGNmMjUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9ldmRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwpAQCAtMTExLDcgKzExMSw4IEBACiAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZXZkZXYtPndhaXQpOworCWlmICh0eXBlID09IEVWX1NZTiAmJiBjb2RlID09IFNZTl9SRVBPUlQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZXZkZXYtPndhaXQpOwogfQogCiBzdGF0aWMgaW50IGV2ZGV2X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKaW5kZXggNzVlMTFjNy4uZGEzOGQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwpAQCAtMTc1Niw3ICsxNzU2LDcgQEAKIAl9IGVsc2UgaWYgKHRlc3RfYml0KEFCU19NVF9UUkFDS0lOR19JRCwgZGV2LT5hYnNiaXQpKSB7CiAJCW10X3Nsb3RzID0gZGV2LT5hYnNpbmZvW0FCU19NVF9UUkFDS0lOR19JRF0ubWF4aW11bSAtCiAJCQkgICBkZXYtPmFic2luZm9bQUJTX01UX1RSQUNLSU5HX0lEXS5taW5pbXVtICsgMSwKLQkJY2xhbXAobXRfc2xvdHMsIDIsIDMyKTsKKwkJbXRfc2xvdHMgPSBjbGFtcChtdF9zbG90cywgMiwgMzIpOwogCX0gZWxzZSBpZiAodGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1gsIGRldi0+YWJzYml0KSkgewogCQltdF9zbG90cyA9IDI7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwppbmRleCBmMjNhNzQzLi4zM2QwYmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCkBAIC0yMDksNiArMjA5LDcgQEAKICNlbmRpZgogCQl9CiAJfQorCWlucHV0X3N5bmMob21hcF9rcF9kYXRhLT5pbnB1dCk7CiAJbWVtY3B5KGtleXBhZF9zdGF0ZSwgbmV3X3N0YXRlLCBzaXplb2Yoa2V5cGFkX3N0YXRlKSk7CiAKIAlpZiAoa2V5X2Rvd24pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcG1pYzh4eHgta2V5cGFkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3BtaWM4eHh4LWtleXBhZC5jCmluZGV4IDQwYjAyYWUuLjYyMjljM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcG1pYzh4eHgta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9wbWljOHh4eC1rZXlwYWQuYwpAQCAtNTIwLDcgKzUyMCw4IEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHBtaWM4eHh4X2twX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JY29uc3Qgc3RydWN0IHBtOHh4eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBtZmRfZ2V0X2RhdGEocGRldik7CisJY29uc3Qgc3RydWN0IHBtOHh4eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCWNvbnN0IHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgKmtleW1hcF9kYXRhOwogCXN0cnVjdCBwbWljOHh4eF9rcCAqa3A7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zaF9rZXlzYy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zaF9rZXlzYy5jCmluZGV4IDgzNGNmOTguLjY4NzY3MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc2hfa2V5c2MuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NoX2tleXNjLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlbU0hfS0VZU0NfTU9ERV8zXSA9IHsgMiwgNCwgNyB9LAogCVtTSF9LRVlTQ19NT0RFXzRdID0geyAzLCA2LCA2IH0sCiAJW1NIX0tFWVNDX01PREVfNV0gPSB7IDQsIDYsIDcgfSwKLQlbU0hfS0VZU0NfTU9ERV82XSA9IHsgNSwgNywgNyB9LAorCVtTSF9LRVlTQ19NT0RFXzZdID0geyA1LCA4LCA4IH0sCiB9OwogCiBzdHJ1Y3Qgc2hfa2V5c2NfcHJpdiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvcG1pYzh4eHgtcHdya2V5LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvcG1pYzh4eHgtcHdya2V5LmMKaW5kZXggOTdlMDdlNy4uYjNjZmI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3BtaWM4eHh4LXB3cmtleS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wbWljOHh4eC1wd3JrZXkuYwpAQCAtOTAsNyArOTAsOCBAQAogCXVuc2lnbmVkIGludCBkZWxheTsKIAl1OCBwb25fY250bDsKIAlzdHJ1Y3QgcG1pYzh4eHhfcHdya2V5ICpwd3JrZXk7Ci0JY29uc3Qgc3RydWN0IHBtOHh4eF9wd3JrZXlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBtZmRfZ2V0X2RhdGEocGRldik7CisJY29uc3Qgc3RydWN0IHBtOHh4eF9wd3JrZXlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCiAJaWYgKCFwZGF0YSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwb3dlciBrZXkgcGxhdGZvcm0gZGF0YSBub3Qgc3VwcGxpZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCmluZGV4IDI1N2UwMzMuLjAxMTBiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlpZiAoc2l6ZSA9PSAwKQogCQkJc2l6ZSA9IHhyZXMgPyA6IDE7CiAKLQkJY2xhbXAodmFsdWUsIG1pbiwgbWF4KTsKKwkJdmFsdWUgPSBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpOwogCiAJCW1vdXNlZGV2LT5wYWNrZXQueCA9ICgodmFsdWUgLSBtaW4pICogeHJlcykgLyBzaXplOwogCQltb3VzZWRldi0+cGFja2V0LmFic19ldmVudCA9IDE7CkBAIC0yMDEsNyArMjAxLDcgQEAKIAkJaWYgKHNpemUgPT0gMCkKIAkJCXNpemUgPSB5cmVzID8gOiAxOwogCi0JCWNsYW1wKHZhbHVlLCBtaW4sIG1heCk7CisJCXZhbHVlID0gY2xhbXAodmFsdWUsIG1pbiwgbWF4KTsKIAogCQltb3VzZWRldi0+cGFja2V0LnkgPSB5cmVzIC0gKCh2YWx1ZSAtIG1pbikgKiB5cmVzKSAvIHNpemU7CiAJCW1vdXNlZGV2LT5wYWNrZXQuYWJzX2V2ZW50ID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKaW5kZXggZjM2OTg5Ni4uODc1NWY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKQEAgLTEyMCwyMSArMTIwLDE3IEBACiAgKiAnaW50ZXJydXB0JyByb3V0aW5lLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VycG9ydF9sZGlzY19yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgc2VycG9ydF9sZGlzY19yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gKHN0cnVjdCBzZXJwb3J0KikgdHR5LT5kaXNjX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgY2hfZmxhZ3M7Ci0JaW50IHJldCA9IDA7CiAJaW50IGk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2VycG9ydC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCF0ZXN0X2JpdChTRVJQT1JUX0FDVElWRSwgJnNlcnBvcnQtPmZsYWdzKSkgewotCQlyZXQgPSAtRUlOVkFMOworCWlmICghdGVzdF9iaXQoU0VSUE9SVF9BQ1RJVkUsICZzZXJwb3J0LT5mbGFncykpCiAJCWdvdG8gb3V0OwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXN3aXRjaCAoZnBbaV0pIHsKQEAgLTE1Niw4ICsxNTIsNiBAQAogCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VycG9ydC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldCA9PSAwID8gY291bnQgOiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jCmluZGV4IDU5ZGU2MzguLmUzNTA1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jCkBAIC0xNTYsOCArMTU2LDEwIEBACiAJaWYgKCFjcyB8fCAhdHJ5X21vZHVsZV9nZXQoY3MtPmRyaXZlci0+b3duZXIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNzLT5tdXRleCkpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3MtPm11dGV4KSkgeworCQltb2R1bGVfcHV0KGNzLT5kcml2ZXItPm93bmVyKTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CiAJdHR5LT5kcml2ZXJfZGF0YSA9IGNzOwogCiAJKytjcy0+b3Blbl9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Nlci1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9zZXItZ2lnYXNldC5jCmluZGV4IDFkNDRkNDcuLjg2YTVjNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Nlci1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvc2VyLWdpZ2FzZXQuYwpAQCAtNjc0LDcgKzY3NCw3IEBACiAgKgljZmxhZ3MJYnVmZmVyIGNvbnRhaW5pbmcgZXJyb3IgZmxhZ3MgZm9yIHJlY2VpdmVkIGNoYXJhY3RlcnMgKGlnbm9yZWQpCiAgKgljb3VudAludW1iZXIgb2YgcmVjZWl2ZWQgY2hhcmFjdGVycwogICovCi1zdGF0aWMgdW5zaWduZWQgaW50CitzdGF0aWMgdm9pZAogZ2lnYXNldF90dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCSAgICBjaGFyICpjZmxhZ3MsIGludCBjb3VudCkKIHsKQEAgLTY4MywxMiArNjgzLDEyIEBACiAJc3RydWN0IGluYnVmX3QgKmluYnVmOwogCiAJaWYgKCFjcykKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAlpbmJ1ZiA9IGNzLT5pbmJ1ZjsKIAlpZiAoIWluYnVmKSB7CiAJCWRldl9lcnIoY3MtPmRldiwgIiVzOiBubyBpbmJ1ZlxuIiwgX19mdW5jX18pOwogCQljc19wdXQoY3MpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCX0KIAogCXRhaWwgPSBpbmJ1Zi0+dGFpbDsKQEAgLTcyNSw4ICs3MjUsNiBAQAogCWdpZ19kYmcoREVCVUdfSU5UUiwgIiVzLS0+QkgiLCBfX2Z1bmNfXyk7CiAJZ2lnYXNldF9zY2hlZHVsZV9ldmVudChjcyk7CiAJY3NfcHV0KGNzKTsKLQotCXJldHVybiBjb3VudDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5jCmluZGV4IDNjY2JmZjEuLjcxYThlYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYwpAQCAtMjgzLDYgKzI4Myw3IEBACiAJX3F1ZXVlX2RhdGEoJmRjaC0+ZGV2LkQsIE1QSF9JTkZPUk1BVElPTl9JTkQsIE1JU0ROX0lEX0FOWSwKIAkJc2l6ZW9mKHN0cnVjdCBwaF9pbmZvX2RjaCkgKyBkY2gtPmRldi5ucmJjaGFuICoKIAkJc2l6ZW9mKHN0cnVjdCBwaF9pbmZvX2NoKSwgcGhpLCBHRlBfQVRPTUlDKTsKKwlrZnJlZShwaGkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL0tjb25maWcgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwppbmRleCAyM2YwZDVlLi43MTNkNDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwpAQCAtMSwzICsxLDEwIEBACitjb25maWcgTEVEU19HUElPX1JFR0lTVEVSCisJYm9vbAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHRoZSBmdW5jdGlvbiBncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UuCisJICBBcyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYXJjaCBjb2RlIGl0IG11c3Qgbm90IGJlIGNvbXBpbGVkIGFzIGEKKwkgIG1vZHVsZS4KKwogbWVudWNvbmZpZyBORVdfTEVEUwogCWJvb2wgIkxFRCBTdXBwb3J0IgogCWhlbHAKQEAgLTcsMjIgKzE0LDE0IEBACiAJICBUaGlzIGlzIG5vdCByZWxhdGVkIHRvIHN0YW5kYXJkIGtleWJvYXJkIExFRHMgd2hpY2ggYXJlIGNvbnRyb2xsZWQKIAkgIHZpYSB0aGUgaW5wdXQgc3lzdGVtLgogCitpZiBORVdfTEVEUworCiBjb25maWcgTEVEU19DTEFTUwogCWJvb2wgIkxFRCBDbGFzcyBTdXBwb3J0IgotCWRlcGVuZHMgb24gTkVXX0xFRFMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBsZWQgc3lzZnMgY2xhc3MgaW4gL3N5cy9jbGFzcy9sZWRzLiAgWW91J2xsCiAJICBuZWVkIHRoaXMgdG8gZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggTEVEcy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBMRURTX0dQSU9fUkVHSVNURVIKLQlib29sCi0JaGVscAotCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgdGhlIGZ1bmN0aW9uIGdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZS4KLQkgIEFzIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBhcmNoIGNvZGUgaXQgbXVzdCBub3QgYmUgY29tcGlsZWQgYXMgYQotCSAgbW9kdWxlLgotCi1pZiBORVdfTEVEUwotCiBjb21tZW50ICJMRUQgZHJpdmVycyIKIAogY29uZmlnIExFRFNfODhQTTg2MFgKQEAgLTM5MSw2ICszOTAsNyBAQAogCiBjb25maWcgTEVEU19BU0lDMwogCWJvb2wgIkxFRCBzdXBwb3J0IGZvciB0aGUgSFRDIEFTSUMzIgorCWRlcGVuZHMgb24gTEVEU19DTEFTUwogCWRlcGVuZHMgb24gTUZEX0FTSUMzCiAJZGVmYXVsdCB5CiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwppbmRleCBjMGNmZjY0Li5jYzFkYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwpAQCAtNTkzLDcgKzU5Myw3IEBACiAJCQkJJmxwNTUyMV9sZWRfYXR0cmlidXRlX2dyb3VwKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbHA1NTIxX2luaXRfbGVkKHN0cnVjdCBscDU1MjFfbGVkICpsZWQsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBscDU1MjFfaW5pdF9sZWQoc3RydWN0IGxwNTUyMV9sZWQgKmxlZCwKIAkJCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCWludCBjaGFuLCBzdHJ1Y3QgbHA1NTIxX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewpAQCAtNjM3LDcgKzYzNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbHA1NTIxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBscDU1MjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgbHA1NTIxX2NoaXAJCSpjaGlwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYwppbmRleCBlMTlmZWQyLi41OTcxZTMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMKQEAgLTgyNiw3ICs4MjYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBscDU1MjNfaW5pdF9sZWQoc3RydWN0IGxwNTUyM19sZWQgKmxlZCwgc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIGludCBfX2RldmluaXQgbHA1NTIzX2luaXRfbGVkKHN0cnVjdCBscDU1MjNfbGVkICpsZWQsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgIGludCBjaGFuLCBzdHJ1Y3QgbHA1NTIzX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewogCWNoYXIgbmFtZVszMl07CkBAIC04NzIsNyArODcyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxwNTUyM19kcml2ZXI7CiAKLXN0YXRpYyBpbnQgbHA1NTIzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBscDU1MjNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgbHA1NTIzX2NoaXAJCSpjaGlwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jCmluZGV4IGQ4ZDNhMWUuLmEyYzg3NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk1MzIuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjYTk1MzJfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInBjYTk1M3giLAorCQkubmFtZSA9ICJsZWRzLXBjYTk1M3giLAogCX0sCiAJLnByb2JlID0gcGNhOTUzMl9wcm9iZSwKIAkucmVtb3ZlID0gcGNhOTUzMl9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJpdmVycy9tZC9iaXRtYXAuYwppbmRleCA3MGJkNzM4Li41NzRiMDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKQEAgLTUzNCw2ICs1MzQsODIgQEAKIAlrdW5tYXBfYXRvbWljKHNiLCBLTV9VU0VSMCk7CiB9CiAKKy8qCisgKiBiaXRtYXBfbmV3X2Rpc2tfc2IKKyAqIEBiaXRtYXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNvbWV3aGF0IHRoZSByZXZlcnNlIG9mIGJpdG1hcF9yZWFkX3NiLiAgYml0bWFwX3JlYWRfc2IKKyAqIHJlYWRzIGFuZCB2ZXJpZmllcyB0aGUgb24tZGlzayBiaXRtYXAgc3VwZXJibG9jayBhbmQgcG9wdWxhdGVzIGJpdG1hcF9pbmZvLgorICogVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyAnYml0bWFwX2luZm8nIGFuZCBwb3B1bGF0ZXMgdGhlIG9uLWRpc2sgYml0bWFwCisgKiBzdHJ1Y3R1cmUsIHdoaWNoIGlzIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FeHh4IG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYml0bWFwX25ld19kaXNrX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3sKKwliaXRtYXBfc3VwZXJfdCAqc2I7CisJdW5zaWduZWQgbG9uZyBjaHVua3NpemUsIGRhZW1vbl9zbGVlcCwgd3JpdGVfYmVoaW5kOworCWludCBlcnIgPSAtRUlOVkFMOworCisJYml0bWFwLT5zYl9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKGJpdG1hcC0+c2JfcGFnZSkpIHsKKwkJZXJyID0gUFRSX0VSUihiaXRtYXAtPnNiX3BhZ2UpOworCQliaXRtYXAtPnNiX3BhZ2UgPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKwliaXRtYXAtPnNiX3BhZ2UtPmluZGV4ID0gMDsKKworCXNiID0ga21hcF9hdG9taWMoYml0bWFwLT5zYl9wYWdlLCBLTV9VU0VSMCk7CisKKwlzYi0+bWFnaWMgPSBjcHVfdG9fbGUzMihCSVRNQVBfTUFHSUMpOworCXNiLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIoQklUTUFQX01BSk9SX0hJKTsKKworCWNodW5rc2l6ZSA9IGJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZTsKKwlCVUdfT04oIWNodW5rc2l6ZSk7CisJaWYgKCFpc19wb3dlcl9vZl8yKGNodW5rc2l6ZSkpIHsKKwkJa3VubWFwX2F0b21pYyhzYiwgS01fVVNFUjApOworCQlwcmludGsoS0VSTl9FUlIgImJpdG1hcCBjaHVua3NpemUgbm90IGEgcG93ZXIgb2YgMlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzYi0+Y2h1bmtzaXplID0gY3B1X3RvX2xlMzIoY2h1bmtzaXplKTsKKworCWRhZW1vbl9zbGVlcCA9IGJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcDsKKwlpZiAoIWRhZW1vbl9zbGVlcCB8fAorCSAgICAoZGFlbW9uX3NsZWVwIDwgMSkgfHwgKGRhZW1vbl9zbGVlcCA+IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJDaG9vc2luZyBkYWVtb25fc2xlZXAgZGVmYXVsdCAoNSBzZWMpXG4iKTsKKwkJZGFlbW9uX3NsZWVwID0gNSAqIEhaOworCX0KKwlzYi0+ZGFlbW9uX3NsZWVwID0gY3B1X3RvX2xlMzIoZGFlbW9uX3NsZWVwKTsKKwliaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5kYWVtb25fc2xlZXAgPSBkYWVtb25fc2xlZXA7CisKKwkvKgorCSAqIEZJWE1FOiB3cml0ZV9iZWhpbmQgZm9yIFJBSUQxLiAgSWYgbm90IHNwZWNpZmllZCwgd2hhdAorCSAqIGlzIGEgZ29vZCBjaG9pY2U/ICBXZSBjaG9vc2UgQ09VTlRFUl9NQVggLyAyIGFyYml0cmFyaWx5LgorCSAqLworCXdyaXRlX2JlaGluZCA9IGJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQ7CisJaWYgKHdyaXRlX2JlaGluZCA+IENPVU5URVJfTUFYKQorCQl3cml0ZV9iZWhpbmQgPSBDT1VOVEVSX01BWCAvIDI7CisJc2ItPndyaXRlX2JlaGluZCA9IGNwdV90b19sZTMyKHdyaXRlX2JlaGluZCk7CisJYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCA9IHdyaXRlX2JlaGluZDsKKworCS8qIGtlZXAgdGhlIGFycmF5IHNpemUgZmllbGQgb2YgdGhlIGJpdG1hcCBzdXBlcmJsb2NrIHVwIHRvIGRhdGUgKi8KKwlzYi0+c3luY19zaXplID0gY3B1X3RvX2xlNjQoYml0bWFwLT5tZGRldi0+cmVzeW5jX21heF9zZWN0b3JzKTsKKworCW1lbWNweShzYi0+dXVpZCwgYml0bWFwLT5tZGRldi0+dXVpZCwgMTYpOworCisJYml0bWFwLT5mbGFncyB8PSBCSVRNQVBfU1RBTEU7CisJc2ItPnN0YXRlIHw9IGNwdV90b19sZTMyKEJJVE1BUF9TVEFMRSk7CisJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGJpdG1hcC0+bWRkZXYtPmV2ZW50czsKKwlzYi0+ZXZlbnRzX2NsZWFyZWQgPSBjcHVfdG9fbGU2NChiaXRtYXAtPm1kZGV2LT5ldmVudHMpOworCisJYml0bWFwLT5mbGFncyB8PSBCSVRNQVBfSE9TVEVORElBTjsKKwlzYi0+dmVyc2lvbiA9IGNwdV90b19sZTMyKEJJVE1BUF9NQUpPUl9IT1NURU5ESUFOKTsKKworCWt1bm1hcF9hdG9taWMoc2IsIEtNX1VTRVIwKTsKKworCXJldHVybiAwOworfQorCiAvKiByZWFkIHRoZSBzdXBlcmJsb2NrIGZyb20gdGhlIGJpdG1hcCBmaWxlIGFuZCBpbml0aWFsaXplIHNvbWUgYml0bWFwIGZpZWxkcyAqLwogc3RhdGljIGludCBiaXRtYXBfcmVhZF9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApCiB7CkBAIC01NzUsNyArNjUxLDcgQEAKIAkJcmVhc29uID0gInVucmVjb2duaXplZCBzdXBlcmJsb2NrIHZlcnNpb24iOwogCWVsc2UgaWYgKGNodW5rc2l6ZSA8IDUxMikKIAkJcmVhc29uID0gImJpdG1hcCBjaHVua3NpemUgdG9vIHNtYWxsIjsKLQllbHNlIGlmICgoMSA8PCBmZnoofmNodW5rc2l6ZSkpICE9IGNodW5rc2l6ZSkKKwllbHNlIGlmICghaXNfcG93ZXJfb2ZfMihjaHVua3NpemUpKQogCQlyZWFzb24gPSAiYml0bWFwIGNodW5rc2l6ZSBub3QgYSBwb3dlciBvZiAyIjsKIAllbHNlIGlmIChkYWVtb25fc2xlZXAgPCAxIHx8IGRhZW1vbl9zbGVlcCA+IE1BWF9TQ0hFRFVMRV9USU1FT1VUKQogCQlyZWFzb24gPSAiZGFlbW9uIHNsZWVwIHBlcmlvZCBvdXQgb2YgcmFuZ2UiOwpAQCAtMTA3Niw4ICsxMTUyLDggQEAKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogYml0bWFwIGluaXRpYWxpemVkIGZyb20gZGlzazogIgotCQkicmVhZCAlbHUvJWx1IHBhZ2VzLCBzZXQgJWx1IGJpdHNcbiIsCi0JCWJtbmFtZShiaXRtYXApLCBiaXRtYXAtPmZpbGVfcGFnZXMsIG51bV9wYWdlcywgYml0X2NudCk7CisJICAgICAgICJyZWFkICVsdS8lbHUgcGFnZXMsIHNldCAlbHUgb2YgJWx1IGJpdHNcbiIsCisJICAgICAgIGJtbmFtZShiaXRtYXApLCBiaXRtYXAtPmZpbGVfcGFnZXMsIG51bV9wYWdlcywgYml0X2NudCwgY2h1bmtzKTsKIAogCXJldHVybiAwOwogCkBAIC0xMzMyLDcgKzE0MDgsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlpZiAodW5saWtlbHkoKCpibWMgJiBDT1VOVEVSX01BWCkgPT0gQ09VTlRFUl9NQVgpKSB7CisJCWlmICh1bmxpa2VseShDT1VOVEVSKCpibWMpID09IENPVU5URVJfTUFYKSkgewogCQkJREVGSU5FX1dBSVQoX193YWl0KTsKIAkJCS8qIG5vdGUgdGhhdCBpdCBpcyBzYWZlIHRvIGRvIHRoZSBwcmVwYXJlX3RvX3dhaXQKIAkJCSAqIGFmdGVyIHRoZSB0ZXN0IGFzIGxvbmcgYXMgd2UgZG8gaXQgYmVmb3JlIGRyb3BwaW5nCkBAIC0xNDA0LDEwICsxNDgwLDEwIEBACiAJCQlzeXNmc19ub3RpZnlfZGlyZW50X3NhZmUoYml0bWFwLT5zeXNmc19jYW5fY2xlYXIpOwogCQl9CiAKLQkJaWYgKCFzdWNjZXNzICYmICEgKCpibWMgJiBORUVERURfTUFTSykpCisJCWlmICghc3VjY2VzcyAmJiAhTkVFREVEKCpibWMpKQogCQkJKmJtYyB8PSBORUVERURfTUFTSzsKIAotCQlpZiAoKCpibWMgJiBDT1VOVEVSX01BWCkgPT0gQ09VTlRFUl9NQVgpCisJCWlmIChDT1VOVEVSKCpibWMpID09IENPVU5URVJfTUFYKQogCQkJd2FrZV91cCgmYml0bWFwLT5vdmVyZmxvd193YWl0KTsKIAogCQkoKmJtYyktLTsKQEAgLTE3MjgsOSArMTgwNCwxNiBAQAogCQl2ZnNfZnN5bmMoZmlsZSwgMSk7CiAJfQogCS8qIHJlYWQgc3VwZXJibG9jayBmcm9tIGJpdG1hcCBmaWxlICh0aGlzIHNldHMgbWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSkgKi8KLQlpZiAoIW1kZGV2LT5iaXRtYXBfaW5mby5leHRlcm5hbCkKLQkJZXJyID0gYml0bWFwX3JlYWRfc2IoYml0bWFwKTsKLQllbHNlIHsKKwlpZiAoIW1kZGV2LT5iaXRtYXBfaW5mby5leHRlcm5hbCkgeworCQkvKgorCQkgKiBJZiAnTURfQVJSQVlfRklSU1RfVVNFJyBpcyBzZXQsIHRoZW4gZGV2aWNlLW1hcHBlciBpcworCQkgKiBpbnN0cnVjdGluZyB1cyB0byBjcmVhdGUgYSBuZXcgb24tZGlzayBiaXRtYXAgaW5zdGFuY2UuCisJCSAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1EX0FSUkFZX0ZJUlNUX1VTRSwgJm1kZGV2LT5mbGFncykpCisJCQllcnIgPSBiaXRtYXBfbmV3X2Rpc2tfc2IoYml0bWFwKTsKKwkJZWxzZQorCQkJZXJyID0gYml0bWFwX3JlYWRfc2IoYml0bWFwKTsKKwl9IGVsc2UgewogCQllcnIgPSAwOwogCQlpZiAobWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSA9PSAwIHx8CiAJCSAgICBtZGRldi0+Yml0bWFwX2luZm8uZGFlbW9uX3NsZWVwID09IDApCkBAIC0xNzU0LDkgKzE4MzcsNiBAQAogCWJpdG1hcC0+Y2h1bmtzID0gY2h1bmtzOwogCWJpdG1hcC0+cGFnZXMgPSBwYWdlczsKIAliaXRtYXAtPm1pc3NpbmdfcGFnZXMgPSBwYWdlczsKLQliaXRtYXAtPmNvdW50ZXJfYml0cyA9IENPVU5URVJfQklUUzsKLQotCWJpdG1hcC0+c3luY2NodW5rID0gfjBVTDsKIAogI2lmZGVmIElOSkVDVF9GQVRBTF9GQVVMVF8xCiAJYml0bWFwLT5icCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5oIGIvZHJpdmVycy9tZC9iaXRtYXAuaAppbmRleCBkMGFlYWY0Li5iMmExMjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5oCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmgKQEAgLTg1LDcgKzg1LDYgQEAKIHR5cGVkZWYgX191MTYgYml0bWFwX2NvdW50ZXJfdDsKICNkZWZpbmUgQ09VTlRFUl9CSVRTIDE2CiAjZGVmaW5lIENPVU5URVJfQklUX1NISUZUIDQKLSNkZWZpbmUgQ09VTlRFUl9CWVRFX1JBVElPIChDT1VOVEVSX0JJVFMgLyA4KQogI2RlZmluZSBDT1VOVEVSX0JZVEVfU0hJRlQgKENPVU5URVJfQklUX1NISUZUIC0gMykKIAogI2RlZmluZSBORUVERURfTUFTSyAoKGJpdG1hcF9jb3VudGVyX3QpICgxIDw8IChDT1VOVEVSX0JJVFMgLSAxKSkpCkBAIC0xOTYsMTkgKzE5NSwxMCBAQAogCiAJbWRkZXZfdCAqbWRkZXY7IC8qIHRoZSBtZCBkZXZpY2UgdGhhdCB0aGUgYml0bWFwIGlzIGZvciAqLwogCi0JaW50IGNvdW50ZXJfYml0czsgLyogaG93IG1hbnkgYml0cyBwZXIgYmxvY2sgY291bnRlciAqLwotCiAJLyogYml0bWFwIGNodW5rc2l6ZSAtLSBob3cgbXVjaCBkYXRhIGRvZXMgZWFjaCBiaXQgcmVwcmVzZW50PyAqLwogCXVuc2lnbmVkIGxvbmcgY2h1bmtzaGlmdDsgLyogY2h1bmtzaXplID0gMl5jaHVua3NoaWZ0IChmb3IgYml0b3BzKSAqLwogCXVuc2lnbmVkIGxvbmcgY2h1bmtzOyAvKiB0b3RhbCBudW1iZXIgb2YgZGF0YSBjaHVua3MgZm9yIHRoZSBhcnJheSAqLwogCi0JLyogV2UgaG9sZCBhIGNvdW50IG9uIHRoZSBjaHVuayBjdXJyZW50bHkgYmVpbmcgc3luY2VkLCBhbmQgZHJvcAotCSAqIGl0IHdoZW4gdGhlIGxhc3QgYmxvY2sgaXMgc3RhcnRlZC4gIElmIHRoZSByZXN5bmMgaXMgYWJvcnRlZAotCSAqIG1pZHdheSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRyb3AgdGhhdCBjb3VudCwgc28gd2UgcmVtZW1iZXIKLQkgKiB0aGUgY291bnRlZCBjaHVuay4uCi0JICovCi0JdW5zaWduZWQgbG9uZyBzeW5jY2h1bms7Ci0KIAlfX3U2NAlldmVudHNfY2xlYXJlZDsKIAlpbnQgbmVlZF9zeW5jOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggYWE2NDBhOC4uOTFlMzFlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMzUxLDYgKzM1MSw5IEBACiAJbWRkZXYtPnN1c3BlbmRlZCA9IDA7CiAJd2FrZV91cCgmbWRkZXYtPnNiX3dhaXQpOwogCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKworCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOyAvKiBwb3NzaWJseSBraWNrIG9mZiBhIHJlc2hhcGUgKi8KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1kZGV2X3Jlc3VtZSk7CiAKQEAgLTE3NTAsNiArMTc1MywxOCBAQAogCX0sCiB9OwogCitzdGF0aWMgdm9pZCBzeW5jX3N1cGVyKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQoreworCWlmIChtZGRldi0+c3luY19zdXBlcikgeworCQltZGRldi0+c3luY19zdXBlcihtZGRldiwgcmRldik7CisJCXJldHVybjsKKwl9CisKKwlCVUdfT04obWRkZXYtPm1ham9yX3ZlcnNpb24gPj0gQVJSQVlfU0laRShzdXBlcl90eXBlcykpOworCisJc3VwZXJfdHlwZXNbbWRkZXYtPm1ham9yX3ZlcnNpb25dLnN5bmNfc3VwZXIobWRkZXYsIHJkZXYpOworfQorCiBzdGF0aWMgaW50IG1hdGNoX21kZGV2X3VuaXRzKG1kZGV2X3QgKm1kZGV2MSwgbWRkZXZfdCAqbWRkZXYyKQogewogCW1ka19yZGV2X3QgKnJkZXYsICpyZGV2MjsKQEAgLTE3ODEsOCArMTc5Niw4IEBACiAKIAlpZiAobGlzdF9lbXB0eSgmbWRkZXYtPmRpc2tzKSkKIAkJcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLQlpZiAoYmxrX2dldF9pbnRlZ3JpdHkobWRkZXYtPmdlbmRpc2spKQotCQlyZXR1cm4gMDsgLyogYWxyZWFkeSByZWdpc3RlcmVkICovCisJaWYgKCFtZGRldi0+Z2VuZGlzayB8fCBibGtfZ2V0X2ludGVncml0eShtZGRldi0+Z2VuZGlzaykpCisJCXJldHVybiAwOyAvKiBzaG91bGRuJ3QgcmVnaXN0ZXIsIG9yIGFscmVhZHkgaXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCS8qIHNraXAgc3BhcmVzIGFuZCBub24tZnVuY3Rpb25hbCBkaXNrcyAqLwogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQpAQCAtMjE2OCw4ICsyMTgzLDcgQEAKIAkJCS8qIERvbid0IHVwZGF0ZSB0aGlzIHN1cGVyYmxvY2sgKi8KIAkJCXJkZXYtPnNiX2xvYWRlZCA9IDI7CiAJCX0gZWxzZSB7Ci0JCQlzdXBlcl90eXBlc1ttZGRldi0+bWFqb3JfdmVyc2lvbl0uCi0JCQkJc3luY19zdXBlcihtZGRldiwgcmRldik7CisJCQlzeW5jX3N1cGVyKG1kZGV2LCByZGV2KTsKIAkJCXJkZXYtPnNiX2xvYWRlZCA9IDE7CiAJCX0KIAl9CkBAIC0yNDYyLDcgKzI0NzYsNyBAQAogCQlpZiAocmRldi0+cmFpZF9kaXNrID09IC0xKQogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCS8qIHBlcnNvbmFsaXR5IGRvZXMgYWxsIG5lZWRlZCBjaGVja3MgKi8KLQkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2sgPT0gTlVMTCkKKwkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfcmVtb3ZlX2Rpc2sgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQllcnIgPSByZGV2LT5tZGRldi0+cGVycy0+CiAJCQlob3RfcmVtb3ZlX2Rpc2socmRldi0+bWRkZXYsIHJkZXYtPnJhaWRfZGlzayk7CkBAIC00NjE5LDkgKzQ2MzMsNiBAQAogCWlmIChtZGRldi0+ZmxhZ3MpCiAJCW1kX3VwZGF0ZV9zYihtZGRldiwgMCk7CiAKLQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwotCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsgLyogcG9zc2libHkga2ljayBvZmYgYSByZXNoYXBlICovCi0KIAltZF9uZXdfZXZlbnQobWRkZXYpOwogCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZShtZGRldi0+c3lzZnNfc3RhdGUpOwogCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZShtZGRldi0+c3lzZnNfYWN0aW9uKTsKQEAgLTQ2NDIsNiArNDY1MywxMCBAQAogCQliaXRtYXBfZGVzdHJveShtZGRldik7CiAJCWdvdG8gb3V0OwogCX0KKworCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOyAvKiBwb3NzaWJseSBraWNrIG9mZiBhIHJlc2hhcGUgKi8KKwogCXNldF9jYXBhY2l0eShtZGRldi0+Z2VuZGlzaywgbWRkZXYtPmFycmF5X3NlY3RvcnMpOwogCXJldmFsaWRhdGVfZGlzayhtZGRldi0+Z2VuZGlzayk7CiAJbWRkZXYtPmNoYW5nZWQgPSAxOwpAQCAtNTI1OSw2ICs1Mjc0LDggQEAKIAkJaWYgKG1kZGV2LT5kZWdyYWRlZCkKIAkJCXNldF9iaXQoTURfUkVDT1ZFUllfUkVDT1ZFUiwgJm1kZGV2LT5yZWNvdmVyeSk7CiAJCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKKwkJaWYgKCFlcnIpCisJCQltZF9uZXdfZXZlbnQobWRkZXYpOwogCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTY4NjYsOCArNjg4Myw4IEBACiAJICogVHVuZSByZWNvbnN0cnVjdGlvbjoKIAkgKi8KIAl3aW5kb3cgPSAzMiooUEFHRV9TSVpFLzUxMik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHVzaW5nICVkayB3aW5kb3csIG92ZXIgYSB0b3RhbCBvZiAlbGx1IGJsb2Nrcy5cbiIsCi0JCXdpbmRvdy8yLCh1bnNpZ25lZCBsb25nIGxvbmcpIG1heF9zZWN0b3JzLzIpOworCXByaW50ayhLRVJOX0lORk8gIm1kOiB1c2luZyAlZGsgd2luZG93LCBvdmVyIGEgdG90YWwgb2YgJWxsdWsuXG4iLAorCQl3aW5kb3cvMiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfc2VjdG9ycy8yKTsKIAogCWF0b21pY19zZXQoJm1kZGV2LT5yZWNvdmVyeV9hY3RpdmUsIDApOwogCWxhc3RfY2hlY2sgPSAwOwpAQCAtNzA0NSw3ICs3MDYyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1kX2RvX3N5bmMpOwogCi0KIHN0YXRpYyBpbnQgcmVtb3ZlX2FuZF9hZGRfc3BhcmVzKG1kZGV2X3QgKm1kZGV2KQogewogCW1ka19yZGV2X3QgKnJkZXY7CkBAIC03MDcyLDYgKzcwODgsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQmxvY2tlZCwgJnJkZXYtPmZsYWdzKSkKIAkJCQlzcGFyZXMrKzsKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwCkBAIC03MTU3LDYgKzcxNzQsOSBAQAogICovCiB2b2lkIG1kX2NoZWNrX3JlY292ZXJ5KG1kZGV2X3QgKm1kZGV2KQogeworCWlmIChtZGRldi0+c3VzcGVuZGVkKQorCQlyZXR1cm47CisKIAlpZiAobWRkZXYtPmJpdG1hcCkKIAkJYml0bWFwX2RhZW1vbl93b3JrKG1kZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5oIGIvZHJpdmVycy9tZC9tZC5oCmluZGV4IDBiMWZkM2YuLjFjMjZjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuaAorKysgYi9kcml2ZXJzL21kL21kLmgKQEAgLTEyNCw2ICsxMjQsNyBAQAogI2RlZmluZSBNRF9DSEFOR0VfREVWUwkwCS8qIFNvbWUgZGV2aWNlIHN0YXR1cyBoYXMgY2hhbmdlZCAqLwogI2RlZmluZSBNRF9DSEFOR0VfQ0xFQU4gMQkvKiB0cmFuc2l0aW9uIHRvIG9yIGZyb20gJ2NsZWFuJyAqLwogI2RlZmluZSBNRF9DSEFOR0VfUEVORElORyAyCS8qIHN3aXRjaCBmcm9tICdjbGVhbicgdG8gJ2FjdGl2ZScgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgTURfQVJSQVlfRklSU1RfVVNFIDMgICAgLyogRmlyc3QgdXNlIG9mIGFycmF5LCBuZWVkcyBpbml0aWFsaXphdGlvbiAqLwogCiAJaW50CQkJCXN1c3BlbmRlZDsKIAlhdG9taWNfdAkJCWFjdGl2ZV9pbzsKQEAgLTMzMCw2ICszMzEsNyBAQAogCWF0b21pY190IGZsdXNoX3BlbmRpbmc7CiAJc3RydWN0IHdvcmtfc3RydWN0IGZsdXNoX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IGV2ZW50X3dvcms7CS8qIHVzZWQgYnkgZG0gdG8gcmVwb3J0IGZhaWx1cmUgZXZlbnQgKi8KKwl2b2lkICgqc3luY19zdXBlcikobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpOwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggNWQwOTYwOS4uZjc0MzFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtNDk3LDIxICs0OTcsMTkgQEAKIAlyZXR1cm4gYmVzdF9kaXNrOwogfQogCi1zdGF0aWMgaW50IHJhaWQxX2Nvbmdlc3RlZCh2b2lkICpkYXRhLCBpbnQgYml0cykKK2ludCBtZF9yYWlkMV9jb25nZXN0ZWQobWRkZXZfdCAqbWRkZXYsIGludCBiaXRzKQogewotCW1kZGV2X3QgKm1kZGV2ID0gZGF0YTsKIAljb25mX3QgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChtZGRldl9jb25nZXN0ZWQobWRkZXYsIGJpdHMpKQotCQlyZXR1cm4gMTsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm1pcnJvcnNbaV0ucmRldik7CiAJCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKIAkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUocmRldi0+YmRldik7CiAKKwkJCUJVR19PTighcSk7CisKIAkJCS8qIE5vdGUgdGhlICd8fCAxJyAtIHdoZW4gcmVhZF9iYWxhbmNlIHByZWZlcnMKIAkJCSAqIG5vbi1jb25nZXN0ZWQgdGFyZ2V0cywgaXQgY2FuIGJlIHJlbW92ZWQKIAkJCSAqLwpAQCAtNTI0LDcgKzUyMiwxNSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChtZF9yYWlkMV9jb25nZXN0ZWQpOwogCitzdGF0aWMgaW50IHJhaWQxX2Nvbmdlc3RlZCh2b2lkICpkYXRhLCBpbnQgYml0cykKK3sKKwltZGRldl90ICptZGRldiA9IGRhdGE7CisKKwlyZXR1cm4gbWRkZXZfY29uZ2VzdGVkKG1kZGV2LCBiaXRzKSB8fAorCQltZF9yYWlkMV9jb25nZXN0ZWQobWRkZXYsIGJpdHMpOworfQogCiBzdGF0aWMgdm9pZCBmbHVzaF9wZW5kaW5nX3dyaXRlcyhjb25mX3QgKmNvbmYpCiB7CkBAIC0xOTcyLDYgKzE5NzgsOCBAQAogCQlyZXR1cm4gUFRSX0VSUihjb25mKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKKwkJaWYgKCFtZGRldi0+Z2VuZGlzaykKKwkJCWNvbnRpbnVlOwogCQlkaXNrX3N0YWNrX2xpbWl0cyhtZGRldi0+Z2VuZGlzaywgcmRldi0+YmRldiwKIAkJCQkgIHJkZXYtPmRhdGFfb2Zmc2V0IDw8IDkpOwogCQkvKiBhcyB3ZSBkb24ndCBob25vdXIgbWVyZ2VfYnZlY19mbiwgd2UgbXVzdCBuZXZlciByaXNrCkBAIC0yMDEzLDggKzIwMjEsMTAgQEAKIAogCW1kX3NldF9hcnJheV9zZWN0b3JzKG1kZGV2LCByYWlkMV9zaXplKG1kZGV2LCAwLCAwKSk7CiAKLQltZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2ZuID0gcmFpZDFfY29uZ2VzdGVkOwotCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZGF0YSA9IG1kZGV2OworCWlmIChtZGRldi0+cXVldWUpIHsKKwkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IHJhaWQxX2Nvbmdlc3RlZDsKKwkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9kYXRhID0gbWRkZXY7CisJfQogCXJldHVybiBtZF9pbnRlZ3JpdHlfcmVnaXN0ZXIobWRkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmggYi9kcml2ZXJzL21kL3JhaWQxLmgKaW5kZXggNWZjNGNhMS4uZTc0M2E2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5oCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuaApAQCAtMTI2LDQgKzEyNiw2IEBACiAgKi8KICNkZWZpbmUJUjFCSU9fUmV0dXJuZWQgNgogCitleHRlcm4gaW50IG1kX3JhaWQxX2Nvbmdlc3RlZChtZGRldl90ICptZGRldiwgaW50IGJpdHMpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCAzNDZlNjliLi5iNzJlZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHJhaWQ1X3NldF9iaV9od19zZWdtZW50cyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBjbnQpCiB7Ci0JYmlvLT5iaV9waHlzX3NlZ21lbnRzID0gcmFpZDVfYmlfcGh5c19zZWdtZW50cyhiaW8pIHx8IChjbnQgPDwgMTYpOworCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IHJhaWQ1X2JpX3BoeXNfc2VnbWVudHMoYmlvKSB8IChjbnQgPDwgMTYpOwogfQogCiAvKiBGaW5kIGZpcnN0IGRhdGEgZGlzayBpbiBhIHJhaWQ2IHN0cmlwZSAqLwpAQCAtNTE0LDcgKzUxNCw3IEBACiAJCWJpID0gJnNoLT5kZXZbaV0ucmVxOwogCiAJCWJpLT5iaV9ydyA9IHJ3OwotCQlpZiAocncgPT0gV1JJVEUpCisJCWlmIChydyAmIFdSSVRFKQogCQkJYmktPmJpX2VuZF9pbyA9IHJhaWQ1X2VuZF93cml0ZV9yZXF1ZXN0OwogCQllbHNlCiAJCQliaS0+YmlfZW5kX2lvID0gcmFpZDVfZW5kX3JlYWRfcmVxdWVzdDsKQEAgLTU0OCwxMyArNTQ4LDEzIEBACiAJCQliaS0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IDA7CiAJCQliaS0+Ymlfc2l6ZSA9IFNUUklQRV9TSVpFOwogCQkJYmktPmJpX25leHQgPSBOVUxMOwotCQkJaWYgKHJ3ID09IFdSSVRFICYmCisJCQlpZiAoKHJ3ICYgV1JJVEUpICYmCiAJCQkgICAgdGVzdF9iaXQoUjVfUmVXcml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQogCQkJCWF0b21pY19hZGQoU1RSSVBFX1NFQ1RPUlMsCiAJCQkJCSZyZGV2LT5jb3JyZWN0ZWRfZXJyb3JzKTsKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChydyA9PSBXUklURSkKKwkJCWlmIChydyAmIFdSSVRFKQogCQkJCXNldF9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKTsKIAkJCXByX2RlYnVnKCJza2lwIG9wICVsZCBvbiBkaXNjICVkIGZvciBzZWN0b3IgJWxsdVxuIiwKIAkJCQliaS0+YmlfcncsIGksICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CkBAIC01ODUsNyArNTg1LDcgQEAKIAlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCBmbGFncywgdHgsIE5VTEwsIE5VTEwsIE5VTEwpOwogCiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBiaW8sIGkpIHsKLQkJaW50IGxlbiA9IGJpb19pb3ZlY19pZHgoYmlvLCBpKS0+YnZfbGVuOworCQlpbnQgbGVuID0gYnZsLT5idl9sZW47CiAJCWludCBjbGVuOwogCQlpbnQgYl9vZmZzZXQgPSAwOwogCkBAIC02MDEsOCArNjAxLDggQEAKIAkJCWNsZW4gPSBsZW47CiAKIAkJaWYgKGNsZW4gPiAwKSB7Ci0JCQliX29mZnNldCArPSBiaW9faW92ZWNfaWR4KGJpbywgaSktPmJ2X29mZnNldDsKLQkJCWJpb19wYWdlID0gYmlvX2lvdmVjX2lkeChiaW8sIGkpLT5idl9wYWdlOworCQkJYl9vZmZzZXQgKz0gYnZsLT5idl9vZmZzZXQ7CisJCQliaW9fcGFnZSA9IGJ2bC0+YnZfcGFnZTsKIAkJCWlmIChmcm9tYmlvKQogCQkJCXR4ID0gYXN5bmNfbWVtY3B5KHBhZ2UsIGJpb19wYWdlLCBwYWdlX29mZnNldCwKIAkJCQkJCSAgYl9vZmZzZXQsIGNsZW4sICZzdWJtaXQpOwpAQCAtNDg1OCw3ICs0ODU4LDcgQEAKIAkJCXByaW50ayhLRVJOX0lORk8gIm1kL3JhaWQ6JXM6IGRldmljZSAlcyBvcGVyYXRpb25hbCBhcyByYWlkIgogCQkJICAgICAgICIgZGlzayAlZFxuIiwKIAkJCSAgICAgICBtZG5hbWUobWRkZXYpLCBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSwgcmFpZF9kaXNrKTsKLQkJfSBlbHNlCisJCX0gZWxzZSBpZiAocmRldi0+c2F2ZWRfcmFpZF9kaXNrICE9IHJhaWRfZGlzaykKIAkJCS8qIENhbm5vdCByZWx5IG9uIGJpdG1hcCB0byBjb21wbGV0ZSByZWNvdmVyeSAqLwogCQkJY29uZi0+ZnVsbHN5bmMgPSAxOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggOTgyNzgwNC4uNWI2YjQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTE5ODgsNiArMTk4OCwxNCBAQAogCWlmIChkdmJkZXYtPnVzZXJzID09IC0xICYmIGZlLT5vcHMudHNfYnVzX2N0cmwpIHsKIAkJaWYgKChyZXQgPSBmZS0+b3BzLnRzX2J1c19jdHJsKGZlLCAxKSkgPCAwKQogCQkJZ290byBlcnIwOworCisJCS8qIElmIHdlIHRvb2sgY29udHJvbCBvZiB0aGUgYnVzLCB3ZSBuZWVkIHRvIGZvcmNlCisJCSAgIHJlaW5pdGlhbGl6YXRpb24uICBUaGlzIGlzIGJlY2F1c2UgbWFueSB0c19idXNfY3RybCgpCisJCSAgIGZ1bmN0aW9ucyBzdHJvYmUgdGhlIFJFU0VUIHBpbiBvbiB0aGUgZGVtb2QsIGFuZCBpZiB0aGUKKwkJICAgZnJvbnRlbmQgdGhyZWFkIGFscmVhZHkgZXhpc3RzIHRoZW4gdGhlIGR2Yl9pbml0KCkgcm91dGluZQorCQkgICB3b24ndCBnZXQgY2FsbGVkICh3aGljaCBpcyB3aGF0IHVzdWFsbHkgZG9lcyBpbml0aWFsCisJCSAgIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24pLiAqLworCQlmZXByaXYtPnJlaW5pdGlhbGlzZSA9IDE7CiAJfQogCiAJaWYgKChyZXQgPSBkdmJfZ2VuZXJpY19vcGVuIChpbm9kZSwgZmlsZSkpIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCmluZGV4IDRkYzFjYTMuLjdjMzI3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwpAQCAtNjAsOCArNjAsNiBAQAogCWludCBhY3RfbGVuLCByZXQ7CiAJdTggYnVmWzY0XTsKIAotCWlmIChzbGVuID4gc2l6ZW9mKGJ1ZikpCi0JCXNsZW4gPSBzaXplb2YoYnVmKTsKIAltZW1jcHkoJmJ1ZlswXSwgc2J1Ziwgc2xlbik7CiAJYnVmWzYwXSA9IHN0YXRlLT5zZXErKzsKIApAQCAtMTgwLDMwICsxNzgsMzcgQEAKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCWludCByZXQgPSAwLCBpbmMsIGkgPSAwOworCXU4IGJ1Zls1Ml07IC8qIDQgKyA0OCAoSTJDIFdSIFVTQiBjb21tYW5kIGhlYWRlciArIEkyQyBXUiBtYXgpICovCiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAl3aGlsZSAoaSA8IG51bSkgewogCQlpZiAobnVtID4gaSArIDEgJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7Ci0JCQl1OCBidWZbNl07CisJCQlpZiAobXNnW2ldLmxlbiA+IDIgfHwgbXNnW2krMV0ubGVuID4gNjApIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWJ1ZlswXSA9IENNRF9JMkNfUkVBRDsKIAkJCWJ1ZlsxXSA9IChtc2dbaV0uYWRkciA8PCAxKSB8IDB4MDE7CiAJCQlidWZbMl0gPSBtc2dbaV0uYnVmWzBdOwogCQkJYnVmWzNdID0gbXNnW2ldLmJ1ZlsxXTsKIAkJCWJ1Zls0XSA9IG1zZ1tpXS5sZW4tMTsKIAkJCWJ1Zls1XSA9IG1zZ1tpKzFdLmxlbjsKLQkJCXJldCA9IGFueXNlZV9jdHJsX21zZyhkLCBidWYsIHNpemVvZihidWYpLCBtc2dbaSsxXS5idWYsCisJCQlyZXQgPSBhbnlzZWVfY3RybF9tc2coZCwgYnVmLCA2LCBtc2dbaSsxXS5idWYsCiAJCQkJbXNnW2krMV0ubGVuKTsKIAkJCWluYyA9IDI7CiAJCX0gZWxzZSB7Ci0JCQl1OCBidWZbNCttc2dbaV0ubGVuXTsKKwkJCWlmIChtc2dbaV0ubGVuID4gNDgpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWJ1ZlswXSA9IENNRF9JMkNfV1JJVEU7CiAJCQlidWZbMV0gPSAobXNnW2ldLmFkZHIgPDwgMSk7CiAJCQlidWZbMl0gPSBtc2dbaV0ubGVuOwogCQkJYnVmWzNdID0gMHgwMTsKIAkJCW1lbWNweSgmYnVmWzRdLCBtc2dbaV0uYnVmLCBtc2dbaV0ubGVuKTsKLQkJCXJldCA9IGFueXNlZV9jdHJsX21zZyhkLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKKwkJCXJldCA9IGFueXNlZV9jdHJsX21zZyhkLCBidWYsIDQgKyBtc2dbaV0ubGVuLCBOVUxMLCAwKTsKIAkJCWluYyA9IDE7CiAJCX0KIAkJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvbWVkaWEtZGV2bm9kZS5jIGIvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZub2RlLmMKaW5kZXggYWY1MjYzYy4uN2I0MmFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZub2RlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZub2RlLmMKQEAgLTIxMywxNCArMjEzLDE0IEBACiAKIAkvKiBQYXJ0IDE6IEZpbmQgYSBmcmVlIG1pbm9yIG51bWJlciAqLwogCW11dGV4X2xvY2soJm1lZGlhX2Rldm5vZGVfbG9jayk7Ci0JbWlub3IgPSBmaW5kX25leHRfemVyb19iaXQobWVkaWFfZGV2bm9kZV9udW1zLCAwLCBNRURJQV9OVU1fREVWSUNFUyk7CisJbWlub3IgPSBmaW5kX25leHRfemVyb19iaXQobWVkaWFfZGV2bm9kZV9udW1zLCBNRURJQV9OVU1fREVWSUNFUywgMCk7CiAJaWYgKG1pbm9yID09IE1FRElBX05VTV9ERVZJQ0VTKSB7CiAJCW11dGV4X3VubG9jaygmbWVkaWFfZGV2bm9kZV9sb2NrKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgZ2V0IGEgZnJlZSBtaW5vclxuIik7CiAJCXJldHVybiAtRU5GSUxFOwogCX0KIAotCXNldF9iaXQobWRldi0+bWlub3IsIG1lZGlhX2Rldm5vZGVfbnVtcyk7CisJc2V0X2JpdChtaW5vciwgbWVkaWFfZGV2bm9kZV9udW1zKTsKIAltdXRleF91bmxvY2soJm1lZGlhX2Rldm5vZGVfbG9jayk7CiAKIAltZGV2LT5taW5vciA9IG1pbm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCmluZGV4IGU0Yzk3ZmQuLjUyNzk4YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiBjb25maWcgUkFESU9fTUlST1BDTTIwCiAJdHJpc3RhdGUgIm1pcm9TT1VORCBQQ00yMCByYWRpbyIKLQlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwyICYmIFNORAorCWRlcGVuZHMgb24gSVNBICYmIElTQV9ETUFfQVBJICYmIFZJREVPX1Y0TDIgJiYgU05ECiAJc2VsZWN0IFNORF9JU0EKIAlzZWxlY3QgU05EX01JUk8KIAktLS1oZWxwLS0tCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogY29uZmlnIFJBRElPX1NGMTZGTVIyCiAJdHJpc3RhdGUgIlNGMTZGTVIyIFJhZGlvIgotCWRlcGVuZHMgb24gSVNBICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwyICYmIFNORAogCS0tLWhlbHAtLS0KIAkgIENob29zZSBZIGhlcmUgaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIEZNIHJhZGlvIGNhcmRzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2ZpbnRlay1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCmluZGV4IDhmYTUzOWQuLjdmNzA3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCkBAIC01OTcsMTIgKzU5NywxNyBAQAogc3RhdGljIGludCBmaW50ZWtfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBmaW50ZWtfZGV2ICpmaW50ZWsgPSBwbnBfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZpdF9kYmcoIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZmaW50ZWstPmZpbnRla19sb2NrLCBmbGFncyk7CisKIAkvKiBkaXNhYmxlIGFsbCBDSVIgaW50ZXJydXB0cyAqLwogCWZpbnRla19jaXJfcmVnX3dyaXRlKGZpbnRlaywgQ0lSX1NUQVRVU19JUlFfTUFTSywgQ0lSX1NUQVRVUyk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW50ZWstPmZpbnRla19sb2NrLCBmbGFncyk7CisKIAlmaW50ZWtfY29uZmlnX21vZGVfZW5hYmxlKGZpbnRlayk7CiAKIAkvKiBkaXNhYmxlIGNpciBsb2dpY2FsIGRldiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwppbmRleCAzZjNjNzA3Li42YmMzNWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2ltb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwpAQCAtMzA3LDYgKzMwNywxNCBAQAogCS8qIDB4ZmZkYyBpTU9OIE1DRSBWRkQgKi8KIAl7IDB4MDAwMTAwMDBmZmZmZmZlZWxsLCBLRVlfVk9MVU1FVVAgfSwKIAl7IDB4MDEwMDAwMDBmZmZmZmZlZWxsLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMDAwMDAwMWZmZmZmZmVlbGwsIEtFWV9NVVRFIH0sCisJeyAweDAwMDAwMDBmZmZmZmZmZWVsbCwgS0VZX01FRElBIH0sCisJeyAweDAwMDAwMDEyZmZmZmZmZWVsbCwgS0VZX1VQIH0sCisJeyAweDAwMDAwMDEzZmZmZmZmZWVsbCwgS0VZX0RPV04gfSwKKwl7IDB4MDAwMDAwMTRmZmZmZmZlZWxsLCBLRVlfTEVGVCB9LAorCXsgMHgwMDAwMDAxNWZmZmZmZmVlbGwsIEtFWV9SSUdIVCB9LAorCXsgMHgwMDAwMDAxNmZmZmZmZmVlbGwsIEtFWV9FTlRFUiB9LAorCXsgMHgwMDAwMDAxN2ZmZmZmZmVlbGwsIEtFWV9FU0MgfSwKIAkvKiBpTU9OIEtub2IgdmFsdWVzICovCiAJeyAweDAwMDEwMGZmZmZmZmZmZWVsbCwgS0VZX1ZPTFVNRVVQIH0sCiAJeyAweDAxMDAwMGZmZmZmZmZmZWVsbCwgS0VZX1ZPTFVNRURPV04gfSwKQEAgLTE1ODIsMTYgKzE1OTAsMTYgQEAKIAkvKiBPbmx5IHBhbmVsIHR5cGUgZXZlbnRzIGxlZnQgdG8gcHJvY2VzcyBub3cgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWN0eC0+a2NfbG9jaywgZmxhZ3MpOwogCisJZG9fZ2V0dGltZW9mZGF5KCZ0KTsKIAkvKiBLRVlfTVVURSByZXBlYXRzIGZyb20ga25vYiBuZWVkIHRvIGJlIHN1cHByZXNzZWQgKi8KIAlpZiAoaWN0eC0+a2MgPT0gS0VZX01VVEUgJiYgaWN0eC0+a2MgPT0gaWN0eC0+bGFzdF9rZXljb2RlKSB7Ci0JCWRvX2dldHRpbWVvZmRheSgmdCk7CiAJCW1zZWMgPSB0djJpbnQoJnQsICZwcmV2X3RpbWUpOwotCQlwcmV2X3RpbWUgPSB0OwogCQlpZiAobXNlYyA8IGljdHgtPmlkZXYtPnJlcFtSRVBfREVMQVldKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY3R4LT5rY19sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CisJcHJldl90aW1lID0gdDsKIAlrYyA9IGljdHgtPmtjOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWN0eC0+a2NfbG9jaywgZmxhZ3MpOwpAQCAtMTYwMyw3ICsxNjExLDkgQEAKIAlpbnB1dF9yZXBvcnRfa2V5KGljdHgtPmlkZXYsIGtjLCAwKTsKIAlpbnB1dF9zeW5jKGljdHgtPmlkZXYpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmljdHgtPmtjX2xvY2ssIGZsYWdzKTsKIAlpY3R4LT5sYXN0X2tleWNvZGUgPSBrYzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY3R4LT5rY19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm47CiAKQEAgLTE3NDAsNiArMTc1MCw4IEBACiAJCWRldGVjdGVkX2Rpc3BsYXlfdHlwZSA9IElNT05fRElTUExBWV9UWVBFX1ZGRDsKIAkJYnJlYWs7CiAJLyogaU1PTiBWRkQsIE1DRSBJUiAqLworCWNhc2UgMHg0NjoKKwljYXNlIDB4N2U6CiAJY2FzZSAweDllOgogCQlkZXZfaW5mbyhpY3R4LT5kZXYsICIweGZmZGMgaU1PTiBWRkQsIE1DRSBJUiIpOwogCQlkZXRlY3RlZF9kaXNwbGF5X3R5cGUgPSBJTU9OX0RJU1BMQVlfVFlQRV9WRkQ7CkBAIC0xNzU1LDYgKzE3NjcsOSBAQAogCQlkZXZfaW5mbyhpY3R4LT5kZXYsICJVbmtub3duIDB4ZmZkYyBkZXZpY2UsICIKIAkJCSAiZGVmYXVsdGluZyB0byBWRkQgYW5kIGlNT04gSVIiKTsKIAkJZGV0ZWN0ZWRfZGlzcGxheV90eXBlID0gSU1PTl9ESVNQTEFZX1RZUEVfVkZEOworCQkvKiBXZSBkb24ndCBrbm93IHdoaWNoIG9uZSBpdCBpcywgYWxsb3cgdXNlciB0byBzZXQgdGhlCisJCSAqIFJDNiBvbmUgZnJvbSB1c2Vyc3BhY2UgaWYgT1RIRVIgd2Fzbid0IGNvcnJlY3QuICovCisJCWFsbG93ZWRfcHJvdG9zIHw9IFJDX1RZUEVfUkM2OwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCmluZGV4IDExYzE5ZDguLjQyM2VkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYwpAQCAtMTE0LDE4ICsxMTQsMjAgQEAKIAlzNjQJCQlkZWx0YTsgLyogbnMgKi8KIAlERUZJTkVfSVJfUkFXX0VWRU5UKGV2KTsKIAlpbnQJCQlyYyA9IDA7CisJaW50CQkJZGVsYXk7CiAKIAlpZiAoIWRldi0+cmF3KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5vdyA9IGt0aW1lX2dldCgpOwogCWRlbHRhID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKG5vdywgZGV2LT5yYXctPmxhc3RfZXZlbnQpKTsKKwlkZWxheSA9IE1TX1RPX05TKGRldi0+aW5wdXRfZGV2LT5yZXBbUkVQX0RFTEFZXSk7CiAKIAkvKiBDaGVjayBmb3IgYSBsb25nIGR1cmF0aW9uIHNpbmNlIGxhc3QgZXZlbnQgb3IgaWYgd2UncmUKIAkgKiBiZWluZyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBub3RlIHRoYXQgZGVsdGEgY2FuJ3QKIAkgKiBwb3NzaWJseSBiZSBuZWdhdGl2ZS4KIAkgKi8KLQlpZiAoZGVsdGEgPiBJUl9NQVhfRFVSQVRJT04gfHwgIWRldi0+cmF3LT5sYXN0X3R5cGUpCisJaWYgKGRlbHRhID4gZGVsYXkgfHwgIWRldi0+cmF3LT5sYXN0X3R5cGUpCiAJCXR5cGUgfD0gSVJfU1RBUlRfRVZFTlQ7CiAJZWxzZQogCQlldi5kdXJhdGlvbiA9IGRlbHRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYwppbmRleCBlNzE2YjkzLi5lY2QzZDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYwpAQCAtMTM0Nyw2ICsxMzQ3LDcgQEAKIAl7CS8qIDA6IElURTg3MDQgKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MDQgQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4N19JT1JFR19MRU5HVEgsCisJICAgICAgIC5pb19yc3JjX25vID0gMCwKIAkgICAgICAgLmh3X3R4X2NhcGFibGUgPSB0cnVlLAogCSAgICAgICAuc2FtcGxlX3BlcmlvZCA9ICh1MzIpICgxMDAwMDAwMDAwVUxMIC8gMTE1MjAwKSwKIAkgICAgICAgLnR4X2NhcnJpZXJfZnJlcSA9IDM4MDAwLApAQCAtMTM3MSw2ICsxMzcyLDcgQEAKIAl7CS8qIDE6IElURTg3MTMgKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MTMgQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4N19JT1JFR19MRU5HVEgsCisJICAgICAgIC5pb19yc3JjX25vID0gMCwKIAkgICAgICAgLmh3X3R4X2NhcGFibGUgPSB0cnVlLAogCSAgICAgICAuc2FtcGxlX3BlcmlvZCA9ICh1MzIpICgxMDAwMDAwMDAwVUxMIC8gMTE1MjAwKSwKIAkgICAgICAgLnR4X2NhcnJpZXJfZnJlcSA9IDM4MDAwLApAQCAtMTM5NSw2ICsxMzk3LDcgQEAKIAl7CS8qIDI6IElURTg3MDggKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MDggQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4NzA4X0lPUkVHX0xFTkdUSCwKKwkgICAgICAgLmlvX3JzcmNfbm8gPSAwLAogCSAgICAgICAuaHdfdHhfY2FwYWJsZSA9IHRydWUsCiAJICAgICAgIC5zYW1wbGVfcGVyaW9kID0gKHUzMikgKDEwMDAwMDAwMDBVTEwgLyAxMTUyMDApLAogCSAgICAgICAudHhfY2Fycmllcl9mcmVxID0gMzgwMDAsCkBAIC0xNDIwLDYgKzE0MjMsNyBAQAogCXsJLyogMzogSVRFODcwOSAqLwogCSAgICAgICAubW9kZWwgPSAiSVRFODcwOSBDSVIgdHJhbnNjZWl2ZXIiLAogCSAgICAgICAuaW9fcmVnaW9uX3NpemUgPSBJVDg3MDlfSU9SRUdfTEVOR1RILAorCSAgICAgICAuaW9fcnNyY19ubyA9IDIsCiAJICAgICAgIC5od190eF9jYXBhYmxlID0gdHJ1ZSwKIAkgICAgICAgLnNhbXBsZV9wZXJpb2QgPSAodTMyKSAoMTAwMDAwMDAwMFVMTCAvIDExNTIwMCksCiAJICAgICAgIC50eF9jYXJyaWVyX2ZyZXEgPSAzODAwMCwKQEAgLTE0NjEsNiArMTQ2NSw3IEBACiAJc3RydWN0IHJjX2RldiAqcmRldiA9IE5VTEw7CiAJaW50IHJldCA9IC1FTk9NRU07CiAJaW50IG1vZGVsX25vOworCWludCBpb19yc3JjX25vOwogCiAJaXRlX2RiZygiJXMgY2FsbGVkIiwgX19mdW5jX18pOwogCkBAIC0xNDkwLDEwICsxNDk1LDExIEBACiAKIAkvKiBnZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZGV2aWNlICovCiAJZGV2X2Rlc2MgPSAmaXRlX2Rldl9kZXNjc1ttb2RlbF9ub107CisJaW9fcnNyY19ubyA9IGRldl9kZXNjLT5pb19yc3JjX25vOwogCiAJLyogdmFsaWRhdGUgcG5wIHJlc291cmNlcyAqLwotCWlmICghcG5wX3BvcnRfdmFsaWQocGRldiwgMCkgfHwKLQkgICAgcG5wX3BvcnRfbGVuKHBkZXYsIDApICE9IGRldl9kZXNjLT5pb19yZWdpb25fc2l6ZSkgeworCWlmICghcG5wX3BvcnRfdmFsaWQocGRldiwgaW9fcnNyY19ubykgfHwKKwkgICAgcG5wX3BvcnRfbGVuKHBkZXYsIGlvX3JzcmNfbm8pICE9IGRldl9kZXNjLT5pb19yZWdpb25fc2l6ZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJUiBQTlAgUG9ydCBub3QgdmFsaWQhXG4iKTsKIAkJZ290byBmYWlsdXJlOwogCX0KQEAgLTE1MDQsNyArMTUxMCw3IEBACiAJfQogCiAJLyogc3RvcmUgcmVzb3VyY2UgdmFsdWVzICovCi0JaXRkZXYtPmNpcl9hZGRyID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCk7CisJaXRkZXYtPmNpcl9hZGRyID0gcG5wX3BvcnRfc3RhcnQocGRldiwgaW9fcnNyY19ubyk7CiAJaXRkZXYtPmNpcl9pcnEgPSBwbnBfaXJxKHBkZXYsIDApOwogCiAJLyogaW5pdGlhbGl6ZSBzcGlubG9ja3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5oIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmgKaW5kZXggMTZhMTlmNS4uYWE4OTlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmgKQEAgLTU3LDYgKzU3LDkgQEAKIAkvKiBzaXplIG9mIHRoZSBJL08gcmVnaW9uICovCiAJaW50IGlvX3JlZ2lvbl9zaXplOwogCisJLyogSVIgcG5wIEkvTyByZXNvdXJjZSBudW1iZXIgKi8KKwlpbnQgaW9fcnNyY19ubzsKKwogCS8qIHRydWUgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRyYW5zbWlzc2lvbiAqLwogCWJvb2wgaHdfdHhfY2FwYWJsZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1wY3R2LWhkLmMKaW5kZXggYmIxMGZmZS4uOGQ1NThhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jCkBAIC0xNSw0MyArMTUsMzkgQEAKIC8qIFBpbm5hY2xlIFBDVFYgSEQgODAwaSBtaW5pIHJlbW90ZSAqLwogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBwaW5uYWNsZV9wY3R2X2hkW10gPSB7Ci0KLQl7IDB4MGYsIEtFWV8xIH0sCi0JeyAweDE1LCBLRVlfMiB9LAotCXsgMHgxMCwgS0VZXzMgfSwKLQl7IDB4MTgsIEtFWV80IH0sCi0JeyAweDFiLCBLRVlfNSB9LAotCXsgMHgxZSwgS0VZXzYgfSwKLQl7IDB4MTEsIEtFWV83IH0sCi0JeyAweDIxLCBLRVlfOCB9LAotCXsgMHgxMiwgS0VZXzkgfSwKLQl7IDB4MjcsIEtFWV8wIH0sCi0KLQl7IDB4MjQsIEtFWV9aT09NIH0sCi0JeyAweDJhLCBLRVlfU1VCVElUTEUgfSwKLQotCXsgMHgwMCwgS0VZX01VVEUgfSwKLQl7IDB4MDEsIEtFWV9FTlRFUiB9LAkvKiBQaW5uYWNsZSBMb2dvICovCi0JeyAweDM5LCBLRVlfUE9XRVIgfSwKLQotCXsgMHgwMywgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDA5LCBLRVlfVk9MVU1FRE9XTiB9LAotCXsgMHgwNiwgS0VZX0NIQU5ORUxVUCB9LAotCXsgMHgwYywgS0VZX0NIQU5ORUxET1dOIH0sCi0KLQl7IDB4MmQsIEtFWV9SRVdJTkQgfSwKLQl7IDB4MzAsIEtFWV9QTEFZUEFVU0UgfSwKLQl7IDB4MzMsIEtFWV9GQVNURk9SV0FSRCB9LAotCXsgMHgzYywgS0VZX1NUT1AgfSwKLQl7IDB4MzYsIEtFWV9SRUNPUkQgfSwKLQl7IDB4M2YsIEtFWV9FUEcgfSwJLyogTGFiZWxlZCAiPyIgKi8KKwkvKiBLZXkgY29kZXMgZm9yIHRoZSB0aW55IFBpbm5hY2xlIHJlbW90ZSovCisJeyAweDA3MDAsIEtFWV9NVVRFIH0sCisJeyAweDA3MDEsIEtFWV9NRU5VIH0sIC8qIFBpbm5hY2xlIGxvZ28gKi8KKwl7IDB4MDczOSwgS0VZX1BPV0VSIH0sCisJeyAweDA3MDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwNzA5LCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwNzA2LCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDA3MGMsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwNzBmLCBLRVlfMSB9LAorCXsgMHgwNzE1LCBLRVlfMiB9LAorCXsgMHgwNzEwLCBLRVlfMyB9LAorCXsgMHgwNzE4LCBLRVlfNCB9LAorCXsgMHgwNzFiLCBLRVlfNSB9LAorCXsgMHgwNzFlLCBLRVlfNiB9LAorCXsgMHgwNzExLCBLRVlfNyB9LAorCXsgMHgwNzIxLCBLRVlfOCB9LAorCXsgMHgwNzEyLCBLRVlfOSB9LAorCXsgMHgwNzI3LCBLRVlfMCB9LAorCXsgMHgwNzI0LCBLRVlfWk9PTSB9LCAvKiAnU3F1YXJlJyBrZXkgKi8KKwl7IDB4MDcyYSwgS0VZX1NVQlRJVExFIH0sICAgLyogJ1QnIGtleSAqLworCXsgMHgwNzJkLCBLRVlfUkVXSU5EIH0sCisJeyAweDA3MzAsIEtFWV9QTEFZUEFVU0UgfSwKKwl7IDB4MDczMywgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweDA3MzYsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDczYywgS0VZX1NUT1AgfSwKKwl7IDB4MDczZiwgS0VZX0hFTFAgfSwgLyogJz8nIGtleSAqLwogfTsKIAogc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBwaW5uYWNsZV9wY3R2X2hkX21hcCA9IHsKIAkubWFwID0gewogCQkuc2NhbiAgICA9IHBpbm5hY2xlX3BjdHZfaGQsCiAJCS5zaXplICAgID0gQVJSQVlfU0laRShwaW5uYWNsZV9wY3R2X2hkKSwKLQkJLnJjX3R5cGUgPSBSQ19UWVBFX1VOS05PV04sCS8qIExlZ2FjeSBJUiB0eXBlICovCisJCS5yY190eXBlID0gUkNfVFlQRV9SQzUsCiAJCS5uYW1lICAgID0gUkNfTUFQX1BJTk5BQ0xFX1BDVFZfSEQsCiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbGlyY19kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcmMvbGlyY19kZXYuYwppbmRleCBmZDIzN2FiLi4yNzk5N2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2xpcmNfZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9saXJjX2Rldi5jCkBAIC01NSw2ICs1NSw4IEBACiAJc3RydWN0IGxpcmNfYnVmZmVyICpidWY7CiAJdW5zaWduZWQgaW50IGNodW5rX3NpemU7CiAKKwlzdHJ1Y3QgY2RldiAqY2RldjsKKwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAlsb25nIGppZmZpZXNfdG9fd2FpdDsKIH07CkBAIC02Miw3ICs2NCw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGxpcmNfZGV2X2xvY2spOwogCiBzdGF0aWMgc3RydWN0IGlyY3RsICppcmN0bHNbTUFYX0lSQ1RMX0RFVklDRVNdOwotc3RhdGljIHN0cnVjdCBjZGV2IGNkZXZzW01BWF9JUkNUTF9ERVZJQ0VTXTsKIAogLyogT25seSB1c2VkIGZvciBzeXNmcyBidXQgZGVmaW5lZCB0byB2b2lkIG90aGVyd2lzZSAqLwogc3RhdGljIHN0cnVjdCBjbGFzcyAqbGlyY19jbGFzczsKQEAgLTE2Nyw5ICsxNjgsMTMgQEAKIAogc3RhdGljIGludCBsaXJjX2NkZXZfYWRkKHN0cnVjdCBpcmN0bCAqaXIpCiB7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAlzdHJ1Y3QgbGlyY19kcml2ZXIgKmQgPSAmaXItPmQ7Ci0Jc3RydWN0IGNkZXYgKmNkZXYgPSAmY2RldnNbZC0+bWlub3JdOworCXN0cnVjdCBjZGV2ICpjZGV2OworCisJY2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZGV2KQorCQlnb3RvIGVycl9vdXQ7CiAKIAlpZiAoZC0+Zm9wcykgewogCQljZGV2X2luaXQoY2RldiwgZC0+Zm9wcyk7CkBAIC0xODAsMTIgKzE4NSwyMCBAQAogCX0KIAlyZXR2YWwgPSBrb2JqZWN0X3NldF9uYW1lKCZjZGV2LT5rb2JqLCAibGlyYyVkIiwgZC0+bWlub3IpOwogCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJCWdvdG8gZXJyX291dDsKIAogCXJldHZhbCA9IGNkZXZfYWRkKGNkZXYsIE1LREVWKE1BSk9SKGxpcmNfYmFzZV9kZXYpLCBkLT5taW5vciksIDEpOwotCWlmIChyZXR2YWwpCisJaWYgKHJldHZhbCkgewogCQlrb2JqZWN0X3B1dCgmY2Rldi0+a29iaik7CisJCWdvdG8gZXJyX291dDsKKwl9CiAKKwlpci0+Y2RldiA9IGNkZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlrZnJlZShjZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMTQsNyArMjI3LDcgQEAKIAlpZiAoTUFYX0lSQ1RMX0RFVklDRVMgPD0gZC0+bWlub3IpIHsKIAkJZGV2X2VycihkLT5kZXYsICJsaXJjX2RldjogbGlyY19yZWdpc3Rlcl9kcml2ZXI6ICIKIAkJCSJcIm1pbm9yXCIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkICglZCkhXG4iLAotCQkJTUFYX0lSQ1RMX0RFVklDRVMtMSwgZC0+bWlub3IpOworCQkJTUFYX0lSQ1RMX0RFVklDRVMgLSAxLCBkLT5taW5vcik7CiAJCWVyciA9IC1FQkFEUlFDOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNjksNyArMzgyLDcgQEAKIAogCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPj0gTUFYX0lSQ1RMX0RFVklDRVMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJsaXJjX2RldjogJXM6IG1pbm9yICglZCkgbXVzdCBiZSBiZXR3ZWVuICIKLQkJICAgICAgICIwIGFuZCAlZCFcbiIsIF9fZnVuY19fLCBtaW5vciwgTUFYX0lSQ1RMX0RFVklDRVMtMSk7CisJCSAgICAgICAiMCBhbmQgJWQhXG4iLCBfX2Z1bmNfXywgbWlub3IsIE1BWF9JUkNUTF9ERVZJQ0VTIC0gMSk7CiAJCXJldHVybiAtRUJBRFJRQzsKIAl9CiAKQEAgLTM4MCw3ICszOTMsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQljZGV2ID0gJmNkZXZzW21pbm9yXTsKKwljZGV2ID0gaXItPmNkZXY7CiAKIAltdXRleF9sb2NrKCZsaXJjX2Rldl9sb2NrKTsKIApAQCAtNDEwLDYgKzQyMyw3IEBACiAJfSBlbHNlIHsKIAkJbGlyY19pcmN0bF9jbGVhbnVwKGlyKTsKIAkJY2Rldl9kZWwoY2Rldik7CisJCWtmcmVlKGNkZXYpOwogCQlrZnJlZShpcik7CiAJCWlyY3Rsc1ttaW5vcl0gPSBOVUxMOwogCX0KQEAgLTQ1Myw3ICs0NjcsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWNkZXYgPSAmY2RldnNbaW1pbm9yKGlub2RlKV07CisJY2RldiA9IGlyLT5jZGV2OwogCWlmICh0cnlfbW9kdWxlX2dldChjZGV2LT5vd25lcikpIHsKIAkJaXItPm9wZW4rKzsKIAkJcmV0dmFsID0gaXItPmQuc2V0X3VzZV9pbmMoaXItPmQuZGF0YSk7CkBAIC00ODQsMTMgKzQ5OCwxNSBAQAogaW50IGxpcmNfZGV2X2ZvcF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaXJjdGwgKmlyID0gaXJjdGxzW2ltaW5vcihpbm9kZSldOwotCXN0cnVjdCBjZGV2ICpjZGV2ID0gJmNkZXZzW2ltaW5vcihpbm9kZSldOworCXN0cnVjdCBjZGV2ICpjZGV2OwogCiAJaWYgKCFpcikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGlyY3RsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWNkZXYgPSBpci0+Y2RldjsKKwogCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJjbG9zZSBjYWxsZWRcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKIAogCVdBUk5fT04obXV0ZXhfbG9ja19raWxsYWJsZSgmbGlyY19kZXZfbG9jaykpOwpAQCAtNTAzLDYgKzUxOSw3IEBACiAJCWxpcmNfaXJjdGxfY2xlYW51cChpcik7CiAJCWNkZXZfZGVsKGNkZXYpOwogCQlpcmN0bHNbaXItPmQubWlub3JdID0gTlVMTDsKKwkJa2ZyZWUoY2Rldik7CiAJCWtmcmVlKGlyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMgYi9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCmluZGV4IGFkOTI3ZmMuLmVjOTcyZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwpAQCAtMTA4LDYgKzEwOCwxMiBAQAogc3RhdGljIGludCBkZWJ1ZzsKICNlbmRpZgogCisjZGVmaW5lIG1jZV9kYmcoZGV2LCBmbXQsIC4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKGRlYnVnKQkJCQkJXAorCQkJZGV2X2luZm8oZGV2LCBmbXQsICMjIF9fVkFfQVJHU19fKTsJXAorCX0gd2hpbGUgKDApCisKIC8qIGdlbmVyYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIFNFTkRfRkxBR19JTl9QUk9HUkVTUwkxCiAjZGVmaW5lIFNFTkRfRkxBR19DT01QTEVURQkyCkBAIC0yNDYsNiArMjUyLDkgQEAKIAkgIC5kcml2ZXJfaW5mbyA9IE1DRV9HRU4yX1RYX0lOViB9LAogCS8qIFNNSyBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLwogCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzMzgpIH0sCisJLyogU01LL0ktTyBEYXRhIEdWLU1DNy9SQ0tJVCBSZWNlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzNTMpLAorCSAgLmRyaXZlcl9pbmZvID0gTUNFX0dFTjJfTk9fVFggfSwKIAkvKiBUYXR1bmcgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KIAl7IFVTQl9ERVZJQ0UoVkVORE9SX1RBVFVORywgMHg5MTUwKSB9LAogCS8qIFNodXR0bGUgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KQEAgLTU0OSw5ICs1NTgsMTAgQEAKIAkJCQkgaW5vdXQsIGRhdGExKTsKIAkJCWJyZWFrOwogCQljYXNlIE1DRV9DTURfU19USU1FT1VUOgotCQkJLyogdmFsdWUgaXMgaW4gdW5pdHMgb2YgNTB1cywgc28geCo1MC8xMDAgb3IgeC8yIG1zICovCisJCQkvKiB2YWx1ZSBpcyBpbiB1bml0cyBvZiA1MHVzLCBzbyB4KjUwLzEwMDAgbXMgKi8KIAkJCWRldl9pbmZvKGRldiwgIiVzIHJlY2VpdmUgdGltZW91dCBvZiAlZCBtc1xuIiwKLQkJCQkgaW5vdXQsICgoZGF0YTEgPDwgOCkgfCBkYXRhMikgLyAyKTsKKwkJCQkgaW5vdXQsCisJCQkJICgoZGF0YTEgPDwgOCkgfCBkYXRhMikgKiBNQ0VfVElNRV9VTklUIC8gMTAwMCk7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0VfQ01EX0dfVElNRU9VVDoKIAkJCWRldl9pbmZvKGRldiwgIkdldCByZWNlaXZlIHRpbWVvdXRcbiIpOwpAQCAtNjA2LDEyICs2MTYsMTUgQEAKIAlpZiAoaXIpIHsKIAkJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCi0JCWRldl9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCisJCW1jZV9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCiAJCQl1cmItPnN0YXR1cywgbGVuKTsKIAogCQltY2V1c2JfZGV2X3ByaW50ZGF0YShpciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIDAsIGxlbiwgdHJ1ZSk7CiAJfQogCisJLyogdGhlIHRyYW5zZmVyIGJ1ZmZlciBhbmQgdXJiIHdlcmUgYWxsb2NhdGVkIGluIG1jZV9yZXF1ZXN0X3BhY2tldCAqLworCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKIH0KIAogLyogcmVxdWVzdCBpbmNvbWluZyBvciBzZW5kIG91dGdvaW5nIHVzYiBwYWNrZXQgLSB1c2VkIHRvIGluaXRpYWxpemUgcmVtb3RlICovCkBAIC02NTUsMTcgKzY2OCwxNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZGV2X2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY2FsbGVkIChzaXplPSUjeClcbiIsIHNpemUpOworCW1jZV9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IGNhbGxlZCAoc2l6ZT0lI3gpXG4iLCBzaXplKTsKIAogCWFzeW5jX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNpemU7CiAJYXN5bmNfdXJiLT5kZXYgPSBpci0+dXNiZGV2OwogCiAJcmVzID0gdXNiX3N1Ym1pdF91cmIoYXN5bmNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzKSB7Ci0JCWRldl9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IEZBSUxFRCEgKHJlcz0lZClcbiIsIHJlcyk7CisJCW1jZV9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IEZBSUxFRCEgKHJlcz0lZClcbiIsIHJlcyk7CiAJCXJldHVybjsKIAl9Ci0JZGV2X2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY29tcGxldGUgKHJlcz0lZClcbiIsIHJlcyk7CisJbWNlX2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY29tcGxldGUgKHJlcz0lZClcbiIsIHJlcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZV9hc3luY19vdXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKQEAgLTY3Myw5ICs2ODYsOSBAQAogCW1jZV9yZXF1ZXN0X3BhY2tldChpciwgZGF0YSwgc2l6ZSwgTUNFVVNCX1RYKTsKIH0KIAotc3RhdGljIHZvaWQgbWNlX3N5bmNfaW4oc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIG1jZV9mbHVzaF9yeF9idWZmZXIoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCBpbnQgc2l6ZSkKIHsKLQltY2VfcmVxdWVzdF9wYWNrZXQoaXIsIGRhdGEsIHNpemUsIE1DRVVTQl9SWCk7CisJbWNlX3JlcXVlc3RfcGFja2V0KGlyLCBOVUxMLCBzaXplLCBNQ0VVU0JfUlgpOwogfQogCiAvKiBTZW5kIGRhdGEgb3V0IHRoZSBJUiBibGFzdGVyIHBvcnQocykgKi8KQEAgLTc5NCw3ICs4MDcsNyBAQAogCQkJaXItPmNhcnJpZXIgPSBjYXJyaWVyOwogCQkJY21kYnVmWzJdID0gTUNFX0NNRF9TSUdfRU5EOwogCQkJY21kYnVmWzNdID0gTUNFX0lSREFUQV9UUkFJTEVSOwotCQkJZGV2X2RiZyhpci0+ZGV2LCAiJXM6IGRpc2FibGluZyBjYXJyaWVyICIKKwkJCW1jZV9kYmcoaXItPmRldiwgIiVzOiBkaXNhYmxpbmcgY2FycmllciAiCiAJCQkJIm1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKIAkJCW1jZV9hc3luY19vdXQoaXIsIGNtZGJ1Ziwgc2l6ZW9mKGNtZGJ1ZikpOwogCQkJcmV0dXJuIGNhcnJpZXI7CkBAIC04MDYsNyArODE5LDcgQEAKIAkJCQlpci0+Y2FycmllciA9IGNhcnJpZXI7CiAJCQkJY21kYnVmWzJdID0gcHJlc2NhbGVyOwogCQkJCWNtZGJ1ZlszXSA9IGRpdmlzb3I7Ci0JCQkJZGV2X2RiZyhpci0+ZGV2LCAiJXM6IHJlcXVlc3RpbmcgJXUgSFogIgorCQkJCW1jZV9kYmcoaXItPmRldiwgIiVzOiByZXF1ZXN0aW5nICV1IEhaICIKIAkJCQkJImNhcnJpZXJcbiIsIF9fZnVuY19fLCBjYXJyaWVyKTsKIAogCQkJCS8qIFRyYW5zbWl0IG5ldyBjYXJyaWVyIHRvIG1jZSBkZXZpY2UgKi8KQEAgLTgzNSw3ICs4NDgsNyBAQAogCXN3aXRjaCAoaXItPmJ1Zl9pbltpbmRleF0pIHsKIAkvKiAyLWJ5dGUgcmV0dXJuIHZhbHVlIGNvbW1hbmRzICovCiAJY2FzZSBNQ0VfQ01EX1NfVElNRU9VVDoKLQkJaXItPnJjLT50aW1lb3V0ID0gVVNfVE9fTlMoKGhpIDw8IDggfCBsbykgLyAyKTsKKwkJaXItPnJjLT50aW1lb3V0ID0gVVNfVE9fTlMoKGhpIDw8IDggfCBsbykgKiBNQ0VfVElNRV9VTklUKTsKIAkJYnJlYWs7CiAKIAkvKiAxLWJ5dGUgcmV0dXJuIHZhbHVlIGNvbW1hbmRzICovCkBAIC04NzksNyArODkyLDcgQEAKIAkJCXJhd2lyLmR1cmF0aW9uID0gKGlyLT5idWZfaW5baV0gJiBNQ0VfUFVMU0VfTUFTSykKIAkJCQkJICogVVNfVE9fTlMoTUNFX1RJTUVfVU5JVCk7CiAKLQkJCWRldl9kYmcoaXItPmRldiwgIlN0b3JpbmcgJXMgd2l0aCBkdXJhdGlvbiAlZFxuIiwKKwkJCW1jZV9kYmcoaXItPmRldiwgIlN0b3JpbmcgJXMgd2l0aCBkdXJhdGlvbiAlZFxuIiwKIAkJCQlyYXdpci5wdWxzZSA/ICJwdWxzZSIgOiAic3BhY2UiLAogCQkJCXJhd2lyLmR1cmF0aW9uKTsKIApAQCAtOTExLDcgKzkyNCw3IEBACiAJCWlmIChpci0+cGFyc2VyX3N0YXRlICE9IENNRF9IRUFERVIgJiYgIWlyLT5yZW0pCiAJCQlpci0+cGFyc2VyX3N0YXRlID0gQ01EX0hFQURFUjsKIAl9Ci0JZGV2X2RiZyhpci0+ZGV2LCAicHJvY2Vzc2VkIElSIGRhdGEsIGNhbGxpbmcgaXJfcmF3X2V2ZW50X2hhbmRsZVxuIik7CisJbWNlX2RiZyhpci0+ZGV2LCAicHJvY2Vzc2VkIElSIGRhdGEsIGNhbGxpbmcgaXJfcmF3X2V2ZW50X2hhbmRsZVxuIik7CiAJaXJfcmF3X2V2ZW50X2hhbmRsZShpci0+cmMpOwogfQogCkBAIC05MzMsNyArOTQ2LDcgQEAKIAogCWlmIChpci0+c2VuZF9mbGFncyA9PSBSRUNWX0ZMQUdfSU5fUFJPR1JFU1MpIHsKIAkJaXItPnNlbmRfZmxhZ3MgPSBTRU5EX0ZMQUdfQ09NUExFVEU7Ci0JCWRldl9kYmcoaXItPmRldiwgInNldHVwIGFuc3dlciByZWNlaXZlZCAlZCBieXRlc1xuIiwKKwkJbWNlX2RiZyhpci0+ZGV2LCAic2V0dXAgYW5zd2VyIHJlY2VpdmVkICVkIGJ5dGVzXG4iLAogCQkJYnVmX2xlbik7CiAJfQogCkBAIC05NTEsNyArOTY0LDcgQEAKIAogCWNhc2UgLUVQSVBFOgogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoaXItPmRldiwgIkVycm9yOiB1cmIgc3RhdHVzID0gJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJbWNlX2RiZyhpci0+ZGV2LCAiRXJyb3I6IHVyYiBzdGF0dXMgPSAlZFxuIiwgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAl9CiAKQEAgLTk2MSw3ICs5NzQsNiBAQAogc3RhdGljIHZvaWQgbWNldXNiX2dlbjFfaW5pdChzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7CiAJaW50IHJldDsKLQlpbnQgbWF4cCA9IGlyLT5sZW5faW47CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaXItPmRldjsKIAljaGFyICpkYXRhOwogCkBAIC05NzgsOCArOTkwLDggQEAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coaXItPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKGlyLT51c2JkZXYsIDApLAogCQkJICAgICAgVVNCX1JFUV9TRVRfQUREUkVTUywgVVNCX1RZUEVfVkVORE9SLCAwLCAwLAogCQkJICAgICAgZGF0YSwgVVNCX0NUUkxfTVNHX1NaLCBIWiAqIDMpOwotCWRldl9kYmcoZGV2LCAiJXMgLSByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JZGV2X2RiZyhkZXYsICIlcyAtIGRhdGFbMF0gPSAlZCwgZGF0YVsxXSA9ICVkXG4iLAorCW1jZV9kYmcoZGV2LCAiJXMgLSByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJbWNlX2RiZyhkZXYsICIlcyAtIGRhdGFbMF0gPSAlZCwgZGF0YVsxXSA9ICVkXG4iLAogCQlfX2Z1bmNfXywgZGF0YVswXSwgZGF0YVsxXSk7CiAKIAkvKiBzZXQgZmVhdHVyZTogYml0IHJhdGUgMzg0MDAgYnBzICovCkBAIC05ODcsNzEgKzk5OSw1NiBAQAogCQkJICAgICAgVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX1RZUEVfVkVORE9SLAogCQkJICAgICAgMHhjMDRlLCAweDAwMDAsIE5VTEwsIDAsIEhaICogMyk7CiAKLQlkZXZfZGJnKGRldiwgIiVzIC0gcmV0ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1jZV9kYmcoZGV2LCAiJXMgLSByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKIAkvKiBiUmVxdWVzdCA0OiBzZXQgY2hhciBsZW5ndGggdG8gOCBiaXRzICovCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGlyLT51c2JkZXYsIHVzYl9zbmRjdHJscGlwZShpci0+dXNiZGV2LCAwKSwKIAkJCSAgICAgIDQsIFVTQl9UWVBFX1ZFTkRPUiwKIAkJCSAgICAgIDB4MDgwOCwgMHgwMDAwLCBOVUxMLCAwLCBIWiAqIDMpOwotCWRldl9kYmcoZGV2LCAiJXMgLSByZXRCID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1jZV9kYmcoZGV2LCAiJXMgLSByZXRCID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCiAJLyogYlJlcXVlc3QgMjogc2V0IGhhbmRzaGFraW5nIHRvIHVzZSBEVFIvRFNSICovCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGlyLT51c2JkZXYsIHVzYl9zbmRjdHJscGlwZShpci0+dXNiZGV2LCAwKSwKIAkJCSAgICAgIDIsIFVTQl9UWVBFX1ZFTkRPUiwKIAkJCSAgICAgIDB4MDAwMCwgMHgwMTAwLCBOVUxMLCAwLCBIWiAqIDMpOwotCWRldl9kYmcoZGV2LCAiJXMgLSByZXRDID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1jZV9kYmcoZGV2LCAiJXMgLSByZXRDID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCiAJLyogZGV2aWNlIHJlc2V0ICovCiAJbWNlX2FzeW5jX291dChpciwgREVWSUNFX1JFU0VULCBzaXplb2YoREVWSUNFX1JFU0VUKSk7Ci0JbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOwogCiAJLyogZ2V0IGh3L3N3IHJldmlzaW9uPyAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SRVZJU0lPTiwgc2l6ZW9mKEdFVF9SRVZJU0lPTikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAogCWtmcmVlKGRhdGEpOwogfTsKIAogc3RhdGljIHZvaWQgbWNldXNiX2dlbjJfaW5pdChzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7Ci0JaW50IG1heHAgPSBpci0+bGVuX2luOwotCiAJLyogZGV2aWNlIHJlc2V0ICovCiAJbWNlX2FzeW5jX291dChpciwgREVWSUNFX1JFU0VULCBzaXplb2YoREVWSUNFX1JFU0VUKSk7Ci0JbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOwogCiAJLyogZ2V0IGh3L3N3IHJldmlzaW9uPyAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SRVZJU0lPTiwgc2l6ZW9mKEdFVF9SRVZJU0lPTikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAogCS8qIHVua25vd24gd2hhdCB0aGUgbmV4dCB0d28gYWN0dWFsbHkgcmV0dXJuLi4uICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1VOS05PV04sIHNpemVvZihHRVRfVU5LTk9XTikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVU5LTk9XTjIsIHNpemVvZihHRVRfVU5LTk9XTjIpKTsKLQltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZXVzYl9nZXRfcGFyYW1ldGVycyhzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7Ci0JaW50IG1heHAgPSBpci0+bGVuX2luOwotCiAJLyogZ2V0IHRoZSBjYXJyaWVyIGFuZCBmcmVxdWVuY3kgKi8KIAltY2VfYXN5bmNfb3V0KGlyLCBHRVRfQ0FSUklFUl9GUkVRLCBzaXplb2YoR0VUX0NBUlJJRVJfRlJFUSkpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAotCWlmICghaXItPmZsYWdzLm5vX3R4KSB7CisJaWYgKCFpci0+ZmxhZ3Mubm9fdHgpCiAJCS8qIGdldCB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzayAqLwogCQltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVFhfQklUTUFTSywgc2l6ZW9mKEdFVF9UWF9CSVRNQVNLKSk7Ci0JCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKLQl9CiAKIAkvKiBnZXQgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SWF9USU1FT1VULCBzaXplb2YoR0VUX1JYX1RJTUVPVVQpKTsKLQltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CiAKIAkvKiBnZXQgcmVjZWl2ZXIgc2Vuc29yIHNldHRpbmcgKi8KIAltY2VfYXN5bmNfb3V0KGlyLCBHRVRfUlhfU0VOU09SLCBzaXplb2YoR0VUX1JYX1NFTlNPUikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIH0KIAogc3RhdGljIHN0cnVjdCByY19kZXYgKm1jZXVzYl9pbml0X3JjX2RldihzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCkBAIC0xMDgyLDcgKzEwNzksNyBAQAogCXJjLT5wcml2ID0gaXI7CiAJcmMtPmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX0lSX1JBVzsKIAlyYy0+YWxsb3dlZF9wcm90b3MgPSBSQ19UWVBFX0FMTDsKLQlyYy0+dGltZW91dCA9IFVTX1RPX05TKDEwMDApOworCXJjLT50aW1lb3V0ID0gTVNfVE9fTlMoMTAwKTsKIAlpZiAoIWlyLT5mbGFncy5ub190eCkgewogCQlyYy0+c190eF9tYXNrID0gbWNldXNiX3NldF90eF9tYXNrOwogCQlyYy0+c190eF9jYXJyaWVyID0gbWNldXNiX3NldF90eF9jYXJyaWVyOwpAQCAtMTEyMiw3ICsxMTE5LDcgQEAKIAlib29sIHR4X21hc2tfbm9ybWFsOwogCWludCBpcl9pbnRmbnVtOwogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisJbWNlX2RiZygmaW50Zi0+ZGV2LCAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZGVzYyAgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIApAQCAtMTE1MCw3ICsxMTQ3LDcgQEAKIAkJCWVwX2luID0gZXA7CiAJCQllcF9pbi0+Ym1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfSU5UOwogCQkJZXBfaW4tPmJJbnRlcnZhbCA9IDE7Ci0JCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJhY2NlcHRhYmxlIGluYm91bmQgZW5kcG9pbnQgIgorCQkJbWNlX2RiZygmaW50Zi0+ZGV2LCAiYWNjZXB0YWJsZSBpbmJvdW5kIGVuZHBvaW50ICIKIAkJCQkiZm91bmRcbiIpOwogCQl9CiAKQEAgLTExNjUsMTIgKzExNjIsMTIgQEAKIAkJCWVwX291dCA9IGVwOwogCQkJZXBfb3V0LT5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ7CiAJCQllcF9vdXQtPmJJbnRlcnZhbCA9IDE7Ci0JCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJhY2NlcHRhYmxlIG91dGJvdW5kIGVuZHBvaW50ICIKKwkJCW1jZV9kYmcoJmludGYtPmRldiwgImFjY2VwdGFibGUgb3V0Ym91bmQgZW5kcG9pbnQgIgogCQkJCSJmb3VuZFxuIik7CiAJCX0KIAl9CiAJaWYgKGVwX2luID09IE5VTEwpIHsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiaW5ib3VuZCBhbmQvb3IgZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJbWNlX2RiZygmaW50Zi0+ZGV2LCAiaW5ib3VuZCBhbmQvb3IgZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjE1LDE2ICsxMjEyLDE2IEBACiAJaWYgKCFpci0+cmMpCiAJCWdvdG8gcmNfZGV2X2ZhaWw7CiAKLQkvKiBmbHVzaCBidWZmZXJzIG9uIHRoZSBkZXZpY2UgKi8KLQltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7Ci0JbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOwotCiAJLyogd2lyZSB1cCBpbmJvdW5kIGRhdGEgaGFuZGxlciAqLwogCXVzYl9maWxsX2ludF91cmIoaXItPnVyYl9pbiwgZGV2LCBwaXBlLCBpci0+YnVmX2luLAogCQltYXhwLCAodXNiX2NvbXBsZXRlX3QpIG1jZXVzYl9kZXZfcmVjdiwgaXIsIGVwX2luLT5iSW50ZXJ2YWwpOwogCWlyLT51cmJfaW4tPnRyYW5zZmVyX2RtYSA9IGlyLT5kbWFfaW47CiAJaXItPnVyYl9pbi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKKwkvKiBmbHVzaCBidWZmZXJzIG9uIHRoZSBkZXZpY2UgKi8KKwltY2VfZGJnKCZpbnRmLT5kZXYsICJGbHVzaGluZyByZWNlaXZlIGJ1ZmZlcnNcbiIpOworCW1jZV9mbHVzaF9yeF9idWZmZXIoaXIsIG1heHApOworCiAJLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KIAlpZiAoaXItPmZsYWdzLm1pY3Jvc29mdF9nZW4xKQogCQltY2V1c2JfZ2VuMV9pbml0KGlyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYwppbmRleCBiZjMwNjBlLi5jZTU5NWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jCkBAIC05OTEsNyArOTkxLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm52dC0+bnZ0X2xvY2ssIGZsYWdzKTsKLQludnQtPmluX3VzZSA9IHRydWU7CiAJbnZ0X2VuYWJsZV9jaXIobnZ0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudnQtPm52dF9sb2NrLCBmbGFncyk7CiAKQEAgLTEwMDQsNyArMTAwMyw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZudnQtPm52dF9sb2NrLCBmbGFncyk7Ci0JbnZ0LT5pbl91c2UgPSBmYWxzZTsKIAludnRfZGlzYWJsZV9jaXIobnZ0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudnQtPm52dF9sb2NrLCBmbGFncyk7CiB9CkBAIC0xMTEyLDcgKzExMTAsNyBAQAogCXJkZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXJkZXYtPmRyaXZlcl9uYW1lID0gTlZUX0RSSVZFUl9OQU1FOwogCXJkZXYtPm1hcF9uYW1lID0gUkNfTUFQX1JDNl9NQ0U7Ci0JcmRldi0+dGltZW91dCA9IFVTX1RPX05TKDEwMDApOworCXJkZXYtPnRpbWVvdXQgPSBNU19UT19OUygxMDApOwogCS8qIHJ4IHJlc29sdXRpb24gaXMgaGFyZHdpcmVkIHRvIDUwdXMgYXRtLCAxLCAyNSwgMTAwIGFsc28gcG9zc2libGUgKi8KIAlyZGV2LT5yeF9yZXNvbHV0aW9uID0gVVNfVE9fTlMoQ0lSX1NBTVBMRV9QRVJJT0QpOwogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuaCBiL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuaAppbmRleCAzNzk3OTVkLi4xMjQxZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5oCkBAIC03MCw3ICs3MCw2IEBACiAJc3RydWN0IGlyX3Jhd19ldmVudCByYXdpcjsKIAogCXNwaW5sb2NrX3QgbnZ0X2xvY2s7Ci0JYm9vbCBpbl91c2U7CiAKIAkvKiBmb3IgcnggKi8KIAl1OCBidWZbUlhfQlVGX0xFTl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCmluZGV4IGY1N2NkNTYuLjMxODZhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCkBAIC01MjIsMTggKzUyMiwyMCBAQAogLyoqCiAgKiBpcl9kb19rZXl1cCgpIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8gc2lnbmFsIHRoZSByZWxlYXNlIG9mIGEga2V5cHJlc3MKICAqIEBkZXY6CXRoZSBzdHJ1Y3QgcmNfZGV2IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZQorICogQHN5bmM6CXdoZXRoZXIgb3Igbm90IHRvIGNhbGwgaW5wdXRfc3luYwogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJlbGVhc2UgYSBrZXlwcmVzcywgaXQgbXVzdCBiZQogICogY2FsbGVkIHdpdGgga2V5bG9jayBoZWxkLgogICovCi1zdGF0aWMgdm9pZCBpcl9kb19rZXl1cChzdHJ1Y3QgcmNfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBpcl9kb19rZXl1cChzdHJ1Y3QgcmNfZGV2ICpkZXYsIGJvb2wgc3luYykKIHsKIAlpZiAoIWRldi0+a2V5cHJlc3NlZCkKIAkJcmV0dXJuOwogCiAJSVJfZHByaW50aygxLCAia2V5dXAga2V5IDB4JTA0eFxuIiwgZGV2LT5sYXN0X2tleWNvZGUpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dF9kZXYsIGRldi0+bGFzdF9rZXljb2RlLCAwKTsKLQlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsKKwlpZiAoc3luYykKKwkJaW5wdXRfc3luYyhkZXYtPmlucHV0X2Rldik7CiAJZGV2LT5rZXlwcmVzc2VkID0gZmFsc2U7CiB9CiAKQEAgLTU0OSw3ICs1NTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5rZXlsb2NrLCBmbGFncyk7Ci0JaXJfZG9fa2V5dXAoZGV2KTsKKwlpcl9kb19rZXl1cChkZXYsIHRydWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+a2V5bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmNfa2V5dXApOwpAQCAtNTc4LDcgKzU4MCw3IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+a2V5bG9jaywgZmxhZ3MpOwogCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGRldi0+a2V5dXBfamlmZmllcykpCi0JCWlyX2RvX2tleXVwKGRldik7CisJCWlyX2RvX2tleXVwKGRldiwgdHJ1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5rZXlsb2NrLCBmbGFncyk7CiB9CiAKQEAgLTU5Nyw2ICs1OTksNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmtleWxvY2ssIGZsYWdzKTsKIAogCWlucHV0X2V2ZW50KGRldi0+aW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBkZXYtPmxhc3Rfc2NhbmNvZGUpOworCWlucHV0X3N5bmMoZGV2LT5pbnB1dF9kZXYpOwogCiAJaWYgKCFkZXYtPmtleXByZXNzZWQpCiAJCWdvdG8gb3V0OwpAQCAtNjIyLDI5ICs2MjUsMjggQEAKIHN0YXRpYyB2b2lkIGlyX2RvX2tleWRvd24oc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgc2NhbmNvZGUsCiAJCQkgIHUzMiBrZXljb2RlLCB1OCB0b2dnbGUpCiB7CisJYm9vbCBuZXdfZXZlbnQgPSAhZGV2LT5rZXlwcmVzc2VkIHx8CisJCQkgZGV2LT5sYXN0X3NjYW5jb2RlICE9IHNjYW5jb2RlIHx8CisJCQkgZGV2LT5sYXN0X3RvZ2dsZSAhPSB0b2dnbGU7CisKKwlpZiAobmV3X2V2ZW50ICYmIGRldi0+a2V5cHJlc3NlZCkKKwkJaXJfZG9fa2V5dXAoZGV2LCBmYWxzZSk7CisKIAlpbnB1dF9ldmVudChkZXYtPmlucHV0X2RldiwgRVZfTVNDLCBNU0NfU0NBTiwgc2NhbmNvZGUpOwogCi0JLyogUmVwZWF0IGV2ZW50PyAqLwotCWlmIChkZXYtPmtleXByZXNzZWQgJiYKLQkgICAgZGV2LT5sYXN0X3NjYW5jb2RlID09IHNjYW5jb2RlICYmCi0JICAgIGRldi0+bGFzdF90b2dnbGUgPT0gdG9nZ2xlKQotCQlyZXR1cm47CisJaWYgKG5ld19ldmVudCAmJiBrZXljb2RlICE9IEtFWV9SRVNFUlZFRCkgeworCQkvKiBSZWdpc3RlciBhIGtleXByZXNzICovCisJCWRldi0+a2V5cHJlc3NlZCA9IHRydWU7CisJCWRldi0+bGFzdF9zY2FuY29kZSA9IHNjYW5jb2RlOworCQlkZXYtPmxhc3RfdG9nZ2xlID0gdG9nZ2xlOworCQlkZXYtPmxhc3Rfa2V5Y29kZSA9IGtleWNvZGU7CiAKLQkvKiBSZWxlYXNlIG9sZCBrZXlwcmVzcyAqLwotCWlyX2RvX2tleXVwKGRldik7CisJCUlSX2RwcmludGsoMSwgIiVzOiBrZXkgZG93biBldmVudCwgIgorCQkJICAgImtleSAweCUwNHgsIHNjYW5jb2RlIDB4JTA0eFxuIiwKKwkJCSAgIGRldi0+aW5wdXRfbmFtZSwga2V5Y29kZSwgc2NhbmNvZGUpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldi0+aW5wdXRfZGV2LCBrZXljb2RlLCAxKTsKKwl9CiAKLQlkZXYtPmxhc3Rfc2NhbmNvZGUgPSBzY2FuY29kZTsKLQlkZXYtPmxhc3RfdG9nZ2xlID0gdG9nZ2xlOwotCWRldi0+bGFzdF9rZXljb2RlID0ga2V5Y29kZTsKLQotCWlmIChrZXljb2RlID09IEtFWV9SRVNFUlZFRCkKLQkJcmV0dXJuOwotCi0JLyogUmVnaXN0ZXIgYSBrZXlwcmVzcyAqLwotCWRldi0+a2V5cHJlc3NlZCA9IHRydWU7Ci0JSVJfZHByaW50aygxLCAiJXM6IGtleSBkb3duIGV2ZW50LCBrZXkgMHglMDR4LCBzY2FuY29kZSAweCUwNHhcbiIsCi0JCSAgIGRldi0+aW5wdXRfbmFtZSwga2V5Y29kZSwgc2NhbmNvZGUpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dF9kZXYsIGRldi0+bGFzdF9rZXljb2RlLCAxKTsKIAlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCmluZGV4IGE5N2NmMjcuLjgzNGE0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKQEAgLTM0NzQsNyArMzQ3NCw3IEBACiAJaWYgKDAgIT0gdC0+aW5kZXgpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYnR0dl9jYWxsX2FsbChidHYsIHR1bmVyLCBnX3R1bmVyLCB0KTsKKwlidHR2X2NhbGxfYWxsKGJ0diwgdHVuZXIsIHNfdHVuZXIsIHQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYwppbmRleCAxOTMzZDRkLi5lODAxMzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKQEAgLTY5NSwxNCArNjk1LDEwIEBACiAKIAljeDE4X2NhbGxfYWxsKGN4LCB0dW5lciwgZ190dW5lciwgdnQpOwogCi0JaWYgKHRlc3RfYml0KENYMThfRl9JX1JBRElPX1VTRVIsICZjeC0+aV9mbGFncykpIHsKKwlpZiAodnQtPnR5cGUgPT0gVjRMMl9UVU5FUl9SQURJTykKIAkJc3RybGNweSh2dC0+bmFtZSwgImN4MTggUmFkaW8gVHVuZXIiLCBzaXplb2YodnQtPm5hbWUpKTsKLQkJdnQtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCX0gZWxzZSB7CisJZWxzZQogCQlzdHJsY3B5KHZ0LT5uYW1lLCAiY3gxOCBUViBUdW5lciIsIHNpemVvZih2dC0+bmFtZSkpOwotCQl2dC0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCX0KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwppbmRleCAyMzU0MzM2Li45MzQxODVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPG1lZGlhL2N4MjU4NDAuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPHN0YWdpbmcvYWx0ZXJhLmg+CiAKKyNpbmNsdWRlICIuLi8uLi8uLi9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaCIKICNpbmNsdWRlICJjeDIzODg1LmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAjaW5jbHVkZSAibmV0dXAtaW5pdC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCmluZGV4IDY0ZDliMjEuLjQxOTc3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKQEAgLTIwNjAsMTIgKzIwNjAsOCBAQAogCQlnb3RvIGZhaWxfaXJxOwogCX0KIAotCWlmICghcGNpX2VuYWJsZV9tc2kocGNpX2RldikpCi0JCWVyciA9IHJlcXVlc3RfaXJxKHBjaV9kZXYtPmlycSwgY3gyMzg4NV9pcnEsCi0JCQkJICBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7Ci0JZWxzZQotCQllcnIgPSByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIGN4MjM4ODVfaXJxLAotCQkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CisJZXJyID0gcmVxdWVzdF9pcnEocGNpX2Rldi0+aXJxLCBjeDIzODg1X2lycSwKKwkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgcGNpX2Rldi0+aXJxKTsKQEAgLTIxMTQsNyArMjExMCw2IEBACiAKIAkvKiB1bnJlZ2lzdGVyIHN0dWZmICovCiAJZnJlZV9pcnEocGNpX2Rldi0+aXJxLCBkZXYpOwotCXBjaV9kaXNhYmxlX21zaShwY2lfZGV2KTsKIAogCWN4MjM4ODVfZGV2X3VucmVnaXN0ZXIoZGV2KTsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29hcnNlX2V4cG9fYXV0b2dhaW4uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29hcnNlX2V4cG9fYXV0b2dhaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiOWQ5NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvYXJzZV9leHBvX2F1dG9nYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIEF1dG8gZ2FpbiBhbGdvcml0aG0gZm9yIGNhbWVyYSdzIHdpdGggYSBjb2Fyc2UgZXhwb3N1cmUgY29udHJvbAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0vKiBBdXRvZ2FpbiArIGV4cG9zdXJlIGFsZ29yaXRobSBmb3IgY2FtZXJhcyB3aXRoIGEgY29hcnNlIGV4cG9zdXJlIGNvbnRyb2wKLSAgICh1c3VhbGx5IHRoaXMgbWVhbnMgd2UgY2FuIG9ubHkgY29udHJvbCB0aGUgY2xvY2tkaXYgdG8gY2hhbmdlIGV4cG9zdXJlKQotICAgQXMgY2hhbmdpbmcgdGhlIGNsb2NrZGl2IHNvIHRoYXQgdGhlIGZwcyBkcm9wcyBmcm9tIDMwIHRvIDE1IGZwcyBmb3IKLSAgIGV4YW1wbGUsIHdpbGwgbGVhZCB0byBhIGh1Z2UgZXhwb3N1cmUgY2hhbmdlIChpdCBlZmZlY3RpdmVseSBkb3VibGVzKSwKLSAgIHRoaXMgYWxnb3JpdGhtIG5vcm1hbGx5IHRyaWVzIHRvIG9ubHkgYWRqdXN0IHRoZSBnYWluIChiZXR3ZWVuIDQwIGFuZAotICAgODAgJSkgYW5kIGlmIHRoYXQgZG9lcyBub3QgaGVscCwgb25seSB0aGVuIGNoYW5nZXMgZXhwb3N1cmUuIFRoaXMgbGVhZHMKLSAgIHRvIGEgbXVjaCBtb3JlIHN0YWJsZSBpbWFnZSB0aGVuIHVzaW5nIHRoZSBrbmVlIGFsZ29yaXRobSB3aGljaCBhdAotICAgY2VydGFpbiBwb2ludHMgb2YgdGhlIGtuZWUgZ3JhcGggd2lsbCBvbmx5IHRyeSB0byBhZGp1c3QgZXhwb3N1cmUsCi0gICB3aGljaCBsZWFkcyB0byBvc2NpbGF0aW5nIGFzIG9uZSBleHBvc3VyZSBzdGVwIGlzIGh1Z2UuCi0KLSAgIE5vdGUgdGhpcyBhc3N1bWVzIHRoYXQgdGhlIHNkIHN0cnVjdCBmb3IgdGhlIGNhbSBpbiBxdWVzdGlvbiBoYXMKLSAgIGV4cF90b29faGlnaF9jbnQgYW5kIGV4cF90b29faGlnaF9jbnQgaW50IG1lbWJlcnMgZm9yIHVzZSBieSB0aGlzIGZ1bmN0aW9uLgotCi0gICBSZXR1cm5zIDAgaWYgbm8gY2hhbmdlcyB3ZXJlIG1hZGUsIDEgaWYgdGhlIGdhaW4gYW5kIG9yIGV4cG9zdXJlIHNldHRpbmdzCi0gICB3aGVyZSBjaGFuZ2VkLiAqLwotc3RhdGljIGludCBnc3BjYV9jb2Fyc2VfZ3JhaW5lZF9leHBvX2F1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQlpbnQgYXZnX2x1bSwgaW50IGRlc2lyZWRfYXZnX2x1bSwgaW50IGRlYWR6b25lKQotewotCWludCBpLCBzdGVwcywgZ2Fpbiwgb3JpZ19nYWluLCBleHBvc3VyZSwgb3JpZ19leHBvc3VyZTsKLQlpbnQgZ2Fpbl9sb3csIGdhaW5faGlnaDsKLQljb25zdCBzdHJ1Y3QgY3RybCAqZ2Fpbl9jdHJsID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgY3RybCAqZXhwb3N1cmVfY3RybCA9IE5VTEw7Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCWludCByZXR2YWwgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGdzcGNhX2Rldi0+c2RfZGVzYy0+bmN0cmxzOyBpKyspIHsKLQkJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZ3NwY2FfZGV2LT5zZF9kZXNjLT5jdHJsc1tpXS5xY3RybC5pZCA9PSBWNEwyX0NJRF9HQUlOKQotCQkJZ2Fpbl9jdHJsID0gJmdzcGNhX2Rldi0+c2RfZGVzYy0+Y3RybHNbaV07Ci0JCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmN0cmxzW2ldLnFjdHJsLmlkID09IFY0TDJfQ0lEX0VYUE9TVVJFKQotCQkJZXhwb3N1cmVfY3RybCA9ICZnc3BjYV9kZXYtPnNkX2Rlc2MtPmN0cmxzW2ldOwotCX0KLQlpZiAoIWdhaW5fY3RybCB8fCAhZXhwb3N1cmVfY3RybCkgewotCQlQREVCVUcoRF9FUlIsICJFcnJvcjogZ3NwY2FfY29hcnNlX2dyYWluZWRfZXhwb19hdXRvZ2FpbiAiCi0JCQkiY2FsbGVkIG9uIGNhbSB3aXRob3V0IGdhaW4gb3IgZXhwb3N1cmUiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGdhaW5fY3RybC0+Z2V0KGdzcGNhX2RldiwgJmdhaW4pIHx8Ci0JICAgIGV4cG9zdXJlX2N0cmwtPmdldChnc3BjYV9kZXYsICZleHBvc3VyZSkpCi0JCXJldHVybiAwOwotCi0Jb3JpZ19nYWluID0gZ2FpbjsKLQlvcmlnX2V4cG9zdXJlID0gZXhwb3N1cmU7Ci0JZ2Fpbl9sb3cgPQotCQkoZ2Fpbl9jdHJsLT5xY3RybC5tYXhpbXVtIC0gZ2Fpbl9jdHJsLT5xY3RybC5taW5pbXVtKSAvIDUgKiAyOwotCWdhaW5fbG93ICs9IGdhaW5fY3RybC0+cWN0cmwubWluaW11bTsKLQlnYWluX2hpZ2ggPQotCQkoZ2Fpbl9jdHJsLT5xY3RybC5tYXhpbXVtIC0gZ2Fpbl9jdHJsLT5xY3RybC5taW5pbXVtKSAvIDUgKiA0OwotCWdhaW5faGlnaCArPSBnYWluX2N0cmwtPnFjdHJsLm1pbmltdW07Ci0KLQkvKiBJZiB3ZSBhcmUgb2YgYSBtdWx0aXBsZSBvZiBkZWFkem9uZSwgZG8gbXVsdGlwbGUgc3RlcHMgdG8gcmVhY2ggdGhlCi0JICAgZGVzaXJlZCBsdW1pbmF0aW9uIGZhc3QgKHdpdGggdGhlIHJpc2Mgb2YgYSBzbGlnaHQgb3ZlcnNob290KSAqLwotCXN0ZXBzID0gKGRlc2lyZWRfYXZnX2x1bSAtIGF2Z19sdW0pIC8gZGVhZHpvbmU7Ci0KLQlQREVCVUcoRF9GUkFNLCAiYXV0b2dhaW46IGx1bTogJWQsIGRlc2lyZWQ6ICVkLCBzdGVwczogJWQiLAotCQlhdmdfbHVtLCBkZXNpcmVkX2F2Z19sdW0sIHN0ZXBzKTsKLQotCWlmICgoZ2FpbiArIHN0ZXBzKSA+IGdhaW5faGlnaCAmJgotCSAgICBzZC0+ZXhwb3N1cmUgPCBleHBvc3VyZV9jdHJsLT5xY3RybC5tYXhpbXVtKSB7Ci0JCWdhaW4gPSBnYWluX2hpZ2g7Ci0JCXNkLT5leHBfdG9vX2xvd19jbnQrKzsKLQl9IGVsc2UgaWYgKChnYWluICsgc3RlcHMpIDwgZ2Fpbl9sb3cgJiYKLQkJICAgc2QtPmV4cG9zdXJlID4gZXhwb3N1cmVfY3RybC0+cWN0cmwubWluaW11bSkgewotCQlnYWluID0gZ2Fpbl9sb3c7Ci0JCXNkLT5leHBfdG9vX2hpZ2hfY250Kys7Ci0JfSBlbHNlIHsKLQkJZ2FpbiArPSBzdGVwczsKLQkJaWYgKGdhaW4gPiBnYWluX2N0cmwtPnFjdHJsLm1heGltdW0pCi0JCQlnYWluID0gZ2Fpbl9jdHJsLT5xY3RybC5tYXhpbXVtOwotCQllbHNlIGlmIChnYWluIDwgZ2Fpbl9jdHJsLT5xY3RybC5taW5pbXVtKQotCQkJZ2FpbiA9IGdhaW5fY3RybC0+cWN0cmwubWluaW11bTsKLQkJc2QtPmV4cF90b29faGlnaF9jbnQgPSAwOwotCQlzZC0+ZXhwX3Rvb19sb3dfY250ID0gMDsKLQl9Ci0KLQlpZiAoc2QtPmV4cF90b29faGlnaF9jbnQgPiAzKSB7Ci0JCWV4cG9zdXJlLS07Ci0JCXNkLT5leHBfdG9vX2hpZ2hfY250ID0gMDsKLQl9IGVsc2UgaWYgKHNkLT5leHBfdG9vX2xvd19jbnQgPiAzKSB7Ci0JCWV4cG9zdXJlKys7Ci0JCXNkLT5leHBfdG9vX2xvd19jbnQgPSAwOwotCX0KLQotCWlmIChnYWluICE9IG9yaWdfZ2FpbikgewotCQlnYWluX2N0cmwtPnNldChnc3BjYV9kZXYsIGdhaW4pOwotCQlyZXR2YWwgPSAxOwotCX0KLQlpZiAoZXhwb3N1cmUgIT0gb3JpZ19leHBvc3VyZSkgewotCQlleHBvc3VyZV9jdHJsLT5zZXQoZ3NwY2FfZGV2LCBleHBvc3VyZSk7Ci0JCXJldHZhbCA9IDE7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYwppbmRleCAzNmE0NmZjLi4wNTdlMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCkBAIC02MDksNyArNjA5LDcgQEAKICAqIGJ1ZmZlcnMsIHRoZXJlIGFyZSBzb21lIHByZXR0eSBzdHJpY3QgcmVhbCB0aW1lIGNvbnN0cmFpbnRzIGZvcgogICogaXNvY2hyb25vdXMgdHJhbnNmZXIgZm9yIGxhcmdlciBmcmFtZSBzaXplcykuCiAgKi8KLS8qamZtOiB0aGlzIHZhbHVlIHdvcmtzIHdlbGwgZm9yIDE2MDB4MTIwMCwgYnV0IG5vdCA4MDB4NjAwIC0gc2VlIGlzb2NfaW5pdCAqLworLypqZm06IHRoaXMgdmFsdWUgZG9lcyBub3Qgd29yayBmb3IgODAweDYwMCAtIHNlZSBpc29jX2luaXQgKi8KICNkZWZpbmUgT1ZGWDJfQlVMS19TSVpFICgxMyAqIDQwOTYpCiAKIC8qIEkyQyByZWdpc3RlcnMgKi8KQEAgLTMzMDcsNiArMzMwNyw3IEBACiAKIAlnc3BjYV9kZXYtPmNhbS5jdHJscyA9IHNkLT5jdHJsczsKIAlzZC0+cXVhbGl0eSA9IFFVQUxJVFlfREVGOworCXNkLT5mcmFtZV9yYXRlID0gMTU7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0NjksNyArMzQ3MCw2IEBACiAJCQkJQVJSQVlfU0laRShpbml0XzUxOV9vdjc2NjApKTsKIAkJd3JpdGVfaTJjX3JlZ3ZhbHMoc2QsIG5vcm1fNzY2MCwgQVJSQVlfU0laRShub3JtXzc2NjApKTsKIAkJc2QtPmdzcGNhX2Rldi5jdXJyX21vZGUgPSAxOwkvKiA2NDB4NDgwICovCi0JCXNkLT5mcmFtZV9yYXRlID0gMTU7CiAJCW92NTE5X3NldF9tb2RlKHNkKTsKIAkJb3Y1MTlfc2V0X2ZyKHNkKTsKIAkJc2QtPmN0cmxzW0NPTE9SU10ubWF4ID0gNDsJLyogMC4uNCAqLwpAQCAtMzUxMSw3ICszNTExLDcgQEAKIAogCXN3aXRjaCAoc2QtPmJyaWRnZSkgewogCWNhc2UgQlJJREdFX09WRlgyOgotCQlpZiAoZ3NwY2FfZGV2LT53aWR0aCA9PSAxNjAwKQorCQlpZiAoZ3NwY2FfZGV2LT53aWR0aCAhPSA4MDApCiAJCQlnc3BjYV9kZXYtPmNhbS5idWxrX3NpemUgPSBPVkZYMl9CVUxLX1NJWkU7CiAJCWVsc2UKIAkJCWdzcGNhX2Rldi0+Y2FtLmJ1bGtfc2l6ZSA9IDcgKiA0MDk2OwpAQCAtNDQ3OCw3ICs0NDc4LDcgQEAKIAlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7CiAKIAkvKiBBIHNob3J0IHJlYWQgc2lnbmFscyBFT0YgKi8KLQlpZiAobGVuIDwgT1ZGWDJfQlVMS19TSVpFKSB7CisJaWYgKGxlbiA8IGdzcGNhX2Rldi0+Y2FtLmJ1bGtfc2l6ZSkgewogCQkvKiBJZiB0aGUgZnJhbWUgaXMgc2hvcnQsIGFuZCBpdCBpcyBvbmUgb2YgdGhlIGZpcnN0IG9uZXMKIAkJICAgdGhlIHNlbnNvciBhbmQgYnJpZGdlIGFyZSBzdGlsbCBzeW5jaW5nLCBzbyBkcm9wIGl0LiAqLwogCQlpZiAoc2QtPmZpcnN0X2ZyYW1lKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYwppbmRleCA2NDE1YWZmLi44MWI4YTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogCXUzMiBwa3RzejsJCQkvKiAodXNlZCBieSBwa3Rfc2NhbikgKi8KIAl1MTYgbnBrdDsKLQl1OCBuY2hnOworCXM4IG5jaGc7CiAJczggc2hvcnRfbWFyazsKIAogCXU4IHF1YWxpdHk7CQkJLyogaW1hZ2UgcXVhbGl0eSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfaGRjcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfaGRjcy5oCmluZGV4IGI1MzhkY2UuLmExNGE4NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogI2RlZmluZSBIRENTX1NMRUVQX01PREUJCSgxIDw8IDEpCiAKICNkZWZpbmUgSERDU19ERUZBVUxUX0VYUE9TVVJFCTQ4Ci0jZGVmaW5lIEhEQ1NfREVGQVVMVF9HQUlOCTEyOAorI2RlZmluZSBIRENTX0RFRkFVTFRfR0FJTgk1MAogCiBzdGF0aWMgaW50IGhkY3NfcHJvYmVfMXgwMChzdHJ1Y3Qgc2QgKnNkKTsKIHN0YXRpYyBpbnQgaGRjc19wcm9iZV8xMDIwKHN0cnVjdCBzZCAqc2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwppbmRleCBhNGU0ZGZkLi4wZmI3NTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwpAQCAtMTMyOCw2ICsxMzI4LDggQEAKIAlpZiAoIWl0di0+aGFzX2N4MjM0MTUpCiAJCXdyaXRlX3JlZ19zeW5jKDB4MDMsIElWVFZfUkVHX0RNQUNPTlRST0wpOwogCisJaXZ0dl9zX3N0ZF9lbmMoaXR2LCAmaXR2LT50dW5lcl9zdGQpOworCiAJLyogRGVmYXVsdCBpbnRlcnJ1cHRzIGVuYWJsZWQuIEZvciB0aGUgUFZSMzUwIHRoaXMgaW5jbHVkZXMgdGhlCiAJICAgZGVjb2RlciBWU1lOQyBpbnRlcnJ1cHQsIHdoaWNoIGlzIGFsd2F5cyBvbi4gSXQgaXMgbm90IG9ubHkgdXNlZAogCSAgIGR1cmluZyBkZWNvZGluZyBidXQgYWxzbyBieSB0aGUgT1NELgpAQCAtMTMzNiwxMiArMTMzOCwxMCBAQAogCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7CiAJCWl2dHZfY2xlYXJfaXJxX21hc2soaXR2LCBJVlRWX0lSUV9NQVNLX0lOSVQgfCBJVlRWX0lSUV9ERUNfVlNZTkMpOwogCQlpdnR2X3NldF9vc2RfYWxwaGEoaXR2KTsKLQl9Ci0JZWxzZQorCQlpdnR2X3Nfc3RkX2RlYyhpdHYsICZpdHYtPnR1bmVyX3N0ZCk7CisJfSBlbHNlIHsKIAkJaXZ0dl9jbGVhcl9pcnFfbWFzayhpdHYsIElWVFZfSVJRX01BU0tfSU5JVCk7Ci0KLQkvKiBGb3IgY2FyZHMgd2l0aCB2aWRlbyBvdXQsIHRoaXMgY2FsbCBuZWVkcyBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KLQlpdnR2X3Nfc3RkKE5VTEwsICZmaCwgJml0di0+dHVuZXJfc3RkKTsKKwl9CiAKIAkvKiBTZXR1cCBpbml0aWFsIGNvbnRyb2xzICovCiAJY3gyMzQxeF9oYW5kbGVyX3NldHVwKCZpdHYtPmN4aGRsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5jCmluZGV4IDE0YTFjZWEuLjAyYzVhZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuYwpAQCAtMjgwLDggKzI4MCw2IEBACiB7CiAJaW50IHJjID0gMDsKIAl2NGwyX3N0ZF9pZCBzdGQ7Ci0Jc3RydWN0IGl2dHZfb3Blbl9pZCBmaDsKLQlmaC5pdHYgPSBpdHY7CiAKIAlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkKIAkJLyogRGlzcGxheSB0ZXN0IGltYWdlIGR1cmluZyByZXN0YXJ0ICovCkBAIC0zMDEsMTQgKzI5OSwxOSBAQAogCS8qIEFsbG93IHNldHRpbmdzIHRvIHJlbG9hZCAqLwogCWl2dHZfbWFpbGJveF9jYWNoZV9pbnZhbGlkYXRlKGl0dik7CiAKLQkvKiBSZXN0b3JlIHZpZGVvIHN0YW5kYXJkICovCisJLyogUmVzdG9yZSBlbmNvZGVyIHZpZGVvIHN0YW5kYXJkICovCiAJc3RkID0gaXR2LT5zdGQ7CiAJaXR2LT5zdGQgPSAwOwotCWl2dHZfc19zdGQoTlVMTCwgJmZoLCAmc3RkKTsKKwlpdnR2X3Nfc3RkX2VuYyhpdHYsICZzdGQpOwogCiAJaWYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpIHsKIAkJaXZ0dl9pbml0X21wZWdfZGVjb2RlcihpdHYpOwogCisJCS8qIFJlc3RvcmUgZGVjb2RlciB2aWRlbyBzdGFuZGFyZCAqLworCQlzdGQgPSBpdHYtPnN0ZF9vdXQ7CisJCWl0di0+c3RkX291dCA9IDA7CisJCWl2dHZfc19zdGRfZGVjKGl0diwgJnN0ZCk7CisKIAkJLyogUmVzdG9yZSBmcmFtZWJ1ZmZlciBpZiBhY3RpdmUgKi8KIAkJaWYgKGl0di0+aXZ0dmZiX3Jlc3RvcmUpCiAJCQlpdHYtPml2dHZmYl9yZXN0b3JlKGl0dik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwppbmRleCAxNjg5NzgzLi4xMjBjN2Q4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKQEAgLTEwNzEsMjggKzEwNzEsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaXZ0dl9zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpzdGQpCit2b2lkIGl2dHZfc19zdGRfZW5jKHN0cnVjdCBpdnR2ICppdHYsIHY0bDJfc3RkX2lkICpzdGQpCiB7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0Jc3RydWN0IGl2dHYgKml0diA9IGZoMmlkKGZoKS0+aXR2OwotCXN0cnVjdCB5dXZfcGxheWJhY2tfaW5mbyAqeWkgPSAmaXR2LT55dXZfaW5mbzsKLQlpbnQgZjsKLQotCWlmICgoKnN0ZCAmIFY0TDJfU1REX0FMTCkgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKnN0ZCA9PSBpdHYtPnN0ZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodGVzdF9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncykgfHwKLQkgICAgYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSA+IDAgfHwKLQkgICAgYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpID4gMCkgewotCQkvKiBTd2l0Y2hpbmcgc3RhbmRhcmQgd291bGQgdHVybiBvZmYgdGhlIHJhZGlvIG9yIG1lc3MKLQkJICAgd2l0aCBhbHJlYWR5IHJ1bm5pbmcgc3RyZWFtcywgcHJldmVudCB0aGF0IGJ5Ci0JCSAgIHJldHVybmluZyBFQlVTWS4gKi8KLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KIAlpdHYtPnN0ZCA9ICpzdGQ7CiAJaXR2LT5pc182MGh6ID0gKCpzdGQgJiBWNEwyX1NURF81MjVfNjApID8gMSA6IDA7CiAJaXR2LT5pc181MGh6ID0gIWl0di0+aXNfNjBoejsKQEAgLTExMDYsNDggKzEwODYsNzkgQEAKIAlpZiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfQ1gyNTg0MCkKIAkJaXR2LT52Ymkuc2xpY2VkX2RlY29kZXJfbGluZV9zaXplID0gaXR2LT5pc182MGh6ID8gMjcyIDogMjg0OwogCi0JSVZUVl9ERUJVR19JTkZPKCJTd2l0Y2hpbmcgc3RhbmRhcmQgdG8gJWxseC5cbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpaXR2LT5zdGQpOwotCiAJLyogVHVuZXIgKi8KIAlpdnR2X2NhbGxfYWxsKGl0diwgY29yZSwgc19zdGQsIGl0di0+c3RkKTsKK30KIAotCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7Ci0JCS8qIHNldCBkaXNwbGF5IHN0YW5kYXJkICovCi0JCWl0di0+c3RkX291dCA9ICpzdGQ7Ci0JCWl0di0+aXNfb3V0XzYwaHogPSBpdHYtPmlzXzYwaHo7Ci0JCWl0di0+aXNfb3V0XzUwaHogPSBpdHYtPmlzXzUwaHo7Ci0JCWl2dHZfY2FsbF9hbGwoaXR2LCB2aWRlbywgc19zdGRfb3V0cHV0LCBpdHYtPnN0ZF9vdXQpOwordm9pZCBpdnR2X3Nfc3RkX2RlYyhzdHJ1Y3QgaXZ0diAqaXR2LCB2NGwyX3N0ZF9pZCAqc3RkKQoreworCXN0cnVjdCB5dXZfcGxheWJhY2tfaW5mbyAqeWkgPSAmaXR2LT55dXZfaW5mbzsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgZjsKIAotCQkvKgotCQkgKiBUaGUgbmV4dCBmaXJtd2FyZSBjYWxsIGlzIHRpbWUgc2Vuc2l0aXZlLiBUaW1lIGl0IHRvCi0JCSAqIGF2b2lkIHJpc2sgb2YgYSBoYXJkIGxvY2ssIGJ5IHRyeWluZyB0byBlbnN1cmUgdGhlIGNhbGwKLQkJICogaGFwcGVucyB3aXRoaW4gdGhlIGZpcnN0IDEwMCBsaW5lcyBvZiB0aGUgdG9wIGZpZWxkLgotCQkgKiBNYWtlIDQgYXR0ZW1wdHMgdG8gc3luYyB0byB0aGUgZGVjb2RlciBiZWZvcmUgZ2l2aW5nIHVwLgotCQkgKi8KLQkJZm9yIChmID0gMDsgZiA8IDQ7IGYrKykgewotCQkJcHJlcGFyZV90b193YWl0KCZpdHYtPnZzeW5jX3dhaXRxLCAmd2FpdCwKLQkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJaWYgKChyZWFkX3JlZyhJVlRWX1JFR19ERUNfTElORV9GSUVMRCkgPj4gMTYpIDwgMTAwKQotCQkJCWJyZWFrOwotCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDI1KSk7Ci0JCX0KLQkJZmluaXNoX3dhaXQoJml0di0+dnN5bmNfd2FpdHEsICZ3YWl0KTsKKwkvKiBzZXQgZGlzcGxheSBzdGFuZGFyZCAqLworCWl0di0+c3RkX291dCA9ICpzdGQ7CisJaXR2LT5pc19vdXRfNjBoeiA9ICgqc3RkICYgVjRMMl9TVERfNTI1XzYwKSA/IDEgOiAwOworCWl0di0+aXNfb3V0XzUwaHogPSAhaXR2LT5pc19vdXRfNjBoejsKKwlpdnR2X2NhbGxfYWxsKGl0diwgdmlkZW8sIHNfc3RkX291dHB1dCwgaXR2LT5zdGRfb3V0KTsKIAotCQlpZiAoZiA9PSA0KQotCQkJSVZUVl9XQVJOKCJNb2RlIGNoYW5nZSBmYWlsZWQgdG8gc3luYyB0byBkZWNvZGVyXG4iKTsKLQotCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfU1RBTkRBUkQsIDEsIGl0di0+aXNfb3V0XzUwaHopOwotCQlpdHYtPm1haW5fcmVjdC5sZWZ0ID0gaXR2LT5tYWluX3JlY3QudG9wID0gMDsKLQkJaXR2LT5tYWluX3JlY3Qud2lkdGggPSA3MjA7Ci0JCWl0di0+bWFpbl9yZWN0LmhlaWdodCA9IGl0di0+Y3hoZGwuaGVpZ2h0OwotCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX09TRF9TRVRfRlJBTUVCVUZGRVJfV0lORE9XLCA0LAotCQkJNzIwLCBpdHYtPm1haW5fcmVjdC5oZWlnaHQsIDAsIDApOwotCQl5aS0+bWFpbl9yZWN0ID0gaXR2LT5tYWluX3JlY3Q7Ci0JCWlmICghaXR2LT5vc2RfaW5mbykgewotCQkJeWktPm9zZF9mdWxsX3cgPSA3MjA7Ci0JCQl5aS0+b3NkX2Z1bGxfaCA9IGl0di0+aXNfb3V0XzUwaHogPyA1NzYgOiA0ODA7Ci0JCX0KKwkvKgorCSAqIFRoZSBuZXh0IGZpcm13YXJlIGNhbGwgaXMgdGltZSBzZW5zaXRpdmUuIFRpbWUgaXQgdG8KKwkgKiBhdm9pZCByaXNrIG9mIGEgaGFyZCBsb2NrLCBieSB0cnlpbmcgdG8gZW5zdXJlIHRoZSBjYWxsCisJICogaGFwcGVucyB3aXRoaW4gdGhlIGZpcnN0IDEwMCBsaW5lcyBvZiB0aGUgdG9wIGZpZWxkLgorCSAqIE1ha2UgNCBhdHRlbXB0cyB0byBzeW5jIHRvIHRoZSBkZWNvZGVyIGJlZm9yZSBnaXZpbmcgdXAuCisJICovCisJZm9yIChmID0gMDsgZiA8IDQ7IGYrKykgeworCQlwcmVwYXJlX3RvX3dhaXQoJml0di0+dnN5bmNfd2FpdHEsICZ3YWl0LAorCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKChyZWFkX3JlZyhJVlRWX1JFR19ERUNfTElORV9GSUVMRCkgPj4gMTYpIDwgMTAwKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygyNSkpOwogCX0KKwlmaW5pc2hfd2FpdCgmaXR2LT52c3luY193YWl0cSwgJndhaXQpOworCisJaWYgKGYgPT0gNCkKKwkJSVZUVl9XQVJOKCJNb2RlIGNoYW5nZSBmYWlsZWQgdG8gc3luYyB0byBkZWNvZGVyXG4iKTsKKworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9TVEFOREFSRCwgMSwgaXR2LT5pc19vdXRfNTBoeik7CisJaXR2LT5tYWluX3JlY3QubGVmdCA9IDA7CisJaXR2LT5tYWluX3JlY3QudG9wID0gMDsKKwlpdHYtPm1haW5fcmVjdC53aWR0aCA9IDcyMDsKKwlpdHYtPm1haW5fcmVjdC5oZWlnaHQgPSBpdHYtPmlzX291dF81MGh6ID8gNTc2IDogNDgwOworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9GUkFNRUJVRkZFUl9XSU5ET1csIDQsCisJCTcyMCwgaXR2LT5tYWluX3JlY3QuaGVpZ2h0LCAwLCAwKTsKKwl5aS0+bWFpbl9yZWN0ID0gaXR2LT5tYWluX3JlY3Q7CisJaWYgKCFpdHYtPm9zZF9pbmZvKSB7CisJCXlpLT5vc2RfZnVsbF93ID0gNzIwOworCQl5aS0+b3NkX2Z1bGxfaCA9IGl0di0+aXNfb3V0XzUwaHogPyA1NzYgOiA0ODA7CisJfQorfQorCitpbnQgaXZ0dl9zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJc3RydWN0IGl2dHYgKml0diA9IGZoMmlkKGZoKS0+aXR2OworCisJaWYgKCgqc3RkICYgVjRMMl9TVERfQUxMKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgqc3RkID09IGl0di0+c3RkKQorCQlyZXR1cm4gMDsKKworCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9SQURJT19VU0VSLCAmaXR2LT5pX2ZsYWdzKSB8fAorCSAgICBhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCB8fAorCSAgICBhdG9taWNfcmVhZCgmaXR2LT5kZWNvZGluZykgPiAwKSB7CisJCS8qIFN3aXRjaGluZyBzdGFuZGFyZCB3b3VsZCBtZXNzIHdpdGggYWxyZWFkeSBydW5uaW5nCisJCSAgIHN0cmVhbXMsIHByZXZlbnQgdGhhdCBieSByZXR1cm5pbmcgRUJVU1kuICovCisJCXJldHVybiAtRUJVU1k7CisJfQorCisJSVZUVl9ERUJVR19JTkZPKCJTd2l0Y2hpbmcgc3RhbmRhcmQgdG8gJWxseC5cbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpaXR2LT5zdGQpOworCisJaXZ0dl9zX3N0ZF9lbmMoaXR2LCBzdGQpOworCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKQorCQlpdnR2X3Nfc3RkX2RlYyhpdHYsIHN0ZCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE3MywxNCArMTE4NCwxMCBAQAogCiAJaXZ0dl9jYWxsX2FsbChpdHYsIHR1bmVyLCBnX3R1bmVyLCB2dCk7CiAKLQlpZiAodGVzdF9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncykpIHsKKwlpZiAodnQtPnR5cGUgPT0gVjRMMl9UVU5FUl9SQURJTykKIAkJc3RybGNweSh2dC0+bmFtZSwgIml2dHYgUmFkaW8gVHVuZXIiLCBzaXplb2YodnQtPm5hbWUpKTsKLQkJdnQtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCX0gZWxzZSB7CisJZWxzZQogCQlzdHJsY3B5KHZ0LT5uYW1lLCAiaXZ0diBUViBUdW5lciIsIHNpemVvZih2dC0+bmFtZSkpOwotCQl2dC0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCX0KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuaAppbmRleCA1OGYwMDM0Li44OTE4NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmgKQEAgLTI3LDcgKzI3LDggQEAKIHZvaWQgaXZ0dl9zZXRfb3NkX2FscGhhKHN0cnVjdCBpdnR2ICppdHYpOwogaW50IGl2dHZfc2V0X3NwZWVkKHN0cnVjdCBpdnR2ICppdHYsIGludCBzcGVlZCk7CiB2b2lkIGl2dHZfc2V0X2Z1bmNzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpOwotaW50IGl2dHZfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqc3RkKTsKK3ZvaWQgaXZ0dl9zX3N0ZF9lbmMoc3RydWN0IGl2dHYgKml0diwgdjRsMl9zdGRfaWQgKnN0ZCk7Cit2b2lkIGl2dHZfc19zdGRfZGVjKHN0cnVjdCBpdnR2ICppdHYsIHY0bDJfc3RkX2lkICpzdGQpOwogaW50IGl2dHZfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKnZmKTsKIGludCBpdnR2X3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgaW5wKTsKIGxvbmcgaXZ0dl92NGwyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKaW5kZXggOTQyNjgzMy4uZTc3OTRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJCXY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF9hdWRpbywgYXVkaW8sIHNfc3RyZWFtLCAxKTsKIAkJLyogQXZvaWQgdW5wcmVkaWN0YWJsZSBQQ0kgYnVzIGhhbmcgLSBkaXNhYmxlIHZpZGVvIGNsb2NrcyAqLwogCQl2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfdmlkZW8sIHZpZGVvLCBzX3N0cmVhbSwgMCk7Ci0JCWl2dHZfbXNsZWVwX3RpbWVvdXQoMzAwLCAxKTsKKwkJaXZ0dl9tc2xlZXBfdGltZW91dCgzMDAsIDApOwogCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19JTklUSUFMSVpFX0lOUFVULCAwKTsKIAkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19zdHJlYW0sIDEpOwogCX0KQEAgLTgzNCw3ICs4MzQsNyBAQAogCQl9CiAKIAkJLyogSGFuZGxlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KLQkJaXZ0dl9tc2xlZXBfdGltZW91dCgxMDAsIDEpOworCQlpdnR2X21zbGVlcF90aW1lb3V0KDEwMCwgMCk7CiAJfQogCiAJYXRvbWljX2RlYygmaXR2LT5jYXB0dXJpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuYwppbmRleCBiNmViNTFjLi4yOTNkYjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuYwpAQCAtNzEsNyArNzEsNyBAQAogCSAgIFR1cm5pbmcgdGhpcyBzaWduYWwgb24gYW5kIG9mZiBjYW4gY29uZnVzZSBjZXJ0YWluCiAJICAgVFZzLiBBcyBmYXIgYXMgSSBjYW4gdGVsbCB0aGVyZSBpcyBubyByZWFzb24gbm90IHRvCiAJICAgdHJhbnNtaXQgdGhpcyBzaWduYWwuICovCi0JaWYgKChpdHYtPnN0ZCAmIFY0TDJfU1REXzYyNV81MCkgJiYgIWVuYWJsZWQpIHsKKwlpZiAoKGl0di0+c3RkX291dCAmIFY0TDJfU1REXzYyNV81MCkgJiYgIWVuYWJsZWQpIHsKIAkJZW5hYmxlZCA9IDE7CiAJCW1vZGUgPSAweDA4OyAgLyogNHgzIGZ1bGwgZm9ybWF0ICovCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jCmluZGV4IDE3MjQ3NDUuLjZiN2M5YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0dmZiLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCiBzdGF0aWMgaW50IGl2dHZmYl9zZXRfZGlzcGxheV93aW5kb3coc3RydWN0IGl2dHYgKml0diwgc3RydWN0IHY0bDJfcmVjdCAqaXZ0dl93aW5kb3cpCiB7Ci0JaW50IG9zZF9oZWlnaHRfbGltaXQgPSBpdHYtPmlzXzUwaHogPyA1NzYgOiA0ODA7CisJaW50IG9zZF9oZWlnaHRfbGltaXQgPSBpdHYtPmlzX291dF81MGh6ID8gNTc2IDogNDgwOwogCiAJLyogT25seSBmYWlsIGlmIHJlc29sdXRpb24gdG9vIGhpZ2gsIG90aGVyd2lzZSBmdWRnZSB0aGUgc3RhcnQgY29vcmRzLiAqLwogCWlmICgoaXZ0dl93aW5kb3ctPmhlaWdodCA+IG9zZF9oZWlnaHRfbGltaXQpIHx8IChpdnR2X3dpbmRvdy0+d2lkdGggPiBJVlRWX09TRF9NQVhfV0lEVEgpKQpAQCAtNDcxLDkgKzQ3MSw5IEBACiAJCQl2YmxhbmsuZmxhZ3MgPSBGQl9WQkxBTktfSEFWRV9DT1VOVCB8RkJfVkJMQU5LX0hBVkVfVkNPVU5UIHwKIAkJCQkJRkJfVkJMQU5LX0hBVkVfVlNZTkM7CiAJCQl0cmFjZSA9IHJlYWRfcmVnKElWVFZfUkVHX0RFQ19MSU5FX0ZJRUxEKSA+PiAxNjsKLQkJCWlmIChpdHYtPmlzXzUwaHogJiYgdHJhY2UgPiAzMTIpCisJCQlpZiAoaXR2LT5pc19vdXRfNTBoeiAmJiB0cmFjZSA+IDMxMikKIAkJCQl0cmFjZSAtPSAzMTI7Ci0JCQllbHNlIGlmIChpdHYtPmlzXzYwaHogJiYgdHJhY2UgPiAyNjIpCisJCQllbHNlIGlmIChpdHYtPmlzX291dF82MGh6ICYmIHRyYWNlID4gMjYyKQogCQkJCXRyYWNlIC09IDI2MjsKIAkJCWlmICh0cmFjZSA9PSAxKQogCQkJCXZibGFuay5mbGFncyB8PSBGQl9WQkxBTktfVlNZTkNJTkc7CkBAIC02NTYsNyArNjU2LDcgQEAKIAlJVlRWRkJfREVCVUdfSU5GTygiaXZ0dmZiX2NoZWNrX3ZhclxuIik7CiAKIAkvKiBTZXQgYmFzZSByZWZlcmVuY2VzIGZvciBtb2RlIGNhbGNzLiAqLwotCWlmIChpdHYtPmlzXzUwaHopIHsKKwlpZiAoaXR2LT5pc19vdXRfNTBoeikgewogCQlwaXhjbG9jayA9IDg0MzE2OwogCQlobGltaXQgPSA3NzY7CiAJCXZsaW1pdCA9IDU5MTsKQEAgLTc4NCwxMiArNzg0LDEyIEBACiAJICAgSWYgdGhlIG1hcmdpbnMgYXJlIHRvbyBsYXJnZSwganVzdCBjZW50ZXIgdGhlIHNjcmVlbgogCSAgIChlbmZvcmNpbmcgbWFyZ2lucyBjYXVzZXMgdG9vIG1hbnkgcHJvYmxlbXMpICovCiAKLQlpZiAodmFyLT5sZWZ0X21hcmdpbiArIHZhci0+eHJlcyA+IElWVFZfT1NEX01BWF9XSURUSCArIDEpIHsKKwlpZiAodmFyLT5sZWZ0X21hcmdpbiArIHZhci0+eHJlcyA+IElWVFZfT1NEX01BWF9XSURUSCArIDEpCiAJCXZhci0+bGVmdF9tYXJnaW4gPSAxICsgKChJVlRWX09TRF9NQVhfV0lEVEggLSB2YXItPnhyZXMpIC8gMik7Ci0JfQotCWlmICh2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyA+IChpdHYtPmlzXzUwaHogPyA1NzcgOiA0ODEpKSB7Ci0JCXZhci0+dXBwZXJfbWFyZ2luID0gMSArICgoKGl0di0+aXNfNTBoeiA/IDU3NiA6IDQ4MCkgLSB2YXItPnlyZXMpIC8gMik7Ci0JfQorCisJaWYgKHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzID4gKGl0di0+aXNfb3V0XzUwaHogPyA1NzcgOiA0ODEpKQorCQl2YXItPnVwcGVyX21hcmdpbiA9IDEgKyAoKChpdHYtPmlzX291dF81MGh6ID8gNTc2IDogNDgwKSAtCisJCQl2YXItPnlyZXMpIC8gMik7CiAKIAkvKiBNYWludGFpbiBvdmVyYWxsICdzaXplJyBmb3IgYSBjb25zdGFudCByZWZyZXNoIHJhdGUgKi8KIAl2YXItPnJpZ2h0X21hcmdpbiA9IGhsaW1pdCAtIHZhci0+bGVmdF9tYXJnaW4gLSB2YXItPnhyZXM7CkBAIC04MzYsNyArODM2LDEyIEBACiAJdTMyIG9zZF9wYW5faW5kZXg7CiAJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKSBpbmZvLT5wYXI7CiAKLQlvc2RfcGFuX2luZGV4ID0gKHZhci0+eG9mZnNldCArICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCkpKnZhci0+Yml0c19wZXJfcGl4ZWwvODsKKwlpZiAodmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsIHx8CisJICAgIHZhci0+eG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvc2RfcGFuX2luZGV4ID0gdmFyLT55b2Zmc2V0ICogaW5mby0+Zml4LmxpbmVfbGVuZ3RoCisJCSAgICAgICsgdmFyLT54b2Zmc2V0ICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIC8gODsKIAl3cml0ZV9yZWcob3NkX3Bhbl9pbmRleCwgMHgwMkEwQyk7CiAKIAkvKiBQYXNzIHRoaXMgaW5mbyBiYWNrIHRoZSB5dXYgaGFuZGxlciAqLwpAQCAtMTAwMywxOSArMTAwOCwyMSBAQAogCS8qIEhhcmR3YXJlIGNvb3JkcyBzdGFydCBhdCAwLCB1c2VyIGNvb3JkcyBzdGFydCBhdCAxLiAqLwogCW9zZF9sZWZ0LS07CiAKLQlzdGFydF93aW5kb3cubGVmdCA9IG9zZF9sZWZ0ID49IDAgPyBvc2RfbGVmdCA6ICgoSVZUVl9PU0RfTUFYX1dJRFRIIC0gc3RhcnRfd2luZG93LndpZHRoKSAvIDIpOworCXN0YXJ0X3dpbmRvdy5sZWZ0ID0gb3NkX2xlZnQgPj0gMCA/CisJCSBvc2RfbGVmdCA6ICgoSVZUVl9PU0RfTUFYX1dJRFRIIC0gc3RhcnRfd2luZG93LndpZHRoKSAvIDIpOwogCiAJb2ktPmRpc3BsYXlfYnl0ZV9zdHJpZGUgPQogCQkJc3RhcnRfd2luZG93LndpZHRoICogb2ktPmJ5dGVzX3Blcl9waXhlbDsKIAogCS8qIFZlcnRpY2FsIHNpemUgJiBwb3NpdGlvbiAqLwogCi0JbWF4X2hlaWdodCA9IGl0di0+aXNfNTBoeiA/IDU3NiA6IDQ4MDsKKwltYXhfaGVpZ2h0ID0gaXR2LT5pc19vdXRfNTBoeiA/IDU3NiA6IDQ4MDsKIAogCWlmIChvc2RfeXJlcyA+IG1heF9oZWlnaHQpCiAJCW9zZF95cmVzID0gbWF4X2hlaWdodDsKIAotCXN0YXJ0X3dpbmRvdy5oZWlnaHQgPSBvc2RfeXJlcyA/IG9zZF95cmVzIDogaXR2LT5pc181MGh6ID8gNDgwIDogNDAwOworCXN0YXJ0X3dpbmRvdy5oZWlnaHQgPSBvc2RfeXJlcyA/CisJCW9zZF95cmVzIDogaXR2LT5pc19vdXRfNTBoeiA/IDQ4MCA6IDQwMDsKIAogCS8qIENoZWNrIHZlcnRpY2FsIHN0YXJ0IChvc2RfdXBwZXIpLiAqLwogCWlmIChvc2RfdXBwZXIgKyBzdGFydF93aW5kb3cuaGVpZ2h0ID4gbWF4X2hlaWdodCArIDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9scy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzLmgKaW5kZXggMTBiNTVjOC4uODlkMDlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzLmgKQEAgLTIsMTAgKzIsMTAgQEAKICAqIEhlYWRlciBmb3IgTS01TU9MUyA4TSBQaXhlbCBjYW1lcmEgc2Vuc29yIHdpdGggSVNQCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IEhldW5nSnVuIEtpbSwgcml2ZXJmdWwua2ltQHNhbXN1bmcuY29tCisgKiBBdXRob3I6IEhldW5nSnVuIEtpbSA8cml2ZXJmdWwua2ltQHNhbXN1bmcuY29tPgogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0sIGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogRG9uZ3NvbyBOYXRoYW5pZWwgS2ltIDxkb25nc29vNDUua2ltQHNhbXN1bmcuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTA2LDIzICsxMDYsMjMgQEAKICAqIFRoZSBlYWNoIHZhbHVlIGFjY29yZGluZyB0byBlYWNoIHNjZW5lbW9kZSBpcyByZWNvbW1lbmRlZCBpbiB0aGUgZG9jdW1lbnRzLgogICovCiBzdHJ1Y3QgbTVtb2xzX3NjZW5lbW9kZSB7Ci0JdTMyIG1ldGVyaW5nOwotCXUzMiBldl9iaWFzOwotCXUzMiB3Yl9tb2RlOwotCXUzMiB3Yl9wcmVzZXQ7Ci0JdTMyIGNocm9tYV9lbjsKLQl1MzIgY2hyb21hX2x2bDsKLQl1MzIgZWRnZV9lbjsKLQl1MzIgZWRnZV9sdmw7Ci0JdTMyIGFmX3JhbmdlOwotCXUzMiBmZF9tb2RlOwotCXUzMiBtY2M7Ci0JdTMyIGxpZ2h0OwotCXUzMiBmbGFzaDsKLQl1MzIgdG9uZTsKLQl1MzIgaXNvOwotCXUzMiBjYXB0X21vZGU7Ci0JdTMyIHdkcjsKKwl1OCBtZXRlcmluZzsKKwl1OCBldl9iaWFzOworCXU4IHdiX21vZGU7CisJdTggd2JfcHJlc2V0OworCXU4IGNocm9tYV9lbjsKKwl1OCBjaHJvbWFfbHZsOworCXU4IGVkZ2VfZW47CisJdTggZWRnZV9sdmw7CisJdTggYWZfcmFuZ2U7CisJdTggZmRfbW9kZTsKKwl1OCBtY2M7CisJdTggbGlnaHQ7CisJdTggZmxhc2g7CisJdTggdG9uZTsKKwl1OCBpc287CisJdTggY2FwdF9tb2RlOworCXU4IHdkcjsKIH07CiAKIC8qKgpAQCAtMTU0LDcgKzE1NCw2IEBACiAJdTgJc3RyW1ZFUlNJT05fU1RSSU5HX1NJWkVdOwogCXU4CWFmOwogfTsKLSNkZWZpbmUgVkVSU0lPTl9TSVpFIHNpemVvZihzdHJ1Y3QgbTVtb2xzX3ZlcnNpb24pCiAKIC8qKgogICogc3RydWN0IG01bW9sc19pbmZvIC0gTS01TU9MUyBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmUKQEAgLTIxNiw5ICsyMTUsOSBAQAogCWJvb2wgbG9ja19hZTsKIAlib29sIGxvY2tfYXdiOwogCXU4IHJlc29sdXRpb247Ci0JdTMyIGludGVycnVwdDsKLQl1MzIgbW9kZTsKLQl1MzIgbW9kZV9zYXZlOworCXU4IGludGVycnVwdDsKKwl1OCBtb2RlOworCXU4IG1vZGVfc2F2ZTsKIAlpbnQgKCpzZXRfcG93ZXIpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKTsKIH07CiAKQEAgLTI1Niw5ICsyNTUsMTEgQEAKICAqICAgKy0tLS0tLS0rLS0tKy0tLS0tLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0rLS0tLS0tKwogICogICAtIGRbMC4uM106IGFjY29yZGluZyB0byBzaXplMQogICovCi1pbnQgbTVtb2xzX3JlYWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZ19jb21iLCB1MzIgKnZhbCk7CitpbnQgbTVtb2xzX3JlYWRfdTgoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZ19jb21iLCB1OCAqdmFsKTsKK2ludCBtNW1vbHNfcmVhZF91MTYoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZ19jb21iLCB1MTYgKnZhbCk7CitpbnQgbTVtb2xzX3JlYWRfdTMyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWdfY29tYiwgdTMyICp2YWwpOwogaW50IG01bW9sc193cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnX2NvbWIsIHUzMiB2YWwpOwotaW50IG01bW9sc19idXN5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IGNhdGVnb3J5LCB1OCBjbWQsIHUzMiB2YWx1ZSk7CitpbnQgbTVtb2xzX2J1c3koc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggY2F0ZWdvcnksIHU4IGNtZCwgdTggdmFsdWUpOwogCiAvKgogICogTW9kZSBvcGVyYXRpb24gb2YgdGhlIE0tNU1PTFMKQEAgLTI4MCwxMiArMjgxLDEyIEBACiAgKiBUaGUgYXZhaWxhYmxlIGV4ZWN1dGluZyBvcmRlciBiZXR3ZWVuIGVhY2ggbW9kZXMgYXJlIGFzIGZvbGxvd3M6CiAgKiAgIFBBUkFNRVRFUiA8LS0tPiBNT05JVE9SIDwtLS0+IENBUFRVUkUKICAqLwotaW50IG01bW9sc19tb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTMyIG1vZGUpOworaW50IG01bW9sc19tb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTggbW9kZSk7CiAKLWludCBtNW1vbHNfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnKTsKK2ludCBtNW1vbHNfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCByZWcpOwogaW50IG01bW9sc19zeW5jX2NvbnRyb2xzKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbyk7CiBpbnQgbTVtb2xzX3N0YXJ0X2NhcHR1cmUoc3RydWN0IG01bW9sc19pbmZvICppbmZvKTsKLWludCBtNW1vbHNfZG9fc2NlbmVtb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTMyIG1vZGUpOworaW50IG01bW9sc19kb19zY2VuZW1vZGUoc3RydWN0IG01bW9sc19pbmZvICppbmZvLCB1OCBtb2RlKTsKIGludCBtNW1vbHNfbG9ja18zYShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8sIGJvb2wgbG9jayk7CiBpbnQgbTVtb2xzX3NldF9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NhcHR1cmUuYwppbmRleCBkNzFhMzkwLi5kOTQ3MTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jYXB0dXJlLmMKQEAgLTIsMTAgKzIsMTAgQEAKICAqIFRoZSBDYXB0dXJlIGNvZGUgZm9yIEZ1aml0c3UgTS01TU9MUyBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01OCw5ICs1OCw5IEBACiB7CiAJdTMyIG51bSwgZGVuOwogCi0JaW50IHJldCA9IG01bW9sc19yZWFkKHNkLCBhZGRyX251bSwgJm51bSk7CisJaW50IHJldCA9IG01bW9sc19yZWFkX3UzMihzZCwgYWRkcl9udW0sICZudW0pOwogCWlmICghcmV0KQotCQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgYWRkcl9kZW4sICZkZW4pOworCQlyZXQgPSBtNW1vbHNfcmVhZF91MzIoc2QsIGFkZHJfZGVuLCAmZGVuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCSp2YWwgPSBkZW4gPT0gMCA/IDAgOiBudW0gLyBkZW47CkBAIC05OSwyMCArOTksMjAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbTVtb2xzX3JlYWQoc2QsIEVYSUZfSU5GT19JU08sICh1MzIgKikmZXhpZi0+aXNvX3NwZWVkKTsKKwlyZXQgPSBtNW1vbHNfcmVhZF91MTYoc2QsIEVYSUZfSU5GT19JU08sICZleGlmLT5pc29fc3BlZWQpOwogCWlmICghcmV0KQotCQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgRVhJRl9JTkZPX0ZMQVNILCAodTMyICopJmV4aWYtPmZsYXNoKTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBFWElGX0lORk9fRkxBU0gsICZleGlmLT5mbGFzaCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBFWElGX0lORk9fU0RSLCAodTMyICopJmV4aWYtPnNkcik7CisJCXJldCA9IG01bW9sc19yZWFkX3UxNihzZCwgRVhJRl9JTkZPX1NEUiwgJmV4aWYtPnNkcik7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBFWElGX0lORk9fUVZBTCwgKHUzMiAqKSZleGlmLT5xdmFsKTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBFWElGX0lORk9fUVZBTCwgJmV4aWYtPnF2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAoIXJldCkKLQkJcmV0ID0gbTVtb2xzX3JlYWQoc2QsIENBUENfSU1BR0VfU0laRSwgJmluZm8tPmNhcC5tYWluKTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTMyKHNkLCBDQVBDX0lNQUdFX1NJWkUsICZpbmZvLT5jYXAubWFpbik7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBDQVBDX1RIVU1CX1NJWkUsICZpbmZvLT5jYXAudGh1bWIpOworCQlyZXQgPSBtNW1vbHNfcmVhZF91MzIoc2QsIENBUENfVEhVTUJfU0laRSwgJmluZm8tPmNhcC50aHVtYik7CiAJaWYgKCFyZXQpCiAJCWluZm8tPmNhcC50b3RhbCA9IGluZm8tPmNhcC5tYWluICsgaW5mby0+Y2FwLnRodW1iOwogCkBAIC0xMjIsNyArMTIyLDcgQEAKIGludCBtNW1vbHNfc3RhcnRfY2FwdHVyZShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZpbmZvLT5zZDsKLQl1MzIgcmVzb2x1dGlvbiA9IGluZm8tPnJlc29sdXRpb247CisJdTggcmVzb2x1dGlvbiA9IGluZm8tPnJlc29sdXRpb247CiAJaW50IHRpbWVvdXQ7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvbnRyb2xzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29udHJvbHMuYwppbmRleCA4MTdjMTZmLi5kMTM1ZDIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29udHJvbHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29udHJvbHMuYwpAQCAtMiwxMCArMiwxMCBAQAogICogQ29udHJvbHMgZm9yIE0tNU1PTFMgOE0gUGl4ZWwgY2FtZXJhIHNlbnNvciB3aXRoIElTUAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yOiBIZXVuZ0p1biBLaW0sIHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBIZXVuZ0p1biBLaW0gPHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbT4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogRG9uZ3NvbyBOYXRoYW5pZWwgS2ltLCBkb25nc29vNDUua2ltQHNhbXN1bmcuY29tCisgKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSA8ZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEzMCw3ICsxMzAsNyBAQAogICoKICAqIFdBUk5JTkc6IFRoZSBleGVjdXRpb24gb3JkZXIgaXMgaW1wb3J0YW50LiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlci4KICAqLwotaW50IG01bW9sc19kb19zY2VuZW1vZGUoc3RydWN0IG01bW9sc19pbmZvICppbmZvLCB1MzIgbW9kZSkKK2ludCBtNW1vbHNfZG9fc2NlbmVtb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTggbW9kZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmluZm8tPnNkOwogCXN0cnVjdCBtNW1vbHNfc2NlbmVtb2RlIHNjZW5lbW9kZSA9IG01bW9sc19kZWZhdWx0X3NjZW5lbW9kZVttb2RlXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCmluZGV4IDc2ZWFjMjYuLjQzYzY4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYwpAQCAtMiwxMCArMiwxMCBAQAogICogRHJpdmVyIGZvciBNLTVNT0xTIDhNIFBpeGVsIGNhbWVyYSBzZW5zb3Igd2l0aCBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMzMsMTMgKzEzMywxMyBAQAogLyoqCiAgKiBtNW1vbHNfcmVhZCAtICBJMkMgcmVhZCBmdW5jdGlvbgogICogQHJlZzogY29tYmluYXRpb24gb2Ygc2l6ZSwgY2F0ZWdvcnkgYW5kIGNvbW1hbmQgZm9yIHRoZSBJMkMgcGFja2V0CisgKiBAc2l6ZTogZGVzaXJlZCBzaXplIG9mIEkyQyBwYWNrZXQKICAqIEB2YWw6IHJlYWQgdmFsdWUKICAqLwotaW50IG01bW9sc19yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHUzMiAqdmFsKQorc3RhdGljIGludCBtNW1vbHNfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgc2l6ZSwgdTMyIHJlZywgdTMyICp2YWwpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXU4IHJidWZbTTVNT0xTX0kyQ19NQVhfU0laRSArIDFdOwotCXU4IHNpemUgPSBJMkNfU0laRShyZWcpOwogCXU4IGNhdGVnb3J5ID0gSTJDX0NBVEVHT1JZKHJlZyk7CiAJdTggY21kID0gSTJDX0NPTU1BTkQocmVnKTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CkBAIC0xNDksMTEgKzE0OSw2IEBACiAJaWYgKCFjbGllbnQtPmFkYXB0ZXIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCXY0bDJfZXJyKHNkLCAiV3JvbmcgZGF0YSBzaXplXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CiAJbXNnWzBdLmZsYWdzID0gMDsKIAltc2dbMF0ubGVuID0gNTsKQEAgLTE4NCw2ICsxNzksNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IG01bW9sc19yZWFkX3U4KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHU4ICp2YWwpCit7CisJdTMyIHZhbF8zMjsKKwlpbnQgcmV0OworCisJaWYgKEkyQ19TSVpFKHJlZykgIT0gMSkgeworCQl2NGwyX2VycihzZCwgIldyb25nIGRhdGEgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG01bW9sc19yZWFkKHNkLCBJMkNfU0laRShyZWcpLCByZWcsICZ2YWxfMzIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqdmFsID0gKHU4KXZhbF8zMjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbTVtb2xzX3JlYWRfdTE2KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHUxNiAqdmFsKQoreworCXUzMiB2YWxfMzI7CisJaW50IHJldDsKKworCWlmIChJMkNfU0laRShyZWcpICE9IDIpIHsKKwkJdjRsMl9lcnIoc2QsICJXcm9uZyBkYXRhIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtNW1vbHNfcmVhZChzZCwgSTJDX1NJWkUocmVnKSwgcmVnLCAmdmFsXzMyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJKnZhbCA9ICh1MTYpdmFsXzMyOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtNW1vbHNfcmVhZF91MzIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZywgdTMyICp2YWwpCit7CisJaWYgKEkyQ19TSVpFKHJlZykgIT0gNCkgeworCQl2NGwyX2VycihzZCwgIldyb25nIGRhdGEgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBtNW1vbHNfcmVhZChzZCwgSTJDX1NJWkUocmVnKSwgcmVnLCB2YWwpOworfQorCiAvKioKICAqIG01bW9sc193cml0ZSAtIEkyQyBjb21tYW5kIHdyaXRlIGZ1bmN0aW9uCiAgKiBAcmVnOiBjb21iaW5hdGlvbiBvZiBzaXplLCBjYXRlZ29yeSBhbmQgY29tbWFuZCBmb3IgdGhlIEkyQyBwYWNrZXQKQEAgLTIzMSwxMyArMjcyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtNW1vbHNfYnVzeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCBjYXRlZ29yeSwgdTggY21kLCB1MzIgbWFzaykKK2ludCBtNW1vbHNfYnVzeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCBjYXRlZ29yeSwgdTggY21kLCB1OCBtYXNrKQogewotCXUzMiBidXN5LCBpOworCXU4IGJ1c3k7CisJaW50IGk7CiAJaW50IHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBNNU1PTFNfSTJDX0NIRUNLX1JFVFJZOyBpKyspIHsKLQkJcmV0ID0gbTVtb2xzX3JlYWQoc2QsIEkyQ19SRUcoY2F0ZWdvcnksIGNtZCwgMSksICZidXN5KTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTgoc2QsIEkyQ19SRUcoY2F0ZWdvcnksIGNtZCwgMSksICZidXN5KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQlpZiAoKGJ1c3kgJiBtYXNrKSA9PSBtYXNrKQpAQCAtMjUyLDE0ICsyOTQsMTQgQEAKICAqIEJlZm9yZSB3cml0aW5nIGRlc2lyZWQgaW50ZXJydXB0IHZhbHVlIHRoZSBJTlRfRkFDVE9SIHJlZ2lzdGVyIHNob3VsZAogICogYmUgcmVhZCB0byBjbGVhciBwZW5kaW5nIGludGVycnVwdHMuCiAgKi8KLWludCBtNW1vbHNfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnKQoraW50IG01bW9sc19lbmFibGVfaW50ZXJydXB0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKIAlzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8gPSB0b19tNW1vbHMoc2QpOwotCXUzMiBtYXNrID0gaXNfYXZhaWxhYmxlX2FmKGluZm8pID8gUkVHX0lOVF9BRiA6IDA7Ci0JdTMyIGR1bW15OworCXU4IG1hc2sgPSBpc19hdmFpbGFibGVfYWYoaW5mbykgPyBSRUdfSU5UX0FGIDogMDsKKwl1OCBkdW1teTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbTVtb2xzX3JlYWQoc2QsIFNZU1RFTV9JTlRfRkFDVE9SLCAmZHVtbXkpOworCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fSU5UX0ZBQ1RPUiwgJmR1bW15KTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gbTVtb2xzX3dyaXRlKHNkLCBTWVNURU1fSU5UX0VOQUJMRSwgcmVnICYgfm1hc2spOwogCXJldHVybiByZXQ7CkBAIC0yNzEsNyArMzEzLDcgQEAKICAqIEl0IGFsd2F5cyBhY2NvbXBhbmllcyBhIGxpdHRsZSBkZWxheSBjaGFuZ2luZyB0aGUgTS01TU9MUyBtb2RlLCBzbyBpdCBpcwogICogbmVlZGVkIGNoZWNraW5nIGN1cnJlbnQgYnVzeSBzdGF0dXMgdG8gZ3VhcmFudGVlIHJpZ2h0IG1vZGUuCiAgKi8KLXN0YXRpYyBpbnQgbTVtb2xzX3JlZ19tb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBtb2RlKQorc3RhdGljIGludCBtNW1vbHNfcmVnX21vZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggbW9kZSkKIHsKIAlpbnQgcmV0ID0gbTVtb2xzX3dyaXRlKHNkLCBTWVNURU1fU1lTTU9ERSwgbW9kZSk7CiAKQEAgLTI4NiwxNiArMzI4LDE2IEBACiAgKiBjYW4gYmUgZ3VhcmFudGVlZCBvbmx5IHdoZW4gdGhlIHNlbnNvciBpcyBvcGVyYXRpbmcgaW4gbW9kZSB3aGljaCB3aGljaAogICogYSBjb21tYW5kIGJlbG9uZ3MgdG8uCiAgKi8KLWludCBtNW1vbHNfbW9kZShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8sIHUzMiBtb2RlKQoraW50IG01bW9sc19tb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTggbW9kZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmluZm8tPnNkOwogCWludCByZXQgPSAtRUlOVkFMOwotCXUzMiByZWc7CisJdTggcmVnOwogCiAJaWYgKG1vZGUgPCBSRUdfUEFSQU1FVEVSICYmIG1vZGUgPiBSRUdfQ0FQVFVSRSkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG01bW9sc19yZWFkKHNkLCBTWVNURU1fU1lTTU9ERSwgJnJlZyk7CisJcmV0ID0gbTVtb2xzX3JlYWRfdTgoc2QsIFNZU1RFTV9TWVNNT0RFLCAmcmVnKTsKIAlpZiAoKCFyZXQgJiYgcmVnID09IG1vZGUpIHx8IHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzQ0LDQxICszODYsMzcgQEAKIHN0YXRpYyBpbnQgbTVtb2xzX2dldF92ZXJzaW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CiAJc3RydWN0IG01bW9sc19pbmZvICppbmZvID0gdG9fbTVtb2xzKHNkKTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBtNW1vbHNfdmVyc2lvbiB2ZXI7Ci0JCXU4IGJ5dGVzW1ZFUlNJT05fU0laRV07Ci0JfSB2ZXJzaW9uOwotCXUzMiAqdmFsdWU7Ci0JdTggY21kID0gQ0FUMF9WRVJfQ1VTVE9NRVI7CisJc3RydWN0IG01bW9sc192ZXJzaW9uICp2ZXIgPSAmaW5mby0+dmVyOworCXU4ICpzdHIgPSB2ZXItPnN0cjsKKwlpbnQgaTsKIAlpbnQgcmV0OwogCi0JZG8gewotCQl2YWx1ZSA9ICh1MzIgKikmdmVyc2lvbi5ieXRlc1tjbWRdOwotCQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgU1lTVEVNX0NNRChjbWQpLCB2YWx1ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0gd2hpbGUgKGNtZCsrICE9IENBVDBfVkVSX0FXQik7Ci0KLQlkbyB7Ci0JCXZhbHVlID0gKHUzMiAqKSZ2ZXJzaW9uLmJ5dGVzW2NtZF07Ci0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBTWVNURU1fVkVSX1NUUklORywgdmFsdWUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJaWYgKGNtZCA+PSBWRVJTSU9OX1NJWkUgLSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSB3aGlsZSAodmVyc2lvbi5ieXRlc1tjbWQrK10pOwotCi0JdmFsdWUgPSAodTMyICopJnZlcnNpb24uYnl0ZXNbY21kXTsKLQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgQUZfVkVSU0lPTiwgdmFsdWUpOworCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fVkVSX0NVU1RPTUVSLCAmdmVyLT5jdXN0b21lcik7CisJaWYgKCFyZXQpCisJCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fVkVSX1BST0pFQ1QsICZ2ZXItPnByb2plY3QpOworCWlmICghcmV0KQorCQlyZXQgPSBtNW1vbHNfcmVhZF91MTYoc2QsIFNZU1RFTV9WRVJfRklSTVdBUkUsICZ2ZXItPmZ3KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBTWVNURU1fVkVSX0hBUkRXQVJFLCAmdmVyLT5odyk7CisJaWYgKCFyZXQpCisJCXJldCA9IG01bW9sc19yZWFkX3UxNihzZCwgU1lTVEVNX1ZFUl9QQVJBTUVURVIsICZ2ZXItPnBhcmFtKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBTWVNURU1fVkVSX0FXQiwgJnZlci0+YXdiKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTgoc2QsIEFGX1ZFUlNJT04sICZ2ZXItPmFmKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogc3RvcmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBzd2FwcGVkIGZvciBiZWluZyByZWFkYWJsZSAqLwotCWluZm8tPnZlcgk9IHZlcnNpb24udmVyOwotCWluZm8tPnZlci5mdwk9IGJlMTZfdG9fY3B1KGluZm8tPnZlci5mdyk7Ci0JaW5mby0+dmVyLmh3CT0gYmUxNl90b19jcHUoaW5mby0+dmVyLmh3KTsKLQlpbmZvLT52ZXIucGFyYW0JPSBiZTE2X3RvX2NwdShpbmZvLT52ZXIucGFyYW0pOwotCWluZm8tPnZlci5hd2IJPSBiZTE2X3RvX2NwdShpbmZvLT52ZXIuYXdiKTsKKwlmb3IgKGkgPSAwOyBpIDwgVkVSU0lPTl9TVFJJTkdfU0laRTsgaSsrKSB7CisJCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fVkVSX1NUUklORywgJnN0cltpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXZlci0+ZncgPSBiZTE2X3RvX2NwdSh2ZXItPmZ3KTsKKwl2ZXItPmh3ID0gYmUxNl90b19jcHUodmVyLT5odyk7CisJdmVyLT5wYXJhbSA9IGJlMTZfdG9fY3B1KHZlci0+cGFyYW0pOworCXZlci0+YXdiID0gYmUxNl90b19jcHUodmVyLT5hd2IpOwogCiAJdjRsMl9pbmZvKHNkLCAiTWFudWZhY3R1cmVyXHRbJXNdXG4iLAogCQkJaXNfbWFudWZhY3R1cmVyKGluZm8sIFJFR19TQU1TVU5HX0VMRUNUUk8pID8KQEAgLTcyMiw3ICs3NjAsNyBAQAogCWludCByZXQ7CiAKIAkvKiBEZXRlcm1pbmUgdmFsdWUncyByYW5nZSAmIHN0ZXAgb2YgY29udHJvbHMgZm9yIHZhcmlvdXMgRlcgdmVyc2lvbiAqLwotCXJldCA9IG01bW9sc19yZWFkKHNkLCBBRV9NQVhfR0FJTl9NT04sICh1MzIgKikmbWF4X2V4cG9zdXJlKTsKKwlyZXQgPSBtNW1vbHNfcmVhZF91MTYoc2QsIEFFX01BWF9HQUlOX01PTiwgJm1heF9leHBvc3VyZSk7CiAJaWYgKCFyZXQpCiAJCXN0ZXBfem9vbSA9IGlzX21hbnVmYWN0dXJlcihpbmZvLCBSRUdfU0FNU1VOR19PUFRJQ1MpID8gMzEgOiAxOwogCWlmIChyZXQpCkBAIC04NDIsMTggKzg4MCwxOCBAQAogCXN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbyA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbTVtb2xzX2luZm8sIHdvcmtfaXJxKTsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmluZm8tPnNkOwotCXUzMiByZWc7CisJdTggcmVnOwogCWludCByZXQ7CiAKIAlpZiAoIWlzX3Bvd2VyZWQoaW5mbykgfHwKLQkJCW01bW9sc19yZWFkKHNkLCBTWVNURU1fSU5UX0ZBQ1RPUiwgJmluZm8tPmludGVycnVwdCkpCisJCQltNW1vbHNfcmVhZF91OChzZCwgU1lTVEVNX0lOVF9GQUNUT1IsICZpbmZvLT5pbnRlcnJ1cHQpKQogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKGluZm8tPmludGVycnVwdCAmIFJFR19JTlRfTUFTSykgewogCWNhc2UgUkVHX0lOVF9BRjoKIAkJaWYgKCFpc19hdmFpbGFibGVfYWYoaW5mbykpCiAJCQlicmVhazsKLQkJcmV0ID0gbTVtb2xzX3JlYWQoc2QsIEFGX1NUQVRVUywgJnJlZyk7CisJCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBBRl9TVEFUVVMsICZyZWcpOwogCQl2NGwyX2RiZygyLCBtNW1vbHNfZGVidWcsIHNkLCAiQUYgJXNcbiIsCiAJCQkgcmVnID09IFJFR19BRl9GQUlMID8gIkZhaWxlZCIgOgogCQkJIHJlZyA9PSBSRUdfQUZfU1VDQ0VTUyA/ICJTdWNjZXNzIiA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfcmVnLmgKaW5kZXggYjgzZTM2Zi4uYzc1NWJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX3JlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19yZWcuaApAQCAtMiwxMCArMiwxMCBAQAogICogUmVnaXN0ZXIgbWFwIGZvciBNLTVNT0xTIDhNIFBpeGVsIGNhbWVyYSBzZW5zb3Igd2l0aCBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01NiwxMyArNTYsMjQgQEAKICAqIG1vcmUgc3BlY2lmaWMgY29udGVudHMsIHNlZSBkZWZpbml0aW9uIGlmIGZpbGUgbTVtb2xzLmguCiAgKi8KICNkZWZpbmUgQ0FUMF9WRVJfQ1VTVE9NRVIJMHgwMAkvKiBjdXN0b21lciB2ZXJzaW9uICovCi0jZGVmaW5lIENBVDBfVkVSX0FXQgkJMHgwOQkvKiBBdXRvIFdCIHZlcnNpb24gKi8KKyNkZWZpbmUgQ0FUMF9WRVJfUFJPSkVDVAkweDAxCS8qIHByb2plY3QgdmVyc2lvbiAqLworI2RlZmluZSBDQVQwX1ZFUl9GSVJNV0FSRQkweDAyCS8qIEZpcm13YXJlIHZlcnNpb24gKi8KKyNkZWZpbmUgQ0FUMF9WRVJfSEFSRFdBUkUJMHgwNAkvKiBIYXJkd2FyZSB2ZXJzaW9uICovCisjZGVmaW5lIENBVDBfVkVSX1BBUkFNRVRFUgkweDA2CS8qIFBhcmFtZXRlciB2ZXJzaW9uICovCisjZGVmaW5lIENBVDBfVkVSX0FXQgkJMHgwOAkvKiBBdXRvIFdCIHZlcnNpb24gKi8KICNkZWZpbmUgQ0FUMF9WRVJfU1RSSU5HCQkweDBhCS8qIHN0cmluZyBpbmNsdWRpbmcgTS01TU9MUyAqLwogI2RlZmluZSBDQVQwX1NZU01PREUJCTB4MGIJLyogU1lTVEVNIG1vZGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ0FUMF9TVEFUVVMJCTB4MGMJLyogU1lTVEVNIG1vZGUgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIENBVDBfSU5UX0ZBQ1RPUgkJMHgxMAkvKiBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlciAqLwogI2RlZmluZSBDQVQwX0lOVF9FTkFCTEUJCTB4MTEJLyogaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwogCisjZGVmaW5lIFNZU1RFTV9WRVJfQ1VTVE9NRVIJSTJDX1JFRyhDQVRfU1lTVEVNLCBDQVQwX1ZFUl9DVVNUT01FUiwgMSkKKyNkZWZpbmUgU1lTVEVNX1ZFUl9QUk9KRUNUCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9WRVJfUFJPSkVDVCwgMSkKKyNkZWZpbmUgU1lTVEVNX1ZFUl9GSVJNV0FSRQlJMkNfUkVHKENBVF9TWVNURU0sIENBVDBfVkVSX0ZJUk1XQVJFLCAyKQorI2RlZmluZSBTWVNURU1fVkVSX0hBUkRXQVJFCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9WRVJfSEFSRFdBUkUsIDIpCisjZGVmaW5lIFNZU1RFTV9WRVJfUEFSQU1FVEVSCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9WRVJfUEFSQU1FVEVSLCAyKQorI2RlZmluZSBTWVNURU1fVkVSX0FXQgkJSTJDX1JFRyhDQVRfU1lTVEVNLCBDQVQwX1ZFUl9BV0IsIDIpCisKICNkZWZpbmUgU1lTVEVNX1NZU01PREUJCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9TWVNNT0RFLCAxKQogI2RlZmluZSBSRUdfU1lTSU5JVAkJMHgwMAkvKiBTWVNURU0gbW9kZSAqLwogI2RlZmluZSBSRUdfUEFSQU1FVEVSCQkweDAxCS8qIFBBUkFNRVRFUiBtb2RlICovCkBAIC0zODIsOCArMzkzLDggQEAKICNkZWZpbmUgUkVHX0NBUF9TVEFSVF9NQUlOCTB4MDEKICNkZWZpbmUgUkVHX0NBUF9TVEFSVF9USFVNQgkweDAzCiAKLSNkZWZpbmUgQ0FQQ19JTUFHRV9TSVpFCQlJMkNfUkVHKENBVF9DQVBUX0NUUkwsIENBVENfQ0FQX0lNQUdFX1NJWkUsIDEpCi0jZGVmaW5lIENBUENfVEhVTUJfU0laRQkJSTJDX1JFRyhDQVRfQ0FQVF9DVFJMLCBDQVRDX0NBUF9USFVNQl9TSVpFLCAxKQorI2RlZmluZSBDQVBDX0lNQUdFX1NJWkUJCUkyQ19SRUcoQ0FUX0NBUFRfQ1RSTCwgQ0FUQ19DQVBfSU1BR0VfU0laRSwgNCkKKyNkZWZpbmUgQ0FQQ19USFVNQl9TSVpFCQlJMkNfUkVHKENBVF9DQVBUX0NUUkwsIENBVENfQ0FQX1RIVU1CX1NJWkUsIDQpCiAKIC8qCiAgKiBDYXRlZ29yeSBGIC0gRmxhc2gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwppbmRleCBkZTVkNDgxLi5jNDNjODFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCkBAIC00ODAsMTIgKzQ4MCwxNCBAQAogCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmIChzdGF0ZS0+cmFkaW8pCisJaWYgKHZ0LT50eXBlICE9IFY0TDJfVFVORVJfQU5BTE9HX1RWKQogCQlyZXR1cm4gMDsKLQlpZiAoc3RhdGUtPm9wbW9kZSA9PSBPUE1PREVfQVVUT1NFTEVDVCkKLQkJbXNwX2RldGVjdF9zdGVyZW8oY2xpZW50KTsKLQl2dC0+YXVkbW9kZSAgICA9IHN0YXRlLT5hdWRtb2RlOwotCXZ0LT5yeHN1YmNoYW5zID0gc3RhdGUtPnJ4c3ViY2hhbnM7CisJaWYgKCFzdGF0ZS0+cmFkaW8pIHsKKwkJaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX0FVVE9TRUxFQ1QpCisJCQltc3BfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOworCQl2dC0+cnhzdWJjaGFucyA9IHN0YXRlLT5yeHN1YmNoYW5zOworCX0KKwl2dC0+YXVkbW9kZSA9IHN0YXRlLT5hdWRtb2RlOwogCXZ0LT5jYXBhYmlsaXR5IHw9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8CiAJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzI7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jCmluZGV4IGJjMGMyM2EuLjYzZjhhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jCkBAIC00NDQsMTIgKzQ0NCw5IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlpbnQgcmV0OwogCi0JaWYgKHBjZGV2LT5pY2QpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVidXN5OwotCX0KKwlpZiAocGNkZXYtPmljZCkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIk1YMSBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKQEAgLTQ1OCw4ICs0NTUsNyBAQAogCiAJcGNkZXYtPmljZCA9IGljZDsKIAotZWJ1c3k6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbXgxX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCmluZGV4IDRhZGE5YmUuLjRkMDdjNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKQEAgLTk4Miw2ICs5ODIsMTQgQEAKIAlzdGFydGluZGV4ID0gKHZvdXQtPnZpZCA9PSBPTUFQX1ZJREVPMSkgPwogCQl2aWRlbzFfbnVtYnVmZmVycyA6IHZpZGVvMl9udW1idWZmZXJzOwogCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworCWlmICgqc2l6ZSA+IHZvdXQtPmJ1ZmZlcl9zaXplKSB7CisJCXY0bDJfZXJyKCZ2b3V0LT52aWRfZGV2LT52NGwyX2RldiwKKwkJCQkiYnVmZmVyIGFsbG9jYXRpb24gbWlzbWF0Y2ggWyV1XSBbJXVdXG4iLAorCQkJCSpzaXplLCB2b3V0LT5idWZmZXJfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCWZvciAoaSA9IHN0YXJ0aW5kZXg7IGkgPCAqY291bnQ7IGkrKykgewogCQl2b3V0LT5idWZmZXJfc2l6ZSA9ICpzaXplOwogCkBAIC0xMjI4LDYgKzEyMzYsMTQgQEAKIAkJCQkodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisJaWYgKHNpemUgPiB2b3V0LT5idWZmZXJfc2l6ZSkgeworCQl2NGwyX2Vycigmdm91dC0+dmlkX2Rldi0+djRsMl9kZXYsCisJCQkJImluc3VmZmljaWVudCBtZW1vcnkgWyVsdV0gWyV1XVxuIiwKKwkJCQlzaXplLCB2b3V0LT5idWZmZXJfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCXEtPmJ1ZnNbaV0tPmJhZGRyID0gdm1hLT52bV9zdGFydDsKIAogCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CkBAIC0yMzkxLDcgKzI0MDcsNyBAQAogCQkvKiBSZWdpc3RlciB0aGUgVmlkZW8gZGV2aWNlIHdpdGggVjRMMgogCQkgKi8KIAkJdmZkID0gdm91dC0+dmZkOwotCQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgayArIDEpIDwgMCkgeworCQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpIDwgMCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiOiBDb3VsZCBub3QgcmVnaXN0ZXIgIgogCQkJCQkiVmlkZW8gZm9yIExpbnV4IGRldmljZVxuIik7CiAJCQl2ZmQtPm1pbm9yID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmMKaW5kZXggMmFhNmE3Ni4uOGFlNzQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCWlmIChjcm9wLT5oZWlnaHQgIT0gd2luLT53LmhlaWdodCkgeworCQlpZiAodHJ5X2Nyb3AuaGVpZ2h0ICE9IHdpbi0+dy5oZWlnaHQpIHsKIAkJCS8qIElmIHdlJ3JlIHJlc2l6aW5nIHZlcnRpY2FsbHksIHdlIGNhbid0IHN1cHBvcnQgYQogCQkJICogY3JvcCB3aWR0aCB3aWRlciB0aGFuIDc2OCBwaXhlbHMuCiAJCQkgKi8KQEAgLTIwMiw3ICsyMDIsNyBAQAogCQl9CiAJfQogCS8qIHZlcnRpY2FsIHJlc2l6aW5nICovCi0JdnJlc2l6ZSA9ICgxMDI0ICogY3JvcC0+aGVpZ2h0KSAvIHdpbi0+dy5oZWlnaHQ7CisJdnJlc2l6ZSA9ICgxMDI0ICogdHJ5X2Nyb3AuaGVpZ2h0KSAvIHdpbi0+dy5oZWlnaHQ7CiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpICYmICh2cmVzaXplID4gMjA0OCkpCiAJCXZyZXNpemUgPSAyMDQ4OwogCWVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpICYmICh2cmVzaXplID4gNDA5NikpCkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJCXRyeV9jcm9wLmhlaWdodCA9IDI7CiAJfQogCS8qIGhvcml6b250YWwgcmVzaXppbmcgKi8KLQlocmVzaXplID0gKDEwMjQgKiBjcm9wLT53aWR0aCkgLyB3aW4tPncud2lkdGg7CisJaHJlc2l6ZSA9ICgxMDI0ICogdHJ5X2Nyb3Aud2lkdGgpIC8gd2luLT53LndpZHRoOwogCWlmIChjcHVfaXNfb21hcDI0eHgoKSAmJiAoaHJlc2l6ZSA+IDIwNDgpKQogCQlocmVzaXplID0gMjA0ODsKIAllbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiAoaHJlc2l6ZSA+IDQwOTYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMKaW5kZXggNDcyYTY5My4uOTRiNmVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5jCkBAIC0zOTEsNyArMzkxLDcgQEAKIAl9OwogCWludCBpOwogCi0JZGV2X2RiZyhpc3AtPmRldiwgIiIpOworCWRldl9kYmcoaXNwLT5kZXYsICJJU1AgSVJROiAiKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5hbWUpOyBpKyspIHsKIAkJaWYgKCgxIDw8IGkpICYgaXJxc3RhdHVzKQpAQCAtMTc0OCw3ICsxNzQ4LDcgQEAKIAkJZ290byBkb25lOwogCiAJLyogUmVnaXN0ZXIgZXh0ZXJuYWwgZW50aXRpZXMgKi8KLQlmb3IgKHN1YmRldnMgPSBwZGF0YS0+c3ViZGV2czsgc3ViZGV2cy0+c3ViZGV2czsgKytzdWJkZXZzKSB7CisJZm9yIChzdWJkZXZzID0gcGRhdGEtPnN1YmRldnM7IHN1YmRldnMgJiYgc3ViZGV2cy0+c3ViZGV2czsgKytzdWJkZXZzKSB7CiAJCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yOwogCQlzdHJ1Y3QgbWVkaWFfZW50aXR5ICppbnB1dDsKIAkJdW5zaWduZWQgaW50IGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwppbmRleCA5ZDBkZDA4Li5lOThkMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwpAQCAtMzA0Niw2ICszMDQ2LDggQEAKIAlpZiAoaGR3LT5pbnB1dF9kaXJ0eSB8fCBoZHctPmF1ZGlvbW9kZV9kaXJ0eSB8fCBoZHctPmZvcmNlX2RpcnR5KSB7CiAJCXN0cnVjdCB2NGwyX3R1bmVyIHZ0OwogCQltZW1zZXQoJnZ0LCAwLCBzaXplb2YodnQpKTsKKwkJdnQudHlwZSA9IChoZHctPmlucHV0X3ZhbCA9PSBQVlIyX0NWQUxfSU5QVVRfUkFESU8pID8KKwkJCVY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAkJdnQuYXVkbW9kZSA9IGhkdy0+YXVkaW9tb2RlX3ZhbDsKIAkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmhkdy0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R1bmVyLCAmdnQpOwogCX0KQEAgLTUxNzEsNiArNTE3Myw4IEBACiB7CiAJc3RydWN0IHY0bDJfdHVuZXIgKnZ0cCA9ICZoZHctPnR1bmVyX3NpZ25hbF9pbmZvOwogCW1lbXNldCh2dHAsIDAsIHNpemVvZigqdnRwKSk7CisJdnRwLT50eXBlID0gKGhkdy0+aW5wdXRfdmFsID09IFBWUjJfQ1ZBTF9JTlBVVF9SQURJTykgPworCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJaGR3LT50dW5lcl9zaWduYWxfc3RhbGUgPSAwOwogCS8qIE5vdGU6IFRoZXJlIGFwcGFyZW50bHkgaXMgbm8gcmVwbGFjZW1lbnQgZm9yIFZJRElPQ19DUk9QQ0FQCiAJICAgdXNpbmcgdjRsMi1zdWJkZXYgLSB0aGVyZWZvcmUgd2UgY2FuJ3Qgc3VwcG9ydCB0aGF0IEFUIEFMTCByaWdodApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKaW5kZXggMTU5M2Y4ZC4uNzYwYjRkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCkBAIC0xNDE0LDcgKzE0MTQsNyBAQAogCXsKIAkJQVJHX0RFRihzdHJ1Y3QgcHdjX3Byb2JlLCBwcm9iZSkKIAotCQlzdHJjcHkoQVJHUihwcm9iZSkubmFtZSwgcGRldi0+dmRldi0+bmFtZSk7CisJCXN0cmNweShBUkdSKHByb2JlKS5uYW1lLCBwZGV2LT52ZGV2Lm5hbWUpOwogCQlBUkdSKHByb2JlKS50eXBlID0gcGRldi0+dHlwZTsKIAkJQVJHX09VVChwcm9iZSkKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IDM1NmNkNDIuLmIwYmRlNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC00MCw3ICs0MCw3IEBACiAgICBPaCB5ZXMsIGNvbnZlbnRpb246IHRvIGRpc2N0aW5ndWlzaCBiZXR3ZWVuIGFsbCB0aGUgdmFyaW91cyBwb2ludGVycyB0bwogICAgZGV2aWNlLXN0cnVjdHVyZXMsIEkgdXNlIHRoZXNlIG5hbWVzIGZvciB0aGUgcG9pbnRlciB2YXJpYWJsZXM6CiAgICB1ZGV2OiBzdHJ1Y3QgdXNiX2RldmljZSAqCi0gICB2ZGV2OiBzdHJ1Y3QgdmlkZW9fZGV2aWNlICoKKyAgIHZkZXY6IHN0cnVjdCB2aWRlb19kZXZpY2UgKG1lbWJlciBvZiBwd2NfZGV2KQogICAgcGRldjogc3RydWN0IHB3Y19kZXZpdmUgKgogKi8KIApAQCAtMTUyLDYgKzE1Miw3IEBACiAJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHdjX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogc3RhdGljIGludCAgcHdjX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyB2b2lkIHB3Y192aWRlb19yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgcHdjX2ZvcHMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCkBAIC0xNjQsNDIgKzE2NSwxMiBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHB3Y190ZW1wbGF0ZSA9IHsKIAkubmFtZSA9CQkiUGhpbGlwcyBXZWJjYW0iLAkvKiBGaWxsZWQgaW4gbGF0ZXIgKi8KLQkucmVsZWFzZSA9CXZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5yZWxlYXNlID0JcHdjX3ZpZGVvX3JlbGVhc2UsCiAJLmZvcHMgPSAgICAgICAgICZwd2NfZm9wcywKKwkuaW9jdGxfb3BzID0JJnB3Y19pb2N0bF9vcHMsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPa2F5LCB0aGlzIGlzIHNvbWUgbWFnaWMgdGhhdCBJIHdvcmtlZCBvdXQgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIGl0Li4uCi0KLSAgIFRoZSBiaWdnZXN0IHByb2JsZW0gd2l0aCBhbnkgVVNCIGRldmljZSBpcyBvZiBjb3Vyc2U6ICJ3aGF0IHRvIGRvCi0gICB3aGVuIHRoZSB1c2VyIHVucGx1Z3MgdGhlIGRldmljZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgYW4gYXBwbGljYXRpb24/IgotICAgV2UgaGF2ZSBzZXZlcmFsIG9wdGlvbnM6Ci0gICAxKSBDdXJzZSB0aGVtIHdpdGggdGhlIDcgcGxhZ3VlcyB3aGVuIHRoZXkgZG8gKHJlcXVpcmVzIGRpdmluZSBpbnRlcnZlbnRpb24pCi0gICAyKSBUZWxsIHRoZW0gbm90IHRvICh3b24ndCB3b3JrOiB0aGV5J2xsIGRvIGl0IGFueXdheSkKLSAgIDMpIE9vcHMgdGhlIGtlcm5lbCAodGhpcyB3aWxsIGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gYSB1c2VyJ3MgdXB0aW1lKQotICAgNCkgRG8gc29tZXRoaW5nIHNlbnNpYmxlLgotCi0gICBPZiBjb3Vyc2UsIHdlIGdvIGZvciBvcHRpb24gNC4KLQotICAgSXQgaGFwcGVucyB0aGF0IHRoaXMgZGV2aWNlIHdpbGwgYmUgbGlua2VkIHRvIHR3byB0aW1lcywgb25jZSBmcm9tCi0gICB1c2JfZGV2aWNlIGFuZCBvbmNlIGZyb20gdGhlIHZpZGVvX2RldmljZSBpbiB0aGVpciByZXNwZWN0aXZlICdwcml2YXRlJwotICAgcG9pbnRlcnMuIFRoaXMgaXMgZG9uZSB3aGVuIHRoZSBkZXZpY2UgaXMgcHJvYmVkKCkgYW5kIGFsbCBpbml0aWFsaXphdGlvbgotICAgc3VjY2VlZGVkLiBUaGUgcHdjX2RldmljZSBzdHJ1Y3QgbGlua3MgYmFjayB0byBib3RoIHN0cnVjdHVyZXMuCi0KLSAgIFdoZW4gYSBkZXZpY2UgaXMgdW5wbHVnZ2VkIHdoaWxlIGluIHVzZSBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgIGxpc3Qgb2Yga25vd24gVVNCIGRldmljZXM7IEkgYWxzbyBkZS1yZWdpc3RlciBpdCBhcyBhIFY0TCBkZXZpY2UsIGJ1dAotICAgdW5mb3J0dW5hdGVseSBJIGNhbid0IGZyZWUgdGhlIG1lbW9yeSBzaW5jZSB0aGUgc3RydWN0IGlzIHN0aWxsIGluIHVzZQotICAgYnkgdGhlIGZpbGUgZGVzY3JpcHRvci4gVGhpcyBmcmVlLWluZyBpcyB0aGVuIGRlZmVyZW5kIHVudGlsIHRoZSBmaXJzdAotICAgb3Bwb3J0dW5pdHkuIENydWRlLCBidXQgaXQgd29ya3MuCi0KLSAgIEEgc21hbGwgJ2FkdmFudGFnZScgaXMgdGhhdCBpZiBhIHVzZXIgdW5wbHVncyB0aGUgY2FtIGFuZCBwbHVncyBpdCBiYWNrCi0gICBpbiwgaXQgc2hvdWxkIGdldCBhc3NpZ25lZCB0aGUgc2FtZSB2aWRlbyBkZXZpY2UgbWlub3IsIGJ1dCB1bmZvcnR1bmF0ZWx5Ci0gICBpdCdzIG5vbi10cml2aWFsIHRvIHJlLWxpbmsgdGhlIGNhbSBiYWNrIHRvIHRoZSB2aWRlbyBkZXZpY2UuLi4gKHRoYXQKLSAgIHdvdWxkIHN1cmVseSBiZSBtYWdpYyEgOikpCi0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUHJpdmF0ZSBmdW5jdGlvbnMgKi8KIAogLyogSGVyZSB3ZSB3YW50IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkuCkBAIC0xMDE2LDE2ICs5ODcsMTUgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihidXR0b24sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3NuYXBzaG90X2J1dHRvbl9zdGF0dXMsCiAJCSAgIE5VTEwpOwogCi1zdGF0aWMgaW50IHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3N0YXRpYyBpbnQgcHdjX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCWludCByYzsKIAotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9idXR0b24pOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT52ZGV2LmRldiwgJmRldl9hdHRyX2J1dHRvbik7CiAJaWYgKHJjKQogCQlnb3RvIGVycjsKIAlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpIHsKLQkJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3Bhbl90aWx0KTsKKwkJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPnZkZXYuZGV2LCAmZGV2X2F0dHJfcGFuX3RpbHQpOwogCQlpZiAocmMpCiAJCQlnb3RvIGVycl9idXR0b247CiAJfQpAQCAtMTAzMywxOSArMTAwMywxNyBAQAogCXJldHVybiAwOwogCiBlcnJfYnV0dG9uOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPnZkZXYuZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKIGVycjoKIAlQV0NfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgc3lzZnMgZmlsZXMuXG4iKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIHB3Y19yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3N0YXRpYyB2b2lkIHB3Y19yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQogCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9wYW5fdGlsdCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9idXR0b24pOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPnZkZXYuZGV2LCAmZGV2X2F0dHJfcGFuX3RpbHQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+dmRldi5kZXYsICZkZXZfYXR0cl9idXR0b24pOwogfQogCiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKQEAgLTExMDYsNyArMTA3NCw3IEBACiAJCWlmIChyZXQgPj0gMCkKIAkJewogCQkJUFdDX0RFQlVHX09QRU4oIlRoaXMgJXMgY2FtZXJhIGlzIGVxdWlwcGVkIHdpdGggYSAlcyAoJWQpLlxuIiwKLQkJCQkJcGRldi0+dmRldi0+bmFtZSwKKwkJCQkJcGRldi0+dmRldi5uYW1lLAogCQkJCQlwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKGkpLCBpKTsKIAkJfQogCX0KQEAgLTExODAsMTYgKzExNDgsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBwd2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIHB3Y192aWRlb19yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCkKIHsKLQlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPnZkZXYpOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gY29udGFpbmVyX29mKHZmZCwgc3RydWN0IHB3Y19kZXZpY2UsIHZkZXYpOworCWludCBoaW50OwogCi0jaWZkZWYgQ09ORklHX1VTQl9QV0NfSU5QVVRfRVZERVYKLQlpZiAocGRldi0+YnV0dG9uX2RldikKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocGRldi0+YnV0dG9uX2Rldik7Ci0jZW5kaWYKKwkvKiBzZWFyY2ggZGV2aWNlX2hpbnRbXSB0YWJsZSBpZiB3ZSBvY2N1cHkgYSBzbG90LCBieSBhbnkgY2hhbmNlICovCisJZm9yIChoaW50ID0gMDsgaGludCA8IE1BWF9ERVZfSElOVFM7IGhpbnQrKykKKwkJaWYgKGRldmljZV9oaW50W2hpbnRdLnBkZXYgPT0gcGRldikKKwkJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOwogCiAJa2ZyZWUocGRldik7CiB9CkBAIC0xMTk5LDcgKzExNjYsNyBAQAogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JaW50IGksIGhpbnQ7CisJaW50IGk7CiAKIAlQV0NfREVCVUdfT1BFTigiPj4gdmlkZW9fY2xvc2UgY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOwogCkBAIC0xMjM0LDEyICsxMjAxLDYgQEAKIAkJfQogCQlwZGV2LT52b3Blbi0tOwogCQlQV0NfREVCVUdfT1BFTigiPDwgdmlkZW9fY2xvc2UoKSB2b3Blbj0lZFxuIiwgcGRldi0+dm9wZW4pOwotCX0gZWxzZSB7Ci0JCXB3Y19jbGVhbnVwKHBkZXYpOwotCQkvKiBzZWFyY2ggZGV2aWNlX2hpbnRbXSB0YWJsZSBpZiB3ZSBvY2N1cHkgYSBzbG90LCBieSBhbnkgY2hhbmNlICovCi0JCWZvciAoaGludCA9IDA7IGhpbnQgPCBNQVhfREVWX0hJTlRTOyBoaW50KyspCi0JCQlpZiAoZGV2aWNlX2hpbnRbaGludF0ucGRldiA9PSBwZGV2KQotCQkJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTcxNSwxOSArMTY3NiwxMiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBkZXYtPmZyYW1lcSk7CiAJcGRldi0+dmNvbXByZXNzaW9uID0gcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbjsKIAotCS8qIEFsbG9jYXRlIHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgKi8KLQlwZGV2LT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7Ci0JaWYgKCFwZGV2LT52ZGV2KSB7Ci0JCVBXQ19FUlJPUigiRXJyLCBjYW5ub3QgYWxsb2NhdGUgdmlkZW9fZGV2aWNlIHN0cnV0dXJlLiBGYWlsaW5nIHByb2JlLiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWVfbWVtOwotCX0KLQltZW1jcHkocGRldi0+dmRldiwgJnB3Y190ZW1wbGF0ZSwgc2l6ZW9mKHB3Y190ZW1wbGF0ZSkpOwotCXBkZXYtPnZkZXYtPnBhcmVudCA9ICZpbnRmLT5kZXY7Ci0JcGRldi0+dmRldi0+bG9jayA9ICZwZGV2LT5tb2Rsb2NrOwotCXBkZXYtPnZkZXYtPmlvY3RsX29wcyA9ICZwd2NfaW9jdGxfb3BzOwotCXN0cmNweShwZGV2LT52ZGV2LT5uYW1lLCBuYW1lKTsKLQl2aWRlb19zZXRfZHJ2ZGF0YShwZGV2LT52ZGV2LCBwZGV2KTsKKwkvKiBJbml0IHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkoJnBkZXYtPnZkZXYsICZwd2NfdGVtcGxhdGUsIHNpemVvZihwd2NfdGVtcGxhdGUpKTsKKwlwZGV2LT52ZGV2LnBhcmVudCA9ICZpbnRmLT5kZXY7CisJcGRldi0+dmRldi5sb2NrID0gJnBkZXYtPm1vZGxvY2s7CisJc3RyY3B5KHBkZXYtPnZkZXYubmFtZSwgbmFtZSk7CisJdmlkZW9fc2V0X2RydmRhdGEoJnBkZXYtPnZkZXYsIHBkZXYpOwogCiAJcGRldi0+cmVsZWFzZSA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKIAlQV0NfREVCVUdfUFJPQkUoIlJlbGVhc2U6ICUwNHhcbiIsIHBkZXYtPnJlbGVhc2UpOwpAQCAtMTc0Niw4ICsxNzAwLDYgQEAKIAkJfQogCX0KIAotCXBkZXYtPnZkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKLQogCS8qIG9jY3VweSBzbG90ICovCiAJaWYgKGhpbnQgPCBNQVhfREVWX0hJTlRTKQogCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gcGRldjsKQEAgLTE3NTksMTYgKzE3MTEsMTYgQEAKIAlwd2Nfc2V0X2xlZHMocGRldiwgMCwgMCk7CiAJcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAwKTsKIAotCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHBkZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKTsKKwlyYyA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcGRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOwogCWlmIChyYyA8IDApIHsKIAkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgYXMgdmlkZW8gZGV2aWNlICglZCkuXG4iLCByYyk7Ci0JCWdvdG8gZXJyX3ZpZGVvX3JlbGVhc2U7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCX0KLQlyYyA9IHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMocGRldi0+dmRldik7CisJcmMgPSBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYpOwogCWlmIChyYykKIAkJZ290byBlcnJfdmlkZW9fdW5yZWc7CiAKLQlQV0NfSU5GTygiUmVnaXN0ZXJlZCBhcyAlcy5cbiIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUocGRldi0+dmRldikpOworCVBXQ19JTkZPKCJSZWdpc3RlcmVkIGFzICVzLlxuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSgmcGRldi0+dmRldikpOwogCiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfSU5QVVRfRVZERVYKIAkvKiByZWdpc3RlciB3ZWJjYW0gc25hcHNob3QgYnV0dG9uIGlucHV0IGRldmljZSAqLwpAQCAtMTc3Niw3ICsxNzI4LDcgQEAKIAlpZiAoIXBkZXYtPmJ1dHRvbl9kZXYpIHsKIAkJUFdDX0VSUk9SKCJFcnIsIGluc3VmZmljaWVudCBtZW1vcnkgZm9yIHdlYmNhbSBzbmFwc2hvdCBidXR0b24gZGV2aWNlLiIpOwogCQlyYyA9IC1FTk9NRU07Ci0JCXB3Y19yZW1vdmVfc3lzZnNfZmlsZXMocGRldi0+dmRldik7CisJCXB3Y19yZW1vdmVfc3lzZnNfZmlsZXMocGRldik7CiAJCWdvdG8gZXJyX3ZpZGVvX3VucmVnOwogCX0KIApAQCAtMTc5NCw3ICsxNzQ2LDcgQEAKIAlpZiAocmMpIHsKIAkJaW5wdXRfZnJlZV9kZXZpY2UocGRldi0+YnV0dG9uX2Rldik7CiAJCXBkZXYtPmJ1dHRvbl9kZXYgPSBOVUxMOwotCQlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOworCQlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYpOwogCQlnb3RvIGVycl92aWRlb191bnJlZzsKIAl9CiAjZW5kaWYKQEAgLTE4MDQsMTAgKzE3NTYsNyBAQAogZXJyX3ZpZGVvX3VucmVnOgogCWlmIChoaW50IDwgTUFYX0RFVl9ISU5UUykKIAkJZGV2aWNlX2hpbnRbaGludF0ucGRldiA9IE5VTEw7Ci0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGRldi0+dmRldik7Ci0JcGRldi0+dmRldiA9IE5VTEw7CS8qIFNvIHdlIGRvbid0IHRyeSB0byByZWxlYXNlIGl0IGJlbG93ICovCi1lcnJfdmlkZW9fcmVsZWFzZToKLQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZGV2LT52ZGV2KTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGRldi0+dmRldik7CiBlcnJfZnJlZV9tZW06CiAJa2ZyZWUocGRldik7CiAJcmV0dXJuIHJjOwpAQCAtMTgxNiwxMCArMTc2NSw4IEBACiAvKiBUaGUgdXNlciB5YW5rZWQgb3V0IHRoZSBjYWJsZS4uLiAqLwogc3RhdGljIHZvaWQgdXNiX3B3Y19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCWludCBoaW50OworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ICA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLQlwZGV2ID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CiAJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7CiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CiAJaWYgKHBkZXYgPT0gTlVMTCkgewpAQCAtMTgzNiwzMCArMTc4MywyNSBAQAogCX0KIAogCS8qIFdlIGdvdCB1bnBsdWdnZWQ7IHRoaXMgaXMgc2lnbmFsbGVkIGJ5IGFuIEVQSVBFIGVycm9yIGNvZGUgKi8KLQlpZiAocGRldi0+dm9wZW4pIHsKLQkJUFdDX0lORk8oIkRpc2Nvbm5lY3RlZCB3aGlsZSB3ZWJjYW0gaXMgaW4gdXNlIVxuIik7Ci0JCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVQSVBFOwotCX0KKwlwZGV2LT5lcnJvcl9zdGF0dXMgPSBFUElQRTsKKwlwZGV2LT51bnBsdWdnZWQgPSAxOwogCiAJLyogQWxlcnQgd2FpdGluZyBwcm9jZXNzZXMgKi8KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7Ci0JLyogV2FpdCB1bnRpbCBkZXZpY2UgaXMgY2xvc2VkICovCi0JaWYgKHBkZXYtPnZvcGVuKSB7Ci0JCXBkZXYtPnVucGx1Z2dlZCA9IDE7Ci0JCXB3Y19pc29fc3RvcChwZGV2KTsKLQl9IGVsc2UgewotCQkvKiBEZXZpY2UgaXMgY2xvc2VkLCBzbyB3ZSBjYW4gc2FmZWx5IHVucmVnaXN0ZXIgaXQgKi8KLQkJUFdDX0RFQlVHX1BST0JFKCJVbnJlZ2lzdGVyaW5nIHZpZGVvIGRldmljZSBpbiBkaXNjb25uZWN0KCkuXG4iKTsKKworCS8qIE5vIG5lZWQgdG8ga2VlcCB0aGUgdXJicyBhcm91bmQgYWZ0ZXIgZGlzY29ubmVjdGlvbiAqLworCXB3Y19pc29jX2NsZWFudXAocGRldik7CiAKIGRpc2Nvbm5lY3Rfb3V0OgotCQkvKiBzZWFyY2ggZGV2aWNlX2hpbnRbXSB0YWJsZSBpZiB3ZSBvY2N1cHkgYSBzbG90LCBieSBhbnkgY2hhbmNlICovCi0JCWZvciAoaGludCA9IDA7IGhpbnQgPCBNQVhfREVWX0hJTlRTOyBoaW50KyspCi0JCQlpZiAoZGV2aWNlX2hpbnRbaGludF0ucGRldiA9PSBwZGV2KQotCQkJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOwotCX0KLQogCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7Ci0JcHdjX2NsZWFudXAocGRldik7CisKKwlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZwZGV2LT52ZGV2KTsKKworI2lmZGVmIENPTkZJR19VU0JfUFdDX0lOUFVUX0VWREVWCisJaWYgKHBkZXYtPmJ1dHRvbl9kZXYpCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPmJ1dHRvbl9kZXYpOworI2VuZGlmCiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaAppbmRleCBlOTQ3NzY2Li4wODNmOGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaApAQCAtMTYyLDkgKzE2Miw5IEBACiAKIHN0cnVjdCBwd2NfZGV2aWNlCiB7Ci0gICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKIAotICAgLyogUG9pbnRlciB0byBvdXIgdXNiX2RldmljZSAqLworICAgLyogUG9pbnRlciB0byBvdXIgdXNiX2RldmljZSwgbWF5IGJlIE5VTEwgYWZ0ZXIgdW5wbHVnICovCiAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAogICAgaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGNhbSAoNjQ1LCA2NDYsIDY3NSwgNjgwLCA2OTAsIDcyMCwgNzMwLCA3NDAsIDc1MCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCmluZGV4IGQxNDJiNDAuLjgxYjRhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiBTYW1zdW5nIFM1UCBTb0Mgc2VyaWVzIGNhbWVyYSBpbnRlcmZhY2UgKGNhbWVyYSBjYXB0dXJlKSBkcml2ZXIKKyAqIFNhbXN1bmcgUzVQL0VYWU5PUzQgU29DIHNlcmllcyBjYW1lcmEgaW50ZXJmYWNlIChjYW1lcmEgY2FwdHVyZSkgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KICAqIEF1dGhvcjogU3lsd2VzdGVyIE5hd3JvY2tpLCA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjYyLDEyICsyNjIsNyBAQAogewogCWlmICghZnIgfHwgcGxhbmUgPj0gZnItPmZtdC0+bWVtcGxhbmVzKQogCQlyZXR1cm4gMDsKLQotCWRiZygiJXM6IHc6ICVkLiBoOiAlZC4gZGVwdGhbJWRdOiAlZCIsCi0JICAgIF9fZnVuY19fLCBmci0+d2lkdGgsIGZyLT5oZWlnaHQsIHBsYW5lLCBmci0+Zm10LT5kZXB0aFtwbGFuZV0pOwotCiAJcmV0dXJuIGZyLT5mX3dpZHRoICogZnItPmZfaGVpZ2h0ICogZnItPmZtdC0+ZGVwdGhbcGxhbmVdIC8gODsKLQogfQogCiBzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLApAQCAtMjgzLDI0ICsyNzgsMTQgQEAKIAogCSpudW1fcGxhbmVzID0gZm10LT5tZW1wbGFuZXM7CiAKLQlkYmcoIiVzLCBidWZmZXIgY291bnQ9JWQsIHBsYW5lIGNvdW50PSVkIiwKLQkgICAgX19mdW5jX18sICpudW1fYnVmZmVycywgKm51bV9wbGFuZXMpOwotCiAJZm9yIChpID0gMDsgaSA8IGZtdC0+bWVtcGxhbmVzOyBpKyspIHsKIAkJc2l6ZXNbaV0gPSBnZXRfcGxhbmVfc2l6ZSgmY3R4LT5kX2ZyYW1lLCBpKTsKLQkJZGJnKCJwbGFuZTogJXUsIHBsYW5lX3NpemU6ICVsdSIsIGksIHNpemVzW2ldKTsKIAkJYWxsb2NhdG9yc1tpXSA9IGN0eC0+ZmltY19kZXYtPmFsbG9jX2N0eDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBidWZmZXJfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCi17Ci0JLyogVE9ETzogKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBidWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOwpAQCAtMzgwLDcgKzM2NSw2IEBACiAJLnF1ZXVlX3NldHVwCQk9IHF1ZXVlX3NldHVwLAogCS5idWZfcHJlcGFyZQkJPSBidWZmZXJfcHJlcGFyZSwKIAkuYnVmX3F1ZXVlCQk9IGJ1ZmZlcl9xdWV1ZSwKLQkuYnVmX2luaXQJCT0gYnVmZmVyX2luaXQsCiAJLndhaXRfcHJlcGFyZQkJPSBmaW1jX3VubG9jaywKIAkud2FpdF9maW5pc2gJCT0gZmltY19sb2NrLAogCS5zdGFydF9zdHJlYW1pbmcJPSBzdGFydF9zdHJlYW1pbmcsCkBAIC05MDMsNiArODg3LDcgQEAKIGVycl92NGwyX3JlZzoKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKIGVycl9pbmZvOgorCWtmcmVlKGN0eCk7CiAJZGV2X2VycigmZmltYy0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGxcbiIpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYwppbmRleCBkYzkxYTg1Li5iZGYxOWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKQEAgLTEsOSArMSw4IEBACiAvKgotICogUzVQIGNhbWVyYSBpbnRlcmZhY2UgKHZpZGVvIHBvc3Rwcm9jZXNzb3IpIGRyaXZlcgorICogU2Ftc3VuZyBTNVAvRVhZTk9TNCBTb0Mgc2VyaWVzIGNhbWVyYSBpbnRlcmZhY2UgKHZpZGVvIHBvc3Rwcm9jZXNzb3IpIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCi0gKgotICogU3lsd2VzdGVyIE5hd3JvY2tpLCA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBDb250YWN0OiBTeWx3ZXN0ZXIgTmF3cm9ja2ksIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtNDIsNyArNDEsNiBAQAogCQkuY29sb3IJCT0gUzVQX0ZJTUNfUkdCNTY1LAogCQkubWVtcGxhbmVzCT0gMSwKIAkJLmNvbHBsYW5lcwk9IDEsCi0JCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfQkUsCiAJCS5mbGFncwkJPSBGTVRfRkxBR1NfTTJNLAogCX0sIHsKIAkJLm5hbWUJCT0gIkJHUjY2NiIsCkBAIC0yMzIsMTEgKzIzMCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQogCSpzaGlmdCA9IDAsICpyYXRpbyA9IDE7Ci0KLQlkYmcoInM6ICVkLCB0OiAlZCwgc2hpZnQ6ICVkLCByYXRpbzogJWQiLAotCSAgICBzcmMsIHRhciwgKnNoaWZ0LCAqcmF0aW8pOwogCXJldHVybiAwOwogfQogCkBAIC0yNjgsMTAgKzI2Miw4IEBACiAJCWVycigiaW52YWxpZCBzb3VyY2Ugc2l6ZTogJWQgeCAlZCIsIHN4LCBzeSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQogCXNjLT5yZWFsX3dpZHRoID0gc3g7CiAJc2MtPnJlYWxfaGVpZ2h0ID0gc3k7Ci0JZGJnKCJzeD0gJWQsIHN5PSAlZCwgdHg9ICVkLCB0eT0gJWQiLCBzeCwgc3ksIHR4LCB0eSk7CiAKIAlyZXQgPSBmaW1jX2dldF9zY2FsZXJfZmFjdG9yKHN4LCB0eCwgJnNjLT5wcmVfaHJhdGlvLCAmc2MtPmhmYWN0b3IpOwogCWlmIChyZXQpCkBAIC03MTEsMjIgKzcwMywxOCBAQAogCWYgPSBjdHhfZ2V0X2ZyYW1lKGN0eCwgdnEtPnR5cGUpOwogCWlmIChJU19FUlIoZikpCiAJCXJldHVybiBQVFJfRVJSKGYpOwotCiAJLyoKIAkgKiBSZXR1cm4gbnVtYmVyIG9mIG5vbi1jb250aWdvdXMgcGxhbmVzIChwbGFuZSBidWZmZXJzKQogCSAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJlZCBjb2xvciBmb3JtYXQuCiAJICovCi0JaWYgKGYtPmZtdCkKLQkJKm51bV9wbGFuZXMgPSBmLT5mbXQtPm1lbXBsYW5lczsKKwlpZiAoIWYtPmZtdCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKKwkqbnVtX3BsYW5lcyA9IGYtPmZtdC0+bWVtcGxhbmVzOwogCWZvciAoaSA9IDA7IGkgPCBmLT5mbXQtPm1lbXBsYW5lczsgaSsrKSB7Ci0JCXNpemVzW2ldID0gKGYtPndpZHRoICogZi0+aGVpZ2h0ICogZi0+Zm10LT5kZXB0aFtpXSkgPj4gMzsKKwkJc2l6ZXNbaV0gPSAoZi0+Zl93aWR0aCAqIGYtPmZfaGVpZ2h0ICogZi0+Zm10LT5kZXB0aFtpXSkgLyA4OwogCQlhbGxvY2F0b3JzW2ldID0gY3R4LT5maW1jX2Rldi0+YWxsb2NfY3R4OwogCX0KLQotCWlmICgqbnVtX2J1ZmZlcnMgPT0gMCkKLQkJKm51bV9idWZmZXJzID0gMTsKLQogCXJldHVybiAwOwogfQogCkBAIC04NTIsNyArODQwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cyk7ICsraSkgewogCQlmbXQgPSAmZmltY19mb3JtYXRzW2ldOwotCQlpZiAoZm10LT5mb3VyY2MgPT0gZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAmJgorCQlpZiAoZm10LT5mb3VyY2MgPT0gZi0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCAmJgogCQkgICAoZm10LT5mbGFncyAmIG1hc2spKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmgKaW5kZXggM2JlYjFlNS4uMWY3MDc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5oCkBAIC0xLDcgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKgotICogU3lsd2VzdGVyIE5hd3JvY2tpLCA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTEzNSw5ICsxMzMsMTAgQEAKICAqIEBuYW1lOiBmb3JtYXQgZGVzY3JpcHRpb24KICAqIEBmb3VyY2M6IHRoZSBmb3VyY2MgY29kZSBmb3IgdGhpcyBmb3JtYXQsIDAgaWYgbm90IGFwcGxpY2FibGUKICAqIEBjb2xvcjogdGhlIGNvcnJlc3BvbmRpbmcgZmltY19jb2xvcl9mbXQKLSAqIEBkZXB0aDogcGVyIHBsYW5lIGRyaXZlcidzIHByaXZhdGUgJ251bWJlciBvZiBiaXRzIHBlciBwaXhlbCcKICAqIEBtZW1wbGFuZXM6IG51bWJlciBvZiBwaHlzaWNhbGx5IG5vbi1jb250aWd1b3VzIGRhdGEgcGxhbmVzCiAgKiBAY29scGxhbmVzOiBudW1iZXIgb2YgcGh5c2ljYWxseSBjb250aWd1b3VzIGRhdGEgcGxhbmVzCisgKiBAZGVwdGg6IHBlciBwbGFuZSBkcml2ZXIncyBwcml2YXRlICdudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwnCisgKiBAZmxhZ3M6IGZsYWdzIGluZGljYXRpbmcgd2hpY2ggb3BlcmF0aW9uIG1vZGUgZm9ybWF0IGFwcGxpZXMgdG8KICAqLwogc3RydWN0IGZpbWNfZm10IHsKIAllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWJ1c19jb2RlOwpAQCAtMTcxLDcgKzE3MCw3IEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCBmaW1jX2VmZmVjdCAtIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSAiQXJiaXRyYXJ5IiBpbWFnZSBlZmZlY3QKKyAqIHN0cnVjdCBmaW1jX2VmZmVjdCAtIGNvbG9yIGVmZmVjdCBpbmZvcm1hdGlvbgogICogQHR5cGU6CWVmZmVjdCB0eXBlCiAgKiBAcGF0X2NiOgljciB2YWx1ZSB3aGVuIHR5cGUgaXMgImFyYml0cmFyeSIKICAqIEBwYXRfY3I6CWNyIHZhbHVlIHdoZW4gdHlwZSBpcyAiYXJiaXRyYXJ5IgpAQCAtMTg0LDcgKzE4Myw2IEBACiAKIC8qKgogICogc3RydWN0IGZpbWNfc2NhbGVyIC0gdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgRklNQyBpbmV0cm5hbCBzY2FsZXIKLSAqCiAgKiBAc2NhbGV1cF9oOgkJZmxhZyBpbmRpY2F0aW5nIHNjYWxpbmcgdXAgaG9yaXpvbnRhbGx5CiAgKiBAc2NhbGV1cF92OgkJZmxhZyBpbmRpY2F0aW5nIHNjYWxpbmcgdXAgdmVydGljYWxseQogICogQGNvcHlfbW9kZToJCWZsYWcgaW5kaWNhdGluZyB0cmFuc3BhcmVudCBETUEgdHJhbnNmZXIgKG5vIHNjYWxpbmcKQEAgLTIyMCw3ICsyMTgsNiBAQAogCiAvKioKICAqIHN0cnVjdCBmaW1jX2FkZHIgLSB0aGUgRklNQyBwaHlzaWNhbCBhZGRyZXNzIHNldCBmb3IgRE1BCi0gKgogICogQHk6CSBsdW1pbmFuY2UgcGxhbmUgcGh5c2ljYWwgYWRkcmVzcwogICogQGNiOgkgQ2IgcGxhbmUgcGh5c2ljYWwgYWRkcmVzcwogICogQGNyOgkgQ3IgcGxhbmUgcGh5c2ljYWwgYWRkcmVzcwpAQCAtMjM0LDYgKzIzMSw3IEBACiAvKioKICAqIHN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgLSB0aGUgZHJpdmVyJ3MgdmlkZW8gYnVmZmVyCiAgKiBAdmI6ICAgIHY0bCB2aWRlb2J1ZiBidWZmZXIKKyAqIEBsaXN0OiAgbGlua2VkIGxpc3Qgc3RydWN0dXJlIGZvciBidWZmZXIgcXVldWUKICAqIEBwYWRkcjogcHJlY2FsY3VsYXRlZCBwaHlzaWNhbCBhZGRyZXNzIHNldAogICogQGluZGV4OiBidWZmZXIgaW5kZXggZm9yIHRoZSBvdXRwdXQgRE1BIGVuZ2luZQogICovCkBAIC0yNTQsMTEgKzI1MiwxMCBAQAogICogQG9mZnNfdjoJaW1hZ2UgdmVydGljYWwgcGl4ZWwgb2Zmc2V0CiAgKiBAd2lkdGg6CWltYWdlIHBpeGVsIHdpZHRoCiAgKiBAaGVpZ2h0OglpbWFnZSBwaXhlbCB3ZWlnaHQKLSAqIEBwYWRkcjoJaW1hZ2UgZnJhbWUgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3NlcwotICogQGJ1Zl9jbnQ6CW51bWJlciBvZiBidWZmZXJzIGRlcGVuZGluZyBvbiBhIGNvbG9yIGZvcm1hdAogICogQHBheWxvYWQ6CWltYWdlIHNpemUgaW4gYnl0ZXMgKHcgeCBoIHggYnBwKQotICogQGNvbG9yOgljb2xvciBmb3JtYXQKKyAqIEBwYWRkcjoJaW1hZ2UgZnJhbWUgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3NlcwogICogQGRtYV9vZmZzZXQ6CURNQSBvZmZzZXQgaW4gYnl0ZXMKKyAqIEBmbXQ6CWZpbWMgY29sb3IgZm9ybWF0IHBvaW50ZXIKICAqLwogc3RydWN0IGZpbWNfZnJhbWUgewogCXUzMglmX3dpZHRoOwpAQCAtMzkwLDIxICszODcsMjIgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgZmltY19kZXYgLSBhYnN0cmFjdGlvbiBmb3IgRklNQyBlbnRpdHkKLSAqCiAgKiBAc2xvY2s6CXRoZSBzcGlubG9jayBwcm90ZWN0aW5nIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKICAqIEBsb2NrOgl0aGUgbXV0ZXggcHJvdGVjdGluZyB0aGlzIGRhdGEgc3RydWN0dXJlCiAgKiBAcGRldjoJcG9pbnRlciB0byB0aGUgRklNQyBwbGF0Zm9ybSBkZXZpY2UKICAqIEBwZGF0YToJcG9pbnRlciB0byB0aGUgZGV2aWNlIHBsYXRmb3JtIGRhdGEKKyAqIEB2YXJpYW50Ogl0aGUgSVAgdmFyaWFudCBpbmZvcm1hdGlvbgogICogQGlkOgkJRklNQyBkZXZpY2UgaW5kZXggKDAuLkZJTUNfTUFYX0RFVlMpCiAgKiBAbnVtX2Nsb2NrczogdGhlIG51bWJlciBvZiBjbG9ja3MgbWFuYWdlZCBieSB0aGlzIGRldmljZSBpbnN0YW5jZQotICogQGNsb2NrW106CXRoZSBjbG9ja3MgcmVxdWlyZWQgZm9yIEZJTUMgb3BlcmF0aW9uCisgKiBAY2xvY2s6CWNsb2NrcyByZXF1aXJlZCBmb3IgRklNQyBvcGVyYXRpb24KICAqIEByZWdzOgl0aGUgbWFwcGVkIGhhcmR3YXJlIHJlZ2lzdGVycwogICogQHJlZ3NfcmVzOgl0aGUgcmVzb3VyY2UgY2xhaW1lZCBmb3IgSU8gcmVnaXN0ZXJzCi0gKiBAaXJxOglpbnRlcnJ1cHQgbnVtYmVyIG9mIHRoZSBGSU1DIHN1YmRldmljZQotICogQGlycV9xdWV1ZToKKyAqIEBpcnE6CUZJTUMgaW50ZXJydXB0IG51bWJlcgorICogQGlycV9xdWV1ZToJaW50ZXJydXB0IGhhbmRsZXIgd2FpdHF1ZXVlCiAgKiBAbTJtOgltZW1vcnktdG8tbWVtb3J5IFY0TDIgZGV2aWNlIGluZm9ybWF0aW9uCiAgKiBAdmlkX2NhcDoJY2FtZXJhIGNhcHR1cmUgZGV2aWNlIGluZm9ybWF0aW9uCiAgKiBAc3RhdGU6CWZsYWdzIHVzZWQgdG8gc3luY2hyb25pemUgbTJtIGFuZCBjYXB0dXJlIG1vZGUgb3BlcmF0aW9uCisgKiBAYWxsb2NfY3R4Ogl2aWRlb2J1ZjIgbWVtb3J5IGFsbG9jYXRvciBjb250ZXh0CiAgKi8KIHN0cnVjdCBmaW1jX2RldiB7CiAJc3BpbmxvY2tfdAkJCXNsb2NrOwpAQCAtNDI3LDggKzQyNSw3IEBACiAKIC8qKgogICogZmltY19jdHggLSB0aGUgZGV2aWNlIGNvbnRleHQgZGF0YQotICoKLSAqIEBsb2NrOgkJbXV0ZXggcHJvdGVjdGluZyB0aGlzIGRhdGEgc3RydWN0dXJlCisgKiBAc2xvY2s6CQlzcGlubG9jayBwcm90ZWN0aW5nIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKICAqIEBzX2ZyYW1lOgkJc291cmNlIGZyYW1lIHByb3BlcnRpZXMKICAqIEBkX2ZyYW1lOgkJZGVzdGluYXRpb24gZnJhbWUgcHJvcGVydGllcwogICogQG91dF9vcmRlcl8xcDoJb3V0cHV0IDEtcGxhbmUgWUNCQ1Igb3JkZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCmluZGV4IGZmNmMwZTkuLmQ0ZWUyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwpAQCAtOTYzLDcgKzk2Myw3IEBACiAJICogdG8gd29yayB3aXRoIG90aGVyIHByb3RvY29scy4KIAkgKi8KIAlpZiAoIWlyLT5hY3RpdmUpIHsKLQkJdGltZW91dCA9IGppZmZpZXMgKyBqaWZmaWVzX3RvX21zZWNzKDE1KTsKKwkJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDE1KTsKIAkJbW9kX3RpbWVyKCZpci0+dGltZXIsIHRpbWVvdXQpOwogCQlpci0+YWN0aXZlID0gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCmluZGV4IDM5ODg2NDMuLjRlNGQ0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCkBAIC0xNTEyLDcgKzE1MTIsNyBAQAogICovCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfdmlkZW9fc3RhcnQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IGRldmljZV90eXBlICp0eXBlID0gaWNkLT52ZGV2LT5kZXYudHlwZTsKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUgPSBpY2QtPnZkZXYtPmRldi50eXBlOwogCWludCByZXQ7CiAKIAlpZiAoIWljZC0+ZGV2LnBhcmVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKaW5kZXggOTM2M2VkOS4uYTAzOTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKQEAgLTcxNCwyOSArNzE0LDM0IEBACiAgKiByZXR1cm5zIDAuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBmb3IgYm9hcmRzIHRoYXQgaGF2ZSBhIHNlcGFyYXRlIHR1bmVyIGZvcgogICogcmFkaW8gKGxpa2UgZGV2aWNlcyB3aXRoIHRlYTU3NjcpLgorICogTk9URTogbXQyMHh4IHVzZXMgVjRMMl9UVU5FUl9ESUdJVEFMX1RWIGFuZCBjYWxscyBzZXRfdHZfZnJlcSB0bworICogICAgICAgc2VsZWN0IGEgVFYgZnJlcXVlbmN5LiBTbywgdF9tb2RlID0gVF9BTkFMT0dfVFYgY291bGQgYWN0dWFsbHkKKyAqCSBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIERpZ2l0YWwgVFYgdG9vLgogICovCiBzdGF0aWMgaW5saW5lIGludCBjaGVja19tb2RlKHN0cnVjdCB0dW5lciAqdCwgZW51bSB2NGwyX3R1bmVyX3R5cGUgbW9kZSkKIHsKLQlpZiAoKDEgPDwgbW9kZSAmIHQtPm1vZGVfbWFzaykgPT0gMCkKKwlpbnQgdF9tb2RlOworCWlmIChtb2RlID09IFY0TDJfVFVORVJfUkFESU8pCisJCXRfbW9kZSA9IFRfUkFESU87CisJZWxzZQorCQl0X21vZGUgPSBUX0FOQUxPR19UVjsKKworCWlmICgodF9tb2RlICYgdC0+bW9kZV9tYXNrKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwogfQogCiAvKioKLSAqIHNldF9tb2RlX2ZyZXEgLSBTd2l0Y2ggdHVuZXIgdG8gb3RoZXIgbW9kZS4KLSAqIEBjbGllbnQ6CXN0cnVjdCBpMmNfY2xpZW50IHBvaW50ZXIKKyAqIHNldF9tb2RlIC0gU3dpdGNoIHR1bmVyIHRvIG90aGVyIG1vZGUuCiAgKiBAdDoJCWEgcG9pbnRlciB0byB0aGUgbW9kdWxlJ3MgaW50ZXJuYWwgc3RydWN0X3R1bmVyCiAgKiBAbW9kZToJZW51bSB2NGwyX3R5cGUgKHJhZGlvIG9yIFRWKQotICogQGZyZXE6CWZyZXF1ZW5jeSB0byBzZXQgKDAgbWVhbnMgdG8gdXNlIHRoZSBwcmV2aW91cyBvbmUpCiAgKgogICogSWYgdHVuZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBuZWVkZWQgbW9kZSAocmFkaW8gb3IgVFYpLCBwcmludHMgYQogICogZGVidWcgbWVzc2FnZSBhbmQgcmV0dXJucyAtRUlOVkFMLCBjaGFuZ2luZyBpdHMgc3RhdGUgdG8gc3RhbmRieS4KLSAqIE90aGVyd2lzZSwgY2hhbmdlcyB0aGUgc3RhdGUgYW5kIHNldHMgZnJlcXVlbmN5IHRvIHRoZSBsYXN0IHZhbHVlLCBpZgotICogdGhlIHR1bmVyIGNhbiBzbGVlcCBvciBpZiBpdCBzdXBwb3J0cyBib3RoIFJhZGlvIGFuZCBUVi4KKyAqIE90aGVyd2lzZSwgY2hhbmdlcyB0aGUgbW9kZSBhbmQgcmV0dXJucyAwLgogICovCi1zdGF0aWMgaW50IHNldF9tb2RlX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHR1bmVyICp0LAotCQkJIGVudW0gdjRsMl90dW5lcl90eXBlIG1vZGUsIHVuc2lnbmVkIGludCBmcmVxKQorc3RhdGljIGludCBzZXRfbW9kZShzdHJ1Y3QgdHVuZXIgKnQsIGVudW0gdjRsMl90dW5lcl90eXBlIG1vZGUpCiB7CiAJc3RydWN0IGFuYWxvZ19kZW1vZF9vcHMgKmFuYWxvZ19vcHMgPSAmdC0+ZmUub3BzLmFuYWxvZ19vcHM7CiAKQEAgLTc1MiwxOSArNzU3LDI5IEBACiAJCXQtPm1vZGUgPSBtb2RlOwogCQl0dW5lcl9kYmcoIkNoYW5naW5nIHRvIG1vZGUgJWRcbiIsIG1vZGUpOwogCX0KLQlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKSB7Ci0JCWlmIChmcmVxKQotCQkJdC0+cmFkaW9fZnJlcSA9IGZyZXE7Ci0JCXNldF9yYWRpb19mcmVxKGNsaWVudCwgdC0+cmFkaW9fZnJlcSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZyZXEpCi0JCQl0LT50dl9mcmVxID0gZnJlcTsKLQkJc2V0X3R2X2ZyZXEoY2xpZW50LCB0LT50dl9mcmVxKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBzZXRfZnJlcSAtIFNldCB0aGUgdHVuZXIgdG8gdGhlIGRlc2lyZWQgZnJlcXVlbmN5LgorICogQHQ6CQlhIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSdzIGludGVybmFsIHN0cnVjdF90dW5lcgorICogQGZyZXE6CWZyZXF1ZW5jeSB0byBzZXQgKDAgbWVhbnMgdG8gdXNlIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSkKKyAqLworc3RhdGljIHZvaWQgc2V0X2ZyZXEoc3RydWN0IHR1bmVyICp0LCB1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmdC0+c2QpOworCisJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlpZiAoIWZyZXEpCisJCQlmcmVxID0gdC0+cmFkaW9fZnJlcTsKKwkJc2V0X3JhZGlvX2ZyZXEoY2xpZW50LCBmcmVxKTsKKwl9IGVsc2UgeworCQlpZiAoIWZyZXEpCisJCQlmcmVxID0gdC0+dHZfZnJlcTsKKwkJc2V0X3R2X2ZyZXEoY2xpZW50LCBmcmVxKTsKKwl9Cit9CisKIC8qCiAgKiBGdW5jdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIFRWIG1vZGUKICAqLwpAQCAtODE3LDcgKzgzMiw4IEBACiAvKioKICAqIHR1bmVyX2ZpeHVwX3N0ZCAtIGZvcmNlIGEgZ2l2ZW4gdmlkZW8gc3RhbmRhcmQgdmFyaWFudAogICoKLSAqIEB0Ogl0dW5lciBpbnRlcm5hbCBzdHJ1Y3QKKyAqIEB0OiB0dW5lciBpbnRlcm5hbCBzdHJ1Y3QKKyAqIEBzdGQ6CVRWIHN0YW5kYXJkCiAgKgogICogQSBmZXcgZGV2aWNlcyBvciBkcml2ZXJzIGhhdmUgcHJvYmxlbSB0byBkZXRlY3Qgc29tZSBzdGFuZGFyZCB2YXJpYXRpb25zLgogICogT24gb3RoZXIgb3BlcmF0aW9uYWwgc3lzdGVtcywgdGhlIGRyaXZlcnMgZ2VuZXJhbGx5IGhhdmUgYSBwZXItY291bnRyeQpAQCAtODI3LDU3ICs4NDMsMzkgQEAKICAqIHRvIGRpc3Rpbmd1aXNoIGFsbCB2aWRlbyBzdGFuZGFyZCB2YXJpYXRpb25zLCBhIG1vZHByb2JlIHBhcmFtZXRlciBjYW4KICAqIGJlIHVzZWQgdG8gZm9yY2UgYSB2aWRlbyBzdGFuZGFyZCBtYXRjaC4KICAqLwotc3RhdGljIGludCB0dW5lcl9maXh1cF9zdGQoc3RydWN0IHR1bmVyICp0KQorc3RhdGljIHY0bDJfc3RkX2lkIHR1bmVyX2ZpeHVwX3N0ZChzdHJ1Y3QgdHVuZXIgKnQsIHY0bDJfc3RkX2lkIHN0ZCkKIHsKLQlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1BBTCkgPT0gVjRMMl9TVERfUEFMKSB7CisJaWYgKHBhbFswXSAhPSAnLScgJiYgKHN0ZCAmIFY0TDJfU1REX1BBTCkgPT0gVjRMMl9TVERfUEFMKSB7CiAJCXN3aXRjaCAocGFsWzBdKSB7CiAJCWNhc2UgJzYnOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtNjBcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMXzYwOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gVjRMMl9TVERfUEFMXzYwOwogCQljYXNlICdiJzoKIAkJY2FzZSAnQic6CiAJCWNhc2UgJ2cnOgogCQljYXNlICdHJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRzsKLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9CRzsKIAkJY2FzZSAnaSc6CiAJCWNhc2UgJ0knOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtSVxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfSTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9JOwogCQljYXNlICdkJzoKIAkJY2FzZSAnRCc6CiAJCWNhc2UgJ2snOgogCQljYXNlICdLJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLURLXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9ESzsKLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9ESzsKIAkJY2FzZSAnTSc6CiAJCWNhc2UgJ20nOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtTVxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9NOwogCQljYXNlICdOJzoKIAkJY2FzZSAnbic6Ci0JCQlpZiAocGFsWzFdID09ICdjJyB8fCBwYWxbMV0gPT0gJ0MnKSB7Ci0JCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtTmNcbiIpOwotCQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9OYzsKLQkJCX0gZWxzZSB7Ci0JCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtTlxuIik7Ci0JCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX047Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnLSc6Ci0JCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLwotCQkJYnJlYWs7CisJCQlpZiAocGFsWzFdID09ICdjJyB8fCBwYWxbMV0gPT0gJ0MnKQorCQkJCXJldHVybiBWNEwyX1NURF9QQUxfTmM7CisJCQlyZXR1cm4gVjRMMl9TVERfUEFMX047CiAJCWRlZmF1bHQ6CiAJCQl0dW5lcl93YXJuKCJwYWw9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmICgodC0+c3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7CisJaWYgKHNlY2FtWzBdICE9ICctJyAmJiAoc3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7CiAJCXN3aXRjaCAoc2VjYW1bMF0pIHsKIAkJY2FzZSAnYic6CiAJCWNhc2UgJ0InOgpAQCAtODg1LDYzICs4ODMsNDIgQEAKIAkJY2FzZSAnRyc6CiAJCWNhc2UgJ2gnOgogCQljYXNlICdIJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1CR0hcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fQiB8Ci0JCQkJIFY0TDJfU1REX1NFQ0FNX0cgfAotCQkJCSBWNEwyX1NURF9TRUNBTV9IOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gVjRMMl9TVERfU0VDQU1fQiB8CisJCQkgICAgICAgVjRMMl9TVERfU0VDQU1fRyB8CisJCQkgICAgICAgVjRMMl9TVERfU0VDQU1fSDsKIAkJY2FzZSAnZCc6CiAJCWNhc2UgJ0QnOgogCQljYXNlICdrJzoKIAkJY2FzZSAnSyc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tREtcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fREs7Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9TRUNBTV9ESzsKIAkJY2FzZSAnbCc6CiAJCWNhc2UgJ0wnOgotCQkJaWYgKChzZWNhbVsxXSA9PSAnQycpIHx8IChzZWNhbVsxXSA9PSAnYycpKSB7Ci0JCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUwnXG4iKTsKLQkJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MQzsKLQkJCX0gZWxzZSB7Ci0JCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUxcbiIpOwotCQkJCXQtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0w7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnLSc6Ci0JCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLwotCQkJYnJlYWs7CisJCQlpZiAoKHNlY2FtWzFdID09ICdDJykgfHwgKHNlY2FtWzFdID09ICdjJykpCisJCQkJcmV0dXJuIFY0TDJfU1REX1NFQ0FNX0xDOworCQkJcmV0dXJuIFY0TDJfU1REX1NFQ0FNX0w7CiAJCWRlZmF1bHQ6CiAJCQl0dW5lcl93YXJuKCJzZWNhbT0gYXJndW1lbnQgbm90IHJlY29nbmlzZWRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX05UU0MpID09IFY0TDJfU1REX05UU0MpIHsKKwlpZiAobnRzY1swXSAhPSAnLScgJiYgKHN0ZCAmIFY0TDJfU1REX05UU0MpID09IFY0TDJfU1REX05UU0MpIHsKIAkJc3dpdGNoIChudHNjWzBdKSB7CiAJCWNhc2UgJ20nOgogCQljYXNlICdNJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0MtTVxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX007Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9OVFNDX007CiAJCWNhc2UgJ2onOgogCQljYXNlICdKJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0NfTV9KUFxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX01fSlA7Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9OVFNDX01fSlA7CiAJCWNhc2UgJ2snOgogCQljYXNlICdLJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0NfTV9LUlxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX01fS1I7Ci0JCQlicmVhazsKLQkJY2FzZSAnLSc6Ci0JCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLwotCQkJYnJlYWs7CisJCQlyZXR1cm4gVjRMMl9TVERfTlRTQ19NX0tSOwogCQlkZWZhdWx0OgogCQkJdHVuZXJfaW5mbygibnRzYz0gYXJndW1lbnQgbm90IHJlY29nbmlzZWRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHN0ZDsKIH0KIAogLyoKQEAgLTEwMTYsNyArOTkzLDcgQEAKIAljYXNlIFY0TDJfVFVORVJfUkFESU86CiAJCXAgPSAicmFkaW8iOwogCQlicmVhazsKLQljYXNlIFY0TDJfVFVORVJfRElHSVRBTF9UVjoKKwljYXNlIFY0TDJfVFVORVJfRElHSVRBTF9UVjogLyogVXNlZCBieSBtdDIweHggKi8KIAkJcCA9ICJkaWdpdGFsIFRWIjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1RVTkVSX0FOQUxPR19UVjoKQEAgLTEwNTgsMTAgKzEwMzUsOSBAQAogc3RhdGljIGludCB0dW5lcl9zX3JhZGlvKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmIChzZXRfbW9kZV9mcmVxKGNsaWVudCwgdCwgVjRMMl9UVU5FUl9SQURJTywgMCkgPT0gLUVJTlZBTCkKLQkJcmV0dXJuIDA7CisJaWYgKHNldF9tb2RlKHQsIFY0TDJfVFVORVJfUkFESU8pID09IDApCisJCXNldF9mcmVxKHQsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0xMDcyLDE2ICsxMDQ4LDIwIEBACiAvKioKICAqIHR1bmVyX3NfcG93ZXIgLSBjb250cm9scyB0aGUgcG93ZXIgc3RhdGUgb2YgdGhlIHR1bmVyCiAgKiBAc2Q6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfc3ViZGV2Ci0gKiBAb246IGEgemVybyB2YWx1ZSBwdXRzIHRoZSB0dW5lciB0byBzbGVlcAorICogQG9uOiBhIHplcm8gdmFsdWUgcHV0cyB0aGUgdHVuZXIgdG8gc2xlZXAsIG5vbi16ZXJvIHdha2VzIGl0IHVwCiAgKi8KIHN0YXRpYyBpbnQgdHVuZXJfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwogCXN0cnVjdCBhbmFsb2dfZGVtb2Rfb3BzICphbmFsb2dfb3BzID0gJnQtPmZlLm9wcy5hbmFsb2dfb3BzOwogCi0JLyogRklYTUU6IFdoeSB0aGlzIGZ1bmN0aW9uIGRvbid0IHdha2UgdGhlIHR1bmVyIGlmIG9uICE9IDAgPyAqLwotCWlmIChvbikKKwlpZiAob24pIHsKKwkJaWYgKHQtPnN0YW5kYnkgJiYgc2V0X21vZGUodCwgdC0+bW9kZSkgPT0gMCkgeworCQkJdHVuZXJfZGJnKCJXYWtpbmcgdXAgdHVuZXJcbiIpOworCQkJc2V0X2ZyZXEodCwgMCk7CisJCX0KIAkJcmV0dXJuIDA7CisJfQogCiAJdHVuZXJfZGJnKCJQdXR0aW5nIHR1bmVyIHRvIHNsZWVwXG4iKTsKIAl0LT5zdGFuZGJ5ID0gdHJ1ZTsKQEAgLTEwOTMsMjggKzEwNzMsMzYgQEAKIHN0YXRpYyBpbnQgdHVuZXJfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQogewogCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQlpZiAoc2V0X21vZGVfZnJlcShjbGllbnQsIHQsIFY0TDJfVFVORVJfQU5BTE9HX1RWLCAwKSA9PSAtRUlOVkFMKQorCWlmIChzZXRfbW9kZSh0LCBWNEwyX1RVTkVSX0FOQUxPR19UVikpCiAJCXJldHVybiAwOwogCi0JdC0+c3RkID0gc3RkOwotCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKLQorCXQtPnN0ZCA9IHR1bmVyX2ZpeHVwX3N0ZCh0LCBzdGQpOworCWlmICh0LT5zdGQgIT0gc3RkKQorCQl0dW5lcl9kYmcoIkZpeHVwIHN0YW5kYXJkICVsbHggdG8gJWxseFxuIiwgc3RkLCB0LT5zdGQpOworCXNldF9mcmVxKHQsIDApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHR1bmVyX3NfZnJlcXVlbmN5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JaWYgKHNldF9tb2RlX2ZyZXEoY2xpZW50LCB0LCBmLT50eXBlLCBmLT5mcmVxdWVuY3kpID09IC1FSU5WQUwpCi0JCXJldHVybiAwOwotCisJaWYgKHNldF9tb2RlKHQsIGYtPnR5cGUpID09IDApCisJCXNldF9mcmVxKHQsIGYtPmZyZXF1ZW5jeSk7CiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogdHVuZXJfZ19mcmVxdWVuY3kgLSBHZXQgdGhlIHR1bmVkIGZyZXF1ZW5jeSBmb3IgdGhlIHR1bmVyCisgKiBAc2Q6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfc3ViZGV2CisgKiBAZjogcG9pbnRlciB0byBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kKKyAqCisgKiBBdCByZXR1cm4sIHRoZSBzdHJ1Y3R1cmUgZiB3aWxsIGJlIGZpbGxlZCB3aXRoIHR1bmVyIGZyZXF1ZW5jeQorICogaWYgdGhlIHR1bmVyIG1hdGNoZXMgdGhlIGYtPnR5cGUuCisgKiBOb3RlOiBmLT50eXBlIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpdC4KKyAqIFRoaXMgaXMgZG9uZSBieSBlaXRoZXIgdmlkZW9faW9jdGwyIG9yIGJ5IHRoZSBicmlkZ2UgZHJpdmVyLgorICovCiBzdGF0aWMgaW50IHR1bmVyX2dfZnJlcXVlbmN5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7CkBAIC0xMTIyLDggKzExMTAsNyBAQAogCiAJaWYgKGNoZWNrX21vZGUodCwgZi0+dHlwZSkgPT0gLUVJTlZBTCkKIAkJcmV0dXJuIDA7Ci0JZi0+dHlwZSA9IHQtPm1vZGU7Ci0JaWYgKGZlX3R1bmVyX29wcy0+Z2V0X2ZyZXF1ZW5jeSAmJiAhdC0+c3RhbmRieSkgeworCWlmIChmLT50eXBlID09IHQtPm1vZGUgJiYgZmVfdHVuZXJfb3BzLT5nZXRfZnJlcXVlbmN5ICYmICF0LT5zdGFuZGJ5KSB7CiAJCXUzMiBhYnNfZnJlcTsKIAogCQlmZV90dW5lcl9vcHMtPmdldF9mcmVxdWVuY3koJnQtPmZlLCAmYWJzX2ZyZXEpOwpAQCAtMTEzMSwxMiArMTExOCwyMiBAQAogCQkJRElWX1JPVU5EX0NMT1NFU1QoYWJzX2ZyZXEgKiAyLCAxMjUpIDoKIAkJCURJVl9ST1VORF9DTE9TRVNUKGFic19mcmVxLCA2MjUwMCk7CiAJfSBlbHNlIHsKLQkJZi0+ZnJlcXVlbmN5ID0gKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgPworCQlmLT5mcmVxdWVuY3kgPSAoVjRMMl9UVU5FUl9SQURJTyA9PSBmLT50eXBlKSA/CiAJCQl0LT5yYWRpb19mcmVxIDogdC0+dHZfZnJlcTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogdHVuZXJfZ190dW5lciAtIEZpbGwgaW4gdHVuZXIgaW5mb3JtYXRpb24KKyAqIEBzZDogcG9pbnRlciB0byBzdHJ1Y3QgdjRsMl9zdWJkZXYKKyAqIEB2dDogcG9pbnRlciB0byBzdHJ1Y3QgdjRsMl90dW5lcgorICoKKyAqIEF0IHJldHVybiwgdGhlIHN0cnVjdHVyZSB2dCB3aWxsIGJlIGZpbGxlZCB3aXRoIHR1bmVyIGluZm9ybWF0aW9uCisgKiBpZiB0aGUgdHVuZXIgbWF0Y2hlcyB2dC0+dHlwZS4KKyAqIE5vdGU6IHZ0LT50eXBlIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpdC4KKyAqIFRoaXMgaXMgZG9uZSBieSBlaXRoZXIgdmlkZW9faW9jdGwyIG9yIGJ5IHRoZSBicmlkZ2UgZHJpdmVyLgorICovCiBzdGF0aWMgaW50IHR1bmVyX2dfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQogewogCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKQEAgLTExNDUsNDggKzExNDIsNTcgQEAKIAogCWlmIChjaGVja19tb2RlKHQsIHZ0LT50eXBlKSA9PSAtRUlOVkFMKQogCQlyZXR1cm4gMDsKLQl2dC0+dHlwZSA9IHQtPm1vZGU7Ci0JaWYgKGFuYWxvZ19vcHMtPmdldF9hZmMpCisJaWYgKHZ0LT50eXBlID09IHQtPm1vZGUgJiYgYW5hbG9nX29wcy0+Z2V0X2FmYykKIAkJdnQtPmFmYyA9IGFuYWxvZ19vcHMtPmdldF9hZmMoJnQtPmZlKTsKLQlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX0FOQUxPR19UVikKLQkJdnQtPmNhcGFiaWxpdHkgfD0gVjRMMl9UVU5FUl9DQVBfTk9STTsKIAlpZiAodC0+bW9kZSAhPSBWNEwyX1RVTkVSX1JBRElPKSB7CisJCXZ0LT5jYXBhYmlsaXR5IHw9IFY0TDJfVFVORVJfQ0FQX05PUk07CiAJCXZ0LT5yYW5nZWxvdyA9IHR2X3JhbmdlWzBdICogMTY7CiAJCXZ0LT5yYW5nZWhpZ2ggPSB0dl9yYW5nZVsxXSAqIDE2OwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiByYWRpbyBtb2RlICovCi0JdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCWlmIChmZV90dW5lcl9vcHMtPmdldF9zdGF0dXMpIHsKLQkJdTMyIHR1bmVyX3N0YXR1czsKKwlpZiAodnQtPnR5cGUgPT0gdC0+bW9kZSkgeworCQl2dC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk8gfCBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCWlmIChmZV90dW5lcl9vcHMtPmdldF9zdGF0dXMpIHsKKwkJCXUzMiB0dW5lcl9zdGF0dXM7CiAKLQkJZmVfdHVuZXJfb3BzLT5nZXRfc3RhdHVzKCZ0LT5mZSwgJnR1bmVyX3N0YXR1cyk7Ci0JCXZ0LT5yeHN1YmNoYW5zID0KLQkJCSh0dW5lcl9zdGF0dXMgJiBUVU5FUl9TVEFUVVNfU1RFUkVPKSA/Ci0JCQlWNEwyX1RVTkVSX1NVQl9TVEVSRU8gOgotCQkJVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCWZlX3R1bmVyX29wcy0+Z2V0X3N0YXR1cygmdC0+ZmUsICZ0dW5lcl9zdGF0dXMpOworCQkJdnQtPnJ4c3ViY2hhbnMgPQorCQkJCSh0dW5lcl9zdGF0dXMgJiBUVU5FUl9TVEFUVVNfU1RFUkVPKSA/CisJCQkJVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDoKKwkJCQlWNEwyX1RVTkVSX1NVQl9NT05POworCQl9CisJCWlmIChhbmFsb2dfb3BzLT5oYXNfc2lnbmFsKQorCQkJdnQtPnNpZ25hbCA9IGFuYWxvZ19vcHMtPmhhc19zaWduYWwoJnQtPmZlKTsKKwkJdnQtPmF1ZG1vZGUgPSB0LT5hdWRtb2RlOwogCX0KLQlpZiAoYW5hbG9nX29wcy0+aGFzX3NpZ25hbCkKLQkJdnQtPnNpZ25hbCA9IGFuYWxvZ19vcHMtPmhhc19zaWduYWwoJnQtPmZlKTsKIAl2dC0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9MT1cgfCBWNEwyX1RVTkVSX0NBUF9TVEVSRU87Ci0JdnQtPmF1ZG1vZGUgPSB0LT5hdWRtb2RlOwogCXZ0LT5yYW5nZWxvdyA9IHJhZGlvX3JhbmdlWzBdICogMTYwMDA7CiAJdnQtPnJhbmdlaGlnaCA9IHJhZGlvX3JhbmdlWzFdICogMTYwMDA7CiAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiB0dW5lcl9zX3R1bmVyIC0gU2V0IHRoZSB0dW5lcidzIGF1ZGlvIG1vZGUKKyAqIEBzZDogcG9pbnRlciB0byBzdHJ1Y3QgdjRsMl9zdWJkZXYKKyAqIEB2dDogcG9pbnRlciB0byBzdHJ1Y3QgdjRsMl90dW5lcgorICoKKyAqIFNldHMgdGhlIGF1ZGlvIG1vZGUgaWYgdGhlIHR1bmVyIG1hdGNoZXMgdnQtPnR5cGUuCisgKiBOb3RlOiB2dC0+dHlwZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaXQuCisgKiBUaGlzIGlzIGRvbmUgYnkgZWl0aGVyIHZpZGVvX2lvY3RsMiBvciBieSB0aGUgYnJpZGdlIGRyaXZlci4KKyAqLwogc3RhdGljIGludCB0dW5lcl9zX3R1bmVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3R1bmVyICp2dCkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JaWYgKHNldF9tb2RlX2ZyZXEoY2xpZW50LCB0LCB2dC0+dHlwZSwgMCkgPT0gLUVJTlZBTCkKKwlpZiAoc2V0X21vZGUodCwgdnQtPnR5cGUpKQogCQlyZXR1cm4gMDsKIAogCWlmICh0LT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pCiAJCXQtPmF1ZG1vZGUgPSB2dC0+YXVkbW9kZTsKKwlzZXRfZnJlcSh0LCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIyMSw3ICsxMjI3LDggQEAKIAl0dW5lcl9kYmcoInJlc3VtZVxuIik7CiAKIAlpZiAoIXQtPnN0YW5kYnkpCi0JCXNldF9tb2RlX2ZyZXEoYywgdCwgdC0+dHlwZSwgMCk7CisJCWlmIChzZXRfbW9kZSh0LCB0LT5tb2RlKSA9PSAwKQorCQkJc2V0X2ZyZXEodCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19lbnRpdHkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19lbnRpdHkuYwppbmRleCBlZGU3ODUyLi40OGZlYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZW50aXR5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2VudGl0eS5jCkBAIC0yNywxNCArMjcsMjAgQEAKIAlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5KQogewogCWNvbnN0IHUzMiBmbGFncyA9IE1FRElBX0xOS19GTF9FTkFCTEVEIHwgTUVESUFfTE5LX0ZMX0lNTVVUQUJMRTsKLQlzdHJ1Y3QgdXZjX2VudGl0eSAqcmVtb3RlOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKnNpbms7CiAJdW5zaWduZWQgaW50IGk7Ci0JdTggcmVtb3RlX3BhZDsKIAlpbnQgcmV0OwogCisJc2luayA9IChVVkNfRU5USVRZX1RZUEUoZW50aXR5KSA9PSBVVkNfVFRfU1RSRUFNSU5HKQorCSAgICAgPyAoZW50aXR5LT52ZGV2ID8gJmVudGl0eS0+dmRldi0+ZW50aXR5IDogTlVMTCkKKwkgICAgIDogJmVudGl0eS0+c3ViZGV2LmVudGl0eTsKKwlpZiAoc2luayA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwogCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPm51bV9wYWRzOyArK2kpIHsKIAkJc3RydWN0IG1lZGlhX2VudGl0eSAqc291cmNlOwotCQlzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzaW5rOworCQlzdHJ1Y3QgdXZjX2VudGl0eSAqcmVtb3RlOworCQl1OCByZW1vdGVfcGFkOwogCiAJCWlmICghKGVudGl0eS0+cGFkc1tpXS5mbGFncyAmIE1FRElBX1BBRF9GTF9TSU5LKSkKIAkJCWNvbnRpbnVlOwpAQCAtNDMsMTAgKzQ5LDExIEBACiAJCWlmIChyZW1vdGUgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXNvdXJjZSA9IChVVkNfRU5USVRZX1RZUEUocmVtb3RlKSA9PSBVVkNfVFRfU1RSRUFNSU5HKQotCQkgICAgICAgPyAmcmVtb3RlLT52ZGV2LT5lbnRpdHkgOiAmcmVtb3RlLT5zdWJkZXYuZW50aXR5OwotCQlzaW5rID0gKFVWQ19FTlRJVFlfVFlQRShlbnRpdHkpID09IFVWQ19UVF9TVFJFQU1JTkcpCi0JCSAgICAgPyAmZW50aXR5LT52ZGV2LT5lbnRpdHkgOiAmZW50aXR5LT5zdWJkZXYuZW50aXR5OworCQlzb3VyY2UgPSAoVVZDX0VOVElUWV9UWVBFKHJlbW90ZSkgIT0gVVZDX1RUX1NUUkVBTUlORykKKwkJICAgICAgID8gKHJlbW90ZS0+dmRldiA/ICZyZW1vdGUtPnZkZXYtPmVudGl0eSA6IE5VTEwpCisJCSAgICAgICA6ICZyZW1vdGUtPnN1YmRldi5lbnRpdHk7CisJCWlmIChzb3VyY2UgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwogCiAJCXJlbW90ZV9wYWQgPSByZW1vdGUtPm51bV9wYWRzIC0gMTsKIAkJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKHNvdXJjZSwgcmVtb3RlX3BhZCwKQEAgLTU1LDExICs2MiwxMCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkgIT0gVVZDX1RUX1NUUkVBTUlORykKLQkJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KCZjaGFpbi0+ZGV2LT52ZGV2LAotCQkJCQkJICAmZW50aXR5LT5zdWJkZXYpOworCWlmIChVVkNfRU5USVRZX1RZUEUoZW50aXR5KSA9PSBVVkNfVFRfU1RSRUFNSU5HKQorCQlyZXR1cm4gMDsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldigmY2hhaW4tPmRldi0+dmRldiwgJmVudGl0eS0+c3ViZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdXZjX3N1YmRldl9vcHMgPSB7CkBAIC04NCw5ICs5MCwxMSBAQAogCiAJCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZlbnRpdHktPnN1YmRldi5lbnRpdHksCiAJCQkJCWVudGl0eS0+bnVtX3BhZHMsIGVudGl0eS0+cGFkcywgMCk7Ci0JfSBlbHNlCisJfSBlbHNlIGlmIChlbnRpdHktPnZkZXYgIT0gTlVMTCkgewogCQlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmZW50aXR5LT52ZGV2LT5lbnRpdHksCiAJCQkJCWVudGl0eS0+bnVtX3BhZHMsIGVudGl0eS0+cGFkcywgMCk7CisJfSBlbHNlCisJCXJldCA9IDA7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfcXVldWUuYwppbmRleCAxMDlhMDYzLi5mOTBjZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfcXVldWUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfcXVldWUuYwpAQCAtMTA0LDYgKzEwNCw4IEBACiAJfQogCiAJaWYgKHF1ZXVlLT5jb3VudCkgeworCQl1dmNfcXVldWVfY2FuY2VsKHF1ZXVlLCAwKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5tYWlucXVldWUpOwogCQl2ZnJlZShxdWV1ZS0+bWVtKTsKIAkJcXVldWUtPmNvdW50ID0gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192aWRlby5jCmluZGV4IGZjNzY2YjkuLjQ5OTk0NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192aWRlby5jCkBAIC0xMjU1LDggKzEyNTUsMTAgQEAKIAogCS8qIENvbW1pdCB0aGUgc3RyZWFtaW5nIHBhcmFtZXRlcnMuICovCiAJcmV0ID0gdXZjX2NvbW1pdF92aWRlbyhzdHJlYW0sICZzdHJlYW0tPmN0cmwpOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXV2Y19xdWV1ZV9lbmFibGUoJnN0cmVhbS0+cXVldWUsIDApOwogCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiB1dmNfaW5pdF92aWRlbyhzdHJlYW0sIEdGUF9LRVJORUwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCmluZGV4IDE5ZDVhZTI5Li4wNmYxNDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCkBAIC0xNjcsNiArMTY3LDEyIEBACiAKIAltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOwogCisjaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKKwlpZiAodmRldi0+djRsMl9kZXYgJiYgdmRldi0+djRsMl9kZXYtPm1kZXYgJiYKKwkgICAgdmRldi0+dmZsX3R5cGUgIT0gVkZMX1RZUEVfU1VCREVWKQorCQltZWRpYV9kZXZpY2VfdW5yZWdpc3Rlcl9lbnRpdHkoJnZkZXYtPmVudGl0eSk7CisjZW5kaWYKKwogCS8qIFJlbGVhc2UgdmlkZW9fZGV2aWNlIGFuZCBwZXJmb3JtIG90aGVyCiAJICAgY2xlYW51cHMgYXMgbmVlZGVkLiAqLwogCXZkZXYtPnJlbGVhc2UodmRldik7CkBAIC0zODksOSArMzk1LDYgQEAKIHN0YXRpYyBpbnQgdjRsMl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKLQlzdHJ1Y3QgbWVkaWFfZW50aXR5ICplbnRpdHkgPSBOVUxMOwotI2VuZGlmCiAJaW50IHJldCA9IDA7CiAKIAkvKiBDaGVjayBpZiB0aGUgdmlkZW8gZGV2aWNlIGlzIGF2YWlsYWJsZSAqLwpAQCAtNDA1LDE3ICs0MDgsNiBAQAogCS8qIGFuZCBpbmNyZWFzZSB0aGUgZGV2aWNlIHJlZmNvdW50ICovCiAJdmlkZW9fZ2V0KHZkZXYpOwogCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKLQlpZiAodmRldi0+djRsMl9kZXYgJiYgdmRldi0+djRsMl9kZXYtPm1kZXYgJiYKLQkgICAgdmRldi0+dmZsX3R5cGUgIT0gVkZMX1RZUEVfU1VCREVWKSB7Ci0JCWVudGl0eSA9IG1lZGlhX2VudGl0eV9nZXQoJnZkZXYtPmVudGl0eSk7Ci0JCWlmICghZW50aXR5KSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQl2aWRlb19wdXQodmRldik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotI2VuZGlmCiAJaWYgKHZkZXYtPmZvcHMtPm9wZW4pIHsKIAkJaWYgKHZkZXYtPmxvY2sgJiYgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHZkZXYtPmxvY2spKSB7CiAJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CkBAIC00MzEsMTQgKzQyMyw4IEBACiAKIGVycjoKIAkvKiBkZWNyZWFzZSB0aGUgcmVmY291bnQgaW4gY2FzZSBvZiBhbiBlcnJvciAqLwotCWlmIChyZXQpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQotCQlpZiAodmRldi0+djRsMl9kZXYgJiYgdmRldi0+djRsMl9kZXYtPm1kZXYgJiYKLQkJICAgIHZkZXYtPnZmbF90eXBlICE9IFZGTF9UWVBFX1NVQkRFVikKLQkJCW1lZGlhX2VudGl0eV9wdXQoZW50aXR5KTsKLSNlbmRpZgorCWlmIChyZXQpCiAJCXZpZGVvX3B1dCh2ZGV2KTsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDU1LDExICs0NDEsNiBAQAogCQlpZiAodmRldi0+bG9jaykKIAkJCW11dGV4X3VubG9jayh2ZGV2LT5sb2NrKTsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKLQlpZiAodmRldi0+djRsMl9kZXYgJiYgdmRldi0+djRsMl9kZXYtPm1kZXYgJiYKLQkgICAgdmRldi0+dmZsX3R5cGUgIT0gVkZMX1RZUEVfU1VCREVWKQotCQltZWRpYV9lbnRpdHlfcHV0KCZ2ZGV2LT5lbnRpdHkpOwotI2VuZGlmCiAJLyogZGVjcmVhc2UgdGhlIHJlZmNvdW50IHVuY29uZGl0aW9uYWxseSBzaW5jZSB0aGUgcmVsZWFzZSgpCiAJICAgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuICovCiAJdmlkZW9fcHV0KHZkZXYpOwpAQCAtNzU0LDEyICs3MzUsNiBAQAogCWlmICghdmRldiB8fCAhdmlkZW9faXNfcmVnaXN0ZXJlZCh2ZGV2KSkKIAkJcmV0dXJuOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKLQlpZiAodmRldi0+djRsMl9kZXYgJiYgdmRldi0+djRsMl9kZXYtPm1kZXYgJiYKLQkgICAgdmRldi0+dmZsX3R5cGUgIT0gVkZMX1RZUEVfU1VCREVWKQotCQltZWRpYV9kZXZpY2VfdW5yZWdpc3Rlcl9lbnRpdHkoJnZkZXYtPmVudGl0eSk7Ci0jZW5kaWYKLQogCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOwogCS8qIFRoaXMgbXVzdCBiZSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gdG8gcHJldmVudCBhIHJhY2Ugd2l0aCB2NGwyX29wZW4uCiAJICogT25jZSB0aGlzIGJpdCBoYXMgYmVlbiBjbGVhcmVkIHZpZGVvX2dldCBtYXkgbmV2ZXIgYmUgY2FsbGVkIGFnYWluLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwppbmRleCA1MDZlZGNjLi42OWU4YzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwpAQCAtMTgyMiw2ICsxODIyLDggQEAKIAkJaWYgKCFvcHMtPnZpZGlvY19nX3R1bmVyKQogCQkJYnJlYWs7CiAKKwkJcC0+dHlwZSA9ICh2ZmQtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSA/CisJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCXJldCA9IG9wcy0+dmlkaW9jX2dfdHVuZXIoZmlsZSwgZmgsIHApOwogCQlpZiAoIXJldCkKIAkJCWRiZ2FyZyhjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgpAQCAtMTg0MCw2ICsxODQyLDggQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfdHVuZXIpCiAJCQlicmVhazsKKwkJcC0+dHlwZSA9ICh2ZmQtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSA/CisJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCWRiZ2FyZyhjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgogCQkJCSJjYXBhYmlsaXR5PTB4JXgsIHJhbmdlbG93PSVkLCAiCiAJCQkJInJhbmdlaGlnaD0lZCwgc2lnbmFsPSVkLCBhZmM9JWQsICIKQEAgLTE4NTgsNiArMTg2Miw4IEBACiAJCWlmICghb3BzLT52aWRpb2NfZ19mcmVxdWVuY3kpCiAJCQlicmVhazsKIAorCQlwLT50eXBlID0gKHZmZC0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfUkFESU8pID8KKwkJCVY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAkJcmV0ID0gb3BzLT52aWRpb2NfZ19mcmVxdWVuY3koZmlsZSwgZmgsIHApOwogCQlpZiAoIXJldCkKIAkJCWRiZ2FyZyhjbWQsICJ0dW5lcj0lZCwgdHlwZT0lZCwgZnJlcXVlbmN5PSVkXG4iLApAQCAtMTk0MCwxMyArMTk0NiwxOSBAQAogCWNhc2UgVklESU9DX1NfSFdfRlJFUV9TRUVLOgogCXsKIAkJc3RydWN0IHY0bDJfaHdfZnJlcV9zZWVrICpwID0gYXJnOworCQllbnVtIHY0bDJfdHVuZXJfdHlwZSB0eXBlOwogCiAJCWlmICghb3BzLT52aWRpb2Nfc19od19mcmVxX3NlZWspCiAJCQlicmVhazsKKwkJdHlwZSA9ICh2ZmQtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSA/CisJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCWRiZ2FyZyhjbWQsCi0JCQkidHVuZXI9JWQsIHR5cGU9JWQsIHNlZWtfdXB3YXJkPSVkLCB3cmFwX2Fyb3VuZD0lZFxuIiwKLQkJCXAtPnR1bmVyLCBwLT50eXBlLCBwLT5zZWVrX3Vwd2FyZCwgcC0+d3JhcF9hcm91bmQpOwotCQlyZXQgPSBvcHMtPnZpZGlvY19zX2h3X2ZyZXFfc2VlayhmaWxlLCBmaCwgcCk7CisJCQkidHVuZXI9JXUsIHR5cGU9JXUsIHNlZWtfdXB3YXJkPSV1LCB3cmFwX2Fyb3VuZD0ldSwgc3BhY2luZz0ldVxuIiwKKwkJCXAtPnR1bmVyLCBwLT50eXBlLCBwLT5zZWVrX3Vwd2FyZCwgcC0+d3JhcF9hcm91bmQsIHAtPnNwYWNpbmcpOworCQlpZiAocC0+dHlwZSAhPSB0eXBlKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZQorCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19od19mcmVxX3NlZWsoZmlsZSwgZmgsIHApOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItY29yZS5jCmluZGV4IDZiYTE0NjEuLjMwMTVlNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1jb3JlLmMKQEAgLTQ5MiwxMyArNDkyLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyoKLQkgKiBJZiB0aGUgc2FtZSBudW1iZXIgb2YgYnVmZmVycyBhbmQgbWVtb3J5IGFjY2VzcyBtZXRob2QgaXMgcmVxdWVzdGVkCi0JICogdGhlbiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKHEtPm1lbW9yeSA9PSByZXEtPm1lbW9yeSAmJiByZXEtPmNvdW50ID09IHEtPm51bV9idWZmZXJzKQotCQlyZXR1cm4gMDsKLQogCWlmIChyZXEtPmNvdW50ID09IDAgfHwgcS0+bnVtX2J1ZmZlcnMgIT0gMCB8fCBxLT5tZW1vcnkgIT0gcmVxLT5tZW1vcnkpIHsKIAkJLyoKIAkJICogV2UgYWxyZWFkeSBoYXZlIGJ1ZmZlcnMgYWxsb2NhdGVkLCBzbyBmaXJzdCBjaGVjayBpZiB0aGV5CkBAIC01MzksOSArNTMyLDkgQEAKIAkvKiBGaW5hbGx5LCBhbGxvY2F0ZSBidWZmZXJzIGFuZCB2aWRlbyBtZW1vcnkgKi8KIAlyZXQgPSBfX3ZiMl9xdWV1ZV9hbGxvYyhxLCByZXEtPm1lbW9yeSwgbnVtX2J1ZmZlcnMsIG51bV9wbGFuZXMsCiAJCQkJcGxhbmVfc2l6ZXMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRwcmludGsoMSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aXRoIGVycm9yOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApIHsKKwkJZHByaW50aygxLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJLyoKQEAgLTExOTYsNiArMTE4OSw3IEBACiAJICogaGFzIG5vdCBhbHJlYWR5IGRlcXVldWVkIGJlZm9yZSBpbml0aWF0aW5nIGNhbmNlbC4KIAkgKi8KIAlJTklUX0xJU1RfSEVBRCgmcS0+ZG9uZV9saXN0KTsKKwlhdG9taWNfc2V0KCZxLT5xdWV1ZWRfY291bnQsIDApOwogCXdha2VfdXBfYWxsKCZxLT5kb25lX3dxKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1zZy5jCmluZGV4IGIyZDk0ODUuLjEwYTIwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1zZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1zZy5jCkBAIC02Miw3ICs2Miw3IEBACiAJCWdvdG8gZmFpbF9wYWdlc19hcnJheV9hbGxvYzsKIAogCWZvciAoaSA9IDA7IGkgPCBidWYtPnNnX2Rlc2MubnVtX3BhZ2VzOyArK2kpIHsKLQkJYnVmLT5wYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCQlidWYtPnBhZ2VzW2ldID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyB8IF9fR0ZQX05PV0FSTik7CiAJCWlmIChOVUxMID09IGJ1Zi0+cGFnZXNbaV0pCiAJCQlnb3RvIGZhaWxfcGFnZXNfYWxsb2M7CiAJCXNnX3NldF9wYWdlKCZidWYtPnNnX2Rlc2Muc2dsaXN0W2ldLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMGYwOWMwNS4uNmNhOTM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC03MjgsNiArNzI4LDkgQEAKIAkgIGlmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVFBTNjU5MTAgc2VyaWVzIG9mCiAJICBQb3dlciBNYW5hZ2VtZW50IGNoaXBzLgogCitjb25maWcgVFBTNjU5MTFfQ09NUEFSQVRPUgorCXRyaXN0YXRlCisKIGVuZGlmICMgTUZEX1NVUFBPUlQKIAogbWVudSAiTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQppbmRleCBlZmUzY2MzLi5kN2Q0N2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQpAQCAtOTQsMyArOTQsNCBAQAogb2JqLSQoQ09ORklHX01GRF9QTTg5MjFfQ09SRSkgCSs9IHBtODkyMS1jb3JlLm8KIG9iai0kKENPTkZJR19NRkRfUE04WFhYX0lSUSkgCSs9IHBtOHh4eC1pcnEubwogb2JqLSQoQ09ORklHX01GRF9UUFM2NTkxMCkJKz0gdHBzNjU5MTAubyB0cHM2NTkxMC1pcnEubworb2JqLSQoQ09ORklHX1RQUzY1OTExX0NPTVBBUkFUT1IpCSs9IHRwczY1OTExLWNvbXBhcmF0b3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXNpYzMuYyBiL2RyaXZlcnMvbWZkL2FzaWMzLmMKaW5kZXggYzI3ZmQxZi4uYzcxYWUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXNpYzMuYworKysgYi9kcml2ZXJzL21mZC9hc2ljMy5jCkBAIC02MTksNiArNjE5LDcgQEAKIC8qIE1GRCBjZWxscyAoU1BJLCBQV00sIExFRCwgRFMxV00sIE1NQykgKi8KIHN0YXRpYyBzdHJ1Y3QgZHMxd21fZHJpdmVyX2RhdGEgZHMxd21fcGRhdGEgPSB7CiAJLmFjdGl2ZV9oaWdoID0gMSwKKwkucmVzZXRfcmVjb3Zlcl9kZWxheSA9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRzMXdtX3Jlc291cmNlc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvaHRjLXBhc2ljMy5jIGIvZHJpdmVycy9tZmQvaHRjLXBhc2ljMy5jCmluZGV4IDI4MDhiZDEuLjA0YzcwOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2h0Yy1wYXNpYzMuYworKysgYi9kcml2ZXJzL21mZC9odGMtcGFzaWMzLmMKQEAgLTk5LDYgKzk5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBkczF3bV9kcml2ZXJfZGF0YSBkczF3bV9wZGF0YSA9IHsKIAkuYWN0aXZlX2hpZ2ggPSAwLAorCS5yZXNldF9yZWNvdmVyX2RlbGF5ID0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZHMxd21fcmVzb3VyY2VzW10gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYyBiL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYwppbmRleCA4NTUyMTk1Li4xNzE3MTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMKKysrIGIvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNkZWZpbmUgVVNCSFNfRFJJVkVSX05BTUUJInVzYmhzLW9tYXAiCiAjZGVmaW5lIE9NQVBfRUhDSV9ERVZJQ0UJImVoY2ktb21hcCIKQEAgLTE0Nyw2ICsxNDYsOSBAQAogCiAKIHN0cnVjdCB1c2Joc19oY2Rfb21hcCB7CisJc3RydWN0IGNsawkJCSp1c2Job3N0X2ljazsKKwlzdHJ1Y3QgY2xrCQkJKnVzYmhvc3RfaHNfZmNrOworCXN0cnVjdCBjbGsJCQkqdXNiaG9zdF9mc19mY2s7CiAJc3RydWN0IGNsawkJCSp4Y2xrNjBtaHNwMV9jazsKIAlzdHJ1Y3QgY2xrCQkJKnhjbGs2MG1oc3AyX2NrOwogCXN0cnVjdCBjbGsJCQkqdXRtaV9wMV9mY2s7CkBAIC0xNTYsNiArMTU4LDggQEAKIAlzdHJ1Y3QgY2xrCQkJKnVzYmhvc3RfcDJfZmNrOwogCXN0cnVjdCBjbGsJCQkqdXNidGxsX3AyX2ZjazsKIAlzdHJ1Y3QgY2xrCQkJKmluaXRfNjBtX2ZjbGs7CisJc3RydWN0IGNsawkJCSp1c2J0bGxfZmNrOworCXN0cnVjdCBjbGsJCQkqdXNidGxsX2ljazsKIAogCXZvaWQgX19pb21lbQkJCSp1aGhfYmFzZTsKIAl2b2lkIF9faW9tZW0JCQkqdGxsX2Jhc2U7CkBAIC0zNDksMTMgKzM1Myw0NiBAQAogCW9tYXAtPnBsYXRkYXRhLmVoY2lfZGF0YSA9IHBkYXRhLT5laGNpX2RhdGE7CiAJb21hcC0+cGxhdGRhdGEub2hjaV9kYXRhID0gcGRhdGEtPm9oY2lfZGF0YTsKIAotCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCW9tYXAtPnVzYmhvc3RfaWNrID0gY2xrX2dldChkZXYsICJ1c2Job3N0X2ljayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdF9pY2spKSB7CisJCXJldCA9ICBQVFJfRVJSKG9tYXAtPnVzYmhvc3RfaWNrKTsKKwkJZGV2X2VycihkZXYsICJ1c2Job3N0X2ljayBmYWlsZWQgZXJyb3I6JWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2VuZDsKKwl9CisKKwlvbWFwLT51c2Job3N0X2hzX2ZjayA9IGNsa19nZXQoZGV2LCAiaHNfZmNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2Job3N0X2hzX2ZjaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2Job3N0X2hzX2Zjayk7CisJCWRldl9lcnIoZGV2LCAidXNiaG9zdF9oc19mY2sgZmFpbGVkIGVycm9yOiVkXG4iLCByZXQpOworCQlnb3RvIGVycl91c2Job3N0X2ljazsKKwl9CisKKwlvbWFwLT51c2Job3N0X2ZzX2ZjayA9IGNsa19nZXQoZGV2LCAiZnNfZmNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2Job3N0X2ZzX2ZjaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2Job3N0X2ZzX2Zjayk7CisJCWRldl9lcnIoZGV2LCAidXNiaG9zdF9mc19mY2sgZmFpbGVkIGVycm9yOiVkXG4iLCByZXQpOworCQlnb3RvIGVycl91c2Job3N0X2hzX2ZjazsKKwl9CisKKwlvbWFwLT51c2J0bGxfZmNrID0gY2xrX2dldChkZXYsICJ1c2J0bGxfZmNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2J0bGxfZmNrKSkgeworCQlyZXQgPSBQVFJfRVJSKG9tYXAtPnVzYnRsbF9mY2spOworCQlkZXZfZXJyKGRldiwgInVzYnRsbF9mY2sgZmFpbGVkIGVycm9yOiVkXG4iLCByZXQpOworCQlnb3RvIGVycl91c2Job3N0X2ZzX2ZjazsKKwl9CisKKwlvbWFwLT51c2J0bGxfaWNrID0gY2xrX2dldChkZXYsICJ1c2J0bGxfaWNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2J0bGxfaWNrKSkgeworCQlyZXQgPSBQVFJfRVJSKG9tYXAtPnVzYnRsbF9pY2spOworCQlkZXZfZXJyKGRldiwgInVzYnRsbF9pY2sgZmFpbGVkIGVycm9yOiVkXG4iLCByZXQpOworCQlnb3RvIGVycl91c2J0bGxfZmNrOworCX0KIAogCW9tYXAtPnV0bWlfcDFfZmNrID0gY2xrX2dldChkZXYsICJ1dG1pX3AxX2dmY2xrIik7CiAJaWYgKElTX0VSUihvbWFwLT51dG1pX3AxX2ZjaykpIHsKIAkJcmV0ID0gUFRSX0VSUihvbWFwLT51dG1pX3AxX2Zjayk7CiAJCWRldl9lcnIoZGV2LCAidXRtaV9wMV9nZmNsayBmYWlsZWQgZXJyb3I6JWRcbiIsCXJldCk7Ci0JCWdvdG8gZXJyX2VuZDsKKwkJZ290byBlcnJfdXNidGxsX2ljazsKIAl9CiAKIAlvbWFwLT54Y2xrNjBtaHNwMV9jayA9IGNsa19nZXQoZGV2LCAieGNsazYwbWhzcDFfY2siKTsKQEAgLTQ4NSw4ICs1MjIsMjIgQEAKIGVycl91dG1pX3AxX2ZjazoKIAljbGtfcHV0KG9tYXAtPnV0bWlfcDFfZmNrKTsKIAorZXJyX3VzYnRsbF9pY2s6CisJY2xrX3B1dChvbWFwLT51c2J0bGxfaWNrKTsKKworZXJyX3VzYnRsbF9mY2s6CisJY2xrX3B1dChvbWFwLT51c2J0bGxfZmNrKTsKKworZXJyX3VzYmhvc3RfZnNfZmNrOgorCWNsa19wdXQob21hcC0+dXNiaG9zdF9mc19mY2spOworCitlcnJfdXNiaG9zdF9oc19mY2s6CisJY2xrX3B1dChvbWFwLT51c2Job3N0X2hzX2Zjayk7CisKK2Vycl91c2Job3N0X2ljazoKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaWNrKTsKKwogZXJyX2VuZDoKLQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJa2ZyZWUob21hcCk7CiAKIGVuZF9wcm9iZToKQEAgLTUyMCw3ICs1NzEsMTEgQEAKIAljbGtfcHV0KG9tYXAtPnV0bWlfcDJfZmNrKTsKIAljbGtfcHV0KG9tYXAtPnhjbGs2MG1oc3AxX2NrKTsKIAljbGtfcHV0KG9tYXAtPnV0bWlfcDFfZmNrKTsKLQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJY2xrX3B1dChvbWFwLT51c2J0bGxfaWNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYnRsbF9mY2spOworCWNsa19wdXQob21hcC0+dXNiaG9zdF9mc19mY2spOworCWNsa19wdXQob21hcC0+dXNiaG9zdF9oc19mY2spOworCWNsa19wdXQob21hcC0+dXNiaG9zdF9pY2spOwogCWtmcmVlKG9tYXApOwogCiAJcmV0dXJuIDA7CkBAIC02NDAsNiArNjk1LDcgQEAKIAlzdHJ1Y3QgdXNiaHNfb21hcF9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9ICZvbWFwLT5wbGF0ZGF0YTsKIAl1bnNpZ25lZCBsb25nCQkJZmxhZ3MgPSAwOwogCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJCQl0aW1lb3V0OwogCXVuc2lnbmVkCQkJcmVnOwogCiAJZGV2X2RiZyhkZXYsICJzdGFydGluZyBUSSBIU1VTQiBDb250cm9sbGVyXG4iKTsKQEAgLTY1Miw3ICs3MDgsMTEgQEAKIAlpZiAob21hcC0+Y291bnQgPiAwKQogCQlnb3RvIGVuZF9jb3VudDsKIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3RfaWNrKTsKKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3RfaHNfZmNrKTsKKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3RfZnNfZmNrKTsKKwljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9mY2spOworCWNsa19lbmFibGUob21hcC0+dXNidGxsX2ljayk7CiAKIAlpZiAocGRhdGEtPmVoY2lfZGF0YS0+cGh5X3Jlc2V0KSB7CiAJCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5laGNpX2RhdGEtPnJlc2V0X2dwaW9fcG9ydFswXSkpIHsKQEAgLTY3Niw2ICs3MzYsNTAgQEAKIAlvbWFwLT51c2Joc19yZXYgPSB1c2Joc19yZWFkKG9tYXAtPnVoaF9iYXNlLCBPTUFQX1VISF9SRVZJU0lPTik7CiAJZGV2X2RiZyhkZXYsICJPTUFQIFVISF9SRVZJU0lPTiAweCV4XG4iLCBvbWFwLT51c2Joc19yZXYpOwogCisJLyogcGVyZm9ybSBUTEwgc29mdCByZXNldCwgYW5kIHdhaXQgdW50aWwgcmVzZXQgaXMgY29tcGxldGUgKi8KKwl1c2Joc193cml0ZShvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisKKwkvKiBXYWl0IGZvciBUTEwgcmVzZXQgdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJd2hpbGUgKCEodXNiaHNfcmVhZChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTU1RBVFVTKQorCQkJJiBPTUFQX1VTQlRMTF9TWVNTVEFUVVNfUkVTRVRET05FKSkgeworCQljcHVfcmVsYXgoKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2X2RiZyhkZXYsICJvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl90bGw7CisJCX0KKwl9CisKKwlkZXZfZGJnKGRldiwgIlRMTCBSRVNFVCBET05FXG4iKTsKKworCS8qICgxPDwzKSA9IG5vIGlkbGUgbW9kZSBvbmx5IGZvciBpbml0aWFsIGRlYnVnZ2luZyAqLworCXVzYmhzX3dyaXRlKG9tYXAtPnRsbF9iYXNlLCBPTUFQX1VTQlRMTF9TWVNDT05GSUcsCisJCQlPTUFQX1VTQlRMTF9TWVNDT05GSUdfRU5BV0FLRVVQIHwKKwkJCU9NQVBfVVNCVExMX1NZU0NPTkZJR19TSURMRU1PREUgfAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX0FVVE9JRExFKTsKKworCS8qIFB1dCBVSEggaW4gTm9JZGxlL05vU3RhbmRieSBtb2RlICovCisJcmVnID0gdXNiaHNfcmVhZChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHKTsKKwlpZiAoaXNfb21hcF91c2Joc19yZXYxKG9tYXApKSB7CisJCXJlZyB8PSAoT01BUF9VSEhfU1lTQ09ORklHX0VOQVdBS0VVUAorCQkJCXwgT01BUF9VSEhfU1lTQ09ORklHX1NJRExFTU9ERQorCQkJCXwgT01BUF9VSEhfU1lTQ09ORklHX0NBQ1RJVklUWQorCQkJCXwgT01BUF9VSEhfU1lTQ09ORklHX01JRExFTU9ERSk7CisJCXJlZyAmPSB+T01BUF9VSEhfU1lTQ09ORklHX0FVVE9JRExFOworCisKKwl9IGVsc2UgaWYgKGlzX29tYXBfdXNiaHNfcmV2MihvbWFwKSkgeworCQlyZWcgJj0gfk9NQVA0X1VISF9TWVNDT05GSUdfSURMRU1PREVfQ0xFQVI7CisJCXJlZyB8PSBPTUFQNF9VSEhfU1lTQ09ORklHX05PSURMRTsKKwkJcmVnICY9IH5PTUFQNF9VSEhfU1lTQ09ORklHX1NUREJZTU9ERV9DTEVBUjsKKwkJcmVnIHw9IE9NQVA0X1VISF9TWVNDT05GSUdfTk9TVERCWTsKKwl9CisKKwl1c2Joc193cml0ZShvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHLCByZWcpOworCiAJcmVnID0gdXNiaHNfcmVhZChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfSE9TVENPTkZJRyk7CiAJLyogc2V0dXAgVUxQSSBieXBhc3MgYW5kIGJ1cnN0IGNvbmZpZ3VyYXRpb25zICovCiAJcmVnIHw9IChPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I0X0JVUlNUX0VOCkBAIC04MTUsOCArOTE5LDYgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3RsbDoKLQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb21hcC0+bG9jaywgZmxhZ3MpOwogCWlmIChwZGF0YS0+ZWhjaV9kYXRhLT5waHlfcmVzZXQpIHsKIAkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmVoY2lfZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzBdKSkKIAkJCWdwaW9fZnJlZShwZGF0YS0+ZWhjaV9kYXRhLT5yZXNldF9ncGlvX3BvcnRbMF0pOwpAQCAtODI0LDYgKzkyNiwxMyBAQAogCQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+ZWhjaV9kYXRhLT5yZXNldF9ncGlvX3BvcnRbMV0pKQogCQkJZ3Bpb19mcmVlKHBkYXRhLT5laGNpX2RhdGEtPnJlc2V0X2dwaW9fcG9ydFsxXSk7CiAJfQorCisJY2xrX2Rpc2FibGUob21hcC0+dXNidGxsX2ljayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNidGxsX2Zjayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9mc19mY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfaHNfZmNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2ljayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb21hcC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg5Niw3ICsxMDA1LDExIEBACiAJCWNsa19kaXNhYmxlKG9tYXAtPnV0bWlfcDFfZmNrKTsKIAl9CiAKLQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJY2xrX2Rpc2FibGUob21hcC0+dXNidGxsX2ljayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNidGxsX2Zjayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9mc19mY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfaHNfZmNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2ljayk7CiAKIAkvKiBUaGUgZ3Bpb19mcmVlIG1pZ2ggc2xlZXA7IHNvIHVubG9jayB0aGUgc3BpbmxvY2sgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbWFwLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMKaW5kZXggM2QyZGM1Ni4uMjgzYWM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHBzNjU5MTEtY29tcGFyYXRvci5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiBzdGF0aWMgX19kZXZpbml0IGludCB0cHM2NTkxMV9jb21wYXJhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgdHBzNjU5MTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHRwczY1OTEwLT5kZXYpOworCXN0cnVjdCB0cHM2NTkxMF9ib2FyZCAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHRwczY1OTEwLT5kZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSBjb21wX3RocmVzaG9sZF9zZXQodHBzNjU5MTAsIENPTVAxLCAgcGRhdGEtPnZtYmNoX3RocmVzaG9sZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXBkczk5MHguYyBiL2RyaXZlcnMvbWlzYy9hcGRzOTkweC5jCmluZGV4IDIwMDMxMWYuLmUyYTUyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9hcGRzOTkweC5jCisrKyBiL2RyaXZlcnMvbWlzYy9hcGRzOTkweC5jCkBAIC02MDksNiArNjA5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNX1JVTlRJTUUpCiBzdGF0aWMgaW50IGFwZHM5OTB4X2NoaXBfb24oc3RydWN0IGFwZHM5OTB4X2NoaXAgKmNoaXApCiB7CiAJaW50IGVycgkgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShjaGlwLT5yZWdzKSwKQEAgLTYyNCw2ICs2MjUsNyBAQAogCWFwZHM5OTB4X21vZGVfb24oY2hpcCk7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBhcGRzOTkweF9jaGlwX29mZihzdHJ1Y3QgYXBkczk5MHhfY2hpcCAqY2hpcCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9jYjcxMC9zZ2J1ZjIuYyBiL2RyaXZlcnMvbWlzYy9jYjcxMC9zZ2J1ZjIuYwppbmRleCBkMDE5NzQ2Li4yYTQwZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY2I3MTAvc2didWYyLmMKKysrIGIvZHJpdmVycy9taXNjL2NiNzEwL3NnYnVmMi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBuZWVkc191bmFsaWduZWRfY29weShjb25zdCB2b2lkICpwdHIpCiB7Ci0jaWZkZWYgSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUworI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCiAJcmV0dXJuIGZhbHNlOwogI2Vsc2UKIAlyZXR1cm4gKChwdHIgLSBOVUxMKSAmIDMpICE9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMgYi9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMKaW5kZXggZTAxZTA4Yy4uYmM2ODViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2NzNTUzNS1tZmdwdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9jczU1MzUtbWZncHQuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJCXRpbWVyX25yID0gdCA8IG1heCA/IChpbnQpIHQgOiAtMTsKIAl9IGVsc2UgewogCQkvKiBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIHRpbWVyJ3MgYXZhaWxhYmxlICovCi0JCWlmICh0ZXN0X2JpdCh0aW1lcl9uciwgbWZncHQtPmF2YWlsKSkKKwkJaWYgKCF0ZXN0X2JpdCh0aW1lcl9uciwgbWZncHQtPmF2YWlsKSkKIAkJCXRpbWVyX25yID0gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaW9jNC5jIGIvZHJpdmVycy9taXNjL2lvYzQuYwppbmRleCA2NjhkNDFlLi5kZjAzZGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaW9jNC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pb2M0LmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCXJldHVybiBJT0M0X1ZBUklBTlRfUENJX1JUOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQKK3N0YXRpYyB2b2lkCiBpb2M0X2xvYWRfbW9kdWxlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJcmVxdWVzdF9tb2R1bGUoInNnaWlvYzQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9rZ2RidHMuYyBiL2RyaXZlcnMvbWlzYy9rZ2RidHMuYwppbmRleCBiMGM1NjMxLi44Y2ViZWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mva2dkYnRzLmMKKysrIGIvZHJpdmVycy9taXNjL2tnZGJ0cy5jCkBAIC0zMDQsNyArMzA0LDEwIEBACiAJCXJldHVybiAxOwogCX0KIAkvKiBSZWFkanVzdCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBpZiBuZWVkZWQgKi8KLQlpbnN0cnVjdGlvbl9wb2ludGVyX3NldCgma2dkYnRzX3JlZ3MsIGlwICsgb2Zmc2V0KTsKKwlpcCArPSBvZmZzZXQ7CisjaWZkZWYgR0RCX0FESlVTVFNfQlJFQUtfT0ZGU0VUCisJaW5zdHJ1Y3Rpb25fcG9pbnRlcl9zZXQoJmtnZGJ0c19yZWdzLCBpcCk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtLmMgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwppbmRleCA4MWQ3ZmE0Li4xNTBjZDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGtkdG0uYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwpAQCAtMTIwLDYgKzEyMCw3IEBACiBzdGF0aWMgZW51bSBjbmFtZSBjcG9pbnQgPSBDTl9JTlZBTElEOwogc3RhdGljIGVudW0gY3R5cGUgY3B0eXBlID0gQ1RfTk9ORTsKIHN0YXRpYyBpbnQgY291bnQgPSBERUZBVUxUX0NPVU5UOworc3RhdGljIERFRklORV9TUElOTE9DSyhjb3VudF9sb2NrKTsKIAogbW9kdWxlX3BhcmFtKHJlY3VyX2NvdW50LCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZWN1cl9jb3VudCwgIiBSZWN1cnNpb24gbGV2ZWwgZm9yIHRoZSBzdGFjayBvdmVyZmxvdyB0ZXN0LCAiXApAQCAtMjMwLDExICsyMzEsMTQgQEAKIHN0YXRpYyBpbnQgbGtkdG1fcGFyc2VfY29tbWFuZGxpbmUodm9pZCkKIHsKIAlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNwb2ludF9jb3VudCA8IDEgfHwgcmVjdXJfY291bnQgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudF9sb2NrLCBmbGFncyk7CiAJY291bnQgPSBjcG9pbnRfY291bnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRfbG9jaywgZmxhZ3MpOwogCiAJLyogTm8gc3BlY2lhbCBwYXJhbWV0ZXJzICovCiAJaWYgKCFjcG9pbnRfdHlwZSAmJiAhY3BvaW50X25hbWUpCkBAIC0zNDksNiArMzUzLDkgQEAKIAogc3RhdGljIHZvaWQgbGtkdG1faGFuZGxlcih2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRfbG9jaywgZmxhZ3MpOwogCWNvdW50LS07CiAJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50ICVzIG9mIHR5cGUgJXMgaGl0LCB0cmlnZ2VyIGluICVkIHJvdW5kc1xuIiwKIAkJCWNwX25hbWVfdG9fc3RyKGNwb2ludCksIGNwX3R5cGVfdG9fc3RyKGNwdHlwZSksIGNvdW50KTsKQEAgLTM1Nyw2ICszNjQsNyBAQAogCQlsa2R0bV9kb19hY3Rpb24oY3B0eXBlKTsKIAkJY291bnQgPSBjcG9pbnRfY291bnQ7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBsa2R0bV9yZWdpc3Rlcl9jcG9pbnQoZW51bSBjbmFtZSB3aGljaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9wdGkuYyBiL2RyaXZlcnMvbWlzYy9wdGkuYwppbmRleCBiYjZmOTI1Li4zNzRkZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvcHRpLmMKKysrIGIvZHJpdmVycy9taXNjL3B0aS5jCkBAIC0zMTcsNyArMzE3LDggQEAKICAqCQkJCWEgbWFzdGVyLCBjaGFubmVsIElEIGFkZHJlc3MKICAqCQkJCXVzZWQgdG8gd3JpdGUgdG8gUFRJIEhXLgogICoKLSAqIEBtYzogbWFzdGVyLCBjaGFubmVsIGFwZXR1cmUgSUQgYWRkcmVzcyB0byBiZSByZWxlYXNlZC4KKyAqIEBtYzogbWFzdGVyLCBjaGFubmVsIGFwZXR1cmUgSUQgYWRkcmVzcyB0byBiZSByZWxlYXNlZC4gIFRoaXMKKyAqICAgICAgd2lsbCBkZS1hbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHZpYSBrZnJlZSgpLgogICovCiB2b2lkIHB0aV9yZWxlYXNlX21hc3RlcmNoYW5uZWwoc3RydWN0IHB0aV9tYXN0ZXJjaGFubmVsICptYykKIHsKQEAgLTQ3NSw4ICs0NzYsMTAgQEAKIAkJZWxzZQogCQkJcHRpX3R0eV9kYXRhLT5tYyA9IHB0aV9yZXF1ZXN0X21hc3RlcmNoYW5uZWwoMik7CiAKLQkJaWYgKHB0aV90dHlfZGF0YS0+bWMgPT0gTlVMTCkKKwkJaWYgKHB0aV90dHlfZGF0YS0+bWMgPT0gTlVMTCkgeworCQkJa2ZyZWUocHRpX3R0eV9kYXRhKTsKIAkJCXJldHVybiAtRU5YSU87CisJCX0KIAkJdHR5LT5kcml2ZXJfZGF0YSA9IHB0aV90dHlfZGF0YTsKIAl9CiAKQEAgLTQ5NSw3ICs0OTgsNyBAQAogCWlmIChwdGlfdHR5X2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXB0aV9yZWxlYXNlX21hc3RlcmNoYW5uZWwocHRpX3R0eV9kYXRhLT5tYyk7Ci0Ja2ZyZWUodHR5LT5kcml2ZXJfZGF0YSk7CisJa2ZyZWUocHRpX3R0eV9kYXRhKTsKIAl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKIH0KIApAQCAtNTgxLDcgKzU4NCw3IEBACiBzdGF0aWMgaW50IHB0aV9jaGFyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJcHRpX3JlbGVhc2VfbWFzdGVyY2hhbm5lbChmaWxwLT5wcml2YXRlX2RhdGEpOwotCWtmcmVlKGZpbHAtPnByaXZhdGVfZGF0YSk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jIGIvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCmluZGV4IGVlNTEwOWEuLjQyZjA2NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKQEAgLTQ5NSwxNCArNDk1LDE0IEBACiAJCX0KIAl9CiAKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCiAJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZxdWV1ZWRfbXNnLT51c2VfY291bnQpID09IDApIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlrZnJlZShxdWV1ZWRfbXNnKTsKIAl9CiAKLQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwotCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NwZWFyMTN4eF9wY2llX2dhZGdldC5jIGIvZHJpdmVycy9taXNjL3NwZWFyMTN4eF9wY2llX2dhZGdldC5jCmluZGV4IDdhZGVkOTAuLmNmYmRkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zcGVhcjEzeHhfcGNpZV9nYWRnZXQuYworKysgYi9kcml2ZXJzL21pc2Mvc3BlYXIxM3h4X3BjaWVfZ2FkZ2V0LmMKQEAgLTg0NSw3ICs4NDUsNyBAQAogZXJyX2lvdW5tYXBfYXBwOgogCWlvdW5tYXAoY29uZmlnLT52YV9hcHBfYmFzZSk7CiBlcnJfa3phbGxvYzoKLQlrZnJlZShjb25maWcpOworCWtmcmVlKHRhcmdldCk7CiBlcnJfcmVsX3JlczoKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzMS0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzMSkpOwogZXJyX3JlbF9yZXMwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKaW5kZXggMWEwNWZlMC4uNTRjOTFmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYworKysgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCkBAIC02MDUsNyArNjA1LDcgQEAKIAlwcl9kZWJ1ZygiJXM6ICVkICIsIF9fZnVuY19fLCBwcm90by0+Y2hubF9pZCk7CiAKIAlzdF9raW1fcmVmKCZzdF9nZGF0YSwgMCk7Ci0JaWYgKHByb3RvLT5jaG5sX2lkID49IFNUX01BWF9DSEFOTkVMUykgeworCWlmICghc3RfZ2RhdGEgfHwgcHJvdG8tPmNobmxfaWQgPj0gU1RfTUFYX0NIQU5ORUxTKSB7CiAJCXByX2VycigiIGNobmxfaWQgJWQgbm90IHN1cHBvcnRlZCIsIHByb3RvLT5jaG5sX2lkKTsKIAkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiAJfQpAQCAtNzQ3LDggKzc0Nyw4IEBACiAJcHJfZGVidWcoIiVzOiBkb25lICIsIF9fZnVuY19fKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdF90dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBjaGFyICp0dHlfZmxhZ3MsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIHN0X3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICBjaGFyICp0dHlfZmxhZ3MsIGludCBjb3VudCkKIHsKICNpZmRlZiBWRVJCT1NFCiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIj5pbj4iLCBEVU1QX1BSRUZJWF9OT05FLApAQCAtNzYxLDggKzc2MSw2IEBACiAJICovCiAJc3RfcmVjdih0dHktPmRpc2NfZGF0YSwgZGF0YSwgY291bnQpOwogCXByX2RlYnVnKCJkb25lICVzIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKiB3YWtlLXVwIGZ1bmN0aW9uIGNhbGxlZCBpbiBmcm9tIHRoZSBUVFkgbGF5ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYwppbmRleCA1ZGE5M2VlLi4zOGZkMmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jCkBAIC0yNDUsOSArMjQ1LDkgQEAKIAkJcHJfZXJyKCJpbnZhbGlkIGFjdGlvbiBhZnRlciBjaGFuZ2UgcmVtb3RlIGJhdWQgY29tbWFuZCIpOwogCX0gZWxzZSB7CiAJCSpwdHIgPSAqcHRyICsgc2l6ZW9mKHN0cnVjdCBidHNfYWN0aW9uKSArCi0JCQkoKHN0cnVjdCBidHNfYWN0aW9uICopbnh0X2FjdGlvbiktPnNpemU7CisJCQkoKHN0cnVjdCBidHNfYWN0aW9uICopY3VyX2FjdGlvbiktPnNpemU7CiAJCSpsZW4gPSAqbGVuIC0gKHNpemVvZihzdHJ1Y3QgYnRzX2FjdGlvbikgKwotCQkJCSgoc3RydWN0IGJ0c19hY3Rpb24gKilueHRfYWN0aW9uKS0+c2l6ZSk7CisJCQkJKChzdHJ1Y3QgYnRzX2FjdGlvbiAqKWN1cl9hY3Rpb24pLT5zaXplKTsKIAkJLyogd2FybiB1c2VyIG9uIG5vdCBjb21tZW50aW5nIHRoZXNlIGluIGZpcm13YXJlICovCiAJCXByX3dhcm4oInNraXBwaW5nIHRoZSB3YWl0IGV2ZW50IG9mIGNoYW5nZSByZW1vdGUgYmF1ZCIpOwogCX0KQEAgLTYwNCw2ICs2MDQsMTAgQEAKIAlzdHJ1Y3Qga2ltX2RhdGFfcwkqa2ltX2dkYXRhOwogCS8qIGdldCBraW1fZ2RhdGEgcmVmZXJlbmNlIGZyb20gcGxhdGZvcm0gZGV2aWNlICovCiAJcGRldiA9IHN0X2dldF9wbGF0X2RldmljZShpZCk7CisJaWYgKCFwZGV2KSB7CisJCSpjb3JlX2RhdGEgPSBOVUxMOworCQlyZXR1cm47CisJfQogCWtpbV9nZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAkqY29yZV9kYXRhID0ga2ltX2dkYXRhLT5jb3JlX2RhdGE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKaW5kZXggNzFkYTU2NC4uZjg1ZTQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwpAQCAtMTAyNCw3ICsxMDI0LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbWQtPnBhcnQpOwogCW1kLT51c2FnZSA9IDE7CiAKLQlyZXQgPSBtbWNfaW5pdF9xdWV1ZSgmbWQtPnF1ZXVlLCBjYXJkLCAmbWQtPmxvY2spOworCXJldCA9IG1tY19pbml0X3F1ZXVlKCZtZC0+cXVldWUsIGNhcmQsICZtZC0+bG9jaywgc3VibmFtZSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfcHV0ZGlzazsKIApAQCAtMTI5Nyw2ICsxMjk3LDkgQEAKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1tY19nZXRfZHJ2ZGF0YShjYXJkKTsKIAogCW1tY19ibGtfcmVtb3ZlX3BhcnRzKGNhcmQsIG1kKTsKKwltbWNfY2xhaW1faG9zdChjYXJkLT5ob3N0KTsKKwltbWNfYmxrX3BhcnRfc3dpdGNoKGNhcmQsIG1kKTsKKwltbWNfcmVsZWFzZV9ob3N0KGNhcmQtPmhvc3QpOwogCW1tY19ibGtfcmVtb3ZlX3JlcShtZCk7CiAJbW1jX3NldF9kcnZkYXRhKGNhcmQsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCmluZGV4IGMwNzMyMmMuLjY0MTNhZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKQEAgLTEwNiwxMCArMTA2LDEyIEBACiAgKiBAbXE6IG1tYyBxdWV1ZQogICogQGNhcmQ6IG1tYyBjYXJkIHRvIGF0dGFjaCB0aGlzIHF1ZXVlCiAgKiBAbG9jazogcXVldWUgbG9jaworICogQHN1Ym5hbWU6IHBhcnRpdGlvbiBzdWJuYW1lCiAgKgogICogSW5pdGlhbGlzZSBhIE1NQyBjYXJkIHJlcXVlc3QgcXVldWUuCiAgKi8KLWludCBtbWNfaW5pdF9xdWV1ZShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IG1tY19jYXJkICpjYXJkLCBzcGlubG9ja190ICpsb2NrKQoraW50IG1tY19pbml0X3F1ZXVlKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCisJCSAgIHNwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIgKnN1Ym5hbWUpCiB7CiAJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKIAl1NjQgbGltaXQgPSBCTEtfQk9VTkNFX0hJR0g7CkBAIC0xMzMsMTIgKzEzNSw3IEBACiAJCW1xLT5xdWV1ZS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMgPSBVSU5UX01BWDsKIAkJaWYgKGNhcmQtPmVyYXNlZF9ieXRlID09IDApCiAJCQltcS0+cXVldWUtPmxpbWl0cy5kaXNjYXJkX3plcm9lc19kYXRhID0gMTsKLQkJaWYgKCFtbWNfY2FuX3RyaW0oY2FyZCkgJiYgaXNfcG93ZXJfb2ZfMihjYXJkLT5lcmFzZV9zaXplKSkgewotCQkJbXEtPnF1ZXVlLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA9Ci0JCQkJCQkJY2FyZC0+ZXJhc2Vfc2l6ZSA8PCA5OwotCQkJbXEtPnF1ZXVlLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQgPQotCQkJCQkJCWNhcmQtPmVyYXNlX3NpemUgPDwgOTsKLQkJfQorCQltcS0+cXVldWUtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gY2FyZC0+cHJlZl9lcmFzZSA8PCA5OwogCQlpZiAobW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShjYXJkKSkKIAkJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfU0VDRElTQ0FSRCwKIAkJCQkJCW1xLT5xdWV1ZSk7CkBAIC0yMDksOCArMjA2LDggQEAKIAogCXNlbWFfaW5pdCgmbXEtPnRocmVhZF9zZW0sIDEpOwogCi0JbXEtPnRocmVhZCA9IGt0aHJlYWRfcnVuKG1tY19xdWV1ZV90aHJlYWQsIG1xLCAibW1jcWQvJWQiLAotCQlob3N0LT5pbmRleCk7CisJbXEtPnRocmVhZCA9IGt0aHJlYWRfcnVuKG1tY19xdWV1ZV90aHJlYWQsIG1xLCAibW1jcWQvJWQlcyIsCisJCWhvc3QtPmluZGV4LCBzdWJuYW1lID8gc3VibmFtZSA6ICIiKTsKIAogCWlmIChJU19FUlIobXEtPnRocmVhZCkpIHsKIAkJcmV0ID0gUFRSX0VSUihtcS0+dGhyZWFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaCBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaAppbmRleCA2NGU2NmUwLi42MjIzZWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmgKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oCkBAIC0xOSw3ICsxOSw4IEBACiAJdW5zaWduZWQgaW50CQlib3VuY2Vfc2dfbGVuOwogfTsKIAotZXh0ZXJuIGludCBtbWNfaW5pdF9xdWV1ZShzdHJ1Y3QgbW1jX3F1ZXVlICosIHN0cnVjdCBtbWNfY2FyZCAqLCBzcGlubG9ja190ICopOworZXh0ZXJuIGludCBtbWNfaW5pdF9xdWV1ZShzdHJ1Y3QgbW1jX3F1ZXVlICosIHN0cnVjdCBtbWNfY2FyZCAqLCBzcGlubG9ja190ICosCisJCQkgIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gdm9pZCBtbWNfY2xlYW51cF9xdWV1ZShzdHJ1Y3QgbW1jX3F1ZXVlICopOwogZXh0ZXJuIHZvaWQgbW1jX3F1ZXVlX3N1c3BlbmQoc3RydWN0IG1tY19xdWV1ZSAqKTsKIGV4dGVybiB2b2lkIG1tY19xdWV1ZV9yZXN1bWUoc3RydWN0IG1tY19xdWV1ZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggNjgwOTFkZC4uNzg0M2VmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTEyNDUsNyArMTI0NSw3IEBACiAJCSAqLwogCQl0aW1lb3V0X2Nsa3MgPDw9IDE7CiAJCXRpbWVvdXRfdXMgKz0gKHRpbWVvdXRfY2xrcyAqIDEwMDApIC8KLQkJCSAgICAgIChjYXJkLT5ob3N0LT5pb3MuY2xvY2sgLyAxMDAwKTsKKwkJCSAgICAgIChtbWNfaG9zdF9jbGtfcmF0ZShjYXJkLT5ob3N0KSAvIDEwMDApOwogCiAJCWVyYXNlX3RpbWVvdXQgPSB0aW1lb3V0X3VzIC8gMTAwMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKaW5kZXggMmE3ZTQzYi4uYWE3ZDFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCkBAIC0yNDcsMTIgKzI0NywxMiBAQAogCQlyZXR1cm4gMDsKIAogCS8qIFZlcnNpb24gaXMgY29kZWQgaW4gdGhlIENTRF9TVFJVQ1RVUkUgYnl0ZSBpbiB0aGUgRVhUX0NTRCByZWdpc3RlciAqLworCWNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlID0gZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV07CiAJaWYgKGNhcmQtPmNzZC5zdHJ1Y3R1cmUgPT0gMykgewotCQlpbnQgZXh0X2NzZF9zdHJ1Y3QgPSBleHRfY3NkW0VYVF9DU0RfU1RSVUNUVVJFXTsKLQkJaWYgKGV4dF9jc2Rfc3RydWN0ID4gMikgeworCQlpZiAoY2FyZC0+ZXh0X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUgPiAyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgRVhUX0NTRCBzdHJ1Y3R1cmUgIgogCQkJCSJ2ZXJzaW9uICVkXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCi0JCQkJCWV4dF9jc2Rfc3RydWN0KTsKKwkJCQkJY2FyZC0+ZXh0X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0yNjYsNiArMjY2LDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbMF0gPSBleHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDBdOworCWNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbMV0gPSBleHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDFdOworCWNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbMl0gPSBleHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDJdOworCWNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbM10gPSBleHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDNdOwogCWlmIChjYXJkLT5leHRfY3NkLnJldiA+PSAyKSB7CiAJCWNhcmQtPmV4dF9jc2Quc2VjdG9ycyA9CiAJCQlleHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDBdIDw8IDAgfApAQCAtMjc3LDcgKzI4MSw3IEBACiAJCWlmIChjYXJkLT5leHRfY3NkLnNlY3RvcnMgPiAoMnUgKiAxMDI0ICogMTAyNCAqIDEwMjQpIC8gNTEyKQogCQkJbW1jX2NhcmRfc2V0X2Jsb2NrYWRkcihjYXJkKTsKIAl9Ci0KKwljYXJkLT5leHRfY3NkLnJhd19jYXJkX3R5cGUgPSBleHRfY3NkW0VYVF9DU0RfQ0FSRF9UWVBFXTsKIAlzd2l0Y2ggKGV4dF9jc2RbRVhUX0NTRF9DQVJEX1RZUEVdICYgRVhUX0NTRF9DQVJEX1RZUEVfTUFTSykgewogCWNhc2UgRVhUX0NTRF9DQVJEX1RZUEVfRERSXzUyIHwgRVhUX0NTRF9DQVJEX1RZUEVfNTIgfAogCSAgICAgRVhUX0NTRF9DQVJEX1RZUEVfMjY6CkBAIC0zMDcsNiArMzExLDExIEBACiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCX0KIAorCWNhcmQtPmV4dF9jc2QucmF3X3NfYV90aW1lb3V0ID0gZXh0X2NzZFtFWFRfQ1NEX1NfQV9USU1FT1VUXTsKKwljYXJkLT5leHRfY3NkLnJhd19lcmFzZV90aW1lb3V0X211bHQgPQorCQlleHRfY3NkW0VYVF9DU0RfRVJBU0VfVElNRU9VVF9NVUxUXTsKKwljYXJkLT5leHRfY3NkLnJhd19oY19lcmFzZV9ncnBfc2l6ZSA9CisJCWV4dF9jc2RbRVhUX0NTRF9IQ19FUkFTRV9HUlBfU0laRV07CiAJaWYgKGNhcmQtPmV4dF9jc2QucmV2ID49IDMpIHsKIAkJdTggc2Ffc2hpZnQgPSBleHRfY3NkW0VYVF9DU0RfU19BX1RJTUVPVVRdOwogCQljYXJkLT5leHRfY3NkLnBhcnRfY29uZmlnID0gZXh0X2NzZFtFWFRfQ1NEX1BBUlRfQ09ORklHXTsKQEAgLTMzNCw2ICszNDMsMTYgQEAKIAkJY2FyZC0+ZXh0X2NzZC5ib290X3NpemUgPSBleHRfY3NkW0VYVF9DU0RfQk9PVF9NVUxUXSA8PCAxNzsKIAl9CiAKKwljYXJkLT5leHRfY3NkLnJhd19oY19lcmFzZV9nYXBfc2l6ZSA9CisJCWV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fQVRUUklCVVRFXTsKKwljYXJkLT5leHRfY3NkLnJhd19zZWNfdHJpbV9tdWx0ID0KKwkJZXh0X2NzZFtFWFRfQ1NEX1NFQ19UUklNX01VTFRdOworCWNhcmQtPmV4dF9jc2QucmF3X3NlY19lcmFzZV9tdWx0ID0KKwkJZXh0X2NzZFtFWFRfQ1NEX1NFQ19FUkFTRV9NVUxUXTsKKwljYXJkLT5leHRfY3NkLnJhd19zZWNfZmVhdHVyZV9zdXBwb3J0ID0KKwkJZXh0X2NzZFtFWFRfQ1NEX1NFQ19GRUFUVVJFX1NVUFBPUlRdOworCWNhcmQtPmV4dF9jc2QucmF3X3RyaW1fbXVsdCA9CisJCWV4dF9jc2RbRVhUX0NTRF9UUklNX01VTFRdOwogCWlmIChjYXJkLT5leHRfY3NkLnJldiA+PSA0KSB7CiAJCS8qCiAJCSAqIEVuaGFuY2VkIGFyZWEgZmVhdHVyZSBzdXBwb3J0IC0tIGNoZWNrIHdoZXRoZXIgdGhlIGVNTUMKQEAgLTM0MSw3ICszNjAsNyBAQAogCQkgKiBhcmVhIG9mZnNldCBhbmQgc2l6ZSB0byB1c2VyIGJ5IGFkZGluZyBzeXNmcyBpbnRlcmZhY2UuCiAJCSAqLwogCQlpZiAoKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVF0gJiAweDIpICYmCi0JCQkJKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fQVRUUklCVVRFXSAmIDB4MSkpIHsKKwkJICAgIChleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX0FUVFJJQlVURV0gJiAweDEpKSB7CiAJCQl1OCBoY19lcmFzZV9ncnBfc3ogPQogCQkJCWV4dF9jc2RbRVhUX0NTRF9IQ19FUkFTRV9HUlBfU0laRV07CiAJCQl1OCBoY193cF9ncnBfc3ogPQpAQCAtNDAxLDE3ICs0MjAsMTcgQEAKIH0KIAogCi1zdGF0aWMgaW50IG1tY19jb21wYXJlX2V4dF9jc2RzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdTggKmV4dF9jc2QsCi0JCQl1bnNpZ25lZCBidXNfd2lkdGgpCitzdGF0aWMgaW50IG1tY19jb21wYXJlX2V4dF9jc2RzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgYnVzX3dpZHRoKQogewogCXU4ICpid19leHRfY3NkOwogCWludCBlcnI7CiAKLQllcnIgPSBtbWNfZ2V0X2V4dF9jc2QoY2FyZCwgJmJ3X2V4dF9jc2QpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJaWYgKGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzEpCisJCXJldHVybiAwOwogCi0JaWYgKChleHRfY3NkID09IE5VTEwgfHwgYndfZXh0X2NzZCA9PSBOVUxMKSkgeworCWVyciA9IG1tY19nZXRfZXh0X2NzZChjYXJkLCAmYndfZXh0X2NzZCk7CisKKwlpZiAoZXJyIHx8IGJ3X2V4dF9jc2QgPT0gTlVMTCkgewogCQlpZiAoYnVzX3dpZHRoICE9IE1NQ19CVVNfV0lEVEhfMSkKIAkJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtNDIxLDM1ICs0NDAsNDAgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBvbmx5IGNvbXBhcmUgcmVhZCBvbmx5IGZpZWxkcyAqLwotCWVyciA9ICghKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVF0gPT0KKwllcnIgPSAoIShjYXJkLT5leHRfY3NkLnJhd19wYXJ0aXRpb25fc3VwcG9ydCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9TVVBQT1JUXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9FUkFTRURfTUVNX0NPTlRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19lcmFzZWRfbWVtX2NvdW50ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfRVJBU0VEX01FTV9DT05UXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9SRVZdID09CisJCShjYXJkLT5leHRfY3NkLnJldiA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1JFVl0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfU1RSVUNUVVJFXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TVFJVQ1RVUkVdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX0NBUkRfVFlQRV0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X2NhcmRfdHlwZSA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX0NBUkRfVFlQRV0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfU19BX1RJTUVPVVRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19zX2FfdGltZW91dCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NfQV9USU1FT1VUXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9IQ19XUF9HUlBfU0laRV0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X2hjX2VyYXNlX2dhcF9zaXplID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfSENfV1BfR1JQX1NJWkVdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX0VSQVNFX1RJTUVPVVRfTVVMVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X2VyYXNlX3RpbWVvdXRfbXVsdCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX0VSQVNFX1RJTUVPVVRfTVVMVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfSENfRVJBU0VfR1JQX1NJWkVdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19oY19lcmFzZV9ncnBfc2l6ZSA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX0hDX0VSQVNFX0dSUF9TSVpFXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9TRUNfVFJJTV9NVUxUXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjX3RyaW1fbXVsdCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19UUklNX01VTFRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1NFQ19FUkFTRV9NVUxUXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjX2VyYXNlX211bHQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfRVJBU0VfTVVMVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfU0VDX0ZFQVRVUkVfU1VQUE9SVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY19mZWF0dXJlX3N1cHBvcnQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfRkVBVFVSRV9TVVBQT1JUXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9UUklNX01VTFRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd190cmltX211bHQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9UUklNX01VTFRdKSAmJgotCQltZW1jbXAoJmV4dF9jc2RbRVhUX0NTRF9TRUNfQ05UXSwKLQkJICAgICAgICZid19leHRfY3NkW0VYVF9DU0RfU0VDX0NOVF0sCi0JCSAgICAgICA0KSAhPSAwKTsKKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbMF0gPT0KKwkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMF0pICYmCisJCShjYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzFdID09CisJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDFdKSAmJgorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1syXSA9PQorCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAyXSkgJiYKKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbM10gPT0KKwkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgM10pKTsKIAlpZiAoZXJyKQogCQllcnIgPSAtRUlOVkFMOwogCkBAIC03NzAsNyArNzk0LDYgQEAKIAkJCQkgKi8KIAkJCQlpZiAoIShob3N0LT5jYXBzICYgTU1DX0NBUF9CVVNfV0lEVEhfVEVTVCkpCiAJCQkJCWVyciA9IG1tY19jb21wYXJlX2V4dF9jc2RzKGNhcmQsCi0JCQkJCQlleHRfY3NkLAogCQkJCQkJYnVzX3dpZHRoKTsKIAkJCQllbHNlCiAJCQkJCWVyciA9IG1tY19idXNfdGVzdChjYXJkLCBidXNfd2lkdGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYwppbmRleCA0ZDBjMTViLi4yNjJmZmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYwpAQCAtNjkxLDE1ICs2OTEsNTQgQEAKIHN0YXRpYyBpbnQgbW1jX3NkaW9fcG93ZXJfcmVzdG9yZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CiAJaW50IHJldDsKKwl1MzIgb2NyOwogCiAJQlVHX09OKCFob3N0KTsKIAlCVUdfT04oIWhvc3QtPmNhcmQpOwogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBjYXJkIGJ5IHBlcmZvcm1pbmcgdGhlIHNhbWUgc3RlcHMgdGhhdCBhcmUgdGFrZW4gYnkKKwkgKiBtbWNfcmVzY2FuX3RyeV9mcmVxKCkgYW5kIG1tY19hdHRhY2hfc2RpbygpIGR1cmluZyBhICJub3JtYWwiIHByb2JlLgorCSAqCisJICogc2Rpb19yZXNldCgpIGlzIHRlY2huaWNhbGx5IG5vdCBuZWVkZWQuIEhhdmluZyBqdXN0IHBvd2VyZWQgdXAgdGhlCisJICogaGFyZHdhcmUsIGl0IHNob3VsZCBhbHJlYWR5IGJlIGluIHJlc2V0IHN0YXRlLiBIb3dldmVyLCBzb21lCisJICogcGxhdGZvcm1zIChzdWNoIGFzIFNEODY4NiBvbiBPTFBDKSBkbyBub3QgaW5zdGFudGx5IGN1dCBwb3dlciwKKwkgKiBtZWFuaW5nIHRoYXQgYSByZXNldCBpcyByZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBwb3dlciBzb29uIGFmdGVyCisJICogcG93ZXJpbmcgb2ZmLiBJdCBpcyBoYXJtbGVzcyBpbiBvdGhlciBjYXNlcy4KKwkgKgorCSAqIFRoZSBDTUQ1IHJlc2V0IChtbWNfc2VuZF9pb19vcF9jb25kKCkpLCBhY2NvcmRpbmcgdG8gdGhlIFNESU8gc3BlYywKKwkgKiBpcyBub3QgbmVjZXNzYXJ5IGZvciBub24tcmVtb3ZhYmxlIGNhcmRzLiBIb3dldmVyLCBpdCBpcyByZXF1aXJlZAorCSAqIGZvciBPTFBDIFNEODY4NiAod2hpY2ggZXhwZWN0cyBhIFtDTUQ1LDUsMyw3XSBpbml0IHNlcXVlbmNlKSwgYW5kCisJICogaGFybWxlc3MgaW4gb3RoZXIgc2l0dWF0aW9ucy4KKwkgKgorCSAqIFdpdGggdGhlc2Ugc3RlcHMgdGFrZW4sIG1tY19zZWxlY3Rfdm9sdGFnZSgpIGlzIGFsc28gcmVxdWlyZWQgdG8KKwkgKiByZXN0b3JlIHRoZSBjb3JyZWN0IHZvbHRhZ2Ugc2V0dGluZyBvZiB0aGUgY2FyZC4KKwkgKi8KKwlzZGlvX3Jlc2V0KGhvc3QpOworCW1tY19nb19pZGxlKGhvc3QpOworCW1tY19zZW5kX2lmX2NvbmQoaG9zdCwgaG9zdC0+b2NyX2F2YWlsKTsKKworCXJldCA9IG1tY19zZW5kX2lvX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaG9zdC0+b2NyX2F2YWlsX3NkaW8pCisJCWhvc3QtPm9jcl9hdmFpbCA9IGhvc3QtPm9jcl9hdmFpbF9zZGlvOworCisJaG9zdC0+b2NyID0gbW1jX3NlbGVjdF92b2x0YWdlKGhvc3QsIG9jciAmIH4weDdGKTsKKwlpZiAoIWhvc3QtPm9jcikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKIAlyZXQgPSBtbWNfc2Rpb19pbml0X2NhcmQoaG9zdCwgaG9zdC0+b2NyLCBob3N0LT5jYXJkLAogCQkJCW1tY19jYXJkX2tlZXBfcG93ZXIoaG9zdCkpOwogCWlmICghcmV0ICYmIGhvc3QtPnNkaW9faXJxcykKIAkJbW1jX3NpZ25hbF9zZGlvX2lycShob3N0KTsKKworb3V0OgogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCmluZGV4IGQyOWI5YzMuLmQyNTY1ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCiAJLyogVGhlbiB1bmRvIHRoZSBydW50aW1lIFBNIHNldHRpbmdzIGluIHNkaW9fYnVzX3Byb2JlKCkgKi8KIAlpZiAoZnVuYy0+Y2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQpCi0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CiAKIG91dDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwppbmRleCA1ZGE1YmVhLi5mZTE0MDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwpAQCAtNTgyLDYgKzU4Miw4IEBACiAJCQlkYXRhLT5lcnJvciA9IC1FSUxTRVE7CiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNJX0RBVEFUSU1FT1VUKSB7CiAJCQlkYXRhLT5lcnJvciA9IC1FVElNRURPVVQ7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNJX1NUQVJUQklURVJSKSB7CisJCQlkYXRhLT5lcnJvciA9IC1FQ09NTTsKIAkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0lfVFhVTkRFUlJVTikgewogCQkJZGF0YS0+ZXJyb3IgPSAtRUlPOwogCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1DSV9SWE9WRVJSVU4pIHsKQEAgLTExNDQsOSArMTE0NiwxNyBAQAogCQllbHNlIGlmIChyZXQgIT0gLUVOT1NZUykKIAkJCWdvdG8gZXJyX2dwaW9fY2Q7CiAKKwkJLyoKKwkJICogQSBncGlvIHBpbiB0aGF0IHdpbGwgZGV0ZWN0IGNhcmRzIHdoZW4gaW5zZXJ0ZWQgYW5kIHJlbW92ZWQKKwkJICogd2lsbCBtb3N0IGxpa2VseSB3YW50IHRvIHRyaWdnZXIgb24gdGhlIGVkZ2VzIGlmIGl0IGlzCisJCSAqIDAgd2hlbiBlamVjdGVkIGFuZCAxIHdoZW4gaW5zZXJ0ZWQgKG9yIG11dGF0aXMgbXV0YW5kaXMKKwkJICogZm9yIHRoZSBpbnZlcnRlZCBjYXNlKSBzbyB3ZSByZXF1ZXN0IHRyaWdnZXJzIG9uIGJvdGgKKwkJICogZWRnZXMuCisJCSAqLwogCQlyZXQgPSByZXF1ZXN0X2FueV9jb250ZXh0X2lycShncGlvX3RvX2lycShwbGF0LT5ncGlvX2NkKSwKLQkJCQkJICAgICAgbW1jaV9jZF9pcnEsIDAsCi0JCQkJCSAgICAgIERSSVZFUl9OQU1FICIgKGNkKSIsIGhvc3QpOworCQkJCW1tY2lfY2RfaXJxLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQlEUklWRVJfTkFNRSAiIChjZCkiLCBob3N0KTsKIAkJaWYgKHJldCA+PSAwKQogCQkJaG9zdC0+Z3Bpb19jZF9pcnEgPSBncGlvX3RvX2lycShwbGF0LT5ncGlvX2NkKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuaCBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oCmluZGV4IGJiMzJlMjEuLjIxNjRlOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oCkBAIC04Niw2ICs4Niw3IEBACiAjZGVmaW5lIE1DSV9DTURSRVNQRU5ECQkoMSA8PCA2KQogI2RlZmluZSBNQ0lfQ01EU0VOVAkJKDEgPDwgNykKICNkZWZpbmUgTUNJX0RBVEFFTkQJCSgxIDw8IDgpCisjZGVmaW5lIE1DSV9TVEFSVEJJVEVSUgkJKDEgPDwgOSkKICNkZWZpbmUgTUNJX0RBVEFCTE9DS0VORAkoMSA8PCAxMCkKICNkZWZpbmUgTUNJX0NNREFDVElWRQkJKDEgPDwgMTEpCiAjZGVmaW5lIE1DSV9UWEFDVElWRQkJKDEgPDwgMTIpCkBAIC0xMTIsNiArMTEzLDcgQEAKICNkZWZpbmUgTUNJX0NNRFJFU1BFTkRDTFIJKDEgPDwgNikKICNkZWZpbmUgTUNJX0NNRFNFTlRDTFIJCSgxIDw8IDcpCiAjZGVmaW5lIE1DSV9EQVRBRU5EQ0xSCQkoMSA8PCA4KQorI2RlZmluZSBNQ0lfU1RBUlRCSVRFUlJDTFIJKDEgPDwgOSkKICNkZWZpbmUgTUNJX0RBVEFCTE9DS0VORENMUgkoMSA8PCAxMCkKIC8qIEV4dGVuZGVkIHN0YXR1cyBiaXRzIGZvciB0aGUgU1QgTWljcm8gdmFyaWFudHMgKi8KICNkZWZpbmUgTUNJX1NUX1NESU9JVEMJCSgxIDw8IDIyKQpAQCAtMTI3LDYgKzEyOSw3IEBACiAjZGVmaW5lIE1DSV9DTURSRVNQRU5ETUFTSwkoMSA8PCA2KQogI2RlZmluZSBNQ0lfQ01EU0VOVE1BU0sJCSgxIDw8IDcpCiAjZGVmaW5lIE1DSV9EQVRBRU5ETUFTSwkJKDEgPDwgOCkKKyNkZWZpbmUgTUNJX1NUQVJUQklURVJSTUFTSwkoMSA8PCA5KQogI2RlZmluZSBNQ0lfREFUQUJMT0NLRU5ETUFTSwkoMSA8PCAxMCkKICNkZWZpbmUgTUNJX0NNREFDVElWRU1BU0sJKDEgPDwgMTEpCiAjZGVmaW5lIE1DSV9UWEFDVElWRU1BU0sJKDEgPDwgMTIpCkBAIC0xNTAsNyArMTUzLDcgQEAKICNkZWZpbmUgTUNJX0lSUUVOQUJMRQlcCiAJKE1DSV9DTURDUkNGQUlMTUFTS3xNQ0lfREFUQUNSQ0ZBSUxNQVNLfE1DSV9DTURUSU1FT1VUTUFTS3wJXAogCU1DSV9EQVRBVElNRU9VVE1BU0t8TUNJX1RYVU5ERVJSVU5NQVNLfE1DSV9SWE9WRVJSVU5NQVNLfAlcCi0JTUNJX0NNRFJFU1BFTkRNQVNLfE1DSV9DTURTRU5UTUFTSykKKwlNQ0lfQ01EUkVTUEVORE1BU0t8TUNJX0NNRFNFTlRNQVNLfE1DSV9TVEFSVEJJVEVSUk1BU0spCiAKIC8qIFRoZXNlIGludGVycnVwdHMgYXJlIGRpcmVjdGVkIHRvIElSUTEgd2hlbiB0d28gSVJRIGxpbmVzIGFyZSBhdmFpbGFibGUgKi8KICNkZWZpbmUgTUNJX0lSUTFNQVNLIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb2ZfbW1jX3NwaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMKaW5kZXggZTJhZWNiNy4uYWI2NmYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMKQEAgLTI1LDYgKzI1LDExIEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogCisvKiBGb3IgYXJjaHMgdGhhdCBkb24ndCBzdXBwb3J0IE5PX0lSUSAoc3VjaCBhcyBtaXBzKSwgcHJvdmlkZSBhIGR1bW15IHZhbHVlICovCisjaWZuZGVmIE5PX0lSUQorI2RlZmluZSBOT19JUlEgMAorI2VuZGlmCisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCmluZGV4IDI1OWVjZTAuLmRlZGYzZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCkBAIC00MjksMTIgKzQyOSwxNCBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9Ci0JCW1tY19zbG90KGhvc3QpLm9jcl9tYXNrID0gbW1jX3JlZ3VsYXRvcl9nZXRfb2NybWFzayhyZWcpOwogCiAJCS8qIEFsbG93IGFuIGF1eCByZWd1bGF0b3IgKi8KIAkJcmVnID0gcmVndWxhdG9yX2dldChob3N0LT5kZXYsICJ2bW1jX2F1eCIpOwogCQlob3N0LT52Y2NfYXV4ID0gSVNfRVJSKHJlZykgPyBOVUxMIDogcmVnOwogCisJCS8qIEZvciBlTU1DIGRvIG5vdCBwb3dlciBvZmYgd2hlbiBub3QgaW4gc2xlZXAgc3RhdGUgKi8KKwkJaWYgKG1tY19zbG90KGhvc3QpLm5vX3JlZ3VsYXRvcl9vZmZfaW5pdCkKKwkJCXJldHVybiAwOwogCQkvKgogCQkqIFVHTFkgSEFDSzogIHdvcmthcm91bmQgcmVndWxhdG9yIGZyYW1ld29yayBidWdzLgogCQkqIFdoZW4gdGhlIGJvb3Rsb2FkZXIgbGVhdmVzIGEgc3VwcGx5IGFjdGl2ZSwgaXQncwpAQCAtOTU5LDcgKzk2MSw4IEBACiAJc3Bpbl91bmxvY2soJmhvc3QtPmlycV9sb2NrKTsKIAogCWlmIChob3N0LT51c2VfZG1hICYmIGRtYV9jaCAhPSAtMSkgewotCQlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBob3N0LT5kYXRhLT5zZywgaG9zdC0+ZG1hX2xlbiwKKwkJZG1hX3VubWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgaG9zdC0+ZGF0YS0+c2csCisJCQlob3N0LT5kYXRhLT5zZ19sZW4sCiAJCQlvbWFwX2hzbW1jX2dldF9kbWFfZGlyKGhvc3QsIGhvc3QtPmRhdGEpKTsKIAkJb21hcF9mcmVlX2RtYShkbWFfY2gpOwogCX0KQEAgLTEzNDMsNyArMTM0Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBkYXRhLT5zZywgaG9zdC0+ZG1hX2xlbiwKKwlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLAogCQlvbWFwX2hzbW1jX2dldF9kbWFfZGlyKGhvc3QsIGRhdGEpKTsKIAogCXJlcV9pbl9wcm9ncmVzcyA9IGhvc3QtPnJlcV9pbl9wcm9ncmVzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYwppbmRleCBiMzY1NDI5Li5jZTUwMGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCkBAIC05Miw3ICs5Miw3IEBACiAJCW1tY19kYXRhLT5vY3JfbWFzayA9IHAtPnRtaW9fb2NyX21hc2s7CiAJCW1tY19kYXRhLT5jYXBhYmlsaXRpZXMgfD0gcC0+dG1pb19jYXBzOwogCi0JCWlmIChwLT5kbWFfc2xhdmVfdHggPj0gMCAmJiBwLT5kbWFfc2xhdmVfcnggPj0gMCkgeworCQlpZiAocC0+ZG1hX3NsYXZlX3R4ID4gMCAmJiBwLT5kbWFfc2xhdmVfcnggPiAwKSB7CiAJCQlwcml2LT5wYXJhbV90eC5zbGF2ZV9pZCA9IHAtPmRtYV9zbGF2ZV90eDsKIAkJCXByaXYtPnBhcmFtX3J4LnNsYXZlX2lkID0gcC0+ZG1hX3NsYXZlX3J4OwogCQkJcHJpdi0+ZG1hX3ByaXYuY2hhbl9wcml2X3R4ID0gJnByaXYtPnBhcmFtX3R4OwpAQCAtMTY1LDEzICsxNjUsMTQgQEAKIAogCXAtPnBkYXRhID0gTlVMTDsKIAorCXRtaW9fbW1jX2hvc3RfcmVtb3ZlKGhvc3QpOworCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwogCQlpZiAoaXJxID49IDApCiAJCQlmcmVlX2lycShpcnEsIGhvc3QpOwogCX0KIAotCXRtaW9fbW1jX2hvc3RfcmVtb3ZlKGhvc3QpOwogCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CiAJY2xrX3B1dChwcml2LT5jbGspOwogCWtmcmVlKHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKaW5kZXggYWQ2MzQ3Yi4uMGIwOWU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCkBAIC04MjQsOCArODI0LDggQEAKIAlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaG9zdC0+cGRhdGE7CiAKLQlyZXR1cm4gKChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSkgfHwKLQkJIShzZF9jdHJsX3JlYWQzMihob3N0LCBDVExfU1RBVFVTKSAmIFRNSU9fU1RBVF9XUlBST1RFQ1QpKTsKKwlyZXR1cm4gISgocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfV1JQUk9URUNUX0RJU0FCTEUpIHx8CisJCSAoc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX1NUQVRVUykgJiBUTUlPX1NUQVRfV1JQUk9URUNUKSk7CiB9CiAKIHN0YXRpYyBpbnQgdG1pb19tbWNfZ2V0X2NkKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYyBiL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKaW5kZXggY2JiMDMzMC4uZDQ0NTVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCkBAIC0yMDk2LDcgKzIwOTYsNyBAQAogc3RhdGljIGludCB2dWIzMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKIAkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsJCQkJLyogTk9UIGlycSAqLwotCXN0cnVjdCB2dWIzMDBfbW1jX2hvc3QgKnZ1YjMwMCA9IE5VTEw7CisJc3RydWN0IHZ1YjMwMF9tbWNfaG9zdCAqdnViMzAwOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwogCWludCBpOwpAQCAtMjExOCwyMyArMjExOCwyMCBAQAogCWNvbW1hbmRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kX291dF91cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsCi0JCQkibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjb21tYW5kX291dF91cmJcbiIpOworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgY29tbWFuZF9vdXRfdXJiXG4iKTsKIAkJZ290byBlcnJvcjA7CiAJfQogCWNvbW1hbmRfcmVzX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kX3Jlc191cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsCi0JCQkibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjb21tYW5kX3Jlc191cmJcbiIpOworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgY29tbWFuZF9yZXNfdXJiXG4iKTsKIAkJZ290byBlcnJvcjE7CiAJfQogCS8qIHRoaXMgYWxzbyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBvdXIgVlVCMzAwIG1tYyBob3N0IGRldmljZSAqLwogCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZihzdHJ1Y3QgdnViMzAwX21tY19ob3N0KSwgJnVkZXYtPmRldik7CiAJaWYgKCFtbWMpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsCi0JCQkibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBtbWNfaG9zdFxuIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgbW1jX2hvc3RcbiIpOwogCQlnb3RvIGVycm9yNDsKIAl9CiAJLyogTU1DIGNvcmUgdHJhbnNmZXIgc2l6ZXMgdHVuYWJsZSBwYXJhbWV0ZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCmluZGV4IDBiYjI1NGMuLjMzZDhhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCkBAIC0zMzksOSArMzM5LDkgQEAKIAkJICAgICAgICAgICAgICAgICAgICAoRklSX09QX1VBICA8PCBGSVJfT1AxX1NISUZUKSB8CiAJCSAgICAgICAgICAgICAgICAgICAgKEZJUl9PUF9SQlcgPDwgRklSX09QMl9TSElGVCkpOwogCQlvdXRfYmUzMigmbGJjLT5mY3IsIE5BTkRfQ01EX1JFQURJRCA8PCBGQ1JfQ01EMF9TSElGVCk7Ci0JCS8qIDUgYnl0ZXMgZm9yIG1hbnVmLCBkZXZpY2UgYW5kIGV4dHMgKi8KLQkJb3V0X2JlMzIoJmxiYy0+ZmJjciwgNSk7Ci0JCWVsYmNfZmNtX2N0cmwtPnJlYWRfYnl0ZXMgPSA1OworCQkvKiBuYW5kX2dldF9mbGFzaF90eXBlKCkgcmVhZHMgOCBieXRlcyBvZiBlbnRpcmUgSUQgc3RyaW5nICovCisJCW91dF9iZTMyKCZsYmMtPmZiY3IsIDgpOworCQllbGJjX2ZjbV9jdHJsLT5yZWFkX2J5dGVzID0gODsKIAkJZWxiY19mY21fY3RybC0+dXNlX21kciA9IDE7CiAJCWVsYmNfZmNtX2N0cmwtPm1kciA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmMgYi9kcml2ZXJzL25ldC8zYzUwMy5jCmluZGV4IGQ4NGY2ZTguLjViNzMyOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTAzLmMKKysrIGIvZHJpdmVycy9uZXQvM2M1MDMuYwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJCW91dGJfcCgweDA0IDw8ICgoKmlycXAgPT0gOSkgPyAyIDogKmlycXApLCBFMzNHX0lEQ0ZSKTsKIAkJb3V0Yl9wKDB4MDAsIEUzM0dfSURDRlIpOwogCQltc2xlZXAoMSk7Ci0JCWZyZWVfaXJxKCppcnFwLCBlbDJfcHJvYmVfaW50ZXJydXB0KTsKKwkJZnJlZV9pcnEoKmlycXAsICZzZWVuKTsKIAkJaWYgKCFzZWVuKQogCQkJY29udGludWU7CiAKQEAgLTQyMiw2ICs0MjIsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJZ290byBlcnJfZGlzYWJsZTsKKwkJYnJlYWs7CiAJfSB3aGlsZSAoKisraXJxcCk7CiAKIAlpZiAoKmlycXAgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDkuYyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKaW5kZXggNWYyNTg4OS4uNDRiMjhiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDkuYworKysgYi9kcml2ZXJzL25ldC8zYzUwOS5jCkBAIC0xODUsNyArMTg1LDcgQEAKIHN0YXRpYyBpbnQgbm9wbnA7CiAjZW5kaWYKIAotc3RhdGljIGludCBlbDNfY29tbW9uX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbDNfY29tbW9uX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBlbDNfY29tbW9uX3JlbW92ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB1c2hvcnQgaWRfcmVhZF9lZXByb20oaW50IGluZGV4KTsKIHN0YXRpYyB1c2hvcnQgcmVhZF9lZXByb20oaW50IGlvYWRkciwgaW50IGluZGV4KTsKQEAgLTM5NSw3ICszOTUsNyBAQAogc3RhdGljIGludCBpc2FfcmVnaXN0ZXJlZDsKIAogI2lmZGVmIENPTkZJR19QTlAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBlbDNfcG5wX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIGVsM19wbnBfaWRzW10gPSB7CiAJeyAuaWQgPSAiVENNNTA5MCIgfSwgLyogM0NvbSBFdGhlcmxpbmsgSUlJIChUUCkgKi8KIAl7IC5pZCA9ICJUQ001MDkxIiB9LCAvKiAzQ29tIEV0aGVybGluayBJSUkgKi8KIAl7IC5pZCA9ICJUQ001MDk0IiB9LCAvKiAzQ29tIEV0aGVybGluayBJSUkgKGNvbWJvKSAqLwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCiAjaWZkZWYgQ09ORklHX0VJU0EKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgZWwzX2Vpc2FfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGVsM19laXNhX2lkc1tdID0gewogCQl7ICJUQ001MDkwIiB9LAogCQl7ICJUQ001MDkxIiB9LAogCQl7ICJUQ001MDkyIiB9LApAQCAtNTA4LDcgKzUwOCw3IEBACiAjaWZkZWYgQ09ORklHX01DQQogc3RhdGljIGludCBlbDNfbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLXN0YXRpYyBjb25zdCBzaG9ydCBlbDNfbWNhX2FkYXB0ZXJfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc2hvcnQgZWwzX21jYV9hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJCTB4NjI3YywKIAkJMHg2MjdkLAogCQkweDYyZGIsCkBAIC01MTcsNyArNTE3LDcgQEAKIAkJMHgwMDAwCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZWwzX21jYV9hZGFwdGVyX25hbWVzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgY2hhciAqZWwzX21jYV9hZGFwdGVyX25hbWVzW10gX19pbml0ZGF0YSA9IHsKIAkJIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoMTBiYXNlMikiLAogCQkiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICgxMGJhc2VUKSIsCiAJCSIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKHRlc3QgbW9kZSkiLApAQCAtNjAxLDcgKzYwMSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTUNBCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbDNfbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19pbml0IGVsM19tY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCS8qIEJhc2VkIG9uIEVyaWsgTnlncmVuJ3MgKG55Z3JlbkBtaXQuZWR1KSAzYzUyOSBwYXRjaCwKIAkgKiBoZWF2aWx5IG1vZGlmaWVkIGJ5IENocmlzIEJlYXVyZWdhcmQKQEAgLTY3MSw3ICs2NzEsNyBAQAogI2VuZGlmIC8qIENPTkZJR19NQ0EgKi8KIAogI2lmZGVmIENPTkZJR19FSVNBCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbDNfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgZWwzX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzaG9ydCBpOwogCWludCBpb2FkZHIsIGlycSwgaWZfcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTl4LmMgYi9kcml2ZXJzL25ldC8zYzU5eC5jCmluZGV4IDk5ZjQzZDIuLjhjYzIyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1OXguYwpAQCAtOTAxLDE0ICs5MDEsMTQgQEAKICNlbmRpZiAvKiAhQ09ORklHX1BNICovCiAKICNpZmRlZiBDT05GSUdfRUlTQQotc3RhdGljIGNvbnN0IHN0cnVjdCBlaXNhX2RldmljZV9pZCB2b3J0ZXhfZWlzYV9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgdm9ydGV4X2Vpc2FfaWRzW10gPSB7CiAJeyAiVENNNTkyMCIsIENIXzNDNTkyIH0sCiAJeyAiVENNNTk3MCIsIENIXzNDNTk3IH0sCiAJeyAiIiB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCB2b3J0ZXhfZWlzYV9pZHMpOwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB2b3J0ZXhfZWlzYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IF9faW5pdCB2b3J0ZXhfZWlzYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJdm9pZCBfX2lvbWVtICppb2FkZHI7CiAJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOXRvby5jIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCmluZGV4IDk4NTE3YTMuLmUzYmFkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYworKysgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKQEAgLTk5Miw2ICs5OTIsNyBAQAogCSAqIGZlYXR1cmVzCiAJICovCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9ISUdIRE1BOworCWRldi0+dmxhbl9mZWF0dXJlcyA9IGRldi0+ZmVhdHVyZXM7CiAKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggMTlmMDRhMy4uOTMzNTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0zNDE2LDcgKzM0MTYsOCBAQAogCiBjb25maWcgTkVUQ09OU09MRV9EWU5BTUlDCiAJYm9vbCAiRHluYW1pYyByZWNvbmZpZ3VyYXRpb24gb2YgbG9nZ2luZyB0YXJnZXRzIgotCWRlcGVuZHMgb24gTkVUQ09OU09MRSAmJiBTWVNGUyAmJiBDT05GSUdGU19GUworCWRlcGVuZHMgb24gTkVUQ09OU09MRSAmJiBTWVNGUyAmJiBDT05GSUdGU19GUyAmJiBcCisJCQkhKE5FVENPTlNPTEU9eSAmJiBDT05GSUdGU19GUz1tKQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGFiaWxpdHkgdG8gZHluYW1pY2FsbHkgcmVjb25maWd1cmUgdGFyZ2V0CiAJICBwYXJhbWV0ZXJzIChpbnRlcmZhY2UsIElQIGFkZHJlc3NlcywgcG9ydCBudW1iZXJzLCBNQUMgYWRkcmVzc2VzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jIGIvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCmluZGV4IDBjOTIxN2YuLjdiM2UyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYworKysgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKQEAgLTUwLDcgKzUwLDcgQEAKICNpZmRlZiBfX2FybV9fCiBzdGF0aWMgdm9pZCB3cml0ZV9ycmVnKHVfbG9uZyBiYXNlLCB1X2ludCByZWcsIHVfaW50IHZhbCkKIHsKLQlfX2FzbV9fKAorCWFzbSB2b2xhdGlsZSgKIAkic3RyJT9oCSUxLCBbJTJdCUAgTkVUX1JBUFxuXHQiCiAJInN0ciU/aAklMCwgWyUyLCAjLTRdCUAgTkVUX1JEUCIKIAk6CkBAIC02MCw3ICs2MCw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJlYWRfcnJlZyh1X2xvbmcgYmFzZV9hZGRyLCB1X2ludCByZWcpCiB7CiAJdW5zaWduZWQgc2hvcnQgdjsKLQlfX2FzbV9fKAorCWFzbSB2b2xhdGlsZSgKIAkic3RyJT9oCSUxLCBbJTJdCUAgTkVUX1JBUFxuXHQiCiAJImxkciU/aAklMCwgWyUyLCAjLTRdCUAgTkVUX1JEUCIKIAk6ICI9ciIgKHYpCkBAIC03MCw3ICs3MCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9pcmVnKHVfbG9uZyBiYXNlLCB1X2ludCByZWcsIHVfaW50IHZhbCkKIHsKLQlfX2FzbV9fKAorCWFzbSB2b2xhdGlsZSgKIAkic3RyJT9oCSUxLCBbJTJdCUAgTkVUX1JBUFxuXHQiCiAJInN0ciU/aAklMCwgWyUyLCAjOF0JQCBORVRfSURQIgogCToKQEAgLTgwLDcgKzgwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVhZF9pcmVnKHVfbG9uZyBiYXNlX2FkZHIsIHVfaW50IHJlZykKIHsKIAl1X3Nob3J0IHY7Ci0JX19hc21fXygKKwlhc20gdm9sYXRpbGUoCiAJInN0ciU/aAklMSwgWyUyXQlAIE5BVF9SQVBcblx0IgogCSJsZHIlP2gJJTAsIFslMiwgIzhdCUAgTkVUX0lEUFxuXHQiCiAJOiAiPXIiICh2KQpAQCAtOTEsNDcgKzkxLDQ4IEBACiAjZGVmaW5lIGFtX3dyaXRld29yZChkZXYsb2ZmLHZhbCkgX19yYXdfd3JpdGV3KHZhbCwgSVNBTUVNX0JBU0UgKyAoKG9mZikgPDwgMSkpCiAjZGVmaW5lIGFtX3JlYWR3b3JkKGRldixvZmYpICAgICAgX19yYXdfcmVhZHcoSVNBTUVNX0JBU0UgKyAoKG9mZikgPDwgMSkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGFtX3dyaXRlYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCW9mZnNldCA9IElTQU1FTV9CQVNFICsgKG9mZnNldCA8PCAxKTsKIAlsZW5ndGggPSAobGVuZ3RoICsgMSkgJiB+MTsKIAlpZiAoKGludClidWYgJiAyKSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHIlP2gJJTIsIFslMF0sICM0IgorCQlhc20gdm9sYXRpbGUoInN0ciU/aAklMiwgWyUwXSwgIzQiCiAJCSA6ICI9JnIiIChvZmZzZXQpIDogIjAiIChvZmZzZXQpLCAiciIgKGJ1ZlswXSB8IChidWZbMV0gPDwgOCkpKTsKIAkJYnVmICs9IDI7CiAJCWxlbmd0aCAtPSAyOwogCX0KIAl3aGlsZSAobGVuZ3RoID4gOCkgewotCQl1bnNpZ25lZCBpbnQgdG1wLCB0bXAyOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSJsZG0lP2lhCSUxISwgeyUyLCAlM31cblx0IgorCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgdG1wIGFzbSgicjIiKSwgdG1wMiBhc20oInIzIik7CisJCWFzbSB2b2xhdGlsZSgKKwkJCSJsZG0lP2lhCSUwISwgeyUxLCAlMn0iCisJCQk6ICIrciIgKGJ1ZiksICI9JnIiICh0bXApLCAiPSZyIiAodG1wMikpOworCQlsZW5ndGggLT0gODsKKwkJYXNtIHZvbGF0aWxlKAorCQkJInN0ciU/aAklMSwgWyUwXSwgIzRcblx0IgorCQkJIm1vdiU/CSUxLCAlMSwgbHNyICMxNlxuXHQiCisJCQkic3RyJT9oCSUxLCBbJTBdLCAjNFxuXHQiCiAJCQkic3RyJT9oCSUyLCBbJTBdLCAjNFxuXHQiCiAJCQkibW92JT8JJTIsICUyLCBsc3IgIzE2XG5cdCIKLQkJCSJzdHIlP2gJJTIsIFslMF0sICM0XG5cdCIKLQkJCSJzdHIlP2gJJTMsIFslMF0sICM0XG5cdCIKLQkJCSJtb3YlPwklMywgJTMsIGxzciAjMTZcblx0IgotCQkJInN0ciU/aAklMywgWyUwXSwgIzQiCi0JCTogIj0mciIgKG9mZnNldCksICI9JnIiIChidWYpLCAiPXIiICh0bXApLCAiPXIiICh0bXAyKQotCQk6ICIwIiAob2Zmc2V0KSwgIjEiIChidWYpKTsKLQkJbGVuZ3RoIC09IDg7CisJCQkic3RyJT9oCSUyLCBbJTBdLCAjNCIKKwkJOiAiK3IiIChvZmZzZXQpLCAiPSZyIiAodG1wKSwgIj0mciIgKHRtcDIpKTsKIAl9CiAJd2hpbGUgKGxlbmd0aCA+IDApIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0ciU/aAklMiwgWyUwXSwgIzQiCisJCWFzbSB2b2xhdGlsZSgic3RyJT9oCSUyLCBbJTBdLCAjNCIKIAkJIDogIj0mciIgKG9mZnNldCkgOiAiMCIgKG9mZnNldCksICJyIiAoYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSkpOwogCQlidWYgKz0gMjsKIAkJbGVuZ3RoIC09IDI7CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBhbV9yZWFkYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCW9mZnNldCA9IElTQU1FTV9CQVNFICsgKG9mZnNldCA8PCAxKTsKIAlsZW5ndGggPSAobGVuZ3RoICsgMSkgJiB+MTsKIAlpZiAoKGludClidWYgJiAyKSB7CiAJCXVuc2lnbmVkIGludCB0bXA7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlhc20gdm9sYXRpbGUoCiAJCQkibGRyJT9oCSUyLCBbJTBdLCAjNFxuXHQiCiAJCQkic3RyJT9iCSUyLCBbJTFdLCAjMVxuXHQiCiAJCQkibW92JT8JJTIsICUyLCBsc3IgIzhcblx0IgpAQCAtMTQwLDEyICsxNDEsMTIgQEAKIAkJbGVuZ3RoIC09IDI7CiAJfQogCXdoaWxlIChsZW5ndGggPiA4KSB7Ci0JCXVuc2lnbmVkIGludCB0bXAsIHRtcDIsIHRtcDM7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgdG1wIGFzbSgicjIiKSwgdG1wMiBhc20oInIzIiksIHRtcDM7CisJCWFzbSB2b2xhdGlsZSgKIAkJCSJsZHIlP2gJJTIsIFslMF0sICM0XG5cdCIKKwkJCSJsZHIlP2gJJTQsIFslMF0sICM0XG5cdCIKIAkJCSJsZHIlP2gJJTMsIFslMF0sICM0XG5cdCIKLQkJCSJvcnIlPwklMiwgJTIsICUzLCBsc2wgIzE2XG5cdCIKLQkJCSJsZHIlP2gJJTMsIFslMF0sICM0XG5cdCIKKwkJCSJvcnIlPwklMiwgJTIsICU0LCBsc2wgIzE2XG5cdCIKIAkJCSJsZHIlP2gJJTQsIFslMF0sICM0XG5cdCIKIAkJCSJvcnIlPwklMywgJTMsICU0LCBsc2wgIzE2XG5cdCIKIAkJCSJzdG0lP2lhCSUxISwgeyUyLCAlM30iCkBAIC0xNTUsNyArMTU2LDcgQEAKIAl9CiAJd2hpbGUgKGxlbmd0aCA+IDApIHsKIAkJdW5zaWduZWQgaW50IHRtcDsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCWFzbSB2b2xhdGlsZSgKIAkJCSJsZHIlP2gJJTIsIFslMF0sICM0XG5cdCIKIAkJCSJzdHIlP2IJJTIsIFslMV0sICMxXG5cdCIKIAkJCSJtb3YlPwklMiwgJTIsIGxzciAjOFxuXHQiCkBAIC0xOTYsNiArMTk3LDQyIEBACiAJcmV0dXJuIGVycm9yY291bnQ7CiB9CiAKK3N0YXRpYyB2b2lkIGFtNzljOTYxX21jX2hhc2goY2hhciAqYWRkciwgdTE2ICpoYXNoKQoreworCWlmIChhZGRyWzBdICYgMHgwMSkgeworCQlpbnQgaWR4LCBiaXQ7CisJCXUzMiBjcmM7CisKKwkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRyKTsKKworCQlpZHggPSBjcmMgPj4gMzA7CisJCWJpdCA9IChjcmMgPj4gMjYpICYgMTU7CisKKwkJaGFzaFtpZHhdIHw9IDEgPDwgYml0OworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhbTc5Yzk2MV9nZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKmhhc2gpCit7CisJdW5zaWduZWQgaW50IG1vZGUgPSBNT0RFX1BPUlRfMTBCVDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbW9kZSB8PSBNT0RFX1BST01JU0M7CisJCW1lbXNldChoYXNoLCAweGZmLCA0ICogc2l6ZW9mKCpoYXNoKSk7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCW1lbXNldChoYXNoLCAweGZmLCA0ICogc2l6ZW9mKCpoYXNoKSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKworCQltZW1zZXQoaGFzaCwgMCwgNCAqIHNpemVvZigqaGFzaCkpOworCisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCisJCQlhbTc5Yzk2MV9tY19oYXNoKGhhLT5hZGRyLCBoYXNoKTsKKwl9CisKKwlyZXR1cm4gbW9kZTsKK30KKwogc3RhdGljIHZvaWQKIGFtNzljOTYxX2luaXRfZm9yX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTIwMyw2ICsyNDAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciAqcDsKIAl1X2ludCBoZHJfYWRkciwgZmlyc3RfZnJlZV9hZGRyOworCXUxNiBtdWx0aV9oYXNoWzRdLCBtb2RlID0gYW03OWM5NjFfZ2V0X3J4X21vZGUoZGV2LCBtdWx0aV9oYXNoKTsKIAlpbnQgaTsKIAogCS8qCkBAIC0yMTgsMTYgKzI1NiwxMiBAQAogCXdyaXRlX2lyZWcgKGRldi0+YmFzZV9hZGRyLCAyLCAweDAwMDApOyAvKiBNT0RFIHJlZ2lzdGVyIHNlbGVjdHMgbWVkaWEgKi8KIAogCWZvciAoaSA9IExBRFJMOyBpIDw9IExBRFJIOyBpKyspCi0JCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBpLCAwKTsKKwkJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIGksIG11bHRpX2hhc2hbaSAtIExBRFJMXSk7CiAKIAlmb3IgKGkgPSBQQURSTCwgcCA9IGRldi0+ZGV2X2FkZHI7IGkgPD0gUEFEUkg7IGkrKywgcCArPSAyKQogCQl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgaSwgcFswXSB8IChwWzFdIDw8IDgpKTsKIAotCWkgPSBNT0RFX1BPUlRfMTBCVDsKLQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQlpIHw9IE1PREVfUFJPTUlTQzsKLQotCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBNT0RFLCBpKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgTU9ERSwgbW9kZSk7CiAJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIFBPTExJTlQsIDApOwogCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBTSVpFUlhSLCAtUlhfQlVGRkVSUyk7CiAJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIFNJWkVUWFIsIC1UWF9CVUZGRVJTKTsKQEAgLTM0MCwyMSArMzc0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYW03OWM5NjFfbWNfaGFzaChjaGFyICphZGRyLCB1bnNpZ25lZCBzaG9ydCAqaGFzaCkKLXsKLQlpZiAoYWRkclswXSAmIDB4MDEpIHsKLQkJaW50IGlkeCwgYml0OwotCQl1MzIgY3JjOwotCi0JCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgYWRkcik7Ci0KLQkJaWR4ID0gY3JjID4+IDMwOwotCQliaXQgPSAoY3JjID4+IDI2KSAmIDE1OwotCi0JCWhhc2hbaWR4XSB8PSAxIDw8IGJpdDsKLQl9Ci19Ci0KIC8qCiAgKiBTZXQgb3IgY2xlYXIgcHJvbWlzY3VvdXMvbXVsdGljYXN0IG1vZGUgZmlsdGVyIGZvciB0aGlzIGFkYXB0ZXIuCiAgKi8KQEAgLTM2MiwyNCArMzgxLDkgQEAKIHsKIAlzdHJ1Y3QgZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgbXVsdGlfaGFzaFs0XSwgbW9kZTsKKwl1MTYgbXVsdGlfaGFzaFs0XSwgbW9kZSA9IGFtNzljOTYxX2dldF9yeF9tb2RlKGRldiwgbXVsdGlfaGFzaCk7CiAJaW50IGksIHN0b3BwZWQ7CiAKLQltb2RlID0gTU9ERV9QT1JUXzEwQlQ7Ci0KLQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCW1vZGUgfD0gTU9ERV9QUk9NSVNDOwotCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewotCQltZW1zZXQobXVsdGlfaGFzaCwgMHhmZiwgc2l6ZW9mKG11bHRpX2hhc2gpKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCi0JCW1lbXNldChtdWx0aV9oYXNoLCAweDAwLCBzaXplb2YobXVsdGlfaGFzaCkpOwotCi0JCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCi0JCQlhbTc5Yzk2MV9tY19oYXNoKGhhLT5hZGRyLCBtdWx0aV9oYXNoKTsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CiAKIAlzdG9wcGVkID0gcmVhZF9ycmVnKGRldi0+YmFzZV9hZGRyLCBDU1IwKSAmIENTUjBfU1RPUDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCmluZGV4IDVhNzcwMDEuLjBiNDZiOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYwpAQCAtMjgzLDEwICsyODMsMTQgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCArIDIpOwogCQlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgeworCQkJc3RydWN0IGVwOTN4eF9yZGVzYyAqcnhkID0gJmVwLT5kZXNjcy0+cmRlc2NbZW50cnldOwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KE5VTEwsIGVwLT5kZXNjcy0+cmRlc2NbZW50cnldLmJ1Zl9hZGRyLAorCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LT5kZXYucGFyZW50LCByeGQtPmJ1Zl9hZGRyLAogCQkJCQkJbGVuZ3RoLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBlcC0+cnhfYnVmW2VudHJ5XSwgbGVuZ3RoKTsKKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJCSAgIHJ4ZC0+YnVmX2FkZHIsIGxlbmd0aCwKKwkJCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7CiAJCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKQEAgLTM0OCw2ICszNTIsNyBAQAogc3RhdGljIGludCBlcDkzeHhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBlcDkzeHhfcHJpdiAqZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBlcDkzeHhfdGRlc2MgKnR4ZDsKIAlpbnQgZW50cnk7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBNQVhfUEtUX1NJWkUpKSB7CkBAIC0zNTksMTEgKzM2NCwxNCBAQAogCWVudHJ5ID0gZXAtPnR4X3BvaW50ZXI7CiAJZXAtPnR4X3BvaW50ZXIgPSAoZXAtPnR4X3BvaW50ZXIgKyAxKSAmIChUWF9RVUVVRV9FTlRSSUVTIC0gMSk7CiAKLQllcC0+ZGVzY3MtPnRkZXNjW2VudHJ5XS50ZGVzYzEgPQotCQlUREVTQzFfRU9GIHwgKGVudHJ5IDw8IDE2KSB8IChza2ItPmxlbiAmIDB4ZmZmKTsKKwl0eGQgPSAmZXAtPmRlc2NzLT50ZGVzY1tlbnRyeV07CisKKwl0eGQtPnRkZXNjMSA9IFRERVNDMV9FT0YgfCAoZW50cnkgPDwgMTYpIHwgKHNrYi0+bGVuICYgMHhmZmYpOworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldi0+ZGV2LnBhcmVudCwgdHhkLT5idWZfYWRkciwgc2tiLT5sZW4sCisJCQkJRE1BX1RPX0RFVklDRSk7CiAJc2tiX2NvcHlfYW5kX2NzdW1fZGV2KHNrYiwgZXAtPnR4X2J1ZltlbnRyeV0pOwotCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KE5VTEwsIGVwLT5kZXNjcy0+dGRlc2NbZW50cnldLmJ1Zl9hZGRyLAotCQkJCXNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYtPmRldi5wYXJlbnQsIHR4ZC0+YnVmX2FkZHIsIHNrYi0+bGVuLAorCQkJCSAgIERNQV9UT19ERVZJQ0UpOwogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAogCXNwaW5fbG9ja19pcnEoJmVwLT50eF9wZW5kaW5nX2xvY2spOwpAQCAtNDU3LDg5ICs0NjUsODAgQEAKIAogc3RhdGljIHZvaWQgZXA5M3h4X2ZyZWVfYnVmZmVycyhzdHJ1Y3QgZXA5M3h4X3ByaXYgKmVwKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGVwLT5kZXYtPmRldi5wYXJlbnQ7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSArPSAyKSB7CisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0VOVFJJRVM7IGkrKykgewogCQlkbWFfYWRkcl90IGQ7CiAKIAkJZCA9IGVwLT5kZXNjcy0+cmRlc2NbaV0uYnVmX2FkZHI7CiAJCWlmIChkKQotCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBkLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZCwgUEtUX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCWlmIChlcC0+cnhfYnVmW2ldICE9IE5VTEwpCi0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZXAtPnJ4X2J1ZltpXSk7CisJCQlrZnJlZShlcC0+cnhfYnVmW2ldKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgVFhfUVVFVUVfRU5UUklFUzsgaSArPSAyKSB7CisJZm9yIChpID0gMDsgaSA8IFRYX1FVRVVFX0VOVFJJRVM7IGkrKykgewogCQlkbWFfYWRkcl90IGQ7CiAKIAkJZCA9IGVwLT5kZXNjcy0+dGRlc2NbaV0uYnVmX2FkZHI7CiAJCWlmIChkKQotCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBkLCBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGQsIFBLVF9CVUZfU0laRSwgRE1BX1RPX0RFVklDRSk7CiAKIAkJaWYgKGVwLT50eF9idWZbaV0gIT0gTlVMTCkKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllcC0+dHhfYnVmW2ldKTsKKwkJCWtmcmVlKGVwLT50eF9idWZbaV0pOwogCX0KIAotCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNpemVvZihzdHJ1Y3QgZXA5M3h4X2Rlc2NzKSwgZXAtPmRlc2NzLAorCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZW9mKHN0cnVjdCBlcDkzeHhfZGVzY3MpLCBlcC0+ZGVzY3MsCiAJCQkJCQkJZXAtPmRlc2NzX2RtYV9hZGRyKTsKIH0KIAotLyoKLSAqIFRoZSBoYXJkd2FyZSBlbmZvcmNlcyBhIHN1Yi0ySyBtYXhpbXVtIHBhY2tldCBzaXplLCBzbyB3ZSBwdXQKLSAqIHR3byBidWZmZXJzIG9uIGV2ZXJ5IGhhcmR3YXJlIHBhZ2UuCi0gKi8KIHN0YXRpYyBpbnQgZXA5M3h4X2FsbG9jX2J1ZmZlcnMoc3RydWN0IGVwOTN4eF9wcml2ICplcCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBlcC0+ZGV2LT5kZXYucGFyZW50OwogCWludCBpOwogCi0JZXAtPmRlc2NzID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNpemVvZihzdHJ1Y3QgZXA5M3h4X2Rlc2NzKSwKLQkJCQkmZXAtPmRlc2NzX2RtYV9hZGRyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJZXAtPmRlc2NzID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZW9mKHN0cnVjdCBlcDkzeHhfZGVzY3MpLAorCQkJCSZlcC0+ZGVzY3NfZG1hX2FkZHIsIEdGUF9LRVJORUwpOwogCWlmIChlcC0+ZGVzY3MgPT0gTlVMTCkKIAkJcmV0dXJuIDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSArPSAyKSB7Ci0JCXZvaWQgKnBhZ2U7CisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0VOVFJJRVM7IGkrKykgeworCQl2b2lkICpidWY7CiAJCWRtYV9hZGRyX3QgZDsKIAotCQlwYWdlID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQlpZiAocGFnZSA9PSBOVUxMKQorCQlidWYgPSBrbWFsbG9jKFBLVF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwogCi0JCWQgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBwYWdlLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0JCWlmIChkbWFfbWFwcGluZ19lcnJvcihOVUxMLCBkKSkgewotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQlkID0gZG1hX21hcF9zaW5nbGUoZGV2LCBidWYsIFBLVF9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZCkpIHsKKwkJCWtmcmVlKGJ1Zik7CiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCWVwLT5yeF9idWZbaV0gPSBwYWdlOworCQllcC0+cnhfYnVmW2ldID0gYnVmOwogCQllcC0+ZGVzY3MtPnJkZXNjW2ldLmJ1Zl9hZGRyID0gZDsKIAkJZXAtPmRlc2NzLT5yZGVzY1tpXS5yZGVzYzEgPSAoaSA8PCAxNikgfCBQS1RfQlVGX1NJWkU7Ci0KLQkJZXAtPnJ4X2J1ZltpICsgMV0gPSBwYWdlICsgUEtUX0JVRl9TSVpFOwotCQllcC0+ZGVzY3MtPnJkZXNjW2kgKyAxXS5idWZfYWRkciA9IGQgKyBQS1RfQlVGX1NJWkU7Ci0JCWVwLT5kZXNjcy0+cmRlc2NbaSArIDFdLnJkZXNjMSA9ICgoaSArIDEpIDw8IDE2KSB8IFBLVF9CVUZfU0laRTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgVFhfUVVFVUVfRU5UUklFUzsgaSArPSAyKSB7Ci0JCXZvaWQgKnBhZ2U7CisJZm9yIChpID0gMDsgaSA8IFRYX1FVRVVFX0VOVFJJRVM7IGkrKykgeworCQl2b2lkICpidWY7CiAJCWRtYV9hZGRyX3QgZDsKIAotCQlwYWdlID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQlpZiAocGFnZSA9PSBOVUxMKQorCQlidWYgPSBrbWFsbG9jKFBLVF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwogCi0JCWQgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBwYWdlLCBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoTlVMTCwgZCkpIHsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJZCA9IGRtYV9tYXBfc2luZ2xlKGRldiwgYnVmLCBQS1RfQlVGX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkKSkgeworCQkJa2ZyZWUoYnVmKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAKLQkJZXAtPnR4X2J1ZltpXSA9IHBhZ2U7CisJCWVwLT50eF9idWZbaV0gPSBidWY7CiAJCWVwLT5kZXNjcy0+dGRlc2NbaV0uYnVmX2FkZHIgPSBkOwotCi0JCWVwLT50eF9idWZbaSArIDFdID0gcGFnZSArIFBLVF9CVUZfU0laRTsKLQkJZXAtPmRlc2NzLT50ZGVzY1tpICsgMV0uYnVmX2FkZHIgPSBkICsgUEtUX0JVRl9TSVpFOwogCX0KIAogCXJldHVybiAwOwpAQCAtODI5LDYgKzgyOCw3IEBACiAJfQogCWVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAllcC0+ZGV2ID0gZGV2OworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmZXAtPm5hcGksIGVwOTN4eF9wb2xsLCA2NCk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmZpbl9tYWMuYyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKaW5kZXggNjhkNDViYS4uNmMwMTllMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmZpbl9tYWMuYworKysgYi9kcml2ZXJzL25ldC9iZmluX21hYy5jCkBAIC01MiwxMyArNTIsMTMgQEAKIE1PRFVMRV9BTElBUygicGxhdGZvcm06YmZpbl9tYWMiKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fTUFDX1VTRV9MMSkKLSMgZGVmaW5lIGJmaW5fbWFjX2FsbG9jKGRtYV9oYW5kbGUsIHNpemUpICBsMV9kYXRhX3NyYW1femFsbG9jKHNpemUpCi0jIGRlZmluZSBiZmluX21hY19mcmVlKGRtYV9oYW5kbGUsIHB0cikgICAgbDFfZGF0YV9zcmFtX2ZyZWUocHRyKQorIyBkZWZpbmUgYmZpbl9tYWNfYWxsb2MoZG1hX2hhbmRsZSwgc2l6ZSwgbnVtKSAgbDFfZGF0YV9zcmFtX3phbGxvYyhzaXplKm51bSkKKyMgZGVmaW5lIGJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcHRyLCBudW0pICAgIGwxX2RhdGFfc3JhbV9mcmVlKHB0cikKICNlbHNlCi0jIGRlZmluZSBiZmluX21hY19hbGxvYyhkbWFfaGFuZGxlLCBzaXplKSBcCi0JZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNpemUsIGRtYV9oYW5kbGUsIEdGUF9LRVJORUwpCi0jIGRlZmluZSBiZmluX21hY19mcmVlKGRtYV9oYW5kbGUsIHB0cikgXAotCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNpemVvZigqcHRyKSwgcHRyLCBkbWFfaGFuZGxlKQorIyBkZWZpbmUgYmZpbl9tYWNfYWxsb2MoZG1hX2hhbmRsZSwgc2l6ZSwgbnVtKSBcCisJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNpemUqbnVtLCBkbWFfaGFuZGxlLCBHRlBfS0VSTkVMKQorIyBkZWZpbmUgYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCBwdHIsIG51bSkgXAorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNpemVvZigqcHRyKSpudW0sIHB0ciwgZG1hX2hhbmRsZSkKICNlbmRpZgogCiAjZGVmaW5lIFBLVF9CVUZfU1ogMTU4MApAQCAtOTUsNyArOTUsNyBAQAogCQkJCXQgPSB0LT5uZXh0OwogCQkJfQogCQl9Ci0JCWJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgdHhfZGVzYyk7CisJCWJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgdHhfZGVzYywgQ09ORklHX0JGSU5fVFhfREVTQ19OVU0pOwogCX0KIAogCWlmIChyeF9kZXNjKSB7CkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCQlyID0gci0+bmV4dDsKIAkJCX0KIAkJfQotCQliZmluX21hY19mcmVlKGRtYV9oYW5kbGUsIHJ4X2Rlc2MpOworCQliZmluX21hY19mcmVlKGRtYV9oYW5kbGUsIHJ4X2Rlc2MsIENPTkZJR19CRklOX1JYX0RFU0NfTlVNKTsKIAl9CiB9CiAKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAjZW5kaWYKIAogCXR4X2Rlc2MgPSBiZmluX21hY19hbGxvYygmZG1hX2hhbmRsZSwKLQkJCQlzaXplb2Yoc3RydWN0IG5ldF9kbWFfZGVzY190eCkgKgorCQkJCXNpemVvZihzdHJ1Y3QgbmV0X2RtYV9kZXNjX3R4KSwKIAkJCQlDT05GSUdfQkZJTl9UWF9ERVNDX05VTSk7CiAJaWYgKHR4X2Rlc2MgPT0gTlVMTCkKIAkJZ290byBpbml0X2Vycm9yOwogCiAJcnhfZGVzYyA9IGJmaW5fbWFjX2FsbG9jKCZkbWFfaGFuZGxlLAotCQkJCXNpemVvZihzdHJ1Y3QgbmV0X2RtYV9kZXNjX3J4KSAqCisJCQkJc2l6ZW9mKHN0cnVjdCBuZXRfZG1hX2Rlc2NfcngpLAogCQkJCUNPTkZJR19CRklOX1JYX0RFU0NfTlVNKTsKIAlpZiAocnhfZGVzYyA9PSBOVUxMKQogCQlnb3RvIGluaXRfZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvYm5hZC5jIGIvZHJpdmVycy9uZXQvYm5hL2JuYWQuYwppbmRleCA3ZDI1YTk3Li40NGUyMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibmEvYm5hZC5jCisrKyBiL2RyaXZlcnMvbmV0L2JuYS9ibmFkLmMKQEAgLTExMTEsNyArMTExMSw3IEBACiAJCSAgICBzdHJ1Y3QgYm5hX2ludHJfaW5mbyAqaW50cl9pbmZvKQogewogCWludCAJCWVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyAJZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAJaXJxX2ZsYWdzID0gMCwgZmxhZ3M7CiAJdTMyCWlycTsKIAlpcnFfaGFuZGxlcl90IAlpcnFfaGFuZGxlcjsKIApAQCAtMTEyNSwxOCArMTEyNSwxNyBAQAogCWlmIChibmFkLT5jZmdfZmxhZ3MgJiBCTkFEX0NGX01TSVgpIHsKIAkJaXJxX2hhbmRsZXIgPSAoaXJxX2hhbmRsZXJfdClibmFkX21zaXhfbWJveF9oYW5kbGVyOwogCQlpcnEgPSBibmFkLT5tc2l4X3RhYmxlW2JuYWQtPm1zaXhfbnVtIC0gMV0udmVjdG9yOwotCQlmbGFncyA9IDA7CiAJCWludHJfaW5mby0+aW50cl90eXBlID0gQk5BX0lOVFJfVF9NU0lYOwogCQlpbnRyX2luZm8tPmlkbFswXS52ZWN0b3IgPSBibmFkLT5tc2l4X251bSAtIDE7CiAJfSBlbHNlIHsKIAkJaXJxX2hhbmRsZXIgPSAoaXJxX2hhbmRsZXJfdClibmFkX2lzcjsKIAkJaXJxID0gYm5hZC0+cGNpZGV2LT5pcnE7Ci0JCWZsYWdzID0gSVJRRl9TSEFSRUQ7CisJCWlycV9mbGFncyA9IElSUUZfU0hBUkVEOwogCQlpbnRyX2luZm8tPmludHJfdHlwZSA9IEJOQV9JTlRSX1RfSU5UWDsKIAkJLyogaW50cl9pbmZvLT5pZGwudmVjdG9yID0gMCA/ICovCiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7Ci0KKwlmbGFncyA9IGlycV9mbGFnczsKIAlzcHJpbnRmKGJuYWQtPm1ib3hfaXJxX25hbWUsICIlcyIsIEJOQURfTkFNRSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbWFpbi5jCmluZGV4IDRiNzAzMTEuLjc0YmU5ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC96bGliLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNkZWZpbmUgQk5YMlhfTUFJTgogI2luY2x1ZGUgImJueDJ4LmgiCkBAIC00NTM3LDggKzQ1MzgsNyBAQAogCWlmIChicC0+c3RybSAgPT0gTlVMTCkKIAkJZ290byBndW56aXBfbm9tZW0yOwogCi0JYnAtPnN0cm0tPndvcmtzcGFjZSA9IGttYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKLQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlicC0+c3RybS0+d29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTsKIAlpZiAoYnAtPnN0cm0tPndvcmtzcGFjZSA9PSBOVUxMKQogCQlnb3RvIGd1bnppcF9ub21lbTM7CiAKQEAgLTQ1NjIsNyArNDU2Miw3IEBACiBzdGF0aWMgdm9pZCBibngyeF9ndW56aXBfZW5kKHN0cnVjdCBibngyeCAqYnApCiB7CiAJaWYgKGJwLT5zdHJtKSB7Ci0JCWtmcmVlKGJwLT5zdHJtLT53b3Jrc3BhY2UpOworCQl2ZnJlZShicC0+c3RybS0+d29ya3NwYWNlKTsKIAkJa2ZyZWUoYnAtPnN0cm0pOwogCQlicC0+c3RybSA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggMTdiNGRkOS4uNjNjMjJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0zODgsNiArMzg4LDggQEAKIAlyZXR1cm4gbmV4dDsKIH0KIAorI2RlZmluZSBib25kX3F1ZXVlX21hcHBpbmcoc2tiKSAoKih1MTYgKikoKHNrYiktPmNiKSkKKwogLyoqCiAgKiBib25kX2Rldl9xdWV1ZV94bWl0IC0gUHJlcGFyZSBza2IgZm9yIHhtaXQuCiAgKgpAQCAtNDAwLDYgKzQwMiw5IEBACiB7CiAJc2tiLT5kZXYgPSBzbGF2ZV9kZXY7CiAJc2tiLT5wcmlvcml0eSA9IDE7CisKKwlza2ItPnF1ZXVlX21hcHBpbmcgPSBib25kX3F1ZXVlX21hcHBpbmcoc2tiKTsKKwogCWlmICh1bmxpa2VseShuZXRwb2xsX3R4X3J1bm5pbmcoc2xhdmVfZGV2KSkpCiAJCWJvbmRfbmV0cG9sbF9zZW5kX3NrYihib25kX2dldF9zbGF2ZV9ieV9kZXYoYm9uZCwgc2xhdmVfZGV2KSwgc2tiKTsKIAllbHNlCkBAIC0xMjkyLDYgKzEyOTcsNyBAQAogCQlnb3RvIG91dDsKIAogCW5wLT5kZXYgPSBzbGF2ZS0+ZGV2OworCXN0cmxjcHkobnAtPmRldl9uYW1lLCBzbGF2ZS0+ZGV2LT5uYW1lLCBJRk5BTVNJWik7CiAJZXJyID0gX19uZXRwb2xsX3NldHVwKG5wKTsKIAlpZiAoZXJyKSB7CiAJCWtmcmVlKG5wKTsKQEAgLTE0MjIsOSArMTQyOCw5IEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi0jZGVmaW5lIEJPTkRfVkxBTl9GRUFUVVJFUwkoTkVUSUZfRl9BTExfVFhfT0ZGTE9BRFMgfCBcCi0JCQkJIE5FVElGX0ZfU09GVF9GRUFUVVJFUyB8IFwKLQkJCQkgTkVUSUZfRl9MUk8pCisjZGVmaW5lIEJPTkRfVkxBTl9GRUFUVVJFUwkoTkVUSUZfRl9BTExfQ1NVTSB8IE5FVElGX0ZfU0cgfCBcCisJCQkJIE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0FMTF9UU08gfCBcCisJCQkJIE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfTFJPKQogCiBzdGF0aWMgdm9pZCBib25kX2NvbXB1dGVfZmVhdHVyZXMoc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7CkBAIC00MjA2LDYgKzQyMTIsNyBAQAogCXJldHVybiByZXM7CiB9CiAKKwogc3RhdGljIHUxNiBib25kX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCS8qCkBAIC00MjE2LDYgKzQyMjMsMTEgQEAKIAkgKi8KIAl1MTYgdHhxID0gc2tiX3J4X3F1ZXVlX3JlY29yZGVkKHNrYikgPyBza2JfZ2V0X3J4X3F1ZXVlKHNrYikgOiAwOwogCisJLyoKKwkgKiBTYXZlIHRoZSBvcmlnaW5hbCB0eHEgdG8gcmVzdG9yZSBiZWZvcmUgcGFzc2luZyB0byB0aGUgZHJpdmVyCisJICovCisJYm9uZF9xdWV1ZV9tYXBwaW5nKHNrYikgPSBza2ItPnF1ZXVlX21hcHBpbmc7CisKIAlpZiAodW5saWtlbHkodHhxID49IGRldi0+cmVhbF9udW1fdHhfcXVldWVzKSkgewogCQlkbyB7CiAJCQl0eHEgLT0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMKaW5kZXggNzNjN2UwMy4uM2RmMGMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYwpAQCAtMTY3LDggKzE2Nyw4IEBACiAKICNlbmRpZgogCi1zdGF0aWMgdW5zaWduZWQgaW50IGxkaXNjX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJY29uc3QgdTggKmRhdGEsIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBsZGlzY19yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHU4ICpkYXRhLAorCQkJY2hhciAqZmxhZ3MsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3Qgc2VyX2RldmljZSAqc2VyOwpAQCAtMjE1LDggKzIxNSw2IEBACiAJfSBlbHNlCiAJCSsrc2VyLT5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7CiAJdXBkYXRlX3R0eV9zdGF0dXMoc2VyKTsKLQotCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGludCBoYW5kbGVfdHgoc3RydWN0IHNlcl9kZXZpY2UgKnNlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvY2FuL0tjb25maWcKaW5kZXggMWQ2OTllMy4uNzU0ZGY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvY2FuL0tjb25maWcKQEAgLTM2LDcgKzM2LDcgQEAKIGNvbmZpZyBDQU5fREVWCiAJdHJpc3RhdGUgIlBsYXRmb3JtIENBTiBkcml2ZXJzIHdpdGggTmV0bGluayBzdXBwb3J0IgogCWRlcGVuZHMgb24gQ0FOCi0JZGVmYXVsdCBZCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgRW5hYmxlcyB0aGUgY29tbW9uIGZyYW1ld29yayBmb3IgcGxhdGZvcm0gQ0FOIGRyaXZlcnMgd2l0aCBOZXRsaW5rCiAJICBzdXBwb3J0LiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZvciBDQU4gZHJpdmVycy4KQEAgLTQ1LDcgKzQ1LDcgQEAKIGNvbmZpZyBDQU5fQ0FMQ19CSVRUSU1JTkcKIAlib29sICJDQU4gYml0LXRpbWluZyBjYWxjdWxhdGlvbiIKIAlkZXBlbmRzIG9uIENBTl9ERVYKLQlkZWZhdWx0IFkKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBJZiBlbmFibGVkLCBDQU4gYml0LXRpbWluZyBwYXJhbWV0ZXJzIHdpbGwgYmUgY2FsY3VsYXRlZCBmb3IgdGhlCiAJICBiaXQtcmF0ZSBzcGVjaWZpZWQgdmlhIE5ldGxpbmsgYXJndW1lbnQgImJpdHJhdGUiIHdoZW4gdGhlIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKaW5kZXggZDQ5OTA1Ni4uMTc2NzgxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCkBAIC05MjMsNyArOTIzLDcgQEAKIAltZW1fc2l6ZSA9IHJlc291cmNlX3NpemUobWVtKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCBtZW1fc2l6ZSwgcGRldi0+bmFtZSkpIHsKIAkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGZhaWxlZF9yZXE7CisJCWdvdG8gZmFpbGVkX2dldDsKIAl9CiAKIAliYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW1fc2l6ZSk7CkBAIC05NzcsOSArOTc3LDggQEAKIAlpb3VubWFwKGJhc2UpOwogIGZhaWxlZF9tYXA6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbV9zaXplKTsKLSBmYWlsZWRfcmVxOgotCWNsa19wdXQoY2xrKTsKICBmYWlsZWRfZ2V0OgorCWNsa19wdXQoY2xrKTsKICBmYWlsZWRfY2xvY2s6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jIGIvZHJpdmVycy9uZXQvY2FuL3NsY2FuLmMKaW5kZXggNzU2MjJkNS4uMWI0OWRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3NsY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NsY2FuLmMKQEAgLTQyNSwxNyArNDI1LDE2IEBACiAgKiBpbiBwYXJhbGxlbAogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2xjYW5fcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKK3N0YXRpYyB2b2lkIHNsY2FuX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2xjYW4gKnNsID0gKHN0cnVjdCBzbGNhbiAqKSB0dHktPmRpc2NfZGF0YTsKLQlpbnQgYnl0ZXMgPSBjb3VudDsKIAogCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFNMQ0FOX01BR0lDIHx8ICFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuOwogCiAJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLwotCXdoaWxlIChieXRlcy0tKSB7CisJd2hpbGUgKGNvdW50LS0pIHsKIAkJaWYgKGZwICYmICpmcCsrKSB7CiAJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkKIAkJCQlzbC0+ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTQ0NCw4ICs0NDMsNiBAQAogCQl9CiAJCXNsY2FuX3VuZXNjKHNsLCAqY3ArKyk7CiAJfQotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCmluZGV4IDNmNTYyYmEuLjc2YmY1ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCkBAIC0yMDI2LDcgKzIwMjYsNyBAQAogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0gZWxzZQogCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKLQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcXMgLSAmYWRhcC0+c2dlLnFzWzBdKTsKKwlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcXMgLSAmYWRhcC0+c2dlLnFzW3BpLT5maXJzdF9xc2V0XSk7CiAKIAlpZiAodW5saWtlbHkocC0+dmxhbl92YWxpZCkpIHsKIAkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCA9IHBpLT52bGFuX2dycDsKQEAgLTIxNDUsNyArMjE0NSw3IEBACiAJaWYgKCFjb21wbGV0ZSkKIAkJcmV0dXJuOwogCi0Jc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHFzIC0gJmFkYXAtPnNnZS5xc1swXSk7CisJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHFzIC0gJmFkYXAtPnNnZS5xc1twaS0+Zmlyc3RfcXNldF0pOwogCiAJaWYgKHVubGlrZWx5KGNwbC0+dmxhbl92YWxpZCkpIHsKIAkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCA9IHBpLT52bGFuX2dycDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RhdmluY2lfZW1hYy5jIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKaW5kZXggMjlhNGYwNi4uZGNjNGExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKQEAgLTE3ODEsOCArMTc4MSw4IEBACiAJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZW1hY19wcml2KSk7CiAJaWYgKCFuZGV2KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yIGFsbG9jYXRpbmcgbmV0X2RldmljZVxuIik7Ci0JCWNsa19wdXQoZW1hY19jbGspOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfY2xrOwogCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOwpAQCAtMTc5Niw3ICsxNzk2LDggQEAKIAlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWlmICghcGRhdGEpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gcHJvYmVfcXVpdDsKIAl9CiAKIAkvKiBNQUMgYWRkciBhbmQgUEhZIG1hc2sgLCBSTUlJIGVuYWJsZSBpbmZvIGZyb20gcGxhdGZvcm1fZGF0YSAqLwpAQCAtMTkyOSw4ICsxOTMwLDkgQEAKIAlpb3VubWFwKHByaXYtPnJlbWFwX2FkZHIpOwogCiBwcm9iZV9xdWl0OgotCWNsa19wdXQoZW1hY19jbGspOwogCWZyZWVfbmV0ZGV2KG5kZXYpOworZnJlZV9jbGs6CisJY2xrX3B1dChlbWFjX2Nsayk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZXBjYS5jIGIvZHJpdmVycy9uZXQvZGVwY2EuYwppbmRleCAxNzY1NDA1Li44YjAwODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZXBjYS5jCisrKyBiL2RyaXZlcnMvbmV0L2RlcGNhLmMKQEAgLTMzMSwxOCArMzMxLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIkRFNDIyIixcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiJ9CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBkZXBjYV9zaWduYXR1cmVbXSBfX2RldmluaXRjb25zdCA9IERFUENBX1NJR05BVFVSRTsKK3N0YXRpYyBjaGFyKiBfX2luaXRkYXRhIGRlcGNhX3NpZ25hdHVyZVtdID0gREVQQ0FfU0lHTkFUVVJFOwogCiBlbnVtIGRlcGNhX3R5cGUgewogCURFUENBLCBkZTEwMCwgZGUxMDEsIGRlMjAwLCBkZTIwMSwgZGUyMDIsIGRlMjEwLCBkZTIxMiwgZGU0MjIsIHVua25vd24KIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyIGRlcGNhX3N0cmluZ1tdID0gImRlcGNhIjsKK3N0YXRpYyBjaGFyIGRlcGNhX3N0cmluZ1tdID0gImRlcGNhIjsKIAogc3RhdGljIGludCBkZXBjYV9kZXZpY2VfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogCiAjaWZkZWYgQ09ORklHX0VJU0EKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgZGVwY2FfZWlzYV9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgZGVwY2FfZWlzYV9pZHNbXSA9IHsKIAl7ICJERUM0MjIwIiwgZGU0MjIgfSwKIAl7ICIiIH0KIH07CkBAIC0zNjcsMTkgKzM2NywxOSBAQAogI2RlZmluZSBERTIxMF9JRCAweDYyOGQKICNkZWZpbmUgREUyMTJfSUQgMHg2ZGVmCiAKLXN0YXRpYyBjb25zdCBzaG9ydCBkZXBjYV9tY2FfYWRhcHRlcl9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzaG9ydCBkZXBjYV9tY2FfYWRhcHRlcl9pZHNbXSA9IHsKIAlERTIxMF9JRCwKIAlERTIxMl9JRCwKIAkweDAwMDAKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpkZXBjYV9tY2FfYWRhcHRlcl9uYW1lW10gPSB7CitzdGF0aWMgY2hhciAqZGVwY2FfbWNhX2FkYXB0ZXJfbmFtZVtdID0gewogCSJERUMgRXRoZXJXT1JLUyBNQyBBZGFwdGVyIChERTIxMCkiLAogCSJERUMgRXRoZXJXT1JLUyBNQyBBZGFwdGVyIChERTIxMikiLAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBlbnVtIGRlcGNhX3R5cGUgZGVwY2FfbWNhX2FkYXB0ZXJfdHlwZVtdID0geworc3RhdGljIGVudW0gZGVwY2FfdHlwZSBkZXBjYV9tY2FfYWRhcHRlcl90eXBlW10gPSB7CiAJZGUyMTAsCiAJZGUyMTIsCiAJMApAQCAtNTQxLDkgKzU0MSwxMCBAQAogc3RhdGljIGludCBsb2FkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIGRlcGNhX2RiZ19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi1zdGF0aWMgY29uc3QgdV9jaGFyIGRlMXh4X2lycVtdIF9fZGV2aW5pdGNvbnN0ID0geyAyLCAzLCA0LCA1LCA3LCA5LCAwIH07Ci1zdGF0aWMgY29uc3QgdV9jaGFyIGRlMnh4X2lycVtdIF9fZGV2aW5pdGNvbnN0ID0geyA1LCA5LCAxMCwgMTEsIDE1LCAwIH07Ci1zdGF0aWMgY29uc3QgdV9jaGFyIGRlNDIyX2lycVtdIF9fZGV2aW5pdGNvbnN0ID0geyA1LCA5LCAxMCwgMTEsIDAgfTsKK3N0YXRpYyB1X2NoYXIgZGUxeHhfaXJxW10gX19pbml0ZGF0YSA9IHsgMiwgMywgNCwgNSwgNywgOSwgMCB9Oworc3RhdGljIHVfY2hhciBkZTJ4eF9pcnFbXSBfX2luaXRkYXRhID0geyA1LCA5LCAxMCwgMTEsIDE1LCAwIH07CitzdGF0aWMgdV9jaGFyIGRlNDIyX2lycVtdIF9faW5pdGRhdGEgPSB7IDUsIDksIDEwLCAxMSwgMCB9Oworc3RhdGljIHVfY2hhciAqZGVwY2FfaXJxOwogCiBzdGF0aWMgaW50IGlycTsKIHN0YXRpYyBpbnQgaW87CkBAIC01NzksNyArNTgwLDcgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGRlcGNhX2h3X2luaXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX2h3X2luaXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHA7CiAJaW50IGksIGosIG9mZnNldCwgbmV0UkFNLCBtZW1fbGVuLCBzdGF0dXMgPSAwOwpAQCAtNzQ3LDcgKzc0OCw2IEBACiAJaWYgKGRldi0+aXJxIDwgMikgewogCQl1bnNpZ25lZCBjaGFyIGlycW51bTsKIAkJdW5zaWduZWQgbG9uZyBpcnFfbWFzaywgZGVsYXk7Ci0JCWNvbnN0IHVfY2hhciAqZGVwY2FfaXJxOwogCiAJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CiAKQEAgLTc3MCw3ICs3NzAsNiBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWRlcGNhX2lycSA9IE5VTEw7CiAJCQlicmVhazsJLyogTm90IHJlYWNoZWQgKi8KIAkJfQogCkBAIC0xMzAzLDcgKzEzMDIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgZGVwY2FfY29tbW9uX2luaXQgKHVfbG9uZyBpb2FkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2cCkKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX2NvbW1vbl9pbml0ICh1X2xvbmcgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldnApCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAKQEAgLTEzMzQsNyArMTMzMyw3IEBACiAvKgogKiogTWljcm9jaGFubmVsIGJ1cyBJL08gZGV2aWNlIHByb2JlCiAqLwotc3RhdGljIGludCBfX2RldmluaXQgZGVwY2FfbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJdW5zaWduZWQgY2hhciBwb3NbMl07CiAJdW5zaWduZWQgY2hhciB3aGVyZTsKQEAgLTE0NTgsNyArMTQ1Nyw3IEBACiAqKiBJU0EgYnVzIEkvTyBkZXZpY2UgcHJvYmUKICovCiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBkZXBjYV9wbGF0Zm9ybV9wcm9iZSAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBkZXBjYV9wbGF0Zm9ybV9wcm9iZSAodm9pZCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGRldjsKQEAgLTE0OTgsNyArMTQ5Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgZW51bSBkZXBjYV90eXBlIF9fZGV2aW5pdCBkZXBjYV9zaG1lbV9wcm9iZSAodWxvbmcgKm1lbV9zdGFydCkKK3N0YXRpYyBlbnVtIGRlcGNhX3R5cGUgX19pbml0IGRlcGNhX3NobWVtX3Byb2JlICh1bG9uZyAqbWVtX3N0YXJ0KQogewogCXVfbG9uZyBtZW1fYmFzZVtdID0gREVQQ0FfUkFNX0JBU0VfQUREUkVTU0VTOwogCWVudW0gZGVwY2FfdHlwZSBhZGFwdGVyID0gdW5rbm93bjsKQEAgLTE1NTksNyArMTU1OCw3IEBACiAqLwogCiAjaWZkZWYgQ09ORklHX0VJU0EKLXN0YXRpYyBpbnQgX19kZXZpbml0IGRlcGNhX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAllbnVtIGRlcGNhX3R5cGUgYWRhcHRlciA9IHVua25vd247CiAJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OwpAQCAtMTYzMCw3ICsxNjI5LDcgQEAKICoqIGFuZCBCb290IChyZWFkYikgUk9NLiBUaGlzIHdpbGwgYWxzbyBnaXZlIHVzIGEgY2x1ZSB0byB0aGUgbmV0d29yayBSQU0KICoqIGJhc2UgYWRkcmVzcy4KICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBEZXBjYVNpZ25hdHVyZShjaGFyICpuYW1lLCB1X2xvbmcgYmFzZV9hZGRyKQorc3RhdGljIGludCBfX2luaXQgRGVwY2FTaWduYXR1cmUoY2hhciAqbmFtZSwgdV9sb25nIGJhc2VfYWRkcikKIHsKIAl1X2ludCBpLCBqLCBrOwogCXZvaWQgX19pb21lbSAqcHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGwyay5jIGIvZHJpdmVycy9uZXQvZGwyay5jCmluZGV4IGM0NDU0NTcuLjIzMTc5ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RsMmsuYworKysgYi9kcml2ZXJzL25ldC9kbDJrLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCWlmIChucC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRExJTkspIHsJLyogRC1MaW5rIE9ubHkgKi8KIAkJLyogQ2hlY2sgQ1JDICovCiAJCWNyYyA9IH5ldGhlcl9jcmNfbGUgKDI1NiAtIDQsIHNyb21kYXRhKTsKLQkJaWYgKHBzcm9tLT5jcmMgIT0gY3JjKSB7CisJCWlmIChwc3JvbS0+Y3JjICE9IGNwdV90b19sZTMyKGNyYykpIHsKIAkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBFRVBST00gZGF0YSBDUkMgZXJyb3IuXG4iLAogCQkJCQlkZXYtPm5hbWUpOwogCQkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZG05MDAwLmMgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwppbmRleCBmYmFmZjM1Li5lZTU5N2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbTkwMDAuYworKysgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwpAQCAtMTE1Nyw5ICsxMTU3LDYgQEAKIAogCWlycWZsYWdzIHw9IElSUUZfU0hBUkVEOwogCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkbTkwMDBfaW50ZXJydXB0LCBpcnFmbGFncywgZGV2LT5uYW1lLCBkZXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQogCS8qIEdQSU8wIG9uIHByZS1hY3RpdmF0ZSBQSFksIFJlZyAxRiBpcyBub3Qgc2V0IGJ5IHJlc2V0ICovCiAJaW93KGRiLCBETTkwMDBfR1BSLCAwKTsJLyogUkVHXzFGIGJpdDAgYWN0aXZhdGUgcGh5eGNlciAqLwogCW1kZWxheSgxKTsgLyogZGVsYXkgbmVlZHMgYnkgRE05MDAwQiAqLwpAQCAtMTE2OCw2ICsxMTY1LDkgQEAKIAlkbTkwMDBfcmVzZXQoZGIpOwogCWRtOTAwMF9pbml0X2RtOTAwMChkZXYpOwogCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkbTkwMDBfaW50ZXJydXB0LCBpcnFmbGFncywgZGV2LT5uYW1lLCBkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCS8qIEluaXQgZHJpdmVyIHZhcmlhYmxlICovCiAJZGItPmRidWdfY250ID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9tYWMtZmNjLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mY2MuYwppbmRleCA3YTg0ZTQ1Li43NTgzYTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mY2MuYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mY2MuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCWdvdG8gb3V0X2VwOwogCiAJZmVwLT5mY2MubWVtID0gKHZvaWQgX19pb21lbSAqKWNwbTJfaW1tcjsKLQlmcGktPmRwcmFtX29mZnNldCA9IGNwbV9kcGFsbG9jKDEyOCwgOCk7CisJZnBpLT5kcHJhbV9vZmZzZXQgPSBjcG1fZHBhbGxvYygxMjgsIDMyKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKGZwaS0+ZHByYW1fb2Zmc2V0KSkgewogCQlyZXQgPSBmcGktPmRwcmFtX29mZnNldDsKIAkJZ290byBvdXRfZmNjY3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKaW5kZXggZmY2MGIyMy4uZGZhNTVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpAQCAtMTAsNyArMTAsNyBAQAogICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYQogICogTW9kaWZpZXI6IFNhbmRlZXAgR29wYWxwZXQgPHNhbmRlZXAua3VtYXJAZnJlZXNjYWxlLmNvbT4KICAqCi0gKiBDb3B5cmlnaHQgMjAwMi0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA5LCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00NzYsOSArNDc2LDYgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgaW50IGZ0cF9ycWZwcltNQVhfRklMRVJfSURYICsgMV07Ci11bnNpZ25lZCBpbnQgZnRwX3JxZmNyW01BWF9GSUxFUl9JRFggKyAxXTsKLQogdm9pZCBsb2NrX3J4X3FzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYpCiB7CiAJaW50IGkgPSAweDA7CkBAIC04NjgsMjggKzg2NSwyOCBAQAogCiAJcnFmYXItLTsKIAlycWZjciA9IFJRRkNSX0NMRSB8IFJRRkNSX1BJRF9NQVNLIHwgUlFGQ1JfQ01QX0VYQUNUOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKLQlmdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOworCXByaXYtPmZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKIAlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHJxZmFyLCBycWZjciwgcnFmcHIpOwogCiAJcnFmYXItLTsKIAlycWZjciA9IFJRRkNSX0NNUF9OT01BVENIOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKLQlmdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOworCXByaXYtPmZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKIAlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHJxZmFyLCBycWZjciwgcnFmcHIpOwogCiAJcnFmYXItLTsKIAlycWZjciA9IFJRRkNSX0NNUF9FWEFDVCB8IFJRRkNSX1BJRF9QQVJTRSB8IFJRRkNSX0NMRSB8IFJRRkNSX0FORDsKIAlycWZwciA9IGNsYXNzOwotCWZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKLQlmdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CisJcHJpdi0+ZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOworCXByaXYtPmZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKIAlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHJxZmFyLCBycWZjciwgcnFmcHIpOwogCiAJcnFmYXItLTsKIAlycWZjciA9IFJRRkNSX0NNUF9FWEFDVCB8IFJRRkNSX1BJRF9NQVNLIHwgUlFGQ1JfQU5EOwogCXJxZnByID0gY2xhc3M7Ci0JZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKKwlwcml2LT5mdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlyZXR1cm4gcnFmYXI7CkBAIC05MDQsOCArOTAxLDggQEAKIAogCS8qIERlZmF1bHQgcnVsZSAqLwogCXJxZmNyID0gUlFGQ1JfQ01QX01BVENIOwotCWZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKLQlmdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CisJcHJpdi0+ZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOworCXByaXYtPmZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKIAlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHJxZmFyLCBycWZjciwgcnFmcHIpOwogCiAJcnFmYXIgPSBjbHVzdGVyX2VudHJ5X3Blcl9jbGFzcyhwcml2LCBycWZhciwgUlFGUFJfSVBWNik7CkBAIC05MjEsOCArOTE4LDggQEAKIAkvKiBSZXN0IGFyZSBtYXNrZWQgcnVsZXMgKi8KIAlycWZjciA9IFJRRkNSX0NNUF9OT01BVENIOwogCWZvciAoaSA9IDA7IGkgPCBycWZhcjsgaSsrKSB7Ci0JCWZ0cF9ycWZjcltpXSA9IHJxZmNyOwotCQlmdHBfcnFmcHJbaV0gPSBycWZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW2ldID0gcnFmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltpXSA9IHJxZnByOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIGksIHJxZmNyLCBycWZwcik7CiAJfQogfQpAQCAtMjI5Miw2ICsyMjg5LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIENoZWNrIGlmIHJ4IHBhcnNlciBzaG91bGQgYmUgYWN0aXZhdGVkICovCit2b2lkIGdmYXJfY2hlY2tfcnhfcGFyc2VyX21vZGUoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgZ2ZhciBfX2lvbWVtICpyZWdzOworCXUzMiB0ZW1wdmFsOworCisJcmVncyA9IHByaXYtPmdmYXJncnBbMF0ucmVnczsKKworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnJjdHJsKTsKKwkvKiBJZiBwYXJzZSBpcyBubyBsb25nZXIgcmVxdWlyZWQsIHRoZW4gZGlzYWJsZSBwYXJzZXIgKi8KKwlpZiAodGVtcHZhbCAmIFJDVFJMX1JFUV9QQVJTRVIpCisJCXRlbXB2YWwgfD0gUkNUUkxfUFJTREVQX0lOSVQ7CisJZWxzZQorCQl0ZW1wdmFsICY9IH5SQ1RSTF9QUlNERVBfSU5JVDsKKwlnZmFyX3dyaXRlKCZyZWdzLT5yY3RybCwgdGVtcHZhbCk7Cit9CisKIAogLyogRW5hYmxlcyBhbmQgZGlzYWJsZXMgVkxBTiBpbnNlcnRpb24vZXh0cmFjdGlvbiAqLwogc3RhdGljIHZvaWQgZ2Zhcl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0yMzI4LDEyICsyMzQyLDkgQEAKIAkJLyogRGlzYWJsZSBWTEFOIHRhZyBleHRyYWN0aW9uICovCiAJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnJjdHJsKTsKIAkJdGVtcHZhbCAmPSB+UkNUUkxfVkxFWDsKLQkJLyogSWYgcGFyc2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLCB0aGVuIGRpc2FibGUgcGFyc2VyICovCi0JCWlmICh0ZW1wdmFsICYgUkNUUkxfUkVRX1BBUlNFUikKLQkJCXRlbXB2YWwgfD0gUkNUUkxfUFJTREVQX0lOSVQ7Ci0JCWVsc2UKLQkJCXRlbXB2YWwgJj0gflJDVFJMX1BSU0RFUF9JTklUOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5yY3RybCwgdGVtcHZhbCk7CisKKwkJZ2Zhcl9jaGVja19yeF9wYXJzZXJfbW9kZShwcml2KTsKIAl9CiAKIAlnZmFyX2NoYW5nZV9tdHUoZGV2LCBkZXYtPm10dSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmggYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKaW5kZXggZmM4NmY1MS4uNDQwZTY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaApAQCAtOSw3ICs5LDcgQEAKICAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEKICAqIE1vZGlmaWVyOiBTYW5kZWVwIEdvcGFscGV0IDxzYW5kZWVwLmt1bWFyQGZyZWVzY2FsZS5jb20+CiAgKgotICogQ29weXJpZ2h0IDIwMDItMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMDItMjAwOSwgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0yNzQsNyArMjc0LDcgQEAKICNkZWZpbmUgUkNUUkxfUFJPTQkJMHgwMDAwMDAwOAogI2RlZmluZSBSQ1RSTF9FTUVOCQkweDAwMDAwMDAyCiAjZGVmaW5lIFJDVFJMX1JFUV9QQVJTRVIJKFJDVFJMX1ZMRVggfCBSQ1RSTF9JUENTRU4gfCBcCi0JCQkJIFJDVFJMX1RVQ1NFTikKKwkJCQkgUkNUUkxfVFVDU0VOIHwgUkNUUkxfRklMUkVOKQogI2RlZmluZSBSQ1RSTF9DSEVDS1NVTU1JTkcJKFJDVFJMX0lQQ1NFTiB8IFJDVFJMX1RVQ1NFTiB8IFwKIAkJCQlSQ1RSTF9QUlNERVBfSU5JVCkKICNkZWZpbmUgUkNUUkxfRVhUSEFTSAkJKFJDVFJMX0dIVFgpCkBAIC0xMTA3LDEwICsxMTA3LDEyIEBACiAJLyogSFcgdGltZSBzdGFtcGluZyBlbmFibGVkIGZsYWcgKi8KIAlpbnQgaHd0c19yeF9lbjsKIAlpbnQgaHd0c190eF9lbjsKKworCS8qRmlsZXIgdGFibGUqLworCXVuc2lnbmVkIGludCBmdHBfcnFmcHJbTUFYX0ZJTEVSX0lEWCArIDFdOworCXVuc2lnbmVkIGludCBmdHBfcnFmY3JbTUFYX0ZJTEVSX0lEWCArIDFdOwogfTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBmdHBfcnFmcHJbTUFYX0ZJTEVSX0lEWCArIDFdOwotZXh0ZXJuIHVuc2lnbmVkIGludCBmdHBfcnFmY3JbTUFYX0ZJTEVSX0lEWCArIDFdOwogCiBzdGF0aWMgaW5saW5lIGludCBnZmFyX2hhc19lcnJhdGEoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwKIAkJCQkgIGVudW0gZ2Zhcl9lcnJhdGEgZXJyKQpAQCAtMTE1NCw2ICsxMTU2LDcgQEAKIAkJdW5zaWduZWQgbG9uZyB0eF9tYXNrLCB1bnNpZ25lZCBsb25nIHJ4X21hc2spOwogdm9pZCBnZmFyX2luaXRfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgZ2Zhcl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKTsKK2V4dGVybiB2b2lkIGdmYXJfY2hlY2tfcnhfcGFyc2VyX21vZGUoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdik7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ldGh0b29sX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYwppbmRleCA0OTNkNzQzLi4yMzllMzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYwpAQCAtOSw3ICs5LDcgQEAKICAqICBNYWludGFpbmVyOiBLdW1hciBHYWxhCiAgKiAgTW9kaWZpZXI6IFNhbmRlZXAgR29wYWxwZXQgPHNhbmRlZXAua3VtYXJAZnJlZXNjYWxlLmNvbT4KICAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNiwgMjAwOC0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDMtMjAwNiwgMjAwOC0yMDA5LCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0bwogICogIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGluY29ycG9yYXRlZCBoZXJlaW4KQEAgLTYwOSwxNSArNjA5LDE1IEBACiAJaWYgKGV0aGZsb3cgJiBSWEhfTDJEQSkgewogCQlmY3IgPSBSUUZDUl9QSURfREFIIHxSUUZDUl9DTVBfTk9NQVRDSCB8CiAJCQlSUUZDUl9IQVNIIHwgUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAKIAkJZmNyID0gUlFGQ1JfUElEX0RBTCB8IFJRRkNSX0FORCB8IFJRRkNSX0NNUF9OT01BVENIIHwKIAkJCQlSUUZDUl9IQVNIIHwgUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAJfQpAQCAtNjI2LDE2ICs2MjYsMTYgQEAKIAkJZmNyID0gUlFGQ1JfUElEX1ZJRCB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQkJUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsIGZjciwgZnByKTsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAJfQogCiAJaWYgKGV0aGZsb3cgJiBSWEhfSVBfU1JDKSB7CiAJCWZjciA9IFJRRkNSX1BJRF9TSUEgfCBSUUZDUl9DTVBfTk9NQVRDSCB8IFJRRkNSX0hBU0ggfAogCQkJUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAJfQpAQCAtNjQzLDggKzY0Myw4IEBACiAJaWYgKGV0aGZsb3cgJiAoUlhIX0lQX0RTVCkpIHsKIAkJZmNyID0gUlFGQ1JfUElEX0RJQSB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02NTIsOCArNjUyLDggQEAKIAlpZiAoZXRoZmxvdyAmIFJYSF9MM19QUk9UTykgewogCQlmY3IgPSBSUUZDUl9QSURfTDRQIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCVJRRkNSX0FORCB8IFJRRkNSX0hBU0hUQkxfMDsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsIGZjciwgZnByKTsKIAkJcHJpdi0+Y3VyX2ZpbGVyX2lkeCA9IHByaXYtPmN1cl9maWxlcl9pZHggLSAxOwogCX0KQEAgLTY2MSw4ICs2NjEsOCBAQAogCWlmIChldGhmbG93ICYgUlhIX0w0X0JfMF8xKSB7CiAJCWZjciA9IFJRRkNSX1BJRF9TUFQgfCBSUUZDUl9DTVBfTk9NQVRDSCB8IFJRRkNSX0hBU0ggfAogCQkJUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAJfQpAQCAtNjcwLDggKzY3MCw4IEBACiAJaWYgKGV0aGZsb3cgJiBSWEhfTDRfQl8yXzMpIHsKIAkJZmNyID0gUlFGQ1JfUElEX0RQVCB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC03MDUsMTIgKzcwNSwxMiBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfRklMRVJfSURYICsgMTsgaSsrKSB7Ci0JCWxvY2FsX3JxZnByW2pdID0gZnRwX3JxZnByW2ldOwotCQlsb2NhbF9ycWZjcltqXSA9IGZ0cF9ycWZjcltpXTsKKwkJbG9jYWxfcnFmcHJbal0gPSBwcml2LT5mdHBfcnFmcHJbaV07CisJCWxvY2FsX3JxZmNyW2pdID0gcHJpdi0+ZnRwX3JxZmNyW2ldOwogCQlqLS07Ci0JCWlmICgoZnRwX3JxZmNyW2ldID09IChSUUZDUl9QSURfUEFSU0UgfAorCQlpZiAoKHByaXYtPmZ0cF9ycWZjcltpXSA9PSAoUlFGQ1JfUElEX1BBUlNFIHwKIAkJCVJRRkNSX0NMRSB8UlFGQ1JfQU5EKSkgJiYKLQkJCShmdHBfcnFmcHJbaV0gPT0gY21wX3JxZnByKSkKKwkJCShwcml2LT5mdHBfcnFmcHJbaV0gPT0gY21wX3JxZnByKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtNzI0LDIwICs3MjQsMjIgQEAKIAkgKiBpZiBpdCB3YXMgYWxyZWFkeSBwcm9ncmFtbWVkLCB3ZSBuZWVkIHRvIG92ZXJ3cml0ZSB0aGVzZSBydWxlcwogCSAqLwogCWZvciAobCA9IGkrMTsgbCA8IE1BWF9GSUxFUl9JRFg7IGwrKykgewotCQlpZiAoKGZ0cF9ycWZjcltsXSAmIFJRRkNSX0NMRSkgJiYKLQkJCSEoZnRwX3JxZmNyW2xdICYgUlFGQ1JfQU5EKSkgewotCQkJZnRwX3JxZmNyW2xdID0gUlFGQ1JfQ0xFIHwgUlFGQ1JfQ01QX0VYQUNUIHwKKwkJaWYgKChwcml2LT5mdHBfcnFmY3JbbF0gJiBSUUZDUl9DTEUpICYmCisJCQkhKHByaXYtPmZ0cF9ycWZjcltsXSAmIFJRRkNSX0FORCkpIHsKKwkJCXByaXYtPmZ0cF9ycWZjcltsXSA9IFJRRkNSX0NMRSB8IFJRRkNSX0NNUF9FWEFDVCB8CiAJCQkJUlFGQ1JfSEFTSFRCTF8wIHwgUlFGQ1JfUElEX01BU0s7Ci0JCQlmdHBfcnFmcHJbbF0gPSBGUFJfRklMRVJfTUFTSzsKLQkJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgbCwgZnRwX3JxZmNyW2xdLCBmdHBfcnFmcHJbbF0pOworCQkJcHJpdi0+ZnRwX3JxZnByW2xdID0gRlBSX0ZJTEVSX01BU0s7CisJCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIGwsIHByaXYtPmZ0cF9ycWZjcltsXSwKKwkJCQlwcml2LT5mdHBfcnFmcHJbbF0pOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIShmdHBfcnFmY3JbbF0gJiBSUUZDUl9DTEUpICYmIChmdHBfcnFmY3JbbF0gJiBSUUZDUl9BTkQpKQorCQlpZiAoIShwcml2LT5mdHBfcnFmY3JbbF0gJiBSUUZDUl9DTEUpICYmCisJCQkocHJpdi0+ZnRwX3JxZmNyW2xdICYgUlFGQ1JfQU5EKSkKIAkJCWNvbnRpbnVlOwogCQllbHNlIHsKLQkJCWxvY2FsX3JxZnByW2pdID0gZnRwX3JxZnByW2xdOwotCQkJbG9jYWxfcnFmY3Jbal0gPSBmdHBfcnFmY3JbbF07CisJCQlsb2NhbF9ycWZwcltqXSA9IHByaXYtPmZ0cF9ycWZwcltsXTsKKwkJCWxvY2FsX3JxZmNyW2pdID0gcHJpdi0+ZnRwX3JxZmNyW2xdOwogCQkJai0tOwogCQl9CiAJfQpAQCAtNzUwLDggKzc1Miw4IEBACiAKIAkvKiBXcml0ZSBiYWNrIHRoZSBwb3BwZWQgb3V0IHJ1bGVzIGFnYWluICovCiAJZm9yIChrID0gaisxOyBrIDwgTUFYX0ZJTEVSX0lEWDsgaysrKSB7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGxvY2FsX3JxZnByW2tdOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBsb2NhbF9ycWZjcltrXTsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gbG9jYWxfcnFmcHJba107CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGxvY2FsX3JxZmNyW2tdOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsCiAJCQkJbG9jYWxfcnFmY3Jba10sIGxvY2FsX3JxZnByW2tdKTsKIAkJaWYgKCFwcml2LT5jdXJfZmlsZXJfaWR4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ3JldGguYyBiL2RyaXZlcnMvbmV0L2dyZXRoLmMKaW5kZXggZjE4MTMwNC4uNjcyZjA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ3JldGguYworKysgYi9kcml2ZXJzL25ldC9ncmV0aC5jCkBAIC0xMDE1LDExICsxMDE1LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCUdSRVRIX1JFR1NBVkUocmVncy0+ZXNhX21zYiwgZGV2LT5kZXZfYWRkclswXSA8PCA4IHwgZGV2LT5kZXZfYWRkclsxXSk7CisJR1JFVEhfUkVHU0FWRShyZWdzLT5lc2FfbHNiLCBkZXYtPmRldl9hZGRyWzJdIDw8IDI0IHwgZGV2LT5kZXZfYWRkclszXSA8PCAxNiB8CisJCSAgICAgIGRldi0+ZGV2X2FkZHJbNF0gPDwgOCB8IGRldi0+ZGV2X2FkZHJbNV0pOwogCi0JR1JFVEhfUkVHU0FWRShyZWdzLT5lc2FfbXNiLCBhZGRyLT5zYV9kYXRhWzBdIDw8IDggfCBhZGRyLT5zYV9kYXRhWzFdKTsKLQlHUkVUSF9SRUdTQVZFKHJlZ3MtPmVzYV9sc2IsCi0JCSAgICAgIGFkZHItPnNhX2RhdGFbMl0gPDwgMjQgfCBhZGRyLT4KLQkJICAgICAgc2FfZGF0YVszXSA8PCAxNiB8IGFkZHItPnNhX2RhdGFbNF0gPDwgOCB8IGFkZHItPnNhX2RhdGFbNV0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwppbmRleCA5OTIwODk2Li4wZDI4Mzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKQEAgLTQ1Niw3ICs0NTYsNyBAQAogICogYSBibG9jayBvZiA2cGFjayBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAogICogYW5kIHNlbnQgb24gdG8gc29tZSBJUCBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpeHBhY2tfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKK3N0YXRpYyB2b2lkIHNpeHBhY2tfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2l4cGFjayAqc3A7CkBAIC00NjQsMTEgKzQ2NCwxMSBAQAogCWludCBjb3VudDE7CiAKIAlpZiAoIWNvdW50KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJc3AgPSBzcF9nZXQodHR5KTsKIAlpZiAoIXNwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuOwogCiAJbWVtY3B5KGJ1ZiwgY3AsIGNvdW50IDwgc2l6ZW9mKGJ1ZikgPyBjb3VudCA6IHNpemVvZihidWYpKTsKIApAQCAtNDg3LDggKzQ4Nyw2IEBACiAKIAlzcF9wdXQoc3ApOwogCXR0eV91bnRocm90dGxlKHR0eSk7Ci0KLQlyZXR1cm4gY291bnQxOwogfQogCiAvKgpAQCAtNjk0LDEwICs2OTIsMTAgQEAKIHsKIAlzdHJ1Y3Qgc2l4cGFjayAqc3A7CiAKLQl3cml0ZV9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmZGlzY19kYXRhX2xvY2spOwogCXNwID0gdHR5LT5kaXNjX2RhdGE7CiAJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwotCXdyaXRlX3VubG9jaygmZGlzY19kYXRhX2xvY2spOworCXdyaXRlX3VubG9ja19iaCgmZGlzY19kYXRhX2xvY2spOwogCWlmICghc3ApCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKaW5kZXggMGU0ZjIzNS4uYmMwMjk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCkBAIC04MTMsMTAgKzgxMywxMCBAQAogewogCXN0cnVjdCBta2lzcyAqYXg7CiAKLQl3cml0ZV9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmZGlzY19kYXRhX2xvY2spOwogCWF4ID0gdHR5LT5kaXNjX2RhdGE7CiAJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwotCXdyaXRlX3VubG9jaygmZGlzY19kYXRhX2xvY2spOworCXdyaXRlX3VubG9ja19iaCgmZGlzY19kYXRhX2xvY2spOwogCiAJaWYgKCFheCkKIAkJcmV0dXJuOwpAQCAtOTIzLDE0ICs5MjMsMTMgQEAKICAqIGEgYmxvY2sgb2YgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKICAqIGFuZCBzZW50IG9uIHRvIHRoZSBBWC4yNSBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG1raXNzX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgbWtpc3NfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgbWtpc3MgKmF4ID0gbWtpc3NfZ2V0KHR0eSk7Ci0JaW50IGJ5dGVzID0gY291bnQ7CiAKIAlpZiAoIWF4KQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuOwogCiAJLyoKIAkgKiBBcmdoISBtdHUgY2hhbmdlIHRpbWUhIC0gY29zdHMgdXMgdGhlIHBhY2tldCBwYXJ0IHJlY2VpdmVkCkBAIC05NDAsNyArOTM5LDcgQEAKIAkJYXhfY2hhbmdlZG10dShheCk7CiAKIAkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCi0Jd2hpbGUgKGJ5dGVzLS0pIHsKKwl3aGlsZSAoY291bnQtLSkgewogCQlpZiAoZnAgIT0gTlVMTCAmJiAqZnArKykgewogCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEFYRl9FUlJPUiwgJmF4LT5mbGFncykpCiAJCQkJYXgtPmRldi0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC05NTMsOCArOTUyLDYgQEAKIAogCW1raXNzX3B1dChheCk7CiAJdHR5X3VudGhyb3R0bGUodHR5KTsKLQotCXJldHVybiBjb3VudDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwMTAwLmMgYi9kcml2ZXJzL25ldC9ocDEwMC5jCmluZGV4IGM1MmExZGYuLmMzZWNiMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtMTg4LDE0ICsxODgsMTQgQEAKICAqICB2YXJpYWJsZXMKICAqLwogI2lmZGVmIENPTkZJR19JU0EKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBocDEwMF9pc2FfdGJsW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqaHAxMDBfaXNhX3RibFtdID0gewogCSJIV1BGMTUwIiwgLyogSFAgSjI1NzMgcmV2IEEgKi8KIAkiSFdQMTk1MCIsIC8qIEhQIEoyNTczICovCiB9OwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRUlTQQotc3RhdGljIGNvbnN0IHN0cnVjdCBlaXNhX2RldmljZV9pZCBocDEwMF9laXNhX3RibFtdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBocDEwMF9laXNhX3RibFtdID0gewogCXsgIkhXUEYxODAiIH0sIC8qIEhQIEoyNTc3IHJldiBBICovCiAJeyAiSFdQMTkyMCIgfSwgLyogSFAgMjcyNDhCICovCiAJeyAiSFdQMTk0MCIgfSwgLyogSFAgSjI1NzcgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0lTQQotc3RhdGljIF9fZGV2aW5pdCBpbnQgaHAxMDBfaXNhX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQorc3RhdGljIF9faW5pdCBpbnQgaHAxMDBfaXNhX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQogewogCWNvbnN0IGNoYXIgKnNpZzsKIAlpbnQgaTsKQEAgLTM3Miw3ICszNzIsNyBAQAogICogRUlTQSBhbmQgUENJIGFyZSBoYW5kbGVkIGJ5IGRldmljZSBpbmZyYXN0cnVjdHVyZS4KICAqLwogCi1zdGF0aWMgaW50ICBfX2RldmluaXQgaHAxMDBfaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyKQorc3RhdGljIGludCAgX19pbml0IGhwMTAwX2lzYV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkcikKIHsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIApAQCAtMzk2LDcgKzM5Niw3IEBACiAjZW5kaWYgLyogQ09ORklHX0lTQSAqLwogCiAjaWYgIWRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19JU0EpCi1zdHJ1Y3QgbmV0X2RldmljZSAqIF9fZGV2aW5pdCBocDEwMF9wcm9iZShpbnQgdW5pdCkKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGhwMTAwX3Byb2JlKGludCB1bml0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwMTAwX3ByaXZhdGUpKTsKIAlpbnQgZXJyOwpAQCAtMTU4MCwxMiArMTU4MCwxMiBAQAogCWhwMTAwX291dGwocmluZ3B0ci0+cGRsX3BhZGRyLCBUWF9QREFfTCk7CS8qIExvdyBQcmlvLiBRdWV1ZSAqLwogCiAJbHAtPnR4cmNvbW1pdCsrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CiAKLQkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLwogCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZHJvcDoKQEAgLTI4NDMsNyArMjg0Myw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfRUlTQQotc3RhdGljIGludCBfX2RldmluaXQgaHAxMDBfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQorc3RhdGljIGludCBfX2luaXQgaHAxMDBfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwMTAwX3ByaXZhdGUpKTsKIAlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSB0b19laXNhX2RldmljZShnZW5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHBsYW5jZS5jIGIvZHJpdmVycy9uZXQvaHBsYW5jZS5jCmluZGV4IGI2MDYwZjcuLmE5MDBkNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9ocGxhbmNlLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogfQogCiAvKiBJbml0aWFsaXNlIGEgc2luZ2xlIGxhbmNlIGJvYXJkIGF0IHRoZSBnaXZlbiBESU8gZGV2aWNlICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaHBsYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkaW9fZGV2ICpkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGhwbGFuY2VfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGlvX2RldiAqZCkKIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyB2YSA9IChkLT5yZXNvdXJjZS5zdGFydCArIERJT19WSVJBRERSQkFTRSk7CiAgICAgICAgIHN0cnVjdCBocGxhbmNlX3ByaXZhdGUgKmxwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtbGFuYS5jIGIvZHJpdmVycy9uZXQvaWJtbGFuYS5jCmluZGV4IDEzNmQ3NTQuLmE3ZDZjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libWxhbmEuYworKysgYi9kcml2ZXJzL25ldC9pYm1sYW5hLmMKQEAgLTg5NSwxMiArODk1LDEyIEBACiBzdGF0aWMgaW50IGlibWxhbmFfaW87CiBzdGF0aWMgaW50IHN0YXJ0c2xvdDsJCS8qIGNvdW50cyB0aHJvdWdoIHNsb3RzIHdoZW4gcHJvYmluZyBtdWx0aXBsZSBkZXZpY2VzICovCiAKLXN0YXRpYyBjb25zdCBzaG9ydCBpYm1sYW5hX2FkYXB0ZXJfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc2hvcnQgaWJtbGFuYV9hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJSUJNX0xBTkFfSUQsCiAJMHgwMDAwCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaWJtbGFuYV9hZGFwdGVyX25hbWVzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgY2hhciAqaWJtbGFuYV9hZGFwdGVyX25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKIAkiSUJNIExBTiBBZGFwdGVyL0EiLAogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCmluZGV4IDE4ZmNjZjkuLjJjMjg2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCkBAIC0yMzczLDYgKzIzNzMsOSBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfUENJX0lPViAqLwogCWFkYXB0ZXItPnJzc19xdWV1ZXMgPSBtaW5fdCh1MzIsIElHQl9NQVhfUlhfUVVFVUVTLCBudW1fb25saW5lX2NwdXMoKSk7CisJLyogaTM1MCBjYW5ub3QgZG8gUlNTIGFuZCBTUi1JT1YgYXQgdGhlIHNhbWUgdGltZSAqLworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfaTM1MCAmJiBhZGFwdGVyLT52ZnNfYWxsb2NhdGVkX2NvdW50KQorCQlhZGFwdGVyLT5yc3NfcXVldWVzID0gMTsKIAogCS8qCiAJICogaWYgcnNzX3F1ZXVlcyA+IDQgb3IgdmZzIGFyZSBnb2luZyB0byBiZSBhbGxvY2F0ZWQgd2l0aCByc3NfcXVldWVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYwppbmRleCAwMzU4NjFkLi4zMzUyYjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKQEAgLTIxNiwyMyArMjE2LDIzIEBACiAgKiB1c2JzZXJpYWw6CXVyYi1jb21wbGV0ZS1pbnRlcnJ1cHQgLyBzb2Z0aW50CiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBpcnR0eV9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGlydHR5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJICAgICAgY2hhciAqZnAsIGludCBjb3VudCkgCiB7CiAJc3RydWN0IHNpcl9kZXYgKmRldjsKIAlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CiAJaW50CWk7CiAKLQlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybiAtRU5PREVWOyk7Ci0JSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtRUlOVkFMOyk7CisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuOyk7CiAKIAlpZiAodW5saWtlbHkoY291bnQ9PTApKQkJLyogeWVzLCB0aGlzIGhhcHBlbnMgKi8KLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCWRldiA9IHByaXYtPmRldjsKIAlpZiAoIWRldikgewogCQlJUkRBX1dBUk5JTkcoIiVzKCksIG5vdCByZWFkeSB5ZXQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTI0MiwxMyArMjQyLDExIEBACiAgCQlpZiAoZnAgJiYgKmZwKyspIHsgCiAJCQlJUkRBX0RFQlVHKDAsICJGcmFtaW5nIG9yIHBhcml0eSBlcnJvciFcbiIpOwogCQkJc2lyZGV2X3JlY2VpdmUoZGV2LCBOVUxMLCAwKTsJLyogbm90aWZ5IHNpcl9kZXYgKHVwZGF0aW5nIHN0YXRzKSAqLwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm47CiAgCQl9CiAJfQogCiAJc2lyZGV2X3JlY2VpdmUoZGV2LCBjcCwgY291bnQpOwotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYwppbmRleCA2OWI1NzA3Li44ODAwZTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYwpAQCAtMjIyLDE5ICsyMjIsMTkgQEAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiAKIC8qIFByb2JpbmcgKi8KLXN0YXRpYyBpbnQgc21zY19pcmNjX2xvb2tfZm9yX2NoaXBzKHZvaWQpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKiBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHU4IHJlZywgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcCwgY2hhciAqdHlwZSk7Ci1zdGF0aWMgaW50IHNtc2Nfc3VwZXJpb19mbGF0KGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7Ci1zdGF0aWMgaW50IHNtc2Nfc3VwZXJpb19wYWdlZChjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpOwotc3RhdGljIGludCBzbXNjX3N1cGVyaW9fZmRjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKTsKLXN0YXRpYyBpbnQgc21zY19zdXBlcmlvX2xwYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2NfbG9va19mb3JfY2hpcHModm9pZCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHU4IHJlZywgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcCwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmRjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19scGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOwogI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBpbnQgcHJlY29uZmlndXJlX3Ntc2NfY2hpcChzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mKTsKLXN0YXRpYyBpbnQgcHJlY29uZmlndXJlX3Rocm91Z2hfODI4MDEoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbiAqY29uZik7Ci1zdGF0aWMgdm9pZCBwcmVjb25maWd1cmVfYWxpX3BvcnQoc3RydWN0IHBjaV9kZXYgKmRldiwKK3N0YXRpYyBpbnQgX19pbml0IHByZWNvbmZpZ3VyZV9zbXNjX2NoaXAoc3RydWN0IHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbiAqY29uZik7CitzdGF0aWMgaW50IF9faW5pdCBwcmVjb25maWd1cmVfdGhyb3VnaF84MjgwMShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mKTsKK3N0YXRpYyB2b2lkIF9faW5pdCBwcmVjb25maWd1cmVfYWxpX3BvcnQoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJIHVuc2lnbmVkIHNob3J0IHBvcnQpOwotc3RhdGljIGludCBwcmVjb25maWd1cmVfdGhyb3VnaF9hbGkoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbiAqY29uZik7Ci1zdGF0aWMgaW50IHNtc2NfaXJjY19wcmVjb25maWd1cmVfc3Vic3lzdGVtcyh1bnNpZ25lZCBzaG9ydCBpcmNjX2NmZywKK3N0YXRpYyBpbnQgX19pbml0IHByZWNvbmZpZ3VyZV90aHJvdWdoX2FsaShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19wcmVjb25maWd1cmVfc3Vic3lzdGVtcyh1bnNpZ25lZCBzaG9ydCBpcmNjX2NmZywKIAkJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBpcmNjX2ZpciwKIAkJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBpcmNjX3NpciwKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIGlyY2NfZG1hLApAQCAtMzY2LDcgKzM2Niw3IEBACiB9CiAKIC8qIFBOUCBob3RwbHVnIHN1cHBvcnQgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBzbXNjX2lyY2NfcG5wX3RhYmxlW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgc21zY19pcmNjX3BucF90YWJsZVtdID0gewogCXsgLmlkID0gIlNNQ2YwMTAiLCAuZHJpdmVyX2RhdGEgPSAwIH0sCiAJLyogYW5kIHByZXN1bWFibHkgb3RoZXJzICovCiAJeyB9CkBAIC01MTUsNyArNTE1LDcgQEAKICAqICAgIFRyeSB0byBvcGVuIGRyaXZlciBpbnN0YW5jZQogICoKICAqLwotc3RhdGljIGludCBfX2RldmluaXQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIHU4IGRtYSwgdTggaXJxKQorc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIHU4IGRtYSwgdTggaXJxKQogewogCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTIyNzMsNyArMjI3Myw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2RldmluaXQgc21zY19hY2Nlc3ModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHVuc2lnbmVkIGNoYXIgcmVnKQorc3RhdGljIGludCBfX2luaXQgc21zY19hY2Nlc3ModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHVuc2lnbmVkIGNoYXIgcmVnKQogewogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTIyODEsNyArMjI4MSw3IEBACiAJcmV0dXJuIGluYihjZmdfYmFzZSkgIT0gcmVnID8gLTEgOiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqIF9fZGV2aW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHU4IHJlZywgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcCwgY2hhciAqdHlwZSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdTggcmVnLCBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwLCBjaGFyICp0eXBlKQogewogCXU4IGRldmlkLCB4ZGV2aWQsIHJldjsKIApAQCAtMjQwNiw3ICsyNDA2LDcgQEAKICNpZmRlZiBDT05GSUdfUENJCiAjZGVmaW5lIFBDSUlEX1ZFTkRPUl9JTlRFTCAweDgwODYKICNkZWZpbmUgUENJSURfVkVORE9SX0FMSSAweDEwYjkKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uIHN1YnN5c3RlbV9jb25maWd1cmF0aW9uc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb25zW10gX19pbml0ZGF0YSA9IHsKIAkvKgogCSAqIFN1YnN5c3RlbXMgbmVlZGluZyBlbnRyaWVzOgogCSAqIDB4MTBiOToweDE1MzMgMHgxMDNjOjB4MDg1MCBIUCBueDkwMTAgZmFtaWx5CkBAIC0yNTMyLDcgKzI1MzIsNyBAQAogICogKEZJUiBwb3J0LCBTSVIgcG9ydCwgRklSIERNQSwgRklSIElSUSkKICAqIHRocm91Z2ggdGhlIGNoaXAgY29uZmlndXJhdGlvbiBwb3J0LgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwcmVjb25maWd1cmVfc21zY19jaGlwKHN0cnVjdAorc3RhdGljIGludCBfX2luaXQgcHJlY29uZmlndXJlX3Ntc2NfY2hpcChzdHJ1Y3QKIAkJCQkJIHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbgogCQkJCQkgKmNvbmYpCiB7CkBAIC0yNjMzLDcgKzI2MzMsNyBAQAogICogb3IgSW50ZWwgODI4MDFEQi9EQkwgKElDSDQvSUNINC1MKSBMUEMgSW50ZXJmYWNlIEJyaWRnZS4KICAqIFRoZXkgYWxsIHdvcmsgdGhlIHNhbWUgd2F5IQogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwcmVjb25maWd1cmVfdGhyb3VnaF84MjgwMShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorc3RhdGljIGludCBfX2luaXQgcHJlY29uZmlndXJlX3Rocm91Z2hfODI4MDEoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJICAgICBzdHJ1Y3QKIAkJCQkJICAgICBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24KIAkJCQkJICAgICAqY29uZikKQEAgLTI3ODYsNyArMjc4Niw3IEBACiAgKiBUaGlzIGlzIGJhc2VkIG9uIHJldmVyc2UtZW5naW5lZXJpbmcgc2luY2UgQUxpIGRvZXMgbm90CiAgKiBwcm92aWRlIGFueSBkYXRhIHNoZWV0IGZvciB0aGUgMTUzMyBjaGlwLgogICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcHJlY29uZmlndXJlX2FsaV9wb3J0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCitzdGF0aWMgdm9pZCBfX2luaXQgcHJlY29uZmlndXJlX2FsaV9wb3J0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQkJCSB1bnNpZ25lZCBzaG9ydCBwb3J0KQogewogCXVuc2lnbmVkIGNoYXIgcmVnOwpAQCAtMjgyNCw3ICsyODI0LDcgQEAKIAlJUkRBX01FU1NBR0UoIkFjdGl2YXRlZCBBTGkgMTUzMyBJU0EgYnJpZGdlIHBvcnQgMHglMDR4LlxuIiwgcG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHByZWNvbmZpZ3VyZV90aHJvdWdoX2FsaShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorc3RhdGljIGludCBfX2luaXQgcHJlY29uZmlndXJlX3Rocm91Z2hfYWxpKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQkJCSAgIHN0cnVjdAogCQkJCQkgICBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24KIAkJCQkJICAgKmNvbmYpCkBAIC0yODM3LDcgKzI4MzcsNyBAQAogCXJldHVybiBwcmVjb25maWd1cmVfc21zY19jaGlwKGNvbmYpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbXNjX2lyY2NfcHJlY29uZmlndXJlX3N1YnN5c3RlbXModW5zaWduZWQgc2hvcnQgaXJjY19jZmcsCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2NfcHJlY29uZmlndXJlX3N1YnN5c3RlbXModW5zaWduZWQgc2hvcnQgaXJjY19jZmcsCiAJCQkJCQkgICAgdW5zaWduZWQgc2hvcnQgaXJjY19maXIsCiAJCQkJCQkgICAgdW5zaWduZWQgc2hvcnQgaXJjY19zaXIsCiAJCQkJCQkgICAgdW5zaWduZWQgY2hhciBpcmNjX2RtYSwKQEAgLTI4NDksNyArMjg0OSw3IEBACiAJaW50IHJldCA9IDA7CiAKIAlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQljb25zdCBzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mOworCQlzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mOwogCiAJCS8qCiAJCSAqIENhY2hlIHRoZSBzdWJzeXN0ZW0gdmVuZG9yL2RldmljZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2tzODg0Mi5jIGIvZHJpdmVycy9uZXQva3M4ODQyLmMKaW5kZXggNGQ0MDYyNi4uZmMxMmFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQva3M4ODQyLmMKKysrIGIvZHJpdmVycy9uZXQva3M4ODQyLmMKQEAgLTY2MSw3ICs2NjEsNyBAQAogCiAJLyogY2hlY2sgdGhlIHN0YXR1cyAqLwogCWlmICgoc3RhdHVzICYgUlhTUl9WQUxJRCkgJiYgIShzdGF0dXMgJiBSWFNSX0VSUk9SKSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXRkZXYsIGxlbik7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgbGVuICsgMyk7CiAKIAkJaWYgKHNrYikgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggYjc4YmUwOC4uNjBmNDZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiBtb2R1bGVfcGFyYW0obXR1LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShkc3BjZmdfd29ya2Fyb3VuZCwgaW50LCAxKTsKK21vZHVsZV9wYXJhbShkc3BjZmdfd29ya2Fyb3VuZCwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOwogbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtdHUsICJEUDgzODF4IE1UVSAoYWxsIGJvYXJkcykiKTsKQEAgLTIwMjgsOCArMjAyOCw4IEBACiAJCW5wLT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMgPSAwOwogCQlucC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KIAkJaWYgKG5wLT5yeF9za2J1ZmZbaV0pIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCi0JCQkJbnAtPnJ4X2RtYVtpXSwgYnVmbGVuLAorCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnJ4X2RtYVtpXSwKKwkJCQlidWZsZW4gKyBOQVRTRU1JX1BBRERJTkcsCiAJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCWRldl9rZnJlZV9za2IobnAtPnJ4X3NrYnVmZltpXSk7CiAJCX0KQEAgLTIzNjAsNyArMjM2MCw4IEBACiAJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQl9IGVsc2UgewogCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9kbWFbZW50cnldLAotCQkJCQlidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCQkgYnVmbGVuICsgTkFUU0VNSV9QQURESU5HLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQkJc2tiX3B1dChza2IgPSBucC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CiAJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUzMjEwLmMgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwppbmRleCBlODk4NGIwYy4uMjQzZWQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUzMjEwLmMKKysrIGIvZHJpdmVycy9uZXQvbmUzMjEwLmMKQEAgLTgwLDIwICs4MCwxNyBAQAogCiAjZGVmaW5lIE5FMzIxMF9ERUJVRwkweDAKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaXJxX21hcFtdIF9fZGV2aW5pdGNvbnN0ID0KLQl7IDE1LCAxMiwgMTEsIDEwLCA5LCA3LCA1LCAzIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNobWVtX21hcFtdIF9fZGV2aW5pdGNvbnN0ID0KLQl7IDB4ZmYwLCAweGZlMCwgMHhmZmYwLCAweGQ4LCAweGZmZTAsIDB4ZmZjMCwgMHhkMCwgMHgwIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaWZtYXBbXSBfX2RldmluaXRjb25zdCA9Ci0JeyAiVVRQIiwgIj8iLCAiQk5DIiwgIkFVSSIgfTsKLXN0YXRpYyBjb25zdCBpbnQgaWZtYXBfdmFsW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFfbWFwW10gX19pbml0ZGF0YSA9IHsxNSwgMTIsIDExLCAxMCwgOSwgNywgNSwgM307CitzdGF0aWMgdW5zaWduZWQgaW50IHNobWVtX21hcFtdIF9faW5pdGRhdGEgPSB7MHhmZjAsIDB4ZmUwLCAweGZmZjAsIDB4ZDgsIDB4ZmZlMCwgMHhmZmMwLCAweGQwLCAweDB9Oworc3RhdGljIGNvbnN0IGNoYXIgKmlmbWFwW10gX19pbml0ZGF0YSA9IHsiVVRQIiwgIj8iLCAiQk5DIiwgIkFVSSJ9Oworc3RhdGljIGludCBpZm1hcF92YWxbXSBfX2luaXRkYXRhID0gewogCQlJRl9QT1JUXzEwQkFTRVQsCiAJCUlGX1BPUlRfVU5LTk9XTiwKIAkJSUZfUE9SVF8xMEJBU0UyLAogCQlJRl9QT1JUX0FVSSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG5lMzIxMF9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IF9faW5pdCBuZTMyMTBfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCXVuc2lnbmVkIGxvbmcgaW9hZGRyLCBwaHlzX21lbTsKIAlpbnQgaSwgcmV0dmFsLCBwb3J0X2luZGV4OwpAQCAtMzE2LDcgKzMxMyw3IEBACiAJbWVtY3B5X3RvaW8oc2htZW0sIGJ1ZiwgY291bnQpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVpc2FfZGV2aWNlX2lkIG5lMzIxMF9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgbmUzMjEwX2lkc1tdID0gewogCXsgIkVHTDAxMDEiIH0sCiAJeyAiTlZMMTgwMSIgfSwKIAl7ICIiIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKaW5kZXggYjY0NDM4My4uYzA3ODhhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpAQCAtMTk2NSwxMSArMTk2NSwxMSBAQAogCiAJbmV0eGVuX3Rzb19jaGVjayhuZXRkZXYsIHR4X3JpbmcsIGZpcnN0X2Rlc2MsIHNrYik7CiAKLQluZXR4ZW5fbmljX3VwZGF0ZV9jbWRfcHJvZHVjZXIoYWRhcHRlciwgdHhfcmluZyk7Ci0KIAlhZGFwdGVyLT5zdGF0cy50eGJ5dGVzICs9IHNrYi0+bGVuOwogCWFkYXB0ZXItPnN0YXRzLnhtaXRjYWxsZWQrKzsKIAorCW5ldHhlbl9uaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihhZGFwdGVyLCB0eF9yaW5nKTsKKwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIGRyb3BfcGFja2V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwppbmRleCAzOTJhNmM0Li5hNzAyNDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwpAQCAtNTgsNiArNTgsNyBAQAogCiBjb25maWcgQkNNNjNYWF9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gNjN4eCBTT0NzIGludGVybmFsIFBIWSIKKwlkZXBlbmRzIG9uIEJDTTYzWFgKIAktLS1oZWxwLS0tCiAJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIDYzNDggYW5kIDYzNTggUEhZcy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYyBiL2RyaXZlcnMvbmV0L3BoeS9kcDgzNjQwLmMKaW5kZXggYjBjOTUyMi4uMmNkOGRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYworKysgYi9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jCkBAIC01NDMsMTEgKzU0MywyMCBAQAogCiAvKiB0aW1lIHN0YW1waW5nIG1ldGhvZHMgKi8KIAotc3RhdGljIHZvaWQgZGVjb2RlX2V2bnQoc3RydWN0IGRwODM2NDBfcHJpdmF0ZSAqZHA4MzY0MCwKLQkJCXN0cnVjdCBwaHlfdHh0cyAqcGh5X3R4dHMsIHUxNiBlc3RzKQorc3RhdGljIGludCBkZWNvZGVfZXZudChzdHJ1Y3QgZHA4MzY0MF9wcml2YXRlICpkcDgzNjQwLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdTE2IGVzdHMpCiB7CisJc3RydWN0IHBoeV90eHRzICpwaHlfdHh0czsKIAlzdHJ1Y3QgcHRwX2Nsb2NrX2V2ZW50IGV2ZW50OwogCWludCB3b3JkcyA9IChlc3RzID4+IEVWTlRfVFNfTEVOX1NISUZUKSAmIEVWTlRfVFNfTEVOX01BU0s7CisJdTE2IGV4dF9zdGF0dXMgPSAwOworCisJaWYgKGVzdHMgJiBNVUxUX0VWTlQpIHsKKwkJZXh0X3N0YXR1cyA9ICoodTE2ICopIGRhdGE7CisJCWRhdGEgKz0gc2l6ZW9mKGV4dF9zdGF0dXMpOworCX0KKworCXBoeV90eHRzID0gZGF0YTsKIAogCXN3aXRjaCAod29yZHMpIHsgLyogZmFsbCB0aHJvdWdoIGluIGV2ZXJ5IGNhc2UgKi8KIAljYXNlIDM6CkBAIC01NjUsNiArNTc0LDkgQEAKIAlldmVudC50aW1lc3RhbXAgPSBwaHkydHh0cygmZHA4MzY0MC0+ZWRhdGEpOwogCiAJcHRwX2Nsb2NrX2V2ZW50KGRwODM2NDAtPmNsb2NrLT5wdHBfY2xvY2ssICZldmVudCk7CisKKwl3b3JkcyA9IGV4dF9zdGF0dXMgPyB3b3JkcyArIDIgOiB3b3JkcyArIDE7CisJcmV0dXJuIHdvcmRzICogc2l6ZW9mKHUxNik7CiB9CiAKIHN0YXRpYyB2b2lkIGRlY29kZV9yeHRzKHN0cnVjdCBkcDgzNjQwX3ByaXZhdGUgKmRwODM2NDAsCkBAIC02NDMsOSArNjU1LDcgQEAKIAogCQl9IGVsc2UgaWYgKFBTRl9FVk5UID09IHR5cGUgJiYgbGVuID49IHNpemVvZigqcGh5X3R4dHMpKSB7CiAKLQkJCXBoeV90eHRzID0gKHN0cnVjdCBwaHlfdHh0cyAqKSBwdHI7Ci0JCQlkZWNvZGVfZXZudChkcDgzNjQwLCBwaHlfdHh0cywgZXN0cyk7Ci0JCQlzaXplID0gc2l6ZW9mKCpwaHlfdHh0cyk7CisJCQlzaXplID0gZGVjb2RlX2V2bnQoZHA4MzY0MCwgcHRyLCBlc3RzKTsKIAogCQl9IGVsc2UgewogCQkJc2l6ZSA9IDA7CkBAIC0xMDM0LDggKzEwNDQsOCBAQAogCiAJaWYgKGlzX3N0YXR1c19mcmFtZShza2IsIHR5cGUpKSB7CiAJCWRlY29kZV9zdGF0dXNfZnJhbWUoZHA4MzY0MCwgc2tiKTsKLQkJLyogTGV0IHRoZSBzdGFjayBkcm9wIHRoaXMgZnJhbWUuICovCi0JCXJldHVybiBmYWxzZTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiB0cnVlOwogCX0KIAogCVNLQl9QVFBfVFlQRShza2IpID0gdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jIGIvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMKaW5kZXggNTM4NzJkNy4uYzU1NGEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMKQEAgLTM0MCw3ICszNDAsNyBAQAogfQogCiAvKiBNYXkgc2xlZXAsIGRvbid0IGNhbGwgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwgb3Igd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50CitzdGF0aWMgdm9pZAogcHBwX2FzeW5jdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAogCQkgIGNoYXIgKmNmbGFncywgaW50IGNvdW50KQogewpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghYXApCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKIAlwcHBfYXN5bmNfaW5wdXQoYXAsIGJ1ZiwgY2ZsYWdzLCBjb3VudCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwpAQCAtMzU2LDggKzM1Niw2IEBACiAJCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOwogCWFwX3B1dChhcCk7CiAJdHR5X3VudGhyb3R0bGUodHR5KTsKLQotCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUyNSw3ICs1MjMsNyBAQAogI2RlZmluZSBQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCkJZG8gewkJXAogCWlmICgoaXNsY3AgJiYgYyA8IDB4MjApIHx8IChhcC0+eGFjY21bYyA+PiA1XSAmICgxIDw8IChjICYgMHgxZikpKSkge1wKIAkJKmJ1ZisrID0gUFBQX0VTQ0FQRTsJCQlcCi0JCSpidWYrKyA9IGMgXiAweDIwOwkJCVwKKwkJKmJ1ZisrID0gYyBeIFBQUF9UUkFOUzsJCQlcCiAJfSBlbHNlCQkJCQkJXAogCQkqYnVmKysgPSBjOwkJCQlcCiB9IHdoaWxlICgwKQpAQCAtODk4LDcgKzg5Niw3IEBACiAJCQkJc3AgPSBza2JfcHV0KHNrYiwgbik7CiAJCQkJbWVtY3B5KHNwLCBidWYsIG4pOwogCQkJCWlmIChhcC0+c3RhdGUgJiBTQ19FU0NBUEUpIHsKLQkJCQkJc3BbMF0gXj0gMHgyMDsKKwkJCQkJc3BbMF0gXj0gUFBQX1RSQU5TOwogCQkJCQlhcC0+c3RhdGUgJj0gflNDX0VTQ0FQRTsKIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jIGIvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYwppbmRleCAzMWU5NDA3Li4xZGJkZjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogCiAJaWYgKHN0YXRlKSB7CiAJCXpsaWJfaW5mbGF0ZUVuZCgmc3RhdGUtPnN0cm0pOwotCQlrZnJlZShzdGF0ZS0+c3RybS53b3Jrc3BhY2UpOworCQl2ZnJlZShzdGF0ZS0+c3RybS53b3Jrc3BhY2UpOwogCQlrZnJlZShzdGF0ZSk7CiAJfQogfQpAQCAtMzQ1LDggKzM0NSw3IEBACiAKIAlzdGF0ZS0+d19zaXplICAgICAgICAgPSB3X3NpemU7CiAJc3RhdGUtPnN0cm0ubmV4dF9vdXQgID0gTlVMTDsKLQlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksCi0JCQkJCUdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOwogCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKaW5kZXggMDgxNTc5MC4uMjU3M2Y1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYworKysgYi9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCkBAIC0zODEsNyArMzgxLDcgQEAKIH0KIAogLyogTWF5IHNsZWVwLCBkb24ndCBjYWxsIGZyb20gaW50ZXJydXB0IGxldmVsIG9yIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLwotc3RhdGljIHVuc2lnbmVkIGludAorc3RhdGljIHZvaWQKIHBwcF9zeW5jX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAogCQkgIGNoYXIgKmNmbGFncywgaW50IGNvdW50KQogewpAQCAtMzg5LDcgKzM4OSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghYXApCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKIAlwcHBfc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CkBAIC0zOTcsOCArMzk3LDYgQEAKIAkJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CiAJc3BfcHV0KGFwKTsKIAl0dHlfdW50aHJvdHRsZSh0dHkpOwotCi0JcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jIGIvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jCmluZGV4IDg5Zjc1NDAuLjVmNTk3Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3B4YTE2OF9ldGguYworKysgYi9kcml2ZXJzL25ldC9weGExNjhfZXRoLmMKQEAgLTEyNzMsNyArMTI3Myw3IEBACiAJd21iKCk7CiAJd3JsKHBlcCwgU0RNQV9DTUQsIFNETUFfQ01EX1RYREggfCBTRE1BX0NNRF9FUkQpOwogCi0Jc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXN0YXRzLT50eF9ieXRlcyArPSBsZW5ndGg7CiAJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlpZiAocGVwLT50eF9yaW5nX3NpemUgLSBwZXAtPnR4X2Rlc2NfY291bnQgPD0gMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19ody5jIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19ody5jCmluZGV4IGU5NjU2NjEuLmE1ZDlmYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2h3LmMKQEAgLTE0MDYsNiArMTQwNiw3IEBACiAKIAlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcXVlLT5ub19vcHM7IGxvb3ArKykgewogCQlRTENOSUNfV1JfRFVNUF9SRUcocXVlLT5zZWxfYWRkciwgYmFzZSwgcXVlX2lkKTsKKwkJYWRkciA9IHF1ZS0+cmVhZF9hZGRyOwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKIAkJCVFMQ05JQ19SRF9EVU1QX1JFRyhhZGRyLCBiYXNlLCAmZGF0YSk7CiAJCQkqYnVmZmVyKysgPSBjcHVfdG9fbGUzMihkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMKaW5kZXggM2FiN2QyYy4uMGY2YWY1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMKQEAgLTIxNTksNiArMjE1OSw3IEBACiAKIAluZiA9ICZwYnVmLT5mcmFnX2FycmF5WzBdOwogCXBjaV91bm1hcF9zaW5nbGUocGRldiwgbmYtPmRtYSwgc2tiX2hlYWRsZW4oc2tiKSwgUENJX0RNQV9UT0RFVklDRSk7CisJcGJ1Zi0+c2tiID0gTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaCBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCmluZGV4IGQzMjg1MDcuLmNhMzA2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCkBAIC0xNiw3ICsxNiw3IEBACiAgKi8KICNkZWZpbmUgRFJWX05BTUUgIAkicWxnZSIKICNkZWZpbmUgRFJWX1NUUklORyAJIlFMb2dpYyAxMCBHaWdhYml0IFBDSS1FIEV0aGVybmV0IERyaXZlciAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSJ2MS4wMC4wMC4yNy4wMC4wMC0wMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JInYxLjAwLjAwLjI5LjAwLjAwLTAxIgogCiAjZGVmaW5lIFdRX0FERFJfQUxJR04JMHgzCS8qIDQgYnl0ZSBhbGlnbm1lbnQgKi8KIApAQCAtMTk5Niw2ICsxOTk2LDcgQEAKIAlRTF9MQl9MSU5LX1VQID0gMTAsCiAJUUxfRlJDX0NPUkVEVU1QID0gMTEsCiAJUUxfRUVIX0ZBVEFMID0gMTIsCisJUUxfQVNJQ19SRUNPVkVSWSA9IDE0LCAvKiBXZSBhcmUgaW4gYXNjaWMgcmVjb3ZlcnkuICovCiB9OwogCiAvKiBsaW5rX3N0YXR1cyBiaXQgZGVmaW5pdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCmluZGV4IDkzMGFlNDUuLjZiNGZmOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYwpAQCAtMjE1Miw2ICsyMTUyLDEwIEBACiAJICogdGhyZWFkCiAJICovCiAJY2xlYXJfYml0KFFMX0FEQVBURVJfVVAsICZxZGV2LT5mbGFncyk7CisJLyogU2V0IGFzaWMgcmVjb3ZlcnkgYml0IHRvIGluZGljYXRlIHJlc2V0IHByb2Nlc3MgdGhhdCB3ZSBhcmUKKwkgKiBpbiBmYXRhbCBlcnJvciByZWNvdmVyeSBwcm9jZXNzIHJhdGhlciB0aGFuIG5vcm1hbCBjbG9zZQorCSAqLworCXNldF9iaXQoUUxfQVNJQ19SRUNPVkVSWSwgJnFkZXYtPmZsYWdzKTsKIAlxdWV1ZV9kZWxheWVkX3dvcmsocWRldi0+d29ya3F1ZXVlLCAmcWRldi0+YXNpY19yZXNldF93b3JrLCAwKTsKIH0KIApAQCAtMjE2NiwyMyArMjE3MCwyMCBAQAogCQlyZXR1cm47CiAKIAljYXNlIENBTV9MT09LVVBfRVJSX0VWRU5UOgotCQluZXRpZl9lcnIocWRldiwgbGluaywgcWRldi0+bmRldiwKLQkJCSAgIk11bHRpcGxlIENBTSBoaXRzIGxvb2t1cCBvY2N1cnJlZC5cbiIpOwotCQluZXRpZl9lcnIocWRldiwgZHJ2LCBxZGV2LT5uZGV2LAotCQkJICAiVGhpcyBldmVudCBzaG91bGRuJ3Qgb2NjdXIuXG4iKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiTXVsdGlwbGUgQ0FNIGhpdHMgbG9va3VwIG9jY3VycmVkLlxuIik7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIlRoaXMgZXZlbnQgc2hvdWxkbid0IG9jY3VyLlxuIik7CiAJCXFsX3F1ZXVlX2FzaWNfZXJyb3IocWRldik7CiAJCXJldHVybjsKIAogCWNhc2UgU09GVF9FQ0NfRVJST1JfRVZFTlQ6Ci0JCW5ldGlmX2VycihxZGV2LCByeF9lcnIsIHFkZXYtPm5kZXYsCi0JCQkgICJTb2Z0IEVDQyBlcnJvciBkZXRlY3RlZC5cbiIpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJTb2Z0IEVDQyBlcnJvciBkZXRlY3RlZC5cbiIpOwogCQlxbF9xdWV1ZV9hc2ljX2Vycm9yKHFkZXYpOwogCQlicmVhazsKIAogCWNhc2UgUENJX0VSUl9BTk9OX0JVRl9SRDoKLQkJbmV0aWZfZXJyKHFkZXYsIHJ4X2VyciwgcWRldi0+bmRldiwKLQkJCSAgIlBDSSBlcnJvciBvY2N1cnJlZCB3aGVuIHJlYWRpbmcgYW5vbnltb3VzIGJ1ZmZlcnMgZnJvbSByeF9yaW5nICVkLlxuIiwKLQkJCSAgaWJfYWVfcnNwLT5xX2lkKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiUENJIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyAiCisJCQkJCSJhbm9ueW1vdXMgYnVmZmVycyBmcm9tIHJ4X3JpbmcgJWQuXG4iLAorCQkJCQlpYl9hZV9yc3AtPnFfaWQpOwogCQlxbF9xdWV1ZV9hc2ljX2Vycm9yKHFkZXYpOwogCQlicmVhazsKIApAQCAtMjQzNywxMSArMjQzOCwxMCBAQAogCSAqLwogCWlmICh2YXIgJiBTVFNfRkUpIHsKIAkJcWxfcXVldWVfYXNpY19lcnJvcihxZGV2KTsKLQkJbmV0aWZfZXJyKHFkZXYsIGludHIsIHFkZXYtPm5kZXYsCi0JCQkgICJHb3QgZmF0YWwgZXJyb3IsIFNUUyA9ICV4LlxuIiwgdmFyKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiR290IGZhdGFsIGVycm9yLCBTVFMgPSAleC5cbiIsIHZhcik7CiAJCXZhciA9IHFsX3JlYWQzMihxZGV2LCBFUlJfU1RTKTsKLQkJbmV0aWZfZXJyKHFkZXYsIGludHIsIHFkZXYtPm5kZXYsCi0JCQkgICJSZXNldHRpbmcgY2hpcC4gRXJyb3IgU3RhdHVzIFJlZ2lzdGVyID0gMHgleFxuIiwgdmFyKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiUmVzZXR0aW5nIGNoaXAuICIKKwkJCQkJIkVycm9yIFN0YXR1cyBSZWdpc3RlciA9IDB4JXhcbiIsIHZhcik7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKQEAgLTM4MTgsMTEgKzM4MTgsMTcgQEAKIAllbmRfamlmZmllcyA9IGppZmZpZXMgKwogCQltYXgoKHVuc2lnbmVkIGxvbmcpMSwgdXNlY3NfdG9famlmZmllcygzMCkpOwogCi0JLyogU3RvcCBtYW5hZ2VtZW50IHRyYWZmaWMuICovCi0JcWxfbWJfc2V0X21nbW50X3RyYWZmaWNfY3RsKHFkZXYsIE1CX1NFVF9NUElfVEZLX1NUT1ApOworCS8qIENoZWNrIGlmIGJpdCBpcyBzZXQgdGhlbiBza2lwIHRoZSBtYWlsYm94IGNvbW1hbmQgYW5kCisJICogY2xlYXIgdGhlIGJpdCwgZWxzZSB3ZSBhcmUgaW4gbm9ybWFsIHJlc2V0IHByb2Nlc3MuCisJICovCisJaWYgKCF0ZXN0X2JpdChRTF9BU0lDX1JFQ09WRVJZLCAmcWRldi0+ZmxhZ3MpKSB7CisJCS8qIFN0b3AgbWFuYWdlbWVudCB0cmFmZmljLiAqLworCQlxbF9tYl9zZXRfbWdtbnRfdHJhZmZpY19jdGwocWRldiwgTUJfU0VUX01QSV9URktfU1RPUCk7CiAKLQkvKiBXYWl0IGZvciB0aGUgTklDIGFuZCBNR01OVCBGSUZPcyB0byBlbXB0eS4gKi8KLQlxbF93YWl0X2ZpZm9fZW1wdHkocWRldik7CisJCS8qIFdhaXQgZm9yIHRoZSBOSUMgYW5kIE1HTU5UIEZJRk9zIHRvIGVtcHR5LiAqLworCQlxbF93YWl0X2ZpZm9fZW1wdHkocWRldik7CisJfSBlbHNlCisJCWNsZWFyX2JpdChRTF9BU0lDX1JFQ09WRVJZLCAmcWRldi0+ZmxhZ3MpOwogCiAJcWxfd3JpdGUzMihxZGV2LCBSU1RfRk8sIChSU1RfRk9fRlIgPDwgMTYpIHwgUlNUX0ZPX0ZSKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjYwNDAuYyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKaW5kZXggMjAwYTM2My4uMGZmZWM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjYwNDAuYworKysgYi9kcml2ZXJzL25ldC9yNjA0MC5jCkBAIC02NzcsOSArNjc3LDExIEBACiAJCWlmIChzdGF0dXMgJiBSWF9GSUZPX0ZVTEwpCiAJCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CiAKLQkJLyogTWFzayBvZmYgUlggaW50ZXJydXB0ICovCi0JCW1pc3IgJj0gflJYX0lOVFM7Ci0JCW5hcGlfc2NoZWR1bGUoJmxwLT5uYXBpKTsKKwkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJmxwLT5uYXBpKSkpIHsKKwkJCS8qIE1hc2sgb2ZmIFJYIGludGVycnVwdCAqLworCQkJbWlzciAmPSB+UlhfSU5UUzsKKwkJCV9fbmFwaV9zY2hlZHVsZSgmbHAtPm5hcGkpOworCQl9CiAJfQogCiAJLyogVFggaW50ZXJydXB0IHJlcXVlc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IGVmMWNlMmUuLjU5OTA2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtNzQyLDcgKzc0Miw3IEBACiAJbXNsZWVwKDIpOwogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJdWRlbGF5KDEwMCk7Ci0JCWlmICghKFJUTF9SMzIoRVJJRFIpICYgRVJJQVJfRkxBRykpCisJCWlmICghKFJUTF9SMzIoRVJJQVIpICYgRVJJQVJfRkxBRykpCiAJCQlicmVhazsKIAl9CiAKQEAgLTE2MjEsNyArMTYyMSw3IEBACiAJICoKIAkgKiAoUlRMX1IzMihUeENvbmZpZykgJiAweDcwMDAwMCkgPT0gMHgyMDAwMDAgPyA4MTAxRWIgOiA4MTAxRWMKIAkgKi8KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9tYWNfaW5mbyB7CiAJCXUzMiBtYXNrOwogCQl1MzIgdmFsOwogCQlpbnQgbWFjX3ZlcnNpb247CkBAIC0xNjg5LDcgKzE2ODksOCBAQAogCiAJCS8qIENhdGNoLWFsbCAqLwogCQl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCVJUTF9HSUdBX01BQ19OT05FICAgfQotCX0sICpwID0gbWFjX2luZm87CisJfTsKKwljb25zdCBzdHJ1Y3QgcnRsX21hY19pbmZvICpwID0gbWFjX2luZm87CiAJdTMyIHJlZzsKIAogCXJlZyA9IFJUTF9SMzIoVHhDb25maWcpOwpAQCAtMzY4MSw3ICszNjgyLDcgQEAKIAogc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfbWFnaWNfcmVnKHZvaWQgX19pb21lbSAqaW9hZGRyLCB1bnNpZ25lZCBtYWNfdmVyc2lvbikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9jZmcyX2luZm8gewogCQl1MzIgbWFjX3ZlcnNpb247CiAJCXUzMiBjbGs7CiAJCXUzMiB2YWw7CkBAIC0zNjkwLDcgKzM2OTEsOCBAQAogCQl7IFJUTF9HSUdBX01BQ19WRVJfMDUsIFBDSV9DbG9ja182Nk1IeiwgMHgwMDBmZmZmZiB9LAogCQl7IFJUTF9HSUdBX01BQ19WRVJfMDYsIFBDSV9DbG9ja18zM01IeiwgMHgwMGZmZmYwMCB9LCAvLyA4MTEwU0NlCiAJCXsgUlRMX0dJR0FfTUFDX1ZFUl8wNiwgUENJX0Nsb2NrXzY2TUh6LCAweDAwZmZmZmZmIH0KLQl9LCAqcCA9IGNmZzJfaW5mbzsKKwl9OworCWNvbnN0IHN0cnVjdCBydGxfY2ZnMl9pbmZvICpwID0gY2ZnMl9pbmZvOwogCXVuc2lnbmVkIGludCBpOwogCXUzMiBjbGs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Jpb25ldC5jIGIvZHJpdmVycy9uZXQvcmlvbmV0LmMKaW5kZXggNzdjNTA5Mi4uNWQzNDM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcmlvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvcmlvbmV0LmMKQEAgLTM3OCw3ICszNzgsNyBAQAogCiBzdGF0aWMgdm9pZCByaW9uZXRfcmVtb3ZlKHN0cnVjdCByaW9fZGV2ICpyZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHJpb19nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3QgcmlvbmV0X3BlZXIgKnBlZXIsICp0bXA7CiAKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXJpb25ldF9hY3RpdmUsIHJkZXYtPm5ldC0+aHBvcnQtPnN5c19zaXplID8KQEAgLTQzMywyMiArNDMzLDEyIEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCiB9OwogCi1zdGF0aWMgaW50IHJpb25ldF9zZXR1cF9uZXRkZXYoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQpCitzdGF0aWMgaW50IHJpb25ldF9zZXR1cF9uZXRkZXYoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCWludCByYyA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOwogCXN0cnVjdCByaW9uZXRfcHJpdmF0ZSAqcm5ldDsKIAl1MTYgZGV2aWNlX2lkOwogCi0JLyogQWxsb2NhdGUgb3VyIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCi0JbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcmlvbmV0X3ByaXZhdGUpKTsKLQlpZiAobmRldiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgZXRoZXJuZXQgZGV2aWNlLlxuIiwKLQkJICAgICAgIERSVl9OQU1FKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlyaW9uZXRfYWN0aXZlID0gKHN0cnVjdCByaW9fZGV2ICoqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKIAkJCW1wb3J0LT5zeXNfc2l6ZSA/IF9fZmxzKHNpemVvZih2b2lkICopKSArIDQgOiAwKTsKIAlpZiAoIXJpb25ldF9hY3RpdmUpIHsKQEAgLTUwNCwxMSArNDk0LDIxIEBACiAJaW50IHJjID0gLUVOT0RFVjsKIAl1MzIgbHBlZiwgbHNyY19vcHMsIGxkc3Rfb3BzOwogCXN0cnVjdCByaW9uZXRfcGVlciAqcGVlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CiAKIAkvKiBJZiBsb2NhbCBkZXZpY2UgaXMgbm90IHJpb25ldCBjYXBhYmxlLCBnaXZlIHVwIHF1aWNrbHkgKi8KIAlpZiAoIXJpb25ldF9jYXBhYmxlKQogCQlnb3RvIG91dDsKIAorCS8qIEFsbG9jYXRlIG91ciBuZXRfZGV2aWNlIHN0cnVjdHVyZSAqLworCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHJpb25ldF9wcml2YXRlKSk7CisJaWYgKG5kZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY291bGQgbm90IGFsbG9jYXRlIGV0aGVybmV0IGRldmljZS5cbiIsCisJCSAgICAgICBEUlZfTkFNRSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyoKIAkgKiBGaXJzdCB0aW1lIHRocm91Z2gsIG1ha2Ugc3VyZSBsb2NhbCBkZXZpY2UgaXMgcmlvbmV0CiAJICogY2FwYWJsZSwgc2V0dXAgbmV0ZGV2LCAgYW5kIHNldCBmbGFncyBzbyB0aGlzIGlzIHNraXBwZWQKQEAgLTUyOSw3ICs1MjksNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyYyA9IHJpb25ldF9zZXR1cF9uZXRkZXYocmRldi0+bmV0LT5ocG9ydCk7CisJCXJjID0gcmlvbmV0X3NldHVwX25ldGRldihyZGV2LT5uZXQtPmhwb3J0LCBuZGV2KTsKIAkJcmlvbmV0X2NoZWNrID0gMTsKIAl9CiAKQEAgLTU0Niw2ICs1NDYsOCBAQAogCQlsaXN0X2FkZF90YWlsKCZwZWVyLT5ub2RlLCAmcmlvbmV0X3BlZXJzKTsKIAl9CiAKKwlyaW9fc2V0X2RydmRhdGEocmRldiwgbmRldik7CisKICAgICAgIG91dDoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaF9ldGguYyBiL2RyaXZlcnMvbmV0L3NoX2V0aC5jCmluZGV4IDhhNzJhOTcuLjFmM2Y3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NoX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3NoX2V0aC5jCkBAIC0xNDAsNiArMTQwLDggQEAKIAkudHBhdXNlcgk9IDEsCiAJLmh3X3N3YXAJPSAxLAogCS5ub19hZGUJCT0gMSwKKwkucnBhZGlyCQk9IDEsCisJLnJwYWRpcl92YWx1ZSAgID0gMiA8PCAxNiwKIH07CiAKICNkZWZpbmUgU0hfR0lHQV9FVEhfQkFTRQkweGZlZTAwMDAwCkBAIC0xMTg0LDggKzExODYsOCBAQAogCQkJCW1kcC0+Y2QtPnNldF9yYXRlKG5kZXYpOwogCQl9CiAJCWlmIChtZHAtPmxpbmsgPT0gUEhZX0RPV04pIHsKLQkJCXNoX2V0aF93cml0ZShuZGV2LCAoc2hfZXRoX3JlYWQobmRldiwgRUNNUikgJiB+RUNNUl9UWEYpCi0JCQkJCXwgRUNNUl9ETSwgRUNNUik7CisJCQlzaF9ldGhfd3JpdGUobmRldiwKKwkJCQkoc2hfZXRoX3JlYWQobmRldiwgRUNNUikgJiB+RUNNUl9UWEYpLCBFQ01SKTsKIAkJCW5ld19zdGF0ZSA9IDE7CiAJCQltZHAtPmxpbmsgPSBwaHlkZXYtPmxpbms7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuYyBiL2RyaXZlcnMvbmV0L3NsaXAuYwppbmRleCA1ODQ4MDljLi4yZjExMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5jCkBAIC0xODIsMTEgKzE4MiwxMSBAQAogI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKIAljYnVmZiA9IHhjaGcoJnNsLT5jYnVmZiwgY2J1ZmYpOwogCXNsY29tcCA9IHhjaGcoJnNsLT5zbGNvbXAsIHNsY29tcCk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CiAJc2wtPnhkYXRhICAgID0gMDsKIAlzbC0+eGJpdHMgICAgPSAwOwogI2VuZGlmCi0jZW5kaWYKIAlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOwogCWVyciA9IDA7CiAKQEAgLTY3MCwxNyArNjcwLDE2IEBACiAgKiBpbiBwYXJhbGxlbAogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2xpcF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIHNsaXBfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkJCQkJY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2xpcCAqc2wgPSB0dHktPmRpc2NfZGF0YTsKLQlpbnQgYnl0ZXMgPSBjb3VudDsKIAogCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFNMSVBfTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoc2wtPmRldikpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAKIAkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCi0Jd2hpbGUgKGJ5dGVzLS0pIHsKKwl3aGlsZSAoY291bnQtLSkgewogCQlpZiAoZnAgJiYgKmZwKyspIHsKIAkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpKQogCQkJCXNsLT5kZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwpAQCAtNjk0LDggKzY5Myw2IEBACiAjZW5kaWYKIAkJCXNsaXBfdW5lc2Moc2wsICpjcCsrKTsKIAl9Ci0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuYyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuYwppbmRleCAwZjI5ZjI2Li5kMDdjMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWMtbWNhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLW1jYS5jCkBAIC0xNTYsNyArMTU2LDcgQEAKICAgIHsgMTQsIDE1IH0KIH07CiAKLXN0YXRpYyBjb25zdCBzaG9ydCBzbWNfbWNhX2FkYXB0ZXJfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc2hvcnQgc21jX21jYV9hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJMHg2MWM4LAogCTB4NjFjOSwKIAkweDZmYzAsCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkweDAwMDAKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbWNfbWNhX2FkYXB0ZXJfbmFtZXNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBjaGFyICpzbWNfbWNhX2FkYXB0ZXJfbmFtZXNbXSBfX2luaXRkYXRhID0gewogCSJTTUMgRXRoZXJjYXJkIFBMVVMgRWxpdGUvQSBCTkMvQVVJIChXRDgwMTNFUC9BKSIsCiAJIlNNQyBFdGhlcmNhcmQgUExVUyBFbGl0ZS9BIFVUUC9BVUkgKFdEODAxM1dQL0EpIiwKIAkiV0QgRXRoZXJjYXJkIFBMVVMvQSAoV0Q4MDAzRS9BIG9yIFdEODAwM0VUL0EpIiwKQEAgLTE5OSw3ICsxOTksNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB1bHRyYW1jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpnZW5fZGV2KQorc3RhdGljIGludCBfX2luaXQgdWx0cmFtY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZ2VuX2RldikKIHsKIAl1bnNpZ25lZCBzaG9ydCBpb2FkZHI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKaW5kZXggZGM0ODA1Zi4uZjYyODU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKQEAgLTI0MDAsOCArMjQwMCwxMCBAQAogCXsgLmNvbXBhdGlibGUgPSAic21zYyxsYW45MWM5NCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzbXNjLGxhbjkxYzExMSIsIH0sCiAJe30sCi19Cit9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc21jOTF4X21hdGNoKTsKKyNlbHNlCisjZGVmaW5lIHNtYzkxeF9tYXRjaCBOVUxMCiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHNtY19kcnZfcG1fb3BzID0gewpAQCAtMjQxNiw5ICsyNDE4LDcgQEAKIAkJLm5hbWUJPSBDQVJETkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5wbQk9ICZzbWNfZHJ2X3BtX29wcywKLSNpZmRlZiBDT05GSUdfT0YKIAkJLm9mX21hdGNoX3RhYmxlID0gc21jOTF4X21hdGNoLAotI2VuZGlmCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggZjRiMDFjNi4uYTFmOWY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmMKKysrIGIvZHJpdmVycy9uZXQvdGczLmMKQEAgLTU3NzQsNyArNTc3NCw3IEBACiAJCQkgZG1hX3VubWFwX2FkZHIodHhiLCBtYXBwaW5nKSwKIAkJCSBza2JfaGVhZGxlbihza2IpLAogCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxhc3Q7IGkrKykgewogCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CiAKIAkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCmluZGV4IDEzMTNhYTEuLjJiZWRjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwpAQCAtNzI3LDcgKzcyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzaG9ydCBtYWRnZW1jX2FkYXB0ZXJfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc2hvcnQgbWFkZ2VtY19hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJMHgwMDJkLAogCTB4MDAwMAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCmluZGV4IDQ1MTQ0ZDUuLmVmYWExZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMTk5NSw3ICsxOTk1LDcgQEAKIAogc3RhdGljIHVfY2hhciBkZTR4NV9pcnFbXSA9IEVJU0FfQUxMT1dFRF9JUlFfTElTVDsKIAotc3RhdGljIGludCBfX2RldmluaXQgZGU0eDVfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQorc3RhdGljIGludCBfX2luaXQgZGU0eDVfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQogewogCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKIAl1X2xvbmcgaW9iYXNlOwpAQCAtMjA5Nyw3ICsyMDk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZTR4NV9laXNhX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZTR4NV9laXNhX2lkc1tdID0gewogICAgICAgICB7ICJERUM0MjUwIiwgMCB9LAkvKiAwIGlzIHRoZSBib2FyZCBuYW1lIGluZGV4Li4uICovCiAgICAgICAgIHsgIiIgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggNzRlOTQwNS4uNTIzNWY0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTQ2MCw3ICs0NjAsMjMgQEAKIAogCXJldHVybiAoZmVhdHVyZXMgJiB0dW4tPnNldF9mZWF0dXJlcykgfCAoZmVhdHVyZXMgJiB+VFVOX1VTRVJfRkVBVFVSRVMpOwogfQotCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHR1bl9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIFR1biBvbmx5IHJlY2VpdmVzIGZyYW1lcyB3aGVuOgorCSAqIDEpIHRoZSBjaGFyIGRldmljZSBlbmRwb2ludCBnZXRzIGRhdGEgZnJvbSB1c2VyIHNwYWNlCisJICogMikgdGhlIHR1biBzb2NrZXQgZ2V0cyBhIHNlbmRtc2cgY2FsbCBmcm9tIHVzZXIgc3BhY2UKKwkgKiBTaW5jZSBib3RoIG9mIHRob3NlIGFyZSBzeW5jcm9ub3VzIG9wZXJhdGlvbnMsIHdlIGFyZSBndWFyYW50ZWVkCisJICogbmV2ZXIgdG8gaGF2ZSBwZW5kaW5nIGRhdGEgd2hlbiB3ZSBwb2xsIGZvciBpdAorCSAqIHNvIHRoZXJlcyBub3RoaW5nIHRvIGRvIGhlcmUgYnV0IHJldHVybi4KKwkgKiBXZSBuZWVkIHRoaXMgdGhvdWdoIHNvIG5ldHBvbGwgcmVjb2duaXplcyB1cyBhcyBhbiBpbnRlcmZhY2UgdGhhdAorCSAqIHN1cHBvcnRzIHBvbGxpbmcsIHdoaWNoIGVuYWJsZXMgYnJpZGdlIGRldmljZXMgaW4gdmlydCBzZXR1cHMgdG8KKwkgKiBzdGlsbCB1c2UgbmV0Y29uc29sZQorCSAqLworCXJldHVybjsKK30KKyNlbmRpZgogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0dW5fbmV0ZGV2X29wcyA9IHsKIAkubmRvX3VuaW5pdAkJPSB0dW5fbmV0X3VuaW5pdCwKIAkubmRvX29wZW4JCT0gdHVuX25ldF9vcGVuLApAQCAtNDY4LDYgKzQ4NCw5IEBACiAJLm5kb19zdGFydF94bWl0CQk9IHR1bl9uZXRfeG1pdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gdHVuX25ldF9jaGFuZ2VfbXR1LAogCS5uZG9fZml4X2ZlYXR1cmVzCT0gdHVuX25ldF9maXhfZmVhdHVyZXMsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IHR1bl9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdGFwX25ldGRldl9vcHMgPSB7CkBAIC00ODAsNiArNDk5LDkgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHR1bl9uZXRfbWNsaXN0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSB0dW5fcG9sbF9jb250cm9sbGVyLAorI2VuZGlmCiB9OwogCiAvKiBJbml0aWFsaXplIG5ldCBkZXZpY2UuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnCmluZGV4IDlkNGY5MTEuLjg0ZDQ2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnCkBAIC0zODUsNiArMzg1LDE2IEBACiAJICByb3V0ZXIgd2l0aCBVU0IgZXRoZXJuZXQgcG9ydC4gVGhpcyBkcml2ZXIgaXMgZm9yIHJvdXRlcnMgb25seSwKIAkgIGl0IHdpbGwgbm90IHdvcmsgd2l0aCBBRFNMIG1vZGVtcyAodXNlIGN4YWNydSBkcml2ZXIgaW5zdGVhZCkuCiAKK2NvbmZpZyBVU0JfTkVUX0tBTE1JQQorCXRyaXN0YXRlICJTYW1zdW5nIEthbG1pYSBiYXNlZCBMVEUgVVNCIG1vZGVtIgorCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIFNhbXN1bmcgS2FsbWlhIGJhc2VkIFVTQiBtb2RlbQorCSAgYXMgU2Ftc3VuZyBHVC1CMzczMC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQga2FsbWlhLgorCiBjb25maWcgVVNCX0hTTwogCXRyaXN0YXRlICJPcHRpb24gVVNCIEhpZ2ggU3BlZWQgTW9iaWxlIERldmljZXMiCiAJZGVwZW5kcyBvbiBVU0IgJiYgUkZLSUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC91c2IvTWFrZWZpbGUKaW5kZXggYzdlYzhhNS4uYzIwM2ZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9NYWtlZmlsZQpAQCAtMjMsNiArMjMsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9VU0JORVQpCSs9IHVzYm5ldC5vCiBvYmotJChDT05GSUdfVVNCX05FVF9JTlQ1MVgxKQkrPSBpbnQ1MXgxLm8KIG9iai0kKENPTkZJR19VU0JfQ0RDX1BIT05FVCkJKz0gY2RjLXBob25ldC5vCitvYmotJChDT05GSUdfVVNCX05FVF9LQUxNSUEpCSs9IGthbG1pYS5vCiBvYmotJChDT05GSUdfVVNCX0lQSEVUSCkJKz0gaXBoZXRoLm8KIG9iai0kKENPTkZJR19VU0JfU0lFUlJBX05FVCkJKz0gc2llcnJhX25ldC5vCiBvYmotJChDT05GSUdfVVNCX05FVF9DWDgyMzEwX0VUSCkJKz0gY3g4MjMxMF9ldGgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2NhdGMuYyBiL2RyaXZlcnMvbmV0L3VzYi9jYXRjLmMKaW5kZXggZDcyMjFjNC4uODA1NmY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2NhdGMuYworKysgYi9kcml2ZXJzL25ldC91c2IvY2F0Yy5jCkBAIC00OTUsNyArNDk1LDcgQEAKIAlpZiAoIXEtPmRpciAmJiBxLT5idWYgJiYgcS0+bGVuKQogCQltZW1jcHkoY2F0Yy0+Y3RybF9idWYsIHEtPmJ1ZiwgcS0+bGVuKTsKIAotCWlmICgoc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIoY2F0Yy0+Y3RybF91cmIsIEdGUF9LRVJORUwpKSkKKwlpZiAoKHN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKGNhdGMtPmN0cmxfdXJiLCBHRlBfQVRPTUlDKSkpCiAJCWVycigic3VibWl0KGN0cmxfdXJiKSBzdGF0dXMgJWQiLCBzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwppbmRleCBjZGQzYWU0Li5mMzNjYTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKQEAgLTU0LDcgKzU0LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvdXNibmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2NkYy5oPgogCi0jZGVmaW5lCURSSVZFUl9WRVJTSU9OCQkJCSIyNC1NYXktMjAxMSIKKyNkZWZpbmUJRFJJVkVSX1ZFUlNJT04JCQkJIjAxLUp1bmUtMjAxMSIKIAogLyogQ0RDIE5DTSBzdWJjbGFzcyAzLjIuMSAqLwogI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAxNl9MRU5HVEhfTUlOCQkweDEwCkBAIC0xMjM0LDYgKzEyMzQsNyBAQAogCS5kaXNjb25uZWN0ID0gY2RjX25jbV9kaXNjb25uZWN0LAogCS5zdXNwZW5kID0gdXNibmV0X3N1c3BlbmQsCiAJLnJlc3VtZSA9IHVzYm5ldF9yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCiAJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwppbmRleCAzODdjYTQzLi4zMDRmZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaHNvLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCkBAIC0yNDIxLDEwICsyNDIxLDggQEAKIAogCXJlbW92ZV9uZXRfZGV2aWNlKGhzb19uZXQtPnBhcmVudCk7CiAKLQlpZiAoaHNvX25ldC0+bmV0KSB7CisJaWYgKGhzb19uZXQtPm5ldCkKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoaHNvX25ldC0+bmV0KTsKLQkJZnJlZV9uZXRkZXYoaHNvX25ldC0+bmV0KTsKLQl9CiAKIAkvKiBzdGFydCBmcmVlaW5nICovCiAJZm9yIChpID0gMDsgaSA8IE1VWF9CVUxLX1JYX0JVRl9DT1VOVDsgaSsrKSB7CkBAIC0yNDM2LDYgKzI0MzQsOSBAQAogCWtmcmVlKGhzb19uZXQtPm11eF9idWxrX3R4X2J1Zik7CiAJaHNvX25ldC0+bXV4X2J1bGtfdHhfYnVmID0gTlVMTDsKIAorCWlmIChoc29fbmV0LT5uZXQpCisJCWZyZWVfbmV0ZGV2KGhzb19uZXQtPm5ldCk7CisKIAlrZnJlZShoc29fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2thbG1pYS5jIGIvZHJpdmVycy9uZXQvdXNiL2thbG1pYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjZjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC91c2Iva2FsbWlhLmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBVU0IgbmV0d29yayBpbnRlcmZhY2UgZHJpdmVyIGZvciBTYW1zdW5nIEthbG1pYSBiYXNlZCBMVEUgVVNCIG1vZGVtIGxpa2UgdGhlCisgKiBTYW1zdW5nIEdULUIzNzMwIGFuZCBHVC1CMzcxMC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTWFyaXVzIEJqb2VybnN0YWQgS290c2JhayA8bWFyaXVzQGtvdHNiYWsuY29tPgorICoKKyAqIFNwb25zb3JlZCBieSBRdWlja2xpbmsgVmlkZW8gRGlzdHJpYnV0aW9uIFNlcnZpY2VzIEx0ZC4KKyAqCisgKiBCYXNlZCBvbiB0aGUgY2RjX2VlbSBtb2R1bGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvY2RjLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3VzYm5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorCisvKgorICogVGhlIFNhbXN1bmcgS2FsbWlhIGJhc2VkIExURSBVU0IgbW9kZW1zIGhhdmUgYSBDREMgQUNNIHBvcnQgZm9yIG1vZGVtIGNvbnRyb2wKKyAqIGhhbmRsZWQgYnkgdGhlICJvcHRpb24iIG1vZHVsZSBhbmQgYW4gZXRoZXJuZXQgZGF0YSBwb3J0IGhhbmRsZWQgYnkgdGhpcworICogbW9kdWxlLgorICoKKyAqIFRoZSBzdGljayBtdXN0IGZpcnN0IGJlIHN3aXRjaGVkIGludG8gbW9kZW0gbW9kZSBieSB1c2JfbW9kZXN3aXRjaAorICogb3Igc2ltaWxhciB0b29sLiBUaGVuIHRoZSBtb2RlbSBnZXRzIHNlbnQgdHdvIGluaXRpYWxpemF0aW9uIHBhY2tldHMgYnkKKyAqIHRoaXMgbW9kdWxlLCB3aGljaCBnaXZlcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4gVXNlciBzcGFjZSBjYW4gdGhlbgorICogY29ubmVjdCB0aGUgbW9kZW0gdXNpbmcgQVQgY29tbWFuZHMgdGhyb3VnaCB0aGUgQUNNIHBvcnQgYW5kIHRoZW4gdXNlCisgKiBESENQIG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlLiBOZXR3b3JrIHBhY2tldHMgYXJlCisgKiBzZW50IHRvIGFuZCBmcm9tIHRoZSBtb2RlbSBpbiBhIHByb3ByaWV0YXJ5IGZvcm1hdCBkaXNjb3ZlcmVkIGFmdGVyIHdhdGNoaW5nCisgKiB0aGUgYmVoYXZpb3Igb2YgdGhlIHdpbmRvd3MgZHJpdmVyIGZvciB0aGUgbW9kZW0uCisgKgorICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlIG9mIHRoZSBtb2RlbSBpcyBhdmFpbGFibGUgaW4gdXNiX21vZGVzd2l0Y2gKKyAqIGZvcnVtIGFuZCB0aGUgcHJvamVjdCBwYWdlOgorICoKKyAqIGh0dHA6Ly93d3cuZHJhaXNiZXJnaG9mLmRlL3VzYl9tb2Rlc3dpdGNoL2JiL3ZpZXd0b3BpYy5waHA/dD00NjUKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ta290c2Jhay9TYW1zdW5nLUdULUIzNzMwLWxpbnV4LWRyaXZlcgorICovCisKKy8qICNkZWZpbmUJREVCVUcgKi8KKy8qICNkZWZpbmUJVkVSQk9TRSAqLworCisjZGVmaW5lIEtBTE1JQV9IRUFERVJfTEVOR1RIIDYKKyNkZWZpbmUgS0FMTUlBX0FMSUdOX1NJWkUgNAorI2RlZmluZSBLQUxNSUFfVVNCX1RJTUVPVVQgMTAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAora2FsbWlhX3NlbmRfaW5pdF9wYWNrZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCAqaW5pdF9tc2csIHU4IGluaXRfbXNnX2xlbiwKKwl1OCAqYnVmZmVyLCB1OCBleHBlY3RlZF9sZW4pCit7CisJaW50IGFjdF9sZW47CisJaW50IHN0YXR1czsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZW5kaW5nIGluaXQgcGFja2V0Iik7CisKKwlzdGF0dXMgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCAweDAyKSwKKwkJaW5pdF9tc2csIGluaXRfbXNnX2xlbiwgJmFjdF9sZW4sIEtBTE1JQV9VU0JfVElNRU9VVCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCW5ldGRldl9lcnIoZGV2LT5uZXQsCisJCQkiRXJyb3Igc2VuZGluZyBpbml0IHBhY2tldC4gU3RhdHVzICVpLCBsZW5ndGggJWlcbiIsCisJCQlzdGF0dXMsIGFjdF9sZW4pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwllbHNlIGlmIChhY3RfbGVuICE9IGluaXRfbXNnX2xlbikgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LAorCQkJIkRpZCBub3Qgc2VuZCBhbGwgb2YgaW5pdCBwYWNrZXQuIEJ5dGVzIHNlbnQ6ICVpIiwKKwkJCWFjdF9sZW4pOworCX0KKwllbHNlIHsKKwkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlN1Y2Nlc3NmdWxseSBzZW50IGluaXQgcGFja2V0LiIpOworCX0KKworCXN0YXR1cyA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIDB4ODEpLAorCQlidWZmZXIsIGV4cGVjdGVkX2xlbiwgJmFjdF9sZW4sIEtBTE1JQV9VU0JfVElNRU9VVCk7CisKKwlpZiAoc3RhdHVzICE9IDApCisJCW5ldGRldl9lcnIoZGV2LT5uZXQsCisJCQkiRXJyb3IgcmVjZWl2aW5nIGluaXQgcmVzdWx0LiBTdGF0dXMgJWksIGxlbmd0aCAlaVxuIiwKKwkJCXN0YXR1cywgYWN0X2xlbik7CisJZWxzZSBpZiAoYWN0X2xlbiAhPSBleHBlY3RlZF9sZW4pCisJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJVbmV4cGVjdGVkIGluaXQgcmVzdWx0IGxlbmd0aDogJWlcbiIsCisJCQlhY3RfbGVuKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2thbG1pYV9pbml0X2FuZF9nZXRfZXRoZXJuZXRfYWRkcihzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4ICpldGhlcm5ldF9hZGRyKQoreworCWNvbnN0IHN0YXRpYyBjaGFyIGluaXRfbXNnXzFbXSA9CisJCXsgMHg1NywgMHg1MCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwKKwkJMHgwMCwgMHgwMCB9OworCWNvbnN0IHN0YXRpYyBjaGFyIGluaXRfbXNnXzJbXSA9CisJCXsgMHg1NywgMHg1MCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhmNCwKKwkJMHgwMCwgMHgwMCB9OworCWNvbnN0IHN0YXRpYyBpbnQgYnVmbGVuID0gMjg7CisJY2hhciAqdXNiX2J1ZjsKKwlpbnQgc3RhdHVzOworCisJdXNiX2J1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSh1c2JfYnVmLCBpbml0X21zZ18xLCAxMik7CisJc3RhdHVzID0ga2FsbWlhX3NlbmRfaW5pdF9wYWNrZXQoZGV2LCB1c2JfYnVmLCBzaXplb2YoaW5pdF9tc2dfMSkKKwkJLyBzaXplb2YoaW5pdF9tc2dfMVswXSksIHVzYl9idWYsIDI0KTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisKKwltZW1jcHkodXNiX2J1ZiwgaW5pdF9tc2dfMiwgMTIpOworCXN0YXR1cyA9IGthbG1pYV9zZW5kX2luaXRfcGFja2V0KGRldiwgdXNiX2J1Ziwgc2l6ZW9mKGluaXRfbXNnXzIpCisJCS8gc2l6ZW9mKGluaXRfbXNnXzJbMF0pLCB1c2JfYnVmLCAyOCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJbWVtY3B5KGV0aGVybmV0X2FkZHIsIHVzYl9idWYgKyAxMCwgRVRIX0FMRU4pOworCisJa2ZyZWUodXNiX2J1Zik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAora2FsbWlhX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGV0aGVybmV0X2FkZHJbRVRIX0FMRU5dOworCisJLyogRG9uJ3QgYmluZCB0byBBVCBjb21tYW5kIGludGVyZmFjZSAqLworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+aW4gPSB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCAweDgxICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwlkZXYtPm91dCA9IHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsIDB4MDIgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOworCWRldi0+c3RhdHVzID0gTlVMTDsKKworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gS0FMTUlBX0hFQURFUl9MRU5HVEg7CisJZGV2LT5oYXJkX210dSA9IDE0MDA7CisJZGV2LT5yeF91cmJfc2l6ZSA9IGRldi0+aGFyZF9tdHUgKiAxMDsgLy8gRm91bmQgYXMgb3B0aW1hbCBhZnRlciB0ZXN0aW5nCisKKwlzdGF0dXMgPSBrYWxtaWFfaW5pdF9hbmRfZ2V0X2V0aGVybmV0X2FkZHIoZGV2LCBldGhlcm5ldF9hZGRyKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyX29mKGludGYpLCBpbnRmKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwltZW1jcHkoZGV2LT5uZXQtPmRldl9hZGRyLCBldGhlcm5ldF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRldi0+bmV0LT5wZXJtX2FkZHIsIGV0aGVybmV0X2FkZHIsIEVUSF9BTEVOKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitrYWxtaWFfdHhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJdTE2IGNvbnRlbnRfbGVuOworCXVuc2lnbmVkIGNoYXIgKmhlYWRlcl9zdGFydDsKKwl1bnNpZ25lZCBjaGFyIGV0aGVyX3R5cGVfMSwgZXRoZXJfdHlwZV8yOworCXU4IHJlbWFpbmRlciwgcGFkbGVuID0gMDsKKworCWlmICghc2tiX2Nsb25lZChza2IpKSB7CisJCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCQlpbnQgdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKworCQlpZiAoKHRhaWxyb29tID49IEtBTE1JQV9BTElHTl9TSVpFKSAmJiAoaGVhZHJvb20KKwkJCT49IEtBTE1JQV9IRUFERVJfTEVOR1RIKSkKKwkJCWdvdG8gZG9uZTsKKworCQlpZiAoKGhlYWRyb29tICsgdGFpbHJvb20pID4gKEtBTE1JQV9IRUFERVJfTEVOR1RICisJCQkrIEtBTE1JQV9BTElHTl9TSVpFKSkgeworCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQgKyBLQUxNSUFfSEVBREVSX0xFTkdUSCwKKwkJCQlza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIEtBTE1JQV9IRUFERVJfTEVOR1RILAorCQlLQUxNSUFfQUxJR05fU0laRSwgZmxhZ3MpOworCWlmICghc2tiMikKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXNrYiA9IHNrYjI7CisKK2RvbmU6CisJaGVhZGVyX3N0YXJ0ID0gc2tiX3B1c2goc2tiLCBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisJZXRoZXJfdHlwZV8xID0gaGVhZGVyX3N0YXJ0W0tBTE1JQV9IRUFERVJfTEVOR1RIICsgMTJdOworCWV0aGVyX3R5cGVfMiA9IGhlYWRlcl9zdGFydFtLQUxNSUFfSEVBREVSX0xFTkdUSCArIDEzXTsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZW5kaW5nIGV0aGVyVHlwZTogJTAyeCUwMngiLCBldGhlcl90eXBlXzEsCisJCWV0aGVyX3R5cGVfMik7CisKKwkvKiBBY2NvcmRpbmcgdG8gZW1waXJpYyBkYXRhIGZvciBkYXRhIHBhY2thZ2VzICovCisJaGVhZGVyX3N0YXJ0WzBdID0gMHg1NzsKKwloZWFkZXJfc3RhcnRbMV0gPSAweDQ0OworCWNvbnRlbnRfbGVuID0gc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSDsKKworCXB1dF91bmFsaWduZWRfbGUxNihjb250ZW50X2xlbiwgJmhlYWRlcl9zdGFydFsyXSk7CisJaGVhZGVyX3N0YXJ0WzRdID0gZXRoZXJfdHlwZV8xOworCWhlYWRlcl9zdGFydFs1XSA9IGV0aGVyX3R5cGVfMjsKKworCS8qIEFsaWduIHRvIDQgYnl0ZXMgYnkgcGFkZGluZyB3aXRoIHplcm9zICovCisJcmVtYWluZGVyID0gc2tiLT5sZW4gJSBLQUxNSUFfQUxJR05fU0laRTsKKwlpZiAocmVtYWluZGVyID4gMCkgeworCQlwYWRsZW4gPSBLQUxNSUFfQUxJR05fU0laRSAtIHJlbWFpbmRlcjsKKwkJbWVtc2V0KHNrYl9wdXQoc2tiLCBwYWRsZW4pLCAwLCBwYWRsZW4pOworCX0KKworCW5ldGRldl9kYmcoCisJCWRldi0+bmV0LAorCQkiU2VuZGluZyBwYWNrYWdlIHdpdGggbGVuZ3RoICVpIGFuZCBwYWRkaW5nICVpLiBIZWFkZXI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LiIsCisJCWNvbnRlbnRfbGVuLCBwYWRsZW4sIGhlYWRlcl9zdGFydFswXSwgaGVhZGVyX3N0YXJ0WzFdLAorCQloZWFkZXJfc3RhcnRbMl0sIGhlYWRlcl9zdGFydFszXSwgaGVhZGVyX3N0YXJ0WzRdLAorCQloZWFkZXJfc3RhcnRbNV0pOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludAora2FsbWlhX3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKgorCSAqIE91ciB0YXNrIGhlcmUgaXMgdG8gc3RyaXAgb2ZmIGZyYW1pbmcsIGxlYXZpbmcgc2tiIHdpdGggb25lCisJICogZGF0YSBmcmFtZSBmb3IgdGhlIHVzYm5ldCBmcmFtZXdvcmsgY29kZSB0byBwcm9jZXNzLgorCSAqLworCWNvbnN0IHN0YXRpYyB1OCBIRUFERVJfRU5EX09GX1VTQl9QQUNLRVRbXSA9CisJCXsgMHg1NywgMHg1YSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCB9OworCWNvbnN0IHN0YXRpYyB1OCBFWFBFQ1RFRF9VTktOT1dOX0hFQURFUl8xW10gPQorCQl7IDB4NTcsIDB4NDMsIDB4MWUsIDB4MDAsIDB4MTUsIDB4MDIgfTsKKwljb25zdCBzdGF0aWMgdTggRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMltdID0KKwkJeyAweDU3LCAweDUwLCAweDBlLCAweDAwLCAweDAwLCAweDAwIH07CisJaW50IGkgPSAwOworCisJLyogaW5jb21wbGV0ZSBoZWFkZXI/ICovCisJaWYgKHNrYi0+bGVuIDwgS0FMTUlBX0hFQURFUl9MRU5HVEgpCisJCXJldHVybiAwOworCisJZG8geworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJCXU4ICpoZWFkZXJfc3RhcnQ7CisJCXUxNiB1c2JfcGFja2V0X2xlbmd0aCwgZXRoZXJfcGFja2V0X2xlbmd0aDsKKwkJaW50IGlzX2xhc3Q7CisKKwkJaGVhZGVyX3N0YXJ0ID0gc2tiLT5kYXRhOworCisJCWlmICh1bmxpa2VseShoZWFkZXJfc3RhcnRbMF0gIT0gMHg1NyB8fCBoZWFkZXJfc3RhcnRbMV0gIT0gMHg0NCkpIHsKKwkJCWlmICghbWVtY21wKGhlYWRlcl9zdGFydCwgRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMSwKKwkJCQlzaXplb2YoRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMSkpIHx8ICFtZW1jbXAoCisJCQkJaGVhZGVyX3N0YXJ0LCBFWFBFQ1RFRF9VTktOT1dOX0hFQURFUl8yLAorCQkJCXNpemVvZihFWFBFQ1RFRF9VTktOT1dOX0hFQURFUl8yKSkpIHsKKwkJCQluZXRkZXZfZGJnKAorCQkJCQlkZXYtPm5ldCwKKwkJCQkJIlJlY2VpdmVkIGV4cGVjdGVkIHVua25vd24gZnJhbWUgaGVhZGVyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC4gUGFja2FnZSBsZW5ndGg6ICVpXG4iLAorCQkJCQloZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9zdGFydFsxXSwKKwkJCQkJaGVhZGVyX3N0YXJ0WzJdLCBoZWFkZXJfc3RhcnRbM10sCisJCQkJCWhlYWRlcl9zdGFydFs0XSwgaGVhZGVyX3N0YXJ0WzVdLAorCQkJCQlza2ItPmxlbiAtIEtBTE1JQV9IRUFERVJfTEVOR1RIKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW5ldGRldl9lcnIoCisJCQkJCWRldi0+bmV0LAorCQkJCQkiUmVjZWl2ZWQgdW5rbm93biBmcmFtZSBoZWFkZXI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LiBQYWNrYWdlIGxlbmd0aDogJWlcbiIsCisJCQkJCWhlYWRlcl9zdGFydFswXSwgaGVhZGVyX3N0YXJ0WzFdLAorCQkJCQloZWFkZXJfc3RhcnRbMl0sIGhlYWRlcl9zdGFydFszXSwKKwkJCQkJaGVhZGVyX3N0YXJ0WzRdLCBoZWFkZXJfc3RhcnRbNV0sCisJCQkJCXNrYi0+bGVuIC0gS0FMTUlBX0hFQURFUl9MRU5HVEgpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWVsc2UKKwkJCW5ldGRldl9kYmcoCisJCQkJZGV2LT5uZXQsCisJCQkJIlJlY2VpdmVkIGhlYWRlcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguIFBhY2thZ2UgbGVuZ3RoOiAlaVxuIiwKKwkJCQloZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9zdGFydFsxXSwgaGVhZGVyX3N0YXJ0WzJdLAorCQkJCWhlYWRlcl9zdGFydFszXSwgaGVhZGVyX3N0YXJ0WzRdLCBoZWFkZXJfc3RhcnRbNV0sCisJCQkJc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisKKwkJLyogc3VidHJhY3Qgc3RhcnQgaGVhZGVyIGFuZCBlbmQgaGVhZGVyICovCisJCXVzYl9wYWNrZXRfbGVuZ3RoID0gc2tiLT5sZW4gLSAoMiAqIEtBTE1JQV9IRUFERVJfTEVOR1RIKTsKKwkJZXRoZXJfcGFja2V0X2xlbmd0aCA9IGdldF91bmFsaWduZWRfbGUxNigmaGVhZGVyX3N0YXJ0WzJdKTsKKwkJc2tiX3B1bGwoc2tiLCBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisKKwkJLyogU29tZSBzbWFsbCBwYWNrZXRzIG1pc3NlcyBlbmQgbWFya2VyICovCisJCWlmICh1c2JfcGFja2V0X2xlbmd0aCA8IGV0aGVyX3BhY2tldF9sZW5ndGgpIHsKKwkJCWV0aGVyX3BhY2tldF9sZW5ndGggPSB1c2JfcGFja2V0X2xlbmd0aAorCQkJCSsgS0FMTUlBX0hFQURFUl9MRU5HVEg7CisJCQlpc19sYXN0ID0gdHJ1ZTsKKwkJfQorCQllbHNlIHsKKwkJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJDb3JyZWN0IHBhY2thZ2UgbGVuZ3RoICMlaSIsIGkKKwkJCQkrIDEpOworCisJCQlpc19sYXN0ID0gKG1lbWNtcChza2ItPmRhdGEgKyBldGhlcl9wYWNrZXRfbGVuZ3RoLAorCQkJCUhFQURFUl9FTkRfT0ZfVVNCX1BBQ0tFVCwKKwkJCQlzaXplb2YoSEVBREVSX0VORF9PRl9VU0JfUEFDS0VUKSkgPT0gMCk7CisJCQlpZiAoIWlzX2xhc3QpIHsKKwkJCQloZWFkZXJfc3RhcnQgPSBza2ItPmRhdGEgKyBldGhlcl9wYWNrZXRfbGVuZ3RoOworCQkJCW5ldGRldl9kYmcoCisJCQkJCWRldi0+bmV0LAorCQkJCQkiRW5kIGhlYWRlcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguIFBhY2thZ2UgbGVuZ3RoOiAlaVxuIiwKKwkJCQkJaGVhZGVyX3N0YXJ0WzBdLCBoZWFkZXJfc3RhcnRbMV0sCisJCQkJCWhlYWRlcl9zdGFydFsyXSwgaGVhZGVyX3N0YXJ0WzNdLAorCQkJCQloZWFkZXJfc3RhcnRbNF0sIGhlYWRlcl9zdGFydFs1XSwKKwkJCQkJc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisJCQl9CisJCX0KKworCQlpZiAoaXNfbGFzdCkgeworCQkJc2tiMiA9IHNrYjsKKwkJfQorCQllbHNlIHsKKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseSghc2tiMikpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlza2JfdHJpbShza2IyLCBldGhlcl9wYWNrZXRfbGVuZ3RoKTsKKworCQlpZiAoaXNfbGFzdCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZSB7CisJCQl1c2JuZXRfc2tiX3JldHVybihkZXYsIHNrYjIpOworCQkJc2tiX3B1bGwoc2tiLCBldGhlcl9wYWNrZXRfbGVuZ3RoKTsKKwkJfQorCisJCWkrKzsKKwl9CisJd2hpbGUgKHNrYi0+bGVuKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGthbG1pYV9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9ICJTYW1zdW5nIEthbG1pYSBMVEUgVVNCIGRvbmdsZSIsCisJLmZsYWdzID0gRkxBR19XV0FOLAorCS5iaW5kID0ga2FsbWlhX2JpbmQsCisJLnJ4X2ZpeHVwID0ga2FsbWlhX3J4X2ZpeHVwLAorCS50eF9maXh1cCA9IGthbG1pYV90eF9maXh1cAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHByb2R1Y3RzW10gPSB7CisJLyogVGhlIHVuc3dpdGNoZWQgVVNCIElELCB0byBnZXQgdGhlIG1vZHVsZSBhdXRvIGxvYWRlZDogKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNGU4LCAweDY4OWEpIH0sCisJLyogVGhlIHN0aWNrIHN3aXRoZWQgaW50byBtb2RlbSAoYnkgZS5nLiB1c2JfbW9kZXN3aXRjaCk6ICovCisJeyBVU0JfREVWSUNFKDB4MDRlOCwgMHg2ODg5KSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZrYWxtaWFfaW5mbywgfSwKKwl7IC8qIEVNUFRZID09IGVuZCBvZiBsaXN0ICovfSB9OworTU9EVUxFX0RFVklDRV9UQUJMRSggdXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBrYWxtaWFfZHJpdmVyID0geworCS5uYW1lID0gImthbG1pYSIsCisJLmlkX3RhYmxlID0gcHJvZHVjdHMsCisJLnByb2JlID0gdXNibmV0X3Byb2JlLAorCS5kaXNjb25uZWN0ID0gdXNibmV0X2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPSB1c2JuZXRfc3VzcGVuZCwKKwkucmVzdW1lID0gdXNibmV0X3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQga2FsbWlhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZrYWxtaWFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KCBrYWxtaWFfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrYWxtaWFfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZrYWxtaWFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KCBrYWxtaWFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcml1cyBCam9lcm5zdGFkIEtvdHNiYWsgPG1hcml1c0Brb3RzYmFrLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBLYWxtaWEgVVNCIG5ldHdvcmsgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvemF1cnVzLmMgYi9kcml2ZXJzL25ldC91c2IvemF1cnVzLmMKaW5kZXggMjQxNzU2ZS4uMWEyMjM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3phdXJ1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi96YXVydXMuYwpAQCAtMzMxLDE3ICszMzEsNyBAQAogCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAogCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKIH0sCi0KLQotLyogQXQgbGVhc3Qgc29tZSBvZiB0aGUgbmV3ZXN0IFBYQSB1bml0cyBoYXZlIHZlcnkgZGlmZmVyZW50IGxpZXMgYWJvdXQKLSAqIHRoZWlyIHN0YW5kYXJkcyBzdXBwb3J0OiAgdGhleSBjbGFpbSB0byBiZSBjZWxsIHBob25lcyBvZmZlcmluZwotICogZGlyZWN0IGFjY2VzcyB0byB0aGVpciByYWRpb3MhICAoTm8sIHRoZXkgZG9uJ3QgY29uZm9ybSB0byBDREMgTURMTS4pCi0gKi8KIHsKLQlVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfTURMTSwKLQkJCVVTQl9DRENfUFJPVE9fTk9ORSksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZib2d1c19tZGxtX2luZm8sCi19LCB7CiAJLyogTW90b3JvbGEgTU9UT01BR1ggcGhvbmVzICovCiAJVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMmI4LCAweDY0MjUsIFVTQl9DTEFTU19DT01NLAogCQkJVVNCX0NEQ19TVUJDTEFTU19NRExNLCBVU0JfQ0RDX1BST1RPX05PTkUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCmluZGV4IDBjYjBiMDYuLmY2ODUzMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYworKysgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKQEAgLTYwOSw3ICs2MDksNyBAQAogCSAqIGJlZm9yZSBpdCBnZXRzIG91dCBvZiBoYW5kLiAgTmF0dXJhbGx5LCB0aGlzIHdhc3RlcyBlbnRyaWVzLiAqLwogCWlmIChjYXBhY2l0eSA8IDIrTUFYX1NLQl9GUkFHUykgewogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCWlmICh1bmxpa2VseSghdmlydHF1ZXVlX2VuYWJsZV9jYih2aS0+c3ZxKSkpIHsKKwkJaWYgKHVubGlrZWx5KCF2aXJ0cXVldWVfZW5hYmxlX2NiX2RlbGF5ZWQodmktPnN2cSkpKSB7CiAJCQkvKiBNb3JlIGp1c3QgZ290IHVzZWQsIGZyZWUgdGhlbSB0aGVuIHJlY2hlY2suICovCiAJCQljYXBhY2l0eSArPSBmcmVlX29sZF94bWl0X3NrYnModmkpOwogCQkJaWYgKGNhcGFjaXR5ID49IDIrTUFYX1NLQl9GUkFHUykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCmluZGV4IGZhNmUyYWMuLjY3NDAyMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYworKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKQEAgLTU3NSw3ICs1NzUsNyBAQAogCXN0cnVjdCB2bXhuZXQzX2NtZF9yaW5nICpyaW5nID0gJnJxLT5yeF9yaW5nW3JpbmdfaWR4XTsKIAl1MzIgdmFsOwogCi0Jd2hpbGUgKG51bV9hbGxvY2F0ZWQgPCBudW1fdG9fYWxsb2MpIHsKKwl3aGlsZSAobnVtX2FsbG9jYXRlZCA8PSBudW1fdG9fYWxsb2MpIHsKIAkJc3RydWN0IHZteG5ldDNfcnhfYnVmX2luZm8gKnJiaTsKIAkJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqZ2Q7CiAKQEAgLTYyMSw5ICs2MjEsMTUgQEAKIAogCQlCVUdfT04ocmJpLT5kbWFfYWRkciA9PSAwKTsKIAkJZ2QtPnJ4ZC5hZGRyID0gY3B1X3RvX2xlNjQocmJpLT5kbWFfYWRkcik7Ci0JCWdkLT5kd29yZFsyXSA9IGNwdV90b19sZTMyKChyaW5nLT5nZW4gPDwgVk1YTkVUM19SWERfR0VOX1NISUZUKQorCQlnZC0+ZHdvcmRbMl0gPSBjcHVfdG9fbGUzMigoIXJpbmctPmdlbiA8PCBWTVhORVQzX1JYRF9HRU5fU0hJRlQpCiAJCQkJCSAgIHwgdmFsIHwgcmJpLT5sZW4pOwogCisJCS8qIEZpbGwgdGhlIGxhc3QgYnVmZmVyIGJ1dCBkb250IG1hcmsgaXQgcmVhZHksIG9yIGVsc2UgdGhlCisJCSAqIGRldmljZSB3aWxsIHRoaW5rIHRoYXQgdGhlIHF1ZXVlIGlzIGZ1bGwgKi8KKwkJaWYgKG51bV9hbGxvY2F0ZWQgPT0gbnVtX3RvX2FsbG9jKQorCQkJYnJlYWs7CisKKwkJZ2QtPmR3b3JkWzJdIHw9IGNwdV90b19sZTMyKHJpbmctPmdlbiA8PCBWTVhORVQzX1JYRF9HRU5fU0hJRlQpOwogCQludW1fYWxsb2NhdGVkKys7CiAJCXZteG5ldDNfY21kX3JpbmdfYWR2X25leHQyZmlsbChyaW5nKTsKIAl9CkBAIC0xMTQwLDYgKzExNDYsNyBAQAogCQlWTVhORVQzX1JFR19SWFBST0QsIFZNWE5FVDNfUkVHX1JYUFJPRDIKIAl9OwogCXUzMiBudW1fcnhkID0gMDsKKwlib29sIHNraXBfcGFnZV9mcmFncyA9IGZhbHNlOwogCXN0cnVjdCBWbXhuZXQzX1J4Q29tcERlc2MgKnJjZDsKIAlzdHJ1Y3Qgdm14bmV0M19yeF9jdHggKmN0eCA9ICZycS0+cnhfY3R4OwogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRApAQCAtMTE1MCwxMSArMTE1NywxMiBAQAogCQkJICAmcnhDb21wKTsKIAl3aGlsZSAocmNkLT5nZW4gPT0gcnEtPmNvbXBfcmluZy5nZW4pIHsKIAkJc3RydWN0IHZteG5ldDNfcnhfYnVmX2luZm8gKnJiaTsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2IgPSBOVUxMOworCQlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2UgPSBOVUxMOwogCQlpbnQgbnVtX3RvX2FsbG9jOwogCQlzdHJ1Y3QgVm14bmV0M19SeERlc2MgKnJ4ZDsKIAkJdTMyIGlkeCwgcmluZ19pZHg7Ci0KKwkJc3RydWN0IHZteG5ldDNfY21kX3JpbmcJKnJpbmcgPSBOVUxMOwogCQlpZiAobnVtX3J4ZCA+PSBxdW90YSkgewogCQkJLyogd2UgbWF5IHN0b3AgZXZlbiBiZWZvcmUgd2Ugc2VlIHRoZSBFT1AgZGVzYyBvZgogCQkJICogdGhlIGN1cnJlbnQgcGt0CkBAIC0xMTY1LDYgKzExNzMsNyBAQAogCQlCVUdfT04ocmNkLT5ycUlEICE9IHJxLT5xaWQgJiYgcmNkLT5ycUlEICE9IHJxLT5xaWQyKTsKIAkJaWR4ID0gcmNkLT5yeGRJZHg7CiAJCXJpbmdfaWR4ID0gcmNkLT5ycUlEIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA/IDAgOiAxOworCQlyaW5nID0gcnEtPnJ4X3JpbmcgKyByaW5nX2lkeDsKIAkJdm14bmV0M19nZXRSeERlc2MocnhkLCAmcnEtPnJ4X3JpbmdbcmluZ19pZHhdLmJhc2VbaWR4XS5yeGQsCiAJCQkJICAmcnhDbWREZXNjKTsKIAkJcmJpID0gcnEtPmJ1Zl9pbmZvW3JpbmdfaWR4XSArIGlkeDsKQEAgLTExOTMsMzcgKzEyMDIsODAgQEAKIAkJCQlnb3RvIHJjZF9kb25lOwogCQkJfQogCisJCQlza2lwX3BhZ2VfZnJhZ3MgPSBmYWxzZTsKIAkJCWN0eC0+c2tiID0gcmJpLT5za2I7Ci0JCQlyYmktPnNrYiA9IE5VTEw7CisJCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYihyYmktPmxlbiArIE5FVF9JUF9BTElHTik7CisJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CisJCQkJLyogU2tiIGFsbG9jYXRpb24gZmFpbGVkLCBkbyBub3QgaGFuZG92ZXIgdGhpcworCQkJCSAqIHNrYiB0byBzdGFjay4gUmV1c2UgaXQuIERyb3AgdGhlIGV4aXN0aW5nIHBrdAorCQkJCSAqLworCQkJCXJxLT5zdGF0cy5yeF9idWZfYWxsb2NfZmFpbHVyZSsrOworCQkJCWN0eC0+c2tiID0gTlVMTDsKKwkJCQlycS0+c3RhdHMuZHJvcF90b3RhbCsrOworCQkJCXNraXBfcGFnZV9mcmFncyA9IHRydWU7CisJCQkJZ290byByY2RfZG9uZTsKKwkJCX0KIAogCQkJcGNpX3VubWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCByYmktPmRtYV9hZGRyLCByYmktPmxlbiwKIAkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJCXNrYl9wdXQoY3R4LT5za2IsIHJjZC0+bGVuKTsKKworCQkJLyogSW1tZWRpYXRlIHJlZmlsbCAqLworCQkJbmV3X3NrYi0+ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKKwkJCXJiaS0+c2tiID0gbmV3X3NrYjsKKwkJCXJiaS0+ZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LAorCQkJCQlyYmktPnNrYi0+ZGF0YSwgcmJpLT5sZW4sCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeGQtPmFkZHIgPSBjcHVfdG9fbGU2NChyYmktPmRtYV9hZGRyKTsKKwkJCXJ4ZC0+bGVuID0gcmJpLT5sZW47CisKIAkJfSBlbHNlIHsKLQkJCUJVR19PTihjdHgtPnNrYiA9PSBOVUxMKTsKKwkJCUJVR19PTihjdHgtPnNrYiA9PSBOVUxMICYmICFza2lwX3BhZ2VfZnJhZ3MpOworCiAJCQkvKiBub24gU09QIGJ1ZmZlciBtdXN0IGJlIHR5cGUgMSBpbiBtb3N0IGNhc2VzICovCi0JCQlpZiAocmJpLT5idWZfdHlwZSA9PSBWTVhORVQzX1JYX0JVRl9QQUdFKSB7Ci0JCQkJQlVHX09OKHJ4ZC0+YnR5cGUgIT0gVk1YTkVUM19SWERfQlRZUEVfQk9EWSk7CisJCQlCVUdfT04ocmJpLT5idWZfdHlwZSAhPSBWTVhORVQzX1JYX0JVRl9QQUdFKTsKKwkJCUJVR19PTihyeGQtPmJ0eXBlICE9IFZNWE5FVDNfUlhEX0JUWVBFX0JPRFkpOwogCi0JCQkJaWYgKHJjZC0+bGVuKSB7Ci0JCQkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgICAgICAgcmJpLT5kbWFfYWRkciwgcmJpLT5sZW4sCi0JCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCS8qIElmIGFuIHNvcCBidWZmZXIgd2FzIGRyb3BwZWQsIHNraXAgYWxsCisJCQkgKiBmb2xsb3dpbmcgbm9uLXNvcCBmcmFnbWVudHMuIFRoZXkgd2lsbCBiZSByZXVzZWQuCisJCQkgKi8KKwkJCWlmIChza2lwX3BhZ2VfZnJhZ3MpCisJCQkJZ290byByY2RfZG9uZTsKIAotCQkJCQl2bXhuZXQzX2FwcGVuZF9mcmFnKGN0eC0+c2tiLCByY2QsIHJiaSk7Ci0JCQkJCXJiaS0+cGFnZSA9IE5VTEw7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBvbmx5IHRpbWUgYSBub24tU09QIGJ1ZmZlciBpcyB0eXBlIDAgaXMKLQkJCQkgKiB3aGVuIGl0J3MgRU9QIGFuZCBlcnJvciBmbGFnIGlzIHJhaXNlZCwgd2hpY2gKLQkJCQkgKiBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQuCisJCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CisJCQlpZiAodW5saWtlbHkobmV3X3BhZ2UgPT0gTlVMTCkpIHsKKwkJCQkvKiBSZXBsYWNlbWVudCBwYWdlIGZyYWcgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KKwkJCQkgKiBSZXVzZSB0aGlzIHBhZ2UuIERyb3AgdGhlIHBrdCBhbmQgZnJlZSB0aGUKKwkJCQkgKiBza2Igd2hpY2ggY29udGFpbmVkIHRoaXMgcGFnZSBhcyBhIGZyYWcuIFNraXAKKwkJCQkgKiBwcm9jZXNzaW5nIGFsbCB0aGUgZm9sbG93aW5nIG5vbi1zb3AgZnJhZ3MuCiAJCQkJICovCi0JCQkJQlVHX09OKHRydWUpOworCQkJCXJxLT5zdGF0cy5yeF9idWZfYWxsb2NfZmFpbHVyZSsrOworCQkJCWRldl9rZnJlZV9za2IoY3R4LT5za2IpOworCQkJCWN0eC0+c2tiID0gTlVMTDsKKwkJCQlza2lwX3BhZ2VfZnJhZ3MgPSB0cnVlOworCQkJCWdvdG8gcmNkX2RvbmU7CiAJCQl9CisKKwkJCWlmIChyY2QtPmxlbikgeworCQkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJCSAgICAgICByYmktPmRtYV9hZGRyLCByYmktPmxlbiwKKwkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCQl2bXhuZXQzX2FwcGVuZF9mcmFnKGN0eC0+c2tiLCByY2QsIHJiaSk7CisJCQl9CisKKwkJCS8qIEltbWVkaWF0ZSByZWZpbGwgKi8KKwkJCXJiaS0+cGFnZSA9IG5ld19wYWdlOworCQkJcmJpLT5kbWFfYWRkciA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCByYmktPnBhZ2UsCisJCQkJCQkgICAgIDAsIFBBR0VfU0laRSwKKwkJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJ4ZC0+YWRkciA9IGNwdV90b19sZTY0KHJiaS0+ZG1hX2FkZHIpOworCQkJcnhkLT5sZW4gPSByYmktPmxlbjsKIAkJfQogCisKIAkJc2tiID0gY3R4LT5za2I7CiAJCWlmIChyY2QtPmVvcCkgewogCQkJc2tiLT5sZW4gKz0gc2tiLT5kYXRhX2xlbjsKQEAgLTEyNDQsMjYgKzEyOTYsMjcgQEAKIAkJfQogCiByY2RfZG9uZToKLQkJLyogZGV2aWNlIG1heSBza2lwIHNvbWUgcnggZGVzY3MgKi8KLQkJcnEtPnJ4X3JpbmdbcmluZ19pZHhdLm5leHQyY29tcCA9IGlkeDsKLQkJVk1YTkVUM19JTkNfUklOR19JRFhfT05MWShycS0+cnhfcmluZ1tyaW5nX2lkeF0ubmV4dDJjb21wLAotCQkJCQkgIHJxLT5yeF9yaW5nW3JpbmdfaWR4XS5zaXplKTsKKwkJLyogZGV2aWNlIG1heSBoYXZlIHNraXBwZWQgc29tZSByeCBkZXNjcyAqLworCQlyaW5nLT5uZXh0MmNvbXAgPSBpZHg7CisJCW51bV90b19hbGxvYyA9IHZteG5ldDNfY21kX3JpbmdfZGVzY19hdmFpbChyaW5nKTsKKwkJcmluZyA9IHJxLT5yeF9yaW5nICsgcmluZ19pZHg7CisJCXdoaWxlIChudW1fdG9fYWxsb2MpIHsKKwkJCXZteG5ldDNfZ2V0UnhEZXNjKHJ4ZCwgJnJpbmctPmJhc2VbcmluZy0+bmV4dDJmaWxsXS5yeGQsCisJCQkJCSAgJnJ4Q21kRGVzYyk7CisJCQlCVUdfT04oIXJ4ZC0+YWRkcik7CiAKLQkJLyogcmVmaWxsIHJ4IGJ1ZmZlcnMgZnJlcXVlbnRseSB0byBhdm9pZCBzdGFydmluZyB0aGUgaC93ICovCi0JCW51bV90b19hbGxvYyA9IHZteG5ldDNfY21kX3JpbmdfZGVzY19hdmFpbChycS0+cnhfcmluZyArCi0JCQkJCQkJICAgcmluZ19pZHgpOwotCQlpZiAodW5saWtlbHkobnVtX3RvX2FsbG9jID4gVk1YTkVUM19SWF9BTExPQ19USFJFU0hPTEQocnEsCi0JCQkJCQkJcmluZ19pZHgsIGFkYXB0ZXIpKSkgewotCQkJdm14bmV0M19ycV9hbGxvY19yeF9idWYocnEsIHJpbmdfaWR4LCBudW1fdG9fYWxsb2MsCi0JCQkJCQlhZGFwdGVyKTsKKwkJCS8qIFJlY3YgZGVzYyBpcyByZWFkeSB0byBiZSB1c2VkIGJ5IHRoZSBkZXZpY2UgKi8KKwkJCXJ4ZC0+Z2VuID0gcmluZy0+Z2VuOworCQkJdm14bmV0M19jbWRfcmluZ19hZHZfbmV4dDJmaWxsKHJpbmcpOworCQkJbnVtX3RvX2FsbG9jLS07CisJCX0KIAotCQkJLyogaWYgbmVlZGVkLCB1cGRhdGUgdGhlIHJlZ2lzdGVyICovCi0JCQlpZiAodW5saWtlbHkocnEtPnNoYXJlZC0+dXBkYXRlUnhQcm9kKSkgewotCQkJCVZNWE5FVDNfV1JJVEVfQkFSMF9SRUcoYWRhcHRlciwKLQkJCQkJcnhwcm9kX3JlZ1tyaW5nX2lkeF0gKyBycS0+cWlkICogOCwKLQkJCQkJcnEtPnJ4X3JpbmdbcmluZ19pZHhdLm5leHQyZmlsbCk7Ci0JCQkJcnEtPnVuY29tbWl0dGVkW3JpbmdfaWR4XSA9IDA7Ci0JCQl9CisJCS8qIGlmIG5lZWRlZCwgdXBkYXRlIHRoZSByZWdpc3RlciAqLworCQlpZiAodW5saWtlbHkocnEtPnNoYXJlZC0+dXBkYXRlUnhQcm9kKSkgeworCQkJVk1YTkVUM19XUklURV9CQVIwX1JFRyhhZGFwdGVyLAorCQkJCXJ4cHJvZF9yZWdbcmluZ19pZHhdICsgcnEtPnFpZCAqIDgsCisJCQkJcmluZy0+bmV4dDJmaWxsKTsKKwkJCXJxLT51bmNvbW1pdHRlZFtyaW5nX2lkeF0gPSAwOwogCQl9CiAKIAkJdm14bmV0M19jb21wX3JpbmdfYWR2X25leHQycHJvYygmcnEtPmNvbXBfcmluZyk7CkBAIC0yODk0LDYgKzI5NDcsNyBAQAogCWVsc2UKICNlbmRpZgogCQludW1fcnhfcXVldWVzID0gMTsKKwludW1fcnhfcXVldWVzID0gcm91bmRkb3duX3Bvd19vZl90d28obnVtX3J4X3F1ZXVlcyk7CiAKIAlpZiAoZW5hYmxlX21xKQogCQludW1fdHhfcXVldWVzID0gbWluKFZNWE5FVDNfREVWSUNFX01BWF9UWF9RVUVVRVMsCkBAIC0yOTAxLDYgKzI5NTUsNyBAQAogCWVsc2UKIAkJbnVtX3R4X3F1ZXVlcyA9IDE7CiAKKwludW1fdHhfcXVldWVzID0gcm91bmRkb3duX3Bvd19vZl90d28obnVtX3R4X3F1ZXVlcyk7CiAJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIpLAogCQkJCSAgIG1heChudW1fdHhfcXVldWVzLCBudW1fcnhfcXVldWVzKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiIyBvZiBUeCBxdWV1ZXMgOiAlZCwgIyBvZiBSeCBxdWV1ZXMgOiAlZFxuIiwKQEAgLTMwODUsNiArMzE0MCw3IEBACiAJZWxzZQogI2VuZGlmCiAJCW51bV9yeF9xdWV1ZXMgPSAxOworCW51bV9yeF9xdWV1ZXMgPSByb3VuZGRvd25fcG93X29mX3R3byhudW1fcnhfcXVldWVzKTsKIAogCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPndvcmspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmggYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKaW5kZXggZjUwZDM2Zi4uZTA4ZDc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaApAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSAidm14bmV0M19kZWZzLmgiCiAKQEAgLTY4LDEwICs2OSwxMCBAQAogLyoKICAqIFZlcnNpb24gbnVtYmVycwogICovCi0jZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMS45LjAtayIKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9TVFJJTkcgICAiMS4xLjE4LjAtayIKIAogLyogYSAzMi1iaXQgaW50LCBlYWNoIGJ5dGUgZW5jb2RlIGEgdmVyaW9uIG51bWJlciBpbiBWTVhORVQzX0RSSVZFUl9WRVJTSU9OICovCi0jZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fTlVNICAgICAgMHgwMTAxMDkwMAorI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX05VTSAgICAgIDB4MDEwMTEyMDAKIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSV9NU0kpCiAJLyogUlNTIG9ubHkgbWFrZXMgc2Vuc2UgaWYgTVNJLVggaXMgc3VwcG9ydGVkLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKaW5kZXggZTA1MGJkNi4uNzc3ZDFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCkBAIC0yMjAzLDggKzIyMDMsMTAgQEAKIAogCWlmIChwb3J0LT5tb2RlICE9IEZTVF9SQVcpIHsKIAkJZXJyID0gaGRsY19vcGVuKGRldik7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIpIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCQkJcmV0dXJuIGVycjsKKwkJfQogCX0KIAogCWZzdF9vcGVucG9ydChwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCmluZGV4IDQwMzk4YmYuLjI0Mjk3YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtNTE3LDE4ICs1MTcsMTcgQEAKICAqIGFuZCBzZW50IG9uIHRvIHNvbWUgSVAgbGF5ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHgyNV9hc3lfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKK3N0YXRpYyB2b2lkIHgyNV9hc3lfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSB0dHktPmRpc2NfZGF0YTsKLQlpbnQgYnl0ZXMgPSBjb3VudDsKIAogCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFgyNV9BU1lfTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoc2wtPmRldikpCiAJCXJldHVybjsKIAogCiAJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLwotCXdoaWxlIChieXRlcy0tKSB7CisJd2hpbGUgKGNvdW50LS0pIHsKIAkJaWYgKGZwICYmICpmcCsrKSB7CiAJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkKIAkJCQlzbC0+ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTUzNyw4ICs1MzYsNiBAQAogCQl9CiAJCXgyNV9hc3lfdW5lc2Moc2wsICpjcCsrKTsKIAl9Ci0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwppbmRleCAyMjA0NzYyLi5iNmM1ZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKQEAgLTcyLDYgKzcyLDExIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoYWxsX2NoYW5uZWxzLCBtb2RwYXJhbV9hbGxfY2hhbm5lbHMsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhhbGxfY2hhbm5lbHMsICJFeHBvc2UgYWxsIGNoYW5uZWxzIHRoZSBkZXZpY2UgY2FuIHVzZS4iKTsKIAorc3RhdGljIGludCBtb2RwYXJhbV9mYXN0Y2hhbnN3aXRjaDsKK21vZHVsZV9wYXJhbV9uYW1lZChmYXN0Y2hhbnN3aXRjaCwgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2gsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhmYXN0Y2hhbnN3aXRjaCwgIkVuYWJsZSBmYXN0IGNoYW5uZWwgc3dpdGNoaW5nIGZvciBBUjI0MTMvQVI1NDEzIHJhZGlvcy4iKTsKKworCiAvKiBNb2R1bGUgaW5mbyAqLwogTU9EVUxFX0FVVEhPUigiSmlyaSBTbGFieSIpOwogTU9EVUxFX0FVVEhPUigiTmljayBLb3NzaWZpZGlzIik7CkBAIC0yNjg2LDYgKzI2OTEsNyBAQAogCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJaW50IHJldCwgYW5pX21vZGU7CisJYm9vbCBmYXN0OwogCiAJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwgInJlc2V0dGluZ1xuIik7CiAKQEAgLTI3MDUsNyArMjcxMSwxMCBAQAogCWF0aDVrX2RyYWluX3R4X2J1ZmZzKHNjKTsKIAlpZiAoY2hhbikKIAkJc2MtPmN1cmNoYW4gPSBjaGFuOwotCXJldCA9IGF0aDVrX2h3X3Jlc2V0KGFoLCBzYy0+b3Btb2RlLCBzYy0+Y3VyY2hhbiwgY2hhbiAhPSBOVUxMLAorCisJZmFzdCA9ICgoY2hhbiAhPSBOVUxMKSAmJiBtb2RwYXJhbV9mYXN0Y2hhbnN3aXRjaCkgPyAxIDogMDsKKworCXJldCA9IGF0aDVrX2h3X3Jlc2V0KGFoLCBzYy0+b3Btb2RlLCBzYy0+Y3VyY2hhbiwgZmFzdCwKIAkJCQkJCQkJc2tpcF9wY3UpOwogCWlmIChyZXQpIHsKIAkJQVRINUtfRVJSKHNjLCAiY2FuJ3QgcmVzZXQgaGFyZHdhcmUgKCVkKVxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCmluZGV4IDYyMTcyZDUuLmY4MjM4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYwpAQCAtMTA3LDEwICsxMDcsMTMgQEAKIAkJY2FzZSBBUjVLX1BLVF9UWVBFX0JFQUNPTjoKIAkJY2FzZSBBUjVLX1BLVF9UWVBFX1BST0JFX1JFU1A6CiAJCQlmcmFtZV90eXBlID0gQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PX0RFTEFZOworCQkJYnJlYWs7CiAJCWNhc2UgQVI1S19QS1RfVFlQRV9QSUZTOgogCQkJZnJhbWVfdHlwZSA9IEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9QSUZTOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlmcmFtZV90eXBlID0gdHlwZTsKKwkJCWJyZWFrOwogCQl9CiAKIAkJdHhfY3RsLT50eF9jb250cm9sXzAgfD0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYwppbmRleCAxZmVmODRmLi4zOTI3NzFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCkBAIC02OTEsMTQgKzY5MSwxMiBAQAogCQlpZiAoIWNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMpCiAJCQljb250aW51ZTsKIAotCQlmb3IgKHBkZyA9IDA7IHBkZyA8IGVlLT5lZV9wZF9nYWluc1ttb2RlXTsgcGRnKyspIHsKKwkJZm9yIChwZGcgPSAwOyBwZGcgPCBBUjVLX0VFUFJPTV9OX1BEX0NVUlZFUzsgcGRnKyspIHsKIAkJCXN0cnVjdCBhdGg1a19wZGdhaW5faW5mbyAqcGQgPQogCQkJCQkmY2hpbmZvW3BpZXJdLnBkX2N1cnZlc1twZGddOwogCi0JCQlpZiAocGQgIT0gTlVMTCkgewotCQkJCWtmcmVlKHBkLT5wZF9zdGVwKTsKLQkJCQlrZnJlZShwZC0+cGRfcHdyKTsKLQkJCX0KKwkJCWtmcmVlKHBkLT5wZF9zdGVwKTsKKwkJCWtmcmVlKHBkLT5wZF9wd3IpOwogCQl9CiAKIAkJa2ZyZWUoY2hpbmZvW3BpZXJdLnBkX2N1cnZlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKaW5kZXggMjk2YzMxNi4uZjJjMGMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYwpAQCAtMjk3LDcgKzI5Nyw5IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGF0aDVrX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCiAJYXRoNWtfbGVkX29mZihzYyk7CiAJcmV0dXJuIDA7CkBAIC0zMDYsNyArMzA4LDggQEAKIHN0YXRpYyBpbnQgYXRoNWtfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CiAKIAkvKgogCSAqIFN1c3BlbmQvUmVzdW1lIHJlc2V0cyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UsIHNvIHdlIGhhdmUgdG8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMKaW5kZXggMzUxMGRlMi4uMTI2YTRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMKQEAgLTExMjQsOCArMTEyNCwxMSBAQAogCQkJLyogTm9uIGZhdGFsLCBjYW4gaGFwcGVuIGVnLgogCQkJICogb24gbW9kZSBjaGFuZ2UgKi8KIAkJCXJldCA9IDA7Ci0JCX0gZWxzZQorCQl9IGVsc2UgeworCQkJQVRINUtfREJHKGFoLT5haF9zYywgQVRINUtfREVCVUdfUkVTRVQsCisJCQkJImZhc3QgY2hhbiBjaGFuZ2Ugc3VjY2Vzc2Z1bFxuIik7CiAJCQlyZXR1cm4gMDsKKwkJfQogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9zeXNmcy5jCmluZGV4IDkyOWM2OGMuLmEwNzNjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9zeXNmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9zeXNmcy5jCkBAIC0xMCw3ICsxMCw4IEBACiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCQlcCiAJCQljaGFyICpidWYpCQkJCQlcCiB7CQkJCQkJCQkJXAotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwkJCQlcCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGdldCk7IAkJCVwKIH0JCQkJCQkJCQlcCiAJCQkJCQkJCQlcCkBAIC0xOCw3ICsxOSw4IEBACiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCQlcCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCiB7CQkJCQkJCQkJXAotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwkJCQlcCiAJaW50IHZhbDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCXZhbCA9IChpbnQpc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXApAQCAtMzMsNyArMzUsOCBAQAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQkJXAogCQkJY2hhciAqYnVmKQkJCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsJCQkJXAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBnZXQpOyAJCQlcCiB9CQkJCQkJCQkJXAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGF0aDVrX2F0dHJfc2hvd18jI25hbWUsIE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCmluZGV4IGQ5ZmY4NDEuLmQ5YzA4YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiBjb25maWcgQVRIOUtfUENJCiAJYm9vbCAiQXRoZXJvcyBhdGg5ayBQQ0kvUENJZSBidXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFUSDlLICYmIFBDSQotCWRlZmF1bHQgUENJCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgUENJIGJ1cyBzdXBwb3J0IGluIGF0aDlrLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMKaW5kZXggMDE1ZDk3NC4uMmQ0YzA5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfY2FsaWIuYwpAQCAtODI5LDcgKzgyOSw3IEBACiAJaWYgKEFSX1NSRVZfOTI3MShhaCkpIHsKIAkJaWYgKCFhcjkyODVfaHdfY2xfY2FsKGFoLCBjaGFuKSkKIAkJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4NV8xMl9PUl9MQVRFUihhaCkpIHsKKwl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4NShhaCkgJiYgQVJfU1JFVl85Mjg1XzEyX09SX0xBVEVSKGFoKSkgewogCQlpZiAoIWFyOTI4NV9od19jbGMoYWgsIGNoYW4pKQogCQkJcmV0dXJuIGZhbHNlOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwppbmRleCAwY2E3NjM1Li5mZjgxNTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKQEAgLTQ2NDUsMTAgKzQ2NDUsMTYgQEAKIAljYXNlIDE6CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU47CisJCWlmIChzY2FsZWRQb3dlciA+IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOKQorCQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU47CisJCWVsc2UKKwkJCXNjYWxlZFBvd2VyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOOworCQlpZiAoc2NhbGVkUG93ZXIgPiBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOKQorCQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTjsKKwkJZWxzZQorCQkJc2NhbGVkUG93ZXIgPSAwOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCmluZGV4IGVlZTIzZWMuLjg5MmM0OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwpAQCAtMTM4MSwzICsxMzgxLDI1IEBACiAJCSI9PT09IEJCIHVwZGF0ZTogZG9uZSA9PT09XG5cbiIpOwogfQogRVhQT1JUX1NZTUJPTChhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfZGJnX2luZm8pOworCit2b2lkIGFyOTAwM19od19kaXNhYmxlX3BoeV9yZXN0YXJ0KHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXUzMiB2YWw7CisKKwkvKiBXaGlsZSByZWNlaXZpbmcgdW5zdXBwb3J0ZWQgcmF0ZSBmcmFtZSByeCBzdGF0ZSBtYWNoaW5lCisJICogZ2V0cyBpbnRvIGEgc3RhdGUgMHhiIGFuZCBpZiBwaHlfcmVzdGFydCBoYXBwZW5zIGluIHRoYXQKKwkgKiBzdGF0ZSwgQkIgd291bGQgZ28gaGFuZy4gSWYgUlhTTSBpcyBpbiAweGIgc3RhdGUgYWZ0ZXIKKwkgKiBmaXJzdCBiYiBwYW5pYywgZW5zdXJlIHRvIGRpc2FibGUgdGhlIHBoeV9yZXN0YXJ0LgorCSAqLworCWlmICghKChNUyhhaC0+YmJfd2F0Y2hkb2dfbGFzdF9zdGF0dXMsCisJCSAgQVJfUEhZX1dBVENIRE9HX1JYX09GRE1fU00pID09IDB4YikgfHwKKwkgICAgYWgtPmJiX2hhbmdfcnhfb2ZkbSkpCisJCXJldHVybjsKKworCWFoLT5iYl9oYW5nX3J4X29mZG0gPSB0cnVlOworCXZhbCA9IFJFR19SRUFEKGFoLCBBUl9QSFlfUkVTVEFSVCk7CisJdmFsICY9IH5BUl9QSFlfUkVTVEFSVF9FTkE7CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9SRVNUQVJULCB2YWwpOworfQorRVhQT1JUX1NZTUJPTChhcjkwMDNfaHdfZGlzYWJsZV9waHlfcmVzdGFydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jCmluZGV4IDc4NTZmMGQuLjM0M2ZjOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jCkBAIC01MjQsMTAgKzUyNCwxNiBAQAogCWNhc2UgMToKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTjsKKwkJaWYgKHNjYWxlZFBvd2VyID4gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU4pCisJCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTjsKKwkJZWxzZQorCQkJc2NhbGVkUG93ZXIgPSAwOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCXNjYWxlZFBvd2VyIC09IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU47CisJCWlmIChzY2FsZWRQb3dlciA+IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4pCisJCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOOworCQllbHNlCisJCQlzY2FsZWRQb3dlciA9IDA7CiAJCWJyZWFrOwogCX0KIAlzY2FsZWRQb3dlciA9IG1heCgodTE2KTAsIHNjYWxlZFBvd2VyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKaW5kZXggNzI1NDNjZS4uMWJlN2M4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKQEAgLTE1NTUsOSArMTU1NSwxMiBAQAogCWlmIChhaC0+YnRjb2V4X2h3LmVuYWJsZWQpCiAJCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogCi0JaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCisJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2NvbmZpZyhhaCk7CiAKKwkJYXI5MDAzX2h3X2Rpc2FibGVfcGh5X3Jlc3RhcnQoYWgpOworCX0KKwogCWF0aDlrX2h3X2FwcGx5X2dwaW9fb3ZlcnJpZGUoYWgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCmluZGV4IDU3NDM1Y2UuLjRiMTU3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCkBAIC04NDIsNiArODQyLDcgQEAKIAogCXUzMiBiYl93YXRjaGRvZ19sYXN0X3N0YXR1czsKIAl1MzIgYmJfd2F0Y2hkb2dfdGltZW91dF9tczsgLyogaW4gbXMsIDAgdG8gZGlzYWJsZSAqLworCXU4IGJiX2hhbmdfcnhfb2ZkbTsgLyogdHJ1ZSBpZiBiYiBoYW5nIGR1ZSB0byByeF9vZmRtICovCiAKIAl1bnNpZ25lZCBpbnQgcGFwcmRfdGFyZ2V0X3Bvd2VyOwogCXVuc2lnbmVkIGludCBwYXByZF90cmFpbmluZ19wb3dlcjsKQEAgLTk5MCw2ICs5OTEsNyBAQAogdm9pZCBhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfY29uZmlnKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXI5MDAzX2h3X2JiX3dhdGNoZG9nX3JlYWQoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfZGJnX2luZm8oc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfaHdfZGlzYWJsZV9waHlfcmVzdGFydChzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGFyOTAwM19wYXByZF9lbmFibGUoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgdmFsKTsKIHZvaWQgYXI5MDAzX3BhcHJkX3BvcHVsYXRlX3NpbmdsZV90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJc3RydWN0IGF0aDlrX2h3X2NhbF9kYXRhICpjYWxkYXRhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKaW5kZXggYTE5OGVlMy4uMmNhMzUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCkBAIC02NzAsNyArNjcwLDggQEAKIAl1MzIgc3RhdHVzID0gc2MtPmludHJzdGF0dXM7CiAJdTMyIHJ4bWFzazsKIAotCWlmIChzdGF0dXMgJiBBVEg5S19JTlRfRkFUQUwpIHsKKwlpZiAoKHN0YXR1cyAmIEFUSDlLX0lOVF9GQVRBTCkgfHwKKwkgICAgKHN0YXR1cyAmIEFUSDlLX0lOVF9CQl9XQVRDSERPRykpIHsKIAkJYXRoX3Jlc2V0KHNjLCB0cnVlKTsKIAkJcmV0dXJuOwogCX0KQEAgLTczNyw2ICs3MzgsNyBAQAogewogI2RlZmluZSBTQ0hFRF9JTlRSICgJCQkJXAogCQlBVEg5S19JTlRfRkFUQUwgfAkJXAorCQlBVEg5S19JTlRfQkJfV0FUQ0hET0cgfAkJXAogCQlBVEg5S19JTlRfUlhPUk4gfAkJXAogCQlBVEg5S19JTlRfUlhFT0wgfAkJXAogCQlBVEg5S19JTlRfUlggfAkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYwppbmRleCBiOGNiZmM3Li4zYmFkMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCkBAIC0yNzgsNiArMjc4LDEyIEBACiAKIAlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIHNjLT5zY19haC0+bGVkX3BpbiwgMSk7CiAKKwkvKiBUaGUgZGV2aWNlIGhhcyB0byBiZSBtb3ZlZCB0byBGVUxMU0xFRVAgZm9yY2libHkuCisJICogT3RoZXJ3aXNlIHRoZSBjaGlwIG5ldmVyIG1vdmVkIHRvIGZ1bGwgc2xlZXAsCisJICogd2hlbiBubyBpbnRlcmZhY2UgaXMgdXAuCisJICovCisJYXRoOWtfaHdfc2V0cG93ZXIoc2MtPnNjX2FoLCBBVEg5S19QTV9GVUxMX1NMRUVQKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCmluZGV4IDE3NTQyMjEuLmJhN2YzNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCkBAIC02ODksNyArNjg5LDggQEAKIAogCWlmIChXTEFOX1JDX1BIWV9IVChyYXRlX3RhYmxlLT5pbmZvW3JpeF0ucGh5KSkgewogCQlyYXRlLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfTUNTOwotCQlpZiAoV0xBTl9SQ19QSFlfNDAocmF0ZV90YWJsZS0+aW5mb1tyaXhdLnBoeSkpCisJCWlmIChXTEFOX1JDX1BIWV80MChyYXRlX3RhYmxlLT5pbmZvW3JpeF0ucGh5KSAmJgorCQkgICAgY29uZl9pc19odDQwKCZ0eHJjLT5ody0+Y29uZikpCiAJCQlyYXRlLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOwogCQlpZiAoV0xBTl9SQ19QSFlfU0dJKHJhdGVfdGFibGUtPmluZm9bcml4XS5waHkpKQogCQkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKaW5kZXggMzc3OWI4OS4uMzM0NDNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCkBAIC02NzEsNyArNjcxLDggQEAKIAkgKiBUT0RPIC0gdGhpcyBjb3VsZCBiZSBpbXByb3ZlZCB0byBiZSBkZXBlbmRlbnQgb24gdGhlIHJhdGUuCiAJICogICAgICBUaGUgaGFyZHdhcmUgY2FuIGtlZXAgdXAgYXQgbG93ZXIgcmF0ZXMsIGJ1dCBub3QgaGlnaGVyIHJhdGVzCiAJICovCi0JaWYgKGZpLT5rZXlpeCAhPSBBVEg5S19UWEtFWUlYX0lOVkFMSUQpCisJaWYgKChmaS0+a2V5aXggIT0gQVRIOUtfVFhLRVlJWF9JTlZBTElEKSAmJgorCSAgICAhKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpKQogCQluZGVsaW0gKz0gQVRIX0FHR1JfRU5DUllQVERFTElNOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYwppbmRleCAyZmI1M2QwLi4zMzNiNjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCkBAIC0xMTIsNiArMTEyLDggQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNGJiLCAweDA5M2YpIH0sCiAJLyogTkVDIFdMMzAwTlUtRyAqLwogCXsgVVNCX0RFVklDRSgweDA0MDksIDB4MDI0OSkgfSwKKwkvKiBORUMgV0wzMDBOVS1BRyAqLworCXsgVVNCX0RFVklDRSgweDA0MDksIDB4MDJiNCkgfSwKIAkvKiBBVk0gRlJJVFohV0xBTiBVU0IgU3RpY2sgTiAqLwogCXsgVVNCX0RFVklDRSgweDA1N2MsIDB4ODQwMSkgfSwKIAkvKiBBVk0gRlJJVFohV0xBTiBVU0IgU3RpY2sgTiAyLjQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9uLmMKaW5kZXggOWVkNjUxNS4uMDU5NjBkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9uLmMKQEAgLTMwOTMsNyArMzA5Myw3IEBACiAJaW50IGZyZXE7CiAJYm9vbCBhdm9pZCA9IGZhbHNlOwogCXU4IGxlbmd0aDsKLQl1MTYgdG1wLCBjb3JlLCB0eXBlLCBjb3VudCwgbWF4LCBudW1iLCBsYXN0LCBjbWQ7CisJdTE2IHRtcCwgY29yZSwgdHlwZSwgY291bnQsIG1heCwgbnVtYiwgbGFzdCA9IDAsIGNtZDsKIAljb25zdCB1MTYgKnRhYmxlOwogCWJvb2wgcGh5Nm9yNXg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMKaW5kZXggN2U1ZTg1YS4uYTdhNDczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMKQEAgLTYyOCwxMSArNjI4LDExIEBACiAKIAkvKiByeF9zdGF0dXMgY2FycmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFja2V0IHRvIG1hYzgwMjExICovCiAJcnhfc3RhdHVzLm1hY3RpbWUgPSBsZTY0X3RvX2NwdShwaHlfcmVzLT50aW1lc3RhbXApOworCXJ4X3N0YXR1cy5iYW5kID0gKHBoeV9yZXMtPnBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfQkFORF8yNF9NU0spID8KKwkJCQlJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKIAlyeF9zdGF0dXMuZnJlcSA9CiAJCWllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShsZTE2X3RvX2NwdShwaHlfcmVzLT5jaGFubmVsKSwKIAkJCQkJCQlyeF9zdGF0dXMuYmFuZCk7Ci0Jcnhfc3RhdHVzLmJhbmQgPSAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykgPwotCQkJCUlFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOwogCXJ4X3N0YXR1cy5yYXRlX2lkeCA9CiAJCWl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeChyYXRlX25fZmxhZ3MsIHJ4X3N0YXR1cy5iYW5kKTsKIAlyeF9zdGF0dXMuZmxhZyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYwppbmRleCBmNTQzM2M3Li5mYWNjOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKQEAgLTEyMTgsMTAgKzEyMTgsMTAgQEAKIAkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKIAkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwogCSAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CisJaWYgKHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSAmJgorCSAgICAocHJpdi0+c3dpdGNoX2NoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CiAJCUlXTF9ERUJVR18xMUgocHJpdiwgImFib3J0IGNoYW5uZWwgc3dpdGNoIG9uICVkXG4iLAotCQkgICAgICBsZTE2X3RvX2NwdShwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsKSk7CisJCSAgICAgIGxlMTZfdG9fY3B1KHByaXYtPnN3aXRjaF9jaGFubmVsKSk7CiAJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7CiAJfQogCkBAIC0xMjM3LDcgKzEyMzcsNyBAQAogCiAJCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwogCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gc2V0X3R4X3Bvd2VyOwogCX0KIAogCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKQEAgLTEzMTcsNiArMTMxNyw3IEBACiAKIAlpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHkocHJpdik7CiAKK3NldF90eF9wb3dlcjoKIAkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAogCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLwogCXJldCA9IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIHRydWUpOwpAQCAtMTQwMyw5ICsxNDA0LDYgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwotCiAJcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsCiAJCQkgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKIH0KQEAgLTE1NDMsNyArMTU0MSw3IEBACiAJczMyIHRlbXA7CiAKIAl0ZW1wID0gaXdsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUocHJpdik7Ci0JaWYgKHRlbXAgPCAwKQorCWlmIChJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfT1VUX09GX1JBTkdFKHRlbXApKQogCQlyZXR1cm47CiAKIAlpZiAocHJpdi0+dGVtcGVyYXR1cmUgIT0gdGVtcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMKaW5kZXggNDJkZjgzMi4uM2JlNzZiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCkBAIC04NTksMTIgKzg1OSw4IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQogfQogRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUpOwogCkBAIC04NzYsMTkgKzg3MiwxOSBAQAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CiAJc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAodm9pZCAqKSZjdHgtPmFjdGl2ZTsKIAotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpIHsKLQkJaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYKLQkJICAgIChjc2EtPmNoYW5uZWwgPT0gcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCkpIHsKLQkJCXJ4b24tPmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKLQkJCUlXTF9ERUJVR18xMUgocHJpdiwgIkNTQSBub3RpZjogY2hhbm5lbCAlZFxuIiwKKwlpZiAoIXRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYgY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9jaGFubmVsKSB7CisJCXJ4b24tPmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7CisJCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCiAJCQkgICAgICBsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKLQkJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAotCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwotCQl9CisJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKKwl9IGVsc2UgeworCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOworCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9jc2EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmgKaW5kZXggYmM2NmM2MC4uYzVmYmRhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCkBAIC01NjAsNyArNTYwLDcgQEAKICNkZWZpbmUgU1RBVFVTX1NDQU5fSFcJCTE1CiAjZGVmaW5lIFNUQVRVU19QT1dFUl9QTUkJMTYKICNkZWZpbmUgU1RBVFVTX0ZXX0VSUk9SCQkxNwotCisjZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oCmluZGV4IGJlMDEwNmMuLmVhMzAxMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKQEAgLTg1NSwxNyArODU1LDYgQEAKIH07CiAKIC8qCi0gKiBpd2xfc3dpdGNoX3J4b246ICJjaGFubmVsIHN3aXRjaCIgc3RydWN0dXJlCi0gKgotICogQCBzd2l0Y2hfaW5fcHJvZ3Jlc3M6IGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzCi0gKiBAIGNoYW5uZWw6IG5ldyBjaGFubmVsCi0gKi8KLXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gewotCWJvb2wgc3dpdGNoX2luX3Byb2dyZXNzOwotCV9fbGUxNiBjaGFubmVsOwotfTsKLQotLyoKICAqIHNjaGVkdWxlIHRoZSB0aW1lciB0byB3YWtlIHVwIGV2ZXJ5IFVDT0RFX1RSQUNFX1BFUklPRCBtaWxsaXNlY29uZHMKICAqIHRvIHBlcmZvcm0gY29udGludW91cyB1Q29kZSBldmVudCBsb2dnaW5nIG9wZXJhdGlvbiBpZiBlbmFibGVkCiAgKi8KQEAgLTExMTUsNyArMTEwNCw3IEBACiAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCBjb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsKIAotCXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gc3dpdGNoX3J4b247CisJX19sZTE2IHN3aXRjaF9jaGFubmVsOwogCiAJLyogMXN0IHJlc3BvbnNlcyBmcm9tIGluaXRpYWxpemUgYW5kIHJ1bnRpbWUgdUNvZGUgaW1hZ2VzLgogCSAqIF80OTY1J3MgaW5pdGlhbGl6ZSBhbGl2ZSByZXNwb25zZSBjb250YWlucyBzb21lIGNhbGlicmF0aW9uIGRhdGEuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCmluZGV4IGFmMmFlMjIuLjcxNTdiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCkBAIC0yODYxLDE2ICsyODYxLDEzIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpCisJICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlnb3RvIG91dDsKIAogCWlmICghaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQogCQlnb3RvIG91dDsKIAotCS8qIGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzICovCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9PSB0cnVlKQotCQlnb3RvIG91dDsKLQogCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpIHsKIAogCQljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOwpAQCAtMjkxOSwxNSArMjkxNiwxOCBAQAogCQkJICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKIAkJCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCiAJCQkgKi8KLQkJCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwKLQkJCQkJCQkJICAgIGNoX3N3aXRjaCkpCi0JCQkJcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCQlzZXRfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKKwkJCXByaXYtPnN3aXRjaF9jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOworCQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LCBjaF9zd2l0Y2gpKSB7CisJCQkJY2xlYXJfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLAorCQkJCQkgICZwcml2LT5zdGF0dXMpOworCQkJCXByaXYtPnN3aXRjaF9jaGFubmVsID0gMDsKKwkJCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgZmFsc2UpOworCQkJfQogCQl9CiAJfQogb3V0OgogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICghcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKQotCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgZmFsc2UpOwogCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKaW5kZXggNjFkNGExMS4uMmE4OGU3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgogI2luY2x1ZGUgIml3bC1kZXYuaCIKQEAgLTU1LDEwICs1NiwxMCBAQAogI2RlZmluZSBJV0wxMDBfVUNPREVfQVBJX01JTiA1CiAKICNkZWZpbmUgSVdMMTAwMF9GV19QUkUgIml3bHdpZmktMTAwMC0iCi0jZGVmaW5lIElXTDEwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMTAwMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0wxMDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwMDBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0wxMDBfRldfUFJFICJpd2x3aWZpLTEwMC0iCi0jZGVmaW5lIElXTDEwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMDBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMMTAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKaW5kZXggODZmZWVjOC4uM2RmNzZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgogI2luY2x1ZGUgIml3bC1kZXYuaCIKQEAgLTU4LDEzICs1OSwxMyBAQAogI2RlZmluZSBJV0wxMDVfVUNPREVfQVBJX01JTiA1CiAKICNkZWZpbmUgSVdMMjAzMF9GV19QUkUgIml3bHdpZmktMjAzMC0iCi0jZGVmaW5lIElXTDIwMzBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMjAzMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0wyMDMwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDIwMzBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0wyMDAwX0ZXX1BSRSAiaXdsd2lmaS0yMDAwLSIKLSNkZWZpbmUgSVdMMjAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wyMDAwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDIwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMjAwMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIElXTDEwNV9GV19QUkUgIml3bHdpZmktMTA1LSIKLSNkZWZpbmUgSVdMMTA1X01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwNV9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0wxMDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMTA1X0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKIHN0YXRpYyB2b2lkIGl3bDIwMDBfc2V0X2N0X3RocmVzaG9sZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CkBAIC0xNzcsNzkgKzE3OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXdsMjAzMF9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0JLyoKLQkgKiBNVUxUSS1GSVhNRQotCSAqIFNlZSBpd2xfbWFjX2NoYW5uZWxfc3dpdGNoLgotCSAqLwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGl3bDYwMDBfY2hhbm5lbF9zd2l0Y2hfY21kIGNtZDsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQl1MzIgc3dpdGNoX3RpbWVfaW5fdXNlYywgdWNvZGVfc3dpdGNoX3RpbWU7Ci0JdTE2IGNoOwotCXUzMiB0c2ZfbG93OwotCXU4IHN3aXRjaF9jb3VudDsKLQl1MTYgYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoY3R4LT50aW1pbmcuYmVhY29uX2ludGVydmFsKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBoY21kID0gewotCQkuaWQgPSBSRVBMWV9DSEFOTkVMX1NXSVRDSCwKLQkJLmxlbiA9IHsgc2l6ZW9mKGNtZCksIH0sCi0JCS5mbGFncyA9IENNRF9TWU5DLAotCQkuZGF0YSA9IHsgJmNtZCwgfSwKLQl9OwotCi0JY21kLmJhbmQgPSBwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0JY2ggPSBjaF9zd2l0Y2gtPmNoYW5uZWwtPmh3X3ZhbHVlOwotCUlXTF9ERUJVR18xMUgocHJpdiwgImNoYW5uZWwgc3dpdGNoIGZyb20gJXUgdG8gJXVcbiIsCi0JCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKLQljbWQucnhvbl9mbGFncyA9IGN0eC0+c3RhZ2luZy5mbGFnczsKLQljbWQucnhvbl9maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOwotCXN3aXRjaF9jb3VudCA9IGNoX3N3aXRjaC0+Y291bnQ7Ci0JdHNmX2xvdyA9IGNoX3N3aXRjaC0+dGltZXN0YW1wICYgMHgwZmZmZmZmZmY7Ci0JLyoKLQkgKiBjYWxjdWxhdGUgdGhlIHVjb2RlIGNoYW5uZWwgc3dpdGNoIHRpbWUKLQkgKiBhZGRpbmcgVFNGIGFzIG9uZSBvZiB0aGUgZmFjdG9yIGZvciB3aGVuIHRvIHN3aXRjaAotCSAqLwotCWlmICgocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgPiB0c2ZfbG93KSAmJiBiZWFjb25faW50ZXJ2YWwpIHsKLQkJaWYgKHN3aXRjaF9jb3VudCA+ICgocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgLSB0c2ZfbG93KSAvCi0JCSAgICBiZWFjb25faW50ZXJ2YWwpKSB7Ci0JCQlzd2l0Y2hfY291bnQgLT0gKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0KLQkJCQl0c2ZfbG93KSAvIGJlYWNvbl9pbnRlcnZhbDsKLQkJfSBlbHNlCi0JCQlzd2l0Y2hfY291bnQgPSAwOwotCX0KLQlpZiAoc3dpdGNoX2NvdW50IDw9IDEpCi0JCWNtZC5zd2l0Y2hfdGltZSA9IGNwdV90b19sZTMyKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lKTsKLQllbHNlIHsKLQkJc3dpdGNoX3RpbWVfaW5fdXNlYyA9Ci0JCQl2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgKiBzd2l0Y2hfY291bnQgKiBUSU1FX1VOSVQ7Ci0JCXVjb2RlX3N3aXRjaF90aW1lID0gaXdsX3VzZWNzX3RvX2JlYWNvbnMocHJpdiwKLQkJCQkJCXN3aXRjaF90aW1lX2luX3VzZWMsCi0JCQkJCQliZWFjb25faW50ZXJ2YWwpOwotCQljbWQuc3dpdGNoX3RpbWUgPSBpd2xfYWRkX2JlYWNvbl90aW1lKHByaXYsCi0JCQkJCQlwcml2LT51Y29kZV9iZWFjb25fdGltZSwKLQkJCQkJCXVjb2RlX3N3aXRjaF90aW1lLAotCQkJCQkJYmVhY29uX2ludGVydmFsKTsKLQl9Ci0JSVdMX0RFQlVHXzExSChwcml2LCAidUNvZGUgdGltZSBmb3IgdGhlIHN3aXRjaCBpcyAweCV4XG4iLAotCQkgICAgICBjbWQuc3dpdGNoX3RpbWUpOwotCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBwcml2LT5iYW5kLCBjaCk7Ci0JaWYgKGNoX2luZm8pCi0JCWNtZC5leHBlY3RfYmVhY29uID0gaXNfY2hhbm5lbF9yYWRhcihjaF9pbmZvKTsKLQllbHNlIHsKLQkJSVdMX0VSUihwcml2LCAiaW52YWxpZCBjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAotCQkJY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwotCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7Ci0KLQlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwotfQotCiBzdGF0aWMgc3RydWN0IGl3bF9saWJfb3BzIGl3bDIwMDBfbGliID0gewogCS5zZXRfaHdfcGFyYW1zID0gaXdsMjAwMF9od19zZXRfaHdfcGFyYW1zLAogCS5yeF9oYW5kbGVyX3NldHVwID0gaXdsYWduX3J4X2hhbmRsZXJfc2V0dXAsCkBAIC0yNTgsNyArMTg2LDYgQEAKIAkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bGFnbl9od192YWxpZF9ydGNfZGF0YV9hZGRyLAogCS5zZW5kX3R4X3Bvd2VyID0gaXdsYWduX3NlbmRfdHhfcG93ZXIsCiAJLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bF91cGRhdGVfY2hhaW5fZmxhZ3MsCi0JLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDIwMzBfaHdfY2hhbm5lbF9zd2l0Y2gsCiAJLmFwbV9vcHMgPSB7CiAJCS5pbml0ID0gaXdsX2FwbV9pbml0LAogCQkuY29uZmlnID0gaXdsMjAwMF9uaWNfY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCmluZGV4IGE3MGI4Y2YuLmU4MTZjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCkBAIC01NywxMCArNTgsMTAgQEAKICNkZWZpbmUgSVdMNTE1MF9VQ09ERV9BUElfTUlOIDEKIAogI2RlZmluZSBJV0w1MDAwX0ZXX1BSRSAiaXdsd2lmaS01MDAwLSIKLSNkZWZpbmUgSVdMNTAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w1MDAwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDUwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNTAwMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIElXTDUxNTBfRldfUFJFICJpd2x3aWZpLTUxNTAtIgotI2RlZmluZSBJV0w1MTUwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDUxNTBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMNTE1MF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w1MTUwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKIC8qIE5JQyBjb25maWd1cmF0aW9uIGZvciA1MDAwIHNlcmllcyAqLwogc3RhdGljIHZvaWQgaXdsNTAwMF9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKQEAgLTMzMSw4ICszMzIsNiBAQAogCQkJY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwotCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7CiAKIAlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwogfQpAQCAtNDI1LDcgKzQyNCw2IEBACiB9Owogc3RhdGljIHN0cnVjdCBpd2xfaHRfcGFyYW1zIGl3bDUwMDBfaHRfcGFyYW1zID0gewogCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLAotCS51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbiA9IHRydWUsIC8qIHVzZSBydHMvY3RzIHByb3RlY3Rpb24gKi8KIH07CiAKICNkZWZpbmUgSVdMX0RFVklDRV81MDAwCQkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCmluZGV4IGY4YzcxMGQuLjViMTUwYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCkBAIC01OCwxNiArNTksMTYgQEAKICNkZWZpbmUgSVdMNjAwMEcyX1VDT0RFX0FQSV9NSU4gNAogCiAjZGVmaW5lIElXTDYwMDBfRldfUFJFICJpd2x3aWZpLTYwMDAtIgotI2RlZmluZSBJV0w2MDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwMDBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMNjAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDAwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMNjA1MF9GV19QUkUgIml3bHdpZmktNjA1MC0iCi0jZGVmaW5lIElXTDYwNTBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjA1MF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w2MDUwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwNTBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0w2MDA1X0ZXX1BSRSAiaXdsd2lmaS02MDAwZzJhLSIKLSNkZWZpbmUgSVdMNjAwNV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDA1X0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDYwMDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAwNV9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIElXTDYwMzBfRldfUFJFICJpd2x3aWZpLTYwMDBnMmItIgotI2RlZmluZSBJV0w2MDMwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwMzBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMNjAzMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDMwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKIHN0YXRpYyB2b2lkIGl3bDYwMDBfc2V0X2N0X3RocmVzaG9sZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CkBAIC0yNzAsOCArMjcxLDYgQEAKIAkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCiAJcmV0dXJuIGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKIH0KQEAgLTYwMywxOSArNjAyLDI3IEBACiAJSVdMX0RFVklDRV82MDUwLAogfTsKIAorI2RlZmluZSBJV0xfREVWSUNFXzYxNTAJCQkJCQlcCisJLmZ3X25hbWVfcHJlID0gSVdMNjA1MF9GV19QUkUsCQkJCVwKKwkudWNvZGVfYXBpX21heCA9IElXTDYwNTBfVUNPREVfQVBJX01BWCwJCQlcCisJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDUwX1VDT0RFX0FQSV9NSU4sCQkJXAorCS5vcHMgPSAmaXdsNjE1MF9vcHMsCQkJCQlcCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNjE1MF9FRVBST01fVkVSU0lPTiwJCVwKKwkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MTUwX1RYX1BPV0VSX1ZFUlNJT04sCVwKKwkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywJCQlcCisJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAorCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKKwkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKKwogc3RydWN0IGl3bF9jZmcgaXdsNjE1MF9iZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gKyBXaU1BWCA2MTUwIEJHTiIsCi0JLmZ3X25hbWVfcHJlID0gSVdMNjA1MF9GV19QUkUsCi0JLnVjb2RlX2FwaV9tYXggPSBJV0w2MDUwX1VDT0RFX0FQSV9NQVgsCi0JLnVjb2RlX2FwaV9taW4gPSBJV0w2MDUwX1VDT0RFX0FQSV9NSU4sCi0JLmVlcHJvbV92ZXIgPSBFRVBST01fNjE1MF9FRVBST01fVkVSU0lPTiwKLQkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MTUwX1RYX1BPV0VSX1ZFUlNJT04sCi0JLm9wcyA9ICZpd2w2MTUwX29wcywKLQkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywKKwlJV0xfREVWSUNFXzYxNTAsCiAJLmh0X3BhcmFtcyA9ICZpd2w2MDAwX2h0X3BhcmFtcywKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwKLQkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUsCit9OworCitzdHJ1Y3QgaXdsX2NmZyBpd2w2MTUwX2JnX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OICsgV2lNQVggNjE1MCBCRyIsCisJSVdMX0RFVklDRV82MTUwLAogfTsKIAogc3RydWN0IGl3bF9jZmcgaXdsNjAwMF8zYWduX2NmZyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taGNtZC5jCmluZGV4IGIxMmM3MmQuLjIzZmE5M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWhjbWQuYwpAQCAtMTYzLDE3ICsxNjMsOSBAQAogCQkJCSAgICAgX19sZTE2IGZjLCBfX2xlMzIgKnR4X2ZsYWdzKQogewogCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTIHx8Ci0JICAgIGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSB7CisJICAgIGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUIHx8CisJICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKIAkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfUFJPVF9SRVFVSVJFX01TSzsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwcml2LT5jZmctPmh0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24gJiYKLQkgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7Ci0JCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1BST1RfUkVRVUlSRV9NU0s7Ci0JCXJldHVybjsKLQl9CiB9CiAKIC8qIENhbGMgbWF4IHNpZ25hbCBsZXZlbCAoZEJtKSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKaW5kZXggYTk1YWQ4NC4uMDlmNjc5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jCkBAIC0zMjUsNiArMzI1LDE0IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKKwkvKgorCSAqIGZvcmNlIENUUy10by1zZWxmIGZyYW1lcyBwcm90ZWN0aW9uIGlmIFJUUy1DVFMgaXMgbm90IHByZWZlcnJlZAorCSAqIG9uZSBhZ2dyZWdhdGlvbiBwcm90ZWN0aW9uIG1ldGhvZAorCSAqLworCWlmICghKHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCisJICAgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSkKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NFTEZfQ1RTX0VOOworCiAJaWYgKChjdHgtPnZpZiAmJiBjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpIHx8CiAJICAgICEoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSkKIAkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwpAQCAtMzQyLDEwICszNTAsMTAgQEAKIAkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKIAkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwogCSAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CisJaWYgKHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSAmJgorCSAgICAocHJpdi0+c3dpdGNoX2NoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CiAJCUlXTF9ERUJVR18xMUgocHJpdiwgImFib3J0IGNoYW5uZWwgc3dpdGNoIG9uICVkXG4iLAotCQkgICAgICBsZTE2X3RvX2NwdShwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsKSk7CisJCQkgICAgICBsZTE2X3RvX2NwdShwcml2LT5zd2l0Y2hfY2hhbm5lbCkpOwogCQlpd2xfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7CiAJfQogCkBAIC0zNjIsNiArMzcwLDExIEBACiAJCX0KIAogCQltZW1jcHkoYWN0aXZlLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZSkpOworCQkvKgorCQkgKiBXZSBkbyBub3QgY29tbWl0IHR4IHBvd2VyIHNldHRpbmdzIHdoaWxlIGNoYW5uZWwgY2hhbmdpbmcsCisJCSAqIGRvIGl0IG5vdyBpZiBhZnRlciBzZXR0aW5ncyBjaGFuZ2VkLgorCQkgKi8KKwkJaXdsX3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwppbmRleCAxMWM2YzExLi44ZTE5NDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwpAQCAtMjg0MywxNiArMjg0MywxMyBAQAogCQlnb3RvIG91dDsKIAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKQorCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJZ290byBvdXQ7CiAKIAlpZiAoIWl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQogCQlnb3RvIG91dDsKIAotCS8qIGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzICovCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9PSB0cnVlKQotCQlnb3RvIG91dDsKLQogCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpIHsKIAogCQljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOwpAQCAtMjkwMSwxNSArMjg5OCwxOSBAQAogCQkJICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKIAkJCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCiAJCQkgKi8KKwkJCXNldF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOworCQkJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7CiAJCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKHByaXYsCi0JCQkJCQkJCSAgICBjaF9zd2l0Y2gpKQotCQkJCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJCQkJCQkgICAgY2hfc3dpdGNoKSkgeworCQkJCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywKKwkJCQkJICAmcHJpdi0+c3RhdHVzKTsKKwkJCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKKwkJCX0KIAkJfQogCX0KIG91dDoKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQlpZiAoIXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKIH0KIApAQCAtMzgzMSwxMSArMzgzMiwxMSBAQAogCiAvKiA2MTUwIFdpRmkvV2lNYXggU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzA1LCBpd2w2MTUwX2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMDYsIGl3bDYxNTBfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMwNywgaXdsNjE1MF9iZ19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMjUsIGl3bDYxNTBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMyNiwgaXdsNjE1MF9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzI3LCBpd2w2MTUwX2JnX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4ODYsIDB4MTMxNSwgaXdsNjE1MF9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NiwgMHgxMzE2LCBpd2w2MTUwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg2LCAweDEzMTcsIGl3bDYxNTBfYmdfY2ZnKX0sCiAKIC8qIDEwMDAgU2VyaWVzIFdpRmkgKi8KIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEyMDUsIGl3bDEwMDBfYmduX2NmZyl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaAppbmRleCAyNDk1ZmU3Li5kMTcxNjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaApAQCAtODksNiArODksNyBAQAogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwNTBfMmFnbl9jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjA1MF8yYWJnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MTUwX2Jnbl9jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjE1MF9iZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTAwMF9iZ25fY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEwMDBfYmdfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEwMF9iZ25fY2ZnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCmluZGV4IDQ2NTNkZWEuLjQ1Y2M1MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKQEAgLTg0MywxMiArODQzLDggQEAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCXJldHVybjsKIAotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGlzX3N1Y2Nlc3MpOwotCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IGZhbHNlOwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQl9CiB9CiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwpAQCAtMTc2Nyw2ICsxNzYzLDcgQEAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmJzc19jdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3ZpZnR5cGUgPSBuZXd0eXBlOwogCXUzMiBpbnRlcmZhY2VfbW9kZXM7CiAJaW50IGVycjsKIApAQCAtMTgyMiw3ICsxODE5LDcgQEAKIAogCS8qIHN1Y2Nlc3MgKi8KIAlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgdHJ1ZSk7Ci0JdmlmLT50eXBlID0gbmV3dHlwZTsKKwl2aWYtPnR5cGUgPSBuZXd2aWZ0eXBlOwogCXZpZi0+cDJwID0gbmV3cDJwOwogCWVyciA9IGl3bF9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKIAlXQVJOX09OKGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKaW5kZXggM2JiNzZmNi4uYTU0ZDQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaApAQCAtNTYwLDYgKzU2MCw3IEBACiAjZGVmaW5lIFNUQVRVU19QT1dFUl9QTUkJMTYKICNkZWZpbmUgU1RBVFVTX0ZXX0VSUk9SCQkxNwogI2RlZmluZSBTVEFUVVNfREVWSUNFX0VOQUJMRUQJMTgKKyNkZWZpbmUgU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcgMTkKIAogCiBzdGF0aWMgaW5saW5lIGludCBpd2xfaXNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaAppbmRleCAyMmE2ZTNlLi5jOGRlMjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaApAQCAtOTgyLDE3ICs5ODIsNiBAQAogfTsKIAogLyoKLSAqIGl3bF9zd2l0Y2hfcnhvbjogImNoYW5uZWwgc3dpdGNoIiBzdHJ1Y3R1cmUKLSAqCi0gKiBAIHN3aXRjaF9pbl9wcm9ncmVzczogY2hhbm5lbCBzd2l0Y2ggaW4gcHJvZ3Jlc3MKLSAqIEAgY2hhbm5lbDogbmV3IGNoYW5uZWwKLSAqLwotc3RydWN0IGl3bF9zd2l0Y2hfcnhvbiB7Ci0JYm9vbCBzd2l0Y2hfaW5fcHJvZ3Jlc3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci19OwotCi0vKgogICogc2NoZWR1bGUgdGhlIHRpbWVyIHRvIHdha2UgdXAgZXZlcnkgVUNPREVfVFJBQ0VfUEVSSU9EIG1pbGxpc2Vjb25kcwogICogdG8gcGVyZm9ybSBjb250aW51b3VzIHVDb2RlIGV2ZW50IGxvZ2dpbmcgb3BlcmF0aW9uIGlmIGVuYWJsZWQKICAqLwpAQCAtMTI4Nyw3ICsxMjc2LDcgQEAKIAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0IGNvbnRleHRzW05VTV9JV0xfUlhPTl9DVFhdOwogCi0Jc3RydWN0IGl3bF9zd2l0Y2hfcnhvbiBzd2l0Y2hfcnhvbjsKKwlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CiAKIAlzdHJ1Y3QgewogCQl1MzIgZXJyb3JfZXZlbnRfdGFibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYwppbmRleCAwMDUzZTllLi5iNzc0NTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKQEAgLTI1MCwxOSArMjUwLDE5IEBACiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKIAlzdHJ1Y3QgaXdsX3J4b25fY21kICpyeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7Ci0JCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmCi0JCSAgICAoY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwpKSB7Ci0JCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmIGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfY2hhbm5lbCkgeworCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAogCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAotCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7Ci0JCX0KKwkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJSVdMX0VSUihwcml2LCAiQ1NBIG5vdGlmIChmYWlsKSA6IGNoYW5uZWwgJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKKwkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKaW5kZXggNjg2ZTE3Ni4uMTM3ZGJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXdsYWduX3VubWFwX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfY21kX21ldGEgKm1ldGEsCi0JCQkgICAgIHN0cnVjdCBpd2xfdGZkICp0ZmQpCisJCQkgICAgIHN0cnVjdCBpd2xfdGZkICp0ZmQsIGludCBkbWFfZGlyKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwcml2LT5wY2lfZGV2OwogCWludCBpOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJLyogVW5tYXAgY2h1bmtzLCBpZiBhbnkuICovCiAJZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKIAkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGl3bF90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKLQkJCQlpd2xfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJaXdsX3RmZF90Yl9nZXRfbGVuKHRmZCwgaSksIGRtYV9kaXIpOwogfQogCiAvKioKQEAgLTE2Nyw3ICsxNjcsOCBAQAogCXN0cnVjdCBpd2xfdGZkICp0ZmRfdG1wID0gdHhxLT50ZmRzOwogCWludCBpbmRleCA9IHR4cS0+cS5yZWFkX3B0cjsKIAotCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgJnR4cS0+bWV0YVtpbmRleF0sICZ0ZmRfdG1wW2luZGV4XSk7CisJaXdsYWduX3VubWFwX3RmZChwcml2LCAmdHhxLT5tZXRhW2luZGV4XSwgJnRmZF90bXBbaW5kZXhdLAorCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwogCiAJLyogZnJlZSBTS0IgKi8KIAlpZiAodHhxLT50eGIpIHsKQEAgLTMxMCw5ICszMTEsNyBAQAogCQlpID0gZ2V0X2NtZF9pbmRleChxLCBxLT5yZWFkX3B0cik7CiAKIAkJaWYgKHR4cS0+bWV0YVtpXS5mbGFncyAmIENNRF9NQVBQRUQpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAorCQkJaXdsYWduX3VubWFwX3RmZChwcml2LCAmdHhxLT5tZXRhW2ldLCAmdHhxLT50ZmRzW2ldLAogCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAkJCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7CiAJCX0KQEAgLTUzNSwxMiArNTM0LDcgQEAKIHZvaWQgaXdsX3R4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAogCQkJaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCkKIHsKLQlpbnQgYWN0dWFsX3Nsb3RzID0gc2xvdHNfbnVtOwotCi0JaWYgKHR4cV9pZCA9PSBwcml2LT5jbWRfcXVldWUpCi0JCWFjdHVhbF9zbG90cysrOwotCi0JbWVtc2V0KHR4cS0+bWV0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfY21kX21ldGEpICogYWN0dWFsX3Nsb3RzKTsKKwltZW1zZXQodHhxLT5tZXRhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9jbWRfbWV0YSkgKiBzbG90c19udW0pOwogCiAJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7CiAKQEAgLTcwMCwxMCArNjk0LDExIEBACiAJCWlmICghKGNtZC0+ZGF0YWZsYWdzW2ldICYgSVdMX0hDTURfREZMX05PQ09QWSkpCiAJCQljb250aW51ZTsKIAkJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwgKHZvaWQgKiljbWQtPmRhdGFbaV0sCi0JCQkJCSAgIGNtZC0+bGVuW2ldLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJICAgY21kLT5sZW5baV0sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+cGNpX2RldiwgcGh5c19hZGRyKSkgewogCQkJaXdsYWduX3VubWFwX3RmZChwcml2LCBvdXRfbWV0YSwKLQkJCQkJICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7CisJCQkJCSAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0sCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCQkJaWR4ID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC04MDcsNyArODAyLDcgQEAKIAljbWQgPSB0eHEtPmNtZFtjbWRfaW5kZXhdOwogCW1ldGEgPSAmdHhxLT5tZXRhW2NtZF9pbmRleF07CiAKLQlpd2xhZ25fdW5tYXBfdGZkKHByaXYsIG1ldGEsICZ0eHEtPnRmZHNbaW5kZXhdKTsKKwlpd2xhZ25fdW5tYXBfdGZkKHByaXYsIG1ldGEsICZ0eHEtPnRmZHNbaW5kZXhdLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCiAJLyogSW5wdXQgZXJyb3IgY2hlY2tpbmcgaXMgZG9uZSB3aGVuIGNvbW1hbmRzIGFyZSBhZGRlZCB0byBxdWV1ZS4gKi8KIAlpZiAobWV0YS0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKaW5kZXggODQ1NjZkYi4uNzFjOGYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKQEAgLTk5NCw2ICs5OTQsOCBAQAogCWNtZCA9IGNtZG5vZGUtPmNtZGJ1ZjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCXByaXYtPnNlcW51bSsrOworCWNtZC0+c2VxbnVtID0gY3B1X3RvX2xlMTYocHJpdi0+c2VxbnVtKTsKIAlwcml2LT5jdXJfY21kID0gY21kbm9kZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCkBAIC0xNjIxLDExICsxNjIzLDkgQEAKIAkvKiBDb3B5IHRoZSBpbmNvbWluZyBjb21tYW5kIHRvIHRoZSBidWZmZXIgKi8KIAltZW1jcHkoY21kbm9kZS0+Y21kYnVmLCBpbl9jbWQsIGluX2NtZF9zaXplKTsKIAotCS8qIFNldCBzZXF1ZW5jZSBudW1iZXIsIGNsZWFuIHJlc3VsdCwgbW92ZSB0byBidWZmZXIgKi8KLQlwcml2LT5zZXFudW0rKzsKKwkvKiBTZXQgY29tbWFuZCwgY2xlYW4gcmVzdWx0LCBtb3ZlIHRvIGJ1ZmZlciAqLwogCWNtZG5vZGUtPmNtZGJ1Zi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNvbW1hbmQpOwogCWNtZG5vZGUtPmNtZGJ1Zi0+c2l6ZSAgICA9IGNwdV90b19sZTE2KGluX2NtZF9zaXplKTsKLQljbWRub2RlLT5jbWRidWYtPnNlcW51bSAgPSBjcHVfdG9fbGUxNihwcml2LT5zZXFudW0pOwogCWNtZG5vZGUtPmNtZGJ1Zi0+cmVzdWx0ICA9IDA7CiAKIAlsYnNfZGViX2hvc3QoIlBSRVBfQ01EOiBjb21tYW5kIDB4JTA0eFxuIiwgY29tbWFuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKaW5kZXggYTdiNWNiMC4uMjI0ZTk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYwpAQCAtOTA3LDcgKzkwNyw3IEBACiAJY2FyZCA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CiAKIAljYXVzZSA9IHNkaW9fcmVhZGIoY2FyZC0+ZnVuYywgSUZfU0RJT19IX0lOVF9TVEFUVVMsICZyZXQpOwotCWlmIChyZXQpCisJaWYgKHJldCB8fCAhY2F1c2UpCiAJCWdvdG8gb3V0OwogCiAJbGJzX2RlYl9zZGlvKCJpbnRlcnJ1cHQ6IDB4JVhcbiIsICh1bnNpZ25lZCljYXVzZSk7CkBAIC0xMDA4LDEwICsxMDA4LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIHJlbGVhc2U7CiAKLQlyZXQgPSBzZGlvX2NsYWltX2lycShmdW5jLCBpZl9zZGlvX2ludGVycnVwdCk7Ci0JaWYgKHJldCkKLQkJZ290byBkaXNhYmxlOwotCiAJLyogRm9yIDEtYml0IHRyYW5zZmVycyB0byB0aGUgODY4NiBtb2RlbCwgd2UgbmVlZCB0byBlbmFibGUgdGhlCiAJICogaW50ZXJydXB0IGZsYWcgaW4gdGhlIENDQ1IgcmVnaXN0ZXIuIFNldCB0aGUgTU1DX1FVSVJLX0xFTklFTlRfRk4wCiAJICogYml0IHRvIGFsbG93IGFjY2VzcyB0byBub24tdmVuZG9yIHJlZ2lzdGVycy4gKi8KQEAgLTEwODMsNiArMTA3OSwyMSBAQAogCQljYXJkLT5yeF91bml0ID0gMDsKIAogCS8qCisJICogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBsYXRlLgorCSAqCisJICogSWYgd2Ugc2V0IGl0IHVwIGVhcmxpZXIsIHRoZSAoYnVnZ3kpIGhhcmR3YXJlIGdlbmVyYXRlcyBhIHNwdXJpb3VzCisJICogaW50ZXJydXB0LCBldmVuIGJlZm9yZSB0aGUgaW50ZXJydXB0IGhhcyBiZWVuIGVuYWJsZWQsIHdpdGgKKwkgKiBDQ0NSX0lOVHggPSAwLgorCSAqCisJICogV2UgcmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyIGxhdGUgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGFueQorCSAqIHNwdXJpb3VzIGludGVycnVwdHMsIGFuZCBhbHNvIHRvIGF2b2lkIGdlbmVyYXRpb24gb2YgdGhhdCBrbm93bgorCSAqIHNwdXJpb3VzIGludGVycnVwdCBpbiB0aGUgZmlyc3QgcGxhY2UuCisJICovCisJcmV0ID0gc2Rpb19jbGFpbV9pcnEoZnVuYywgaWZfc2Rpb19pbnRlcnJ1cHQpOworCWlmIChyZXQpCisJCWdvdG8gZGlzYWJsZTsKKworCS8qCiAJICogRW5hYmxlIGludGVycnVwdHMgbm93IHRoYXQgZXZlcnl0aGluZyBpcyBzZXQgdXAKIAkgKi8KIAlzZGlvX3dyaXRlYihmdW5jLCAweDBmLCBJRl9TRElPX0hfSU5UX01BU0ssICZyZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCmluZGV4IDY2MDgzMWMuLjY4N2MxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKQEAgLTEyODgsNiArMTI4OCw4IEBACiAKIAkqKHVuc2lnbmVkIGxvbmcgKikgd2Rldl9wcml2ID0gKHVuc2lnbmVkIGxvbmcpIHByaXY7CiAKKwlzZXRfd2lwaHlfZGV2KHdkZXYtPndpcGh5LCAoc3RydWN0IGRldmljZSAqKSBwcml2LT5hZGFwdGVyLT5kZXYpOworCiAJcmV0ID0gd2lwaHlfcmVnaXN0ZXIod2Rldi0+d2lwaHkpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiJXM6IHJlZ2lzdGVyaW5nIGNmZzgwMjExIGRldmljZVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKaW5kZXggYTBlOWJjNS4uNGU5N2U5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKQEAgLTE2Nyw4ICsxNjcsOCBAQAogLyogUnggdW5pdCByZWdpc3RlciAqLwogI2RlZmluZSBDQVJEX1JYX1VOSVRfUkVHCQkweDYzCiAKLS8qIEV2ZW50IGhlYWRlciBMZW4qLwotI2RlZmluZSBNV0lGSUVYX0VWRU5UX0hFQURFUl9MRU4gICAgICAgICAgIDgKKy8qIEV2ZW50IGhlYWRlciBsZW4gdy9vIDQgYnl0ZXMgb2YgaW50ZXJmYWNlIGhlYWRlciAqLworI2RlZmluZSBNV0lGSUVYX0VWRU5UX0hFQURFUl9MRU4gICAgICAgICAgIDQKIAogLyogTWF4IHJldHJ5IG51bWJlciBvZiBDTUQ1MyB3cml0ZSAqLwogI2RlZmluZSBNQVhfV1JJVEVfSU9NRU1fUkVUUlkJCTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCmluZGV4IDMyMjYxMTguLmFlYWMzY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYwpAQCAtMjQ3NCw2ICsyNDc0LDcgQEAKICAqIGZhc3RlciBjbGllbnQuCiAgKi8KICNkZWZpbmUgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19FTkFCTEVfTElGRV9USU1FX0VYUElSWQkweDAwMDAwNDAwCisjZGVmaW5lIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfR0VORVJBVEVfQ0NNUF9IRFIJMHgwMDAwMDIwMAogI2RlZmluZSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RfREVDUl9NR01UCQkweDAwMDAwMDgwCiAjZGVmaW5lIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfSE9TVEZPUk1fUFJPQkVSRVNQCTB4MDAwMDAwMjAKICNkZWZpbmUgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19IT1NURk9STV9CRUFDT04JCTB4MDAwMDAwMTAKQEAgLTI1MTAsNyArMjUxMSw4IEBACiAJY21kLT5mbGFncyA9IGNwdV90b19sZTMyKE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfSE9TVF9ERUNSX01HTVQgfAogCQkJCSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RGT1JNX1BST0JFUkVTUCB8CiAJCQkJIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfSE9TVEZPUk1fQkVBQ09OIHwKLQkJCQkgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19FTkFCTEVfTElGRV9USU1FX0VYUElSWSk7CisJCQkJIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfRU5BQkxFX0xJRkVfVElNRV9FWFBJUlkgfAorCQkJCSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0dFTkVSQVRFX0NDTVBfSERSKTsKIAljbWQtPm51bV90eF9kZXNjX3Blcl9xdWV1ZSA9IGNwdV90b19sZTMyKE1XTDhLX1RYX0RFU0NTKTsKIAljbWQtPnRvdGFsX3J4ZCA9IGNwdV90b19sZTMyKE1XTDhLX1JYX0RFU0NTKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZwppbmRleCA5ZGVmMWU1Li5iMmY4YjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZwpAQCAtMTY2LDcgKzE2Niw2IEBACiBjb25maWcgUlQyODAwVVNCX1JUNTNYWAogICAgICAgIGJvb2wgInJ0MjgwMHVzYiAtIEluY2x1ZGUgc3VwcG9ydCBmb3IgcnQ1M3h4IGRldmljZXMgKEVYUEVSSU1FTlRBTCkiCiAgICAgICAgZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLSAgICAgICBkZWZhdWx0IHkKICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgcnQ1M3h4IHdpcmVsZXNzIGNoaXBzZXQgZmFtaWx5IHRvIHRoZQogICAgICAgICAgcnQyODAwcGNpIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYwppbmRleCA1NTUxODBkLi5iNzA0ZTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY29uZmlnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNvbmZpZy5jCkBAIC0yNTAsNyArMjUwLDggQEAKIAlpZiAoaWVlZTgwMjExX2ZsYWdzICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpCiAJCXJ0MngwMGxpbmtfcmVzZXRfdHVuZXIocnQyeDAwZGV2LCBmYWxzZSk7CiAKLQlpZiAodGVzdF9iaXQoUkVRVUlSRV9QU19BVVRPV0FLRSwgJnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSAmJgorCWlmICh0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpICYmCisJICAgIHRlc3RfYml0KFJFUVVJUkVfUFNfQVVUT1dBS0UsICZydDJ4MDBkZXYtPmNhcF9mbGFncykgJiYKIAkgICAgKGllZWU4MDIxMV9mbGFncyAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykgJiYKIAkgICAgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpKSB7CiAJCWJlYWNvbl9kaWZmID0gKGxvbmcpamlmZmllcyAtIChsb25nKXJ0MngwMGRldi0+bGFzdF9iZWFjb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKaW5kZXggYzAxOGQ2Ny4uOTM5ODIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYwpAQCAtMTQ2LDYgKzE0Niw5IEBACiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9CiAJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnQyeDAwX2RldiwgYXV0b3dha2V1cF93b3JrLndvcmspOwogCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKIAlpZiAocnQyeDAwZGV2LT5vcHMtPmxpYi0+c2V0X2RldmljZV9zdGF0ZShydDJ4MDBkZXYsIFNUQVRFX0FXQUtFKSkKIAkJRVJST1IocnQyeDAwZGV2LCAiRGV2aWNlIGZhaWxlZCB0byB3YWtldXAuXG4iKTsKIAljbGVhcl9iaXQoQ09ORklHX1BPV0VSU0FWSU5HLCAmcnQyeDAwZGV2LT5mbGFncyk7CkBAIC0xMTYwLDYgKzExNjMsNyBAQAogCSAqIFN0b3AgYWxsIHdvcmsuCiAJICovCiAJY2FuY2VsX3dvcmtfc3luYygmcnQyeDAwZGV2LT5pbnRmX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnQyeDAwZGV2LT5hdXRvd2FrZXVwX3dvcmspOwogCWlmIChydDJ4MDBfaXNfdXNiKHJ0MngwMGRldikpIHsKIAkJZGVsX3RpbWVyX3N5bmMoJnJ0MngwMGRldi0+dHhzdGF0dXNfdGltZXIpOwogCQljYW5jZWxfd29ya19zeW5jKCZydDJ4MDBkZXYtPnJ4ZG9uZV93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCmluZGV4IGE0MDk1MjguLjI1NGI2NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYwpAQCAtNjY5LDYgKzY2OSwxNCBAQAogCQkJCQkJCSAmcnhfc3RhdHVzLAogCQkJCQkJCSAodTggKikgcGRlc2MsIHNrYik7CiAKKwkJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHJ0bHBjaS0+cnhidWZmZXJzaXplKTsKKwkJCWlmICh1bmxpa2VseSghbmV3X3NrYikpIHsKKwkJCQlSVF9UUkFDRShydGxwcml2LCAoQ09NUF9JTlRSIHwgQ09NUF9SRUNWKSwKKwkJCQkJIERCR19ETUVTRywKKwkJCQkJICgiY2FuJ3QgYWxsb2Mgc2tiIGZvciByeFxuIikpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwogCQkJcGNpX3VubWFwX3NpbmdsZShydGxwY2ktPnBkZXYsCiAJCQkJCSAqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpLAogCQkJCQkgcnRscGNpLT5yeGJ1ZmZlcnNpemUsCkBAIC02OTAsNyArNjk4LDcgQEAKIAkJCWhkciA9IHJ0bF9nZXRfaGRyKHNrYik7CiAJCQlmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKIAotCQkJaWYgKCFzdGF0cy5jcmMgfHwgIXN0YXRzLmh3ZXJyb3IpIHsKKwkJCWlmICghc3RhdHMuY3JjICYmICFzdGF0cy5od2Vycm9yKSB7CiAJCQkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmcnhfc3RhdHVzLAogCQkJCSAgICAgICBzaXplb2Yocnhfc3RhdHVzKSk7CiAKQEAgLTc1OCwxNSArNzY2LDcgQEAKIAkJCQlydGxfbHBzX2xlYXZlKGh3KTsKIAkJCX0KIAotCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOwotCQkJaWYgKHVubGlrZWx5KCFuZXdfc2tiKSkgewotCQkJCVJUX1RSQUNFKHJ0bHByaXYsIChDT01QX0lOVFIgfCBDT01QX1JFQ1YpLAotCQkJCQkgREJHX0RNRVNHLAotCQkJCQkgKCJjYW4ndCBhbGxvYyBza2IgZm9yIHJ4XG4iKSk7Ci0JCQkJZ290byBkb25lOwotCQkJfQogCQkJc2tiID0gbmV3X3NrYjsKLQkJCS8qc2tiLT5kZXYgPSBkZXY7ICovCiAKIAkJCXJ0bHBjaS0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdLnJ4X2J1ZltydGxwY2ktPgogCQkJCQkJCSAgICAgcnhfcmluZwpAQCAtMTExMyw2ICsxMTEzLDEzIEBACiAKIAkJcnRscGNpLT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0uaWR4ID0gMDsKIAorCQkvKiBJZiBhbXNkdV84ayBpcyBkaXNhYmxlZCwgc2V0IGJ1ZmZlcnNpemUgdG8gNDA5Ni4gVGhpcworCQkgKiBjaGFuZ2Ugd2lsbCByZWR1Y2UgbWVtb3J5IGZyYWdtZW50YXRpb24uCisJCSAqLworCQlpZiAocnRscGNpLT5yeGJ1ZmZlcnNpemUgPiA0MDk2ICYmCisJCSAgICBydGxwcml2LT5ydGxoYWwuZGlzYWJsZV9hbXNkdV84aykKKwkJCXJ0bHBjaS0+cnhidWZmZXJzaXplID0gNDA5NjsKKwogCQlmb3IgKGkgPSAwOyBpIDwgcnRscGNpLT5yeHJpbmdjb3VudDsgaSsrKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0KIAkJCSAgICBkZXZfYWxsb2Nfc2tiKHJ0bHBjaS0+cnhidWZmZXJzaXplKTsKQEAgLTE2MTcsNiArMTYyNCwxNiBAQAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4OCwgJnJldmlzaW9uaWQpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4M0MsICZpcnFsaW5lKTsKIAorCS8qIFBDSSBJRCAweDEwZWM6MHg4MTkyIG9jY3VycyBmb3IgYm90aCBSVEw4MTkyRSwgd2hpY2ggdXNlcworCSAqIHI4MTkyZV9wY2ksIGFuZCBSVEw4MTkyU0UsIHdoaWNoIHVzZXMgdGhpcyBkcml2ZXIuIElmIHRoZQorCSAqIHJldmlzaW9uIElEIGlzIFJUTF9QQ0lfUkVWSVNJT05fSURfODE5MlBDSUUgKDB4MDEpLCB0aGVuCisJICogdGhlIGNvcnJlY3QgZHJpdmVyIGlzIHI4MTkyZV9wY2ksIHRodXMgdGhpcyByb3V0aW5lIHNob3VsZAorCSAqIHJldHVybiBmYWxzZS4KKwkgKi8KKwlpZiAoZGV2aWNlaWQgPT0gUlRMX1BDSV84MTkyU0VfRElEICYmCisJICAgIHJldmlzaW9uaWQgPT0gUlRMX1BDSV9SRVZJU0lPTl9JRF84MTkyUENJRSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKGRldmljZWlkID09IFJUTF9QQ0lfODE5Ml9ESUQgfHwKIAkgICAgZGV2aWNlaWQgPT0gUlRMX1BDSV8wMDQ0X0RJRCB8fAogCSAgICBkZXZpY2VpZCA9PSBSVExfUENJXzAwNDdfRElEIHx8CkBAIC0xODQ5LDcgKzE4NjYsOCBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDA0LCAweDA3KTsKIAogCS8qIGZpbmQgYWRhcHRlciAqLwotCV9ydGxfcGNpX2ZpbmRfYWRhcHRlcihwZGV2LCBodyk7CisJaWYgKCFfcnRsX3BjaV9maW5kX2FkYXB0ZXIocGRldiwgaHcpKQorCQlnb3RvIGZhaWwzOwogCiAJLyogSW5pdCBJTyBoYW5kbGVyICovCiAJX3J0bF9wY2lfaW9faGFuZGxlcl9pbml0KCZwZGV2LT5kZXYsIGh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCmluZGV4IGJlZTdjMTQuLjk0MmY3YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYwpAQCAtNTMsNiArNTMsOCBAQAogc3RhdGljIGludCBydGw5MmN1X2luaXRfc3dfdmFycyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwlpbnQgZXJyOwogCiAJcnRscHJpdi0+ZG0uZG1faW5pdGlhbGdhaW5fZW5hYmxlID0gMTsKIAlydGxwcml2LT5kbS5kbV9mbGFnID0gMDsKQEAgLTY0LDYgKzY2LDI0IEBACiAJCQkgKCJDYW4ndCBhbGxvYyBidWZmZXIgZm9yIGZ3LlxuIikpOwogCQlyZXR1cm4gMTsKIAl9CisJLyogcmVxdWVzdCBmdyAqLworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBydGxwcml2LT5jZmctPmZ3X25hbWUsCisJCQlydGxwcml2LT5pby5kZXYpOworCWlmIChlcnIpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIkZhaWxlZCB0byByZXF1ZXN0IGZpcm13YXJlIVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGZpcm13YXJlLT5zaXplID4gMHg0MDAwKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJGaXJtd2FyZSBpcyB0b28gYmlnIVxuIikpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbWNweShydGxwcml2LT5ydGxoYWwucGZpcm13YXJlLCBmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUpOworCXJ0bHByaXYtPnJ0bGhhbC5md3NpemUgPSBmaXJtd2FyZS0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNzgsNiArMjk4LDcgQEAKIAl7UlRMX1VTQl9ERVZJQ0UoMHgwNmY4LCAweGUwMzMsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkhlcmN1bGVzIC0gRWRpbWF4Ki8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxODgsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkFib2NvbSAtIEFib2NvbSovCiAJe1JUTF9VU0JfREVWSUNFKDB4MDdiOCwgMHg4MTg5LCBydGw5MmN1X2hhbF9jZmcpfSwgLypGdW5haSAtIEFib2NvbSovCisJe1JUTF9VU0JfREVWSUNFKDB4MDg0NiwgMHg5MDQxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOZXRHZWFyIFdOQTEwMDBNKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwRGY2LCAweDAwNTIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlNpdGVjb20gLSBFZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDBlYjAsIDB4OTA3MSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qTk8gQnJhbmQgLSBFdG9wKi8KIAkvKiBIUCAtIExpdGUtT24gLDgxODhDVVMgU2xpbSBDb21ibyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jb25mLmgKaW5kZXggMWFiNmM4Ni4uYzgzZmVmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY29uZi5oCkBAIC0xMTU3LDYgKzExNTcsOSBAQAogCS8qIHRpbWUgdG8gd2FpdCBvbiB0aGUgY2hhbm5lbCBmb3IgcGFzc2l2ZSBzY2FucyAoaW4gVFVzKSAqLwogCXUzMiBkd2VsbF90aW1lX3Bhc3NpdmU7CiAKKwkvKiB0aW1lIHRvIHdhaXQgb24gdGhlIGNoYW5uZWwgZm9yIERGUyBzY2FucyAoaW4gVFVzKSAqLworCXUzMiBkd2VsbF90aW1lX2RmczsKKwogCS8qIG51bWJlciBvZiBwcm9iZSByZXF1ZXN0cyB0byBzZW5kIG9uIGVhY2ggY2hhbm5lbCBpbiBhY3RpdmUgc2NhbnMgKi8KIAl1OCBudW1fcHJvYmVfcmVxczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMKaW5kZXggYmMwMGU1Mi4uZTY0OTdkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvbWFpbi5jCkBAIC0zMTEsNiArMzExLDcgQEAKIAkJLm1pbl9kd2VsbF90aW1lX2FjdGl2ZSA9IDgsCiAJCS5tYXhfZHdlbGxfdGltZV9hY3RpdmUgPSAzMCwKIAkJLmR3ZWxsX3RpbWVfcGFzc2l2ZSAgICA9IDEwMCwKKwkJLmR3ZWxsX3RpbWVfZGZzICAgICAgICA9IDE1MCwKIAkJLm51bV9wcm9iZV9yZXFzICAgICAgICA9IDIsCiAJCS5yc3NpX3RocmVzaG9sZCAgICAgICAgPSAtOTAsCiAJCS5zbnJfdGhyZXNob2xkICAgICAgICAgPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmMKaW5kZXggZjM3ZTVhMy4uNTZmNzZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jCkBAIC0zMzEsMTYgKzMzMSwyMiBAQAogCXN0cnVjdCBjb25mX3NjaGVkX3NjYW5fc2V0dGluZ3MgKmMgPSAmd2wtPmNvbmYuc2NoZWRfc2NhbjsKIAlpbnQgaSwgajsKIAl1MzIgZmxhZ3M7CisJYm9vbCBmb3JjZV9wYXNzaXZlID0gIXJlcS0+bl9zc2lkczsKIAogCWZvciAoaSA9IDAsIGogPSBzdGFydDsKIAkgICAgIGkgPCByZXEtPm5fY2hhbm5lbHMgJiYgaiA8IE1BWF9DSEFOTkVMU19BTExfQkFORFM7CiAJICAgICBpKyspIHsKIAkJZmxhZ3MgPSByZXEtPmNoYW5uZWxzW2ldLT5mbGFnczsKIAotCQlpZiAoIShmbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSAmJgotCQkgICAgKChmbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikgPT0gcGFzc2l2ZSkgJiYKLQkJICAgICgoZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUikgPT0gcmFkYXIpICYmCi0JCSAgICAocmVxLT5jaGFubmVsc1tpXS0+YmFuZCA9PSBiYW5kKSkgeworCQlpZiAoZm9yY2VfcGFzc2l2ZSkKKwkJCWZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKworCQlpZiAoKHJlcS0+Y2hhbm5lbHNbaV0tPmJhbmQgPT0gYmFuZCkgJiYKKwkJICAgICEoZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkgJiYKKwkJICAgICghIShmbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKSA9PSByYWRhcikgJiYKKwkJICAgIC8qIGlmIHJhZGFyIGlzIHNldCwgd2UgaWdub3JlIHRoZSBwYXNzaXZlIGZsYWcgKi8KKwkJICAgIChyYWRhciB8fAorCQkgICAgICEhKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSA9PSBwYXNzaXZlKSkgewogCQkJd2wxMjcxX2RlYnVnKERFQlVHX1NDQU4sICJiYW5kICVkLCBjZW50ZXJfZnJlcSAlZCAiLAogCQkJCSAgICAgcmVxLT5jaGFubmVsc1tpXS0+YmFuZCwKIAkJCQkgICAgIHJlcS0+Y2hhbm5lbHNbaV0tPmNlbnRlcl9mcmVxKTsKQEAgLTM1MCw3ICszNTYsMTIgQEAKIAkJCXdsMTI3MV9kZWJ1ZyhERUJVR19TQ0FOLCAibWF4X3Bvd2VyICVkIiwKIAkJCQkgICAgIHJlcS0+Y2hhbm5lbHNbaV0tPm1heF9wb3dlcik7CiAKLQkJCWlmIChmbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikgeworCQkJaWYgKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIpIHsKKwkJCQljaGFubmVsc1tqXS5mbGFncyB8PSBTQ0FOX0NIQU5ORUxfRkxBR1NfREZTOworCQkJCWNoYW5uZWxzW2pdLnBhc3NpdmVfZHVyYXRpb24gPQorCQkJCQljcHVfdG9fbGUxNihjLT5kd2VsbF90aW1lX2Rmcyk7CisJCQl9CisJCQllbHNlIGlmIChmbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikgewogCQkJCWNoYW5uZWxzW2pdLnBhc3NpdmVfZHVyYXRpb24gPQogCQkJCQljcHVfdG9fbGUxNihjLT5kd2VsbF90aW1lX3Bhc3NpdmUpOwogCQkJfSBlbHNlIHsKQEAgLTM1OSw3ICszNzAsNyBAQAogCQkJCWNoYW5uZWxzW2pdLm1heF9kdXJhdGlvbiA9CiAJCQkJCWNwdV90b19sZTE2KGMtPm1heF9kd2VsbF90aW1lX2FjdGl2ZSk7CiAJCQl9Ci0JCQljaGFubmVsc1tqXS50eF9wb3dlcl9hdHQgPSByZXEtPmNoYW5uZWxzW2pdLT5tYXhfcG93ZXI7CisJCQljaGFubmVsc1tqXS50eF9wb3dlcl9hdHQgPSByZXEtPmNoYW5uZWxzW2ldLT5tYXhfcG93ZXI7CiAJCQljaGFubmVsc1tqXS5jaGFubmVsID0gcmVxLT5jaGFubmVsc1tpXS0+aHdfdmFsdWU7CiAKIAkJCWorKzsKQEAgLTM4Niw3ICszOTcsMTEgQEAKIAkJd2wxMjcxX3NjYW5fZ2V0X3NjaGVkX3NjYW5fY2hhbm5lbHMod2wsIHJlcSwgY2ZnLT5jaGFubmVscywKIAkJCQkJCSAgICBJRUVFODAyMTFfQkFORF8yR0haLAogCQkJCQkJICAgIGZhbHNlLCBmYWxzZSwgaWR4KTsKLQlpZHggKz0gY2ZnLT5hY3RpdmVbMF07CisJLyoKKwkgKiA1R0h6IGNoYW5uZWxzIGFsd2F5cyBzdGFydCBhdCBwb3NpdGlvbiAxNCwgbm90IGltbWVkaWF0ZWx5CisJICogYWZ0ZXIgdGhlIGxhc3QgMi40R0h6IGNoYW5uZWwKKwkgKi8KKwlpZHggPSAxNDsKIAogCWNmZy0+cGFzc2l2ZVsxXSA9CiAJCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHMsCkBAIC0zOTQsMjIgKzQwOSwyMyBAQAogCQkJCQkJICAgIGZhbHNlLCB0cnVlLCBpZHgpOwogCWlkeCArPSBjZmctPnBhc3NpdmVbMV07CiAKLQljZmctPmFjdGl2ZVsxXSA9Ci0JCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHMsCi0JCQkJCQkgICAgSUVFRTgwMjExX0JBTkRfNUdIWiwKLQkJCQkJCSAgICBmYWxzZSwgZmFsc2UsIDE0KTsKLQlpZHggKz0gY2ZnLT5hY3RpdmVbMV07Ci0KIAljZmctPmRmcyA9CiAJCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHMsCiAJCQkJCQkgICAgSUVFRTgwMjExX0JBTkRfNUdIWiwKLQkJCQkJCSAgICB0cnVlLCBmYWxzZSwgaWR4KTsKKwkJCQkJCSAgICB0cnVlLCB0cnVlLCBpZHgpOwogCWlkeCArPSBjZmctPmRmczsKIAorCWNmZy0+YWN0aXZlWzFdID0KKwkJd2wxMjcxX3NjYW5fZ2V0X3NjaGVkX3NjYW5fY2hhbm5lbHMod2wsIHJlcSwgY2ZnLT5jaGFubmVscywKKwkJCQkJCSAgICBJRUVFODAyMTFfQkFORF81R0haLAorCQkJCQkJICAgIGZhbHNlLCBmYWxzZSwgaWR4KTsKKwlpZHggKz0gY2ZnLT5hY3RpdmVbMV07CisKIAl3bDEyNzFfZGVidWcoREVCVUdfU0NBTiwgIiAgICAyLjRHSHo6IGFjdGl2ZSAlZCBwYXNzaXZlICVkIiwKIAkJICAgICBjZmctPmFjdGl2ZVswXSwgY2ZnLT5wYXNzaXZlWzBdKTsKIAl3bDEyNzFfZGVidWcoREVCVUdfU0NBTiwgIiAgICA1R0h6OiBhY3RpdmUgJWQgcGFzc2l2ZSAlZCIsCiAJCSAgICAgY2ZnLT5hY3RpdmVbMV0sIGNmZy0+cGFzc2l2ZVsxXSk7CisJd2wxMjcxX2RlYnVnKERFQlVHX1NDQU4sICIgICAgREZTOiAlZCIsIGNmZy0+ZGZzKTsKIAogCXJldHVybiBpZHg7CiB9CkBAIC00MjEsNiArNDM3LDcgQEAKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF9zY2hlZF9zY2FuX2NvbmZpZyAqY2ZnID0gTlVMTDsKIAlzdHJ1Y3QgY29uZl9zY2hlZF9zY2FuX3NldHRpbmdzICpjID0gJndsLT5jb25mLnNjaGVkX3NjYW47CiAJaW50IGksIHRvdGFsX2NoYW5uZWxzLCByZXQ7CisJYm9vbCBmb3JjZV9wYXNzaXZlID0gIXJlcS0+bl9zc2lkczsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgc2NoZWRfc2NhbiBzY2FuIGNvbmZpZyIpOwogCkBAIC00NDQsNyArNDYxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU0NBTl9NQVhfQ1lDTEVfSU5URVJWQUxTOyBpKyspCiAJCWNmZy0+aW50ZXJ2YWxzW2ldID0gY3B1X3RvX2xlMzIocmVxLT5pbnRlcnZhbCk7CiAKLQlpZiAocmVxLT5zc2lkc1swXS5zc2lkX2xlbiAmJiByZXEtPnNzaWRzWzBdLnNzaWQpIHsKKwlpZiAoIWZvcmNlX3Bhc3NpdmUgJiYgcmVxLT5zc2lkc1swXS5zc2lkX2xlbiAmJiByZXEtPnNzaWRzWzBdLnNzaWQpIHsKIAkJY2ZnLT5maWx0ZXJfdHlwZSA9IFNDQU5fU1NJRF9GSUxURVJfU1BFQ0lGSUM7CiAJCWNmZy0+c3NpZF9sZW4gPSByZXEtPnNzaWRzWzBdLnNzaWRfbGVuOwogCQltZW1jcHkoY2ZnLT5zc2lkLCByZXEtPnNzaWRzWzBdLnNzaWQsCkBAIC00NjEsNyArNDc4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNmZy0+YWN0aXZlWzBdKSB7CisJaWYgKCFmb3JjZV9wYXNzaXZlICYmIGNmZy0+YWN0aXZlWzBdKSB7CiAJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHdsLCByZXEtPnNzaWRzWzBdLnNzaWQsCiAJCQkJCQkgcmVxLT5zc2lkc1swXS5zc2lkX2xlbiwKIAkJCQkJCSBpZXMtPmllW0lFRUU4MDIxMV9CQU5EXzJHSFpdLApAQCAtNDczLDcgKzQ5MCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoY2ZnLT5hY3RpdmVbMV0pIHsKKwlpZiAoIWZvcmNlX3Bhc3NpdmUgJiYgY2ZnLT5hY3RpdmVbMV0pIHsKIAkJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEod2wsICByZXEtPnNzaWRzWzBdLnNzaWQsCiAJCQkJCQkgcmVxLT5zc2lkc1swXS5zc2lkX2xlbiwKIAkJCQkJCSBpZXMtPmllW0lFRUU4MDIxMV9CQU5EXzVHSFpdLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmgKaW5kZXggYzgzMzE5NS4uYTBiNmM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oCkBAIC0xMzcsNiArMTM3LDkgQEAKIAlTQ0FOX0JTU19UWVBFX0FOWSwKIH07CiAKKyNkZWZpbmUgU0NBTl9DSEFOTkVMX0ZMQUdTX0RGUwkJQklUKDApCisjZGVmaW5lIFNDQU5fQ0hBTk5FTF9GTEFHU19ERlNfRU5BQkxFRAlCSVQoMSkKKwogc3RydWN0IGNvbm5fc2Nhbl9jaF9wYXJhbXMgewogCV9fbGUxNiBtaW5fZHVyYXRpb247CiAJX19sZTE2IG1heF9kdXJhdGlvbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKaW5kZXggMGU4MTk5NC4uNjMxMTk0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKQEAgLTE1MzMsNiArMTUzMywzMSBAQAogbW9kdWxlX2luaXQodXNiX2luaXQpOwogbW9kdWxlX2V4aXQodXNiX2V4aXQpOwogCitzdGF0aWMgaW50IHpkX2VwX3JlZ3Nfb3V0X21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJCSAgICAgIGludCAqYWN0dWFsX2xlbmd0aCwgaW50IHRpbWVvdXQpCit7CisJLyogSW4gVVNCIDIuMCBtb2RlIEVQX1JFR1NfT1VUIGVuZHBvaW50IGlzIGludGVycnVwdCB0eXBlLiBIb3dldmVyIGluCisJICogVVNCIDEuMSBtb2RlIGVuZHBvaW50IGlzIGJ1bGsuIFNlbGVjdCBjb3JyZWN0IHR5cGUgVVJCIGJ5IGVuZHBvaW50CisJICogZGVzY3JpcHRvci4KKwkgKi8KKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOworCXVuc2lnbmVkIGludCBwaXBlOworCisJcGlwZSA9IHVzYl9zbmRpbnRwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKTsKKwllcCA9IHVzYl9waXBlX2VuZHBvaW50KHVkZXYsIHBpcGUpOworCWlmICghZXApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludCgmZXAtPmRlc2MpKSB7CisJCXJldHVybiB1c2JfaW50ZXJydXB0X21zZyh1ZGV2LCBwaXBlLCBkYXRhLCBsZW4sCisJCQkJCSBhY3R1YWxfbGVuZ3RoLCB0aW1lb3V0KTsKKwl9IGVsc2UgeworCQlwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKTsKKwkJcmV0dXJuIHVzYl9idWxrX21zZyh1ZGV2LCBwaXBlLCBkYXRhLCBsZW4sIGFjdHVhbF9sZW5ndGgsCisJCQkJICAgIHRpbWVvdXQpOworCX0KK30KKwogc3RhdGljIGludCB1c2JfaW50X3JlZ3NfbGVuZ3RoKHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB1c2JfaW50X3JlZ3MpICsgY291bnQgKiBzaXplb2Yoc3RydWN0IHJlZ19kYXRhKTsKQEAgLTE2NDgsMTUgKzE2NzMsMTQgQEAKIAogCXVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CiAJcHJlcGFyZV9yZWFkX3JlZ3NfaW50KHVzYik7Ci0JciA9IHVzYl9pbnRlcnJ1cHRfbXNnKHVkZXYsIHVzYl9zbmRpbnRwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKSwKLQkJCSAgICAgIHJlcSwgcmVxX2xlbiwgJmFjdHVhbF9yZXFfbGVuLCA1MCAvKiBtcyAqLyk7CisJciA9IHpkX2VwX3JlZ3Nfb3V0X21zZyh1ZGV2LCByZXEsIHJlcV9sZW4sICZhY3R1YWxfcmVxX2xlbiwgNTAgLyptcyovKTsKIAlpZiAocikgewogCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAotCQkJImVycm9yIGluIHVzYl9pbnRlcnJ1cHRfbXNnKCkuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCQkiZXJyb3IgaW4gemRfZXBfcmVnc19vdXRfbXNnKCkuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWlmIChyZXFfbGVuICE9IGFjdHVhbF9yZXFfbGVuKSB7Ci0JCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJlcnJvciBpbiB1c2JfaW50ZXJydXB0X21zZygpXG4iCisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJlcnJvciBpbiB6ZF9lcF9yZWdzX291dF9tc2coKVxuIgogCQkJIiByZXFfbGVuICVkICE9IGFjdHVhbF9yZXFfbGVuICVkXG4iLAogCQkJcmVxX2xlbiwgYWN0dWFsX3JlcV9sZW4pOwogCQlyID0gLUVJTzsKQEAgLTE4MTgsOSArMTg0MiwxNyBAQAogCQlydy0+dmFsdWUgPSBjcHVfdG9fbGUxNihpb3JlcXNbaV0udmFsdWUpOwogCX0KIAotCXVzYl9maWxsX2ludF91cmIodXJiLCB1ZGV2LCB1c2Jfc25kaW50cGlwZSh1ZGV2LCBFUF9SRUdTX09VVCksCi0JCQkgcmVxLCByZXFfbGVuLCBpb3dyaXRlMTZ2X3VyYl9jb21wbGV0ZSwgdXNiLAotCQkJIGVwLT5kZXNjLmJJbnRlcnZhbCk7CisJLyogSW4gVVNCIDIuMCBtb2RlIGVuZHBvaW50IGlzIGludGVycnVwdCB0eXBlLiBIb3dldmVyIGluIFVTQiAxLjEgbW9kZQorCSAqIGVuZHBvaW50IGlzIGJ1bGsuIFNlbGVjdCBjb3JyZWN0IHR5cGUgVVJCIGJ5IGVuZHBvaW50IGRlc2NyaXB0b3IuCisJICovCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludCgmZXAtPmRlc2MpKQorCQl1c2JfZmlsbF9pbnRfdXJiKHVyYiwgdWRldiwgdXNiX3NuZGludHBpcGUodWRldiwgRVBfUkVHU19PVVQpLAorCQkJCSByZXEsIHJlcV9sZW4sIGlvd3JpdGUxNnZfdXJiX2NvbXBsZXRlLCB1c2IsCisJCQkJIGVwLT5kZXNjLmJJbnRlcnZhbCk7CisJZWxzZQorCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVkZXYsIHVzYl9zbmRidWxrcGlwZSh1ZGV2LCBFUF9SRUdTX09VVCksCisJCQkJICByZXEsIHJlcV9sZW4sIGlvd3JpdGUxNnZfdXJiX2NvbXBsZXRlLCB1c2IpOworCiAJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfRlJFRV9CVUZGRVI7CiAKIAkvKiBTdWJtaXQgcHJldmlvdXMgVVJCICovCkBAIC0xOTI0LDE1ICsxOTU2LDE0IEBACiAJfQogCiAJdWRldiA9IHpkX3VzYl90b191c2JkZXYodXNiKTsKLQlyID0gdXNiX2ludGVycnVwdF9tc2codWRldiwgdXNiX3NuZGludHBpcGUodWRldiwgRVBfUkVHU19PVVQpLAotCQkJICAgICAgcmVxLCByZXFfbGVuLCAmYWN0dWFsX3JlcV9sZW4sIDUwIC8qIG1zICovKTsKKwlyID0gemRfZXBfcmVnc19vdXRfbXNnKHVkZXYsIHJlcSwgcmVxX2xlbiwgJmFjdHVhbF9yZXFfbGVuLCA1MCAvKm1zKi8pOwogCWlmIChyKSB7CiAJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCi0JCQkiZXJyb3IgaW4gdXNiX2ludGVycnVwdF9tc2coKS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJCSJlcnJvciBpbiB6ZF9lcF9yZWdzX291dF9tc2coKS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChyZXFfbGVuICE9IGFjdHVhbF9yZXFfbGVuKSB7Ci0JCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJlcnJvciBpbiB1c2JfaW50ZXJydXB0X21zZygpIgorCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiZXJyb3IgaW4gemRfZXBfcmVnc19vdXRfbXNnKCkiCiAJCQkiIHJlcV9sZW4gJWQgIT0gYWN0dWFsX3JlcV9sZW4gJWRcbiIsCiAJCQlyZXFfbGVuLCBhY3R1YWxfcmVxX2xlbik7CiAJCXIgPSAtRUlPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCmluZGV4IGEzOTg0ZjQuLmYzNGI1YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKQEAgLTE0MSw2ICsxNDEsMTMgQEAKIAkubm90aWZpZXJfY2FsbCA9IG1vZHVsZV9sb2FkX25vdGlmeSwKIH07CiAKK3N0YXRpYyB2b2lkIGZyZWVfYWxsX3Rhc2tzKHZvaWQpCit7CisJLyogbWFrZSBzdXJlIHdlIGRvbid0IGxlYWsgdGFzayBzdHJ1Y3RzICovCisJcHJvY2Vzc190YXNrX21vcnR1YXJ5KCk7CisJcHJvY2Vzc190YXNrX21vcnR1YXJ5KCk7Cit9CisKIGludCBzeW5jX3N0YXJ0KHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTE0OCw4ICsxNTUsNiBAQAogCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZtYXJrZWRfY3B1cywgR0ZQX0tFUk5FTCkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKLQogCWVyciA9IHRhc2tfaGFuZG9mZl9yZWdpc3RlcigmdGFza19mcmVlX25iKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDE7CkBAIC0xNjYsNyArMTcxLDYgQEAKIAlzdGFydF9jcHVfd29yaygpOwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZidWZmZXJfbXV0ZXgpOwogCXJldHVybiBlcnI7CiBvdXQ0OgogCXByb2ZpbGVfZXZlbnRfdW5yZWdpc3RlcihQUk9GSUxFX01VTk1BUCwgJm11bm1hcF9uYik7CkBAIC0xNzQsNiArMTc4LDcgQEAKIAlwcm9maWxlX2V2ZW50X3VucmVnaXN0ZXIoUFJPRklMRV9UQVNLX0VYSVQsICZ0YXNrX2V4aXRfbmIpOwogb3V0MjoKIAl0YXNrX2hhbmRvZmZfdW5yZWdpc3RlcigmdGFza19mcmVlX25iKTsKKwlmcmVlX2FsbF90YXNrcygpOwogb3V0MToKIAlmcmVlX2NwdW1hc2tfdmFyKG1hcmtlZF9jcHVzKTsKIAlnb3RvIG91dDsKQEAgLTE4MiwyMCArMTg3LDE2IEBACiAKIHZvaWQgc3luY19zdG9wKHZvaWQpCiB7Ci0JLyogZmx1c2ggYnVmZmVycyAqLwotCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7CiAJZW5kX2NwdV93b3JrKCk7CiAJdW5yZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIoJm1vZHVsZV9sb2FkX25iKTsKIAlwcm9maWxlX2V2ZW50X3VucmVnaXN0ZXIoUFJPRklMRV9NVU5NQVAsICZtdW5tYXBfbmIpOwogCXByb2ZpbGVfZXZlbnRfdW5yZWdpc3RlcihQUk9GSUxFX1RBU0tfRVhJVCwgJnRhc2tfZXhpdF9uYik7CiAJdGFza19oYW5kb2ZmX3VucmVnaXN0ZXIoJnRhc2tfZnJlZV9uYik7Ci0JbXV0ZXhfdW5sb2NrKCZidWZmZXJfbXV0ZXgpOworCWJhcnJpZXIoKTsJCQkvKiBkbyBhbGwgb2YgdGhlIGFib3ZlIGZpcnN0ICovCisKIAlmbHVzaF9jcHVfd29yaygpOwogCi0JLyogbWFrZSBzdXJlIHdlIGRvbid0IGxlYWsgdGFzayBzdHJ1Y3RzICovCi0JcHJvY2Vzc190YXNrX21vcnR1YXJ5KCk7Ci0JcHJvY2Vzc190YXNrX21vcnR1YXJ5KCk7Ci0KKwlmcmVlX2FsbF90YXNrcygpOwogCWZyZWVfY3B1bWFza192YXIobWFya2VkX2NwdXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IGM4NWY3NDQuLjA5NDMwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC01MSw2ICs1MSw3IEBACiBvYmotJChDT05GSUdfTU4xMDMwMCkgKz0gc2V0dXAtYnVzLm8KIG9iai0kKENPTkZJR19NSUNST0JMQVpFKSArPSBzZXR1cC1idXMubwogb2JqLSQoQ09ORklHX1RJTEUpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCitvYmotJChDT05GSUdfU1BBUkNfTEVPTikgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KIAogIwogIyBBQ1BJIFJlbGF0ZWQgUENJIEZXIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvZG1hci5jIGIvZHJpdmVycy9wY2kvZG1hci5jCmluZGV4IDEyZTAyYmYuLjNkYzliZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2RtYXIuYworKysgYi9kcml2ZXJzL3BjaS9kbWFyLmMKQEAgLTY5OCwxMiArNjk4LDcgQEAKIAl7CiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKIAkJc3RydWN0IGFjcGlfdGFibGVfZG1hciAqZG1hcjsKLQkJLyoKLQkJICogZm9yIG5vdyB3ZSB3aWxsIGRpc2FibGUgZG1hLXJlbWFwcGluZyB3aGVuIGludGVycnVwdAotCQkgKiByZW1hcHBpbmcgaXMgZW5hYmxlZC4KLQkJICogV2hlbiBzdXBwb3J0IGZvciBxdWV1ZWQgaW52YWxpZGF0aW9uIGZvciBJT1RMQiBpbnZhbGlkYXRpb24KLQkJICogaXMgYWRkZWQsIHdlIHdpbGwgbm90IG5lZWQgdGhpcyBhbnkgbW9yZS4KLQkJICovCisKIAkJZG1hciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyICopIGRtYXJfdGJsOwogCQlpZiAocmV0ICYmIGNwdV9oYXNfeDJhcGljICYmIGRtYXItPmZsYWdzICYgMHgxKQogCQkJcHJpbnRrKEtFUk5fSU5GTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKaW5kZXggNmFmNmI2Mi4uZjAyYzM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYworKysgYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCkBAIC00Nyw2ICs0Nyw4IEBACiAjZGVmaW5lIFJPT1RfU0laRQkJVlREX1BBR0VfU0laRQogI2RlZmluZSBDT05URVhUX1NJWkUJCVZURF9QQUdFX1NJWkUKIAorI2RlZmluZSBJU19CUklER0VfSE9TVF9ERVZJQ0UocGRldikgXAorCQkJICAgICgocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQogI2RlZmluZSBJU19HRlhfREVWSUNFKHBkZXYpICgocGRldi0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpCiAjZGVmaW5lIElTX0lTQV9ERVZJQ0UocGRldikgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0lTQSkKICNkZWZpbmUgSVNfQVpBTElBKHBkZXYpICgocGRldiktPnZlbmRvciA9PSAweDgwODYgJiYgKHBkZXYpLT5kZXZpY2UgPT0gMHgzYTNlKQpAQCAtMTE2LDYgKzExOCwxMSBAQAogCXJldHVybiAocGZuICsgbGV2ZWxfc2l6ZShsZXZlbCkgLSAxKSAmIGxldmVsX21hc2sobGV2ZWwpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbHZsX3RvX25yX3BhZ2VzKHVuc2lnbmVkIGludCBsdmwpCit7CisJcmV0dXJuICAxIDw8ICgobHZsIC0gMSkgKiBMRVZFTF9TVFJJREUpOworfQorCiAvKiBWVC1kIHBhZ2VzIG11c3QgYWx3YXlzIGJlIF9zbWFsbGVyXyB0aGFuIE1NIHBhZ2VzLiBPdGhlcndpc2UgdGhpbmdzCiAgICBhcmUgbmV2ZXIgZ29pbmcgdG8gd29yay4gKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkbWFfdG9fbW1fcGZuKHVuc2lnbmVkIGxvbmcgZG1hX3BmbikKQEAgLTE0Myw2ICsxNTAsMTIgQEAKIHN0YXRpYyBpbnQgcndiZl9xdWlyazsKIAogLyoKKyAqIHNldCB0byAxIHRvIHBhbmljIGtlcm5lbCBpZiBjYW4ndCBzdWNjZXNzZnVsbHkgZW5hYmxlIFZULWQKKyAqICh1c2VkIHdoZW4ga2VybmVsIGlzIGxhdW5jaGVkIHcvIFRYVCkKKyAqLworc3RhdGljIGludCBmb3JjZV9vbiA9IDA7CisKKy8qCiAgKiAwOiBQcmVzZW50CiAgKiAxLTExOiBSZXNlcnZlZAogICogMTItNjM6IENvbnRleHQgUHRyICgxMiAtIChoYXctMSkpCkBAIC0zMzgsNiArMzUxLDkgQEAKIAlpbnQJCWlvbW11X2NvaGVyZW5jeTsvKiBpbmRpY2F0ZSBjb2hlcmVuY3kgb2YgaW9tbXUgYWNjZXNzICovCiAJaW50CQlpb21tdV9zbm9vcGluZzsgLyogaW5kaWNhdGUgc25vb3BpbmcgY29udHJvbCBmZWF0dXJlKi8KIAlpbnQJCWlvbW11X2NvdW50OwkvKiByZWZlcmVuY2UgY291bnQgb2YgaW9tbXUgKi8KKwlpbnQJCWlvbW11X3N1cGVycGFnZTsvKiBMZXZlbCBvZiBzdXBlcnBhZ2VzIHN1cHBvcnRlZDoKKwkJCQkJICAgMCA9PSA0S2lCIChubyBzdXBlcnBhZ2VzKSwgMSA9PSAyTWlCLAorCQkJCQkgICAyID09IDFHaUIsIDMgPT0gNTEyR2lCLCA0ID09IDFUaUIgKi8KIAlzcGlubG9ja190CWlvbW11X2xvY2s7CS8qIHByb3RlY3QgaW9tbXUgc2V0IGluIGRvbWFpbiAqLwogCXU2NAkJbWF4X2FkZHI7CS8qIG1heGltdW0gbWFwcGVkIGFkZHJlc3MgKi8KIH07CkBAIC0zODcsNiArNDAzLDcgQEAKIHN0YXRpYyBpbnQgZG1hcl9tYXBfZ2Z4ID0gMTsKIHN0YXRpYyBpbnQgZG1hcl9mb3JjZWRhYzsKIHN0YXRpYyBpbnQgaW50ZWxfaW9tbXVfc3RyaWN0Oworc3RhdGljIGludCBpbnRlbF9pb21tdV9zdXBlcnBhZ2UgPSAxOwogCiAjZGVmaW5lIERVTU1ZX0RFVklDRV9ET01BSU5fSU5GTyAoKHN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKikoLTEpKQogc3RhdGljIERFRklORV9TUElOTE9DSyhkZXZpY2VfZG9tYWluX2xvY2spOwpAQCAtNDE3LDYgKzQzNCwxMCBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJCSJJbnRlbC1JT01NVTogZGlzYWJsZSBiYXRjaGVkIElPVExCIGZsdXNoXG4iKTsKIAkJCWludGVsX2lvbW11X3N0cmljdCA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAic3Bfb2ZmIiwgNikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiSW50ZWwtSU9NTVU6IGRpc2FibGUgc3VwcG9ydGVkIHN1cGVyIHBhZ2VcbiIpOworCQkJaW50ZWxfaW9tbXVfc3VwZXJwYWdlID0gMDsKIAkJfQogCiAJCXN0ciArPSBzdHJjc3BuKHN0ciwgIiwiKTsKQEAgLTU1NSwxMSArNTc2LDMyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBkb21haW5fdXBkYXRlX2lvbW11X3N1cGVycGFnZShzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKK3sKKwlpbnQgaSwgbWFzayA9IDB4ZjsKKworCWlmICghaW50ZWxfaW9tbXVfc3VwZXJwYWdlKSB7CisJCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gMDsKKwkJcmV0dXJuOworCX0KKworCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gNDsgLyogMVRpQiAqLworCisJZm9yX2VhY2hfc2V0X2JpdChpLCAmZG9tYWluLT5pb21tdV9ibXAsIGdfbnVtX29mX2lvbW11cykgeworCQltYXNrIHw9IGNhcF9zdXBlcl9wYWdlX3ZhbChnX2lvbW11c1tpXS0+Y2FwKTsKKwkJaWYgKCFtYXNrKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlkb21haW4tPmlvbW11X3N1cGVycGFnZSA9IGZscyhtYXNrKTsKK30KKwogLyogU29tZSBjYXBhYmlsaXRpZXMgbWF5IGJlIGRpZmZlcmVudCBhY3Jvc3MgaW9tbXVzICovCiBzdGF0aWMgdm9pZCBkb21haW5fdXBkYXRlX2lvbW11X2NhcChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKIHsKIAlkb21haW5fdXBkYXRlX2lvbW11X2NvaGVyZW5jeShkb21haW4pOwogCWRvbWFpbl91cGRhdGVfaW9tbXVfc25vb3BpbmcoZG9tYWluKTsKKwlkb21haW5fdXBkYXRlX2lvbW11X3N1cGVycGFnZShkb21haW4pOwogfQogCiBzdGF0aWMgc3RydWN0IGludGVsX2lvbW11ICpkZXZpY2VfdG9faW9tbXUoaW50IHNlZ21lbnQsIHU4IGJ1cywgdTggZGV2Zm4pCkBAIC02ODksMjMgKzczMSwzMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRtYV9wdGUgKnBmbl90b19kbWFfcHRlKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGZuKQorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbGFyZ2VfbGV2ZWwpCiB7CiAJaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKIAlzdHJ1Y3QgZG1hX3B0ZSAqcGFyZW50LCAqcHRlID0gTlVMTDsKIAlpbnQgbGV2ZWwgPSBhZ2F3X3RvX2xldmVsKGRvbWFpbi0+YWdhdyk7Ci0JaW50IG9mZnNldDsKKwlpbnQgb2Zmc2V0LCB0YXJnZXRfbGV2ZWw7CiAKIAlCVUdfT04oIWRvbWFpbi0+cGdkKTsKIAlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgcGZuID4+IGFkZHJfd2lkdGgpOwogCXBhcmVudCA9IGRvbWFpbi0+cGdkOwogCisJLyogU2VhcmNoIHB0ZSAqLworCWlmICghbGFyZ2VfbGV2ZWwpCisJCXRhcmdldF9sZXZlbCA9IDE7CisJZWxzZQorCQl0YXJnZXRfbGV2ZWwgPSBsYXJnZV9sZXZlbDsKKwogCXdoaWxlIChsZXZlbCA+IDApIHsKIAkJdm9pZCAqdG1wX3BhZ2U7CiAKIAkJb2Zmc2V0ID0gcGZuX2xldmVsX29mZnNldChwZm4sIGxldmVsKTsKIAkJcHRlID0gJnBhcmVudFtvZmZzZXRdOwotCQlpZiAobGV2ZWwgPT0gMSkKKwkJaWYgKCFsYXJnZV9sZXZlbCAmJiAocHRlLT52YWwgJiBETUFfUFRFX0xBUkdFX1BBR0UpKQorCQkJYnJlYWs7CisJCWlmIChsZXZlbCA9PSB0YXJnZXRfbGV2ZWwpCiAJCQlicmVhazsKIAogCQlpZiAoIWRtYV9wdGVfcHJlc2VudChwdGUpKSB7CkBAIC03MzMsMTAgKzc4MywxMSBAQAogCXJldHVybiBwdGU7CiB9CiAKKwogLyogcmV0dXJuIGFkZHJlc3MncyBwdGUgYXQgc3BlY2lmaWMgbGV2ZWwgKi8KIHN0YXRpYyBzdHJ1Y3QgZG1hX3B0ZSAqZG1hX3Bmbl9sZXZlbF9wdGUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCiAJCQkJCSB1bnNpZ25lZCBsb25nIHBmbiwKLQkJCQkJIGludCBsZXZlbCkKKwkJCQkJIGludCBsZXZlbCwgaW50ICpsYXJnZV9wYWdlKQogewogCXN0cnVjdCBkbWFfcHRlICpwYXJlbnQsICpwdGUgPSBOVUxMOwogCWludCB0b3RhbCA9IGFnYXdfdG9fbGV2ZWwoZG9tYWluLT5hZ2F3KTsKQEAgLTc0OSw4ICs4MDAsMTYgQEAKIAkJaWYgKGxldmVsID09IHRvdGFsKQogCQkJcmV0dXJuIHB0ZTsKIAotCQlpZiAoIWRtYV9wdGVfcHJlc2VudChwdGUpKQorCQlpZiAoIWRtYV9wdGVfcHJlc2VudChwdGUpKSB7CisJCQkqbGFyZ2VfcGFnZSA9IHRvdGFsOwogCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHRlLT52YWwgJiBETUFfUFRFX0xBUkdFX1BBR0UpIHsKKwkJCSpsYXJnZV9wYWdlID0gdG90YWw7CisJCQlyZXR1cm4gcHRlOworCQl9CisKIAkJcGFyZW50ID0gcGh5c190b192aXJ0KGRtYV9wdGVfYWRkcihwdGUpKTsKIAkJdG90YWwtLTsKIAl9CkBAIC03NjMsNiArODIyLDcgQEAKIAkJCQl1bnNpZ25lZCBsb25nIGxhc3RfcGZuKQogewogCWludCBhZGRyX3dpZHRoID0gYWdhd190b193aWR0aChkb21haW4tPmFnYXcpIC0gVlREX1BBR0VfU0hJRlQ7CisJdW5zaWduZWQgaW50IGxhcmdlX3BhZ2UgPSAxOwogCXN0cnVjdCBkbWFfcHRlICpmaXJzdF9wdGUsICpwdGU7CiAKIAlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgc3RhcnRfcGZuID4+IGFkZHJfd2lkdGgpOwpAQCAtNzcxLDE0ICs4MzEsMTUgQEAKIAogCS8qIHdlIGRvbid0IG5lZWQgbG9jayBoZXJlOyBub2JvZHkgZWxzZSB0b3VjaGVzIHRoZSBpb3ZhIHJhbmdlICovCiAJZG8gewotCQlmaXJzdF9wdGUgPSBwdGUgPSBkbWFfcGZuX2xldmVsX3B0ZShkb21haW4sIHN0YXJ0X3BmbiwgMSk7CisJCWxhcmdlX3BhZ2UgPSAxOworCQlmaXJzdF9wdGUgPSBwdGUgPSBkbWFfcGZuX2xldmVsX3B0ZShkb21haW4sIHN0YXJ0X3BmbiwgMSwgJmxhcmdlX3BhZ2UpOwogCQlpZiAoIXB0ZSkgewotCQkJc3RhcnRfcGZuID0gYWxpZ25fdG9fbGV2ZWwoc3RhcnRfcGZuICsgMSwgMik7CisJCQlzdGFydF9wZm4gPSBhbGlnbl90b19sZXZlbChzdGFydF9wZm4gKyAxLCBsYXJnZV9wYWdlICsgMSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlkbyB7IAorCQlkbyB7CiAJCQlkbWFfY2xlYXJfcHRlKHB0ZSk7Ci0JCQlzdGFydF9wZm4rKzsKKwkJCXN0YXJ0X3BmbiArPSBsdmxfdG9fbnJfcGFnZXMobGFyZ2VfcGFnZSk7CiAJCQlwdGUrKzsKIAkJfSB3aGlsZSAoc3RhcnRfcGZuIDw9IGxhc3RfcGZuICYmICFmaXJzdF9wdGVfaW5fcGFnZShwdGUpKTsKIApAQCAtNzk4LDYgKzg1OSw3IEBACiAJaW50IHRvdGFsID0gYWdhd190b19sZXZlbChkb21haW4tPmFnYXcpOwogCWludCBsZXZlbDsKIAl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgbGFyZ2VfcGFnZSA9IDI7CiAKIAlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgc3RhcnRfcGZuID4+IGFkZHJfd2lkdGgpOwogCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBsYXN0X3BmbiA+PiBhZGRyX3dpZHRoKTsKQEAgLTgxMyw3ICs4NzUsMTAgQEAKIAkJCXJldHVybjsKIAogCQlkbyB7Ci0JCQlmaXJzdF9wdGUgPSBwdGUgPSBkbWFfcGZuX2xldmVsX3B0ZShkb21haW4sIHRtcCwgbGV2ZWwpOworCQkJbGFyZ2VfcGFnZSA9IGxldmVsOworCQkJZmlyc3RfcHRlID0gcHRlID0gZG1hX3Bmbl9sZXZlbF9wdGUoZG9tYWluLCB0bXAsIGxldmVsLCAmbGFyZ2VfcGFnZSk7CisJCQlpZiAobGFyZ2VfcGFnZSA+IGxldmVsKQorCQkJCWxldmVsID0gbGFyZ2VfcGFnZSArIDE7CiAJCQlpZiAoIXB0ZSkgewogCQkJCXRtcCA9IGFsaWduX3RvX2xldmVsKHRtcCArIDEsIGxldmVsICsgMSk7CiAJCQkJY29udGludWU7CkBAIC0xMzk3LDYgKzE0NjIsNyBAQAogCWVsc2UKIAkJZG9tYWluLT5pb21tdV9zbm9vcGluZyA9IDA7CiAKKwlkb21haW4tPmlvbW11X3N1cGVycGFnZSA9IGZscyhjYXBfc3VwZXJfcGFnZV92YWwoaW9tbXUtPmNhcCkpOwogCWRvbWFpbi0+aW9tbXVfY291bnQgPSAxOwogCWRvbWFpbi0+bmlkID0gaW9tbXUtPm5vZGU7CiAKQEAgLTE0MTcsNiArMTQ4MywxMCBAQAogCWlmICghZG9tYWluKQogCQlyZXR1cm47CiAKKwkvKiBGbHVzaCBhbnkgbGF6eSB1bm1hcHMgdGhhdCBtYXkgcmVmZXJlbmNlIHRoaXMgZG9tYWluICovCisJaWYgKCFpbnRlbF9pb21tdV9zdHJpY3QpCisJCWZsdXNoX3VubWFwc190aW1lb3V0KDApOworCiAJZG9tYWluX3JlbW92ZV9kZXZfaW5mbyhkb21haW4pOwogCS8qIGRlc3Ryb3kgaW92YXMgKi8KIAlwdXRfaW92YV9kb21haW4oJmRvbWFpbi0+aW92YWQpOwpAQCAtMTY0OCw2ICsxNzE4LDM0IEBACiAJcmV0dXJuIFBBR0VfQUxJR04oaG9zdF9hZGRyICsgc2l6ZSkgPj4gVlREX1BBR0VfU0hJRlQ7CiB9CiAKKy8qIFJldHVybiBsYXJnZXN0IHBvc3NpYmxlIHN1cGVycGFnZSBsZXZlbCBmb3IgYSBnaXZlbiBtYXBwaW5nICovCitzdGF0aWMgaW5saW5lIGludCBoYXJkd2FyZV9sYXJnZXBhZ2VfY2FwcyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGlvdl9wZm4sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBwaHlfcGZuLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGFnZXMpCit7CisJaW50IHN1cHBvcnQsIGxldmVsID0gMTsKKwl1bnNpZ25lZCBsb25nIHBmbm1lcmdlOworCisJc3VwcG9ydCA9IGRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlOworCisJLyogVG8gdXNlIGEgbGFyZ2UgcGFnZSwgdGhlIHZpcnR1YWwgKmFuZCogcGh5c2ljYWwgYWRkcmVzc2VzCisJICAgbXVzdCBiZSBhbGlnbmVkIHRvIDJNaUIvMUdpQi9ldGMuIExvd2VyIGJpdHMgc2V0IGluIGVpdGhlcgorCSAgIG9mIHRoZW0gd2lsbCBtZWFuIHdlIGhhdmUgdG8gdXNlIHNtYWxsZXIgcGFnZXMuIFNvIGp1c3QKKwkgICBtZXJnZSB0aGVtIGFuZCBjaGVjayBib3RoIGF0IG9uY2UuICovCisJcGZubWVyZ2UgPSBpb3ZfcGZuIHwgcGh5X3BmbjsKKworCXdoaWxlIChzdXBwb3J0ICYmICEocGZubWVyZ2UgJiB+VlREX1NUUklERV9NQVNLKSkgeworCQlwYWdlcyA+Pj0gVlREX1NUUklERV9TSElGVDsKKwkJaWYgKCFwYWdlcykKKwkJCWJyZWFrOworCQlwZm5tZXJnZSA+Pj0gVlREX1NUUklERV9TSElGVDsKKwkJbGV2ZWwrKzsKKwkJc3VwcG9ydC0tOworCX0KKwlyZXR1cm4gbGV2ZWw7Cit9CisKIHN0YXRpYyBpbnQgX19kb21haW5fbWFwcGluZyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZfcGZuLAogCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGxvbmcgcGh5c19wZm4sCiAJCQkgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgaW50IHByb3QpCkBAIC0xNjU2LDYgKzE3NTQsOCBAQAogCXBoeXNfYWRkcl90IHVuaW5pdGlhbGl6ZWRfdmFyKHB0ZXZhbCk7CiAJaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIHNnX3JlczsKKwl1bnNpZ25lZCBpbnQgbGFyZ2VwYWdlX2x2bCA9IDA7CisJdW5zaWduZWQgbG9uZyBsdmxfcGFnZXMgPSAwOwogCiAJQlVHX09OKGFkZHJfd2lkdGggPCBCSVRTX1BFUl9MT05HICYmIChpb3ZfcGZuICsgbnJfcGFnZXMgLSAxKSA+PiBhZGRyX3dpZHRoKTsKIApAQCAtMTY3MSw3ICsxNzcxLDcgQEAKIAkJcHRldmFsID0gKChwaHlzX2FkZHJfdClwaHlzX3BmbiA8PCBWVERfUEFHRV9TSElGVCkgfCBwcm90OwogCX0KIAotCXdoaWxlIChucl9wYWdlcy0tKSB7CisJd2hpbGUgKG5yX3BhZ2VzID4gMCkgewogCQl1aW50NjRfdCB0bXA7CiAKIAkJaWYgKCFzZ19yZXMpIHsKQEAgLTE2NzksMTEgKzE3NzksMjEgQEAKIAkJCXNnLT5kbWFfYWRkcmVzcyA9ICgoZG1hX2FkZHJfdClpb3ZfcGZuIDw8IFZURF9QQUdFX1NISUZUKSArIHNnLT5vZmZzZXQ7CiAJCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CiAJCQlwdGV2YWwgPSBwYWdlX3RvX3BoeXMoc2dfcGFnZShzZykpIHwgcHJvdDsKKwkJCXBoeXNfcGZuID0gcHRldmFsID4+IFZURF9QQUdFX1NISUZUOwogCQl9CisKIAkJaWYgKCFwdGUpIHsKLQkJCWZpcnN0X3B0ZSA9IHB0ZSA9IHBmbl90b19kbWFfcHRlKGRvbWFpbiwgaW92X3Bmbik7CisJCQlsYXJnZXBhZ2VfbHZsID0gaGFyZHdhcmVfbGFyZ2VwYWdlX2NhcHMoZG9tYWluLCBpb3ZfcGZuLCBwaHlzX3Bmbiwgc2dfcmVzKTsKKworCQkJZmlyc3RfcHRlID0gcHRlID0gcGZuX3RvX2RtYV9wdGUoZG9tYWluLCBpb3ZfcGZuLCBsYXJnZXBhZ2VfbHZsKTsKIAkJCWlmICghcHRlKQogCQkJCXJldHVybiAtRU5PTUVNOworCQkJLyogSXQgaXMgbGFyZ2UgcGFnZSovCisJCQlpZiAobGFyZ2VwYWdlX2x2bCA+IDEpCisJCQkJcHRldmFsIHw9IERNQV9QVEVfTEFSR0VfUEFHRTsKKwkJCWVsc2UKKwkJCQlwdGV2YWwgJj0gfih1aW50NjRfdClETUFfUFRFX0xBUkdFX1BBR0U7CisKIAkJfQogCQkvKiBXZSBkb24ndCBuZWVkIGxvY2sgaGVyZSwgbm9ib2R5IGVsc2UKIAkJICogdG91Y2hlcyB0aGUgaW92YSByYW5nZQpAQCAtMTY5OSwxNiArMTgwOSwzOCBAQAogCQkJfQogCQkJV0FSTl9PTigxKTsKIAkJfQorCisJCWx2bF9wYWdlcyA9IGx2bF90b19ucl9wYWdlcyhsYXJnZXBhZ2VfbHZsKTsKKworCQlCVUdfT04obnJfcGFnZXMgPCBsdmxfcGFnZXMpOworCQlCVUdfT04oc2dfcmVzIDwgbHZsX3BhZ2VzKTsKKworCQlucl9wYWdlcyAtPSBsdmxfcGFnZXM7CisJCWlvdl9wZm4gKz0gbHZsX3BhZ2VzOworCQlwaHlzX3BmbiArPSBsdmxfcGFnZXM7CisJCXB0ZXZhbCArPSBsdmxfcGFnZXMgKiBWVERfUEFHRV9TSVpFOworCQlzZ19yZXMgLT0gbHZsX3BhZ2VzOworCisJCS8qIElmIHRoZSBuZXh0IFBURSB3b3VsZCBiZSB0aGUgZmlyc3QgaW4gYSBuZXcgcGFnZSwgdGhlbiB3ZQorCQkgICBuZWVkIHRvIGZsdXNoIHRoZSBjYWNoZSBvbiB0aGUgZW50cmllcyB3ZSd2ZSBqdXN0IHdyaXR0ZW4uCisJCSAgIEFuZCB0aGVuIHdlJ2xsIG5lZWQgdG8gcmVjYWxjdWxhdGUgJ3B0ZScsIHNvIGNsZWFyIGl0IGFuZAorCQkgICBsZXQgaXQgZ2V0IHNldCBhZ2FpbiBpbiB0aGUgaWYgKCFwdGUpIGJsb2NrIGFib3ZlLgorCisJCSAgIElmIHdlJ3JlIGRvbmUgKCFucl9wYWdlcykgd2UgbmVlZCB0byBmbHVzaCB0aGUgY2FjaGUgdG9vLgorCisJCSAgIEFsc28gaWYgd2UndmUgYmVlbiBzZXR0aW5nIHN1cGVycGFnZXMsIHdlIG1heSBuZWVkIHRvCisJCSAgIHJlY2FsY3VsYXRlICdwdGUnIGFuZCBzd2l0Y2ggYmFjayB0byBzbWFsbGVyIHBhZ2VzIGZvciB0aGUKKwkJICAgZW5kIG9mIHRoZSBtYXBwaW5nLCBpZiB0aGUgdHJhaWxpbmcgc2l6ZSBpcyBub3QgZW5vdWdoIHRvCisJCSAgIHVzZSBhbm90aGVyIHN1cGVycGFnZSAoaS5lLiBzZ19yZXMgPCBsdmxfcGFnZXMpLiAqLwogCQlwdGUrKzsKLQkJaWYgKCFucl9wYWdlcyB8fCBmaXJzdF9wdGVfaW5fcGFnZShwdGUpKSB7CisJCWlmICghbnJfcGFnZXMgfHwgZmlyc3RfcHRlX2luX3BhZ2UocHRlKSB8fAorCQkgICAgKGxhcmdlcGFnZV9sdmwgPiAxICYmIHNnX3JlcyA8IGx2bF9wYWdlcykpIHsKIAkJCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIGZpcnN0X3B0ZSwKIAkJCQkJICAgKHZvaWQgKilwdGUgLSAodm9pZCAqKWZpcnN0X3B0ZSk7CiAJCQlwdGUgPSBOVUxMOwogCQl9Ci0JCWlvdl9wZm4rKzsKLQkJcHRldmFsICs9IFZURF9QQUdFX1NJWkU7Ci0JCXNnX3Jlcy0tOwotCQlpZiAoIXNnX3JlcykKKworCQlpZiAoIXNnX3JlcyAmJiBucl9wYWdlcykKIAkJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogCXJldHVybiAwOwpAQCAtMjAxNiw3ICsyMTQ4LDcgQEAKIAlpZiAocGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11ID09IERVTU1ZX0RFVklDRV9ET01BSU5fSU5GTykKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIGlvbW11X3ByZXBhcmVfaWRlbnRpdHlfbWFwKHBkZXYsIHJtcnItPmJhc2VfYWRkcmVzcywKLQkJcm1yci0+ZW5kX2FkZHJlc3MgKyAxKTsKKwkJcm1yci0+ZW5kX2FkZHJlc3MpOwogfQogCiAjaWZkZWYgQ09ORklHX0RNQVJfRkxPUFBZX1dBCkBAIC0yMDMwLDcgKzIxNjIsNyBAQAogCQlyZXR1cm47CiAKIAlwcmludGsoS0VSTl9JTkZPICJJT01NVTogUHJlcGFyZSAwLTE2TWlCIHVuaXR5IG1hcHBpbmcgZm9yIExQQ1xuIik7Ci0JcmV0ID0gaW9tbXVfcHJlcGFyZV9pZGVudGl0eV9tYXAocGRldiwgMCwgMTYqMTAyNCoxMDI0KTsKKwlyZXQgPSBpb21tdV9wcmVwYXJlX2lkZW50aXR5X21hcChwZGV2LCAwLCAxNioxMDI0KjEwMjQgLSAxKTsKIAogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IEZhaWxlZCB0byBjcmVhdGUgMC0xNk1pQiBpZGVudGl0eSBtYXA7ICIKQEAgLTIxMDYsMTAgKzIyMzgsMTAgQEAKIAlpZiAobGlrZWx5KCFpb21tdV9pZGVudGl0eV9tYXBwaW5nKSkKIAkJcmV0dXJuIDA7CiAKKwlpbmZvID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCWlmIChpbmZvICYmIGluZm8gIT0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPKQorCQlyZXR1cm4gKGluZm8tPmRvbWFpbiA9PSBzaV9kb21haW4pOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmc2lfZG9tYWluLT5kZXZpY2VzLCBsaW5rKQotCQlpZiAoaW5mby0+ZGV2ID09IHBkZXYpCi0JCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE4Nyw4ICsyMzE5LDE5IEBACiAJICogQXNzdW1lIHRoYXQgdGhleSB3aWxsIC0tIGlmIHRoZXkgdHVybiBvdXQgbm90IHRvIGJlLCB0aGVuIHdlIGNhbiAKIAkgKiB0YWtlIHRoZW0gb3V0IG9mIHRoZSAxOjEgZG9tYWluIGxhdGVyLgogCSAqLwotCWlmICghc3RhcnR1cCkKLQkJcmV0dXJuIHBkZXYtPmRtYV9tYXNrID4gRE1BX0JJVF9NQVNLKDMyKTsKKwlpZiAoIXN0YXJ0dXApIHsKKwkJLyoKKwkJICogSWYgdGhlIGRldmljZSdzIGRtYV9tYXNrIGlzIGxlc3MgdGhhbiB0aGUgc3lzdGVtJ3MgbWVtb3J5CisJCSAqIHNpemUgdGhlbiB0aGlzIGlzIG5vdCBhIGNhbmRpZGF0ZSBmb3IgaWRlbnRpdHkgbWFwcGluZy4KKwkJICovCisJCXU2NCBkbWFfbWFzayA9IHBkZXYtPmRtYV9tYXNrOworCisJCWlmIChwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgJiYKKwkJICAgIHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA8IGRtYV9tYXNrKQorCQkJZG1hX21hc2sgPSBwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CisKKwkJcmV0dXJuIGRtYV9tYXNrID49IGRtYV9nZXRfcmVxdWlyZWRfbWFzaygmcGRldi0+ZGV2KTsKKwl9CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTIyMDMsNiArMjM0Niw5IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCS8qIFNraXAgSG9zdC9QQ0kgQnJpZGdlIGRldmljZXMgKi8KKwkJaWYgKElTX0JSSURHRV9IT1NUX0RFVklDRShwZGV2KSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoaW9tbXVfc2hvdWxkX2lkZW50aXR5X21hcChwZGV2LCAxKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9NTVU6ICVzIGlkZW50aXR5IG1hcHBpbmcgZm9yIGRldmljZSAlc1xuIiwKIAkJCSAgICAgICBodyA/ICJoYXJkd2FyZSIgOiAic29mdHdhcmUiLCBwY2lfbmFtZShwZGV2KSk7CkBAIC0yMjE4LDcgKzIzNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2RtYXJzKGludCBmb3JjZV9vbikKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZG1hcnModm9pZCkKIHsKIAlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CiAJc3RydWN0IGRtYXJfcm1ycl91bml0ICpybXJyOwpAQCAtMjU5Miw4ICsyNzM4LDcgQEAKIAlpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tYWluKTsKIAlzaXplID0gYWxpZ25lZF9ucnBhZ2VzKHBhZGRyLCBzaXplKTsKIAotCWlvdmEgPSBpbnRlbF9hbGxvY19pb3ZhKGh3ZGV2LCBkb21haW4sIGRtYV90b19tbV9wZm4oc2l6ZSksCi0JCQkJcGRldi0+ZG1hX21hc2spOworCWlvdmEgPSBpbnRlbF9hbGxvY19pb3ZhKGh3ZGV2LCBkb21haW4sIGRtYV90b19tbV9wZm4oc2l6ZSksIGRtYV9tYXNrKTsKIAlpZiAoIWlvdmEpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTMxMTgsNyArMzI2MywxNyBAQAogCQlpZiAoaW9tbXUtPnFpKQogCQkJZG1hcl9yZWVuYWJsZV9xaShpb21tdSk7CiAKLQlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpIHsKKwlmb3JfZWFjaF9pb21tdShpb21tdSwgZHJoZCkgeworCQlpZiAoZHJoZC0+aWdub3JlZCkgeworCQkJLyoKKwkJCSAqIHdlIGFsd2F5cyBoYXZlIHRvIGRpc2FibGUgUE1ScyBvciBETUEgbWF5IGZhaWwgb24KKwkJCSAqIHRoaXMgZGV2aWNlCisJCQkgKi8KKwkJCWlmIChmb3JjZV9vbikKKwkJCQlpb21tdV9kaXNhYmxlX3Byb3RlY3RfbWVtX3JlZ2lvbnMoaW9tbXUpOworCQkJY29udGludWU7CisJCX0KKwkKIAkJaW9tbXVfZmx1c2hfd3JpdGVfYnVmZmVyKGlvbW11KTsKIAogCQlpb21tdV9zZXRfcm9vdF9lbnRyeShpb21tdSk7CkBAIC0zMTI3LDcgKzMyODIsOCBAQAogCQkJCQkgICBETUFfQ0NNRF9HTE9CQUxfSU5WTCk7CiAJCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYihpb21tdSwgMCwgMCwgMCwKIAkJCQkJIERNQV9UTEJfR0xPQkFMX0ZMVVNIKTsKLQkJaW9tbXVfZW5hYmxlX3RyYW5zbGF0aW9uKGlvbW11KTsKKwkJaWYgKGlvbW11X2VuYWJsZV90cmFuc2xhdGlvbihpb21tdSkpCisJCQlyZXR1cm4gMTsKIAkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGlvbW11KTsKIAl9CiAKQEAgLTMxOTQsNyArMzM1MCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCWlmIChpbml0X2lvbW11X2h3KCkpIHsKLQkJV0FSTigxLCAiSU9NTVUgc2V0dXAgZmFpbGVkLCBETUFSIGNhbiBub3QgcmVzdW1lIVxuIik7CisJCWlmIChmb3JjZV9vbikKKwkJCXBhbmljKCJ0Ym9vdDogSU9NTVUgc2V0dXAgZmFpbGVkLCBETUFSIGNhbiBub3QgcmVzdW1lIVxuIik7CisJCWVsc2UKKwkJCVdBUk4oMSwgIklPTU1VIHNldHVwIGZhaWxlZCwgRE1BUiBjYW4gbm90IHJlc3VtZSFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMjI5LDcgKzMzODgsNyBAQAogfQogCiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgaW5pdF9pb21tdV9wbV9vcHModm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9pb21tdV9wbV9vcHModm9pZCkge30KICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIAogLyoKQEAgLTMyNzEsNyArMzQzMCw2IEBACiBpbnQgX19pbml0IGludGVsX2lvbW11X2luaXQodm9pZCkKIHsKIAlpbnQgcmV0ID0gMDsKLQlpbnQgZm9yY2Vfb24gPSAwOwogCiAJLyogVlQtZCBpcyByZXF1aXJlZCBmb3IgYSBUWFQvdGJvb3QgbGF1bmNoLCBzbyBlbmZvcmNlIHRoYXQgKi8KIAlmb3JjZV9vbiA9IHRib290X2ZvcmNlX2lvbW11KCk7CkBAIC0zMzA5LDcgKzM0NjcsNyBAQAogCiAJaW5pdF9ub19yZW1hcHBpbmdfZGV2aWNlcygpOwogCi0JcmV0ID0gaW5pdF9kbWFycyhmb3JjZV9vbik7CisJcmV0ID0gaW5pdF9kbWFycygpOwogCWlmIChyZXQpIHsKIAkJaWYgKGZvcmNlX29uKQogCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBETUFSc1xuIik7CkBAIC0zMzgwLDggKzM1MzgsOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmRvbWFpbi0+ZGV2aWNlcykgewogCQlpbmZvID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGRldmljZV9kb21haW5faW5mbywgbGluayk7Ci0JCS8qIE5vIG5lZWQgdG8gY29tcGFyZSBQQ0kgZG9tYWluOyBpdCBoYXMgdG8gYmUgdGhlIHNhbWUgKi8KLQkJaWYgKGluZm8tPmJ1cyA9PSBwZGV2LT5idXMtPm51bWJlciAmJgorCQlpZiAoaW5mby0+c2VnbWVudCA9PSBwY2lfZG9tYWluX25yKHBkZXYtPmJ1cykgJiYKKwkJICAgIGluZm8tPmJ1cyA9PSBwZGV2LT5idXMtPm51bWJlciAmJgogCQkgICAgaW5mby0+ZGV2Zm4gPT0gcGRldi0+ZGV2Zm4pIHsKIAkJCWxpc3RfZGVsKCZpbmZvLT5saW5rKTsKIAkJCWxpc3RfZGVsKCZpbmZvLT5nbG9iYWwpOwpAQCAtMzQxOSwxMCArMzU3NywxMyBAQAogCQlkb21haW5fdXBkYXRlX2lvbW11X2NhcChkb21haW4pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmlvbW11X2xvY2ssIHRtcF9mbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCB0bXBfZmxhZ3MpOwotCQljbGVhcl9iaXQoZG9tYWluLT5pZCwgaW9tbXUtPmRvbWFpbl9pZHMpOwotCQlpb21tdS0+ZG9tYWluc1tkb21haW4tPmlkXSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCB0bXBfZmxhZ3MpOworCQlpZiAoIShkb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfVklSVFVBTF9NQUNISU5FKSAmJgorCQkgICAgIShkb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfU1RBVElDX0lERU5USVRZKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCB0bXBfZmxhZ3MpOworCQkJY2xlYXJfYml0KGRvbWFpbi0+aWQsIGlvbW11LT5kb21haW5faWRzKTsKKwkJCWlvbW11LT5kb21haW5zW2RvbWFpbi0+aWRdID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCB0bXBfZmxhZ3MpOworCQl9CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CkBAIC0zNTA1LDYgKzM2NjYsNyBAQAogCWRvbWFpbi0+aW9tbXVfY291bnQgPSAwOwogCWRvbWFpbi0+aW9tbXVfY29oZXJlbmN5ID0gMDsKIAlkb21haW4tPmlvbW11X3Nub29waW5nID0gMDsKKwlkb21haW4tPmlvbW11X3N1cGVycGFnZSA9IDA7CiAJZG9tYWluLT5tYXhfYWRkciA9IDA7CiAJZG9tYWluLT5uaWQgPSAtMTsKIApAQCAtMzcyMCw3ICszODgyLDcgQEAKIAlzdHJ1Y3QgZG1hX3B0ZSAqcHRlOwogCXU2NCBwaHlzID0gMDsKIAotCXB0ZSA9IHBmbl90b19kbWFfcHRlKGRtYXJfZG9tYWluLCBpb3ZhID4+IFZURF9QQUdFX1NISUZUKTsKKwlwdGUgPSBwZm5fdG9fZG1hX3B0ZShkbWFyX2RvbWFpbiwgaW92YSA+PiBWVERfUEFHRV9TSElGVCwgMCk7CiAJaWYgKHB0ZSkKIAkJcGh5cyA9IGRtYV9wdGVfYWRkcihwdGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3ZhLmMgYi9kcml2ZXJzL3BjaS9pb3ZhLmMKaW5kZXggOTYwNmU1OS4uYzVjMjc0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW92YS5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdmEuYwpAQCAtNjMsOCArNjMsMTYgQEAKIAljdXJyID0gaW92YWQtPmNhY2hlZDMyX25vZGU7CiAJY2FjaGVkX2lvdmEgPSBjb250YWluZXJfb2YoY3Vyciwgc3RydWN0IGlvdmEsIG5vZGUpOwogCi0JaWYgKGZyZWUtPnBmbl9sbyA+PSBjYWNoZWRfaW92YS0+cGZuX2xvKQotCQlpb3ZhZC0+Y2FjaGVkMzJfbm9kZSA9IHJiX25leHQoJmZyZWUtPm5vZGUpOworCWlmIChmcmVlLT5wZm5fbG8gPj0gY2FjaGVkX2lvdmEtPnBmbl9sbykgeworCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoJmZyZWUtPm5vZGUpOworCQlzdHJ1Y3QgaW92YSAqaW92YSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CisKKwkJLyogb25seSBjYWNoZSBpZiBpdCdzIGJlbG93IDMyYml0IHBmbiAqLworCQlpZiAobm9kZSAmJiBpb3ZhLT5wZm5fbG8gPCBpb3ZhZC0+ZG1hXzMyYml0X3BmbikKKwkJCWlvdmFkLT5jYWNoZWQzMl9ub2RlID0gbm9kZTsKKwkJZWxzZQorCQkJaW92YWQtPmNhY2hlZDMyX25vZGUgPSBOVUxMOworCX0KIH0KIAogLyogQ29tcHV0ZXMgdGhlIHBhZGRpbmcgc2l6ZSByZXF1aXJlZCwgdG8gbWFrZSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCAxMzVkZjE2Li40Njc2N2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC02MjQsNyArNjI0LDcgQEAKIAkgKiBzeXN0ZW0gZnJvbSB0aGUgc2xlZXAgc3RhdGUsIHdlJ2xsIGhhdmUgdG8gcHJldmVudCBpdCBmcm9tIHNpZ25hbGluZwogCSAqIHdha2UtdXAuCiAJICovCi0JcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+cHJlcGFyZSkKIAkJZXJyb3IgPSBkcnYtPnBtLT5wcmVwYXJlKGRldik7CkBAIC02MzgsNiArNjM4LDggQEAKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5jb21wbGV0ZSkKIAkJZHJ2LT5wbS0+Y29tcGxldGUoZGV2KTsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIH0KIAogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCA1NjA5OGIzLi42OTI2NzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMzI3MSwxMSArMzI3MSwxMSBAQAogfQogCiBzdGF0aWMgaW50IHBjaV9zZXRfdmdhX3N0YXRlX2FyY2goc3RydWN0IHBjaV9kZXYgKmRldiwgYm9vbCBkZWNvZGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjb21tYW5kX2JpdHMsIGJvb2wgY2hhbmdlX2JyaWRnZSkKKwkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgdTMyIGZsYWdzKQogewogCWlmIChhcmNoX3NldF92Z2Ffc3RhdGUpCiAJCXJldHVybiBhcmNoX3NldF92Z2Ffc3RhdGUoZGV2LCBkZWNvZGUsIGNvbW1hbmRfYml0cywKLQkJCQkJCWNoYW5nZV9icmlkZ2UpOworCQkJCQkJZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0zMjg0LDcgKzMyODQsNyBAQAogICogQGRldjogdGhlIFBDSSBkZXZpY2UKICAqIEBkZWNvZGU6IHRydWUgPSBlbmFibGUgZGVjb2RpbmcsIGZhbHNlID0gZGlzYWJsZSBkZWNvZGluZwogICogQGNvbW1hbmRfYml0czogUENJX0NPTU1BTkRfSU8gYW5kL29yIFBDSV9DT01NQU5EX01FTU9SWQotICogQGNoYW5nZV9icmlkZ2VfZmxhZ3M6IHRyYXZlcnNlIGFuY2VzdG9ycyBhbmQgY2hhbmdlIGJyaWRnZXMKKyAqIEBmbGFnczogdHJhdmVyc2UgYW5jZXN0b3JzIGFuZCBjaGFuZ2UgYnJpZGdlcwogICogQ0hBTkdFX0JSSURHRV9PTkxZIC8gQ0hBTkdFX0JSSURHRQogICovCiBpbnQgcGNpX3NldF92Z2Ffc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgYm9vbCBkZWNvZGUsCkBAIC0zNDgzLDYgKzM0ODMsOCBAQAogCQkJCXBjaV9ub19tc2koKTsKIAkJCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub2FlciIpKSB7CiAJCQkJcGNpX25vX2FlcigpOworCQkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJyZWFsbG9jIiwgNykpIHsKKwkJCQlwY2lfcmVhbGxvYygpOwogCQkJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vZG9tYWlucyIpKSB7CiAJCQkJcGNpX25vX2RvbWFpbnMoKTsKIAkJCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAiY2Jpb3NpemU9IiwgOSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggNzMxZTIwMi4uM2EzOWJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTE0Niw2ICsxNDYsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHBjaV9tc2lfaW5pdF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHBjaV9yZWFsbG9jKHZvaWQpOworCiBzdGF0aWMgaW5saW5lIGludCBwY2lfbm9fZDFkMihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGludCBwYXJlbnRfZHN0YXRlcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA0ODg0OWZmLi5iYWZiM2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCQlyZXMtPmZsYWdzIHw9IHBjaV9jYWxjX3Jlc291cmNlX2ZsYWdzKGwpIHwgSU9SRVNPVVJDRV9TSVpFQUxJR047CiAJCWlmICh0eXBlID09IHBjaV9iYXJfaW8pIHsKIAkJCWwgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCQkJbWFzayA9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAmIElPX1NQQUNFX0xJTUlUOworCQkJbWFzayA9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAmICh1MzIpIElPX1NQQUNFX0xJTUlUOwogCQl9IGVsc2UgewogCQkJbCAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwogCQkJbWFzayA9ICh1MzIpUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggZThhMTQwNi4uMDIxNDVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTI3NjEsNiArMjc2MSw4IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1QzgzMiwgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CiBERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MzIsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9SNUNFODIzLCByaWNvaF9tbWNfZml4dXBfcjVjODMyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRV9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1Q0U4MjMsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOwogI2VuZGlmIC8qQ09ORklHX01NQ19SSUNPSF9NTUMqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfRE1BUikgfHwgZGVmaW5lZChDT05GSUdfSU5UUl9SRU1BUCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggMWU5ZTVhNS4uOTk5NTg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTQ3LDYgKzQ3LDEzIEBACiAJKGhlYWQpLT5uZXh0ID0gTlVMTDsJCQkJXAogfSB3aGlsZSAoMCkKIAoraW50IHBjaV9yZWFsbG9jX2VuYWJsZSA9IDA7CisjZGVmaW5lIHBjaV9yZWFsbG9jX2VuYWJsZWQoKSBwY2lfcmVhbGxvY19lbmFibGUKK3ZvaWQgcGNpX3JlYWxsb2Modm9pZCkKK3sKKwlwY2lfcmVhbGxvY19lbmFibGUgPSAxOworfQorCiAvKioKICAqIGFkZF90b19saXN0KCkgLSBhZGQgYSBuZXcgcmVzb3VyY2UgdHJhY2tlciB0byB0aGUgbGlzdAogICogQGhlYWQ6CUhlYWQgb2YgdGhlIGxpc3QKQEAgLTEwMjUsNiArMTAzMiw3IEBACiAJcmV0dXJuIGRlcHRoOwogfQogCisKIC8qCiAgKiBmaXJzdCB0cnkgd2lsbCBub3QgdG91Y2ggcGNpIGJyaWRnZSByZXMKICAqIHNlY29uZCAgYW5kIGxhdGVyIHRyeSB3aWxsIGNsZWFyIHNtYWxsIGxlYWYgYnJpZGdlIHJlcwpAQCAtMTA2OCw2ICsxMDc2LDEzIEBACiAJLyogYW55IGRldmljZSBjb21wbGFpbj8gKi8KIAlpZiAoIWhlYWQubmV4dCkKIAkJZ290byBlbmFibGVfYW5kX2R1bXA7CisKKwkvKiBkb24ndCByZWFsbG9jIGlmIGFza2VkIHRvIGRvIHNvICovCisJaWYgKCFwY2lfcmVhbGxvY19lbmFibGVkKCkpIHsKKwkJZnJlZV9saXN0KHJlc291cmNlX2xpc3RfeCwgJmhlYWQpOworCQlnb3RvIGVuYWJsZV9hbmRfZHVtcDsKKwl9CisKIAlmYWlsZWRfdHlwZSA9IDA7CiAJZm9yIChsaXN0ID0gaGVhZC5uZXh0OyBsaXN0OykgewogCQlmYWlsZWRfdHlwZSB8PSBsaXN0LT5mbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92cGFjMjcwLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jCmluZGV4IDQzNTAwMmQuLmU5NTZmNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92cGFjMjcwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYwpAQCAtMTEsNiArMTEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCkBAIC03NSwxMCArNzYsMTAgQEAKIHN0YXRpYyB2b2lkIHZwYWMyNzBfcGNtY2lhX2h3X3NodXRkb3duKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQogewogCWlmIChza3QtPm5yID09IDApCi0JCWdwaW9fcmVxdWVzdF9hcnJheSh2cGFjMjcwX3BjbWNpYV9ncGlvcywKKwkJZ3Bpb19mcmVlX2FycmF5KHZwYWMyNzBfcGNtY2lhX2dwaW9zLAogCQkJCQlBUlJBWV9TSVpFKHZwYWMyNzBfcGNtY2lhX2dwaW9zKSk7CiAJZWxzZQotCQlncGlvX3JlcXVlc3RfYXJyYXkodnBhYzI3MF9jZl9ncGlvcywKKwkJZ3Bpb19mcmVlX2FycmF5KHZwYWMyNzBfY2ZfZ3Bpb3MsCiAJCQkJCUFSUkFZX1NJWkUodnBhYzI3MF9jZl9ncGlvcykpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwppbmRleCAwMDU0MTdiLi5lMWM0OTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKQEAgLTExNTYsOSArMTE1Niw5IEBACiAJc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSBwYXJhbXMgPSB7CiAJCS5mdW5jdGlvbl9udW0gPSAweDEsCiAJCS5ob3RrZXlfbnVtYmVyID0gMHgwMSwKLQkJLmRldmljZXMgPSBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUyAmCi0JCQkJQUNFUl9XTUlEM19HRFNfVEhSRUVHICYKLQkJCQlBQ0VSX1dNSUQzX0dEU19XSU1BWCAmCisJCS5kZXZpY2VzID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1MgfAorCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyB8CisJCQkJQUNFUl9XTUlEM19HRFNfV0lNQVggfAogCQkJCUFDRVJfV01JRDNfR0RTX0JMVUVUT09USCwKIAl9OwogCXN0cnVjdCBhY3BpX2J1ZmZlciBpbnB1dCA9IHsKQEAgLTE0NDUsNiArMTQ0NSw4IEBACiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZXZlbnRfcmV0dXJuX3ZhbHVlIHJldHVybl92YWx1ZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTE2IGRldmljZV9zdGF0ZTsKKwljb25zdCBzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CiAKIAlzdGF0dXMgPSB3bWlfZ2V0X2V2ZW50X2RhdGEodmFsdWUsICZyZXNwb25zZSk7CiAJaWYgKHN0YXR1cyAhPSBBRV9PSykgewpAQCAtMTQ3MiwyMyArMTQ3NCwzMiBAQAogCiAJc3dpdGNoIChyZXR1cm5fdmFsdWUuZnVuY3Rpb24pIHsKIAljYXNlIFdNSURfSE9US0VZX0VWRU5UOgotCQlpZiAocmV0dXJuX3ZhbHVlLmRldmljZV9zdGF0ZSkgewotCQkJdTE2IGRldmljZV9zdGF0ZSA9IHJldHVybl92YWx1ZS5kZXZpY2Vfc3RhdGU7Ci0JCQlwcl9kZWJ1ZygiZGV2aWNlIHN0YXRlOiAweCV4XG4iLCBkZXZpY2Vfc3RhdGUpOwotCQkJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKQotCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUod2lyZWxlc3NfcmZraWxsLAotCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfV0lSRUxFU1MpKTsKLQkJCWlmIChoYXNfY2FwKEFDRVJfQ0FQX0JMVUVUT09USCkpCi0JCQkJcmZraWxsX3NldF9zd19zdGF0ZShibHVldG9vdGhfcmZraWxsLAotCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RIKSk7Ci0JCQlpZiAoaGFzX2NhcChBQ0VSX0NBUF9USFJFRUcpKQotCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUodGhyZWVnX3Jma2lsbCwKLQkJCQkhKGRldmljZV9zdGF0ZSAmIEFDRVJfV01JRDNfR0RTX1RIUkVFRykpOwotCQl9Ci0JCWlmICghc3BhcnNlX2tleW1hcF9yZXBvcnRfZXZlbnQoYWNlcl93bWlfaW5wdXRfZGV2LAotCQkJCXJldHVybl92YWx1ZS5rZXlfbnVtLCAxLCB0cnVlKSkKKwkJZGV2aWNlX3N0YXRlID0gcmV0dXJuX3ZhbHVlLmRldmljZV9zdGF0ZTsKKwkJcHJfZGVidWcoImRldmljZSBzdGF0ZTogMHgleFxuIiwgZGV2aWNlX3N0YXRlKTsKKworCQlrZXkgPSBzcGFyc2Vfa2V5bWFwX2VudHJ5X2Zyb21fc2NhbmNvZGUoYWNlcl93bWlfaW5wdXRfZGV2LAorCQkJCQkJCXJldHVybl92YWx1ZS5rZXlfbnVtKTsKKwkJaWYgKCFrZXkpIHsKIAkJCXByX3dhcm4oIlVua25vd24ga2V5IG51bWJlciAtIDB4JXhcbiIsCiAJCQkJcmV0dXJuX3ZhbHVlLmtleV9udW0pOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChrZXktPmtleWNvZGUpIHsKKwkJCWNhc2UgS0VZX1dMQU46CisJCQljYXNlIEtFWV9CTFVFVE9PVEg6CisJCQkJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKQorCQkJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHdpcmVsZXNzX3Jma2lsbCwKKwkJCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfV0lSRUxFU1MpKTsKKwkJCQlpZiAoaGFzX2NhcChBQ0VSX0NBUF9USFJFRUcpKQorCQkJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHRocmVlZ19yZmtpbGwsCisJCQkJCQkhKGRldmljZV9zdGF0ZSAmIEFDRVJfV01JRDNfR0RTX1RIUkVFRykpOworCQkJCWlmIChoYXNfY2FwKEFDRVJfQ0FQX0JMVUVUT09USCkpCisJCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUoYmx1ZXRvb3RoX3Jma2lsbCwKKwkJCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RIKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcGFyc2Vfa2V5bWFwX3JlcG9ydF9lbnRyeShhY2VyX3dtaV9pbnB1dF9kZXYsIGtleSwKKwkJCQkJCSAgIDEsIHRydWUpOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX3dhcm4oIlVua25vd24gZnVuY3Rpb24gbnVtYmVyIC0gJWQgLSAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLXdtaS5jCmluZGV4IDAwNDYwY2IuLjNjNzg1N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYwpAQCAtMTAyNSw2ICsxMDI1LDcgQEAKIAkJcmV0dXJuIHBvd2VyOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUExBVEZPUk07CiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBtYXg7CiAJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKGFzdXMtPmRyaXZlci0+bmFtZSwKIAkJCQkgICAgICAgJmFzdXMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LCBhc3VzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCmluZGV4IDNmMjA0ZmQuLjg4NzdiODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKQEAgLTEwMzAsOCArMTAzMCwxMCBAQAogCWluaXRpYWxpemVfZmFuX2NvbnRyb2xfZGF0YShkYXRhKTsKIAogCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZjb21wYWxfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJa2ZyZWUoZGF0YSk7CiAJCXJldHVybiBlcnI7CisJfQogCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKaW5kZXggZDM4NDFkZS4uZTM5YWIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCkBAIC0yOTIsMTIgKzI5Miw5IEBACiAJZGVsbF9zZW5kX3JlcXVlc3QoYnVmZmVyLCAxNywgMTEpOwogCiAJLyogSWYgdGhlIGhhcmR3YXJlIHN3aXRjaCBjb250cm9scyB0aGlzIHJhZGlvLCBhbmQgdGhlIGhhcmR3YXJlCi0JICAgc3dpdGNoIGlzIGRpc2FibGVkLCBkb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgc29mdHdhcmUgc3RhdGUuCi0JICAgSWYgdGhlIGhhcmR3YXJlIHN3aXRjaCBpcyByZXBvcnRlZCBhcyBub3Qgc3VwcG9ydGVkLCBhbHdheXMKLQkgICBmaXJlIHRoZSBTTUkgdG8gdG9nZ2xlIHRoZSBraWxsc3dpdGNoLiAqLworCSAgIHN3aXRjaCBpcyBkaXNhYmxlZCwgZG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIHNvZnR3YXJlIHN0YXRlICovCiAJaWYgKChod3N3aXRjaF9zdGF0ZSAmIEJJVChod3N3aXRjaF9iaXQpKSAmJgotCSAgICAhKGJ1ZmZlci0+b3V0cHV0WzFdICYgQklUKDE2KSkgJiYKLQkgICAgKGJ1ZmZlci0+b3V0cHV0WzFdICYgQklUKDApKSkgeworCSAgICAhKGJ1ZmZlci0+b3V0cHV0WzFdICYgQklUKDE2KSkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDAzLDIzICs0MDAsNiBAQAogCiBzdGF0aWMgdm9pZCBkZWxsX3VwZGF0ZV9yZmtpbGwoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQogewotCWludCBzdGF0dXM7Ci0KLQlnZXRfYnVmZmVyKCk7Ci0JZGVsbF9zZW5kX3JlcXVlc3QoYnVmZmVyLCAxNywgMTEpOwotCXN0YXR1cyA9IGJ1ZmZlci0+b3V0cHV0WzFdOwotCXJlbGVhc2VfYnVmZmVyKCk7Ci0KLQkvKiBpZiBoYXJkd2FyZSByZmtpbGwgaXMgbm90IHN1cHBvcnRlZCwgc2V0IGl0IGV4cGxpY2l0bHkgKi8KLQlpZiAoIShzdGF0dXMgJiBCSVQoMCkpKSB7Ci0JCWlmICh3aWZpX3Jma2lsbCkKLQkJCWRlbGxfcmZraWxsX3NldCgodm9pZCAqKTEsICEoKHN0YXR1cyAmIEJJVCgxNykpID4+IDE3KSk7Ci0JCWlmIChibHVldG9vdGhfcmZraWxsKQotCQkJZGVsbF9yZmtpbGxfc2V0KCh2b2lkICopMiwgISgoc3RhdHVzICYgQklUKDE4KSkgPj4gMTgpKTsKLQkJaWYgKHd3YW5fcmZraWxsKQotCQkJZGVsbF9yZmtpbGxfc2V0KCh2b2lkICopMywgISgoc3RhdHVzICYgQklUKDE5KSkgPj4gMTkpKTsKLQl9Ci0KIAlpZiAod2lmaV9yZmtpbGwpCiAJCWRlbGxfcmZraWxsX3F1ZXJ5KHdpZmlfcmZraWxsLCAodm9pZCAqKTEpOwogCWlmIChibHVldG9vdGhfcmZraWxsKQpAQCAtNTYwLDExICs1NDAsMTEgQEAKIAllbHNlCiAJCWRlbGxfc2VuZF9yZXF1ZXN0KGJ1ZmZlciwgMCwgMSk7CiAKKwlyZXQgPSBidWZmZXItPm91dHB1dFsxXTsKKwogb3V0OgogCXJlbGVhc2VfYnVmZmVyKCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gYnVmZmVyLT5vdXRwdXRbMV07CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGRlbGxfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwppbmRleCBmOTQwMTdiLi5lMmZhYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwpAQCAtMjA3LDYgKzIwNyw3IEBACiAJfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IHNpemVvZihzdHJ1Y3QgYmlvc19hcmdzKSwgJmFyZ3MgfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXUzMiByYzsKIAogCWlmIChXQVJOX09OKGluc2l6ZSA+IHNpemVvZihhcmdzLmRhdGEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjQsMTMgKzIyNSwxMyBAQAogCX0KIAogCWJpb3NfcmV0dXJuID0gKHN0cnVjdCBiaW9zX3JldHVybiAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJcmMgPSBiaW9zX3JldHVybi0+cmV0dXJuX2NvZGU7CiAKLQlpZiAoYmlvc19yZXR1cm4tPnJldHVybl9jb2RlKSB7Ci0JCWlmIChiaW9zX3JldHVybi0+cmV0dXJuX2NvZGUgIT0gSFBXTUlfUkVUX1VOS05PV05fQ01EVFlQRSkKLQkJCXByX3dhcm4oInF1ZXJ5IDB4JXggcmV0dXJuZWQgZXJyb3IgMHgleFxuIiwKLQkJCQlxdWVyeSwgYmlvc19yZXR1cm4tPnJldHVybl9jb2RlKTsKKwlpZiAocmMpIHsKKwkJaWYgKHJjICE9IEhQV01JX1JFVF9VTktOT1dOX0NNRFRZUEUpCisJCQlwcl93YXJuKCJxdWVyeSAweCV4IHJldHVybmVkIGVycm9yIDB4JXhcbiIsIHF1ZXJ5LCByYyk7CiAJCWtmcmVlKG9iaik7Ci0JCXJldHVybiBiaW9zX3JldHVybi0+cmV0dXJuX2NvZGU7CisJCXJldHVybiByYzsKIAl9CiAKIAlpZiAoIW91dHNpemUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX29ha3RyYWlsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9vYWt0cmFpbC5jCmluZGV4IGU5MzYzNjQuLjdmODhjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX29ha3RyYWlsLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfb2FrdHJhaWwuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiAJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUExBVEZPUk07CiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBPVF9FQ19CTF9CUklHSFRORVNTX01BWDsKIAliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoRFJJVkVSX05BTUUsCiAJCQkJICAgICAgICZvYWt0cmFpbF9kZXZpY2UtPmRldiwgTlVMTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCA3N2Y2ZTcwLi4yNmM1YjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC0xODQsNiArMTg0LDEwIEBACiAKIAkvKiBNaXNjIGJheSBldmVudHMgKi8KIAlUUF9IS0VZX0VWX09QVERSVl9FSgkJPSAweDMwMDYsIC8qIG9wdC4gZHJpdmUgdHJheSBlamVjdGVkICovCisJVFBfSEtFWV9FVl9IT1RQTFVHX0RPQ0sJCT0gMHg0MDEwLCAvKiBkb2NrZWQgaW50byBob3RwbHVnIGRvY2sKKwkJCQkJCSAgICAgb3IgcG9ydCByZXBsaWNhdG9yICovCisJVFBfSEtFWV9FVl9IT1RQTFVHX1VORE9DSwk9IDB4NDAxMSwgLyogdW5kb2NrZWQgZnJvbSBob3RwbHVnCisJCQkJCQkgICAgIGRvY2sgb3IgcG9ydCByZXBsaWNhdG9yICovCiAKIAkvKiBVc2VyLWludGVyZmFjZSBldmVudHMgKi8KIAlUUF9IS0VZX0VWX0xJRF9DTE9TRQkJPSAweDUwMDEsIC8qIGxhcHRvcCBsaWQgY2xvc2VkICovCkBAIC0xOTQsNiArMTk4LDEwIEBACiAJVFBfSEtFWV9FVl9QRU5fUkVNT1ZFRAkJPSAweDUwMGMsIC8qIHRhYmxldCBwZW4gcmVtb3ZlZCAqLwogCVRQX0hLRVlfRVZfQlJHSFRfQ0hBTkdFRAk9IDB4NTAxMCwgLyogYmFja2xpZ2h0IGNvbnRyb2wgZXZlbnQgKi8KIAorCS8qIEtleS1yZWxhdGVkIHVzZXItaW50ZXJmYWNlIGV2ZW50cyAqLworCVRQX0hLRVlfRVZfS0VZX05VTUxPQ0sJCT0gMHg2MDAwLCAvKiBOdW1Mb2NrIGtleSBwcmVzc2VkICovCisJVFBfSEtFWV9FVl9LRVlfRk4JCT0gMHg2MDA1LCAvKiBGbiBrZXkgcHJlc3NlZD8gRTQyMCAqLworCiAJLyogVGhlcm1hbCBldmVudHMgKi8KIAlUUF9IS0VZX0VWX0FMQVJNX0JBVF9IT1QJPSAweDYwMTEsIC8qIGJhdHRlcnkgdG9vIGhvdCAqLwogCVRQX0hLRVlfRVZfQUxBUk1fQkFUX1hIT1QJPSAweDYwMTIsIC8qIGJhdHRlcnkgY3JpdGljYWxseSBob3QgKi8KQEAgLTIwMSw2ICsyMDksMTAgQEAKIAlUUF9IS0VZX0VWX0FMQVJNX1NFTlNPUl9YSE9UCT0gMHg2MDIyLCAvKiBzZW5zb3IgY3JpdGljYWxseSBob3QgKi8KIAlUUF9IS0VZX0VWX1RITV9UQUJMRV9DSEFOR0VECT0gMHg2MDMwLCAvKiB0aGVybWFsIHRhYmxlIGNoYW5nZWQgKi8KIAorCVRQX0hLRVlfRVZfVU5LXzYwNDAJCT0gMHg2MDQwLCAvKiBSZWxhdGVkIHRvIEFDIGNoYW5nZT8KKwkJCQkJCSAgICAgc29tZSBzb3J0IG9mIEFQTSBoaW50LAorCQkJCQkJICAgICBXNTIwICovCisKIAkvKiBNaXNjICovCiAJVFBfSEtFWV9FVl9SRktJTExfQ0hBTkdFRAk9IDB4NzAwMCwgLyogcmZraWxsIHN3aXRjaCBjaGFuZ2VkICovCiB9OwpAQCAtMzUxMyw2ICszNTI1LDM0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfZG9ja2V2ZW50KGNvbnN0IHUzMiBoa2V5LAorCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCisJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQoreworCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCBldmVudHMgKi8KKwkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKKwkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKKworCXN3aXRjaCAoaGtleSkgeworCWNhc2UgVFBfSEtFWV9FVl9VTkRPQ0tfQUNLOgorCQkvKiBBQ1BJIHVuZG9jayBvcGVyYXRpb24gY29tcGxldGVkIGFmdGVyIHdha2V1cCAqLworCQlob3RrZXlfYXV0b3NsZWVwX2FjayA9IDE7CisJCXByX2luZm8oInVuZG9ja2VkXG4iKTsKKwkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOworCQlyZXR1cm4gdHJ1ZTsKKworCWNhc2UgVFBfSEtFWV9FVl9IT1RQTFVHX0RPQ0s6IC8qIGRvY2tlZCB0byBwb3J0IHJlcGxpY2F0b3IgKi8KKwkJcHJfaW5mbygiZG9ja2VkIGludG8gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3JcbiIpOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFRQX0hLRVlfRVZfSE9UUExVR19VTkRPQ0s6IC8qIHVuZG9ja2VkIGZyb20gcG9ydCByZXBsaWNhdG9yICovCisJCXByX2luZm8oInVuZG9ja2VkIGZyb20gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3JcbiIpOworCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfdXNyZXZlbnQoY29uc3QgdTMyIGhrZXksCiAJCQkJIGJvb2wgKnNlbmRfYWNwaV9ldiwKIAkJCQkgYm9vbCAqaWdub3JlX2FjcGlfZXYpCkBAIC0zNTQ3LDEzICszNTg3LDEzIEBACiAKIHN0YXRpYyB2b2lkIHRoZXJtYWxfZHVtcF9hbGxfc2Vuc29ycyh2b2lkKTsKIAotc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV90aGVybWFsKGNvbnN0IHUzMiBoa2V5LAorc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV82eHh4KGNvbnN0IHUzMiBoa2V5LAogCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCiAJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQogewogCWJvb2wga25vd24gPSB0cnVlOwogCi0JLyogMHg2MDAwLTB4NkZGRjogdGhlcm1hbCBhbGFybXMgKi8KKwkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcy9ub3RpY2VzIGFuZCBrZXlib2FyZCBldmVudHMgKi8KIAkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKIAkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKIApAQCAtMzU4Miw4ICszNjIyLDE3IEBACiAJCQkgImEgc2Vuc29yIHJlcG9ydHMgc29tZXRoaW5nIGlzIGV4dHJlbWVseSBob3QhXG4iKTsKIAkJLyogcmVjb21tZW5kZWQgYWN0aW9uOiBpbW1lZGlhdGUgc2xlZXAvaGliZXJuYXRlICovCiAJCWJyZWFrOworCisJY2FzZSBUUF9IS0VZX0VWX0tFWV9OVU1MT0NLOgorCWNhc2UgVFBfSEtFWV9FVl9LRVlfRk46CisJCS8qIGtleSBwcmVzcyBldmVudHMsIHdlIGp1c3QgaWdub3JlIHRoZW0gYXMgbG9uZyBhcyB0aGUgRUMKKwkJICogaXMgc3RpbGwgcmVwb3J0aW5nIHRoZW0gaW4gdGhlIG5vcm1hbCBrZXlib2FyZCBzdHJlYW0gKi8KKwkJKnNlbmRfYWNwaV9ldiA9IGZhbHNlOworCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOworCQlyZXR1cm4gdHJ1ZTsKKwogCWRlZmF1bHQ6Ci0JCXByX2FsZXJ0KCJUSEVSTUFMIEFMRVJUOiB1bmtub3duIHRoZXJtYWwgYWxhcm0gcmVjZWl2ZWRcbiIpOworCQlwcl93YXJuKCJ1bmtub3duIHBvc3NpYmxlIHRoZXJtYWwgYWxhcm0gb3Iga2V5Ym9hcmQgZXZlbnQgcmVjZWl2ZWRcbiIpOwogCQlrbm93biA9IGZhbHNlOwogCX0KIApAQCAtMzY1MiwxNSArMzcwMSw5IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJLyogMHg0MDAwLTB4NEZGRjogZG9jay1yZWxhdGVkIHdha2V1cHMgKi8KLQkJCWlmIChoa2V5ID09IFRQX0hLRVlfRVZfVU5ET0NLX0FDSykgewotCQkJCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMTsKLQkJCQlwcl9pbmZvKCJ1bmRvY2tlZFxuIik7Ci0JCQkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOwotCQkJCWtub3duX2V2ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJa25vd25fZXYgPSBmYWxzZTsKLQkJCX0KKwkJCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCBldmVudHMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV9kb2NrZXZlbnQoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCQkJCSZpZ25vcmVfYWNwaV9ldik7CiAJCQlicmVhazsKIAkJY2FzZSA1OgogCQkJLyogMHg1MDAwLTB4NUZGRjogaHVtYW4gaW50ZXJmYWNlIGhlbHBlcnMgKi8KQEAgLTM2NjgsOCArMzcxMSw5IEBACiAJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKIAkJCWJyZWFrOwogCQljYXNlIDY6Ci0JCQkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcyAqLwotCQkJa25vd25fZXYgPSBob3RrZXlfbm90aWZ5X3RoZXJtYWwoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCS8qIDB4NjAwMC0weDZGRkY6IHRoZXJtYWwgYWxhcm1zL25vdGljZXMgYW5kCisJCQkgKiAgICAgICAgICAgICAgICBrZXlib2FyZCBldmVudHMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV82eHh4KGhrZXksICZzZW5kX2FjcGlfZXYsCiAJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKIAkJCWJyZWFrOwogCQljYXNlIDc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2hhcmRldi5jIGIvZHJpdmVycy9wdHAvcHRwX2NoYXJkZXYuYwppbmRleCBhOGQwM2FlLi5lN2YzMDFkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHRwL3B0cF9jaGFyZGV2LmMKKysrIGIvZHJpdmVycy9wdHAvcHRwX2NoYXJkZXYuYwpAQCAtNDYsNyArNDYsOCBAQAogCQljYXBzLm5fZXh0X3RzID0gcHRwLT5pbmZvLT5uX2V4dF90czsKIAkJY2Fwcy5uX3Blcl9vdXQgPSBwdHAtPmluZm8tPm5fcGVyX291dDsKIAkJY2Fwcy5wcHMgPSBwdHAtPmluZm8tPnBwczsKLQkJZXJyID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNhcHMsIHNpemVvZihjYXBzKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY2Fwcywgc2l6ZW9mKGNhcHMpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFBfRVhUVFNfUkVRVUVTVDoKQEAgLTEyOSw4ICsxMzAsMTAgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAKLQlpZiAocHRwLT5kZWZ1bmN0KQorCWlmIChwdHAtPmRlZnVuY3QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwdHAtPnRzZXZxX211eCk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOwogCkBAIC0xNTAsMTAgKzE1Myw4IEBACiAKIAltdXRleF91bmxvY2soJnB0cC0+dHNldnFfbXV4KTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBldmVudCwgY250KSkgewotCQltdXRleF91bmxvY2soJnB0cC0+dHNldnFfbXV4KTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZXZlbnQsIGNudCkpCiAJCXJldHVybiAtRUZBVUxUOwotCX0KIAogCXJldHVybiBjbnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCmluZGV4IGU1ZjdiOGYuLjJiYjhmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCkBAIC0yNjYsNyArMjY2LDcgQEAKICAqIFJlZ3VsYXRvciBpbmZvcm1hdGlvbgogICovCiBzdGF0aWMgc3RydWN0IGRiODUwMF9yZWd1bGF0b3JfaW5mbwotCQlkYjg1MDBfcmVndWxhdG9yX2luZm9bREI4NTAwX05VTV9SRUdVTEFUT1JTXSA9IHsKK2RiODUwMF9yZWd1bGF0b3JfaW5mb1tEQjg1MDBfTlVNX1JFR1VMQVRPUlNdID0gewogCVtEQjg1MDBfUkVHVUxBVE9SX1ZBUEVdID0gewogCQkuZGVzYyA9IHsKIAkJCS5uYW1lCT0gImRiODUwMC12YXBlIiwKQEAgLTQ5MiwxMSArNDkyLDkgQEAKIAkJCQlpbmZvLT5kZXNjLm5hbWUsIGVycik7CiAKIAkJCS8qIGlmIGZhaWxpbmcsIHVucmVnaXN0ZXIgYWxsIGVhcmxpZXIgcmVndWxhdG9ycyAqLwotCQkJaS0tOwotCQkJd2hpbGUgKGkgPj0gMCkgeworCQkJd2hpbGUgKC0taSA+PSAwKSB7CiAJCQkJaW5mbyA9ICZkYjg1MDBfcmVndWxhdG9yX2luZm9baV07CiAJCQkJcmVndWxhdG9yX3VucmVnaXN0ZXIoaW5mby0+cmRldik7Ci0JCQkJaS0tOwogCQkJfQogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtNTM2LDEzICs1MzQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBkYjg1MDBfcmVndWxhdG9yX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkYjg1MDBfcmVndWxhdG9yX2RyaXZlcik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZGI4NTAwX3JlZ3VsYXRvcl9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZGI4NTAwX3JlZ3VsYXRvcl9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKaW5kZXggZGFmZjdmZC4uNDg2ZWQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJczggdmlkID0gLTEsIGk7CiAKIAlpZiAoIWdwaW9faXNfdmFsaWQobWF4ODk1Mi0+cGRhdGEtPmdwaW9fdmlkMCkgfHwKLQkJCSFncGlvX2lzX3ZhbGlkKG1heDg5NTItPnBkYXRhLT5ncGlvX3ZpZDApKSB7CisJCQkhZ3Bpb19pc192YWxpZChtYXg4OTUyLT5wZGF0YS0+Z3Bpb192aWQxKSkgewogCQkvKiBEVlMgbm90IHN1cHBvcnRlZCAqLwogCQlyZXR1cm4gLUVQRVJNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYwppbmRleCAxMGQ1YTFkLi5hZDY2MjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCkBAIC0zOSwyNSArMzksMjggQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CiAJaW50IHJhbXBfZGVsYXk7IC8qIGluIG1WL3VzICovCiAKKwlib29sIGJ1Y2sxX2dwaW9kdnM7CisJYm9vbCBidWNrMl9ncGlvZHZzOworCWJvb2wgYnVjazVfZ3Bpb2R2czsKIAl1OCBidWNrMV92b2xbOF07CiAJdTggYnVjazJfdm9sWzhdOwogCXU4IGJ1Y2s1X3ZvbFs4XTsKKwlpbnQgYnVjazEyNV9ncGlvc1szXTsKIAlpbnQgYnVjazEyNV9ncGlvaW5kZXg7CisJYm9vbCBpZ25vcmVfZ3Bpb2R2c19zaWRlX2VmZmVjdDsKIAogCXU4IHNhdmVkX3N0YXRlc1tNQVg4OTk3X1JFR19NQVhdOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1heDg5OTdfc2V0X2dwaW8oc3RydWN0IG1heDg5OTdfZGF0YSAqbWF4ODk5NykKIHsKLQlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9Ci0JCWRldl9nZXRfcGxhdGRhdGEobWF4ODk5Ny0+aW9kZXYtPmRldik7CiAJaW50IHNldDMgPSAobWF4ODk5Ny0+YnVjazEyNV9ncGlvaW5kZXgpICYgMHgxOwogCWludCBzZXQyID0gKChtYXg4OTk3LT5idWNrMTI1X2dwaW9pbmRleCkgPj4gMSkgJiAweDE7CiAJaW50IHNldDEgPSAoKG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb2luZGV4KSA+PiAyKSAmIDB4MTsKIAotCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5idWNrMTI1X2dwaW9zWzBdLCBzZXQxKTsKLQlncGlvX3NldF92YWx1ZShwZGF0YS0+YnVjazEyNV9ncGlvc1sxXSwgc2V0Mik7Ci0JZ3Bpb19zZXRfdmFsdWUocGRhdGEtPmJ1Y2sxMjVfZ3Bpb3NbMl0sIHNldDMpOworCWdwaW9fc2V0X3ZhbHVlKG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb3NbMF0sIHNldDEpOworCWdwaW9fc2V0X3ZhbHVlKG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb3NbMV0sIHNldDIpOworCWdwaW9fc2V0X3ZhbHVlKG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb3NbMl0sIHNldDMpOwogfQogCiBzdHJ1Y3Qgdm9sdGFnZV9tYXBfZGVzYyB7CkBAIC0zODAsOCArMzgzLDYgQEAKIHN0YXRpYyBpbnQgbWF4ODk5N19nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3QgbWF4ODk5N19kYXRhICptYXg4OTk3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9Ci0JCWRldl9nZXRfcGxhdGRhdGEobWF4ODk5Ny0+aW9kZXYtPmRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IG1heDg5OTctPmlvZGV2LT5pMmM7CiAJaW50IHJlZywgc2hpZnQsIG1hc2ssIHJldDsKIAlpbnQgcmlkID0gbWF4ODk5N19nZXRfcmlkKHJkZXYpOwpAQCAtMzkxLDkgKzM5Miw5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICgocmlkID09IE1BWDg5OTdfQlVDSzEgJiYgcGRhdGEtPmJ1Y2sxX2dwaW9kdnMpIHx8Ci0JCQkocmlkID09IE1BWDg5OTdfQlVDSzIgJiYgcGRhdGEtPmJ1Y2syX2dwaW9kdnMpIHx8Ci0JCQkocmlkID09IE1BWDg5OTdfQlVDSzUgJiYgcGRhdGEtPmJ1Y2s1X2dwaW9kdnMpKQorCWlmICgocmlkID09IE1BWDg5OTdfQlVDSzEgJiYgbWF4ODk5Ny0+YnVjazFfZ3Bpb2R2cykgfHwKKwkJCShyaWQgPT0gTUFYODk5N19CVUNLMiAmJiBtYXg4OTk3LT5idWNrMl9ncGlvZHZzKSB8fAorCQkJKHJpZCA9PSBNQVg4OTk3X0JVQ0s1ICYmIG1heDg5OTctPmJ1Y2s1X2dwaW9kdnMpKQogCQlyZWcgKz0gbWF4ODk5Ny0+YnVjazEyNV9ncGlvaW5kZXg7CiAKIAlyZXQgPSBtYXg4OTk3X3JlYWRfcmVnKGkyYywgcmVnLCAmdmFsKTsKQEAgLTU0Myw3ICs1NDQsOCBAQAogCQkJcmlkID09IE1BWDg5OTdfQlVDSzQgfHwgcmlkID09IE1BWDg5OTdfQlVDSzUpIHsKIAkJLyogSWYgdGhlIHZvbHRhZ2UgaXMgaW5jcmVhc2luZyAqLwogCQlpZiAob3JnIDwgaSkKLQkJCXVkZWxheShkZXNjLT5zdGVwICogKGkgLSBvcmcpIC8gbWF4ODk5Ny0+cmFtcF9kZWxheSk7CisJCQl1ZGVsYXkoRElWX1JPVU5EX1VQKGRlc2MtPnN0ZXAgKiAoaSAtIG9yZyksCisJCQkJCQltYXg4OTk3LT5yYW1wX2RlbGF5KSk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTU2MSw4ICs1NjMsNiBAQAogCQl1OCBuZXdfdmFsLCBpbnQgKmJlc3QpCiB7CiAJc3RydWN0IG1heDg5OTdfZGF0YSAqbWF4ODk5NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0Jc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQotCQlkZXZfZ2V0X3BsYXRkYXRhKG1heDg5OTctPmlvZGV2LT5kZXYpOwogCWludCByaWQgPSBtYXg4OTk3X2dldF9yaWQocmRldik7CiAJdTggKmJ1Y2t4X3ZhbFszXTsKIAlib29sIGJ1Y2t4X2dwaW9kdnNbM107CkBAIC01ODksOSArNTg5LDkgQEAKIAlidWNreF92YWxbMF0gPSBtYXg4OTk3LT5idWNrMV92b2w7CiAJYnVja3hfdmFsWzFdID0gbWF4ODk5Ny0+YnVjazJfdm9sOwogCWJ1Y2t4X3ZhbFsyXSA9IG1heDg5OTctPmJ1Y2s1X3ZvbDsKLQlidWNreF9ncGlvZHZzWzBdID0gcGRhdGEtPmJ1Y2sxX2dwaW9kdnM7Ci0JYnVja3hfZ3Bpb2R2c1sxXSA9IHBkYXRhLT5idWNrMl9ncGlvZHZzOwotCWJ1Y2t4X2dwaW9kdnNbMl0gPSBwZGF0YS0+YnVjazVfZ3Bpb2R2czsKKwlidWNreF9ncGlvZHZzWzBdID0gbWF4ODk5Ny0+YnVjazFfZ3Bpb2R2czsKKwlidWNreF9ncGlvZHZzWzFdID0gbWF4ODk5Ny0+YnVjazJfZ3Bpb2R2czsKKwlidWNreF9ncGlvZHZzWzJdID0gbWF4ODk5Ny0+YnVjazVfZ3Bpb2R2czsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJaW50IG90aGVyczsKQEAgLTY0MCw4ICs2NDAsNiBAQAogCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IG1heDg5OTdfZGF0YSAqbWF4ODk5NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0Jc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQotCQlkZXZfZ2V0X3BsYXRkYXRhKG1heDg5OTctPmlvZGV2LT5kZXYpOwogCWludCByaWQgPSBtYXg4OTk3X2dldF9yaWQocmRldik7CiAJY29uc3Qgc3RydWN0IHZvbHRhZ2VfbWFwX2Rlc2MgKmRlc2M7CiAJaW50IG5ld192YWwsIG5ld19pZHgsIGRhbWFnZSwgdG1wX3ZhbCwgdG1wX2lkeCwgdG1wX2RtZzsKQEAgLTY1MywxNSArNjUxLDE1IEBACiAKIAlzd2l0Y2ggKHJpZCkgewogCWNhc2UgTUFYODk5N19CVUNLMToKLQkJaWYgKHBkYXRhLT5idWNrMV9ncGlvZHZzKQorCQlpZiAobWF4ODk5Ny0+YnVjazFfZ3Bpb2R2cykKIAkJCWdwaW9fZHZzX21vZGUgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfQlVDSzI6Ci0JCWlmIChwZGF0YS0+YnVjazJfZ3Bpb2R2cykKKwkJaWYgKG1heDg5OTctPmJ1Y2syX2dwaW9kdnMpCiAJCQlncGlvX2R2c19tb2RlID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0JVQ0s1OgotCQlpZiAocGRhdGEtPmJ1Y2s1X2dwaW9kdnMpCisJCWlmIChtYXg4OTk3LT5idWNrNV9ncGlvZHZzKQogCQkJZ3Bpb19kdnNfbW9kZSA9IHRydWU7CiAJCWJyZWFrOwogCX0KQEAgLTY5NSw3ICs2OTMsNyBAQAogCW5ld19pZHggPSB0bXBfaWR4OwogCW5ld192YWwgPSB0bXBfdmFsOwogCi0JaWYgKHBkYXRhLT5pZ25vcmVfZ3Bpb2R2c19zaWRlX2VmZmVjdCA9PSBmYWxzZSkKKwlpZiAobWF4ODk5Ny0+aWdub3JlX2dwaW9kdnNfc2lkZV9lZmZlY3QgPT0gZmFsc2UpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGV2X3dhcm4oJnJkZXYtPmRldiwgIk1BWDg5OTcgR1BJTy1EVlMgU2lkZSBFZmZlY3QgV2FybmluZzogR1BJTyBTRVQ6IgpAQCAtOTkzLDYgKzk5MSwxMSBAQAogCWkyYyA9IG1heDg5OTctPmlvZGV2LT5pMmM7CiAKIAltYXg4OTk3LT5idWNrMTI1X2dwaW9pbmRleCA9IHBkYXRhLT5idWNrMTI1X2RlZmF1bHRfaWR4OworCW1heDg5OTctPmJ1Y2sxX2dwaW9kdnMgPSBwZGF0YS0+YnVjazFfZ3Bpb2R2czsKKwltYXg4OTk3LT5idWNrMl9ncGlvZHZzID0gcGRhdGEtPmJ1Y2syX2dwaW9kdnM7CisJbWF4ODk5Ny0+YnVjazVfZ3Bpb2R2cyA9IHBkYXRhLT5idWNrNV9ncGlvZHZzOworCW1lbWNweShtYXg4OTk3LT5idWNrMTI1X2dwaW9zLCBwZGF0YS0+YnVjazEyNV9ncGlvcywgc2l6ZW9mKGludCkgKiAzKTsKKwltYXg4OTk3LT5pZ25vcmVfZ3Bpb2R2c19zaWRlX2VmZmVjdCA9IHBkYXRhLT5pZ25vcmVfZ3Bpb2R2c19zaWRlX2VmZmVjdDsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJbWF4ODk5Ny0+YnVjazFfdm9sW2ldID0gcmV0ID0KQEAgLTExMjQsNiArMTEyNywxMCBAQAogCQkJCTB4M2YpOwogCX0KIAorCS8qIE1pc2MgU2V0dGluZ3MgKi8KKwltYXg4OTk3LT5yYW1wX2RlbGF5ID0gMTA7IC8qIHNldCAxMG1WL3VzLCB3aGljaCBpcyB0aGUgZGVmYXVsdCAqLworCW1heDg5OTdfd3JpdGVfcmVnKGkyYywgTUFYODk5N19SRUdfQlVDS1JBTVAsICgweGYgPDwgNCkgfCAweDkpOworCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcmVndWxhdG9yczsgaSsrKSB7CiAJCWNvbnN0IHN0cnVjdCB2b2x0YWdlX21hcF9kZXNjICpkZXNjOwogCQlpbnQgaWQgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pZDsKQEAgLTExNDgsMTAgKzExNTUsNiBAQAogCQl9CiAJfQogCi0JLyogTWlzYyBTZXR0aW5ncyAqLwotCW1heDg5OTctPnJhbXBfZGVsYXkgPSAxMDsgLyogc2V0IDEwbVYvdXMsIHdoaWNoIGlzIHRoZSBkZWZhdWx0ICovCi0JbWF4ODk5N193cml0ZV9yZWcoaTJjLCBNQVg4OTk3X1JFR19CVUNLUkFNUCwgKDB4ZiA8PCA0KSB8IDB4OSk7Ci0KIAlyZXR1cm4gMDsKIGVycjoKIAlmb3IgKGkgPSAwOyBpIDwgbWF4ODk5Ny0+bnVtX3JlZ3VsYXRvcnM7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IGY4MjJlMTMuLmNlMmFhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMTA1MSw0ICsxMDUxLDEzIEBACiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIExpbnV4IGRyaXZlciBzaWRlIG9mIHRoZSBUaWxlcmEKIAkgIGh5cGVydmlzb3IncyByZWFsLXRpbWUgY2xvY2sgaW50ZXJmYWNlLgogCitjb25maWcgUlRDX0RSVl9QVVYzCisJdHJpc3RhdGUgIlBLVW5pdHkgdjMgUlRDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX1BVVjMKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJUQyBpbiB0aGUgUEtVbml0eS12MyBTb0NzLgorCisJICBUaGlzIGRyaXZlIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXB1djMuCisKIGVuZGlmICMgUlRDX0NMQVNTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IDIxM2Q3MjUuLjBmZmVmZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC03OCw2ICs3OCw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9QTDAzMCkJKz0gcnRjLXBsMDMwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BMMDMxKQkrPSBydGMtcGwwMzEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUFMzKQkrPSBydGMtcHMzLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BVVjMpCSs9IHJ0Yy1wdXYzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BYQSkJKz0gcnRjLXB4YS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SOTcwMSkJKz0gcnRjLXI5NzAxLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JQNUMwMSkJKz0gcnRjLXJwNWMwMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IGVmNjMxNmEuLmRmNjg2MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC0zMTgsNyArMzE4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y19yZWFkX2FsYXJtKTsKIAotaW50IF9fcnRjX3NldF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCitzdGF0aWMgaW50IF9fcnRjX3NldF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCiB7CiAJc3RydWN0IHJ0Y190aW1lIHRtOwogCWxvbmcgbm93LCBzY2hlZHVsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggZDBlMDZlZC4uY2FjZTZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtNDIxLDcgKzQyMSw4IEBACiAJCQllcnIgPSBvcHMtPmlvY3RsKHJ0Yy0+ZGV2LnBhcmVudCwgY21kLCBhcmcpOwogCQkJaWYgKGVyciA9PSAtRU5PSU9DVExDTUQpCiAJCQkJZXJyID0gLUVOT1RUWTsKLQkJfQorCQl9IGVsc2UKKwkJCWVyciA9IC1FTk9UVFk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCmluZGV4IDQ3MjRiYTMuLmIyMDA1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTE0OSw2ICsxNDksNyBAQAogCXsgImRzMTM0MCIsIGRzXzEzNDAgfSwKIAl7ICJkczMyMzEiLCBkc18zMjMxIH0sCiAJeyAibTQxdDAwIiwgbTQxdDAwIH0sCisJeyAicHQ3YzQzMzgiLCBkc18xMzA3IH0sCiAJeyAicng4MDI1IiwgcnhfODAyNSB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tNDF0OTMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDF0OTMuYwppbmRleCAxYTg0YjNlLi43MzE3ZDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbTQxdDkzLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW00MXQ5My5jCkBAIC0xODksNyArMTg5LDcgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgbTQxdDkzX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAogCWlmIChydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIva2VybmVsL3J0Yy5jIGIvZHJpdmVycy9ydGMvcnRjLXB1djMuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBhcmNoL3VuaWNvcmUzMi9rZXJuZWwvcnRjLmMKcmVuYW1lIHRvIGRyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKaW5kZXggOGNhZDcwYi4uNDZmMTRiOCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL3J0Yy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKQEAgLTEsNyArMSw1IEBACiAvKgotICogbGludXgvYXJjaC91bmljb3JlMzIva2VybmVsL3J0Yy5jCi0gKgotICogQ29kZSBzcGVjaWZpYyB0byBQS1VuaXR5IFNvQyBhbmQgVW5pQ29yZSBJU0EKKyAqIFJUQyBkcml2ZXIgY29kZSBzcGVjaWZpYyB0byBQS1VuaXR5IFNvQyBhbmQgVW5pQ29yZSBJU0EKICAqCiAgKglNYWludGFpbmVkIGJ5IEdVQU4gWHVlLXRhbyA8Z3h0QG1wcmMucGt1LmVkdS5jbj4KICAqCUNvcHlyaWdodCAoQykgMjAwMS0yMDEwIEd1YW4gWHVldGFvCkBAIC0zNiw3ICszNCw2IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHB1djNfcnRjX3BpZV9sb2NrKTsKIAogLyogSVJRIEhhbmRsZXJzICovCi0KIHN0YXRpYyBpcnFyZXR1cm5fdCBwdXYzX3J0Y19hbGFybWlycShpbnQgaXJxLCB2b2lkICppZCkKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcmRldiA9IGlkOwpAQCAtODksNyArODYsNiBAQAogfQogCiAvKiBUaW1lIHJlYWQvd3JpdGUgKi8KLQogc3RhdGljIGludCBwdXYzX3J0Y19nZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCiB7CiAJcnRjX3RpbWVfdG9fdG0ocmVhZGwoUlRDX1JDTlIpLCBydGNfdG0pOwpAQCAtMTk2LDcgKzE5Miw2IEBACiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCS8qIGRvIG5vdCBjbGVhciBBSUUgaGVyZSwgaXQgbWF5IGJlIG5lZWRlZCBmb3Igd2FrZSAqLwotCiAJcHV2M19ydGNfc2V0cGllKGRldiwgMCk7CiAJZnJlZV9pcnEocHV2M19ydGNfYWxhcm1ubywgcnRjX2Rldik7CiAJZnJlZV9pcnEocHV2M19ydGNfdGlja25vLCBydGNfZGV2KTsKQEAgLTIxOCw3ICsyMTMsNiBAQAogCQl3cml0ZWwocmVhZGwoUlRDX1JUU1IpICYgflJUQ19SVFNSX0haRSwgUlRDX1JUU1IpOwogCX0gZWxzZSB7CiAJCS8qIHJlLWVuYWJsZSB0aGUgZGV2aWNlLCBhbmQgY2hlY2sgaXQgaXMgb2sgKi8KLQogCQlpZiAoKHJlYWRsKFJUQ19SVFNSKSAmIFJUQ19SVFNSX0haRSkgPT0gMCkgewogCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgInJ0YyBkaXNhYmxlZCwgcmUtZW5hYmxpbmdcbiIpOwogCQkJd3JpdGVsKHJlYWRsKFJUQ19SVFNSKSB8IFJUQ19SVFNSX0haRSwgUlRDX1JUU1IpOwpAQCAtMjUxLDcgKzI0NSw2IEBACiAJcHJfZGVidWcoIiVzOiBwcm9iZT0lcFxuIiwgX19mdW5jX18sIHBkZXYpOwogCiAJLyogZmluZCB0aGUgSVJRcyAqLwotCiAJcHV2M19ydGNfdGlja25vID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKIAlpZiAocHV2M19ydGNfdGlja25vIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgZm9yIHJ0YyB0aWNrXG4iKTsKQEAgLTI2OCw3ICsyNjEsNiBAQAogCQkgcHV2M19ydGNfdGlja25vLCBwdXYzX3J0Y19hbGFybW5vKTsKIAogCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiAqLwotCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAocmVzID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uIHJlc291cmNlXG4iKTsKQEAgLTI4OCw3ICsyODAsNiBAQAogCXB1djNfcnRjX2VuYWJsZShwZGV2LCAxKTsKIAogCS8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLwotCiAJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigicGt1bml0eSIsICZwZGV2LT5kZXYsICZwdXYzX3J0Y29wcywKIAkJCQkgIFRISVNfTU9EVUxFKTsKIApAQCAtMzE1LDggKzMwNiw2IEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAotLyogUlRDIFBvd2VyIG1hbmFnZW1lbnQgY29udHJvbCAqLwotCiBzdGF0aWMgaW50IHRpY250X3NhdmU7CiAKIHN0YXRpYyBpbnQgcHV2M19ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC0zNjgsNCArMzU3LDMgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiUlRDIERyaXZlciBmb3IgdGhlIFBLVW5pdHkgdjMgY2hpcCIpOwogTU9EVUxFX0FVVEhPUigiSHUgRG9uZ2xpYW5nIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYyBiL2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYwppbmRleCBiOGJjODYyLi5lZmQ2MDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdnQ4NTAwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXZ0ODUwMC5jCkBAIC03OCw3ICs3OCw2IEBACiAJdm9pZCBfX2lvbWVtCQkqcmVnYmFzZTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7CiAJaW50CQkJaXJxX2FsYXJtOwotCWludAkJCWlycV9oejsKIAlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOwogCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBQcm90ZWN0cyB0aGlzIHN0cnVjdHVyZSAqLwogfTsKQEAgLTEwMCwxMCArOTksNiBAQAogCWlmIChpc3IgJiAxKQogCQlldmVudHMgfD0gUlRDX0FGIHwgUlRDX0lSUUY7CiAKLQkvKiBPbmx5IHNlY29uZC9taW51dGUgaW50ZXJydXB0cyBhcmUgc3VwcG9ydGVkICovCi0JaWYgKGlzciAmIDIpCi0JCWV2ZW50cyB8PSBSVENfVUYgfCBSVENfSVJRRjsKLQogCXJ0Y191cGRhdGVfaXJxKHZ0ODUwMF9ydGMtPnJ0YywgMSwgZXZlbnRzKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE5OSwyNyArMTk0LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdnQ4NTAwX3VwZGF0ZV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCi17Ci0Jc3RydWN0IHZ0ODUwMF9ydGMgKnZ0ODUwMF9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIHRtcCA9IHJlYWRsKHZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX0NSKTsKLQotCWlmIChlbmFibGVkKQotCQl0bXAgfD0gVlQ4NTAwX1JUQ19DUl9TTV9TRUMgfCBWVDg1MDBfUlRDX0NSX1NNX0VOQUJMRTsKLQllbHNlCi0JCXRtcCAmPSB+VlQ4NTAwX1JUQ19DUl9TTV9FTkFCTEU7Ci0KLQl3cml0ZWwodG1wLCB2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19DUik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB2dDg1MDBfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lID0gdnQ4NTAwX3J0Y19yZWFkX3RpbWUsCiAJLnNldF90aW1lID0gdnQ4NTAwX3J0Y19zZXRfdGltZSwKIAkucmVhZF9hbGFybSA9IHZ0ODUwMF9ydGNfcmVhZF9hbGFybSwKIAkuc2V0X2FsYXJtID0gdnQ4NTAwX3J0Y19zZXRfYWxhcm0sCiAJLmFsYXJtX2lycV9lbmFibGUgPSB2dDg1MDBfYWxhcm1faXJxX2VuYWJsZSwKLQkudXBkYXRlX2lycV9lbmFibGUgPSB2dDg1MDBfdXBkYXRlX2lycV9lbmFibGUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB2dDg1MDBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0yNDgsMTMgKzIyOCw2IEBACiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCi0JdnQ4NTAwX3J0Yy0+aXJxX2h6ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKLQlpZiAodnQ4NTAwX3J0Yy0+aXJxX2h6IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyAxSHogSVJRIHJlc291cmNlIGRlZmluZWRcbiIpOwotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCiAJdnQ4NTAwX3J0Yy0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHZ0ODUwMF9ydGMtPnJlcy0+c3RhcnQsCiAJCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZSh2dDg1MDBfcnRjLT5yZXMpLAogCQkJCQkgICAgICJ2dDg1MDAtcnRjIik7CkBAIC0yNzIsOSArMjQ1LDggQEAKIAkJZ290byBlcnJfcmVsZWFzZTsKIAl9CiAKLQkvKiBFbmFibGUgdGhlIHNlY29uZC9taW51dGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYW5kIGVuYWJsZSBSVEMgKi8KLQl3cml0ZWwoVlQ4NTAwX1JUQ19DUl9FTkFCTEUgfCBWVDg1MDBfUlRDX0NSXzI0SAotCQl8IFZUODUwMF9SVENfQ1JfU01fRU5BQkxFIHwgVlQ4NTAwX1JUQ19DUl9TTV9TRUMsCisJLyogRW5hYmxlIFJUQyBhbmQgc2V0IGl0IHRvIDI0LWhvdXIgbW9kZSAqLworCXdyaXRlbChWVDg1MDBfUlRDX0NSX0VOQUJMRSB8IFZUODUwMF9SVENfQ1JfMjRILAogCSAgICAgICB2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19DUik7CiAKIAl2dDg1MDBfcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJ2dDg1MDAtcnRjIiwgJnBkZXYtPmRldiwKQEAgLTI4NiwyNiArMjU4LDE2IEBACiAJCWdvdG8gZXJyX3VubWFwOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKHZ0ODUwMF9ydGMtPmlycV9oeiwgdnQ4NTAwX3J0Y19pcnEsIDAsCi0JCQkgICJydGMgMUh6IiwgdnQ4NTAwX3J0Yyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAotCQkJdnQ4NTAwX3J0Yy0+aXJxX2h6LCByZXQpOwotCQlnb3RvIGVycl91bnJlZzsKLQl9Ci0KIAlyZXQgPSByZXF1ZXN0X2lycSh2dDg1MDBfcnRjLT5pcnFfYWxhcm0sIHZ0ODUwMF9ydGNfaXJxLCAwLAogCQkJICAicnRjIGFsYXJtIiwgdnQ4NTAwX3J0Yyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAogCQkJdnQ4NTAwX3J0Yy0+aXJxX2FsYXJtLCByZXQpOwotCQlnb3RvIGVycl9mcmVlX2h6OworCQlnb3RvIGVycl91bnJlZzsKIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyX2ZyZWVfaHo6Ci0JZnJlZV9pcnEodnQ4NTAwX3J0Yy0+aXJxX2h6LCB2dDg1MDBfcnRjKTsKIGVycl91bnJlZzoKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIodnQ4NTAwX3J0Yy0+cnRjKTsKIGVycl91bm1hcDoKQEAgLTMyMyw3ICsyODUsNiBAQAogCXN0cnVjdCB2dDg1MDBfcnRjICp2dDg1MDBfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlmcmVlX2lycSh2dDg1MDBfcnRjLT5pcnFfYWxhcm0sIHZ0ODUwMF9ydGMpOwotCWZyZWVfaXJxKHZ0ODUwMF9ydGMtPmlycV9oeiwgdnQ4NTAwX3J0Yyk7CiAKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIodnQ4NTAwX3J0Yy0+cnRjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKaW5kZXggNTVlOGY3Mi4uNTcwZDRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAogCS8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5vIHRhcmdldCBidWZmZXIgZW1wdHkgKi8KIAlpZiAoKCFxLT5pc19pbnB1dF9xICYmCi0JICAgIChxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNV0uZmxhZ3MgJiAweGZmKSA9PSAweDEwKSkgeworCSAgICAocS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTVdLnNmbGFncykgPT0gMHgxMCkpIHsKIAkJcXBlcmZfaW5jKHEsIHRhcmdldF9mdWxsKTsKIAkJREJGX0RFVl9FVkVOVChEQkZfSU5GTywgcS0+aXJxX3B0ciwgIk9VVEZVTEwgRlRDOiUwMngiLAogCQkJICAgICAgcS0+Zmlyc3RfdG9fY2hlY2spOwpAQCAtNDI3LDggKzQyNyw4IEBACiAJREJGX0VSUk9SKChxLT5pc19pbnB1dF9xKSA/ICJJTjolMmQiIDogIk9VVDolMmQiLCBxLT5ucik7CiAJREJGX0VSUk9SKCJGVEM6JTNkIEM6JTNkIiwgcS0+Zmlyc3RfdG9fY2hlY2ssIGNvdW50KTsKIAlEQkZfRVJST1IoIkYxNDolMnggRjE1OiUyeCIsCi0JCSAgcS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTRdLmZsYWdzICYgMHhmZiwKLQkJICBxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNV0uZmxhZ3MgJiAweGZmKTsKKwkJICBxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNF0uc2ZsYWdzLAorCQkgIHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE1XS5zZmxhZ3MpOwogCiAJLyoKIAkgKiBJbnRlcnJ1cHRzIG1heSBiZSBhdm9pZGVkIGFzIGxvbmcgYXMgdGhlIGVycm9yIGlzIHByZXNlbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCmluZGV4IDU1YzZhYTEuLmQzY2VlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaApAQCAtMzYxLDcgKzM2MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHFldGhfaXNfbGFzdF9zYmFsZShzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGUpCiB7Ci0JcmV0dXJuIChzYmFsZS0+ZmxhZ3MgJiBTQkFMX0ZMQUdTX0xBU1RfRU5UUlkpOworCXJldHVybiAoc2JhbGUtPmVmbGFncyAmIFNCQUxfRUZMQUdTX0xBU1RfRU5UUlkpOwogfQogCiBlbnVtIHFldGhfcWRpb19idWZmZXJfc3RhdGVzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCA1MDM2NzhhLi5kZDA4ZjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC04OTAsNyArODkwLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJLyogaXMgUENJIGZsYWcgc2V0IG9uIGJ1ZmZlcj8gKi8KLQlpZiAoYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uZmxhZ3MgJiAweDQwKQorCWlmIChidWYtPmJ1ZmZlci0+ZWxlbWVudFswXS5zZmxhZ3MgJiBTQkFMX1NGTEFHUzBfUENJX1JFUSkKIAkJYXRvbWljX2RlYygmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpOwogCiAJc2tiID0gc2tiX2RlcXVldWUoJmJ1Zi0+c2tiX2xpc3QpOwpAQCAtOTA2LDkgKzkwNiwxMSBAQAogCQlidWYtPmlzX2hlYWRlcltpXSA9IDA7CiAJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmxlbmd0aCA9IDA7CiAJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmFkZHIgPSBOVUxMOwotCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5mbGFncyA9IDA7CisJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmVmbGFncyA9IDA7CisJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLnNmbGFncyA9IDA7CiAJfQotCWJ1Zi0+YnVmZmVyLT5lbGVtZW50WzE1XS5mbGFncyA9IDA7CisJYnVmLT5idWZmZXItPmVsZW1lbnRbMTVdLmVmbGFncyA9IDA7CisJYnVmLT5idWZmZXItPmVsZW1lbnRbMTVdLnNmbGFncyA9IDA7CiAJYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCA9IDA7CiAJYXRvbWljX3NldCgmYnVmLT5zdGF0ZSwgUUVUSF9RRElPX0JVRl9FTVBUWSk7CiB9CkBAIC0yMzY4LDkgKzIzNzAsMTAgQEAKIAkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0ubGVuZ3RoID0gUEFHRV9TSVpFOwogCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5hZGRyID0gIHBvb2xfZW50cnktPmVsZW1lbnRzW2ldOwogCQlpZiAoaSA9PSBRRVRIX01BWF9CVUZGRVJfRUxFTUVOVFMoY2FyZCkgLSAxKQotCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZmxhZ3MgPSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5lZmxhZ3MgPSBTQkFMX0VGTEFHU19MQVNUX0VOVFJZOwogCQllbHNlCi0JCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5mbGFncyA9IDA7CisJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5lZmxhZ3MgPSAwOworCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5zZmxhZ3MgPSAwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI3MTgsMTEgKzI3MjEsMTEgQEAKIAlpZiAocWRpb19lcnJvcikgewogCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCBkYmZ0ZXh0KTsKIAkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgRjE1PSUwMlgiLAotCQkJICAgICAgIGJ1Zi0+ZWxlbWVudFsxNV0uZmxhZ3MgJiAweGZmKTsKKwkJCSAgICAgICBidWYtPmVsZW1lbnRbMTVdLnNmbGFncyk7CiAJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiIEYxND0lMDJYIiwKLQkJCSAgICAgICBidWYtPmVsZW1lbnRbMTRdLmZsYWdzICYgMHhmZik7CisJCQkgICAgICAgYnVmLT5lbGVtZW50WzE0XS5zZmxhZ3MpOwogCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiBxZXJyPSVYIiwgcWRpb19lcnJvcik7Ci0JCWlmICgoYnVmLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmYpID09IDB4MTIpIHsKKwkJaWYgKChidWYtPmVsZW1lbnRbMTVdLnNmbGFncykgPT0gMHgxMikgewogCQkJY2FyZC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZQpAQCAtMjc5OCw3ICsyODAxLDcgQEAKIHN0YXRpYyBpbnQgcWV0aF9oYW5kbGVfc2VuZF9lcnJvcihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAogCQlzdHJ1Y3QgcWV0aF9xZGlvX291dF9idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IHFkaW9fZXJyKQogewotCWludCBzYmFsZjE1ID0gYnVmZmVyLT5idWZmZXItPmVsZW1lbnRbMTVdLmZsYWdzICYgMHhmZjsKKwlpbnQgc2JhbGYxNSA9IGJ1ZmZlci0+YnVmZmVyLT5lbGVtZW50WzE1XS5zZmxhZ3M7CiAKIAlRRVRIX0NBUkRfVEVYVChjYXJkLCA2LCAiaGRzbmRlcnIiKTsKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX0lRRCkgewpAQCAtMjkwNyw4ICsyOTEwLDggQEAKIAogCWZvciAoaSA9IGluZGV4OyBpIDwgaW5kZXggKyBjb3VudDsgKytpKSB7CiAJCWJ1ZiA9ICZxdWV1ZS0+YnVmc1tpICUgUURJT19NQVhfQlVGRkVSU19QRVJfUV07Ci0JCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2J1Zi0+bmV4dF9lbGVtZW50X3RvX2ZpbGwgLSAxXS5mbGFncyB8PQotCQkJCVNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKKwkJYnVmLT5idWZmZXItPmVsZW1lbnRbYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCAtIDFdLmVmbGFncyB8PQorCQkJCVNCQUxfRUZMQUdTX0xBU1RfRU5UUlk7CiAKIAkJaWYgKHF1ZXVlLT5jYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfSVFEKQogCQkJY29udGludWU7CkBAIC0yOTIxLDcgKzI5MjQsNyBAQAogCQkJCS8qIGl0J3MgbGlrZWx5IHRoYXQgd2UnbGwgZ28gdG8gcGFja2luZwogCQkJCSAqIG1vZGUgc29vbiAqLwogCQkJCWF0b21pY19pbmMoJnF1ZXVlLT5zZXRfcGNpX2ZsYWdzX2NvdW50KTsKLQkJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFswXS5mbGFncyB8PSAweDQwOworCQkJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50WzBdLnNmbGFncyB8PSBTQkFMX1NGTEFHUzBfUENJX1JFUTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmICghYXRvbWljX3JlYWQoJnF1ZXVlLT5zZXRfcGNpX2ZsYWdzX2NvdW50KSkgewpAQCAtMjkzNCw3ICsyOTM3LDcgQEAKIAkJCQkgKiBmdXJ0aGVyIHNlbmQgd2FzIHJlcXVlc3RlZCBieSB0aGUgc3RhY2sKIAkJCQkgKi8KIAkJCQlhdG9taWNfaW5jKCZxdWV1ZS0+c2V0X3BjaV9mbGFnc19jb3VudCk7Ci0JCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uZmxhZ3MgfD0gMHg0MDsKKwkJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFswXS5zZmxhZ3MgfD0gU0JBTF9TRkxBR1MwX1BDSV9SRVE7CiAJCQl9CiAJCX0KIAl9CkBAIC0zMTgwLDIwICszMTgzLDIwIEBACiAJCWlmICghbGVuZ3RoKSB7CiAJCQlpZiAoZmlyc3RfbGFwKQogCQkJCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQotCQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPQotCQkJCQkJU0JBTF9GTEFHU19GSVJTVF9GUkFHOworCQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0KKwkJCQkJCVNCQUxfRUZMQUdTX0ZJUlNUX0ZSQUc7CiAJCQkJZWxzZQotCQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPSAwOworCQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0gMDsKIAkJCWVsc2UKLQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPQotCQkJCSAgICBTQkFMX0ZMQUdTX01JRERMRV9GUkFHOworCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5lZmxhZ3MgPQorCQkJCSAgICBTQkFMX0VGTEFHU19NSURETEVfRlJBRzsKIAkJfSBlbHNlIHsKIAkJCWlmIChmaXJzdF9sYXApCi0JCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQkgICAgU0JBTF9GTEFHU19GSVJTVF9GUkFHOworCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5lZmxhZ3MgPQorCQkJCSAgICBTQkFMX0VGTEFHU19GSVJTVF9GUkFHOwogCQkJZWxzZQotCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9Ci0JCQkJICAgIFNCQUxfRkxBR1NfTUlERExFX0ZSQUc7CisJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9CisJCQkJICAgIFNCQUxfRUZMQUdTX01JRERMRV9GUkFHOwogCQl9CiAJCWRhdGEgKz0gbGVuZ3RoX2hlcmU7CiAJCWVsZW1lbnQrKzsKQEAgLTMyMDUsMTIgKzMyMDgsMTIgQEAKIAkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmFkZHIgPSAoY2hhciAqKXBhZ2VfdG9fcGh5cyhmcmFnLT5wYWdlKQogCQkJKyBmcmFnLT5wYWdlX29mZnNldDsKIAkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmxlbmd0aCA9IGZyYWctPnNpemU7Ci0JCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9IFNCQUxfRkxBR1NfTUlERExFX0ZSQUc7CisJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5lZmxhZ3MgPSBTQkFMX0VGTEFHU19NSURETEVfRlJBRzsKIAkJZWxlbWVudCsrOwogCX0KIAotCWlmIChidWZmZXItPmVsZW1lbnRbZWxlbWVudCAtIDFdLmZsYWdzKQotCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudCAtIDFdLmZsYWdzID0gU0JBTF9GTEFHU19MQVNUX0ZSQUc7CisJaWYgKGJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50IC0gMV0uZWZsYWdzKQorCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudCAtIDFdLmVmbGFncyA9IFNCQUxfRUZMQUdTX0xBU1RfRlJBRzsKIAkqbmV4dF9lbGVtZW50X3RvX2ZpbGwgPSBlbGVtZW50OwogfQogCkBAIC0zMjM0LDcgKzMyMzcsNyBAQAogCQkvKmZpbGwgZmlyc3QgYnVmZmVyIGVudHJ5IG9ubHkgd2l0aCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KIAkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmFkZHIgPSBza2ItPmRhdGE7CiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5sZW5ndGggPSBoZHJfbGVuOwotCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPSBTQkFMX0ZMQUdTX0ZJUlNUX0ZSQUc7CisJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5lZmxhZ3MgPSBTQkFMX0VGTEFHU19GSVJTVF9GUkFHOwogCQlidWYtPm5leHRfZWxlbWVudF90b19maWxsKys7CiAJCXNrYi0+ZGF0YSArPSBoZHJfbGVuOwogCQlza2ItPmxlbiAgLT0gaGRyX2xlbjsKQEAgLTMyNDYsNyArMzI0OSw3IEBACiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5hZGRyID0gaGRyOwogCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0ubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKwogCQkJCQkJCWhkX2xlbjsKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0gU0JBTF9GTEFHU19GSVJTVF9GUkFHOworCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0gU0JBTF9FRkxBR1NfRklSU1RfRlJBRzsKIAkJYnVmLT5pc19oZWFkZXJbZWxlbWVudF0gPSAxOwogCQlidWYtPm5leHRfZWxlbWVudF90b19maWxsKys7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKaW5kZXggODUxMmI1Yy4uMDIyZmI2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCkBAIC02NDAsNyArNjQwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnpmY3BfZnNmX3JlcV9jcmVhdGUoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywKLQkJCQkJCXUzMiBmc2ZfY21kLCB1MzIgc2J0eXBlLAorCQkJCQkJdTMyIGZzZl9jbWQsIHU4IHNidHlwZSwKIAkJCQkJCW1lbXBvb2xfdCAqcG9vbCkKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gcWRpby0+YWRhcHRlcjsKQEAgLTg0MSw3ICs4NDEsNyBAQAogCWlmICh6ZmNwX3FkaW9fc2JhbF9nZXQocWRpbykpCiAJCWdvdG8gb3V0OwogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfQUJPUlRfRkNQX0NNTkQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5zY3NpX2Fib3J0KTsKIAlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJcmVxID0gTlVMTDsKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9TRU5EX0dFTkVSSUMsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQsIHBvb2wpOworCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEVfUkVBRCwgcG9vbCk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJcmV0ID0gUFRSX0VSUihyZXEpOwpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX1NFTkRfRUxTLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9XUklURV9SRUFELCBOVUxMKTsKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQsIE5VTEwpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldCA9IFBUUl9FUlIocmVxKTsKQEAgLTExNTYsNyArMTE1Niw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9FWENIQU5HRV9DT05GSUdfREFUQSwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xMTk4LDcgKzExOTgsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0VYQ0hBTkdFX0NPTkZJR19EQVRBLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELCBOVUxMKTsKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsIE5VTEwpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKQEAgLTEyNTAsNyArMTI1MCw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9FWENIQU5HRV9QT1JUX0RBVEEsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9FWENIQU5HRV9QT1JUX0RBVEEsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsIE5VTEwpOworCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwgTlVMTCk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJcmV0dmFsID0gUFRSX0VSUihyZXEpOwpAQCAtMTQxMiw3ICsxNDEyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX09QRU5fUE9SVF9XSVRIX0RJRCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xNDc4LDcgKzE0NzgsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfQ0xPU0VfUE9SVCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xNTUzLDcgKzE1NTMsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfT1BFTl9QT1JUX1dJVEhfRElELAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTE2MDYsNyArMTYwNiw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9DTE9TRV9QT1JULAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTE2OTgsNyArMTY5OCw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9DTE9TRV9QSFlTSUNBTF9QT1JULAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTE4MTIsNyArMTgxMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9PUEVOX0xVTiwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBhZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xOTAxLDcgKzE5MDEsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfQ0xPU0VfTFVOLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTIxNjEsNyArMjE2MSw3IEBACiB7CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOwogCXN0cnVjdCBmY3BfY21uZCAqZmNwX2NtbmQ7Ci0JdW5zaWduZWQgaW50IHNidHlwZSA9IFNCQUxfRkxBR1MwX1RZUEVfUkVBRDsKKwl1OCBzYnR5cGUgPSBTQkFMX1NGTEFHUzBfVFlQRV9SRUFEOwogCWludCByZWFsX2J5dGVzLCByZXR2YWwgPSAtRUlPLCBkaXhfYnl0ZXMgPSAwOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNjc2lfY21uZC0+ZGV2aWNlOwogCXN0cnVjdCB6ZmNwX3Njc2lfZGV2ICp6ZmNwX3NkZXYgPSBzZGV2X3RvX3pmY3Aoc2Rldik7CkBAIC0yMTgxLDcgKzIxODEsNyBAQAogCX0KIAogCWlmIChzY3NpX2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCi0JCXNidHlwZSA9IFNCQUxfRkxBR1MwX1RZUEVfV1JJVEU7CisJCXNidHlwZSA9IFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFOwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9GQ1BfQ01ORCwKIAkJCQkgIHNidHlwZSwgYWRhcHRlci0+cG9vbC5zY3NpX3JlcSk7CkBAIC0yMjgwLDcgKzIyODAsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfRkNQX0NNTkQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFLAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEUsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLnNjc2lfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMjMyOCwxNyArMjMyOCwxOCBAQAogCXN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8gPSBhZGFwdGVyLT5xZGlvOwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSA9IE5VTEw7CiAJc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9zdXBwb3J0ICpib3R0b207Ci0JaW50IGRpcmVjdGlvbiwgcmV0dmFsID0gLUVJTywgYnl0ZXM7CisJaW50IHJldHZhbCA9IC1FSU8sIGJ5dGVzOworCXU4IGRpcmVjdGlvbjsKIAogCWlmICghKGFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9DRkRDKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwogCiAJc3dpdGNoIChmc2ZfY2ZkYy0+Y29tbWFuZCkgewogCWNhc2UgRlNGX1FUQ0JfRE9XTkxPQURfQ09OVFJPTF9GSUxFOgotCQlkaXJlY3Rpb24gPSBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFOworCQlkaXJlY3Rpb24gPSBTQkFMX1NGTEFHUzBfVFlQRV9XUklURTsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUVRDQl9VUExPQURfQ09OVFJPTF9GSUxFOgotCQlkaXJlY3Rpb24gPSBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQ7CisJCWRpcmVjdGlvbiA9IFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjQxMyw3ICsyNDE0LDcgQEAKIAkJZnNmX3JlcS0+cWRpb19yZXEuc2JhbF9yZXNwb25zZSA9IHNiYWxfaWR4OwogCQl6ZmNwX2ZzZl9yZXFfY29tcGxldGUoZnNmX3JlcSk7CiAKLQkJaWYgKGxpa2VseShzYmFsZS0+ZmxhZ3MgJiBTQkFMX0ZMQUdTX0xBU1RfRU5UUlkpKQorCQlpZiAobGlrZWx5KHNiYWxlLT5lZmxhZ3MgJiBTQkFMX0VGTEFHU19MQVNUX0VOVFJZKSkKIAkJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKaW5kZXggOThlOTdkOS4uZDljNDBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiAJLyogc2V0IGxhc3QgZW50cnkgZmxhZyBpbiBjdXJyZW50IFNCQUxFIG9mIGN1cnJlbnQgU0JBTCAqLwogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX2N1cnIocWRpbywgcV9yZXEpOwotCXNiYWxlLT5mbGFncyB8PSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJc2JhbGUtPmVmbGFncyB8PSBTQkFMX0VGTEFHU19MQVNUX0VOVFJZOwogCiAJLyogZG9uJ3QgZXhjZWVkIGxhc3QgYWxsb3dlZCBTQkFMICovCiAJaWYgKHFfcmVxLT5zYmFsX2xhc3QgPT0gcV9yZXEtPnNiYWxfbGltaXQpCkBAIC0xMzIsNyArMTMyLDcgQEAKIAogCS8qIHNldCBjaGFpbmluZyBmbGFnIGluIGZpcnN0IFNCQUxFIG9mIGN1cnJlbnQgU0JBTCAqLwogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX3JlcShxZGlvLCBxX3JlcSk7Ci0Jc2JhbGUtPmZsYWdzIHw9IFNCQUxfRkxBR1MwX01PUkVfU0JBTFM7CisJc2JhbGUtPnNmbGFncyB8PSBTQkFMX1NGTEFHUzBfTU9SRV9TQkFMUzsKIAogCS8qIGNhbGN1bGF0ZSBpbmRleCBvZiBuZXh0IFNCQUwgKi8KIAlxX3JlcS0+c2JhbF9sYXN0Kys7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCS8qIHNldCBzdG9yYWdlLWJsb2NrIHR5cGUgZm9yIG5ldyBTQkFMICovCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfY3VycihxZGlvLCBxX3JlcSk7Ci0Jc2JhbGUtPmZsYWdzIHw9IHFfcmVxLT5zYnR5cGU7CisJc2JhbGUtPnNmbGFncyB8PSBxX3JlcS0+c2J0eXBlOwogCiAJcmV0dXJuIHNiYWxlOwogfQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIAkvKiBzZXQgc3RvcmFnZS1ibG9jayB0eXBlIGZvciB0aGlzIHJlcXVlc3QgKi8KIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9yZXEocWRpbywgcV9yZXEpOwotCXNiYWxlLT5mbGFncyB8PSBxX3JlcS0+c2J0eXBlOworCXNiYWxlLT5zZmxhZ3MgfD0gcV9yZXEtPnNidHlwZTsKIAogCWZvciAoOyBzZzsgc2cgPSBzZ19uZXh0KHNnKSkgewogCQlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9uZXh0KHFkaW8sIHFfcmVxKTsKQEAgLTM4NCw3ICszODQsOCBAQAogCWZvciAoY2MgPSAwOyBjYyA8IFFESU9fTUFYX0JVRkZFUlNfUEVSX1E7IGNjKyspIHsKIAkJc2JhbGUgPSAmKHFkaW8tPnJlc19xW2NjXS0+ZWxlbWVudFswXSk7CiAJCXNiYWxlLT5sZW5ndGggPSAwOwotCQlzYmFsZS0+ZmxhZ3MgPSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJCXNiYWxlLT5lZmxhZ3MgPSBTQkFMX0VGTEFHU19MQVNUX0VOVFJZOworCQlzYmFsZS0+c2ZsYWdzID0gMDsKIAkJc2JhbGUtPmFkZHIgPSBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uaAppbmRleCAyMjk3ZDhkLi41NGUyMmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uaApAQCAtNjcsNyArNjcsNyBAQAogICogQHFkaW9fb3V0Yl91c2FnZTogdXNhZ2Ugb2Ygb3V0Ym91bmQgcXVldWUKICAqLwogc3RydWN0IHpmY3BfcWRpb19yZXEgewotCXUzMglzYnR5cGU7CisJdTgJc2J0eXBlOwogCXU4CXNiYWxfbnVtYmVyOwogCXU4CXNiYWxfZmlyc3Q7CiAJdTgJc2JhbF9sYXN0OwpAQCAtMTE2LDcgKzExNiw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgemZjcF9xZGlvX3JlcV9pbml0KHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICpxX3JlcSwKLQkJCXVuc2lnbmVkIGxvbmcgcmVxX2lkLCB1MzIgc2J0eXBlLCB2b2lkICpkYXRhLCB1MzIgbGVuKQorCQkJdW5zaWduZWQgbG9uZyByZXFfaWQsIHU4IHNidHlwZSwgdm9pZCAqZGF0YSwgdTMyIGxlbikKIHsKIAlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJaW50IGNvdW50ID0gbWluKGF0b21pY19yZWFkKCZxZGlvLT5yZXFfcV9mcmVlKSwKQEAgLTEzMSw3ICsxMzEsOCBAQAogCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfcmVxKHFkaW8sIHFfcmVxKTsKIAlzYmFsZS0+YWRkciA9ICh2b2lkICopIHJlcV9pZDsKLQlzYmFsZS0+ZmxhZ3MgPSBTQkFMX0ZMQUdTMF9DT01NQU5EIHwgc2J0eXBlOworCXNiYWxlLT5lZmxhZ3MgPSAwOworCXNiYWxlLT5zZmxhZ3MgPSBTQkFMX1NGTEFHUzBfQ09NTUFORCB8IHNidHlwZTsKIAogCWlmICh1bmxpa2VseSghZGF0YSkpCiAJCXJldHVybjsKQEAgLTE3Myw3ICsxNzQsNyBAQAogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX2N1cnIocWRpbywgcV9yZXEpOwotCXNiYWxlLT5mbGFncyB8PSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJc2JhbGUtPmVmbGFncyB8PSBTQkFMX0VGTEFHU19MQVNUX0VOVFJZOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKaW5kZXggNGExZjAyOS4uOGQ5ZGFlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL0tjb25maWcKQEAgLTgzMCw2ICs4MzAsMTkgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdkdGguCiAKK2NvbmZpZyBTQ1NJX0lTQ0kKKwl0cmlzdGF0ZSAiSW50ZWwoUikgQzYwMCBTZXJpZXMgQ2hpcHNldCBTQVMgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJZGVwZW5kcyBvbiBYODYKKwkjICh0ZW1wb3JhcnkpOiBrbm93biBhbHBoYSBxdWFsaXR5IGRyaXZlcgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNDU0lfU0FTX0xJQlNBUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSA2R2IvcyBTQVMgY2FwYWJpbGl0aWVzIG9mIHRoZSBzdG9yYWdlCisJICBjb250cm9sIHVuaXQgZm91bmQgaW4gdGhlIEludGVsKFIpIEM2MDAgc2VyaWVzIGNoaXBzZXQuCisKKwkgIFRoZSBleHBlcmltZW50YWwgdGFnIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGUgZHJpdmVyIGV4aXRzIGFscGhhCisKIGNvbmZpZyBTQ1NJX0dFTkVSSUNfTkNSNTM4MAogCXRyaXN0YXRlICJHZW5lcmljIE5DUjUzODAvNTNjNDAwIFNDU0kgUElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IDdhZDBiOGEuLjNjMDhmNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTczLDYgKzczLDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEKQkrPSBhaWM3eHh4X29sZC5vCiBvYmotJChDT05GSUdfU0NTSV9BSUM5NFhYKQkrPSBhaWM5NHh4Lwogb2JqLSQoQ09ORklHX1NDU0lfUE04MDAxKQkrPSBwbTgwMDEvCitvYmotJChDT05GSUdfU0NTSV9JU0NJKQkJKz0gaXNjaS8KIG9iai0kKENPTkZJR19TQ1NJX0lQUykJCSs9IGlwcy5vCiBvYmotJChDT05GSUdfU0NTSV9GRF9NQ1MpCSs9IGZkX21jcy5vCiBvYmotJChDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOKSs9IGZkb21haW4ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuYyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKaW5kZXggYzZjMDQzNC4uNmJiYTIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuYworKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCkBAIC0xMDM3LDYgKzEwMzcsNyBAQAogCXVuc2lnbmVkIGNoYXIgc2Vuc2Vfa2V5OwogCXVuc2lnbmVkIGNoYXIgYXNjOyAgICAgIC8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSAqLwogCXVuc2lnbmVkIGNoYXIgYXNjcTsgICAgIC8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBxdWFsaWZpZXIgKi8KKwl1bnNpZ25lZCBsb25nIHNlbnNlX2RhdGFfc2l6ZTsKIAogCWVpID0gY3AtPmVycl9pbmZvOwogCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNwLT5zY3NpX2NtZDsKQEAgLTEwNTEsMTAgKzEwNTIsMTQgQEAKIAljbWQtPnJlc3VsdCB8PSBlaS0+U2NzaVN0YXR1czsKIAogCS8qIGNvcHkgdGhlIHNlbnNlIGRhdGEgd2hldGhlciB3ZSBuZWVkIHRvIG9yIG5vdC4gKi8KLQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsIGVpLT5TZW5zZUluZm8sCi0JCWVpLT5TZW5zZUxlbiA+IFNDU0lfU0VOU0VfQlVGRkVSU0laRSA/Ci0JCQlTQ1NJX1NFTlNFX0JVRkZFUlNJWkUgOgotCQkJZWktPlNlbnNlTGVuKTsKKwlpZiAoU0NTSV9TRU5TRV9CVUZGRVJTSVpFIDwgc2l6ZW9mKGVpLT5TZW5zZUluZm8pKQorCQlzZW5zZV9kYXRhX3NpemUgPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJZWxzZQorCQlzZW5zZV9kYXRhX3NpemUgPSBzaXplb2YoZWktPlNlbnNlSW5mbyk7CisJaWYgKGVpLT5TZW5zZUxlbiA8IHNlbnNlX2RhdGFfc2l6ZSkKKwkJc2Vuc2VfZGF0YV9zaXplID0gZWktPlNlbnNlTGVuOworCisJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCBlaS0+U2Vuc2VJbmZvLCBzZW5zZV9kYXRhX3NpemUpOwogCXNjc2lfc2V0X3Jlc2lkKGNtZCwgZWktPlJlc2lkdWFsQ250KTsKIAogCWlmIChlaS0+Q29tbWFuZFN0YXR1cyA9PSAwKSB7CkBAIC0yNTgwLDcgKzI1ODUsOCBAQAogCQljLT5TR1swXS5FeHQgPSAwOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nKi8KIAl9CiAJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKLQlocHNhX3BjaV91bm1hcChoLT5wZGV2LCBjLCAxLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChpb2NvbW1hbmQuYnVmX3NpemUgPiAwKQorCQlocHNhX3BjaV91bm1hcChoLT5wZGV2LCBjLCAxLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWNoZWNrX2lvY3RsX3VuaXRfYXR0ZW50aW9uKGgsIGMpOwogCiAJLyogQ29weSB0aGUgZXJyb3IgaW5mb3JtYXRpb24gb3V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKaW5kZXggYjc2NTA2MS4uYmRmYTIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYwpAQCAtNDMwNiw4ICs0MzA2LDggQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlpZiAocmMgPT0gSF9DTE9TRUQpCiAJCQl2aW9fZW5hYmxlX2ludGVycnVwdHModG9fdmlvX2Rldih2aG9zdC0+ZGV2KSk7Ci0JCWVsc2UgaWYgKHJjIHx8IChyYyA9IGlibXZmY19zZW5kX2NycV9pbml0KHZob3N0KSkgfHwKLQkJCSAocmMgPSB2aW9fZW5hYmxlX2ludGVycnVwdHModG9fdmlvX2Rldih2aG9zdC0+ZGV2KSkpKSB7CisJCWlmIChyYyB8fCAocmMgPSBpYm12ZmNfc2VuZF9jcnFfaW5pdCh2aG9zdCkpIHx8CisJCSAgICAocmMgPSB2aW9fZW5hYmxlX2ludGVycnVwdHModG9fdmlvX2Rldih2aG9zdC0+ZGV2KSkpKSB7CiAJCQlpYm12ZmNfbGlua19kb3duKHZob3N0LCBJQk1WRkNfTElOS19ERUFEKTsKIAkJCWRldl9lcnIodmhvc3QtPmRldiwgIkVycm9yIGFmdGVyIHJlc2V0IChyYz0lZClcbiIsIHJjKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvaXNjaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU5ZTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACitvYmotJChDT05GSUdfU0NTSV9JU0NJKSArPSBpc2NpLm8KK2lzY2ktb2JqcyA6PSBpbml0Lm8gcGh5Lm8gcmVxdWVzdC5vIFwKKwkgICAgIHJlbW90ZV9kZXZpY2UubyBwb3J0Lm8gXAorCSAgICAgaG9zdC5vIHRhc2subyBwcm9iZV9yb21zLm8gXAorCSAgICAgcmVtb3RlX25vZGVfY29udGV4dC5vIFwKKwkgICAgIHJlbW90ZV9ub2RlX3RhYmxlLm8gXAorCSAgICAgdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5vIFwKKwkgICAgIHBvcnRfY29uZmlnLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjU0NDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIyBNYWtlZmlsZSBmb3IgY3JlYXRlX2Z3CisjCitDQz1nY2MKK0NGTEFHUz0tYyAtV2FsbCAtTzIgLWcKK0xERkxBR1M9CitTT1VSQ0VTPWNyZWF0ZV9mdy5jCitPQkpFQ1RTPSQoU09VUkNFUzouY3BwPS5vKQorRVhFQ1VUQUJMRT1jcmVhdGVfZncKKworYWxsOiAkKFNPVVJDRVMpICQoRVhFQ1VUQUJMRSkKKworJChFWEVDVVRBQkxFKTogJChPQkpFQ1RTKQorCSQoQ0MpICQoTERGTEFHUykgJChPQkpFQ1RTKSAtbyAkQAorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAkPCAtTyAkQAorCitjbGVhbjoKKwlybSAtZiAqLm8gJChFWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvUkVBRE1FIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTZkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9SRUFETUUKQEAgLTAsMCArMSwzNiBAQAorVGhpcyBkZWZpbmVzIHRoZSB0ZW1wb3JhcnkgYmluYXJ5IGJsb3cgd2UgYXJlIHRvIHBhc3MgdG8gdGhlIFNDVQorZHJpdmVyIHRvIGVtdWxhdGUgdGhlIGJpbmFyeSBmaXJtd2FyZSB0aGF0IHdlIHdpbGwgZXZlbnR1YWxseSBiZQorYWJsZSB0byBhY2Nlc3MgdmlhIE5WUkFNIG9uIHRoZSBTQ1UgY29udHJvbGxlci4KKworVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYmluYXJ5IGJsb2IgaXMgZXhwZWN0ZWQgdG8gYmUgMTQ5IGJ5dGVzIG9yIGxhcmdlcgorCitIZWFkZXIgVHlwZXM6CisweDE6IFBoeSBNYXNrcworMHgyOiBQaHkgR2VucworMHgzOiBTQVMgQWRkcnMKKzB4ZmY6IEVuZCBvZiBEYXRhCisKK0lEIHN0cmluZyAtIHU4WzEyXTogIiNTQ1UgTUFHSUMjXDAiCitWZXJzaW9uIC0gdTg6IDEKK1N1YlZlcnNpb24gLSB1ODogMAorCitIZWFkZXIgVHlwZSAtIHU4OiAweDEKK1NpemUgLSB1ODogOAorUGh5IE1hc2sgLSB1MzJbOF0KKworSGVhZGVyIFR5cGUgLSB1ODogMHgyCitTaXplIC0gdTg6IDgKK1BoeSBHZW4gLSB1MzJbOF0KKworSGVhZGVyIFR5cGUgLSB1ODogMHgzCitTaXplIC0gdTg6IDgKK1NhcyBBZGRyIC0gdTY0WzhdCisKK0hlYWRlciBUeXBlIC0gdTg6IDB4ZgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQbGFjZSBpc2NpX2Zpcm13YXJlLmJpbiBpbiAvbGliL2Zpcm13YXJlCitCZSBzdXJlIHRvIHJlY3JlYXRlIHRoZSBpbml0cmFtZnMgaW1hZ2UgdG8gaW5jbHVkZSB0aGUgZmlybXdhcmUuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5jIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvY3JlYXRlX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhMjg4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5jCkBAIC0wLDAgKzEsOTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNyZWF0ZV9mdy5oIgorI2luY2x1ZGUgIi4uL3Byb2JlX3JvbXMuaCIKKworaW50IHdyaXRlX2Jsb2Ioc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9vcm9tKQoreworCUZJTEUgKmZkOworCWludCBlcnI7CisJc2l6ZV90IGNvdW50OworCisJZmQgPSBmb3BlbihibG9iX25hbWUsICJ3KyIpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJPcGVuIGZpbGUgZm9yIHdyaXRlIGZhaWxlZCIpOworCQlmY2xvc2UoZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljb3VudCA9IGZ3cml0ZShpc2NpX29yb20sIHNpemVvZihzdHJ1Y3QgaXNjaV9vcm9tKSwgMSwgZmQpOworCWlmIChjb3VudCAhPSAxKSB7CisJCXBlcnJvcigiV3JpdGUgZGF0YSBmYWlsZWQiKTsKKwkJZmNsb3NlKGZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZmNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHNldF9iaW5hcnlfdmFsdWVzKHN0cnVjdCBpc2NpX29yb20gKmlzY2lfb3JvbSkKK3sKKwlpbnQgY3RybF9pZHgsIHBoeV9pZHgsIHBvcnRfaWR4OworCisJLyogc2V0dGluZyBPUk9NIHNpZ25hdHVyZSAqLworCXN0cm5jcHkoaXNjaV9vcm9tLT5oZHIuc2lnbmF0dXJlLCBzaWcsIHN0cmxlbihzaWcpKTsKKwlpc2NpX29yb20tPmhkci52ZXJzaW9uID0gdmVyc2lvbjsKKwlpc2NpX29yb20tPmhkci50b3RhbF9ibG9ja19sZW5ndGggPSBzaXplb2Yoc3RydWN0IGlzY2lfb3JvbSk7CisJaXNjaV9vcm9tLT5oZHIuaGRyX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2NpX2Jpb3Nfb2VtX3BhcmFtX2Jsb2NrX2hkcik7CisJaXNjaV9vcm9tLT5oZHIubnVtX2VsZW1lbnRzID0gbnVtX2VsZW1lbnRzOworCisJZm9yIChjdHJsX2lkeCA9IDA7IGN0cmxfaWR4IDwgMjsgY3RybF9pZHgrKykgeworCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLmNvbnRyb2xsZXIubW9kZV90eXBlID0gbW9kZV90eXBlOworCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXAgPQorCQkJbWF4X251bV9jb25jdXJyZW50X2Rldl9zcGluX3VwOworCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLmNvbnRyb2xsZXIuZG9fZW5hYmxlX3NzYyA9CisJCQllbmFibGVfc3NjOworCisJCWZvciAocG9ydF9pZHggPSAwOyBwb3J0X2lkeCA8IDQ7IHBvcnRfaWR4KyspCisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBvcnRzW3BvcnRfaWR4XS5waHlfbWFzayA9CisJCQkJcGh5X21hc2tbY3RybF9pZHhdW3BvcnRfaWR4XTsKKworCQlmb3IgKHBoeV9pZHggPSAwOyBwaHlfaWR4IDwgNDsgcGh5X2lkeCsrKSB7CisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uc2FzX2FkZHJlc3MuaGlnaCA9CisJCQkJKF9fdTMyKShzYXNfYWRkcltjdHJsX2lkeF1bcGh5X2lkeF0gPj4gMzIpOworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLnNhc19hZGRyZXNzLmxvdyA9CisJCQkJKF9fdTMyKShzYXNfYWRkcltjdHJsX2lkeF1bcGh5X2lkeF0pOworCisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uYWZlX3R4X2FtcF9jb250cm9sMCA9CisJCQkJYWZlX3R4X2FtcF9jb250cm9sMDsKKwkJCWlzY2lfb3JvbS0+Y3RybFtjdHJsX2lkeF0ucGh5c1twaHlfaWR4XS5hZmVfdHhfYW1wX2NvbnRyb2wxID0KKwkJCQlhZmVfdHhfYW1wX2NvbnRyb2wxOworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLmFmZV90eF9hbXBfY29udHJvbDIgPQorCQkJCWFmZV90eF9hbXBfY29udHJvbDI7CisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uYWZlX3R4X2FtcF9jb250cm9sMyA9CisJCQkJYWZlX3R4X2FtcF9jb250cm9sMzsKKwkJfQorCX0KK30KKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpc2NpX29yb20gKmlzY2lfb3JvbTsKKworCWlzY2lfb3JvbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlzY2lfb3JvbSkpOworCW1lbXNldChpc2NpX29yb20sIDAsIHNpemVvZihzdHJ1Y3QgaXNjaV9vcm9tKSk7CisKKwlzZXRfYmluYXJ5X3ZhbHVlcyhpc2NpX29yb20pOworCisJZXJyID0gd3JpdGVfYmxvYihpc2NpX29yb20pOworCWlmIChlcnIgPCAwKSB7CisJCWZyZWUoaXNjaV9vcm9tKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmcmVlKGlzY2lfb3JvbSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjk4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIF9DUkVBVEVfRldfSF8KKyNkZWZpbmUgX0NSRUFURV9GV19IXworI2luY2x1ZGUgIi4uL3Byb2JlX3JvbXMuaCIKKworCisvKiB3ZSBhcmUgY29uZmlndXJpbmcgZm9yIDIgU0NVcyAqLworc3RhdGljIGNvbnN0IGludCBudW1fZWxlbWVudHMgPSAyOworCisvKgorICogRm9yIGFsbCBkZWZpbmVkIGFycmF5czoKKyAqIGVsZW1lbnRzIDAtMyBhcmUgZm9yIFNDVTAsIHBvcnRzIDAtMworICogZWxlbWVudHMgNC03IGFyZSBmb3IgU0NVMSwgcG9ydHMgMC0zCisgKgorICogdmFsaWQgY29uZmlndXJhdGlvbnMgZm9yIG9uZSBTQ1UgYXJlOgorICogIFAwICBQMSAgUDIgIFAzCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKiAweEYsMHgwLDB4MCwweDAgIyAxIHg0IHBvcnQKKyAqIDB4MywweDAsMHg0LDB4OCAjIFBoeXMgMCBhbmQgMSBhcmUgYSB4MiBwb3J0LCBwaHkgMiBhbmQgcGh5IDMgYXJlIGVhY2ggeDEKKyAqICAgICAgICAgICAgICAgICAjIHBvcnRzCisgKiAweDEsMHgyLDB4QywweDAgIyBQaHlzIDAgYW5kIDEgYXJlIGVhY2ggeDEgcG9ydHMsIHBoeSAyIGFuZCBwaHkgMyBhcmUgYSB4MgorICogICAgICAgICAgICAgICAgICMgcG9ydAorICogMHgzLDB4MCwweEMsMHgwICMgUGh5cyAwIGFuZCAxIGFyZSBhIHgyIHBvcnQsIHBoeSAyIGFuZCBwaHkgMyBhcmUgYSB4MiBwb3J0CisgKiAweDEsMHgyLDB4NCwweDggIyBFYWNoIHBoeSBpcyBhIHgxIHBvcnQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbikKKyAqCisgKiBpZiB0aGVyZSBpcyBhIHBvcnQvcGh5IG9uIHdoaWNoIHlvdSBkbyBub3Qgd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorICogdmFsdWVzLCB1c2UgdGhlIHZhbHVlIGFzc2lnbmVkIHRvIFVOSU5JVF9QQVJBTSAoMjU1KS4KKyAqLworCisvKiBkaXNjb3ZlcnkgbW9kZSB0eXBlIChwb3J0IGF1dG8gY29uZmlnIG1vZGUgYnkgZGVmYXVsdCApICovCisKKy8qCisgKiBpZiB0aGVyZSBpcyBhIHBvcnQvcGh5IG9uIHdoaWNoIHlvdSBkbyBub3Qgd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorICogdmFsdWVzLCB1c2UgdGhlIHZhbHVlICIwMDAwMDAwMDAwMDAwMDAwIi4gU0FTIGFkZHJlc3Mgb2YgemVybydzIGlzCisgKiBjb25zaWRlcmVkIGludmFsaWQgYW5kIHdpbGwgbm90IGJlIHVzZWQuCisgKi8KKyNpZmRlZiBNUEMKK3N0YXRpYyBjb25zdCBpbnQgbW9kZV90eXBlID0gU0NJQ19QT1JUX01BTlVBTF9DT05GSUdVUkFUSU9OX01PREU7CitzdGF0aWMgY29uc3QgX191OCBwaHlfbWFza1syXVs0XSA9IHsgezEsIDIsIDQsIDh9LAorCQkJCSAgICAgezEsIDIsIDQsIDh9IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHNhc19hZGRyWzJdWzRdID0geyB7IDB4NUZDRkZGRkZGMDAwMDAwMVVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRkYwMDAwMDAyVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGRjAwMDAwMDNVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkZGMDAwMDAwNFVMTCB9LAorCQkJCQkJICAgeyAweDVGQ0ZGRkZGRjAwMDAwMDVVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkZGMDAwMDAwNlVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRkYwMDAwMDA3VUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGRjAwMDAwMDhVTEwgfSB9OworI2Vsc2UJLyogQVBDIChkZWZhdWx0KSAqLworc3RhdGljIGNvbnN0IGludCBtb2RlX3R5cGUgPSBTQ0lDX1BPUlRfQVVUT01BVElDX0NPTkZJR1VSQVRJT05fTU9ERTsKK3N0YXRpYyBjb25zdCBfX3U4IHBoeV9tYXNrWzJdWzRdOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBzYXNfYWRkclsyXVs0XSA9IHsgeyAweDVGQ0ZGRkZGMDAwMDAwMDFVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkYwMDAwMDAwMVVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRjAwMDAwMDAxVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGMDAwMDAwMDFVTEwgfSwKKwkJCQkJCSAgIHsgMHg1RkNGRkZGRjAwMDAwMDAyVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGMDAwMDAwMDJVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkYwMDAwMDAwMlVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRjAwMDAwMDAyVUxMIH0gfTsKKyNlbmRpZgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGRldmljZSBzcGluIHVwICovCitzdGF0aWMgY29uc3QgaW50IG1heF9udW1fY29uY3VycmVudF9kZXZfc3Bpbl91cCA9IDE7CisKKy8qIGVuYWJsZSBvZiBzc2Mgb3BlcmF0aW9uICovCitzdGF0aWMgY29uc3QgaW50IGVuYWJsZV9zc2M7CisKKy8qIEFGRV9UWF9BTVBfQ09OVFJPTCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhZmVfdHhfYW1wX2NvbnRyb2wwID0gMHgwMDBiZGQwODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWZlX3R4X2FtcF9jb250cm9sMSA9IDB4MDAwZmZjMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFmZV90eF9hbXBfY29udHJvbDIgPSAweDAwMGI3YzA5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhZmVfdHhfYW1wX2NvbnRyb2wzID0gMHgwMDBhZmM2ZTsKKworc3RhdGljIGNvbnN0IGNoYXIgYmxvYl9uYW1lW10gPSAiaXNjaV9maXJtd2FyZS5iaW4iOworc3RhdGljIGNvbnN0IGNoYXIgc2lnW10gPSAiSVNDVU9FTUIiOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmVyc2lvbiA9IDB4MTA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDcyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmMKQEAgLTAsMCArMSwyNzUxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zYXMuaD4KKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgorI2luY2x1ZGUgInJlbW90ZV9kZXZpY2UuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAic2N1X2NvbXBsZXRpb25fY29kZXMuaCIKKyNpbmNsdWRlICJzY3VfZXZlbnRfY29kZXMuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJzY3VfcmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgInNjdV90YXNrX2NvbnRleHQuaCIKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9SQU1fSU5JVF9TVEFMTF9USU1FICAgICAgMjAwCisKKyNkZWZpbmUgc211X21heF9wb3J0cyhkY2NfdmFsdWUpIFwKKwkoXAorCQkoKChkY2NfdmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9NQVNLKSBcCisJCSA+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX1NISUZUKSArIDEgXAorCSkKKworI2RlZmluZSBzbXVfbWF4X3Rhc2tfY29udGV4dHMoZGNjX3ZhbHVlKQlcCisJKFwKKwkJKCgoZGNjX3ZhbHVlKSAmIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfTUFTSykgXAorCQkgPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19TSElGVCkgKyAxIFwKKwkpCisKKyNkZWZpbmUgc211X21heF9ybmNzKGRjY192YWx1ZSkgXAorCShcCisJCSgoKGRjY192YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19NQVNLKSBcCisJCSA+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19TSElGVCkgKyAxIFwKKwkpCisKKyNkZWZpbmUgU0NJQ19TRFNfQ09OVFJPTExFUl9QSFlfU1RBUlRfVElNRU9VVCAgICAgIDEwMAorCisvKioKKyAqCisgKgorICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB3aGlsZSBhIGdpdmVuIHBoeSBpcyBjb25zdW1pbmcgcG93ZXIKKyAqIGJlZm9yZSBhbGxvd2luZyBhbm90aGVyIHNldCBvZiBwaHlzIHRvIGNvbnN1bWUgcG93ZXIuIFVsdGltYXRlbHksIHRoaXMgd2lsbAorICogYmUgc3BlY2lmaWVkIGJ5IE9FTSBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfQ09OVFJPTExFUl9QT1dFUl9DT05UUk9MX0lOVEVSVkFMIDUwMAorCisvKioKKyAqIE5PUk1BTElaRV9QVVRfUE9JTlRFUigpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgbm9ybWFsaXplIHRoZSBjb21wbGV0aW9uIHF1ZXVlIHB1dCBwb2ludGVyIHNvIGl0cyB2YWx1ZSBjYW4KKyAqIGJlIHVzZWQgYXMgYW4gYXJyYXkgaW5kZQorICovCisjZGVmaW5lIE5PUk1BTElaRV9QVVRfUE9JTlRFUih4KSBcCisJKCh4KSAmIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9QT0lOVEVSX01BU0spCisKKworLyoqCisgKiBOT1JNQUxJWkVfRVZFTlRfUE9JTlRFUigpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgbm9ybWFsaXplIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGV2ZW50IGVudHJ5IHNvIGl0cyB2YWx1ZSBjYW4KKyAqIGJlIHVzZWQgYXMgYW4gaW5kZXguCisgKi8KKyNkZWZpbmUgTk9STUFMSVpFX0VWRU5UX1BPSU5URVIoeCkgXAorCShcCisJCSgoeCkgJiBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfUE9JTlRFUl9NQVNLKSBcCisJCT4+IFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9QT0lOVEVSX1NISUZUCVwKKwkpCisKKy8qKgorICogTk9STUFMSVpFX0dFVF9QT0lOVEVSKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gd2lsbCBub3JtYWxpemUgdGhlIGNvbXBsZXRpb24gcXVldWUgZ2V0IHBvaW50ZXIgc28gaXRzIHZhbHVlIGNhbgorICogYmUgdXNlZCBhcyBhbiBpbmRleCBpbnRvIGFuIGFycmF5CisgKi8KKyNkZWZpbmUgTk9STUFMSVpFX0dFVF9QT0lOVEVSKHgpIFwKKwkoKHgpICYgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1BPSU5URVJfTUFTSykKKworLyoqCisgKiBOT1JNQUxJWkVfR0VUX1BPSU5URVJfQ1lDTEVfQklUKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gd2lsbCBub3JtYWxpemUgdGhlIGNvbXBsZXRpb24gcXVldWUgY3ljbGUgcG9pbnRlciBzbyBpdCBtYXRjaGVzCisgKiB0aGUgY29tcGxldGlvbiBxdWV1ZSBjeWNsZSBiaXQKKyAqLworI2RlZmluZSBOT1JNQUxJWkVfR0VUX1BPSU5URVJfQ1lDTEVfQklUKHgpIFwKKwkoKFNNVV9DUUdSX0NZQ0xFX0JJVCAmICh4KSkgPDwgKDMxIC0gU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0NZQ0xFX0JJVF9TSElGVCkpCisKKy8qKgorICogQ09NUExFVElPTl9RVUVVRV9DWUNMRV9CSVQoKSAtCisgKgorICogVGhpcyBtYWNybyB3aWxsIHJldHVybiB0aGUgY3ljbGUgYml0IG9mIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5CisgKi8KKyNkZWZpbmUgQ09NUExFVElPTl9RVUVVRV9DWUNMRV9CSVQoeCkgKCh4KSAmIDB4ODAwMDAwMDApCisKKy8qIEluaXQgdGhlIHN0YXRlIG1hY2hpbmUgYW5kIGNhbGwgdGhlIHN0YXRlIGVudHJ5IGZ1bmN0aW9uIChpZiBhbnkpICovCit2b2lkIHNjaV9pbml0X3NtKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSwKKwkJIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSAqc3RhdGVfdGFibGUsIHUzMiBpbml0aWFsX3N0YXRlKQoreworCXNjaV9zdGF0ZV90cmFuc2l0aW9uX3QgaGFuZGxlcjsKKworCXNtLT5pbml0aWFsX3N0YXRlX2lkICAgID0gaW5pdGlhbF9zdGF0ZTsKKwlzbS0+cHJldmlvdXNfc3RhdGVfaWQgICA9IGluaXRpYWxfc3RhdGU7CisJc20tPmN1cnJlbnRfc3RhdGVfaWQgICAgPSBpbml0aWFsX3N0YXRlOworCXNtLT5zdGF0ZV90YWJsZSAgICAgICAgID0gc3RhdGVfdGFibGU7CisKKwloYW5kbGVyID0gc20tPnN0YXRlX3RhYmxlW2luaXRpYWxfc3RhdGVdLmVudGVyX3N0YXRlOworCWlmIChoYW5kbGVyKQorCQloYW5kbGVyKHNtKTsKK30KKworLyogQ2FsbCB0aGUgc3RhdGUgZXhpdCBmbiwgdXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlLCBjYWxsIHRoZSBzdGF0ZSBlbnRyeSBmbiAqLwordm9pZCBzY2lfY2hhbmdlX3N0YXRlKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSwgdTMyIG5leHRfc3RhdGUpCit7CisJc2NpX3N0YXRlX3RyYW5zaXRpb25fdCBoYW5kbGVyOworCisJaGFuZGxlciA9IHNtLT5zdGF0ZV90YWJsZVtzbS0+Y3VycmVudF9zdGF0ZV9pZF0uZXhpdF9zdGF0ZTsKKwlpZiAoaGFuZGxlcikKKwkJaGFuZGxlcihzbSk7CisKKwlzbS0+cHJldmlvdXNfc3RhdGVfaWQgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzbS0+Y3VycmVudF9zdGF0ZV9pZCA9IG5leHRfc3RhdGU7CisKKwloYW5kbGVyID0gc20tPnN0YXRlX3RhYmxlW3NtLT5jdXJyZW50X3N0YXRlX2lkXS5lbnRlcl9zdGF0ZTsKKwlpZiAoaGFuZGxlcikKKwkJaGFuZGxlcihzbSk7Cit9CisKK3N0YXRpYyBib29sIHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25fcXVldWVfaGFzX2VudHJpZXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGdldF92YWx1ZSA9IGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldDsKKwl1MzIgZ2V0X2luZGV4ID0gZ2V0X3ZhbHVlICYgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1BPSU5URVJfTUFTSzsKKworCWlmIChOT1JNQUxJWkVfR0VUX1BPSU5URVJfQ1lDTEVfQklUKGdldF92YWx1ZSkgPT0KKwkgICAgQ09NUExFVElPTl9RVUVVRV9DWUNMRV9CSVQoaWhvc3QtPmNvbXBsZXRpb25fcXVldWVbZ2V0X2luZGV4XSkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBzY2lfY29udHJvbGxlcl9pc3Ioc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJaWYgKHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25fcXVldWVfaGFzX2VudHJpZXMoaWhvc3QpKSB7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHdlIGhhdmUgYSBzcHVyaW91cyBpbnRlcnJ1cHQgaXQgY291bGQgYmUgdGhhdCB3ZSBoYXZlIGFscmVhZHkKKwkJICogZW1wdGllZCB0aGUgY29tcGxldGlvbiBxdWV1ZSBmcm9tIGEgcHJldmlvdXMgaW50ZXJydXB0ICovCisJCXdyaXRlbChTTVVfSVNSX0NPTVBMRVRJT04sICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X3N0YXR1cyk7CisKKwkJLyoKKwkJICogVGhlcmUgaXMgYSByYWNlIGluIHRoZSBoYXJkd2FyZSB0aGF0IGNvdWxkIGNhdXNlIHVzIG5vdCB0byBiZSBub3RpZmllZAorCQkgKiBvZiBhbiBpbnRlcnJ1cHQgY29tcGxldGlvbiBpZiB3ZSBkbyBub3QgdGFrZSB0aGlzIHN0ZXAuICBXZSB3aWxsIG1hc2sKKwkJICogdGhlbiB1bm1hc2sgdGhlIGludGVycnVwdHMgc28gaWYgdGhlcmUgaXMgYW5vdGhlciBpbnRlcnJ1cHQgcGVuZGluZworCQkgKiB0aGUgY2xlYXJpbmcgb2YgdGhlIGludGVycnVwdCBzb3VyY2Ugd2UgZ2V0IHRoZSBuZXh0IGludGVycnVwdCBtZXNzYWdlLiAqLworCQl3cml0ZWwoMHhGRjAwMDAwMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7CisJCXdyaXRlbCgwLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9tYXNrKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2lycXJldHVybl90IGlzY2lfbXNpeF9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRhdGE7CisKKwlpZiAoc2NpX2NvbnRyb2xsZXJfaXNyKGlob3N0KSkKKwkJdGFza2xldF9zY2hlZHVsZSgmaWhvc3QtPmNvbXBsZXRpb25fdGFza2xldCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBib29sIHNjaV9jb250cm9sbGVyX2Vycm9yX2lzcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW50ZXJydXB0X3N0YXR1czsKKworCWludGVycnVwdF9zdGF0dXMgPQorCQlyZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCWludGVycnVwdF9zdGF0dXMgJj0gKFNNVV9JU1JfUVVFVUVfRVJST1IgfCBTTVVfSVNSX1FVRVVFX1NVU1BFTkQpOworCisJaWYgKGludGVycnVwdF9zdGF0dXMgIT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBhbiBlcnJvciBpbnRlcnJ1cHQgcGVuZGluZyBzbyBsZXQgaXQgdGhyb3VnaCBhbmQgaGFuZGxlCisJCSAqIGluIHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIFRoZXJlIGlzIGEgcmFjZSBpbiB0aGUgaGFyZHdhcmUgdGhhdCBjb3VsZCBjYXVzZSB1cyBub3QgdG8gYmUgbm90aWZpZWQKKwkgKiBvZiBhbiBpbnRlcnJ1cHQgY29tcGxldGlvbiBpZiB3ZSBkbyBub3QgdGFrZSB0aGlzIHN0ZXAuICBXZSB3aWxsIG1hc2sKKwkgKiB0aGVuIHVubWFzayB0aGUgZXJyb3IgaW50ZXJydXB0cyBzbyBpZiB0aGVyZSB3YXMgYW5vdGhlciBpbnRlcnJ1cHQKKwkgKiBwZW5kaW5nIHdlIHdpbGwgYmUgbm90aWZpZWQuCisJICogQ291bGQgd2Ugd3JpdGUgdGhlIHZhbHVlIG9mIChTTVVfSVNSX1FVRVVFX0VSUk9SIHwgU01VX0lTUl9RVUVVRV9TVVNQRU5EKT8gKi8KKwl3cml0ZWwoMHhmZiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7CisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl90YXNrX2NvbXBsZXRpb24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUzMiBlbnQpCit7CisJdTMyIGluZGV4ID0gU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGVudCk7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGlob3N0LT5yZXFzW2luZGV4XTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIHJlYWxseSB3YW50IHRvIHByb2Nlc3MgdGhpcyBJTyByZXF1ZXN0ICovCisJaWYgKHRlc3RfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpICYmCisJICAgIGlyZXEtPmlvX3RhZyAhPSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRyAmJgorCSAgICBJU0NJX1RBR19TRVEoaXJlcS0+aW9fdGFnKSA9PSBpaG9zdC0+aW9fcmVxdWVzdF9zZXF1ZW5jZVtpbmRleF0pCisJCS8qIFllcCB0aGlzIGlzIGEgdmFsaWQgaW8gcmVxdWVzdCBwYXNzIGl0IGFsb25nIHRvIHRoZQorCQkgKiBpbyByZXF1ZXN0IGhhbmRsZXIKKwkJICovCisJCXNjaV9pb19yZXF1ZXN0X3RjX2NvbXBsZXRpb24oaXJlcSwgZW50KTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfc2RtYV9jb21wbGV0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZW50KQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisKKwlpbmRleCA9IFNDVV9HRVRfQ09NUExFVElPTl9JTkRFWChlbnQpOworCisJc3dpdGNoIChzY3VfZ2V0X2NvbW1hbmRfcmVxdWVzdF90eXBlKGVudCkpIHsKKwljYXNlIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEM6CisJY2FzZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1RDOgorCQlpcmVxID0gaWhvc3QtPnJlcXNbaW5kZXhdOworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiAleCBmb3IgaW8gcmVxdWVzdCAlcFxuIiwKKwkJCSBfX2Z1bmNfXywgZW50LCBpcmVxKTsKKwkJLyogQHRvZG8gRm9yIGEgcG9zdCBUQyBvcGVyYXRpb24gd2UgbmVlZCB0byBmYWlsIHRoZSBJTworCQkgKiByZXF1ZXN0CisJCSAqLworCQlicmVhazsKKwljYXNlIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX0RVTVBfUk5DOgorCWNhc2UgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DOgorCWNhc2UgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9STkM6CisJCWlkZXYgPSBpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XTsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogJXggZm9yIGRldmljZSAlcFxuIiwKKwkJCSBfX2Z1bmNfXywgZW50LCBpZGV2KTsKKwkJLyogQHRvZG8gRm9yIGEgcG9ydCBSTkMgb3BlcmF0aW9uIHdlIG5lZWQgdG8gZmFpbCB0aGUKKwkJICogZGV2aWNlCisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiB1bmtub3duIGNvbXBsZXRpb24gdHlwZSAleFxuIiwKKwkJCSBfX2Z1bmNfXywgZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl91bnNvbGljaXRlZF9mcmFtZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTMyIGVudCkKK3sKKwl1MzIgaW5kZXg7CisJdTMyIGZyYW1lX2luZGV4OworCisJc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgKmZyYW1lX2hlYWRlcjsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKworCWVudW0gc2NpX3N0YXR1cyByZXN1bHQgPSBTQ0lfRkFJTFVSRTsKKworCWZyYW1lX2luZGV4ID0gU0NVX0dFVF9GUkFNRV9JTkRFWChlbnQpOworCisJZnJhbWVfaGVhZGVyID0gaWhvc3QtPnVmX2NvbnRyb2wuYnVmZmVycy5hcnJheVtmcmFtZV9pbmRleF0uaGVhZGVyOworCWlob3N0LT51Zl9jb250cm9sLmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLnN0YXRlID0gVU5TT0xJQ0lURURfRlJBTUVfSU5fVVNFOworCisJaWYgKFNDVV9HRVRfRlJBTUVfRVJST1IoZW50KSkgeworCQkvKgorCQkgKiAvIEB0b2RvIElmIHRoZSBJQUYgZnJhbWUgb3IgU0lHTkFUVVJFIEZJUyBmcmFtZSBoYXMgYW4gZXJyb3Igd2lsbAorCQkgKiAvICAgICAgIHRoaXMgY2F1c2UgYSBwcm9ibGVtPyBXZSBleHBlY3QgdGhlIHBoeSBpbml0aWFsaXphdGlvbiB3aWxsCisJCSAqIC8gICAgICAgZmFpbCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZnJhbWUuICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFtZV9oZWFkZXItPmlzX2FkZHJlc3NfZnJhbWUpIHsKKwkJaW5kZXggPSBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWChlbnQpOworCQlpcGh5ID0gJmlob3N0LT5waHlzW2luZGV4XTsKKwkJcmVzdWx0ID0gc2NpX3BoeV9mcmFtZV9oYW5kbGVyKGlwaHksIGZyYW1lX2luZGV4KTsKKwl9IGVsc2UgeworCisJCWluZGV4ID0gU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGVudCk7CisKKwkJaWYgKGluZGV4ID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYSBzaWduYXR1cmUgZmlzIG9yIGEgZnJhbWUgZnJvbSBhIGRpcmVjdCBhdHRhY2hlZCBTQVRBCisJCQkgKiBkZXZpY2UgdGhhdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuICBJbiBlaXRoZXIgY2FzZSBmb3J3YXJlZAorCQkJICogdGhlIGZyYW1lIHRvIHRoZSBQRSBhbmQgbGV0IGl0IHRha2UgY2FyZSBvZiB0aGUgZnJhbWUgZGF0YS4gKi8KKwkJCWluZGV4ID0gU0NVX0dFVF9QUk9UT0NPTF9FTkdJTkVfSU5ERVgoZW50KTsKKwkJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCQkJcmVzdWx0ID0gc2NpX3BoeV9mcmFtZV9oYW5kbGVyKGlwaHksIGZyYW1lX2luZGV4KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbmRleCA8IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzKQorCQkJCWlkZXYgPSBpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XTsKKwkJCWVsc2UKKwkJCQlpZGV2ID0gTlVMTDsKKworCQkJaWYgKGlkZXYgIT0gTlVMTCkKKwkJCQlyZXN1bHQgPSBzY2lfcmVtb3RlX2RldmljZV9mcmFtZV9oYW5kbGVyKGlkZXYsIGZyYW1lX2luZGV4KTsKKwkJCWVsc2UKKwkJCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCX0KKwl9CisKKwlpZiAocmVzdWx0ICE9IFNDSV9TVUNDRVNTKSB7CisJCS8qCisJCSAqIC8gQHRvZG8gSXMgdGhlcmUgYW55IHJlYXNvbiB0byByZXBvcnQgc29tZSBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2UKKwkJICogLyAgICAgICB3aGVuIHdlIGdldCB0aGlzIGZhaWx1cmUgbm90aWZpY3Rpb24/ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9ldmVudF9jb21wbGV0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZW50KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJdTMyIGluZGV4OworCisJaW5kZXggPSBTQ1VfR0VUX0NPTVBMRVRJT05fSU5ERVgoZW50KTsKKworCXN3aXRjaCAoc2N1X2dldF9ldmVudF90eXBlKGVudCkpIHsKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1NNVV9DT01NQU5EX0VSUk9SOgorCQkvKiAvIEB0b2RvIFRoZSBkcml2ZXIgZGlkIHNvbWV0aGluZyB3cm9uZyBhbmQgd2UgbmVlZCB0byBmaXggdGhlIGNvbmR0aW9uLiAqLworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgMHglcCByZWNlaXZlZCBTTVUgY29tbWFuZCBlcnJvciAiCisJCQkiMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaWhvc3QsCisJCQllbnQpOworCQlicmVhazsKKworCWNhc2UgU0NVX0VWRU5UX1RZUEVfU01VX1BDUV9FUlJPUjoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1NNVV9FUlJPUjoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX0ZBVEFMX01FTU9SWV9FUlJPUjoKKwkJLyoKKwkJICogLyBAdG9kbyBUaGlzIGlzIGEgaGFyZHdhcmUgZmFpbHVyZSBhbmQgaXRzIGxpa2VseSB0aGF0IHdlIHdhbnQgdG8KKwkJICogLyAgICAgICByZXNldCB0aGUgY29udHJvbGxlci4gKi8KKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBDb250cm9sbGVyIDB4JXAgcmVjZWl2ZWQgZmF0YWwgY29udHJvbGxlciAiCisJCQkiZXZlbnQgIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlob3N0LAorCQkJZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1RSQU5TUE9SVF9FUlJPUjoKKwkJaXJlcSA9IGlob3N0LT5yZXFzW2luZGV4XTsKKwkJc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihpcmVxLCBlbnQpOworCQlicmVhazsKKworCWNhc2UgU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5UOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGVudCkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfU01QX1JFU1BPTlNFX05PX1BFOgorCQljYXNlIFNDVV9FVkVOVF9TUEVDSUZJQ19UQVNLX1RJTUVPVVQ6CisJCQlpcmVxID0gaWhvc3QtPnJlcXNbaW5kZXhdOworCQkJaWYgKGlyZXEgIT0gTlVMTCkKKwkJCQlzY2lfaW9fcmVxdWVzdF9ldmVudF9oYW5kbGVyKGlyZXEsIGVudCk7CisJCQllbHNlCisJCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciAweCVwIHJlY2VpdmVkICIKKwkJCQkJICJldmVudCAweCV4IGZvciBpbyByZXF1ZXN0IG9iamVjdCAiCisJCQkJCSAidGhhdCBkb2VzbnQgZXhpc3QuXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBpaG9zdCwKKwkJCQkJIGVudCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NVX0VWRU5UX1NQRUNJRklDX0lUX05FWFVTX1RJTUVPVVQ6CisJCQlpZGV2ID0gaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF07CisJCQlpZiAoaWRldiAhPSBOVUxMKQorCQkJCXNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoaWRldiwgZW50KTsKKwkJCWVsc2UKKwkJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJICIlczogU0NJQyBDb250cm9sbGVyIDB4JXAgcmVjZWl2ZWQgIgorCQkJCQkgImV2ZW50IDB4JXggZm9yIHJlbW90ZSBkZXZpY2Ugb2JqZWN0ICIKKwkJCQkJICJ0aGF0IGRvZXNudCBleGlzdC5cbiIsCisJCQkJCSBfX2Z1bmNfXywKKwkJCQkJIGlob3N0LAorCQkJCQkgZW50KTsKKworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0U6CisJLyoKKwkgKiBkaXJlY3QgdGhlIGJyb2FkY2FzdCBjaGFuZ2UgZXZlbnQgdG8gdGhlIHBoeSBmaXJzdCBhbmQgdGhlbiBsZXQKKwkgKiB0aGUgcGh5IHJlZGlyZWN0IHRoZSBicm9hZGNhc3QgY2hhbmdlIHRvIHRoZSBwb3J0IG9iamVjdCAqLworCWNhc2UgU0NVX0VWRU5UX1RZUEVfRVJSX0NOVF9FVkVOVDoKKwkvKgorCSAqIGRpcmVjdCBlcnJvciBjb3VudGVyIGV2ZW50IHRvIHRoZSBwaHkgb2JqZWN0IHNpbmNlIHRoYXQgaXMgd2hlcmUKKwkgKiB3ZSBnZXQgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbi4gIFRoaXMgaXMgYSB0eXBlIDQgZXZlbnQuICovCisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5UOgorCQlpbmRleCA9IFNDVV9HRVRfUFJPVE9DT0xfRU5HSU5FX0lOREVYKGVudCk7CisJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCQlzY2lfcGh5X2V2ZW50X2hhbmRsZXIoaXBoeSwgZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYOgorCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlg6CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0M6CisJCWlmIChpbmRleCA8IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzKSB7CisJCQlpZGV2ID0gaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF07CisKKwkJCWlmIChpZGV2ICE9IE5VTEwpCisJCQkJc2NpX3JlbW90ZV9kZXZpY2VfZXZlbnRfaGFuZGxlcihpZGV2LCBlbnQpOworCQl9IGVsc2UKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgMHglcCByZWNlaXZlZCBldmVudCAweCV4ICIKKwkJCQkiZm9yIHJlbW90ZSBkZXZpY2Ugb2JqZWN0IDB4JTB4IHRoYXQgZG9lc250ICIKKwkJCQkiZXhpc3QuXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWlob3N0LAorCQkJCWVudCwKKwkJCQlpbmRleCk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciByZWNlaXZlZCB1bmtub3duIGV2ZW50IGNvZGUgJXhcbiIsCisJCQkgX19mdW5jX18sCisJCQkgZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9wcm9jZXNzX2NvbXBsZXRpb25zKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBjb21wbGV0aW9uX2NvdW50ID0gMDsKKwl1MzIgZW50OworCXUzMiBnZXRfaW5kZXg7CisJdTMyIGdldF9jeWNsZTsKKwl1MzIgZXZlbnRfZ2V0OworCXUzMiBldmVudF9jeWNsZTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogY29tcGxldGlvbiBxdWV1ZSBiZWdpbmluZyBnZXQ6MHglMDh4XG4iLAorCQlfX2Z1bmNfXywKKwkJaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKworCS8qIEdldCB0aGUgY29tcG9uZW50IHBhcnRzIG9mIHRoZSBjb21wbGV0aW9uIHF1ZXVlICovCisJZ2V0X2luZGV4ID0gTk9STUFMSVpFX0dFVF9QT0lOVEVSKGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisJZ2V0X2N5Y2xlID0gU01VX0NRR1JfQ1lDTEVfQklUICYgaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0OworCisJZXZlbnRfZ2V0ID0gTk9STUFMSVpFX0VWRU5UX1BPSU5URVIoaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKwlldmVudF9jeWNsZSA9IFNNVV9DUUdSX0VWRU5UX0NZQ0xFX0JJVCAmIGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldDsKKworCXdoaWxlICgKKwkJTk9STUFMSVpFX0dFVF9QT0lOVEVSX0NZQ0xFX0JJVChnZXRfY3ljbGUpCisJCT09IENPTVBMRVRJT05fUVVFVUVfQ1lDTEVfQklUKGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlW2dldF9pbmRleF0pCisJCSkgeworCQljb21wbGV0aW9uX2NvdW50Kys7CisKKwkJZW50ID0gaWhvc3QtPmNvbXBsZXRpb25fcXVldWVbZ2V0X2luZGV4XTsKKworCQkvKiBpbmNyZW1lbnQgdGhlIGdldCBwb2ludGVyIGFuZCBjaGVjayBmb3Igcm9sbG92ZXIgdG8gdG9nZ2xlIHRoZSBjeWNsZSBiaXQgKi8KKwkJZ2V0X2N5Y2xlIF49ICgoZ2V0X2luZGV4KzEpICYgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMpIDw8CisJCQkgICAgIChTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfQ1lDTEVfQklUX1NISUZUIC0gU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX1NISUZUKTsKKwkJZ2V0X2luZGV4ID0gKGdldF9pbmRleCsxKSAmIChTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUy0xKTsKKworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5OjB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLAorCQkJZW50KTsKKworCQlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UWVBFKGVudCkpIHsKKwkJY2FzZSBTQ1VfQ09NUExFVElPTl9UWVBFX1RBU0s6CisJCQlzY2lfY29udHJvbGxlcl90YXNrX2NvbXBsZXRpb24oaWhvc3QsIGVudCk7CisJCQlicmVhazsKKworCQljYXNlIFNDVV9DT01QTEVUSU9OX1RZUEVfU0RNQToKKwkJCXNjaV9jb250cm9sbGVyX3NkbWFfY29tcGxldGlvbihpaG9zdCwgZW50KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NVX0NPTVBMRVRJT05fVFlQRV9VRkk6CisJCQlzY2lfY29udHJvbGxlcl91bnNvbGljaXRlZF9mcmFtZShpaG9zdCwgZW50KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NVX0NPTVBMRVRJT05fVFlQRV9FVkVOVDoKKwkJY2FzZSBTQ1VfQ09NUExFVElPTl9UWVBFX05PVElGWTogeworCQkJZXZlbnRfY3ljbGUgXj0gKChldmVudF9nZXQrMSkgJiBTQ1VfTUFYX0VWRU5UUykgPDwKKwkJCQkgICAgICAgKFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9DWUNMRV9CSVRfU0hJRlQgLSBTQ1VfTUFYX0VWRU5UU19TSElGVCk7CisJCQlldmVudF9nZXQgPSAoZXZlbnRfZ2V0KzEpICYgKFNDVV9NQVhfRVZFTlRTLTEpOworCisJCQlzY2lfY29udHJvbGxlcl9ldmVudF9jb21wbGV0aW9uKGlob3N0LCBlbnQpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciByZWNlaXZlZCB1bmtub3duICIKKwkJCQkgImNvbXBsZXRpb24gdHlwZSAleFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIGVudCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSB0aGUgZ2V0IHJlZ2lzdGVyIGlmIHdlIGNvbXBsZXRlZCBvbmUgb3IgbW9yZSBlbnRyaWVzICovCisJaWYgKGNvbXBsZXRpb25fY291bnQgPiAwKSB7CisJCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCA9CisJCQlTTVVfQ1FHUl9HRU5fQklUKEVOQUJMRSkgfAorCQkJU01VX0NRR1JfR0VOX0JJVChFVkVOVF9FTkFCTEUpIHwKKwkJCWV2ZW50X2N5Y2xlIHwKKwkJCVNNVV9DUUdSX0dFTl9WQUwoRVZFTlRfUE9JTlRFUiwgZXZlbnRfZ2V0KSB8CisJCQlnZXRfY3ljbGUgfAorCQkJU01VX0NRR1JfR0VOX1ZBTChQT0lOVEVSLCBnZXRfaW5kZXgpOworCisJCXdyaXRlbChpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQsCisJCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKworCX0KKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogY29tcGxldGlvbiBxdWV1ZSBlbmRpbmcgZ2V0OjB4JTA4eFxuIiwKKwkJX19mdW5jX18sCisJCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW50ZXJydXB0X3N0YXR1czsKKworCWludGVycnVwdF9zdGF0dXMgPQorCQlyZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCisJaWYgKChpbnRlcnJ1cHRfc3RhdHVzICYgU01VX0lTUl9RVUVVRV9TVVNQRU5EKSAmJgorCSAgICBzY2lfY29udHJvbGxlcl9jb21wbGV0aW9uX3F1ZXVlX2hhc19lbnRyaWVzKGlob3N0KSkgeworCisJCXNjaV9jb250cm9sbGVyX3Byb2Nlc3NfY29tcGxldGlvbnMoaWhvc3QpOworCQl3cml0ZWwoU01VX0lTUl9RVUVVRV9TVVNQRU5ELCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsICIlczogc3RhdHVzOiAlI3hcbiIsIF9fZnVuY19fLAorCQkJaW50ZXJydXB0X3N0YXR1cyk7CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaWhvc3QtPnNtLCBTQ0lDX0ZBSUxFRCk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIElmIHdlIGRvbnQgcHJvY2VzcyBhbnkgY29tcGxldGlvbnMgSSBhbSBub3Qgc3VyZSB0aGF0IHdlIHdhbnQgdG8gZG8gdGhpcy4KKwkgKiBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGhhcmR3YXJlIGZhdWx0IGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVzZXQuCisJICovCisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworfQorCitpcnFyZXR1cm5fdCBpc2NpX2ludHhfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpCit7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBkYXRhOworCisJaWYgKHNjaV9jb250cm9sbGVyX2lzcihpaG9zdCkpIHsKKwkJd3JpdGVsKFNNVV9JU1JfQ09NUExFVElPTiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmaWhvc3QtPmNvbXBsZXRpb25fdGFza2xldCk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoc2NpX2NvbnRyb2xsZXJfZXJyb3JfaXNyKGlob3N0KSkgeworCQlzcGluX2xvY2soJmlob3N0LT5zY2ljX2xvY2spOworCQlzY2lfY29udHJvbGxlcl9lcnJvcl9oYW5kbGVyKGlob3N0KTsKKwkJc3Bpbl91bmxvY2soJmlob3N0LT5zY2ljX2xvY2spOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpcnFyZXR1cm5fdCBpc2NpX2Vycm9yX2lzcihpbnQgdmVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGF0YTsKKworCWlmIChzY2lfY29udHJvbGxlcl9lcnJvcl9pc3IoaWhvc3QpKQorCQlzY2lfY29udHJvbGxlcl9lcnJvcl9oYW5kbGVyKGlob3N0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBpc2NpX2hvc3Rfc3RhcnRfY29tcGxldGUoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBjb3JlIGxpYnJhcnksCisgKiAgICB0aHJvdWdoIHRoZSBJU0NJIE1vZHVsZSwgdG8gaW5kaWNhdGUgY29udHJvbGxlciBzdGFydCBzdGF0dXMuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIElTQ0kgaG9zdCBvYmplY3QKKyAqIEBjb21wbGV0aW9uX3N0YXR1czogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBmcm9tIHRoZQorICogICAgY29yZSBsaWJyYXJ5LgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9ob3N0X3N0YXJ0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBlbnVtIHNjaV9zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJaWYgKGNvbXBsZXRpb25fc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlkZXZfaW5mbygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSJjb250cm9sbGVyIHN0YXJ0IHRpbWVkIG91dCwgY29udGludWluZy4uLlxuIik7CisJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9yZWFkeSk7CisJY2xlYXJfYml0KElIT1NUX1NUQVJUX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpOworCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOworfQorCitpbnQgaXNjaV9ob3N0X3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCktPmxsZGRfaGE7CisKKwlpZiAodGVzdF9iaXQoSUhPU1RfU1RBUlRfUEVORElORywgJmlob3N0LT5mbGFncykpCisJCXJldHVybiAwOworCisJLyogdG9kbzogdXNlIHNhc19mbHVzaF9kaXNjb3Zlcnkgb25jZSBpdCBpcyB1cHN0cmVhbSAqLworCXNjc2lfZmx1c2hfd29yayhzaG9zdCk7CisKKwlzY3NpX2ZsdXNoX3dvcmsoc2hvc3QpOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpaG9zdC0+c3RhdHVzID0gJWQsIHRpbWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgaXNjaV9ob3N0X2dldF9zdGF0ZShpaG9zdCksIHRpbWUpOworCisJcmV0dXJuIDE7CisKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9nZXRfc3VnZ2VzdGVkX3N0YXJ0X3RpbWVvdXQoKSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlCisgKiAgICBzdWdnZXN0ZWQgc2NpX2NvbnRyb2xsZXJfc3RhcnQoKSB0aW1lb3V0IGFtb3VudC4gIFRoZSB1c2VyIGlzIGZyZWUgdG8KKyAqICAgIHVzZSBhbnkgdGltZW91dCB2YWx1ZSwgYnV0IHRoaXMgbWV0aG9kIHByb3ZpZGVzIHRoZSBzdWdnZXN0ZWQgbWluaW11bQorICogICAgc3RhcnQgdGltZW91dCB2YWx1ZS4gIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBiYXNlZCB1cG9uIGVtcGlyaWNhbAorICogICAgaW5mb3JtYXRpb24gZGV0ZXJtaW5lZCBhcyBhIHJlc3VsdCBvZiBpbnRlcm9wZXJhYmlsaXR5IHRlc3RpbmcuCisgKiBAY29udHJvbGxlcjogdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUKKyAqICAgIHN1Z2dlc3RlZCBzdGFydCB0aW1lb3V0LgorICoKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIHRoZSBzdWdnZXN0ZWQgc3RhcnQKKyAqIG9wZXJhdGlvbiB0aW1lb3V0LgorICovCitzdGF0aWMgdTMyIHNjaV9jb250cm9sbGVyX2dldF9zdWdnZXN0ZWRfc3RhcnRfdGltZW91dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiBWYWxpZGF0ZSB0aGUgdXNlciBzdXBwbGllZCBwYXJhbWV0ZXJzLiAqLworCWlmICghaWhvc3QpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUaGUgc3VnZ2VzdGVkIG1pbmltdW0gdGltZW91dCB2YWx1ZSBmb3IgYSBjb250cm9sbGVyIHN0YXJ0IG9wZXJhdGlvbjoKKwkgKgorCSAqICAgICBTaWduYXR1cmUgRklTIFRpbWVvdXQKKwkgKiAgICsgUGh5IFN0YXJ0IFRpbWVvdXQKKwkgKiAgICsgTnVtYmVyIG9mIFBoeSBTcGluIFVwIEludGVydmFscworCSAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogICBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciB0aGUgY29udHJvbGxlciBzdGFydCBvcGVyYXRpb24uCisJICoKKwkgKiBOT1RFOiBUaGUgbnVtYmVyIG9mIHBoeSBzcGluIHVwIGludGVydmFscyB3aWxsIGJlIGVxdWl2YWxlbnQKKwkgKiAgICAgICB0byB0aGUgbnVtYmVyIG9mIHBoeXMgZGl2aWRlZCBieSB0aGUgbnVtYmVyIHBoeXMgYWxsb3dlZAorCSAqICAgICAgIHBlciBpbnRlcnZhbCAtIDEgKG9uY2UgT0VNIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCkuCisJICogICAgICAgQ3VycmVudGx5IHdlIGFzc3VtZSBvbmx5IDEgcGh5IHBlciBpbnRlcnZhbC4gKi8KKworCXJldHVybiBTQ0lDX1NEU19TSUdOQVRVUkVfRklTX1RJTUVPVVQKKwkJKyBTQ0lDX1NEU19DT05UUk9MTEVSX1BIWV9TVEFSVF9USU1FT1VUCisJCSsgKChTQ0lfTUFYX1BIWVMgLSAxKSAqIFNDSUNfU0RTX0NPTlRST0xMRVJfUE9XRVJfQ09OVFJPTF9JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCUJVR19PTihpaG9zdC0+c211X3JlZ2lzdGVycyA9PSBOVUxMKTsKKwl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCUJVR19PTihpaG9zdC0+c211X3JlZ2lzdGVycyA9PSBOVUxMKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2VuYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBwb3J0X3Rhc2tfc2NoZWR1bGVyX3ZhbHVlOworCisJcG9ydF90YXNrX3NjaGVkdWxlcl92YWx1ZSA9CisJCXJlYWRsKCZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5wdHNnLmNvbnRyb2wpOworCXBvcnRfdGFza19zY2hlZHVsZXJfdmFsdWUgfD0KKwkJKFNDVV9QVFNHQ1JfR0VOX0JJVChFVE1fRU5BQkxFKSB8CisJCSBTQ1VfUFRTR0NSX0dFTl9CSVQoUFRTR19FTkFCTEUpKTsKKwl3cml0ZWwocG9ydF90YXNrX3NjaGVkdWxlcl92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnB0c2cuY29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2Fzc2lnbl90YXNrX2VudHJpZXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIHRhc2tfYXNzaWdubWVudDsKKworCS8qCisJICogQXNzaWduIGFsbCB0aGUgVENzIHRvIGZ1bmN0aW9uIDAKKwkgKiBUT0RPOiBEbyB3ZSBhY3R1YWxseSBuZWVkIHRvIHJlYWQgdGhpcyByZWdpc3RlciB0byB3cml0ZSBpdCBiYWNrPworCSAqLworCisJdGFza19hc3NpZ25tZW50ID0KKwkJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT50YXNrX2NvbnRleHRfYXNzaWdubWVudFswXSk7CisKKwl0YXNrX2Fzc2lnbm1lbnQgfD0gKFNNVV9UQ0FfR0VOX1ZBTChTVEFSVElORywgMCkpIHwKKwkJKFNNVV9UQ0FfR0VOX1ZBTChFTkRJTkcsICBpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXMgLSAxKSkgfAorCQkoU01VX1RDQV9HRU5fQklUKFJBTkdFX0NIRUNLX0VOQUJMRSkpOworCisJd3JpdGVsKHRhc2tfYXNzaWdubWVudCwKKwkJJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT50YXNrX2NvbnRleHRfYXNzaWdubWVudFswXSk7CisKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfaW5pdGlhbGl6ZV9jb21wbGV0aW9uX3F1ZXVlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBpbmRleDsKKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9jb250cm9sX3ZhbHVlOworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2dldF92YWx1ZTsKKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9wdXRfdmFsdWU7CisKKwlpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQgPSAwOworCisJY29tcGxldGlvbl9xdWV1ZV9jb250cm9sX3ZhbHVlID0KKwkJKFNNVV9DUUNfUVVFVUVfTElNSVRfU0VUKFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTIC0gMSkgfAorCQkgU01VX0NRQ19FVkVOVF9MSU1JVF9TRVQoU0NVX01BWF9FVkVOVFMgLSAxKSk7CisKKwl3cml0ZWwoY29tcGxldGlvbl9xdWV1ZV9jb250cm9sX3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfY29udHJvbCk7CisKKworCS8qIFNldCB0aGUgY29tcGxldGlvbiBxdWV1ZSBnZXQgcG9pbnRlciBhbmQgZW5hYmxlIHRoZSBxdWV1ZSAqLworCWNvbXBsZXRpb25fcXVldWVfZ2V0X3ZhbHVlID0gKAorCQkoU01VX0NRR1JfR0VOX1ZBTChQT0lOVEVSLCAwKSkKKwkJfCAoU01VX0NRR1JfR0VOX1ZBTChFVkVOVF9QT0lOVEVSLCAwKSkKKwkJfCAoU01VX0NRR1JfR0VOX0JJVChFTkFCTEUpKQorCQl8IChTTVVfQ1FHUl9HRU5fQklUKEVWRU5UX0VOQUJMRSkpCisJCSk7CisKKwl3cml0ZWwoY29tcGxldGlvbl9xdWV1ZV9nZXRfdmFsdWUsCisJICAgICAgICZpaG9zdC0+c211X3JlZ2lzdGVycy0+Y29tcGxldGlvbl9xdWV1ZV9nZXQpOworCisJLyogU2V0IHRoZSBjb21wbGV0aW9uIHF1ZXVlIHB1dCBwb2ludGVyICovCisJY29tcGxldGlvbl9xdWV1ZV9wdXRfdmFsdWUgPSAoCisJCShTTVVfQ1FQUl9HRU5fVkFMKFBPSU5URVIsIDApKQorCQl8IChTTVVfQ1FQUl9HRU5fVkFMKEVWRU5UX1BPSU5URVIsIDApKQorCQkpOworCisJd3JpdGVsKGNvbXBsZXRpb25fcXVldWVfcHV0X3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfcHV0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIGN5Y2xlIGJpdCBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVM7IGluZGV4KyspIHsKKwkJLyoKKwkJICogSWYgZ2V0LmN5Y2xlX2JpdCAhPSBjb21wbGV0aW9uX3F1ZXVlLmN5Y2xlX2JpdAorCQkgKiBpdHMgbm90IGEgdmFsaWQgY29tcGxldGlvbiBxdWV1ZSBlbnRyeQorCQkgKiBzbyBhdCBzeXN0ZW0gc3RhcnQgYWxsIGVudHJpZXMgYXJlIGludmFsaWQgKi8KKwkJaWhvc3QtPmNvbXBsZXRpb25fcXVldWVbaW5kZXhdID0gMHg4MDAwMDAwMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfdW5zb2xpY2l0ZWRfZnJhbWVfcXVldWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGZyYW1lX3F1ZXVlX2NvbnRyb2xfdmFsdWU7CisJdTMyIGZyYW1lX3F1ZXVlX2dldF92YWx1ZTsKKwl1MzIgZnJhbWVfcXVldWVfcHV0X3ZhbHVlOworCisJLyogV3JpdGUgdGhlIHF1ZXVlIHNpemUgKi8KKwlmcmFtZV9xdWV1ZV9jb250cm9sX3ZhbHVlID0KKwkJU0NVX1VGUUNfR0VOX1ZBTChRVUVVRV9TSVpFLCBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyk7CisKKwl3cml0ZWwoZnJhbWVfcXVldWVfY29udHJvbF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX3F1ZXVlX2NvbnRyb2wpOworCisJLyogU2V0dXAgdGhlIGdldCBwb2ludGVyIGZvciB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgcXVldWUgKi8KKwlmcmFtZV9xdWV1ZV9nZXRfdmFsdWUgPSAoCisJCVNDVV9VRlFHUF9HRU5fVkFMKFBPSU5URVIsIDApCisJCXwgIFNDVV9VRlFHUF9HRU5fQklUKEVOQUJMRV9CSVQpCisJCSk7CisKKwl3cml0ZWwoZnJhbWVfcXVldWVfZ2V0X3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudW5zb2xpY2l0ZWRfZnJhbWVfZ2V0X3BvaW50ZXIpOworCS8qIFNldHVwIHRoZSBwdXQgcG9pbnRlciBmb3IgdGhlIHVuc29saWNpdGVkIGZyYW1lIHF1ZXVlICovCisJZnJhbWVfcXVldWVfcHV0X3ZhbHVlID0gU0NVX1VGUVBQX0dFTl9WQUwoUE9JTlRFUiwgMCk7CisJd3JpdGVsKGZyYW1lX3F1ZXVlX3B1dF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX3B1dF9wb2ludGVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgZW51bSBzY2lfc3RhdHVzIHN0YXR1cykKK3sKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgPT0gU0NJQ19TVEFSVElORykgeworCQkvKgorCQkgKiBXZSBtb3ZlIGludG8gdGhlIHJlYWR5IHN0YXRlLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHBoeXMvcG9ydHMKKwkJICogbWF5IGJlIHVwIGFuZCBvcGVyYXRpb25hbC4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19SRUFEWSk7CisKKwkJaXNjaV9ob3N0X3N0YXJ0X2NvbXBsZXRlKGlob3N0LCBzdGF0dXMpOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfcGh5X3N0YXJ0aW5nKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9waHlfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QSFlfU1RBUlRJTkc6CisJY2FzZSBTQ0lfUEhZX1NVQl9JTklUSUFMOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1NQRUVEX0VOOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1BPV0VSOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUY6CisJY2FzZSBTQ0lfUEhZX1NVQl9GSU5BTDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeSAtIHN0YXJ0IHBoeQorICogQHNjaWM6IGNvbnRyb2xsZXIKKyAqCisgKiBJZiBhbGwgdGhlIHBoeXMgaGF2ZSBiZWVuIHN0YXJ0ZWQsIHRoZW4gYXR0ZW1wdCB0byB0cmFuc2l0aW9uIHRoZQorICogY29udHJvbGxlciB0byB0aGUgUkVBRFkgc3RhdGUgYW5kIGluZm9ybSB0aGUgdXNlcgorICogKHNjaV9jYl9jb250cm9sbGVyX3N0YXJ0X2NvbXBsZXRlKCkpLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtID0gJmlob3N0LT5vZW1fcGFyYW1ldGVyczsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJaWYgKGlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKGlob3N0LT5uZXh0X3BoeV90b19zdGFydCA+PSBTQ0lfTUFYX1BIWVMpIHsKKwkJYm9vbCBpc19jb250cm9sbGVyX3N0YXJ0X2NvbXBsZXRlID0gdHJ1ZTsKKwkJdTMyIHN0YXRlOworCQl1OCBpbmRleDsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCQkJc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJCQlpZiAoIXBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRoZSBjb250cm9sbGVyIHN0YXJ0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZSBpZmY6CisJCQkgKiAtIGFsbCBsaW5rcyBoYXZlIGJlZW4gZ2l2ZW4gYW4gb3Bwb3J0dW5pdHkgdG8gc3RhcnQKKwkJCSAqIC0gaGF2ZSBubyBpbmRpY2F0aW9uIG9mIGEgY29ubmVjdGVkIGRldmljZQorCQkJICogLSBoYXZlIGFuIGluZGljYXRpb24gb2YgYSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBpdCBoYXMKKwkJCSAqICAgZmluaXNoZWQgdGhlIGxpbmsgdHJhaW5pbmcgcHJvY2Vzcy4KKwkJCSAqLworCQkJaWYgKChpcGh5LT5pc19pbl9saW5rX3RyYWluaW5nID09IGZhbHNlICYmIHN0YXRlID09IFNDSV9QSFlfSU5JVElBTCkgfHwKKwkJCSAgICAoaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9PSBmYWxzZSAmJiBzdGF0ZSA9PSBTQ0lfUEhZX1NUT1BQRUQpIHx8CisJCQkgICAgKGlwaHktPmlzX2luX2xpbmtfdHJhaW5pbmcgPT0gdHJ1ZSAmJiBpc19waHlfc3RhcnRpbmcoaXBoeSkpKSB7CisJCQkJaXNfY29udHJvbGxlcl9zdGFydF9jb21wbGV0ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVGhlIGNvbnRyb2xsZXIgaGFzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCB0aGUgc3RhcnQgcHJvY2Vzcy4KKwkJICogSW5mb3JtIHRoZSBTQ0kgQ29yZSB1c2VyIGFuZCB0cmFuc2l0aW9uIHRvIHRoZSBSRUFEWSBzdGF0ZS4gKi8KKwkJaWYgKGlzX2NvbnRyb2xsZXJfc3RhcnRfY29tcGxldGUgPT0gdHJ1ZSkgeworCQkJc2NpX2NvbnRyb2xsZXJfdHJhbnNpdGlvbl90b19yZWFkeShpaG9zdCwgU0NJX1NVQ0NFU1MpOworCQkJc2NpX2RlbF90aW1lcigmaWhvc3QtPnBoeV90aW1lcik7CisJCQlpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJaXBoeSA9ICZpaG9zdC0+cGh5c1tpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnRdOworCisJCWlmIChvZW0tPmNvbnRyb2xsZXIubW9kZV90eXBlID09IFNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCQlpZiAocGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSA9PSBOVUxMKSB7CisJCQkJaWhvc3QtPm5leHRfcGh5X3RvX3N0YXJ0Kys7CisKKwkJCQkvKiBDYXV0aW9uIHJlY3Vyc2lvbiBhaGVhZCBiZSBmb3J3YXJuZWQKKwkJCQkgKgorCQkJCSAqIFRoZSBQSFkgd2FzIG5ldmVyIGFkZGVkIHRvIGEgUE9SVCBpbiBNUEMgbW9kZQorCQkJCSAqIHNvIHN0YXJ0IHRoZSBuZXh0IHBoeSBpbiBzZXF1ZW5jZSBUaGlzIHBoeQorCQkJCSAqIHdpbGwgbmV2ZXIgZ28gbGluayB1cCBhbmQgd2lsbCBub3QgZHJhdyBwb3dlcgorCQkJCSAqIHRoZSBPRU0gcGFyYW1ldGVycyBlaXRoZXIgY29uZmlndXJlZCB0aGUgcGh5CisJCQkJICogaW5jb3JyZWN0bHkgZm9yIHRoZSBQT1JUIG9yIGl0IHdhcyBuZXZlcgorCQkJCSAqIGFzc2lnbmVkIHRvIGEgUE9SVAorCQkJCSAqLworCQkJCXJldHVybiBzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeShpaG9zdCk7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBzY2lfcGh5X3N0YXJ0KGlwaHkpOworCisJCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJCXNjaV9tb2RfdGltZXIoJmlob3N0LT5waHlfdGltZXIsCisJCQkJICAgICAgU0NJQ19TRFNfQ09OVFJPTExFUl9QSFlfU1RBUlRfVElNRU9VVCk7CisJCQlpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZyA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCAiCisJCQkJICJ0byBzdG9wIHBoeSAlZCBiZWNhdXNlIG9mIHN0YXR1cyAiCisJCQkJICIlZC5cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBpaG9zdC0+cGh5c1tpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnRdLnBoeV9pbmRleCwKKwkJCQkgc3RhdHVzKTsKKwkJfQorCisJCWlob3N0LT5uZXh0X3BoeV90b19zdGFydCsrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHBoeV9zdGFydHVwX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZih0bXIsIHR5cGVvZigqaWhvc3QpLCBwaHlfdGltZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCWlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwlkbyB7CisJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KGlob3N0KTsKKwl9IHdoaWxlIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpOworCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUxNiBpc2NpX3RjaV9hY3RpdmUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJcmV0dXJuIENJUkNfQ05UKGlob3N0LT50Y2lfaGVhZCwgaWhvc3QtPnRjaV90YWlsLCBTQ0lfTUFYX0lPX1JFUVVFU1RTKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdGFydChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICB1MzIgdGltZW91dCkKK3sKKwllbnVtIHNjaV9zdGF0dXMgcmVzdWx0OworCXUxNiBpbmRleDsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX0lOSVRJQUxJWkVEKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICJTQ0lDIENvbnRyb2xsZXIgc3RhcnQgb3BlcmF0aW9uIHJlcXVlc3RlZCBpbiAiCisJCQkgImludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwkvKiBCdWlsZCB0aGUgVENpIGZyZWUgcG9vbCAqLworCUJVSUxEX0JVR19PTihTQ0lfTUFYX0lPX1JFUVVFU1RTID4gMSA8PCBzaXplb2YoaWhvc3QtPnRjaV9wb29sWzBdKSAqIDgpOworCWlob3N0LT50Y2lfaGVhZCA9IDA7CisJaWhvc3QtPnRjaV90YWlsID0gMDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXM7IGluZGV4KyspCisJCWlzY2lfdGNpX2ZyZWUoaWhvc3QsIGluZGV4KTsKKworCS8qIEJ1aWxkIHRoZSBSTmkgZnJlZSBwb29sICovCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2luaXRpYWxpemUoJmlob3N0LT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLAorCQkJCQkgaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXMpOworCisJLyoKKwkgKiBCZWZvcmUgYW55dGhpbmcgZWxzZSBsZXRzIG1ha2Ugc3VyZSB3ZSB3aWxsIG5vdCBiZQorCSAqIGludGVycnVwdGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCisJLyogRW5hYmxlIHRoZSBwb3J0IHRhc2sgc2NoZWR1bGVyICovCisJc2NpX2NvbnRyb2xsZXJfZW5hYmxlX3BvcnRfdGFza19zY2hlZHVsZXIoaWhvc3QpOworCisJLyogQXNzaWduIGFsbCB0aGUgdGFzayBlbnRyaWVzIHRvIGlob3N0IHBoeXNpY2FsIGZ1bmN0aW9uICovCisJc2NpX2NvbnRyb2xsZXJfYXNzaWduX3Rhc2tfZW50cmllcyhpaG9zdCk7CisKKwkvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgY29tcGxldGlvbiBxdWV1ZSAqLworCXNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfY29tcGxldGlvbl9xdWV1ZShpaG9zdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBxdWV1ZSBmb3IgdXNlICovCisJc2NpX2NvbnRyb2xsZXJfaW5pdGlhbGl6ZV91bnNvbGljaXRlZF9mcmFtZV9xdWV1ZShpaG9zdCk7CisKKwkvKiBTdGFydCBhbGwgb2YgdGhlIHBvcnRzIG9uIHRoaXMgY29udHJvbGxlciAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaW5kZXhdOworCisJCXJlc3VsdCA9IHNjaV9wb3J0X3N0YXJ0KGlwb3J0KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisJc2NpX2NvbnRyb2xsZXJfc3RhcnRfbmV4dF9waHkoaWhvc3QpOworCisJc2NpX21vZF90aW1lcigmaWhvc3QtPnRpbWVyLCB0aW1lb3V0KTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19TVEFSVElORyk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaXNjaV9ob3N0X3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpLT5sbGRkX2hhOworCXVuc2lnbmVkIGxvbmcgdG1vID0gc2NpX2NvbnRyb2xsZXJfZ2V0X3N1Z2dlc3RlZF9zdGFydF90aW1lb3V0KGlob3N0KTsKKworCXNldF9iaXQoSUhPU1RfU1RBUlRfUEVORElORywgJmlob3N0LT5mbGFncyk7CisKKwlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwlzY2lfY29udHJvbGxlcl9zdGFydChpaG9zdCwgdG1vKTsKKwlzY2lfY29udHJvbGxlcl9lbmFibGVfaW50ZXJydXB0cyhpaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaXNjaV9ob3N0X3N0b3BfY29tcGxldGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGVudW0gc2NpX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cykKK3sKKwlpc2NpX2hvc3RfY2hhbmdlX3N0YXRlKGlob3N0LCBpc2NpX3N0b3BwZWQpOworCXNjaV9jb250cm9sbGVyX2Rpc2FibGVfaW50ZXJydXB0cyhpaG9zdCk7CisJY2xlYXJfYml0KElIT1NUX1NUT1BfUEVORElORywgJmlob3N0LT5mbGFncyk7CisJd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25faGFuZGxlcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiBFbXB0eSBvdXQgdGhlIGNvbXBsZXRpb24gcXVldWUgKi8KKwlpZiAoc2NpX2NvbnRyb2xsZXJfY29tcGxldGlvbl9xdWV1ZV9oYXNfZW50cmllcyhpaG9zdCkpCisJCXNjaV9jb250cm9sbGVyX3Byb2Nlc3NfY29tcGxldGlvbnMoaWhvc3QpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCBhbmQgZW5hYmxlIGFsbCBpbnRlcnJ1cHRzIGFnYWluICovCisJd3JpdGVsKFNNVV9JU1JfQ09NUExFVElPTiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKwkvKiBDb3VsZCB3ZSB3cml0ZSB0aGUgdmFsdWUgb2YgU01VX0lTUl9DT01QTEVUSU9OPyAqLworCXdyaXRlbCgweEZGMDAwMDAwLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9tYXNrKTsKKwl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7Cit9CisKKy8qKgorICogaXNjaV9ob3N0X2NvbXBsZXRpb25fcm91dGluZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyB0aGUgZGVsYXllZCBzZXJ2aWNlCisgKiAgICByb3V0aW5lIHRoYXQgY2FsbHMgdGhlIHNjaSBjb3JlIGxpYnJhcnkncyBjb21wbGV0aW9uIGhhbmRsZXIuIEl0J3MKKyAqICAgIHNjaGVkdWxlZCBhcyBhIHRhc2tsZXQgZnJvbSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB3aGVuIGludGVycnVwdHMKKyAqICAgIGluIHVzZSwgb3Igc2V0IGFzIHRoZSB0aW1lb3V0IGZ1bmN0aW9uIGluIHBvbGxlZCBtb2RlLgorICogQGRhdGE6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9ob3N0X2NvbXBsZXRpb25fcm91dGluZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSAoc3RydWN0IGlzY2lfaG9zdCAqKWRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAgICBjb21wbGV0ZWRfcmVxdWVzdF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgICAgZXJyb3JlZF9yZXF1ZXN0X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAgICAqY3VycmVudF9wb3NpdGlvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICpuZXh0X3Bvc2l0aW9uOworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqbmV4dF9yZXF1ZXN0OworCXN0cnVjdCBzYXNfdGFzayAgICAgKnRhc2s7CisKKwlJTklUX0xJU1RfSEVBRCgmY29tcGxldGVkX3JlcXVlc3RfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVycm9yZWRfcmVxdWVzdF9saXN0KTsKKworCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCisJc2NpX2NvbnRyb2xsZXJfY29tcGxldGlvbl9oYW5kbGVyKGlob3N0KTsKKworCS8qIFRha2UgdGhlIGxpc3RzIG9mIGNvbXBsZXRlZCBJL09zIGZyb20gdGhlIGhvc3QuICovCisKKwlsaXN0X3NwbGljZV9pbml0KCZpaG9zdC0+cmVxdWVzdHNfdG9fY29tcGxldGUsCisJCQkgJmNvbXBsZXRlZF9yZXF1ZXN0X2xpc3QpOworCisJLyogVGFrZSB0aGUgbGlzdCBvZiBlcnJvcmVkIEkvT3MgZnJvbSB0aGUgaG9zdC4gKi8KKwlsaXN0X3NwbGljZV9pbml0KCZpaG9zdC0+cmVxdWVzdHNfdG9fZXJyb3JiYWNrLAorCQkJICZlcnJvcmVkX3JlcXVlc3RfbGlzdCk7CisKKwlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCisJLyogUHJvY2VzcyBhbnkgY29tcGxldGlvbnMgaW4gdGhlIGxpc3RzLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShjdXJyZW50X3Bvc2l0aW9uLCBuZXh0X3Bvc2l0aW9uLAorCQkJICAgJmNvbXBsZXRlZF9yZXF1ZXN0X2xpc3QpIHsKKworCQlyZXF1ZXN0ID0gbGlzdF9lbnRyeShjdXJyZW50X3Bvc2l0aW9uLCBzdHJ1Y3QgaXNjaV9yZXF1ZXN0LAorCQkJCSAgICAgY29tcGxldGVkX25vZGUpOworCQl0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOworCisJCS8qIE5vcm1hbCBub3RpZmljYXRpb24gKHRhc2tfZG9uZSkgKi8KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogTm9ybWFsIC0gcmVxdWVzdC90YXNrID0gJXAvJXBcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXJlcXVlc3QsCisJCQl0YXNrKTsKKworCQkvKiBSZXR1cm4gdGhlIHRhc2sgdG8gbGlic2FzICovCisJCWlmICh0YXNrICE9IE5VTEwpIHsKKworCQkJdGFzay0+bGxkZF90YXNrID0gTlVMTDsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkgeworCisJCQkJLyogSWYgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiB0aGUgYWJvcnQgcGF0aCwKKwkJCQkqIHRoZSB0YXNrX2RvbmUgY2FsbGJhY2sgY2Fubm90IGJlIGNhbGxlZC4KKwkJCQkqLworCQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKKwkJCX0KKwkJfQorCisJCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCQlpc2NpX2ZyZWVfdGFnKGlob3N0LCByZXF1ZXN0LT5pb190YWcpOworCQlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxdWVzdCwgbmV4dF9yZXF1ZXN0LCAmZXJyb3JlZF9yZXF1ZXN0X2xpc3QsCisJCQkJIGNvbXBsZXRlZF9ub2RlKSB7CisKKwkJdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKworCQkvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBFcnJvciAtIHJlcXVlc3QvdGFzayA9ICVwLyVwXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHJlcXVlc3QsCisJCQkgdGFzayk7CisKKwkJaWYgKHRhc2sgIT0gTlVMTCkgeworCisJCQkvKiBQdXQgdGhlIHRhc2sgaW50byB0aGUgYWJvcnQgcGF0aCBpZiBpdCdzIG5vdCB0aGVyZQorCQkJICogYWxyZWFkeS4KKwkJCSAqLworCQkJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKQorCQkJCXNhc190YXNrX2Fib3J0KHRhc2spOworCisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIGlzIGEgY2FzZSB3aGVyZSB0aGUgcmVxdWVzdCBoYXMgY29tcGxldGVkIHdpdGggYQorCQkJICogc3RhdHVzIHN1Y2ggdGhhdCBpdCBuZWVkZWQgZnVydGhlciB0YXJnZXQgc2VydmljaW5nLAorCQkJICogYnV0IHRoZSBzYXNfdGFzayByZWZlcmVuY2UgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkCisJCQkgKiBmcm9tIHRoZSByZXF1ZXN0LiAgU2luY2UgaXQgd2FzIGVycm9yZWQsIGl0IHdhcyBub3QKKwkJCSAqIGJlaW5nIGFib3J0ZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gZXhjZXB0IGZyZWUKKwkJCSAqIGl0LgorCQkJICovCisKKwkJCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCQkJLyogUmVtb3ZlIHRoZSByZXF1ZXN0IGZyb20gdGhlIHJlbW90ZSBkZXZpY2UncyBsaXN0CisJCQkqIG9mIHBlbmRpbmcgcmVxdWVzdHMuCisJCQkqLworCQkJbGlzdF9kZWxfaW5pdCgmcmVxdWVzdC0+ZGV2X25vZGUpOworCQkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgcmVxdWVzdC0+aW9fdGFnKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisJCX0KKwl9CisKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zdG9wKCkgLSBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgYW4gaW5kaXZpZHVhbCBjb250cm9sbGVyCisgKiAgICBvYmplY3QuVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgdGhlIGFzc29jaWF0ZWQgdXNlciBjYWxsYmFjayB1cG9uCisgKiAgICBjb21wbGV0aW9uLiAgVGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGZvbGxvd2luZworICogICAgY29uZGl0aW9ucyBhcmUgbWV0OiAtIyB0aGUgbWV0aG9kIHJldHVybiBzdGF0dXMgaXMgU0NJX1NVQ0NFU1MuIC0jIHRoZQorICogICAgY29udHJvbGxlciBoYXMgYmVlbiBxdWllc2NlZC4gVGhpcyBtZXRob2Qgd2lsbCBlbnN1cmUgdGhhdCBhbGwgSU8KKyAqICAgIHJlcXVlc3RzIGFyZSBxdWllc2NlZCwgcGh5cyBhcmUgc3RvcHBlZCwgYW5kIGFsbCBhZGRpdGlvbmFsIG9wZXJhdGlvbiBieQorICogICAgdGhlIGhhcmR3YXJlIGlzIGhhbHRlZC4KKyAqIEBjb250cm9sbGVyOiB0aGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCB0byBzdG9wLgorICogQHRpbWVvdXQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiB3aGljaCB0aGUKKyAqICAgIHN0b3Agb3BlcmF0aW9uIHNob3VsZCBjb21wbGV0ZS4KKyAqCisgKiBUaGUgY29udHJvbGxlciBtdXN0IGJlIGluIHRoZSBTVEFSVEVEIG9yIFNUT1BQRUQgc3RhdGUuIEluZGljYXRlIGlmIHRoZQorICogY29udHJvbGxlciBzdG9wIG1ldGhvZCBzdWNjZWVkZWQgb3IgZmFpbGVkIGluIHNvbWUgd2F5LiBTQ0lfU1VDQ0VTUyBpZiB0aGUKKyAqIHN0b3Agb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBiZWdhbi4gU0NJX1dBUk5JTkdfQUxSRUFEWV9JTl9TVEFURSBpZiB0aGUKKyAqIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBpbiB0aGUgU1RPUFBFRCBzdGF0ZS4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSBpZiB0aGUKKyAqIGNvbnRyb2xsZXIgaXMgbm90IGVpdGhlciBpbiB0aGUgU1RBUlRFRCBvciBTVE9QUEVEIHN0YXRlcy4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgdGltZW91dCkKK3sKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19SRUFEWSkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiU0NJQyBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIHJlcXVlc3RlZCBpbiAiCisJCQkgImludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzY2lfbW9kX3RpbWVyKCZpaG9zdC0+dGltZXIsIHRpbWVvdXQpOworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19TVE9QUElORyk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9jb250cm9sbGVyX3Jlc2V0KCkgLSBUaGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoZSBzdXBwbGllZCBjb3JlCisgKiAgICBjb250cm9sbGVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHNhaWQgY29udHJvbGxlci4gIFRoaXMgb3BlcmF0aW9uIGlzCisgKiAgICBjb25zaWRlcmVkIGRlc3RydWN0aXZlLiAgSW4gb3RoZXIgd29yZHMsIGFsbCBjdXJyZW50IG9wZXJhdGlvbnMgYXJlIHdpcGVkCisgKiAgICBvdXQuICBObyBJTyBjb21wbGV0aW9ucyBmb3Igb3V0c3RhbmRpbmcgZGV2aWNlcyBvY2N1ci4gIE91dHN0YW5kaW5nIElPCisgKiAgICByZXF1ZXN0cyBhcmUgbm90IGFib3J0ZWQgb3IgY29tcGxldGVkIGF0IHRoZSBhY3R1YWwgcmVtb3RlIGRldmljZS4KKyAqIEBjb250cm9sbGVyOiB0aGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCB0byByZXNldC4KKyAqCisgKiBJbmRpY2F0ZSBpZiB0aGUgY29udHJvbGxlciByZXNldCBtZXRob2Qgc3VjY2VlZGVkIG9yIGZhaWxlZCBpbiBzb21lIHdheS4KKyAqIFNDSV9TVUNDRVNTIGlmIHRoZSByZXNldCBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuIFNDSV9GQVRBTF9FUlJPUiBpZgorICogdGhlIGNvbnRyb2xsZXIgcmVzZXQgb3BlcmF0aW9uIGlzIHVuYWJsZSB0byBjb21wbGV0ZS4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9yZXNldChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzd2l0Y2ggKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkKSB7CisJY2FzZSBTQ0lDX1JFU0VUOgorCWNhc2UgU0NJQ19SRUFEWToKKwljYXNlIFNDSUNfU1RPUFBFRDoKKwljYXNlIFNDSUNfRkFJTEVEOgorCQkvKgorCQkgKiBUaGUgcmVzZXQgb3BlcmF0aW9uIGlzIG5vdCBhIGdyYWNlZnVsIGNsZWFudXAsIGp1c3QKKwkJICogcGVyZm9ybSB0aGUgc3RhdGUgdHJhbnNpdGlvbi4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19SRVNFVFRJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIlNDSUMgQ29udHJvbGxlciByZXNldCBvcGVyYXRpb24gcmVxdWVzdGVkIGluICIKKwkJCSAiaW52YWxpZCBzdGF0ZVxuIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKwordm9pZCBpc2NpX2hvc3RfZGVpbml0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCWludCBpOworCisJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9zdG9wcGluZyk7CisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CisJCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsICpkOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpZGV2LCBkLCAmaXBvcnQtPnJlbW90ZV9kZXZfbGlzdCwgbm9kZSkgeworCQkJaWYgKHRlc3RfYml0KElERVZfQUxMT0NBVEVELCAmaWRldi0+ZmxhZ3MpKQorCQkJCWlzY2lfcmVtb3RlX2RldmljZV9zdG9wKGlob3N0LCBpZGV2KTsKKwkJfQorCX0KKworCXNldF9iaXQoSUhPU1RfU1RPUF9QRU5ESU5HLCAmaWhvc3QtPmZsYWdzKTsKKworCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCXNjaV9jb250cm9sbGVyX3N0b3AoaWhvc3QsIFNDSUNfQ09OVFJPTExFUl9TVE9QX1RJTUVPVVQpOworCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisKKwl3YWl0X2Zvcl9zdG9wKGlob3N0KTsKKwlzY2lfY29udHJvbGxlcl9yZXNldChpaG9zdCk7CisKKwkvKiBDYW5jZWwgYW55L2FsbCBvdXRzdGFuZGluZyBwb3J0IHRpbWVycyAqLworCWZvciAoaSA9IDA7IGkgPCBpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CisJCWRlbF90aW1lcl9zeW5jKCZpcG9ydC0+dGltZXIudGltZXIpOworCX0KKworCS8qIENhbmNlbCBhbnkvYWxsIG91dHN0YW5kaW5nIHBoeSB0aW1lcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gJmlob3N0LT5waHlzW2ldOworCQlkZWxfdGltZXJfc3luYygmaXBoeS0+c2F0YV90aW1lci50aW1lcik7CisJfQorCisJZGVsX3RpbWVyX3N5bmMoJmlob3N0LT5wb3J0X2FnZW50LnRpbWVyLnRpbWVyKTsKKworCWRlbF90aW1lcl9zeW5jKCZpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lci50aW1lcik7CisKKwlkZWxfdGltZXJfc3luYygmaWhvc3QtPnRpbWVyLnRpbWVyKTsKKworCWRlbF90aW1lcl9zeW5jKCZpaG9zdC0+cGh5X3RpbWVyLnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqc2N1X2Jhc2Uoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaXNjaV9ob3N0LT5wZGV2OworCWludCBpZCA9IGlzY2lfaG9zdC0+aWQ7CisKKwlyZXR1cm4gcGNpbV9pb21hcF90YWJsZShwZGV2KVtTQ0lfU0NVX0JBUiAqIDJdICsgU0NJX1NDVV9CQVJfU0laRSAqIGlkOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzbXVfYmFzZShzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpc2NpX2hvc3QtPnBkZXY7CisJaW50IGlkID0gaXNjaV9ob3N0LT5pZDsKKworCXJldHVybiBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpW1NDSV9TTVVfQkFSICogMl0gKyBTQ0lfU01VX0JBUl9TSVpFICogaWQ7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfdXNlcl9wYXJhbWV0ZXJzX2dldChzdHJ1Y3Qgc2NpX3VzZXJfcGFyYW1ldGVycyAqdSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCQlzdHJ1Y3Qgc2NpX3BoeV91c2VyX3BhcmFtcyAqdV9waHkgPSAmdS0+cGh5c1tpXTsKKworCQl1X3BoeS0+bWF4X3NwZWVkX2dlbmVyYXRpb24gPSBwaHlfZ2VuOworCisJCS8qIHdlIGFyZSBub3QgZXhwb3J0aW5nIHRoZXNlIGZvciBub3cgKi8KKwkJdV9waHktPmFsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweDdmOworCQl1X3BoeS0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHhmZjsKKwkJdV9waHktPm5vdGlmeV9lbmFibGVfc3Bpbl91cF9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHgzMzsKKwl9CisKKwl1LT5zdHBfaW5hY3Rpdml0eV90aW1lb3V0ID0gc3RwX2luYWN0aXZlX3RvOworCXUtPnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQgPSBzc3BfaW5hY3RpdmVfdG87CisJdS0+c3RwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IHN0cF9tYXhfb2NjX3RvOworCXUtPnNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPSBzc3BfbWF4X29jY190bzsKKwl1LT5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQgPSBub19vdXRib3VuZF90YXNrX3RvOworCXUtPm1heF9udW1iZXJfY29uY3VycmVudF9kZXZpY2Vfc3Bpbl91cCA9IG1heF9jb25jdXJyX3NwaW51cDsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfaW5pdGlhbF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfUkVTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX2NvbnRyb2xsZXJfc3RhcnRpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpaG9zdC0+dGltZXIpOworfQorCisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0JBU0VfUkFOR0VfTE9XRVJfQk9VTkRfTlMgODUzCisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0JBU0VfUkFOR0VfVVBQRVJfQk9VTkRfTlMgMTI4MAorI2RlZmluZSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9NQVhfVVMgICAgICAgICAgICAgICAgICAgIDI3MDAwMDAKKyNkZWZpbmUgSU5URVJSVVBUX0NPQUxFU0NFX05VTUJFUl9NQVggICAgICAgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01JTiAgICAgICAgICAgICAgICA3CisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0VOQ09ERV9NQVggICAgICAgICAgICAgICAgMjgKKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zZXRfaW50ZXJydXB0X2NvYWxlc2NlbmNlKCkgLSBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIHVzZXIgdG8KKyAqICAgIGNvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IGNvYWxlc2NlbmNlLgorICogQGNvbnRyb2xsZXI6IFRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QKKyAqICAgIGZvciB3aGljaCBpdHMgaW50ZXJydXB0IGNvYWxlc2NlIHJlZ2lzdGVyIGlzIG92ZXJyaWRkZW4uCisgKiBAY29hbGVzY2VfbnVtYmVyOiBVc2VkIHRvIGNvbnRyb2wgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBDb21wbGV0aW9uCisgKiAgICBRdWV1ZSBiZWZvcmUgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4gSWYgdGhlIG51bWJlciBvZiBlbnRyaWVzIGV4Y2VlZAorICogICAgdGhpcyBudW1iZXIsIGFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZC4gVGhlIHZhbGlkIHJhbmdlIG9mIHRoZSBpbnB1dAorICogICAgaXMgWzAsIDI1Nl0uIEEgc2V0dGluZyBvZiAwIHJlc3VsdHMgaW4gY29hbGVzY2luZyBiZWluZyBkaXNhYmxlZC4KKyAqIEBjb2FsZXNjZV90aW1lb3V0OiBUaW1lb3V0IHZhbHVlIGluIG1pY3Jvc2Vjb25kcy4gVGhlIHZhbGlkIHJhbmdlIG9mIHRoZQorICogICAgaW5wdXQgaXMgWzAsIDI3MDAwMDBdIC4gQSBzZXR0aW5nIG9mIDAgaXMgYWxsb3dlZCBhbmQgcmVzdWx0cyBpbiBubworICogICAgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZW91dC4KKyAqCisgKiBJbmRpY2F0ZSBpZiB0aGUgdXNlciBzdWNjZXNzZnVsbHkgc2V0IHRoZSBpbnRlcnJ1cHQgY29hbGVzY2UgcGFyYW1ldGVycy4KKyAqIFNDSV9TVUNDRVNTIFRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHRoZSBpbnRlcnJ1dHAgY29hbGVzY2VuY2UuCisgKiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSBUaGUgdXNlciBpbnB1dCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9jb250cm9sbGVyX3NldF9pbnRlcnJ1cHRfY29hbGVzY2VuY2Uoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSB1MzIgY29hbGVzY2VfbnVtYmVyLAorCQkJCQkgdTMyIGNvYWxlc2NlX3RpbWVvdXQpCit7CisJdTggdGltZW91dF9lbmNvZGUgPSAwOworCXUzMiBtaW4gPSAwOworCXUzMiBtYXggPSAwOworCisJLyogQ2hlY2sgaWYgdGhlIGlucHV0IHBhcmFtZXRlcnMgZmFsbCBpbiB0aGUgcmFuZ2UuICovCisJaWYgKGNvYWxlc2NlX251bWJlciA+IElOVEVSUlVQVF9DT0FMRVNDRV9OVU1CRVJfTUFYKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7CisKKwkvKgorCSAqICBEZWZpbmVkIGVuY29kaW5nIGZvciBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lb3V0OgorCSAqICAgICAgICAgICAgICBWYWx1ZSAgIE1pbiAgICAgIE1heCAgICAgVW5pdHMKKwkgKiAgICAgICAgICAgICAgLS0tLS0gICAtLS0gICAgICAtLS0gICAgIC0tLS0tCisJICogICAgICAgICAgICAgIDAgICAgICAgLSAgICAgICAgLSAgICAgICBEaXNhYmxlZAorCSAqICAgICAgICAgICAgICAxICAgICAgIDEzLjMgICAgIDIwLjAgICAgbnMKKwkgKiAgICAgICAgICAgICAgMiAgICAgICAyNi43ICAgICA0MC4wCisJICogICAgICAgICAgICAgIDMgICAgICAgNTMuMyAgICAgODAuMAorCSAqICAgICAgICAgICAgICA0ICAgICAgIDEwNi43ICAgIDE2MC4wCisJICogICAgICAgICAgICAgIDUgICAgICAgMjEzLjMgICAgMzIwLjAKKwkgKiAgICAgICAgICAgICAgNiAgICAgICA0MjYuNyAgICA2NDAuMAorCSAqICAgICAgICAgICAgICA3ICAgICAgIDg1My4zICAgIDEyODAuMAorCSAqICAgICAgICAgICAgICA4ICAgICAgIDEuNyAgICAgIDIuNiAgICAgdXMKKwkgKiAgICAgICAgICAgICAgOSAgICAgICAzLjQgICAgICA1LjEKKwkgKiAgICAgICAgICAgICAgMTAgICAgICA2LjggICAgICAxMC4yCisJICogICAgICAgICAgICAgIDExICAgICAgMTMuNyAgICAgMjAuNQorCSAqICAgICAgICAgICAgICAxMiAgICAgIDI3LjMgICAgIDQxLjAKKwkgKiAgICAgICAgICAgICAgMTMgICAgICA1NC42ICAgICA4MS45CisJICogICAgICAgICAgICAgIDE0ICAgICAgMTA5LjIgICAgMTYzLjgKKwkgKiAgICAgICAgICAgICAgMTUgICAgICAyMTguNSAgICAzMjcuNworCSAqICAgICAgICAgICAgICAxNiAgICAgIDQzNi45ICAgIDY1NS40CisJICogICAgICAgICAgICAgIDE3ICAgICAgODczLjggICAgMTMxMC43CisJICogICAgICAgICAgICAgIDE4ICAgICAgMS43ICAgICAgMi42ICAgICBtcworCSAqICAgICAgICAgICAgICAxOSAgICAgIDMuNSAgICAgIDUuMgorCSAqICAgICAgICAgICAgICAyMCAgICAgIDcuMCAgICAgIDEwLjUKKwkgKiAgICAgICAgICAgICAgMjEgICAgICAxNC4wICAgICAyMS4wCisJICogICAgICAgICAgICAgIDIyICAgICAgMjguMCAgICAgNDEuOQorCSAqICAgICAgICAgICAgICAyMyAgICAgIDU1LjkgICAgIDgzLjkKKwkgKiAgICAgICAgICAgICAgMjQgICAgICAxMTEuOCAgICAxNjcuOAorCSAqICAgICAgICAgICAgICAyNSAgICAgIDIyMy43ICAgIDMzNS41CisJICogICAgICAgICAgICAgIDI2ICAgICAgNDQ3LjQgICAgNjcxLjEKKwkgKiAgICAgICAgICAgICAgMjcgICAgICA4OTQuOCAgICAxMzQyLjIKKwkgKiAgICAgICAgICAgICAgMjggICAgICAxLjggICAgICAyLjcgICAgIHMKKwkgKiAgICAgICAgICAgICAgT3RoZXJzIFVuZGVmaW5lZCAqLworCisJLyoKKwkgKiBVc2UgdGhlIHRhYmxlIGFib3ZlIHRvIGRlY2lkZSB0aGUgZW5jb2RlIG9mIGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVvdXQKKwkgKiB2YWx1ZSBmb3IgcmVnaXN0ZXIgd3JpdGluZy4gKi8KKwlpZiAoY29hbGVzY2VfdGltZW91dCA9PSAwKQorCQl0aW1lb3V0X2VuY29kZSA9IDA7CisJZWxzZXsKKwkJLyogbWFrZSB0aGUgdGltZW91dCB2YWx1ZSBpbiB1bml0IG9mICgxMCBucykuICovCisJCWNvYWxlc2NlX3RpbWVvdXQgPSBjb2FsZXNjZV90aW1lb3V0ICogMTAwOworCQltaW4gPSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9CQVNFX1JBTkdFX0xPV0VSX0JPVU5EX05TIC8gMTA7CisJCW1heCA9IElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0JBU0VfUkFOR0VfVVBQRVJfQk9VTkRfTlMgLyAxMDsKKworCQkvKiBnZXQgdGhlIGVuY29kZSBvZiB0aW1lb3V0IGZvciByZWdpc3RlciB3cml0aW5nLiAqLworCQlmb3IgKHRpbWVvdXRfZW5jb2RlID0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01JTjsKKwkJICAgICAgdGltZW91dF9lbmNvZGUgPD0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01BWDsKKwkJICAgICAgdGltZW91dF9lbmNvZGUrKykgeworCQkJaWYgKG1pbiA8PSBjb2FsZXNjZV90aW1lb3V0ICYmICBtYXggPiBjb2FsZXNjZV90aW1lb3V0KQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAoY29hbGVzY2VfdGltZW91dCA+PSBtYXggJiYgY29hbGVzY2VfdGltZW91dCA8IG1pbiAqIDIKKwkJCQkgJiYgY29hbGVzY2VfdGltZW91dCA8PSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9NQVhfVVMgKiAxMDApIHsKKwkJCQlpZiAoKGNvYWxlc2NlX3RpbWVvdXQgLSBtYXgpIDwgKDIgKiBtaW4gLSBjb2FsZXNjZV90aW1lb3V0KSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZXsKKwkJCQkJdGltZW91dF9lbmNvZGUrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltYXggPSBtYXggKiAyOworCQkJCW1pbiA9IG1pbiAqIDI7CisJCQl9CisJCX0KKworCQlpZiAodGltZW91dF9lbmNvZGUgPT0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01BWCArIDEpCisJCQkvKiB0aGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLiAqLworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworCX0KKworCXdyaXRlbChTTVVfSUNDX0dFTl9WQUwoTlVNQkVSLCBjb2FsZXNjZV9udW1iZXIpIHwKKwkgICAgICAgU01VX0lDQ19HRU5fVkFMKFRJTUVSLCB0aW1lb3V0X2VuY29kZSksCisJICAgICAgICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X2NvYWxlc2NlX2NvbnRyb2wpOworCisKKwlpaG9zdC0+aW50ZXJydXB0X2NvYWxlc2NlX251bWJlciA9ICh1MTYpY29hbGVzY2VfbnVtYmVyOworCWlob3N0LT5pbnRlcnJ1cHRfY29hbGVzY2VfdGltZW91dCA9IGNvYWxlc2NlX3RpbWVvdXQgLyAxMDA7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlob3N0KSwgc20pOworCisJLyogc2V0IHRoZSBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjZW5jZSBudW1iZXIgYW5kIHRpbWVvdXQgdmFsdWUuICovCisJc2NpX2NvbnRyb2xsZXJfc2V0X2ludGVycnVwdF9jb2FsZXNjZW5jZShpaG9zdCwgMHgxMCwgMjUwKTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdCBjb2FsZXNjZW5jZS4gKi8KKwlzY2lfY29udHJvbGxlcl9zZXRfaW50ZXJydXB0X2NvYWxlc2NlbmNlKGlob3N0LCAwLCAwKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdG9wX3BoeXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGluZGV4OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJZW51bSBzY2lfc3RhdHVzIHBoeV9zdGF0dXM7CisKKwlzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlwaHlfc3RhdHVzID0gc2NpX3BoeV9zdG9wKCZpaG9zdC0+cGh5c1tpbmRleF0pOworCisJCWlmIChwaHlfc3RhdHVzICE9IFNDSV9TVUNDRVNTICYmCisJCSAgICBwaHlfc3RhdHVzICE9IFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEUpIHsKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFOworCisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCB0byBzdG9wICIKKwkJCQkgInBoeSAlZCBiZWNhdXNlIG9mIHN0YXR1cyAlZC5cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBpaG9zdC0+cGh5c1tpbmRleF0ucGh5X2luZGV4LCBwaHlfc3RhdHVzKTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RvcF9wb3J0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisJZW51bSBzY2lfc3RhdHVzIHBvcnRfc3RhdHVzOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaW5kZXhdOworCisJCXBvcnRfc3RhdHVzID0gc2NpX3BvcnRfc3RvcChpcG9ydCk7CisKKwkJaWYgKChwb3J0X3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgJiYKKwkJICAgIChwb3J0X3N0YXR1cyAhPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFKSkgeworCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IENvbnRyb2xsZXIgc3RvcCBvcGVyYXRpb24gZmFpbGVkIHRvICIKKwkJCQkgInN0b3AgcG9ydCAlZCBiZWNhdXNlIG9mIHN0YXR1cyAlZC5cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBpcG9ydC0+bG9naWNhbF9wb3J0X2luZGV4LAorCQkJCSBwb3J0X3N0YXR1cyk7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0b3BfZGV2aWNlcyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwllbnVtIHNjaV9zdGF0dXMgZGV2aWNlX3N0YXR1czsKKworCXN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXM7IGluZGV4KyspIHsKKwkJaWYgKGlob3N0LT5kZXZpY2VfdGFibGVbaW5kZXhdICE9IE5VTEwpIHsKKwkJCS8qIC8gQHRvZG8gV2hhdCB0aW1lb3V0IHZhbHVlIGRvIHdlIHdhbnQgdG8gcHJvdmlkZSB0byB0aGlzIHJlcXVlc3Q/ICovCisJCQlkZXZpY2Vfc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XSwgMCk7CisKKwkJCWlmICgoZGV2aWNlX3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgJiYKKwkJCSAgICAoZGV2aWNlX3N0YXR1cyAhPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFKSkgeworCQkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCAiCisJCQkJCSAidG8gc3RvcCBkZXZpY2UgMHglcCBiZWNhdXNlIG9mICIKKwkJCQkJICJzdGF0dXMgJWQuXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XSwgZGV2aWNlX3N0YXR1cyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9zdG9wcGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwkvKiBTdG9wIGFsbCBvZiB0aGUgY29tcG9uZW50cyBmb3IgdGhpcyBjb250cm9sbGVyICovCisJc2NpX2NvbnRyb2xsZXJfc3RvcF9waHlzKGlob3N0KTsKKwlzY2lfY29udHJvbGxlcl9zdG9wX3BvcnRzKGlob3N0KTsKKwlzY2lfY29udHJvbGxlcl9zdG9wX2RldmljZXMoaWhvc3QpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9zdG9wcGluZ19zdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppaG9zdCksIHNtKTsKKworCXNjaV9kZWxfdGltZXIoJmlob3N0LT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3Jlc2V0X2hhcmR3YXJlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCS8qIERpc2FibGUgaW50ZXJydXB0cyBzbyB3ZSBkb250IHRha2UgYW55IHNwdXJpb3VzIGludGVycnVwdHMgKi8KKwlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCisJLyogUmVzZXQgdGhlIFNDVSAqLworCXdyaXRlbCgweEZGRkZGRkZGLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPnNvZnRfcmVzZXRfY29udHJvbCk7CisKKwkvKiBEZWxheSBmb3IgMW1zIHRvIGJlZm9yZSBjbGVhcmluZyB0aGUgQ1FQIGFuZCBVRlFQUi4gKi8KKwl1ZGVsYXkoMTAwMCk7CisKKwkvKiBUaGUgd3JpdGUgdG8gdGhlIENRR1IgY2xlYXJzIHRoZSBDUVAgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisKKwkvKiBUaGUgd3JpdGUgdG8gdGhlIFVGUUdQIGNsZWFycyB0aGUgVUZRUFIgKi8KKwl3cml0ZWwoMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX2dldF9wb2ludGVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVzZXR0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppaG9zdCksIHNtKTsKKworCXNjaV9jb250cm9sbGVyX3Jlc2V0X2hhcmR3YXJlKGlob3N0KTsKKwlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfUkVTRVQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjaV9iYXNlX3N0YXRlIHNjaV9jb250cm9sbGVyX3N0YXRlX3RhYmxlW10gPSB7CisJW1NDSUNfSU5JVElBTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9jb250cm9sbGVyX2luaXRpYWxfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJQ19SRVNFVF0gPSB7fSwKKwlbU0NJQ19JTklUSUFMSVpJTkddID0ge30sCisJW1NDSUNfSU5JVElBTElaRURdID0ge30sCisJW1NDSUNfU1RBUlRJTkddID0geworCQkuZXhpdF9zdGF0ZSAgPSBzY2lfY29udHJvbGxlcl9zdGFydGluZ19zdGF0ZV9leGl0LAorCX0sCisJW1NDSUNfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfY29udHJvbGxlcl9yZWFkeV9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lDX1JFU0VUVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9jb250cm9sbGVyX3Jlc2V0dGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lDX1NUT1BQSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX2NvbnRyb2xsZXJfc3RvcHBpbmdfc3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlID0gc2NpX2NvbnRyb2xsZXJfc3RvcHBpbmdfc3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lDX1NUT1BQRURdID0ge30sCisJW1NDSUNfRkFJTEVEXSA9IHt9Cit9OworCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9zZXRfZGVmYXVsdF9jb25maWdfcGFyYW1ldGVycyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiB0aGVzZSBkZWZhdWx0cyBhcmUgb3ZlcnJpZGRlbiBieSB0aGUgcGxhdGZvcm0gLyBmaXJtd2FyZSAqLworCXUxNiBpbmRleDsKKworCS8qIERlZmF1bHQgdG8gQVBDIG1vZGUuICovCisJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubW9kZV90eXBlID0gU0NJQ19QT1JUX0FVVE9NQVRJQ19DT05GSUdVUkFUSU9OX01PREU7CisKKwkvKiBEZWZhdWx0IHRvIEFQQyBtb2RlLiAqLworCWlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwID0gMTsKKworCS8qIERlZmF1bHQgdG8gbm8gU1NDIG9wZXJhdGlvbi4gKi8KKwlpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5kb19lbmFibGVfc3NjID0gZmFsc2U7CisKKwkvKiBJbml0aWFsaXplIGFsbCBvZiB0aGUgcG9ydCBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gdG8gbmFycm93IHBvcnRzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUE9SVFM7IGluZGV4KyspIHsKKwkJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLnBvcnRzW2luZGV4XS5waHlfbWFzayA9IDA7CisJfQorCisJLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHBoeSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCS8qIERlZmF1bHQgdG8gNkcgKGkuZS4gR2VuIDMpIGZvciBub3cuICovCisJCWlob3N0LT51c2VyX3BhcmFtZXRlcnMucGh5c1tpbmRleF0ubWF4X3NwZWVkX2dlbmVyYXRpb24gPSAzOworCisJCS8qIHRoZSBmcmVxdWVuY2llcyBjYW5ub3QgYmUgMCAqLworCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLmFsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweDdmOworCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLmluX2Nvbm5lY3Rpb25fYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9IDB4ZmY7CisJCWlob3N0LT51c2VyX3BhcmFtZXRlcnMucGh5c1tpbmRleF0ubm90aWZ5X2VuYWJsZV9zcGluX3VwX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweDMzOworCisJCS8qCisJCSAqIFByZXZpb3VzIFZpdGVzc2UgYmFzZWQgZXhwYW5kZXJzIGhhZCBhIGFyYml0cmF0aW9uIGlzc3VlIHRoYXQKKwkJICogaXMgd29ya2VkIGFyb3VuZCBieSBoYXZpbmcgdGhlIHVwcGVyIDMyLWJpdHMgb2YgU0FTIGFkZHJlc3MKKwkJICogd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhlbiB0aGUgVml0ZXNzZSBjb21wYW55IGlkZW50aWZpZXIuCisJCSAqIEhlbmNlLCB1c2FnZSBvZiAweDVGQ0ZGRkZGLiAqLworCQlpaG9zdC0+b2VtX3BhcmFtZXRlcnMucGh5c1tpbmRleF0uc2FzX2FkZHJlc3MubG93ID0gMHgxICsgaWhvc3QtPmlkOworCQlpaG9zdC0+b2VtX3BhcmFtZXRlcnMucGh5c1tpbmRleF0uc2FzX2FkZHJlc3MuaGlnaCA9IDB4NUZDRkZGRkY7CisJfQorCisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zdHBfaW5hY3Rpdml0eV90aW1lb3V0ID0gNTsKKwlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQgPSA1OworCWlob3N0LT51c2VyX3BhcmFtZXRlcnMuc3RwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IDU7CisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0ID0gMjA7CisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQgPSAyMDsKK30KKworc3RhdGljIHZvaWQgY29udHJvbGxlcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKmlob3N0KSwgdGltZXIpOworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpaG9zdC0+c207CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCWlmIChzbS0+Y3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lDX1NUQVJUSU5HKQorCQlzY2lfY29udHJvbGxlcl90cmFuc2l0aW9uX3RvX3JlYWR5KGlob3N0LCBTQ0lfRkFJTFVSRV9USU1FT1VUKTsKKwllbHNlIGlmIChzbS0+Y3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lDX1NUT1BQSU5HKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSUNfRkFJTEVEKTsKKwkJaXNjaV9ob3N0X3N0b3BfY29tcGxldGUoaWhvc3QsIFNDSV9GQUlMVVJFX1RJTUVPVVQpOworCX0gZWxzZQkvKiAvIEB0b2RvIE5vdyB3aGF0IGRvIHdlIHdhbnQgdG8gZG8gaW4gdGhpcyBjYXNlPyAqLworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBDb250cm9sbGVyIHRpbWVyIGZpcmVkIHdoZW4gY29udHJvbGxlciB3YXMgbm90ICIKKwkJCSJpbiBhIHN0YXRlIGJlaW5nIHRpbWVkLlxuIiwKKwkJCV9fZnVuY19fKTsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJdm9pZCBfX2lvbWVtICpzY3VfYmFzZSwKKwkJCQkJCXZvaWQgX19pb21lbSAqc211X2Jhc2UpCit7CisJdTggaTsKKworCXNjaV9pbml0X3NtKCZpaG9zdC0+c20sIHNjaV9jb250cm9sbGVyX3N0YXRlX3RhYmxlLCBTQ0lDX0lOSVRJQUwpOworCisJaWhvc3QtPnNjdV9yZWdpc3RlcnMgPSBzY3VfYmFzZTsKKwlpaG9zdC0+c211X3JlZ2lzdGVycyA9IHNtdV9iYXNlOworCisJc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9jb25zdHJ1Y3QoJmlob3N0LT5wb3J0X2FnZW50KTsKKworCS8qIENvbnN0cnVjdCB0aGUgcG9ydHMgZm9yIHRoaXMgY29udHJvbGxlciAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BPUlRTOyBpKyspCisJCXNjaV9wb3J0X2NvbnN0cnVjdCgmaWhvc3QtPnBvcnRzW2ldLCBpLCBpaG9zdCk7CisJc2NpX3BvcnRfY29uc3RydWN0KCZpaG9zdC0+cG9ydHNbaV0sIFNDSUNfU0RTX0RVTU1ZX1BPUlQsIGlob3N0KTsKKworCS8qIENvbnN0cnVjdCB0aGUgcGh5cyBmb3IgdGhpcyBjb250cm9sbGVyICovCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKSB7CisJCS8qIEFkZCBhbGwgdGhlIFBIWXMgdG8gdGhlIGR1bW15IHBvcnQgKi8KKwkJc2NpX3BoeV9jb25zdHJ1Y3QoJmlob3N0LT5waHlzW2ldLAorCQkJCSAgJmlob3N0LT5wb3J0c1tTQ0lfTUFYX1BPUlRTXSwgaSk7CisJfQorCisJaWhvc3QtPmludmFsaWRfcGh5X21hc2sgPSAwOworCisJc2NpX2luaXRfdGltZXIoJmlob3N0LT50aW1lciwgY29udHJvbGxlcl90aW1lb3V0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIFVzZXIgYW5kIE9FTSBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzLiAqLworCXNjaV9jb250cm9sbGVyX3NldF9kZWZhdWx0X2NvbmZpZ19wYXJhbWV0ZXJzKGlob3N0KTsKKworCXJldHVybiBzY2lfY29udHJvbGxlcl9yZXNldChpaG9zdCk7Cit9CisKK2ludCBzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoc3RydWN0IHNjaV9vZW1fcGFyYW1zICpvZW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QT1JUUzsgaSsrKQorCQlpZiAob2VtLT5wb3J0c1tpXS5waHlfbWFzayA+IFNDSUNfU0RTX1BBUk1fUEhZX01BU0tfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspCisJCWlmIChvZW0tPnBoeXNbaV0uc2FzX2FkZHJlc3MuaGlnaCA9PSAwICYmCisJCSAgICBvZW0tPnBoeXNbaV0uc2FzX2FkZHJlc3MubG93ID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZW0tPmNvbnRyb2xsZXIubW9kZV90eXBlID09IFNDSUNfUE9SVF9BVVRPTUFUSUNfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykKKwkJCWlmIChvZW0tPnBvcnRzW2ldLnBoeV9tYXNrICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChvZW0tPmNvbnRyb2xsZXIubW9kZV90eXBlID09IFNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCXU4IHBoeV9tYXNrID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspCisJCQlwaHlfbWFzayB8PSBvZW0tPnBvcnRzW2ldLnBoeV9tYXNrOworCisJCWlmIChwaHlfbWFzayA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9lbS0+Y29udHJvbGxlci5tYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cCA+IE1BWF9DT05DVVJSRU5UX0RFVklDRV9TUElOX1VQX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9vZW1fcGFyYW1ldGVyc19zZXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIHN0YXRlID0gaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgPT0gU0NJQ19SRVNFVCB8fAorCSAgICBzdGF0ZSA9PSBTQ0lDX0lOSVRJQUxJWklORyB8fAorCSAgICBzdGF0ZSA9PSBTQ0lDX0lOSVRJQUxJWkVEKSB7CisKKwkJaWYgKHNjaV9vZW1fcGFyYW1ldGVyc192YWxpZGF0ZSgmaWhvc3QtPm9lbV9wYXJhbWV0ZXJzKSkKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK3N0YXRpYyB2b2lkIHBvd2VyX2NvbnRyb2xfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCppaG9zdCksIHBvd2VyX2NvbnRyb2wudGltZXIpOworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRtci0+Y2FuY2VsKQorCQlnb3RvIGRvbmU7CisKKwlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX2dyYW50ZWRfcG93ZXIgPSAwOworCisJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZyA9PSAwKSB7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyX3N0YXJ0ZWQgPSBmYWxzZTsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCisJCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX3dhaXRpbmcgPT0gMCkKKwkJCWJyZWFrOworCisJCWlwaHkgPSBpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2ldOworCQlpZiAoaXBoeSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA+PQorCQkgICAgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXApCisJCQlicmVhazsKKworCQlpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2ldID0gTlVMTDsKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c193YWl0aW5nLS07CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlcisrOworCQlzY2lfcGh5X2NvbnN1bWVfcG93ZXJfaGFuZGxlcihpcGh5KTsKKwl9CisKKwkvKgorCSAqIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBwb3dlciBsaXN0IGlzIGVtcHR5LCB3ZSBuZWVkIHRvIHN0YXJ0IHRoZQorCSAqIHRpbWVyIGluIGNhc2UgYW5vdGhlciBwaHkgYmVjb21lcyByZWFkeS4KKwkgKi8KKwlzY2lfbW9kX3RpbWVyKHRtciwgU0NJQ19TRFNfQ09OVFJPTExFUl9QT1dFUl9DT05UUk9MX0lOVEVSVkFMKTsKKwlpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lcl9zdGFydGVkID0gdHJ1ZTsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9pbnNlcnQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJQlVHX09OKGlwaHkgPT0gTlVMTCk7CisKKwlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyIDwKKwkgICAgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXApIHsKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyKys7CisJCXNjaV9waHlfY29uc3VtZV9wb3dlcl9oYW5kbGVyKGlwaHkpOworCisJCS8qCisJCSAqIHN0b3AgYW5kIHN0YXJ0IHRoZSBwb3dlcl9jb250cm9sIHRpbWVyLiBXaGVuIHRoZSB0aW1lciBmaXJlcywgdGhlCisJCSAqIG5vX29mX3BoeXNfZ3JhbnRlZF9wb3dlciB3aWxsIGJlIHNldCB0byAwCisJCSAqLworCQlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXJfc3RhcnRlZCkKKwkJCXNjaV9kZWxfdGltZXIoJmlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyKTsKKworCQlzY2lfbW9kX3RpbWVyKCZpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lciwKKwkJCQkgU0NJQ19TRFNfQ09OVFJPTExFUl9QT1dFUl9DT05UUk9MX0lOVEVSVkFMKTsKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXJfc3RhcnRlZCA9IHRydWU7CisKKwl9IGVsc2UgeworCQkvKiBBZGQgdGhlIHBoeSBpbiB0aGUgd2FpdGluZyBsaXN0ICovCisJCWlob3N0LT5wb3dlcl9jb250cm9sLnJlcXVlc3RlcnNbaXBoeS0+cGh5X2luZGV4XSA9IGlwaHk7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZysrOworCX0KK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX3JlbW92ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlCVUdfT04oaXBoeSA9PSBOVUxMKTsKKworCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2lwaHktPnBoeV9pbmRleF0pCisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZy0tOworCisJaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVyc1tpcGh5LT5waHlfaW5kZXhdID0gTlVMTDsKK30KKworI2RlZmluZSBBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkgMTAKKworLyogSW5pdGlhbGl6ZSB0aGUgQUZFIGZvciB0aGlzIHBoeSBpbmRleC4gV2UgbmVlZCB0byByZWFkIHRoZSBBRkUgc2V0dXAgZnJvbQorICogdGhlIE9FTSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2FmZV9pbml0aWFsaXphdGlvbihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwljb25zdCBzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSA9ICZpaG9zdC0+b2VtX3BhcmFtZXRlcnM7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpaG9zdC0+cGRldjsKKwl1MzIgYWZlX3N0YXR1czsKKwl1MzIgcGh5X2lkOworCisJLyogQ2xlYXIgREZYIFN0YXR1cyByZWdpc3RlcnMgKi8KKwl3cml0ZWwoMHgwMDgxMDAwZiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2RmeF9tYXN0ZXJfY29udHJvbDApOworCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJaWYgKGlzX2IwKHBkZXYpKSB7CisJCS8qIFBNIFJ4IEVxdWFsaXphdGlvbiBTYXZlLCBQTSBTUGh5IFJ4IEFja25vd2xlZGdlbWVudAorCQkgKiBUaW1lciwgUE0gU3RhZ2dlciBUaW1lciAqLworCQl3cml0ZWwoMHgwMDA3QkZGRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wyKTsKKwkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJfQorCisJLyogQ29uZmlndXJlIGJpYXMgY3VycmVudHMgdG8gbm9ybWFsICovCisJaWYgKGlzX2EyKHBkZXYpKQorCQl3cml0ZWwoMHgwMDAwNUEwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2JpYXNfY29udHJvbCk7CisJZWxzZSBpZiAoaXNfYjAocGRldikgfHwgaXNfYzAocGRldikpCisJCXdyaXRlbCgweDAwMDA1RjAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfYmlhc19jb250cm9sKTsKKworCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJLyogRW5hYmxlIFBMTCAqLworCWlmIChpc19iMChwZGV2KSB8fCBpc19jMChwZGV2KSkKKwkJd3JpdGVsKDB4ODAwNDBBMDgsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9wbGxfY29udHJvbDApOworCWVsc2UKKwkJd3JpdGVsKDB4ODAwNDA5MDgsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9wbGxfY29udHJvbDApOworCisJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkvKiBXYWl0IGZvciB0aGUgUExMIHRvIGxvY2sgKi8KKwlkbyB7CisJCWFmZV9zdGF0dXMgPSByZWFkbCgmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfY29tbW9uX2Jsb2NrX3N0YXR1cyk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCX0gd2hpbGUgKChhZmVfc3RhdHVzICYgMHgwMDAwMTAwMCkgPT0gMCk7CisKKwlpZiAoaXNfYTIocGRldikpIHsKKwkJLyogU2hvcnRlbiBTQVMgU05XIGxvY2sgdGltZSAoUnhMb2NrIHRpbWVyIHZhbHVlIGZyb20gNzYgdXMgdG8gNTAgdXMpICovCisJCXdyaXRlbCgweDdiY2M5NmFkLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfcG1zbl9tYXN0ZXJfY29udHJvbDApOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwl9CisKKwlmb3IgKHBoeV9pZCA9IDA7IHBoeV9pZCA8IFNDSV9NQVhfUEhZUzsgcGh5X2lkKyspIHsKKwkJY29uc3Qgc3RydWN0IHNjaV9waHlfb2VtX3BhcmFtcyAqb2VtX3BoeSA9ICZvZW0tPnBoeXNbcGh5X2lkXTsKKworCQlpZiAoaXNfYjAocGRldikpIHsKKwkJCSAvKiBDb25maWd1cmUgdHJhbnNtaXR0ZXIgU1NDIHBhcmFtZXRlcnMgKi8KKwkJCXdyaXRlbCgweDAwMDMwMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfc3NjX2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJCX0gZWxzZSBpZiAoaXNfYzAocGRldikpIHsKKwkJCSAvKiBDb25maWd1cmUgdHJhbnNtaXR0ZXIgU1NDIHBhcmFtZXRlcnMgKi8KKwkJCXdyaXRlbCgweDAwMDMwMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9zc2NfY29udHJvbCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJLyoKKwkJCSAqIEFsbCBkZWZhdWx0cywgZXhjZXB0IHRoZSBSZWNlaXZlIFdvcmQgQWxpZ25hbWVudC9Db21tYSBEZXRlY3QKKwkJCSAqIEVuYWJsZS4uLi4oMHhlODAwKSAqLworCQkJd3JpdGVsKDB4MDAwMDQ1MDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV94Y3ZyX2NvbnRyb2wwKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEFsbCBkZWZhdWx0cywgZXhjZXB0IHRoZSBSZWNlaXZlIFdvcmQgQWxpZ25hbWVudC9Db21tYSBEZXRlY3QKKwkJCSAqIEVuYWJsZS4uLi4oMHhlODAwKSAqLworCQkJd3JpdGVsKDB4MDAwMDQ1MTIsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV94Y3ZyX2NvbnRyb2wwKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCQl3cml0ZWwoMHgwMDUwMTAwRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3hjdnJfY29udHJvbDEpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJCX0KKworCQkvKgorCQkgKiBQb3dlciB1cCBUWCBhbmQgUlggb3V0IGZyb20gcG93ZXIgZG93biAoUFdSRE5UWCBhbmQgUFdSRE5SWCkKKwkJICogJiBpbmNyZWFzZSBUWCBpbnQgJiBleHQgYmlhcyAyMCUuLi4uKDB4ZTg1YykgKi8KKwkJaWYgKGlzX2EyKHBkZXYpKQorCQkJd3JpdGVsKDB4MDAwMDAzRjAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9jaGFubmVsX2NvbnRyb2wpOworCQllbHNlIGlmIChpc19iMChwZGV2KSkgeworCQkJIC8qIFBvd2VyIGRvd24gVFggYW5kIFJYIChQV1JETlRYIGFuZCBQV1JETlJYKSAqLworCQkJd3JpdGVsKDB4MDAwMDAzRDcsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9jaGFubmVsX2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJCS8qCisJCQkgKiBQb3dlciB1cCBUWCBhbmQgUlggb3V0IGZyb20gcG93ZXIgZG93biAoUFdSRE5UWCBhbmQgUFdSRE5SWCkKKwkJCSAqICYgaW5jcmVhc2UgVFggaW50ICYgZXh0IGJpYXMgMjAlLi4uLigweGU4NWMpICovCisJCQl3cml0ZWwoMHgwMDAwMDNENCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX2NoYW5uZWxfY29udHJvbCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoMHgwMDAwMDFFNywgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX2NoYW5uZWxfY29udHJvbCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJLyoKKwkJCSAqIFBvd2VyIHVwIFRYIGFuZCBSWCBvdXQgZnJvbSBwb3dlciBkb3duIChQV1JETlRYIGFuZCBQV1JETlJYKQorCQkJICogJiBpbmNyZWFzZSBUWCBpbnQgJiBleHQgYmlhcyAyMCUuLi4uKDB4ZTg1YykgKi8KKwkJCXdyaXRlbCgweDAwMDAwMUU0LCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfY2hhbm5lbF9jb250cm9sKTsKKwkJfQorCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQlpZiAoaXNfYTIocGRldikpIHsKKwkJCS8qIEVuYWJsZSBUWCBlcXVhbGl6YXRpb24gKDB4ZTgyNCkgKi8KKwkJCXdyaXRlbCgweDAwMDQwMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfY29udHJvbCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwkJfQorCisJCS8qCisJCSAqIFJEUEk9MHgwKFJYIFBvd2VyIE9uKSwgUlhPT0JERVRQRE5DPTB4MCwgVFBEPTB4MChUWCBQb3dlciBPbiksCisJCSAqIFJERD0weDAoUlggRGV0ZWN0IEVuYWJsZWQpIC4uLi4oMHhlODAwKSAqLworCQl3cml0ZWwoMHgwMDAwNDEwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3hjdnJfY29udHJvbDApOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkvKiBMZWF2ZSBERkUvRkZFIG9uICovCisJCWlmIChpc19hMihwZGV2KSkKKwkJCXdyaXRlbCgweDNGMTExMDNGLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfcnhfc3NjX2NvbnRyb2wwKTsKKwkJZWxzZSBpZiAoaXNfYjAocGRldikpIHsKKwkJCXdyaXRlbCgweDNGMTExMDNGLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfcnhfc3NjX2NvbnRyb2wwKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCQkJLyogRW5hYmxlIFRYIGVxdWFsaXphdGlvbiAoMHhlODI0KSAqLworCQkJd3JpdGVsKDB4MDAwNDAwMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9jb250cm9sKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlbCgweDAxNDBERjBGLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfcnhfc3NjX2NvbnRyb2wxKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCQl3cml0ZWwoMHgzRjZGMTAzRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3J4X3NzY19jb250cm9sMCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJLyogRW5hYmxlIFRYIGVxdWFsaXphdGlvbiAoMHhlODI0KSAqLworCQkJd3JpdGVsKDB4MDAwNDAwMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9jb250cm9sKTsKKwkJfQorCisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wwLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMCk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wxLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMSk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wyLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMik7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wzLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMyk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCX0KKworCS8qIFRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIFBFcyAqLworCXdyaXRlbCgweDAwMDEwZjAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfZGZ4X21hc3Rlcl9jb250cm9sMCk7CisJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfcG93ZXJfY29udHJvbChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzY2lfaW5pdF90aW1lcigmaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXIsIHBvd2VyX2NvbnRyb2xfdGltZW91dCk7CisKKwltZW1zZXQoaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVycywgMCwKKwkgICAgICAgc2l6ZW9mKGlob3N0LT5wb3dlcl9jb250cm9sLnJlcXVlc3RlcnMpKTsKKworCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZyA9IDA7CisJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyID0gMDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9pbml0aWFsaXplKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpaG9zdC0+c207CisJZW51bSBzY2lfc3RhdHVzIHJlc3VsdCA9IFNDSV9GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgaSwgc3RhdGUsIHZhbDsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX1JFU0VUKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICJTQ0lDIENvbnRyb2xsZXIgaW5pdGlhbGl6ZSBvcGVyYXRpb24gcmVxdWVzdGVkICIKKwkJCSAiaW4gaW52YWxpZCBzdGF0ZVxuIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSUNfSU5JVElBTElaSU5HKTsKKworCXNjaV9pbml0X3RpbWVyKCZpaG9zdC0+cGh5X3RpbWVyLCBwaHlfc3RhcnR1cF90aW1lb3V0KTsKKworCWlob3N0LT5uZXh0X3BoeV90b19zdGFydCA9IDA7CisJaWhvc3QtPnBoeV9zdGFydHVwX3RpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKworCXNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfcG93ZXJfY29udHJvbChpaG9zdCk7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSBmb3IgQjAgc2luY2Ugd2UgZG8gbm90IGhhdmUgdG8KKwkgKiBwcm9ncmFtIHRoZSBBRkUgcmVnaXN0ZXJzLgorCSAqIC8gQHRvZG8gVGhlIEFGRSBzZXR0aW5ncyBhcmUgc3VwcG9zZWQgdG8gYmUgY29ycmVjdCBmb3IgdGhlIEIwIGJ1dAorCSAqIC8gICAgICAgcHJlc2VudGx5IHRoZXkgc2VlbSB0byBiZSB3cm9uZy4gKi8KKwlzY2lfY29udHJvbGxlcl9hZmVfaW5pdGlhbGl6YXRpb24oaWhvc3QpOworCisKKwkvKiBUYWtlIHRoZSBoYXJkd2FyZSBvdXQgb2YgcmVzZXQgKi8KKwl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5zb2Z0X3Jlc2V0X2NvbnRyb2wpOworCisJLyoKKwkgKiAvIEB0b2RvIFByb3ZpZGUgbWVhbmluZ2Z1bGwgZXJyb3IgY29kZSBmb3IgaGFyZHdhcmUgZmFpbHVyZQorCSAqIHJlc3VsdCA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfSEFSRFdBUkU7ICovCisJZm9yIChpID0gMTAwOyBpID49IDE7IGktLSkgeworCQl1MzIgc3RhdHVzOworCisJCS8qIExvb3AgdW50aWwgdGhlIGhhcmR3YXJlIHJlcG9ydHMgc3VjY2VzcyAqLworCQl1ZGVsYXkoU0NVX0NPTlRFWFRfUkFNX0lOSVRfU1RBTExfVElNRSk7CisJCXN0YXR1cyA9IHJlYWRsKCZpaG9zdC0+c211X3JlZ2lzdGVycy0+Y29udHJvbF9zdGF0dXMpOworCisJCWlmICgoc3RhdHVzICYgU0NVX1JBTV9JTklUX0NPTVBMRVRFRCkgPT0gU0NVX1JBTV9JTklUX0NPTVBMRVRFRCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoYXQgYXJlIHRoZSBhY3RhdWwgZGV2aWNlIGNhcGFjaXRpZXMgdGhhdCB0aGUKKwkgKiBoYXJkd2FyZSB3aWxsIHN1cHBvcnQgKi8KKwl2YWwgPSByZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmRldmljZV9jb250ZXh0X2NhcGFjaXR5KTsKKworCS8qIFJlY29yZCB0aGUgc21hbGxlciBvZiB0aGUgdHdvIGNhcGFjaXR5IHZhbHVlcyAqLworCWlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllcyA9IG1pbihzbXVfbWF4X3BvcnRzKHZhbCksIFNDSV9NQVhfUE9SVFMpOworCWlob3N0LT50YXNrX2NvbnRleHRfZW50cmllcyA9IG1pbihzbXVfbWF4X3Rhc2tfY29udGV4dHModmFsKSwgU0NJX01BWF9JT19SRVFVRVNUUyk7CisJaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXMgPSBtaW4oc211X21heF9ybmNzKHZhbCksIFNDSV9NQVhfUkVNT1RFX0RFVklDRVMpOworCisJLyoKKwkgKiBNYWtlIGFsbCBQRXMgdGhhdCBhcmUgdW5hc3NpZ25lZCBtYXRjaCB1cCB3aXRoIHRoZQorCSAqIGxvZ2ljYWwgcG9ydHMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWhvc3QtPmxvZ2ljYWxfcG9ydF9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHNjdV9wb3J0X3Rhc2tfc2NoZWR1bGVyX2dyb3VwX3JlZ2lzdGVycyBfX2lvbWVtCisJCQkqcHRzZyA9ICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5wdHNnOworCisJCXdyaXRlbChpLCAmcHRzZy0+cHJvdG9jb2xfZW5naW5lW2ldKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIFBDSSBSZWxheGVkIG9yZGVyaW5nIGluIERNQSBlbmdpbmVzICovCisJdmFsID0gcmVhZGwoJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnBkbWFfY29uZmlndXJhdGlvbik7CisJdmFsIHw9IFNDVV9QRE1BQ1JfR0VOX0JJVChQQ0lfUkVMQVhFRF9PUkRFUklOR19FTkFCTEUpOworCXdyaXRlbCh2YWwsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS5wZG1hX2NvbmZpZ3VyYXRpb24pOworCisJdmFsID0gcmVhZGwoJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLmNkbWFfY29uZmlndXJhdGlvbik7CisJdmFsIHw9IFNDVV9DRE1BQ1JfR0VOX0JJVChQQ0lfUkVMQVhFRF9PUkRFUklOR19FTkFCTEUpOworCXdyaXRlbCh2YWwsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS5jZG1hX2NvbmZpZ3VyYXRpb24pOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBQSFlzIGJlZm9yZSB0aGUgUE9SVHMgYmVjYXVzZSB0aGUgUEhZIHJlZ2lzdGVycworCSAqIGFyZSBhY2Nlc3NlZCBkdXJpbmcgdGhlIHBvcnQgaW5pdGlhbGl6YXRpb24uCisJICovCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKSB7CisJCXJlc3VsdCA9IHNjaV9waHlfaW5pdGlhbGl6ZSgmaWhvc3QtPnBoeXNbaV0sCisJCQkJCSAgICAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucGVbaV0udGwsCisJCQkJCSAgICAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucGVbaV0ubGwpOworCQlpZiAocmVzdWx0ICE9IFNDSV9TVUNDRVNTKQorCQkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gJmlob3N0LT5wb3J0c1tpXTsKKworCQlpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMgPSAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucHRzZy5wb3J0W2ldOworCQlpcG9ydC0+cG9ydF9wZV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyID0gJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnB0c2cucHJvdG9jb2xfZW5naW5lWzBdOworCQlpcG9ydC0+dmlpdF9yZWdpc3RlcnMgPSAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAudmlpdFtpXTsKKwl9CisKKwlyZXN1bHQgPSBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2luaXRpYWxpemUoaWhvc3QsICZpaG9zdC0+cG9ydF9hZ2VudCk7CisKKyBvdXQ6CisJLyogQWR2YW5jZSB0aGUgY29udHJvbGxlciBzdGF0ZSBtYWNoaW5lICovCisJaWYgKHJlc3VsdCA9PSBTQ0lfU1VDQ0VTUykKKwkJc3RhdGUgPSBTQ0lDX0lOSVRJQUxJWkVEOworCWVsc2UKKwkJc3RhdGUgPSBTQ0lDX0ZBSUxFRDsKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV91c2VyX3BhcmFtZXRlcnNfc2V0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICAgc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgKnNjaV9wYXJtcykKK3sKKwl1MzIgc3RhdGUgPSBpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChzdGF0ZSA9PSBTQ0lDX1JFU0VUIHx8CisJICAgIHN0YXRlID09IFNDSUNfSU5JVElBTElaSU5HIHx8CisJICAgIHN0YXRlID09IFNDSUNfSU5JVElBTElaRUQpIHsKKwkJdTE2IGluZGV4OworCisJCS8qCisJCSAqIFZhbGlkYXRlIHRoZSB1c2VyIHBhcmFtZXRlcnMuICBJZiB0aGV5IGFyZSBub3QgbGVnYWwsIHRoZW4KKwkJICogcmV0dXJuIGEgZmFpbHVyZS4KKwkJICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQkJc3RydWN0IHNjaV9waHlfdXNlcl9wYXJhbXMgKnVzZXJfcGh5OworCisJCQl1c2VyX3BoeSA9ICZzY2lfcGFybXMtPnBoeXNbaW5kZXhdOworCisJCQlpZiAoISgodXNlcl9waHktPm1heF9zcGVlZF9nZW5lcmF0aW9uIDw9CisJCQkJCQlTQ0lDX1NEU19QQVJNX01BWF9TUEVFRCkgJiYKKwkJCSAgICAgICh1c2VyX3BoeS0+bWF4X3NwZWVkX2dlbmVyYXRpb24gPgorCQkJCQkJU0NJQ19TRFNfUEFSTV9OT19TUEVFRCkpKQorCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQkJaWYgKHVzZXJfcGh5LT5pbl9jb25uZWN0aW9uX2FsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPAorCQkJCQkzKQorCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQkJaWYgKCh1c2VyX3BoeS0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5IDwKKwkJCQkJCTMpIHx8CisJCQkgICAgKHVzZXJfcGh5LT5hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5ID09IDApIHx8CisJCQkgICAgKHVzZXJfcGh5LT4KKwkJCQlub3RpZnlfZW5hYmxlX3NwaW5fdXBfaW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9PQorCQkJCQkJMCkpCisJCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworCQl9CisKKwkJaWYgKChzY2lfcGFybXMtPnN0cF9pbmFjdGl2aXR5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPnN0cF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPnNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPm5vX291dGJvdW5kX3Rhc2tfdGltZW91dCA9PSAwKSkKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQltZW1jcHkoJmlob3N0LT51c2VyX3BhcmFtZXRlcnMsIHNjaV9wYXJtcywgc2l6ZW9mKCpzY2lfcGFybXMpKTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK3N0YXRpYyBpbnQgc2NpX2NvbnRyb2xsZXJfbWVtX2luaXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlob3N0LT5wZGV2LT5kZXY7CisJZG1hX2FkZHJfdCBkbWE7CisJc2l6ZV90IHNpemU7CisJaW50IGVycjsKKworCXNpemUgPSBTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUyAqIHNpemVvZih1MzIpOworCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlID0gZG1hbV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICZkbWEsIEdGUF9LRVJORUwpOworCWlmICghaWhvc3QtPmNvbXBsZXRpb25fcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoZG1hKSwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX2xvd2VyKTsKKwl3cml0ZWwodXBwZXJfMzJfYml0cyhkbWEpLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfdXBwZXIpOworCisJc2l6ZSA9IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzICogc2l6ZW9mKHVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0KTsKKwlpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAmZG1hLAorCQkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWlob3N0LT5yZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGRtYSksICZpaG9zdC0+c211X3JlZ2lzdGVycy0+cmVtb3RlX25vZGVfY29udGV4dF9sb3dlcik7CisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoZG1hKSwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5yZW1vdGVfbm9kZV9jb250ZXh0X3VwcGVyKTsKKworCXNpemUgPSBpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQpLAorCWlob3N0LT50YXNrX2NvbnRleHRfdGFibGUgPSBkbWFtX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlob3N0LT50YXNrX2NvbnRleHRfZG1hID0gZG1hOworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGRtYSksICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aG9zdF90YXNrX3RhYmxlX2xvd2VyKTsKKwl3cml0ZWwodXBwZXJfMzJfYml0cyhkbWEpLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmhvc3RfdGFza190YWJsZV91cHBlcik7CisKKwllcnIgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9jb25zdHJ1Y3QoaWhvc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIEluZm9ybSB0aGUgc2lsaWNvbiBhcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIFVGIGhlYWRlcnMgYW5kCisJICogYWRkcmVzcyB0YWJsZS4KKwkgKi8KKwl3cml0ZWwobG93ZXJfMzJfYml0cyhpaG9zdC0+dWZfY29udHJvbC5oZWFkZXJzLnBoeXNpY2FsX2FkZHJlc3MpLAorCQkmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudWZfaGVhZGVyX2Jhc2VfYWRkcmVzc19sb3dlcik7CisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoaWhvc3QtPnVmX2NvbnRyb2wuaGVhZGVycy5waHlzaWNhbF9hZGRyZXNzKSwKKwkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVmX2hlYWRlcl9iYXNlX2FkZHJlc3NfdXBwZXIpOworCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoaWhvc3QtPnVmX2NvbnRyb2wuYWRkcmVzc190YWJsZS5waHlzaWNhbF9hZGRyZXNzKSwKKwkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVmX2FkZHJlc3NfdGFibGVfbG93ZXIpOworCXdyaXRlbCh1cHBlcl8zMl9iaXRzKGlob3N0LT51Zl9jb250cm9sLmFkZHJlc3NfdGFibGUucGh5c2ljYWxfYWRkcmVzcyksCisJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51Zl9hZGRyZXNzX3RhYmxlX3VwcGVyKTsKKworCXJldHVybiAwOworfQorCitpbnQgaXNjaV9ob3N0X2luaXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJaW50IGVyciA9IDAsIGk7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgc2NpX3VzZXJfcGFyYW1ldGVycyBzY2lfdXNlcl9wYXJhbXM7CisJc3RydWN0IGlzY2lfcGNpX2luZm8gKnBjaV9pbmZvID0gdG9fcGNpX2luZm8oaWhvc3QtPnBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmlob3N0LT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWhvc3QtPnNjaWNfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaWhvc3QtPmV2ZW50cSk7CisKKwlpc2NpX2hvc3RfY2hhbmdlX3N0YXRlKGlob3N0LCBpc2NpX3N0YXJ0aW5nKTsKKworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2NvbnN0cnVjdChpaG9zdCwgc2N1X2Jhc2UoaWhvc3QpLAorCQkJCQkgIHNtdV9iYXNlKGlob3N0KSk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHNjaV9jb250cm9sbGVyX2NvbnN0cnVjdCBmYWlsZWQgLSBzdGF0dXMgPSAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWhvc3QtPnNhc19oYS5kZXYgPSAmaWhvc3QtPnBkZXYtPmRldjsKKwlpaG9zdC0+c2FzX2hhLmxsZGRfaGEgPSBpaG9zdDsKKworCS8qCisJICogZ3JhYiBpbml0aWFsIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGNvbnRyb2xsZXIgb2JqZWN0IGZvciBPRU0gYW5kIFVTRVIKKwkgKiBwYXJhbWV0ZXJzCisJICovCisJaXNjaV91c2VyX3BhcmFtZXRlcnNfZ2V0KCZzY2lfdXNlcl9wYXJhbXMpOworCXN0YXR1cyA9IHNjaV91c2VyX3BhcmFtZXRlcnNfc2V0KGlob3N0LCAmc2NpX3VzZXJfcGFyYW1zKTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogc2NpX3VzZXJfcGFyYW1ldGVyc19zZXQgZmFpbGVkXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZ3JhYiBhbnkgT0VNIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIG9yb20gKi8KKwlpZiAocGNpX2luZm8tPm9yb20pIHsKKwkJc3RhdHVzID0gaXNjaV9wYXJzZV9vZW1fcGFyYW1ldGVycygmaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLAorCQkJCQkJICAgcGNpX2luZm8tPm9yb20sCisJCQkJCQkgICBpaG9zdC0+aWQpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgInBhcnNpbmcgZmlybXdhcmUgb2VtIHBhcmFtZXRlcnMgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJc3RhdHVzID0gc2NpX29lbV9wYXJhbWV0ZXJzX3NldChpaG9zdCk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHNjaV9vZW1fcGFyYW1ldGVyc19zZXQgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdGFza2xldF9pbml0KCZpaG9zdC0+Y29tcGxldGlvbl90YXNrbGV0LAorCQkgICAgIGlzY2lfaG9zdF9jb21wbGV0aW9uX3JvdXRpbmUsICh1bnNpZ25lZCBsb25nKWlob3N0KTsKKworCUlOSVRfTElTVF9IRUFEKCZpaG9zdC0+cmVxdWVzdHNfdG9fY29tcGxldGUpOworCUlOSVRfTElTVF9IRUFEKCZpaG9zdC0+cmVxdWVzdHNfdG9fZXJyb3JiYWNrKTsKKworCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2luaXRpYWxpemUoaWhvc3QpOworCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV9jb250cm9sbGVyX2luaXRpYWxpemUgZmFpbGVkIC0iCisJCQkgIiBzdGF0dXMgPSAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSBzY2lfY29udHJvbGxlcl9tZW1faW5pdChpaG9zdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BPUlRTOyBpKyspCisJCWlzY2lfcG9ydF9pbml0KCZpaG9zdC0+cG9ydHNbaV0sIGlob3N0LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykKKwkJaXNjaV9waHlfaW5pdCgmaWhvc3QtPnBoeXNbaV0sIGlob3N0LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9ICZpaG9zdC0+ZGV2aWNlc1tpXTsKKworCQlJTklUX0xJU1RfSEVBRCgmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlkZXYtPm5vZGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX0lPX1JFUVVFU1RTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwkJZG1hX2FkZHJfdCBkbWE7CisKKwkJaXJlcSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXNjaV9yZXF1ZXN0KSwgJmRtYSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaXJlcSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlyZXEtPnRjID0gJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbaV07CisJCWlyZXEtPm93bmluZ19jb250cm9sbGVyID0gaWhvc3Q7CisJCXNwaW5fbG9ja19pbml0KCZpcmVxLT5zdGF0ZV9sb2NrKTsKKwkJaXJlcS0+cmVxdWVzdF9kYWRkciA9IGRtYTsKKwkJaXJlcS0+aXNjaV9ob3N0ID0gaWhvc3Q7CisJCWlob3N0LT5yZXFzW2ldID0gaXJlcTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9saW5rX3VwKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCSAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3dpdGNoIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCkgeworCWNhc2UgU0NJQ19TVEFSVElORzoKKwkJc2NpX2RlbF90aW1lcigmaWhvc3QtPnBoeV90aW1lcik7CisJCWlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJCWlob3N0LT5wb3J0X2FnZW50LmxpbmtfdXBfaGFuZGxlcihpaG9zdCwgJmlob3N0LT5wb3J0X2FnZW50LAorCQkJCQkJICBpcG9ydCwgaXBoeSk7CisJCXNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KGlob3N0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lDX1JFQURZOgorCQlpaG9zdC0+cG9ydF9hZ2VudC5saW5rX3VwX2hhbmRsZXIoaWhvc3QsICZpaG9zdC0+cG9ydF9hZ2VudCwKKwkJCQkJCSAgaXBvcnQsIGlwaHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgbGlua3VwIGV2ZW50IGZyb20gcGh5ICVkIGluICIKKwkJCSJ1bmV4cGVjdGVkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgaXBoeS0+cGh5X2luZGV4LAorCQkJaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpOworCX0KK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9saW5rX2Rvd24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXN3aXRjaCAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpIHsKKwljYXNlIFNDSUNfU1RBUlRJTkc6CisJY2FzZSBTQ0lDX1JFQURZOgorCQlpaG9zdC0+cG9ydF9hZ2VudC5saW5rX2Rvd25faGFuZGxlcihpaG9zdCwgJmlob3N0LT5wb3J0X2FnZW50LAorCQkJCQkJICAgaXBvcnQsIGlwaHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgbGlua2Rvd24gZXZlbnQgZnJvbSBwaHkgJWQgaW4gIgorCQkJInVuZXhwZWN0ZWQgc3RhdGUgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlwaHktPnBoeV9pbmRleCwKKwkJCWlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHNjaV9jb250cm9sbGVyX2hhc19yZW1vdGVfZGV2aWNlc19zdG9wcGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllczsgaW5kZXgrKykgeworCQlpZiAoKGlob3N0LT5kZXZpY2VfdGFibGVbaW5kZXhdICE9IE5VTEwpICYmCisJCSAgIChpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XS0+c20uY3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lfREVWX1NUT1BQSU5HKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9yZW1vdGVfZGV2aWNlX3N0b3BwZWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19TVE9QUElORykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIlNDSUMgQ29udHJvbGxlciAweCVwIHJlbW90ZSBkZXZpY2Ugc3RvcHBlZCBldmVudCAiCisJCQkiZnJvbSBkZXZpY2UgMHglcCBpbiB1bmV4cGVjdGVkIHN0YXRlICVkXG4iLAorCQkJaWhvc3QsIGlkZXYsCisJCQlpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXNjaV9jb250cm9sbGVyX2hhc19yZW1vdGVfZGV2aWNlc19zdG9wcGluZyhpaG9zdCkpCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19TVE9QUEVEKTsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUzMiByZXF1ZXN0KQoreworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlc1slZF06ICUjeFxuIiwKKwkJX19mdW5jX18sIGlob3N0LT5pZCwgcmVxdWVzdCk7CisKKwl3cml0ZWwocmVxdWVzdCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5wb3N0X2NvbnRleHRfcG9ydCk7Cit9CisKK3N0cnVjdCBpc2NpX3JlcXVlc3QgKnNjaV9yZXF1ZXN0X2J5X3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IGlvX3RhZykKK3sKKwl1MTYgdGFza19pbmRleDsKKwl1MTYgdGFza19zZXF1ZW5jZTsKKworCXRhc2tfaW5kZXggPSBJU0NJX1RBR19UQ0koaW9fdGFnKTsKKworCWlmICh0YXNrX2luZGV4IDwgaWhvc3QtPnRhc2tfY29udGV4dF9lbnRyaWVzKSB7CisJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBpaG9zdC0+cmVxc1t0YXNrX2luZGV4XTsKKworCQlpZiAodGVzdF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncykpIHsKKwkJCXRhc2tfc2VxdWVuY2UgPSBJU0NJX1RBR19TRVEoaW9fdGFnKTsKKworCQkJaWYgKHRhc2tfc2VxdWVuY2UgPT0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGFza19pbmRleF0pCisJCQkJcmV0dXJuIGlyZXE7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCBhbGxvY2F0ZXMgcmVtb3RlIG5vZGUgaW5kZXggYW5kIHRoZSByZXNlcnZlcyB0aGUgcmVtb3RlIG5vZGUKKyAqICAgIGNvbnRleHQgc3BhY2UgZm9yIHVzZS4gVGhpcyBtZXRob2QgY2FuIGZhaWwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcmVtb3RlCisgKiAgICBub2RlIGluZGV4IGF2YWlsYWJsZS4KKyAqIEBzY2ljOiBUaGlzIGlzIHRoZSBjb250cm9sbGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgc2V0IG9mCisgKiAgICBmcmVlIHJlbW90ZSBub2RlIGlkcworICogQHNjaV9kZXY6IFRoaXMgaXMgdGhlIGRldmljZSBvYmplY3Qgd2hpY2ggaXMgcmVxdWVzdGluZyB0aGUgYSByZW1vdGUgbm9kZQorICogICAgaWQKKyAqIEBub2RlX2lkOiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSBpZCB0aGF0IGlzIGFzc2luZ2VkIHRvIHRoZSBkZXZpY2UgaWYgb25lCisgKiAgICBpcyBhdmFpbGFibGUKKyAqCisgKiBlbnVtIHNjaV9zdGF0dXMgU0NJX0ZBSUxVUkVfT1VUX09GX1JFU09VUkNFUyBpZiB0aGVyZSBhcmUgbm8gYXZhaWxhYmxlIHJlbW90ZQorICogbm9kZSBpbmRleCBhdmFpbGFibGUuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9hbGxvY2F0ZV9yZW1vdGVfbm9kZV9jb250ZXh0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJCSAgICB1MTYgKm5vZGVfaWQpCit7CisJdTE2IG5vZGVfaW5kZXg7CisJdTMyIHJlbW90ZV9ub2RlX2NvdW50ID0gc2NpX3JlbW90ZV9kZXZpY2Vfbm9kZV9jb3VudChpZGV2KTsKKworCW5vZGVfaW5kZXggPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfcmVtb3RlX25vZGUoCisJCSZpaG9zdC0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywgcmVtb3RlX25vZGVfY291bnQKKwkJKTsKKworCWlmIChub2RlX2luZGV4ICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkgeworCQlpaG9zdC0+ZGV2aWNlX3RhYmxlW25vZGVfaW5kZXhdID0gaWRldjsKKworCQkqbm9kZV9pZCA9IG5vZGVfaW5kZXg7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTOworfQorCit2b2lkIHNjaV9jb250cm9sbGVyX2ZyZWVfcmVtb3RlX25vZGVfY29udGV4dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICAgIHUxNiBub2RlX2lkKQoreworCXUzMiByZW1vdGVfbm9kZV9jb3VudCA9IHNjaV9yZW1vdGVfZGV2aWNlX25vZGVfY291bnQoaWRldik7CisKKwlpZiAoaWhvc3QtPmRldmljZV90YWJsZVtub2RlX2lkXSA9PSBpZGV2KSB7CisJCWlob3N0LT5kZXZpY2VfdGFibGVbbm9kZV9pZF0gPSBOVUxMOworCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3JlbW90ZV9ub2RlX2luZGV4KAorCQkJJmlob3N0LT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLCByZW1vdGVfbm9kZV9jb3VudCwgbm9kZV9pZAorCQkJKTsKKwl9Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKHZvaWQgKnJlc3BvbnNlX2J1ZmZlciwKKwkJCQkgICAgICAgdm9pZCAqZnJhbWVfaGVhZGVyLAorCQkJCSAgICAgICB2b2lkICpmcmFtZV9idWZmZXIpCit7CisJLyogWFhYIHR5cGUgc2FmZXR5PyAqLworCW1lbWNweShyZXNwb25zZV9idWZmZXIsIGZyYW1lX2hlYWRlciwgc2l6ZW9mKHUzMikpOworCisJbWVtY3B5KHJlc3BvbnNlX2J1ZmZlciArIHNpemVvZih1MzIpLAorCSAgICAgICBmcmFtZV9idWZmZXIsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKSAtIHNpemVvZih1MzIpKTsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZnJhbWVfaW5kZXgpCit7CisJaWYgKHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX3JlbGVhc2VfZnJhbWUoJmlob3N0LT51Zl9jb250cm9sLCBmcmFtZV9pbmRleCkpCisJCXdyaXRlbChpaG9zdC0+dWZfY29udHJvbC5nZXQsCisJCQkmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudW5zb2xpY2l0ZWRfZnJhbWVfZ2V0X3BvaW50ZXIpOworfQorCit2b2lkIGlzY2lfdGNpX2ZyZWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiB0Y2kpCit7CisJdTE2IHRhaWwgPSBpaG9zdC0+dGNpX3RhaWwgJiAoU0NJX01BWF9JT19SRVFVRVNUUy0xKTsKKworCWlob3N0LT50Y2lfcG9vbFt0YWlsXSA9IHRjaTsKKwlpaG9zdC0+dGNpX3RhaWwgPSB0YWlsICsgMTsKK30KKworc3RhdGljIHUxNiBpc2NpX3RjaV9hbGxvYyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MTYgaGVhZCA9IGlob3N0LT50Y2lfaGVhZCAmIChTQ0lfTUFYX0lPX1JFUVVFU1RTLTEpOworCXUxNiB0Y2kgPSBpaG9zdC0+dGNpX3Bvb2xbaGVhZF07CisKKwlpaG9zdC0+dGNpX2hlYWQgPSBoZWFkICsgMTsKKwlyZXR1cm4gdGNpOworfQorCitzdGF0aWMgdTE2IGlzY2lfdGNpX3NwYWNlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXJldHVybiBDSVJDX1NQQUNFKGlob3N0LT50Y2lfaGVhZCwgaWhvc3QtPnRjaV90YWlsLCBTQ0lfTUFYX0lPX1JFUVVFU1RTKTsKK30KKwordTE2IGlzY2lfYWxsb2NfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCWlmIChpc2NpX3RjaV9zcGFjZShpaG9zdCkpIHsKKwkJdTE2IHRjaSA9IGlzY2lfdGNpX2FsbG9jKGlob3N0KTsKKwkJdTggc2VxID0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGNpXTsKKworCQlyZXR1cm4gSVNDSV9UQUcoc2VxLCB0Y2kpOworCX0KKworCXJldHVybiBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRzsKK30KKworZW51bSBzY2lfc3RhdHVzIGlzY2lfZnJlZV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiBpb190YWcpCit7CisJdTE2IHRjaSA9IElTQ0lfVEFHX1RDSShpb190YWcpOworCXUxNiBzZXEgPSBJU0NJX1RBR19TRVEoaW9fdGFnKTsKKworCS8qIHByZXZlbnQgdGFpbCBmcm9tIHBhc3NpbmcgaGVhZCAqLworCWlmIChpc2NpX3RjaV9hY3RpdmUoaWhvc3QpID09IDApCisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX0lPX1RBRzsKKworCWlmIChzZXEgPT0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGNpXSkgeworCQlpaG9zdC0+aW9fcmVxdWVzdF9zZXF1ZW5jZVt0Y2ldID0gKHNlcSsxKSAmIChTQ0lfTUFYX1NFUS0xKTsKKworCQlpc2NpX3RjaV9mcmVlKGlob3N0LCB0Y2kpOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfSU9fVEFHOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RhcnRfaW8oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX1JFQURZKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiaW52YWxpZCBzdGF0ZSB0byBzdGFydCBJL08iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfaW8oaWhvc3QsIGlkZXYsIGlyZXEpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlzZXRfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpOworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgaXJlcS0+cG9zdF9jb250ZXh0KTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJLyogdGVybWluYXRlIGFuIG9uZ29pbmcgKGkuZS4gc3RhcnRlZCkgY29yZSBJTyByZXF1ZXN0LiAgVGhpcyBkb2VzIG5vdAorCSAqIGFib3J0IHRoZSBJTyByZXF1ZXN0IGF0IHRoZSB0YXJnZXQsIGJ1dCByYXRoZXIgcmVtb3ZlcyB0aGUgSU8KKwkgKiByZXF1ZXN0IGZyb20gdGhlIGhvc3QgY29udHJvbGxlci4KKwkgKi8KKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgImludmFsaWQgc3RhdGUgdG8gdGVybWluYXRlIHJlcXVlc3RcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF90ZXJtaW5hdGUoaXJlcSk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qCisJICogVXRpbGl6ZSB0aGUgb3JpZ2luYWwgcG9zdCBjb250ZXh0IGNvbW1hbmQgYW5kIG9yIGluIHRoZSBQT1NUX1RDX0FCT1JUCisJICogcmVxdWVzdCBzdWItdHlwZS4KKwkgKi8KKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsCisJCQkJICAgIGlyZXEtPnBvc3RfY29udGV4dCB8IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9QT1NUX1RDX0FCT1JUKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oKSAtIFRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSBjb3JlIHNwZWNpZmljCisgKiAgICBjb21wbGV0aW9uIG9wZXJhdGlvbnMgZm9yIGFuIElPIHJlcXVlc3QuICBBZnRlciB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLAorICogICAgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHRoZSBJTyByZXF1ZXN0IGFzIGludmFsaWQgdW50aWwgaXQgaXMgcHJvcGVybHkKKyAqICAgIHJldXNlZCAoaS5lLiByZS1jb25zdHJ1Y3RlZCkuCisgKiBAaWhvc3Q6IFRoZSBoYW5kbGUgdG8gdGhlIGNvbnRyb2xsZXIgb2JqZWN0IGZvciB3aGljaCB0byBjb21wbGV0ZSB0aGUKKyAqICAgIElPIHJlcXVlc3QuCisgKiBAaWRldjogVGhlIGhhbmRsZSB0byB0aGUgcmVtb3RlIGRldmljZSBvYmplY3QgZm9yIHdoaWNoIHRvIGNvbXBsZXRlCisgKiAgICB0aGUgSU8gcmVxdWVzdC4KKyAqIEBpcmVxOiB0aGUgaGFuZGxlIHRvIHRoZSBpbyByZXF1ZXN0IG9iamVjdCB0byBjb21wbGV0ZS4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdTE2IGluZGV4OworCisJc3dpdGNoIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCkgeworCWNhc2UgU0NJQ19TVE9QUElORzoKKwkJLyogWFhYOiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiAqLworCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJY2FzZSBTQ0lDX1JFQURZOgorCQlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9jb21wbGV0ZV9pbyhpaG9zdCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWluZGV4ID0gSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZyk7CisJCWNsZWFyX2JpdChJUkVRX0FDVElWRSwgJmlyZXEtPmZsYWdzKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiaW52YWxpZCBzdGF0ZSB0byBjb21wbGV0ZSBJL08iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19SRUFEWSkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgImludmFsaWQgc3RhdGUgdG8gY29udGludWUgSS9PIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNldF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisJc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KGlob3N0LCBpcmVxLT5wb3N0X2NvbnRleHQpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKCkgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFNDSUMgdXNlciB0bworICogICAgc2VuZC9zdGFydCBhIGZyYW1ld29yayB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdC4KKyAqIEBjb250cm9sbGVyOiB0aGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCBmb3Igd2hpY2ggdG8gc3RhcnQgdGhlIHRhc2sKKyAqICAgIG1hbmFnZW1lbnQgcmVxdWVzdC4KKyAqIEByZW1vdGVfZGV2aWNlOiB0aGUgaGFuZGxlIHRvIHRoZSByZW1vdGUgZGV2aWNlIG9iamVjdCBmb3Igd2hpY2ggdG8gc3RhcnQKKyAqICAgIHRoZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdC4KKyAqIEB0YXNrX3JlcXVlc3Q6IHRoZSBoYW5kbGUgdG8gdGhlIHRhc2sgcmVxdWVzdCBvYmplY3QgdG8gc3RhcnQuCisgKi8KK2VudW0gc2NpX3Rhc2tfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X3Rhc2soc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBTQ0lDIENvbnRyb2xsZXIgc3RhcnRpbmcgdGFzayBmcm9tIGludmFsaWQgIgorCQkJICJzdGF0ZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBTQ0lfVEFTS19GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfdGFzayhpaG9zdCwgaWRldiwgaXJlcSk7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIFNDSV9GQUlMVVJFX1JFU0VUX0RFVklDRV9QQVJUSUFMX1NVQ0NFU1M6CisJCXNldF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisKKwkJLyoKKwkJICogV2Ugd2lsbCBsZXQgZnJhbWV3b3JrIGtub3cgdGhpcyB0YXNrIHJlcXVlc3Qgc3RhcnRlZCBzdWNjZXNzZnVsbHksCisJCSAqIGFsdGhvdWdoIGNvcmUgaXMgc3RpbGwgd29yaW5nIG9uIHN0YXJ0aW5nIHRoZSByZXF1ZXN0ICh0byBwb3N0IHRjIHdoZW4KKwkJICogUk5DIGlzIHJlc3VtZWQuKQorCQkgKi8KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1NVQ0NFU1M6CisJCXNldF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisJCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgaXJlcS0+cG9zdF9jb250ZXh0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjIxMDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5oCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfU0NJX0hPU1RfSF8KKyNkZWZpbmUgX1NDSV9IT1NUX0hfCisKKyNpbmNsdWRlICJyZW1vdGVfZGV2aWNlLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInJlbW90ZV9ub2RlX3RhYmxlLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAidW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5oIgorI2luY2x1ZGUgInByb2JlX3JvbXMuaCIKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKK3N0cnVjdCBzY3VfdGFza19jb250ZXh0OworCisKKy8qKgorICogc3RydWN0IHNjaV9wb3dlcl9jb250cm9sIC0KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmaWVsZHMgZm9yIG1hbmFnaW5nIHBvd2VyIGNvbnRyb2wgZm9yIGRpcmVjdAorICogYXR0YWNoZWQgZGlzayBkZXZpY2VzLgorICovCitzdHJ1Y3Qgc2NpX3Bvd2VyX2NvbnRyb2wgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHdoZW4gdGhlIHBvd2VyIGNvbnRyb2wgdGltZXIgaXMgcnVubmluZyBhbmQgY2xlYXJlZCB3aGVuCisJICogaXQgaXMgbm90LgorCSAqLworCWJvb2wgdGltZXJfc3RhcnRlZDsKKworCS8qKgorCSAqIFRpbWVyIHRvIGNvbnRyb2wgd2hlbiB0aGUgZGlyZWN0ZWQgYXR0YWNoZWQgZGlza3MgY2FuIGNvbnN1bWUgcG93ZXIuCisJICovCisJc3RydWN0IHNjaV90aW1lciB0aW1lcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHBoeXMgYXJlIHB1dCBpbnRvIHRoZQorCSAqIHJlcXVlc3RlcnMgZmllbGQuCisJICovCisJdTggcGh5c193YWl0aW5nOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgcGh5cyBoYXZlIGJlZW4gZ3JhbnRlZCB0byBjb25zdW1lIHBvd2VyCisJICovCisJdTggcGh5c19ncmFudGVkX3Bvd2VyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBhbiBhcnJheSBvZiBwaHlzIHRoYXQgd2UgYXJlIHdhaXRpbmcgb24uIFRoZSBwaHlzIGFyZSBkaXJlY3QKKwkgKiBtYXBwZWQgaW50byByZXF1ZXN0ZXJzIHZpYSBzdHJ1Y3Qgc2NpX3BoeS5waHlfaW5kZXgKKwkgKi8KKwlzdHJ1Y3QgaXNjaV9waHkgKnJlcXVlc3RlcnNbU0NJX01BWF9QSFlTXTsKKworfTsKKworc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQ7Cit0eXBlZGVmIHZvaWQgKCpwb3J0X2NvbmZpZ19mbikoc3RydWN0IGlzY2lfaG9zdCAqLAorCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICosCisJCQkgICAgICAgc3RydWN0IGlzY2lfcG9ydCAqLCBzdHJ1Y3QgaXNjaV9waHkgKik7CisKK3N0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50IHsKKwl1MTYgcGh5X2NvbmZpZ3VyZWRfbWFzazsKKwl1MTYgcGh5X3JlYWR5X21hc2s7CisJc3RydWN0IHsKKwkJdTggbWluX2luZGV4OworCQl1OCBtYXhfaW5kZXg7CisJfSBwaHlfdmFsaWRfcG9ydF9yYW5nZVtTQ0lfTUFYX1BIWVNdOworCWJvb2wgdGltZXJfcGVuZGluZzsKKwlwb3J0X2NvbmZpZ19mbiBsaW5rX3VwX2hhbmRsZXI7CisJcG9ydF9jb25maWdfZm4gbGlua19kb3duX2hhbmRsZXI7CisJc3RydWN0IHNjaV90aW1lcgl0aW1lcjsKK307CisKKy8qKgorICogaXNjaV9ob3N0IC0gcHJpbWFyeSBob3N0L2NvbnRyb2xsZXIgb2JqZWN0CisgKiBAdGltZXI6IHRpbWVvdXQgc3RhcnQvc3RvcCBvcGVyYXRpb25zCisgKiBAZGV2aWNlX3RhYmxlOiBybmkgKGh3IHJlbW90ZSBub2RlIGluZGV4KSB0byByZW1vdGUgZGV2aWNlIGxvb2t1cCB0YWJsZQorICogQGF2YWlsYWJsZV9yZW1vdGVfbm9kZXM6IHJuaSBhbGxvY2F0b3IKKyAqIEBwb3dlcl9jb250cm9sOiBtYW5hZ2UgZGV2aWNlIHNwaW4gdXAKKyAqIEBpb19yZXF1ZXN0X3NlcXVlbmNlOiBnZW5lcmF0aW9uIG51bWJlciBmb3IgdGNpJ3MgKHRhc2sgY29udGV4dHMpCisgKiBAdGFza19jb250ZXh0X3RhYmxlOiBodyB0YXNrIGNvbnRleHQgdGFibGUKKyAqIEByZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlOiBodyByZW1vdGUgbm9kZSBjb250ZXh0IHRhYmxlCisgKiBAY29tcGxldGlvbl9xdWV1ZTogaHctcHJvZHVjZXIgZHJpdmVyLWNvbnN1bWVyIGNvbW11bmljYXRpb24gcmluZworICogQGNvbXBsZXRpb25fcXVldWVfZ2V0OiB0cmFja3MgdGhlIGRyaXZlciAnaGVhZCcgb2YgdGhlIHJpbmcgdG8gbm90aWZ5IGh3CisgKiBAbG9naWNhbF9wb3J0X2VudHJpZXM6IG1pbih7ZHJpdmVyfHNpbGljb259LXN1cHBvcnRlZC1wb3J0LWNvdW50KQorICogQHJlbW90ZV9ub2RlX2VudHJpZXM6IG1pbih7ZHJpdmVyfHNpbGljb259LXN1cHBvcnRlZC1ub2RlLWNvdW50KQorICogQHRhc2tfY29udGV4dF9lbnRyaWVzOiBtaW4oe2RyaXZlcnxzaWxpY29ufS1zdXBwb3J0ZWQtdGFzay1jb3VudCkKKyAqIEBwaHlfdGltZXI6IHBoeSBzdGFydHVwIHRpbWVyCisgKiBAaW52YWxpZF9waHlfbWFzazogaWYgYW4gaW52YWxpZF9saW5rX3VwIG5vdGlmaWNhdGlvbiBpcyByZXBvcnRlZCBhIGJpdCBmb3IKKyAqIAkJICAgICAgdGhlIHBoeSBpbmRleCBpcyBzZXQgc28gZnVydGhlciBub3RpZmljYXRpb25zIGFyZSBub3QKKyAqIAkJICAgICAgbWFkZS4gIE9uY2UgdGhlIHBoeSByZXBvcnRzIGxpbmsgdXAgYW5kIGlzIG1hZGUgcGFydCBvZiBhCisgKiAJCSAgICAgIHBvcnQgdGhlbiB0aGlzIGJpdCBpcyBjbGVhcmVkLgorCisgKi8KK3N0cnVjdCBpc2NpX2hvc3QgeworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lIHNtOworCS8qIFhYWCBjYW4gd2UgdGltZSB0aGlzIGV4dGVybmFsbHkgKi8KKwlzdHJ1Y3Qgc2NpX3RpbWVyIHRpbWVyOworCS8qIFhYWCBkcm9wIHJlZmVyZW5jZSBtb2R1bGUgcGFyYW1zIGRpcmVjdGx5ICovCisJc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgdXNlcl9wYXJhbWV0ZXJzOworCS8qIFhYWCBubyBuZWVkIHRvIGJlIGEgdW5pb24gKi8KKwlzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgb2VtX3BhcmFtZXRlcnM7CisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgcG9ydF9hZ2VudDsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICpkZXZpY2VfdGFibGVbU0NJX01BWF9SRU1PVEVfREVWSUNFU107CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSBhdmFpbGFibGVfcmVtb3RlX25vZGVzOworCXN0cnVjdCBzY2lfcG93ZXJfY29udHJvbCBwb3dlcl9jb250cm9sOworCXU4IGlvX3JlcXVlc3Rfc2VxdWVuY2VbU0NJX01BWF9JT19SRVFVRVNUU107CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dF90YWJsZTsKKwlkbWFfYWRkcl90IHRhc2tfY29udGV4dF9kbWE7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGU7CisJdTMyICpjb21wbGV0aW9uX3F1ZXVlOworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2dldDsKKwl1MzIgbG9naWNhbF9wb3J0X2VudHJpZXM7CisJdTMyIHJlbW90ZV9ub2RlX2VudHJpZXM7CisJdTMyIHRhc2tfY29udGV4dF9lbnRyaWVzOworCXN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbCB1Zl9jb250cm9sOworCisJLyogcGh5IHN0YXJ0dXAgKi8KKwlzdHJ1Y3Qgc2NpX3RpbWVyIHBoeV90aW1lcjsKKwkvKiBYWFgga2lsbCAqLworCWJvb2wgcGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZzsKKwl1MzIgbmV4dF9waHlfdG9fc3RhcnQ7CisJLyogWFhYIGNvbnZlcnQgdG8gdW5zaWduZWQgbG9uZyBhbmQgdXNlIGJpdG9wcyAqLworCXU4IGludmFsaWRfcGh5X21hc2s7CisKKwkvKiBUT0RPIGF0dGVtcHQgZHluYW1pYyBpbnRlcnJ1cHQgY29hbGVzY2luZyBzY2hlbWUgKi8KKwl1MTYgaW50ZXJydXB0X2NvYWxlc2NlX251bWJlcjsKKwl1MzIgaW50ZXJydXB0X2NvYWxlc2NlX3RpbWVvdXQ7CisJc3RydWN0IHNtdV9yZWdpc3RlcnMgX19pb21lbSAqc211X3JlZ2lzdGVyczsKKwlzdHJ1Y3Qgc2N1X3JlZ2lzdGVycyBfX2lvbWVtICpzY3VfcmVnaXN0ZXJzOworCisJdTE2IHRjaV9oZWFkOworCXUxNiB0Y2lfdGFpbDsKKwl1MTYgdGNpX3Bvb2xbU0NJX01BWF9JT19SRVFVRVNUU107CisKKwlpbnQgaWQ7IC8qIHVuaXF1ZSB3aXRoaW4gYSBnaXZlbiBwY2kgZGV2aWNlICovCisJc3RydWN0IGlzY2lfcGh5IHBoeXNbU0NJX01BWF9QSFlTXTsKKwlzdHJ1Y3QgaXNjaV9wb3J0IHBvcnRzW1NDSV9NQVhfUE9SVFMgKyAxXTsgLyogaW5jbHVkZXMgZHVtbXkgcG9ydCAqLworCXN0cnVjdCBzYXNfaGFfc3RydWN0IHNhc19oYTsKKworCXNwaW5sb2NrX3Qgc3RhdGVfbG9jazsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwllbnVtIGlzY2lfc3RhdHVzIHN0YXR1czsKKwkjZGVmaW5lIElIT1NUX1NUQVJUX1BFTkRJTkcgMAorCSNkZWZpbmUgSUhPU1RfU1RPUF9QRU5ESU5HIDEKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50cTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgY29tcGxldGlvbl90YXNrbGV0OworCXN0cnVjdCBsaXN0X2hlYWQgcmVxdWVzdHNfdG9fY29tcGxldGU7CisJc3RydWN0IGxpc3RfaGVhZCByZXF1ZXN0c190b19lcnJvcmJhY2s7CisJc3BpbmxvY2tfdCBzY2ljX2xvY2s7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxc1tTQ0lfTUFYX0lPX1JFUVVFU1RTXTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlIGRldmljZXNbU0NJX01BWF9SRU1PVEVfREVWSUNFU107Cit9OworCisvKioKKyAqIGVudW0gc2NpX2NvbnRyb2xsZXJfc3RhdGVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCB0aGUgc3RhdGVzCisgKiAgICBmb3IgdGhlIGNvbW1vbiBjb250cm9sbGVyIHN0YXRlIG1hY2hpbmUuCisgKi8KK2VudW0gc2NpX2NvbnRyb2xsZXJfc3RhdGVzIHsKKwkvKioKKwkgKiBTaW1wbHkgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSBiYXNlIGNvbnRyb2xsZXIgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lDX0lOSVRJQUwgPSAwLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbGxlciBpcyByZXNldC4gIFRoZSBtZW1vcnkgZm9yCisJICogdGhlIGNvbnRyb2xsZXIgaXMgaW4gaXQncyBpbml0aWFsIHN0YXRlLCBidXQgdGhlIGNvbnRyb2xsZXIgcmVxdWlyZXMKKwkgKiBpbml0aWFsaXphdGlvbi4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTCBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVTRVRUSU5HIHN0YXRlLgorCSAqLworCVNDSUNfUkVTRVQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHR5cGljYWxseSBhbiBhY3Rpb24gc3RhdGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRyb2xsZXIKKwkgKiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXphdGlvbi4gIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMKKwkgKiBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRVNFVCBzdGF0ZS4KKwkgKi8KKwlTQ0lDX0lOSVRJQUxJWklORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisJICogaW5pdGlhbGl6ZWQuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUxJWklORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX0lOSVRJQUxJWkVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHRoZSBjb250cm9sbGVyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlY29taW5nCisJICogcmVhZHkgKGkuZS4gc3RhcnRpbmcpLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMSVpFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lDX1NUQVJUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIGNvbnRyb2xsZXIgaXMgbm93IHJlYWR5LiAgVGh1cywgdGhlIHVzZXIKKwkgKiBpcyBhYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGUgY29udHJvbGxlci4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJQ19SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgdHlwaWNhbGx5IGFuIGFjdGlvbiBzdGF0ZSB0aGF0IGluZGljYXRlcyB0aGUgY29udHJvbGxlcgorCSAqIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlc2V0dGluZy4gIFRodXMsIHRoZSB1c2VyIGlzIHVuYWJsZSB0byBwZXJmb3JtCisJICogSU8gb3BlcmF0aW9ucyBvbiB0aGUgY29udHJvbGxlci4gIEEgcmVzZXQgaXMgY29uc2lkZXJlZCBkZXN0cnVjdGl2ZSBpbgorCSAqIG1vc3QgY2FzZXMuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBGQUlMRUQgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQRUQgc3RhdGUuCisJICovCisJU0NJQ19SRVNFVFRJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyIGlzIGluIHRoZSBwcm9jZXNzIG9mIHN0b3BwaW5nLgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCwgYnV0IGV4aXN0aW5nIElPCisJICogb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBjb21wbGV0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJQ19TVE9QUElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHN0b3BwZWQuCisJICogSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBzdWNjZXNzZnVsbHkgYmUKKwkgKiBpbml0aWFsaXplZC4gIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTElaSU5HIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVElORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RPUFBJTkcgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFU0VUVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX0ZBSUxFRCwKK307CisKKy8qKgorICogc3RydWN0IGlzY2lfcGNpX2luZm8gLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHBjaSBmdW5jdGlvbiBjb250YWluaW5nIHRoZQorICogICAgY29udHJvbGxlcnMuIERlcGVuZGluZyBvbiBQQ0kgU0tVLCB0aGVyZSBjb3VsZCBiZSB1cCB0byAyIGNvbnRyb2xsZXJzIGluCisgKiAgICB0aGUgUENJIGZ1bmN0aW9uLgorICovCisjZGVmaW5lIFNDSV9NQVhfTVNJWF9JTlQgKFNDSV9OVU1fTVNJX1hfSU5UKlNDSV9NQVhfQ09OVFJPTExFUlMpCisKK3N0cnVjdCBpc2NpX3BjaV9pbmZvIHsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbU0NJX01BWF9NU0lYX0lOVF07CisJc3RydWN0IGlzY2lfaG9zdCAqaG9zdHNbU0NJX01BWF9DT05UUk9MTEVSU107CisJc3RydWN0IGlzY2lfb3JvbSAqb3JvbTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcGNpX2luZm8gKnRvX3BjaV9pbmZvKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBwY2lfZ2V0X2RydmRhdGEocGRldik7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfaXNjaV9ob3N0KGlkLCBpaG9zdCwgcGRldikgXAorCWZvciAoaWQgPSAwLCBpaG9zdCA9IHRvX3BjaV9pbmZvKHBkZXYpLT5ob3N0c1tpZF07IFwKKwkgICAgIGlkIDwgQVJSQVlfU0laRSh0b19wY2lfaW5mbyhwZGV2KS0+aG9zdHMpICYmIGlob3N0OyBcCisJICAgICBpaG9zdCA9IHRvX3BjaV9pbmZvKHBkZXYpLT5ob3N0c1srK2lkXSkKKworc3RhdGljIGlubGluZSBlbnVtIGlzY2lfc3RhdHVzIGlzY2lfaG9zdF9nZXRfc3RhdGUoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0KQoreworCXJldHVybiBpc2NpX2hvc3QtPnN0YXR1czsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfaG9zdF9jaGFuZ2Vfc3RhdGUoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCQkJCQkgIGVudW0gaXNjaV9zdGF0dXMgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2hvc3QgPSAlcCwgc3RhdGUgPSAweCV4IiwKKwkJX19mdW5jX18sCisJCWlzY2lfaG9zdCwKKwkJc3RhdHVzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJaXNjaV9ob3N0LT5zdGF0dXMgPSBzdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3N0YXJ0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXdhaXRfZXZlbnQoaWhvc3QtPmV2ZW50cSwgIXRlc3RfYml0KElIT1NUX1NUQVJUX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3N0b3Aoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJd2FpdF9ldmVudChpaG9zdC0+ZXZlbnRxLCAhdGVzdF9iaXQoSUhPU1RfU1RPUF9QRU5ESU5HLCAmaWhvc3QtPmZsYWdzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9kZXZpY2Vfc3RhcnQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJd2FpdF9ldmVudChpaG9zdC0+ZXZlbnRxLCAhdGVzdF9iaXQoSURFVl9TVEFSVF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX2RldmljZV9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXdhaXRfZXZlbnQoaWhvc3QtPmV2ZW50cSwgIXRlc3RfYml0KElERVZfU1RPUF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXNjaV9ob3N0ICpkZXZfdG9faWhvc3Qoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5wb3J0LT5oYS0+bGxkZF9oYTsKK30KKworLyogd2UgYWx3YXlzIHVzZSBwcm90b2NvbCBlbmdpbmUgZ3JvdXAgemVybyAqLworI2RlZmluZSBJU0NJX1BFRyAwCisKKy8qIHNlZSBzY2lfY29udHJvbGxlcl9pb190YWdfYWxsb2NhdGV8ZnJlZSBmb3IgaG93IHNlcSBhbmQgdGNpIGFyZSBidWlsdCAqLworI2RlZmluZSBJU0NJX1RBRyhzZXEsIHRjaSkgKCgodTE2KSAoc2VxKSkgPDwgMTIgfCB0Y2kpCisKKy8qIHRoZXNlIGFyZSByZXR1cm5lZCBieSB0aGUgaGFyZHdhcmUsIHNvIHNhbml0aXplIHRoZW0gKi8KKyNkZWZpbmUgSVNDSV9UQUdfU0VRKHRhZykgKCgodGFnKSA+PiAxMikgJiAoU0NJX01BWF9TRVEtMSkpCisjZGVmaW5lIElTQ0lfVEFHX1RDSSh0YWcpICgodGFnKSAmIChTQ0lfTUFYX0lPX1JFUVVFU1RTLTEpKQorCisvKiBleHBhbmRlciBhdHRhY2hlZCBzYXRhIGRldmljZXMgcmVxdWlyZSAzIHJuYyBzbG90cyAqLworc3RhdGljIGlubGluZSBpbnQgc2NpX3JlbW90ZV9kZXZpY2Vfbm9kZV9jb3VudChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJaWYgKChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSAmJgorCSAgICAhaWRldi0+aXNfZGlyZWN0X2F0dGFjaGVkKQorCQlyZXR1cm4gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVDsKKwlyZXR1cm4gU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVDsKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9jbGVhcl9pbnZhbGlkX3BoeSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgY2xlYXIgdGhlIGJpdCBpbiB0aGUgaW52YWxpZCBwaHkgbWFzayBmb3IgdGhpcyBjb250cm9sbGVyCisgKiBvYmplY3QuICBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCBtZXNzYWdlcyByZXBvcnRlZCBmb3IgaW52YWxpZCBsaW5rIHVwCisgKiBub3RpZmljYXRpb25zLgorICovCisjZGVmaW5lIHNjaV9jb250cm9sbGVyX2NsZWFyX2ludmFsaWRfcGh5KGNvbnRyb2xsZXIsIHBoeSkgXAorCSgoY29udHJvbGxlciktPmludmFsaWRfcGh5X21hc2sgJj0gfigxIDw8IChwaHkpLT5waHlfaW5kZXgpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKnNjaXBoeV90b19kZXYoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCisJaWYgKCFpcGh5IHx8ICFpcGh5LT5pc2NpX3BvcnQgfHwgIWlwaHktPmlzY2lfcG9ydC0+aXNjaV9ob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmaXBoeS0+aXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzY2lwb3J0X3RvX2RldihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKworCWlmICghaXBvcnQgfHwgIWlwb3J0LT5pc2NpX2hvc3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZpcG9ydC0+aXNjaV9ob3N0LT5wZGV2LT5kZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqc2NpcmRldl90b19kZXYoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlpZiAoIWlkZXYgfHwgIWlkZXYtPmlzY2lfcG9ydCB8fCAhaWRldi0+aXNjaV9wb3J0LT5pc2NpX2hvc3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZpZGV2LT5pc2NpX3BvcnQtPmlzY2lfaG9zdC0+cGRldi0+ZGV2OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfYTIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPnJldmlzaW9uIDwgNCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfYjAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPnJldmlzaW9uID09IDQpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2MwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5yZXZpc2lvbiA+PSA1KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgIHUzMiByZXF1ZXN0KTsKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICAgdTMyIGZyYW1lX2luZGV4KTsKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKHZvaWQgKnJlc3BvbnNlX2J1ZmZlciwKKwkJCQkJICAgIHZvaWQgKmZyYW1lX2hlYWRlciwKKwkJCQkJICAgIHZvaWQgKmZyYW1lX2J1ZmZlcik7CitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfYWxsb2NhdGVfcmVtb3RlX25vZGVfY29udGV4dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCQkJIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkJCSB1MTYgKm5vZGVfaWQpOwordm9pZCBzY2lfY29udHJvbGxlcl9mcmVlX3JlbW90ZV9ub2RlX2NvbnRleHQoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MTYgbm9kZV9pZCk7CisKK3N0cnVjdCBpc2NpX3JlcXVlc3QgKnNjaV9yZXF1ZXN0X2J5X3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICB1MTYgaW9fdGFnKTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX2luc2VydCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX3Bvd2VyX2NvbnRyb2xfcXVldWVfcmVtb3ZlKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfbGlua191cCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX2xpbmtfZG93bigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX3JlbW90ZV9kZXZpY2Vfc3RvcHBlZCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9jb3B5X3Rhc2tfY29udGV4dCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9yZWdpc3Rlcl9zZXR1cChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2ludCBpc2NpX2hvc3Rfc2Nhbl9maW5pc2hlZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVuc2lnbmVkIGxvbmcpOwordm9pZCBpc2NpX2hvc3Rfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwordTE2IGlzY2lfYWxsb2NfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKK2VudW0gc2NpX3N0YXR1cyBpc2NpX2ZyZWVfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MTYgaW9fdGFnKTsKK3ZvaWQgaXNjaV90Y2lfZnJlZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IHRjaSk7CisKK2ludCBpc2NpX2hvc3RfaW5pdChzdHJ1Y3QgaXNjaV9ob3N0ICopOworCit2b2lkIGlzY2lfaG9zdF9pbml0X2NvbnRyb2xsZXJfbmFtZXMoCisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCXVuc2lnbmVkIGludCBjb250cm9sbGVyX2lkeCk7CisKK3ZvaWQgaXNjaV9ob3N0X2RlaW5pdCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICopOworCit2b2lkIGlzY2lfaG9zdF9wb3J0X2xpbmtfdXAoCisJc3RydWN0IGlzY2lfaG9zdCAqLAorCXN0cnVjdCBpc2NpX3BvcnQgKiwKKwlzdHJ1Y3QgaXNjaV9waHkgKik7CitpbnQgaXNjaV9ob3N0X2Rldl9mb3VuZChzdHJ1Y3QgZG9tYWluX2RldmljZSAqKTsKKwordm9pZCBpc2NpX2hvc3RfcmVtb3RlX2RldmljZV9zdGFydF9jb21wbGV0ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICosCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqLAorCWVudW0gc2NpX3N0YXR1cyk7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X2lvKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3Rhc2tfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X3Rhc2soCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb21wbGV0ZV9pbygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCit2b2lkIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfY29uc3RydWN0KAorCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWUwZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgorCitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICppc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlzY2lfaWRfdGFibGUpID0geworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2MSksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjMpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDY1KSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2NyksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjkpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDZCKSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2MCksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjIpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDY0KSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2NiksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjgpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDZBKSx9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXNjaV9pZF90YWJsZSk7CisKKy8qIGxpbnV4IGlzY2kgc3BlY2lmaWMgc2V0dGluZ3MgKi8KKwordW5zaWduZWQgY2hhciBub19vdXRib3VuZF90YXNrX3RvID0gMjA7Cittb2R1bGVfcGFyYW0obm9fb3V0Ym91bmRfdGFza190bywgYnl0ZSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vX291dGJvdW5kX3Rhc2tfdG8sICJObyBPdXRib3VuZCBUYXNrIFRpbWVvdXQgKDF1cyBpbmNyKSIpOworCit1MTYgc3NwX21heF9vY2NfdG8gPSAyMDsKK21vZHVsZV9wYXJhbShzc3BfbWF4X29jY190bywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NwX21heF9vY2NfdG8sICJTU1AgTWF4IG9jY3VwYW5jeSB0aW1lb3V0ICgxMDB1cyBpbmNyKSIpOworCit1MTYgc3RwX21heF9vY2NfdG8gPSA1OworbW9kdWxlX3BhcmFtKHN0cF9tYXhfb2NjX3RvLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzdHBfbWF4X29jY190bywgIlNUUCBNYXggb2NjdXBhbmN5IHRpbWVvdXQgKDEwMHVzIGluY3IpIik7CisKK3UxNiBzc3BfaW5hY3RpdmVfdG8gPSA1OworbW9kdWxlX3BhcmFtKHNzcF9pbmFjdGl2ZV90bywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NwX2luYWN0aXZlX3RvLCAiU1NQIGluYWN0aXZpdHkgdGltZW91dCAoMTAwdXMgaW5jcikiKTsKKwordTE2IHN0cF9pbmFjdGl2ZV90byA9IDU7Cittb2R1bGVfcGFyYW0oc3RwX2luYWN0aXZlX3RvLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzdHBfaW5hY3RpdmVfdG8sICJTVFAgaW5hY3Rpdml0eSB0aW1lb3V0ICgxMDB1cyBpbmNyKSIpOworCit1bnNpZ25lZCBjaGFyIHBoeV9nZW4gPSAzOworbW9kdWxlX3BhcmFtKHBoeV9nZW4sIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhwaHlfZ2VuLCAiUEhZIGdlbmVyYXRpb24gKDE6IDEuNUdicHMgMjogMy4wR2JwcyAzOiA2LjBHYnBzKSIpOworCit1bnNpZ25lZCBjaGFyIG1heF9jb25jdXJyX3NwaW51cCA9IDE7Cittb2R1bGVfcGFyYW0obWF4X2NvbmN1cnJfc3BpbnVwLCBieXRlLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2NvbmN1cnJfc3BpbnVwLCAiTWF4IGNvbmN1cnJlbnQgZGV2aWNlIHNwaW51cCIpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpc2NpX3NodCA9IHsKKworCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCQk9IERSVl9OQU1FLAorCS5wcm9jX25hbWUJCQk9IERSVl9OQU1FLAorCS5xdWV1ZWNvbW1hbmQJCQk9IHNhc19xdWV1ZWNvbW1hbmQsCisJLnRhcmdldF9hbGxvYwkJCT0gc2FzX3RhcmdldF9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCQk9IHNhc19zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCQk9IHNhc19zbGF2ZV9kZXN0cm95LAorCS5zY2FuX2ZpbmlzaGVkCQkJPSBpc2NpX2hvc3Rfc2Nhbl9maW5pc2hlZCwKKwkuc2Nhbl9zdGFydAkJCT0gaXNjaV9ob3N0X3NjYW5fc3RhcnQsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAkJPSBzYXNfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jaGFuZ2VfcXVldWVfdHlwZQkJPSBzYXNfY2hhbmdlX3F1ZXVlX3R5cGUsCisJLmJpb3NfcGFyYW0JCQk9IHNhc19iaW9zX3BhcmFtLAorCS5jYW5fcXVldWUJCQk9IElTQ0lfQ0FOX1FVRVVFX1ZBTCwKKwkuY21kX3Blcl9sdW4JCQk9IDEsCisJLnRoaXNfaWQJCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkubWF4X3NlY3RvcnMJCQk9IFNDU0lfREVGQVVMVF9NQVhfU0VDVE9SUywKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IHNhc19laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gaXNjaV9idXNfcmVzZXRfaGFuZGxlciwKKwkuc2xhdmVfYWxsb2MJCQk9IHNhc19zbGF2ZV9hbGxvYywKKwkudGFyZ2V0X2Rlc3Ryb3kJCQk9IHNhc190YXJnZXRfZGVzdHJveSwKKwkuaW9jdGwJCQkJPSBzYXNfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IHNhc19kb21haW5fZnVuY3Rpb25fdGVtcGxhdGUgaXNjaV90cmFuc3BvcnRfb3BzICA9IHsKKworCS8qIFRoZSBjbGFzcyBjYWxscyB0aGVzZSB0byBub3RpZnkgdGhlIExMREQgb2YgYW4gZXZlbnQuICovCisJLmxsZGRfcG9ydF9mb3JtZWQJPSBpc2NpX3BvcnRfZm9ybWVkLAorCS5sbGRkX3BvcnRfZGVmb3JtZWQJPSBpc2NpX3BvcnRfZGVmb3JtZWQsCisKKwkvKiBUaGUgY2xhc3MgY2FsbHMgdGhlc2Ugd2hlbiBhIGRldmljZSBpcyBmb3VuZCBvciBnb25lLiAqLworCS5sbGRkX2Rldl9mb3VuZAkJPSBpc2NpX3JlbW90ZV9kZXZpY2VfZm91bmQsCisJLmxsZGRfZGV2X2dvbmUJCT0gaXNjaV9yZW1vdGVfZGV2aWNlX2dvbmUsCisKKwkubGxkZF9leGVjdXRlX3Rhc2sJPSBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrLAorCS8qIFRhc2sgTWFuYWdlbWVudCBGdW5jdGlvbnMuIE11c3QgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LiAqLworCS5sbGRkX2Fib3J0X3Rhc2sJPSBpc2NpX3Rhc2tfYWJvcnRfdGFzaywKKwkubGxkZF9hYm9ydF90YXNrX3NldAk9IGlzY2lfdGFza19hYm9ydF90YXNrX3NldCwKKwkubGxkZF9jbGVhcl9hY2EJCT0gaXNjaV90YXNrX2NsZWFyX2FjYSwKKwkubGxkZF9jbGVhcl90YXNrX3NldAk9IGlzY2lfdGFza19jbGVhcl90YXNrX3NldCwKKwkubGxkZF9JX1RfbmV4dXNfcmVzZXQJPSBpc2NpX3Rhc2tfSV9UX25leHVzX3Jlc2V0LAorCS5sbGRkX2x1X3Jlc2V0CQk9IGlzY2lfdGFza19sdV9yZXNldCwKKwkubGxkZF9xdWVyeV90YXNrCT0gaXNjaV90YXNrX3F1ZXJ5X3Rhc2ssCisKKwkvKiBQb3J0IGFuZCBBZGFwdGVyIG1hbmFnZW1lbnQgKi8KKwkubGxkZF9jbGVhcl9uZXh1c19wb3J0CT0gaXNjaV90YXNrX2NsZWFyX25leHVzX3BvcnQsCisJLmxsZGRfY2xlYXJfbmV4dXNfaGEJPSBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfaGEsCisKKwkvKiBQaHkgbWFuYWdlbWVudCAqLworCS5sbGRkX2NvbnRyb2xfcGh5CT0gaXNjaV9waHlfY29udHJvbCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQIFIgTyBUIEUgQyBUIEUgRCAgTSBFIFQgSCBPIEQgUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqCisgKiBpc2NpX3JlZ2lzdGVyX3Nhc19oYSgpIC0gVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdmFyaW91cyBsbGRkCisgKiAgICBzcGVjaWZpYyBtZW1iZXJzIG9mIHRoZSBzYXNfaGEgc3RydWN0IGFuZCBjYWxscyB0aGUgbGlic2FzCisgKiAgICBzYXNfcmVnaXN0ZXJfaGEoKSBmdW5jdGlvbi4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGxkZCBzcGVjaWZpYyB3cmFwcGVyIGZvciB0aGUKKyAqICAgIGxpYnNhcyBzYXNfaGEgc3RydWN0LgorICoKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHN1Y2VzcyBvciBmYWlsdXJlLiBUaGUgdXNlcgorICogc2hvdWxkIGNoZWNrIGZvciBwb3NzaWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciByZXR1cm4gb3RoZXJ3aXNlLCBhIHplcm8KKyAqIGluZGljYXRlcyBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGlzY2lfcmVnaXN0ZXJfc2FzX2hhKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gJihpc2NpX2hvc3QtPnNhc19oYSk7CisJc3RydWN0IGFzZF9zYXNfcGh5ICoqc2FzX3BoeXM7CisJc3RydWN0IGFzZF9zYXNfcG9ydCAqKnNhc19wb3J0czsKKworCXNhc19waHlzID0gZGV2bV9remFsbG9jKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQlTQ0lfTUFYX1BIWVMgKiBzaXplb2Yodm9pZCAqKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNhc19waHlzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNhc19wb3J0cyA9IGRldm1fa3phbGxvYygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJIFNDSV9NQVhfUE9SVFMgKiBzaXplb2Yodm9pZCAqKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXNfcG9ydHMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyotLS0tLS0tLS0tLS0tLS0tLSBMaWJzYXMgSW5pdGlhbGl6YXRpb24gU3R1ZmYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHZhcmlvdXMgZmllbGRzIGluIHRoZSBzYXNfaGEgc3RydWN0OgorCSAqLworCisJc2FzX2hhLT5zYXNfaGFfbmFtZSA9IERSVl9OQU1FOworCXNhc19oYS0+bGxkZF9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzYXNfaGEtPnNhc19hZGRyICAgID0gJmlzY2lfaG9zdC0+cGh5c1swXS5zYXNfYWRkclswXTsKKworCS8qIHNldCB0aGUgYXJyYXkgb2YgcGh5IGFuZCBwb3J0IHN0cnVjdHMuICAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCQlzYXNfcGh5c1tpXSA9ICZpc2NpX2hvc3QtPnBoeXNbaV0uc2FzX3BoeTsKKwkJc2FzX3BvcnRzW2ldID0gJmlzY2lfaG9zdC0+cG9ydHNbaV0uc2FzX3BvcnQ7CisJfQorCisJc2FzX2hhLT5zYXNfcGh5ICA9IHNhc19waHlzOworCXNhc19oYS0+c2FzX3BvcnQgPSBzYXNfcG9ydHM7CisJc2FzX2hhLT5udW1fcGh5cyA9IFNDSV9NQVhfUEhZUzsKKworCXNhc19oYS0+bGxkZF9xdWV1ZV9zaXplID0gSVNDSV9DQU5fUVVFVUVfVkFMOworCXNhc19oYS0+bGxkZF9tYXhfZXhlY3V0ZV9udW0gPSAxOworCXNhc19oYS0+c3RyaWN0X3dpZGVfcG9ydHMgPSAxOworCisJc2FzX3JlZ2lzdGVyX2hhKHNhc19oYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaXNjaV9zaG93X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNvbnRhaW5lcl9vZihkZXYsIHR5cGVvZigqc2hvc3QpLCBzaG9zdF9kZXYpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNhc19oYSwgdHlwZW9mKCppaG9zdCksIHNhc19oYSk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaWhvc3QtPmlkKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGlzY2lfaWQsIFNfSVJVR08sIGlzY2lfc2hvd19pZCwgTlVMTCk7CisKK3N0YXRpYyB2b2lkIGlzY2lfdW5yZWdpc3RlcihzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlpZiAoIWlzY2lfaG9zdCkKKwkJcmV0dXJuOworCisJc2hvc3QgPSBpc2NpX2hvc3QtPnNob3N0OworCWRldmljZV9yZW1vdmVfZmlsZSgmc2hvc3QtPnNob3N0X2RldiwgJmRldl9hdHRyX2lzY2lfaWQpOworCisJc2FzX3VucmVnaXN0ZXJfaGEoJmlzY2lfaG9zdC0+c2FzX2hhKTsKKworCXNhc19yZW1vdmVfaG9zdChpc2NpX2hvc3QtPnNob3N0KTsKKwlzY3NpX3JlbW92ZV9ob3N0KGlzY2lfaG9zdC0+c2hvc3QpOworCXNjc2lfaG9zdF9wdXQoaXNjaV9ob3N0LT5zaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzY2lfcGNpX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGVyciwgYmFyX251bSwgYmFyX21hc2sgPSAwOworCXZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcDsKKworCWVyciA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgZW5hYmxlIFBDSSBkZXZpY2UgJXMhXG4iLAorCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoYmFyX251bSA9IDA7IGJhcl9udW0gPCBTQ0lfUENJX0JBUl9DT1VOVDsgYmFyX251bSsrKQorCQliYXJfbWFzayB8PSAxIDw8IChiYXJfbnVtICogMik7CisKKwllcnIgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgYmFyX21hc2ssIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOworCWlmICghaW9tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChlcnIpIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChlcnIpIHsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudW1fY29udHJvbGxlcnMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyogYmFyIHNpemUgYWxvbmUgY2FuIHRlbGwgdXMgaWYgd2UgYXJlIHJ1bm5pbmcgd2l0aCBhIGR1YWwgY29udHJvbGxlcgorCSAqIHBhcnQsIG5vIG5lZWQgdG8gdHJ1c3QgcmV2aXNpb24gaWRzIHRoYXQgbWlnaHQgYmUgdW5kZXIgYnJva2VuIGZpcm13YXJlCisJICogY29udHJvbAorCSAqLworCXJlc291cmNlX3NpemVfdCBzY3VfYmFyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFNDSV9TQ1VfQkFSKjIpOworCXJlc291cmNlX3NpemVfdCBzbXVfYmFyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFNDSV9TTVVfQkFSKjIpOworCisJaWYgKHNjdV9iYXJfc2l6ZSA+PSBTQ0lfU0NVX0JBUl9TSVpFKlNDSV9NQVhfQ09OVFJPTExFUlMgJiYKKwkgICAgc211X2Jhcl9zaXplID49IFNDSV9TTVVfQkFSX1NJWkUqU0NJX01BWF9DT05UUk9MTEVSUykKKwkJcmV0dXJuIFNDSV9NQVhfQ09OVFJPTExFUlM7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpc2NpX3NldHVwX2ludGVycnVwdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGVyciwgaSwgbnVtX21zaXg7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3Q7CisJc3RydWN0IGlzY2lfcGNpX2luZm8gKnBjaV9pbmZvID0gdG9fcGNpX2luZm8ocGRldik7CisKKwkvKgorCSAqICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisJICogIFBDSSBmdW5jdGlvbi4KKwkgKi8KKwludW1fbXNpeCA9IG51bV9jb250cm9sbGVycyhwZGV2KSAqIFNDSV9OVU1fTVNJX1hfSU5UOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2l4OyBpKyspCisJCXBjaV9pbmZvLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIHBjaV9pbmZvLT5tc2l4X2VudHJpZXMsIG51bV9tc2l4KTsKKwlpZiAoZXJyKQorCQlnb3RvIGludHg7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21zaXg7IGkrKykgeworCQlpbnQgaWQgPSBpIC8gU0NJX05VTV9NU0lfWF9JTlQ7CisJCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4ID0gJnBjaV9pbmZvLT5tc2l4X2VudHJpZXNbaV07CisJCWlycV9oYW5kbGVyX3QgaXNyOworCisJCWlob3N0ID0gcGNpX2luZm8tPmhvc3RzW2lkXTsKKwkJLyogb2RkIG51bWJlcmVkIHZlY3RvcnMgYXJlIGVycm9yIGludGVycnVwdHMgKi8KKwkJaWYgKGkgJiAxKQorCQkJaXNyID0gaXNjaV9lcnJvcl9pc3I7CisJCWVsc2UKKwkJCWlzciA9IGlzY2lfbXNpeF9pc3I7CisKKwkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBtc2l4LT52ZWN0b3IsIGlzciwgMCwKKwkJCQkgICAgICAgRFJWX05BTUUiLW1zaXgiLCBpaG9zdCk7CisJCWlmICghZXJyKQorCQkJY29udGludWU7CisKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm1zaXggc2V0dXAgZmFpbGVkIGZhbGxpbmcgYmFjayB0byBpbnR4XG4iKTsKKwkJd2hpbGUgKGktLSkgeworCQkJaWQgPSBpIC8gU0NJX05VTV9NU0lfWF9JTlQ7CisJCQlpaG9zdCA9IHBjaV9pbmZvLT5ob3N0c1tpZF07CisJCQltc2l4ID0gJnBjaV9pbmZvLT5tc2l4X2VudHJpZXNbaV07CisJCQlkZXZtX2ZyZWVfaXJxKCZwZGV2LT5kZXYsIG1zaXgtPnZlY3RvciwgaWhvc3QpOworCQl9CisJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CisJCWdvdG8gaW50eDsKKwl9CisJcmV0dXJuIDA7CisKKyBpbnR4OgorCWZvcl9lYWNoX2lzY2lfaG9zdChpLCBpaG9zdCwgcGRldikgeworCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHBkZXYtPmlycSwgaXNjaV9pbnR4X2lzciwKKwkJCQkgICAgICAgSVJRRl9TSEFSRUQsIERSVl9OQU1FIi1pbnR4IiwgaWhvc3QpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3RfYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGVycjsKKworCWlzY2lfaG9zdCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlzY2lfaG9zdCksIEdGUF9LRVJORUwpOworCWlmICghaXNjaV9ob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCWlzY2lfaG9zdC0+cGRldiA9IHBkZXY7CisJaXNjaV9ob3N0LT5pZCA9IGlkOworCisJc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmlzY2lfc2h0LCBzaXplb2Yodm9pZCAqKSk7CisJaWYgKCFzaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisJaXNjaV9ob3N0LT5zaG9zdCA9IHNob3N0OworCisJZXJyID0gaXNjaV9ob3N0X2luaXQoaXNjaV9ob3N0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9zaG9zdDsKKworCVNIT1NUX1RPX1NBU19IQShzaG9zdCkgPSAmaXNjaV9ob3N0LT5zYXNfaGE7CisJaXNjaV9ob3N0LT5zYXNfaGEuY29yZS5zaG9zdCA9IHNob3N0OworCXNob3N0LT50cmFuc3BvcnR0ID0gaXNjaV90cmFuc3BvcnRfdGVtcGxhdGU7CisKKwlzaG9zdC0+bWF4X2lkID0gfjA7CisJc2hvc3QtPm1heF9sdW4gPSB+MDsKKwlzaG9zdC0+bWF4X2NtZF9sZW4gPSBNQVhfQ09NTUFORF9TSVpFOworCisJZXJyID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfc2hvc3Q7CisKKwllcnIgPSBpc2NpX3JlZ2lzdGVyX3Nhc19oYShpc2NpX2hvc3QpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3Nob3N0X3JlbW92ZTsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2hvc3QtPnNob3N0X2RldiwgJmRldl9hdHRyX2lzY2lfaWQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfaGE7CisKKwlyZXR1cm4gaXNjaV9ob3N0OworCisgZXJyX3VucmVnaXN0ZXJfaGE6CisJc2FzX3VucmVnaXN0ZXJfaGEoJihpc2NpX2hvc3QtPnNhc19oYSkpOworIGVycl9zaG9zdF9yZW1vdmU6CisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisgZXJyX3Nob3N0OgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzY2lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlzY2lfcGNpX2luZm8gKnBjaV9pbmZvOworCWludCBlcnIsIGk7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCXN0cnVjdCBpc2NpX29yb20gKm9yb20gPSBOVUxMOworCWNoYXIgKnNvdXJjZSA9ICIocGxhdGZvcm0pIjsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkcml2ZXIgY29uZmlndXJlZCBmb3IgcmV2OiAlZCBzaWxpY29uXG4iLAorCQkgcGRldi0+cmV2aXNpb24pOworCisJcGNpX2luZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwY2lfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcGNpX2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwY2lfaW5mbyk7CisKKwlpZiAoZWZpX2VuYWJsZWQpCisJCW9yb20gPSBpc2NpX2dldF9lZmlfdmFyKHBkZXYpOworCisJaWYgKCFvcm9tKQorCQlvcm9tID0gaXNjaV9yZXF1ZXN0X29wcm9tKHBkZXYpOworCisJZm9yIChpID0gMDsgb3JvbSAmJiBpIDwgQVJSQVlfU0laRShvcm9tLT5jdHJsKTsgaSsrKSB7CisJCWlmIChzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoJm9yb20tPmN0cmxbaV0pKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiWyVkXTogaW52YWxpZCBvZW0gcGFyYW1ldGVycyBkZXRlY3RlZCwgZmFsbGluZyBiYWNrIHRvIGZpcm13YXJlXG4iLCBpKTsKKwkJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgb3JvbSk7CisJCQlvcm9tID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcm9tKSB7CisJCXNvdXJjZSA9ICIoZmlybXdhcmUpIjsKKwkJb3JvbSA9IGlzY2lfcmVxdWVzdF9maXJtd2FyZShwZGV2LCBmdyk7CisJCWlmICghb3JvbSkgeworCQkJLyogVE9ETyBjb252ZXJ0IHRoaXMgdG8gV0FSTl9UQUlOVF9PTkNFIG9uY2UgdGhlCisJCQkgKiBvcm9tL2VmaSBwYXJhbWV0ZXIgc3VwcG9ydCBpcyB3aWRlbHkgYXZhaWxhYmxlCisJCQkgKi8KKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJMb2FkaW5nIHVzZXIgZmlybXdhcmUgZmFpbGVkLCB1c2luZyBkZWZhdWx0ICIKKwkJCQkgInZhbHVlc1xuIik7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiRGVmYXVsdCBPRU0gY29uZmlndXJhdGlvbiBiZWluZyB1c2VkOiA0ICIKKwkJCQkgIm5hcnJvdyBwb3J0cywgYW5kIGRlZmF1bHQgU0FTIEFkZHJlc3Nlc1xuIik7CisJCX0KKwl9CisKKwlpZiAob3JvbSkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiT0VNIFNBUyBwYXJhbWV0ZXJzICh2ZXJzaW9uOiAldS4ldSkgbG9hZGVkICVzXG4iLAorCQkJIChvcm9tLT5oZHIudmVyc2lvbiAmIDB4ZjApID4+IDQsCisJCQkgKG9yb20tPmhkci52ZXJzaW9uICYgMHhmKSwgc291cmNlKTsKKworCXBjaV9pbmZvLT5vcm9tID0gb3JvbTsKKworCWVyciA9IGlzY2lfcGNpX2luaXQocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29udHJvbGxlcnMocGRldik7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9ob3N0ICpoID0gaXNjaV9ob3N0X2FsbG9jKHBkZXYsIGkpOworCisJCWlmICghaCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2hvc3RfYWxsb2M7CisJCX0KKwkJcGNpX2luZm8tPmhvc3RzW2ldID0gaDsKKwl9CisKKwllcnIgPSBpc2NpX3NldHVwX2ludGVycnVwdHMocGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfaG9zdF9hbGxvYzsKKworCWZvcl9lYWNoX2lzY2lfaG9zdChpLCBpc2NpX2hvc3QsIHBkZXYpCisJCXNjc2lfc2Nhbl9ob3N0KGlzY2lfaG9zdC0+c2hvc3QpOworCisJcmV0dXJuIDA7CisKKyBlcnJfaG9zdF9hbGxvYzoKKwlmb3JfZWFjaF9pc2NpX2hvc3QoaSwgaXNjaV9ob3N0LCBwZGV2KQorCQlpc2NpX3VucmVnaXN0ZXIoaXNjaV9ob3N0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaXNjaV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCWludCBpOworCisJZm9yX2VhY2hfaXNjaV9ob3N0KGksIGlob3N0LCBwZGV2KSB7CisJCWlzY2lfdW5yZWdpc3RlcihpaG9zdCk7CisJCWlzY2lfaG9zdF9kZWluaXQoaWhvc3QpOworCQlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlzY2lfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBpc2NpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBpc2NpX3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlzY2lfcGNpX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBpc2NpX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJfaW5mbygiJXM6IEludGVsKFIpIEM2MDAgU0FTIENvbnRyb2xsZXIgRHJpdmVyXG4iLCBEUlZfTkFNRSk7CisKKwlpc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHNhc19kb21haW5fYXR0YWNoX3RyYW5zcG9ydCgmaXNjaV90cmFuc3BvcnRfb3BzKTsKKwlpZiAoIWlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlzY2lfcGNpX2RyaXZlcik7CisJaWYgKGVycikKKwkJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KGlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBpc2NpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlzY2lfcGNpX2RyaXZlcik7CisJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KGlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0ZJUk1XQVJFKElTQ0lfRldfTkFNRSk7Cittb2R1bGVfaW5pdChpc2NpX2luaXQpOworbW9kdWxlX2V4aXQoaXNjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlNjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaXNjaS5oCkBAIC0wLDAgKzEsNTM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fSVNDSV9IX18KKyNkZWZpbmUgX19JU0NJX0hfXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiaXNjaSIKKyNkZWZpbmUgU0NJX1BDSV9CQVJfQ09VTlQgMgorI2RlZmluZSBTQ0lfTlVNX01TSV9YX0lOVCAyCisjZGVmaW5lIFNDSV9TTVVfQkFSICAgICAgIDAKKyNkZWZpbmUgU0NJX1NNVV9CQVJfU0laRSAgKDE2KjEwMjQpCisjZGVmaW5lIFNDSV9TQ1VfQkFSICAgICAgIDEKKyNkZWZpbmUgU0NJX1NDVV9CQVJfU0laRSAgKDQqMTAyNCoxMDI0KQorI2RlZmluZSBTQ0lfSU9fU1BBQ0VfQkFSMCAyCisjZGVmaW5lIFNDSV9JT19TUEFDRV9CQVIxIDMKKyNkZWZpbmUgSVNDSV9DQU5fUVVFVUVfVkFMIDI1MCAvKiA8IFNDSV9NQVhfSU9fUkVRVUVTVFMgPyAqLworI2RlZmluZSBTQ0lDX0NPTlRST0xMRVJfU1RPUF9USU1FT1VUIDUwMDAKKworI2RlZmluZSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRyAweEZGRkYKKworI2RlZmluZSBTQ0lfTUFYX1BIWVMgICg0VUwpCisjZGVmaW5lIFNDSV9NQVhfUE9SVFMgU0NJX01BWF9QSFlTCisjZGVmaW5lIFNDSV9NQVhfU01QX1BIWVMgICgzODQpIC8qIG5vdCBzaWxpY29uIGNvbnN0cmFpbmVkICovCisjZGVmaW5lIFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgKDI1NlVMKQorI2RlZmluZSBTQ0lfTUFYX0lPX1JFUVVFU1RTICgyNTZVTCkKKyNkZWZpbmUgU0NJX01BWF9TRVEgKDE2KQorI2RlZmluZSBTQ0lfTUFYX01TSVhfTUVTU0FHRVMgICgyKQorI2RlZmluZSBTQ0lfTUFYX1NDQVRURVJfR0FUSEVSX0VMRU1FTlRTIDEzMCAvKiBub3Qgc2lsaWNvbiBjb25zdHJhaW5lZCAqLworI2RlZmluZSBTQ0lfTUFYX0NPTlRST0xMRVJTIDIKKyNkZWZpbmUgU0NJX01BWF9ET01BSU5TICBTQ0lfTUFYX1BPUlRTCisKKyNkZWZpbmUgU0NVX01BWF9DUklUSUNBTF9OT1RJRklDQVRJT05TICAgICgzODQpCisjZGVmaW5lIFNDVV9NQVhfRVZFTlRTX1NISUZUCQkgICg3KQorI2RlZmluZSBTQ1VfTUFYX0VWRU5UUyAgICAgICAgICAgICAgICAgICAgKDEgPDwgU0NVX01BWF9FVkVOVFNfU0hJRlQpCisjZGVmaW5lIFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTICAgICAgICAoMTI4KQorI2RlZmluZSBTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfU0NSQVRDSCAgKDEyOCkKKyNkZWZpbmUgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMgIChTQ1VfTUFYX0NSSVRJQ0FMX05PVElGSUNBVElPTlMgXAorCQkJCQkgICArIFNDVV9NQVhfRVZFTlRTIFwKKwkJCQkJICAgKyBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUwlcCisJCQkJCSAgICsgU0NJX01BWF9JT19SRVFVRVNUUyBcCisJCQkJCSAgICsgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX1NDUkFUQ0gpCisjZGVmaW5lIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9TSElGVAkgIChpbG9nMihTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUykpCisKKyNkZWZpbmUgU0NVX0FCU09MVVRFX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgKDQwOTYpCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRSAgICgxMDI0KQorI2RlZmluZSBTQ1VfSU5WQUxJRF9GUkFNRV9JTkRFWCAgICAgICAgICAgICAoMHhGRkZGKQorCisjZGVmaW5lIFNDVV9JT19SRVFVRVNUX01BWF9TR0VfU0laRSAgICAgICAgICgweDAwRkZGRkZGKQorI2RlZmluZSBTQ1VfSU9fUkVRVUVTVF9NQVhfVFJBTlNGRVJfTEVOR1RIICAoMHgwMEZGRkZGRikKKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NpemVzKHZvaWQpCit7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDVV9NQVhfRVZFTlRTKTsKKwlCVUlMRF9CVUdfT04oU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgPD0gOCk7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKTsKKwlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMpOworCUJVSUxEX0JVR19PTihTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyA+IFNDVV9BQlNPTFVURV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKTsKKwlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoU0NJX01BWF9JT19SRVFVRVNUUyk7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDSV9NQVhfU0VRKTsKK30KKworLyoqCisgKiBlbnVtIHNjaV9zdGF0dXMgLSBUaGlzIGlzIHRoZSBnZW5lcmFsIHJldHVybiBzdGF0dXMgZW51bWVyYXRpb24gZm9yIG5vbi1JTywKKyAqICAgIG5vbi10YXNrIG1hbmFnZW1lbnQgcmVsYXRlZCBTQ0kgaW50ZXJmYWNlIG1ldGhvZHMuCisgKgorICoKKyAqLworZW51bSBzY2lfc3RhdHVzIHsKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorCSAqLworCVNDSV9TVUNDRVNTID0gMCwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxpbmcgbWV0aG9kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisJICogYnV0IHRoYXQgdGhlIElPIG1heSBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgaGF2aW5nIGl0J3Mgc3RhcnQgbWV0aG9kCisJICogaW52b2tlZC4gIFRoaXMgb2NjdXJzIGR1cmluZyBTQVQgdHJhbnNsYXRpb24gZm9yIHJlcXVlc3RzIHRoYXQgZG8KKwkgKiBub3QgcmVxdWlyZSBhbiBJTyB0byB0aGUgdGFyZ2V0IG9yIGZvciBhbnkgb3RoZXIgcmVxdWVzdHMgdGhhdCBtYXkKKwkgKiBiZSBjb21wbGV0ZWQgd2l0aG91dCBoYXZpbmcgdG8gc3VibWl0IElPLgorCSAqLworCVNDSV9TVUNDRVNTX0lPX0NPTVBMRVRFX0JFRk9SRV9TVEFSVCwKKworCS8qKgorCSAqICBUaGlzIFZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBTQ1UgaGFyZHdhcmUgcmV0dXJuZWQgYW4gZWFybHkgcmVzcG9uc2UKKwkgKiAgYmVjYXVzZSB0aGUgaW8gcmVxdWVzdCBzcGVjaWZpZWQgbW9yZSBkYXRhIHRoYW4gaXMgcmV0dXJuZWQgYnkgdGhlCisJICogIHRhcmdldCBkZXZpY2UgKG1vZGUgcGFnZXMsIGlucXVpcnkgZGF0YSwgZXRjLikuIFRoZSBjb21wbGV0aW9uIHJvdXRpbmUKKwkgKiAgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIHRvIGdldCB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KKwkgKi8KKwlTQ0lfU1VDQ0VTU19JT19ET05FX0VBUkxZLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBmb3Igd2hpY2ggYSBzdGF0ZSBjaGFuZ2UgaXMKKwkgKiBiZWluZyByZXF1ZXN0ZWQgaXMgYWxyZWFkeSBpbiBzYWlkIHN0YXRlLgorCSAqLworCVNDSV9XQVJOSU5HX0FMUkVBRFlfSU5fU1RBVEUsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgaW50ZXJydXB0IGNvYWxlc2NlbmNlIHRpbWVyIG1heSBjYXVzZSBTQVMKKwkgKiBzcGVjaWZpY2F0aW9uIGNvbXBsaWFuY2UgaXNzdWVzIChpLmUuIFNNUCB0YXJnZXQgbW9kZSByZXNwb25zZQorCSAqIGZyYW1lcyBtdXN0IGJlIHJldHVybmVkIHdpdGhpbiAxLjkgbWlsbGlzZWNvbmRzKS4KKwkgKi8KKwlTQ0lfV0FSTklOR19USU1FUl9DT05GTElDVCwKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIGEgc2VxdWVuY2Ugb2YgYWN0aW9uIGlzIG5vdCBjb21wbGV0ZWQgeWV0LiBNb3N0bHksCisJICogdGhpcyBzdGF0dXMgaXMgdXNlZCB3aGVuIG11bHRpcGxlIEFUQSBjb21tYW5kcyBhcmUgbmVlZGVkIGluIGEgU0FUSSB0cmFuc2xhdGlvbi4KKwkgKi8KKwlTQ0lfV0FSTklOR19TRVFVRU5DRV9JTkNPTVBMRVRFLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGEgZ2VuZXJhbCBmYWlsdXJlLgorCSAqLworCVNDSV9GQUlMVVJFLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIFNDSSBpbXBsZW1lbnRhdGlvbiBpcyB1bmFibGUgdG8gY29tcGxldGUKKwkgKiBhbiBvcGVyYXRpb24gZHVlIHRvIGEgY3JpdGljYWwgZmxhdyB0aGUgcHJldmVudHMgYW55IGZ1cnRoZXIgb3BlcmF0aW9uCisJICogKGkuZS4gYW4gaW52YWxpZCBwb2ludGVyKS4KKwkgKi8KKwlTQ0lfRkFUQUxfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZSBzdGF0ZQorCSAqIG9mIHRoZSBjb250cm9sbGVyIGlzIGluIGEgc3RhdGUgdGhhdCBwcmV2ZW50cyBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCisJICovCisJU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlcmUgaXMKKwkgKiBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzL21lbW9yeSB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiBjb250cm9sbGVyIG9iamVjdCByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbiBjYW4ndCBiZSBsb2NhdGVkLgorCSAqLworCVNDSV9GQUlMVVJFX0NPTlRST0xMRVJfTk9UX0ZPVU5ELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiBkaXNjb3ZlcmVkIGNvbnRyb2xsZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX0NPTlRST0xMRVJfVFlQRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogcmVxdWVzdGVkIGluaXRpYWxpemF0aW9uIGRhdGEgdmVyc2lvbiBpc24ndCBzdXBwb3J0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfSU5JVF9EQVRBX1ZFUlNJT04sCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZQorCSAqIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIG9mIFNBUyBQaHlzIGludG8gU0FTIFBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiByZXF1ZXN0ZWQgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcmVtb3RlIGRldmljZSwgcG9ydCwKKwkgKiBvciBjb250cm9sbGVyLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBTQ0kgaW1wbGVtZW50YXRpb24uCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfSU5GT1JNQVRJT05fVFlQRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogZGV2aWNlIGFscmVhZHkgZXhpc3RzLgorCSAqLworCVNDSV9GQUlMVVJFX0RFVklDRV9FWElTVFMsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIGFkZGluZworCSAqIGEgcGh5IHRvIHRoZSBvYmplY3QgaXMgbm90IHBvc3NpYmxlLgorCSAqLworCVNDSV9GQUlMVVJFX0FERElOR19QSFlfVU5TVVBQT1JURUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZQorCSAqIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFNDSSBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9JTkZPUk1BVElPTl9GSUVMRCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlIFNDSQorCSAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN1cHBsaWVkIHRpbWUgbGltaXQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfVElNRV9MSU1JVCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2QgZmFpbGVkLCBiZWNhdXNlIHRoZSBTQ0kKKwkgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgUGh5LgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfUEhZLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIG1ldGhvZCBmYWlsZWQsIGJlY2F1c2UgdGhlIFNDSQorCSAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBQb3J0LgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfUE9SVCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2Qgd2FzIHBhcnRseSBzdWNjZXNzZnVsCisJICogVGhlIHBvcnQgd2FzIHJlc2V0IGJ1dCBub3QgYWxsIHBoeXMgaW4gcG9ydCBhcmUgb3BlcmF0aW9uYWwKKwkgKi8KKwlTQ0lfRkFJTFVSRV9SRVNFVF9QT1JUX1BBUlRJQUxfU1VDQ0VTUywKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IGNhbGxpbmcgbWV0aG9kIGZhaWxlZAorCSAqIFRoZSBwb3J0IHJlc2V0IGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBub25lIG9mIHRoZSBwaHlzIGFyZSBvcGVyYXRpb25hbAorCSAqLworCVNDSV9GQUlMVVJFX1JFU0VUX1BPUlRfRkFJTFVSRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2QgZmFpbGVkLCBiZWNhdXNlIHRoZSBTQ0kKKwkgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGRldmljZS4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIGZhaWxlZCwgYmVjYXVzZSB0aGUgcmVtb3RlCisJICogZGV2aWNlIGlzIGluIGEgYmFkIHN0YXRlIGFuZCByZXF1aXJlcyBhIHJlc2V0LgorCSAqLworCVNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIGZhaWxlZCwgYmVjYXVzZSB0aGUgU0NJCisJICogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY29udGFpbiBvciBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgSU8gdGFnLgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfSU9fVEFHLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYW5kIHRoZSB1c2VyIHNob3VsZAorCSAqIGNoZWNrIHRoZSByZXNwb25zZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgSU8uCisJICovCisJU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCwgdGhlIGZhaWx1cmUgaXMKKwkgKiBjb250cm9sbGVyIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLCBhbmQgdGhlIHJlc3BvbnNlIGRhdGEgYXNzb2NpYXRlZAorCSAqIHdpdGggdGhlIHJlcXVlc3QgaXMgbm90IHZhbGlkLiAgWW91IGNhbiBxdWVyeSBmb3IgdGhlIGNvbnRyb2xsZXIKKwkgKiBzcGVjaWZpYyBlcnJvciBpbmZvcm1hdGlvbiB2aWEgc2NpX2NvbnRyb2xsZXJfZ2V0X3JlcXVlc3Rfc3RhdHVzKCkKKwkgKi8KKwlTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUiwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlZCB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlCisJICogdXNlciByZXF1ZXN0ZWQgdGhpcyBJTyB0byBiZSB0ZXJtaW5hdGVkLgorCSAqLworCVNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCBhbmQgdGhlIGFzc29jaWF0ZWQKKwkgKiByZXF1ZXN0IHJlcXVpcmVzIGEgU0NTSSBhYm9ydCB0YXNrIHRvIGJlIHNlbnQgdG8gdGhlIHRhcmdldC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JT19SRVFVSVJFU19TQ1NJX0FCT1JULAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgc3VwcGxpZWQKKwkgKiBkZXZpY2UgY291bGQgbm90IGJlIGxvY2F0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfREVWSUNFX05PVF9GT1VORCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlCisJICogb2JqZWN0cyBhc3NvY2lhdGlvbiBpcyByZXF1aXJlZCBhbmQgaXMgbm90IGNvcnJlY3RseSBzZXQuCisJICovCisJU0NJX0ZBSUxVUkVfSU5WQUxJRF9BU1NPQ0lBVElPTiwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkLCBiZWNhdXNlIGEgdGltZW91dAorCSAqIG9jY3VycmVkLgorCSAqLworCVNDSV9GQUlMVVJFX1RJTUVPVVQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUgdXNlcgorCSAqIHNwZWNpZmllZCBhIHZhbHVlIHRoYXQgaXMgZWl0aGVyIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlIG51bWJlcgorCSAqIG9mIG1lc3NhZ2VzIChNU0ktWCkgaXMgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9NRVNTQUdFX0NPVU5ULAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWV0aG9kIGZhaWxlZCBkdWUgdG8gYSBsYWNrIG9mCisJICogYXZhaWxhYmxlIE5DUSB0YWdzLgorCSAqLworCVNDSV9GQUlMVVJFX05PX05DUV9UQUdfQVZBSUxBQkxFLAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhIHByb3RvY29sIHZpb2xhdGlvbiBoYXMgb2NjdXJyZWQgb24gdGhlCisJICogbGluay4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9QUk9UT0NPTF9WSU9MQVRJT04sCisKKwkvKioKKwkgKiBUaGlzIHZhbHVlIGluZGljYXRlcyBhIGZhaWx1cmUgY29uZGl0aW9uIHRoYXQgcmV0cnkgbWF5IGhlbHAgdG8gY2xlYXIuCisJICovCisJU0NJX0ZBSUxVUkVfUkVUUllfUkVRVUlSRUQsCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgcmV0cnkgbGltaXQgd2FzIHJlYWNoZWQgd2hlbiBhIHJldHJ5IGlzIGF0dGVtcHRlZAorCSAqLworCVNDSV9GQUlMVVJFX1JFVFJZX0xJTUlUX1JFQUNIRUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIHdhcyBwYXJ0bHkgc3VjY2Vzc2Z1bC4KKwkgKiBNb3N0bHksIHRoaXMgc3RhdHVzIGlzIHVzZWQgd2hlbiBhIExVTl9SRVNFVCBpc3N1ZWQgdG8gYW4gZXhwYW5kZXIgYXR0YWNoZWQKKwkgKiBTVFAgZGV2aWNlIGluIFJFQURZIE5DUSBzdWJzdGF0ZSBuZWVkcyB0byBoYXZlIFJOQyBzdXNwZW5kZWQvcmVzdW1lZAorCSAqIGJlZm9yZSBwb3N0aW5nIFRDLgorCSAqLworCVNDSV9GQUlMVVJFX1JFU0VUX0RFVklDRV9QQVJUSUFMX1NVQ0NFU1MsCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyBhbiBpbGxlZ2FsIHBoeSBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSByb3V0aW5nIGF0dHJpYnV0ZQorCSAqIG9mIGJvdGggZXhwYW5kZXIgcGh5IGF0dGFjaGVkIHRvIGVhY2ggb3RoZXIuCisJICovCisJU0NJX0ZBSUxVUkVfSUxMRUdBTF9ST1VUSU5HX0FUVFJJQlVURV9DT05GSUdVUkFUSU9OLAorCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgYSBDT05GSUcgUk9VVEUgSU5GTyBjb21tYW5kIGhhcyBhIHJlc3BvbnNlIHdpdGggZnVuY3Rpb24gcmVzdWx0CisJICogSU5ERVggRE9FUyBOT1QgRVhJU1QsIHVzdWFsbHkgbWVhbnMgZXhjZWVkaW5nIG1heCByb3V0ZSBpbmRleC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9FWENFRURfTUFYX1JPVVRFX0lOREVYLAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhbiB1bnN1cHBvcnRlZCBQQ0kgZGV2aWNlIElEIGhhcyBiZWVuCisJICogc3BlY2lmaWVkLiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCBhdHRlbXB0cyB0byBpbnZva2UKKwkgKiBzY2lfbGlicmFyeV9hbGxvY2F0ZV9jb250cm9sbGVyKCkgd2lsbCBmYWlsLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BDSV9ERVZJQ0VfSUQKKworfTsKKworLyoqCisgKiBlbnVtIHNjaV9pb19zdGF0dXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIG9mIHRoZSBwb3NzaWJsZSBJTworICogICAgY29tcGxldGlvbiBzdGF0dXMgdmFsdWVzLiAgRWFjaCB2YWx1ZSBpbiB0aGlzIGVudW1lcmF0aW9uIG1hcHMgZGlyZWN0bHkKKyAqICAgIHRvIGEgdmFsdWUgaW4gdGhlIGVudW0gc2NpX3N0YXR1cyBlbnVtZXJhdGlvbi4gIFBsZWFzZSByZWZlciB0byB0aGF0CisgKiAgICBlbnVtZXJhdGlvbiBmb3IgZGV0YWlsZWQgY29tbWVudHMgY29uY2VybmluZyB3aGF0IHRoZSBzdGF0dXMgcmVwcmVzZW50cy4KKyAqCisgKiBBZGQgdGhlIEFQSSB0byByZXRyaWV2ZSB0aGUgU0NVIHN0YXR1cyBmcm9tIHRoZSBjb3JlLiBDaGVjayB0byBzZWUgdGhhdCB0aGUKKyAqIGZvbGxvd2luZyBzdGF0dXMgYXJlIHByb3Blcmx5IGhhbmRsZWQ6IC0gU0NJX0lPX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wKKyAqIC0gU0NJX0lPX0ZBSUxVUkVfSU5WQUxJRF9JT19UQUcKKyAqLworZW51bSBzY2lfaW9fc3RhdHVzIHsKKwlTQ0lfSU9fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICA9IFNDSV9TVUNDRVNTLAorCVNDSV9JT19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgID0gU0NJX0ZBSUxVUkUsCisJU0NJX0lPX1NVQ0NFU1NfQ09NUExFVEVfQkVGT1JFX1NUQVJUICAgPSBTQ0lfU1VDQ0VTU19JT19DT01QTEVURV9CRUZPUkVfU1RBUlQsCisJU0NJX0lPX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWSAgICAgICAgICAgPSBTQ0lfU1VDQ0VTU19JT19ET05FX0VBUkxZLAorCVNDSV9JT19GQUlMVVJFX0lOVkFMSURfU1RBVEUgICAgICAgICAgID0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSwKKwlTQ0lfSU9fRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTICA9IFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMsCisJU0NJX0lPX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wgICAgPSBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCwKKwlTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRCAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElELAorCVNDSV9JT19GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfRVJSID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIsCisJU0NJX0lPX0ZBSUxVUkVfVEVSTUlOQVRFRCAgICAgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JT19URVJNSU5BVEVELAorCVNDSV9JT19GQUlMVVJFX1JFUVVJUkVTX1NDU0lfQUJPUlQgICAgID0gU0NJX0ZBSUxVUkVfSU9fUkVRVUlSRVNfU0NTSV9BQk9SVCwKKwlTQ0lfSU9fRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSA9IFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLAorCVNDSV9JT19GQUlMVVJFX05PX05DUV9UQUdfQVZBSUxBQkxFICAgID0gU0NJX0ZBSUxVUkVfTk9fTkNRX1RBR19BVkFJTEFCTEUsCisJU0NJX0lPX0ZBSUxVUkVfUFJPVE9DT0xfVklPTEFUSU9OICAgICAgPSBTQ0lfRkFJTFVSRV9QUk9UT0NPTF9WSU9MQVRJT04sCisKKwlTQ0lfSU9fRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEID0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCwKKworCVNDSV9JT19GQUlMVVJFX1JFVFJZX1JFUVVJUkVEICAgICAgPSBTQ0lfRkFJTFVSRV9SRVRSWV9SRVFVSVJFRCwKKwlTQ0lfSU9fRkFJTFVSRV9SRVRSWV9MSU1JVF9SRUFDSEVEID0gU0NJX0ZBSUxVUkVfUkVUUllfTElNSVRfUkVBQ0hFRCwKKwlTQ0lfSU9fRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UKK307CisKKy8qKgorICogZW51bSBzY2lfdGFza19zdGF0dXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIG9mIHRoZSBwb3NzaWJsZSB0YXNrCisgKiAgICBjb21wbGV0aW9uIHN0YXR1cyB2YWx1ZXMuICBFYWNoIHZhbHVlIGluIHRoaXMgZW51bWVyYXRpb24gbWFwcyBkaXJlY3RseQorICogICAgdG8gYSB2YWx1ZSBpbiB0aGUgZW51bSBzY2lfc3RhdHVzIGVudW1lcmF0aW9uLiAgUGxlYXNlIHJlZmVyIHRvIHRoYXQKKyAqICAgIGVudW1lcmF0aW9uIGZvciBkZXRhaWxlZCBjb21tZW50cyBjb25jZXJuaW5nIHdoYXQgdGhlIHN0YXR1cyByZXByZXNlbnRzLgorICoKKyAqIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBmb2xsb3dpbmcgc3RhdHVzIGFyZSBwcm9wZXJseSBoYW5kbGVkOgorICovCitlbnVtIHNjaV90YXNrX3N0YXR1cyB7CisJU0NJX1RBU0tfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICA9IFNDSV9TVUNDRVNTLAorCVNDSV9UQVNLX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgPSBTQ0lfRkFJTFVSRSwKKwlTQ0lfVEFTS19GQUlMVVJFX0lOVkFMSURfU1RBVEUgICAgICAgICAgID0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSwKKwlTQ0lfVEFTS19GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgID0gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUywKKwlTQ0lfVEFTS19GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MICAgID0gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wsCisJU0NJX1RBU0tfRkFJTFVSRV9JTlZBTElEX1RBRyAgICAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lOVkFMSURfSU9fVEFHLAorCVNDSV9UQVNLX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRCwKKwlTQ0lfVEFTS19GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfRVJSID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIsCisJU0NJX1RBU0tfRkFJTFVSRV9URVJNSU5BVEVEICAgICAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQsCisJU0NJX1RBU0tfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSA9IFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLAorCisJU0NJX1RBU0tfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEID0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCwKKwlTQ0lfVEFTS19GQUlMVVJFX1JFU0VUX0RFVklDRV9QQVJUSUFMX1NVQ0NFU1MgPSBTQ0lfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTCisKK307CisKKy8qKgorICogc2NpX3N3YWIzMl9jcHkgLSBjb252ZXJ0IGJldHdlZW4gc2NzaSBhbmQgc2N1LWhhcmR3YXJlIGJ5dGUgZm9ybWF0CisgKiBAZGVzdDogcmVjZWl2ZSB0aGUgNC1ieXRlIGVuZGlhbiBzd2FwcGVkIHZlcnNpb24gb2Ygc3JjCisgKiBAc3JjOiB3b3JkIGFsaWduZWQgc291cmNlIGJ1ZmZlcgorICoKKyAqIHNjdSBoYXJkd2FyZSBoYW5kbGVzIFNTUC9TTVAgY29udHJvbCwgcmVzcG9uc2UsIGFuZCB1bmlkZW50aWZpZWQKKyAqIGZyYW1lcyBpbiAiYmlnIGVuZGlhbiBkd29yZCIgb3JkZXIuICBSZWdhcmRsZXNzIG9mIGhvc3QgZW5kaWFuIHRoaXMKKyAqIGlzIGFsd2F5cyBhIHN3YWIzMigpLXBlci1kd29yZCBjb252ZXJzaW9uIG9mIHRoZSBzdGFuZGFyZCBkZWZpbml0aW9uLAorICogaS5lLiBzaW5nbGUgYnl0ZSBmaWVsZHMgc3dhcHBlZCBhbmQgbXVsdGktYnl0ZSBmaWVsZHMgaW4gbGl0dGxlLQorICogZW5kaWFuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2lfc3dhYjMyX2NweSh2b2lkICpfZGVzdCwgdm9pZCAqX3NyYywgc3NpemVfdCB3b3JkX2NudCkKK3sKKwl1MzIgKmRlc3QgPSBfZGVzdCwgKnNyYyA9IF9zcmM7CisKKwl3aGlsZSAoLS13b3JkX2NudCA+PSAwKQorCQlkZXN0W3dvcmRfY250XSA9IHN3YWIzMihzcmNbd29yZF9jbnRdKTsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbm9fb3V0Ym91bmRfdGFza190bzsKK2V4dGVybiB1MTYgc3NwX21heF9vY2NfdG87CitleHRlcm4gdTE2IHN0cF9tYXhfb2NjX3RvOworZXh0ZXJuIHUxNiBzc3BfaW5hY3RpdmVfdG87CitleHRlcm4gdTE2IHN0cF9pbmFjdGl2ZV90bzsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBoeV9nZW47CitleHRlcm4gdW5zaWduZWQgY2hhciBtYXhfY29uY3Vycl9zcGludXA7CisKK2lycXJldHVybl90IGlzY2lfbXNpeF9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSk7CitpcnFyZXR1cm5fdCBpc2NpX2ludHhfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpOworaXJxcmV0dXJuX3QgaXNjaV9lcnJvcl9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSk7CisKKy8qCisgKiBFYWNoIHRpbWVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNhbmNlbGxhdGlvbiBmbGFnIHRoYXQgaXMgc2V0IHdoZW4KKyAqIGRlbF90aW1lcigpIGlzIGNhbGxlZCBhbmQgY2hlY2tlZCBpbiB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uIFRoaXMKKyAqIGlzIG5lZWRlZCBzaW5jZSBkZWxfdGltZXJfc3luYygpIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBzY2lfbG9jayBoZWxkLgorICogRm9yIGRlaW5pdCBob3dldmVyLCBkZWxfdGltZXJfc3luYygpIGlzIHVzZWQgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLgorICovCitzdHJ1Y3Qgc2NpX3RpbWVyIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlib29sCQkJY2FuY2VsOworfTsKKworc3RhdGljIGlubGluZQordm9pZCBzY2lfaW5pdF90aW1lcihzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIsIHZvaWQgKCpmbikodW5zaWduZWQgbG9uZykpCit7CisJdG1yLT50aW1lci5mdW5jdGlvbiA9IGZuOworCXRtci0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0bXI7CisJdG1yLT5jYW5jZWwgPSAwOworCWluaXRfdGltZXIoJnRtci0+dGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX21vZF90aW1lcihzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIsIHVuc2lnbmVkIGxvbmcgbXNlYykKK3sKKwl0bXItPmNhbmNlbCA9IDA7CisJbW9kX3RpbWVyKCZ0bXItPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtc2VjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2lfZGVsX3RpbWVyKHN0cnVjdCBzY2lfdGltZXIgKnRtcikKK3sKKwl0bXItPmNhbmNlbCA9IDE7CisJZGVsX3RpbWVyKCZ0bXItPnRpbWVyKTsKK30KKworc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgeworCWNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSAqc3RhdGVfdGFibGU7CisJdTMyIGluaXRpYWxfc3RhdGVfaWQ7CisJdTMyIGN1cnJlbnRfc3RhdGVfaWQ7CisJdTMyIHByZXZpb3VzX3N0YXRlX2lkOworfTsKKwordHlwZWRlZiB2b2lkICgqc2NpX3N0YXRlX3RyYW5zaXRpb25fdCkoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKTsKKworc3RydWN0IHNjaV9iYXNlX3N0YXRlIHsKKwlzY2lfc3RhdGVfdHJhbnNpdGlvbl90IGVudGVyX3N0YXRlOwkvKiBDYWxsZWQgb24gc3RhdGUgZW50cnkgKi8KKwlzY2lfc3RhdGVfdHJhbnNpdGlvbl90IGV4aXRfc3RhdGU7CS8qIENhbGxlZCBvbiBzdGF0ZSBleGl0ICovCit9OworCitleHRlcm4gdm9pZCBzY2lfaW5pdF9zbShzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20sCisJCQljb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgKnN0YXRlX3RhYmxlLAorCQkJdTMyIGluaXRpYWxfc3RhdGUpOworZXh0ZXJuIHZvaWQgc2NpX2NoYW5nZV9zdGF0ZShzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20sIHUzMiBuZXh0X3N0YXRlKTsKKyNlbmRpZiAgLyogX19JU0NJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTMxM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJzY3VfZXZlbnRfY29kZXMuaCIKKyNpbmNsdWRlICJwcm9iZV9yb21zLmgiCisKKy8qIE1heGltdW0gYXJiaXRyYXRpb24gd2FpdCB0aW1lIGluIG1pY3JvLXNlY29uZHMgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUEhZX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUUgICg3MDApCisKK2VudW0gc2FzX2xpbmtyYXRlIHNjaV9waHlfbGlua3JhdGUoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXJldHVybiBpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX3BoeV90cmFuc3BvcnRfbGF5ZXJfaW5pdGlhbGl6YXRpb24oc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N1X3RyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqcmVnKQoreworCXUzMiB0bF9jb250cm9sOworCisJaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyA9IHJlZzsKKworCXdyaXRlbChTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgsCisJCSZpcGh5LT50cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLT5zdHBfcm5pKTsKKworCS8qCisJICogSGFyZHdhcmUgdGVhbSByZWNvbW1lbmRzIHRoYXQgd2UgZW5hYmxlIHRoZSBTVFAgcHJlZmV0Y2ggZm9yIGFsbAorCSAqIHRyYW5zcG9ydHMKKwkgKi8KKwl0bF9jb250cm9sID0gcmVhZGwoJmlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXRsX2NvbnRyb2wgfD0gU0NVX1RMQ1JfR0VOX0JJVChTVFBfV1JJVEVfREFUQV9QUkVGRVRDSCk7CisJd3JpdGVsKHRsX2NvbnRyb2wsICZpcGh5LT50cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX3BoeV9saW5rX2xheWVyX2luaXRpYWxpemF0aW9uKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkgIHN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqcmVnKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCWludCBwaHlfaWR4ID0gaXBoeS0+cGh5X2luZGV4OworCXN0cnVjdCBzY2lfcGh5X3VzZXJfcGFyYW1zICpwaHlfdXNlciA9ICZpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbcGh5X2lkeF07CisJc3RydWN0IHNjaV9waHlfb2VtX3BhcmFtcyAqcGh5X29lbSA9CisJCSZpaG9zdC0+b2VtX3BhcmFtZXRlcnMucGh5c1twaHlfaWR4XTsKKwl1MzIgcGh5X2NvbmZpZ3VyYXRpb247CisJc3RydWN0IHNjaV9waHlfY2FwIHBoeV9jYXA7CisJdTMyIHBhcml0eV9jaGVjayA9IDA7CisJdTMyIHBhcml0eV9jb3VudCA9IDA7CisJdTMyIGxsY3RsLCBsaW5rX3JhdGU7CisJdTMyIGNsa3NtX3ZhbHVlID0gMDsKKworCWlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzID0gcmVnOworCisJLyogU2V0IG91ciBJREVOVElGWSBmcmFtZSBkYXRhICovCisJI2RlZmluZSBTQ0lfRU5EX0RFVklDRSAweDAxCisKKwl3cml0ZWwoU0NVX1NBU19USUlEX0dFTl9CSVQoU01QX0lOSVRJQVRPUikgfAorCSAgICAgICBTQ1VfU0FTX1RJSURfR0VOX0JJVChTU1BfSU5JVElBVE9SKSB8CisJICAgICAgIFNDVV9TQVNfVElJRF9HRU5fQklUKFNUUF9JTklUSUFUT1IpIHwKKwkgICAgICAgU0NVX1NBU19USUlEX0dFTl9CSVQoREFfU0FUQV9IT1NUKSB8CisJICAgICAgIFNDVV9TQVNfVElJRF9HRU5fVkFMKERFVklDRV9UWVBFLCBTQ0lfRU5EX0RFVklDRSksCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+dHJhbnNtaXRfaWRlbnRpZmljYXRpb24pOworCisJLyogV3JpdGUgdGhlIGRldmljZSBTQVMgQWRkcmVzcyAqLworCXdyaXRlbCgweEZFRENCQTk4LAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnNhc19kZXZpY2VfbmFtZV9oaWdoKTsKKwl3cml0ZWwocGh5X2lkeCwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zYXNfZGV2aWNlX25hbWVfbG93KTsKKworCS8qIFdyaXRlIHRoZSBzb3VyY2UgU0FTIEFkZHJlc3MgKi8KKwl3cml0ZWwocGh5X29lbS0+c2FzX2FkZHJlc3MuaGlnaCwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfaGlnaCk7CisJd3JpdGVsKHBoeV9vZW0tPnNhc19hZGRyZXNzLmxvdywKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfbG93KTsKKworCS8qIENsZWFyIGFuZCBTZXQgdGhlIFBIWSBJZGVudGlmaWVyICovCisJd3JpdGVsKDAsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+aWRlbnRpZnlfZnJhbWVfcGh5X2lkKTsKKwl3cml0ZWwoU0NVX1NBU19USVBJRF9HRU5fVkFMVUUoSUQsIHBoeV9pZHgpLAorCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmlkZW50aWZ5X2ZyYW1lX3BoeV9pZCk7CisKKwkvKiBDaGFuZ2UgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHBoeSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJcGh5X2NvbmZpZ3VyYXRpb24gPQorCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCS8qIEhvbGQgT09CIHN0YXRlIG1hY2hpbmUgaW4gcmVzZXQgKi8KKwlwaHlfY29uZmlndXJhdGlvbiB8PSAgU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwl3cml0ZWwocGh5X2NvbmZpZ3VyYXRpb24sCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJLyogQ29uZmlndXJlIHRoZSBTTlcgY2FwYWJpbGl0aWVzICovCisJcGh5X2NhcC5hbGwgPSAwOworCXBoeV9jYXAuc3RhcnQgPSAxOworCXBoeV9jYXAuZ2VuM19ub19zc2MgPSAxOworCXBoeV9jYXAuZ2VuMl9ub19zc2MgPSAxOworCXBoeV9jYXAuZ2VuMV9ub19zc2MgPSAxOworCWlmIChpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5kb19lbmFibGVfc3NjID09IHRydWUpIHsKKwkJcGh5X2NhcC5nZW4zX3NzYyA9IDE7CisJCXBoeV9jYXAuZ2VuMl9zc2MgPSAxOworCQlwaHlfY2FwLmdlbjFfc3NjID0gMTsKKwl9CisKKwkvKgorCSAqIFRoZSBTQVMgc3BlY2lmaWNhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGh5X2NhcGFiaWxpdGllcyB0aGF0CisJICogYXJlIHRyYW5zbWl0dGVkIHNoYWxsIGhhdmUgYW4gZXZlbiBwYXJpdHkuICBDYWxjdWxhdGUgdGhlIHBhcml0eS4gKi8KKwlwYXJpdHlfY2hlY2sgPSBwaHlfY2FwLmFsbDsKKwl3aGlsZSAocGFyaXR5X2NoZWNrICE9IDApIHsKKwkJaWYgKHBhcml0eV9jaGVjayAmIDB4MSkKKwkJCXBhcml0eV9jb3VudCsrOworCQlwYXJpdHlfY2hlY2sgPj49IDE7CisJfQorCisJLyoKKwkgKiBJZiBwYXJpdHkgaW5kaWNhdGVzIHRoZXJlIGFyZSBhbiBvZGQgbnVtYmVyIG9mIGJpdHMgc2V0LCB0aGVuCisJICogc2V0IHRoZSBwYXJpdHkgYml0IHRvIDEgaW4gdGhlIHBoeSBjYXBhYmlsaXRpZXMuICovCisJaWYgKChwYXJpdHlfY291bnQgJSAyKSAhPSAwKQorCQlwaHlfY2FwLnBhcml0eSA9IDE7CisKKwl3cml0ZWwocGh5X2NhcC5hbGwsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NhcGFiaWxpdGllcyk7CisKKwkvKiBTZXQgdGhlIGVuYWJsZSBzcGludXAgcGVyaW9kIGJ1dCBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIHNlbmQKKwkgKiBub3RpZnkgZW5hYmxlIHNwaW51cAorCSAqLworCXdyaXRlbChTQ1VfRU5TUElOVVBfR0VOX1ZBTChDT1VOVCwKKwkJCXBoeV91c2VyLT5ub3RpZnlfZW5hYmxlX3NwaW5fdXBfaW5zZXJ0aW9uX2ZyZXF1ZW5jeSksCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisKKwkvKiBXcml0ZSB0aGUgQUxJR04gSW5zZXJ0aW9uIEZlcmVxdWVuY3kgZm9yIGNvbm5lY3RlZCBwaHkgYW5kCisJICogaW5wZW5kZW50IG9mIGNvbm5lY3RlZCBzdGF0ZQorCSAqLworCWNsa3NtX3ZhbHVlID0gU0NVX0FMSUdOX0lOU0VSVElPTl9GUkVRVUVOQ1lfR0VOX1ZBTChDT05ORUNURUQsCisJCQlwaHlfdXNlci0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5KTsKKworCWNsa3NtX3ZhbHVlIHw9IFNDVV9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0dFTl9WQUwoR0VORVJBTCwKKwkJCXBoeV91c2VyLT5hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5KTsKKworCXdyaXRlbChjbGtzbV92YWx1ZSwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5jbG9ja19za2V3X21hbmFnZW1lbnQpOworCisJLyogQHRvZG8gUHJvdmlkZSBhIHdheSB0byB3cml0ZSB0aGlzIHJlZ2lzdGVyIGNvcnJlY3RseSAqLworCXdyaXRlbCgweDAyMTA4NDIxLAorCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmFmZV9sb29rdXBfdGFibGVfY29udHJvbCk7CisKKwlsbGN0bCA9IFNDVV9TQVNfTExDVExfR0VOX1ZBTChOT19PVVRCT1VORF9UQVNLX1RJTUVPVVQsCisJCSh1OClpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLm5vX291dGJvdW5kX3Rhc2tfdGltZW91dCk7CisKKwlzd2l0Y2ggKHBoeV91c2VyLT5tYXhfc3BlZWRfZ2VuZXJhdGlvbikgeworCWNhc2UgU0NJQ19TRFNfUEFSTV9HRU4zX1NQRUVEOgorCQlsaW5rX3JhdGUgPSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjM7CisJCWJyZWFrOworCWNhc2UgU0NJQ19TRFNfUEFSTV9HRU4yX1NQRUVEOgorCQlsaW5rX3JhdGUgPSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbmtfcmF0ZSA9IFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfR0VOMTsKKwkJYnJlYWs7CisJfQorCWxsY3RsIHw9IFNDVV9TQVNfTExDVExfR0VOX1ZBTChNQVhfTElOS19SQVRFLCBsaW5rX3JhdGUpOworCXdyaXRlbChsbGN0bCwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5saW5rX2xheWVyX2NvbnRyb2wpOworCisJaWYgKGlzX2EyKGlob3N0LT5wZGV2KSkgeworCQkvKiBQcm9ncmFtIHRoZSBtYXggQVJCIHRpbWUgZm9yIHRoZSBQSFkgdG8gNzAwdXMgc28gd2UgaW50ZXItb3BlcmF0ZSB3aXRoCisJCSAqIHRoZSBQTUMgZXhwYW5kZXIgd2hpY2ggc2h1dHMgZG93biBQSFlzIGlmIHRoZSBleHBhbmRlciBQSFkgZ2VuZXJhdGVzIHRvbworCQkgKiBtYW55IGJyZWFrcy4gIFRoaXMgdGltZSB2YWx1ZSB3aWxsIGd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWF0b3IgUEhZIHdpbGwKKwkJICogZ2VuZXJhdGUgdGhlIGJyZWFrLgorCQkgKi8KKwkJd3JpdGVsKFNDSUNfU0RTX1BIWV9NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FLAorCQkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5tYXhpbXVtX2FyYml0cmF0aW9uX3dhaXRfdGltZXJfdGltZW91dCk7CisJfQorCisJLyogRGlzYWJsZSBsaW5rIGxheWVyIGhhbmcgZGV0ZWN0aW9uLCByZWx5IG9uIHRoZSBPUyB0aW1lb3V0IGZvciBJL08gdGltZW91dHMuICovCisJd3JpdGVsKDAsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9oYW5nX2RldGVjdGlvbl90aW1lb3V0KTsKKworCS8qIFdlIGNhbiBleGl0IHRoZSBpbml0aWFsIHN0YXRlIHRvIHRoZSBzdG9wcGVkIHN0YXRlICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RPUFBFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHBoeV9zYXRhX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKmlwaHkpLCBzYXRhX3RpbWVyKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwaHktPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkgIiVzOiBTQ0lDIFNEUyBQaHkgMHglcCBkaWQgbm90IHJlY2VpdmUgc2lnbmF0dXJlIGZpcyBiZWZvcmUgIgorCQkgInRpbWVvdXQuXG4iLAorCQkgX19mdW5jX18sCisJCSBpcGh5KTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBvcnQgY3VycmVudGx5IGNvbnRhaW5pbmcgdGhpcyBwaHkuIElmIHRoZSBwaHkgaXMKKyAqICAgIGN1cnJlbnRseSBjb250YWluZWQgYnkgdGhlIGR1bW15IHBvcnQsIHRoZW4gdGhlIHBoeSBpcyBjb25zaWRlcmVkIHRvIG5vdAorICogICAgYmUgcGFydCBvZiBhIHBvcnQuCisgKiBAc2NpX3BoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwaHkgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZQorICogICAgY29udGFpbmluZyBwb3J0LgorICoKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBoYW5kbGUgdG8gYSBwb3J0IHRoYXQgY29udGFpbnMgdGhlIHN1cHBsaWVkIHBoeS4KKyAqIE5VTEwgVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgcGh5IGlzIG5vdCBwYXJ0IG9mIGEgcmVhbAorICogcG9ydCAoaS5lLiBpdCdzIGNvbnRhaW5lZCBpbiB0aGUgZHVtbXkgcG9ydCkuICFOVUxMIEFsbCBvdGhlcgorICogdmFsdWVzIGluZGljYXRlIGEgaGFuZGxlL3BvaW50ZXIgdG8gdGhlIHBvcnQgY29udGFpbmluZyB0aGUgcGh5LgorICovCitzdHJ1Y3QgaXNjaV9wb3J0ICpwaHlfZ2V0X25vbl9kdW1teV9wb3J0KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlwaHktPm93bmluZ19wb3J0OworCisJaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IFNDSUNfU0RTX0RVTU1ZX1BPUlQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlwaHktPm93bmluZ19wb3J0OworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHdpbGwgYXNzaWduIGEgcG9ydCB0byB0aGUgcGh5IG9iamVjdC4KKyAqIEBvdXRdOiBpcGh5IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcGh5IGZvciB3aGljaCB0byBhc3NpZ24gYSBwb3J0CisgKiAgICBvYmplY3QuCisgKgorICoKKyAqLwordm9pZCBzY2lfcGh5X3NldF9wb3J0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlpcGh5LT5vd25pbmdfcG9ydCA9IGlwb3J0OworCisJaWYgKGlwaHktPmJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQpIHsKKwkJaXBoeS0+YmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZCA9IGZhbHNlOworCQlzY2lfcG9ydF9icm9hZGNhc3RfY2hhbmdlX3JlY2VpdmVkKGlwaHktPm93bmluZ19wb3J0LCBpcGh5KTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2luaXRpYWxpemUoc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCSAgIHN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICp0bCwKKwkJCQkgICBzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKmxsKQoreworCS8qIFBlcmZyb20gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBUTCBoYXJkd2FyZSAqLworCXNjaV9waHlfdHJhbnNwb3J0X2xheWVyX2luaXRpYWxpemF0aW9uKGlwaHksIHRsKTsKKworCS8qIFBlcm9mcm0gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBQRSBoYXJkd2FyZSAqLworCXNjaV9waHlfbGlua19sYXllcl9pbml0aWFsaXphdGlvbihpcGh5LCBsbCk7CisKKwkvKiBUaGVyZSBpcyBub3RoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBpbiB0aGlzIHN0YXRlIGp1c3QKKwkgKiB0cmFuc2l0aW9uIHRvIHRoZSBzdG9wcGVkIHN0YXRlCisJICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RPUFBFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgYXNzaWducyB0aGUgZGlyZWN0IGF0dGFjaGVkIGRldmljZSBJRCBmb3IgdGhpcyBwaHkuCisgKgorICogQGlwaHkgVGhlIHBoeSBmb3Igd2hpY2ggdGhlIGRpcmVjdCBhdHRhY2hlZCBkZXZpY2UgaWQgaXMgdG8KKyAqICAgICAgIGJlIGFzc2lnbmVkLgorICogQGRldmljZV9pZCBUaGUgZGlyZWN0IGF0dGFjaGVkIGRldmljZSBJRCB0byBhc3NpZ24gdG8gdGhlIHBoeS4KKyAqICAgICAgIFRoaXMgd2lsbCBlaXRoZXIgYmUgdGhlIFJOaSBmb3IgdGhlIGRldmljZSBvciBhbiBpbnZhbGlkIFJOaSBpZiB0aGVyZQorICogICAgICAgaXMgbm8gY3VycmVudCBkZXZpY2UgYXNzaWduZWQgdG8gdGhlIHBoeS4KKyAqLwordm9pZCBzY2lfcGh5X3NldHVwX3RyYW5zcG9ydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHksIHUzMiBkZXZpY2VfaWQpCit7CisJdTMyIHRsX2NvbnRyb2w7CisKKwl3cml0ZWwoZGV2aWNlX2lkLCAmaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycy0+c3RwX3JuaSk7CisKKwkvKgorCSAqIFRoZSByZWFkIHNob3VsZCBndWFyYW50ZWUgdGhhdCB0aGUgZmlyc3Qgd3JpdGUgZ2V0cyBwb3N0ZWQKKwkgKiBiZWZvcmUgdGhlIG5leHQgd3JpdGUKKwkgKi8KKwl0bF9jb250cm9sID0gcmVhZGwoJmlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXRsX2NvbnRyb2wgfD0gU0NVX1RMQ1JfR0VOX0JJVChDTEVBUl9UQ0lfTkNRX01BUFBJTkdfVEFCTEUpOworCXdyaXRlbCh0bF9jb250cm9sLCAmaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3VzcGVuZChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXNjdV9zYXNfcGNmZ192YWx1ZSB8PSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChTVVNQRU5EX1BST1RPQ09MX0VOR0lORSk7CisJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwlzY2lfcGh5X3NldHVwX3RyYW5zcG9ydChpcGh5LCBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpOworfQorCit2b2lkIHNjaV9waHlfcmVzdW1lKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwl1MzIgc2N1X3Nhc19wY2ZnX3ZhbHVlOworCisJc2N1X3Nhc19wY2ZnX3ZhbHVlID0KKwkJcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJc2N1X3Nhc19wY2ZnX3ZhbHVlICY9IH5TQ1VfU0FTX1BDRkdfR0VOX0JJVChTVVNQRU5EX1BST1RPQ09MX0VOR0lORSk7CisJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7Cit9CisKK3ZvaWQgc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3Moc3RydWN0IGlzY2lfcGh5ICppcGh5LCBzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXMpCit7CisJc2FzLT5oaWdoID0gcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfaGlnaCk7CisJc2FzLT5sb3cgPSByZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnNvdXJjZV9zYXNfYWRkcmVzc19sb3cpOworfQorCit2b2lkIHNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzKQoreworCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgKmlhZjsKKworCWlhZiA9ICZpcGh5LT5mcmFtZV9yY3ZkLmlhZjsKKwltZW1jcHkoc2FzLCBpYWYtPnNhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKK30KKwordm9pZCBzY2lfcGh5X2dldF9wcm90b2NvbHMoc3RydWN0IGlzY2lfcGh5ICppcGh5LCBzdHJ1Y3Qgc2NpX3BoeV9wcm90byAqcHJvdG8pCit7CisJcHJvdG8tPmFsbCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+dHJhbnNtaXRfaWRlbnRpZmljYXRpb24pOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9zdGFydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1BIWV9TVE9QUEVEKSB7CisJCWRldl9kYmcoc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfc3RvcChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NVQl9JTklUSUFMOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfT1NTUF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19TUEVFRF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVI6CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU46CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGOgorCWNhc2UgU0NJX1BIWV9TVUJfRklOQUw6CisJY2FzZSBTQ0lfUEhZX1JFQURZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RPUFBFRCk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9yZXNldChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1BIWV9SRUFEWSkgeworCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfUkVTRVRUSU5HKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2NvbnN1bWVfcG93ZXJfaGFuZGxlcihzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVI6IHsKKwkJdTMyIGVuYWJsZV9zcGludXA7CisKKwkJZW5hYmxlX3NwaW51cCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisJCWVuYWJsZV9zcGludXAgfD0gU0NVX0VOU1BJTlVQX0dFTl9CSVQoRU5BQkxFKTsKKwkJd3JpdGVsKGVuYWJsZV9zcGludXAsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisKKwkJLyogQ2hhbmdlIHN0YXRlIHRvIHRoZSBmaW5hbCBzdGF0ZSB0aGlzIHN1YnN0YXRlIG1hY2hpbmUgaGFzIHJ1biB0byBjb21wbGV0aW9uICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9GSU5BTCk7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVI6IHsKKwkJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCQkvKiBSZWxlYXNlIHRoZSBzcGludXAgaG9sZCBzdGF0ZSBhbmQgcmVzZXQgdGhlIE9PQiBzdGF0ZSBtYWNoaW5lICovCisJCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKwkJc2N1X3Nhc19wY2ZnX3ZhbHVlICY9CisJCQl+KFNDVV9TQVNfUENGR19HRU5fQklUKFNBVEFfU1BJTlVQX0hPTEQpIHwgU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX0VOQUJMRSkpOworCQlzY3Vfc2FzX3BjZmdfdmFsdWUgfD0gU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwkJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJCS8qIE5vdyByZXN0YXJ0IHRoZSBPT0Igb3BlcmF0aW9uICovCisJCXNjdV9zYXNfcGNmZ192YWx1ZSAmPSB+U0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwkJc2N1X3Nhc19wY2ZnX3ZhbHVlIHw9IFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9FTkFCTEUpOworCQl3cml0ZWwoc2N1X3Nhc19wY2ZnX3ZhbHVlLAorCQkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwkJLyogQ2hhbmdlIHN0YXRlIHRvIHRoZSBmaW5hbCBzdGF0ZSB0aGlzIHN1YnN0YXRlIG1hY2hpbmUgaGFzIHJ1biB0byBjb21wbGV0aW9uICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTik7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwlkZWZhdWx0OgorCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwkvKiBjb250aW51ZSB0aGUgbGluayB0cmFpbmluZyBmb3IgdGhlIHBoeSBhcyBpZiBpdCB3ZXJlIGEgU0FTIFBIWQorCSAqIGluc3RlYWQgb2YgYSBTQVRBIFBIWS4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIGNvbXBsZXRpb24gcXVldWUgaGFkIGEgU0FTCisJICogUEhZIERFVEVDVEVEIGV2ZW50IHdoZW4gdGhlIHN0YXRlIG1hY2hpbmUgd2FzIGV4cGVjdGluZyBhIFNBVEEgUEhZIGV2ZW50LgorCSAqLworCXUzMiBwaHlfY29udHJvbDsKKworCXBoeV9jb250cm9sID0gcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJcGh5X2NvbnRyb2wgfD0gU0NVX1NBU19QQ0ZHX0dFTl9CSVQoU0FUQV9TUElOVVBfSE9MRCk7CisJd3JpdGVsKHBoeV9jb250cm9sLAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU4pOworCisJaXBoeS0+cHJvdG9jb2wgPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FTOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0X3NhdGFfbGlua190cmFpbmluZyhzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJLyogVGhpcyBtZXRob2QgY29udGludWVzIHRoZSBsaW5rIHRyYWluaW5nIGZvciB0aGUgcGh5IGFzIGlmIGl0IHdlcmUgYSBTQVRBIFBIWQorCSAqIGluc3RlYWQgb2YgYSBTQVMgUEhZLiAgVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIGNvbXBsZXRpb24gcXVldWUgaGFkIGEgU0FUQQorCSAqIFNQSU5VUCBIT0xEIGV2ZW50IHdoZW4gdGhlIHN0YXRlIG1hY2hpbmUgd2FzIGV4cGVjdGluZyBhIFNBUyBQSFkgZXZlbnQuIG5vbmUKKwkgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUik7CisKKwlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVRBOworfQorCisvKioKKyAqIHNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyAtIHBlcmZvcm0gcHJvY2Vzc2luZyBjb21tb24gdG8KKyAqICAgIGFsbCBwcm90b2NvbHMgdXBvbiBjb21wbGV0aW9uIG9mIGxpbmsgdHJhaW5pbmcuCisgKiBAc2NpX3BoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwaHkgb2JqZWN0IGZvciB3aGljaCBsaW5rIHRyYWluaW5nCisgKiAgICBoYXMgY29tcGxldGVkLgorICogQG1heF9saW5rX3JhdGU6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbWF4aW11bSBsaW5rIHJhdGUgdG8gYmUKKyAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBoeS4KKyAqIEBuZXh0X3N0YXRlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG5leHQgc3RhdGUgZm9yIHRoZSBwaHkncyBzdGFydGluZworICogICAgc3ViLXN0YXRlIG1hY2hpbmUuCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCQkgICBlbnVtIHNhc19saW5rcmF0ZSBtYXhfbGlua19yYXRlLAorCQkJCQkgICB1MzIgbmV4dF9zdGF0ZSkKK3sKKwlpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA9IG1heF9saW5rX3JhdGU7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgbmV4dF9zdGF0ZSk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2V2ZW50X2hhbmRsZXIoc3RydWN0IGlzY2lfcGh5ICppcGh5LCB1MzIgZXZlbnRfY29kZSkKK3sKKwllbnVtIHNjaV9waHlfc3RhdGVzIHN0YXRlID0gaXBoeS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU46CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBU19QSFlfREVURUNURUQ6CisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9TUElOVVBfSE9MRDoKKwkJCXNjaV9waHlfc3RhcnRfc2F0YV9saW5rX3RyYWluaW5nKGlwaHkpOworCQkJaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWV2ZW50X2NvZGUpOworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19TUEVFRF9FTjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qCisJCQkgKiBXaHkgaXMgdGhpcyBiZWluZyByZXBvcnRlZCBhZ2FpbiBieSB0aGUgY29udHJvbGxlcj8KKwkJCSAqIFdlIHdvdWxkIHJlLWVudGVyIHRoaXMgc3RhdGUgc28ganVzdCBzdGF5IGhlcmUgKi8KKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVNfMTU6CisJCWNhc2UgU0NVX0VWRU5UX1NBU18xNV9TU0M6CisJCQlzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoaXBoeSwgU0FTX0xJTktfUkFURV8xXzVfR0JQUywKKwkJCQkJCSAgICAgICBTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUYpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBU18zMDoKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTXzMwX1NTQzoKKwkJCXNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyhpcGh5LCBTQVNfTElOS19SQVRFXzNfMF9HQlBTLAorCQkJCQkJICAgICAgIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTXzYwOgorCQljYXNlIFNDVV9FVkVOVF9TQVNfNjBfU1NDOgorCQkJc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKGlwaHksIFNBU19MSU5LX1JBVEVfNl8wX0dCUFMsCisJCQkJCQkgICAgICAgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBX1NQSU5VUF9IT0xEOgorCQkJLyoKKwkJCSAqIFdlIHdlcmUgZG9pbmcgU0FTIFBIWSBsaW5rIHRyYWluaW5nIGFuZCByZWNlaXZlZCBhIFNBVEEgUEhZIGV2ZW50CisJCQkgKiBjb250aW51ZSBPT0IvU04gYXMgaWYgdGhpcyB3ZXJlIGEgU0FUQSBQSFkgKi8KKwkJCXNjaV9waHlfc3RhcnRfc2F0YV9saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX0xJTktfRkFJTFVSRToKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLCBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEOgorCQkJLyogQmFja3VwIHRoZSBzdGF0ZSBtYWNoaW5lICovCisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCQkvKiBXZSB3ZXJlIGRvaW5nIFNBUyBQSFkgbGluayB0cmFpbmluZyBhbmQgcmVjZWl2ZWQgYQorCQkJICogU0FUQSBQSFkgZXZlbnQgY29udGludWUgT09CL1NOIGFzIGlmIHRoaXMgd2VyZSBhCisJCQkgKiBTQVRBIFBIWQorCQkJICovCisJCQlzY2lfcGh5X3N0YXJ0X3NhdGFfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9SRUNFSVZFRF9JREVOVElGWV9USU1FT1VUOgorCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCWNhc2UgU0NVX0VWRU5UX0hBUkRfUkVTRVRfUkVDRUlWRUQ6CisJCQkvKiBTdGFydCB0aGUgb29iL3NuIHN0YXRlIG1hY2hpbmUgb3ZlciBhZ2FpbiAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSAiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sIGV2ZW50X2NvZGUpOworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgdW5leHBlY3RlZCAiCisJCQkJImV2ZW50X2NvZGUgJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJZXZlbnRfY29kZSk7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCX0KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCQkvKiBUaGVzZSBldmVudHMgYXJlIHJlY2VpdmVkIGV2ZXJ5IDEwbXMgYW5kIGFyZQorCQkJICogZXhwZWN0ZWQgd2hpbGUgaW4gdGhpcyBzdGF0ZQorCQkJICovCisJCQlicmVhazsKKworCQljYXNlIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEOgorCQkJLyogVGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIHBoeSB0eXBlIGJlZm9yZSBPT0IvU04gZm9yIHRoZQorCQkJICogU0FUQSBmaW5pc2hlZCBzdGFydCBkb3duIHRoZSBTQVMgbGluayB0cmFuaW5nIHBhdGguCisJCQkgKi8KKwkJCXNjaV9waHlfc3RhcnRfc2FzX2xpbmtfdHJhaW5pbmcoaXBoeSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLCBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9TUElOVVBfSE9MRDoKKwkJCS8qIFRoZXNlIGV2ZW50cyBtaWdodCBiZSByZWNlaXZlZCBzaW5jZSB3ZSBkb250IGtub3cgaG93IG1hbnkgbWF5IGJlIGluCisJCQkgKiB0aGUgY29tcGxldGlvbiBxdWV1ZSB3aGlsZSB3YWl0aW5nIGZvciBwb3dlcgorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9QSFlfREVURUNURUQ6CisJCQlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVRBOworCisJCQkvKiBXZSBoYXZlIHJlY2VpdmVkIHRoZSBTQVRBIFBIWSBub3RpZmljYXRpb24gY2hhbmdlIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qIFRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlIGluIHRoZSBwaHkgdHlwZSBiZWZvcmUgT09CL1NOIGZvciB0aGUKKwkJCSAqIFNBVEEgZmluaXNoZWQgc3RhcnQgZG93biB0aGUgU0FTIGxpbmsgdHJhbmluZyBwYXRoLgorCQkJICovCisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSAiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIGV2ZW50X2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7OworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU46CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfUEhZX0RFVEVDVEVEOgorCQkJLyoKKwkJCSAqIFRoZSBoYXJkd2FyZSByZXBvcnRzIG11bHRpcGxlIFNBVEEgUEhZIGRldGVjdGVkIGV2ZW50cworCQkJICogaWdub3JlIHRoZSBleHRyYXMgKi8KKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBXzE1OgorCQljYXNlIFNDVV9FVkVOVF9TQVRBXzE1X1NTQzoKKwkJCXNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyhpcGh5LCBTQVNfTElOS19SQVRFXzFfNV9HQlBTLAorCQkJCQkJICAgICAgIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUYpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfMzA6CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfMzBfU1NDOgorCQkJc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKGlwaHksIFNBU19MSU5LX1JBVEVfM18wX0dCUFMsCisJCQkJCQkgICAgICAgU0NJX1BIWV9TVUJfQVdBSVRfU0lHX0ZJU19VRik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV82MDoKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV82MF9TU0M6CisJCQlzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoaXBoeSwgU0FTX0xJTktfUkFURV82XzBfR0JQUywKKwkJCQkJCSAgICAgICBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qCisJCQkgKiBUaGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiB0aGUgcGh5IHR5cGUgYmVmb3JlIE9PQi9TTiBmb3IgdGhlCisJCQkgKiBTQVRBIGZpbmlzaGVkIHN0YXJ0IGRvd24gdGhlIFNBUyBsaW5rIHRyYW5pbmcgcGF0aC4gKi8KKwkJCXNjaV9waHlfc3RhcnRfc2FzX2xpbmtfdHJhaW5pbmcoaXBoeSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZXZlbnRfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUY6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfUEhZX0RFVEVDVEVEOgorCQkJLyogQmFja3VwIHRoZSBzdGF0ZSBtYWNoaW5lICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTik7CisJCQlicmVhazsKKworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfUkVBRFk6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX0xJTktfRkFJTFVSRToKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9CUk9BRENBU1RfQ0hBTkdFOgorCQkJLyogQnJvYWRjYXN0IGNoYW5nZSByZWNlaXZlZC4gTm90aWZ5IHRoZSBwb3J0LiAqLworCQkJaWYgKHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkgIT0gTlVMTCkKKwkJCQlzY2lfcG9ydF9icm9hZGNhc3RfY2hhbmdlX3JlY2VpdmVkKGlwaHktPm93bmluZ19wb3J0LCBpcGh5KTsKKwkJCWVsc2UKKwkJCQlpcGh5LT5iY25fcmVjZWl2ZWRfd2hpbGVfcG9ydF91bmFzc2lnbmVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzUCBTQ0lDIFBIWSAweCVwIHJlYWR5IHN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgaXBoeSwgZXZlbnRfY29kZSk7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1JFU0VUVElORzoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfSEFSRF9SRVNFVF9UUkFOU01JVFRFRDoKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBTQ0lDIFBIWSAweCVwIHJlc2V0dGluZyBzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sIGlwaHksIGV2ZW50X2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgdTMyIGZyYW1lX2luZGV4KQoreworCWVudW0gc2NpX3BoeV9zdGF0ZXMgc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCWVudW0gc2NpX3N0YXR1cyByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRjogeworCQl1MzIgKmZyYW1lX3dvcmRzOworCQlzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lIGlhZjsKKworCQlyZXN1bHQgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAodm9pZCAqKikmZnJhbWVfd29yZHMpOworCisJCWlmIChyZXN1bHQgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCXNjaV9zd2FiMzJfY3B5KCZpYWYsIGZyYW1lX3dvcmRzLCBzaXplb2YoaWFmKSAvIHNpemVvZih1MzIpKTsKKwkJaWYgKGlhZi5mcmFtZV90eXBlID09IDApIHsKKwkJCXUzMiBzdGF0ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisJCQltZW1jcHkoJmlwaHktPmZyYW1lX3JjdmQuaWFmLCAmaWFmLCBzaXplb2YoaWFmKSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCQkJaWYgKGlhZi5zbXBfdHBvcnQpIHsKKwkJCQkvKiBXZSBnb3QgdGhlIElBRiBmb3IgYW4gZXhwYW5kZXIgUEhZIGdvIHRvIHRoZSBmaW5hbAorCQkJCSAqIHN0YXRlIHNpbmNlIHRoZXJlIGFyZSBubyBwb3dlciByZXF1aXJlbWVudHMgZm9yCisJCQkJICogZXhwYW5kZXIgcGh5cy4KKwkJCQkgKi8KKwkJCQlzdGF0ZSA9IFNDSV9QSFlfU1VCX0ZJTkFMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBnb3QgdGhlIElBRiB3ZSBjYW4gbm93IGdvIHRvIHRoZSBhd2FpdCBzcGludXAKKwkJCQkgKiBzZW1hcGhvcmUgc3RhdGUKKwkJCQkgKi8KKwkJCQlzdGF0ZSA9IFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjsKKwkJCX0KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBzdGF0ZSk7CisJCQlyZXN1bHQgPSBTQ0lfU1VDQ0VTUzsKKwkJfSBlbHNlCisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSJ1bmV4cGVjdGVkIGZyYW1lIGlkICV4XG4iLAorCQkJCV9fZnVuY19fLCBmcmFtZV9pbmRleCk7CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUY6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZpc19mcmFtZV9kYXRhOworCisJCXJlc3VsdCA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCisJCWlmIChyZXN1bHQgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWlmICgoZnJhbWVfaGVhZGVyLT5maXNfdHlwZSA9PSBGSVNfUkVHRDJIKSAmJgorCQkgICAgIShmcmFtZV9oZWFkZXItPnN0YXR1cyAmIEFUQV9CVVNZKSkgeworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICh2b2lkICoqKSZmaXNfZnJhbWVfZGF0YSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCQkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcGh5LT5mcmFtZV9yY3ZkLmZpcywKKwkJCQkJCQkgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgIGZpc19mcmFtZV9kYXRhKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisKKwkJCS8qIGdvdCBJQUYgd2UgY2FuIG5vdyBnbyB0byB0aGUgYXdhaXQgc3BpbnVwIHNlbWFwaG9yZSBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0ZJTkFMKTsKKworCQkJcmVzdWx0ID0gU0NJX1NVQ0NFU1M7CisJCX0gZWxzZQorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGZyYW1lIGlkICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZnJhbWVfaW5kZXgpOworCisJCS8qIFJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgZnJhbWUgd2l0aCBpdCAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2luaXRpYWxfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJLyogVGhpcyBpcyBqdXN0IGFuIHRlbXBvcmFyeSBzdGF0ZSBnbyBvZmYgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU4pOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3Nhc19wb3dlcl9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcGh5LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX2luc2VydChpaG9zdCwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2FzX3Bvd2VyX3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9yZW1vdmUoaWhvc3QsIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcG93ZXJfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9pbnNlcnQoaWhvc3QsIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcG93ZXJfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcGh5LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX3JlbW92ZShpaG9zdCwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9waHlfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX21vZF90aW1lcigmaXBoeS0+c2F0YV90aW1lciwgU0NJQ19TRFNfU0FUQV9MSU5LX1RSQUlOSU5HX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcGh5X3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaXBoeS0+c2F0YV90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfbW9kX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyLCBTQ0lDX1NEU19TQVRBX0xJTktfVFJBSU5JTkdfVElNRU9VVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCXNjaV9kZWxfdGltZXIoJmlwaHktPnNhdGFfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NpZ19maXNfdWZfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJaWYgKHNjaV9wb3J0X2xpbmtfZGV0ZWN0ZWQoaXBoeS0+b3duaW5nX3BvcnQsIGlwaHkpKSB7CisKKwkJLyoKKwkJICogQ2xlYXIgdGhlIFBFIHN1c3BlbmQgY29uZGl0aW9uIHNvIHdlIGNhbiBhY3R1YWxseQorCQkgKiByZWNlaXZlIFNJRyBGSVMKKwkJICogVGhlIGhhcmR3YXJlIHdpbGwgbm90IHJlc3BvbmQgdG8gdGhlIFhSRFkgdW50aWwgdGhlIFBFCisJCSAqIHN1c3BlbmQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCisJCSAqLworCQlzY2lfcGh5X3Jlc3VtZShpcGh5KTsKKworCQlzY2lfbW9kX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyLAorCQkJICAgICAgU0NJQ19TRFNfU0lHTkFUVVJFX0ZJU19USU1FT1VUKTsKKwl9IGVsc2UKKwkJaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NpZ19maXNfdWZfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19maW5hbF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwkvKiBTdGF0ZSBtYWNoaW5lIGhhcyBydW4gdG8gY29tcGxldGlvbiBzbyBleGl0IG91dCBhbmQgY2hhbmdlCisJICogdGhlIGJhc2Ugc3RhdGUgbWFjaGluZSB0byB0aGUgcmVhZHkgc3RhdGUKKwkgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9SRUFEWSk7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcGh5OiBUaGlzIGlzIHRoZSBzdHJ1Y3QgaXNjaV9waHkgb2JqZWN0IHRvIHN0b3AuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBzdG9wIHRoZSBzdHJ1Y3QgaXNjaV9waHkgb2JqZWN0LiBUaGlzIGRvZXMgbm90IHJlc2V0IHRoZQorICogcHJvdG9jb2wgZW5naW5lIGl0IGp1c3Qgc3VzcGVuZHMgaXQgYW5kIHBsYWNlcyBpdCBpbiBhIHN0YXRlIHdoZXJlIGl0IHdpbGwKKyAqIG5vdCBjYXVzZSB0aGUgZW5kIGRldmljZSB0byBwb3dlciB1cC4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY3VfbGlua19sYXllcl9zdG9wX3Byb3RvY29sX2VuZ2luZSgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKwl1MzIgZW5hYmxlX3NwaW51cF92YWx1ZTsKKworCS8qIFN1c3BlbmQgdGhlIHByb3RvY29sIGVuZ2luZSBhbmQgcGxhY2UgaXQgaW4gYSBzYXRhIHNwaW51cCBob2xkIHN0YXRlICovCisJc2N1X3Nhc19wY2ZnX3ZhbHVlID0KKwkJcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJc2N1X3Nhc19wY2ZnX3ZhbHVlIHw9CisJCShTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpIHwKKwkJIFNDVV9TQVNfUENGR19HRU5fQklUKFNVU1BFTkRfUFJPVE9DT0xfRU5HSU5FKSB8CisJCSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChTQVRBX1NQSU5VUF9IT0xEKSk7CisJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkgICAgICAgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwkvKiBEaXNhYmxlIHRoZSBub3RpZnkgZW5hYmxlIHNwaW51cCBwcmltaXRpdmVzICovCisJZW5hYmxlX3NwaW51cF92YWx1ZSA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisJZW5hYmxlX3NwaW51cF92YWx1ZSAmPSB+U0NVX0VOU1BJTlVQX0dFTl9CSVQoRU5BQkxFKTsKKwl3cml0ZWwoZW5hYmxlX3NwaW51cF92YWx1ZSwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5ub3RpZnlfZW5hYmxlX3NwaW51cF9jb250cm9sKTsKK30KKworLyoqCisgKgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgc3RhcnQgdGhlIE9PQi9TTiBzdGF0ZSBtYWNoaW5lIGZvciB0aGlzIHN0cnVjdCBpc2NpX3BoeSBvYmplY3QuCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9saW5rX2xheWVyX3N0YXJ0X29vYigKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXNjdV9zYXNfcGNmZ192YWx1ZSB8PSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfRU5BQkxFKTsKKwlzY3Vfc2FzX3BjZmdfdmFsdWUgJj0KKwkJfihTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpIHwKKwkJU0NVX1NBU19QQ0ZHX0dFTl9CSVQoSEFSRF9SRVNFVCkpOworCXdyaXRlbChzY3Vfc2FzX3BjZmdfdmFsdWUsCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworfQorCisvKioKKyAqCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCB0cmFuc21pdCBhIGhhcmQgcmVzZXQgcmVxdWVzdCBvbiB0aGUgc3BlY2lmaWVkIHBoeS4gVGhlIFNDVQorICogaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCB3ZSByZXNldCB0aGUgT09CIHN0YXRlIG1hY2hpbmUgYW5kIHNldCB0aGUgaGFyZCByZXNldAorICogYml0IGluIHRoZSBwaHkgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gV2UgdGhlbiBtdXN0IHN0YXJ0IE9PQiBvdmVyIHdpdGggdGhlCisgKiBoYXJkIHJlc2V0IGJpdCBzZXQuCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9saW5rX2xheWVyX3R4X2hhcmRfcmVzZXQoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXUzMiBwaHlfY29uZmlndXJhdGlvbl92YWx1ZTsKKworCS8qCisJICogU0FTIFBoeXMgbXVzdCB3YWl0IGZvciB0aGUgSEFSRF9SRVNFVF9UWCBldmVudCBub3RpZmljYXRpb24gdG8gdHJhbnNpdGlvbgorCSAqIHRvIHRoZSBzdGFydGluZyBzdGF0ZS4gKi8KKwlwaHlfY29uZmlndXJhdGlvbl92YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXBoeV9jb25maWd1cmF0aW9uX3ZhbHVlIHw9CisJCShTQ1VfU0FTX1BDRkdfR0VOX0JJVChIQVJEX1JFU0VUKSB8CisJCSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpKTsKKwl3cml0ZWwocGh5X2NvbmZpZ3VyYXRpb25fdmFsdWUsCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJLyogTm93IHRha2UgdGhlIE9PQiBzdGF0ZSBtYWNoaW5lIG91dCBvZiByZXNldCAqLworCXBoeV9jb25maWd1cmF0aW9uX3ZhbHVlIHw9IFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9FTkFCTEUpOworCXBoeV9jb25maWd1cmF0aW9uX3ZhbHVlICY9IH5TQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpOworCXdyaXRlbChwaHlfY29uZmlndXJhdGlvbl92YWx1ZSwKKwkgICAgICAgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RvcHBlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5vd25pbmdfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qCisJICogQHRvZG8gV2UgbmVlZCB0byBnZXQgdG8gdGhlIGNvbnRyb2xsZXIgdG8gcGxhY2UgdGhpcyBQRSBpbiBhCisJICogcmVzZXQgc3RhdGUKKwkgKi8KKwlzY2lfZGVsX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyKTsKKworCXNjdV9saW5rX2xheWVyX3N0b3BfcHJvdG9jb2xfZW5naW5lKGlwaHkpOworCisJaWYgKGlwaHktPnNtLnByZXZpb3VzX3N0YXRlX2lkICE9IFNDSV9QSFlfSU5JVElBTCkKKwkJc2NpX2NvbnRyb2xsZXJfbGlua19kb3duKGlob3N0LCBwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpLCBpcGh5KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5vd25pbmdfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXNjdV9saW5rX2xheWVyX3N0b3BfcHJvdG9jb2xfZW5naW5lKGlwaHkpOworCXNjdV9saW5rX2xheWVyX3N0YXJ0X29vYihpcGh5KTsKKworCS8qIFdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9mIHBoeSB3ZSBhcmUgZ29pbmcgdG8gYmUganVzdCB5ZXQgKi8KKwlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9VTktOT1dOOworCWlwaHktPmJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQgPSBmYWxzZTsKKworCWlmIChpcGh5LT5zbS5wcmV2aW91c19zdGF0ZV9pZCA9PSBTQ0lfUEhZX1JFQURZKQorCQlzY2lfY29udHJvbGxlcl9saW5rX2Rvd24oaWhvc3QsIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSksIGlwaHkpOworCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0lOSVRJQUwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3JlYWR5X3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlwaHktPm93bmluZ19wb3J0OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfbGlua191cChpaG9zdCwgcGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfcmVhZHlfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfcGh5X3N1c3BlbmQoaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfcmVzZXR0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCS8qIFRoZSBwaHkgaXMgYmVpbmcgcmVzZXQsIHRoZXJlZm9yZSBkZWFjdGl2YXRlIGl0IGZyb20gdGhlIHBvcnQuICBJbgorCSAqIHRoZSByZXNldHRpbmcgc3RhdGUgd2UgZG9uJ3Qgbm90aWZ5IHRoZSB1c2VyIHJlZ2FyZGluZyBsaW5rIHVwIGFuZAorCSAqIGxpbmsgZG93biBub3RpZmljYXRpb25zCisJICovCisJc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoaXBoeS0+b3duaW5nX3BvcnQsIGlwaHksIGZhbHNlKTsKKworCWlmIChpcGh5LT5wcm90b2NvbCA9PSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FTKSB7CisJCXNjdV9saW5rX2xheWVyX3R4X2hhcmRfcmVzZXQoaXBoeSk7CisJfSBlbHNlIHsKKwkJLyogVGhlIFNDVSBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgYSBkaXNjcmV0ZSByZXNldCBzdGF0ZSBzbworCQkgKiBqdXN0IGdvIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlLgorCQkgKi8KKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcGh5X3N0YXRlX3RhYmxlW10gPSB7CisJW1NDSV9QSFlfSU5JVElBTF0gPSB7IH0sCisJW1NDSV9QSFlfU1RPUFBFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RvcHBlZF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1NUQVJUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1NVQl9JTklUSUFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19pbml0aWFsX3N1YnN0YXRlX2VudGVyLAorCX0sCisJW1NDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU5dID0geyB9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU5dID0geyB9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUZdID0geyB9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVJdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3Nhc19wb3dlcl9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXNfcG93ZXJfc3Vic3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BPV0VSXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3Bvd2VyX3N1YnN0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcG93ZXJfc3Vic3RhdGVfZXhpdAorCX0sCisJW1NDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3BoeV9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3BoeV9zdWJzdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3NwZWVkX3N1YnN0YXRlX2V4aXQKKwl9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zaWdfZmlzX3VmX3N1YnN0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NpZ19maXNfdWZfc3Vic3RhdGVfZXhpdAorCX0sCisJW1NDSV9QSFlfU1VCX0ZJTkFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19maW5hbF9zdWJzdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1JFQURZXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9yZWFkeV9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgPSBzY2lfcGh5X3JlYWR5X3N0YXRlX2V4aXQsCisJfSwKKwlbU0NJX1BIWV9SRVNFVFRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcGh5X3Jlc2V0dGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX0ZJTkFMXSA9IHsgfSwKK307CisKK3ZvaWQgc2NpX3BoeV9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJICAgIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1OCBwaHlfaW5kZXgpCit7CisJc2NpX2luaXRfc20oJmlwaHktPnNtLCBzY2lfcGh5X3N0YXRlX3RhYmxlLCBTQ0lfUEhZX0lOSVRJQUwpOworCisJLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgZGF0YSB0byBvdXIgbG9jYWxzICovCisJaXBoeS0+b3duaW5nX3BvcnQgPSBpcG9ydDsKKwlpcGh5LT5waHlfaW5kZXggPSBwaHlfaW5kZXg7CisJaXBoeS0+YmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZCA9IGZhbHNlOworCWlwaHktPnByb3RvY29sID0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1VOS05PV047CisJaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMgPSBOVUxMOworCWlwaHktPm1heF9uZWdvdGlhdGVkX3NwZWVkID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCisJLyogQ3JlYXRlIHRoZSBTSUdOQVRVUkUgRklTIFRpbWVvdXQgdGltZXIgZm9yIHRoaXMgcGh5ICovCisJc2NpX2luaXRfdGltZXIoJmlwaHktPnNhdGFfdGltZXIsIHBoeV9zYXRhX3RpbWVvdXQpOworfQorCit2b2lkIGlzY2lfcGh5X2luaXQoc3RydWN0IGlzY2lfcGh5ICppcGh5LCBzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgaW50IGluZGV4KQoreworCXN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtID0gJmlob3N0LT5vZW1fcGFyYW1ldGVyczsKKwl1NjQgc2NpX3Nhc19hZGRyOworCV9fYmU2NCBzYXNfYWRkcjsKKworCXNjaV9zYXNfYWRkciA9IG9lbS0+cGh5c1tpbmRleF0uc2FzX2FkZHJlc3MuaGlnaDsKKwlzY2lfc2FzX2FkZHIgPDw9IDMyOworCXNjaV9zYXNfYWRkciB8PSBvZW0tPnBoeXNbaW5kZXhdLnNhc19hZGRyZXNzLmxvdzsKKwlzYXNfYWRkciA9IGNwdV90b19iZTY0KHNjaV9zYXNfYWRkcik7CisJbWVtY3B5KGlwaHktPnNhc19hZGRyLCAmc2FzX2FkZHIsIHNpemVvZihzYXNfYWRkcikpOworCisJaXBoeS0+aXNjaV9wb3J0ID0gTlVMTDsKKwlpcGh5LT5zYXNfcGh5LmVuYWJsZWQgPSAwOworCWlwaHktPnNhc19waHkuaWQgPSBpbmRleDsKKwlpcGh5LT5zYXNfcGh5LnNhc19hZGRyID0gJmlwaHktPnNhc19hZGRyWzBdOworCWlwaHktPnNhc19waHkuZnJhbWVfcmN2ZCA9ICh1OCAqKSZpcGh5LT5mcmFtZV9yY3ZkOworCWlwaHktPnNhc19waHkuaGEgPSAmaWhvc3QtPnNhc19oYTsKKwlpcGh5LT5zYXNfcGh5LmxsZGRfcGh5ID0gaXBoeTsKKwlpcGh5LT5zYXNfcGh5LmVuYWJsZWQgPSAxOworCWlwaHktPnNhc19waHkuY2xhc3MgPSBTQVM7CisJaXBoeS0+c2FzX3BoeS5pcHJvdG8gPSBTQVNfUFJPVE9DT0xfQUxMOworCWlwaHktPnNhc19waHkudHByb3RvID0gMDsKKwlpcGh5LT5zYXNfcGh5LnR5cGUgPSBQSFlfVFlQRV9QSFlTSUNBTDsKKwlpcGh5LT5zYXNfcGh5LnJvbGUgPSBQSFlfUk9MRV9JTklUSUFUT1I7CisJaXBoeS0+c2FzX3BoeS5vb2JfbW9kZSA9IE9PQl9OT1RfQ09OTkVDVEVEOworCWlwaHktPnNhc19waHkubGlua3JhdGUgPSBTQVNfTElOS19SQVRFX1VOS05PV047CisJbWVtc2V0KCZpcGh5LT5mcmFtZV9yY3ZkLCAwLCBzaXplb2YoaXBoeS0+ZnJhbWVfcmN2ZCkpOworfQorCisKKy8qKgorICogaXNjaV9waHlfY29udHJvbCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIHBoeSBtYW5hZ2VtZW50IGZ1bmN0aW9uLgorICogQHBoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzcGh5IGJlaW5nIGNvbnRyb2xsZWQuCisgKiBAZnVuYzogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwaHkgY29udHJvbCBmdW5jdGlvbiBiZWluZyBpbnZva2VkLgorICogQGJ1ZjogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWMgdG8gdGhlIHBoeSBmdW5jdGlvbiBiZWluZyBpbnZva2VkLgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfcGh5X2NvbnRyb2woc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5LAorCQkgICAgIGVudW0gcGh5X2Z1bmMgZnVuYywKKwkJICAgICB2b2lkICpidWYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gc2FzX3BoeS0+bGxkZF9waHk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5pc2NpX3BvcnQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBzYXNfcGh5LT5oYS0+bGxkZF9oYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBwaHkgJXA7IGZ1bmMgJWQ7IGJ1ZiAlcDsgaXNjaSBwaHkgJXAsIHBvcnQgJXBcbiIsCisJCV9fZnVuY19fLCBzYXNfcGh5LCBmdW5jLCBidWYsIGlwaHksIGlwb3J0KTsKKworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgUEhZX0ZVTkNfRElTQUJMRToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJc2NpX3BoeV9zdG9wKGlwaHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBQSFlfRlVOQ19MSU5LX1JFU0VUOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlzY2lfcGh5X3N0b3AoaXBoeSk7CisJCXNjaV9waHlfc3RhcnQoaXBoeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIWV9GVU5DX0hBUkRfUkVTRVQ6CisJCWlmICghaXBvcnQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKiBQZXJmb3JtIHRoZSBwb3J0IHJlc2V0LiAqLworCQlyZXQgPSBpc2NpX3BvcnRfcGVyZm9ybV9oYXJkX3Jlc2V0KGlob3N0LCBpcG9ydCwgaXBoeSk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICAgIiVzOiBwaHkgJXA7IGZ1bmMgJWQgTk9UIElNUExFTUVOVEVEIVxuIiwKKwkJCSAgIF9fZnVuY19fLCBzYXNfcGh5LCBmdW5jKTsKKwkJcmV0ID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9waHkuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Njk5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9waHkuaApAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX0lTQ0lfUEhZX0hfCisjZGVmaW5lIF9JU0NJX1BIWV9IXworCisjaW5jbHVkZSA8c2NzaS9zYXMuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJzYXMuaCIKKworLyogVGhpcyBpcyB0aGUgdGltZW91dCB2YWx1ZSBmb3IgdGhlIFNBVEEgcGh5IHRvIHdhaXQgZm9yIGEgU0lHTkFUVVJFIEZJUworICogYmVmb3JlIHJlc3RhcnRpbmcgdGhlIHN0YXJ0aW5nIHN0YXRlIG1hY2hpbmUuICBUZWNobmljYWxseSwgdGhlIG9sZCBwYXJhbGxlbAorICogQVRBIHNwZWNpZmljYXRpb24gcmVxdWlyZWQgdXAgdG8gMzAgc2Vjb25kcyBmb3IgYSBkZXZpY2UgdG8gaXNzdWUgaXRzCisgKiBzaWduYXR1cmUgRklTIGFzIGEgcmVzdWx0IG9mIGEgc29mdCByZXNldC4gIE5vdyB3ZSBzZWUgdGhhdCBkZXZpY2VzIHJlc3BvbmQKKyAqIGdlbmVyYWxseSB3aXRoaW4gMTUgc2Vjb25kcywgYnV0IHdlJ2xsIHVzZSAyNSBmb3Igbm93LgorICovCisjZGVmaW5lIFNDSUNfU0RTX1NJR05BVFVSRV9GSVNfVElNRU9VVCAgICAyNTAwMAorCisvKiBUaGlzIGlzIHRoZSB0aW1lb3V0IGZvciB0aGUgU0FUQSBPT0IvU04gYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lcyBub3QKKyAqIHJlY29nbml6ZSBhIGhvdCBwbHVnIGFmdGVyIE9PQiBzaWduYWwgYnV0IGJlZm9yZSB0aGUgU04gc2lnbmFscy4gIFdlIG5lZWQgdG8KKyAqIG1ha2Ugc3VyZSBhZnRlciBhIGhvdHBsdWcgdGltZW91dCBpZiB3ZSBoYXZlIG5vdCByZWNlaXZlZCB0aGUgc3BlZWQgZXZlbnQKKyAqIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZSB0aGF0IHdlIHJlc3RhcnQgdGhlIGhhcmR3YXJlIE9PQiBzdGF0ZQorICogbWFjaGluZS4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19TQVRBX0xJTktfVFJBSU5JTkdfVElNRU9VVCAgMjUwCisKK2VudW0gc2NpX3BoeV9wcm90b2NvbCB7CisJU0NJQ19TRFNfUEhZX1BST1RPQ09MX1VOS05PV04sCisJU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBUywKKwlTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSwKKwlTQ0lDX1NEU19NQVhfUEhZX1BST1RPQ09MUworfTsKKworLyoqCisgKiBpc2NpX3BoeSAtIGhiYSBsb2NhbCBwaHkgaW5mcmFzdHJ1Y3R1cmUKKyAqIEBzbToKKyAqIEBwcm90b2NvbDogYXR0YWNoZWQgZGV2aWNlIHByb3RvY29sCisgKiBAcGh5X2luZGV4OiBwaHlzaWNhbCBpbmRleCByZWxhdGl2ZSB0byB0aGUgY29udHJvbGxlciAoMC0zKQorICogQGJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQ6IGJjbiB0byByZXBvcnQgYWZ0ZXIgcG9ydCBhc3NvY2lhdGlvbgorICogQHNhdGFfdGltZXI6IHRpbWVvdXQgU0FUQSBzaWduYXR1cmUgRklTIGFycml2YWwKKyAqLworc3RydWN0IGlzY2lfcGh5IHsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICpvd25pbmdfcG9ydDsKKwllbnVtIHNhc19saW5rcmF0ZSBtYXhfbmVnb3RpYXRlZF9zcGVlZDsKKwllbnVtIHNjaV9waHlfcHJvdG9jb2wgcHJvdG9jb2w7CisJdTggcGh5X2luZGV4OworCWJvb2wgYmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZDsKKwlib29sIGlzX2luX2xpbmtfdHJhaW5pbmc7CisJc3RydWN0IHNjaV90aW1lciBzYXRhX3RpbWVyOworCXN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICp0cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzOworCXN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqbGlua19sYXllcl9yZWdpc3RlcnM7CisJc3RydWN0IGFzZF9zYXNfcGh5IHNhc19waHk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0OworCXU4IHNhc19hZGRyW1NBU19BRERSX1NJWkVdOworCXVuaW9uIHsKKwkJc3RydWN0IHNhc19pZGVudGlmeV9mcmFtZSBpYWY7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgZmlzOworCX0gZnJhbWVfcmN2ZDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcGh5ICp0b19pcGh5KHN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc2FzX3BoeSwgdHlwZW9mKCppcGh5KSwgc2FzX3BoeSk7CisKKwlyZXR1cm4gaXBoeTsKK30KKworc3RydWN0IHNjaV9waHlfY2FwIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKgorCQkJICogVGhlIFNBUyBzcGVjaWZpY2F0aW9uIGluZGljYXRlcyB0aGUgc3RhcnQgYml0IHNoYWxsCisJCQkgKiBhbHdheXMgYmUgc2V0IHRvCisJCQkgKiAxLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdGhlIHN0YXJ0IGJpdCBzZXQKKwkJCSAqIHRvIDAgaWYgdGhlIFBIWSBDQVBBQklMSVRJRVMgd2VyZSBlaXRoZXIgbm90CisJCQkgKiByZWNlaXZlZCBvciBzcGVlZCBuZWdvdGlhdGlvbiBmYWlsZWQuCisJCQkgKi8KKwkJCXU4IHN0YXJ0OjE7CisJCQl1OCB0eF9zc2NfdHlwZToxOworCQkJdTggcmVzMToyOworCQkJdTggcmVxX2xvZ2ljYWxfbGlua3JhdGU6NDsKKworCQkJdTMyIGdlbjFfbm9fc3NjOjE7CisJCQl1MzIgZ2VuMV9zc2M6MTsKKwkJCXUzMiBnZW4yX25vX3NzYzoxOworCQkJdTMyIGdlbjJfc3NjOjE7CisJCQl1MzIgZ2VuM19ub19zc2M6MTsKKwkJCXUzMiBnZW4zX3NzYzoxOworCQkJdTMyIHJlczI6MTc7CisJCQl1MzIgcGFyaXR5OjE7CisJCX07CisJCXUzMiBhbGw7CisJfTsKK30gIF9fcGFja2VkOworCisvKiB0aGlzIGRhdGEgc3RydWN0dXJlIHJlZmxlY3RzIHRoZSBsaW5rIGxheWVyIHRyYW5zbWl0IGlkZW50aWZpY2F0aW9uIHJlZyAqLworc3RydWN0IHNjaV9waHlfcHJvdG8geworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUxNiBfcl9hOjE7CisJCQl1MTYgc21wX2lwb3J0OjE7CisJCQl1MTYgc3RwX2lwb3J0OjE7CisJCQl1MTYgc3NwX2lwb3J0OjE7CisJCQl1MTYgX3JfYjo0OworCQkJdTE2IF9yX2M6MTsKKwkJCXUxNiBzbXBfdHBvcnQ6MTsKKwkJCXUxNiBzdHBfdHBvcnQ6MTsKKwkJCXUxNiBzc3BfdHBvcnQ6MTsKKwkJCXUxNiBfcl9kOjQ7CisJCX07CisJCXUxNiBhbGw7CisJfTsKK30gX19wYWNrZWQ7CisKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3BoeV9wcm9wZXJ0aWVzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcHJvcGVydGllcyBjb21tb24gdG8KKyAqICAgIGFsbCBwaHlzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3BoeV9wcm9wZXJ0aWVzIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IGN1cnJlbnRseSBjb250YWlucyB0aGUKKwkgKiBzdXBwbGllZCBwaHkuICBUaGlzIGZpZWxkIG1heSBiZSBzZXQgdG8gTlVMTAorCSAqIGlmIHRoZSBwaHkgaXMgbm90IGN1cnJlbnRseSBjb250YWluZWQgaW4gYSBwb3J0LgorCSAqLworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIGxpbmsgcmF0ZSBhdCB3aGljaCB0aGUgcGh5IGlzCisJICogY3VycmVudGx5IG9wZXJhdGluZy4KKwkgKi8KKwllbnVtIHNhc19saW5rcmF0ZSBuZWdvdGlhdGVkX2xpbmtfcmF0ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBpbmRleCBvZiB0aGUgcGh5IGluIHJlbGF0aW9uIHRvIG90aGVyCisJICogcGh5cyB3aXRoaW4gdGhlIGNvbnRyb2xsZXIuICBUaGlzIGluZGV4IGlzIHplcm8gcmVsYXRpdmUuCisJICovCisJdTggaW5kZXg7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfc2FzX3BoeV9wcm9wZXJ0aWVzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcHJvcGVydGllcywKKyAqICAgIHNwZWNpZmljIHRvIGEgU0FTIHBoeSwgdGhhdCBjYW4gYmUgcmV0cmlldmVkLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY2lfc2FzX3BoeV9wcm9wZXJ0aWVzIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGRlbGluZWF0ZXMgdGhlIElkZW50aWZ5IEFkZHJlc3MgRnJhbWUgcmVjZWl2ZWQKKwkgKiBmcm9tIHRoZSByZW1vdGUgZW5kIHBvaW50LgorCSAqLworCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgcmN2ZF9pYWY7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGRlbGluZWF0ZXMgdGhlIFBoeSBjYXBhYmlsaXRpZXMgc3RydWN0dXJlIHJlY2VpdmVkCisJICogZnJvbSB0aGUgcmVtb3RlIGVuZCBwb2ludC4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX3BoeV9jYXAgcmN2ZF9jYXA7CisKK307CisKKy8qKgorICogc3RydWN0IHNjaV9zYXRhX3BoeV9wcm9wZXJ0aWVzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcHJvcGVydGllcywKKyAqICAgIHNwZWNpZmljIHRvIGEgU0FUQSBwaHksIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3NhdGFfcGh5X3Byb3BlcnRpZXMgeworCS8qKgorCSAqIFRoaXMgZmllbGQgZGVsaW5lYXRlcyB0aGUgc2lnbmF0dXJlIEZJUyByZWNlaXZlZCBmcm9tIHRoZQorCSAqIGF0dGFjaGVkIHRhcmdldC4KKwkgKi8KKwlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzIHNpZ25hdHVyZV9maXM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0byB0aGUgdXNlciBpZiBhIHBvcnQgc2VsZWN0b3IgaXMgY29ubmVjdGVkCisJICogb24gdGhlIHNwZWNpZmllZCBwaHkuCisJICovCisJYm9vbCBpc19wb3J0X3NlbGVjdG9yX3ByZXNlbnQ7CisKK307CisKKy8qKgorICogZW51bSBzY2lfcGh5X2NvdW50ZXJfaWQgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgdGhlIHZhcmlvdXMgcGllY2VzIG9mCisgKiAgICBvcHRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgc3BlY2lmaWMgcGh5LgorICoKKyAqCisgKi8KK2VudW0gc2NpX3BoeV9jb3VudGVyX2lkIHsKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9GUkFNRSwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1RSQU5TTUlUVEVEX0ZSQU1FLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgRFdPUkRzIHJlY2VpdmVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRlJBTUVfV09SRCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIERXT1JEcyB0cmFuc21pdHRlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1RSQU5TTUlUVEVEX0ZSQU1FX0RXT1JELAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgdGltZXMgRFdPUkQKKwkgKiBzeW5jaHJvbml6YXRpb24gd2FzIGxvc3QuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9MT1NTX09GX1NZTkNfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiByZWNlaXZlZCBEV09SRHMgd2l0aAorCSAqIHJ1bm5pbmcgZGlzcGFyaXR5IGVycm9ycy4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0RJU1BBUklUWV9FUlJPUiwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyB3aXRoIGEKKwkgKiBDUkMgZXJyb3IgKG5vdCBpbmNsdWRpbmcgc2hvcnQgb3IgdHJ1bmNhdGVkIGZyYW1lcykuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9GUkFNRV9DUkNfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBET05FIChBQ0svTkFLIFRJTUVPVVQpCisJICogcHJpbWl0aXZlcyByZWNlaXZlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0RPTkVfQUNLX05BS19USU1FT1VULAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgRE9ORSAoQUNLL05BSyBUSU1FT1VUKQorCSAqIHByaW1pdGl2ZXMgdHJhbnNtaXR0ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9UUkFOU01JVFRFRF9ET05FX0FDS19OQUtfVElNRU9VVCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBpbmFjdGl2aXR5CisJICogdGltZXIgZm9yIGNvbm5lY3Rpb25zIG9uIHRoZSBwaHkgaGFzIGJlZW4gdXRpbGl6ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9JTkFDVElWSVRZX1RJTUVSX0VYUElSRUQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBET05FIChDUkVESVQgVElNRU9VVCkKKwkgKiBwcmltaXRpdmVzIHJlY2VpdmVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRE9ORV9DUkVESVRfVElNRU9VVCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIERPTkUgKENSRURJVCBUSU1FT1VUKQorCSAqIHByaW1pdGl2ZXMgdHJhbnNtaXR0ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9UUkFOU01JVFRFRF9ET05FX0NSRURJVF9USU1FT1VULAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgQ1JFRElUIEJMT0NLRUQKKwkgKiBwcmltaXRpdmVzIHJlY2VpdmVkLgorCSAqIEBub3RlIERlcGVuZGluZyBvbiByZW1vdGUgZGV2aWNlIGltcGxlbWVudGF0aW9uLCBjcmVkaXQgYmxvY2tzCisJICogICAgICAgbWF5IG9jY3VyIHJlZ3VsYXJseS4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0NSRURJVF9CTE9DS0VELAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiBzaG9ydCBmcmFtZXMKKwkgKiByZWNlaXZlZC4gIEEgc2hvcnQgZnJhbWUgaXMgc2ltcGx5IGEgZnJhbWUgc21hbGxlciB0aGVuIHdoYXQgaXMKKwkgKiBhbGxvd2VkIGJ5IGVpdGhlciB0aGUgU0FTIG9yIFNBVEEgc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX1NIT1JUX0ZSQU1FLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgYWZ0ZXIKKwkgKiBjcmVkaXQgaGFzIGJlZW4gZXhoYXVzdGVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRlJBTUVfV0lUSE9VVF9DUkVESVQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBhZnRlcgorCSAqIGEgRE9ORSBoYXMgYmVlbiByZWNlaXZlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0ZSQU1FX0FGVEVSX0RPTkUsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBwaHkKKwkgKiBmYWlsZWQgdG8gYWNoaWV2ZSBEV09SRCBzeW5jaHJvbml6YXRpb24gZHVyaW5nIHNwZWVkIG5lZ290aWF0aW9uLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfU05fRFdPUkRfU1lOQ19FUlJPUgorfTsKKworZW51bSBzY2lfcGh5X3N0YXRlcyB7CisJLyoqCisJICogU2ltcGx5IHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgYmFzZSBkb21haW4gc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUEhZX0lOSVRJQUwsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBwaHkgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHN0b3BwZWQuCisJICogSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkIG9uIHRoaXMgcGh5LgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVElORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFU0VUVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUEhZX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBwaHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVjb21taW5nCisJICogcmVhZHkuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQgb24gdGhpcyBwaHkuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQRUQgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRVNFVFRJTkcgc3RhdGUuCisJICovCisJU0NJX1BIWV9TVEFSVElORywKKworCS8qKgorCSAqIEluaXRpYWwgc3RhdGUKKwkgKi8KKwlTQ0lfUEhZX1NVQl9JTklUSUFMLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIGhhcmR3YXJlIE9TU1AgZXZlbnQgdHlwZSBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9PU1NQX0VOLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIFBIWSBzcGVlZCBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU4sCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciB0aGUgSUFGIFVuc29saWNpdGVkIGZyYW1lIG5vdGlmaWNhdGlvbgorCSAqLworCVNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRiwKKworCS8qKgorCSAqIFdhaXQgc3RhdGUgZm9yIHRoZSByZXF1ZXN0IHRvIGNvbnN1bWUgcG93ZXIKKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVIsCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciByZXF1ZXN0IHRvIGNvbnN1bWUgcG93ZXIKKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BPV0VSLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIFNBVEEgUEhZIG5vdGlmaWNhdGlvbgorCSAqLworCVNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOLAorCisJLyoqCisJICogV2FpdCBmb3IgdGhlIFNBVEEgUEhZIHNwZWVkIG5vdGlmaWNhdGlvbgorCSAqLworCVNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU4sCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciB0aGUgU0lHTkFUVVJFIEZJUyB1bnNvbGljaXRlZCBmcmFtZSBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGLAorCisJLyoqCisJICogRXhpdCBzdGF0ZSBmb3IgdGhpcyBzdGF0ZSBtYWNoaW5lCisJICovCisJU0NJX1BIWV9TVUJfRklOQUwsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgdGhlIHBoeSBpcyBub3cgcmVhZHkuICBUaHVzLCB0aGUgdXNlcgorCSAqIGlzIGFibGUgdG8gcGVyZm9ybSBJTyBvcGVyYXRpb25zIHV0aWxpemluZyB0aGlzIHBoeSBhcyBsb25nIGFzIGl0CisJICogaXMgY3VycmVudGx5IHBhcnQgb2YgYSB2YWxpZCBwb3J0LgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUEhZX1JFQURZLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGh5IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlc2V0LgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCBvbiB0aGlzIHBoeS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX1BIWV9SRVNFVFRJTkcsCisKKwkvKioKKwkgKiBTaW1wbHkgdGhlIGZpbmFsIHN0YXRlIGZvciB0aGUgYmFzZSBwaHkgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUEhZX0ZJTkFMLAorfTsKKwordm9pZCBzY2lfcGh5X2NvbnN0cnVjdCgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJdTggcGh5X2luZGV4KTsKKworc3RydWN0IGlzY2lfcG9ydCAqcGh5X2dldF9ub25fZHVtbXlfcG9ydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9waHlfc2V0X3BvcnQoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMsCisJc3RydWN0IHNjdV9saW5rX2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICpsaW5rX2xheWVyX3JlZ2lzdGVycyk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X3N0YXJ0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X3N0b3AoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfcmVzZXQoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcGh5X3Jlc3VtZSgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9waHlfc2V0dXBfdHJhbnNwb3J0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwl1MzIgZGV2aWNlX2lkKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfZXZlbnRfaGFuZGxlcigKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJdTMyIGV2ZW50X2NvZGUpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9mcmFtZV9oYW5kbGVyKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwl1MzIgZnJhbWVfaW5kZXgpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9jb25zdW1lX3Bvd2VyX2hhbmRsZXIoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzX2FkZHJlc3MpOworCit2b2lkIHNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXNfYWRkcmVzcyk7CisKK3N0cnVjdCBzY2lfcGh5X3Byb3RvOwordm9pZCBzY2lfcGh5X2dldF9wcm90b2NvbHMoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBzY2lfcGh5X3Byb3RvICpwcm90b2NvbHMpOworZW51bSBzYXNfbGlua3JhdGUgc2NpX3BoeV9saW5rcmF0ZShzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitzdHJ1Y3QgaXNjaV9ob3N0Owordm9pZCBpc2NpX3BoeV9pbml0KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGludCBpbmRleCk7CitpbnQgaXNjaV9waHlfY29udHJvbChzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSwgZW51bSBwaHlfZnVuYyBmdW5jLCB2b2lkICpidWYpOworCisjZW5kaWYgLyogIWRlZmluZWQoX0lTQ0lfUEhZX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmMKQEAgLTAsMCArMSwxNzU3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisKKyNkZWZpbmUgU0NJQ19TRFNfUE9SVF9IQVJEX1JFU0VUX1RJTUVPVVQgICgxMDAwKQorI2RlZmluZSBTQ1VfRFVNTVlfSU5ERVggICAgKDB4RkZGRikKKworc3RhdGljIHZvaWQgaXNjaV9wb3J0X2NoYW5nZV9zdGF0ZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgZW51bSBpc2NpX3N0YXR1cyBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlwb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpcG9ydCA9ICVwLCBzdGF0ZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpcG9ydCwgc3RhdHVzKTsKKworCS8qIFhYWCBwb2ludGxlc3MgbG9jayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcG9ydC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCWlwb3J0LT5zdGF0dXMgPSBzdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBvcnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZ2V0X3Byb3RvY29scyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IHNjaV9waHlfcHJvdG8gKnByb3RvKQoreworCXU4IGluZGV4OworCisJcHJvdG8tPmFsbCA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaW5kZXhdOworCisJCWlmICghaXBoeSkKKwkJCWNvbnRpbnVlOworCQlzY2lfcGh5X2dldF9wcm90b2NvbHMoaXBoeSwgcHJvdG8pOworCX0KK30KKworc3RhdGljIHUzMiBzY2lfcG9ydF9nZXRfcGh5cyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgaW5kZXg7CisJdTMyIG1hc2s7CisKKwltYXNrID0gMDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspCisJCWlmIChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSkKKwkJCW1hc2sgfD0gKDEgPDwgaW5kZXgpOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICogc2NpX3BvcnRfZ2V0X3Byb3BlcnRpZXMoKSAtIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSBwcm9wZXJ0aWVzCisgKiAgICByZWdhcmRpbmcgdGhlIHBvcnQsIHN1Y2ggYXM6IHBoeXNpY2FsIGluZGV4LCBwcm90b2NvbHMsIHNhcyBhZGRyZXNzLCBldGMuCisgKiBAcG9ydDogdGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwb3J0IGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgcGh5c2ljYWwKKyAqICAgIGluZGV4LgorICogQHByb3BlcnRpZXM6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcHJvcGVydGllcyBzdHJ1Y3R1cmUgaW50byB3aGljaCB0bworICogICAgY29weSB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLgorICoKKyAqIEluZGljYXRlIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHZhbGlkIHBvcnQuIFNDSV9TVUNDRVNTIFRoaXMgdmFsdWUgaXMKKyAqIHJldHVybmVkIGlmIHRoZSBzcGVjaWZpZWQgcG9ydCB3YXMgdmFsaWQuIFNDSV9GQUlMVVJFX0lOVkFMSURfUE9SVCBUaGlzCisgKiB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgc3BlY2lmaWVkIHBvcnQgaXMgbm90IHZhbGlkLiAgV2hlbiB0aGlzIHZhbHVlIGlzCisgKiByZXR1cm5lZCwgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdGhlIHByb3BlcnRpZXMgb3V0cHV0IHBhcmFtZXRlci4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9nZXRfcHJvcGVydGllcyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCXN0cnVjdCBzY2lfcG9ydF9wcm9wZXJ0aWVzICpwcm9wKQoreworCWlmICghaXBvcnQgfHwgaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9PSBTQ0lDX1NEU19EVU1NWV9QT1JUKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QT1JUOworCisJcHJvcC0+aW5kZXggPSBpcG9ydC0+bG9naWNhbF9wb3J0X2luZGV4OworCXByb3AtPnBoeV9tYXNrID0gc2NpX3BvcnRfZ2V0X3BoeXMoaXBvcnQpOworCXNjaV9wb3J0X2dldF9zYXNfYWRkcmVzcyhpcG9ydCwgJnByb3AtPmxvY2FsLnNhc19hZGRyZXNzKTsKKwlzY2lfcG9ydF9nZXRfcHJvdG9jb2xzKGlwb3J0LCAmcHJvcC0+bG9jYWwucHJvdG9jb2xzKTsKKwlzY2lfcG9ydF9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3MoaXBvcnQsICZwcm9wLT5yZW1vdGUuc2FzX2FkZHJlc3MpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKwl1MzIgdmFsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXBvcnQtPnBoeV90YWJsZSk7IGkrKykgeworCQlpcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpXTsKKwkJaWYgKCFpcGh5KQorCQkJY29udGludWU7CisJCXZhbCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9jb250cm9sKTsKKwkJLyogY2xlYXIgdGhlIGJpdCBieSB3cml0aW5nIDEuICovCisJCXdyaXRlbCh2YWwsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9jb250cm9sKTsKKwl9Cit9CisKKy8qIGNhbGxlZCB1bmRlciBzY2lfbG9jayB0byBzdGFiaWxpemUgcGh5OnBvcnQgYXNzb2NpYXRpb25zICovCit2b2lkIGlzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlpbnQgaTsKKworCWNsZWFyX2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyk7CisJd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncykpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwb3J0LT5waHlfdGFibGUpOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpXTsKKworCQlpZiAoIWlwaHkpCisJCQljb250aW51ZTsKKworCQlpaG9zdC0+c2FzX2hhLm5vdGlmeV9wb3J0X2V2ZW50KCZpcGh5LT5zYXNfcGh5LAorCQkJCQkJUE9SVEVfQlJPQURDQVNUX1JDVkQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9iY19jaGFuZ2VfcmVjZWl2ZWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlpZiAoaXBvcnQgJiYgdGVzdF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGRpc2FibGVkIEJDTjsgaXNjaV9waHkgPSAlcCwgc2FzX3BoeSA9ICVwXG4iLAorCQkJX19mdW5jX18sIGlwaHksICZpcGh5LT5zYXNfcGh5KTsKKwkJc2V0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncyk7CisJCWF0b21pY19pbmMoJmlwb3J0LT5ldmVudCk7CisJCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlzY2lfcGh5ID0gJXAsIHNhc19waHkgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpcGh5LCAmaXBoeS0+c2FzX3BoeSk7CisKKwkJaWhvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwKKwkJCQkJCVBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKKwl9CisJc2NpX3BvcnRfYmNuX2VuYWJsZShpcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9saW5rX3VwKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwkJCSAgICAgIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNjaV9wb3J0X3Byb3BlcnRpZXMgcHJvcGVydGllczsKKwl1bnNpZ25lZCBsb25nIHN1Y2Nlc3MgPSB0cnVlOworCisJQlVHX09OKGlwaHktPmlzY2lfcG9ydCAhPSBOVUxMKTsKKworCWlwaHktPmlzY2lfcG9ydCA9IGlwb3J0OworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9wb3J0ID0gJXBcbiIsCisJCV9fZnVuY19fLCBpcG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX2xvY2ssIGZsYWdzKTsKKworCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXBoeS0+aXNjaV9wb3J0LCBpc2NpX3N0YXJ0aW5nKTsKKworCXNjaV9wb3J0X2dldF9wcm9wZXJ0aWVzKGlwb3J0LCAmcHJvcGVydGllcyk7CisKKwlpZiAoaXBoeS0+cHJvdG9jb2wgPT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBVEEpIHsKKwkJdTY0IGF0dGFjaGVkX3Nhc19hZGRyZXNzOworCisJCWlwaHktPnNhc19waHkub29iX21vZGUgPSBTQVRBX09PQl9NT0RFOworCQlpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKTsKKworCQkvKgorCQkgKiBGb3IgZGlyZWN0LWF0dGFjaGVkIFNBVEEgZGV2aWNlcywgdGhlIFNDSSBjb3JlIHdpbGwKKwkJICogYXV0b21hZ2ljYWxseSBhc3NpZ24gYSBTQVMgYWRkcmVzcyB0byB0aGUgZW5kIGRldmljZQorCQkgKiBmb3IgdGhlIHB1cnBvc2Ugb2YgY3JlYXRpbmcgYSBwb3J0LiBUaGlzIFNBUyBhZGRyZXNzCisJCSAqIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIGFzc2lnbmVkIHRvIHRoZSBQSFkgYW5kIG5lZWRzCisJCSAqIHRvIGJlIG9idGFpbmVkIGZyb20gc3RydWN0IHNjaV9wb3J0X3Byb3BlcnRpZXMgcHJvcGVydGllcy4KKwkJICovCisJCWF0dGFjaGVkX3Nhc19hZGRyZXNzID0gcHJvcGVydGllcy5yZW1vdGUuc2FzX2FkZHJlc3MuaGlnaDsKKwkJYXR0YWNoZWRfc2FzX2FkZHJlc3MgPDw9IDMyOworCQlhdHRhY2hlZF9zYXNfYWRkcmVzcyB8PSBwcm9wZXJ0aWVzLnJlbW90ZS5zYXNfYWRkcmVzcy5sb3c7CisJCXN3YWI2NHMoJmF0dGFjaGVkX3Nhc19hZGRyZXNzKTsKKworCQltZW1jcHkoJmlwaHktPnNhc19waHkuYXR0YWNoZWRfc2FzX2FkZHIsCisJCSAgICAgICAmYXR0YWNoZWRfc2FzX2FkZHJlc3MsIHNpemVvZihhdHRhY2hlZF9zYXNfYWRkcmVzcykpOworCX0gZWxzZSBpZiAoaXBoeS0+cHJvdG9jb2wgPT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBUykgeworCQlpcGh5LT5zYXNfcGh5Lm9vYl9tb2RlID0gU0FTX09PQl9NT0RFOworCQlpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lKTsKKworCQkvKiBDb3B5IHRoZSBhdHRhY2hlZCBTQVMgYWRkcmVzcyBmcm9tIHRoZSBJQUYgKi8KKwkJbWVtY3B5KGlwaHktPnNhc19waHkuYXR0YWNoZWRfc2FzX2FkZHIsCisJCSAgICAgICBpcGh5LT5mcmFtZV9yY3ZkLmlhZi5zYXNfYWRkciwgU0FTX0FERFJfU0laRSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmaXNjaV9ob3N0LT5wZGV2LT5kZXYsICIlczogdW5rb3duIHRhcmdldFxuIiwgX19mdW5jX18pOworCQlzdWNjZXNzID0gZmFsc2U7CisJfQorCisJaXBoeS0+c2FzX3BoeS5waHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBzY2lfcGh5X2xpbmtyYXRlKGlwaHkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX2xvY2ssIGZsYWdzKTsKKworCS8qIE5vdGlmeSBsaWJzYXMgdGhhdCB3ZSBoYXZlIGFuIGFkZHJlc3MgZnJhbWUsIGlmIGluZGVlZAorCSAqIHdlJ3ZlIGZvdW5kIGFuIFNTUCwgU01QLCBvciBTVFAgdGFyZ2V0ICovCisJaWYgKHN1Y2Nlc3MpCisJCWlzY2lfaG9zdC0+c2FzX2hhLm5vdGlmeV9wb3J0X2V2ZW50KCZpcGh5LT5zYXNfcGh5LAorCQkJCQkJICAgIFBPUlRFX0JZVEVTX0RNQUVEKTsKK30KKworCisvKioKKyAqIGlzY2lfcG9ydF9saW5rX2Rvd24oKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzY2kgY29yZSB3aGVuIGEgbGluaworICogICAgYmVjb21lcyBpbmFjdGl2ZS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwaHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBwaHkgd2l0aCB0aGUgYWN0aXZlIGxpbmsuCisgKiBAcG9ydDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpc2NpIHBvcnQgd2l0aCB0aGUgYWN0aXZlIGxpbmsuCisgKgorICovCitzdGF0aWMgdm9pZCBpc2NpX3BvcnRfbGlua19kb3duKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwkJCQlzdHJ1Y3QgaXNjaV9waHkgKmlzY2lfcGh5LAorCQkJCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV9wb3J0KTsKKworCWlmIChpc2NpX3BvcnQpIHsKKworCQkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBwaHkgb24gdGhpcyBwb3J0LiAqLworCQlpZiAoaXNjaV9waHktPnNhc19waHkucG9ydCAmJgorCQkgICAgaXNjaV9waHktPnNhc19waHkucG9ydC0+bnVtX3BoeXMgPT0gMSkgeworCQkJYXRvbWljX2luYygmaXNjaV9wb3J0LT5ldmVudCk7CisJCQlpc2NpX3BvcnRfYmNuX2VuYWJsZShpc2NpX2hvc3QsIGlzY2lfcG9ydCk7CisKKwkJCS8qIGNoYW5nZSB0aGUgc3RhdGUgZm9yIGFsbCBkZXZpY2VzIG9uIHRoaXMgcG9ydC4gIFRoZQorCQkJICogbmV4dCB0YXNrIHNlbnQgdG8gdGhpcyBkZXZpY2Ugd2lsbCBiZSByZXR1cm5lZCBhcworCQkJICogU0FTX1RBU0tfVU5ERUxJVkVSRUQsIGFuZCB0aGUgc2NzaSBtaWQgbGF5ZXIgd2lsbAorCQkJICogcmVtb3ZlIHRoZSB0YXJnZXQKKwkJCSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShpc2NpX2RldmljZSwKKwkJCQkJICAgICZpc2NpX3BvcnQtPnJlbW90ZV9kZXZfbGlzdCwKKwkJCQkJICAgIG5vZGUpIHsKKwkJCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBpc2NpX2RldmljZSA9ICVwXG4iLAorCQkJCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UpOworCQkJCXNldF9iaXQoSURFVl9HT05FLCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKKwkJCX0KKwkJfQorCQlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlzY2lfcG9ydCwgaXNjaV9zdG9wcGluZyk7CisJfQorCisJLyogTm90aWZ5IGxpYnNhcyBvZiB0aGUgYm9ya2VuIGxpbmssIHRoaXMgd2lsbCB0cmlnZ2VyIGNhbGxzIHRvIG91cgorCSAqIGlzY2lfcG9ydF9kZWZvcm1lZCBhbmQgaXNjaV9kZXZfZ29uZSBmdW5jdGlvbnMuCisJICovCisJc2FzX3BoeV9kaXNjb25uZWN0ZWQoJmlzY2lfcGh5LT5zYXNfcGh5KTsKKwlpc2NpX2hvc3QtPnNhc19oYS5ub3RpZnlfcGh5X2V2ZW50KCZpc2NpX3BoeS0+c2FzX3BoeSwKKwkJCQkJICAgUEhZRV9MT1NTX09GX1NJR05BTCk7CisKKwlpc2NpX3BoeS0+aXNjaV9wb3J0ID0gTlVMTDsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwIC0gRG9uZVxuIiwgX19mdW5jX18sIGlzY2lfcG9ydCk7Cit9CisKKworLyoqCisgKiBpc2NpX3BvcnRfcmVhZHkoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzY2kgY29yZSB3aGVuIGEgbGluaworICogICAgYmVjb21lcyByZWFkeS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNjaSBwb3J0IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9wb3J0X3JlYWR5KHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0KQoreworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV9wb3J0KTsKKworCWNvbXBsZXRlX2FsbCgmaXNjaV9wb3J0LT5zdGFydF9jb21wbGV0ZSk7CisJaXNjaV9wb3J0X2NoYW5nZV9zdGF0ZShpc2NpX3BvcnQsIGlzY2lfcmVhZHkpOworCXJldHVybjsKK30KKworLyoqCisgKiBpc2NpX3BvcnRfbm90X3JlYWR5KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUgd2hlbiBhIGxpbmsKKyAqICAgIGlzIG5vdCByZWFkeS4gQWxsIHJlbW90ZSBkZXZpY2VzIG9uIHRoaXMgbGluayB3aWxsIGJlIHJlbW92ZWQgaWYgdGhleSBhcmUKKyAqICAgIGluIHRoZSBzdG9wcGluZyBzdGF0ZS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNjaSBwb3J0IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9wb3J0X25vdF9yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCkKK3sKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9zdG9wX2NvbXBsZXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgZW51bSBzY2lfc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKQoreworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICJQb3J0IHN0b3AgY29tcGxldGVcbiIpOworfQorCisvKioKKyAqIGlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUKKyAqICAgIHdoZW4gdGhlIGhhcmQgcmVzZXQgY29tcGxldGUgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLgorICogQHBvcnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2NpIHBvcnQgd2l0aCB0aGUgYWN0aXZlIGxpbmsuCisgKiBAY29tcGxldGlvbl9zdGF0dXM6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY29yZSBzdGF0dXMgZm9yIHRoZSByZXNldAorICogICAgcHJvY2Vzcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCwKKwkJCQkJICBlbnVtIHNjaV9zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJZGV2X2RiZygmaXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcCwgY29tcGxldGlvbl9zdGF0dXM9JXhcbiIsCisJCSAgICAgX19mdW5jX18sIGlzY2lfcG9ydCwgY29tcGxldGlvbl9zdGF0dXMpOworCisJLyogU2F2ZSB0aGUgc3RhdHVzIG9mIHRoZSBoYXJkIHJlc2V0IGZyb20gdGhlIHBvcnQuICovCisJaXNjaV9wb3J0LT5oYXJkX3Jlc2V0X3N0YXR1cyA9IGNvbXBsZXRpb25fc3RhdHVzOworCisJY29tcGxldGVfYWxsKCZpc2NpX3BvcnQtPmhhcmRfcmVzZXRfY29tcGxldGUpOworfQorCisvKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHRydWUgdmFsdWUgaWYgdGhlIHNwZWNpZmllZCBwaHkgY2FuIGJlIGFzc2lnbmVkIHRvCisgKiB0aGlzIHBvcnQgVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcGh5cyBmb3IgZWFjaCBwb3J0IHRoYXQgYXJlIGFsbG93ZWQ6IC0KKyAqIFBvcnQgMCAtIDMgMiAxIDAgLSBQb3J0IDEgLSAgICAgMSAtIFBvcnQgMiAtIDMgMiAtIFBvcnQgMyAtIDMgVGhpcyBtZXRob2QKKyAqIGRvZXNuJ3QgcHJlY2x1ZGUgYWxsIGNvbmZpZ3VyYXRpb25zLiAgSXQgbWVyZWx5IGVuc3VyZXMgdGhhdCBhIHBoeSBpcyBwYXJ0CisgKiBvZiB0aGUgYWxsb3dhYmxlIHNldCBvZiBwaHkgaWRlbnRpZmllcnMgZm9yIHRoYXQgcG9ydC4gIEZvciBleGFtcGxlLCBvbmUKKyAqIGNvdWxkIGFzc2lnbiBwaHkgMyB0byBwb3J0IDAgYW5kIG5vIG90aGVyIHBoeXMuICBQbGVhc2UgcmVmZXIgdG8KKyAqIHNjaV9wb3J0X2lzX3BoeV9tYXNrX3ZhbGlkKCkgZm9yIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB3aGV0aGVyIHRoZQorICogcGh5X21hc2sgZm9yIGEgcG9ydCBjYW4gYmUgc3VwcG9ydGVkLiBib29sIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIHBoeQorICogYXNzaWdubWVudCBmb3IgdGhlIHBvcnQgZmFsc2UgaWYgdGhpcyBpcyBub3QgYSB2YWxpZCBwaHkgYXNzaWdubWVudCBmb3IgdGhlCisgKiBwb3J0CisgKi8KK2Jvb2wgc2NpX3BvcnRfaXNfdmFsaWRfcGh5X2Fzc2lnbm1lbnQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUzMiBwaHlfaW5kZXgpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgKnVzZXIgPSAmaWhvc3QtPnVzZXJfcGFyYW1ldGVyczsKKworCS8qIEluaXRpYWxpemUgdG8gaW52YWxpZCB2YWx1ZS4gKi8KKwl1MzIgZXhpc3RpbmdfcGh5X2luZGV4ID0gU0NJX01BWF9QSFlTOworCXUzMiBpbmRleDsKKworCWlmICgoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMSkgJiYgKHBoeV9pbmRleCAhPSAxKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IDMgJiYgcGh5X2luZGV4ICE9IDMpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9PSAyICYmCisJICAgIChwaHlfaW5kZXggPT0gMCB8fCBwaHlfaW5kZXggPT0gMSkpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykKKwkJaWYgKGlwb3J0LT5waHlfdGFibGVbaW5kZXhdICYmIGluZGV4ICE9IHBoeV9pbmRleCkKKwkJCWV4aXN0aW5nX3BoeV9pbmRleCA9IGluZGV4OworCisJLyogRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBwaHlzIGluIHRoZSBwb3J0IGFyZSBjYXBhYmxlIG9mCisJICogb3BlcmF0aW5nIGF0IHRoZSBzYW1lIG1heGltdW0gbGluayByYXRlLgorCSAqLworCWlmIChleGlzdGluZ19waHlfaW5kZXggPCBTQ0lfTUFYX1BIWVMgJiYKKwkgICAgdXNlci0+cGh5c1twaHlfaW5kZXhdLm1heF9zcGVlZF9nZW5lcmF0aW9uICE9CisJICAgIHVzZXItPnBoeXNbZXhpc3RpbmdfcGh5X2luZGV4XS5tYXhfc3BlZWRfZ2VuZXJhdGlvbikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcG9ydDogVGhpcyBpcyB0aGUgcG9ydCBvYmplY3QgZm9yIHdoaWNoIHRvIGRldGVybWluZSBpZiB0aGUgcGh5IG1hc2sKKyAqICAgIGNhbiBiZSBzdXBwb3J0ZWQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBwb3J0J3MgcGh5IG1hc2sgY2FuIGJlIHN1cHBvcnRlZAorICogYnkgdGhlIFNDVS4gVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdmFsaWQgUEhZIG1hc2sgY29uZmlndXJhdGlvbnMgZm9yCisgKiBlYWNoIHBvcnQ6IC0gUG9ydCAwIC0gW1szICAyXSAxXSAwIC0gUG9ydCAxIC0gICAgICAgIFsxXSAtIFBvcnQgMiAtIFtbM10gMl0KKyAqIC0gUG9ydCAzIC0gIFszXSBUaGlzIG1ldGhvZCByZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW9uIHNwZWNpZnlpbmcgaWYgdGhlCisgKiBwaHkgbWFzayBjYW4gYmUgc3VwcG9ydGVkLiB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBwaHkgYXNzaWdubWVudCBmb3IgdGhlCisgKiBwb3J0IGZhbHNlIGlmIHRoaXMgaXMgbm90IGEgdmFsaWQgcGh5IGFzc2lnbm1lbnQgZm9yIHRoZSBwb3J0CisgKi8KK3N0YXRpYyBib29sIHNjaV9wb3J0X2lzX3BoeV9tYXNrX3ZhbGlkKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXUzMiBwaHlfbWFzaykKK3sKKwlpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMCkgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MEYpID09IDB4MEYpCisJCSAgICB8fCAoKHBoeV9tYXNrICYgMHgwMykgPT0gMHgwMykKKwkJICAgIHx8ICgocGh5X21hc2sgJiAweDAxKSA9PSAweDAxKQorCQkgICAgfHwgKHBoeV9tYXNrID09IDApKQorCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIGlmIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9PSAxKSB7CisJCWlmICgoKHBoeV9tYXNrICYgMHgwMikgPT0gMHgwMikKKwkJICAgIHx8IChwaHlfbWFzayA9PSAwKSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMikgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MEMpID09IDB4MEMpCisJCSAgICB8fCAoKHBoeV9tYXNrICYgMHgwNCkgPT0gMHgwNCkKKwkJICAgIHx8IChwaHlfbWFzayA9PSAwKSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMykgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MDgpID09IDB4MDgpCisJCSAgICB8fCAocGh5X21hc2sgPT0gMCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgYSBjdXJyZW50bHkgYWN0aXZlIChpLmUuIGNvbm5lY3RlZCkgcGh5IGNvbnRhaW5lZCBpbgorICogdGhlIHBvcnQuICBDdXJyZW50bHksIHRoZSBsb3dlc3Qgb3JkZXIgcGh5IHRoYXQgaXMgY29ubmVjdGVkIGlzIHJldHVybmVkLgorICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBTQ0lTX1NEU19QSFkgb2JqZWN0LiBOVUxMIFRoaXMgdmFsdWUgaXMKKyAqIHJldHVybmVkIGlmIHRoZXJlIGFyZSBubyBjdXJyZW50bHkgYWN0aXZlIChpLmUuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSBlbmQKKyAqIHBvaW50KSBwaHlzIGNvbnRhaW5lZCBpbiB0aGUgcG9ydC4gQWxsIG90aGVyIHZhbHVlcyBzcGVjaWZ5IGEgc3RydWN0IHNjaV9waHkKKyAqIG9iamVjdCB0aGF0IGlzIGFjdGl2ZSBpbiB0aGUgcG9ydC4KKyAqLworc3RhdGljIHN0cnVjdCBpc2NpX3BoeSAqc2NpX3BvcnRfZ2V0X2FfY29ubmVjdGVkX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCS8qIEVuc3VyZSB0aGF0IHRoZSBwaHkgaXMgYm90aCBwYXJ0IG9mIHRoZSBwb3J0IGFuZCBjdXJyZW50bHkKKwkJICogY29ubmVjdGVkIHRvIHRoZSByZW1vdGUgZW5kLXBvaW50LgorCQkgKi8KKwkJaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaW5kZXhdOworCQlpZiAoaXBoeSAmJiBzY2lfcG9ydF9hY3RpdmVfcGh5KGlwb3J0LCBpcGh5KSkKKwkJCXJldHVybiBpcGh5OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3NldF9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGFkZCB0aGlzIHBoeSB0byBhIHBvcnQKKwkgKiB0aGF0IG1lYW5zIHRoYXQgdGhlIHBoeSBpcyBub3QgcGFydCBvZiBhIHBvcnQgYW5kIHRoYXQgdGhlIHBvcnQgZG9lcworCSAqIG5vdCBhbHJlYWR5IGhhdmUgYSBwaHkgYXNzaW5nZWQgdG8gdGhlIHBoeSBpbmRleC4KKwkgKi8KKwlpZiAoIWlwb3J0LT5waHlfdGFibGVbaXBoeS0+cGh5X2luZGV4XSAmJgorCSAgICAhcGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSAmJgorCSAgICBzY2lfcG9ydF9pc192YWxpZF9waHlfYXNzaWdubWVudChpcG9ydCwgaXBoeS0+cGh5X2luZGV4KSkgeworCQkvKiBQaHkgaXMgYmVpbmcgYWRkZWQgaW4gdGhlIHN0b3BwZWQgc3RhdGUgc28gd2UgYXJlIGluIE1QQyBtb2RlCisJCSAqIG1ha2UgbG9naWNhbCBwb3J0IGluZGV4ID0gcGh5c2ljYWwgcG9ydCBpbmRleAorCQkgKi8KKwkJaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCQlpcG9ydC0+cGh5X3RhYmxlW2lwaHktPnBoeV9pbmRleF0gPSBpcGh5OworCQlzY2lfcGh5X3NldF9wb3J0KGlwaHksIGlwb3J0KTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NsZWFyX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcGh5IGlzIHBhcnQgb2YgdGhpcyBwb3J0ICovCisJaWYgKGlwb3J0LT5waHlfdGFibGVbaXBoeS0+cGh5X2luZGV4XSA9PSBpcGh5ICYmCisJICAgIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkgPT0gaXBvcnQpIHsKKwkJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkJLyogWWVwIGl0IGlzIGFzc2lnbmVkIHRvIHRoaXMgcG9ydCBzbyByZW1vdmUgaXQgKi8KKwkJc2NpX3BoeV9zZXRfcG9ydChpcGh5LCAmaWhvc3QtPnBvcnRzW1NDSV9NQVhfUE9SVFNdKTsKKwkJaXBvcnQtPnBoeV90YWJsZVtpcGh5LT5waHlfaW5kZXhdID0gTlVMTDsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRTsKK30KKwordm9pZCBzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3Moc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhcykKK3sKKwl1MzIgaW5kZXg7CisKKwlzYXMtPmhpZ2ggPSAwOworCXNhcy0+bG93ICA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKQorCQlpZiAoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0pCisJCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcyhpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSwgc2FzKTsKK30KKwordm9pZCBzY2lfcG9ydF9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3Moc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhcykKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBwaHkgaXMgYm90aCBwYXJ0IG9mIHRoZSBwb3J0IGFuZCBjdXJyZW50bHkKKwkgKiBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBlbmQtcG9pbnQuCisJICovCisJaXBoeSA9IHNjaV9wb3J0X2dldF9hX2Nvbm5lY3RlZF9waHkoaXBvcnQpOworCWlmIChpcGh5KSB7CisJCWlmIChpcGh5LT5wcm90b2NvbCAhPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSkgeworCQkJc2NpX3BoeV9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3MoaXBoeSwgc2FzKTsKKwkJfSBlbHNlIHsKKwkJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKGlwaHksIHNhcyk7CisJCQlzYXMtPmxvdyArPSBpcGh5LT5waHlfaW5kZXg7CisJCX0KKwl9IGVsc2UgeworCQlzYXMtPmhpZ2ggPSAwOworCQlzYXMtPmxvdyAgPSAwOworCX0KK30KKworLyoqCisgKiBzY2lfcG9ydF9jb25zdHJ1Y3RfZHVtbXlfcm5jKCkgLSBjcmVhdGUgZHVtbXkgcm5jIGZvciBzaSB3b3JrYXJvdW5kCisgKgorICogQHNjaV9wb3J0OiBsb2dpY2FsIHBvcnQgb24gd2hpY2ggd2UgbmVlZCB0byBjcmVhdGUgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQKKyAqIEBybmk6IHJlbW90ZSBub2RlIGluZGV4IGZvciB0aGlzIHJlbW90ZSBub2RlIGNvbnRleHQuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgY29uc3RydWN0IGEgZHVtbXkgcmVtb3RlIG5vZGUgY29udGV4dCBkYXRhIHN0cnVjdHVyZQorICogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGhhcmR3YXJlIHRvIHdvcmsgYXJvdW5kIGEgc2NoZWR1bGVyCisgKiBlcnJvciBpbiB0aGUgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2NvbnN0cnVjdF9kdW1teV9ybmMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUxNiBybmkpCit7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYzsKKworCXJuYyA9ICZpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXItPnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGVbcm5pXTsKKworCW1lbXNldChybmMsIDAsIHNpemVvZih1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCkpOworCisJcm5jLT5zc3AucmVtb3RlX3Nhc19hZGRyZXNzX2hpID0gMDsKKwlybmMtPnNzcC5yZW1vdGVfc2FzX2FkZHJlc3NfbG8gPSAwOworCisJcm5jLT5zc3AucmVtb3RlX25vZGVfaW5kZXggPSBybmk7CisJcm5jLT5zc3AucmVtb3RlX25vZGVfcG9ydF93aWR0aCA9IDE7CisJcm5jLT5zc3AubG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisKKwlybmMtPnNzcC5uZXh1c19sb3NzX3RpbWVyX2VuYWJsZSA9IGZhbHNlOworCXJuYy0+c3NwLmNoZWNrX2JpdCA9IGZhbHNlOworCXJuYy0+c3NwLmlzX3ZhbGlkID0gdHJ1ZTsKKwlybmMtPnNzcC5pc19yZW1vdGVfbm9kZV9jb250ZXh0ID0gdHJ1ZTsKKwlybmMtPnNzcC5mdW5jdGlvbl9udW1iZXIgPSAwOworCXJuYy0+c3NwLmFyYml0cmF0aW9uX3dhaXRfdGltZSA9IDA7Cit9CisKKy8qCisgKiBjb25zdHJ1Y3QgYSBkdW1teSB0YXNrIGNvbnRleHQgZGF0YSBzdHJ1Y3R1cmUuICBUaGlzCisgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGhhcmR3cmUgdG8gd29yayBhcm91bmQgYSBzY2hlZHVsZXIgZXJyb3IKKyAqIGluIHRoZSBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgc2NpX3BvcnRfY29uc3RydWN0X2R1bW15X3Rhc2soc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUxNiB0YWcpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dDsKKworCXRhc2tfY29udGV4dCA9ICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlW0lTQ0lfVEFHX1RDSSh0YWcpXTsKKwltZW1zZXQodGFza19jb250ZXh0LCAwLCBzaXplb2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQpKTsKKworCXRhc2tfY29udGV4dC0+aW5pdGlhdG9yX3JlcXVlc3QgPSAxOworCXRhc2tfY29udGV4dC0+Y29ubmVjdGlvbl9yYXRlID0gMTsKKwl0YXNrX2NvbnRleHQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCXRhc2tfY29udGV4dC0+cHJvdG9jb2xfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1NQOworCXRhc2tfY29udGV4dC0+dGFza19pbmRleCA9IElTQ0lfVEFHX1RDSSh0YWcpOworCXRhc2tfY29udGV4dC0+dmFsaWQgPSBTQ1VfVEFTS19DT05URVhUX1ZBTElEOworCXRhc2tfY29udGV4dC0+Y29udGV4dF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9UWVBFOworCXRhc2tfY29udGV4dC0+cmVtb3RlX25vZGVfaW5kZXggPSBpcG9ydC0+cmVzZXJ2ZWRfcm5pOworCXRhc2tfY29udGV4dC0+ZG9fbm90X2RtYV9zc3BfZ29vZF9yZXNwb25zZSA9IDE7CisJdGFza19jb250ZXh0LT50YXNrX3BoYXNlID0gMHgwMTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZGVzdHJveV9kdW1teV9yZXNvdXJjZXMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3RhZyAhPSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykKKwkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgaXBvcnQtPnJlc2VydmVkX3RhZyk7CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3JuaSAhPSBTQ1VfRFVNTVlfSU5ERVgpCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3JlbW90ZV9ub2RlX2luZGV4KCZpaG9zdC0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywKKwkJCQkJCQkJICAgICAxLCBpcG9ydC0+cmVzZXJ2ZWRfcm5pKTsKKworCWlwb3J0LT5yZXNlcnZlZF9ybmkgPSBTQ1VfRFVNTVlfSU5ERVg7CisJaXBvcnQtPnJlc2VydmVkX3RhZyA9IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHOworfQorCit2b2lkIHNjaV9wb3J0X3NldHVwX3RyYW5zcG9ydHMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUzMiBkZXZpY2VfaWQpCit7CisJdTggaW5kZXg7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgJiAoMSA8PCBpbmRleCkpCisJCQlzY2lfcGh5X3NldHVwX3RyYW5zcG9ydChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSwgZGV2aWNlX2lkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2FjdGl2YXRlX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCSAgYm9vbCBkb19ub3RpZnlfdXNlcikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlmIChpcGh5LT5wcm90b2NvbCAhPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSkKKwkJc2NpX3BoeV9yZXN1bWUoaXBoeSk7CisKKwlpcG9ydC0+YWN0aXZlX3BoeV9tYXNrIHw9IDEgPDwgaXBoeS0+cGh5X2luZGV4OworCisJc2NpX2NvbnRyb2xsZXJfY2xlYXJfaW52YWxpZF9waHkoaWhvc3QsIGlwaHkpOworCisJaWYgKGRvX25vdGlmeV91c2VyID09IHRydWUpCisJCWlzY2lfcG9ydF9saW5rX3VwKGlob3N0LCBpcG9ydCwgaXBoeSk7Cit9CisKK3ZvaWQgc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCSAgICAgYm9vbCBkb19ub3RpZnlfdXNlcikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlwb3J0LT5hY3RpdmVfcGh5X21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisKKwlpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKKworCS8qIFJlLWFzc2lnbiB0aGUgcGh5IGJhY2sgdG8gdGhlIExQIGFzIGlmIGl0IHdlcmUgYSBuYXJyb3cgcG9ydCAqLworCXdyaXRlbChpcGh5LT5waHlfaW5kZXgsCisJCSZpcG9ydC0+cG9ydF9wZV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyW2lwaHktPnBoeV9pbmRleF0pOworCisJaWYgKGRvX25vdGlmeV91c2VyID09IHRydWUpCisJCWlzY2lfcG9ydF9saW5rX2Rvd24oaWhvc3QsIGlwaHksIGlwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfaW52YWxpZF9saW5rX3VwKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVheSByZXBvcnRlZCB0aGlzIGxpbmsgYXMgYmFkIGFuZCBpZgorCSAqIG5vdCBnbyBhaGVhZCBhbmQgdGVsbCB0aGUgU0NJX1VTRVIgdGhhdCB3ZSBoYXZlIGRpc2NvdmVyZWQgYW4KKwkgKiBpbnZhbGlkIGxpbmsuCisJICovCisJaWYgKChpaG9zdC0+aW52YWxpZF9waHlfbWFzayAmICgxIDw8IGlwaHktPnBoeV9pbmRleCkpID09IDApIHsKKwkJaWhvc3QtPmludmFsaWRfcGh5X21hc2sgfD0gMSA8PCBpcGh5LT5waHlfaW5kZXg7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiSW52YWxpZCBsaW5rIHVwIVxuIik7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19wb3J0X3JlYWR5X3N0YXRlKGVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1JFQURZOgorCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJY2FzZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUw6CisJY2FzZSBTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkc6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qIGZsYWcgZHVtbXkgcm5jIGhhbmxpbmcgd2hlbiBleGl0aW5nIGEgcmVhZHkgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIHBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2Uoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICAgICAgZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGUpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlwb3J0LT5zbTsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBvbGRfc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChpc19wb3J0X3JlYWR5X3N0YXRlKG9sZF9zdGF0ZSkgJiYgIWlzX3BvcnRfcmVhZHlfc3RhdGUoc3RhdGUpKQorCQlpcG9ydC0+cmVhZHlfZXhpdCA9IHRydWU7CisKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CisJaXBvcnQtPnJlYWR5X2V4aXQgPSBmYWxzZTsKK30KKworLyoqCisgKiBzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlciAtIHBoeSBjYW4gYmUgYXNzaWduZWQgdG8gcG9ydD8KKyAqIEBzY2lfcG9ydDogc2NpX3BvcnQgb2JqZWN0IGZvciB3aGljaCBoYXMgYSBwaHkgdGhhdCBoYXMgZ29uZSBsaW5rIHVwLgorICogQHNjaV9waHk6IFRoaXMgaXMgdGhlIHN0cnVjdCBpc2NpX3BoeSBvYmplY3QgdGhhdCBoYXMgZ29uZSBsaW5rIHVwLgorICogQGRvX25vdGlmeV91c2VyOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciB0byBpbmZvcm0gdGhlIHVzZXIgKHZpYQorICogICAgc2NpX3BvcnRfbGlua191cCgpKSBhcyB0byB0aGUgZmFjdCB0aGF0IGEgbmV3IHBoeSBhcyBiZWNvbWUgcmVhZHkuCisgKgorICogRGV0ZXJtaW5lIGlmIHRoaXMgcGh5IGNhbiBiZSBhc3NpZ25lZCB0byB0aGlzCisgKiBwb3J0IC4gSWYgdGhlIHBoeSBpcyBub3QgYSB2YWxpZCBQSFkgZm9yCisgKiB0aGlzIHBvcnQgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCBub3RpZnkgdGhlIHVzZXIuIEEgUEhZIGNhbiBvbmx5IGJlCisgKiBwYXJ0IG9mIGEgcG9ydCBpZiBpdCdzIGF0dGFjaGVkIFNBUyBBRERSRVNTIGlzIHRoZSBzYW1lIGFzIGFsbCBvdGhlciBQSFlzIGluCisgKiB0aGUgc2FtZSBwb3J0LiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2dlbmVyYWxfbGlua191cF9oYW5kbGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkJICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJCQkJCQkgIGJvb2wgZG9fbm90aWZ5X3VzZXIpCit7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwb3J0X3Nhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X3Nhc19hZGRyZXNzOworCisJc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwb3J0LCAmcG9ydF9zYXNfYWRkcmVzcyk7CisJc2NpX3BoeV9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3MoaXBoeSwgJnBoeV9zYXNfYWRkcmVzcyk7CisKKwkvKiBJZiB0aGUgU0FTIGFkZHJlc3Mgb2YgdGhlIG5ldyBwaHkgbWF0Y2hlcyB0aGUgU0FTIGFkZHJlc3Mgb2YKKwkgKiBvdGhlciBwaHlzIGluIHRoZSBwb3J0IE9SIHRoaXMgaXMgdGhlIGZpcnN0IHBoeSBpbiB0aGUgcG9ydCwKKwkgKiB0aGVuIGFjdGl2YXRlIHRoZSBwaHkgYW5kIGFsbG93IGl0IHRvIGJlIHVzZWQgZm9yIG9wZXJhdGlvbnMKKwkgKiBpbiB0aGlzIHBvcnQuCisJICovCisJaWYgKChwaHlfc2FzX2FkZHJlc3MuaGlnaCA9PSBwb3J0X3Nhc19hZGRyZXNzLmhpZ2ggJiYKKwkgICAgIHBoeV9zYXNfYWRkcmVzcy5sb3cgID09IHBvcnRfc2FzX2FkZHJlc3MubG93KSB8fAorCSAgICBpcG9ydC0+YWN0aXZlX3BoeV9tYXNrID09IDApIHsKKwkJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlwb3J0LT5zbTsKKworCQlzY2lfcG9ydF9hY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIGRvX25vdGlmeV91c2VyKTsKKwkJaWYgKHNtLT5jdXJyZW50X3N0YXRlX2lkID09IFNDSV9QT1JUX1JFU0VUVElORykKKwkJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX1JFQURZKTsKKwl9IGVsc2UKKwkJc2NpX3BvcnRfaW52YWxpZF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKK30KKworCisKKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgcG9ydCBvbmx5IGhhcyBhIHNpbmdsZSBwaHkgb2JqZWN0IGFzc2lnbmVkLgorICogICAgIElmIHRoZXJlIGFyZSBubyBwaHlzIG9yIG1vcmUgdGhhbiBvbmUgcGh5IHRoZW4gdGhlIG1ldGhvZCB3aWxsIHJldHVybgorICogICAgdHJ1ZS4KKyAqIEBzY2lfcG9ydDogVGhlIHBvcnQgZm9yIHdoaWNoIHRoZSB3aWRlIHBvcnQgY29uZGl0aW9uIGlzIHRvIGJlIGNoZWNrZWQuCisgKgorICogYm9vbCB0cnVlIElzIHJldHVybmVkIGlmIHRoaXMgaXMgYSB3aWRlIHBvcnRlZCBwb3J0LiBmYWxzZSBJcyByZXR1cm5lZCBpZgorICogdGhpcyBpcyBhIG5hcnJvdyBwb3J0LgorICovCitzdGF0aWMgYm9vbCBzY2lfcG9ydF9pc193aWRlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBpbmRleDsKKwl1MzIgcGh5X2NvdW50ID0gMDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlpZiAoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0gIT0gTlVMTCkgeworCQkJcGh5X2NvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gcGh5X2NvdW50ICE9IDE7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBQSFkgb2JqZWN0IHdoZW4gdGhlIGxpbmsgaXMgZGV0ZWN0ZWQuIGlmIHRoZQorICogICAgcG9ydCB3YW50cyB0aGUgUEhZIHRvIGNvbnRpbnVlIG9uIHRvIHRoZSBsaW5rIHVwIHN0YXRlIHRoZW4gdGhlIHBvcnQKKyAqICAgIGxheWVyIG11c3QgcmV0dXJuIHRydWUuICBJZiB0aGUgcG9ydCBvYmplY3QgcmV0dXJucyBmYWxzZSB0aGUgcGh5IG9iamVjdAorICogICAgbXVzdCBoYWx0IGl0cyBhdHRlbXB0IHRvIGdvIGxpbmsgdXAuCisgKiBAc2NpX3BvcnQ6IFRoZSBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGh5IG9iamVjdC4KKyAqIEBzY2lfcGh5OiBUaGUgcGh5IG9iamVjdCB0aGF0IGlzIHRyeWluZyB0byBnbyBsaW5rIHVwLgorICoKKyAqIHRydWUgaWYgdGhlIHBoeSBvYmplY3QgY2FuIGNvbnRpbnVlIHRvIHRoZSBsaW5rIHVwIGNvbmRpdGlvbi4gdHJ1ZSBJcworICogcmV0dXJuZWQgaWYgdGhpcyBwaHkgY2FuIGNvbnRpbnVlIHRvIHRoZSByZWFkeSBzdGF0ZS4gZmFsc2UgSXMgcmV0dXJuZWQgaWYKKyAqIGNhbiBub3QgY29udGludWUgb24gdG8gdGhlIHJlYWR5IHN0YXRlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBpbiBwbGFjZSBmb3IKKyAqIHdpZGUgcG9ydHMgYW5kIGRpcmVjdCBhdHRhY2hlZCBwaHlzLiAgU2luY2UgdGhlcmUgYXJlIG5vIHdpZGUgcG9ydGVkIFNBVEEKKyAqIGRldmljZXMgdGhpcyBjb3VsZCBiZWNvbWUgYW4gaW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKi8KK2Jvb2wgc2NpX3BvcnRfbGlua19kZXRlY3RlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJaWYgKChpcG9ydC0+bG9naWNhbF9wb3J0X2luZGV4ICE9IFNDSUNfU0RTX0RVTU1ZX1BPUlQpICYmCisJICAgIChpcGh5LT5wcm90b2NvbCA9PSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSkgJiYKKwkgICAgc2NpX3BvcnRfaXNfd2lkZShpcG9ydCkpIHsKKwkJc2NpX3BvcnRfaW52YWxpZF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCppcG9ydCksIHRpbWVyKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjdXJyZW50X3N0YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJY3VycmVudF9zdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKGN1cnJlbnRfc3RhdGUgPT0gU0NJX1BPUlRfUkVTRVRUSU5HKSB7CisJCS8qIGlmIHRoZSBwb3J0IGlzIHN0aWxsIGluIHRoZSByZXNldHRpbmcgc3RhdGUgdGhlbiB0aGUgdGltZW91dAorCQkgKiBmaXJlZCBiZWZvcmUgdGhlIHJlc2V0IGNvbXBsZXRlZC4KKwkJICovCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX0ZBSUxFRCk7CisJfSBlbHNlIGlmIChjdXJyZW50X3N0YXRlID09IFNDSV9QT1JUX1NUT1BQRUQpIHsKKwkJLyogaWYgdGhlIHBvcnQgaXMgc3RvcHBlZCB0aGVuIHRoZSBzdGFydCByZXF1ZXN0IGZhaWxlZCBJbiB0aGlzCisJCSAqIGNhc2Ugc3RheSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKwkJICovCisJCWRldl9lcnIoc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJIiVzOiBTQ0lDIFBvcnQgMHglcCBmYWlsZWQgdG8gc3RvcCBiZWZvcmUgdGllbW91dC5cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlwb3J0KTsKKwl9IGVsc2UgaWYgKGN1cnJlbnRfc3RhdGUgPT0gU0NJX1BPUlRfU1RPUFBJTkcpIHsKKwkJLyogaWYgdGhlIHBvcnQgaXMgc3RpbGwgc3RvcHBpbmcgdGhlbiB0aGUgc3RvcCBoYXMgbm90IGNvbXBsZXRlZCAqLworCQlpc2NpX3BvcnRfc3RvcF9jb21wbGV0ZShpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIsCisJCQkJCWlwb3J0LAorCQkJCQlTQ0lfRkFJTFVSRV9USU1FT1VUKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgcG9ydCBpcyBpbiB0aGUgcmVhZHkgc3RhdGUgYW5kIHdlIGhhdmUgYSB0aW1lcgorCQkgKiByZXBvcnRpbmcgYSB0aW1lb3V0IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisJCSAqLworCQlkZXZfZXJyKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSIlczogU0NJQyBQb3J0IDB4JXAgaXMgcHJvY2Vzc2luZyBhIHRpbWVvdXQgb3BlcmF0aW9uICIKKwkJCSJpbiBzdGF0ZSAlZC5cbiIsIF9fZnVuY19fLCBpcG9ydCwgY3VycmVudF9zdGF0ZSk7CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBoYXJkd2FyZXMgVklJVCBlbnRyeSBmb3IgdGhpcyBwb3J0LgorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3VwZGF0ZV92aWl0X2VudHJ5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisKKwlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZzYXNfYWRkcmVzcyk7CisKKwl3cml0ZWwoc2FzX2FkZHJlc3MuaGlnaCwKKwkJJmlwb3J0LT52aWl0X3JlZ2lzdGVycy0+aW5pdGlhdG9yX3Nhc19hZGRyZXNzX2hpKTsKKwl3cml0ZWwoc2FzX2FkZHJlc3MubG93LAorCQkmaXBvcnQtPnZpaXRfcmVnaXN0ZXJzLT5pbml0aWF0b3Jfc2FzX2FkZHJlc3NfbG8pOworCisJLyogVGhpcyB2YWx1ZSBnZXQgY2xlYXJlZCBqdXN0IGluIGNhc2UgaXRzIG5vdCBhbHJlYWR5IGNsZWFyZWQgKi8KKwl3cml0ZWwoMCwgJmlwb3J0LT52aWl0X3JlZ2lzdGVycy0+cmVzZXJ2ZWQpOworCisJLyogV2UgYXJlIHJlcXVpcmVkIHRvIHVwZGF0ZSB0aGUgc3RhdHVzIHJlZ2lzdGVyIGxhc3QgKi8KKwl3cml0ZWwoU0NVX1ZJSVRfRU5UUllfSURfVklJVCB8CisJICAgICAgIFNDVV9WSUlUX0lQUFRfSU5JVElBVE9SIHwKKwkgICAgICAgKCgxIDw8IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4KSA8PCBTQ1VfVklJVF9FTlRSWV9MUFZJRV9TSElGVCkgfAorCSAgICAgICBTQ1VfVklJVF9TVEFUVVNfQUxMX1ZBTElELAorCSAgICAgICAmaXBvcnQtPnZpaXRfcmVnaXN0ZXJzLT5zdGF0dXMpOworfQorCitlbnVtIHNhc19saW5rcmF0ZSBzY2lfcG9ydF9nZXRfbWF4X2FsbG93ZWRfc3BlZWQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTE2IGluZGV4OworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKwllbnVtIHNhc19saW5rcmF0ZSBtYXhfYWxsb3dlZF9zcGVlZCA9IFNBU19MSU5LX1JBVEVfNl8wX0dCUFM7CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHBoeXMgaW4gdGhpcyBwb3J0IGFuZCBmaW5kIHRoZSBwaHkgd2l0aCB0aGUKKwkgKiBsb3dlc3QgbWF4aW11bSBsaW5rIHJhdGUuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCWlwaHkgPSBpcG9ydC0+cGh5X3RhYmxlW2luZGV4XTsKKwkJaWYgKGlwaHkgJiYgc2NpX3BvcnRfYWN0aXZlX3BoeShpcG9ydCwgaXBoeSkgJiYKKwkJICAgIGlwaHktPm1heF9uZWdvdGlhdGVkX3NwZWVkIDwgbWF4X2FsbG93ZWRfc3BlZWQpCisJCQltYXhfYWxsb3dlZF9zcGVlZCA9IGlwaHktPm1heF9uZWdvdGlhdGVkX3NwZWVkOworCX0KKworCXJldHVybiBtYXhfYWxsb3dlZF9zcGVlZDsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfc3VzcGVuZF9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBwdHNfY29udHJvbF92YWx1ZTsKKworCXB0c19jb250cm9sX3ZhbHVlID0gcmVhZGwoJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisJcHRzX2NvbnRyb2xfdmFsdWUgfD0gU0NVX1BUU3hDUl9HRU5fQklUKFNVU1BFTkQpOworCXdyaXRlbChwdHNfY29udHJvbF92YWx1ZSwgJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKKy8qKgorICogc2NpX3BvcnRfcG9zdF9kdW1teV9yZXF1ZXN0KCkgLSBwb3N0IGR1bW15L3dvcmthcm91bmQgcmVxdWVzdAorICogQHNjaV9wb3J0OiBwb3J0IHRvIHBvc3QgdGFzaworICoKKyAqIFByZXZlbnQgdGhlIGhhcmR3YXJlIHNjaGVkdWxlciBmcm9tIHBvc3RpbmcgbmV3IHJlcXVlc3RzIHRvIHRoZSBmcm9udAorICogb2YgdGhlIHNjaGVkdWxlciBxdWV1ZSBjYXVzaW5nIGEgc3RhcnZhdGlvbiBwcm9ibGVtIGZvciBjdXJyZW50bHkKKyAqIG9uZ29pbmcgcmVxdWVzdHMuCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9wb3N0X2R1bW15X3JlcXVlc3Qoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTE2IHRhZyA9IGlwb3J0LT5yZXNlcnZlZF90YWc7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRjOworCXUzMiBjb21tYW5kOworCisJdGMgPSAmaWhvc3QtPnRhc2tfY29udGV4dF90YWJsZVtJU0NJX1RBR19UQ0kodGFnKV07CisJdGMtPmFib3J0ID0gMDsKKworCWNvbW1hbmQgPSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDIHwKKwkJICBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8CisJCSAgSVNDSV9UQUdfVENJKHRhZyk7CisKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGNvbW1hbmQpOworfQorCisvKioKKyAqIFRoaXMgcm91dGluZSB3aWxsIGFib3J0IHRoZSBkdW1teSByZXF1ZXN0LiAgVGhpcyB3aWxsIGFsb3cgdGhlIGhhcmR3YXJlIHRvCisgKiBwb3dlciBkb3duIHBhcnRzIG9mIHRoZSBzaWxpY29uIHRvIHNhdmUgcG93ZXIuCisgKgorICogQHNjaV9wb3J0OiBUaGUgcG9ydCBvbiB3aGljaCB0aGUgdGFzayBtdXN0IGJlIGFib3J0ZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9hYm9ydF9kdW1teV9yZXF1ZXN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXUxNiB0YWcgPSBpcG9ydC0+cmVzZXJ2ZWRfdGFnOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YzsKKwl1MzIgY29tbWFuZDsKKworCXRjID0gJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbSVNDSV9UQUdfVENJKHRhZyldOworCXRjLT5hYm9ydCA9IDE7CisKKwljb21tYW5kID0gU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1BPU1RfVENfQUJPUlQgfAorCQkgIGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4IDw8IFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUIHwKKwkJICBJU0NJX1RBR19UQ0kodGFnKTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcG9ydDogVGhpcyBpcyB0aGUgc3RydWN0IGlzY2lfcG9ydCBvYmplY3QgdG8gcmVzdW1lLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzdW1lIHRoZSBwb3J0IHRhc2sgc2NoZWR1bGVyIGZvciB0aGlzIHBvcnQgb2JqZWN0LiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitzY2lfcG9ydF9yZXN1bWVfcG9ydF90YXNrX3NjaGVkdWxlcihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgcHRzX2NvbnRyb2xfdmFsdWU7CisKKwlwdHNfY29udHJvbF92YWx1ZSA9IHJlYWRsKCZpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXB0c19jb250cm9sX3ZhbHVlICY9IH5TQ1VfUFRTeENSX0dFTl9CSVQoU1VTUEVORCk7CisJd3JpdGVsKHB0c19jb250cm9sX3ZhbHVlLCAmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfd2FpdGluZ19lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwlzY2lfcG9ydF9zdXNwZW5kX3BvcnRfdGFza19zY2hlZHVsZXIoaXBvcnQpOworCisJaXBvcnQtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1BPUlRfTk9UX1JFQURZX05PX0FDVElWRV9QSFlTOworCisJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgIT0gMCkgeworCQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHBoeXMgb24gdGhlIHBvcnQgaXMgcmVhZHkgKi8KKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfb3BlcmF0aW9uYWxfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlzY2lfcG9ydF9yZWFkeShpaG9zdCwgaXBvcnQpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCWlmIChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSkgeworCQkJd3JpdGVsKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4LAorCQkJCSZpcG9ydC0+cG9ydF9wZV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyWworCQkJCQlpcG9ydC0+cGh5X3RhYmxlW2luZGV4XS0+cGh5X2luZGV4XSk7CisJCX0KKwl9CisKKwlzY2lfcG9ydF91cGRhdGVfdmlpdF9lbnRyeShpcG9ydCk7CisKKwlzY2lfcG9ydF9yZXN1bWVfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7CisKKwkvKgorCSAqIFBvc3QgdGhlIGR1bW15IHRhc2sgZm9yIHRoZSBwb3J0IHNvIHRoZSBoYXJkd2FyZSBjYW4gc2NoZWR1bGUKKwkgKiBpbyBjb3JyZWN0bHkKKwkgKi8KKwlzY2lfcG9ydF9wb3N0X2R1bW15X3JlcXVlc3QoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9pbnZhbGlkYXRlX2R1bW15X3JlbW90ZV9ub2RlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXU4IHBoeXNfaW5kZXggPSBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKwl1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jOworCXUxNiBybmkgPSBpcG9ydC0+cmVzZXJ2ZWRfcm5pOworCXUzMiBjb21tYW5kOworCisJcm5jID0gJmlob3N0LT5yZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlW3JuaV07CisKKwlybmMtPnNzcC5pc192YWxpZCA9IGZhbHNlOworCisJLyogZW5zdXJlIHRoZSBwcmVjZWRpbmcgdGMgYWJvcnQgcmVxdWVzdCBoYXMgcmVhY2hlZCB0aGUKKwkgKiBjb250cm9sbGVyIGFuZCBnaXZlIGl0IGFtcGxlIHRpbWUgdG8gYWN0IGJlZm9yZSBwb3N0aW5nIHRoZSBybmMKKwkgKiBpbnZhbGlkYXRlCisJICovCisJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsgLyogZmx1c2ggKi8KKwl1ZGVsYXkoMTApOworCisJY29tbWFuZCA9IFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfSU5WQUxJREFURSB8CisJCSAgcGh5c19pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8IHJuaTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7Cit9CisKKy8qKgorICoKKyAqIEBvYmplY3Q6IFRoaXMgaXMgdGhlIG9iamVjdCB3aGljaCBpcyBjYXN0IHRvIGEgc3RydWN0IGlzY2lfcG9ydCBvYmplY3QuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBwZXJmb3JtIHRoZSBhY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBzdHJ1Y3QgaXNjaV9wb3J0IG9uCisgKiBleGl0aW5nIHRoZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwuIFRoaXMgZnVuY3Rpb24gcmVwb3J0cworICogdGhlIHBvcnQgbm90IHJlYWR5IGFuZCBzdXNwZW5kcyB0aGUgcG9ydCB0YXNrIHNjaGVkdWxlci4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9vcGVyYXRpb25hbF9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qCisJICogS2lsbCB0aGUgZHVtbXkgdGFzayBmb3IgdGhpcyBwb3J0IGlmIGl0IGhhcyBub3QgeWV0IHBvc3RlZAorCSAqIHRoZSBoYXJkd2FyZSB3aWxsIHRyZWF0IHRoaXMgYXMgYSBOT1AgYW5kIGp1c3QgcmV0dXJuIGFib3J0CisJICogY29tcGxldGUuCisJICovCisJc2NpX3BvcnRfYWJvcnRfZHVtbXlfcmVxdWVzdChpcG9ydCk7CisKKwlpc2NpX3BvcnRfbm90X3JlYWR5KGlob3N0LCBpcG9ydCk7CisKKwlpZiAoaXBvcnQtPnJlYWR5X2V4aXQpCisJCXNjaV9wb3J0X2ludmFsaWRhdGVfZHVtbXlfcmVtb3RlX25vZGUoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9jb25maWd1cmluZ19lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA9PSAwKSB7CisJCWlzY2lfcG9ydF9ub3RfcmVhZHkoaWhvc3QsIGlwb3J0KTsKKworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NVQl9XQUlUSU5HKTsKKwl9IGVsc2UgaWYgKGlwb3J0LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPT0gMCkKKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9jb25maWd1cmluZ19leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKworCXNjaV9wb3J0X3N1c3BlbmRfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7CisJaWYgKGlwb3J0LT5yZWFkeV9leGl0KQorCQlzY2lfcG9ydF9pbnZhbGlkYXRlX2R1bW15X3JlbW90ZV9ub2RlKGlwb3J0KTsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0YXJ0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKwl1MzIgcGh5X21hc2s7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCWlmIChzdGF0ZSAhPSBTQ0lfUE9SVF9TVE9QUEVEKSB7CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJaWYgKGlwb3J0LT5hc3NpZ25lZF9kZXZpY2VfY291bnQgPiAwKSB7CisJCS8qIFRPRE8gVGhpcyBpcyBhIHN0YXJ0IGZhaWx1cmUgb3BlcmF0aW9uIGJlY2F1c2UKKwkJICogdGhlcmUgYXJlIHN0aWxsIGRldmljZXMgYXNzaWduZWQgdG8gdGhpcyBwb3J0LgorCQkgKiBUaGVyZSBtdXN0IGJlIG5vIGRldmljZXMgYXNzaWduZWQgdG8gYSBwb3J0IG9uIGEKKwkJICogc3RhcnQgb3BlcmF0aW9uLgorCQkgKi8KKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwl9CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3JuaSA9PSBTQ1VfRFVNTVlfSU5ERVgpIHsKKwkJdTE2IHJuaSA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9yZW1vdGVfbm9kZSgKKwkJCQkmaWhvc3QtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXMsIDEpOworCisJCWlmIChybmkgIT0gU0NVX0RVTU1ZX0lOREVYKQorCQkJc2NpX3BvcnRfY29uc3RydWN0X2R1bW15X3JuYyhpcG9ydCwgcm5pKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKKwkJaXBvcnQtPnJlc2VydmVkX3JuaSA9IHJuaTsKKwl9CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3RhZyA9PSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykgeworCQl1MTYgdGFnOworCisJCXRhZyA9IGlzY2lfYWxsb2NfdGFnKGlob3N0KTsKKwkJaWYgKHRhZyA9PSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7CisJCWVsc2UKKwkJCXNjaV9wb3J0X2NvbnN0cnVjdF9kdW1teV90YXNrKGlwb3J0LCB0YWcpOworCQlpcG9ydC0+cmVzZXJ2ZWRfdGFnID0gdGFnOworCX0KKworCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJcGh5X21hc2sgPSBzY2lfcG9ydF9nZXRfcGh5cyhpcG9ydCk7CisKKwkJLyoKKwkJICogVGhlcmUgYXJlIG9uZSBvciBtb3JlIHBoeXMgYXNzaWduZWQgdG8gdGhpcyBwb3J0LiAgTWFrZSBzdXJlCisJCSAqIHRoZSBwb3J0J3MgcGh5IG1hc2sgaXMgaW4gZmFjdCBsZWdhbCBhbmQgc3VwcG9ydGVkIGJ5IHRoZQorCQkgKiBzaWxpY29uLgorCQkgKi8KKwkJaWYgKHNjaV9wb3J0X2lzX3BoeV9tYXNrX3ZhbGlkKGlwb3J0LCBwaHlfbWFzaykgPT0gdHJ1ZSkgeworCQkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJCSAgU0NJX1BPUlRfUkVBRFkpOworCisJCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJCX0KKwkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisJfQorCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJc2NpX3BvcnRfZGVzdHJveV9kdW1teV9yZXNvdXJjZXMoaXBvcnQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0b3Aoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NUT1BQRUQ6CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCWNhc2UgU0NJX1BPUlRfUkVTRVRUSU5HOgorCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NUT1BQSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2hhcmRfcmVzZXQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUzMiB0aW1lb3V0KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1BIWTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBOVUxMOworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCXUzMiBwaHlfaW5kZXg7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCWlmIChzdGF0ZSAhPSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpIHsKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwkvKiBTZWxlY3QgYSBwaHkgb24gd2hpY2ggd2UgY2FuIHNlbmQgdGhlIGhhcmQgcmVzZXQgcmVxdWVzdC4gKi8KKwlmb3IgKHBoeV9pbmRleCA9IDA7IHBoeV9pbmRleCA8IFNDSV9NQVhfUEhZUyAmJiAhaXBoeTsgcGh5X2luZGV4KyspIHsKKwkJaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbcGh5X2luZGV4XTsKKwkJaWYgKGlwaHkgJiYgIXNjaV9wb3J0X2FjdGl2ZV9waHkoaXBvcnQsIGlwaHkpKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYSBwaHkgYnV0IGl0IGlzIG5vdCByZWFkeSBzZWxlY3QKKwkJCSAqIGRpZmZlcmVudCBwaHkKKwkJCSAqLworCQkJaXBoeSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGEgcGh5IHRoZW4gZ28gYWhlYWQgYW5kIHN0YXJ0IHRoZSByZXNldCBwcm9jZWR1cmUgKi8KKwlpZiAoIWlwaHkpCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gc2NpX3BoeV9yZXNldChpcGh5KTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlzY2lfbW9kX3RpbWVyKCZpcG9ydC0+dGltZXIsIHRpbWVvdXQpOworCWlwb3J0LT5ub3RfcmVhZHlfcmVhc29uID0gU0NJQ19QT1JUX05PVF9SRUFEWV9IQVJEX1JFU0VUX1JFUVVFU1RFRDsKKworCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX1JFU0VUVElORyk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9wb3J0X2FkZF9waHkoKSAtCisgKiBAc2NpX3BvcnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcG9ydCBpbiB3aGljaCB0aGUgcGh5IHdpbGwgYmUgYWRkZWQuCisgKiBAc2NpX3BoeTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHBoeSB3aGljaCBpcyB0byBiZSBhZGRlZCB0byB0aGUgcG9ydC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCBhIFBIWSB0byB0aGUgc2VsZWN0ZWQgcG9ydC4gVGhpcyBtZXRob2QgcmV0dXJucyBhbgorICogZW51bSBzY2lfc3RhdHVzLiBTQ0lfU1VDQ0VTUyB0aGUgcGh5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwb3J0LiBBbnkgb3RoZXIKKyAqIHN0YXR1cyBpcyBhIGZhaWx1cmUgdG8gYWRkIHRoZSBwaHkgdG8gdGhlIHBvcnQuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9hZGRfcGh5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUE9SVF9TVE9QUEVEOiB7CisJCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcG9ydF9zYXNfYWRkcmVzczsKKworCQkvKiBSZWFkIHRoZSBwb3J0IGFzc2lnbmVkIFNBUyBBZGRyZXNzIGlmIHRoZXJlIGlzIG9uZSAqLworCQlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZwb3J0X3Nhc19hZGRyZXNzKTsKKworCQlpZiAocG9ydF9zYXNfYWRkcmVzcy5oaWdoICE9IDAgJiYgcG9ydF9zYXNfYWRkcmVzcy5sb3cgIT0gMCkgeworCQkJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwaHlfc2FzX2FkZHJlc3M7CisKKwkJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBQSFkgU0FTIEFkZHJlc3MgbWF0Y2hlcyB0aGUgU0FTIEFkZHJlc3MKKwkJCSAqIGZvciB0aGlzIHBvcnQKKwkJCSAqLworCQkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoaXBoeSwgJnBoeV9zYXNfYWRkcmVzcyk7CisKKwkJCWlmIChwb3J0X3Nhc19hZGRyZXNzLmhpZ2ggIT0gcGh5X3Nhc19hZGRyZXNzLmhpZ2ggfHwKKwkJCSAgICBwb3J0X3Nhc19hZGRyZXNzLmxvdyAgIT0gcGh5X3Nhc19hZGRyZXNzLmxvdykKKwkJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCQl9CisJCXJldHVybiBzY2lfcG9ydF9zZXRfcGh5KGlwb3J0LCBpcGh5KTsKKwl9CisJY2FzZSBTQ0lfUE9SVF9TVUJfV0FJVElORzoKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwkJc3RhdHVzID0gc2NpX3BvcnRfc2V0X3BoeShpcG9ydCwgaXBoeSk7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIoaXBvcnQsIGlwaHksIHRydWUpOworCQlpcG9ydC0+bm90X3JlYWR5X3JlYXNvbiA9IFNDSUNfUE9SVF9OT1RfUkVBRFlfUkVDT05GSUdVUklORzsKKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HKTsKKworCQlyZXR1cm4gc3RhdHVzOworCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9zZXRfcGh5KGlwb3J0LCBpcGh5KTsKKworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIoaXBvcnQsIGlwaHksIHRydWUpOworCisJCS8qIFJlLWVudGVyIHRoZSBjb25maWd1cmluZyBzdGF0ZSBzaW5jZSB0aGlzIG1heSBiZSB0aGUgbGFzdCBwaHkgaW4KKwkJICogdGhlIHBvcnQuCisJCSAqLworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworLyoqCisgKiBzY2lfcG9ydF9yZW1vdmVfcGh5KCkgLQorICogQHNjaV9wb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHBvcnQgaW4gd2hpY2ggdGhlIHBoeSB3aWxsIGJlIGFkZGVkLgorICogQHNjaV9waHk6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBwaHkgd2hpY2ggaXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBvcnQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIFBIWSBmcm9tIHRoZSBzZWxlY3RlZCBQT1JULiBUaGlzIG1ldGhvZCByZXR1cm5zCisgKiBhbiBlbnVtIHNjaV9zdGF0dXMuIFNDSV9TVUNDRVNTIHRoZSBwaHkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwb3J0LiBBbnkKKyAqIG90aGVyIHN0YXR1cyBpcyBhIGZhaWx1cmUgdG8gYWRkIHRoZSBwaHkgdG8gdGhlIHBvcnQuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9yZW1vdmVfcGh5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1RPUFBFRDoKKwkJcmV0dXJuIHNjaV9wb3J0X2NsZWFyX3BoeShpcG9ydCwgaXBoeSk7CisJY2FzZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUw6CisJCXN0YXR1cyA9IHNjaV9wb3J0X2NsZWFyX3BoeShpcG9ydCwgaXBoeSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXNjaV9wb3J0X2RlYWN0aXZhdGVfcGh5KGlwb3J0LCBpcGh5LCB0cnVlKTsKKwkJaXBvcnQtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1BPUlRfTk9UX1JFQURZX1JFQ09ORklHVVJJTkc7CisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9jbGVhcl9waHkoaXBvcnQsIGlwaHkpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCQlzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeShpcG9ydCwgaXBoeSwgdHJ1ZSk7CisKKwkJLyogUmUtZW50ZXIgdGhlIGNvbmZpZ3VyaW5nIHN0YXRlIHNpbmNlIHRoaXMgbWF5IGJlIHRoZSBsYXN0IHBoeSBpbgorCQkgKiB0aGUgcG9ydAorCQkgKi8KKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9saW5rX3VwKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJCS8qIFNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IHBoeSBnb2luZyBsaW5rIHVwIGZvciB0aGUgcG9ydCB3ZQorCQkgKiBjYW4ganVzdCBlbmFibGUgaXQgYW5kIGNvbnRpbnVlCisJCSAqLworCQlzY2lfcG9ydF9hY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIHRydWUpOworCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlcihpcG9ydCwgaXBoeSwgdHJ1ZSk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QT1JUX1JFU0VUVElORzoKKwkJLyogVE9ETyBXZSBzaG91bGQgIG1ha2UgIHN1cmUgIHRoYXQgIHRoZSBwaHkgIHRoYXQgIGhhcyBnb25lCisJCSAqIGxpbmsgdXAgaXMgdGhlIHNhbWUgb25lIG9uIHdoaWNoIHdlIHNlbnQgdGhlIHJlc2V0LiAgSXQgaXMKKwkJICogcG9zc2libGUgdGhhdCB0aGUgcGh5IG9uIHdoaWNoIHdlIHNlbnQgIHRoZSByZXNldCBpcyBub3QgdGhlCisJCSAqIG9uZSB0aGF0IGhhcyAgZ29uZSAgbGluayB1cCAgYW5kIHdlICB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0CisJCSAqIHBoeSBiZWluZyByZXNldCAgY29tZXMgIGJhY2suICBDb25zaWRlciB0aGUgY2FzZSB3aGVyZSBhCisJCSAqIHJlc2V0IGlzIHNlbnQgYnV0IGJlZm9yZSB0aGUgaGFyZHdhcmUgcHJvY2Vzc2VzIHRoZSByZXNldCBpdAorCQkgKiBnZXQgYSBsaW5rIHVwIG9uICB0aGUgIHBvcnQgYmVjYXVzZSBvZiBhIGhvdCBwbHVnIGV2ZW50LgorCQkgKiBiZWNhdXNlICBvZiAgdGhlIHJlc2V0IHJlcXVlc3QgdGhpcyBwaHkgd2lsbCBnbyBsaW5rIGRvd24KKwkJICogYWxtb3N0IGltbWVkaWF0ZWx5LgorCQkgKi8KKworCQkvKiBJbiB0aGUgcmVzZXR0aW5nIHN0YXRlIHdlIGRvbid0IG5vdGlmeSB0aGUgdXNlciByZWdhcmRpbmcKKwkJICogbGluayB1cCBhbmQgbGluayBkb3duIG5vdGlmaWNhdGlvbnMuCisJCSAqLworCQlzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlcihpcG9ydCwgaXBoeSwgZmFsc2UpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9saW5rX2Rvd24oc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeShpcG9ydCwgaXBoeSwgdHJ1ZSk7CisKKwkJLyogSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBwaHlzIGxlZnQgaW4gdGhlIHBvcnQsIHRoZW4KKwkJICogdHJhbnNpdGlvbiB0aGUgcG9ydCB0byB0aGUgV0FJVElORyBzdGF0ZSB1bnRpbCBzdWNoIHRpbWUKKwkJICogYXMgYSBwaHkgZ29lcyBsaW5rIHVwCisJCSAqLworCQlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA9PSAwKQorCQkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJCSAgU0NJX1BPUlRfU1VCX1dBSVRJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUE9SVF9SRVNFVFRJTkc6CisJCS8qIEluIHRoZSByZXNldHRpbmcgc3RhdGUgd2UgZG9uJ3Qgbm90aWZ5IHRoZSB1c2VyIHJlZ2FyZGluZworCQkgKiBsaW5rIHVwIGFuZCBsaW5rIGRvd24gbm90aWZpY2F0aW9ucy4gKi8KKwkJc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIGZhbHNlKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfc3RhcnRfaW8oc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50Kys7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NUT1BQRUQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfUE9SVF9TVE9QUElORzoKKwkJc2NpX3BvcnRfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoaXBvcnQpOworCisJCWlmIChpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApCisJCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkJICBTQ0lfUE9SVF9TVE9QUEVEKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lfUE9SVF9SRUFEWToKKwljYXNlIFNDSV9QT1JUX1JFU0VUVElORzoKKwljYXNlIFNDSV9QT1JUX0ZBSUxFRDoKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzY2lfcG9ydF9kZWNyZW1lbnRfcmVxdWVzdF9jb3VudChpcG9ydCk7CisJCWJyZWFrOworCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlzY2lfcG9ydF9kZWNyZW1lbnRfcmVxdWVzdF9jb3VudChpcG9ydCk7CisJCWlmIChpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApIHsKKwkJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCQkgIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZW5hYmxlX3BvcnRfdGFza19zY2hlZHVsZXIoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTMyIHB0c19jb250cm9sX3ZhbHVlOworCisJIC8qIGVuYWJsZSB0aGUgcG9ydCB0YXNrIHNjaGVkdWxlciBpbiBhIHN1c3BlbmRlZCBzdGF0ZSAqLworCXB0c19jb250cm9sX3ZhbHVlID0gcmVhZGwoJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisJcHRzX2NvbnRyb2xfdmFsdWUgfD0gU0NVX1BUU3hDUl9HRU5fQklUKEVOQUJMRSkgfCBTQ1VfUFRTeENSX0dFTl9CSVQoU1VTUEVORCk7CisJd3JpdGVsKHB0c19jb250cm9sX3ZhbHVlLCAmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZGlzYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBwdHNfY29udHJvbF92YWx1ZTsKKworCXB0c19jb250cm9sX3ZhbHVlID0gcmVhZGwoJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisJcHRzX2NvbnRyb2xfdmFsdWUgJj0KKwkJfihTQ1VfUFRTeENSX0dFTl9CSVQoRU5BQkxFKSB8IFNDVV9QVFN4Q1JfR0VOX0JJVChTVVNQRU5EKSk7CisJd3JpdGVsKHB0c19jb250cm9sX3ZhbHVlLCAmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcG9zdF9kdW1teV9yZW1vdGVfbm9kZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1OCBwaHlzX2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYzsKKwl1MTYgcm5pID0gaXBvcnQtPnJlc2VydmVkX3JuaTsKKwl1MzIgY29tbWFuZDsKKworCXJuYyA9ICZpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZVtybmldOworCXJuYy0+c3NwLmlzX3ZhbGlkID0gdHJ1ZTsKKworCWNvbW1hbmQgPSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DXzMyIHwKKwkJICBwaHlzX2luZGV4IDw8IFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUIHwgcm5pOworCisJc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KGlob3N0LCBjb21tYW5kKTsKKworCS8qIGVuc3VyZSBoYXJkd2FyZSBoYXMgc2VlbiB0aGUgcG9zdCBybmMgY29tbWFuZCBhbmQgZ2l2ZSBpdAorCSAqIGFtcGxlIHRpbWUgdG8gYWN0IGJlZm9yZSBzZW5kaW5nIHRoZSBzdXNwZW5kCisJICovCisJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsgLyogZmx1c2ggKi8KKwl1ZGVsYXkoMTApOworCisJY29tbWFuZCA9IFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfU1VTUEVORF9UWF9SWCB8CisJCSAgcGh5c19pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8IHJuaTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3N0b3BwZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJaWYgKGlwb3J0LT5zbS5wcmV2aW91c19zdGF0ZV9pZCA9PSBTQ0lfUE9SVF9TVE9QUElORykgeworCQkvKgorCQkgKiBJZiB3ZSBlbnRlciB0aGlzIHN0YXRlIGJlY2FzdXNlIG9mIGEgcmVxdWVzdCB0byBzdG9wCisJCSAqIHRoZSBwb3J0IHRoZW4gd2Ugd2FudCB0byBkaXNhYmxlIHRoZSBoYXJkd2FyZXMgcG9ydAorCQkgKiB0YXNrIHNjaGVkdWxlci4gKi8KKwkJc2NpX3BvcnRfZGlzYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKGlwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3N0b3BwZWRfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwkvKiBFbmFibGUgYW5kIHN1c3BlbmQgdGhlIHBvcnQgdGFzayBzY2hlZHVsZXIgKi8KKwlzY2lfcG9ydF9lbmFibGVfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3JlYWR5X3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1MzIgcHJldl9zdGF0ZTsKKworCXByZXZfc3RhdGUgPSBpcG9ydC0+c20ucHJldmlvdXNfc3RhdGVfaWQ7CisJaWYgKHByZXZfc3RhdGUgID09IFNDSV9QT1JUX1JFU0VUVElORykKKwkJaXNjaV9wb3J0X2hhcmRfcmVzZXRfY29tcGxldGUoaXBvcnQsIFNDSV9TVUNDRVNTKTsKKwllbHNlCisJCWlzY2lfcG9ydF9ub3RfcmVhZHkoaWhvc3QsIGlwb3J0KTsKKworCS8qIFBvc3QgYW5kIHN1c3BlbmQgdGhlIGR1bW15IHJlbW90ZSBub2RlIGNvbnRleHQgZm9yIHRoaXMgcG9ydC4gKi8KKwlzY2lfcG9ydF9wb3N0X2R1bW15X3JlbW90ZV9ub2RlKGlwb3J0KTsKKworCS8qIFN0YXJ0IHRoZSByZWFkeSBzdWJzdGF0ZSBtYWNoaW5lICovCisJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkgIFNDSV9QT1JUX1NVQl9XQUlUSU5HKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVzZXR0aW5nX3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaXBvcnQtPnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfc3RvcHBpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpcG9ydC0+dGltZXIpOworCisJc2NpX3BvcnRfZGVzdHJveV9kdW1teV9yZXNvdXJjZXMoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9mYWlsZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJaXNjaV9wb3J0X2hhcmRfcmVzZXRfY29tcGxldGUoaXBvcnQsIFNDSV9GQUlMVVJFX1RJTUVPVVQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcG9ydF9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfUE9SVF9TVE9QUEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfc3RvcHBlZF9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BvcnRfc3RvcHBlZF9zdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BPUlRfU1RPUFBJTkddID0geworCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcG9ydF9zdG9wcGluZ19zdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BPUlRfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcG9ydF9yZWFkeV9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUE9SVF9TVUJfV0FJVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX3dhaXRpbmdfZW50ZXIsCisJfSwKKwlbU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfb3BlcmF0aW9uYWxfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX29wZXJhdGlvbmFsX2V4aXQKKwl9LAorCVtTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9jb25maWd1cmluZ19lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfY29uZmlndXJpbmdfZXhpdAorCX0sCisJW1NDSV9QT1JUX1JFU0VUVElOR10gPSB7CisJCS5leGl0X3N0YXRlICA9IHNjaV9wb3J0X3Jlc2V0dGluZ19zdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BPUlRfRkFJTEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfZmFpbGVkX3N0YXRlX2VudGVyLAorCX0KK307CisKK3ZvaWQgc2NpX3BvcnRfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1OCBpbmRleCwKKwkJCSAgICAgc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc2NpX2luaXRfc20oJmlwb3J0LT5zbSwgc2NpX3BvcnRfc3RhdGVfdGFibGUsIFNDSV9QT1JUX1NUT1BQRUQpOworCisJaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCAgPSBTQ0lDX1NEU19EVU1NWV9QT1JUOworCWlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID0gaW5kZXg7CisJaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAgICAgPSAwOworCWlwb3J0LT5yZWFkeV9leGl0CSAgICAgID0gZmFsc2U7CisKKwlpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIgPSBpaG9zdDsKKworCWlwb3J0LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPSAwOworCWlwb3J0LT5hc3NpZ25lZF9kZXZpY2VfY291bnQgPSAwOworCisJaXBvcnQtPnJlc2VydmVkX3JuaSA9IFNDVV9EVU1NWV9JTkRFWDsKKwlpcG9ydC0+cmVzZXJ2ZWRfdGFnID0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUc7CisKKwlzY2lfaW5pdF90aW1lcigmaXBvcnQtPnRpbWVyLCBwb3J0X3RpbWVvdXQpOworCisJaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzID0gTlVMTDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykKKwkJaXBvcnQtPnBoeV90YWJsZVtpbmRleF0gPSBOVUxMOworfQorCit2b2lkIGlzY2lfcG9ydF9pbml0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgaW50IGluZGV4KQoreworCUlOSVRfTElTVF9IRUFEKCZpcG9ydC0+cmVtb3RlX2Rldl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaXBvcnQtPmRvbWFpbl9kZXZfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmlwb3J0LT5zdGF0ZV9sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmlwb3J0LT5zdGFydF9jb21wbGV0ZSk7CisJaXBvcnQtPmlzY2lfaG9zdCA9IGlob3N0OworCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXBvcnQsIGlzY2lfZnJlZWQpOworCWF0b21pY19zZXQoJmlwb3J0LT5ldmVudCwgMCk7Cit9CisKKy8qKgorICogaXNjaV9wb3J0X2dldF9zdGF0ZSgpIC0gVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBzdGF0dXMgb2YgdGhlIHBvcnQgb2JqZWN0LgorICogQGlzY2lfcG9ydDogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBpc2NpX3BvcnQgb2JqZWN0CisgKgorICogc3RhdHVzIG9mIHRoZSBvYmplY3QgYXMgYSBpc2NpX3N0YXR1cyBlbnVtLgorICovCitlbnVtIGlzY2lfc3RhdHVzIGlzY2lfcG9ydF9nZXRfc3RhdGUoCisJc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0KQoreworCXJldHVybiBpc2NpX3BvcnQtPnN0YXR1czsKK30KKwordm9pZCBzY2lfcG9ydF9icm9hZGNhc3RfY2hhbmdlX3JlY2VpdmVkKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKiBub3RpZnkgdGhlIHVzZXIuICovCisJaXNjaV9wb3J0X2JjX2NoYW5nZV9yZWNlaXZlZChpaG9zdCwgaXBvcnQsIGlwaHkpOworfQorCitpbnQgaXNjaV9wb3J0X3BlcmZvcm1faGFyZF9yZXNldChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJaW50IGlkeCwgcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaXBvcnQgPSAlcFxuIiwKKwkJX19mdW5jX18sIGlwb3J0KTsKKworCWluaXRfY29tcGxldGlvbigmaXBvcnQtPmhhcmRfcmVzZXRfY29tcGxldGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCSNkZWZpbmUgSVNDSV9QT1JUX1JFU0VUX1RJTUVPVVQgU0NJQ19TRFNfU0lHTkFUVVJFX0ZJU19USU1FT1VUCisJc3RhdHVzID0gc2NpX3BvcnRfaGFyZF9yZXNldChpcG9ydCwgSVNDSV9QT1JUX1JFU0VUX1RJTUVPVVQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpcG9ydC0+aGFyZF9yZXNldF9jb21wbGV0ZSk7CisKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgPSAlcDsgaGFyZCByZXNldCBjb21wbGV0aW9uXG4iLAorCQkJX19mdW5jX18sIGlwb3J0KTsKKworCQlpZiAoaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisKKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgPSAlcDsgc2NpX3BvcnRfaGFyZF9yZXNldCBjYWxsIgorCQkJIiBmYWlsZWQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpcG9ydCwgc3RhdHVzKTsKKworCX0KKworCS8qIElmIHRoZSBoYXJkIHJlc2V0IGZvciB0aGUgcG9ydCBoYXMgZmFpbGVkLCBjb25zaWRlciB0aGlzCisJICogdGhlIHNhbWUgYXMgbGluayBmYWlsdXJlcyBvbiBhbGwgcGh5cyBpbiB0aGUgcG9ydC4KKwkgKi8KKwlpZiAocmV0ICE9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKKworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpcG9ydCA9ICVwOyBoYXJkIHJlc2V0IGZhaWxlZCAiCisJCQkiKDB4JXgpIC0gZHJpdmluZyBleHBsaWNpdCBsaW5rIGZhaWwgZm9yIGFsbCBwaHlzXG4iLAorCQkJX19mdW5jX18sIGlwb3J0LCBpcG9ydC0+aGFyZF9yZXNldF9zdGF0dXMpOworCisJCS8qIERvd24gYWxsIHBoeXMgaW4gdGhlIHBvcnQuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgU0NJX01BWF9QSFlTOyArK2lkeCkgeworCQkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpZHhdOworCisJCQlpZiAoIWlwaHkpCisJCQkJY29udGludWU7CisJCQlzY2lfcGh5X3N0b3AoaXBoeSk7CisJCQlzY2lfcGh5X3N0YXJ0KGlwaHkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpc2NpX3BvcnRfZGVmb3JtZWQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpYnNhcyB3aGVuIGEgcG9ydCBiZWNvbWVzCisgKiAgICBpbmFjdGl2ZS4KKyAqIEBwaHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGlic2FzIHBoeSB3aXRoIHRoZSBpbmFjdGl2ZSBwb3J0LgorICoKKyAqLwordm9pZCBpc2NpX3BvcnRfZGVmb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkpCit7CisJcHJfZGVidWcoIiVzOiBzYXNfcGh5ID0gJXBcbiIsIF9fZnVuY19fLCBwaHkpOworfQorCisvKioKKyAqIGlzY2lfcG9ydF9mb3JtZWQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpYnNhcyB3aGVuIGEgcG9ydCBiZWNvbWVzCisgKiAgICBhY3RpdmUuCisgKiBAcGh5OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGxpYnNhcyBwaHkgd2l0aCB0aGUgYWN0aXZlIHBvcnQuCisgKgorICovCit2b2lkIGlzY2lfcG9ydF9mb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkpCit7CisJcHJfZGVidWcoIiVzOiBzYXNfcGh5ID0gJXAsIHNhc19wb3J0ID0gJXBcbiIsIF9fZnVuY19fLCBwaHksIHBoeS0+cG9ydCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwZWNkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuaApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfSVNDSV9QT1JUX0hfCisjZGVmaW5lIF9JU0NJX1BPUlRfSF8KKworI2luY2x1ZGUgPHNjc2kvbGlic2FzLmg+CisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInNhcy5oIgorI2luY2x1ZGUgInBoeS5oIgorCisjZGVmaW5lIFNDSUNfU0RTX0RVTU1ZX1BPUlQgICAweEZGCisKK3N0cnVjdCBpc2NpX3BoeTsKK3N0cnVjdCBpc2NpX2hvc3Q7CisKK2VudW0gaXNjaV9zdGF0dXMgeworCWlzY2lfZnJlZWQgICAgICAgID0gMHgwMCwKKwlpc2NpX3N0YXJ0aW5nICAgICA9IDB4MDEsCisJaXNjaV9yZWFkeSAgICAgICAgPSAweDAyLAorCWlzY2lfcmVhZHlfZm9yX2lvID0gMHgwMywKKwlpc2NpX3N0b3BwaW5nICAgICA9IDB4MDQsCisJaXNjaV9zdG9wcGVkICAgICAgPSAweDA1LAorfTsKKworLyoqCisgKiBzdHJ1Y3QgaXNjaV9wb3J0IC0gaXNjaSBkaXJlY3QgYXR0YWNoZWQgc2FzIHBvcnQgb2JqZWN0CisgKiBAZXZlbnQ6IGNvdW50cyBiY25zIGFuZCBwb3J0IHN0b3AgZXZlbnRzIChmb3IgYmNuIGZpbHRlcmluZykKKyAqIEByZWFkeV9leGl0OiBzZXZlcmFsIHN0YXRlcyBjb25zdGl0dXRlICdyZWFkeScuIFdoZW4gZXhpdGluZyByZWFkeSB3ZQorICogICAgICAgICAgICAgIG5lZWQgdG8gdGFrZSBleHRyYSBwb3J0LXRlYXJkb3duIGFjdGlvbnMgdGhhdCBhcmUKKyAqICAgICAgICAgICAgICBza2lwcGVkIHdoZW4gZXhpdGluZyB0byBhbm90aGVyICdyZWFkeScgc3RhdGUuCisgKiBAbG9naWNhbF9wb3J0X2luZGV4OiBzb2Z0d2FyZSBwb3J0IGluZGV4CisgKiBAcGh5c2ljYWxfcG9ydF9pbmRleDogaGFyZHdhcmUgcG9ydCBpbmRleAorICogQGFjdGl2ZV9waHlfbWFzazogaWRlbnRpZmllcyBwaHkgbWVtYmVycworICogQHJlc2VydmVkX3RhZzoKKyAqIEByZXNlcnZlZF9ybmk6IHJlc2VydmVyIGZvciBwb3J0IHRhc2sgc2NoZWR1bGVyIHdvcmthcm91bmQKKyAqIEBzdGFydGVkX3JlcXVlc3RfY291bnQ6IHJlZmVyZW5jZSBjb3VudCBmb3Igb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqIEBub3RfcmVhZHlfcmVhc29uOiBzZXQgZHVyaW5nIHN0YXRlIHRyYW5zaXRpb25zIGFuZCBub3RpZmllZAorICogQHRpbWVyOiB0aW1lb3V0IHN0YXJ0L3N0b3Agb3BlcmF0aW9ucworICovCitzdHJ1Y3QgaXNjaV9wb3J0IHsKKwllbnVtIGlzY2lfc3RhdHVzIHN0YXR1czsKKwkjZGVmaW5lIElQT1JUX0JDTl9CTE9DS0VEIDAKKwkjZGVmaW5lIElQT1JUX0JDTl9QRU5ESU5HIDEKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF0b21pY190IGV2ZW50OworCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdDsKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0IHNhc19wb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgcmVtb3RlX2Rldl9saXN0OworCXNwaW5sb2NrX3Qgc3RhdGVfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbWFpbl9kZXZfbGlzdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdGFydF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBoYXJkX3Jlc2V0X2NvbXBsZXRlOworCWVudW0gc2NpX3N0YXR1cyBoYXJkX3Jlc2V0X3N0YXR1czsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwlib29sIHJlYWR5X2V4aXQ7CisJdTggbG9naWNhbF9wb3J0X2luZGV4OworCXU4IHBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdTggYWN0aXZlX3BoeV9tYXNrOworCXUxNiByZXNlcnZlZF9ybmk7CisJdTE2IHJlc2VydmVkX3RhZzsKKwl1MzIgc3RhcnRlZF9yZXF1ZXN0X2NvdW50OworCXUzMiBhc3NpZ25lZF9kZXZpY2VfY291bnQ7CisJdTMyIG5vdF9yZWFkeV9yZWFzb247CisJc3RydWN0IGlzY2lfcGh5ICpwaHlfdGFibGVbU0NJX01BWF9QSFlTXTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICpvd25pbmdfY29udHJvbGxlcjsKKwlzdHJ1Y3Qgc2NpX3RpbWVyIHRpbWVyOworCXN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnM7CisJLyogWFhYIHJld29yazogb25seSBvbmUgcmVnaXN0ZXIsIG5vIG5lZWQgdG8gcmVwbGljYXRlIHBlci1wb3J0ICovCisJdTMyIF9faW9tZW0gKnBvcnRfcGVfY29uZmlndXJhdGlvbl9yZWdpc3RlcjsKKwlzdHJ1Y3Qgc2N1X3ZpaXRfZW50cnkgX19pb21lbSAqdmlpdF9yZWdpc3RlcnM7Cit9OworCitlbnVtIHNjaV9wb3J0X25vdF9yZWFkeV9yZWFzb25fY29kZSB7CisJU0NJQ19QT1JUX05PVF9SRUFEWV9OT19BQ1RJVkVfUEhZUywKKwlTQ0lDX1BPUlRfTk9UX1JFQURZX0hBUkRfUkVTRVRfUkVRVUVTVEVELAorCVNDSUNfUE9SVF9OT1RfUkVBRFlfSU5WQUxJRF9QT1JUX0NPTkZJR1VSQVRJT04sCisJU0NJQ19QT1JUX05PVF9SRUFEWV9SRUNPTkZJR1VSSU5HLAorCisJU0NJQ19QT1JUX05PVF9SRUFEWV9SRUFTT05fQ09ERV9NQVgKK307CisKK3N0cnVjdCBzY2lfcG9ydF9lbmRfcG9pbnRfcHJvcGVydGllcyB7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBzYXNfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3BoeV9wcm90byBwcm90b2NvbHM7Cit9OworCitzdHJ1Y3Qgc2NpX3BvcnRfcHJvcGVydGllcyB7CisJdTMyIGluZGV4OworCXN0cnVjdCBzY2lfcG9ydF9lbmRfcG9pbnRfcHJvcGVydGllcyBsb2NhbDsKKwlzdHJ1Y3Qgc2NpX3BvcnRfZW5kX3BvaW50X3Byb3BlcnRpZXMgcmVtb3RlOworCXUzMiBwaHlfbWFzazsKK307CisKKy8qKgorICogZW51bSBzY2lfcG9ydF9zdGF0ZXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIHRoZSBzdGF0ZXMgZm9yIHRoZQorICogICAgY29tbW9uIHBvcnQgc3RhdGUgbWFjaGluZS4KKyAqCisgKgorICovCitlbnVtIHNjaV9wb3J0X3N0YXRlcyB7CisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gc3RvcHBlZC4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQSU5HIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBwb3J0IGlzIGluIHRoZSBwcm9jZXNzIG9mIHN0b3BwaW5nLgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCwgYnV0IGV4aXN0aW5nIElPCisJICogb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBjb21wbGV0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX1BPUlRfU1RPUFBJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgcG9ydCBpcyBub3cgcmVhZHkuICBUaHVzLCB0aGUgdXNlciBpcworCSAqIGFibGUgdG8gcGVyZm9ybSBJTyBvcGVyYXRpb25zIG9uIHRoaXMgcG9ydC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJX1BPUlRfUkVBRFksCisKKwkvKioKKwkgKiBUaGUgc3Vic3RhdGUgd2hlcmUgdGhlIHBvcnQgaXMgc3RhcnRlZCBhbmQgcmVhZHkgYnV0IGhhcyBubworCSAqIGFjdGl2ZSBwaHlzLgorCSAqLworCVNDSV9QT1JUX1NVQl9XQUlUSU5HLAorCisJLyoqCisJICogVGhlIHN1YnN0YXRlIHdoZXJlIHRoZSBwb3J0IGlzIHN0YXJ0ZWQgYW5kIHJlYWR5IGFuZCB0aGVyZSBpcworCSAqIGF0IGxlYXN0IG9uZSBwaHkgb3BlcmF0aW9uYWwuCisJICovCisJU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMLAorCisJLyoqCisJICogVGhlIHN1YnN0YXRlIHdoZXJlIHRoZSBwb3J0IGlzIHN0YXJ0ZWQgYW5kIHRoZXJlIHdhcyBhbgorCSAqIGFkZC9yZW1vdmUgcGh5IGV2ZW50LiAgVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgaW4gQXV0b21hdGljCisJICogUG9ydCBDb25maWd1cmF0aW9uIE1vZGUgKEFQQykKKwkgKi8KKwlTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgcG9ydCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBwZXJmb3JtaW5nIGEgaGFyZAorCSAqIHJlc2V0LiAgVGh1cywgdGhlIHVzZXIgaXMgdW5hYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGlzCisJICogcG9ydC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX1BPUlRfUkVTRVRUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHBvcnQgaGFzIGZhaWxlZCBhIHJlc2V0IHJlcXVlc3QuICBUaGlzIHN0YXRlCisJICogaXMgZW50ZXJlZCB3aGVuIGEgcG9ydCByZXNldCByZXF1ZXN0IHRpbWVzIG91dC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVTRVRUSU5HIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX0ZBSUxFRCwKKworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX3BvcnRfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJaWYgKFdBUk5fT05DRShpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDAsCisJCSAgICAgICAiJXM6IHRyaWVkIHRvIGRlY3JlbWVudCBzdGFydGVkX3JlcXVlc3RfY291bnQgcGFzdCAwIT8iLAorCQkJX19mdW5jX18pKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJaXBvcnQtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudC0tOworfQorCisjZGVmaW5lIHNjaV9wb3J0X2FjdGl2ZV9waHkocG9ydCwgcGh5KSBcCisJKCgocG9ydCktPmFjdGl2ZV9waHlfbWFzayAmICgxIDw8IChwaHkpLT5waHlfaW5kZXgpKSAhPSAwKQorCit2b2lkIHNjaV9wb3J0X2NvbnN0cnVjdCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwl1OCBwb3J0X2luZGV4LAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0YXJ0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9zdG9wKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2FkZF9waHkoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3JlbW92ZV9waHkoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcG9ydF9zZXR1cF90cmFuc3BvcnRzKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXUzMiBkZXZpY2VfaWQpOworCit2b2lkIGlzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX2hvc3QgKiwgc3RydWN0IGlzY2lfcG9ydCAqKTsKKwordm9pZCBzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeSgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJYm9vbCBkb19ub3RpZnlfdXNlcik7CisKK2Jvb2wgc2NpX3BvcnRfbGlua19kZXRlY3RlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfbGlua191cChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2xpbmtfZG93bihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKK3N0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2U7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfc3RhcnRfaW8oCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbXBsZXRlX2lvKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2FzX2xpbmtyYXRlIHNjaV9wb3J0X2dldF9tYXhfYWxsb3dlZF9zcGVlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCk7CisKK3ZvaWQgc2NpX3BvcnRfYnJvYWRjYXN0X2NoYW5nZV9yZWNlaXZlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitib29sIHNjaV9wb3J0X2lzX3ZhbGlkX3BoeV9hc3NpZ25tZW50KAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXUzMiBwaHlfaW5kZXgpOworCit2b2lkIHNjaV9wb3J0X2dldF9zYXNfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXNfYWRkcmVzcyk7CisKK3ZvaWQgc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhc19hZGRyZXNzKTsKKworZW51bSBpc2NpX3N0YXR1cyBpc2NpX3BvcnRfZ2V0X3N0YXRlKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCk7CisKK3ZvaWQgaXNjaV9wb3J0X2Zvcm1lZChzdHJ1Y3QgYXNkX3Nhc19waHkgKik7Cit2b2lkIGlzY2lfcG9ydF9kZWZvcm1lZChzdHJ1Y3QgYXNkX3Nhc19waHkgKik7CisKK3ZvaWQgaXNjaV9wb3J0X2luaXQoCisJc3RydWN0IGlzY2lfcG9ydCAqcG9ydCwKKwlzdHJ1Y3QgaXNjaV9ob3N0ICpob3N0LAorCWludCBpbmRleCk7CisKK2ludCBpc2NpX3BvcnRfcGVyZm9ybV9oYXJkX3Jlc2V0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVNDSV9QT1JUX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydF9jb25maWcuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2YjExMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJob3N0LmgiCisKKyNkZWZpbmUgU0NJQ19TRFNfTVBDX1JFQ09ORklHVVJBVElPTl9USU1FT1VUICAgICgxMCkKKyNkZWZpbmUgU0NJQ19TRFNfQVBDX1JFQ09ORklHVVJBVElPTl9USU1FT1VUICAgICgxMCkKKyNkZWZpbmUgU0NJQ19TRFNfQVBDX1dBSVRfTElOS19VUF9OT1RJRklDQVRJT04gICgxMDApCisKK2VudW0gU0NJQ19TRFNfQVBDX0FDVElWSVRZIHsKKwlTQ0lDX1NEU19BUENfU0tJUF9QSFksCisJU0NJQ19TRFNfQVBDX0FERF9QSFksCisJU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSLAorCisJU0NJQ19TRFNfQVBDX0FDVElWSVRZX01BWAorfTsKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhbCBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgcm91dGluZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKioKKyAqCisgKiBAYWRkcmVzc19vbmU6IEEgU0FTIEFkZHJlc3MgdG8gYmUgY29tcGFyZWQuCisgKiBAYWRkcmVzc190d286IEEgU0FTIEFkZHJlc3MgdG8gYmUgY29tcGFyZWQuCisgKgorICogQ29tcGFyZSB0aGUgdHdvIFNBUyBBZGRyZXNzIGFuZCBpZiBTQVMgQWRkcmVzcyBPbmUgaXMgZ3JlYXRlciB0aGFuIFNBUworICogQWRkcmVzcyBUd28gdGhlbiByZXR1cm4gPiAwIGVsc2UgaWYgU0FTIEFkZHJlc3MgT25lIGlzIGxlc3MgdGhhbiBTQVMgQWRkcmVzcworICogVHdvIHJldHVybiA8IDAgT3RoZXJ3aXNlIHRoZXkgYXJlIHRoZSBzYW1lIHJldHVybiAwIEEgc2lnbmVkIHZhbHVlIG9mIHggPiAwCisgKiA+IHkgd2hlcmUgeCBpcyByZXR1cm5lZCBmb3IgQWRkcmVzcyBPbmUgPiBBZGRyZXNzIFR3byB5IGlzIHJldHVybmVkIGZvcgorICogQWRkcmVzcyBPbmUgPCBBZGRyZXNzIFR3byAwIGlzIHJldHVybmVkIG9mciBBZGRyZXNzIE9uZSA9IEFkZHJlc3MgVHdvCisgKi8KK3N0YXRpYyBzMzIgc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBhZGRyZXNzX29uZSwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIGFkZHJlc3NfdHdvKQoreworCWlmIChhZGRyZXNzX29uZS5oaWdoID4gYWRkcmVzc190d28uaGlnaCkgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGFkZHJlc3Nfb25lLmhpZ2ggPCBhZGRyZXNzX3R3by5oaWdoKSB7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKGFkZHJlc3Nfb25lLmxvdyA+IGFkZHJlc3NfdHdvLmxvdykgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGFkZHJlc3Nfb25lLmxvdyA8IGFkZHJlc3NfdHdvLmxvdykgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVGhlIHR3byBTQVMgQWRkcmVzcyBtdXN0IGJlIGlkZW50aWNhbCAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCisgKiBAY29udHJvbGxlcjogVGhlIGNvbnRyb2xsZXIgb2JqZWN0IHVzZWQgZm9yIHRoZSBwb3J0IHNlYXJjaC4KKyAqIEBwaHk6IFRoZSBwaHkgb2JqZWN0IHRvIG1hdGNoLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGZpbmQgYSBtYXRjaGluZyBwb3J0IGZvciB0aGUgcGh5LiAgVGhpcyBtZWFucyB0aGF0IHRoZQorICogcG9ydCBhbmQgcGh5IGJvdGggaGF2ZSB0aGUgc2FtZSBicm9hZGNhc3Qgc2FzIGFkZHJlc3MgYW5kIHNhbWUgcmVjZWl2ZWQgc2FzCisgKiBhZGRyZXNzLiBUaGUgcG9ydCBhZGRyZXNzIG9yIHRoZSBOVUxMIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nCisgKiBwb3J0LiBwb3J0IGFkZHJlc3MgaWYgdGhlIHBvcnQgY2FuIGJlIGZvdW5kIHRvIG1hdGNoIHRoZSBwaHkuCisgKiBOVUxMIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHBvcnQgZm9yIHRoZSBwaHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNjaV9wb3J0ICpzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2ZpbmRfcG9ydCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTggaTsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHBvcnRfc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwb3J0X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X3Nhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzOworCisJLyoKKwkgKiBTaW5jZSB0aGlzIHBoeSBjYW4gYmUgYSBtZW1iZXIgb2YgYSB3aWRlIHBvcnQgY2hlY2sgdG8gc2VlIGlmIG9uZSBvcgorCSAqIG1vcmUgcGh5cyBtYXRjaCB0aGUgc2VudCBhbmQgcmVjZWl2ZWQgU0FTIGFkZHJlc3MgYXMgdGhpcyBwaHkgaW4gd2hpY2gKKwkgKiBjYXNlIGl0IHNob3VsZCBwYXJ0aWNpcGF0ZSBpbiB0aGUgc2FtZSBwb3J0LgorCSAqLworCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKGlwaHksICZwaHlfc2FzX2FkZHJlc3MpOworCXNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwaHksICZwaHlfYXR0YWNoZWRfZGV2aWNlX2FkZHJlc3MpOworCisJZm9yIChpID0gMDsgaSA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gJmlob3N0LT5wb3J0c1tpXTsKKworCQlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZwb3J0X3Nhc19hZGRyZXNzKTsKKwkJc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwb3J0LCAmcG9ydF9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzcyk7CisKKwkJaWYgKHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKHBvcnRfc2FzX2FkZHJlc3MsIHBoeV9zYXNfYWRkcmVzcykgPT0gMCAmJgorCQkgICAgc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUocG9ydF9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzcywgcGh5X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzKSA9PSAwKQorCQkJcmV0dXJuIGlwb3J0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCisgKiBAY29udHJvbGxlcjogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcG9ydCBhZ2VudAorICogQHBvcnRfYWdlbnQ6IFRoaXMgaXMgdGhlIHBvcnQgY29uZmlncnVhdGlvbiBhZ2VudCBmb3IgdGhlIGNvbnRyb2xsZXIuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgdmFsaWRhdGUgdGhlIHBvcnQgY29uZmlndXJhdGlvbiBpcyBjb3JyZWN0IGZvciB0aGUgU0NVCisgKiBoYXJkd2FyZS4gIFRoZSBTQ1UgaGFyZHdhcmUgYWxsb3dzIGZvciBwb3J0IGNvbmZpZ3VyYXRpb25zIGFzIGZvbGxvd3MuIExQMAorICogLT4gKFBFMCksIChQRTAsIFBFMSksIChQRTAsIFBFMSwgUEUyLCBQRTMpIExQMSAtPiAoUEUxKSBMUDIgLT4gKFBFMiksIChQRTIsCisgKiBQRTMpIExQMyAtPiAoUEUzKSBlbnVtIHNjaV9zdGF0dXMgU0NJX1NVQ0NFU1MgdGhlIHBvcnQgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBmb3IKKyAqIHRoaXMgcG9ydCBjb25maWd1cmF0aW9uIGFnZW50LiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT04KKyAqIHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkIGZvciB0aGlzIHBvcnQgY29uZmlndXJhdGlvbiBhZ2VudC4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X3ZhbGlkYXRlX3BvcnRzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KQoreworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgZmlyc3RfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHNlY29uZF9hZGRyZXNzOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhlIG1heCByYW5nZXMgZm9yIGFsbCB0aGUgcGh5cyB0aGUgbWF4IGluZGV4CisJICogaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBwb3J0IHJhbmdlIGluZGV4ICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzBdLm1heF9pbmRleCAhPSAwIHx8CisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzFdLm1heF9pbmRleCAhPSAxIHx8CisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzJdLm1heF9pbmRleCAhPSAyIHx8CisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzNdLm1heF9pbmRleCAhPSAzKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCisJLyoKKwkgKiBUaGlzIGlzIGEgcmVxdWVzdCB0byBjb25maWd1cmUgYSBzaW5nbGUgeDQgcG9ydCBvciBhdCBsZWFzdCBhdHRlbXB0CisJICogdG8gbWFrZSBhbGwgdGhlIHBoeXMgaW50byBhIHNpbmdsZSBwb3J0ICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzBdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzFdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzJdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzNdLm1pbl9pbmRleCA9PSAwKQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBkZWdlbmVyYXRlIGNhc2Ugd2hlcmUgcGh5IDEgYW5kIHBoeSAyIGFyZSBhc3NpZ25lZAorCSAqIHRvIHRoZSBzYW1lIHBvcnQgdGhpcyBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgYnkgdGhlIGhhcmR3YXJlCisJICogdW5sZXNzIHRoZXkgYXJlIHBhcnQgb2YgdGhlIHNhbWUgeDQgcG9ydCBhbmQgdGhpcyBjb25kaXRpb24gd2FzCisJICogYWxyZWFkeSBjaGVja2VkIGFib3ZlLiAqLworCWlmIChwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsyXS5taW5faW5kZXggPT0gMSkgeworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCX0KKworCS8qCisJICogUEUwIGFuZCBQRTMgY2FuIG5ldmVyIGhhdmUgdGhlIHNhbWUgU0FTIEFkZHJlc3MgdW5sZXNzIHRoZXkKKwkgKiBhcmUgcGFydCBvZiB0aGUgc2FtZSB4NCB3aWRlIHBvcnQgYW5kIHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkCisJICogZm9yIHRoaXMgY29uZGl0aW9uLiAqLworCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1swXSwgJmZpcnN0X2FkZHJlc3MpOworCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1szXSwgJnNlY29uZF9hZGRyZXNzKTsKKworCWlmIChzY2lfc2FzX2FkZHJlc3NfY29tcGFyZShmaXJzdF9hZGRyZXNzLCBzZWNvbmRfYWRkcmVzcykgPT0gMCkgeworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCX0KKworCS8qCisJICogUEUwIGFuZCBQRTEgYXJlIGNvbmZpZ3VyZWQgaW50byBhIDJ4MSBwb3J0cyBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBTQVMgQWRkcmVzcyBmb3IgUEUwIGFuZCBQRTIgYXJlIGRpZmZlcmVudCBzaW5jZSB0aGV5IGNhbiBub3QgYmUKKwkgKiBwYXJ0IG9mIHRoZSBzYW1lIHBvcnQuICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzBdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzFdLm1pbl9pbmRleCA9PSAxKSB7CisJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1swXSwgJmZpcnN0X2FkZHJlc3MpOworCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbMl0sICZzZWNvbmRfYWRkcmVzcyk7CisKKwkJaWYgKHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKGZpcnN0X2FkZHJlc3MsIHNlY29uZF9hZGRyZXNzKSA9PSAwKSB7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCQl9CisJfQorCisJLyoKKwkgKiBQRTIgYW5kIFBFMyBhcmUgY29uZmlndXJlZCBpbnRvIGEgMngxIHBvcnRzIG1ha2Ugc3VyZSB0aGF0IHRoZQorCSAqIFNBUyBBZGRyZXNzIGZvciBQRTEgYW5kIFBFMyBhcmUgZGlmZmVyZW50IHNpbmNlIHRoZXkgY2FuIG5vdCBiZQorCSAqIHBhcnQgb2YgdGhlIHNhbWUgcG9ydC4gKi8KKwlpZiAocG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbMl0ubWluX2luZGV4ID09IDIgJiYKKwkgICAgcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbM10ubWluX2luZGV4ID09IDMpIHsKKwkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzWzFdLCAmZmlyc3RfYWRkcmVzcyk7CisJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1szXSwgJnNlY29uZF9hZGRyZXNzKTsKKworCQlpZiAoc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoZmlyc3RfYWRkcmVzcywgc2Vjb25kX2FkZHJlc3MpID09IDApIHsKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJCX0KKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hbnVhbCBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgcm91dGluZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiB2ZXJpZnkgYWxsIG9mIHRoZSBwaHlzIGluIHRoZSBzYW1lIHBvcnQgYXJlIHVzaW5nIHRoZSBzYW1lIFNBUyBhZGRyZXNzICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfbXBjX2FnZW50X3ZhbGlkYXRlX3BoeV9jb25maWd1cmF0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwl1MzIgcGh5X21hc2s7CisJdTMyIGFzc2lnbmVkX3BoeV9tYXNrOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwaHlfYXNzaWduZWRfYWRkcmVzczsKKwl1OCBwb3J0X2luZGV4OworCXU4IHBoeV9pbmRleDsKKworCWFzc2lnbmVkX3BoeV9tYXNrID0gMDsKKwlzYXNfYWRkcmVzcy5oaWdoID0gMDsKKwlzYXNfYWRkcmVzcy5sb3cgPSAwOworCisJZm9yIChwb3J0X2luZGV4ID0gMDsgcG9ydF9pbmRleCA8IFNDSV9NQVhfUE9SVFM7IHBvcnRfaW5kZXgrKykgeworCQlwaHlfbWFzayA9IGlob3N0LT5vZW1fcGFyYW1ldGVycy5wb3J0c1twb3J0X2luZGV4XS5waHlfbWFzazsKKworCQlpZiAoIXBoeV9tYXNrKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGF0IG9uZSBvciBtb3JlIG9mIHRoZSBwaHlzIHdlcmUgbm90IGFscmVhZHkgYXNzaW5nZWQgdG8KKwkJICogYSBkaWZmZXJlbnQgcG9ydC4gKi8KKwkJaWYgKChwaHlfbWFzayAmIH5hc3NpZ25lZF9waHlfbWFzaykgPT0gMCkgeworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwkJfQorCisJCS8qIEZpbmQgdGhlIHN0YXJ0aW5nIHBoeSBpbmRleCBmb3IgdGhpcyByb3VuZCB0aHJvdWdoIHRoZSBsb29wICovCisJCWZvciAocGh5X2luZGV4ID0gMDsgcGh5X2luZGV4IDwgU0NJX01BWF9QSFlTOyBwaHlfaW5kZXgrKykgeworCQkJaWYgKChwaHlfbWFzayAmICgxIDw8IHBoeV9pbmRleCkpID09IDApCisJCQkJY29udGludWU7CisJCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbcGh5X2luZGV4XSwKKwkJCQkJCSAgICAgJnNhc19hZGRyZXNzKTsKKworCQkJLyoKKwkJCSAqIFRoZSBwaHlfaW5kZXggY2FuIGJlIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUKKwkJCSAqIHBvcnQgcmFuZ2Ugc2luY2UgdGhlIGhhcmR3YXJlIHN0YXJ0cyBhbGwgbG9naWNhbCBwb3J0cworCQkJICogdGhlIHNhbWUgYXMgdGhlIFBFIGluZGV4LiAqLworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5taW5faW5kZXggPSBwb3J0X2luZGV4OworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5tYXhfaW5kZXggPSBwaHlfaW5kZXg7CisKKwkJCWlmIChwaHlfaW5kZXggIT0gcG9ydF9pbmRleCkgeworCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogU2VlIGhvdyBtYW55IGFkZGl0aW9uYWwgcGh5cyBhcmUgYmVpbmcgYWRkZWQgdG8gdGhpcyBsb2dpY2FsIHBvcnQuCisJCSAqIE5vdGU6IFdlIGhhdmUgbm90IG1vdmVkIHRoZSBjdXJyZW50IHBoeV9pbmRleCBzbyB3ZSB3aWxsIGFjdHVhbGx5CisJCSAqICAgICAgIGNvbXBhcmUgdGhlIHN0YXJ0dGluZyBwaHkgd2l0aCBpdHNlbGYuCisJCSAqICAgICAgIFRoaXMgaXMgZXhwZWN0ZWQgYW5kIHJlcXVpcmVkIHRvIGFkZCB0aGUgcGh5IHRvIHRoZSBwb3J0LiAqLworCQl3aGlsZSAocGh5X2luZGV4IDwgU0NJX01BWF9QSFlTKSB7CisJCQlpZiAoKHBoeV9tYXNrICYgKDEgPDwgcGh5X2luZGV4KSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1twaHlfaW5kZXhdLAorCQkJCQkJICAgICAmcGh5X2Fzc2lnbmVkX2FkZHJlc3MpOworCisJCQlpZiAoc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoc2FzX2FkZHJlc3MsIHBoeV9hc3NpZ25lZF9hZGRyZXNzKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgcGh5IG1hc2sgc3BlY2lmaWVkIHRoYXQgdGhpcyBwaHkgaXMgcGFydCBvZiB0aGUgc2FtZSBwb3J0CisJCQkJICogYXMgdGhlIHN0YXJ0aW5nIHBoeSBhbmQgaXQgaXMgbm90IHNvIGZhaWwgdGhpcyBjb25maWd1cmF0aW9uICovCisJCQkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwkJCX0KKworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5taW5faW5kZXggPSBwb3J0X2luZGV4OworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5tYXhfaW5kZXggPSBwaHlfaW5kZXg7CisKKwkJCXNjaV9wb3J0X2FkZF9waHkoJmlob3N0LT5wb3J0c1twb3J0X2luZGV4XSwKKwkJCQkJICAgICAgJmlob3N0LT5waHlzW3BoeV9pbmRleF0pOworCisJCQlhc3NpZ25lZF9waHlfbWFzayB8PSAoMSA8PCBwaHlfaW5kZXgpOworCQl9CisKKwkJcGh5X2luZGV4Kys7CisJfQorCisJcmV0dXJuIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfdmFsaWRhdGVfcG9ydHMoaWhvc3QsIHBvcnRfYWdlbnQpOworfQorCitzdGF0aWMgdm9pZCBtcGNfYWdlbnRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdTggaW5kZXg7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGNvbmZpZ3VyZV9waHlfbWFzazsKKworCXBvcnRfYWdlbnQgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKnBvcnRfYWdlbnQpLCB0aW1lcik7CisJaWhvc3QgPSBjb250YWluZXJfb2YocG9ydF9hZ2VudCwgdHlwZW9mKCppaG9zdCksIHBvcnRfYWdlbnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZyA9IGZhbHNlOworCisJLyogRmluZCB0aGUgbWFzayBvZiBwaHlzIHRoYXQgYXJlIHJlcG9ydGVkIHJlYWQgYnV0IGFzIHlldCB1bmNvbmZpZ3VyZWQgaW50byBhIHBvcnQgKi8KKwljb25maWd1cmVfcGh5X21hc2sgPSB+cG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayAmIHBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9ICZpaG9zdC0+cGh5c1tpbmRleF07CisKKwkJaWYgKGNvbmZpZ3VyZV9waHlfbWFzayAmICgxIDw8IGluZGV4KSkgeworCQkJcG9ydF9hZ2VudC0+bGlua191cF9oYW5kbGVyKGlob3N0LCBwb3J0X2FnZW50LAorCQkJCQkJICAgIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSksCisJCQkJCQkgICAgaXBoeSk7CisJCX0KKwl9CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzY2lfbXBjX2FnZW50X2xpbmtfdXAoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50LAorCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCS8qIElmIHRoZSBwb3J0IGlzIE5VTEwgdGhlbiB0aGUgcGh5IHdhcyBub3QgYXNzaWduZWQgdG8gYSBwb3J0LgorCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGh5IHdhcyBub3QgZ2l2ZW4gdGhlIHNhbWUgU0FTIEFkZHJlc3MgYXMKKwkgKiB0aGUgb3RoZXIgUEhZcyBpbiB0aGUgcG9ydC4KKwkgKi8KKwlpZiAoIWlwb3J0KQorCQlyZXR1cm47CisKKwlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayB8PSAoMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCXNjaV9wb3J0X2xpbmtfdXAoaXBvcnQsIGlwaHkpOworCWlmICgoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAmICgxIDw8IGlwaHktPnBoeV9pbmRleCkpKQorCQlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrIHw9ICgxIDw8IGlwaHktPnBoeV9pbmRleCk7Cit9CisKKy8qKgorICoKKyAqIEBjb250cm9sbGVyOiBUaGlzIGlzIHRoZSBjb250cm9sbGVyIG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBsaW5rIGRvd24KKyAqICAgIG5vdGlmaWNhdGlvbi4KKyAqIEBwb3J0OiBUaGlzIGlzIHRoZSBwb3J0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBoeS4gIElmIHRoZSBpcyBubworICogICAgYXNzb2NpYXRlZCBwb3J0IHRoaXMgaXMgYW4gTlVMTC4gIFRoZSBwb3J0IGlzIGFuIGludmFsaWQKKyAqICAgIGhhbmRsZSBvbmx5IGlmIHRoZSBwaHkgd2FzIG5ldmVyIHBvcnQgb2YgdGhpcyBwb3J0LiAgVGhpcyBoYXBwZW5zIHdoZW4KKyAqICAgIHRoZSBwaHkgaXMgbm90IGJyb2FkY2FzdGluZyB0aGUgc2FtZSBTQVMgYWRkcmVzcyBhcyB0aGUgb3RoZXIgcGh5cyBpbiB0aGUKKyAqICAgIGFzc2lnbmVkIHBvcnQuCisgKiBAcGh5OiBUaGlzIGlzIHRoZSBwaHkgb2JqZWN0IHdoaWNoIGhhcyBnb25lIGxpbmsgZG93bi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIG1hbnVhbCBwb3J0IGNvbmZpZ3VyYXRpb24gbGluayBkb3duIG5vdGlmaWNhdGlvbnMuCisgKiBTaW5jZSBhbGwgcG9ydHMgYW5kIHBoeXMgYXJlIGFzc29jaWF0ZWQgYXQgaW5pdGlhbGl6YXRpb24gdGltZSB3ZSBqdXN0IHR1cm4KKyAqIGFyb3VuZCBhbmQgbm90aWZpeSB0aGUgcG9ydCBvYmplY3Qgb2YgdGhlIGxpbmsgZG93biBldmVudC4gIElmIHRoaXMgUEhZIGlzCisgKiBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcG9ydCB0aGVyZSBpcyBubyBhY3Rpb24gdGFrZW4uIElzIGl0IHBvc3NpYmxlIHRvIGdldCBhCisgKiBsaW5rIGRvd24gbm90aWZpY2F0aW9uIGZyb20gYSBwaHkgdGhhdCBoYXMgbm8gYXNzb2NvYXRlZCBwb3J0PworICovCitzdGF0aWMgdm9pZCBzY2lfbXBjX2FnZW50X2xpbmtfZG93bigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJaWYgKGlwb3J0ICE9IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgd2UgY2FuIGZvcm0gYSBuZXcgcG9ydCBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIHBoeXMKKwkJICogdGhlbiB3ZSB3YW50IHRvIHN0YXJ0IHRoZSB0aW1lciB0byBhbGxvdyB0aGUgU0NJIFVzZXIgdG8KKwkJICogY2xlYW51cCBvbGQgZGV2aWNlcyBhbmQgcmVkaXNjb3ZlciB0aGUgcG9ydCBiZWZvcmUKKwkJICogcmVidWlsZGluZyB0aGUgcG9ydCB3aXRoIHRoZSBwaHlzIHRoYXQgcmVtYWluIGluIHRoZSByZWFkeQorCQkgKiBzdGF0ZS4KKwkJICovCisJCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCQlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgbW9yZSBwaHlzIHdhaXRpbmcgdG8gYmUKKwkJICogY29uZmlndXJlZCBpbnRvIGEgcG9ydC4gSWYgdGhlcmUgYXJlIGFsbG93IHRoZSBTQ0kgVXNlcgorCQkgKiB0byB0ZWFyIGRvd24gdGhpcyBwb3J0LCBpZiBuZWNlc3NhcnksIGFuZCB0aGVuIHJlY29uc3RydWN0CisJCSAqIHRoZSBwb3J0IGFmdGVyIHRoZSB0aW1lb3V0LgorCQkgKi8KKwkJaWYgKChwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrID09IDB4MDAwMCkgJiYKKwkJICAgIChwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayAhPSAweDAwMDApICYmCisJCSAgICAhcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZykgeworCQkJcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZyA9IHRydWU7CisKKwkJCXNjaV9tb2RfdGltZXIoJnBvcnRfYWdlbnQtPnRpbWVyLAorCQkJCSAgICAgIFNDSUNfU0RTX01QQ19SRUNPTkZJR1VSQVRJT05fVElNRU9VVCk7CisJCX0KKworCQlzY2lfcG9ydF9saW5rX2Rvd24oaXBvcnQsIGlwaHkpOworCX0KK30KKworLyogdmVyaWZ5IHBoeXMgYXJlIGFzc2lnbmVkIGEgdmFsaWQgU0FTIGFkZHJlc3MgZm9yIGF1dG9tYXRpYyBwb3J0CisgKiBjb25maWd1cmF0aW9uIG1vZGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9hcGNfYWdlbnRfdmFsaWRhdGVfcGh5X2NvbmZpZ3VyYXRpb24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KQoreworCXU4IHBoeV9pbmRleDsKKwl1OCBwb3J0X2luZGV4OworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwaHlfYXNzaWduZWRfYWRkcmVzczsKKworCXBoeV9pbmRleCA9IDA7CisKKwl3aGlsZSAocGh5X2luZGV4IDwgU0NJX01BWF9QSFlTKSB7CisJCXBvcnRfaW5kZXggPSBwaHlfaW5kZXg7CisKKwkJLyogR2V0IHRoZSBhc3NpZ25lZCBTQVMgQWRkcmVzcyBmb3IgdGhlIGZpcnN0IFBIWSBvbiB0aGUgY29udHJvbGxlci4gKi8KKwkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzW3BoeV9pbmRleF0sCisJCQkJCSAgICAmc2FzX2FkZHJlc3MpOworCisJCXdoaWxlICgrK3BoeV9pbmRleCA8IFNDSV9NQVhfUEhZUykgeworCQkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzW3BoeV9pbmRleF0sCisJCQkJCQkgICAgICZwaHlfYXNzaWduZWRfYWRkcmVzcyk7CisKKwkJCS8qIFZlcmlmeSBlYWNoIG9mIHRoZSBTQVMgYWRkcmVzcyBhcmUgYWxsIHRoZSBzYW1lIGZvciBldmVyeSBQSFkgKi8KKwkJCWlmIChzY2lfc2FzX2FkZHJlc3NfY29tcGFyZShzYXNfYWRkcmVzcywgcGh5X2Fzc2lnbmVkX2FkZHJlc3MpID09IDApIHsKKwkJCQlwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtwaHlfaW5kZXhdLm1pbl9pbmRleCA9IHBvcnRfaW5kZXg7CisJCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5tYXhfaW5kZXggPSBwaHlfaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWluX2luZGV4ID0gcGh5X2luZGV4OworCQkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWF4X2luZGV4ID0gcGh5X2luZGV4OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfdmFsaWRhdGVfcG9ydHMoaWhvc3QsIHBvcnRfYWdlbnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfYXBjX2FnZW50X2NvbmZpZ3VyZV9wb3J0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50LAorCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCQkgICAgICAgYm9vbCBzdGFydF90aW1lcikKK3sKKwl1OCBwb3J0X2luZGV4OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQ7CisJZW51bSBTQ0lDX1NEU19BUENfQUNUSVZJVFkgYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX1NLSVBfUEhZOworCisJaXBvcnQgPSBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2ZpbmRfcG9ydChpaG9zdCwgaXBoeSk7CisKKwlpZiAoaXBvcnQpIHsKKwkJaWYgKHNjaV9wb3J0X2lzX3ZhbGlkX3BoeV9hc3NpZ25tZW50KGlwb3J0LCBpcGh5LT5waHlfaW5kZXgpKQorCQkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX0FERF9QSFk7CisJCWVsc2UKKwkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TS0lQX1BIWTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyBtYXRjaGluZyBQb3J0IGZvciB0aGlzIFBIWSBzbyBsZXRzIHNlYXJjaCB0aHJvdWdoIHRoZQorCQkgKiBQb3J0cyBhbmQgc2VlIGlmIHdlIGNhbiBhZGQgdGhlIFBIWSB0byBpdHMgb3duIHBvcnQgb3IgbWF5YmUgc3RhcnQKKwkJICogdGhlIHRpbWVyIGFuZCB3YWl0IHRvIHNlZSBpZiBhIHdpZGVyIHBvcnQgY2FuIGJlIG1hZGUuCisJCSAqCisJCSAqIE5vdGUgdGhlIGJyZWFrIHdoZW4gd2UgcmVhY2ggdGhlIGNvbmRpdGlvbiBvZiB0aGUgcG9ydCBpZCA9PSBwaHkgaWQgKi8KKwkJZm9yIChwb3J0X2luZGV4ID0gcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbaXBoeS0+cGh5X2luZGV4XS5taW5faW5kZXg7CisJCSAgICAgcG9ydF9pbmRleCA8PSBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtpcGh5LT5waHlfaW5kZXhdLm1heF9pbmRleDsKKwkJICAgICBwb3J0X2luZGV4KyspIHsKKworCQkJaXBvcnQgPSAmaWhvc3QtPnBvcnRzW3BvcnRfaW5kZXhdOworCisJCQkvKiBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoaXMgUEhZIGNhbiBiZSBhZGRlZCB0byB0aGlzIFBvcnQuICovCisJCQlpZiAoc2NpX3BvcnRfaXNfdmFsaWRfcGh5X2Fzc2lnbm1lbnQoaXBvcnQsIGlwaHktPnBoeV9pbmRleCkpIHsKKwkJCQkvKgorCQkJCSAqIFBvcnQgY29udGFpbnMgYSBQSFkgd2l0aCBhIGdyZWF0ZXIgUEhZIElEIHRoYW4gdGhlIGN1cnJlbnQKKwkJCQkgKiBQSFkgdGhhdCBoYXMgZ29uZSBsaW5rIHVwLiAgVGhpcyBwaHkgY2FuIG5vdCBiZSBwYXJ0IG9mIGFueQorCQkJCSAqIHBvcnQgc28gc2tpcCBpdCBhbmQgbW92ZSBvbi4gKi8KKwkJCQlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA+ICgxIDw8IGlwaHktPnBoeV9pbmRleCkpIHsKKwkJCQkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX1NLSVBfUEhZOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIG91ciBQb3J0IGxpc3QgYW5kIGhhdmUgbm90IGZvdW5kCisJCQkJICogYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkIG5vdCBlaXRoZXIgYWRkIHRoZSBQSFkgdG8gdGhlIHBvcnQKKwkJCQkgKiBvciB3YWl0IGZvciBtb3JlIHBoeXMgdG8gYmVjb21lIGFjdGl2ZS4gKi8KKwkJCQlpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gaXBoeS0+cGh5X2luZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBQb3J0IGVpdGhlciBoYXMgbm8gYWN0aXZlIFBIWXMuCisJCQkJCSAqIENvbnNpZGVyIHRoYXQgaWYgdGhlIHBvcnQgaGFkIGFueSBhY3RpdmUgUEhZcyB3ZSB3b3VsZCBoYXZlCisJCQkJCSAqIG9yIGFjdGl2ZSBQSFlzIHdpdGgKKwkJCQkJICogYSBsb3dlciBQSFkgSWQgdGhhbiB0aGlzIFBIWS4gKi8KKwkJCQkJaWYgKGFwY19hY3Rpdml0eSAhPSBTQ0lDX1NEU19BUENfU1RBUlRfVElNRVIpIHsKKwkJCQkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19BRERfUEhZOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBUaGUgY3VycmVudCBQb3J0IGhhcyBubyBhY3RpdmUgUEhZcyBhbmQgdGhpcyBQSFkgY291bGQgYmUgcGFydAorCQkJCSAqIG9mIHRoaXMgUG9ydC4gIFNpbmNlIHdlIGRvbnQga25vdyBhcyB5ZXQgc2V0dXAgdG8gc3RhcnQgdGhlCisJCQkJICogdGltZXIgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIGJldHRlciBjb25maWd1cmF0aW9uLiAqLworCQkJCWlmIChpcG9ydC0+YWN0aXZlX3BoeV9tYXNrID09IDApIHsKKwkJCQkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgUG9ydCBoYXMgYW4gYWN0aXZlIHBoeSBhbmQgdGhlIGN1cnJlbnQgUGh5IGNhbiBub3QKKwkJCQkgKiBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHBvcnQgc28gc2tpcCB0aGUgUEhZIGFuZCBzZWUgaWYKKwkJCQkgKiB0aGVyZSBpcyBhIGJldHRlciBjb25maWd1cmF0aW9uLiAqLworCQkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TS0lQX1BIWTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzdGFydCB0aW1lciBvcGVyYXRpb25zIHNob3VsZCBpbnN0ZWFkIG1hcCB0byBhbgorCSAqIGFkZCBwaHkgb3BlcmF0aW9uLiAgVGhpcyBpcyBjYXVzZWQgYmVjYXVzZSB3ZSBoYXZlIGJlZW4gd2FpdGluZyB0bworCSAqIGFkZCBhIHBoeSB0byBhIHBvcnQgYnV0IGNvdWxkIG5vdCBiZWN1YXNlIHRoZSBhdXRvbWF0aWMgcG9ydAorCSAqIGNvbmZpZ3VyYXRpb24gZW5naW5lIGhhZCBhIGNob2ljZSBvZiBwb3NzaWJsZSBwb3J0cyBmb3IgdGhlIHBoeS4KKwkgKiBTaW5jZSB3ZSBoYXZlIGdvbmUgdGhyb3VnaCBhIHRpbWVvdXQgd2UgYXJlIGdvaW5nIHRvIHJlc3RyaWN0IHRoZQorCSAqIGNob2ljZSB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgcG9ydC4gKi8KKwlpZiAoCisJCShzdGFydF90aW1lciA9PSBmYWxzZSkKKwkJJiYgKGFwY19hY3Rpdml0eSA9PSBTQ0lDX1NEU19BUENfU1RBUlRfVElNRVIpCisJCSkgeworCQlhcGNfYWN0aXZpdHkgPSBTQ0lDX1NEU19BUENfQUREX1BIWTsKKwl9CisKKwlzd2l0Y2ggKGFwY19hY3Rpdml0eSkgeworCWNhc2UgU0NJQ19TRFNfQVBDX0FERF9QSFk6CisJCXN0YXR1cyA9IHNjaV9wb3J0X2FkZF9waHkoaXBvcnQsIGlwaHkpOworCisJCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJCXBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgfD0gKDEgPDwgaXBoeS0+cGh5X2luZGV4KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSOgorCQkvKgorCQkgKiBUaGlzIGNhbiBvY2N1ciBmb3IgZWl0aGVyIGEgbGluayBkb3duIGV2ZW50LCBvciBhIGxpbmsKKwkJICogdXAgZXZlbnQgd2hlcmUgd2UgY2Fubm90IHlldCB0ZWxsIHRoZSBwb3J0IHRvIHdoaWNoIGEKKwkJICogcGh5IGJlbG9uZ3MuCisJCSAqLworCQlpZiAocG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZykKKwkJCXNjaV9kZWxfdGltZXIoJnBvcnRfYWdlbnQtPnRpbWVyKTsKKworCQlwb3J0X2FnZW50LT50aW1lcl9wZW5kaW5nID0gdHJ1ZTsKKwkJc2NpX21vZF90aW1lcigmcG9ydF9hZ2VudC0+dGltZXIsCisJCQkgICAgICBTQ0lDX1NEU19BUENfV0FJVF9MSU5LX1VQX05PVElGSUNBVElPTik7CisJCWJyZWFrOworCisJY2FzZSBTQ0lDX1NEU19BUENfU0tJUF9QSFk6CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyB0aGUgUEhZIGNhbiBub3QgYmUgbWFkZSBwYXJ0IG9mIGEgcG9ydCBhdCB0aGlzIHRpbWUuICovCisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBzY2lfYXBjX2FnZW50X2xpbmtfdXAgLSBoYW5kbGUgYXBjIGxpbmsgdXAgZXZlbnRzCisgKiBAc2NpYzogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgbGluayB1cAorICogICAgbm90aWZpY2F0aW9uLgorICogQHNjaV9wb3J0OiBUaGlzIGlzIHRoZSBwb3J0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBoeS4gIElmIHRoZSBpcyBubworICogICAgYXNzb2NpYXRlZCBwb3J0IHRoaXMgaXMgYW4gTlVMTC4KKyAqIEBzY2lfcGh5OiBUaGlzIGlzIHRoZSBwaHkgb2JqZWN0IHdoaWNoIGhhcyBnb25lIGxpbmsgdXAuCisgKgorICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgYXV0b21hdGljIHBvcnQgY29uZmlndXJhdGlvbiBmb3IgbGluayB1cAorICogbm90aWZpY2F0aW9ucy4gSXMgaXQgcG9zc2libGUgdG8gZ2V0IGEgbGluayBkb3duIG5vdGlmaWNhdGlvbiBmcm9tIGEgcGh5CisgKiB0aGF0IGhhcyBubyBhc3NvY29hdGVkIHBvcnQ/CisgKi8KK3N0YXRpYyB2b2lkIHNjaV9hcGNfYWdlbnRfbGlua191cChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICAgc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQsCisJCQkJICAgICAgIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTggcGh5X2luZGV4ICA9IGlwaHktPnBoeV9pbmRleDsKKworCWlmICghaXBvcnQpIHsKKwkJLyogdGhlIHBoeSBpcyBub3QgdGhlIHBhcnQgb2YgdGhpcyBwb3J0ICovCisJCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrIHw9IDEgPDwgcGh5X2luZGV4OworCQlzY2lfYXBjX2FnZW50X2NvbmZpZ3VyZV9wb3J0cyhpaG9zdCwgcG9ydF9hZ2VudCwgaXBoeSwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJLyogdGhlIHBoeSBpcyBhbHJlYWR5IHRoZSBwYXJ0IG9mIHRoZSBwb3J0ICovCisJCXUzMiBwb3J0X3N0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwkJLyogaWYgdGhlIFBPUlQnUyBzdGF0ZSBpcyByZXNldHRpbmcgdGhlbiB0aGUgbGluayB1cCBpcyBmcm9tCisJCSAqIHBvcnQgaGFyZCByZXNldCBpbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdGVsbCB0aGUgcG9ydAorCQkgKiB0aGF0IGxpbmsgdXAgaXMgcmVjaWV2ZWQKKwkJICovCisJCUJVR19PTihwb3J0X3N0YXRlICE9IFNDSV9QT1JUX1JFU0VUVElORyk7CisJCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrIHw9IDEgPDwgcGh5X2luZGV4OworCQlzY2lfcG9ydF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKKwl9Cit9CisKKy8qKgorICoKKyAqIEBjb250cm9sbGVyOiBUaGlzIGlzIHRoZSBjb250cm9sbGVyIG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBsaW5rIGRvd24KKyAqICAgIG5vdGlmaWNhdGlvbi4KKyAqIEBpcG9ydDogVGhpcyBpcyB0aGUgcG9ydCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaHkuICBJZiB0aGUgaXMgbm8KKyAqICAgIGFzc29jaWF0ZWQgcG9ydCB0aGlzIGlzIGFuIE5VTEwuCisgKiBAaXBoeTogVGhpcyBpcyB0aGUgcGh5IG9iamVjdCB3aGljaCBoYXMgZ29uZSBsaW5rIGRvd24uCisgKgorICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgYXV0b21hdGljIHBvcnQgY29uZmlndXJhdGlvbiBsaW5rIGRvd24KKyAqIG5vdGlmaWNhdGlvbnMuIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwb3J0IHRoZXJlIGlzIG5vIGFjdGlvbiB0YWtlbi4gSXMgaXQKKyAqIHBvc3NpYmxlIHRvIGdldCBhIGxpbmsgZG93biBub3RpZmljYXRpb24gZnJvbSBhIHBoeSB0aGF0IGhhcyBubyBhc3NvY29hdGVkCisgKiBwb3J0PworICovCitzdGF0aWMgdm9pZCBzY2lfYXBjX2FnZW50X2xpbmtfZG93bigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJcG9ydF9hZ2VudC0+cGh5X3JlYWR5X21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisKKwlpZiAoIWlwb3J0KQorCQlyZXR1cm47CisJaWYgKHBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJiAoMSA8PCBpcGh5LT5waHlfaW5kZXgpKSB7CisJCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwkJc3RhdHVzID0gc2NpX3BvcnRfcmVtb3ZlX3BoeShpcG9ydCwgaXBoeSk7CisKKwkJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykKKwkJCXBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisJfQorfQorCisvKiBjb25maWd1cmUgdGhlIHBoeXMgaW50byBwb3J0cyB3aGVuIHRoZSB0aW1lciBmaXJlcyAqLworc3RhdGljIHZvaWQgYXBjX2FnZW50X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgY29uZmlndXJlX3BoeV9tYXNrOworCisJcG9ydF9hZ2VudCA9IGNvbnRhaW5lcl9vZih0bXIsIHR5cGVvZigqcG9ydF9hZ2VudCksIHRpbWVyKTsKKwlpaG9zdCA9IGNvbnRhaW5lcl9vZihwb3J0X2FnZW50LCB0eXBlb2YoKmlob3N0KSwgcG9ydF9hZ2VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRtci0+Y2FuY2VsKQorCQlnb3RvIGRvbmU7CisKKwlwb3J0X2FnZW50LT50aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwljb25maWd1cmVfcGh5X21hc2sgPSB+cG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayAmIHBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrOworCisJaWYgKCFjb25maWd1cmVfcGh5X21hc2spCisJCXJldHVybjsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlpZiAoKGNvbmZpZ3VyZV9waHlfbWFzayAmICgxIDw8IGluZGV4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXNjaV9hcGNfYWdlbnRfY29uZmlndXJlX3BvcnRzKGlob3N0LCBwb3J0X2FnZW50LAorCQkJCQkJICAgJmlob3N0LT5waHlzW2luZGV4XSwgZmFsc2UpOworCX0KKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFB1YmxpYyBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgcm91dGluZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKioKKyAqCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBjb25zdHJ1Y3QgdGhlIHBvcnQgY29uZmlndXJhdGlvbiBhZ2VudCBmb3Igb3BlcmF0aW9uLiBUaGlzCisgKiBjYWxsIGlzIHVuaXZlcnNhbCBmb3IgYm90aCBtYW51YWwgcG9ydCBjb25maWd1cmF0aW9uIGFuZCBhdXRvbWF0aWMgcG9ydAorICogY29uZmlndXJhdGlvbiBtb2Rlcy4KKyAqLwordm9pZCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2NvbnN0cnVjdCgKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwl1MzIgaW5kZXg7CisKKwlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrID0gMHgwMDsKKwlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayA9IDB4MDA7CisKKwlwb3J0X2FnZW50LT5saW5rX3VwX2hhbmRsZXIgPSBOVUxMOworCXBvcnRfYWdlbnQtPmxpbmtfZG93bl9oYW5kbGVyID0gTlVMTDsKKworCXBvcnRfYWdlbnQtPnRpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUE9SVFM7IGluZGV4KyspIHsKKwkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbaW5kZXhdLm1pbl9pbmRleCA9IDA7CisJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW2luZGV4XS5tYXhfaW5kZXggPSAwOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWVudW0gc2NpX3BvcnRfY29uZmlndXJhdGlvbl9tb2RlIG1vZGU7CisKKwltb2RlID0gaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubW9kZV90eXBlOworCisJaWYgKG1vZGUgPT0gU0NJQ19QT1JUX01BTlVBTF9DT05GSUdVUkFUSU9OX01PREUpIHsKKwkJc3RhdHVzID0gc2NpX21wY19hZ2VudF92YWxpZGF0ZV9waHlfY29uZmlndXJhdGlvbigKKwkJCQlpaG9zdCwgcG9ydF9hZ2VudCk7CisKKwkJcG9ydF9hZ2VudC0+bGlua191cF9oYW5kbGVyID0gc2NpX21wY19hZ2VudF9saW5rX3VwOworCQlwb3J0X2FnZW50LT5saW5rX2Rvd25faGFuZGxlciA9IHNjaV9tcGNfYWdlbnRfbGlua19kb3duOworCisJCXNjaV9pbml0X3RpbWVyKCZwb3J0X2FnZW50LT50aW1lciwgbXBjX2FnZW50X3RpbWVvdXQpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHNjaV9hcGNfYWdlbnRfdmFsaWRhdGVfcGh5X2NvbmZpZ3VyYXRpb24oCisJCQkJaWhvc3QsIHBvcnRfYWdlbnQpOworCisJCXBvcnRfYWdlbnQtPmxpbmtfdXBfaGFuZGxlciA9IHNjaV9hcGNfYWdlbnRfbGlua191cDsKKwkJcG9ydF9hZ2VudC0+bGlua19kb3duX2hhbmRsZXIgPSBzY2lfYXBjX2FnZW50X2xpbmtfZG93bjsKKworCQlzY2lfaW5pdF90aW1lcigmcG9ydF9hZ2VudC0+dGltZXIsIGFwY19hZ2VudF90aW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjQzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wcm9iZV9yb21zLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKi8KKworLyogcHJvYmVfcm9tcyAtIHNjYW4gZm9yIG9lbSBwYXJhbWV0ZXJzICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxhc20vcHJvYmVfcm9tcy5oPgorCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJwcm9iZV9yb21zLmgiCisKK3N0YXRpYyBlZmlfY2hhcjE2X3QgaXNjaV9lZml2YXJfbmFtZVtdID0geworCSdSJywgJ3MnLCAndCcsICdTJywgJ2MnLCAndScsICdPJworfTsKKworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X29wcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXZvaWQgX19pb21lbSAqb3Byb20gPSBwY2lfbWFwX2Jpb3Nyb20ocGRldik7CisJc3RydWN0IGlzY2lfb3JvbSAqcm9tID0gTlVMTDsKKwlzaXplX3QgbGVuLCBpOworCWludCBqOworCWNoYXIgb2VtX3NpZ1s0XTsKKwlzdHJ1Y3QgaXNjaV9vZW1faGRyIG9lbV9oZHI7CisJdTggKnRtcCwgc3VtOworCisJaWYgKCFvcHJvbSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBwY2lfYmlvc3JvbV9zaXplKHBkZXYpOworCXJvbSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJvbSksIEdGUF9LRVJORUwpOworCWlmICghcm9tKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9yb21cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIHJvbTsgaSArPSBJU0NJX09FTV9TSUdfU0laRSkgeworCQltZW1jcHlfZnJvbWlvKG9lbV9zaWcsIG9wcm9tICsgaSwgSVNDSV9PRU1fU0lHX1NJWkUpOworCisJCS8qIHdlIHRoaW5rIHdlIGZvdW5kIHRoZSBPRU0gdGFibGUgKi8KKwkJaWYgKG1lbWNtcChvZW1fc2lnLCBJU0NJX09FTV9TSUcsIElTQ0lfT0VNX1NJR19TSVpFKSA9PSAwKSB7CisJCQlzaXplX3QgY29weV9sZW47CisKKwkJCW1lbWNweV9mcm9taW8oJm9lbV9oZHIsIG9wcm9tICsgaSwgc2l6ZW9mKG9lbV9oZHIpKTsKKworCQkJY29weV9sZW4gPSBtaW4ob2VtX2hkci5sZW4gLSBzaXplb2Yob2VtX2hkciksCisJCQkJICAgICAgIHNpemVvZigqcm9tKSk7CisKKwkJCW1lbWNweV9mcm9taW8ocm9tLAorCQkJCSAgICAgIG9wcm9tICsgaSArIHNpemVvZihvZW1faGRyKSwKKwkJCQkgICAgICBjb3B5X2xlbik7CisKKwkJCS8qIGNhbGN1bGF0ZSBjaGVja3N1bSAqLworCQkJdG1wID0gKHU4ICopJm9lbV9oZHI7CisJCQlmb3IgKGogPSAwLCBzdW0gPSAwOyBqIDwgc2l6ZW9mKG9lbV9oZHIpOyBqKyssIHRtcCsrKQorCQkJCXN1bSArPSAqdG1wOworCisJCQl0bXAgPSAodTggKilyb207CisJCQlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKCpyb20pOyBqKyssIHRtcCsrKQorCQkJCXN1bSArPSAqdG1wOworCisJCQlpZiAoc3VtICE9IDApIHsKKwkJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCQkgIk9FTSB0YWJsZSBjaGVja3N1bSBmYWlsZWRcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBrZWVwIGdvaW5nIGlmIHRoYXQncyBub3QgdGhlIG9lbSBwYXJhbSB0YWJsZSAqLworCQkJaWYgKG1lbWNtcChyb20tPmhkci5zaWduYXR1cmUsCisJCQkJICAgSVNDSV9ST01fU0lHLAorCQkJCSAgIElTQ0lfUk9NX1NJR19TSVpFKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiT0VNIHBhcmFtZXRlciB0YWJsZSBmb3VuZCBpbiBPUk9NXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gbGVuKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9wcm9tIHBhcnNlIGVycm9yXG4iKTsKKwkJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCByb20pOworCQlyb20gPSBOVUxMOworCX0KKwlwY2lfdW5tYXBfYmlvc3JvbShvcHJvbSk7CisKKwlyZXR1cm4gcm9tOworfQorCitlbnVtIHNjaV9zdGF0dXMgaXNjaV9wYXJzZV9vZW1fcGFyYW1ldGVycyhzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSwKKwkJCQkJICBzdHJ1Y3QgaXNjaV9vcm9tICpvcm9tLCBpbnQgc2N1X2luZGV4KQoreworCS8qIGNoZWNrIGZvciB2YWxpZCBpbnB1dHMgKi8KKwlpZiAoc2N1X2luZGV4IDwgMCB8fCBzY3VfaW5kZXggPj0gU0NJX01BWF9DT05UUk9MTEVSUyB8fAorCSAgICBzY3VfaW5kZXggPiBvcm9tLT5oZHIubnVtX2VsZW1lbnRzIHx8ICFvZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJKm9lbSA9IG9yb20tPmN0cmxbc2N1X2luZGV4XTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCXN0cnVjdCBpc2NpX29yb20gKm9yb20gPSBOVUxMLCAqZGF0YTsKKwlpbnQgaSwgajsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgSVNDSV9GV19OQU1FLCAmcGRldi0+ZGV2KSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmdy0+c2l6ZSA8IHNpemVvZigqb3JvbSkpCisJCWdvdG8gb3V0OworCisJZGF0YSA9IChzdHJ1Y3QgaXNjaV9vcm9tICopZnctPmRhdGE7CisKKwlpZiAoc3RybmNtcChJU0NJX1JPTV9TSUcsIGRhdGEtPmhkci5zaWduYXR1cmUsCisJCSAgICBzdHJsZW4oSVNDSV9ST01fU0lHKSkgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlvcm9tID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9yb20pCisJCWdvdG8gb3V0OworCisJbWVtY3B5KG9yb20sIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwlpZiAoaXNfYzAocGRldikpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBkZXByZWNhdGVkOiBvdmVycmlkZSBkZWZhdWx0IGFtcF9jb250cm9sIGZvciBwcmUtcHJlcHJvZHVjdGlvbgorCSAqIHNpbGljb24gcmV2aXNpb25zCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3JvbS0+Y3RybCk7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUob3JvbS0+Y3RybFtpXS5waHlzKTsgaisrKSB7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMCA9IDB4ZTdjMDM7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMSA9IDB4ZTdjMDM7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMiA9IDB4ZTdjMDM7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMyA9IDB4ZTdjMDM7CisJCX0KKyBvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gb3JvbTsKK30KKworc3RhdGljIHN0cnVjdCBlZmkgKmdldF9lZmkodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfRUZJCisJcmV0dXJuICZlZmk7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfZ2V0X2VmaV92YXIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwlzdHJ1Y3QgaXNjaV9vcm9tICpyb207CisJc3RydWN0IGlzY2lfb2VtX2hkciAqb2VtX2hkcjsKKwl1OCAqdG1wLCBzdW07CisJaW50IGo7CisJdW5zaWduZWQgbG9uZyBkYXRhX2xlbjsKKwl1OCAqZWZpX2RhdGE7CisJdTMyIGVmaV9hdHRyaWIgPSAwOworCisJZGF0YV9sZW4gPSAxMDI0OworCWVmaV9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVmaV9kYXRhKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVGSSBkYXRhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcm9tID0gKHN0cnVjdCBpc2NpX29yb20gKikoZWZpX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlzY2lfb2VtX2hkcikpOworCisJaWYgKGdldF9lZmkoKSkKKwkJc3RhdHVzID0gZ2V0X2VmaSgpLT5nZXRfdmFyaWFibGUoaXNjaV9lZml2YXJfbmFtZSwKKwkJCQkJCSAmSVNDSV9FRklfVkVORE9SX0dVSUQsCisJCQkJCQkgJmVmaV9hdHRyaWIsCisJCQkJCQkgJmRhdGFfbGVuLAorCQkJCQkJIGVmaV9kYXRhKTsKKwllbHNlCisJCXN0YXR1cyA9IEVGSV9OT1RfRk9VTkQ7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlVuYWJsZSB0byBvYnRhaW4gRUZJIHZhciBkYXRhIGZvciBPRU0gcGFybXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvZW1faGRyID0gKHN0cnVjdCBpc2NpX29lbV9oZHIgKillZmlfZGF0YTsKKworCWlmIChtZW1jbXAob2VtX2hkci0+c2lnLCBJU0NJX09FTV9TSUcsIElTQ0lfT0VNX1NJR19TSVpFKSAhPSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIkludmFsaWQgT0VNIGhlYWRlciBzaWduYXR1cmVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKwl0bXAgPSAodTggKillZmlfZGF0YTsKKwlmb3IgKGogPSAwLCBzdW0gPSAwOyBqIDwgKHNpemVvZigqb2VtX2hkcikgKyBzaXplb2YoKnJvbSkpOyBqKyssIHRtcCsrKQorCQlzdW0gKz0gKnRtcDsKKworCWlmIChzdW0gIT0gMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJPRU0gdGFibGUgY2hlY2tzdW0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG1lbWNtcChyb20tPmhkci5zaWduYXR1cmUsCisJCSAgIElTQ0lfUk9NX1NJRywKKwkJICAgSVNDSV9ST01fU0lHX1NJWkUpICE9IDApIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiSW52YWxpZCBPRU0gdGFibGUgc2lnbmF0dXJlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJvbTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzAwN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfSVNDSV9QUk9CRV9ST01TX0hfCisjZGVmaW5lIF9JU0NJX1BST0JFX1JPTVNfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgImlzY2kuaCIKKworI2RlZmluZSBTQ0lDX1NEU19QQVJNX05PX1NQRUVEICAgMAorCisvKiBnZW5lcmF0aW9uIDEgKGkuZS4gMS41IEdiL3MpICovCisjZGVmaW5lIFNDSUNfU0RTX1BBUk1fR0VOMV9TUEVFRCAxCisKKy8qIGdlbmVyYXRpb24gMiAoaS5lLiAzLjAgR2IvcykgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9HRU4yX1NQRUVEIDIKKworLyogZ2VuZXJhdGlvbiAzIChpLmUuIDYuMCBHYi9zKSAqLworI2RlZmluZSBTQ0lDX1NEU19QQVJNX0dFTjNfU1BFRUQgMworI2RlZmluZSBTQ0lDX1NEU19QQVJNX01BWF9TUEVFRCBTQ0lDX1NEU19QQVJNX0dFTjNfU1BFRUQKKworLyogcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgYnkgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBzY2lfdXNlcl9wYXJhbWV0ZXJzIHsKKwlzdHJ1Y3Qgc2NpX3BoeV91c2VyX3BhcmFtcyB7CisJCS8qKgorCQkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgTk9USUZZIChFTkFCTEUgU1BJTiBVUCkgcHJpbWl0aXZlCisJCSAqIGluc2VydGlvbiBmcmVxdWVuY3kgZm9yIHRoaXMgcGh5IGluZGV4LgorCQkgKi8KKwkJdTMyIG5vdGlmeV9lbmFibGVfc3Bpbl91cF9pbnNlcnRpb25fZnJlcXVlbmN5OworCisJCS8qKgorCQkgKiBUaGlzIG1ldGhvZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBEV09SRHMgd2l0aGluIHdoaWNoCisJCSAqIHRvIHRyYW5zbWl0IGEgc2luZ2xlIEFMSUdOIHByaW1pdGl2ZS4gIFRoaXMgdmFsdWUgYXBwbGllcyByZWdhcmRsZXNzCisJCSAqIG9mIHdoYXQgdHlwZSBvZiBkZXZpY2UgaXMgYXR0YWNoZWQgb3IgY29ubmVjdGlvbiBzdGF0ZS4gIEEgdmFsdWUgb2YKKwkJICogMCBpbmRpY2F0ZXMgdGhhdCBubyBBTElHTiBwcmltaXRpdmVzIHdpbGwgYmUgaW5zZXJ0ZWQuCisJCSAqLworCQl1MTYgYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeTsKKworCQkvKioKKwkJICogVGhpcyBtZXRob2Qgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgRFdPUkRzIHdpdGhpbiB3aGljaAorCQkgKiB0byB0cmFuc21pdCAyIEFMSUdOIHByaW1pdGl2ZXMuICBUaGlzIGFwcGxpZXMgZm9yIFNBUyBjb25uZWN0aW9ucworCQkgKiBvbmx5LiAgQSBtaW5pbXVtIHZhbHVlIG9mIDMgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZmllbGQuCisJCSAqLworCQl1MTYgaW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5OworCisJCS8qKgorCQkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbWF4aW11bSBzcGVlZCBnZW5lcmF0aW9uIHRvIGJlIHV0aWxpemVkCisJCSAqIGJ5IHBoeXMgaW4gdGhlIHN1cHBsaWVkIHBvcnQuCisJCSAqIC0gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyBnZW5lcmF0aW9uIDEgKGkuZS4gMS41IEdiL3MpLgorCQkgKiAtIEEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgZ2VuZXJhdGlvbiAyIChpLmUuIDMuMCBHYi9zKS4KKwkJICogLSBBIHZhbHVlIG9mIDMgaW5kaWNhdGVzIGdlbmVyYXRpb24gMyAoaS5lLiA2LjAgR2IvcykuCisJCSAqLworCQl1OCBtYXhfc3BlZWRfZ2VuZXJhdGlvbjsKKworCX0gcGh5c1tTQ0lfTUFYX1BIWVNdOworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpcmVjdCBhdHRhY2hlZCBkZXZpY2VzCisJICogdGhhdCBjYW4gaGF2ZSBwb3dlciBzdXBwbGllZCB0byB0aGVtIHNpbXVsdGFuZW91c2x5LgorCSAqLworCXU4IG1heF9udW1iZXJfY29uY3VycmVudF9kZXZpY2Vfc3Bpbl91cDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBhbGxvdyBhIHBoeSB0byBjb25zdW1lCisJICogcG93ZXIgYmVmb3JlIHlpZWxkaW5nIHRvIGFub3RoZXIgcGh5LgorCSAqCisJICovCisJdTggcGh5X3NwaW5fdXBfZGVsYXlfaW50ZXJ2YWw7CisKKwkvKioKKwkgKiBUaGVzZSB0aW1lciB2YWx1ZXMgc3BlY2lmaWVzIGhvdyBsb25nIGEgbGluayB3aWxsIHJlbWFpbiBvcGVuIHdpdGggbm8KKwkgKiBhY3Rpdml0eSBpbiBpbmNyZW1lbnRzIG9mIGEgbWljcm9zZWNvbmQsIGl0IGNhbiBiZSBpbiBpbmNyZW1lbnRzIG9mCisJICogMTAwIG1pY3Jvc2Vjb25kcyBpZiB0aGUgdXBwZXIgbW9zdCBiaXQgaXMgc2V0LgorCSAqCisJICovCisJdTE2IHN0cF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisJdTE2IHNzcF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisKKwkvKioKKwkgKiBUaGVzZSB0aW1lciB2YWx1ZXMgc3BlY2lmaWVzIGhvdyBsb25nIGEgbGluayB3aWxsIHJlbWFpbiBvcGVuIGluIGluY3JlbWVudHMKKwkgKiBvZiAxMDAgbWljcm9zZWNvbmRzLgorCSAqCisJICovCisJdTE2IHN0cF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQ7CisJdTE2IHNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQ7CisKKwkvKioKKwkgKiBUaGlzIHRpbWVyIHZhbHVlIHNwZWNpZmllcyBob3cgbG9uZyBhIGxpbmsgd2lsbCByZW1haW4gb3BlbiB3aXRoIG5vCisJICogb3V0Ym91bmQgdHJhZmZpYyBpbiBpbmNyZW1lbnRzIG9mIGEgbWljcm9zZWNvbmQuCisJICoKKwkgKi8KKwl1OCBub19vdXRib3VuZF90YXNrX3RpbWVvdXQ7CisKK307CisKKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9QSFlfTUFTS19NSU4gMHgwCisjZGVmaW5lIFNDSUNfU0RTX1BBUk1fUEhZX01BU0tfTUFYIDB4RgorI2RlZmluZSBNQVhfQ09OQ1VSUkVOVF9ERVZJQ0VfU1BJTl9VUF9DT1VOVCA0CisKK3N0cnVjdCBzY2lfb2VtX3BhcmFtczsKK2ludCBzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoc3RydWN0IHNjaV9vZW1fcGFyYW1zICpvZW0pOworCitzdHJ1Y3QgaXNjaV9vcm9tOworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X29wcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2VudW0gc2NpX3N0YXR1cyBpc2NpX3BhcnNlX29lbV9wYXJhbWV0ZXJzKHN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtLAorCQkJCQkgIHN0cnVjdCBpc2NpX29yb20gKm9yb20sIGludCBzY3VfaW5kZXgpOworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfZ2V0X2VmaV92YXIoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdHJ1Y3QgaXNjaV9vZW1faGRyIHsKKwl1OCBzaWdbNF07CisJdTggcmV2X21ham9yOworCXU4IHJldl9taW5vcjsKKwl1MTYgbGVuOworCXU4IGNoZWNrc3VtOworCXU4IHJlc2VydmVkMTsKKwl1MTYgcmVzZXJ2ZWQyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbHNlCisjZGVmaW5lIFNDSV9NQVhfUE9SVFMgNAorI2RlZmluZSBTQ0lfTUFYX1BIWVMgNAorI2RlZmluZSBTQ0lfTUFYX0NPTlRST0xMRVJTIDIKKyNlbmRpZgorCisjZGVmaW5lIElTQ0lfRldfTkFNRQkJImlzY2kvaXNjaV9maXJtd2FyZS5iaW4iCisKKyNkZWZpbmUgUk9NU0lHTkFUVVJFCQkweGFhNTUKKworI2RlZmluZSBJU0NJX09FTV9TSUcJCSIkT0VNIgorI2RlZmluZSBJU0NJX09FTV9TSUdfU0laRQk0CisjZGVmaW5lIElTQ0lfUk9NX1NJRwkJIklTQ1VPRU1CIgorI2RlZmluZSBJU0NJX1JPTV9TSUdfU0laRQk4CisKKyNkZWZpbmUgSVNDSV9FRklfVkVORE9SX0dVSUQJXAorCUVGSV9HVUlEKDB4MTkzZGZlZmEsIDB4YTQ0NSwgMHg0MzAyLCAweDk5LCAweGQ4LCAweGVmLCAweDNhLCAweGFkLCBcCisJCQkweDFhLCAweDA0LCAweGM2KQorI2RlZmluZSBJU0NJX0VGSV9WQVJfTkFNRQkiUnN0U2N1TyIKKworLyogQWxsb3dlZCBQT1JUIGNvbmZpZ3VyYXRpb24gbW9kZXMgQVBDIEF1dG9tYXRpYyBQT1JUIGNvbmZpZ3VyYXRpb24gbW9kZSBpcworICogZGVmaW5lZCBieSB0aGUgT0VNIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBwcm92aWRpbmcgbm8gUEhZX01BU0sgcGFyYW1ldGVycworICogZm9yIGFueSBQT1JULiBpLmUuIFRoZXJlIGFyZSBubyBwaHlzIGFzc2lnbmVkIHRvIGFueSBvZiB0aGUgcG9ydHMgYXQgc3RhcnQuCisgKiBNUEMgTWFudWFsIFBPUlQgY29uZmlndXJhdGlvbiBtb2RlIGlzIGRlZmluZWQgYnkgdGhlIE9FTSBjb25maWd1cmF0aW9uCisgKiBwYXJhbWV0ZXJzIHByb3ZpZGluZyBhIFBIWV9NQVNLIHZhbHVlIGZvciBhbnkgUE9SVC4gIEl0IGlzIGFzc3VtZWQgdGhhdCBhbnkKKyAqIFBPUlQgd2l0aCBubyBQSFlfTUFTSyBpcyBhbiBpbnZhbGlkIHBvcnQgYW5kIG5vdCBhbGwgUEhZcyBtdXN0IGJlIGFzc2lnbmVkLgorICogQSBQT1JUX1BIWSBtYXNrIHRoYXQgYXNzaWducyBqdXN0IGEgc2luZ2xlIFBIWSB0byBhIHBvcnQgYW5kIG5vIG90aGVyIFBIWXMKKyAqIGJlaW5nIGFzc2lnbmVkIGlzIHN1ZmZpY2llbnQgdG8gZGVjbGFyZSBtYW51YWwgUE9SVCBjb25maWd1cmF0aW9uLgorICovCitlbnVtIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fbW9kZSB7CisJU0NJQ19QT1JUX01BTlVBTF9DT05GSUdVUkFUSU9OX01PREUgPSAwLAorCVNDSUNfUE9SVF9BVVRPTUFUSUNfQ09ORklHVVJBVElPTl9NT0RFID0gMQorfTsKKworc3RydWN0IHNjaV9iaW9zX29lbV9wYXJhbV9ibG9ja19oZHIgeworCXVpbnQ4X3Qgc2lnbmF0dXJlW0lTQ0lfUk9NX1NJR19TSVpFXTsKKwl1aW50MTZfdCB0b3RhbF9ibG9ja19sZW5ndGg7CisJdWludDhfdCBoZHJfbGVuZ3RoOworCXVpbnQ4X3QgdmVyc2lvbjsKKwl1aW50OF90IHByZWJvb3Rfc291cmNlOworCXVpbnQ4X3QgbnVtX2VsZW1lbnRzOworCXVpbnQxNl90IGVsZW1lbnRfbGVuZ3RoOworCXVpbnQ4X3QgcmVzZXJ2ZWRbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHNjaV9vZW1fcGFyYW1zIHsKKwlzdHJ1Y3QgeworCQl1aW50OF90IG1vZGVfdHlwZTsKKwkJdWludDhfdCBtYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cDsKKwkJdWludDhfdCBkb19lbmFibGVfc3NjOworCQl1aW50OF90IHJlc2VydmVkOworCX0gY29udHJvbGxlcjsKKworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcGh5X21hc2s7CisJfSBwb3J0c1tTQ0lfTUFYX1BPUlRTXTsKKworCXN0cnVjdCBzY2lfcGh5X29lbV9wYXJhbXMgeworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgaGlnaDsKKwkJCXVpbnQzMl90IGxvdzsKKwkJfSBzYXNfYWRkcmVzczsKKworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wwOworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wxOworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wyOworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wzOworCX0gcGh5c1tTQ0lfTUFYX1BIWVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpc2NpX29yb20geworCXN0cnVjdCBzY2lfYmlvc19vZW1fcGFyYW1fYmxvY2tfaGRyIGhkcjsKKwlzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgY3RybFtTQ0lfTUFYX0NPTlRST0xMRVJTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlZ2lzdGVycy5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVnaXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNjZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMTkzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfU0NVX1JFR0lTVEVSU19IXworI2RlZmluZSBfU0NVX1JFR0lTVEVSU19IXworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgU0NVIG1lbW9yeSBtYXBwZWQKKyAqICAgIHJlZ2lzdGVycy4KKyAqCisgKgorICovCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfTUFTSyAgICAgICAgICgweEMwMDAwMDAwKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JRF9TSElGVCAgICAgICAgKDMwKQorCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0ZVTkNUSU9OX01BU0sgICAoMHgwRkYwMDAwMCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfRlVOQ1RJT05fU0hJRlQgICgyMCkKKworI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9NQVNLICAgKDB4MDAwMUY4MDApCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUICAoMTIpCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfTFBWSUVfTUFTSyAgICAgICgweDAwMDAwRjAwKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9MUFZJRV9TSElGVCAgICAgKDgpCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfU1RBVFVTX01BU0sgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQgICAgKDApCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfSU5WQUxJRCAgICgwIDw8IFNDVV9WSUlUX0VOVFJZX0lEX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JRF9WSUlUICAgICAgKDEgPDwgU0NVX1ZJSVRfRU5UUllfSURfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lEX0lJVCAgICAgICAoMiA8PCBTQ1VfVklJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfVklSVF9FWFAgICgzIDw8IFNDVV9WSUlUX0VOVFJZX0lEX1NISUZUKQorCisjZGVmaW5lIFNDVV9WSUlUX0lQUFRfU1NQX0lOSVRJQVRPUiAoMHgwMSA8PCBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9TSElGVCkKKyNkZWZpbmUgU0NVX1ZJSVRfSVBQVF9TTVBfSU5JVElBVE9SICgweDAyIDw8IFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9JUFBUX1NUUF9JTklUSUFUT1IgKDB4MDQgPDwgU0NVX1ZJSVRfRU5UUllfSVBQVE1PREVfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX0lQUFRfSU5JVElBVE9SCSAgICBcCisJKFwKKwkJU0NVX1ZJSVRfSVBQVF9TU1BfSU5JVElBVE9SICBcCisJCXwgU0NVX1ZJSVRfSVBQVF9TTVBfSU5JVElBVE9SICBcCisJCXwgU0NVX1ZJSVRfSVBQVF9TVFBfSU5JVElBVE9SICBcCisJKQorCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19STkNfVkFMSUQgICAgICAoMHgwMSA8PCBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19BRERSRVNTX1ZBTElEICAoMHgwMiA8PCBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19STklfVkFMSUQgICAgICAoMHgwNCA8PCBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19BTExfVkFMSUQgICAgICBcCisJKFwKKwkJU0NVX1ZJSVRfU1RBVFVTX1JOQ19WQUxJRAlcCisJCXwgU0NVX1ZJSVRfU1RBVFVTX0FERFJFU1NfVkFMSUQJICBcCisJCXwgU0NVX1ZJSVRfU1RBVFVTX1JOSV9WQUxJRAkgIFwKKwkpCisKKyNkZWZpbmUgU0NVX1ZJSVRfSVBQVF9TTVBfVEFSR0VUICAgICgweDEwIDw8IFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUKQorCisvKioKKyAqIHN0cnVjdCBzY3VfdmlpdF9lbnRyeSAtIFRoaXMgaXMgdGhlIFNDVSBWaXJ0dWFsIEluaXRpYXRvciBUYWJsZSBFbnRyeQorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfdmlpdF9lbnRyeSB7CisJLyoqCisJICogVGhpcyBtdXN0IGJlIGVuY29kZWQgYXMgdG8gdGhlIHR5cGUgb2YgaW5pdGlhdG9yIHRoYXQgaXMgYmVpbmcgY29uc3RydWN0ZWQKKwkgKiBmb3IgdGhpcyBwb3J0LgorCSAqLworCXUzMiBzdGF0dXM7CisKKwkvKioKKwkgKiBWaXJ0dWFsIGluaXRpYXRvciBoaWdoIFNBUyBBZGRyZXNzCisJICovCisJdTMyIGluaXRpYXRvcl9zYXNfYWRkcmVzc19oaTsKKworCS8qKgorCSAqIFZpcnR1YWwgaW5pdGlhdG9yIGxvdyBTQVMgQWRkcmVzcworCSAqLworCXUzMiBpbml0aWF0b3Jfc2FzX2FkZHJlc3NfbG87CisKKwkvKioKKwkgKiBUaGlzIG11c3QgYmUgMAorCSAqLworCXUzMiByZXNlcnZlZDsKKworfTsKKworCisvKiBJSVQgU3RhdHVzIERlZmluZXMgKi8KKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9NQVNLICAgICAgICAgICAgICAgICgweEMwMDAwMDAwKQorI2RlZmluZSBTQ1VfSUlUX0VOVFJZX0lEX1NISUZUICAgICAgICAgICAgICAgKDMwKQorCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfU1RBVFVTX1VQREFURV9NQVNLICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9TVEFUVVNfVVBEQVRFX1NISUZUICAgICgyOSkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX0xQSV9NQVNLICAgICAgICAgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfTFBJX1NISUZUICAgICAgICAgICAgICAoOCkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1NUQVRVU19NQVNLICAgICAgICAgICAgKDB4MDAwMDAwRkYpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfU1RBVFVTX1NISUZUICAgICAgICAgICAoMCkKKworLyogSUlUIFJlbW90ZSBJbml0aWF0b3IgRGVmaW5lcyAqLworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1JFTU9URV9UQUdfTUFTSyAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfUkVNT1RFX1RBR19TSElGVCAoMCkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1JFTU9URV9STkNfTUFTSyAgKDB4MEZGRjAwMDApCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfUkVNT1RFX1JOQ19TSElGVCAoMTYpCisKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9JTlZBTElEICAgKDAgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9WSUlUICAgICAgKDEgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9JSVQgICAgICAgKDIgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9WSVJUX0VYUCAgKDMgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X2lpdF9lbnRyeSAtIFRoaXMgd2lsbCBiZSBpbXBsZW1lbnRlZCBsYXRlciB3aGVuIHdlIHN1cHBvcnQKKyAqICAgIHZpcnR1YWwgZnVuY3Rpb25zCisgKgorICoKKyAqLworc3RydWN0IHNjdV9paXRfZW50cnkgeworCXUzMiBzdGF0dXM7CisJdTMyIHJlbW90ZV9pbml0aWF0b3Jfc2FzX2FkZHJlc3NfaGk7CisJdTMyIHJlbW90ZV9pbml0aWF0b3Jfc2FzX2FkZHJlc3NfbG87CisJdTMyIHJlbW90ZV9pbml0aWF0b3I7CisKK307CisKKy8qIEdlbmVyYXRlIGEgdmFsdWUgZm9yIGFuIFNDVSByZWdpc3RlciAqLworI2RlZmluZSBTQ1VfR0VOX1ZBTFVFKG5hbWUsIHZhbHVlKSBcCisJKCgodmFsdWUpIDw8IG5hbWUgIyMgX1NISUZUKSAmIChuYW1lICMjIF9NQVNLKSkKKworLyoKKyAqIEdlbmVyYXRlIGEgYml0IHZhbHVlIGZvciBhbiBTQ1UgcmVnaXN0ZXIKKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdpc3RlciBNQVNLIGlzIGp1c3QgYSBzaW5nbGUgYml0ICovCisjZGVmaW5lIFNDVV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKG5hbWUsICgodTMyKTEpKQorCisjZGVmaW5lIFNDVV9TRVRfQklUKG5hbWUsIHJlZ192YWx1ZSkgXAorCSgocmVnX3ZhbHVlKSB8IFNDVV9HRU5fQklUKG5hbWUpKQorCisjZGVmaW5lIFNDVV9DTEVBUl9CSVQobmFtZSwgcmVnX3ZhbHVlKSBcCisJKChyZWdfdmFsdWUpJCB+KFNDVV9HRU5fQklUKG5hbWUpKSkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVbmlvbnMgZm9yIGJpdGZpZWxkIGRlZmluaXRpb25zIG9mIFNDVSBSZWdpc3RlcnMKKyAqIFNNVSBQb3N0IENvbnRleHQgUG9ydAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTlRFWFRfSU5ERVhfU0hJRlQgICAgICAgICAoMCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTlRFWFRfSU5ERVhfTUFTSyAgICAgICAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0xPR0lDQUxfUE9SVF9JTkRFWF9TSElGVCAgICAoMTIpCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9MT0dJQ0FMX1BPUlRfSU5ERVhfTUFTSyAgICAgKDB4MDAwMEYwMDApCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9QUk9UT0NPTF9FTkdJTkVfU0hJRlQgICAgICAgKDE2KQorI2RlZmluZSBTTVVfUE9TVF9DT05URVhUX1BPUlRfUFJPVE9DT0xfRU5HSU5FX01BU0sgICAgICAgICgweDAwMDMwMDAwKQorI2RlZmluZSBTTVVfUE9TVF9DT05URVhUX1BPUlRfQ09NTUFORF9DT05URVhUX1NISUZUICAgICAgICgxOCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTU1BTkRfQ09OVEVYVF9NQVNLICAgICAgICAoMHgwMEZDMDAwMCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAoMHhGRjAwMDAwMCkKKworI2RlZmluZSBTTVVfUENQX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9QT1NUX0NPTlRFWFRfUE9SVF8gIyMgbmFtZSwgdmFsdWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfU1RBVFVTX0NPTVBMRVRJT05fU0hJRlQgICAgICAgKDMxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19DT01QTEVUSU9OX01BU0sgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9TVVNQRU5EX1NISUZUICAgICgxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9TVVNQRU5EX01BU0sgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9FUlJPUl9TSElGVCAgICAgICgwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9FUlJPUl9NQVNLICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19SRVNFUlZFRF9NQVNLICAgICAgICAgICgweDdGRkZGRkZDKQorCisjZGVmaW5lIFNNVV9JU1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0lOVEVSUlVQVF9TVEFUVVNfICMjIG5hbWUpCisKKyNkZWZpbmUgU01VX0lTUl9RVUVVRV9FUlJPUiAgIFNNVV9JU1JfR0VOX0JJVChRVUVVRV9FUlJPUikKKyNkZWZpbmUgU01VX0lTUl9RVUVVRV9TVVNQRU5EIFNNVV9JU1JfR0VOX0JJVChRVUVVRV9TVVNQRU5EKQorI2RlZmluZSBTTVVfSVNSX0NPTVBMRVRJT04gICAgU01VX0lTUl9HRU5fQklUKENPTVBMRVRJT04pCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfTUFTS19DT01QTEVUSU9OX1NISUZUICAgICAgICAgKDMxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfQ09NUExFVElPTl9NQVNLICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfU1VTUEVORF9TSElGVCAgICAgICgxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfU1VTUEVORF9NQVNLICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfRVJST1JfU0hJRlQgICAgICAgICgwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfRVJST1JfTUFTSyAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICgweDdGRkZGRkZDKQorCisjZGVmaW5lIFNNVV9JTVJfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0lOVEVSUlVQVF9NQVNLXyAjIyBuYW1lKQorCisjZGVmaW5lIFNNVV9JTVJfUVVFVUVfRVJST1IgICBTTVVfSU1SX0dFTl9CSVQoUVVFVUVfRVJST1IpCisjZGVmaW5lIFNNVV9JTVJfUVVFVUVfU1VTUEVORCBTTVVfSU1SX0dFTl9CSVQoUVVFVUVfU1VTUEVORCkKKyNkZWZpbmUgU01VX0lNUl9DT01QTEVUSU9OICAgIFNNVV9JTVJfR0VOX0JJVChDT01QTEVUSU9OKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF9USU1FUl9TSElGVCAgICAoMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfVElNRVJfTUFTSyAgICAgKDB4MDAwMDAwMUYpCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfQ09BTEVTQ0lOR19DT05UUk9MX05VTUJFUl9TSElGVCAgICg4KQorI2RlZmluZSBTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF9OVU1CRVJfTUFTSyAgICAoMHgwMDAwRkYwMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgKDB4RkZGRjAwRTApCisKKyNkZWZpbmUgU01VX0lDQ19HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF8gIyMgbmFtZSwgdmFsdWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfU1RBUlRfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9SQU5HRV9TVEFSVF9NQVNLICAgICAgICgweDAwMDAwRkZGKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX0VORElOR19TSElGVCAgICAgKDE2KQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX0VORElOR19NQVNLICAgICAgKDB4MEZGRjAwMDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfRU5BQkxFX1NISUZUICAgICAoMzEpCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfRU5BQkxFX01BU0sgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9SQU5HRV9SRVNFUlZFRF9NQVNLICAgICgweDcwMDBGMDAwKQorCisjZGVmaW5lIFNNVV9UQ1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU01VX1RBU0tfQ09OVEVYVF9SQU5HRV8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX1RDUl9HRU5fQklUKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9CSVQoU01VX1RBU0tfQ09OVEVYVF9SQU5HRV8gIyMgbmFtZSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfUE9JTlRFUl9TSElGVCAgICAgICAgICAoMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX1BPSU5URVJfTUFTSyAgICAgICAgICAgKDB4MDAwMDNGRkYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9DWUNMRV9CSVRfU0hJRlQgICAgICAgICgxNSkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX0NZQ0xFX0JJVF9NQVNLICAgICAgICAgKDB4MDAwMDgwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9FVkVOVF9QT0lOVEVSX1NISUZUICAgICgxNikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX0VWRU5UX1BPSU5URVJfTUFTSyAgICAgKDB4MDNGRjAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9FVkVOVF9DWUNMRV9CSVRfU0hJRlQgICgyNikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX0VWRU5UX0NZQ0xFX0JJVF9NQVNLICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9SRVNFUlZFRF9NQVNLICAgICAgICAgICgweEY4MDA0MDAwKQorCisjZGVmaW5lIFNNVV9DUVBSX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX0NRUFJfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUXyAjIyBuYW1lKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9QT0lOVEVSX1NISUZUICAgICAgICAgICgwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfUE9JTlRFUl9NQVNLICAgICAgICAgICAoMHgwMDAwM0ZGRikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0NZQ0xFX0JJVF9TSElGVCAgICAgICAgKDE1KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfQ1lDTEVfQklUX01BU0sgICAgICAgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX1BPSU5URVJfU0hJRlQgICAgKDE2KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfUE9JTlRFUl9NQVNLICAgICAoMHgwM0ZGMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX0NZQ0xFX0JJVF9TSElGVCAgKDI2KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfQ1lDTEVfQklUX01BU0sgICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VOQUJMRV9TSElGVCAgICAgICAgICAgKDMwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRU5BQkxFX01BU0sgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX0VOQUJMRV9TSElGVCAgICAgKDMxKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfRU5BQkxFX01BU0sgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1JFU0VSVkVEX01BU0sgICAgICAgICAgKDB4MzgwMDQwMDApCisKKyNkZWZpbmUgU01VX0NRR1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTTVVfQ1FHUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfICMjIG5hbWUpCisKKyNkZWZpbmUgU01VX0NRR1JfQ1lDTEVfQklUIFwKKwlTTVVfQ1FHUl9HRU5fQklUKENZQ0xFX0JJVCkKKworI2RlZmluZSBTTVVfQ1FHUl9FVkVOVF9DWUNMRV9CSVQgXAorCVNNVV9DUUdSX0dFTl9CSVQoRVZFTlRfQ1lDTEVfQklUKQorCisjZGVmaW5lIFNNVV9DUUdSX0dFVF9QT0lOVEVSX1NFVCh2YWx1ZSkJXAorCVNNVV9DUUdSX0dFTl9WQUwoUE9JTlRFUiwgdmFsdWUpCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfQ09OVFJPTF9RVUVVRV9MSU1JVF9TSElGVCAgKDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfUVVFVUVfTElNSVRfTUFTSyAgICgweDAwMDAzRkZGKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MX0VWRU5UX0xJTUlUX1NISUZUICAoMTYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfRVZFTlRfTElNSVRfTUFTSyAgICgweDAzRkYwMDAwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MX1JFU0VSVkVEX01BU0sgICAgICAoMHhGQzAwQzAwMCkKKworI2RlZmluZSBTTVVfQ1FDX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNNVV9DUUNfUVVFVUVfTElNSVRfU0VUKHZhbHVlKSBcCisJU01VX0NRQ19HRU5fVkFMKFFVRVVFX0xJTUlULCB2YWx1ZSkKKworI2RlZmluZSBTTVVfQ1FDX0VWRU5UX0xJTUlUX1NFVCh2YWx1ZSkgXAorCVNNVV9DUUNfR0VOX1ZBTChFVkVOVF9MSU1JVCwgdmFsdWUpCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19TSElGVCAgICAoMCkKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19NQVNLICAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9TSElGVCAgICAoMTIpCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfTFBfTUFTSyAgICAgKDB4MDAwMDcwMDApCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfUk5DX1NISUZUICAgKDE1KQorI2RlZmluZSBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19NQVNLICAgICgweDA3RkY4MDAwKQorI2RlZmluZSBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1BFR19TSElGVCAgICgyNykKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9QRUdfTUFTSyAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX1JFU0VSVkVEX01BU0sgICAoMHhGMDAwMDAwMCkKKworI2RlZmluZSBTTVVfRENDX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX0RDQ19HRVRfTUFYX1BFRyh2YWx1ZSkgXAorCShcCisJCSgodmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9QRUdfTUFTSykgXAorCQk+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX1NISUZUIFwKKwkpCisKKyNkZWZpbmUgU01VX0RDQ19HRVRfTUFYX0xQKHZhbHVlKSBcCisJKFwKKwkJKCh2YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX01BU0spIFwKKwkJPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9TSElGVCBcCisJKQorCisjZGVmaW5lIFNNVV9EQ0NfR0VUX01BWF9UQyh2YWx1ZSkgXAorCShcCisJCSgodmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19NQVNLKSBcCisJCT4+IFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfU0hJRlQgXAorCSkKKworI2RlZmluZSBTTVVfRENDX0dFVF9NQVhfUk5DKHZhbHVlKSBcCisJKFwKKwkJKCh2YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19NQVNLKSBcCisJCT4+IFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfUk5DX1NISUZUIFwKKwkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX1RBU0tfQ09OVEVYVF9SQU5HRV9FTkFCTEVfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX1RBU0tfQ09OVEVYVF9SQU5HRV9FTkFCTEVfTUFTSyAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX0NPTVBMRVRJT05fQllURV9TV0FQX0VOQUJMRV9TSElGVCAgICAoMSkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX0NPTVBMRVRJT05fQllURV9TV0FQX0VOQUJMRV9NQVNLICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX0NPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVEX1NISUZUICAgICAoMTYpCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19DT05URVhUX1JBTV9JTklUX0NPTVBMRVRFRF9NQVNLICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19TQ0hFRFVMRVJfUkFNX0lOSVRfQ09NUExFVEVEX1NISUZUICAgKDE3KQorI2RlZmluZSBTTVVfQ09OVFJPTF9TVEFUVVNfU0NIRURVTEVSX1JBTV9JTklUX0NPTVBMRVRFRF9NQVNLICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTTVVfQ09OVFJPTF9TVEFUVVNfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweEZGRkNGRkZDKQorCisjZGVmaW5lIFNNVV9TTVVDU1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0NPTlRST0xfU1RBVFVTXyAjIyBuYW1lKQorCisjZGVmaW5lIFNNVV9TTVVDU1JfU0NIRURVTEVSX1JBTV9JTklUX0NPTVBMRVRFRAlcCisJKFNNVV9TTVVDU1JfR0VOX0JJVChTQ0hFRFVMRVJfUkFNX0lOSVRfQ09NUExFVEVEKSkKKworI2RlZmluZSBTTVVfU01VQ1NSX0NPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVECVwKKwkoU01VX1NNVUNTUl9HRU5fQklUKENPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVEKSkKKworI2RlZmluZSBTQ1VfUkFNX0lOSVRfQ09NUExFVEVEIFwKKwkoXAorCQlTTVVfU01VQ1NSX0NPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVEIFwKKwkJfCBTTVVfU01VQ1NSX1NDSEVEVUxFUl9SQU1fSU5JVF9DT01QTEVURUQgXAorCSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTBfU0hJRlQgICgwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTBfTUFTSyAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTFfU0hJRlQgICgxKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTFfTUFTSyAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTJfU0hJRlQgICgyKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTJfTUFTSyAgICgweDAwMDAwMDA0KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTNfU0hJRlQgICgzKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTNfTUFTSyAgICgweDAwMDAwMDA4KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTBfU0hJRlQgICg4KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTBfTUFTSyAgICgweDAwMDAwMTAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTFfU0hJRlQgICg5KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTFfTUFTSyAgICgweDAwMDAwMjAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTJfU0hJRlQgICgxMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUyX01BU0sgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUzX1NISUZUICAoMTEpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcxX1BFM19NQVNLICAgKDB4MDAwMDA4MDApCisKKyNkZWZpbmUgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORShwZWcsIHBlKSBcCisJKCgxIDw8IChwZSkpIDw8ICgocGVnKSAqIDgpKQorCisjZGVmaW5lIFNNVV9SRVNFVF9QRUdfUFJPVE9DT0xfRU5HSU5FUyhwZWcpIFwKKwkoXAorCQlTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FKHBlZywgMCkgXAorCQl8IFNNVV9SRVNFVF9QUk9UT0NPTF9FTkdJTkUocGVnLCAxKSBcCisJCXwgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORShwZWcsIDIpIFwKKwkJfCBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FKHBlZywgMykgXAorCSkKKworI2RlZmluZSBTTVVfUkVTRVRfQUxMX1BST1RPQ09MX0VOR0lORVMoKSBcCisJKFwKKwkJU01VX1JFU0VUX1BFR19QUk9UT0NPTF9FTkdJTkVTKDApIFwKKwkJfCBTTVVfUkVTRVRfUEVHX1BST1RPQ09MX0VOR0lORVMoMSkgXAorCSkKKworI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzBfTFAwX1NISUZUICAoMTYpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMF9MUDBfTUFTSyAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzBfTFAyX1NISUZUICAoMTcpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMF9MUDJfTUFTSyAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzFfTFAwX1NISUZUICAoMTgpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMV9MUDBfTUFTSyAgICgweDAwMDQwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzFfTFAyX1NISUZUICAoMTkpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMV9MUDJfTUFTSyAgICgweDAwMDgwMDAwKQorCisjZGVmaW5lIFNNVV9SRVNFVF9XSURFX1BPUlRfUVVFVUUocGVnLCB3aWRlX3BvcnQpIFwKKwkoKDEgPDwgKCh3aWRlX3BvcnQpIC8gMikpIDw8ICgocGVnKSAqIDIpIDw8IDE2KQorCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcwX1NISUZUICAgICAgKDIwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9NQVNLICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9TSElGVCAgICAgICgyMSkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfTUFTSyAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1NDVV9TSElGVCAgICAgICAoMjIpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9TQ1VfTUFTSyAgICAgICAgKDB4MDA0MDAwMDApCisKKy8qCisgKiBJdCBzZWVtcyB0byBtYWtlIHNlbnNlIHRoYXQgaWYgeW91IGFyZSBnb2luZyB0byByZXNldCB0aGUgcHJvdG9jb2wKKyAqIGVuZ2luZSBncm91cCB0aGF0IHlvdSB3b3VsZCBhbHNvIHJlc2V0IGFsbCBvZiB0aGUgcHJvdG9jb2wgZW5naW5lcyAqLworI2RlZmluZSBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FX0dST1VQKHBlZykgXAorCShcCisJCSgxIDw8ICgocGVnKSArIDIwKSkgXAorCQl8IFNNVV9SRVNFVF9XSURFX1BPUlRfUVVFVUUocGVnLCAwKSBcCisJCXwgU01VX1JFU0VUX1dJREVfUE9SVF9RVUVVRShwZWcsIDEpIFwKKwkJfCBTTVVfUkVTRVRfUEVHX1BST1RPQ09MX0VOR0lORVMocGVnKSBcCisJKQorCisjZGVmaW5lIFNNVV9SRVNFVF9BTExfUFJPVE9DT0xfRU5HSU5FX0dST1VQUygpIFwKKwkoXAorCQlTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FX0dST1VQKDApIFwKKwkJfCBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FX0dST1VQKDEpIFwKKwkpCisKKyNkZWZpbmUgU01VX1JFU0VUX1NDVSgpICAoMHhGRkZGRkZGRikKKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9TVEFSVElOR19TSElGVCAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9TVEFSVElOR19NQVNLICAgICAgICAgICAgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9FTkRJTkdfU0hJRlQgICAgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfRU5ESU5HX01BU0sgICAgICAgICAgICAgICAgICgweDBGRkYwMDAwKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfUkFOR0VfQ0hFQ0tfRU5BQkxFX1NISUZUICAgICgzMSkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UX1JBTkdFX0NIRUNLX0VOQUJMRV9NQVNLICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAoMHg3MDAwRjAwMCkKKworI2RlZmluZSBTTVVfVENBX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX1RDQV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfICMjIG5hbWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0NPTlRST0xfUVVFVUVfU0laRV9TSElGVCAgICgwKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9DT05UUk9MX1FVRVVFX1NJWkVfTUFTSyAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAgICAgKDB4RkZGRkYwMDApCisKKyNkZWZpbmUgU0NVX1VGUUNfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfQ09OVFJPTF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUNfUVVFVUVfU0laRV9TRVQodmFsdWUpIFwKKwlTQ1VfVUZRQ19HRU5fVkFMKFFVRVVFX1NJWkUsIHZhbHVlKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9QVVRfUE9JTlRFUl9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9QVVRfUE9JTlRFUl9NQVNLICAgICAgICgweDAwMDAwRkZGKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9QVVRfQ1lDTEVfQklUX1NISUZUICAgICgxMikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX0NZQ0xFX0JJVF9NQVNLICAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX1JFU0VSVkVEX01BU0sgICAgICAoMHhGRkZGRTAwMCkKKworI2RlZmluZSBTQ1VfVUZRUFBfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfVUZRUFBfR0VOX0JJVChuYW1lKQlcCisJU0NVX0dFTl9CSVQoU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUXyAjIyBuYW1lKQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0RNQSBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9QT0lOVEVSX1NISUZUICAgICAgKDApCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9QT0lOVEVSX01BU0sgICAgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9DWUNMRV9CSVRfU0hJRlQgICAgKDEyKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfQ1lDTEVfQklUX01BU0sgICAgICgxMikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfR0VUX0VOQUJMRV9CSVRfU0hJRlQgICAoMzEpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9FTkFCTEVfQklUX01BU0sgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9SRVNFUlZFRF9NQVNLICAgICAgKDB4N0ZGRkUwMDApCisKKyNkZWZpbmUgU0NVX1VGUUdQX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUdQX0dFTl9CSVQobmFtZSkJXAorCVNDVV9HRU5fQklUKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF8gIyMgbmFtZSkKKworI2RlZmluZSBTQ1VfVUZRR1BfQ1lDTEVfQklUKHZhbHVlKSBcCisJU0NVX1VGUUdQX0dFTl9CSVQoQ1lDTEVfQklULCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfVUZRR1BfR0VUX1BPSU5URVIodmFsdWUpIFwKKwlTQ1VfVUZRR1BfR0VOX1ZBTFVFKFBPSU5URVIsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFHUF9FTkFCTEUodmFsdWUpCVwKKwkoU0NVX1VGUUdQX0dFTl9CSVQoRU5BQkxFKSB8IHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFHUF9ESVNBQkxFKHZhbHVlKSBcCisJKH5TQ1VfVUZRR1BfR0VOX0JJVChFTkFCTEUpICYgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUdQX1ZBTFVFKGJpdCwgdmFsdWUpIFwKKwkoU0NVX1VGUUdQX0NZQ0xFX0JJVChiaXQpIHwgU0NVX1VGUUdQX0dFVF9QT0lOVEVSKHZhbHVlKSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9BRERSRVNTX01PRElGSUVSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0FERFJFU1NfTU9ESUZJRVJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAoMTYpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9QQ0lfTk9fU05PT1BfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNykKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9QQ0lfTk9fU05PT1BfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9CWVRFX1NXQVBfU0hJRlQgICAgICAgICAgICAgICAgICAgKDE4KQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9CWVRFX1NXQVBfTUFTSyAgICAgICAgICAgICAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQklHX0VORElBTl9DT05UUk9MX1hQSV9TR0xfRkVUQ0hfU0hJRlQgICAgICAgICAgICAgICAoMTkpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQklHX0VORElBTl9DT05UUk9MX1hQSV9TR0xfRkVUQ0hfTUFTSyAgICAgICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfWFBJX1JYX0hFQURFUl9SQU1fV1JJVEVfU0hJRlQgICAgICgyMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfWFBJX1JYX0hFQURFUl9SQU1fV1JJVEVfTUFTSyAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9YUElfVUZfQUREUkVTU19GRVRDSF9TSElGVCAgICAgICAgKDIxKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9YUElfVUZfQUREUkVTU19GRVRDSF9NQVNLICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQUREUkVTU19NT0RJRklFUl9TRUxFQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAoMjIpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQUREUkVTU19NT0RJRklFUl9TRUxFQ1RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGODAwMDAwKQorCisjZGVmaW5lIFNDVV9QRE1BQ1JfR0VOX1ZBTFVFKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfUERNQV9DT05GSUdVUkFUSU9OXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfUERNQUNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fICMjIG5hbWUpCisKKyNkZWZpbmUgU0NVX1BETUFDUl9CRV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfUENNQUNSX0dFTl9CSVQoQklHX0VORElBTl9DT05UUk9MXyAjIyBuYW1lKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfQ0RNQV9DT05GSUdVUkFUSU9OX1BDSV9SRUxBWEVEX09SREVSSU5HX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9DRE1BX0NPTkZJR1VSQVRJT05fUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKKworI2RlZmluZSBTQ1VfQ0RNQUNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9DRE1BX0NPTkZJR1VSQVRJT05fICMjIG5hbWUpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBTQ1UgTGluayBMYXllciBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19USU1FT1VUX1NISUZUICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfVElNRU9VVF9NQVNLICAgICAgICAgICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTX0xPQ0tfVElNRV9TSElGVCAgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19MT0NLX1RJTUVfTUFTSyAgICAgICAgICAgICgweDAwMDBGRjAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfUkFURV9DSEFOR0VfREVMQVlfU0hJRlQgICAoMTYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19SQVRFX0NIQU5HRV9ERUxBWV9NQVNLICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfRFdPUkRfU1lOQ19USU1FT1VUX1NISUZUICAoMjQpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19EV09SRF9TWU5DX1RJTUVPVVRfTUFTSyAgICgweEZGMDAwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUNHT0lBVElPTl9USU1FUl9WQUxVRVNfUkVRVUlSRURfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVDR09JQVRJT05fVElNRVJfVkFMVUVTX0RFRkFVTFRfTUFTSyAgICAgICAgICAgICAgKDB4N0QwMDY3NkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FQ0dPSUFUSU9OX1RJTUVSX1ZBTFVFU19SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICgweDAwRkYwMDAwKQorCisjZGVmaW5lIFNDVV9TQVNfU1BEVE9WX0dFTl9WQUxVRShuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTXyAjIyBuYW1lLCB2YWx1ZSkKKworCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19EV09SRF9TWU5DX0FRVUlSRURfU0hJRlQgICAgICAgICAgICAoMikKKyNkZWZpbmUgU0NVX0xJTktfU1RBVFVTX0RXT1JEX1NZTkNfQVFVSVJFRF9NQVNLICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfVFJBTlNNSVRfUE9SVF9TRUxFQ1RJT05fRE9ORV9TSElGVCAgKDQpCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19UUkFOU01JVF9QT1JUX1NFTEVDVElPTl9ET05FX01BU0sgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgU0NVX0xJTktfU1RBVFVTX1JFQ0VJVkVSX0NSRURJVF9FWEhBVVNURURfU0hJRlQgICAgICg1KQorI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfUkVDRUlWRVJfQ1JFRElUX0VYSEFVU1RFRF9NQVNLICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAoMHhGRkZGRkZDRCkKKworI2RlZmluZSBTQ1VfU0FTX0xMU1RBX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9MSU5LX1NUQVRVU18gIyMgbmFtZSkKKworCisvKiBUT0RPOiBXaGVyZSBpcyB0aGUgU0FUQV9QU0VMVE9WIHJlZ2lzdGVyPyAqLworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0NVIFNBUyBNYXhpbXVtIEFyYml0cmF0aW9uIFdhaXQgVGltZSBUaW1lb3V0IFJlZ2lzdGVyCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0FTX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUVfVElNRU9VVF9WQUxVRV9TSElGVCAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfVkFMVUVfTUFTSyAgICAgICAgKDB4MDAwMDdGRkYpCisjZGVmaW5lIFNDVV9TQVNfTUFYX0FSQklUUkFUSU9OX1dBSVRfVElNRV9USU1FT1VUX1NDQUxFX1NISUZUICAgICAgICgxNSkKKyNkZWZpbmUgU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfU0NBTEVfTUFTSyAgICAgICAgKDB4MDAwMDgwMDApCisKKyNkZWZpbmUgU0NVX1NBU19NQVdUVE9WX0dFTl9WQUxVRShuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfTUFXVFRPVl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0FTX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUVfVElNRU9VVF8gIyMgbmFtZSkKKworCisvKgorICogVE9ETzogV2hlcmUgaXMgdGhlIFNBU19MTktUT1YgcmVnc2l0ZXI/CisgKiBUT0RPOiBXaGVyZSBpcyB0aGUgU0FTX1BIWVRPViByZWdpc3Rlcj8gKi8KKworI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NNUF9UQVJHRVRfU0hJRlQgICAgICAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TTVBfVEFSR0VUX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1RQX1RBUkdFVF9TSElGVCAgICAgICAgICAgICgyKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NUUF9UQVJHRVRfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TU1BfVEFSR0VUX1NISUZUICAgICAgICAgICAgKDMpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1NQX1RBUkdFVF9NQVNLICAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX0RBX1NBVEFfSE9TVF9TSElGVCAgICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9EQV9TQVRBX0hPU1RfTUFTSyAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU01QX0lOSVRJQVRPUl9TSElGVCAgICAgICAgICg5KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NNUF9JTklUSUFUT1JfTUFTSyAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TVFBfSU5JVElBVE9SX1NISUZUICAgICAgICAgKDEwKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NUUF9JTklUSUFUT1JfTUFTSyAgICAgICAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TU1BfSU5JVElBVE9SX1NISUZUICAgICAgICAgKDExKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NTUF9JTklUSUFUT1JfTUFTSyAgICAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9SRUFTT05fQ09ERV9TSElGVCAgICAgICAgICAgKDE2KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1JFQVNPTl9DT0RFX01BU0sgICAgICAgICAgICAoMHgwMDBGMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9BRERSRVNTX0ZSQU1FX1RZUEVfU0hJRlQgICAgKDI0KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX0FERFJFU1NfRlJBTUVfVFlQRV9NQVNLICAgICAoMHgwRjAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9ERVZJQ0VfVFlQRV9TSElGVCAgICAgICAgICAgKDI4KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX0RFVklDRV9UWVBFX01BU0sgICAgICAgICAgICAoMHg3MDAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgKDB4ODBGMEYxRjEpCisKKyNkZWZpbmUgU0NVX1NBU19USUlEX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfVElJRF9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OXyAjIyBuYW1lKQorCisvKiBTQVMgSWRlbnRpZnkgRnJhbWUgUEhZIElkZW50aWZpZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfQlJFQUtfUkVQTFlfQ0FQQUJMRV9TSElGVCAgICAgICgxNikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfQlJFQUtfUkVQTFlfQ0FQQUJMRV9NQVNLICAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9SRVFVRVNURURfSU5TSURFX1pQU0RTX1NISUZUICAgKDE3KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9SRVFVRVNURURfSU5TSURFX1pQU0RTX01BU0sgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0lOU0lERV9aUFNEU19QRVJTSVNURU5UX1NISUZUICAoMTgpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0lOU0lERV9aUFNEU19QRVJTSVNURU5UX01BU0sgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICgyNCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweEZGMDAwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgKDB4MDBGODAwRkYpCisKKyNkZWZpbmUgU0NVX1NBU19USVBJRF9HRU5fVkFMVUUobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0FTX1RJUElEX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSXyAjIyBuYW1lKQorCisKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9QQVJJVFlfQ0hFQ0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9QQVJJVFlfQ0hFQ0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9CQURfQ1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAoNikKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9CQURfQ1JDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX1NDUkFNQkxFUl9TSElGVCAgICAgICAgICAgICAgICAgICAoNykKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX1NDUkFNQkxFUl9NQVNLICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0RFU0NSQU1CTEVSX1NISUZUICAgICAgICAgICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0RFU0NSQU1CTEVSX01BU0sgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0NSRURJVF9JTlNFUlRJT05fU0hJRlQgICAgICAgICAgICAoOSkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0NSRURJVF9JTlNFUlRJT05fTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9TVVNQRU5EX1BST1RPQ09MX0VOR0lORV9TSElGVCAgICAgICAgICAgICAoMTEpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fU1VTUEVORF9QUk9UT0NPTF9FTkdJTkVfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fU0FUQV9TUElOVVBfSE9MRF9TSElGVCAgICAgICAgICAgICAgICAgICAgKDEyKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1NBVEFfU1BJTlVQX0hPTERfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1RSQU5TTUlUX1BPUlRfU0VMRUNUSU9OX1NJR05BTF9TSElGVCAgICAgICgxMykKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UUkFOU01JVF9QT1JUX1NFTEVDVElPTl9TSUdOQUxfTUFTSyAgICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9IQVJEX1JFU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fSEFSRF9SRVNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDQwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fT09CX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1KQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0VOQUJMRV9GUkFNRV9UWF9JTlNFUlRfQUxJR05fU0hJRlQgICAgICAgICgyMykKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9FTkFCTEVfRlJBTUVfVFhfSU5TRVJUX0FMSUdOX01BU0sgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9GT1JXQVJEX0lERU5USUZZX0ZSQU1FX1NISUZUICAgICAgICAgICAgICAoMjcpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRk9SV0FSRF9JREVOVElGWV9GUkFNRV9NQVNLICAgICAgICAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9CWVRFX1RSQU5TUE9TRV9TVFBfRlJBTUVfU0hJRlQgICAgKDI4KQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0RJU0FCTEVfQllURV9UUkFOU1BPU0VfU1RQX0ZSQU1FX01BU0sgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9SRVNFVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgyOSkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9PT0JfUkVTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9USFJFRV9JQUZfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAoMzApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVEhSRUVfSUFGX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fT09CX0FMSUdOMF9FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgKDMxKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9BTElHTjBfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1JFUVVJUkVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxMDAwMDBGKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0RFRkFVTFRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQxODAxMDBGKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorCisjZGVmaW5lIFNDVV9TQVNfUENGR19HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OXyAjIyBuYW1lKQorCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0FMSUdOX0lOU0VSVElPTl9GUkVRVUVOQ1lfR0VORVJBTF9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0dFTkVSQUxfTUFTSyAgICAgICAoMHgwMDAwMDdGRikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9DT05ORUNURURfU0hJRlQgICAgKDE2KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0NPTk5FQ1RFRF9NQVNLICAgICAoMHgwMGZmMDAwMCkKKworI2RlZmluZSBTQ1VfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZXyMjbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MX0NPVU5UX1NISUZUICAgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfQ09VTlRfTUFTSyAgICAgKDB4MDAwM0ZGRkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0VOQUJMRV9TUElOVVBfQ09OVFJPTF9FTkFCTEVfU0hJRlQgICAoMzEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0VOQUJMRV9TUElOVVBfQ09OVFJPTF9FTkFCTEVfTUFTSyAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MX1JFU0VSVkVEX01BU0sgICgweDdGRkMwMDAwKQorCisjZGVmaW5lIFNDVV9FTlNQSU5VUF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9FTlNQSU5VUF9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfICMjIG5hbWUpCisKKworI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1RYU1NDVFlQRV9TSElGVCAgICAgKDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfVFhTU0NUWVBFX01BU0sgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19STExSQVRFX1NISUZUICAgICAgICg0KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1JMTFJBVEVfTUFTSyAgICAgICAgKDB4MDAwMDAwRjApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPMTVHQlBTX1NISUZUICAgICAoOCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TV08xNUdCUFNfTUFTSyAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMTVHQlBTX1NISUZUICAgICAgKDkpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1cxNUdCUFNfTUFTSyAgICAgICAoMHgwMDAwMDIwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TV08zMEdCUFNfU0hJRlQgICAgICgxMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TV08zMEdCUFNfTUFTSyAgICAgICgweDAwMDAwNDAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMzBHQlBTX1NISUZUICAgICAgKDExKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMzBHQlBTX01BU0sgICAgICAgKDB4MDAwMDA4MDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPNjBHQlBTX1NISUZUICAgICAoMTIpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPNjBHQlBTX01BU0sgICAgICAoMHgwMDAwMTAwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzYwR0JQU19TSElGVCAgICAgICgxMykKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzYwR0JQU19NQVNLICAgICAgICgweDAwMDAyMDAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX0VWRU5fUEFSSVRZX1NISUZUICAgKDMxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX0VWRU5fUEFSSVRZX01BU0sgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfREVGQVVMVF9NQVNLICAgICAgICAoMHgwMDAwM0YwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19SRVFVSVJFRF9NQVNLICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1JFU0VSVkVEX01BU0sgICAgICAgKDB4N0ZGRkMwMEQpCisKKyNkZWZpbmUgU0NVX1NBU19QSFlDQVBfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU18gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NBU19QSFlDQVBfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU18gIyMgbmFtZSkKKworCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9TT1VSQ0VfWk9ORV9HUk9VUF9DT05UUk9MX1ZJUlRVQUxfRVhQQU5ERVJfUEhZX1pPTkVfR1JPVVBfU0hJRlQgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF9WSVJUVUFMX0VYUEFOREVSX1BIWV9aT05FX0dST1VQX01BU0sgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfSU5TSURFX1NPVVJDRV9aT05FX0dST1VQX1NISUZUICAgICAgICAgKDMxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF9JTlNJREVfU09VUkNFX1pPTkVfR1JPVVBfTUFTSyAgICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4N0ZGRkZGMDApCisKKyNkZWZpbmUgU0NVX1BTWkdDUl9HRU5fVkFMKG5hbWUsIHZhbHVlKQlcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1BTWkdDUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF8gIyMgbmFtZSkKKworI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTBfTE9DS0VEX1NISUZUICAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUwX0xPQ0tFRF9NQVNLICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMF9VUERBVElOR19TSElGVCAgICAgICgyKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTBfVVBEQVRJTkdfTUFTSyAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUxX0xPQ0tFRF9TSElGVCAgICAgICAgKDQpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMV9MT0NLRURfTUFTSyAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTFfVVBEQVRJTkdfU0hJRlQgICAgICAoNSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUxX1VQREFUSU5HX01BU0sgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUwX1NISUZUICgxNikKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTBfTUFTSyAgKDB4MDAwMzAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMF9TSElGVCAgICAgICgxOSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUwX01BU0sgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUxX1NISUZUICgyMCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTFfTUFTSyAgKDB4MDAzMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMV9TSElGVCAgICAgICgyMykKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUxX01BU0sgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUyX1NISUZUICgyNCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTJfTUFTSyAgKDB4MDMwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMl9TSElGVCAgICAgICgyNykKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUyX01BU0sgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUzX1NISUZUICgyOCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTNfTUFTSyAgKDB4MzAwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFM19TSElGVCAgICAgICgzMSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUzX01BU0sgICAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICgweDQ0NDRGRkM5KQorCisjZGVmaW5lIFNDVV9QRUdfU0NVVlpFQ1JfR0VOX1ZBTChuYW1lLCB2YWwpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF8gIyMgbmFtZSwgdmFsKQorCisjZGVmaW5lIFNDVV9QRUdfU0NVVlpFQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MXyAjIyBuYW1lKQorCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBQb3J0IFRhc2sgU2NoZWR1bGVyIHJlZ2lzdGVycyBzaGlmdCBhbmQgbWFzayB2YWx1ZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfSVRfTkVYVVNfVElNRU9VVF9TSElGVCAgICAgKDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfSVRfTkVYVVNfVElNRU9VVF9NQVNLICAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfVEFTS19USU1FT1VUX1NISUZUICAgICAgICAgKDE2KQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1RBU0tfVElNRU9VVF9NQVNLICAgICAgICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1BUU0dfRU5BQkxFX1NISUZUICAgICAgICAgICgyNCkKKyNkZWZpbmUgU0NVX1BUU0dfQ09OVFJPTF9QVFNHX0VOQUJMRV9NQVNLICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgU0NVX1BUU0dfQ09OVFJPTF9FVE1fRU5BQkxFX1NISUZUICAgICAgICAgICAoMjUpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfRVRNX0VOQUJMRV9NQVNLICAgICAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfREVGQVVMVF9NQVNLICAgICAgICAgICAgICAgKDB4MDAwMjAwMDIpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfUkVRVUlSRURfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgKDB4RkMwMDAwMDApCisKKyNkZWZpbmUgU0NVX1BUU0dDUl9HRU5fVkFMKG5hbWUsIHZhbCkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1BUU0dfQ09OVFJPTF8gIyMgbmFtZSwgdmFsKQorCisjZGVmaW5lIFNDVV9QVFNHQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1BUU0dfQ09OVFJPTF8gIyMgbmFtZSkKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfUFRTR19SRUFMX1RJTUVfQ0xPQ0tfU0hJRlQgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19NQVNLICAgICAgICAgICAoMHgwMDAwRkZGRikKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX1JFU0VSVkVEX01BU0sgICgweEZGRkYwMDAwKQorCisjZGVmaW5lIFNDVV9SVENSX0dFTl9WQUwobmFtZSwgdmFsKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfUFRTR18gIyMgbmFtZSwgdmFsKQorCisKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX0NPTlRST0xfUFJFU0NBTEVSX1ZBTFVFX1NISUZUICAoMCkKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX0NPTlRST0xfUFJFU0NBTEVSX1ZBTFVFX01BU0sgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAoMHhGRjAwMDAwMCkKKworI2RlZmluZSBTQ1VfUlRDQ1JfR0VOX1ZBTChuYW1lLCB2YWwpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19DT05UUk9MXyAjIyBuYW1lLCB2YWwpCisKKworI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfU1VTUEVORF9TSElGVCAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF9TVVNQRU5EX01BU0sgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU0NVX1BUU0dfUE9SVF9UQVNLX1NDSEVEVUxFUl9DT05UUk9MX0VOQUJMRV9TSElGVCAgICgxKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfRU5BQkxFX01BU0sgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAoMHhGRkZGRkZGQykKKworI2RlZmluZSBTQ1VfUFRTeENSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF8gIyMgbmFtZSkKKworCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX05FWFRfUk5fVkFMSURfU0hJRlQgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX05FWFRfUk5fVkFMSURfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX0FDVElWRV9STlNDX0xJU1RfVkFMSURfU0hJRlQgICAgKDEpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX0FDVElWRV9STlNDX0xJU1RfVkFMSURfTUFTSyAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX1BUU19TVVNQRU5ERURfU0hJRlQgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX1BUU19TVVNQRU5ERURfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgKDB4RkZGRkZGRjgpCisKKyNkZWZpbmUgU0NVX1BUU3hTUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU18gIyMgbmFtZSkKKworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0dQSU8gUmVnaXN0ZXIgc2hpZnQgYW5kIG1hc2sgdmFsdWVzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfQ0xPQ0tfU0VMRUNUX1NISUZUICAgICAgICgxKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfQ0xPQ0tfU0VMRUNUX01BU0sgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfU0hJRlRfV0lEVEhfU0VMRUNUX1NISUZUICgyKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfU0hJRlRfV0lEVEhfU0VMRUNUX01BU0sgICgweDAwMDAwMDA0KQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19URVNUX0JJVF9TSElGVCAgICAgICAgICAgICAgICAgICgxNSkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fVEVTVF9CSVRfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAoMHhGRkZGN0ZGOCkKKworI2RlZmluZSBTQ1VfU0dJQ1J4X0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9TR1BJT19DT05UUk9MX1NHUElPXyAjIyBuYW1lKQorCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjBfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMF9NQVNLICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IxX1NISUZUICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjFfTUFTSyAgICAgICAoMHgwMDAwMDBGMCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMl9TSElGVCAgICAgICg4KQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IyX01BU0sgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjNfU0hJRlQgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjNfTUFTSyAgICAgICAoMHgwMDAwRjAwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SRVNFUlZFRF9NQVNLICgweEZGRkYwMDAwKQorCisjZGVmaW5lIFNDVV9TR1BCUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IwX1NISUZUICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IwX01BU0sgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IxX1NISUZUICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IxX01BU0sgICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IyX1NISUZUICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IyX01BU0sgICAgICAgICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IzX1NISUZUICAgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SM19NQVNLICAgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SRVNFUlZFRF9NQVNLICAgKDB4RkZGRjg4ODgpCisKKyNkZWZpbmUgU0NVX1NHU0RMUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjBfU0hJRlQgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjBfTUFTSyAgICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjFfU0hJRlQgICAgICAgICg0KQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjFfTUFTSyAgICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjJfU0hJRlQgICAgICAgICg4KQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjJfTUFTSyAgICAgICAgICgweDAwMDAwMzAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjNfU0hJRlQgICAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IzX01BU0sgICAgICAgICAoMHgwMDAwMzAwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1JFU0VSVkVEX01BU0sgICAoMHhGRkZGODg4OCkKKworI2RlZmluZSBTQ1VfU0dTRFVSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMF9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDBfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QxX1NISUZUICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMV9NQVNLICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDJfU0hJRlQgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QyX01BU0sgICAgICAgKDB4MDAwMDAzMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EM19TSElGVCAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QzX01BU0sgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9SRVNFUlZFRF9NQVNLICgweEZGRkY4ODg4KQorCisjZGVmaW5lIFNDVV9TR1NJRExSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMF9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDBfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QxX1NISUZUICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMV9NQVNLICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDJfU0hJRlQgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QyX01BU0sgICAgICAgKDB4MDAwMDAzMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EM19TSElGVCAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QzX01BU0sgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9SRVNFUlZFRF9NQVNLICgweEZGRkY4ODg4KQorCisjZGVmaW5lIFNDVV9TR1NJRFVSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19WRU5ET1JfU1BFQ0lGSUNfQ09ERV9TSElGVCAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREVfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwRikKKyNkZWZpbmUgU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFX1JFU0VSVkVEX01BU0sgICAgKDB4RkZGRkZGRjApCisKKyNkZWZpbmUgU0NVX1NHVlNDUl9HRU5fVkFMKHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREUgIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEwX1NISUZUICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEwX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMF9TSElGVCAgICAoMikKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMF9NQVNLICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTBfU0hJRlQgICAgICAoMykKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTBfTUFTSyAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEExX1NISUZUICAgICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEExX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMV9TSElGVCAgICAoNikKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMV9NQVNLICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTFfU0hJRlQgICAgICAoNykKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTFfTUFTSyAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEyX1NISUZUICAgICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEyX01BU0sgICAgICAgICAgICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMl9TSElGVCAgICAoMTApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTJfTUFTSyAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEyX1NISUZUICAgICAgKDExKQorI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSk9HX0VOQUJMRV9EQVRBMl9NQVNLICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICgweEZGRkZGMDAwKQorCisjZGVmaW5lIFNDVV9TR09EU1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dPRFNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF8gIyMgbmFtZSkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIFNNVSBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTTVUgUmVnaXN0ZXJzCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIGJhc2VkIG9mZiBvZiBCQVIwCisgKgorICogVG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIG90aGVyIGZ1bmN0aW9ucyB1c2UKKyAqICAgICAgIEJBUjAgKyBGTiMgKiBTeXN0ZW1QYWdlU2l6ZSAqIDIKKyAqCisgKiBUaGUgVENBIGlzIG9ubHkgYWNjZXNzYWJsZSBmcm9tIEZOIzAgKFBoeXNpY2FsIEZ1bmN0aW9uKSBhbmQgZWFjaAorICogaXMgcHJvZ3JhbW1lZCBieSAoQkFSMCArIFNDVV9TTVVfVENBX09GRlNFVCArIChGTiMgKiAweDA0KSkgb3IKKyAqICAgIFRDQTAgZm9yIEZOIzAgaXMgYXQgQkFSMCArIDB4MDQwMAorICogICAgVENBMSBmb3IgRk4jMSBpcyBhdCBCQVIwICsgMHgwNDA0CisgKiAgICBldGMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBY2Nlc3NhYmxlIHRvIGFsbCBGTiNzICovCisjZGVmaW5lIFNDVV9TTVVfUENQX09GRlNFVCAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1NNVV9BTVJfT0ZGU0VUICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTQ1VfU01VX0lTUl9PRkZTRVQgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9TTVVfSU1SX09GRlNFVCAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1NNVV9JQ0NfT0ZGU0VUICAgICAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfU01VX0hUVExCQVJfT0ZGU0VUICAgICAgMHgwMDIwCisjZGVmaW5lIFNDVV9TTVVfSFRUVUJBUl9PRkZTRVQgICAgICAweDAwMjQKKyNkZWZpbmUgU0NVX1NNVV9UQ1JfT0ZGU0VUICAgICAgICAgIDB4MDAyOAorI2RlZmluZSBTQ1VfU01VX0NRTEJBUl9PRkZTRVQgICAgICAgMHgwMDMwCisjZGVmaW5lIFNDVV9TTVVfQ1FVQkFSX09GRlNFVCAgICAgICAweDAwMzQKKyNkZWZpbmUgU0NVX1NNVV9DUVBSX09GRlNFVCAgICAgICAgIDB4MDA0MAorI2RlZmluZSBTQ1VfU01VX0NRR1JfT0ZGU0VUICAgICAgICAgMHgwMDQ0CisjZGVmaW5lIFNDVV9TTVVfQ1FDX09GRlNFVCAgICAgICAgICAweDAwNDgKKy8qIEFjY2Vzc2FibGUgdG8gRk4jMCBvbmx5ICovCisjZGVmaW5lIFNDVV9TTVVfUk5DTEJBUl9PRkZTRVQgICAgICAweDAwODAKKyNkZWZpbmUgU0NVX1NNVV9STkNVQkFSX09GRlNFVCAgICAgIDB4MDA4NAorI2RlZmluZSBTQ1VfU01VX0RDQ19PRkZTRVQgICAgICAgICAgMHgwMDkwCisjZGVmaW5lIFNDVV9TTVVfREZDX09GRlNFVCAgICAgICAgICAweDAwOTQKKyNkZWZpbmUgU0NVX1NNVV9TTVVDU1JfT0ZGU0VUICAgICAgIDB4MDA5OAorI2RlZmluZSBTQ1VfU01VX1NDVVNSQ1JfT0ZGU0VUICAgICAgMHgwMDlDCisjZGVmaW5lIFNDVV9TTVVfU01BV19PRkZTRVQgICAgICAgICAweDAwQTAKKyNkZWZpbmUgU0NVX1NNVV9TTURXX09GRlNFVCAgICAgICAgIDB4MDBBNAorLyogQWNjZXNzYWJsZSB0byBGTiMwIG9ubHkgKi8KKyNkZWZpbmUgU0NVX1NNVV9UQ0FfT0ZGU0VUICAgICAgICAgIDB4MDQwMAorLyogQWNjZXNzYWJsZSB0byBhbGwgRk4jcyAqLworI2RlZmluZSBTQ1VfU01VX01UX01MQVIwX09GRlNFVCAgICAgMHgyMDAwCisjZGVmaW5lIFNDVV9TTVVfTVRfTVVBUjBfT0ZGU0VUICAgICAweDIwMDQKKyNkZWZpbmUgU0NVX1NNVV9NVF9NRFIwX09GRlNFVCAgICAgIDB4MjAwOAorI2RlZmluZSBTQ1VfU01VX01UX1ZDUjBfT0ZGU0VUICAgICAgMHgyMDBDCisjZGVmaW5lIFNDVV9TTVVfTVRfTUxBUjFfT0ZGU0VUICAgICAweDIwMTAKKyNkZWZpbmUgU0NVX1NNVV9NVF9NVUFSMV9PRkZTRVQgICAgIDB4MjAxNAorI2RlZmluZSBTQ1VfU01VX01UX01EUjFfT0ZGU0VUICAgICAgMHgyMDE4CisjZGVmaW5lIFNDVV9TTVVfTVRfVkNSMV9PRkZTRVQgICAgICAweDIwMUMKKyNkZWZpbmUgU0NVX1NNVV9NUEJBX09GRlNFVCAgICAgICAgIDB4MzAwMAorCisvKioKKyAqIHN0cnVjdCBzbXVfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBTTVUgcmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNtdV9yZWdpc3RlcnMgeworLyogMHgwMDAwIFBDUCAqLworCXUzMiBwb3N0X2NvbnRleHRfcG9ydDsKKy8qIDB4MDAwNCBBTVIgKi8KKwl1MzIgYWRkcmVzc19tb2RpZmllcjsKKwl1MzIgcmVzZXJ2ZWRfMDg7CisJdTMyIHJlc2VydmVkXzBDOworLyogMHgwMDEwIElTUiAqLworCXUzMiBpbnRlcnJ1cHRfc3RhdHVzOworLyogMHgwMDE0IElNUiAqLworCXUzMiBpbnRlcnJ1cHRfbWFzazsKKy8qIDB4MDAxOCBJQ0MgKi8KKwl1MzIgaW50ZXJydXB0X2NvYWxlc2NlX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzFDOworLyogMHgwMDIwIEhUVExCQVIgKi8KKwl1MzIgaG9zdF90YXNrX3RhYmxlX2xvd2VyOworLyogMHgwMDI0IEhUVFVCQVIgKi8KKwl1MzIgaG9zdF90YXNrX3RhYmxlX3VwcGVyOworLyogMHgwMDI4IFRDUiAqLworCXUzMiB0YXNrX2NvbnRleHRfcmFuZ2U7CisJdTMyIHJlc2VydmVkXzJDOworLyogMHgwMDMwIENRTEJBUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2xvd2VyOworLyogMHgwMDM0IENRVUJBUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX3VwcGVyOworCXUzMiByZXNlcnZlZF8zODsKKwl1MzIgcmVzZXJ2ZWRfM0M7CisvKiAweDAwNDAgQ1FQUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX3B1dDsKKy8qIDB4MDA0NCBDUUdSICovCisJdTMyIGNvbXBsZXRpb25fcXVldWVfZ2V0OworLyogMHgwMDQ4IENRQyAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzRDOworCXUzMiByZXNlcnZlZF81eFs0XTsKKwl1MzIgcmVzZXJ2ZWRfNnhbNF07CisJdTMyIHJlc2VydmVkXzd4WzRdOworLyoKKyAqIEFjY2Vzc2FibGUgdG8gRk4jMCBvbmx5CisgKiAweDAwODAgUk5DTEJBUiAqLworCXUzMiByZW1vdGVfbm9kZV9jb250ZXh0X2xvd2VyOworLyogMHgwMDg0IFJOQ1VCQVIgKi8KKwl1MzIgcmVtb3RlX25vZGVfY29udGV4dF91cHBlcjsKKwl1MzIgcmVzZXJ2ZWRfODg7CisJdTMyIHJlc2VydmVkXzhDOworLyogMHgwMDkwIERDQyAqLworCXUzMiBkZXZpY2VfY29udGV4dF9jYXBhY2l0eTsKKy8qIDB4MDA5NCBERkMgKi8KKwl1MzIgZGV2aWNlX2Z1bmN0aW9uX2NhcGFjaXR5OworLyogMHgwMDk4IFNNVUNTUiAqLworCXUzMiBjb250cm9sX3N0YXR1czsKKy8qIDB4MDA5QyBTQ1VTUkNSICovCisJdTMyIHNvZnRfcmVzZXRfY29udHJvbDsKKy8qIDB4MDBBMCBTTUFXICovCisJdTMyIG1tcl9hZGRyZXNzX3dpbmRvdzsKKy8qIDB4MDBBNCBTTURXICovCisJdTMyIG1tcl9kYXRhX3dpbmRvdzsKKwl1MzIgcmVzZXJ2ZWRfQTg7CisJdTMyIHJlc2VydmVkX0FDOworLyogQSB3aG9sZSBidW5jaCBvZiByZXNlcnZlZCBzcGFjZSAqLworCXUzMiByZXNlcnZlZF9CeFs0XTsKKwl1MzIgcmVzZXJ2ZWRfQ3hbNF07CisJdTMyIHJlc2VydmVkX0R4WzRdOworCXUzMiByZXNlcnZlZF9FeFs0XTsKKwl1MzIgcmVzZXJ2ZWRfRnhbNF07CisJdTMyIHJlc2VydmVkXzF4eFs2NF07CisJdTMyIHJlc2VydmVkXzJ4eFs2NF07CisJdTMyIHJlc2VydmVkXzN4eFs2NF07CisvKgorICogQWNjZXNzYWJsZSB0byBGTiMwIG9ubHkKKyAqIDB4MDQwMCBUQ0EgKi8KKwl1MzIgdGFza19jb250ZXh0X2Fzc2lnbm1lbnRbMjU2XTsKKy8qIE1TSS1YIHJlZ2lzdGVycyBub3QgaW5jbHVkZWQgKi8KK307CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0RNQSBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9TRE1BX0JBU0UgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgU0NVX1NETUFfUFVGQVRMSEFSX09GRlNFVCAgIDB4MDAwMAorI2RlZmluZSBTQ1VfU0RNQV9QVUZBVFVIQVJfT0ZGU0VUICAgMHgwMDA0CisjZGVmaW5lIFNDVV9TRE1BX1VGTEhCQVJfT0ZGU0VUICAgICAweDAwMDgKKyNkZWZpbmUgU0NVX1NETUFfVUZVSEJBUl9PRkZTRVQgICAgIDB4MDAwQworI2RlZmluZSBTQ1VfU0RNQV9VRlFDX09GRlNFVCAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9TRE1BX1VGUVBQX09GRlNFVCAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1NETUFfVUZRR1BfT0ZGU0VUICAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfU0RNQV9QRE1BQ1JfT0ZGU0VUICAgICAgMHgwMDFDCisjZGVmaW5lIFNDVV9TRE1BX0NETUFDUl9PRkZTRVQgICAgICAweDAwODAKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3NkbWFfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBTQ1UgU0RNQSBSZWdpc3RlcnMKKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3NkbWFfcmVnaXN0ZXJzIHsKKy8qIDB4MDAwMCBQVUZBVExIQVIgKi8KKwl1MzIgdWZfYWRkcmVzc190YWJsZV9sb3dlcjsKKy8qIDB4MDAwNCBQVUZBVFVIQVIgKi8KKwl1MzIgdWZfYWRkcmVzc190YWJsZV91cHBlcjsKKy8qIDB4MDAwOCBVRkxIQkFSICovCisJdTMyIHVmX2hlYWRlcl9iYXNlX2FkZHJlc3NfbG93ZXI7CisvKiAweDAwMEMgVUZVSEJBUiAqLworCXUzMiB1Zl9oZWFkZXJfYmFzZV9hZGRyZXNzX3VwcGVyOworLyogMHgwMDEwIFVGUUMgKi8KKwl1MzIgdW5zb2xpY2l0ZWRfZnJhbWVfcXVldWVfY29udHJvbDsKKy8qIDB4MDAxNCBVRlFQUCAqLworCXUzMiB1bnNvbGljaXRlZF9mcmFtZV9wdXRfcG9pbnRlcjsKKy8qIDB4MDAxOCBVRlFHUCAqLworCXUzMiB1bnNvbGljaXRlZF9mcmFtZV9nZXRfcG9pbnRlcjsKKy8qIDB4MDAxQyBQRE1BQ1IgKi8KKwl1MzIgcGRtYV9jb25maWd1cmF0aW9uOworLyogUmVzZXJ2ZWQgdW50aWwgb2Zmc2V0IDB4ODAgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAyMF8wMDdDWzB4MThdOworLyogMHgwMDgwIENETUFDUiAqLworCXUzMiBjZG1hX2NvbmZpZ3VyYXRpb247CisvKiBSZW1haW5kZXIgU0RNQSByZWdpc3RlciBzcGFjZSAqLworCXUzMiByZXNlcnZlZF8wMDg0XzA0MDBbMHhERl07CisKK307CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBTQ1UgTGluayBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9QRUcwX09GRlNFVCAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1BFRzFfT0ZGU0VUICAgIDB4ODAwMAorCisjZGVmaW5lIFNDVV9UTDBfT0ZGU0VUICAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1RMMV9PRkZTRVQgICAgIDB4MDQwMAorI2RlZmluZSBTQ1VfVEwyX09GRlNFVCAgICAgMHgwODAwCisjZGVmaW5lIFNDVV9UTDNfT0ZGU0VUICAgICAweDBDMDAKKworI2RlZmluZSBTQ1VfTExfT0ZGU0VUICAgICAgMHgwMDgwCisjZGVmaW5lIFNDVV9MTDBfT0ZGU0VUICAgICAoU0NVX1RMMF9PRkZTRVQgKyBTQ1VfTExfT0ZGU0VUKQorI2RlZmluZSBTQ1VfTEwxX09GRlNFVCAgICAgKFNDVV9UTDFfT0ZGU0VUICsgU0NVX0xMX09GRlNFVCkKKyNkZWZpbmUgU0NVX0xMMl9PRkZTRVQgICAgIChTQ1VfVEwyX09GRlNFVCArIFNDVV9MTF9PRkZTRVQpCisjZGVmaW5lIFNDVV9MTDNfT0ZGU0VUICAgICAoU0NVX1RMM19PRkZTRVQgKyBTQ1VfTExfT0ZGU0VUKQorCisvKiBUcmFuc3BvcnQgTGF5ZXIgT2Zmc2V0cyAoUEVHICsgVEwpICovCisjZGVmaW5lIFNDVV9UTENSX09GRlNFVCAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ1VfVExBRFRSX09GRlNFVCAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1RMVFRNUl9PRkZTRVQgICAgICAgMHgwMDA4CisjZGVmaW5lIFNDVV9UTEVFQ1IwX09GRlNFVCAgICAgIDB4MDAwQworI2RlZmluZSBTQ1VfU1RQVExEQVJOSV9PRkZTRVQgICAweDAwMTAKKworCisjZGVmaW5lIFNDVV9UTENSX0hBU0hfU0FTX0NIRUNLSU5HX0VOQUJMRV9TSElGVCAgICAoMCkKKyNkZWZpbmUgU0NVX1RMQ1JfSEFTSF9TQVNfQ0hFQ0tJTkdfRU5BQkxFX01BU0sgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfVExDUl9DTEVBUl9UQ0lfTkNRX01BUFBJTkdfVEFCTEVfU0hJRlQgKDEpCisjZGVmaW5lIFNDVV9UTENSX0NMRUFSX1RDSV9OQ1FfTUFQUElOR19UQUJMRV9NQVNLICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU0NVX1RMQ1JfU1RQX1dSSVRFX0RBVEFfUFJFRkVUQ0hfU0hJRlQgICAgICgzKQorI2RlZmluZSBTQ1VfVExDUl9TVFBfV1JJVEVfREFUQV9QUkVGRVRDSF9NQVNLICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIFNDVV9UTENSX0NNRF9OQUtfU1RBVFVTX0NPREVfU0hJRlQgICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1RMQ1JfQ01EX05BS19TVEFUVVNfQ09ERV9NQVNLICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBTQ1VfVExDUl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4RkZGRkZGRUIpCisKKyNkZWZpbmUgU0NVX1RMQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1RMQ1JfICMjIG5hbWUpCisKKy8qKgorICogc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBTQ1UgVHJhbnNwb3J0IExheWVyCisgKiAgICByZWdpc3RlcnMKKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3RyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgeworCS8qIDB4MDAwMCBUTENSICovCisJdTMyIGNvbnRyb2w7CisJLyogMHgwMDA0IFRMQURUUiAqLworCXUzMiBhcmJpdHJhdGlvbl9kZWxheV90aW1lcjsKKwkvKiAweDAwMDggVExUVE1SICovCisJdTMyIHRpbWVyX3Rlc3RfbW9kZTsKKwkvKiAweDAwMEMgcmVzZXJ2ZWQgKi8KKwl1MzIgcmVzZXJ2ZWRfMEM7CisJLyogMHgwMDEwIFNUUFRMREFSTkkgKi8KKwl1MzIgc3RwX3JuaTsKKwkvKiAweDAwMTQgVExGRVdQT1JDVFJMICovCisJdTMyIHRsZmVfd3BvX3JlYWRfY29udHJvbDsKKwkvKiAweDAwMTggVExGRVdQT1JEQVRBICovCisJdTMyIHRsZmVfd3BvX3JlYWRfZGF0YTsKKwkvKiAweDAwMUMgUlhUTFNTQ1NSMSAqLworCXUzMiByeHRsX3NpbmdsZV9zdGVwX2NvbnRyb2xfc3RhdHVzXzE7CisJLyogMHgwMDIwIFJYVExTU0NTUjIgKi8KKwl1MzIgcnh0bF9zaW5nbGVfc3RlcF9jb250cm9sX3N0YXR1c18yOworCS8qIDB4MDAyNCBBV1RSRERDUiAqLworCXUzMiB0bGZlX2F3dF9yZXRyeV9kZWxheV9kZWJ1Z19jb250cm9sOworCS8qIFJlbWFpbmRlciBvZiBUTCBtZW1vcnkgc3BhY2UgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAyOF8wMDdGWzB4MTZdOworCit9OworCisvKiBQcm90b2NvbCBFbmdpbmUgR3JvdXAgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNDVV9TQ1VWWkVDUnhfT0ZGU0VUICAgICAgICAweDEwODAKKworLyogTGluayBMYXllciBPZmZzZXRzIChQRUcgKyBUTCArIExMKSAqLworI2RlZmluZSBTQ1VfU0FTX1NQRFRPVl9PRkZTRVQgICAgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9TQVNfTExTVEFfT0ZGU0VUICAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1NBVEFfUFNFTFRPVl9PRkZTRVQgICAgIDB4MDAwOAorI2RlZmluZSBTQ1VfU0FTX1RJTUVUT1ZfT0ZGU0VUICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9TQVNfTE9TVE9UX09GRlNFVCAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1NBU19MTktUT1ZfT0ZGU0VUICAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfU0FTX1BIWVRPVl9PRkZTRVQgICAgICAgMHgwMDFDCisjZGVmaW5lIFNDVV9TQVNfQUZFUkNOVF9PRkZTRVQgICAgICAweDAwMjAKKyNkZWZpbmUgU0NVX1NBU19XRVJDTlRfT0ZGU0VUICAgICAgIDB4MDAyNAorI2RlZmluZSBTQ1VfU0FTX1RJSURfT0ZGU0VUICAgICAgICAgMHgwMDI4CisjZGVmaW5lIFNDVV9TQVNfVElETkhfT0ZGU0VUICAgICAgICAweDAwMkMKKyNkZWZpbmUgU0NVX1NBU19USUROTF9PRkZTRVQgICAgICAgIDB4MDAzMAorI2RlZmluZSBTQ1VfU0FTX1RJU1NBSF9PRkZTRVQgICAgICAgMHgwMDM0CisjZGVmaW5lIFNDVV9TQVNfVElTU0FMX09GRlNFVCAgICAgICAweDAwMzgKKyNkZWZpbmUgU0NVX1NBU19USVBJRF9PRkZTRVQgICAgICAgIDB4MDAzQworI2RlZmluZSBTQ1VfU0FTX1RJUkVTMl9PRkZTRVQgICAgICAgMHgwMDQwCisjZGVmaW5lIFNDVV9TQVNfQURSU1RBX09GRlNFVCAgICAgICAweDAwNDQKKyNkZWZpbmUgU0NVX1NBU19NQVdUVE9WX09GRlNFVCAgICAgIDB4MDA0OAorI2RlZmluZSBTQ1VfU0FTX0ZSUExERklMX09GRlNFVCAgICAgMHgwMDU0CisjZGVmaW5lIFNDVV9TQVNfUkZDTlRfT0ZGU0VUICAgICAgICAweDAwNjAKKyNkZWZpbmUgU0NVX1NBU19URkNOVF9PRkZTRVQgICAgICAgIDB4MDA2NAorI2RlZmluZSBTQ1VfU0FTX1JGRENOVF9PRkZTRVQgICAgICAgMHgwMDY4CisjZGVmaW5lIFNDVV9TQVNfVEZEQ05UX09GRlNFVCAgICAgICAweDAwNkMKKyNkZWZpbmUgU0NVX1NBU19MRVJDTlRfT0ZGU0VUICAgICAgIDB4MDA3MAorI2RlZmluZSBTQ1VfU0FTX1JESVNFUlJDTlRfT0ZGU0VUICAgMHgwMDc0CisjZGVmaW5lIFNDVV9TQVNfQ1JFUkNOVF9PRkZTRVQgICAgICAweDAwNzgKKyNkZWZpbmUgU0NVX1NUUENUTF9PRkZTRVQgICAgICAgICAgIDB4MDA3QworI2RlZmluZSBTQ1VfU0FTX1BDRkdfT0ZGU0VUICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFNDVV9TQVNfQ0xLU01fT0ZGU0VUICAgICAgICAweDAwODQKKyNkZWZpbmUgU0NVX1NBU19UWENPTVdBS0VfT0ZGU0VUICAgIDB4MDA4OAorI2RlZmluZSBTQ1VfU0FTX1RYQ09NSU5JVF9PRkZTRVQgICAgMHgwMDhDCisjZGVmaW5lIFNDVV9TQVNfVFhDT01TQVNfT0ZGU0VUICAgICAweDAwOTAKKyNkZWZpbmUgU0NVX1NBU19DT01JTklUX09GRlNFVCAgICAgIDB4MDA5NAorI2RlZmluZSBTQ1VfU0FTX0NPTVdBS0VfT0ZGU0VUICAgICAgMHgwMDk4CisjZGVmaW5lIFNDVV9TQVNfQ09NU0FTX09GRlNFVCAgICAgICAweDAwOUMKKyNkZWZpbmUgU0NVX1NBU19TRkVSQ05UX09GRlNFVCAgICAgIDB4MDBBMAorI2RlZmluZSBTQ1VfU0FTX0NERkVSQ05UX09GRlNFVCAgICAgMHgwMEE0CisjZGVmaW5lIFNDVV9TQVNfRE5GRVJDTlRfT0ZGU0VUICAgICAweDAwQTgKKyNkZWZpbmUgU0NVX1NBU19QUlNURVJDTlRfT0ZGU0VUICAgIDB4MDBBQworI2RlZmluZSBTQ1VfU0FTX0NOVENUTF9PRkZTRVQgICAgICAgMHgwMEIwCisjZGVmaW5lIFNDVV9TQVNfU1NQVE9WX09GRlNFVCAgICAgICAweDAwQjQKKyNkZWZpbmUgU0NVX0ZUQ1RMX09GRlNFVCAgICAgICAgICAgIDB4MDBCOAorI2RlZmluZSBTQ1VfRlJDVExfT0ZGU0VUICAgICAgICAgICAgMHgwMEJDCisjZGVmaW5lIFNDVV9GVFdNUktfT0ZGU0VUICAgICAgICAgICAweDAwQzAKKyNkZWZpbmUgU0NVX0VOU1BJTlVQX09GRlNFVCAgICAgICAgIDB4MDBDNAorI2RlZmluZSBTQ1VfU0FTX1RSTlRPVl9PRkZTRVQgICAgICAgMHgwMEM4CisjZGVmaW5lIFNDVV9TQVNfUEhZQ0FQX09GRlNFVCAgICAgICAweDAwQ0MKKyNkZWZpbmUgU0NVX1NBU19QSFlDVExfT0ZGU0VUICAgICAgIDB4MDBEMAorI2RlZmluZSBTQ1VfU0FTX0xMQ1RMX09GRlNFVCAgICAgICAgMHgwMEQ4CisjZGVmaW5lIFNDVV9BRkVfWENWUkNSX09GRlNFVCAgICAgICAweDAwREMKKyNkZWZpbmUgU0NVX0FGRV9MVVRDUl9PRkZTRVQgICAgICAgIDB4MDBFMAorCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjEgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfR0VOMiAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9HRU4zICAgICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9CUk9BRENBU1RfUFJJTUlUSVZFX1NISUZUICAgICAgICAgICAgKDIpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX0JST0FEQ0FTVF9QUklNSVRJVkVfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDNGQykKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQ0xPU0VfTk9fQUNUSVZFX1RBU0tfRElTQUJMRV9TSElGVCAgICgxNikKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQ0xPU0VfTk9fQUNUSVZFX1RBU0tfRElTQUJMRV9NQVNLICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9DTE9TRV9OT19PVVRCT1VORF9UQVNLX0RJU0FCTEVfU0hJRlQgKDE3KQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9DTE9TRV9OT19PVVRCT1VORF9UQVNLX0RJU0FCTEVfTUFTSyAgKDB4MDAwMjAwMDApCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX05PX09VVEJPVU5EX1RBU0tfVElNRU9VVF9TSElGVCAgICAgICAoMjQpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX05PX09VVEJPVU5EX1RBU0tfVElNRU9VVF9NQVNLICAgICAgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwRkNGQzAwKQorCisjZGVmaW5lIFNDVV9TQVNfTExDVExfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfTExDVExfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfICMjIG5hbWUpCisKKworLyogI2RlZmluZSBTQ1VfRlJYSEVDUl9EQ05UX09GRlNFVCAgICAgIDB4MDBCMCAqLworI2RlZmluZSBTQ1VfUFNaR0NSX09GRlNFVCAgICAgICAgICAgMHgwMEU0CisjZGVmaW5lIFNDVV9TQVNfUkVDUEhZQ0FQX09GRlNFVCAgICAweDAwRTgKKy8qICNkZWZpbmUgU0NVX1RYX0xVVFNFTF9PRkZTRVQgICAgICAgICAweDAwQjggKi8KKworI2RlZmluZSBTQ1VfU0FTX1BUeENfT0ZGU0VUICAgICAgICAgMHgwMEQ0IC8qIFNhbWUgb2Zmc2V0IGFzIFNBU19UQ1RTVE0gKi8KKworLyoqCisgKiBzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIC0gU0NVIExpbmsgTGF5ZXIgUmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNjdV9saW5rX2xheWVyX3JlZ2lzdGVycyB7CisvKiAweDAwMDAgU0FTX1NQRFRPViAqLworCXUzMiBzcGVlZF9uZWdvdGlhdGlvbl90aW1lcnM7CisvKiAweDAwMDQgU0FTX0xMU1RBICovCisJdTMyIGxpbmtfbGF5ZXJfc3RhdHVzOworLyogMHgwMDA4IFNBVEFfUFNFTFRPViAqLworCXUzMiBwb3J0X3NlbGVjdG9yX3RpbWVvdXQ7CisJdTMyIHJlc2VydmVkMEM7CisvKiAweDAwMTAgU0FTX1RJTUVUT1YgKi8KKwl1MzIgdGltZW91dF91bml0X3ZhbHVlOworLyogMHgwMDE0IFNBU19SQ0RUT1YgKi8KKwl1MzIgcmNkX3RpbWVvdXQ7CisvKiAweDAwMTggU0FTX0xOS1RPViAqLworCXUzMiBsaW5rX3RpbWVyX3RpbWVvdXRzOworLyogMHgwMDFDIFNBU19QSFlUT1YgKi8KKwl1MzIgc2FzX3BoeV90aW1lb3V0czsKKy8qIDB4MDAyMCBTQVNfQUZFUkNOVCAqLworCXUzMiByZWNlaXZlZF9hZGRyZXNzX2ZyYW1lX2Vycm9yX2NvdW50ZXI7CisvKiAweDAwMjQgU0FTX1dFUkNOVCAqLworCXUzMiBpbnZhbGlkX2R3b3JkX2NvdW50ZXI7CisvKiAweDAwMjggU0FTX1RJSUQgKi8KKwl1MzIgdHJhbnNtaXRfaWRlbnRpZmljYXRpb247CisvKiAweDAwMkMgU0FTX1RJRE5IICovCisJdTMyIHNhc19kZXZpY2VfbmFtZV9oaWdoOworLyogMHgwMDMwIFNBU19USUROTCAqLworCXUzMiBzYXNfZGV2aWNlX25hbWVfbG93OworLyogMHgwMDM0IFNBU19USVNTQUggKi8KKwl1MzIgc291cmNlX3Nhc19hZGRyZXNzX2hpZ2g7CisvKiAweDAwMzggU0FTX1RJU1NBTCAqLworCXUzMiBzb3VyY2Vfc2FzX2FkZHJlc3NfbG93OworLyogMHgwMDNDIFNBU19USVBJRCAqLworCXUzMiBpZGVudGlmeV9mcmFtZV9waHlfaWQ7CisvKiAweDAwNDAgU0FTX1RJUkVTMiAqLworCXUzMiBpZGVudGlmeV9mcmFtZV9yZXNlcnZlZDsKKy8qIDB4MDA0NCBTQVNfQURSU1RBICovCisJdTMyIHJlY2VpdmVkX2FkZHJlc3NfZnJhbWU7CisvKiAweDAwNDggU0FTX01BV1RUT1YgKi8KKwl1MzIgbWF4aW11bV9hcmJpdHJhdGlvbl93YWl0X3RpbWVyX3RpbWVvdXQ7CisvKiAweDAwNEMgU0FTX1BUeEMgKi8KKwl1MzIgdHJhbnNtaXRfcHJpbWl0aXZlOworLyogMHgwMDUwIFNBU19ST1JFUyAqLworCXUzMiBlcnJvcl9jb3VudGVyX2V2ZW50X25vdGlmaWNhdGlvbl9jb250cm9sOworLyogMHgwMDU0IFNBU19GUlBMREZJTCAqLworCXUzMiBmcnhxX3BheWxvYWRfZmlsbF90aHJlc2hvbGQ7CisvKiAweDAwNTggU0FTX0xMSEFOR19UT1QgKi8KKwl1MzIgbGlua19sYXllcl9oYW5nX2RldGVjdGlvbl90aW1lb3V0OworCXUzMiByZXNlcnZlZF81QzsKKy8qIDB4MDA2MCBTQVNfUkZDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZnJhbWVfY291bnQ7CisvKiAweDAwNjQgU0FTX1RGQ05UICovCisJdTMyIHRyYW5zbWl0X2ZyYW1lX2NvdW50OworLyogMHgwMDY4IFNBU19SRkRDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZHdvcmRfY291bnQ7CisvKiAweDAwNkMgU0FTX1RGRENOVCAqLworCXUzMiB0cmFuc21pdF9kd29yZF9jb3VudDsKKy8qIDB4MDA3MCBTQVNfTEVSQ05UICovCisJdTMyIGxvc3Nfb2Zfc3luY19lcnJvcl9jb3VudDsKKy8qIDB4MDA3NCBTQVNfUkRJU0VSUkNOVCAqLworCXUzMiBydW5uaW5nX2Rpc3Bhcml0eV9lcnJvcl9jb3VudDsKKy8qIDB4MDA3OCBTQVNfQ1JFUkNOVCAqLworCXUzMiByZWNlaXZlZF9mcmFtZV9jcmNfZXJyb3JfY291bnQ7CisvKiAweDAwN0MgU1RQQ1RMICovCisJdTMyIHN0cF9jb250cm9sOworLyogMHgwMDgwIFNBU19QQ0ZHICovCisJdTMyIHBoeV9jb25maWd1cmF0aW9uOworLyogMHgwMDg0IFNBU19DTEtTTSAqLworCXUzMiBjbG9ja19za2V3X21hbmFnZW1lbnQ7CisvKiAweDAwODggU0FTX1RYQ09NV0FLRSAqLworCXUzMiB0cmFuc21pdF9jb213YWtlX3NpZ25hbDsKKy8qIDB4MDA4QyBTQVNfVFhDT01JTklUICovCisJdTMyIHRyYW5zbWl0X2NvbWluaXRfc2lnbmFsOworLyogMHgwMDkwIFNBU19UWENPTVNBUyAqLworCXUzMiB0cmFuc21pdF9jb21zYXNfc2lnbmFsOworLyogMHgwMDk0IFNBU19DT01JTklUICovCisJdTMyIGNvbWluaXRfY29udHJvbDsKKy8qIDB4MDA5OCBTQVNfQ09NV0FLRSAqLworCXUzMiBjb213YWtlX2NvbnRyb2w7CisvKiAweDAwOUMgU0FTX0NPTVNBUyAqLworCXUzMiBjb21zYXNfY29udHJvbDsKKy8qIDB4MDBBMCBTQVNfU0ZFUkNOVCAqLworCXUzMiByZWNlaXZlZF9zaG9ydF9mcmFtZV9jb3VudDsKKy8qIDB4MDBBNCBTQVNfQ0RGRVJDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZnJhbWVfd2l0aG91dF9jcmVkaXRfY291bnQ7CisvKiAweDAwQTggU0FTX0RORkVSQ05UICovCisJdTMyIHJlY2VpdmVkX2ZyYW1lX2FmdGVyX2RvbmVfY291bnQ7CisvKiAweDAwQUMgU0FTX1BSU1RFUkNOVCAqLworCXUzMiBwaHlfcmVzZXRfcHJvYmxlbV9jb3VudDsKKy8qIDB4MDBCMCBTQVNfQ05UQ1RMICovCisJdTMyIGNvdW50ZXJfY29udHJvbDsKKy8qIDB4MDBCNCBTQVNfU1NQVE9WICovCisJdTMyIHNzcF90aW1lcl90aW1lb3V0X3ZhbHVlczsKKy8qIDB4MDBCOCBGVENUTCAqLworCXUzMiBmdHhfY29udHJvbDsKKy8qIDB4MDBCQyBGUkNUTCAqLworCXUzMiBmcnhfY29udHJvbDsKKy8qIDB4MDBDMCBGVFdNUksgKi8KKwl1MzIgZnR4X3dhdGVybWFyazsKKy8qIDB4MDBDNCBFTlNQSU5VUCAqLworCXUzMiBub3RpZnlfZW5hYmxlX3NwaW51cF9jb250cm9sOworLyogMHgwMEM4IFNBU19UUk5UT1YgKi8KKwl1MzIgc2FzX3RyYWluaW5nX3NlcXVlbmNlX3RpbWVyX3ZhbHVlczsKKy8qIDB4MDBDQyBTQVNfUEhZQ0FQICovCisJdTMyIHBoeV9jYXBhYmlsaXRpZXM7CisvKiAweDAwRDAgU0FTX1BIWUNUTCAqLworCXUzMiBwaHlfY29udHJvbDsKKwl1MzIgcmVzZXJ2ZWRfZDQ7CisvKiAweDAwRDggTExDVEwgKi8KKwl1MzIgbGlua19sYXllcl9jb250cm9sOworLyogMHgwMERDIEFGRV9YQ1ZSQ1IgKi8KKwl1MzIgYWZlX3hjdnJfY29udHJvbDsKKy8qIDB4MDBFMCBBRkVfTFVUQ1IgKi8KKwl1MzIgYWZlX2xvb2t1cF90YWJsZV9jb250cm9sOworLyogMHgwMEU0IFBTWkdDUiAqLworCXUzMiBwaHlfc291cmNlX3pvbmVfZ3JvdXBfY29udHJvbDsKKy8qIDB4MDBFOCBTQVNfUkVDUEhZQ0FQICovCisJdTMyIHJlY2VpdmVfcGh5Y2FwOworCXUzMiByZXNlcnZlZF9lYzsKKy8qIDB4MDBGMCBTTkFGRVJYUlNUQ1RMICovCisJdTMyIHNwZWVkX25lZ290aWF0aW9uX2FmZV9yeF9yZXNldF9jb250cm9sOworLyogMHgwMEY0IFNBU19TU0lQTUNUTCAqLworCXUzMiBwb3dlcl9tYW5hZ2VtZW50X2NvbnRyb2w7CisvKiAweDAwRjggU0FTX1BTUFJFUV9QUklNICovCisJdTMyIHNhc19wbV9wYXJ0aWFsX3JlcXVlc3RfcHJpbWl0aXZlOworLyogMHgwMEZDIFNBU19QU1NSRVFfUFJJTSAqLworCXUzMiBzYXNfcG1fc2x1bWJlcl9yZXF1ZXN0X3ByaW1pdGl2ZTsKKy8qIDB4MDEwMCBTQVNfUFBTQUNLX1BSSU0gKi8KKwl1MzIgc2FzX3BtX2Fja19wcmltaXRpdmVfcmVnaXN0ZXI7CisvKiAweDAxMDQgU0FTX1BTTkFLX1BSSU0gKi8KKwl1MzIgc2FzX3BtX25ha19wcmltaXRpdmVfcmVnaXN0ZXI7CisvKiAweDAxMDggU0FTX1NTSVBNVE9WICovCisJdTMyIHNhc19wcmltaXRpdmVfdGltZW91dDsKKwl1MzIgcmVzZXJ2ZWRfMTBjOworLyogMHgwMTEwIC0gMHgwMTFDIFBMQVBSRENUUkx4UkVHICovCisJdTMyIHBsYV9wcm9kdWN0X2NvbnRyb2xbNF07CisvKiAweDAxMjAgUExBUFJEU1VNUkVHICovCisJdTMyIHBsYV9wcm9kdWN0X3N1bTsKKy8qIDB4MDEyNCBQTEFDT05UUk9MUkVHICovCisJdTMyIHBsYV9jb250cm9sOworLyogUmVtYWluZGVyIG9mIG1lbW9yeSBzcGFjZSA4OTYgYnl0ZXMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDEyOF8wMzdmWzB4OTZdOworCit9OworCisvKgorICogMHgwMEQ0IC8vIFNhbWUgb2Zmc2V0IGFzIFNBU19UQ1RTVE0gU0FTX1BUeEMKKyAqICAgdTMyICAgcHJpbWl0aXZlX3RyYW5zbWl0X2NvbnRyb2w7ICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTR1BJTworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTQ1VfU0dQSU9fT0ZGU0VUICAgICAgICAgMHgxNDAwCisKKy8qICNkZWZpbmUgU0NVX1NHUElPX09GRlNFVCAgICAgICAgIDB4NjAwMCAgIC8vIGxhdGVyIG1vdmVzIHRvIDB4MTQwMCBzZWUgSFNEIDY1MjYyNSAqLworI2RlZmluZSBTQ1VfU0dQSU9fU0dJQ1JfT0ZGU0VUICAgMHgwMDAwCisjZGVmaW5lIFNDVV9TR1BJT19TR1BCUl9PRkZTRVQgICAweDAwMDQKKyNkZWZpbmUgU0NVX1NHUElPX1NHU0RMUl9PRkZTRVQgIDB4MDAwOAorI2RlZmluZSBTQ1VfU0dQSU9fU0dTRFVSX09GRlNFVCAgMHgwMDBDCisjZGVmaW5lIFNDVV9TR1BJT19TR1NJRExSX09GRlNFVCAweDAwMTAKKyNkZWZpbmUgU0NVX1NHUElPX1NHU0lEVVJfT0ZGU0VUIDB4MDAxNAorI2RlZmluZSBTQ1VfU0dQSU9fU0dWU0NSX09GRlNFVCAgMHgwMDE4CisvKiBBZGRyZXNzIGZyb20gMHgwODIwIHRvIDB4MDgzQyAqLworI2RlZmluZSBTQ1VfU0dQSU9fU0dPRFNSX09GRlNFVCAgMHgwMDIwCisKKy8qKgorICogc3RydWN0IHNjdV9zZ3Bpb19yZWdpc3RlcnMgLSBTQ1UgU0dQSU8gUmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNjdV9zZ3Bpb19yZWdpc3RlcnMgeworLyogMHgwMDAwIFNHUElPX1NHSUNSICovCisJdTMyIGludGVyZmFjZV9jb250cm9sOworLyogMHgwMDA0IFNHUElPX1NHUEJSICovCisJdTMyIGJsaW5rX3JhdGU7CisvKiAweDAwMDggU0dQSU9fU0dTRExSICovCisJdTMyIHN0YXJ0X2RyaXZlX2xvd2VyOworLyogMHgwMDBDIFNHUElPX1NHU0RVUiAqLworCXUzMiBzdGFydF9kcml2ZV91cHBlcjsKKy8qIDB4MDAxMCBTR1BJT19TR1NJRExSICovCisJdTMyIHNlcmlhbF9pbnB1dF9sb3dlcjsKKy8qIDB4MDAxNCBTR1BJT19TR1NJRFVSICovCisJdTMyIHNlcmlhbF9pbnB1dF91cHBlcjsKKy8qIDB4MDAxOCBTR1BJT19TR1ZTQ1IgKi8KKwl1MzIgdmVuZG9yX3NwZWNpZmljX2NvZGU7CisvKiAweDAwMjAgU0dQSU9fU0dPRFNSICovCisJdTMyIG91cHV0X2RhdGFfc2VsZWN0WzhdOworLyogUmVtYWluZGVyIG9mIG1lbW9yeSBzcGFjZSAyNTYgYnl0ZXMgKi8KKwl1MzIgcmVzZXJ2ZWRfMTQ0NF8xNGZmWzB4MzFdOworCit9OworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogRGVmaW5lcyBmb3IgVklJVCBlbnRyeSBvZmZzZXRzCisgKiAqIEFjY2VzcyBhZGRpdGlvbmFsIGVudHJpZXMgYnkgU0NVX1ZJSVRfQkFTRSArIGluZGV4ICogMHgxMAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgICAgIFNDVV9WSUlUX0JBU0UgICAgIDB4MWMwMAorCitzdHJ1Y3Qgc2N1X3ZpaXRfcmVnaXN0ZXJzIHsKKwl1MzIgcmVnaXN0ZXJzWzI1Nl07Cit9OworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0NVIFBPUlQgVEFTSyBTQ0hFRFVMRVIgUkVHSVNURVJTCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIFNDVV9QVFNHX0JBU0UgICAgICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBTQ1VfUFRTR19QVFNHQ1JfT0ZGU0VUICAgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9QVFNHX1JUQ1JfT0ZGU0VUICAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1BUU0dfUlRDQ1JfT0ZGU0VUICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ1VfUFRTR19QVFMwQ1JfT0ZGU0VUICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9QVFNHX1BUUzBTUl9PRkZTRVQgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1BUU0dfUFRTMUNSX09GRlNFVCAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfUFRTR19QVFMxU1JfT0ZGU0VUICAgICAgMHgwMDFDCisjZGVmaW5lIFNDVV9QVFNHX1BUUzJDUl9PRkZTRVQgICAgICAweDAwMjAKKyNkZWZpbmUgU0NVX1BUU0dfUFRTMlNSX09GRlNFVCAgICAgIDB4MDAyNAorI2RlZmluZSBTQ1VfUFRTR19QVFMzQ1JfT0ZGU0VUICAgICAgMHgwMDI4CisjZGVmaW5lIFNDVV9QVFNHX1BUUzNTUl9PRkZTRVQgICAgICAweDAwMkMKKyNkZWZpbmUgU0NVX1BUU0dfUENTUEUwQ1JfT0ZGU0VUICAgIDB4MDAzMAorI2RlZmluZSBTQ1VfUFRTR19QQ1NQRTFDUl9PRkZTRVQgICAgMHgwMDM0CisjZGVmaW5lIFNDVV9QVFNHX1BDU1BFMkNSX09GRlNFVCAgICAweDAwMzgKKyNkZWZpbmUgU0NVX1BUU0dfUENTUEUzQ1JfT0ZGU0VUICAgIDB4MDAzQworI2RlZmluZSBTQ1VfUFRTR19FVE1UU0NDUl9PRkZTRVQgICAgMHgwMDQwCisjZGVmaW5lIFNDVV9QVFNHX0VUTVJOU0NDUl9PRkZTRVQgICAweDAwNDQKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBjb250cm9sL3N0YXRzIHBhaXJzCisgKiAgICBmb3IgZWFjaCBQb3J0IFRhc2sgU2NoZWR1bGVyLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMgeworCXUzMiBjb250cm9sOworCXUzMiBzdGF0dXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgLSBUaGVzZSBhcmUgdGhlIFBPUlQgVGFzaworICogICAgU2NoZWR1bGVyIHJlZ2lzdGVycworICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgeworLyogMHgwMDAwIFBUU0dDUiAqLworCXUzMiBjb250cm9sOworLyogMHgwMDA0IFJUQ1IgKi8KKwl1MzIgcmVhbF90aW1lX2Nsb2NrOworLyogMHgwMDA4IFJUQ0NSICovCisJdTMyIHJlYWxfdGltZV9jbG9ja19jb250cm9sOworLyogMHgwMDBDICovCisJdTMyIHJlc2VydmVkXzBDOworLyoKKyAqIDB4MDAxMCBQVFMwQ1IKKyAqIDB4MDAxNCBQVFMwU1IKKyAqIDB4MDAxOCBQVFMxQ1IKKyAqIDB4MDAxQyBQVFMxU1IKKyAqIDB4MDAyMCBQVFMyQ1IKKyAqIDB4MDAyNCBQVFMyU1IKKyAqIDB4MDAyOCBQVFMzQ1IKKyAqIDB4MDAyQyBQVFMzU1IgKi8KKwlzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzIHBvcnRbNF07CisvKgorICogMHgwMDMwIFBDU1BFMENSCisgKiAweDAwMzQgUENTUEUxQ1IKKyAqIDB4MDAzOCBQQ1NQRTJDUgorICogMHgwMDNDIFBDU1BFM0NSICovCisJdTMyIHByb3RvY29sX2VuZ2luZVs0XTsKKy8qIDB4MDA0MCBFVE1UU0NDUiAqLworCXUzMiB0Y19zY2FubmluZ19pbnRlcnZhbF9jb250cm9sOworLyogMHgwMDQ0IEVUTVJOU0NDUiAqLworCXUzMiBybmNfc2Nhbm5pbmdfaW50ZXJ2YWxfY29udHJvbDsKKy8qIFJlbWFpbmRlciBvZiBtZW1vcnkgc3BhY2UgMTI4IGJ5dGVzICovCisJdTMyIHJlc2VydmVkXzEwNDhfMTA3ZlsweDBFXTsKKworfTsKKworI2RlZmluZSBTQ1VfUFRTR19TQ1VWWkVDUl9PRkZTRVQgICAgICAgIDB4MDAzQworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogQUZFIFJFR0lTVEVSUworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX0FGRV9NTVJfQkFTRSAgICAgICAgICAgICAgICAgIDB4RTAwMAorCisvKgorICogQUZFIDAgaXMgYXQgb2Zmc2V0IDB4MDgwMAorICogQUZFIDEgaXMgYXQgb2Zmc2V0IDB4MDkwMAorICogQUZFIDIgaXMgYXQgb2Zmc2V0IDB4MGEwMAorICogQUZFIDMgaXMgYXQgb2Zmc2V0IDB4MGIwMCAqLworc3RydWN0IHNjdV9hZmVfdHJhbnNjZWl2ZXIgeworCS8qIDB4MDAwMCBBRkVfWENWUl9DVFJMMCAqLworCXUzMiBhZmVfeGN2cl9jb250cm9sMDsKKwkvKiAweDAwMDQgQUZFX1hDVlJfQ1RSTDEgKi8KKwl1MzIgYWZlX3hjdnJfY29udHJvbDE7CisJLyogMHgwMDA4ICovCisJdTMyIHJlc2VydmVkXzAwMDg7CisJLyogMHgwMDBjIGFmZV9kZnhfcnhfY29udHJvbDAgKi8KKwl1MzIgYWZlX2RmeF9yeF9jb250cm9sMDsKKwkvKiAweDAwMTAgQUZFX0RGWF9SWF9DVFJMMSAqLworCXUzMiBhZmVfZGZ4X3J4X2NvbnRyb2wxOworCS8qIDB4MDAxNCAqLworCXUzMiByZXNlcnZlZF8wMDE0OworCS8qIDB4MDAxOCBBRkVfREZYX1JYX1NUUzAgKi8KKwl1MzIgYWZlX2RmeF9yeF9zdGF0dXMwOworCS8qIDB4MDAxYyBBRkVfREZYX1JYX1NUUzEgKi8KKwl1MzIgYWZlX2RmeF9yeF9zdGF0dXMxOworCS8qIDB4MDAyMCAqLworCXUzMiByZXNlcnZlZF8wMDIwOworCS8qIDB4MDAyNCBBRkVfVFhfQ1RSTCAqLworCXUzMiBhZmVfdHhfY29udHJvbDsKKwkvKiAweDAwMjggQUZFX1RYX0FNUF9DVFJMMCAqLworCXUzMiBhZmVfdHhfYW1wX2NvbnRyb2wwOworCS8qIDB4MDAyYyBBRkVfVFhfQU1QX0NUUkwxICovCisJdTMyIGFmZV90eF9hbXBfY29udHJvbDE7CisJLyogMHgwMDMwIEFGRV9UWF9BTVBfQ1RSTDIgKi8KKwl1MzIgYWZlX3R4X2FtcF9jb250cm9sMjsKKwkvKiAweDAwMzQgQUZFX1RYX0FNUF9DVFJMMyAqLworCXUzMiBhZmVfdHhfYW1wX2NvbnRyb2wzOworCS8qIDB4MDAzOCBhZmVfdHhfc3NjX2NvbnRyb2wgKi8KKwl1MzIgYWZlX3R4X3NzY19jb250cm9sOworCS8qIDB4MDAzYyAqLworCXUzMiByZXNlcnZlZF8wMDNjOworCS8qIDB4MDA0MCBBRkVfUlhfU1NDX0NUUkwwICovCisJdTMyIGFmZV9yeF9zc2NfY29udHJvbDA7CisJLyogMHgwMDQ0IEFGRV9SWF9TU0NfQ1RSTDEgKi8KKwl1MzIgYWZlX3J4X3NzY19jb250cm9sMTsKKwkvKiAweDAwNDggQUZFX1JYX1NTQ19DVFJMMiAqLworCXUzMiBhZmVfcnhfc3NjX2NvbnRyb2wyOworCS8qIDB4MDA0YyBBRkVfUlhfRVFfU1RTMCAqLworCXUzMiBhZmVfcnhfZXFfc3RhdHVzMDsKKwkvKiAweDAwNTAgQUZFX1JYX0VRX1NUUzEgKi8KKwl1MzIgYWZlX3J4X2VxX3N0YXR1czE7CisJLyogMHgwMDU0IEFGRV9SWF9DRFJfU1RTICovCisJdTMyIGFmZV9yeF9jZHJfc3RhdHVzOworCS8qIDB4MDA1OCAqLworCXUzMiByZXNlcnZlZF8wMDU4OworCS8qIDB4MDA1YyBBRkVfQ0hBTl9DVFJMICovCisJdTMyIGFmZV9jaGFubmVsX2NvbnRyb2w7CisJLyogMHgwMDYwLTB4MDA2YyAqLworCXUzMiByZXNlcnZlZF8wMDYwXzAwNmNbMHgwNF07CisJLyogMHgwMDcwIEFGRV9YQ1ZSX0VDX1NUUzAgKi8KKwl1MzIgYWZlX3hjdnJfZXJyb3JfY2FwdHVyZV9zdGF0dXMwOworCS8qIDB4MDA3NCBBRkVfWENWUl9FQ19TVFMxICovCisJdTMyIGFmZV94Y3ZyX2Vycm9yX2NhcHR1cmVfc3RhdHVzMTsKKwkvKiAweDAwNzggQUZFX1hDVlJfRUNfU1RTMiAqLworCXUzMiBhZmVfeGN2cl9lcnJvcl9jYXB0dXJlX3N0YXR1czI7CisJLyogMHgwMDdjIGFmZV94Y3ZyX2VjX3N0YXR1czMgKi8KKwl1MzIgYWZlX3hjdnJfZXJyb3JfY2FwdHVyZV9zdGF0dXMzOworCS8qIDB4MDA4MCBBRkVfWENWUl9FQ19TVFM0ICovCisJdTMyIGFmZV94Y3ZyX2Vycm9yX2NhcHR1cmVfc3RhdHVzNDsKKwkvKiAweDAwODQgQUZFX1hDVlJfRUNfU1RTNSAqLworCXUzMiBhZmVfeGN2cl9lcnJvcl9jYXB0dXJlX3N0YXR1czU7CisJLyogMHgwMDg4LTB4MDBmYyAqLworCXUzMiByZXNlcnZlZF8wMDhjXzAwZmNbMHgxZV07Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfYWZlX3JlZ2lzdGVycyAtIEFGRSBSZWdzaXRlcnMKKyAqCisgKgorICovCisvKiBVYW9hIEFGRSByZWdpc3RlcnMgKi8KK3N0cnVjdCBzY3VfYWZlX3JlZ2lzdGVycyB7CisJLyogMFhlMDAwIEFGRV9CSUFTX0NUUkwgKi8KKwl1MzIgYWZlX2JpYXNfY29udHJvbDsKKwl1MzIgcmVzZXJ2ZWRfMDAwNDsKKwkvKiAweDAwMDggQUZFX1BMTF9DVFJMMCAqLworCXUzMiBhZmVfcGxsX2NvbnRyb2wwOworCS8qIDB4MDAwYyBBRkVfUExMX0NUUkwxICovCisJdTMyIGFmZV9wbGxfY29udHJvbDE7CisJLyogMHgwMDEwIEFGRV9QTExfQ1RSTDIgKi8KKwl1MzIgYWZlX3BsbF9jb250cm9sMjsKKwkvKiAweDAwMTQgQUZFX0NCX1NUUyAqLworCXUzMiBhZmVfY29tbW9uX2Jsb2NrX3N0YXR1czsKKwkvKiAweDAwMTgtMHgwMDdjICovCisJdTMyIHJlc2VydmVkXzE4XzdjWzB4MWFdOworCS8qIDB4MDA4MCBBRkVfUE1TTl9NQ1RSTDAgKi8KKwl1MzIgYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wwOworCS8qIDB4MDA4NCBBRkVfUE1TTl9NQ1RSTDEgKi8KKwl1MzIgYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wxOworCS8qIDB4MDA4OCBBRkVfUE1TTl9NQ1RSTDIgKi8KKwl1MzIgYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wyOworCS8qIDB4MDA4Qy0weDAwZmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDA4Y18wMGZjWzB4MURdOworCS8qIDB4MDEwMCBBRkVfREZYX01TVF9DVFJMMCAqLworCXUzMiBhZmVfZGZ4X21hc3Rlcl9jb250cm9sMDsKKwkvKiAweDAxMDQgQUZFX0RGWF9NU1RfQ1RSTDEgKi8KKwl1MzIgYWZlX2RmeF9tYXN0ZXJfY29udHJvbDE7CisJLyogMHgwMTA4IEFGRV9ERlhfRENMX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9kY2xfY29udHJvbDsKKwkvKiAweDAxMGMgQUZFX0RGWF9ETU9OX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9kaWdpdGFsX21vbml0b3JfY29udHJvbDsKKwkvKiAweDAxMTAgQUZFX0RGWF9BTU9OUF9DVFJMICovCisJdTMyIGFmZV9kZnhfYW5hbG9nX3BfbW9uaXRvcl9jb250cm9sOworCS8qIDB4MDExNCBBRkVfREZYX0FNT05OX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9hbmFsb2dfbl9tb25pdG9yX2NvbnRyb2w7CisJLyogMHgwMTE4IEFGRV9ERlhfTlRMX1NUUyAqLworCXUzMiBhZmVfZGZ4X250bF9zdGF0dXM7CisJLyogMHgwMTFjIEFGRV9ERlhfRklGT19TVFMwICovCisJdTMyIGFmZV9kZnhfZmlmb19zdGF0dXMwOworCS8qIDB4MDEyMCBBRkVfREZYX0ZJRk9fU1RTMSAqLworCXUzMiBhZmVfZGZ4X2ZpZm9fc3RhdHVzMTsKKwkvKiAweDAxMjQgQUZFX0RGWF9NUEFUX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9tYXN0ZXJfcGF0dGVybl9jb250cm9sOworCS8qIDB4MDEyOCBBRkVfREZYX1AwX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9wMF9jb250cm9sOworCS8qIDB4MDEyYy0weDAxYTggQUZFX0RGWF9QMF9EUnggKi8KKwl1MzIgYWZlX2RmeF9wMF9kYXRhWzMyXTsKKwkvKiAweDAxYWMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDFhYzsKKwkvKiAweDAxYjAtMHgwMjBjIEFGRV9ERlhfUDBfSVJ4ICovCisJdTMyIGFmZV9kZnhfcDBfaW5zdHJ1Y3Rpb25bMjRdOworCS8qIDB4MDIxMCAqLworCXUzMiByZXNlcnZlZF8wMjEwOworCS8qIDB4MDIxNCBBRkVfREZYX1AxX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9wMV9jb250cm9sOworCS8qIDB4MDIxOC0weDI0NSBBRkVfREZYX1AxX0RSeCAqLworCXUzMiBhZmVfZGZ4X3AxX2RhdGFbMTZdOworCS8qIDB4MDI1OC0weDAyOWMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDI1OF8wMjljWzB4MTJdOworCS8qIDB4MDJhMC0weDAyYmMgQUZFX0RGWF9QMV9JUnggKi8KKwl1MzIgYWZlX2RmeF9wMV9pbnN0cnVjdGlvbls4XTsKKwkvKiAweDAyYzAtMHgyZmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDJjMF8wMmZjWzB4MTBdOworCS8qIDB4MDMwMCBBRkVfREZYX1RYX1BNU05fQ1RSTCAqLworCXUzMiBhZmVfZGZ4X3R4X3Btc25fY29udHJvbDsKKwkvKiAweDAzMDQgQUZFX0RGWF9SWF9QTVNOX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9yeF9wbXNuX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzAzMDg7CisJLyogMHgwMzBjIEFGRV9ERlhfTk9BX0NUUkwwICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2wwOworCS8qIDB4MDMxMCBBRkVfREZYX05PQV9DVFJMMSAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sMTsKKwkvKiAweDAzMTQgQUZFX0RGWF9OT0FfQ1RSTDIgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDI7CisJLyogMHgwMzE4IEFGRV9ERlhfTk9BX0NUUkwzICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2wzOworCS8qIDB4MDMxYyBBRkVfREZYX05PQV9DVFJMNCAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sNDsKKwkvKiAweDAzMjAgQUZFX0RGWF9OT0FfQ1RSTDUgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDU7CisJLyogMHgwMzI0IEFGRV9ERlhfTk9BX0NUUkw2ICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2w2OworCS8qIDB4MDMyOCBBRkVfREZYX05PQV9DVFJMNyAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sNzsKKwkvKiAweDAzMmMtMHgwN2ZjICovCisJdTMyIHJlc2VydmVkXzAzMmNfMDdmY1sweDEzNV07CisKKwkvKiAweDA4MDAtMHgwYmZjICovCisJc3RydWN0IHNjdV9hZmVfdHJhbnNjZWl2ZXIgc2N1X2FmZV94Y3ZyWzRdOworCisJLyogMHgwYzAwLTB4MGZmYyAqLworCXUzMiByZXNlcnZlZF8wYzAwXzBmZmNbMHgwMTAwXTsKK307CisKK3N0cnVjdCBzY3VfcHJvdG9jb2xfZW5naW5lX2dyb3VwX3JlZ2lzdGVycyB7CisJdTMyIHRhYmxlWzB4RTBdOworfTsKKworCitzdHJ1Y3Qgc2N1X3ZpaXRfaWl0IHsKKwl1MzIgdGFibGVbMjU2XTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgZm9yIHRoZSBaT05FIFBhcnRpdGlvbiBUYWJsZSBpbmZvcm1hdGlvbiBaT05JTkcgd2lsbCBub3QgYmUKKyAqICAgIGluY2x1ZGVkIGluIHRoZSAxLjEgcmVsZWFzZS4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3pvbmVfcGFydGl0aW9uX3RhYmxlIHsKKwl1MzIgdGFibGVbMjA0OF07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgQ1JBTSByZWdpc3RlciBzaW5jZSBJIGFtIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8KKyAqICAgIHJlYWQvd3JpdGUgdG8gdGhlc2UgcmVnaXN0ZXJzIGFzIHlldC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X2NvbXBsZXRpb25fcmFtIHsKKwl1MzIgcmFtWzEyOF07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgRkJSQU0gcmVnaXN0ZXJzIHNpbmNlIEkgYW0gbm90IHN1cmUgaWYgd2UgbmVlZCB0bworICogICAgcmVhZC93cml0ZSB0byB0aGVzZSByZWdpc3RlcnMgYXMgeWV0LgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfZnJhbWVfYnVmZmVyX3JhbSB7CisJdTMyIHJhbVsxMjhdOworfTsKKworI2RlZmluZSBzY3Vfc2NyYXRjaF9yYW1fU0laRV9JTl9EV09SRFMgIDI1NgorCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgc2NyYXRjaCBSQU0gcmVnaXN0ZXJzLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3Vfc2NyYXRjaF9yYW0geworCXUzMiByYW1bc2N1X3NjcmF0Y2hfcmFtX1NJWkVfSU5fRFdPUkRTXTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc2luY2UgSSBhbSBub3QgeWV0IHN1cmUgd2hhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGhlcmUgZm9yLgorICoKKyAqCisgKi8KK3N0cnVjdCBub2FfcHJvdG9jb2xfZW5naW5lX3BhcnRpdGlvbiB7CisJdTMyIHJlc2VydmVkWzY0XTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc2luY2UgSSBhbSBub3QgeWV0IHN1cmUgd2hhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGhlcmUgZm9yLgorICoKKyAqCisgKi8KK3N0cnVjdCBub2FfaHViX3BhcnRpdGlvbiB7CisJdTMyIHJlc2VydmVkWzY0XTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc2luY2UgSSBhbSBub3QgeWV0IHN1cmUgd2hhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGhlcmUgZm9yLgorICoKKyAqCisgKi8KK3N0cnVjdCBub2FfaG9zdF9pbnRlcmZhY2VfcGFydGl0aW9uIHsKKwl1MzIgcmVzZXJ2ZWRbNjRdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdHJhbnNwb3J0X2xpbmtfbGF5ZXJfcGFpciAtIFRoZSBTQ1UgSGFyZHdhcmUgcGFpcnMgdXAgdGhlIFRMCisgKiAgICByZWdpc3RlcnMgd2l0aCB0aGUgTEwgcmVnaXN0ZXJzIHNvIHdlIG11c3QgcGxhY2UgdGhlbSBhZGpjZW50IHRvIG1ha2UgdGhlCisgKiAgICBhcnJheSBvZiByZWdpc3RlcnMgaW4gdGhlIFBFRy4KKyAqCisgKgorICovCitzdHJ1Y3QgdHJhbnNwb3J0X2xpbmtfbGF5ZXJfcGFpciB7CisJc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIHRsOworCXN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgbGw7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfcGVnX3JlZ2lzdGVycyAtIFNDVSBQcm90b2NvbCBFbmdpbmUgTWVtb3J5IG1hcHBlZCByZWdpc3RlciBzcGFjZS4KKyAqICAgICBUaGVzZSByZWdpc3RlcnMgYXJlIHVuaXF1ZSB0byBlYWNoIHByb3RvY29sIGVuZ2luZSBncm91cC4gIFRoZXJlIGNhbiBiZQorICogICAgYXQgbW9zdCB0d28gUEVHIGZvciBhIHNpbmdsZSBTQ1UgcGFydC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgeworCXN0cnVjdCB0cmFuc3BvcnRfbGlua19sYXllcl9wYWlyIHBlWzRdOworCXN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgcHRzZzsKKwlzdHJ1Y3Qgc2N1X3Byb3RvY29sX2VuZ2luZV9ncm91cF9yZWdpc3RlcnMgcGVnOworCXN0cnVjdCBzY3Vfc2dwaW9fcmVnaXN0ZXJzIHNncGlvOworCXUzMiByZXNlcnZlZF8wMTUwMF8xQkZGWzB4MUMwXTsKKwlzdHJ1Y3Qgc2N1X3ZpaXRfZW50cnkgdmlpdFs2NF07CisJc3RydWN0IHNjdV96b25lX3BhcnRpdGlvbl90YWJsZSB6cHQwOworCXN0cnVjdCBzY3Vfem9uZV9wYXJ0aXRpb25fdGFibGUgenB0MTsKK307CisKKy8qKgorICogc3RydWN0IHNjdV9yZWdpc3RlcnMgLSBTQ1UgcmVnc2l0ZXJzIGluY2x1ZGluZyBib3RoIFBFRyByZWdpc3RlcnMgaWYgd2UgdHVybgorICogICAgb24gdGhhdCBjb21waWxlIG9wdGlvbi4gQWxsIG9mIHRoZXNlIHJlZ2lzdGVycyBhcmUgaW4gdGhlIG1lbW9yeSBtYXBwZWQKKyAqICAgIHNwYWNlIHJldHVybmVkIGZyb20gQkFSMS4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3JlZ2lzdGVycyB7CisJLyogMHgwMDAwIC0gUEVHIDAgKi8KKwlzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgcGVnMDsKKworCS8qIDB4NjAwMCAtIFNETUEgYW5kIE1pc2NlbGxhbmVvdXMgKi8KKwlzdHJ1Y3Qgc2N1X3NkbWFfcmVnaXN0ZXJzIHNkbWE7CisJc3RydWN0IHNjdV9jb21wbGV0aW9uX3JhbSBjcmFtOworCXN0cnVjdCBzY3VfZnJhbWVfYnVmZmVyX3JhbSBmYnJhbTsKKwl1MzIgcmVzZXJ2ZWRfNjgwMF82OUZGWzB4ODBdOworCXN0cnVjdCBub2FfcHJvdG9jb2xfZW5naW5lX3BhcnRpdGlvbiBub2FfcGU7CisJc3RydWN0IG5vYV9odWJfcGFydGl0aW9uIG5vYV9odWI7CisJc3RydWN0IG5vYV9ob3N0X2ludGVyZmFjZV9wYXJ0aXRpb24gbm9hX2lmOworCXUzMiByZXNlcnZlZF82ZDAwXzdmZmZbMHg0YzBdOworCisJLyogMHg4MDAwIC0gUEVHIDEgKi8KKwlzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgcGVnMTsKKworCS8qIDB4RTAwMCAtIEFGRSBSZWdpc3RlcnMgKi8KKwlzdHJ1Y3Qgc2N1X2FmZV9yZWdpc3RlcnMgYWZlOworCisJLyogMHhGMDAwIC0gcmVzZXJ2ZWQgKi8KKwl1MzIgcmVzZXJ2ZWRfZjAwMF8yMTFmZmZbMHg4MGMwMF07CisKKwkvKiAweDIxMjAwMCAtIHNjcmF0Y2ggUkFNICovCisJc3RydWN0IHNjdV9zY3JhdGNoX3JhbSBzY3JhdGNoX3JhbTsKK307CisKKyNlbmRpZiAgIC8qIF9TQ1VfUkVHSVNURVJTX0hFQURFUl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU2MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5jCkBAIC0wLDAgKzEsMTUwMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlIDxzY3NpL3Nhcy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmVtb3RlX2RldmljZS5oIgorI2luY2x1ZGUgInJlcXVlc3QuaCIKKyNpbmNsdWRlICJyZW1vdGVfbm9kZV9jb250ZXh0LmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpaG9zdCB3aGVuCisgKiAgICB0aGUgcmVtb3RlIGRldmljZSBpcyBub3QgcmVhZHkuIFdlIG1hcmsgdGhlIGlzY2kgZGV2aWNlIGFzIHJlYWR5IChub3QKKyAqICAgICJyZWFkeV9mb3JfaW8iKSBhbmQgc2lnbmFsIHRoZSB3YWl0aW5nIHByb2NjZXNzLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpc2NpIGhvc3Qgb2JqZWN0LgorICogQGlzY2lfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlbW90ZSBkZXZpY2UKKyAqCisgKiBzY2lfbG9jayBpcyBoZWxkIG9uIGVudHJhbmNlIHRvIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCB1MzIgcmVhc29uKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUT1BfUkVRVUVTVEVEOgorCQlzZXRfYml0KElERVZfR09ORSwgJmlkZXYtPmZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfU0RCX0VSUk9SX0ZJU19SRUNFSVZFRDoKKwkJc2V0X2JpdChJREVWX0lPX05DUUVSUk9SLCAmaWRldi0+ZmxhZ3MpOworCisJCS8qIEtpbGwgYWxsIG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGUgZGV2aWNlLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlyZXEsICZpZGV2LT5yZXFzX2luX3Byb2Nlc3MsIGRldl9ub2RlKSB7CisKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBpc2NpX2RldmljZSA9ICVwIHJlcXVlc3QgPSAlcFxuIiwKKwkJCQlfX2Z1bmNfXywgaWRldiwgaXJlcSk7CisKKwkJCXNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KGlob3N0LAorCQkJCQkJCSAgaWRldiwKKwkJCQkJCQkgIGlyZXEpOworCQl9CisJCS8qIEZhbGwgdGhyb3VnaCBpbnRvIHRoZSBkZWZhdWx0IGNhc2UuLi4gKi8KKwlkZWZhdWx0OgorCQljbGVhcl9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9yZWFkeSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGlob3N0IHdoZW4gdGhlCisgKiAgICByZW1vdGUgZGV2aWNlIGlzIHJlYWR5LiBXZSBtYXJrIHRoZSBpc2NpIGRldmljZSBhcyByZWFkeSBhbmQgc2lnbmFsIHRoZQorICogICAgd2FpdGluZyBwcm9jY2Vzcy4KKyAqIEBpaG9zdDogb3VyIHZhbGlkIGlzY2lfaG9zdAorICogQGlkZXY6IHJlbW90ZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlkZXYgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJY2xlYXJfYml0KElERVZfSU9fTkNRRVJST1IsICZpZGV2LT5mbGFncyk7CisJc2V0X2JpdChJREVWX0lPX1JFQURZLCAmaWRldi0+ZmxhZ3MpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSURFVl9TVEFSVF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpKQorCQl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKK30KKworLyogY2FsbGVkIG9uY2UgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgcmVhZHkgdG8gYmUgZnJlZWQuCisgKiBUaGUgcmVtb3RlIGRldmljZSBjYW4gbm93IHJlcG9ydCB0aGF0IGl0cyBzdG9wIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gbm9uZQorICovCitzdGF0aWMgdm9pZCBybmNfZGVzdHJ1Y3RfZG9uZSh2b2lkICpfZGV2KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBfZGV2OworCisJQlVHX09OKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCAhPSAwKTsKKwlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX0RFVl9TVE9QUEVEKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV90ZXJtaW5hdGVfcmVxdWVzdHMoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzICA9IFNDSV9TVUNDRVNTOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfSU9fUkVRVUVTVFM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gaWhvc3QtPnJlcXNbaV07CisJCWVudW0gc2NpX3N0YXR1cyBzOworCisJCWlmICghdGVzdF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncykgfHwKKwkJICAgIGlyZXEtPnRhcmdldF9kZXZpY2UgIT0gaWRldikKKwkJCWNvbnRpbnVlOworCisJCXMgPSBzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChpaG9zdCwgaWRldiwgaXJlcSk7CisJCWlmIChzICE9IFNDSV9TVUNDRVNTKQorCQkJc3RhdHVzID0gczsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQl1MzIgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfSU5JVElBTDoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9ERVZfU1RBUlRJTkc6CisJCS8qIGRldmljZSBub3Qgc3RhcnRlZCBzbyB0aGVyZSBoYWQgYmV0dGVyIGJlIG5vIHJlcXVlc3RzICovCisJCUJVR19PTihpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgIT0gMCk7CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2Rlc3RydWN0KCZpZGV2LT5ybmMsCisJCQkJCQkgICAgICBybmNfZGVzdHJ1Y3RfZG9uZSwgaWRldik7CisJCS8qIFRyYW5zaXRpb24gdG8gdGhlIHN0b3BwaW5nIHN0YXRlIGFuZCB3YWl0IGZvciB0aGUKKwkJICogcmVtb3RlIG5vZGUgdG8gY29tcGxldGUgYmVpbmcgcG9zdGVkIGFuZCBpbnZhbGlkYXRlZC4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfU1RPUFBJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfSURMRToKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX0RFVl9TVE9QUElORyk7CisJCWlmIChpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPT0gMCkgeworCQkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdHJ1Y3QoJmlkZXYtPnJuYywKKwkJCQkJCQkgICAgICBybmNfZGVzdHJ1Y3RfZG9uZSwgaWRldik7CisJCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJCX0gZWxzZQorCQkJcmV0dXJuIHNjaV9yZW1vdGVfZGV2aWNlX3Rlcm1pbmF0ZV9yZXF1ZXN0cyhpZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lfREVWX1NUT1BQSU5HOgorCQkvKiBBbGwgcmVxdWVzdHMgc2hvdWxkIGhhdmUgYmVlbiB0ZXJtaW5hdGVkLCBidXQgaWYgdGhlcmUgaXMgYW4KKwkJICogYXR0ZW1wdCB0byBzdG9wIGEgZGV2aWNlIGFscmVhZHkgaW4gdGhlIHN0b3BwaW5nIHN0YXRlLCB0aGVuCisJCSAqIHRyeSBhZ2FpbiB0byB0ZXJtaW5hdGUuCisJCSAqLworCQlyZXR1cm4gc2NpX3JlbW90ZV9kZXZpY2VfdGVybWluYXRlX3JlcXVlc3RzKGlkZXYpOworCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfU1RPUFBJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXQoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfSU5JVElBTDoKKwljYXNlIFNDSV9ERVZfU1RPUFBFRDoKKwljYXNlIFNDSV9ERVZfU1RBUlRJTkc6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCWNhc2UgU0NJX0RFVl9TVE9QUElORzoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6CisJY2FzZSBTQ0lfREVWX0ZJTkFMOgorCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNROgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfUkVTRVRUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX0RFVl9SRVNFVFRJTkcpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfUkVBRFkpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJICAgICAgIHUzMiBzdXNwZW5kX3R5cGUpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1NUUF9ERVZfQ01EKSB7CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlyZXR1cm4gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZCgmaWRldi0+cm5jLAorCQkJCQkJICAgIHN1c3BlbmRfdHlwZSwgTlVMTCwgTlVMTCk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkgICAgIHUzMiBmcmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX0RFVl9JTklUSUFMOgorCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCWNhc2UgU0NJX0RFVl9TVEFSVElORzoKKwljYXNlIFNDSV9TVFBfREVWX0lETEU6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJLyogUmV0dXJuIHRoZSBmcmFtZSBiYWNrIHRvIHRoZSBjb250cm9sbGVyICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJY2FzZSBTQ0lfREVWX1NUT1BQSU5HOgorCWNhc2UgU0NJX0RFVl9GQUlMRUQ6CisJY2FzZSBTQ0lfREVWX1JFU0VUVElORzogeworCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCQlzdHJ1Y3Qgc3NwX2ZyYW1lX2hkciBoZHI7CisJCXZvaWQgKmZyYW1lX2hlYWRlcjsKKwkJc3NpemVfdCB3b3JkX2NudDsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgJmZyYW1lX2hlYWRlcik7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXdvcmRfY250ID0gc2l6ZW9mKGhkcikgLyBzaXplb2YodTMyKTsKKwkJc2NpX3N3YWIzMl9jcHkoJmhkciwgZnJhbWVfaGVhZGVyLCB3b3JkX2NudCk7CisKKwkJaXJlcSA9IHNjaV9yZXF1ZXN0X2J5X3RhZyhpaG9zdCwgYmUxNl90b19jcHUoaGRyLnRhZykpOworCQlpZiAoaXJlcSAmJiBpcmVxLT50YXJnZXRfZGV2aWNlID09IGlkZXYpIHsKKwkJCS8qIFRoZSBJTyByZXF1ZXN0IGlzIG5vdyBpbiBjaGFyZ2Ugb2YgcmVsZWFzaW5nIHRoZSBmcmFtZSAqLworCQkJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihpcmVxLCBmcmFtZV9pbmRleCk7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBjb3VsZCBub3QgbWFwIHRoaXMgdGFnIHRvIGEgdmFsaWQgSU8KKwkJCSAqIHJlcXVlc3QgSnVzdCB0b3NzIHRoZSBmcmFtZSBhbmQgY29udGludWUKKwkJCSAqLworCQkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNDSV9TVFBfREVWX05DUTogeworCQlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpoZHI7CisKKwkJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgICh2b2lkICoqKSZoZHIpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpZiAoaGRyLT5maXNfdHlwZSA9PSBGSVNfU0VUREVWQklUUyAmJgorCQkgICAgKGhkci0+c3RhdHVzICYgQVRBX0VSUikpIHsKKwkJCWlkZXYtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfU0RCX0VSUk9SX0ZJU19SRUNFSVZFRDsKKworCQkJLyogVE9ETyBDaGVjayBzYWN0aXZlIGFuZCBjb21wbGV0ZSBhc3NvY2lhdGVkIElPIGlmIGFueS4gKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9TVFBfREVWX05DUV9FUlJPUik7CisJCX0gZWxzZSBpZiAoaGRyLT5maXNfdHlwZSA9PSBGSVNfUkVHRDJIICYmCisJCQkgICAoaGRyLT5zdGF0dXMgJiBBVEFfRVJSKSkgeworCQkJLyoKKwkJCSAqIFNvbWUgZGV2aWNlcyByZXR1cm4gRDJIIEZJUyB3aGVuIGFuIE5DUSBlcnJvciBpcyBkZXRlY3RlZC4KKwkJCSAqIFRyZWF0IHRoaXMgbGlrZSBhbiBTREIgZXJyb3IgRklTIHJlYWR5IHJlYXNvbi4KKwkJCSAqLworCQkJaWRldi0+bm90X3JlYWR5X3JlYXNvbiA9IFNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU0FUQV9TREJfRVJST1JfRklTX1JFQ0VJVkVEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9TVFBfREVWX05DUV9FUlJPUik7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlicmVhazsKKwl9CisJY2FzZSBTQ0lfU1RQX0RFVl9DTUQ6CisJY2FzZSBTQ0lfU01QX0RFVl9DTUQ6CisJCS8qIFRoZSBkZXZpY2UgZG9lcyBub3QgcHJvY2VzcyBhbnkgVUYgcmVjZWl2ZWQgZnJvbSB0aGUgaGFyZHdhcmUgd2hpbGUKKwkJICogaW4gdGhpcyBzdGF0ZS4gIEFsbCB1bnNvbGljaXRlZCBmcmFtZXMgYXJlIGZvcndhcmRlZCB0byB0aGUgaW8gcmVxdWVzdAorCQkgKiBvYmplY3QuCisJCSAqLworCQlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9mcmFtZV9oYW5kbGVyKGlkZXYtPndvcmtpbmdfcmVxdWVzdCwgZnJhbWVfaW5kZXgpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYm9vbCBpc19yZW1vdGVfZGV2aWNlX3JlYWR5KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNROgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJICAgICB1MzIgZXZlbnRfY29kZSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkpIHsKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQzoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYOgorCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlg6CisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2V2ZW50X2hhbmRsZXIoJmlkZXYtPnJuYywgZXZlbnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5UOgorCQlpZiAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9JVF9ORVhVU19USU1FT1VUKSB7CisJCQlzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCQkJLyogU3VzcGVuZCB0aGUgYXNzb2NpYXRlZCBSTkMgKi8KKwkJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoJmlkZXYtPnJuYywKKwkJCQkJCQkgICAgICBTQ0lfU09GVFdBUkVfU1VTUEVOU0lPTiwKKwkJCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKKworCQkJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihpZGV2KSwKKwkJCQkiJXM6IGRldmljZTogJXAgZXZlbnQgY29kZTogJXg6ICVzXG4iLAorCQkJCV9fZnVuY19fLCBpZGV2LCBldmVudF9jb2RlLAorCQkJCWlzX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWRldikKKwkJCQk/ICJJX1RfTmV4dXNfVGltZW91dCBldmVudCIKKwkJCQk6ICJJX1RfTmV4dXNfVGltZW91dCBldmVudCBpbiB3cm9uZyBzdGF0ZSIpOworCisJCQlicmVhazsKKwkJfQorCS8qIEVsc2UsIGZhbGwgdGhyb3VnaCBhbmQgdHJlYXQgYXMgdW5oYW5kbGVkLi4uICovCisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihpZGV2KSwKKwkJCSIlczogZGV2aWNlOiAlcCBldmVudCBjb2RlOiAleDogJXNcbiIsCisJCQlfX2Z1bmNfXywgaWRldiwgZXZlbnRfY29kZSwKKwkJCWlzX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWRldikKKwkJCT8gInVuZXhwZWN0ZWQgZXZlbnQiCisJCQk6ICJ1bmV4cGVjdGVkIGV2ZW50IGluIHdyb25nIHN0YXRlIik7CisJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoc3RhdGUgPT0gU0NJX1NUUF9ERVZfSURMRSkgeworCisJCS8qIFdlIHBpY2sgdXAgc3VzcGVuc2lvbiBldmVudHMgdG8gaGFuZGxlIHNwZWNpZmljYWxseSB0byB0aGlzCisJCSAqIHN0YXRlLiBXZSByZXN1bWUgdGhlIFJOQyByaWdodCBhd2F5LgorCQkgKi8KKwkJaWYgKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWCB8fAorCQkgICAgc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYKQorCQkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsIE5VTEwsIE5VTEwpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3JlcXVlc3Qoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJIGVudW0gc2NpX3N0YXR1cyBzdGF0dXMpCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKworCS8qIGNsZWFudXAgcmVxdWVzdHMgdGhhdCBmYWlsZWQgYWZ0ZXIgc3RhcnRpbmcgb24gdGhlIHBvcnQgKi8KKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlzY2lfcG9ydF9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJZWxzZSB7CisJCWtyZWZfZ2V0KCZpZGV2LT5rcmVmKTsKKwkJaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50Kys7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfaW8oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX0lOSVRJQUw6CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJY2FzZSBTQ0lfREVWX1NUQVJUSU5HOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX0RFVl9TVE9QUElORzoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6CisJY2FzZSBTQ0lfREVWX0ZJTkFMOgorCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJCS8qIGF0dGVtcHQgdG8gc3RhcnQgYW4gaW8gcmVxdWVzdCBmb3IgdGhpcyBkZXZpY2Ugb2JqZWN0LiBUaGUgcmVtb3RlCisJCSAqIGRldmljZSBvYmplY3Qgd2lsbCBpc3N1ZSB0aGUgc3RhcnQgcmVxdWVzdCBmb3IgdGhlIGlvIGFuZCBpZgorCQkgKiBzdWNjZXNzZnVsIGl0IHdpbGwgc3RhcnQgdGhlIHJlcXVlc3QgZm9yIHRoZSBwb3J0IG9iamVjdCB0aGVuCisJCSAqIGluY3JlbWVudCBpdHMgb3duIHJlcXVlc3QgY291bnQuCisJCSAqLworCQlzdGF0dXMgPSBzY2lfcG9ydF9zdGFydF9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKCZpZGV2LT5ybmMsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCWJyZWFrOworCWNhc2UgU0NJX1NUUF9ERVZfSURMRTogeworCQkvKiBoYW5kbGUgdGhlIHN0YXJ0IGlvIG9wZXJhdGlvbiBmb3IgYSBzYXRhIGRldmljZSB0aGF0IGlzIGluCisJCSAqIHRoZSBjb21tYW5kIGlkbGUgc3RhdGUuIC0gRXZhbHV0ZSB0aGUgdHlwZSBvZiBJTyByZXF1ZXN0IHRvCisJCSAqIGJlIHN0YXJ0ZWQgLSBJZiBpdHMgYW4gTkNRIHJlcXVlc3QgY2hhbmdlIHRvIE5DUSBzdWJzdGF0ZSAtCisJCSAqIElmIGl0cyBhbnkgb3RoZXIgY29tbWFuZCBjaGFuZ2UgdG8gdGhlIENNRCBzdWJzdGF0ZQorCQkgKgorCQkgKiBJZiB0aGlzIGlzIGEgc29mdHJlc2V0IHdlIG1heSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQKKwkJICogc3Vic3RhdGUuCisJCSAqLworCQllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBuZXdfc3RhdGU7CisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCQlzdGF0dXMgPSBzY2lfcG9ydF9zdGFydF9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKCZpZGV2LT5ybmMsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSkKKwkJCW5ld19zdGF0ZSA9IFNDSV9TVFBfREVWX05DUTsKKwkJZWxzZSB7CisJCQlpZGV2LT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworCQkJbmV3X3N0YXRlID0gU0NJX1NUUF9ERVZfQ01EOworCQl9CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIG5ld19zdGF0ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNDSV9TVFBfREVWX05DUTogeworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwkJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EpIHsKKwkJCXN0YXR1cyA9IHNjaV9wb3J0X3N0YXJ0X2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQkJcmV0dXJuIHN0YXR1czsKKworCQkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfaW8oJmlkZXYtPnJuYywgaXJlcSk7CisJCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQlzdGF0dXMgPSBzY2lfcmVxdWVzdF9zdGFydChpcmVxKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJCXJldHVybiBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEOworCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwkJc3RhdHVzID0gc2NpX3BvcnRfc3RhcnRfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gaXJlcTsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9TTVBfREVWX0NNRCk7CisJCWJyZWFrOworCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQkvKiBkZXZpY2UgaXMgYWxyZWFkeSBoYW5kbGluZyBhIGNvbW1hbmQgaXQgY2FuIG5vdCBhY2NlcHQgbmV3IGNvbW1hbmRzCisJCSAqIHVudGlsIHRoaXMgb25lIGlzIGNvbXBsZXRlLgorCQkgKi8KKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfcmVxdWVzdChpZGV2LCBpcmVxLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgY29tbW9uX2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gc2NpX3JlcXVlc3RfY29tcGxldGUoaXJlcSk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IHNjaV9wb3J0X2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc2NpX3JlbW90ZV9kZXZpY2VfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoaWRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX0RFVl9JTklUSUFMOgorCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCWNhc2UgU0NJX0RFVl9TVEFSVElORzoKKwljYXNlIFNDSV9TVFBfREVWX0lETEU6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX0RFVl9GQUlMRUQ6CisJY2FzZSBTQ0lfREVWX0ZJTkFMOgorCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJY2FzZSBTQ0lfU1RQX0RFVl9BV0FJVF9SRVNFVDoKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCQlzdGF0dXMgPSBjb21tb25fY29tcGxldGVfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlicmVhazsKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwkJc3RhdHVzID0gY29tbW9uX2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChpcmVxLT5zY2lfc3RhdHVzID09IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQpIHsKKwkJCS8qIFRoaXMgcmVxdWVzdCBjYXVzZXMgaGFyZHdhcmUgZXJyb3IsIGRldmljZSBuZWVkcyB0byBiZSBMdW4gUmVzZXQuCisJCQkgKiBTbyBoZXJlIHdlIGZvcmNlIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIElETEUgc3RhdGUgc28gdGhlIHJlc3QgSU9zCisJCQkgKiBjYW4gcmVhY2ggUk5DIHN0YXRlIGhhbmRsZXIsIHRoZXNlIElPcyB3aWxsIGJlIGNvbXBsZXRlZCBieSBSTkMgd2l0aAorCQkJICogc3RhdHVzIG9mICJERVZJQ0VfUkVTRVRfUkVRVUlSRUQiLCBpbnN0ZWFkIG9mICJJTlZBTElEIFNUQVRFIi4KKwkJCSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQpOworCQl9IGVsc2UgaWYgKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwKQorCQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1NUUF9ERVZfSURMRSk7CisJCWJyZWFrOworCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQlzdGF0dXMgPSBjb21tb25fY29tcGxldGVfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9TTVBfREVWX0lETEUpOworCQlicmVhazsKKwljYXNlIFNDSV9ERVZfU1RPUFBJTkc6CisJCXN0YXR1cyA9IGNvbW1vbl9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApCisJCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdCgmaWRldi0+cm5jLAorCQkJCQkJCSBybmNfZGVzdHJ1Y3RfZG9uZSwKKwkJCQkJCQkgaWRldik7CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWRldl9lcnIoc2NpcmRldl90b19kZXYoaWRldiksCisJCQkiJXM6IFBvcnQ6MHglcCBEZXZpY2U6MHglcCBSZXF1ZXN0OjB4JXAgU3RhdHVzOjB4JXggIgorCQkJImNvdWxkIG5vdCBjb21wbGV0ZVxuIiwgX19mdW5jX18sIGlwb3J0LAorCQkJaWRldiwgaXJlcSwgc3RhdHVzKTsKKwllbHNlCisJCWlzY2lfcHV0X2RldmljZShpZGV2KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2NvbnRpbnVlX3JlcXVlc3Qodm9pZCAqZGV2KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBkZXY7CisKKwkvKiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgcmVxdWVzdCBpcyBzdGlsbCB2YWxpZCB0byBjb250aW51ZS4gKi8KKwlpZiAoaWRldi0+d29ya2luZ19yZXF1ZXN0KQorCQlzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhpZGV2LT53b3JraW5nX3JlcXVlc3QpOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfdGFzayhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX0lOSVRJQUw6CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJY2FzZSBTQ0lfREVWX1NUQVJUSU5HOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwljYXNlIFNDSV9ERVZfU1RPUFBJTkc6CisJY2FzZSBTQ0lfREVWX0ZBSUxFRDoKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNROgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJCXN0YXR1cyA9IHNjaV9wb3J0X3N0YXJ0X2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfdGFzaygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWdvdG8gb3V0OworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJZ290byBvdXQ7CisKKwkJLyogTm90ZTogSWYgdGhlIHJlbW90ZSBkZXZpY2Ugc3RhdGUgaXMgbm90IElETEUgdGhpcyB3aWxsCisJCSAqIHJlcGxhY2UgdGhlIHJlcXVlc3QgdGhhdCBwcm9iYWJseSByZXN1bHRlZCBpbiB0aGUgdGFzaworCQkgKiBtYW5hZ2VtZW50IHJlcXVlc3QuCisJCSAqLworCQlpZGV2LT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfU1RQX0RFVl9DTUQpOworCisJCS8qIFRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG11c3QgY2xlYW51cCB0aGUgVENpIHRvIE5DUSBtYXBwaW5nCisJCSAqIHRhYmxlLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgY29ycmVjdGx5IGlzIHRvIGVpdGhlciB3cml0ZQorCQkgKiB0byB0aGUgVExDUiByZWdpc3RlciBvciB0byBpbnZhbGlkYXRlIGFuZCByZXBvc3QgdGhlIFJOQy4gSW4KKwkJICogZWl0aGVyIGNhc2UgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgc3RhdGUgbWFjaGluZSB3aWxsIHRha2UKKwkJICogdGhlIGNvcnJlY3QgYWN0aW9uIHdoZW4gdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgc3VzcGVuZGVkCisJCSAqIGFuZCBsYXRlciByZXN1bWVkLgorCQkgKi8KKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZCgmaWRldi0+cm5jLAorCQkJCVNDSV9TT0ZUV0FSRV9TVVNQRU5TSU9OLCBOVUxMLCBOVUxMKTsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsCisJCQkJc2NpX3JlbW90ZV9kZXZpY2VfY29udGludWVfcmVxdWVzdCwKKwkJCQkJCSAgICBpZGV2KTsKKworCW91dDoKKwkJc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfcmVxdWVzdChpZGV2LCBpcmVxLCBzdGF0dXMpOworCQkvKiBXZSBuZWVkIHRvIGxldCB0aGUgY29udHJvbGxlciBzdGFydCByZXF1ZXN0IGhhbmRsZXIga25vdyB0aGF0CisJCSAqIGl0IGNhbid0IHBvc3QgVEMgeWV0LiBXZSB3aWxsIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiB0bworCQkgKiBwb3N0IFRDIHdoZW4gUk5DIGdldHMgcmVzdW1lZC4KKwkJICovCisJCXJldHVybiBTQ0lfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTOworCWNhc2UgU0NJX0RFVl9SRUFEWToKKwkJc3RhdHVzID0gc2NpX3BvcnRfc3RhcnRfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF90YXNrKCZpZGV2LT5ybmMsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCWJyZWFrOworCX0KKwlzY2lfcmVtb3RlX2RldmljZV9zdGFydF9yZXF1ZXN0KGlkZXYsIGlyZXEsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCB1MzIgcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCXUzMiBjb250ZXh0OworCisJY29udGV4dCA9IHJlcXVlc3QgfAorCQkgIChJU0NJX1BFRyA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX1BST1RPQ09MX0VOR0lORV9HUk9VUF9TSElGVCkgfAorCQkgIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkgIGlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleDsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIsIGNvbnRleHQpOworfQorCisvKiBjYWxsZWQgb25jZSB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBoYXMgdHJhbnNpc2l0aW9uZWQgdG8gYQorICogcmVhZHkgc3RhdGUuICBUaGlzIGlzIHRoZSBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlbW90ZSBkZXZpY2Ugb2JqZWN0IGNhbiBhbHNvCisgKiB0cmFuc2l0aW9uIHRvIHJlYWR5LgorICovCitzdGF0aWMgdm9pZCByZW1vdGVfZGV2aWNlX3Jlc3VtZV9kb25lKHZvaWQgKl9kZXYpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IF9kZXY7CisKKwlpZiAoaXNfcmVtb3RlX2RldmljZV9yZWFkeShpZGV2KSkKKwkJcmV0dXJuOworCisJLyogZ28gJ3JlYWR5JyBpZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSByZWFkeSBzdGF0ZSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfREVWX1JFQURZKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfcmVzdW1lX2NvbXBsZXRlX2hhbmRsZXIodm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gX2RldjsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qIEZvciBOQ1Egb3BlcmF0aW9uIHdlIGRvIG5vdCBpc3N1ZSBhIGlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoKS4KKwkgKiBBcyBhIHJlc3VsdCwgYXZvaWQgc2VuZGluZyB0aGUgcmVhZHkgbm90aWZpY2F0aW9uLgorCSAqLworCWlmIChpZGV2LT5zbS5wcmV2aW91c19zdGF0ZV9pZCAhPSBTQ0lfU1RQX0RFVl9OQ1EpCisJCWlzY2lfcmVtb3RlX2RldmljZV9yZWFkeShpaG9zdCwgaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2luaXRpYWxfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKworCS8qIEluaXRpYWwgc3RhdGUgaXMgYSB0cmFuc2l0aW9uYWwgc3RhdGUgdG8gdGhlIHN0b3BwZWQgc3RhdGUgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX0RFVl9TVE9QUEVEKTsKK30KKworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpIC0gZnJlZSByZW1vdGUgbm9kZSBjb250ZXh0IGFuZCBkZXN0cnVjdAorICogQHJlbW90ZV9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVtb3RlIGRldmljZSB0byBiZSBkZXN0cnVjdGVkLgorICoKKyAqIFJlbW90ZSBkZXZpY2Ugb2JqZWN0cyBhcmUgYSBsaW1pdGVkIHJlc291cmNlLiAgQXMgc3VjaCwgdGhleSBtdXN0IGJlCisgKiBwcm90ZWN0ZWQuICBUaHVzIGNhbGxzIHRvIGNvbnN0cnVjdCBhbmQgZGVzdHJ1Y3QgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQKKyAqIG5vbi1yZWVudHJhbnQuIFRoZSByZXR1cm4gdmFsdWUgc2hhbGwgaW5kaWNhdGUgaWYgdGhlIGRldmljZSB3YXMKKyAqIHN1Y2Nlc3NmdWxseSBkZXN0cnVjdGVkIG9yIGlmIHNvbWUgZmFpbHVyZSBvY2N1cnJlZC4gZW51bSBzY2lfc3RhdHVzIFRoaXMgdmFsdWUKKyAqIGlzIHJldHVybmVkIGlmIHRoZSBkZXZpY2UgaXMgc3VjY2Vzc2Z1bGx5IGRlc3RydWN0ZWQuCisgKiBTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UgVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgc3VwcGxpZWQKKyAqIGRldmljZSBpc24ndCB2YWxpZCAoZS5nLiBpdCdzIGFscmVhZHkgYmVlbiBkZXN0b3J5ZWQsIHRoZSBoYW5kbGUgaXNuJ3QKKyAqIHZhbGlkLCBldGMuKS4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpZGV2LT5zbTsKKwllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBzdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCisJaWYgKHN0YXRlICE9IFNDSV9ERVZfU1RPUFBFRCkgeworCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJc2NpX2NvbnRyb2xsZXJfZnJlZV9yZW1vdGVfbm9kZV9jb250ZXh0KGlob3N0LCBpZGV2LAorCQkJCQkJICAgICBpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXgpOworCWlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleCA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWDsKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfREVWX0ZJTkFMKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2VfZGVjb25zdHJ1Y3QoKSAtIFRoaXMgZnVuY3Rpb24gZnJlZXMgYW4gaXNjaV9yZW1vdGVfZGV2aWNlLgorICogQGlob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAaWRldjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZW1vdGUgZGV2aWNlIHRvIGJlIGZyZWVkLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX2RlY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJLyogVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgb3V0c3RhbmRpbmcgaW8ncy4gQWxsIHBhdGhzIHRvCisJICogaGVyZSBzaG91bGQgZ28gdGhyb3VnaCBpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cy4KKwkgKiBJZiB3ZSBoaXQgdGhpcyBjb25kaXRpb24sIHdlIHdpbGwgbmVlZCBhIHdheSB0byBjb21wbGV0ZQorCSAqIGlvIHJlcXVlc3RzIGluIHByb2Nlc3MgKi8KKwlCVUdfT04oIWxpc3RfZW1wdHkoJmlkZXYtPnJlcXNfaW5fcHJvY2VzcykpOworCisJc2NpX3JlbW90ZV9kZXZpY2VfZGVzdHJ1Y3QoaWRldik7CisJbGlzdF9kZWxfaW5pdCgmaWRldi0+bm9kZSk7CisJaXNjaV9wdXRfZGV2aWNlKGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9zdG9wcGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTMyIHByZXZfc3RhdGU7CisKKwkvKiBJZiB3ZSBhcmUgZW50ZXJpbmcgZnJvbSB0aGUgc3RvcHBpbmcgc3RhdGUgbGV0IHRoZSBTQ0kgVXNlciBrbm93IHRoYXQKKwkgKiB0aGUgc3RvcCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlwcmV2X3N0YXRlID0gaWRldi0+c20ucHJldmlvdXNfc3RhdGVfaWQ7CisJaWYgKHByZXZfc3RhdGUgPT0gU0NJX0RFVl9TVE9QUElORykKKwkJaXNjaV9yZW1vdGVfZGV2aWNlX2RlY29uc3RydWN0KGlob3N0LCBpZGV2KTsKKworCXNjaV9jb250cm9sbGVyX3JlbW90ZV9kZXZpY2Vfc3RvcHBlZChpaG9zdCwgaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KGlob3N0LCBpZGV2LAorCQkJCSAgICAgU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TVEFSVF9SRVFVRVNURUQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9yZWFkeV9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NBVEEpKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU1RQX0RFVl9JRExFKTsKKwl9IGVsc2UgaWYgKGRldl9pc19leHBhbmRlcihkZXYpKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU01QX0RFVl9JRExFKTsKKwl9IGVsc2UKKwkJaXNjaV9yZW1vdGVfZGV2aWNlX3JlYWR5KGlob3N0LCBpZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHlfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYpIHsKKwkJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkJaXNjaV9yZW1vdGVfZGV2aWNlX25vdF9yZWFkeShpaG9zdCwgaWRldiwKKwkJCQkJICAgICBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUT1BfUkVRVUVTVEVEKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0dGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZCgKKwkJJmlkZXYtPnJuYywgU0NJX1NPRlRXQVJFX1NVU1BFTlNJT04sIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9yZXNldHRpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gTlVMTDsKKwlpZiAoc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaXNfcmVhZHkoJmlkZXYtPnJuYykpIHsKKwkJLyoKKwkJICogU2luY2UgdGhlIFJOQyBpcyByZWFkeSwgaXQncyBhbHJpZ2h0IHRvIGZpbmlzaCBjb21wbGV0aW9uCisJCSAqIHByb2Nlc3NpbmcgKGUuZy4gc2lnbmFsIHRoZSByZW1vdGUgZGV2aWNlIGlzIHJlYWR5KS4gKi8KKwkJc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfcmVzdW1lX2NvbXBsZXRlX2hhbmRsZXIoaWRldik7CisJfSBlbHNlIHsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsCisJCQlzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9yZXN1bWVfY29tcGxldGVfaGFuZGxlciwKKwkJCWlkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJQlVHX09OKGlkZXYtPndvcmtpbmdfcmVxdWVzdCA9PSBOVUxMKTsKKworCWlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoaWhvc3QsIGlkZXYsCisJCQkJICAgICBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfUkVRVUVTVF9TVEFSVEVEKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X25jcV9lcnJvcl9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJaWYgKGlkZXYtPm5vdF9yZWFkeV9yZWFzb24gPT0gU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1NEQl9FUlJPUl9GSVNfUkVDRUlWRUQpCisJCWlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoaWhvc3QsIGlkZXYsCisJCQkJCSAgICAgaWRldi0+bm90X3JlYWR5X3JlYXNvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9pZGxlX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWhvc3QsIGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBzY2lfc21wX3JlbW90ZV9kZXZpY2VfcmVhZHlfY21kX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlCVUdfT04oaWRldi0+d29ya2luZ19yZXF1ZXN0ID09IE5VTEwpOworCisJaXNjaV9yZW1vdGVfZGV2aWNlX25vdF9yZWFkeShpaG9zdCwgaWRldiwKKwkJCQkgICAgIFNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU01QX1JFUVVFU1RfU1RBUlRFRCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9jbWRfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfREVWX0lOSVRJQUxdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX2RldmljZV9pbml0aWFsX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9ERVZfU1RPUFBFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0b3BwZWRfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX0RFVl9TVEFSVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0aW5nX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9ERVZfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX2RldmljZV9yZWFkeV9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHlfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9TVFBfREVWX0lETEVdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfU1RQX0RFVl9DTURdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfY21kX3N1YnN0YXRlX2VudGVyLAorCX0sCisJW1NDSV9TVFBfREVWX05DUV0gPSB7IH0sCisJW1NDSV9TVFBfREVWX05DUV9FUlJPUl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9uY3FfZXJyb3Jfc3Vic3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVRdID0geyB9LAorCVtTQ0lfU01QX0RFVl9JRExFXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1NNUF9ERVZfQ01EXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9leGl0LAorCX0sCisJW1NDSV9ERVZfU1RPUFBJTkddID0geyB9LAorCVtTQ0lfREVWX0ZBSUxFRF0gPSB7IH0sCisJW1NDSV9ERVZfUkVTRVRUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXR0aW5nX3N0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcmVtb3RlX2RldmljZV9yZXNldHRpbmdfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9ERVZfRklOQUxdID0geyB9LAorfTsKKworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3QoKSAtIGNvbW1vbiBjb25zdHJ1Y3Rpb24KKyAqIEBzY2lfcG9ydDogU0FTL1NBVEEgcG9ydCB0aHJvdWdoIHdoaWNoIHRoaXMgZGV2aWNlIGlzIGFjY2Vzc2VkLgorICogQHNjaV9kZXY6IHJlbW90ZSBkZXZpY2UgdG8gY29uc3RydWN0CisgKgorICogVGhpcyByb3V0aW5lIGp1c3QgcGVyZm9ybXMgYmVuaWduIGluaXRpYWxpemF0aW9uIGFuZCBkb2VzIG5vdAorICogYWxsb2NhdGUgdGhlIHJlbW90ZV9ub2RlX2NvbnRleHQgd2hpY2ggaXMgbGVmdCB0bworICogc2NpX3JlbW90ZV9kZXZpY2VfW2RlXWFfY29uc3RydWN0KCkuICBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpCisgKiBmcmVlcyB0aGUgcmVtb3RlX25vZGVfY29udGV4dChzKSBmb3IgdGhlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlpZGV2LT5vd25pbmdfcG9ydCA9IGlwb3J0OworCWlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9IDA7CisKKwlzY2lfaW5pdF9zbSgmaWRldi0+c20sIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlX3RhYmxlLCBTQ0lfREVWX0lOSVRJQUwpOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29uc3RydWN0KCZpZGV2LT5ybmMsCisJCQkJCSAgICAgICBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpOworfQorCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX2RhX2NvbnN0cnVjdCgpIC0gY29uc3RydWN0IGRpcmVjdCBhdHRhY2hlZCBkZXZpY2UuCisgKgorICogVGhlIGluZm9ybWF0aW9uIChlLmcuIElBRiwgU2lnbmF0dXJlIEZJUywgZXRjLikgbmVjZXNzYXJ5IHRvIGJ1aWxkCisgKiB0aGUgZGV2aWNlIGlzIGtub3duIHRvIHRoZSBTQ0kgQ29yZSBzaW5jZSBpdCBpcyBjb250YWluZWQgaW4gdGhlCisgKiBzY2lfcGh5IG9iamVjdC4gIFJlbW90ZSBub2RlIGNvbnRleHQocykgaXMvYXJlIGEgZ2xvYmFsIHJlc291cmNlCisgKiBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lLCBmcmVlZCBieSBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpLgorICoKKyAqIFJldHVybnM6CisgKiBTQ0lfRkFJTFVSRV9ERVZJQ0VfRVhJU1RTIC0gZGV2aWNlIGhhcyBhbHJlYWR5IGJlZW4gY29uc3RydWN0ZWQuCisgKiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCAtIGUuZy4gc2FzIGRldmljZSBhdHRhY2hlZCB0bworICogc2F0YS1vbmx5IGNvbnRyb2xsZXIgaW5zdGFuY2UuCisgKiBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIC0gcmVtb3RlIG5vZGUgY29udGV4dHMgZXhoYXVzdGVkLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2RhX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisKKwlzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3QoaXBvcnQsIGlkZXYpOworCisJLyoKKwkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHJlcXVlc3QgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbW90ZSBub2RlIGNvbnRleHQKKwkgKiBlbnRyaWVzIHdpbGwgYmUgbmVlZGVkIHRvIHN0b3JlIHRoZSByZW1vdGUgbm9kZS4KKwkgKi8KKwlpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQgPSB0cnVlOworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2FsbG9jYXRlX3JlbW90ZV9ub2RlX2NvbnRleHQoaXBvcnQtPm93bmluZ19jb250cm9sbGVyLAorCQkJCQkJCQkgIGlkZXYsCisJCQkJCQkJCSAgJmlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleCk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYgfHwgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fAorCSAgICAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSB8fCBkZXZfaXNfZXhwYW5kZXIoZGV2KSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKworCWlkZXYtPmNvbm5lY3Rpb25fcmF0ZSA9IHNjaV9wb3J0X2dldF9tYXhfYWxsb3dlZF9zcGVlZChpcG9ydCk7CisKKwkvKiAvIEB0b2RvIFNob3VsZCBJIGFzc2lnbiB0aGUgcG9ydCB3aWR0aCBieSByZWFkaW5nIGFsbCBvZiB0aGUgcGh5cyBvbiB0aGUgcG9ydD8gKi8KKwlpZGV2LT5kZXZpY2VfcG9ydF93aWR0aCA9IDE7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2VfZWFfY29uc3RydWN0KCkgLSBjb25zdHJ1Y3QgZXhwYW5kZXIgYXR0YWNoZWQgZGV2aWNlCisgKgorICogUmVtb3RlIG5vZGUgY29udGV4dChzKSBpcy9hcmUgYSBnbG9iYWwgcmVzb3VyY2UgYWxsb2NhdGVkIGJ5IHRoaXMKKyAqIHJvdXRpbmUsIGZyZWVkIGJ5IHNjaV9yZW1vdGVfZGV2aWNlX2Rlc3RydWN0KCkuCisgKgorICogUmV0dXJuczoKKyAqIFNDSV9GQUlMVVJFX0RFVklDRV9FWElTVFMgLSBkZXZpY2UgaGFzIGFscmVhZHkgYmVlbiBjb25zdHJ1Y3RlZC4KKyAqIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MIC0gZS5nLiBzYXMgZGV2aWNlIGF0dGFjaGVkIHRvCisgKiBzYXRhLW9ubHkgY29udHJvbGxlciBpbnN0YW5jZS4KKyAqIFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgLSByZW1vdGUgbm9kZSBjb250ZXh0cyBleGhhdXN0ZWQuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZWFfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChpcG9ydCwgaWRldik7CisKKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9hbGxvY2F0ZV9yZW1vdGVfbm9kZV9jb250ZXh0KGlwb3J0LT5vd25pbmdfY29udHJvbGxlciwKKwkJCQkJCQkJICBpZGV2LAorCQkJCQkJCQkgICZpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXgpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFViB8fCBkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8CisJICAgIChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApIHx8IGRldl9pc19leHBhbmRlcihkZXYpKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MOworCisJLyoKKwkgKiBGb3IgU0FTLTIgdGhlIHBoeXNpY2FsIGxpbmsgcmF0ZSBpcyBhY3R1YWxseSBhIGxvZ2ljYWwgbGluaworCSAqIHJhdGUgdGhhdCBpbmNvcnBvcmF0ZXMgbXVsdGlwbGV4aW5nLiAgVGhlIFNDVSBkb2Vzbid0CisJICogaW5jb3Jwb3JhdGUgbXVsdGlwbGV4aW5nIGFuZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZQorCSAqIGNvbm5lY3Rpb24gdGhlIGxvZ2ljYWwgbGluayByYXRlIGlzIHRoYXQgc2FtZSBhcyB0aGUKKwkgKiBwaHlzaWNhbC4gIEZ1cnRoZXJtb3JlLCB0aGUgU0FTLTIgYW5kIFNBUy0xLjEgZmllbGRzIG92ZXJsYXkKKwkgKiBvbmUgYW5vdGhlciwgc28gdGhpcyBjb2RlIHdvcmtzIGZvciBib3RoIHNpdHVhdGlvbnMuICovCisJaWRldi0+Y29ubmVjdGlvbl9yYXRlID0gbWluX3QodTE2LCBzY2lfcG9ydF9nZXRfbWF4X2FsbG93ZWRfc3BlZWQoaXBvcnQpLAorCQkJCQkgZGV2LT5saW5rcmF0ZSk7CisKKwkvKiAvIEB0b2RvIFNob3VsZCBJIGFzc2lnbiB0aGUgcG9ydCB3aWR0aCBieSByZWFkaW5nIGFsbCBvZiB0aGUgcGh5cyBvbiB0aGUgcG9ydD8gKi8KKwlpZGV2LT5kZXZpY2VfcG9ydF93aWR0aCA9IDE7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnQoKSAtIFRoaXMgbWV0aG9kIHdpbGwgc3RhcnQgdGhlIHN1cHBsaWVkIHJlbW90ZQorICogICAgZGV2aWNlLiAgVGhpcyBtZXRob2QgZW5hYmxlcyBub3JtYWwgSU8gcmVxdWVzdHMgdG8gZmxvdyB0aHJvdWdoIHRvIHRoZQorICogICAgcmVtb3RlIGRldmljZS4KKyAqIEByZW1vdGVfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRldmljZSB0byBiZSBzdGFydGVkLgorICogQHRpbWVvdXQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiB3aGljaCB0aGUKKyAqICAgIHN0YXJ0IG9wZXJhdGlvbiBzaG91bGQgY29tcGxldGUuCisgKgorICogQW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkZXZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLiBTQ0lfU1VDQ0VTUworICogVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgZGV2aWNlIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZC4KKyAqIFNDSV9GQUlMVVJFX0lOVkFMSURfUEhZIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gc3RhcnQKKyAqIHRoZSBkZXZpY2Ugd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gcGh5cyBhZGRlZCB0byBpdC4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdGFydChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChzdGF0ZSAhPSBTQ0lfREVWX1NUT1BQRUQpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZSgmaWRldi0+cm5jLAorCQkJCQkJICAgICByZW1vdGVfZGV2aWNlX3Jlc3VtZV9kb25lLAorCQkJCQkJICAgICBpZGV2KTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX0RFVl9TVEFSVElORyk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPmlzY2lfaG9zdDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGRldi0+cGFyZW50ICYmIGRldl9pc19leHBhbmRlcihkZXYtPnBhcmVudCkpCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX2VhX2NvbnN0cnVjdChpcG9ydCwgaWRldik7CisJZWxzZQorCQlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9kYV9jb25zdHJ1Y3QoaXBvcnQsIGlkZXYpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGNvbnN0cnVjdCBmYWlsZWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBzdGFydCB0aGUgZGV2aWNlLiAqLworCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0KGlkZXYsIElTQ0lfUkVNT1RFX0RFVklDRV9TVEFSVF9USU1FT1VUKTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAicmVtb3RlIGRldmljZSBzdGFydCBmYWlsZWQ6ICVkXG4iLAorCQkJIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9udWtlX3JlcXVlc3RzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGFib3J0ZWRfdGFza19jb21wbGV0aW9uKTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaWRldiA9ICVwXG4iLCBfX2Z1bmNfXywgaWRldik7CisKKwkvKiBDbGVhbnVwIGFsbCByZXF1ZXN0cyBwZW5kaW5nIGZvciB0aGlzIGRldmljZS4gKi8KKwlpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKGlob3N0LCBpZGV2KTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaWRldiA9ICVwLCBkb25lXG4iLCBfX2Z1bmNfXywgaWRldik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIGlzY2lfcmVtb3RlX2RldmljZSB3aGVuIGEgbGlic2FzIGRldl9mb3VuZCBtZXNzYWdlCisgKiAgICBpcyByZWNlaXZlZC4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2lfcG9ydCBjb25lY3RlZCB0byB0aGlzIGRldmljZS4KKyAqCisgKiBwb2ludGVyIHRvIG5ldyBpc2NpX3JlbW90ZV9kZXZpY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICoKK2lzY2lfcmVtb3RlX2RldmljZV9hbGxvYyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTOyBpKyspIHsKKwkJaWRldiA9ICZpaG9zdC0+ZGV2aWNlc1tpXTsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElERVZfQUxMT0NBVEVELCAmaWRldi0+ZmxhZ3MpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gU0NJX01BWF9SRU1PVEVfREVWSUNFUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKFdBUk5fT05DRSghbGlzdF9lbXB0eSgmaWRldi0+cmVxc19pbl9wcm9jZXNzKSwgImZvdW5kIHJlcXVlc3RzIGluIHByb2Nlc3NcbiIpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChXQVJOX09OQ0UoIWxpc3RfZW1wdHkoJmlkZXYtPm5vZGUpLCAiZm91bmQgbm9uLWlkbGUgcmVtb3RlIGRldmljZVxuIikpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlkZXY7Cit9CisKK3ZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihrcmVmLCB0eXBlb2YoKmlkZXYpLCBrcmVmKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPmlzY2lfcG9ydC0+aXNjaV9ob3N0OworCisJaWRldi0+ZG9tYWluX2RldiA9IE5VTEw7CisJaWRldi0+aXNjaV9wb3J0ID0gTlVMTDsKKwljbGVhcl9iaXQoSURFVl9TVEFSVF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChJREVWX1NUT1BfUEVORElORywgJmlkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoSURFVl9HT05FLCAmaWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChJREVWX0VILCAmaWRldi0+ZmxhZ3MpOworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChJREVWX0FMTE9DQVRFRCwgJmlkZXYtPmZsYWdzKTsKKwl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKK30KKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSB0byBzdG9wIHRoZQorICogICAgcmVtb3RlIGRldmljZS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBpc2NpX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZW1vdGUgZGV2aWNlLgorICoKKyAqIFRoZSBzdGF0dXMgb2YgdGhlIGlob3N0IHJlcXVlc3QgdG8gc3RvcC4KKyAqLworZW51bSBzY2lfc3RhdHVzIGlzY2lfcmVtb3RlX2RldmljZV9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpZGV2LT5kb21haW5fZGV2LT5sbGRkX2RldiA9IE5VTEw7IC8qIGRpc2FibGUgbmV3IGxvb2t1cHMgKi8KKwlzZXRfYml0KElERVZfR09ORSwgJmlkZXYtPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBLaWxsIGFsbCBvdXRzdGFuZGluZyByZXF1ZXN0cy4gKi8KKwlpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cyhpaG9zdCwgaWRldik7CisKKwlzZXRfYml0KElERVZfU1RPUF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9zdG9wKGlkZXYsIDUwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciB0aGUgc3RvcCBjb21wbGV0ZSBjYWxsYmFjay4gKi8KKwlpZiAoV0FSTl9PTkNFKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUywgImZhaWxlZCB0byBzdG9wIGRldmljZVxuIikpCisJCS8qIG5vdGhpbmcgdG8gd2FpdCBmb3IgKi87CisJZWxzZQorCQl3YWl0X2Zvcl9kZXZpY2Vfc3RvcChpaG9zdCwgaWRldik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9nb25lKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgd2hlbiBhIGRvbWFpbgorICogICAgZGV2aWNlIGlzIHJlbW92ZWQuCisgKiBAZG9tYWluX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsaWJzYXMgZG9tYWluIGRldmljZS4KKyAqCisgKi8KK3ZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX2dvbmUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRldl90b19paG9zdChkZXYpOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBkZXYtPmxsZGRfZGV2OworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBkb21haW5fZGV2aWNlID0gJXAsIGlzY2lfZGV2aWNlID0gJXAsIGlzY2lfcG9ydCA9ICVwXG4iLAorCQlfX2Z1bmNfXywgZGV2LCBpZGV2LCBpZGV2LT5pc2NpX3BvcnQpOworCisJaXNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoaWhvc3QsIGlkZXYpOworfQorCisKKy8qKgorICogaXNjaV9yZW1vdGVfZGV2aWNlX2ZvdW5kKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgd2hlbiBhIHJlbW90ZQorICogICAgZGV2aWNlIGlzIGRpc2NvdmVyZWQuIEEgcmVtb3RlIGRldmljZSBvYmplY3QgaXMgY3JlYXRlZCBhbmQgc3RhcnRlZC4gdGhlCisgKiAgICBmdW5jdGlvbiB0aGVuIHNsZWVwcyB1bnRpbCB0aGUgc2NpIGNvcmUgZGV2aWNlIHN0YXJ0ZWQgbWVzc2FnZSBpcworICogICAgcmVjZWl2ZWQuCisgKiBAZG9tYWluX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsaWJzYXMgZG9tYWluIGRldmljZS4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3JlbW90ZV9kZXZpY2VfZm91bmQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXYpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0ID0gZGV2X3RvX2lob3N0KGRvbWFpbl9kZXYpOworCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlzY2lfcGh5OworCXN0cnVjdCBhc2Rfc2FzX3BvcnQgKnNhc19wb3J0OworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZTsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogZG9tYWluX2RldmljZSA9ICVwXG4iLCBfX2Z1bmNfXywgZG9tYWluX2Rldik7CisKKwl3YWl0X2Zvcl9zdGFydChpc2NpX2hvc3QpOworCisJc2FzX3BvcnQgPSBkb21haW5fZGV2LT5wb3J0OworCXNhc19waHkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzYXNfcG9ydC0+cGh5X2xpc3QsIHN0cnVjdCBhc2Rfc2FzX3BoeSwKKwkJCQkgICBwb3J0X3BoeV9lbCk7CisJaXNjaV9waHkgPSB0b19pcGh5KHNhc19waHkpOworCWlzY2lfcG9ydCA9IGlzY2lfcGh5LT5pc2NpX3BvcnQ7CisKKwkvKiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZvciBhIGRldmljZSBvbiB0aGlzIHBvcnQsCisJICogc28gaXQgaGFzIHRvIGNvbWUgdXAgZXZlbnR1YWxseQorCSAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlzY2lfcG9ydC0+c3RhcnRfY29tcGxldGUpOworCisJaWYgKChpc2NpX3N0b3BwaW5nID09IGlzY2lfcG9ydF9nZXRfc3RhdGUoaXNjaV9wb3J0KSkgfHwKKwkgICAgKGlzY2lfc3RvcHBlZCA9PSBpc2NpX3BvcnRfZ2V0X3N0YXRlKGlzY2lfcG9ydCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlzY2lfZGV2aWNlID0gaXNjaV9yZW1vdGVfZGV2aWNlX2FsbG9jKGlzY2lfaG9zdCwgaXNjaV9wb3J0KTsKKwlpZiAoIWlzY2lfZGV2aWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWtyZWZfaW5pdCgmaXNjaV9kZXZpY2UtPmtyZWYpOworCUlOSVRfTElTVF9IRUFEKCZpc2NpX2RldmljZS0+bm9kZSk7CisKKwlzcGluX2xvY2tfaXJxKCZpc2NpX2hvc3QtPnNjaWNfbG9jayk7CisJaXNjaV9kZXZpY2UtPmRvbWFpbl9kZXYgPSBkb21haW5fZGV2OworCWlzY2lfZGV2aWNlLT5pc2NpX3BvcnQgPSBpc2NpX3BvcnQ7CisJbGlzdF9hZGRfdGFpbCgmaXNjaV9kZXZpY2UtPm5vZGUsICZpc2NpX3BvcnQtPnJlbW90ZV9kZXZfbGlzdCk7CisKKwlzZXRfYml0KElERVZfU1RBUlRfUEVORElORywgJmlzY2lfZGV2aWNlLT5mbGFncyk7CisJc3RhdHVzID0gaXNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChpc2NpX3BvcnQsIGlzY2lfZGV2aWNlKTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2RldmljZSk7CisKKwlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCS8qIGRldmljZSBjYW1lIHVwLCBhZHZlcnRpc2UgaXQgdG8gdGhlIHdvcmxkICovCisJCWRvbWFpbl9kZXYtPmxsZGRfZGV2ID0gaXNjaV9kZXZpY2U7CisJfSBlbHNlCisJCWlzY2lfcHV0X2RldmljZShpc2NpX2RldmljZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpc2NpX2hvc3QtPnNjaWNfbG9jayk7CisKKwkvKiB3YWl0IGZvciB0aGUgZGV2aWNlIHJlYWR5IGNhbGxiYWNrLiAqLworCXdhaXRfZm9yX2RldmljZV9zdGFydChpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKworCXJldHVybiBzdGF0dXMgPT0gU0NJX1NVQ0NFU1MgPyAwIDogLUVOT0RFVjsKK30KKy8qKgorICogaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZygpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHRoZXJlIGlzIGFueQorICogICAgcGVuZGluZyByZXNldCBjb25kaXRpb24gb24gdGhlIGRldmljZS4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgaXNjaV9kZXZpY2Ugb2JqZWN0LgorICoKKyAqIHRydWUgaWYgdGhlcmUgaXMgYSByZXNldCBwZW5kaW5nIGZvciB0aGUgZGV2aWNlLgorICovCitib29sIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoCisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICp0bXBfcmVxOworCWJvb2wgcmVzZXRfaXNfcGVuZGluZyA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2RldmljZSA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV9kZXZpY2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBmb3IgcmVzZXQgb24gYWxsIHBlbmRpbmcgcmVxdWVzdHMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlzY2lfcmVxdWVzdCwgdG1wX3JlcSwKKwkJCQkgJmlzY2lfZGV2aWNlLT5yZXFzX2luX3Byb2Nlc3MsIGRldl9ub2RlKSB7CisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpc2NpX2RldmljZSA9ICVwIHJlcXVlc3QgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpc2NpX2RldmljZSwgaXNjaV9yZXF1ZXN0KTsKKworCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7CisJCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soCisJCQkJaXNjaV9yZXF1ZXN0KTsKKworCQkJc3Bpbl9sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCQkJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCkKKwkJCQlyZXNldF9pc19wZW5kaW5nID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXAgcmVzZXRfaXNfcGVuZGluZyA9ICVkXG4iLAorCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UsIHJlc2V0X2lzX3BlbmRpbmcpOworCisJcmV0dXJuIHJlc2V0X2lzX3BlbmRpbmc7Cit9CisKKy8qKgorICogaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZygpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFyIGlmIGFueSBwZW5kaW5nCisgKiAgICByZXNldCBjb25kaXRpb24gZmxhZ3Mgb24gdGhlIGRldmljZS4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgaXNjaV9kZXZpY2Ugb2JqZWN0LgorICoKKyAqIHRydWUgaWYgdGhlcmUgaXMgYSByZXNldCBwZW5kaW5nIGZvciB0aGUgZGV2aWNlLgorICovCit2b2lkIGlzY2lfZGV2aWNlX2NsZWFyX3Jlc2V0X3BlbmRpbmcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV9yZXF1ZXN0OworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnRtcF9yZXE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlkZXY9JXAsIGlob3N0PSVwXG4iLAorCQkgX19mdW5jX18sIGlkZXYsIGlob3N0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBDbGVhciByZXNldCBwZW5kaW5nIG9uIGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpc2NpX3JlcXVlc3QsIHRtcF9yZXEsCisJCQkJICZpZGV2LT5yZXFzX2luX3Byb2Nlc3MsIGRldl9ub2RlKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaWRldiA9ICVwIHJlcXVlc3QgPSAlcFxuIiwKKwkJCSBfX2Z1bmNfXywgaWRldiwgaXNjaV9yZXF1ZXN0KTsKKworCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7CisKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MyOworCQkJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKAorCQkJCWlzY2lfcmVxdWVzdCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzMik7CisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19ORUVEX0RFVl9SRVNFVDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MyKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjY2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuaApAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfSVNDSV9SRU1PVEVfREVWSUNFX0hfCisjZGVmaW5lIF9JU0NJX1JFTU9URV9ERVZJQ0VfSF8KKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlICJzY3VfcmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgInJlbW90ZV9ub2RlX2NvbnRleHQuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisKK2VudW0gc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5X3JlYXNvbl9jb2RlIHsKKwlTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUQVJUX1JFUVVFU1RFRCwKKwlTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUT1BfUkVRVUVTVEVELAorCVNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU0FUQV9SRVFVRVNUX1NUQVJURUQsCisJU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1NEQl9FUlJPUl9GSVNfUkVDRUlWRUQsCisJU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TTVBfUkVRVUVTVF9TVEFSVEVELAorCVNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfUkVBU09OX0NPREVfTUFYCit9OworCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZSAtIGlzY2kgcmVwcmVzZW50YXRpb24gb2YgYSBzYXMgZXhwYW5kZXIgLyBlbmQgcG9pbnQKKyAqIEBkZXZpY2VfcG9ydF93aWR0aDogaHcgc2V0dGluZyBmb3IgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucworICogQGNvbm5lY3Rpb25fcmF0ZTogcGVyLXRhc2tjb250ZXh0IGNvbm5lY3Rpb24gcmF0ZSBmb3IgdGhpcyBkZXZpY2UKKyAqIEB3b3JraW5nX3JlcXVlc3Q6IFNBVEEgcmVxdWVzdHMgaGF2ZSBubyB0YWcgd2UgZm9yIHVuYWNjZWxlcmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgIHByb3RvY29scyB3ZSBuZWVkIGEgbWV0aG9kIHRvIGFzc29jaWF0ZSB1bnNvbGljaXRlZAorICogICAgICAgICAgICAgICAgICAgZnJhbWVzIHdpdGggYSBwZW5kaW5nIHJlcXVlc3QKKyAqLworc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSB7CisJI2RlZmluZSBJREVWX1NUQVJUX1BFTkRJTkcgMAorCSNkZWZpbmUgSURFVl9TVE9QX1BFTkRJTkcgMQorCSNkZWZpbmUgSURFVl9BTExPQ0FURUQgMgorCSNkZWZpbmUgSURFVl9FSCAzCisJI2RlZmluZSBJREVWX0dPTkUgNAorCSNkZWZpbmUgSURFVl9JT19SRUFEWSA1CisJI2RlZmluZSBJREVWX0lPX05DUUVSUk9SIDYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0OworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcXNfaW5fcHJvY2VzczsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwl1MzIgZGV2aWNlX3BvcnRfd2lkdGg7CisJZW51bSBzYXNfbGlua3JhdGUgY29ubmVjdGlvbl9yYXRlOworCWJvb2wgaXNfZGlyZWN0X2F0dGFjaGVkOworCXN0cnVjdCBpc2NpX3BvcnQgKm93bmluZ19wb3J0OworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCBybmM7CisJLyogWFhYIHVuaWZ5IHdpdGggZGV2aWNlIHJlZmVyZW5jZSBjb3VudGluZyBhbmQgZGVsZXRlICovCisJdTMyIHN0YXJ0ZWRfcmVxdWVzdF9jb3VudDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICp3b3JraW5nX3JlcXVlc3Q7CisJdTMyIG5vdF9yZWFkeV9yZWFzb247Cit9OworCisjZGVmaW5lIElTQ0lfUkVNT1RFX0RFVklDRV9TVEFSVF9USU1FT1VUIDUwMDAKKworLyogZGV2aWNlIHJlZmVyZW5jZSByb3V0aW5lcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBzY2lfbG9jayAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2xvb2t1cF9kZXZpY2Uoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gZGV2LT5sbGRkX2RldjsKKworCWlmIChpZGV2ICYmICF0ZXN0X2JpdChJREVWX0dPTkUsICZpZGV2LT5mbGFncykpIHsKKwkJa3JlZl9nZXQoJmlkZXYtPmtyZWYpOworCQlyZXR1cm4gaWRldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CitzdGF0aWMgaW5saW5lIHZvaWQgaXNjaV9wdXRfZGV2aWNlKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJaWYgKGlkZXYpCisJCWtyZWZfcHV0KCZpZGV2LT5rcmVmLCBpc2NpX3JlbW90ZV9kZXZpY2VfcmVsZWFzZSk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBpc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7Cit2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9udWtlX3JlcXVlc3RzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOwordm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfZ29uZShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZG9tYWluX2Rldik7CitpbnQgaXNjaV9yZW1vdGVfZGV2aWNlX2ZvdW5kKHN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2KTsKK2Jvb2wgaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOwordm9pZCBpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoKSAtIFRoaXMgbWV0aG9kIHdpbGwgc3RvcCBib3RoIHRyYW5zbWlzc2lvbiBhbmQKKyAqICAgIHJlY2VwdGlvbiBvZiBsaW5rIGFjdGl2aXR5IGZvciB0aGUgc3VwcGxpZWQgcmVtb3RlIGRldmljZS4gIFRoaXMgbWV0aG9kCisgKiAgICBkaXNhYmxlcyBub3JtYWwgSU8gcmVxdWVzdHMgZnJvbSBmbG93aW5nIHRocm91Z2ggdG8gdGhlIHJlbW90ZSBkZXZpY2UuCisgKiBAcmVtb3RlX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdG8gYmUgc3RvcHBlZC4KKyAqIEB0aW1lb3V0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggdGhlCisgKiAgICBzdG9wIG9wZXJhdGlvbiBzaG91bGQgY29tcGxldGUuCisgKgorICogQW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkZXZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBzdG9wcGVkLiBTQ0lfU1VDQ0VTUworICogVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBkZXZpY2Ugd2FzCisgKiBzdWNjZXNzZnVsbHkgc3RvcHBlZC4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgdGltZW91dCk7CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXQoKSAtIFRoaXMgbWV0aG9kIHdpbGwgcmVzZXQgdGhlIGRldmljZSBtYWtpbmcgaXQKKyAqICAgIHJlYWR5IGZvciBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFueXRpbWUgdGhlIGRldmljZSBpcworICogICAgcmVzZXQgZWl0aGVyIHRocm91Z2ggYSBTTVAgcGh5IGNvbnRyb2wgb3IgYSBwb3J0IGhhcmQgcmVzZXQgcmVxdWVzdC4KKyAqIEByZW1vdGVfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRldmljZSB0byBiZSByZXNldC4KKyAqCisgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY3R1YWxseSBjYXVzZSB0aGUgZGV2aWNlIGhhcmR3YXJlIHRvIGJlIHJlc2V0LiBUaGlzCisgKiBtZXRob2QgcmVzZXRzIHRoZSBzb2Z0d2FyZSBvYmplY3Qgc28gdGhhdCBpdCB3aWxsIGJlIG9wZXJhdGlvbmFsIGFmdGVyIGEKKyAqIGRldmljZSBoYXJkd2FyZSByZXNldCBjb21wbGV0ZXMuIEFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgZGV2aWNlIHJlc2V0CisgKiB3YXMgYWNjZXB0ZWQuIFNDSV9TVUNDRVNTIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSByZXNldCBpcworICogc3RhcnRlZC4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOworCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKCkgLSBUaGlzIG1ldGhvZCBpbmZvcm1zIHRoZSBkZXZpY2Ugb2JqZWN0CisgKiAgICB0aGF0IHRoZSByZXNldCBvcGVyYXRpb24gaXMgY29tcGxldGUgYW5kIHRoZSBkZXZpY2UgY2FuIHJlc3VtZSBvcGVyYXRpb24KKyAqICAgIGFnYWluLgorICogQHJlbW90ZV9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZGV2aWNlIHdoaWNoIGlzIHRvIGJlIGluZm9ybWVkCisgKiAgICBvZiB0aGUgcmVzZXQgY29tcGxldGUgb3BlcmF0aW9uLgorICoKKyAqIEFuIGluZGljYXRpb24gdGhhdCB0aGUgZGV2aWNlIGlzIHJlc3VtaW5nIG9wZXJhdGlvbi4gU0NJX1NVQ0NFU1MgdGhlIGRldmljZQorICogaXMgcmVzdW1pbmcgb3BlcmF0aW9uLgorICovCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXRfY29tcGxldGUoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CisKKy8qKgorICogZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIHRoZSBzdGF0ZXMKKyAqICAgIGZvciB0aGUgY29tbW9uIHJlbW90ZSBkZXZpY2Ugc3RhdGUgbWFjaGluZS4KKyAqCisgKgorICovCitlbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyB7CisJLyoqCisJICogU2ltcGx5IHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgYmFzZSByZW1vdGUgZGV2aWNlIHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX0RFVl9JTklUSUFMLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVtb3RlIGRldmljZSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4KKwkgKiBzdG9wcGVkLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfREVWX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgdGhlIHJlbW90ZSBkZXZpY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YKKwkgKiBiZWNvbWluZyByZWFkeSAoaS5lLiBzdGFydGluZykuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zCisJICogYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RPUFBFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lfREVWX1NUQVJUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHJlbW90ZSBkZXZpY2UgaXMgbm93IHJlYWR5LiAgVGh1cywgdGhlIHVzZXIKKwkgKiBpcyBhYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGUgcmVtb3RlIGRldmljZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJX0RFVl9SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkbGUgc3Vic3RhdGUgZm9yIHRoZSBzdHAgcmVtb3RlIGRldmljZS4gIFdoZW4gdGhlcmUgYXJlIG5vCisJICogYWN0aXZlIElPIGZvciB0aGUgZGV2aWNlIGl0IGlzIGlzIGluIHRoaXMgc3RhdGUuCisJICovCisJU0NJX1NUUF9ERVZfSURMRSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbW1hbmQgc3RhdGUgZm9yIGZvciB0aGUgU1RQIHJlbW90ZSBkZXZpY2UuICBUaGlzIHN0YXRlIGlzCisJICogZW50ZXJlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcHJvY2Vzc2luZyBhIG5vbi1OQ1EgY29tbWFuZC4gIFRoZSBkZXZpY2Ugb2JqZWN0CisJICogd2lsbCBmYWlsIGFueSBuZXcgc3RhcnQgSU8gcmVxdWVzdHMgdW50aWwgdGhpcyBjb21tYW5kIGlzIGNvbXBsZXRlLgorCSAqLworCVNDSV9TVFBfREVWX0NNRCwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIE5DUSBzdGF0ZSBmb3IgdGhlIFNUUCByZW1vdGUgZGV2aWNlLiAgVGhpcyBzdGF0ZSBpcyBlbnRlcmVkCisJICogd2hlbiB0aGUgZGV2aWNlIGlzIHByb2Nlc3NpbmcgYW4gTkNRIHJldXFlc3QuICBJdCB3aWxsIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJICogc28gbG9uZyBhcyB0aGVyZSBpcyBvbmUgb3IgbW9yZSBOQ1EgcmVxdWVzdHMgYmVpbmcgcHJvY2Vzc2VkLgorCSAqLworCVNDSV9TVFBfREVWX05DUSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIE5DUSBlcnJvciBzdGF0ZSBmb3IgdGhlIFNUUCByZW1vdGUgZGV2aWNlLiAgVGhpcyBzdGF0ZSBpcworCSAqIGVudGVyZWQgd2hlbiBhbiBTREIgZXJyb3IgRklTIGlzIHJlY2VpdmVkIGJ5IHRoZSBkZXZpY2Ugb2JqZWN0IHdoaWxlIGluIHRoZQorCSAqIE5DUSBzdGF0ZS4gIFRoZSBkZXZpY2Ugb2JqZWN0IHdpbGwgb25seSBhY2NlcHQgYSBSRUFEIExPRyBjb21tYW5kIHdoaWxlIGluCisJICogdGhpcyBzdGF0ZS4KKwkgKi8KKwlTQ0lfU1RQX0RFVl9OQ1FfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBSRUFEWSBzdWJzdGF0ZSBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyB3YWl0aW5nIGZvciB0aGUgUkVTRVQgdGFzaworCSAqIGNvbWluZyB0byBiZSByZWNvdmVyZWQgZnJvbSBjZXJ0YWluIGhhcmR3YXJlIHNwZWNpZmljIGVycm9yLgorCSAqLworCVNDSV9TVFBfREVWX0FXQUlUX1JFU0VULAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgcmVhZHkgb3BlcmF0aW9uYWwgc3Vic3RhdGUgZm9yIHRoZSByZW1vdGUgZGV2aWNlLiAgVGhpcyBpcyB0aGUKKwkgKiBub3JtYWwgb3BlcmF0aW9uYWwgc3RhdGUgZm9yIGEgcmVtb3RlIGRldmljZS4KKwkgKi8KKwlTQ0lfU01QX0RFVl9JRExFLAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgc3VzcGVuZGVkIHN0YXRlIGZvciB0aGUgcmVtb3RlIGRldmljZS4gIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQKKwkgKiB0aGUgZGV2aWNlIGlzIHBsYWNlZCBpbiB3aGVuIGEgUk5DIHN1c3BlbmQgaXMgcmVjZWl2ZWQgYnkgdGhlIFNDVSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfU01QX0RFVl9DTUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSByZW1vdGUgZGV2aWNlIGlzIGluIHRoZSBwcm9jZXNzIG9mCisJICogc3RvcHBpbmcuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQsIGJ1dAorCSAqIGV4aXN0aW5nIElPIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgdG8gY29tcGxldGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBGQUlMRUQgc3RhdGUuCisJICovCisJU0NJX0RFVl9TVE9QUElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBkZXZpY2UgaGFzIGZhaWxlZC4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUxJWklORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX0RFVl9GQUlMRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlc2V0LgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX0RFVl9SRVNFVFRJTkcsCisKKwkvKioKKwkgKiBTaW1wbHkgdGhlIGZpbmFsIHN0YXRlIGZvciB0aGUgYmFzZSByZW1vdGUgZGV2aWNlIHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX0RFVl9GSU5BTCwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqcm5jX3RvX2RldihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYykKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCisJaWRldiA9IGNvbnRhaW5lcl9vZihybmMsIHR5cGVvZigqaWRldiksIHJuYyk7CisKKwlyZXR1cm4gaWRldjsKK30KKworc3RhdGljIGlubGluZSBib29sIGRldl9pc19leHBhbmRlcihzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmRldl90eXBlID09IEVER0VfREVWIHx8IGRldi0+ZGV2X3R5cGUgPT0gRkFOT1VUX0RFVjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2RlY3JlbWVudF9yZXF1ZXN0X2NvdW50KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJLyogWFhYIGRlbGV0ZSB0aGlzIHZvb2RvbyB3aGVuIGNvbnZlcnRpbmcgdG8gdGhlIHRvcC1sZXZlbCBkZXZpY2UKKwkgKiByZWZlcmVuY2UgY291bnQKKwkgKi8KKwlpZiAoV0FSTl9PTkNFKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwLAorCQkgICAgICAiJXM6IHRyaWVkIHRvIGRlY3JlbWVudCBzdGFydGVkX3JlcXVlc3RfY291bnQgcGFzdCAwIT8iLAorCQkJX19mdW5jX18pKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50LS07Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9mcmFtZV9oYW5kbGVyKAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTMyIGZyYW1lX2luZGV4KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgZXZlbnRfY29kZSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdGFydF9pbygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfdGFzaygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfY29tcGxldGVfaW8oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgc3VzcGVuZF90eXBlKTsKKwordm9pZCBzY2lfcmVtb3RlX2RldmljZV9wb3N0X3JlcXVlc3QoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgcmVxdWVzdCk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVNDSV9SRU1PVEVfREVWSUNFX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGU4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV9jb250ZXh0LmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInJlbW90ZV9kZXZpY2UuaCIKKyNpbmNsdWRlICJyZW1vdGVfbm9kZV9jb250ZXh0LmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAic2N1X3Rhc2tfY29udGV4dC5oIgorCisKKy8qKgorICoKKyAqIEBzY2lfcm5jOiBUaGUgUk5DIGZvciB3aGljaCB0aGUgaXMgcG9zdGVkIHJlcXVlc3QgaXMgYmVpbmcgbWFkZS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBSTkMgaXMgbm90IGluIHRoZSBpbml0aWFsIHN0YXRlLiAgSW4gYWxsCisgKiBvdGhlciBzdGF0ZXMgdGhlIFJOQyBpcyBjb25zaWRlcmVkIGFjdGl2ZSBhbmQgdGhpcyB3aWxsIHJldHVybiB0cnVlLiBUaGUKKyAqIGRlc3Ryb3kgcmVxdWVzdCBvZiB0aGUgc3RhdGUgbWFjaGluZSBkcml2ZXMgdGhlIFJOQyBiYWNrIHRvIHRoZSBpbml0aWFsCisgKiBzdGF0ZS4gIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGNoYW5nZXMgdGhlbiB0aGlzIHJvdXRpbmUgd2lsbCBhbHNvIGhhdmUgdG8gYmUKKyAqIGNoYW5nZWQuIGJvb2wgdHJ1ZSBpZiB0aGUgc3RhdGUgbWFjaGluZSBpcyBub3QgaW4gdGhlIGluaXRpYWwgc3RhdGUgZmFsc2UgaWYKKyAqIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIGluIHRoZSBpbml0aWFsIHN0YXRlCisgKi8KKworLyoqCisgKgorICogQHNjaV9ybmM6IFRoZSBzdGF0ZSBvZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBvYmplY3QgdG8gY2hlY2suCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpcyBpbiBhIFJFQURZIHN0YXRlCisgKiBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gZmFsc2UgYm9vbCB0cnVlIGlmIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIGluCisgKiB0aGUgcmVhZHkgc3RhdGUuIGZhbHNlIGlmIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIG5vdCBpbiB0aGUgcmVhZHkgc3RhdGUuCisgKi8KK2Jvb2wgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaXNfcmVhZHkoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKQoreworCXUzMiBjdXJyZW50X3N0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChjdXJyZW50X3N0YXRlID09IFNDSV9STkNfUkVBRFkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmNfYnlfaWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiBpZCkKK3sKKwlpZiAoaWQgPCBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllcyAmJgorCSAgICBpaG9zdC0+ZGV2aWNlX3RhYmxlW2lkXSkKKwkJcmV0dXJuICZpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZVtpZF07CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29uc3RydWN0X2J1ZmZlcihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IHJuY190b19kZXYoc2NpX3JuYyk7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJaW50IHJuaSA9IHNjaV9ybmMtPnJlbW90ZV9ub2RlX2luZGV4OworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmM7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3Q7CisJX19sZTY0IHNhc19hZGRyOworCisJaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJcm5jID0gc2NpX3JuY19ieV9pZChpaG9zdCwgcm5pKTsKKworCW1lbXNldChybmMsIDAsIHNpemVvZih1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCkKKwkJKiBzY2lfcmVtb3RlX2RldmljZV9ub2RlX2NvdW50KGlkZXYpKTsKKworCXJuYy0+c3NwLnJlbW90ZV9ub2RlX2luZGV4ID0gcm5pOworCXJuYy0+c3NwLnJlbW90ZV9ub2RlX3BvcnRfd2lkdGggPSBpZGV2LT5kZXZpY2VfcG9ydF93aWR0aDsKKwlybmMtPnNzcC5sb2dpY2FsX3BvcnRfaW5kZXggPSBpZGV2LT5vd25pbmdfcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKworCS8qIHNhcyBhZGRyZXNzIGlzIF9fYmU2NCwgY29udGV4dCByYW0gZm9ybWF0IGlzIF9fbGU2NCAqLworCXNhc19hZGRyID0gY3B1X3RvX2xlNjQoU0FTX0FERFIoZGV2LT5zYXNfYWRkcikpOworCXJuYy0+c3NwLnJlbW90ZV9zYXNfYWRkcmVzc19oaSA9IHVwcGVyXzMyX2JpdHMoc2FzX2FkZHIpOworCXJuYy0+c3NwLnJlbW90ZV9zYXNfYWRkcmVzc19sbyA9IGxvd2VyXzMyX2JpdHMoc2FzX2FkZHIpOworCisJcm5jLT5zc3AubmV4dXNfbG9zc190aW1lcl9lbmFibGUgPSB0cnVlOworCXJuYy0+c3NwLmNoZWNrX2JpdCAgICAgICAgICAgICAgID0gZmFsc2U7CisJcm5jLT5zc3AuaXNfdmFsaWQgICAgICAgICAgICAgICAgPSBmYWxzZTsKKwlybmMtPnNzcC5pc19yZW1vdGVfbm9kZV9jb250ZXh0ICA9IHRydWU7CisJcm5jLT5zc3AuZnVuY3Rpb25fbnVtYmVyICAgICAgICAgPSAwOworCisJcm5jLT5zc3AuYXJiaXRyYXRpb25fd2FpdF90aW1lID0gMDsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCXJuYy0+c3NwLmNvbm5lY3Rpb25fb2NjdXBhbmN5X3RpbWVvdXQgPQorCQkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zdHBfbWF4X29jY3VwYW5jeV90aW1lb3V0OworCQlybmMtPnNzcC5jb25uZWN0aW9uX2luYWN0aXZpdHlfdGltZW91dCA9CisJCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnN0cF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisJfSBlbHNlIHsKKwkJcm5jLT5zc3AuY29ubmVjdGlvbl9vY2N1cGFuY3lfdGltZW91dCAgPQorCQkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0OworCQlybmMtPnNzcC5jb25uZWN0aW9uX2luYWN0aXZpdHlfdGltZW91dCA9CisJCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisJfQorCisJcm5jLT5zc3AuaW5pdGlhbF9hcmJpdHJhdGlvbl93YWl0X3RpbWUgPSAwOworCisJLyogT3BlbiBBZGRyZXNzIEZyYW1lIFBhcmFtZXRlcnMgKi8KKwlybmMtPnNzcC5vYWZfY29ubmVjdGlvbl9yYXRlID0gaWRldi0+Y29ubmVjdGlvbl9yYXRlOworCXJuYy0+c3NwLm9hZl9mZWF0dXJlcyA9IDA7CisJcm5jLT5zc3Aub2FmX3NvdXJjZV96b25lX2dyb3VwID0gMDsKKwlybmMtPnNzcC5vYWZfbW9yZV9jb21wYXRpYmlsaXR5X2ZlYXR1cmVzID0gMDsKK30KKworLyoqCisgKgorICogQHNjaV9ybmM6CisgKiBAY2FsbGJhY2s6CisgKiBAY2FsbGJhY2tfcGFyYW1ldGVyOgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0dXAgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgb2JqZWN0IHNvIGl0IHdpbGwgdHJhbnNpdGlvbgorICogdG8gaXRzIHJlYWR5IHN0YXRlLiAgSWYgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgYWxyZWFkeSBzZXR1cCB0bworICogdHJhbnNpdGlvbiB0byBpdHMgZmluYWwgc3RhdGUgdGhlbiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCXNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNhbGxiYWNrLAorCXZvaWQgKmNhbGxiYWNrX3BhcmFtZXRlcikKK3sKKwlpZiAoc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgIT0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUwpIHsKKwkJc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9SRUFEWTsKKwkJc2NpX3JuYy0+dXNlcl9jYWxsYmFjayAgICAgPSBjYWxsYmFjazsKKwkJc2NpX3JuYy0+dXNlcl9jb29raWUgICAgICAgPSBjYWxsYmFja19wYXJhbWV0ZXI7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19kZXN0b3J5KAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwlzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYWxsYmFjaywKKwl2b2lkICpjYWxsYmFja19wYXJhbWV0ZXIpCit7CisJc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9GSU5BTDsKKwlzY2lfcm5jLT51c2VyX2NhbGxiYWNrICAgICA9IGNhbGxiYWNrOworCXNjaV9ybmMtPnVzZXJfY29va2llICAgICAgID0gY2FsbGJhY2tfcGFyYW1ldGVyOworfQorCisvKioKKyAqCisgKgorICogVGhpcyBtZXRob2QganVzdCBjYWxscyB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbiBhbmQgdGhlbiByZXNldHMgdGhlCisgKiBjYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfbm90aWZ5X3VzZXIoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMpCit7CisJaWYgKHJuYy0+dXNlcl9jYWxsYmFjayAhPSBOVUxMKSB7CisJCSgqcm5jLT51c2VyX2NhbGxiYWNrKShybmMtPnVzZXJfY29va2llKTsKKworCQlybmMtPnVzZXJfY2FsbGJhY2sgPSBOVUxMOworCQlybmMtPnVzZXJfY29va2llID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnRpbnVlX3N0YXRlX3RyYW5zaXRpb25zKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jKQoreworCWlmIChybmMtPmRlc3RpbmF0aW9uX3N0YXRlID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1JFQURZKQorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUocm5jLCBybmMtPnVzZXJfY2FsbGJhY2ssCisJCQkJCQkgICAgcm5jLT51c2VyX2Nvb2tpZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3ZhbGlkYXRlX2NvbnRleHRfYnVmZmVyKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYykKK3sKKwl1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jX2J1ZmZlcjsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gcm5jX3RvX2RldihzY2lfcm5jKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXJuY19idWZmZXIgPSBzY2lfcm5jX2J5X2lkKGlob3N0LCBzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleCk7CisKKwlybmNfYnVmZmVyLT5zc3AuaXNfdmFsaWQgPSB0cnVlOworCisJaWYgKCFpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQgJiYKKwkgICAgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpKSB7CisJCXNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChpZGV2LCBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DXzk2KTsKKwl9IGVsc2UgeworCQlzY2lfcmVtb3RlX2RldmljZV9wb3N0X3JlcXVlc3QoaWRldiwgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ18zMik7CisKKwkJaWYgKGlkZXYtPmlzX2RpcmVjdF9hdHRhY2hlZCkKKwkJCXNjaV9wb3J0X3NldHVwX3RyYW5zcG9ydHMoaWRldi0+b3duaW5nX3BvcnQsCisJCQkJCQkgIHNjaV9ybmMtPnJlbW90ZV9ub2RlX2luZGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGVfY29udGV4dF9idWZmZXIoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKQoreworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmNfYnVmZmVyOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBybmNfdG9fZGV2KHNjaV9ybmMpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJcm5jX2J1ZmZlciA9IHNjaV9ybmNfYnlfaWQoaWhvc3QsIHNjaV9ybmMtPnJlbW90ZV9ub2RlX2luZGV4KTsKKworCXJuY19idWZmZXItPnNzcC5pc192YWxpZCA9IGZhbHNlOworCisJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KHJuY190b19kZXYoc2NpX3JuYyksCisJCQkJICAgICAgIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfSU5WQUxJREFURSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2luaXRpYWxfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGdvdHRlbiBiYWNrIHRvIHRoZSBpbml0aWFsIHN0YXRlIGJlY2F1c2UKKwkgKiBzb21lb25lIHJlcXVlc3RlZCB0byBkZXN0cm95IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG9iamVjdC4KKwkgKi8KKwlpZiAoc20tPnByZXZpb3VzX3N0YXRlX2lkID09IFNDSV9STkNfSU5WQUxJREFUSU5HKSB7CisJCXJuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9VTlNQRUNJRklFRDsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfbm90aWZ5X3VzZXIocm5jKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Bvc3Rpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYyA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCpzY2lfcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdmFsaWRhdGVfY29udGV4dF9idWZmZXIoc2NpX3JuYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaW52YWxpZGF0ZV9jb250ZXh0X2J1ZmZlcihybmMpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldjsKKworCWlkZXYgPSBybmNfdG9fZGV2KHJuYyk7CisJZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCS8qCisJICogRm9yIGRpcmVjdCBhdHRhY2hlZCBTQVRBIGRldmljZXMgd2UgbmVlZCB0byBjbGVhciB0aGUgVExDUgorCSAqIE5DUSB0byBUQ2kgdGFnIG1hcHBpbmcgb24gdGhlIHBoeSBhbmQgaW4gY2FzZXMgd2hlcmUgd2UKKwkgKiByZXN1bWUgYmVjYXVzZSBvZiBhIHRhcmdldCByZXNldCB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlCisJICogdGhlIFNUUFRMREFSTkkgcmVnaXN0ZXIgd2l0aCB0aGUgUk5pIG9mIHRoZSBkZXZpY2UKKwkgKi8KKwlpZiAoKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpICYmCisJICAgIGlkZXYtPmlzX2RpcmVjdF9hdHRhY2hlZCkKKwkJc2NpX3BvcnRfc2V0dXBfdHJhbnNwb3J0cyhpZGV2LT5vd25pbmdfcG9ydCwKKwkJCQkJICAgICAgIHJuYy0+cmVtb3RlX25vZGVfaW5kZXgpOworCisJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KGlkZXYsIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfUkVTVU1FKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVhZHlfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKworCXJuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9VTlNQRUNJRklFRDsKKworCWlmIChybmMtPnVzZXJfY2FsbGJhY2spCisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X25vdGlmeV91c2VyKHJuYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3R4X3N1c3BlbmRlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29udGludWVfc3RhdGVfdHJhbnNpdGlvbnMocm5jKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdHhfcnhfc3VzcGVuZGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYyA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCpybmMpLCBzbSk7CisKKwlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb250aW51ZV9zdGF0ZV90cmFuc2l0aW9ucyhybmMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjaV9iYXNlX3N0YXRlIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlX3RhYmxlW10gPSB7CisJW1NDSV9STkNfSU5JVElBTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2luaXRpYWxfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JOQ19QT1NUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcG9zdGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX0lOVkFMSURBVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX1JFU1VNSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1pbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JOQ19SRUFEWV0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3JlYWR5X3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfVFhfU1VTUEVOREVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdHhfc3VzcGVuZGVkX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfVFhfUlhfU1VTUEVOREVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdHhfcnhfc3VzcGVuZGVkX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfQVdBSVRfU1VTUEVOU0lPTl0gPSB7IH0sCit9OworCit2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnN0cnVjdChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYywKKwkJCQkJICAgIHUxNiByZW1vdGVfbm9kZV9pbmRleCkKK3sKKwltZW1zZXQocm5jLCAwLCBzaXplb2Yoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0KSk7CisKKwlybmMtPnJlbW90ZV9ub2RlX2luZGV4ID0gcmVtb3RlX25vZGVfaW5kZXg7CisJcm5jLT5kZXN0aW5hdGlvbl9zdGF0ZSA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1VOU1BFQ0lGSUVEOworCisJc2NpX2luaXRfc20oJnJuYy0+c20sIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlX3RhYmxlLCBTQ0lfUk5DX0lOSVRJQUwpOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkJICAgdTMyIGV2ZW50X2NvZGUpCit7CisJZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX1BPU1RJTkc6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1BPU1RfUk5DX0NPTVBMRVRFOgorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVBRFkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNDSV9STkNfSU5WQUxJREFUSU5HOgorCQlpZiAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9QT1NUX1JOQ19JTlZBTElEQVRFX0NPTVBMRVRFKSB7CisJCQlpZiAoc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgPT0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUwpCisJCQkJc3RhdGUgPSBTQ0lfUk5DX0lOSVRJQUw7CisJCQllbHNlCisJCQkJc3RhdGUgPSBTQ0lfUk5DX1BPU1RJTkc7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgc3RhdGUpOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkpIHsKKwkJCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFg6CisJCQljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYOgorCQkJCS8qIFdlIHJlYWxseSBkb250IGNhcmUgaWYgdGhlIGhhcmR3YXJlIGlzIGdvaW5nIHRvIHN1c3BlbmQKKwkJCQkgKiB0aGUgZGV2aWNlIHNpbmNlIGl0J3MgYmVpbmcgaW52YWxpZGF0ZWQgYW55d2F5ICovCisJCQkJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCQkJIiVzOiBTQ0lDIFJlbW90ZSBOb2RlIENvbnRleHQgMHglcCB3YXMgIgorCQkJCQkic3VzcGVuZWRlZCBieSBoYXJkd2FyZSB3aGlsZSBiZWluZyAiCisJCQkJCSJpbnZhbGlkYXRlZC5cbiIsIF9fZnVuY19fLCBzY2lfcm5jKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX1JFU1VNSU5HOgorCQlpZiAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9QT1NUX1JDTl9SRUxFQVNFKSB7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19SRUFEWSk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSkgeworCQkJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWDoKKwkJCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlg6CisJCQkJLyogV2UgcmVhbGx5IGRvbnQgY2FyZSBpZiB0aGUgaGFyZHdhcmUgaXMgZ29pbmcgdG8gc3VzcGVuZAorCQkJCSAqIHRoZSBkZXZpY2Ugc2luY2UgaXQncyBiZWluZyByZXN1bWVkIGFueXdheSAqLworCQkJCWRldl9kYmcoc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkJCSIlczogU0NJQyBSZW1vdGUgTm9kZSBDb250ZXh0IDB4JXAgd2FzICIKKwkJCQkJInN1c3BlbmVkZWQgYnkgaGFyZHdhcmUgd2hpbGUgYmVpbmcgcmVzdW1lZC5cbiIsCisJCQkJCV9fZnVuY19fLCBzY2lfcm5jKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9UTF9STkNfU1VTUEVORF9UWDoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1RYX1NVU1BFTkRFRCk7CisJCQlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9UTF9STkNfU1VTUEVORF9UWF9SWDoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRCk7CisJCQlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT046CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1RMX1JOQ19TVVNQRU5EX1RYOgorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfVFhfU1VTUEVOREVEKTsKKwkJCXNjaV9ybmMtPnN1c3BlbnNpb25fY29kZSA9IHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1RMX1JOQ19TVVNQRU5EX1RYX1JYOgorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEKTsKKwkJCXNjaV9ybmMtPnN1c3BlbnNpb25fY29kZSA9IHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCSAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKwlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKyBvdXQ6CisJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCSAiJXM6IGNvZGU6ICUjeCBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBldmVudF9jb2RlLCBzdGF0ZSk7CisJcmV0dXJuIFNDSV9GQUlMVVJFOworCit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYl9mbiwKKwkJCQkJCSAgICAgIHZvaWQgKmNiX3ApCit7CisJZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX0lOVkFMSURBVElORzoKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fZGVzdG9yeShzY2lfcm5jLCBjYl9mbiwgY2JfcCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfUE9TVElORzoKKwljYXNlIFNDSV9STkNfUkVTVU1JTkc6CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCWNhc2UgU0NJX1JOQ19UWF9TVVNQRU5ERUQ6CisJY2FzZSBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRDoKKwljYXNlIFNDSV9STkNfQVdBSVRfU1VTUEVOU0lPTjoKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fZGVzdG9yeShzY2lfcm5jLCBjYl9mbiwgY2JfcCk7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX0lOVkFMSURBVElORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfSU5JVElBTDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQkvKiBXZSBoYXZlIGRlY2lkZWQgdGhhdCB0aGUgZGVzdHJ1Y3QgcmVxdWVzdCBvbiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dAorCQkgKiBjYW4gbm90IGZhaWwgc2luY2UgaXQgaXMgZWl0aGVyIGluIHRoZSBpbml0aWFsL2Rlc3Ryb3llZCBzdGF0ZSBvciBpcworCQkgKiBjYW4gYmUgZGVzdHJveWVkLgorCQkgKi8KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgIHUzMiBzdXNwZW5kX3R5cGUsCisJCQkJCQkgICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgICB2b2lkICpjYl9wKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJaWYgKHN0YXRlICE9IFNDSV9STkNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzY2lfcm5jLT51c2VyX2NhbGxiYWNrICAgPSBjYl9mbjsKKwlzY2lfcm5jLT51c2VyX2Nvb2tpZSAgICAgPSBjYl9wOworCXNjaV9ybmMtPnN1c3BlbnNpb25fY29kZSA9IHN1c3BlbmRfdHlwZTsKKworCWlmIChzdXNwZW5kX3R5cGUgPT0gU0NJX1NPRlRXQVJFX1NVU1BFTlNJT04pIHsKKwkJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KHJuY190b19kZXYoc2NpX3JuYyksCisJCQkJCQkgICAgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ19TVVNQRU5EX1RYKTsKKwl9CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgIHZvaWQgKmNiX3ApCit7CisJZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX0lOSVRJQUw6CisJCWlmIChzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKworCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb25zdHJ1Y3RfYnVmZmVyKHNjaV9ybmMpOworCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19QT1NUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JOQ19QT1NUSU5HOgorCWNhc2UgU0NJX1JOQ19JTlZBTElEQVRJTkc6CisJY2FzZSBTQ0lfUk5DX1JFU1VNSU5HOgorCQlpZiAoc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgIT0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfUkVBRFkpCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKworCQlzY2lfcm5jLT51c2VyX2NhbGxiYWNrID0gY2JfZm47CisJCXNjaV9ybmMtPnVzZXJfY29va2llICAgPSBjYl9wOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX1RYX1NVU1BFTkRFRDogeworCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gcm5jX3RvX2RldihzY2lfcm5jKTsKKwkJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fcmVzdW1lKHNjaV9ybmMsIGNiX2ZuLCBjYl9wKTsKKworCQkvKiBUT0RPOiBjb25zaWRlciBhZGRpbmcgYSByZXN1bWUgYWN0aW9uIG9mIE5PTkUsIElOVkFMSURBVEUsIFdSSVRFX1RMQ1IgKi8KKwkJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYgfHwgZGV2X2lzX2V4cGFuZGVyKGRldikpCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19SRVNVTUlORyk7CisJCWVsc2UgaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpIHsKKwkJCWlmIChpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQpIHsKKwkJCQkvKiBAdG9kbyBGaXggdGhpcyBzaW5jZSBJIGFtIGJlaW5nIHNpbGx5IGluIHdyaXRpbmcgdG8gdGhlIFNUUFRMREFSTkkgcmVnaXN0ZXIuICovCisJCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVTVU1JTkcpOworCQkJfSBlbHNlIHsKKwkJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19JTlZBTElEQVRJTkcpOworCQkJfQorCQl9IGVsc2UKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwljYXNlIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEOgorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19SRVNVTUlORyk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OOgorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbyhzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX1RYX1NVU1BFTkRFRDoKKwljYXNlIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEOgorCWNhc2UgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OOgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCSAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlkZXZfZGJnKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkiJXM6IHJlcXVlc3RlZCB0byBzdGFydCBJTyB3aGlsZSBzdGlsbCByZXN1bWluZywgJWRcbiIsCisJCV9fZnVuY19fLCBzdGF0ZSk7CisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF90YXNrKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JOQ19SRVNVTUlORzoKKwljYXNlIFNDSV9STkNfUkVBRFk6CisJY2FzZSBTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT046CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfVFhfU1VTUEVOREVEOgorCWNhc2UgU0NJX1JOQ19UWF9SWF9TVVNQRU5ERUQ6CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZShzY2lfcm5jLCBOVUxMLCBOVUxMKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTgwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV9jb250ZXh0LmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSF8KKyNkZWZpbmUgX1NDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSF8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMsIGNvbnN0YW50cywgYW5kIHByb3RvdHlwZXMgYXNzb2NpYXRlZCB3aXRoCisgKiAgICB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpbiB0aGUgc2lsaWNvbi4gIEl0IGV4aXN0cyB0byBtb2RlbCBhbmQgbWFuYWdlCisgKiAgICB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpbiB0aGUgc2lsaWNvbi4KKyAqCisgKgorICovCisKKyNpbmNsdWRlICJpc2NpLmgiCisKKy8qKgorICoKKyAqCisgKiBUaGlzIGNvbnN0YW50IHJlcHJlc2VudHMgYW4gaW52YWxpZCByZW1vdGUgZGV2aWNlIGlkLCBpdCBpcyB1c2VkIHRvIHByb2dyYW0KKyAqIHRoZSBTVFBEQVJOSSByZWdpc3RlciBzbyB0aGUgZHJpdmVyIGtub3dzIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU0lHTkFUVVJFCisgKiBGSVMgZnJvbSB0aGUgU0NVLgorICovCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCAgICAweDBGRkYKKworI2RlZmluZSBTQ1VfSEFSRFdBUkVfU1VTUEVOU0lPTiAgKDApCisjZGVmaW5lIFNDSV9TT0ZUV0FSRV9TVVNQRU5TSU9OICAoMSkKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKK3N0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2U7CitzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQ7CisKK3R5cGVkZWYgdm9pZCAoKnNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrKSh2b2lkICopOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGVudW1lcmF0aW9uIG9mIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHN0YXRlcy4KKyAqLworZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyB7CisJLyoqCisJICogVGhpcyBzdGF0ZSBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgYSByZW1vdGUgbm9kZSBjb250ZXh0LiAgT24gYSByZXN1bWUKKwkgKiByZXF1ZXN0IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgcG9zdGluZyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUk5DX0lOSVRJQUwsCisKKwkvKioKKwkgKiBUaGlzIGlzIGEgdHJhbnNpdGlvbiBzdGF0ZSB0aGF0IHBvc3RzIHRoZSBSTmkgdG8gdGhlIGhhcmR3YXJlLiBPbmNlIHRoZSBSTkMKKwkgKiBpcyBwb3N0ZWQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgd2lsbCBiZSBtYWRlIHJlYWR5LgorCSAqLworCVNDSV9STkNfUE9TVElORywKKworCS8qKgorCSAqIFRoaXMgaXMgYSB0cmFuc2l0aW9uIHN0YXRlIHRoYXQgd2lsbCBwb3N0IGFuIFJOQyBpbnZhbGlkYXRlIHRvIHRoZQorCSAqIGhhcmR3YXJlLiAgT25jZSB0aGUgaW52YWxpZGF0ZSBpcyBjb21wbGV0ZSB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCB3aWxsCisJICogdHJhbnNpdGlvbiB0byB0aGUgcG9zdGluZyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUk5DX0lOVkFMSURBVElORywKKworCS8qKgorCSAqIFRoaXMgaXMgYSB0cmFuc2l0aW9uIHN0YXRlIHRoYXQgd2lsbCBwb3N0IGFuIFJOQyByZXN1bWUgdG8gdGhlIGhhcmRhcmUuCisJICogT25jZSB0aGUgZXZlbnQgbm90aWZpY2F0aW9uIG9mIHJlc3VtZSBjb21wbGV0ZSBpcyByZWNlaXZlZCB0aGUgcmVtb3RlIG5vZGUKKwkgKiBjb250ZXh0IHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgcmVhZHkgc3RhdGUuCisJICovCisJU0NJX1JOQ19SRVNVTUlORywKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgbXVzdCBiZSBpbiB0byBhY2NlcHQgaW8KKwkgKiByZXF1ZXN0IG9wZXJhdGlvbnMuCisJICovCisJU0NJX1JOQ19SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgdHJhbnNpdGlvbnMgdG8gd2hlbiBpdCBnZXRzCisJICogYSBUWCBzdXNwZW5kIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfUk5DX1RYX1NVU1BFTkRFRCwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgdHJhbnNpdGlvbnMgdG8gd2hlbiBpdCBnZXRzCisJICogYSBUWCBSWCBzdXNwZW5kIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRCwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgYSB3YWl0IHN0YXRlIGZvciB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCB0aGF0IHdhaXRzIGZvciBhCisJICogc3VzcGVuZCBub3RpZmljYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUuICBUaGlzIHN0YXRlIGlzIGVudGVyZWQgd2hlbiBlaXRoZXIKKwkgKiB0aGVyZSBpcyBhIHJlcXVlc3QgdG8gc3VwZW5kIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG9yIHdoZW4gdGhlcmUgaXMgYSBUQworCSAqIGNvbXBsZXRpb24gd2hlcmUgdGhlIHJlbW90ZSBub2RlIHdpbGwgYmUgc3VzcGVuZGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT04KK307CisKKy8qKgorICoKKyAqCisgKiBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBlbmQgZGVzdGluYXRpb24gc3RhdGUgZm9yIHRoZSByZW1vdGUKKyAqIG5vZGUgY29udGV4dC4KKyAqLworZW51bSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0aW5hdGlvbl9zdGF0ZSB7CisJU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfVU5TUEVDSUZJRUQsCisJU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfUkVBRFksCisJU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUwKK307CisKKy8qKgorICogc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGRhdGEKKyAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBvYmplY3QuICBUaGUgcmVtb3RlIG5vZGUgY29udGV4dAorICogICAgKFJOQykgb2JqZWN0IG1vZGVscyB0aGUgdGhlIHJlbW90ZSBkZXZpY2UgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIG1hbmFnZQorICogICAgdGhlIHNpbGljb24gUk5DLgorICovCitzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSByZW1vdGUgbm9kZSBpbmRleCAoUk5JKSBhc3NvY2lhdGVkIHdpdGgKKwkgKiB0aGlzIFJOQy4KKwkgKi8KKwl1MTYgcmVtb3RlX25vZGVfaW5kZXg7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSByZWNvcmVkIHN1c3BlbnNpb24gY29kZSBvciB0aGUgcmVhc29uIGZvciB0aGUgcmVtb3RlIG5vZGUKKwkgKiBjb250ZXh0IHN1c3BlbnNpb24uCisJICovCisJdTMyIHN1c3BlbnNpb25fY29kZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdHJ1ZSBpZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpcyByZXN1bWluZyBmcm9tIGl0cyBjdXJyZW50CisJICogc3RhdGUuICBUaGlzIGNhbiBjYXVzZSBhbiBhdXRvbWF0aWMgcmVzdW1lIG9uIHJlY2VpdmluZyBhIHN1c3BlbnNpb24KKwkgKiBub3RpZmljYXRpb24uCisJICovCisJZW51bSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0aW5hdGlvbl9zdGF0ZSBkZXN0aW5hdGlvbl9zdGF0ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIHVzZXIgcmVxdWVzdGVkIHRvIGJlCisJICogY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RlZCBzdGF0ZSB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlLgorCSAqLworCXNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIHVzZXJfY2FsbGJhY2s7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciByZXF1ZXN0ZWQKKwkgKiBzdGF0ZSB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlZC4KKwkgKi8KKwl2b2lkICp1c2VyX2Nvb2tpZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSBvYmplY3QncyBzdGF0ZSBtYWNoaW5lLgorCSAqLworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lIHNtOworfTsKKwordm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb25zdHJ1Y3Qoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMsCisJCQkJCSAgICB1MTYgcmVtb3RlX25vZGVfaW5kZXgpOworCisKK2Jvb2wgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaXNfcmVhZHkoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJCSAgIHUzMiBldmVudF9jb2RlKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJCSAgICAgIHZvaWQgKmNhbGxiYWNrX3BhcmFtZXRlcik7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgIHUzMiBzdXNwZW5kX3R5cGUsCisJCQkJCQkgICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgICB2b2lkICpjYl9wKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgIHZvaWQgKmNiX3ApOworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X3Rhc2soc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCSAgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCisjZW5kaWYgIC8qIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV90YWJsZS5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFiMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuYwpAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRQorICogICAgcHVibGljLCBwcm90ZWN0ZWQsIGFuZCBwcml2YXRlIG1ldGhvZHMuCisgKgorICoKKyAqLworI2luY2x1ZGUgInJlbW90ZV9ub2RlX3RhYmxlLmgiCisjaW5jbHVkZSAicmVtb3RlX25vZGVfY29udGV4dC5oIgorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIGluZGV4IHRhYmxlIGZyb20gd2hpY2ggdGhlCisgKiAgICBzZWxlY3Rpb24gd2lsbCBiZSBtYWRlLgorICogQGdyb3VwX3RhYmxlX2luZGV4OiBUaGlzIGlzIHRoZSBpbmRleCB0byB0aGUgZ3JvdXAgdGFibGUgZnJvbSB3aGljaCB0bworICogICAgc2VhcmNoIGZvciBhbiBhdmFpbGFibGUgc2VsZWN0aW9uLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGZpbmQgdGhlIGJpdCBwb3NpdGlvbiBpbiBhYnNvbHV0ZSBiaXQgdGVybXMgb2YgdGhlIG5leHQgMzIKKyAqICsgYml0IHBvc2l0aW9uLiAgSWYgdGhlcmUgYXJlIGF2YWlsYWJsZSBiaXRzIGluIHRoZSBmaXJzdCB1MzIgdGhlbiBpdCBpcworICoganVzdCBiaXQgcG9zaXRpb24uIHUzMiBUaGlzIGlzIHRoZSBhYnNvbHV0ZSBiaXQgcG9zaXRpb24gZm9yIGFuIGF2YWlsYWJsZQorICogZ3JvdXAuCisgKi8KK3N0YXRpYyB1MzIgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2dldF9ncm91cF9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfdGFibGVfaW5kZXgpCit7CisJdTMyIGR3b3JkX2luZGV4OworCXUzMiAqZ3JvdXBfdGFibGU7CisJdTMyIGJpdF9pbmRleDsKKworCWdyb3VwX3RhYmxlID0gcmVtb3RlX25vZGVfdGFibGUtPnJlbW90ZV9ub2RlX2dyb3Vwc1tncm91cF90YWJsZV9pbmRleF07CisKKwlmb3IgKGR3b3JkX2luZGV4ID0gMDsgZHdvcmRfaW5kZXggPCByZW1vdGVfbm9kZV90YWJsZS0+Z3JvdXBfYXJyYXlfc2l6ZTsgZHdvcmRfaW5kZXgrKykgeworCQlpZiAoZ3JvdXBfdGFibGVbZHdvcmRfaW5kZXhdICE9IDApIHsKKwkJCWZvciAoYml0X2luZGV4ID0gMDsgYml0X2luZGV4IDwgMzI7IGJpdF9pbmRleCsrKSB7CisJCQkJaWYgKChncm91cF90YWJsZVtkd29yZF9pbmRleF0gJiAoMSA8PCBiaXRfaW5kZXgpKSAhPSAwKSB7CisJCQkJCXJldHVybiAoZHdvcmRfaW5kZXggKiAzMikgKyBiaXRfaW5kZXg7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0lOVkFMSURfSU5ERVg7Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBpbiB3aGljaCB0byBjbGVhciB0aGUKKyAqICAgIHNlbGVjdG9yLgorICogQHNldF9pbmRleDogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgc2VsZWN0b3IgaW4gd2hpY2ggdGhlIGNoYW5nZSB3aWxsIGJlCisgKiAgICBtYWRlLgorICogQGdyb3VwX2luZGV4OiBUaGlzIGlzIHRoZSBiaXQgaW5kZXggaW4gdGhlIHRhYmxlIHRvIGJlIG1vZGlmaWVkLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgY2xlYXIgdGhlIGdyb3VwIGluZGV4IGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZ3JvdXAgaW5kZXgKKyAqIHRhYmxlLiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfdGFibGVfaW5kZXgsCisJdTMyIGdyb3VwX2luZGV4KQoreworCXUzMiBkd29yZF9pbmRleDsKKwl1MzIgYml0X2luZGV4OworCXUzMiAqZ3JvdXBfdGFibGU7CisKKwlCVUdfT04oZ3JvdXBfdGFibGVfaW5kZXggPj0gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCk7CisJQlVHX09OKGdyb3VwX2luZGV4ID49ICh1MzIpKHJlbW90ZV9ub2RlX3RhYmxlLT5ncm91cF9hcnJheV9zaXplICogMzIpKTsKKworCWR3b3JkX2luZGV4ID0gZ3JvdXBfaW5kZXggLyAzMjsKKwliaXRfaW5kZXggICA9IGdyb3VwX2luZGV4ICUgMzI7CisJZ3JvdXBfdGFibGUgPSByZW1vdGVfbm9kZV90YWJsZS0+cmVtb3RlX25vZGVfZ3JvdXBzW2dyb3VwX3RhYmxlX2luZGV4XTsKKworCWdyb3VwX3RhYmxlW2R3b3JkX2luZGV4XSA9IGdyb3VwX3RhYmxlW2R3b3JkX2luZGV4XSAmIH4oMSA8PCBiaXRfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgaW4gd2hpY2ggdG8gc2V0IHRoZQorICogICAgc2VsZWN0b3IuCisgKiBAZ3JvdXBfdGFibGVfaW5kZXg6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHNlbGVjdG9yIGluIHdoaWNoIHRoZSBjaGFuZ2UKKyAqICAgIHdpbGwgYmUgbWFkZS4KKyAqIEBncm91cF9pbmRleDogVGhpcyBpcyB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSB0YWJsZSB0byBiZSBtb2RpZmllZC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgZ3JvdXAgaW5kZXggYml0IGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZ3JvcHUgaW5kZXgKKyAqIHRhYmxlLiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4LAorCXUzMiBncm91cF9pbmRleCkKK3sKKwl1MzIgZHdvcmRfaW5kZXg7CisJdTMyIGJpdF9pbmRleDsKKwl1MzIgKmdyb3VwX3RhYmxlOworCisJQlVHX09OKGdyb3VwX3RhYmxlX2luZGV4ID49IFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpOworCUJVR19PTihncm91cF9pbmRleCA+PSAodTMyKShyZW1vdGVfbm9kZV90YWJsZS0+Z3JvdXBfYXJyYXlfc2l6ZSAqIDMyKSk7CisKKwlkd29yZF9pbmRleCA9IGdyb3VwX2luZGV4IC8gMzI7CisJYml0X2luZGV4ICAgPSBncm91cF9pbmRleCAlIDMyOworCWdyb3VwX3RhYmxlID0gcmVtb3RlX25vZGVfdGFibGUtPnJlbW90ZV9ub2RlX2dyb3Vwc1tncm91cF90YWJsZV9pbmRleF07CisKKwlncm91cF90YWJsZVtkd29yZF9pbmRleF0gPSBncm91cF90YWJsZVtkd29yZF9pbmRleF0gfCAoMSA8PCBiaXRfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgaW4gd2hpY2ggdG8gbW9kaWZ5CisgKiAgICB0aGUgcmVtb3RlIG5vZGUgYXZhaWxhYmlsaXR5LgorICogQHJlbW90ZV9ub2RlX2luZGV4OiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSBpbmRleCB0aGF0IGlzIGJlaW5nIHJldHVybmVkIHRvCisgKiAgICB0aGUgdGFibGUuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIHJlbW90ZSB0byBhdmFpbGFibGUgaW4gdGhlIHJlbW90ZSBub2RlIGFsbG9jYXRpb24KKyAqIHRhYmxlLiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfbm9kZV9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIHNsb3Rfbm9ybWFsaXplZDsKKwl1MzIgc2xvdF9wb3NpdGlvbjsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAocmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IHJlbW90ZV9ub2RlX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRDsKKwlzbG90X25vcm1hbGl6ZWQgPSAoZHdvcmRfcmVtYWluZGVyIC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgKiBzaXplb2YodTMyKTsKKwlzbG90X3Bvc2l0aW9uICAgPSByZW1vdGVfbm9kZV9pbmRleCAlIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisKKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl0gfD0KKwkJMSA8PCAoc2xvdF9ub3JtYWxpemVkICsgc2xvdF9wb3NpdGlvbik7Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBmcm9tIHdoaWNoIHRvIGNsZWFyCisgKiAgICB0aGUgYXZhaWxhYmxlIHJlbW90ZSBub2RlIGJpdC4KKyAqIEByZW1vdGVfbm9kZV9pbmRleDogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgaW5kZXggd2hpY2ggaXMgdG8gYmUgY2xlYXJlZAorICogICAgZnJvbSB0aGUgdGFibGUuCisgKgorICogVGhpcyBtZXRob2QgY2xlYXJzIHRoZSByZW1vdGUgbm9kZSBpbmRleCBmcm9tIHRoZSB0YWJsZSBvZiBhdmFpbGFibGUgcmVtb3RlCisgKiBub2Rlcy4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfbm9kZV9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIHNsb3RfcG9zaXRpb247CisJdTMyIHNsb3Rfbm9ybWFsaXplZDsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAocmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IHJlbW90ZV9ub2RlX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRDsKKwlzbG90X25vcm1hbGl6ZWQgPSAoZHdvcmRfcmVtYWluZGVyIC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgKiBzaXplb2YodTMyKTsKKwlzbG90X3Bvc2l0aW9uICAgPSByZW1vdGVfbm9kZV9pbmRleCAlIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisKKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl0gJj0KKwkJfigxIDw8IChzbG90X25vcm1hbGl6ZWQgKyBzbG90X3Bvc2l0aW9uKSk7Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGUgcmVtb3RlIG5vZGUgdGFibGUgZnJvbSB3aGljaCB0aGUgc2xvdCB3aWxsIGJlCisgKiAgICBjbGVhcmVkLgorICogQGdyb3VwX2luZGV4OiBUaGUgaW5kZXggZm9yIHRoZSBzbG90IHRoYXQgaXMgdG8gYmUgY2xlYXJlZC4KKyAqCisgKiBUaGlzIG1ldGhvZCBjbGVhcnMgdGhlIGVudGlyZSB0YWJsZSBzbG90IGF0IHRoZSBzcGVjaWZpZWQgc2xvdCBpbmRleC4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXAoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX2luZGV4KQoreworCXUzMiBkd29yZF9sb2NhdGlvbjsKKwl1MzIgZHdvcmRfcmVtYWluZGVyOworCXUzMiBkd29yZF92YWx1ZTsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAoZ3JvdXBfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gZ3JvdXBfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRDsKKwlkd29yZF9yZW1haW5kZXIgPSBncm91cF9pbmRleCAlIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCisJZHdvcmRfdmFsdWUgPSByZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl07CisJZHdvcmRfdmFsdWUgJj0gfihTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9GVUxMX1NMT1RfVkFMVUUgPDwgKGR3b3JkX3JlbWFpbmRlciAqIDQpKTsKKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl0gPSBkd29yZF92YWx1ZTsKK30KKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOgorICoKKyAqIFRIaXMgbWV0aG9kIHNldHMgYW4gZW50aXJlIHJlbW90ZSBub2RlIGdyb3VwIGluIHRoZSByZW1vdGUgbm9kZSB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIGR3b3JkX3ZhbHVlOworCisJQlVHX09OKAorCQkocmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9ub2Rlc19hcnJheV9zaXplICogU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQpCisJCTw9IChncm91cF9pbmRleCAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpCisJCSk7CisKKwlkd29yZF9sb2NhdGlvbiAgPSBncm91cF9pbmRleCAvIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IGdyb3VwX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQ7CisKKwlkd29yZF92YWx1ZSA9IHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzW2R3b3JkX2xvY2F0aW9uXTsKKwlkd29yZF92YWx1ZSB8PSAoU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFIDw8IChkd29yZF9yZW1haW5kZXIgKiA0KSk7CisJcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbZHdvcmRfbG9jYXRpb25dID0gZHdvcmRfdmFsdWU7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgdGhhdCBmb3Igd2hpY2ggdGhlIGdyb3VwCisgKiAgICB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KKyAqIEBncm91cF9pbmRleDogVGhpcyBpcyB0aGUgZ3JvdXAgaW5kZXggdG8gdXNlIHRvIGZpbmQgdGhlIGdyb3VwIHZhbHVlLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBncm91cCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBncm91cCBpbmRleC4gVGhlCisgKiBiaXQgdmFsdWVzIGF0IHRoZSBzcGVjaWZpZWQgcmVtb3RlIG5vZGUgZ3JvdXAgaW5kZXguCisgKi8KK3N0YXRpYyB1OCBzY2lfcmVtb3RlX25vZGVfdGFibGVfZ2V0X2dyb3VwX3ZhbHVlKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiBncm91cF9pbmRleCkKK3sKKwl1MzIgZHdvcmRfbG9jYXRpb247CisJdTMyIGR3b3JkX3JlbWFpbmRlcjsKKwl1MzIgZHdvcmRfdmFsdWU7CisKKwlkd29yZF9sb2NhdGlvbiAgPSBncm91cF9pbmRleCAvIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IGdyb3VwX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQ7CisKKwlkd29yZF92YWx1ZSA9IHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzW2R3b3JkX2xvY2F0aW9uXTsKKwlkd29yZF92YWx1ZSAmPSAoU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFIDw8IChkd29yZF9yZW1haW5kZXIgKiA0KSk7CisJZHdvcmRfdmFsdWUgPSBkd29yZF92YWx1ZSA+PiAoZHdvcmRfcmVtYWluZGVyICogNCk7CisKKwlyZXR1cm4gKHU4KWR3b3JkX3ZhbHVlOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhlIHJlbW90ZSB0aGF0IHdoaWNoIGlzIHRvIGJlIGluaXRpYWxpemVkLgorICogQHJlbW90ZV9ub2RlX2VudHJpZXM6IFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBwdXQgaW4gdGhlIHRhYmxlLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgaW5pdGlhbGl6ZSB0aGUgcmVtb3RlIG5vZGUgdGFibGUgZm9yIHVzZS4gbm9uZQorICovCit2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9pbml0aWFsaXplKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiByZW1vdGVfbm9kZV9lbnRyaWVzKQoreworCXUzMiBpbmRleDsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcmF3IGRhdGEgd2UgY291bGQgaW1wcm92ZSB0aGUgc3BlZWQgYnkgb25seSBpbml0aWFsaXppbmcKKwkgKiB0aG9zZSBlbnRyaWVzIHRoYXQgd2UgYXJlIGFjdHVhbGx5IGdvaW5nIHRvIGJlIHVzZWQgKi8KKwltZW1zZXQoCisJCXJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLAorCQkweDAwLAorCQlzaXplb2YocmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXMpCisJCSk7CisKKwltZW1zZXQoCisJCXJlbW90ZV9ub2RlX3RhYmxlLT5yZW1vdGVfbm9kZV9ncm91cHMsCisJCTB4MDAsCisJCXNpemVvZihyZW1vdGVfbm9kZV90YWJsZS0+cmVtb3RlX25vZGVfZ3JvdXBzKQorCQkpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYXZhaWxhYmxlIHJlbW90ZSBub2RlIHNldHMgKi8KKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX25vZGVzX2FycmF5X3NpemUgPSAodTE2KQorCQkJCQkJCShyZW1vdGVfbm9kZV9lbnRyaWVzIC8gU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRCkKKwkJCQkJCQkrICgocmVtb3RlX25vZGVfZW50cmllcyAlIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQpICE9IDApOworCisKKwkvKiBJbml0aWFsaXplIGVhY2ggZnVsbCBEV09SRCB0byBhIEZVTEwgU0VUIG9mIHJlbW90ZSBub2RlcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHJlbW90ZV9ub2RlX2VudHJpZXM7IGluZGV4KyspIHsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ub2RlX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCBpbmRleCk7CisJfQorCisJcmVtb3RlX25vZGVfdGFibGUtPmdyb3VwX2FycmF5X3NpemUgPSAodTE2KQorCQkJCQkgICAgICAocmVtb3RlX25vZGVfZW50cmllcyAvIChTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICogMzIpKQorCQkJCQkgICAgICArICgocmVtb3RlX25vZGVfZW50cmllcyAlIChTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICogMzIpKSAhPSAwKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChyZW1vdGVfbm9kZV9lbnRyaWVzIC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCk7IGluZGV4KyspIHsKKwkJLyoKKwkJICogVGhlc2UgYXJlIGFsbCBndWFyYW50ZWVkIHRvIGJlIGZ1bGwgc2xvdCB2YWx1ZXMgc28gZmlsbCB0aGVtIGluIHRoZQorCQkgKiBhdmFpbGFibGUgc2V0cyBvZiAzIHJlbW90ZSBub2RlcyAqLworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAyLCBpbmRleCk7CisJfQorCisJLyogTm93IGZpbGwgaW4gYW55IHJlbWFpbmRlcnMgdGhhdCB3ZSBtYXkgZmluZCAqLworCWlmICgocmVtb3RlX25vZGVfZW50cmllcyAlIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpID09IDIpIHsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMSwgaW5kZXgpOworCX0gZWxzZSBpZiAoKHJlbW90ZV9ub2RlX2VudHJpZXMgJSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSA9PSAxKSB7CisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgocmVtb3RlX25vZGVfdGFibGUsIDAsIGluZGV4KTsKKwl9Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGUgcmVtb3RlIG5vZGUgdGFibGUgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSBhCisgKiAgICByZW1vdGUgbm9kZS4KKyAqIEB0YWJsZV9pbmRleDogVGhlIGdyb3VwIGluZGV4IHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHNlYXJjaC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFsbG9jYXRlIGEgc2luZ2xlIFJOaSBmcm9tIHRoZSByZW1vdGUgbm9kZSB0YWJsZS4gIFRoZQorICogdGFibGUgaW5kZXggd2lsbCBkZXRlcm1pbmUgZnJvbSB3aGljaCByZW1vdGUgbm9kZSBncm91cCB0YWJsZSB0byBzZWFyY2guCisgKiBUaGlzIHNlYXJjaCBtYXkgZmFpbCBhbmQgYW5vdGhlciBncm91cCBub2RlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGUKKyAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGFsbG93IGEgc2VyYWNoIG9mIHRoZSBhdmFpbGFibGUgc2luZ2xlIHJlbW90ZSBub2RlCisgKiBncm91cCB1cCB0byB0aGUgdHJpcGxlIHJlbW90ZSBub2RlIGdyb3VwLiAgSWYgYW4gZW50cnkgaXMgZm91bmQgaW4gdGhlCisgKiBzcGVjaWZpZWQgdGFibGUgdGhlIHJlbW90ZSBub2RlIGlzIHJlbW92ZWQgYW5kIHRoZSByZW1vdGUgbm9kZSBncm91cHMgYXJlCisgKiB1cGRhdGVkLiBUaGUgUk5pIHZhbHVlIG9yIGFuIGludmFsaWQgcmVtb3RlIG5vZGUgY29udGV4dCBpZiBhbiBSTmkgY2FuIG5vdAorICogYmUgZm91bmQuCisgKi8KK3N0YXRpYyB1MTYgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfdGFibGVfaW5kZXgpCit7CisJdTggaW5kZXg7CisJdTggZ3JvdXBfdmFsdWU7CisJdTMyIGdyb3VwX2luZGV4OworCXUxNiByZW1vdGVfbm9kZV9pbmRleCA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWDsKKworCWdyb3VwX2luZGV4ID0gc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2dldF9ncm91cF9pbmRleCgKKwkJcmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX3RhYmxlX2luZGV4KTsKKworCS8qIFdlIGNvdWxkIG5vdCBmaW5kIGFuIGF2YWlsYWJsZSBzbG90IGluIHRoZSB0YWJsZSBzZWxlY3RvciAwICovCisJaWYgKGdyb3VwX2luZGV4ICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0lOVkFMSURfSU5ERVgpIHsKKwkJZ3JvdXBfdmFsdWUgPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfZ2V0X2dyb3VwX3ZhbHVlKAorCQkJcmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX2luZGV4KTsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOyBpbmRleCsrKSB7CisJCQlpZiAoKCgxIDw8IGluZGV4KSAmIGdyb3VwX3ZhbHVlKSAhPSAwKSB7CisJCQkJLyogV2UgaGF2ZSBzZWxlY3RlZCBhIGJpdCBub3cgY2xlYXIgaXQgKi8KKwkJCQlyZW1vdGVfbm9kZV9pbmRleCA9ICh1MTYpKGdyb3VwX2luZGV4ICogU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVAorCQkJCQkJCSAgKyBpbmRleCk7CisKKwkJCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXBfaW5kZXgoCisJCQkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCwgZ3JvdXBfaW5kZXgKKwkJCQkJKTsKKworCQkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ub2RlX2luZGV4KAorCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgKKwkJCQkJKTsKKworCQkJCWlmIChncm91cF90YWJsZV9pbmRleCA+IDApIHsKKwkJCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleCgKKwkJCQkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCAtIDEsIGdyb3VwX2luZGV4CisJCQkJCQkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlbW90ZV9ub2RlX2luZGV4OworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHRhYmxlIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlCisgKiAgICByZW1vdGUgbm9kZSBlbnRyaWVzLgorICogQGdyb3VwX3RhYmxlX2luZGV4OiBUSGlzIGlzIHRoZSBncm91cCB0YWJsZSBpbmRleCB3aGljaCBtdXN0IGVxdWFsIHR3byAoMikKKyAqICAgIGZvciB0aGlzIG9wZXJhdGlvbi4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFsbG9jYXRlIHRocmVlIGNvbnNlY3V0aXZlIHJlbW90ZSBub2RlIGNvbnRleHQgZW50cmllcy4gSWYKKyAqIHRoZXJlIGFyZSBubyByZW1haW5pbmcgdHJpcGxlIGVudHJpZXMgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgZmFpbHVyZS4KKyAqIFRoZSByZW1vdGUgbm9kZSBpbmRleCB0aGF0IHJlcHJlc2VudHMgdGhyZWUgY29uc2VjdXRpdmUgcmVtb3RlIG5vZGUgZW50cmllcworICogb3IgYW4gaW52YWxpZCByZW1vdGUgbm9kZSBjb250ZXh0IGlmIG5vbmUgY2FuIGJlIGZvdW5kLgorICovCitzdGF0aWMgdTE2IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV90cmlwbGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4KQoreworCXUzMiBncm91cF9pbmRleDsKKwl1MTYgcmVtb3RlX25vZGVfaW5kZXggPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVg7CisKKwlncm91cF9pbmRleCA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9nZXRfZ3JvdXBfaW5kZXgoCisJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCk7CisKKwlpZiAoZ3JvdXBfaW5kZXggIT0gU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfSU5WQUxJRF9JTkRFWCkgeworCQlyZW1vdGVfbm9kZV9pbmRleCA9ICh1MTYpZ3JvdXBfaW5kZXggKiBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleCgKKwkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCwgZ3JvdXBfaW5kZXgKKwkJCSk7CisKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2NsZWFyX2dyb3VwKAorCQkJcmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX2luZGV4CisJCQkpOworCX0KKworCXJldHVybiByZW1vdGVfbm9kZV9pbmRleDsKK30KKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBmcm9tIHdoaWNoIHRoZSByZW1vdGUgbm9kZQorICogICAgYWxsb2NhdGlvbiBpcyB0byB0YWtlIHBsYWNlLgorICogQHJlbW90ZV9ub2RlX2NvdW50OiBUaGlzIGlzIHRoZXIgcmVtb3RlIG5vZGUgY291bnQgd2hpY2ggaXMgb25lIG9mCisgKiAgICBTQ1VfU1NQX1JFTU9URV9OT0RFX0NPVU5UKDEpIG9yIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQoMykuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBhbGxvY2F0ZSBhIHJlbW90ZSBub2RlIHRoYXQgbWF0YWNoZXMgdGhlIHJlbW90ZSBub2RlIGNvdW50CisgKiBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlci4gIFZhbGlkIHZhbHVlcyBmb3IgcmVtb3RlIG5vZGUgY291bnQgaXMKKyAqIFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQoMSkgb3IgU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCgzKS4gdTE2IFRoaXMgaXMKKyAqIHRoZSByZW1vdGUgbm9kZSBpbmRleCB0aGF0IGlzIHJldHVybmVkIG9yIGFuIGludmFsaWQgcmVtb3RlIG5vZGUgY29udGV4dC4KKyAqLwordTE2IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9yZW1vdGVfbm9kZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfY291bnQpCit7CisJdTE2IHJlbW90ZV9ub2RlX2luZGV4ID0gU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYOworCisJaWYgKHJlbW90ZV9ub2RlX2NvdW50ID09IFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQpIHsKKwkJcmVtb3RlX25vZGVfaW5kZXggPQorCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMCk7CisKKwkJaWYgKHJlbW90ZV9ub2RlX2luZGV4ID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkgeworCQkJcmVtb3RlX25vZGVfaW5kZXggPQorCQkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJCQkJCXJlbW90ZV9ub2RlX3RhYmxlLCAxKTsKKwkJfQorCisJCWlmIChyZW1vdGVfbm9kZV9pbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpIHsKKwkJCXJlbW90ZV9ub2RlX2luZGV4ID0KKwkJCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfc2luZ2xlX3JlbW90ZV9ub2RlKAorCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMik7CisJCX0KKwl9IGVsc2UgaWYgKHJlbW90ZV9ub2RlX2NvdW50ID09IFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpIHsKKwkJcmVtb3RlX25vZGVfaW5kZXggPQorCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3RyaXBsZV9yZW1vdGVfbm9kZSgKKwkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMik7CisJfQorCisJcmV0dXJuIHJlbW90ZV9ub2RlX2luZGV4OworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6CisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBmcmVlIGEgc2luZ2xlIHJlbW90ZSBub2RlIGluZGV4IGJhY2sgdG8gdGhlIHJlbW90ZSBub2RlCisgKiB0YWJsZS4gIFRoaXMgcm91dGluZSB3aWxsIHVwZGF0ZSB0aGUgcmVtb3RlIG5vZGUgZ3JvdXBzCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MTYgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJdTMyIGdyb3VwX2luZGV4OworCXU4IGdyb3VwX3ZhbHVlOworCisJZ3JvdXBfaW5kZXggPSByZW1vdGVfbm9kZV9pbmRleCAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisKKwlncm91cF92YWx1ZSA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9nZXRfZ3JvdXBfdmFsdWUocmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX2luZGV4KTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgd2UgYXJlIG5vdCB0cnlpbmcgdG8gYWRkIGFuIGVudHJ5IHRvIGEgc2xvdCB0aGF0IGlzIGFscmVhZHkKKwkgKiBmdWxsLiAqLworCUJVR19PTihncm91cF92YWx1ZSA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9GVUxMX1NMT1RfVkFMVUUpOworCisJaWYgKGdyb3VwX3ZhbHVlID09IDB4MDApIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIG5vIGVudHJpZXMgaW4gdGhpcyBzbG90IHNvIGl0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHNpbmdsZQorCQkgKiBzbG90IHRhYmxlLiAqLworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAwLCBncm91cF9pbmRleCk7CisJfSBlbHNlIGlmICgoZ3JvdXBfdmFsdWUgJiAoZ3JvdXBfdmFsdWUgLSAxKSkgPT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGlzIHNsb3Qgc28gaXQgbXVzdCBiZSBtb3ZlZCBmcm9tIHRoZQorCQkgKiBzaW5nbGUgc2xvdCB0YWJsZSB0byB0aGUgZHVhbCBzbG90IHRhYmxlICovCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMCwgZ3JvdXBfaW5kZXgpOworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAxLCBncm91cF9pbmRleCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIHR3byBlbnRyaWVzIGluIHRoZSBzbG90IHNvIGl0IG11c3QgYmUgbW92ZWQgZnJvbSB0aGUgZHVhbAorCQkgKiBzbG90IHRhYmxlIHRvIHRoZSB0cmlwcGxlIHNsb3QgdGFibGUuICovCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMSwgZ3JvdXBfaW5kZXgpOworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAyLCBncm91cF9pbmRleCk7CisJfQorCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ub2RlX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCByZW1vdGVfbm9kZV9pbmRleCk7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgdG8gd2hpY2ggdGhlIHJlbW90ZSBub2RlCisgKiAgICBpbmRleCBpcyB0byBiZSBmcmVlZC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbGVhc2UgYSBncm91cCBvZiB0aHJlZSBjb25zZWN1dGl2ZSByZW1vdGUgbm9kZXMgYmFjayB0bworICogdGhlIGZyZWUgcmVtb3RlIG5vZGVzLgorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV90cmlwbGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTE2IHJlbW90ZV9ub2RlX2luZGV4KQoreworCXUzMiBncm91cF9pbmRleDsKKworCWdyb3VwX2luZGV4ID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleCgKKwkJcmVtb3RlX25vZGVfdGFibGUsIDIsIGdyb3VwX2luZGV4CisJCSk7CisKKwlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwKHJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF9pbmRleCk7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhlIHJlbW90ZSBub2RlIHRhYmxlIHRvIHdoaWNoIHRoZSByZW1vdGUgbm9kZSBpbmRleCBpcworICogICAgdG8gYmUgZnJlZWQuCisgKiBAcmVtb3RlX25vZGVfY291bnQ6IFRoaXMgaXMgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIHJlbW90ZSBub2RlcyB0aGF0IGFyZQorICogICAgdG8gYmUgZnJlZWQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZWxlYXNlIHRoZSByZW1vdGUgbm9kZSBpbmRleCBiYWNrIGludG8gdGhlIHJlbW90ZSBub2RlCisgKiB0YWJsZSBmcmVlIHBvb2wuCisgKi8KK3ZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3JlbGVhc2VfcmVtb3RlX25vZGVfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2NvdW50LAorCXUxNiByZW1vdGVfbm9kZV9pbmRleCkKK3sKKwlpZiAocmVtb3RlX25vZGVfY291bnQgPT0gU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVCkgeworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJCQlyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgpOworCX0gZWxzZSBpZiAocmVtb3RlX25vZGVfY291bnQgPT0gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgeworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV90cmlwbGVfcmVtb3RlX25vZGUoCisJCQlyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxYWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0hfCisjZGVmaW5lIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9IXworCisjaW5jbHVkZSAiaXNjaS5oIgorCisvKioKKyAqCisgKgorICogUmVtb3RlIG5vZGUgc2V0cyBhcmUgc2V0cyBvZiByZW1vdGUgbm9kZSBpbmRleCBpbiB0aGUgcmVtdG9lIG5vZGUgdGFibGUgVGhlCisgKiBTQ1UgaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCBTVFAgcmVtb3RlIG5vZGUgZW50cmllcyB0YWtlIHRocmVlIGNvbnNlY3V0aXZlCisgKiByZW1vdGUgbm9kZSBpbmRleCBzbyB0aGUgdGFibGUgaXMgYXJyYW5nZWQgaW4gc2V0cyBvZiB0aHJlZS4gVGhlIGJpdHMgYXJlCisgKiB1c2VkIGFzIDAxMTEgMDExMSB0byBtYWtlIGEgYnl0ZSBhbmQgdGhlIGJpdHMgZGVmaW5lIHRoZSBzZXQgb2YgdGhyZWUgcmVtb3RlCisgKiBub2RlcyB0byB1c2UgYXMgYSBzZXF1ZW5jZS4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9CWVRFIDIKKworLyoqCisgKgorICoKKyAqIFNpbmNlIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBpcyBvcmdhbml6ZWQgYXMgRFdPUkRTIHRha2UgdGhlIHJlbW90ZSBub2RlIHNldHMKKyAqIGluIGJ5dGVzIGFuZCByZXByZXNlbnQgdGhlbSBpbiBEV09SRHMuIFRoZSBsb3dlc3Qgb3JkZXJlZCBiaXRzIGFyZSB0aGUgb25lcworICogdXNlZCBpbiBjYXNlIGZ1bGwgRFdPUkQgaXMgbm90IGJlaW5nIHVzZWQuIGkuZS4gMDAwMCAwMDAwIDAwMDAgMDAwMCAwMTExCisgKiAwMTExIDAxMTEgMDExMSAvLyBpZiBvbmx5IGEgc2luZ2xlIFdPUkQgaXMgaW4gdXNlIGluIHRoZSBEV09SRC4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRCBcCisJKHNpemVvZih1MzIpICogU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfQllURSkKKy8qKgorICoKKyAqCisgKiBUaGlzIGlzIGEgY291bnQgb2YgdGhlIG51bWViZXIgb2YgcmVtb3RlIG5vZGVzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEKKyAqIGJ5dGUKKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0JZVEUJXAorCShTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICogU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfQllURSkKKworLyoqCisgKgorICoKKyAqIFRoaXMgaXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHJlbW90ZSBub2RlcyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBhCisgKiBEV1JPRAorICovCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQJXAorCShzaXplb2YodTMyKSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfQllURSkKKworLyoqCisgKgorICoKKyAqIFRoaXMgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgcmVtb3RlIG5vZGUgZ3JvdXAKKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfQklUU19QRVJfR1JPVVAgICA0CisKKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfSU5WQUxJRF9JTkRFWCAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9GVUxMX1NMT1RfVkFMVUUgICAgKDB4MDcpCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0VNUFRZX1NMT1RfVkFMVUUgICAoMHgwMCkKKworLyoqCisgKgorICoKKyAqIEV4cGFuZGVyIGF0dGFjaGVkIHNhdGEgcmVtb3RlIG5vZGUgY291bnQKKyAqLworI2RlZmluZSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICAgICAgICAzCisKKy8qKgorICoKKyAqCisgKiBFeHBhbmRlciBvciBkaXJlY3QgYXR0YWNoZWQgc3NwIHJlbW90ZSBub2RlIGNvdW50CisgKi8KKyNkZWZpbmUgU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVCAgICAgICAgMQorCisvKioKKyAqCisgKgorICogRGlyZWN0IGF0dGFjaGVkIFNUUCByZW1vdGUgbm9kZSBjb3VudAorICovCisjZGVmaW5lIFNDVV9TQVRBX1JFTU9URV9OT0RFX0NPVU5UICAgICAgIDEKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlIC0KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBhcnJheSBzaXplIGluIGR3b3JkcworCSAqLworCXUxNiBhdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGFycmF5IHNpemUgb2YgdGhlCisJICovCisJdTE2IGdyb3VwX2FycmF5X3NpemU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBhcnJheSBvZiBhdmFpbGFibGUgcmVtb3RlIG5vZGUgZW50cmllcyBpbiBiaXRzLgorCSAqIEJlY2F1c2Ugb2YgdGhlIHdheSBTVFAgcmVtb3RlIG5vZGUgZGF0YSBpcyBhbGxvY2F0ZWQgb24gdGhlIFNDVSBoYXJkd2FyZQorCSAqIHRoZSByZW1vdGUgbm9kZXMgbXVzdCBvY2N1cHkgdGhyZWUgY29uc2VjdXRpdmUgcmVtb3RlIG5vZGUgY29udGV4dAorCSAqIGVudHJpZXMuICBGb3IgZWFzZSBvZiBhbGxvY2F0aW9uIGFuZCBkZS1hbGxvY2F0aW9uIHdlIGhhdmUgYnJva2VuIHRoZQorCSAqIHNldHMgb2YgdGhyZWUgaW50byBhIHNpbmdsZSBuaWJibGUuICBXaGVuIHRoZSBTVFAgUk5pIGlzIGFsbG9jYXRlZCBhbGwKKwkgKiBvZiB0aGUgYml0cyBpbiB0aGUgbmliYmxlIGFyZSBjbGVhcmVkLiAgVGhpcyBtYXRoIHJlc3VsdHMgaW4gYSB0YWJsZSBzaXplCisJICogb2YgTUFYX1JFTU9URV9OT0RFUyAvIENPTlNFQ1VUSVZFIFJOaSBFTlRSSUVTIGZvciBTVFAgLyAyIGVudHJpZXMgcGVyIGJ5dGUuCisJICovCisJdTMyIGF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbCisJCShTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTIC8gU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRCkKKwkJKyAoKFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgJSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEKSAhPSAwKV07CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBuaWJibGUgc2VsZWN0b3IgZm9yIHRoZSBhYm92ZSB0YWJsZS4gIFRoZXJlIGFyZSB0aHJlZQorCSAqIHBvc3NpYmxlIHNlbGVjdG9ycyBlYWNoIGZvciBmYXN0IGxvb2t1cCB3aGVuIHRyeWluZyB0byBmaW5kIG9uZSwgdHdvIG9yCisJICogdGhyZWUgcmVtb3RlIG5vZGUgZW50cmllcy4KKwkgKi8KKwl1MzIgcmVtb3RlX25vZGVfZ3JvdXBzWworCQlTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UXVsKKwkJKFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgLyAoMzIgKiBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSkKKwkJKyAoKFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgJSAoMzIgKiBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSkgIT0gMCldOworCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfZW50cmllcyk7CisKK3UxNiBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2NvdW50KTsKKwordm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9yZW1vdGVfbm9kZV9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfY291bnQsCisJdTE2IHJlbW90ZV9ub2RlX2luZGV4KTsKKworI2VuZGlmIC8qIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmUwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKQEAgLTAsMCArMSwzMzkxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAic2N1X2NvbXBsZXRpb25fY29kZXMuaCIKKyNpbmNsdWRlICJzY3VfZXZlbnRfY29kZXMuaCIKKyNpbmNsdWRlICJzYXMuaCIKKworc3RhdGljIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAqdG9fc2dsX2VsZW1lbnRfcGFpcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJCWludCBpZHgpCit7CisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm4gJmlyZXEtPnRjLT5zZ2xfcGFpcl9hYjsKKwllbHNlIGlmIChpZHggPT0gMSkKKwkJcmV0dXJuICZpcmVxLT50Yy0+c2dsX3BhaXJfY2Q7CisJZWxzZSBpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gJmlyZXEtPnNnX3RhYmxlW2lkeCAtIDJdOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCB0b19zZ2xfZWxlbWVudF9wYWlyX2RtYShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB1MzIgaWR4KQoreworCXUzMiBvZmZzZXQ7CisKKwlpZiAoaWR4ID09IDApIHsKKwkJb2Zmc2V0ID0gKHZvaWQgKikgJmlyZXEtPnRjLT5zZ2xfcGFpcl9hYiAtCisJCQkgKHZvaWQgKikgJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbMF07CisJCXJldHVybiBpaG9zdC0+dGFza19jb250ZXh0X2RtYSArIG9mZnNldDsKKwl9IGVsc2UgaWYgKGlkeCA9PSAxKSB7CisJCW9mZnNldCA9ICh2b2lkICopICZpcmVxLT50Yy0+c2dsX3BhaXJfY2QgLQorCQkJICh2b2lkICopICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlWzBdOworCQlyZXR1cm4gaWhvc3QtPnRhc2tfY29udGV4dF9kbWEgKyBvZmZzZXQ7CisJfQorCisJcmV0dXJuIHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLCAmaXJlcS0+c2dfdGFibGVbaWR4IC0gMl0pOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NnbF9lbGVtZW50KHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKmUsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJZS0+bGVuZ3RoID0gc2dfZG1hX2xlbihzZyk7CisJZS0+YWRkcmVzc191cHBlciA9IHVwcGVyXzMyX2JpdHMoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwllLT5hZGRyZXNzX2xvd2VyID0gbG93ZXJfMzJfYml0cyhzZ19kbWFfYWRkcmVzcyhzZykpOworCWUtPmFkZHJlc3NfbW9kaWZpZXIgPSAwOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVxdWVzdF9idWlsZF9zZ2woc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlyZXEtPmlzY2lfaG9zdDsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1MzIgc2dfaWR4ID0gMDsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnNjdV9zZyAgID0gTlVMTDsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnByZXZfc2cgID0gTlVMTDsKKworCWlmICh0YXNrLT5udW1fc2NhdHRlciA+IDApIHsKKwkJc2cgPSB0YXNrLT5zY2F0dGVyOworCisJCXdoaWxlIChzZykgeworCQkJc2N1X3NnID0gdG9fc2dsX2VsZW1lbnRfcGFpcihpcmVxLCBzZ19pZHgpOworCQkJaW5pdF9zZ2xfZWxlbWVudCgmc2N1X3NnLT5BLCBzZyk7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJaWYgKHNnKSB7CisJCQkJaW5pdF9zZ2xfZWxlbWVudCgmc2N1X3NnLT5CLCBzZyk7CisJCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCX0gZWxzZQorCQkJCW1lbXNldCgmc2N1X3NnLT5CLCAwLCBzaXplb2Yoc2N1X3NnLT5CKSk7CisKKwkJCWlmIChwcmV2X3NnKSB7CisJCQkJZG1hX2FkZHIgPSB0b19zZ2xfZWxlbWVudF9wYWlyX2RtYShpaG9zdCwKKwkJCQkJCQkJICAgaXJlcSwKKwkJCQkJCQkJICAgc2dfaWR4KTsKKworCQkJCXByZXZfc2ctPm5leHRfcGFpcl91cHBlciA9CisJCQkJCXVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCQkJCXByZXZfc2ctPm5leHRfcGFpcl9sb3dlciA9CisJCQkJCWxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworCQkJfQorCisJCQlwcmV2X3NnID0gc2N1X3NnOworCQkJc2dfaWR4Kys7CisJCX0KKwl9IGVsc2UgewkvKiBoYW5kbGUgd2hlbiBubyBzZyAqLworCQlzY3Vfc2cgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHNnX2lkeCk7CisKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJICB0YXNrLT5zY2F0dGVyLAorCQkJCQkgIHRhc2stPnRvdGFsX3hmZXJfbGVuLAorCQkJCQkgIHRhc2stPmRhdGFfZGlyKTsKKworCQlpcmVxLT56ZXJvX3NjYXR0ZXJfZGFkZHIgPSBkbWFfYWRkcjsKKworCQlzY3Vfc2ctPkEubGVuZ3RoID0gdGFzay0+dG90YWxfeGZlcl9sZW47CisJCXNjdV9zZy0+QS5hZGRyZXNzX3VwcGVyID0gdXBwZXJfMzJfYml0cyhkbWFfYWRkcik7CisJCXNjdV9zZy0+QS5hZGRyZXNzX2xvd2VyID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcik7CisJfQorCisJaWYgKHNjdV9zZykgeworCQlzY3Vfc2ctPm5leHRfcGFpcl91cHBlciA9IDA7CisJCXNjdV9zZy0+bmV4dF9wYWlyX2xvd2VyID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9pb19yZXF1ZXN0X2J1aWxkX3NzcF9jb21tYW5kX2l1KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNzcF9jbWRfaXUgKmNtZF9pdTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwljbWRfaXUgPSAmaXJlcS0+c3NwLmNtZDsKKworCW1lbWNweShjbWRfaXUtPkxVTiwgdGFzay0+c3NwX3Rhc2suTFVOLCA4KTsKKwljbWRfaXUtPmFkZF9jZGJfbGVuID0gMDsKKwljbWRfaXUtPl9yX2EgPSAwOworCWNtZF9pdS0+X3JfYiA9IDA7CisJY21kX2l1LT5lbl9mYnVyc3QgPSAwOyAvKiB1bnN1cHBvcnRlZCAqLworCWNtZF9pdS0+dGFza19wcmlvID0gdGFzay0+c3NwX3Rhc2sudGFza19wcmlvOworCWNtZF9pdS0+dGFza19hdHRyID0gdGFzay0+c3NwX3Rhc2sudGFza19hdHRyOworCWNtZF9pdS0+X3JfYyA9IDA7CisKKwlzY2lfc3dhYjMyX2NweSgmY21kX2l1LT5jZGIsIHRhc2stPnNzcF90YXNrLmNkYiwKKwkJICAgICAgIHNpemVvZih0YXNrLT5zc3BfdGFzay5jZGIpIC8gc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgdm9pZCBzY2lfdGFza19yZXF1ZXN0X2J1aWxkX3NzcF90YXNrX2l1KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNzcF90YXNrX2l1ICp0YXNrX2l1OworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3QgaXNjaV90bWYgKmlzY2lfdG1mID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSk7CisKKwl0YXNrX2l1ID0gJmlyZXEtPnNzcC50bWY7CisKKwltZW1zZXQodGFza19pdSwgMCwgc2l6ZW9mKHN0cnVjdCBzc3BfdGFza19pdSkpOworCisJbWVtY3B5KHRhc2tfaXUtPkxVTiwgdGFzay0+c3NwX3Rhc2suTFVOLCA4KTsKKworCXRhc2tfaXUtPnRhc2tfZnVuYyA9IGlzY2lfdG1mLT50bWZfY29kZTsKKwl0YXNrX2l1LT50YXNrX3RhZyA9CisJCShpcmVxLT50dHlwZSA9PSB0bWZfdGFzaykgPworCQlpc2NpX3RtZi0+aW9fdGFnIDoKKwkJU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUc7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgaXMgd2lsbCBmaWxsIGluIHRoZSBTQ1UgVGFzayBDb250ZXh0IGZvciBhbnkgdHlwZSBvZiBTU1AgcmVxdWVzdC4KKyAqIEBzY2lfcmVxOgorICogQHRhc2tfY29udGV4dDoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zc3BfcmVxZXVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCkKK3sKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQ7CisKKwlpZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZTsKKwlpcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCisJLyogRmlsbCBpbiB0aGUgVEMgd2l0aCB0aGUgaXRzIHJlcXVpcmVkIGRhdGEgKi8KKwl0YXNrX2NvbnRleHQtPmFib3J0ID0gMDsKKwl0YXNrX2NvbnRleHQtPnByaW9yaXR5ID0gMDsKKwl0YXNrX2NvbnRleHQtPmluaXRpYXRvcl9yZXF1ZXN0ID0gMTsKKwl0YXNrX2NvbnRleHQtPmNvbm5lY3Rpb25fcmF0ZSA9IGlkZXYtPmNvbm5lY3Rpb25fcmF0ZTsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX2VuZ2luZV9pbmRleCA9IElTQ0lfUEVHOworCXRhc2tfY29udGV4dC0+bG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1A7CisJdGFza19jb250ZXh0LT52YWxpZCA9IFNDVV9UQVNLX0NPTlRFWFRfVkFMSUQ7CisJdGFza19jb250ZXh0LT5jb250ZXh0X3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1RZUEU7CisKKwl0YXNrX2NvbnRleHQtPnJlbW90ZV9ub2RlX2luZGV4ID0gaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4OworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9jb2RlID0gMDsKKworCXRhc2tfY29udGV4dC0+bGlua19sYXllcl9jb250cm9sID0gMDsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+c3RyaWN0X29yZGVyaW5nID0gMDsKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgPSAwOworCXRhc2tfY29udGV4dC0+dGltZW91dF9lbmFibGUgPSAwOworCXRhc2tfY29udGV4dC0+YmxvY2tfZ3VhcmRfZW5hYmxlID0gMDsKKworCXRhc2tfY29udGV4dC0+YWRkcmVzc19tb2RpZmllciA9IDA7CisKKwkvKiB0YXNrX2NvbnRleHQtPnR5cGUuc3NwLnRhZyA9IGlyZXEtPmlvX3RhZzsgKi8KKwl0YXNrX2NvbnRleHQtPnRhc2tfcGhhc2UgPSAweDAxOworCisJaXJlcS0+cG9zdF9jb250ZXh0ID0gKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEMgfAorCQkJICAgICAgKElTQ0lfUEVHIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1NISUZUKSB8CisJCQkgICAgICAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwKKwkJCSAgICAgICBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkJICAgICAgSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZykpOworCisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY29tbWFuZCBidWZmZXIgdG8gdGhlCisJICogU0NVIFRhc2sgQ29udGV4dAorCSAqLworCWRtYV9hZGRyID0gc2NpX2lvX3JlcXVlc3RfZ2V0X2RtYV9hZGRyKGlyZXEsICZpcmVxLT5zc3AuY21kKTsKKworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9pdV91cHBlciA9IHVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9pdV9sb3dlciA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworCisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgcmVzcG9uc2UgYnVmZmVyIHRvIHRoZQorCSAqIFNDVSBUYXNrIENvbnRleHQKKwkgKi8KKwlkbWFfYWRkciA9IHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLCAmaXJlcS0+c3NwLnJzcCk7CisKKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X3VwcGVyID0gdXBwZXJfMzJfYml0cyhkbWFfYWRkcik7CisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV9sb3dlciA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYSBTU1AgSU8gcmVxdWVzdC4KKyAqIEBzY2lfcmVxOgorICoKKyAqLworc3RhdGljIHZvaWQgc2N1X3NzcF9pb19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkJCSAgICAgIHUzMiBsZW4pCit7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJc2N1X3NzcF9yZXFldXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSwgdGFza19jb250ZXh0KTsKKworCXRhc2tfY29udGV4dC0+c3NwX2NvbW1hbmRfaXVfbGVuZ3RoID0KKwkJc2l6ZW9mKHN0cnVjdCBzc3BfY21kX2l1KSAvIHNpemVvZih1MzIpOworCXRhc2tfY29udGV4dC0+dHlwZS5zc3AuZnJhbWVfdHlwZSA9IFNTUF9DT01NQU5EOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwljYXNlIERNQV9OT05FOgorCWRlZmF1bHQ6CisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gU0NVX1RBU0tfVFlQRV9JT1JFQUQ7CisJCWJyZWFrOworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJdGFza19jb250ZXh0LT50YXNrX3R5cGUgPSBTQ1VfVEFTS19UWVBFX0lPV1JJVEU7CisJCWJyZWFrOworCX0KKworCXRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzID0gbGVuOworCisJaWYgKHRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzID4gMCkKKwkJc2NpX3JlcXVlc3RfYnVpbGRfc2dsKGlyZXEpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYSBTU1AgVGFzayByZXF1ZXN0LiAgVGhlCisgKiAgICBmb2xsb3dpbmcgaW1wb3J0YW50IHNldHRpbmdzIGFyZSB1dGlsaXplZDogLSMgcHJpb3JpdHkgPT0KKyAqICAgIFNDVV9UQVNLX1BSSU9SSVRZX0hJR0guICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdGFzayByZXF1ZXN0IGlzIGlzc3VlZAorICogICAgYWhlYWQgb2Ygb3RoZXIgdGFzayBkZXN0aW5lZCBmb3IgdGhlIHNhbWUgUmVtb3RlIE5vZGUuIC0jIHRhc2tfdHlwZSA9PQorICogICAgU0NVX1RBU0tfVFlQRV9JT1JFQUQuICBUaGlzIHNpbXBseSBpbmRpY2F0ZXMgdGhhdCBhIG5vcm1hbCByZXF1ZXN0IHR5cGUKKyAqICAgIChpLmUuIG5vbi1yYXcgZnJhbWUpIGlzIGJlaW5nIHV0aWxpemVkIHRvIHBlcmZvcm0gdGFzayBtYW5hZ2VtZW50LiAtIworICogICAgY29udHJvbF9mcmFtZSA9PSAxLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHByb3BlciBlbmRpYW5lc3MgaXMgc2V0IHNvCisgKiAgICB0aGF0IHRoZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIGZvciBhIHRhc2sgZnJhbWUuCisgKiBAc2NpX3JlcTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSB0YXNrIHJlcXVlc3Qgb2JqZWN0IGJlaW5nCisgKiAgICBjb25zdHJ1Y3RlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zc3BfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisKKwlzY3Vfc3NwX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxLCB0YXNrX2NvbnRleHQpOworCisJdGFza19jb250ZXh0LT5jb250cm9sX2ZyYW1lICAgICAgICAgICAgICAgID0gMTsKKwl0YXNrX2NvbnRleHQtPnByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgPSBTQ1VfVEFTS19QUklPUklUWV9ISUdIOworCXRhc2tfY29udGV4dC0+dGFza190eXBlICAgICAgICAgICAgICAgICAgICA9IFNDVV9UQVNLX1RZUEVfUkFXX0ZSQU1FOworCXRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzICAgICAgICA9IDA7CisJdGFza19jb250ZXh0LT50eXBlLnNzcC5mcmFtZV90eXBlICAgICAgICAgID0gU1NQX1RBU0s7CisJdGFza19jb250ZXh0LT5zc3BfY29tbWFuZF9pdV9sZW5ndGggPQorCQlzaXplb2Yoc3RydWN0IHNzcF90YXNrX2l1KSAvIHNpemVvZih1MzIpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYW55IHR5cGUgb2YgU0FUQQorICogICAgcmVxdWVzdC4gIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHZhcmlvdXMgU0FUQSBjb25zdHJ1Y3RvcnMuCisgKiBAc2NpX3JlcTogVGhlIGdlbmVyYWwgSU8gcmVxdWVzdCBvYmplY3Qgd2hpY2ggaXMgdG8gYmUgdXNlZCBpbgorICogICAgY29uc3RydWN0aW5nIHRoZSBTQ1UgdGFzayBjb250ZXh0LgorICogQHRhc2tfY29udGV4dDogVGhlIGJ1ZmZlciBwb2ludGVyIGZvciB0aGUgU0NVIHRhc2sgY29udGV4dCB3aGljaCBpcyBiZWluZworICogICAgY29uc3RydWN0ZWQuCisgKgorICogVGhlIGdlbmVyYWwgaW8gcmVxdWVzdCBjb25zdHJ1Y3Rpb24gaXMgY29tcGxldGUuIFRoZSBidWZmZXIgYXNzaWdubWVudCBmb3IKKyAqIHRoZSBjb21tYW5kIGJ1ZmZlciBpcyBjb21wbGV0ZS4gbm9uZSBSZXZpc2l0IHRhc2sgY29udGV4dCBjb25zdHJ1Y3Rpb24gdG8KKyAqIGRldGVybWluZSB3aGF0IGlzIGNvbW1vbiBmb3IgU1NQL1NNUC9TVFAgdGFzayBjb250ZXh0IHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zYXRhX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQpCit7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCisJaWRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2U7CisJaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKworCS8qIEZpbGwgaW4gdGhlIFRDIHdpdGggdGhlIGl0cyByZXF1aXJlZCBkYXRhICovCisJdGFza19jb250ZXh0LT5hYm9ydCA9IDA7CisJdGFza19jb250ZXh0LT5wcmlvcml0eSA9IFNDVV9UQVNLX1BSSU9SSVRZX05PUk1BTDsKKwl0YXNrX2NvbnRleHQtPmluaXRpYXRvcl9yZXF1ZXN0ID0gMTsKKwl0YXNrX2NvbnRleHQtPmNvbm5lY3Rpb25fcmF0ZSA9IGlkZXYtPmNvbm5lY3Rpb25fcmF0ZTsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX2VuZ2luZV9pbmRleCA9IElTQ0lfUEVHOworCXRhc2tfY29udGV4dC0+bG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TVFA7CisJdGFza19jb250ZXh0LT52YWxpZCA9IFNDVV9UQVNLX0NPTlRFWFRfVkFMSUQ7CisJdGFza19jb250ZXh0LT5jb250ZXh0X3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1RZUEU7CisKKwl0YXNrX2NvbnRleHQtPnJlbW90ZV9ub2RlX2luZGV4ID0gaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4OworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9jb2RlID0gMDsKKworCXRhc2tfY29udGV4dC0+bGlua19sYXllcl9jb250cm9sID0gMDsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+c3RyaWN0X29yZGVyaW5nID0gMDsKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgPSAwOworCXRhc2tfY29udGV4dC0+dGltZW91dF9lbmFibGUgPSAwOworCXRhc2tfY29udGV4dC0+YmxvY2tfZ3VhcmRfZW5hYmxlID0gMDsKKworCXRhc2tfY29udGV4dC0+YWRkcmVzc19tb2RpZmllciA9IDA7CisJdGFza19jb250ZXh0LT50YXNrX3BoYXNlID0gMHgwMTsKKworCXRhc2tfY29udGV4dC0+c3NwX2NvbW1hbmRfaXVfbGVuZ3RoID0KKwkJKHNpemVvZihzdHJ1Y3QgaG9zdF90b19kZXZfZmlzKSAtIHNpemVvZih1MzIpKSAvIHNpemVvZih1MzIpOworCisJLyogU2V0IHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBIMkQgUkVHIEZJUyAqLworCXRhc2tfY29udGV4dC0+dHlwZS53b3Jkc1swXSA9ICoodTMyICopJmlyZXEtPnN0cC5jbWQ7CisKKwlpcmVxLT5wb3N0X2NvbnRleHQgPSAoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQyB8CisJCQkgICAgICAoSVNDSV9QRUcgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQpIHwKKwkJCSAgICAgIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PAorCQkJICAgICAgIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUKSB8CisJCQkgICAgICBJU0NJX1RBR19UQ0koaXJlcS0+aW9fdGFnKSk7CisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY29tbWFuZCBidWZmZXIgdG8gdGhlIFNDVSBUYXNrCisJICogQ29udGV4dC4gV2UgbXVzdCBvZmZzZXQgdGhlIGNvbW1hbmQgYnVmZmVyIGJ5IDQgYnl0ZXMgYmVjYXVzZSB0aGUKKwkgKiBmaXJzdCA0IGJ5dGVzIGFyZSB0cmFuc2ZlcmVkIGluIHRoZSBib2R5IG9mIHRoZSBUQy4KKwkgKi8KKwlkbWFfYWRkciA9IHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLAorCQkJCQkJKChjaGFyICopICZpcmVxLT5zdHAuY21kKSArCisJCQkJCQlzaXplb2YodTMyKSk7CisKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfdXBwZXIgPSB1cHBlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBsb3dlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKworCS8qIFNBVEEgUmVxdWVzdHMgZG8gbm90IGhhdmUgYSByZXNwb25zZSBidWZmZXIgKi8KKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X3VwcGVyID0gMDsKKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X2xvd2VyID0gMDsKK30KKworc3RhdGljIHZvaWQgc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJc2N1X3NhdGFfcmVxZXVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEsIHRhc2tfY29udGV4dCk7CisKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgICAgICAgICA9IDA7CisJdGFza19jb250ZXh0LT5wcmlvcml0eSAgICAgICAgICAgICAgPSBTQ1VfVEFTS19QUklPUklUWV9OT1JNQUw7CisJdGFza19jb250ZXh0LT50YXNrX3R5cGUgICAgICAgICAgICAgPSBTQ1VfVEFTS19UWVBFX1NBVEFfUkFXX0ZSQU1FOworCXRhc2tfY29udGV4dC0+dHlwZS5zdHAuZmlzX3R5cGUgICAgID0gRklTX1JFR0gyRDsKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IHNpemVvZihzdHJ1Y3QgaG9zdF90b19kZXZfZmlzKSAtIHNpemVvZih1MzIpOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9zdHBfcGlvX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkJICBib29sIGNvcHlfcnhfZnJhbWUpCit7CisJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKKworCXNjdV9zdHBfcmF3X3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxKTsKKworCXN0cF9yZXEtPnN0YXR1cyA9IDA7CisJc3RwX3JlcS0+c2dsLm9mZnNldCA9IDA7CisJc3RwX3JlcS0+c2dsLnNldCA9IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0E7CisKKwlpZiAoY29weV9yeF9mcmFtZSkgeworCQlzY2lfcmVxdWVzdF9idWlsZF9zZ2woaXJlcSk7CisJCXN0cF9yZXEtPnNnbC5pbmRleCA9IDA7CisJfSBlbHNlIHsKKwkJLyogVGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0aGUgZGF0YSBjb3BpZWQgdG8gdGhlIFNHTCBidWZmZXIgbG9jYXRpb24gKi8KKwkJc3RwX3JlcS0+c2dsLmluZGV4ID0gLTE7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqCisgKiBAc2NpX3JlcTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZXF1ZXN0IHRvIGJlIGNvbnN0cnVjdGVkIGFzIGFuCisgKiAgICBvcHRpbWl6ZWQgcmVxdWVzdC4KKyAqIEBvcHRpbWl6ZWRfdGFza190eXBlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciB0aGUgcmVxdWVzdCBpcyB0byBiZQorICogICAgYW4gVURNQSByZXF1ZXN0IG9yIGEgTkNRIHJlcXVlc3QuIC0gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBVRE1BLiAtIEEKKyAqICAgIHZhbHVlIG9mIDEgaW5kaWNhdGVzIE5DUS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gcmVxdWVzdCBjb25zdHJ1Y3Rpb24gY29tbW9uIHRvIGFsbCB0eXBlcyBvZiBTVFAKKyAqIHJlcXVlc3RzIHRoYXQgYXJlIG9wdGltaXplZCBieSB0aGUgc2lsaWNvbiAoaS5lLiBVRE1BLCBOQ1EpLiBUaGlzIG1ldGhvZAorICogcmV0dXJucyBhbiBpbmRpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIHZvaWQgc2NpX3N0cF9vcHRpbWl6ZWRfcmVxdWVzdF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgICAgdTggb3B0aW1pemVkX3Rhc2tfdHlwZSwKKwkJCQkJCSAgICAgdTMyIGxlbiwKKwkJCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKworCS8qIEJ1aWxkIHRoZSBTVFAgdGFzayBjb250ZXh0IHN0cnVjdHVyZSAqLworCXNjdV9zYXRhX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxLCB0YXNrX2NvbnRleHQpOworCisJLyogQ29weSBvdmVyIHRoZSBTR0wgZWxlbWVudHMgKi8KKwlzY2lfcmVxdWVzdF9idWlsZF9zZ2woaXJlcSk7CisKKwkvKiBDb3B5IG92ZXIgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcmVkICovCisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSBsZW47CisKKwlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpIHsKKwkJLyoKKwkJICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgRE1BIElOIGFuZCBETUEgT1VUIHJlcXVlc3QgdGFzayB0eXBlCisJCSAqIHZhbHVlcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRlBETUEgUkVBRAorCQkgKiBhbmQgRlBETUEgV1JJVEUgdmFsdWVzLiAgQWRkIHRoZSBzdXBwbGllZCB0YXNrIHR5cGUgcGFyYW1ldGVyCisJCSAqIHRvIHRoaXMgZGlmZmVyZW5jZSB0byBzZXQgdGhlIHRhc2sgdHlwZSBwcm9wZXJseSBmb3IgdGhpcworCQkgKiBEQVRBIE9VVCAoV1JJVEUpIGNhc2UuICovCisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gb3B0aW1pemVkX3Rhc2tfdHlwZSArIChTQ1VfVEFTS19UWVBFX0RNQV9PVVQKKwkJCQkJCQkJIC0gU0NVX1RBU0tfVFlQRV9ETUFfSU4pOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZvciB0aGUgREFUQSBJTiAoUkVBRCkgY2FzZSwgc2ltcGx5IHNhdmUgdGhlIHN1cHBsaWVkCisJCSAqIG9wdGltaXplZCB0YXNrIHR5cGUuICovCisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gb3B0aW1pemVkX3Rhc2tfdHlwZTsKKwl9Cit9CisKKworCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJICAgICAgIHUzMiBsZW4sCisJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgICAgIGJvb2wgY29weSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJLyogY2hlY2sgZm9yIG1hbmFnZW1lbnQgcHJvdG9jb2xzICovCisJaWYgKGlyZXEtPnR0eXBlID09IHRtZl90YXNrKSB7CisJCXN0cnVjdCBpc2NpX3RtZiAqdG1mID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSk7CisKKwkJaWYgKHRtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2ggfHwKKwkJICAgIHRtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2xvdykgeworCQkJc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEpOworCQkJcmV0dXJuIFNDSV9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCQkiJXM6IFJlcXVlc3QgMHglcCByZWNlaXZlZCB1bi1oYW5kbGVkIFNBVCAiCisJCQkJIm1hbmFnZW1lbnQgcHJvdG9jb2wgMHgleC5cbiIsCisJCQkJX19mdW5jX18sIGlyZXEsIHRtZi0+dG1mX2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlpZiAoIXNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykpIHsKKwkJZGV2X2VycigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCSIlczogTm9uLUFUQSBwcm90b2NvbCBpbiBTQVRBIHBhdGg6IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXRhc2stPnRhc2tfcHJvdG8pOworCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisKKwl9CisKKwkvKiBub24gZGF0YSAqLworCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkgeworCQlzY3Vfc3RwX3Jhd19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwkvKiBOQ1EgKi8KKwlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSkgeworCQlzY2lfc3RwX29wdGltaXplZF9yZXF1ZXN0X2NvbnN0cnVjdChpcmVxLAorCQkJCQkJCSBTQ1VfVEFTS19UWVBFX0ZQRE1BUV9SRUFELAorCQkJCQkJCSBsZW4sIGRpcik7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwkvKiBETUEgKi8KKwlpZiAodGFzay0+YXRhX3Rhc2suZG1hX3hmZXIpIHsKKwkJc2NpX3N0cF9vcHRpbWl6ZWRfcmVxdWVzdF9jb25zdHJ1Y3QoaXJlcSwKKwkJCQkJCQkgU0NVX1RBU0tfVFlQRV9ETUFfSU4sCisJCQkJCQkJIGxlbiwgZGlyKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0gZWxzZSAvKiBQSU8gKi8KKwkJcmV0dXJuIHNjaV9zdHBfcGlvX3JlcXVlc3RfY29uc3RydWN0KGlyZXEsIGNvcHkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfYmFzaWNfc3NwKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJaXJlcS0+cHJvdG9jb2wgPSBTQ0lDX1NTUF9QUk9UT0NPTDsKKworCXNjdV9zc3BfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEsCisJCQkJCQkgIHRhc2stPmRhdGFfZGlyLAorCQkJCQkJICB0YXNrLT50b3RhbF94ZmVyX2xlbik7CisKKwlzY2lfaW9fcmVxdWVzdF9idWlsZF9zc3BfY29tbWFuZF9pdShpcmVxKTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTlNUUlVDVEVEKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NzcCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCS8qIENvbnN0cnVjdCB0aGUgU1NQIFRhc2sgU0NVIFRhc2sgQ29udGV4dCAqLworCXNjdV9zc3BfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisKKwkvKiBGaWxsIGluIHRoZSBTU1AgVGFzayBJVSAqLworCXNjaV90YXNrX3JlcXVlc3RfYnVpbGRfc3NwX3Rhc2tfaXUoaXJlcSk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT05TVFJVQ1RFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X2Jhc2ljX3NhdGEoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWJvb2wgY29weSA9IGZhbHNlOworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCWlyZXEtPnByb3RvY29sID0gU0NJQ19TVFBfUFJPVE9DT0w7CisKKwljb3B5ID0gKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKSA/IGZhbHNlIDogdHJ1ZTsKKworCXN0YXR1cyA9IHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9zYXRhKGlyZXEsCisJCQkJCQl0YXNrLT50b3RhbF94ZmVyX2xlbiwKKwkJCQkJCXRhc2stPmRhdGFfZGlyLAorCQkJCQkJY29weSk7CisKKwlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKQorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT05TVFJVQ1RFRCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCS8qIGNoZWNrIGZvciBtYW5hZ2VtZW50IHByb3RvY29scyAqLworCWlmIChpcmVxLT50dHlwZSA9PSB0bWZfdGFzaykgeworCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJCWlmICh0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoIHx8CisJCSAgICB0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9sb3cpIHsKKwkJCXNjdV9zdHBfcmF3X3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJmlyZXEtPm93bmluZ19jb250cm9sbGVyLT5wZGV2LT5kZXYsCisJCQkJIiVzOiBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgdW4taGFuZGxlZCBTQVQgIgorCQkJCSJQcm90b2NvbCAweCV4LlxuIiwKKwkJCQlfX2Z1bmNfXywgaXJlcSwgdG1mLT50bWZfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09OU1RSVUNURUQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzY2lfcmVxX3R4X2J5dGVzIC0gYnl0ZXMgdHJhbnNmZXJyZWQgd2hlbiByZXBseSB1bmRlcnJ1bnMgcmVxdWVzdAorICogQHNjaV9yZXE6IHJlcXVlc3QgdGhhdCB3YXMgdGVybWluYXRlZCBlYXJseQorICovCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfU1JBTSAweDIwMDAwMAorc3RhdGljIHUzMiBzY2lfcmVxX3R4X2J5dGVzKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKwl1MzIgcmV0X3ZhbCA9IDA7CisKKwlpZiAocmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5hZGRyZXNzX21vZGlmaWVyKSA9PSAwKSB7CisJCXZvaWQgX19pb21lbSAqc2N1X3JlZ19iYXNlID0gaWhvc3QtPnNjdV9yZWdpc3RlcnM7CisKKwkJLyogZ2V0IHRoZSBieXRlcyBvZiBkYXRhIGZyb20gdGhlIEFkZHJlc3MgPT0gQkFSMSArIDIwMDAyQ2ggKyAoMjU2KlRDaSkgd2hlcmUKKwkJICogICBCQVIxIGlzIHRoZSBzY3VfcmVnaXN0ZXJzCisJCSAqICAgMHgyMDAwMkMgPSAweDIwMDAwMCArIDB4MmMKKwkJICogICAgICAgICAgICA9IHN0YXJ0IG9mIHRhc2sgY29udGV4dCBTUkFNICsgb2Zmc2V0IG9mICh0eXBlLnNzcC5kYXRhX29mZnNldCkKKwkJICogICBUQ2kgaXMgdGhlIGlvX3RhZyBvZiBzdHJ1Y3Qgc2NpX3JlcXVlc3QKKwkJICovCisJCXJldF92YWwgPSByZWFkbChzY3VfcmVnX2Jhc2UgKworCQkJCShTQ1VfVEFTS19DT05URVhUX1NSQU0gKyBvZmZzZXRvZihzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCwgdHlwZS5zc3AuZGF0YV9vZmZzZXQpKSArCisJCQkJKChzaXplb2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQpKSAqIElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpKSk7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVxdWVzdF9zdGFydChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRjID0gaXJlcS0+dGM7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlpZiAoc3RhdGUgIT0gU0NJX1JFUV9DT05TVFJVQ1RFRCkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBJTyBSZXF1ZXN0IHJlcXVlc3RlZCB0byBzdGFydCB3aGlsZSBpbiB3cm9uZyAiCisJCQkgInN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwl0Yy0+dGFza19pbmRleCA9IElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpOworCisJc3dpdGNoICh0Yy0+cHJvdG9jb2xfdHlwZSkgeworCWNhc2UgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TTVA6CisJY2FzZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NTUDoKKwkJLyogU1NQL1NNUCBGcmFtZSAqLworCQl0Yy0+dHlwZS5zc3AudGFnID0gaXJlcS0+aW9fdGFnOworCQl0Yy0+dHlwZS5zc3AudGFyZ2V0X3BvcnRfdHJhbnNmZXJfdGFnID0gMHhGRkZGOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TVFA6CisJCS8qIFNUUC9TQVRBIEZyYW1lCisJCSAqIHRjLT50eXBlLnN0cC5uY3FfdGFnID0gaXJlcS0+bmNxX3RhZzsKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX05PTkU6CisJCS8qIC8gQHRvZG8gV2hlbiBkbyB3ZSBzZXQgbm8gcHJvdG9jb2wgdHlwZT8gKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgYnVpbGQgdGhlIElPCisJCSAqIHJlcXVlc3RzICovCisJCWJyZWFrOworCX0KKworCS8qIEFkZCB0byB0aGUgcG9zdF9jb250ZXh0IHRoZSBpbyB0YWcgdmFsdWUgKi8KKwlpcmVxLT5wb3N0X2NvbnRleHQgfD0gSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZyk7CisKKwkvKiBFdmVyeXRoaW5nIGlzIGdvb2QgZ28gYWhlYWQgYW5kIGNoYW5nZSBzdGF0ZSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUQVJURUQpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X3Rlcm1pbmF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUkVRX0NPTlNUUlVDVEVEOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fVEVSTUlOQVRFRDsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JFUV9TVEFSVEVEOgorCWNhc2UgU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUDoKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfUkVTUDoKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfVENfQ09NUDoKKwljYXNlIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOgorCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySDoKKwljYXNlIFNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfSDJEOgorCWNhc2UgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkg6CisJY2FzZSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9IMkQ6CisJY2FzZSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRToKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19EQVRBX0lOOgorCWNhc2UgU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VUOgorCWNhc2UgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRDoKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRzoKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkg6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0FCT1JUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JFUV9UQVNLX1dBSVRfVENfUkVTUDoKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQUJPUlRJTkcpOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUkVRX0NPTVBMRVRFRDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgSU8gUmVxdWVzdCByZXF1ZXN0ZWQgdG8gYWJvcnQgd2hpbGUgaW4gd3JvbmcgIgorCQkJICJzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBpcmVxLT5zbS5jdXJyZW50X3N0YXRlX2lkKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlpZiAoV0FSTl9PTkNFKHN0YXRlICE9IFNDSV9SRVFfQ09NUExFVEVELAorCQkgICAgICAiaXNjaTogcmVxdWVzdCBjb21wbGV0aW9uIGZyb20gd3Jvbmcgc3RhdGUgKCVkKVxuIiwgc3RhdGUpKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKworCWlmIChpcmVxLT5zYXZlZF9yeF9mcmFtZV9pbmRleCAhPSBTQ1VfSU5WQUxJRF9GUkFNRV9JTkRFWCkKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwKKwkJCQkJCSAgaXJlcS0+c2F2ZWRfcnhfZnJhbWVfaW5kZXgpOworCisJLyogWFhYIGNhbiB3ZSBqdXN0IHN0b3AgdGhlIG1hY2hpbmUgYW5kIHJlbW92ZSB0aGUgJ2ZpbmFsJyBzdGF0ZT8gKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9GSU5BTCk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICB1MzIgZXZlbnRfY29kZSkKK3sKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1JFUV9TVFBfUElPX0RBVEFfSU4pIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogKCV4KSBpbiB3cm9uZyBzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgZXZlbnRfY29kZSwgc3RhdGUpOworCisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXN3aXRjaCAoc2N1X2dldF9ldmVudF9zcGVjaWZpZXIoZXZlbnRfY29kZSkpIHsKKwljYXNlIFNDVV9UQVNLX0RPTkVfQ1JDX0VSUiA8PCBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9TSElGVDoKKwkJLyogV2UgYXJlIHdhaXRpbmcgZm9yIGRhdGEgYW5kIHRoZSBTQ1UgaGFzIFJfRVJSIHRoZSBkYXRhIGZyYW1lLgorCQkgKiBHbyBiYWNrIHRvIHdhaXRpbmcgZm9yIHRoZSBEMkggUmVnaXN0ZXIgRklTCisJCSAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogcGlvIHJlcXVlc3QgdW5leHBlY3RlZCBldmVudCAlI3hcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnRfY29kZSk7CisKKwkJLyogVE9ETyBTaG91bGQgd2UgZmFpbCB0aGUgUElPIHJlcXVlc3Qgd2hlbiB3ZSBnZXQgYW4KKwkJICogdW5leHBlY3RlZCBldmVudD8KKwkJICovCisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyByZXNwb25zZSBkYXRhIGZvciByZXF1ZXN0cyByZXR1cm5pbmcgcmVzcG9uc2UgZGF0YQorICogICAgaW5zdGVhZCBvZiBzZW5zZSBkYXRhLgorICogQHNjaV9yZXE6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVxdWVzdCBvYmplY3QgZm9yIHdoaWNoIHRvIGNvcHkKKyAqICAgIHRoZSByZXNwb25zZSBkYXRhLgorICovCitzdGF0aWMgdm9pZCBzY2lfaW9fcmVxdWVzdF9jb3B5X3Jlc3BvbnNlKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJdm9pZCAqcmVzcF9idWY7CisJdTMyIGxlbjsKKwlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICpzc3BfcmVzcG9uc2U7CisJc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJc3NwX3Jlc3BvbnNlID0gJmlyZXEtPnNzcC5yc3A7CisKKwlyZXNwX2J1ZiA9ICZpc2NpX3RtZi0+cmVzcC5yZXNwX2l1OworCisJbGVuID0gbWluX3QodTMyLAorCQkgICAgU1NQX1JFU1BfSVVfTUFYX1NJWkUsCisJCSAgICBiZTMyX3RvX2NwdShzc3BfcmVzcG9uc2UtPnJlc3BvbnNlX2RhdGFfbGVuKSk7CisKKwltZW1jcHkocmVzcF9idWYsIHNzcF9yZXNwb25zZS0+cmVzcF9kYXRhLCBsZW4pOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCityZXF1ZXN0X3N0YXJ0ZWRfc3RhdGVfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCSAgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3BfaXU7CisJdTggZGF0YXByZXM7CisKKwkvKiBUT0RPOiBBbnkgU0RNQSByZXR1cm4gY29kZSBvZiBvdGhlciB0aGFuIDAgaXMgYmFkIGRlY29kZSAweDAwM0MwMDAwCisJICogdG8gZGV0ZXJtaW5lIFNETUEgc3RhdHVzCisJICovCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0VBUkxZX1JFU1ApOiB7CisJCS8qIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHRoZSBTQ1UgaGFyZHdhcmUgd2lsbCByZXR1cm4gYW4gZWFybHkKKwkJICogcmVzcG9uc2UgYmVjYXVzZSB0aGUgaW8gcmVxdWVzdCBzcGVjaWZpZWQgbW9yZSBkYXRhIHRoYW4gaXMKKwkJICogcmV0dXJuZWQgYnkgdGhlIHRhcmdldCBkZXZpY2UgKG1vZGUgcGFnZXMsIGlucXVpcnkgZGF0YSwKKwkJICogZXRjLikuICBXZSBtdXN0IGNoZWNrIHRoZSByZXNwb25zZSBzdGF0cyB0byBzZWUgaWYgdGhpcyBpcworCQkgKiB0cnVseSBhIGZhaWxlZCByZXF1ZXN0IG9yIGEgZ29vZCByZXF1ZXN0IHRoYXQganVzdCBnb3QKKwkJICogY29tcGxldGVkIGVhcmx5LgorCQkgKi8KKwkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqcmVzcCA9ICZpcmVxLT5zc3AucnNwOworCQlzc2l6ZV90IHdvcmRfY250ID0gU1NQX1JFU1BfSVVfTUFYX1NJWkUgLyBzaXplb2YodTMyKTsKKworCQlzY2lfc3dhYjMyX2NweSgmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICAmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICB3b3JkX2NudCk7CisKKwkJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTX0lPX0RPTkVfRUFSTFk7CisJCX0gZWxzZSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFKTogeworCQlzc2l6ZV90IHdvcmRfY250ID0gU1NQX1JFU1BfSVVfTUFYX1NJWkUgLyBzaXplb2YodTMyKTsKKworCQlzY2lfc3dhYjMyX2NweSgmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICAmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICB3b3JkX2NudCk7CisKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1JFU1BfTEVOX0VSUik6CisJCS8qIFRPRE8gV2l0aCBUQVNLX0RPTkVfUkVTUF9MRU5fRVJSIGlzIHRoZSByZXNwb25zZSBmcmFtZQorCQkgKiBndWFyYW50ZWVkIHRvIGJlIHJlY2VpdmVkIGJlZm9yZSB0aGlzIGNvbXBsZXRpb24gc3RhdHVzIGlzCisJCSAqIHBvc3RlZD8KKwkJICovCisJCXJlc3BfaXUgPSAmaXJlcS0+c3NwLnJzcDsKKwkJZGF0YXByZXMgPSByZXNwX2l1LT5kYXRhcHJlczsKKworCQlpZiAoZGF0YXByZXMgPT0gMSB8fCBkYXRhcHJlcyA9PSAyKSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJfSBlbHNlIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCX0KKwkJYnJlYWs7CisJLyogb25seSBzdHAgZGV2aWNlIGdldHMgc3VzcGVuZGVkLiAqLworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9BQ0tfTkFLX1RPKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTExfUEVSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX05BS19FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9EQVRBX0xFTl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MTF9BQk9SVF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9YUl9XRF9MRU4pOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9NQVhfUExEX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1VORVhQX1JFU1ApOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9TREJGSVMpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9SRUdfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU0RCX0VSUik6CisJCWlmIChpcmVxLT5wcm90b2NvbCA9PSBTQ0lDX1NUUF9QUk9UT0NPTCkgeworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSA+PgorCQkJCQkgICBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQ7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRDsKKwkJfSBlbHNlIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgPj4KKwkJCQkJICAgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQl9CisJCWJyZWFrOworCisJLyogYm90aCBzdHAvc3NwIGRldmljZSBnZXRzIHN1c3BlbmRlZCAqLworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MRl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfV1JPTkdfREVTVElOQVRJT04pOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8xKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzMpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfQkFEX0RFU1RJTkFUSU9OKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1pPTkVfVklPTEFUSU9OKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1NUUF9SRVNPVVJDRVNfQlVTWSk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX0NPTk5FQ1RJT05fUkFURV9OT1RfU1VQUE9SVEVEKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSA+PgorCQkJCSAgIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQ7CisJCWJyZWFrOworCisJLyogbmVpdGhlciBzc3Agbm9yIHN0cCBnZXRzIHN1c3BlbmRlZC4gKi8KKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTkFLX0NNRF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9YUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1hSX0lVX0xFTl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TRE1BX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX09GRlNFVF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9FWENFU1NfREFUQSk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9SRVNQX1RPX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9VRklfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9MTF9SWF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9EQVRBKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfT1BFTl9GQUlMKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfVklJVF9FTlRSWV9OVik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0lJVF9FTlRSWV9OVik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1JOQ05WX09VVEJPVU5EKToKKwlkZWZhdWx0OgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpID4+CisJCQkJICAgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCWJyZWFrOworCX0KKworCS8qCisJICogVE9ETzogVGhpcyBpcyBwcm9iYWJseSB3cm9uZyBmb3IgQUNLL05BSyB0aW1lb3V0IGNvbmRpdGlvbnMKKwkgKi8KKworCS8qIEluIGFsbCBjYXNlcyB3ZSB3aWxsIHRyZWF0IHRoaXMgYXMgdGhlIGNvbXBsZXRpb24gb2YgdGhlIElPIHJlcS4gKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworcmVxdWVzdF9hYm9ydGluZ19zdGF0ZV90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCXUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIChTQ1VfVEFTS19ET05FX0dPT0QgPDwgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUKToKKwljYXNlIChTQ1VfVEFTS19ET05FX1RBU0tfQUJPUlQgPDwgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVEFTS19BQk9SVDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQ7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVW5sZXNzIHdlIGdldCBzb21lIHN0cmFuZ2UgZXJyb3Igd2FpdCBmb3IgdGhlIHRhc2sgYWJvcnQgdG8gY29tcGxldGUKKwkJICogVE9ETzogU2hvdWxkIHRoZXJlIGJlIGEgc3RhdGUgY2hhbmdlIGZvciB0aGlzIGNvbXBsZXRpb24/CisJCSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc3NwX3Rhc2tfcmVxdWVzdF9hd2FpdF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICAgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1ApOworCQlicmVhazsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfQUNLX05BS19UTyk6CisJCS8qIEN1cnJlbnRseSwgdGhlIGRlY2lzaW9uIGlzIHRvIHNpbXBseSBhbGxvdyB0aGUgdGFzayByZXF1ZXN0CisJCSAqIHRvIHRpbWVvdXQgaWYgdGhlIHRhc2sgSVUgd2Fzbid0IHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKwkJICogVGhlcmUgaXMgYSBwb3RlbnRpYWwgZm9yIHJlY2VpdmluZyBtdWx0aXBsZSB0YXNrIHJlc3BvbnNlcyBpZgorCQkgKiB3ZSBkZWNpZGUgdG8gc2VuZCB0aGUgdGFzayBJVSBhZ2Fpbi4KKwkJICovCisJCWRldl93YXJuKCZpcmVxLT5vd25pbmdfY29udHJvbGxlci0+cGRldi0+ZGV2LAorCQkJICIlczogVGFza1JlcXVlc3Q6MHglcCBDb21wbGV0aW9uQ29kZToleCAtICIKKwkJCSAiQUNLL05BSyB0aW1lb3V0XG4iLCBfX2Z1bmNfXywgaXJlcSwKKwkJCSBjb21wbGV0aW9uX2NvZGUpOworCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZSBjb21wbGV0ZS4KKwkJICogSWYgYSBOQUsgd2FzIHJlY2VpdmVkLCB0aGVuIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIHJldHJ5CisJCSAqIHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NtcF9yZXF1ZXN0X2F3YWl0X3Jlc3BvbnNlX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCS8qIEluIHRoZSBBV0FJVCBSRVNQT05TRSBzdGF0ZSwgYW55IFRDIGNvbXBsZXRpb24gaXMKKwkJICogdW5leHBlY3RlZC4gIGJ1dCBpZiB0aGUgVEMgaGFzIHN1Y2Nlc3Mgc3RhdHVzLCB3ZQorCQkgKiBjb21wbGV0ZSB0aGUgSU8gYW55d2F5LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX1JFU1BfVE9fRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX1VGSV9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TTVBfRlJNX1RZUEVfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX0xMX1JYX0VSUik6CisJCS8qIFRoZXNlIHN0YXR1cyBoYXMgYmVlbiBzZWVuIGluIGEgc3BlY2lmaWMgTFNJCisJCSAqIGV4cGFuZGVyLCB3aGljaCBzb21ldGltZXMgaXMgbm90IGFibGUgdG8gc2VuZCBzbXAKKwkJICogcmVzcG9uc2Ugd2l0aGluIDIgbXMuIFRoaXMgY2F1c2VzIG91ciBoYXJkd2FyZSBicmVhaworCQkgKiB0aGUgY29ubmVjdGlvbiBhbmQgc2V0IFRDIGNvbXBsZXRpb24gd2l0aCBvbmUgb2YKKwkJICogdGhlc2UgU01QX1hYWF9YWF9FUlIgc3RhdHVzLiBGb3IgdGhlc2UgdHlwZSBvZiBlcnJvciwKKwkJICogd2UgYXNrIGlob3N0IHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9TTVBfUkVTUF9UT19FUlI7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9SRVRSWV9SRVFVSVJFRDsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZSBjb21wbGV0ZS4gIElmIGEgTkFLCisJCSAqIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0byB0aGUgdXNlciB0byByZXRyeSB0aGUgcmVxdWVzdAorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NtcF9yZXF1ZXN0X2F3YWl0X3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUKKwkJICogY29tcGxldGUuICBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8KKwkJICogdGhlIHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKnBpb19zZ2xfbmV4dChzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSkKK3sKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50ICpzZ2w7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyICpzZ2xfcGFpcjsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gdG9faXJlcShzdHBfcmVxKTsKKwlzdHJ1Y3QgaXNjaV9zdHBfcGlvX3NnbCAqcGlvX3NnbCA9ICZzdHBfcmVxLT5zZ2w7CisKKwlzZ2xfcGFpciA9IHRvX3NnbF9lbGVtZW50X3BhaXIoaXJlcSwgcGlvX3NnbC0+aW5kZXgpOworCWlmICghc2dsX3BhaXIpCisJCXNnbCA9IE5VTEw7CisJZWxzZSBpZiAocGlvX3NnbC0+c2V0ID09IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0EpIHsKKwkJaWYgKHNnbF9wYWlyLT5CLmFkZHJlc3NfbG93ZXIgPT0gMCAmJgorCQkgICAgc2dsX3BhaXItPkIuYWRkcmVzc191cHBlciA9PSAwKSB7CisJCQlzZ2wgPSBOVUxMOworCQl9IGVsc2UgeworCQkJcGlvX3NnbC0+c2V0ID0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQjsKKwkJCXNnbCA9ICZzZ2xfcGFpci0+QjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzZ2xfcGFpci0+bmV4dF9wYWlyX2xvd2VyID09IDAgJiYKKwkJICAgIHNnbF9wYWlyLT5uZXh0X3BhaXJfdXBwZXIgPT0gMCkgeworCQkJc2dsID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXBpb19zZ2wtPmluZGV4Kys7CisJCQlwaW9fc2dsLT5zZXQgPSBTQ1VfU0dMX0VMRU1FTlRfUEFJUl9BOworCQkJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHBpb19zZ2wtPmluZGV4KTsKKwkJCXNnbCA9ICZzZ2xfcGFpci0+QTsKKwkJfQorCX0KKworCXJldHVybiBzZ2w7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3N0cF9yZXF1ZXN0X25vbl9kYXRhX2F3YWl0X2gyZF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQl1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0QySCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZQorCQkgKiBjb21wbGV0ZS4gIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0bworCQkgKiB0aGUgdXNlciB0byByZXRyeSB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisjZGVmaW5lIFNDVV9NQVhfRlJBTUVfQlVGRkVSX1NJWkUgIDB4NDAwICAvKiAxSyBpcyB0aGUgbWF4aW11bSBTQ1UgZnJhbWUgZGF0YSBwYXlsb2FkICovCisKKy8qIHRyYW5zbWl0IERBVEFfRklTIGZyb20gKGN1cnJlbnQgc2dsICsgb2Zmc2V0KSBmb3IgaW5wdXQKKyAqIHBhcmFtZXRlciBsZW5ndGguIGN1cnJlbnQgc2dsIGFuZCBvZmZzZXQgaXMgYWxyZWF5IHN0b3JlZCBpbiB0aGUgSU8gcmVxdWVzdAorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9vdXRfdHJhc21pdF9kYXRhX2ZyYW1lKAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJdTMyIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSA9ICZpcmVxLT5zdHAucmVxOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnNnbF9wYWlyOworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKmN1cnJlbnRfc2dsOworCisJLyogUmVjeWNsZSB0aGUgVEMgYW5kIHJlY29uc3RydWN0IGl0IGZvciBzZW5kaW5nIG91dCBEQVRBIEZJUyBjb250YWluaW5nCisJICogZm9yIHRoZSBkYXRhIGZyb20gY3VycmVudF9zZ2wrb2Zmc2V0IGZvciB0aGUgaW5wdXQgbGVuZ3RoCisJICovCisJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHN0cF9yZXEtPnNnbC5pbmRleCk7CisJaWYgKHN0cF9yZXEtPnNnbC5zZXQgPT0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQSkKKwkJY3VycmVudF9zZ2wgPSAmc2dsX3BhaXItPkE7CisJZWxzZQorCQljdXJyZW50X3NnbCA9ICZzZ2xfcGFpci0+QjsKKworCS8qIHVwZGF0ZSB0aGUgVEMgKi8KKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfdXBwZXIgPSBjdXJyZW50X3NnbC0+YWRkcmVzc191cHBlcjsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBjdXJyZW50X3NnbC0+YWRkcmVzc19sb3dlcjsKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IGxlbmd0aDsKKwl0YXNrX2NvbnRleHQtPnR5cGUuc3RwLmZpc190eXBlID0gRklTX0RBVEE7CisKKwkvKiBzZW5kIHRoZSBuZXcgVEMgb3V0LiAqLworCXJldHVybiBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhpcmVxKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfb3V0X3RyYW5zbWl0X2RhdGEoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSA9ICZpcmVxLT5zdHAucmVxOworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAqc2dsX3BhaXI7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudCAqc2dsOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdTMyIG9mZnNldDsKKwl1MzIgbGVuID0gMDsKKworCW9mZnNldCA9IHN0cF9yZXEtPnNnbC5vZmZzZXQ7CisJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHN0cF9yZXEtPnNnbC5pbmRleCk7CisJaWYgKFdBUk5fT05DRSghc2dsX3BhaXIsICIlczogbnVsbCBzZ2wgZWxlbWVudCIsIF9fZnVuY19fKSkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCisJaWYgKHN0cF9yZXEtPnNnbC5zZXQgPT0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQSkgeworCQlzZ2wgPSAmc2dsX3BhaXItPkE7CisJCWxlbiA9IHNnbF9wYWlyLT5BLmxlbmd0aCAtIG9mZnNldDsKKwl9IGVsc2UgeworCQlzZ2wgPSAmc2dsX3BhaXItPkI7CisJCWxlbiA9IHNnbF9wYWlyLT5CLmxlbmd0aCAtIG9mZnNldDsKKwl9CisKKwlpZiAoc3RwX3JlcS0+cGlvX2xlbiA9PSAwKQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKwlpZiAoc3RwX3JlcS0+cGlvX2xlbiA+PSBsZW4pIHsKKwkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFzbWl0X2RhdGFfZnJhbWUoaXJlcSwgbGVuKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0cF9yZXEtPnBpb19sZW4gLT0gbGVuOworCisJCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBzZ2wsIG9mZnNldCBhbmQgc2F2ZSBmb3IgZnV0dXJlICovCisJCXNnbCA9IHBpb19zZ2xfbmV4dChzdHBfcmVxKTsKKwkJb2Zmc2V0ID0gMDsKKwl9IGVsc2UgaWYgKHN0cF9yZXEtPnBpb19sZW4gPCBsZW4pIHsKKwkJc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFzbWl0X2RhdGFfZnJhbWUoaXJlcSwgc3RwX3JlcS0+cGlvX2xlbik7CisKKwkJLyogU2dsIG9mZnNldCB3aWxsIGJlIGFkanVzdGVkIGFuZCBzYXZlZCBmb3IgZnV0dXJlICovCisJCW9mZnNldCArPSBzdHBfcmVxLT5waW9fbGVuOworCQlzZ2wtPmFkZHJlc3NfbG93ZXIgKz0gc3RwX3JlcS0+cGlvX2xlbjsKKwkJc3RwX3JlcS0+cGlvX2xlbiA9IDA7CisJfQorCisJc3RwX3JlcS0+c2dsLm9mZnNldCA9IG9mZnNldDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoKKyAqIEBzdHBfcmVxdWVzdDogVGhlIHJlcXVlc3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgU0dMIHByb2Nlc3NpbmcuCisgKiBAZGF0YV9idWZmZXI6IFRoZSBidWZmZXIgb2YgZGF0YSB0byBiZSBjb3BpZWQuCisgKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRyYW5zZmVyLgorICoKKyAqIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGZvciB0aGUgbGVuZ3RoIHNwZWNpZmllZCB0byB0aGUgSU8gcmVxZXVzdCBTR0wKKyAqIHNwZWNpZmllZCBkYXRhIHJlZ2lvbi4gZW51bSBzY2lfc3RhdHVzCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9pbl9jb3B5X2RhdGFfYnVmZmVyKHN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxLAorCQkJCQkJICB1OCAqZGF0YV9idWYsIHUzMiBsZW4pCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwl1OCAqc3JjX2FkZHI7CisJaW50IGNvcHlfbGVuOworCXN0cnVjdCBzYXNfdGFzayAqdGFzazsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXZvaWQgKmthZGRyOworCWludCB0b3RhbF9sZW4gPSBsZW47CisKKwlpcmVxID0gdG9faXJlcShzdHBfcmVxKTsKKwl0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCXNyY19hZGRyID0gZGF0YV9idWY7CisKKwlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPiAwKSB7CisJCXNnID0gdGFzay0+c2NhdHRlcjsKKworCQl3aGlsZSAodG90YWxfbGVuID4gMCkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHNnKTsKKworCQkJY29weV9sZW4gPSBtaW5fdChpbnQsIHRvdGFsX2xlbiwgc2dfZG1hX2xlbihzZykpOworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9JUlEwKTsKKwkJCW1lbWNweShrYWRkciArIHNnLT5vZmZzZXQsIHNyY19hZGRyLCBjb3B5X2xlbik7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9JUlEwKTsKKwkJCXRvdGFsX2xlbiAtPSBjb3B5X2xlbjsKKwkJCXNyY19hZGRyICs9IGNvcHlfbGVuOworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJfQorCX0gZWxzZSB7CisJCUJVR19PTih0YXNrLT50b3RhbF94ZmVyX2xlbiA8IHRvdGFsX2xlbik7CisJCW1lbWNweSh0YXNrLT5zY2F0dGVyLCBzcmNfYWRkciwgdG90YWxfbGVuKTsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcmVxOiBUaGUgUElPIERBVEEgSU4gcmVxdWVzdCB0aGF0IGlzIHRvIHJlY2VpdmUgdGhlIGRhdGEuCisgKiBAZGF0YV9idWZmZXI6IFRoZSBidWZmZXIgdG8gY29weSBmcm9tLgorICoKKyAqIENvcHkgdGhlIGRhdGEgYnVmZmVyIHRvIHRoZSBpbyByZXF1ZXN0IGRhdGEgcmVnaW9uLiBlbnVtIHNjaV9zdGF0dXMKKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhKAorCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxLAorCXU4ICpkYXRhX2J1ZmZlcikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBsZXNzIHRoYW4gMUsgcmVtYWluaW5nIGluIHRoZSB0cmFuc2ZlciByZXF1ZXN0CisJICogY29weSBqdXN0IHRoZSBkYXRhIGZvciB0aGUgdHJhbnNmZXIgKi8KKwlpZiAoc3RwX3JlcS0+cGlvX2xlbiA8IFNDVV9NQVhfRlJBTUVfQlVGRkVSX1NJWkUpIHsKKwkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX2luX2NvcHlfZGF0YV9idWZmZXIoCisJCQlzdHBfcmVxLCBkYXRhX2J1ZmZlciwgc3RwX3JlcS0+cGlvX2xlbik7CisKKwkJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykKKwkJCXN0cF9yZXEtPnBpb19sZW4gPSAwOworCX0gZWxzZSB7CisJCS8qIFdlIGFyZSB0cmFuc2ZlcmluZyB0aGUgd2hvbGUgZnJhbWUgc28gY29weSAqLworCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhX2J1ZmZlcigKKwkJCXN0cF9yZXEsIGRhdGFfYnVmZmVyLCBTQ1VfTUFYX0ZSQU1FX0JVRkZFUl9TSVpFKTsKKworCQlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKQorCQkJc3RwX3JlcS0+cGlvX2xlbiAtPSBTQ1VfTUFYX0ZSQU1FX0JVRkZFUl9TSVpFOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3N0cF9yZXF1ZXN0X3Bpb19hd2FpdF9oMmRfY29tcGxldGlvbl90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZQorCQkgKiBjb21wbGV0ZS4gIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0bworCQkgKiB0aGUgdXNlciB0byByZXRyeSB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworcGlvX2RhdGFfb3V0X3R4X2RvbmVfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCSAgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCWJvb2wgYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCA9IGZhbHNlOworCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxID0gJmlyZXEtPnN0cC5yZXE7CisKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJLyogVHJhbnNtaXQgZGF0YSAqLworCQlpZiAoc3RwX3JlcS0+cGlvX2xlbiAhPSAwKSB7CisJCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfb3V0X3RyYW5zbWl0X2RhdGEoaXJlcSk7CisJCQlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCQkJaWYgKHN0cF9yZXEtPnBpb19sZW4gPT0gMCkKKwkJCQkJYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCA9IHRydWU7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RwX3JlcS0+cGlvX2xlbiA9PSAwKSB7CisJCQkvKgorCQkJICogdGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgYWxsIGRhdGEgaXMgd3JpdHRlbiBhdCB0aGUKKwkJCSAqIGZpcnN0IHRpbWUgYWZ0ZXIgdGhlIHBpbyBzZXR1cCBmaXMgaXMgcmVjZWl2ZWQKKwkJCSAqLworCQkJYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCAgPSB0cnVlOworCQl9CisKKwkJLyogYWxsIGRhdGEgdHJhbnNmZXJyZWQuICovCisJCWlmIChhbGxfZnJhbWVzX3RyYW5zZmVycmVkKSB7CisJCQkvKgorCQkJICogQ2hhbmdlIHRoZSBzdGF0ZSB0byBTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTgorCQkJICogYW5kIHdhaXQgZm9yIFBJT19TRVRVUCBmaXMgLyBvciBEMkggUkVnIGZpcy4gKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLgorCQkgKiBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkKKwkJICogdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3N0cF9yZXF1ZXN0X3VkbWFfZ2VuZXJhbF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkJCSAgICAgICB1MzIgZnJhbWVfaW5kZXgpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKwlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpmcmFtZV9oZWFkZXI7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCXN0YXR1cyA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwlpZiAoKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgJiYKKwkgICAgKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUgPT0gRklTX1JFR0QySCkpIHsKKwkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucnNwLAorCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCSAgICAgICBmcmFtZV9idWZmZXIpOworCX0KKworCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgdTMyIGZyYW1lX2luZGV4KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3NpemVfdCB3b3JkX2NudDsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSAgeworCWNhc2UgU0NJX1JFUV9TVEFSVEVEOiB7CisJCXN0cnVjdCBzc3BfZnJhbWVfaGRyIHNzcF9oZHI7CisJCXZvaWQgKmZyYW1lX2hlYWRlcjsKKworCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICAgICAmZnJhbWVfaGVhZGVyKTsKKworCQl3b3JkX2NudCA9IHNpemVvZihzdHJ1Y3Qgc3NwX2ZyYW1lX2hkcikgLyBzaXplb2YodTMyKTsKKwkJc2NpX3N3YWIzMl9jcHkoJnNzcF9oZHIsIGZyYW1lX2hlYWRlciwgd29yZF9jbnQpOworCisJCWlmIChzc3BfaGRyLmZyYW1lX3R5cGUgPT0gU1NQX1JFU1BPTlNFKSB7CisJCQlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICpyZXNwX2l1OworCQkJc3NpemVfdCB3b3JkX2NudCA9IFNTUF9SRVNQX0lVX01BWF9TSVpFIC8gc2l6ZW9mKHUzMik7CisKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJnJlc3BfaXUpOworCisJCQlzY2lfc3dhYjMyX2NweSgmaXJlcS0+c3NwLnJzcCwgcmVzcF9pdSwgd29yZF9jbnQpOworCisJCQlyZXNwX2l1ID0gJmlyZXEtPnNzcC5yc3A7CisKKwkJCWlmIChyZXNwX2l1LT5kYXRhcHJlcyA9PSAweDAxIHx8CisJCQkgICAgcmVzcF9pdS0+ZGF0YXByZXMgPT0gMHgwMikgeworCQkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJCX0gZWxzZSB7CisJCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBub3QgYSByZXNwb25zZSBmcmFtZSwgd2h5IGRpZCBpdCBnZXQgZm9yd2FyZGVkPyAqLworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIHJlY2VpdmVkIHVuZXhwZWN0ZWQgIgorCQkJCSJmcmFtZSAlZCB0eXBlIDB4JTAyeFxuIiwgX19mdW5jX18sIGlyZXEsCisJCQkJZnJhbWVfaW5kZXgsIHNzcF9oZHIuZnJhbWVfdHlwZSk7CisJCX0KKworCQkvKgorCQkgKiBJbiBhbnkgY2FzZSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgZnJhbWUgYnVmZmVyIHJldHVybiBpdCB0bworCQkgKiB0aGUgY29udHJvbGxlcgorCQkgKi8KKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwljYXNlIFNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1A6CisJCXNjaV9pb19yZXF1ZXN0X2NvcHlfcmVzcG9uc2UoaXJlcSk7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCisJY2FzZSBTQ0lfUkVRX1NNUF9XQUlUX1JFU1A6IHsKKwkJc3RydWN0IHNtcF9yZXNwICpyc3BfaGRyID0gJmlyZXEtPnNtcC5yc3A7CisJCXZvaWQgKmZyYW1lX2hlYWRlcjsKKworCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICAgICAmZnJhbWVfaGVhZGVyKTsKKworCQkvKiBieXRlIHN3YXAgdGhlIGhlYWRlci4gKi8KKwkJd29yZF9jbnQgPSBTTVBfUkVTUF9IRFJfU1ogLyBzaXplb2YodTMyKTsKKwkJc2NpX3N3YWIzMl9jcHkocnNwX2hkciwgZnJhbWVfaGVhZGVyLCB3b3JkX2NudCk7CisKKwkJaWYgKHJzcF9oZHItPmZyYW1lX3R5cGUgPT0gU01QX1JFU1BPTlNFKSB7CisJCQl2b2lkICpzbXBfcmVzcDsKKworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAmc21wX3Jlc3ApOworCisJCQl3b3JkX2NudCA9IChzaXplb2Yoc3RydWN0IHNtcF9yZXNwKSAtIFNNUF9SRVNQX0hEUl9TWikgLworCQkJCXNpemVvZih1MzIpOworCisJCQlzY2lfc3dhYjMyX2NweSgoKHU4ICopIHJzcF9oZHIpICsgU01QX1JFU1BfSERSX1NaLAorCQkJCSAgICAgICBzbXBfcmVzcCwgd29yZF9jbnQpOworCisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfU01QX1dBSVRfVENfQ09NUCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhpcyB3YXMgbm90IGEgcmVzcG9uc2UgZnJhbWUgd2h5IGRpZCBpdCBnZXQKKwkJCSAqIGZvcndhcmRlZD8KKwkJCSAqLworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgU01QIFJlcXVlc3QgMHglcCByZWNlaXZlZCB1bmV4cGVjdGVkICIKKwkJCQkiZnJhbWUgJWQgdHlwZSAweCUwMnhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaXJlcSwKKwkJCQlmcmFtZV9pbmRleCwKKwkJCQlyc3BfaGRyLT5mcmFtZV90eXBlKTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUjsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCX0KKworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX1RDX0NPTVA6CisJCXJldHVybiBzY2lfc3RwX3JlcXVlc3RfdWRtYV9nZW5lcmFsX2ZyYW1lX2hhbmRsZXIoaXJlcSwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4KTsKKworCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySDoKKwkJLyogVXNlIHRoZSBnZW5lcmFsIGZyYW1lIGhhbmRsZXIgdG8gY29weSB0aGUgcmVzcG9zbmUgZGF0YSAqLworCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfdWRtYV9nZW5lcmFsX2ZyYW1lX2hhbmRsZXIoaXJlcSwgZnJhbWVfaW5kZXgpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKworCWNhc2UgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkg6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIGNvdWxkIG5vdCBnZXQgZnJhbWUgIgorCQkJCSJoZWFkZXIgZm9yIGZyYW1lIGluZGV4ICVkLCBzdGF0dXMgJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJc3RwX3JlcSwKKwkJCQlmcmFtZV9pbmRleCwKKwkJCQlzdGF0dXMpOworCisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJc3dpdGNoIChmcmFtZV9oZWFkZXItPmZpc190eXBlKSB7CisJCWNhc2UgRklTX1JFR0QySDoKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJCXNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSgmaXJlcS0+c3RwLnJzcCwKKwkJCQkJCQkgICAgICAgZnJhbWVfaGVhZGVyLAorCQkJCQkJCSAgICAgICBmcmFtZV9idWZmZXIpOworCisJCQkvKiBUaGUgY29tbWFuZCBoYXMgY29tcGxldGVkIHdpdGggZXJyb3IgKi8KKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IElPIFJlcXVlc3Q6MHglcCBGcmFtZSBJZDolZCBwcm90b2NvbCAiCisJCQkJICAidmlvbGF0aW9uIG9jY3VycmVkXG4iLCBfX2Z1bmNfXywgc3RwX3JlcSwKKwkJCQkgIGZyYW1lX2luZGV4KTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1BST1RPQ09MX1ZJT0xBVElPTjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKworCQkvKiBGcmFtZSBoYXMgYmVlbiBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19XQUlUX0ZSQU1FOiB7CisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIGNvdWxkIG5vdCBnZXQgZnJhbWUgIgorCQkJCSJoZWFkZXIgZm9yIGZyYW1lIGluZGV4ICVkLCBzdGF0dXMgJXhcbiIsCisJCQkJX19mdW5jX18sIHN0cF9yZXEsIGZyYW1lX2luZGV4LCBzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCXN3aXRjaCAoZnJhbWVfaGVhZGVyLT5maXNfdHlwZSkgeworCQljYXNlIEZJU19QSU9fU0VUVVA6CisJCQkvKiBHZXQgZnJvbSB0aGUgZnJhbWUgYnVmZmVyIHRoZSBQSU8gU2V0dXAgRGF0YSAqLworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAodm9pZCAqKikmZnJhbWVfYnVmZmVyKTsKKworCQkJLyogR2V0IHRoZSBkYXRhIGZyb20gdGhlIFBJTyBTZXR1cCBUaGUgU0NVIEhhcmR3YXJlCisJCQkgKiByZXR1cm5zIGZpcnN0IHdvcmQgaW4gdGhlIGZyYW1lX2hlYWRlciBhbmQgdGhlIHJlc3QKKwkJCSAqIG9mIHRoZSBkYXRhIGlzIGluIHRoZSBmcmFtZSBidWZmZXIgc28gd2UgbmVlZCB0bworCQkJICogYmFjayB1cCBvbmUgZHdvcmQKKwkJCSAqLworCisJCQkvKiB0cmFuc2Zlcl9jb3VudDogZmlyc3QgMTZiaXRzIGluIHRoZSA0dGggZHdvcmQgKi8KKwkJCXN0cF9yZXEtPnBpb19sZW4gPSBmcmFtZV9idWZmZXJbM10gJiAweGZmZmY7CisKKwkJCS8qIHN0YXR1czogNHRoIGJ5dGUgaW4gdGhlIDNyZCBkd29yZCAqLworCQkJc3RwX3JlcS0+c3RhdHVzID0gKGZyYW1lX2J1ZmZlclsyXSA+PiAyNCkgJiAweGZmOworCisJCQlzY2lfY29udHJvbGxlcl9jb3B5X3NhdGFfcmVzcG9uc2UoJmlyZXEtPnN0cC5yc3AsCisJCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgICAgICAgZnJhbWVfYnVmZmVyKTsKKworCQkJaXJlcS0+c3RwLnJzcC5zdGF0dXMgPSBzdHBfcmVxLT5zdGF0dXM7CisKKwkJCS8qIFRoZSBuZXh0IHN0YXRlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIHRoZQorCQkJICogcmVxdWVzdCB3YXMgUElPIERhdGEtaW4gb3IgRGF0YSBvdXQKKwkJCSAqLworCQkJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTik7CisJCQl9IGVsc2UgaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCQkvKiBUcmFuc21pdCBkYXRhICovCisJCQkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFuc21pdF9kYXRhKGlyZXEpOworCQkJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fREFUQV9PVVQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBGSVNfU0VUREVWQklUUzoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCQlicmVhazsKKworCQljYXNlIEZJU19SRUdEMkg6CisJCQlpZiAoZnJhbWVfaGVhZGVyLT5zdGF0dXMgJiBBVEFfQlVTWSkgeworCQkJCS8qCisJCQkJICogTm93IHdoeSBpcyB0aGUgZHJpdmUgc2VuZGluZyBhIEQySCBSZWdpc3RlcgorCQkJCSAqIEZJUyB3aGVuIGl0IGlzIHN0aWxsIGJ1c3k/ICBEbyBub3RoaW5nIHNpbmNlCisJCQkJICogd2UgYXJlIHN0aWxsIGluIHRoZSByaWdodCBzdGF0ZS4KKwkJCQkgKi8KKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSUMgUElPIFJlcXVlc3QgMHglcCByZWNlaXZlZCAiCisJCQkJCSJEMkggUmVnaXN0ZXIgRklTIHdpdGggQlNZIHN0YXR1cyAiCisJCQkJCSIweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJc3RwX3JlcSwKKwkJCQkJZnJhbWVfaGVhZGVyLT5zdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICh2b2lkICoqKSZmcmFtZV9idWZmZXIpOworCisJCQlzY2lfY29udHJvbGxlcl9jb3B5X3NhdGFfcmVzcG9uc2UoJmlyZXEtPnN0cC5yZXEsCisJCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgICAgICAgZnJhbWVfYnVmZmVyKTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIEZJWE1FOiB3aGF0IGRvIHdlIGRvIGhlcmU/ICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIEZyYW1lIGlzIGRlY29kZWQgcmV0dXJuIGl0IHRvIHRoZSBjb250cm9sbGVyICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNhc2UgU0NJX1JFUV9TVFBfUElPX0RBVEFfSU46IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQlzdHJ1Y3Qgc2F0YV9maXNfZGF0YSAqZnJhbWVfYnVmZmVyOworCisJCXN0YXR1cyA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICAodm9pZCAqKikmZnJhbWVfaGVhZGVyKTsKKworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJQyBJTyBSZXF1ZXN0IDB4JXAgY291bGQgbm90IGdldCBmcmFtZSAiCisJCQkJImhlYWRlciBmb3IgZnJhbWUgaW5kZXggJWQsIHN0YXR1cyAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdHBfcmVxLAorCQkJCWZyYW1lX2luZGV4LAorCQkJCXN0YXR1cyk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJaWYgKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUgIT0gRklTX0RBVEEpIHsKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIFBJTyBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgZnJhbWUgJWQgIgorCQkJCSJ3aXRoIGZpcyB0eXBlIDB4JTAyeCB3aGVuIGV4cGVjdGluZyBhIGRhdGEgIgorCQkJCSJmaXMuXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0cF9yZXEsCisJCQkJZnJhbWVfaW5kZXgsCisJCQkJZnJhbWVfaGVhZGVyLT5maXNfdHlwZSk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVRVUlSRVNfU0NTSV9BQk9SVDsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisKKwkJCS8qIEZyYW1lIGlzIGRlY29kZWQgcmV0dXJuIGl0IHRvIHRoZSBjb250cm9sbGVyICovCisJCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJaWYgKHN0cF9yZXEtPnNnbC5pbmRleCA8IDApIHsKKwkJCWlyZXEtPnNhdmVkX3J4X2ZyYW1lX2luZGV4ID0gZnJhbWVfaW5kZXg7CisJCQlzdHBfcmVxLT5waW9fbGVuID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJCXN0YXR1cyA9IHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9pbl9jb3B5X2RhdGEoc3RwX3JlcSwKKwkJCQkJCQkJCSAgICAodTggKilmcmFtZV9idWZmZXIpOworCisJCQkvKiBGcmFtZSBpcyBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyLCBhcmUgdGhlcmUgbW9yZQorCQkgKiBieXRlcyByZW1haW5pbmcgZm9yIHRoaXMgZGF0YSB0cmFuc2ZlcgorCQkgKi8KKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUyB8fCBzdHBfcmVxLT5waW9fbGVuICE9IDApCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWlmICgoc3RwX3JlcS0+c3RhdHVzICYgQVRBX0JVU1kpID09IDApIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJfSBlbHNlIHsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkg6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIElPIFJlcXVlc3QgMHglcCBjb3VsZCBub3QgZ2V0IGZyYW1lICIKKwkJCQkiaGVhZGVyIGZvciBmcmFtZSBpbmRleCAlZCwgc3RhdHVzICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0cF9yZXEsCisJCQkJZnJhbWVfaW5kZXgsCisJCQkJc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlzd2l0Y2ggKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUpIHsKKwkJY2FzZSBGSVNfUkVHRDJIOgorCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAodm9pZCAqKikmZnJhbWVfYnVmZmVyKTsKKworCQkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucnNwLAorCQkJCQkJCSAgICAgICBmcmFtZV9oZWFkZXIsCisJCQkJCQkJICAgICAgIGZyYW1lX2J1ZmZlcik7CisKKwkJCS8qIFRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvciAqLworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogSU8gUmVxdWVzdDoweCVwIEZyYW1lIElkOiVkIHByb3RvY29sICIKKwkJCQkgInZpb2xhdGlvbiBvY2N1cnJlZFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIHN0cF9yZXEsCisJCQkJIGZyYW1lX2luZGV4KTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1BST1RPQ09MX1ZJT0xBVElPTjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKworCQkvKiBGcmFtZSBoYXMgYmVlbiBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgorCQkvKgorCQkgKiBUT0RPOiBJcyBpdCBldmVuIHBvc3NpYmxlIHRvIGdldCBhbiB1bnNvbGljaXRlZCBmcmFtZSBpbiB0aGUKKwkJICogYWJvcnRpbmcgc3RhdGU/CisJCSAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogU0NJQyBJTyBSZXF1ZXN0IGdpdmVuIHVuZXhwZWN0ZWQgZnJhbWUgJXggd2hpbGUgIgorCQkJICJpbiBzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBmcmFtZV9pbmRleCwKKwkJCSBzdGF0ZSk7CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc3RwX3JlcXVlc3RfdWRtYV9hd2FpdF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICAgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1VORVhQX0ZJUyk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1JFR19FUlIpOgorCQkvKiBXZSBtdXN0IGNoZWNrIHRoZXIgcmVzcG9uc2UgYnVmZmVyIHRvIHNlZSBpZiB0aGUgRDJICisJCSAqIFJlZ2lzdGVyIEZJUyB3YXMgcmVjZWl2ZWQgYmVmb3JlIHdlIGdvdCB0aGUgVEMKKwkJICogY29tcGxldGlvbi4KKwkJICovCisJCWlmIChpcmVxLT5zdHAucnNwLmZpc190eXBlID09IEZJU19SRUdEMkgpIHsKKwkJCXNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoaXJlcS0+dGFyZ2V0X2RldmljZSwKKwkJCQlTQ1VfRVZFTlRfU1BFQ0lGSUMoU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGhhdmUgYW4gZXJyb3IgY29tcGxldGlvbiBzdGF0dXMgZm9yIHRoZQorCQkJICogVEMgdGhlbiB3ZSBjYW4gZXhwZWN0IGEgRDJIIHJlZ2lzdGVyIEZJUyBmcm9tCisJCQkgKiB0aGUgZGV2aWNlIHNvIHdlIG11c3QgY2hhbmdlIHN0YXRlIHRvIHdhaXQKKwkJCSAqIGZvciBpdAorCQkJICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySCk7CisJCX0KKwkJYnJlYWs7CisKKwkvKiBUT0RPIENoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlc2UgY29tcGxldGlvbiBzdGF0dXMgbmVlZCB0bworCSAqIHdhaXQgZm9yIHRoZSBkZXZpY2UgdG8gaG9zdCByZWdpc3RlciBmaXMuCisJICovCisJLyogVE9ETyBXZSBjYW4gcmV0cnkgdGhlIGNvbW1hbmQgZm9yIFNDVV9UQVNLX0RPTkVfQ01EX0xMX1JfRVJSCisJICogLSB0aGlzIGNvbWVzIG9ubHkgZm9yIEIwCisJICovCisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0lOVl9GSVNfTEVOKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTUFYX1BMRF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MTF9SX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NNRF9MTF9SX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NSQ19FUlIpOgorCQlzY2lfcmVtb3RlX2RldmljZV9zdXNwZW5kKGlyZXEtPnRhcmdldF9kZXZpY2UsCisJCQlTQ1VfRVZFTlRfU1BFQ0lGSUMoU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSk7CisJLyogRmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGNhc2UgKi8KKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLiAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3N0cF9yZXF1ZXN0X3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuCisJCSAqIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0byB0aGUgdXNlciB0byByZXRyeQorCQkgKiB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzdHBfcmVxdWVzdF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9kaWFnbm9zdGljX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuICBJZgorCQkgKiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkgdGhlCisJCSAqIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF90Y19jb21wbGV0aW9uKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9SRVFfU1RBUlRFRDoKKwkJcmV0dXJuIHJlcXVlc3Rfc3RhcnRlZF9zdGF0ZV90Y19ldmVudChpcmVxLCBjb21wbGV0aW9uX2NvZGUpOworCisJY2FzZSBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gc3NwX3Rhc2tfcmVxdWVzdF9hd2FpdF90Y19ldmVudChpcmVxLAorCQkJCQkJICAgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfUkVTUDoKKwkJcmV0dXJuIHNtcF9yZXF1ZXN0X2F3YWl0X3Jlc3BvbnNlX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TTVBfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gc21wX3JlcXVlc3RfYXdhaXRfdGNfZXZlbnQoaXJlcSwgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX1RDX0NPTVA6CisJCXJldHVybiBzdHBfcmVxdWVzdF91ZG1hX2F3YWl0X3RjX2V2ZW50KGlyZXEsCisJCQkJCQkgICAgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkQ6CisJCXJldHVybiBzdHBfcmVxdWVzdF9ub25fZGF0YV9hd2FpdF9oMmRfdGNfZXZlbnQoaXJlcSwKKwkJCQkJCQkgICAgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEOgorCQlyZXR1cm4gc3RwX3JlcXVlc3RfcGlvX2F3YWl0X2gyZF9jb21wbGV0aW9uX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJCSAgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VUOgorCQlyZXR1cm4gcGlvX2RhdGFfb3V0X3R4X2RvbmVfdGNfZXZlbnQoaXJlcSwgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRDoKKwkJcmV0dXJuIHN0cF9yZXF1ZXN0X3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJCQkgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRzoKKwkJcmV0dXJuIHN0cF9yZXF1ZXN0X3NvZnRfcmVzZXRfYXdhaXRfaDJkX2RpYWdub3N0aWNfdGNfZXZlbnQoaXJlcSwKKwkJCQkJCQkJCSAgICBjb21wbGV0aW9uX2NvZGUpOworCisJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgorCQlyZXR1cm4gcmVxdWVzdF9hYm9ydGluZ19zdGF0ZV90Y19ldmVudChpcmVxLAorCQkJCQkJICAgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgSU8gUmVxdWVzdCBnaXZlbiB0YXNrIGNvbXBsZXRpb24gIgorCQkJICJub3RpZmljYXRpb24gJXggd2hpbGUgaW4gd3Jvbmcgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkgY29tcGxldGlvbl9jb2RlLAorCQkJIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9wcm9jZXNzX3Jlc3BvbnNlX2l1KCkgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0YXR1cyBhbmQKKyAqICAgIHJlc3BvbnNlIGl1LCBpbiB0aGUgdGFzayBzdHJ1Y3QsIGZyb20gdGhlIHJlcXVlc3Qgb2JqZWN0IGZvciB0aGUgdXBwZXIKKyAqICAgIGxheWVyIGRyaXZlci4KKyAqIEBzYXNfdGFzazogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHRhc2sgc3RydWN0IGZyb20gdGhlIHVwcGVyIGxheWVyIGRyaXZlci4KKyAqIEByZXNwX2l1OiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIHJlc3BvbnNlIGl1IG9mIHRoZSBjb21wbGV0ZWQgcmVxdWVzdC4KKyAqIEBkZXY6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGludXggZGV2aWNlIHN0cnVjdC4KKyAqCisgKiBub25lLgorICovCitzdGF0aWMgdm9pZCBpc2NpX3JlcXVlc3RfcHJvY2Vzc19yZXNwb25zZV9pdSgKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqcmVzcF9pdSwKKwlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2X2RiZyhkZXYsCisJCSIlczogcmVzcF9pdSA9ICVwICIKKwkJInJlc3BfaXUtPnN0YXR1cyA9IDB4JXgsXG5yZXNwX2l1LT5kYXRhcHJlcyA9ICVkICIKKwkJInJlc3BfaXUtPnJlc3BvbnNlX2RhdGFfbGVuID0gJXgsICIKKwkJInJlc3BfaXUtPnNlbnNlX2RhdGFfbGVuID0gJXhcbnJlcHNvbnNlIGRhdGE6ICIsCisJCV9fZnVuY19fLAorCQlyZXNwX2l1LAorCQlyZXNwX2l1LT5zdGF0dXMsCisJCXJlc3BfaXUtPmRhdGFwcmVzLAorCQlyZXNwX2l1LT5yZXNwb25zZV9kYXRhX2xlbiwKKwkJcmVzcF9pdS0+c2Vuc2VfZGF0YV9sZW4pOworCisJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9IHJlc3BfaXUtPnN0YXR1czsKKworCS8qIGxpYnNhcyB1cGRhdGVzIHRoZSB0YXNrIHN0YXR1cyBmaWVsZHMgYmFzZWQgb24gdGhlIHJlc3BvbnNlIGl1LiAqLworCXNhc19zc3BfdGFza19yZXNwb25zZShkZXYsIHRhc2ssIHJlc3BfaXUpOworfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKCkgLSBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBJL08KKyAqICAgIGNvbXBsZXRpb24gZm9yIE9QRU5fUkVKRUNUIGNvbmRpdGlvbnMuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCBpc2NpX3JlcXVlc3Qgb2JqZWN0LgorICogQHJlc3BvbnNlX3B0cjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGZvciB0aGUgSS9PLgorICogQHN0YXR1c19wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZXhlYyBzdGF0dXMgZm9yIHRoZSBJL08uCisgKiBAY29tcGxldGVfdG9faG9zdF9wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGJ5CisgKiAgICB0aGUgTExERCB3aXRoIHJlc3BlY3QgdG8gY29tcGxldGluZyB0aGlzIHJlcXVlc3Qgb3IgZm9yY2luZyBhbiBhYm9ydAorICogICAgY29uZGl0aW9uIG9uIHRoZSBJL08uCisgKiBAb3Blbl9yZWpfcmVhc29uOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGVuY29kZWQgcmVhc29uIGZvciB0aGUKKyAqICAgIGFiYW5kb24tY2xhc3MgcmVqZWN0LgorICoKKyAqIG5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWVudW0gc2VydmljZV9yZXNwb25zZSAqcmVzcG9uc2VfcHRyLAorCWVudW0gZXhlY19zdGF0dXMgKnN0YXR1c19wdHIsCisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uICpjb21wbGV0ZV90b19ob3N0X3B0ciwKKwllbnVtIHNhc19vcGVuX3Jlal9yZWFzb24gb3Blbl9yZWpfcmVhc29uKQoreworCS8qIFRhc2sgaW4gdGhlIHRhcmdldCBpcyBkb25lLiAqLworCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJKnJlc3BvbnNlX3B0ciAgICAgICAgICAgICAgICAgICAgID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJKnN0YXR1c19wdHIgICAgICAgICAgICAgICAgICAgICAgID0gU0FTX09QRU5fUkVKRUNUOworCSpjb21wbGV0ZV90b19ob3N0X3B0ciAgICAgICAgICAgICA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwl0YXNrLT50YXNrX3N0YXR1cy5vcGVuX3Jlal9yZWFzb24gPSBvcGVuX3Jlal9yZWFzb247Cit9CisKKy8qKgorICogaXNjaV9yZXF1ZXN0X2hhbmRsZV9jb250cm9sbGVyX3NwZWNpZmljX2Vycm9ycygpIC0gVGhpcyBmdW5jdGlvbiBkZWNvZGVzCisgKiAgICBjb250cm9sbGVyLXNwZWNpZmljIEkvTyBjb21wbGV0aW9uIGVycm9yIGNvbmRpdGlvbnMuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCBpc2NpX3JlcXVlc3Qgb2JqZWN0LgorICogQHJlc3BvbnNlX3B0cjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGZvciB0aGUgSS9PLgorICogQHN0YXR1c19wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZXhlYyBzdGF0dXMgZm9yIHRoZSBJL08uCisgKiBAY29tcGxldGVfdG9faG9zdF9wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGJ5CisgKiAgICB0aGUgTExERCB3aXRoIHJlc3BlY3QgdG8gY29tcGxldGluZyB0aGlzIHJlcXVlc3Qgb3IgZm9yY2luZyBhbiBhYm9ydAorICogICAgY29uZGl0aW9uIG9uIHRoZSBJL08uCisgKgorICogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2hhbmRsZV9jb250cm9sbGVyX3NwZWNpZmljX2Vycm9ycygKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWVudW0gc2VydmljZV9yZXNwb25zZSAqcmVzcG9uc2VfcHRyLAorCWVudW0gZXhlY19zdGF0dXMgKnN0YXR1c19wdHIsCisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uICpjb21wbGV0ZV90b19ob3N0X3B0cikKK3sKKwl1bnNpZ25lZCBpbnQgY3N0YXR1czsKKworCWNzdGF0dXMgPSByZXF1ZXN0LT5zY3Vfc3RhdHVzOworCisJZGV2X2RiZygmcmVxdWVzdC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogJXAgU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIgIgorCQkiLSBjb250cm9sbGVyIHN0YXR1cyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCByZXF1ZXN0LCBjc3RhdHVzKTsKKworCS8qIERlY29kZSB0aGUgY29udHJvbGxlci1zcGVjaWZpYyBlcnJvcnM7IG1vc3QKKwkgKiBpbXBvcnRhbnQgaXMgdG8gcmVjb2duaXplIHRob3NlIGNvbmRpdGlvbnMgaW4gd2hpY2gKKwkgKiB0aGUgdGFyZ2V0IG1heSBzdGlsbCBoYXZlIGEgdGFzayBvdXRzdGFuZGluZyB0aGF0CisJICogbXVzdCBiZSBhYm9ydGVkLgorCSAqCisJICogTm90ZSB0aGF0IHRoZXJlIGFyZSBTQ1UgY29tcGxldGlvbiBjb2RlcyBiZWluZworCSAqIG5hbWVkIGluIHRoZSBkZWNvZGUgYmVsb3cgZm9yIHdoaWNoIFNDSUMgaGFzIGFscmVhZHkKKwkgKiBkb25lIHdvcmsgdG8gaGFuZGxlIHRoZW0gaW4gYSB3YXkgb3RoZXIgdGhhbiBhcworCSAqIGEgY29udHJvbGxlci1zcGVjaWZpYyBjb21wbGV0aW9uIGNvZGU7IHRoZXNlIGFyZSBsZWZ0CisJICogaW4gdGhlIGRlY29kZSBiZWxvdyBmb3IgY29tcGxldGVuZXNzIHNha2UuCisJICovCisJc3dpdGNoIChjc3RhdHVzKSB7CisJY2FzZSBTQ1VfVEFTS19ET05FX0RNQVNFVFVQX0RJUkVSUjoKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUjogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfWEZFUkNOVF9FUlI6CisJCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9TTVBfVUZJX0VSUjogKi8KKwkJaWYgKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCkgeworCQkJLyogU0NVX1RBU0tfRE9ORV9TTVBfVUZJX0VSUiA9PSBUYXNrIERvbmUuICovCisJCQkqcmVzcG9uc2VfcHRyID0gU0FTX1RBU0tfQ09NUExFVEU7CisKKwkJCS8qIFNlZSBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuL2lzIGJlaW5nIHN0b3BwZWQuIE5vdGUKKwkJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJCSAqLworCQkJaWYgKCFpZGV2KQorCQkJCSpzdGF0dXNfcHRyID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCSpzdGF0dXNfcHRyID0gU0FTX0FCT1JURURfVEFTSzsKKworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkJKmNvbXBsZXRlX3RvX2hvc3RfcHRyID0KKwkJCQlpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCX0gZWxzZSB7CisJCQkvKiBUYXNrIGluIHRoZSB0YXJnZXQgaXMgbm90IGRvbmUuICovCisJCQkqcmVzcG9uc2VfcHRyID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJCWlmICghaWRldikKKwkJCQkqc3RhdHVzX3B0ciA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJCWVsc2UKKwkJCQkqc3RhdHVzX3B0ciA9IFNBTV9TVEFUX1RBU0tfQUJPUlRFRDsKKworCQkJY2xlYXJfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCQkqY29tcGxldGVfdG9faG9zdF9wdHIgPQorCQkJCWlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX0RPTkVfQ1JDX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfTkFLX0NNRF9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX0VYQ0VTU19EQVRBOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9VTkVYUF9GSVM6CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX1VORVhQX1JFU1A6ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1ZJSVRfRU5UUllfTlY6ICAgICAgIC8qIFRPRE8gLSBjb25kaXRpb25zPyAqLworCWNhc2UgU0NVX1RBU0tfRE9ORV9JSVRfRU5UUllfTlY6ICAgICAgICAvKiBUT0RPIC0gY29uZGl0aW9ucz8gKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfUk5DTlZfT1VUQk9VTkQ6ICAgICAgLyogVE9ETyAtIGNvbmRpdGlvbnM/ICovCisJCS8qIFRoZXNlIGFyZSBjb25kaXRpb25zIGluIHdoaWNoIHRoZSB0YXJnZXQKKwkJICogaGFzIGNvbXBsZXRlZCB0aGUgdGFzaywgc28gdGhhdCBubyBjbGVhbnVwCisJCSAqIGlzIG5lY2Vzc2FyeS4KKwkJICovCisJCSpyZXNwb25zZV9wdHIgPSBTQVNfVEFTS19DT01QTEVURTsKKworCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFpZGV2KQorCQkJKnN0YXR1c19wdHIgPSBTQVNfREVWSUNFX1VOS05PV047CisJCWVsc2UKKwkJCSpzdGF0dXNfcHRyID0gU0FTX0FCT1JURURfVEFTSzsKKworCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCSpjb21wbGV0ZV90b19ob3N0X3B0ciA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwkJYnJlYWs7CisKKworCS8qIE5vdGUgdGhhdCB0aGUgb25seSBvcGVuIHJlamVjdCBjb21wbGV0aW9uIGNvZGVzIHNlZW4gaGVyZSB3aWxsIGJlCisJICogYWJhbmRvbi1jbGFzcyBjb2RlczsgYWxsIG90aGVycyBhcmUgYXV0b21hdGljYWxseSByZXRyaWVkIGluIHRoZSBTQ1UuCisJICovCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9XUk9OR19ERVNUSU5BVElPTjoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9XUk9OR19ERVNUKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX09QRU5fUkVKRUNUX1pPTkVfVklPTEFUSU9OOgorCisJCS8qIE5vdGUgLSB0aGUgcmV0dXJuIG9mIEFCMCB3aWxsIGNoYW5nZSB3aGVuCisJCSAqIGxpYnNhcyBpbXBsZW1lbnRzIGRldGVjdGlvbiBvZiB6b25lIHZpb2xhdGlvbnMuCisJCSAqLworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9SRVNWX0FCMCk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzE6CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfUkVTVl9BQjEpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8yOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX1JFU1ZfQUIyKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMzoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9SRVNWX0FCMyk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9CQURfREVTVElOQVRJT046CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfQkFEX0RFU1QpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfU1RQX1JFU09VUkNFU19CVVNZOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX1NUUF9OT1JFUyk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX0VQUk9UTyk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRDoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9DT05OX1JBVEUpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfRE9ORV9MTF9SX0VSUjoKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfQUNLX05BS19UTzogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfTExfUEVSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfTExfU1lfVEVSTToKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfTkFLX0VSUjoqLworCWNhc2UgU0NVX1RBU0tfRE9ORV9MTF9MRl9URVJNOgorCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9EQVRBX0xFTl9FUlI6ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX0xMX0FCT1JUX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfU0VRX0lOVl9UWVBFOgorCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9VTkVYUF9YUjogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfWFJfSVVfTEVOX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfSU5WX0ZJU19MRU46CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX1hSX1dEX0xFTjogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfU0RNQV9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX09GRlNFVF9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX01BWF9QTERfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9MRl9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX1NNUF9SRVNQX1RPX0VSUjogIC8qIEVzY2FsYXRlIHRvIGRldiByZXNldD8gKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfU01QX0xMX1JYX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfVU5FWFBfREFUQToKKwljYXNlIFNDVV9UQVNLX0RPTkVfVU5FWFBfU0RCRklTOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9SRUdfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9TREJfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUOgorCWRlZmF1bHQ6CisJCS8qIFRhc2sgaW4gdGhlIHRhcmdldCBpcyBub3QgZG9uZS4gKi8KKwkJKnJlc3BvbnNlX3B0ciA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCQkqc3RhdHVzX3B0ciA9IFNBTV9TVEFUX1RBU0tfQUJPUlRFRDsKKworCQlpZiAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSB7CisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCQkqY29tcGxldGVfdG9faG9zdF9wdHIgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisKKwkJCSpjb21wbGV0ZV90b19ob3N0X3B0ciA9IGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rhc2tfc2F2ZV9mb3JfdXBwZXJfbGF5ZXJfY29tcGxldGlvbigpIC0gVGhpcyBmdW5jdGlvbiBzYXZlcyB0aGUKKyAqICAgIHJlcXVlc3QgZm9yIGxhdGVyIGNvbXBsZXRpb24gdG8gdGhlIHVwcGVyIGxheWVyIGRyaXZlci4KKyAqIEBob3N0OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGhvc3Qgb24gd2hpY2ggdGhlIHRoZSByZXF1ZXN0CisgKiAgICBzaG91bGQgYmUgcXVldWVkIChlaXRoZXIgYXMgYW4gZXJyb3Igb3Igc3VjY2VzcykuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCByZXF1ZXN0LgorICogQHJlc3BvbnNlOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgcmVzcG9uc2UgY29kZSBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorICogQHN0YXR1czogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHN0YXR1cyBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisgKgorICogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgaXNjaV90YXNrX3NhdmVfZm9yX3VwcGVyX2xheWVyX2NvbXBsZXRpb24oCisJc3RydWN0IGlzY2lfaG9zdCAqaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCWVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSwKKwllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cywKKwllbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24gdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKworCXRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbgorCQk9IGlzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXModGFzaywgcmVzcG9uc2UsIHN0YXR1cywKKwkJCQkJCSAgdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKTsKKworCS8qIFRhc2tzIGFib3J0ZWQgc3BlY2lmaWNhbGx5IGJ5IGEgY2FsbCB0byB0aGUgbGxkZF9hYm9ydF90YXNrCisJICogZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjb21wbGV0ZWQgdG8gdGhlIGhvc3QgaW4gdGhlIHJlZ3VsYXIgcGF0aC4KKwkgKi8KKwlzd2l0Y2ggKHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbikgeworCisJY2FzZSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb246CisKKwkJLyogTm9ybWFsIG5vdGlmaWNhdGlvbiAodGFza19kb25lKSAqLworCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IE5vcm1hbCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXRhc2ssCisJCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKKwkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQsIHN0YXR1cyk7CisJCS8qIEFkZCB0byB0aGUgY29tcGxldGVkIGxpc3QuICovCisJCWxpc3RfYWRkKCZyZXF1ZXN0LT5jb21wbGV0ZWRfbm9kZSwKKwkJCSAmaG9zdC0+cmVxdWVzdHNfdG9fY29tcGxldGUpOworCisJCS8qIFRha2UgdGhlIHJlcXVlc3Qgb2ZmIHRoZSBkZXZpY2UncyBwZW5kaW5nIHJlcXVlc3QgbGlzdC4gKi8KKwkJbGlzdF9kZWxfaW5pdCgmcmVxdWVzdC0+ZGV2X25vZGUpOworCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjoKKwkJLyogTm8gbm90aWZpY2F0aW9uIHRvIGxpYnNhcyBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcworCQkgKiBhbHJlYWR5IGluIHRoZSBhYm9ydCBwYXRoLgorCQkgKi8KKwkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogQWJvcnRlZCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCQkgX19mdW5jX18sCisJCQkgdGFzaywKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOworCisJCS8qIFdha2UgdXAgd2hhdGV2ZXIgcHJvY2VzcyB3YXMgd2FpdGluZyBmb3IgdGhpcworCQkgKiByZXF1ZXN0IHRvIGNvbXBsZXRlLgorCQkgKi8KKwkJV0FSTl9PTihyZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gPT0gTlVMTCk7CisKKwkJaWYgKHJlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbiAhPSBOVUxMKSB7CisKKwkJCS8qIFNpZ25hbCB3aG9ldmVyIGlzIHdhaXRpbmcgdGhhdCB0aGlzCisJCQkqIHJlcXVlc3QgaXMgY29tcGxldGUuCisJCQkqLworCQkJY29tcGxldGUocmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb246CisJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLworCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBFcnJvciAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCQkgX19mdW5jX18sCisJCQkgdGFzaywKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOworCQkvKiBBZGQgdG8gdGhlIGFib3J0ZWQgbGlzdC4gKi8KKwkJbGlzdF9hZGQoJnJlcXVlc3QtPmNvbXBsZXRlZF9ub2RlLAorCQkJICZob3N0LT5yZXF1ZXN0c190b19lcnJvcmJhY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFVua25vd24gLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHRhc2ssCisJCQkgdGFzay0+dGFza19zdGF0dXMucmVzcCwgcmVzcG9uc2UsCisJCQkgdGFzay0+dGFza19zdGF0dXMuc3RhdCwgc3RhdHVzKTsKKworCQkvKiBBZGQgdG8gdGhlIGVycm9yIHRvIGxpYnNhcyBsaXN0LiAqLworCQlsaXN0X2FkZCgmcmVxdWVzdC0+Y29tcGxldGVkX25vZGUsCisJCQkgJmhvc3QtPnJlcXVlc3RzX3RvX2Vycm9yYmFjayk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X3Byb2Nlc3Nfc3RwX3Jlc3BvbnNlKHN0cnVjdCBzYXNfdGFzayAqdGFzaywKKwkJCQkJICAgICAgdm9pZCAqcmVzcG9uc2VfYnVmZmVyKQoreworCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmQyaF9yZWdfZmlzID0gcmVzcG9uc2VfYnVmZmVyOworCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzID0gJnRhc2stPnRhc2tfc3RhdHVzOworCXN0cnVjdCBhdGFfdGFza19yZXNwICpyZXNwID0gKHZvaWQgKikmdHMtPmJ1ZlswXTsKKworCXJlc3AtPmZyYW1lX2xlbiA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKHJlc3BvbnNlX2J1ZmZlciArIDYpKTsKKwltZW1jcHkoJnJlc3AtPmVuZGluZ19maXNbMF0sIHJlc3BvbnNlX2J1ZmZlciArIDE2LCAyNCk7CisJdHMtPmJ1Zl92YWxpZF9zaXplID0gc2l6ZW9mKCpyZXNwKTsKKworCS8qKgorCSAqIElmIHRoZSBkZXZpY2UgZmF1bHQgYml0IGlzIHNldCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCB0aGVuCisJICogc2V0IHRoZSBzZW5zZSBkYXRhIGFuZCByZXR1cm4uCisJICovCisJaWYgKGQyaF9yZWdfZmlzLT5zdGF0dXMgJiBBVEFfREYpCisJCXRzLT5zdGF0ID0gU0FTX1BST1RPX1JFU1BPTlNFOworCWVsc2UKKwkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOworCisJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKK30KKworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2lvX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCwKKwkJCQkJICAgICBlbnVtIHNjaV9pb19zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOworCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3BfaXU7CisJdm9pZCAqcmVzcF9idWY7CisJdW5zaWduZWQgbG9uZyB0YXNrX2ZsYWdzOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UodGFzay0+ZGV2KTsKKwllbnVtIHNlcnZpY2VfcmVzcG9uc2UgcmVzcG9uc2UgICAgICAgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cyAgICAgICAgID0gU0FTX0FCT1JURURfVEFTSzsKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgcmVxdWVzdF9zdGF0dXM7CisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIGNvbXBsZXRlX3RvX2hvc3QKKwkJPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHJlcXVlc3QgPSAlcCwgdGFzayA9ICVwLFxuIgorCQkidGFzay0+ZGF0YV9kaXIgPSAlZCBjb21wbGV0aW9uX3N0YXR1cyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlyZXF1ZXN0LAorCQl0YXNrLAorCQl0YXNrLT5kYXRhX2RpciwKKwkJY29tcGxldGlvbl9zdGF0dXMpOworCisJc3Bpbl9sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwlyZXF1ZXN0X3N0YXR1cyA9IHJlcXVlc3QtPnN0YXR1czsKKworCS8qIERlY29kZSB0aGUgcmVxdWVzdCBzdGF0dXMuICBOb3RlIHRoYXQgaWYgdGhlIHJlcXVlc3QgaGFzIGJlZW4KKwkgKiBhYm9ydGVkIGJ5IGEgdGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uLCB3ZSBkb24ndCBjYXJlCisJICogd2hhdCB0aGUgc3RhdHVzIGlzLgorCSAqLworCXN3aXRjaCAocmVxdWVzdF9zdGF0dXMpIHsKKworCWNhc2UgYWJvcnRlZDoKKwkJLyogImFib3J0ZWQiIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkIGJ5IGEgdGFzaworCQkgKiBtYW5hZ2VtZW50IGZ1bmN0aW9uLCBzaW5jZSBvbmNlIGEgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgaXMKKwkJICogcGVyZm9tZWQgYnkgdGhlIGRldmljZSwgdGhlIHJlcXVlc3Qgb25seSBjb21wbGV0ZXMgYmVjYXVzZQorCQkgKiBvZiB0aGUgc3Vic2VxdWVudCBkcml2ZXIgdGVybWluYXRlLgorCQkgKgorCQkgKiBBYm9ydGVkIGFsc28gbWVhbnMgYW4gZXh0ZXJuYWwgdGhyZWFkIGlzIGV4cGxpY2l0bHkgbWFuYWdpbmcKKwkJICogdGhpcyByZXF1ZXN0LCBzbyB0aGF0IHdlIGRvIG5vdCBjb21wbGV0ZSBpdCB1cCB0aGUgc3RhY2suCisJCSAqCisJCSAqIFRoZSB0YXJnZXQgaXMgc3RpbGwgdGhlcmUgKHNpbmNlIHRoZSBUTUYgd2FzIHN1Y2Nlc3NmdWwpLgorCQkgKi8KKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJcmVzcG9uc2UgPSBTQVNfVEFTS19DT01QTEVURTsKKworCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFpZGV2KQorCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQllbHNlCisJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fYWJvcnRlZF9pb19jb21wbGV0aW9uOworCQkvKiBUaGlzIHdhcyBhbiBhYm9ydGVkIHJlcXVlc3QuICovCisKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWNhc2UgYWJvcnRpbmc6CisJCS8qIGFib3J0aW5nIG1lYW5zIHRoYXQgdGhlIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbiB0cmllZCBhbmQKKwkJICogZmFpbGVkIHRvIGFib3J0IHRoZSByZXF1ZXN0LiBXZSBuZWVkIHRvIG5vdGUgdGhlIHJlcXVlc3QKKwkJICogYXMgU0FTX1RBU0tfVU5ERUxJVkVSRUQsIHNvIHRoYXQgdGhlIHNjc2kgbWlkIGxheWVyIG1hcmtzIHRoZQorCQkgKiB0YXJnZXQgYXMgZG93bi4KKwkJICoKKwkJICogQWJvcnRpbmcgYWxzbyBtZWFucyBhbiBleHRlcm5hbCB0aHJlYWQgaXMgZXhwbGljaXRseSBtYW5hZ2luZworCQkgKiB0aGlzIHJlcXVlc3QsIHNvIHRoYXQgd2UgZG8gbm90IGNvbXBsZXRlIGl0IHVwIHRoZSBzdGFjay4KKwkJICovCisJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJaWYgKCFpZGV2KQorCQkJLyogVGhlIGRldmljZSBoYXMgYmVlbiAvaXMgYmVpbmcgc3RvcHBlZC4gTm90ZSB0aGF0CisJCQkgKiB3ZSBpZ25vcmUgdGhlIHF1aWVzY2Ugc3RhdGUsIHNpbmNlIHdlIGFyZQorCQkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkJICovCisJCQlzdGF0dXMgPSBTQVNfREVWSUNFX1VOS05PV047CisJCWVsc2UKKwkJCXN0YXR1cyA9IFNBU19QSFlfRE9XTjsKKworCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjsKKworCQkvKiBUaGlzIHdhcyBhbiBhYm9ydGVkIHJlcXVlc3QuICovCisKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWNhc2UgdGVybWluYXRpbmc6CisKKwkJLyogVGhpcyB3YXMgYW4gdGVybWluYXRlZCByZXF1ZXN0LiAgVGhpcyBoYXBwZW5zIHdoZW4KKwkJICogdGhlIEkvTyBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2Ugb2YgYW4gYWN0aW9uIG9uCisJCSAqIHRoZSBkZXZpY2UgKHJlc2V0LCB0ZWFyIGRvd24sIGV0Yy4pLCBhbmQgdGhlIEkvTyBuZWVkcworCQkgKiB0byBiZSBjb21wbGV0ZWQgdXAgdGhlIHN0YWNrLgorCQkgKi8KKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKworCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFpZGV2KQorCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQllbHNlCisJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fYWJvcnRlZF9pb19jb21wbGV0aW9uOworCisJCS8qIFRoaXMgd2FzIGEgdGVybWluYXRlZCByZXF1ZXN0LiAqLworCisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIGRlYWQ6CisJCS8qIFRoaXMgd2FzIGEgdGVybWluYXRlZCByZXF1ZXN0IHRoYXQgdGltZWQtb3V0IGR1cmluZyB0aGUKKwkJICogdGVybWluYXRpb24gcHJvY2Vzcy4gIFRoZXJlIGlzIG5vIHRhc2sgdG8gY29tcGxldGUgdG8KKwkJICogbGlic2FzLgorCQkgKi8KKwkJY29tcGxldGVfdG9faG9zdCA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogVGhlIHJlcXVlc3QgaXMgZG9uZSBmcm9tIGFuIFNDVSBIVyBwZXJzcGVjdGl2ZS4gKi8KKwkJcmVxdWVzdC0+c3RhdHVzID0gY29tcGxldGVkOworCisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKworCQkvKiBUaGlzIGlzIGFuIGFjdGl2ZSByZXF1ZXN0IGJlaW5nIGNvbXBsZXRlZCBmcm9tIHRoZSBjb3JlLiAqLworCQlzd2l0Y2ggKGNvbXBsZXRpb25fc3RhdHVzKSB7CisKKwkJY2FzZSBTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRDoKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRCAoJXAvJXApXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXJlcXVlc3QsCisJCQkJdGFzayk7CisKKwkJCWlmIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKSB7CisJCQkJcmVzcF9idWYgPSAmcmVxdWVzdC0+c3RwLnJzcDsKKwkJCQlpc2NpX3JlcXVlc3RfcHJvY2Vzc19zdHBfcmVzcG9uc2UodGFzaywKKwkJCQkJCQkJICByZXNwX2J1Zik7CisJCQl9IGVsc2UgaWYgKFNBU19QUk9UT0NPTF9TU1AgPT0gdGFzay0+dGFza19wcm90bykgeworCisJCQkJLyogY3JhY2sgdGhlIGl1IHJlc3BvbnNlIGJ1ZmZlci4gKi8KKwkJCQlyZXNwX2l1ID0gJnJlcXVlc3QtPnNzcC5yc3A7CisJCQkJaXNjaV9yZXF1ZXN0X3Byb2Nlc3NfcmVzcG9uc2VfaXUodGFzaywgcmVzcF9pdSwKKwkJCQkJCQkJICZpaG9zdC0+cGRldi0+ZGV2KTsKKworCQkJfSBlbHNlIGlmIChTQVNfUFJPVE9DT0xfU01QID09IHRhc2stPnRhc2tfcHJvdG8pIHsKKworCQkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogU0NJX0lPX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQ6ICIKKwkJCQkJIlNBU19QUk9UT0NPTF9TTVAgcHJvdG9jb2xcbiIsCisJCQkJCV9fZnVuY19fKTsKKworCQkJfSBlbHNlCisJCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiB1bmtub3duIHByb3RvY29sXG4iLCBfX2Z1bmNfXyk7CisKKwkJCS8qIHVzZSB0aGUgdGFzayBzdGF0dXMgc2V0IGluIHRoZSB0YXNrIHN0cnVjdCBieSB0aGUKKwkJCSAqIGlzY2lfcmVxdWVzdF9wcm9jZXNzX3Jlc3BvbnNlX2l1IGNhbGwuCisJCQkgKi8KKwkJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCQlyZXNwb25zZSA9IHRhc2stPnRhc2tfc3RhdHVzLnJlc3A7CisJCQlzdGF0dXMgPSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0OworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ0lfSU9fU1VDQ0VTUzoKKwkJY2FzZSBTQ0lfSU9fU1VDQ0VTU19JT19ET05FX0VBUkxZOgorCisJCQlyZXNwb25zZSA9IFNBU19UQVNLX0NPTVBMRVRFOworCQkJc3RhdHVzICAgPSBTQU1fU1RBVF9HT09EOworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkJaWYgKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCkgeworCQkJCXZvaWQgKnJzcCA9ICZyZXF1ZXN0LT5zbXAucnNwOworCisJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBTTVAgcHJvdG9jb2wgY29tcGxldGlvblxuIiwKKwkJCQkJX19mdW5jX18pOworCisJCQkJc2dfY29weV9mcm9tX2J1ZmZlcigKKwkJCQkJJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwLCAxLAorCQkJCQlyc3AsIHNpemVvZihzdHJ1Y3Qgc21wX3Jlc3ApKTsKKwkJCX0gZWxzZSBpZiAoY29tcGxldGlvbl9zdGF0dXMKKwkJCQkgICA9PSBTQ0lfSU9fU1VDQ0VTU19JT19ET05FX0VBUkxZKSB7CisKKwkJCQkvKiBUaGlzIHdhcyBhbiBTU1AgLyBTVFAgLyBTQVRBIHRyYW5zZmVyLgorCQkJCSAqIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBsZXNzIGRhdGEgdGhhbgorCQkJCSAqIHRoZSBtYXhpbXVtIHdhcyB0cmFuc2ZlcnJlZC4KKwkJCQkgKi8KKwkJCQl1MzIgdHJhbnNmZXJyZWRfbGVuZ3RoID0gc2NpX3JlcV90eF9ieXRlcyhyZXF1ZXN0KTsKKworCQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc2lkdWFsCisJCQkJCT0gdGFzay0+dG90YWxfeGZlcl9sZW4gLSB0cmFuc2ZlcnJlZF9sZW5ndGg7CisKKwkJCQkvKiBJZiB0aGVyZSB3ZXJlIHJlc2lkdWFsIGJ5dGVzLCBjYWxsIHRoaXMgYW4KKwkJCQkgKiB1bmRlcnJ1bi4KKwkJCQkgKi8KKwkJCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzaWR1YWwgIT0gMCkKKwkJCQkJc3RhdHVzID0gU0FTX0RBVEFfVU5ERVJSVU47CisKKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSV9JT19TVUNDRVNTX0lPX0RPTkVfRUFSTFkgJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlzdGF0dXMpOworCisJCQl9IGVsc2UKKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSV9JT19TVUNDRVNTXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0lPX0ZBSUxVUkVfVEVSTUlOQVRFRDoKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lfSU9fRkFJTFVSRV9URVJNSU5BVEVEICglcC8lcClcbiIsCisJCQkJX19mdW5jX18sCisJCQkJcmVxdWVzdCwKKwkJCQl0YXNrKTsKKworCQkJLyogVGhlIHJlcXVlc3Qgd2FzIHRlcm1pbmF0ZWQgZXhwbGljaXRseS4gIE5vIGhhbmRsaW5nCisJCQkgKiBpcyBuZWVkZWQgaW4gdGhlIFNDU0kgZXJyb3IgaGFuZGxlciBwYXRoLgorCQkJICovCisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKworCQkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkJICogdGhhdCB3ZSBpZ25vcmUgdGhlIHF1aWVzY2Ugc3RhdGUsIHNpbmNlIHdlIGFyZQorCQkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkJICovCisJCQlpZiAoIWlkZXYpCisJCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCQlicmVhazsKKworCQljYXNlIFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOgorCisJCQlpc2NpX3JlcXVlc3RfaGFuZGxlX2NvbnRyb2xsZXJfc3BlY2lmaWNfZXJyb3JzKAorCQkJCWlkZXYsIHJlcXVlc3QsIHRhc2ssICZyZXNwb25zZSwgJnN0YXR1cywKKwkJCQkmY29tcGxldGVfdG9faG9zdCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0lPX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRDoKKwkJCS8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGluIHRoYXQgdGhlIEkvTyBjb21wbGV0aW9uCisJCQkgKiBpcyB0ZWxsaW5nIHVzIHRoYXQgdGhlIGRldmljZSBuZWVkcyBhIHJlc2V0LgorCQkJICogSW4gb3JkZXIgZm9yIHRoZSBkZXZpY2UgcmVzZXQgY29uZGl0aW9uIHRvIGJlCisJCQkgKiBub3RpY2VkLCB0aGUgSS9PIGhhcyB0byBiZSBoYW5kbGVkIGluIHRoZSBlcnJvcgorCQkJICogaGFuZGxlci4gIFNldCB0aGUgcmVzZXQgZmxhZyBhbmQgY2F1c2UgdGhlCisJCQkgKiBTQ1NJIGVycm9yIHRocmVhZCB0byBiZSBzY2hlZHVsZWQuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIHRhc2tfZmxhZ3MpOworCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgdGFza19mbGFncyk7CisKKwkJCS8qIEZhaWwgdGhlIEkvTy4gKi8KKwkJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCQlzdGF0dXMgPSBTQU1fU1RBVF9UQVNLX0FCT1JURUQ7CisKKwkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjsKKwkJCWNsZWFyX2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0ZBSUxVUkVfUkVUUllfUkVRVUlSRUQ6CisKKwkJCS8qIEZhaWwgdGhlIEkvTyBzbyBpdCBjYW4gYmUgcmV0cmllZC4gKi8KKwkJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCQlpZiAoIWlkZXYpCisJCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJYnJlYWs7CisKKworCQlkZWZhdWx0OgorCQkJLyogQ2F0Y2ggYW55IG90aGVyd2lzZSB1bmhhbmRsZWQgZXJyb3IgY29kZXMgaGVyZS4gKi8KKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogaW52YWxpZCBjb21wbGV0aW9uIGNvZGU6IDB4JXggLSAiCisJCQkJICJpc2NpX3JlcXVlc3QgPSAlcFxuIiwKKwkJCQkgX19mdW5jX18sIGNvbXBsZXRpb25fc3RhdHVzLCByZXF1ZXN0KTsKKworCQkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKworCQkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkJICogdGhhdCB3ZSBpZ25vcmUgdGhlIHF1aWVzY2Ugc3RhdGUsIHNpbmNlIHdlIGFyZQorCQkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkJICovCisJCQlpZiAoIWlkZXYpCisJCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCWlmIChTQVNfUFJPVE9DT0xfU01QID09IHRhc2stPnRhc2tfcHJvdG8pIHsKKwkJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb247CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnRhc2tfcHJvdG8pIHsKKwljYXNlIFNBU19QUk9UT0NPTF9TU1A6CisJCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkKKwkJCWJyZWFrOworCQlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPT0gMCkKKwkJCS8qIDAgaW5kaWNhdGVzIGEgc2luZ2xlIGRtYSBhZGRyZXNzICovCisJCQlkbWFfdW5tYXBfc2luZ2xlKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkgcmVxdWVzdC0+emVyb19zY2F0dGVyX2RhZGRyLAorCQkJCQkgdGFzay0+dG90YWxfeGZlcl9sZW4sIHRhc2stPmRhdGFfZGlyKTsKKwkJZWxzZSAgLyogdW5tYXAgdGhlIHNnbCBkbWEgYWRkcmVzc2VzICovCisJCQlkbWFfdW5tYXBfc2coJmlob3N0LT5wZGV2LT5kZXYsIHRhc2stPnNjYXR0ZXIsCisJCQkJICAgICByZXF1ZXN0LT5udW1fc2dfZW50cmllcywgdGFzay0+ZGF0YV9kaXIpOworCQlicmVhazsKKwljYXNlIFNBU19QUk9UT0NPTF9TTVA6IHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZ0YXNrLT5zbXBfdGFzay5zbXBfcmVxOworCQlzdHJ1Y3Qgc21wX3JlcSAqc21wX3JlcTsKKwkJdm9pZCAqa2FkZHI7CisKKwkJZG1hX3VubWFwX3NnKCZpaG9zdC0+cGRldi0+ZGV2LCBzZywgMSwgRE1BX1RPX0RFVklDRSk7CisKKwkJLyogbmVlZCB0byBzd2FiIGl0IGJhY2sgaW4gY2FzZSB0aGUgY29tbWFuZCBidWZmZXIgaXMgcmUtdXNlZCAqLworCQlrYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9JUlEwKTsKKwkJc21wX3JlcSA9IGthZGRyICsgc2ctPm9mZnNldDsKKwkJc2NpX3N3YWIzMl9jcHkoc21wX3JlcSwgc21wX3JlcSwgc2ctPmxlbmd0aCAvIHNpemVvZih1MzIpKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fSVJRMCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBQdXQgdGhlIGNvbXBsZXRlZCByZXF1ZXN0IG9uIHRoZSBjb3JyZWN0IGxpc3QgKi8KKwlpc2NpX3Rhc2tfc2F2ZV9mb3JfdXBwZXJfbGF5ZXJfY29tcGxldGlvbihpaG9zdCwgcmVxdWVzdCwgcmVzcG9uc2UsCisJCQkJCQkgIHN0YXR1cywgY29tcGxldGVfdG9faG9zdAorCQkJCQkJICApOworCisJLyogY29tcGxldGUgdGhlIGlvIHJlcXVlc3QgdG8gdGhlIGNvcmUuICovCisJc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oaWhvc3QsIHJlcXVlc3QtPnRhcmdldF9kZXZpY2UsIHJlcXVlc3QpOworCWlzY2lfcHV0X2RldmljZShpZGV2KTsKKworCS8qIHNldCB0ZXJtaW5hdGVkIGhhbmRsZSBzbyBpdCBjYW5ub3QgYmUgY29tcGxldGVkIG9yCisJICogdGVybWluYXRlZCBhZ2FpbiwgYW5kIHRvIGNhdXNlIGFueSBjYWxscyBpbnRvIGFib3J0CisJICogdGFzayB0byByZWNvZ25pemUgdGhlIGFscmVhZHkgY29tcGxldGVkIGNhc2UuCisJICovCisJc2V0X2JpdChJUkVRX1RFUk1JTkFURUQsICZyZXF1ZXN0LT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZXF1ZXN0X3N0YXJ0ZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZS0+ZG9tYWluX2RldjsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7CisKKwkvKiBYWFggYXMgaGNoIHNhaWQgYWx3YXlzIGNyZWF0aW5nIGFuIGludGVybmFsIHNhc190YXNrIGZvciB0bWYKKwkgKiByZXF1ZXN0cyB3b3VsZCBzaW1wbGlmeSB0aGUgZHJpdmVyCisJICovCisJdGFzayA9IGlyZXEtPnR0eXBlID09IGlvX3Rhc2sgPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSkgOiBOVUxMOworCisJLyogYWxsIHVuYWNjZWxlcmF0ZWQgcmVxdWVzdCB0eXBlcyAobm9uIHNzcCBvciBuY3EpIGhhbmRsZWQgd2l0aAorCSAqIHN1YnN0YXRlcworCSAqLworCWlmICghdGFzayAmJiBkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVApOworCX0gZWxzZSBpZiAoIXRhc2sgJiYKKwkJICAgKGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCB8fAorCQkgICAgaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSktPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9sb3cpKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfQVNTRVJURUQpOworCX0gZWxzZSBpZiAodGFzayAmJiB0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1JFUV9TTVBfV0FJVF9SRVNQKTsKKwl9IGVsc2UgaWYgKHRhc2sgJiYgc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSAmJgorCQkgICAhdGFzay0+YXRhX3Rhc2sudXNlX25jcSkgeworCQl1MzIgc3RhdGU7CisKKwkJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKQorCQkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0gyRDsKKwkJZWxzZSBpZiAodGFzay0+YXRhX3Rhc2suZG1hX3hmZXIpCisJCQlzdGF0ZSA9IFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOworCQllbHNlIC8qIFBJTyAqLworCQkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9IMkQ7CisKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgc3RhdGUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3JlcXVlc3RfY29tcGxldGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qIFRlbGwgdGhlIFNDSV9VU0VSIHRoYXQgdGhlIElPIHJlcXVlc3QgaXMgY29tcGxldGUgKi8KKwlpZiAoIXRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKQorCQlpc2NpX3JlcXVlc3RfaW9fcmVxdWVzdF9jb21wbGV0ZShpaG9zdCwgaXJlcSwKKwkJCQkJCSBpcmVxLT5zY2lfc3RhdHVzKTsKKwllbHNlCisJCWlzY2lfdGFza19yZXF1ZXN0X2NvbXBsZXRlKGlob3N0LCBpcmVxLCBpcmVxLT5zY2lfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlcXVlc3RfYWJvcnRpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKworCS8qIFNldHRpbmcgdGhlIGFib3J0IGJpdCBpbiB0aGUgVGFzayBDb250ZXh0IGlzIHJlcXVpcmVkIGJ5IHRoZSBzaWxpY29uLiAqLworCWlyZXEtPnRjLT5hYm9ydCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX25vbl9kYXRhX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisKKwlpcmVxLT50YXJnZXRfZGV2aWNlLT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9waW9fYXdhaXRfaDJkX2NvbXBsZXRpb25fZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKworCWlyZXEtPnRhcmdldF9kZXZpY2UtPndvcmtpbmdfcmVxdWVzdCA9IGlyZXE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX2NvbXBsZXRpb25fZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKworCWlyZXEtPnRhcmdldF9kZXZpY2UtPndvcmtpbmdfcmVxdWVzdCA9IGlyZXE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX3NvZnRfcmVzZXRfYXdhaXRfaDJkX2RpYWdub3N0aWNfY29tcGxldGlvbl9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcmVxKSwgc20pOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YyA9IGlyZXEtPnRjOworCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmgyZF9maXM7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCS8qIENsZWFyIHRoZSBTUlNUIGJpdCAqLworCWgyZF9maXMgPSAmaXJlcS0+c3RwLmNtZDsKKwloMmRfZmlzLT5jb250cm9sID0gMDsKKworCS8qIENsZWFyIHRoZSBUQyBjb250cm9sIGJpdCAqLworCXRjLT5jb250cm9sX2ZyYW1lID0gMDsKKworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2NvbnRpbnVlX2lvKGlyZXEpOworCVdBUk5fT05DRShzdGF0dXMgIT0gU0NJX1NVQ0NFU1MsICJpc2NpOiBjb250aW51ZSBpbyBmYWlsdXJlXG4iKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcmVxdWVzdF9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfUkVRX0lOSVRdID0geyB9LAorCVtTQ0lfUkVRX0NPTlNUUlVDVEVEXSA9IHsgfSwKKwlbU0NJX1JFUV9TVEFSVEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlcXVlc3Rfc3RhcnRlZF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0gyRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX25vbl9kYXRhX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyLAorCX0sCisJW1NDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfRDJIXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZXF1ZXN0X3N0YXJ0ZWRfcGlvX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyLAorCX0sCisJW1NDSV9SRVFfU1RQX1BJT19XQUlUX0ZSQU1FXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfUElPX0RBVEFfSU5dID0geyB9LAorCVtTQ0lfUkVRX1NUUF9QSU9fREFUQV9PVVRdID0geyB9LAorCVtTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUF0gPSB7IH0sCisJW1NDSV9SRVFfU1RQX1VETUFfV0FJVF9EMkhdID0geyB9LAorCVtTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZXF1ZXN0X3N0YXJ0ZWRfc29mdF9yZXNldF9hd2FpdF9oMmRfYXNzZXJ0ZWRfY29tcGxldGlvbl9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9kaWFnbm9zdGljX2NvbXBsZXRpb25fZW50ZXIsCisJfSwKKwlbU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0QySF0gPSB7IH0sCisJW1NDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVBdID0geyB9LAorCVtTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQXSA9IHsgfSwKKwlbU0NJX1JFUV9TTVBfV0FJVF9SRVNQXSA9IHsgfSwKKwlbU0NJX1JFUV9TTVBfV0FJVF9UQ19DT01QXSA9IHsgfSwKKwlbU0NJX1JFUV9DT01QTEVURURdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVxdWVzdF9jb21wbGV0ZWRfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JFUV9BQk9SVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZXF1ZXN0X2Fib3J0aW5nX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9SRVFfRklOQUxdID0geyB9LAorfTsKKworc3RhdGljIHZvaWQKK3NjaV9nZW5lcmFsX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzY2lfaW5pdF9zbSgmaXJlcS0+c20sIHNjaV9yZXF1ZXN0X3N0YXRlX3RhYmxlLCBTQ0lfUkVRX0lOSVQpOworCisJaXJlcS0+dGFyZ2V0X2RldmljZSA9IGlkZXY7CisJaXJlcS0+cHJvdG9jb2wgPSBTQ0lDX05PX1BST1RPQ09MOworCWlyZXEtPnNhdmVkX3J4X2ZyYW1lX2luZGV4ID0gU0NVX0lOVkFMSURfRlJBTUVfSU5ERVg7CisKKwlpcmVxLT5zY2lfc3RhdHVzICAgPSBTQ0lfU1VDQ0VTUzsKKwlpcmVxLT5zY3Vfc3RhdHVzICAgPSAwOworCWlyZXEtPnBvc3RfY29udGV4dCA9IDB4RkZGRkZGRkY7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwkvKiBCdWlsZCB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIHJlcXVlc3QgKi8KKwlzY2lfZ2VuZXJhbF9yZXF1ZXN0X2NvbnN0cnVjdChpaG9zdCwgaWRldiwgaXJlcSk7CisKKwlpZiAoaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4ID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUkVNT1RFX0RFVklDRTsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKQorCQkvKiBwYXNzICovOworCWVsc2UgaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpCisJCW1lbXNldCgmaXJlcS0+c3RwLmNtZCwgMCwgc2l6ZW9mKGlyZXEtPnN0cC5jbWQpKTsKKwllbHNlIGlmIChkZXZfaXNfZXhwYW5kZXIoZGV2KSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKworCW1lbXNldChpcmVxLT50YywgMCwgb2Zmc2V0b2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQsIHNnbF9wYWlyX2FiKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICAgdTE2IGlvX3RhZywgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwkvKiBCdWlsZCB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIHJlcXVlc3QgKi8KKwlzY2lfZ2VuZXJhbF9yZXF1ZXN0X2NvbnN0cnVjdChpaG9zdCwgaWRldiwgaXJlcSk7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFViB8fAorCSAgICBkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCXNldF9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncyk7CisJCW1lbXNldChpcmVxLT50YywgMCwgc2l6ZW9mKHN0cnVjdCBzY3VfdGFza19jb250ZXh0KSk7CisJfSBlbHNlCisJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBpc2NpX3JlcXVlc3Rfc3NwX3JlcXVlc3RfY29uc3RydWN0KAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWRldl9kYmcoJnJlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHJlcXVlc3QgPSAlcFxuIiwKKwkJX19mdW5jX18sCisJCXJlcXVlc3QpOworCXN0YXR1cyA9IHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9iYXNpY19zc3AocmVxdWVzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBpc2NpX3JlcXVlc3Rfc3RwX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmZpcyA9ICZpcmVxLT5zdHAuY21kOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSB0YXNrLT51bGRkX3Rhc2s7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWRldl9kYmcoJmlyZXEtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlyZXEgPSAlcFxuIiwKKwkJX19mdW5jX18sCisJCWlyZXEpOworCisJbWVtY3B5KGZpcywgJnRhc2stPmF0YV90YXNrLmZpcywgc2l6ZW9mKHN0cnVjdCBob3N0X3RvX2Rldl9maXMpKTsKKwlpZiAoIXRhc2stPmF0YV90YXNrLmRldmljZV9jb250cm9sX3JlZ191cGRhdGUpCisJCWZpcy0+ZmxhZ3MgfD0gMHg4MDsKKwlmaXMtPmZsYWdzICY9IDB4RjA7CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfYmFzaWNfc2F0YShpcmVxKTsKKworCWlmIChxYyAmJiAocWMtPnRmLmNvbW1hbmQgPT0gQVRBX0NNRF9GUERNQV9XUklURSB8fAorCQkgICBxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX0ZQRE1BX1JFQUQpKSB7CisJCWZpcy0+c2VjdG9yX2NvdW50ID0gcWMtPnRhZyA8PCAzOworCQlpcmVxLT50Yy0+dHlwZS5zdHAubmNxX3RhZyA9IHFjLT50YWc7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X3NtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJICAgICAgc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmdGFzay0+c21wX3Rhc2suc21wX3JlcTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQ7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQ7CisJc3RydWN0IHNtcF9yZXEgKnNtcF9yZXE7CisJdm9pZCAqa2FkZHI7CisJdTggcmVxX2xlbjsKKwl1MzIgY21kOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSwgS01fSVJRMCk7CisJc21wX3JlcSA9IGthZGRyICsgc2ctPm9mZnNldDsKKwkvKgorCSAqIExvb2sgYXQgdGhlIFNNUCByZXF1ZXN0cycgaGVhZGVyIGZpZWxkczsgZm9yIGNlcnRhaW4gU0FTIDEueCBTTVAKKwkgKiBmdW5jdGlvbnMgdW5kZXIgU0FTIDIuMCwgYSB6ZXJvIHJlcXVlc3QgbGVuZ3RoIHJlYWxseSBpbmRpY2F0ZXMKKwkgKiBhIG5vbi16ZXJvIGRlZmF1bHQgbGVuZ3RoLgorCSAqLworCWlmIChzbXBfcmVxLT5yZXFfbGVuID09IDApIHsKKwkJc3dpdGNoIChzbXBfcmVxLT5mdW5jKSB7CisJCWNhc2UgU01QX0RJU0NPVkVSOgorCQljYXNlIFNNUF9SRVBPUlRfUEhZX0VSUl9MT0c6CisJCWNhc2UgU01QX1JFUE9SVF9QSFlfU0FUQToKKwkJY2FzZSBTTVBfUkVQT1JUX1JPVVRFX0lORk86CisJCQlzbXBfcmVxLT5yZXFfbGVuID0gMjsKKwkJCWJyZWFrOworCQljYXNlIFNNUF9DT05GX1JPVVRFX0lORk86CisJCWNhc2UgU01QX1BIWV9DT05UUk9MOgorCQljYXNlIFNNUF9QSFlfVEVTVF9GVU5DVElPTjoKKwkJCXNtcF9yZXEtPnJlcV9sZW4gPSA5OworCQkJYnJlYWs7CisJCQkvKiBEZWZhdWx0IC0gemVybyBpcyBhIHZhbGlkIGRlZmF1bHQgZm9yIDIuMC4gKi8KKwkJfQorCX0KKwlyZXFfbGVuID0gc21wX3JlcS0+cmVxX2xlbjsKKwlzY2lfc3dhYjMyX2NweShzbXBfcmVxLCBzbXBfcmVxLCBzZy0+bGVuZ3RoIC8gc2l6ZW9mKHUzMikpOworCWNtZCA9ICoodTMyICopIHNtcF9yZXE7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fSVJRMCk7CisKKwlpZiAoIWRtYV9tYXBfc2coZGV2LCBzZywgMSwgRE1BX1RPX0RFVklDRSkpCisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKworCWlyZXEtPnByb3RvY29sID0gU0NJQ19TTVBfUFJPVE9DT0w7CisKKwkvKiBieXRlIHN3YXAgdGhlIHNtcCByZXF1ZXN0LiAqLworCisJdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisKKwlpZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZTsKKwlpcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBUQyB3aXRoIHRoZSBpdHMgcmVxdWlyZWQgZGF0YQorCSAqIDAwaAorCSAqLworCXRhc2tfY29udGV4dC0+cHJpb3JpdHkgPSAwOworCXRhc2tfY29udGV4dC0+aW5pdGlhdG9yX3JlcXVlc3QgPSAxOworCXRhc2tfY29udGV4dC0+Y29ubmVjdGlvbl9yYXRlID0gaWRldi0+Y29ubmVjdGlvbl9yYXRlOworCXRhc2tfY29udGV4dC0+cHJvdG9jb2xfZW5naW5lX2luZGV4ID0gSVNDSV9QRUc7CisJdGFza19jb250ZXh0LT5sb2dpY2FsX3BvcnRfaW5kZXggPSBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NNUDsKKwl0YXNrX2NvbnRleHQtPmFib3J0ID0gMDsKKwl0YXNrX2NvbnRleHQtPnZhbGlkID0gU0NVX1RBU0tfQ09OVEVYVF9WQUxJRDsKKwl0YXNrX2NvbnRleHQtPmNvbnRleHRfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfVFlQRTsKKworCS8qIDA0aCAqLworCXRhc2tfY29udGV4dC0+cmVtb3RlX25vZGVfaW5kZXggPSBpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXg7CisJdGFza19jb250ZXh0LT5jb21tYW5kX2NvZGUgPSAwOworCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gU0NVX1RBU0tfVFlQRV9TTVBfUkVRVUVTVDsKKworCS8qIDA4aCAqLworCXRhc2tfY29udGV4dC0+bGlua19sYXllcl9jb250cm9sID0gMDsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+c3RyaWN0X29yZGVyaW5nID0gMDsKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgPSAxOworCXRhc2tfY29udGV4dC0+dGltZW91dF9lbmFibGUgPSAwOworCXRhc2tfY29udGV4dC0+YmxvY2tfZ3VhcmRfZW5hYmxlID0gMDsKKworCS8qIDBjaCAqLworCXRhc2tfY29udGV4dC0+YWRkcmVzc19tb2RpZmllciA9IDA7CisKKwkvKiAxMGggKi8KKwl0YXNrX2NvbnRleHQtPnNzcF9jb21tYW5kX2l1X2xlbmd0aCA9IHJlcV9sZW47CisKKwkvKiAxNGggKi8KKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IDA7CisKKwkvKgorCSAqIDE4aCB+IDMwaCwgcHJvdG9jb2wgc3BlY2lmaWMKKwkgKiBzaW5jZSBjb21tYW5kSVUgaGFzIGJlZW4gYnVpbGQgYnkgZnJhbWV3b3JrIGF0IHRoaXMgcG9pbnQsIHdlIGp1c3QKKwkgKiBjb3B5IHRoZSBmcmlzdCBEV29yZCBmcm9tIGNvbW1hbmQgSVUgdG8gdGhpcyBsb2NhdGlvbi4gKi8KKwltZW1jcHkoJnRhc2tfY29udGV4dC0+dHlwZS5zbXAsICZjbWQsIHNpemVvZih1MzIpKTsKKworCS8qCisJICogNDBoCisJICogIkZvciBTTVAgeW91IGNvdWxkIHByb2dyYW0gaXQgdG8gemVyby4gV2Ugd291bGQgcHJlZmVyIHRoYXQgd2F5CisJICogc28gdGhhdCBkb25lIGNvZGUgd2lsbCBiZSBjb25zaXN0ZW50LiIgLSBWZW5raQorCSAqLworCXRhc2tfY29udGV4dC0+dGFza19waGFzZSA9IDA7CisKKwlpcmVxLT5wb3N0X2NvbnRleHQgPSAoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQyB8CisJCQkgICAgICAoSVNDSV9QRUcgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQpIHwKKwkJCSAgICAgICAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwKKwkJCQlTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkJICAgICAgSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZykpOworCS8qCisJICogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyIHRvIHRoZSBTQ1UgVGFzaworCSAqIENvbnRleHQgY29tbWFuZCBidWZmZXIgc2hvdWxkIG5vdCBjb250YWluIGNvbW1hbmQgaGVhZGVyLgorCSAqLworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9pdV91cHBlciA9IHVwcGVyXzMyX2JpdHMoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBsb3dlcl8zMl9iaXRzKHNnX2RtYV9hZGRyZXNzKHNnKSArIHNpemVvZih1MzIpKTsKKworCS8qIFNNUCByZXNwb25zZSBjb21lcyBhcyBVRiwgc28gbm8gbmVlZCB0byBzZXQgcmVzcG9uc2UgSVUgYWRkcmVzcy4gKi8KKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X3VwcGVyID0gMDsKKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X2xvd2VyID0gMDsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTlNUUlVDVEVEKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoKKyAqIGlzY2lfc21wX3JlcXVlc3RfYnVpbGQoKSAtIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBzbXAgcmVxdWVzdC4KKyAqIEBpcmVxOiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIGlzY2lfcmVxdWVzdCBhbGxvY2F0ZWQgaW4gdGhlCisgKiAgICByZXF1ZXN0IGNvbnN0cnVjdCBmdW5jdGlvbi4KKyAqCisgKiBTQ0lfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsbCBjb21wbGV0aW9uLCBvciBzcGVjaWZpYyBmYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9zbXBfcmVxdWVzdF9idWlsZChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXJlcS0+aXNjaV9ob3N0LT5wZGV2LT5kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9GQUlMVVJFOworCisJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X3NtcChkZXYsIGlyZXEsIHRhc2spOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWRldl9kYmcoJmlyZXEtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogZmFpbGVkIHdpdGggc3RhdHVzID0gJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaXNjaV9pb19yZXF1ZXN0X2J1aWxkKCkgLSBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgaW8gcmVxdWVzdCBvYmplY3QuCisgKiBAaWhvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgaXNjaV9yZXF1ZXN0IG9iamVjdCBhbGxvY2F0ZWQgaW4gdGhlCisgKiAgICByZXF1ZXN0IGNvbnN0cnVjdCBmdW5jdGlvbi4KKyAqIEBzY2lfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgaGFuZGxlIGZvciB0aGUgc2NpIGNvcmUncyByZW1vdGUgZGV2aWNlCisgKiAgICBvYmplY3QgdGhhdCBpcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAqCisgKiBTQ0lfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsbCBjb21wbGV0aW9uLCBvciBzcGVjaWZpYyBmYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9pb19yZXF1ZXN0X2J1aWxkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpZGV2ID0gMHglcDsgcmVxdWVzdCA9ICVwLCAiCisJCSJudW1fc2NhdHRlciA9ICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJaWRldiwKKwkJcmVxdWVzdCwKKwkJdGFzay0+bnVtX3NjYXR0ZXIpOworCisJLyogbWFwIHRoZSBzZ2wgYWRkcmVzc2VzLCBpZiBwcmVzZW50LgorCSAqIGxpYmF0YSBkb2VzIHRoZSBtYXBwaW5nIGZvciBzYXRhIGRldmljZXMKKwkgKiBiZWZvcmUgd2UgZ2V0IHRoZSByZXF1ZXN0LgorCSAqLworCWlmICh0YXNrLT5udW1fc2NhdHRlciAmJgorCSAgICAhc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSAmJgorCSAgICAhKFNBU19QUk9UT0NPTF9TTVAgJiB0YXNrLT50YXNrX3Byb3RvKSkgeworCisJCXJlcXVlc3QtPm51bV9zZ19lbnRyaWVzID0gZG1hX21hcF9zZygKKwkJCSZpaG9zdC0+cGRldi0+ZGV2LAorCQkJdGFzay0+c2NhdHRlciwKKwkJCXRhc2stPm51bV9zY2F0dGVyLAorCQkJdGFzay0+ZGF0YV9kaXIKKwkJCSk7CisKKwkJaWYgKHJlcXVlc3QtPm51bV9zZ19lbnRyaWVzID09IDApCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKKwl9CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3QoaWhvc3QsIGlkZXYsIHJlcXVlc3QpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogZmFpbGVkIHJlcXVlc3QgY29uc3RydWN0XG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCXN3aXRjaCAodGFzay0+dGFza19wcm90bykgeworCWNhc2UgU0FTX1BST1RPQ09MX1NNUDoKKwkJc3RhdHVzID0gaXNjaV9zbXBfcmVxdWVzdF9idWlsZChyZXF1ZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBTQVNfUFJPVE9DT0xfU1NQOgorCQlzdGF0dXMgPSBpc2NpX3JlcXVlc3Rfc3NwX3JlcXVlc3RfY29uc3RydWN0KHJlcXVlc3QpOworCQlicmVhazsKKwljYXNlIFNBU19QUk9UT0NPTF9TQVRBOgorCWNhc2UgU0FTX1BST1RPQ09MX1NUUDoKKwljYXNlIFNBU19QUk9UT0NPTF9TQVRBIHwgU0FTX1BST1RPQ09MX1NUUDoKKwkJc3RhdHVzID0gaXNjaV9yZXF1ZXN0X3N0cF9yZXF1ZXN0X2NvbnN0cnVjdChyZXF1ZXN0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHVua25vd24gcHJvdG9jb2xcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IHRhZykKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IGlob3N0LT5yZXFzW0lTQ0lfVEFHX1RDSSh0YWcpXTsKKwlpcmVxLT5pb190YWcgPSB0YWc7CisJaXJlcS0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKwlpcmVxLT5mbGFncyA9IDA7CisJaXJlcS0+bnVtX3NnX2VudHJpZXMgPSAwOworCUlOSVRfTElTVF9IRUFEKCZpcmVxLT5jb21wbGV0ZWRfbm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmlyZXEtPmRldl9ub2RlKTsKKwlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIGFsbG9jYXRlZCk7CisKKwlyZXR1cm4gaXJlcTsKK30KKworc3RhdGljIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfaW9fcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSAgICAgc3RydWN0IHNhc190YXNrICp0YXNrLAorCQkJCQkJICAgICB1MTYgdGFnKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisKKwlpcmVxID0gaXNjaV9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCB0YWcpOworCWlyZXEtPnR0eXBlX3B0ci5pb190YXNrX3B0ciA9IHRhc2s7CisJaXJlcS0+dHR5cGUgPSBpb190YXNrOworCXRhc2stPmxsZGRfdGFzayA9IGlyZXE7CisKKwlyZXR1cm4gaXJlcTsKK30KKworc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV90bWZfcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWYsCisJCQkJCSAgICAgICB1MTYgdGFnKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisKKwlpcmVxID0gaXNjaV9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCB0YWcpOworCWlyZXEtPnR0eXBlX3B0ci50bWZfdGFza19wdHIgPSBpc2NpX3RtZjsKKwlpcmVxLT50dHlwZSA9IHRtZl90YXNrOworCisJcmV0dXJuIGlyZXE7Cit9CisKK2ludCBpc2NpX3JlcXVlc3RfZXhlY3V0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCSBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHUxNiB0YWcpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MOworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGRvIGNvbW1vbiBhbGxvY2F0aW9uIGFuZCBpbml0IG9mIHJlcXVlc3Qgb2JqZWN0LiAqLworCWlyZXEgPSBpc2NpX2lvX3JlcXVlc3RfZnJvbV90YWcoaWhvc3QsIHRhc2ssIHRhZyk7CisKKwlzdGF0dXMgPSBpc2NpX2lvX3JlcXVlc3RfYnVpbGQoaWhvc3QsIGlyZXEsIGlkZXYpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHJlcXVlc3RfY29uc3RydWN0IGZhaWxlZCAtIHN0YXR1cyA9IDB4JXhcbiIsCisJCQkgX19mdW5jX18sCisJCQkgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KElERVZfSU9fTkNRRVJST1IsICZpZGV2LT5mbGFncykpIHsKKworCQlpZiAoaXNjaV90YXNrX2lzX25jcV9yZWNvdmVyeSh0YXNrKSkgeworCisJCQkvKiBUaGUgZGV2aWNlIGlzIGluIGFuIE5DUSByZWNvdmVyeSBzdGF0ZS4gIElzc3VlIHRoZQorCQkJICogcmVxdWVzdCBvbiB0aGUgdGFzayBzaWRlLiAgTm90ZSB0aGF0IGl0IHdpbGwKKwkJCSAqIGNvbXBsZXRlIG9uIHRoZSBJL08gcmVxdWVzdCBzaWRlIGJlY2F1c2UgdGhlCisJCQkgKiByZXF1ZXN0IHdhcyBidWlsdCB0aGF0IHdheSAoaWUuCisJCQkgKiBpcmVxLT5pc190YXNrX21hbmFnZW1lbnRfcmVxdWVzdCBpcyBmYWxzZSkuCisJCQkgKi8KKwkJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3N0YXJ0X3Rhc2soaWhvc3QsCisJCQkJCQkJICAgIGlkZXYsCisJCQkJCQkJICAgIGlyZXEpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzZW5kIHRoZSByZXF1ZXN0LCBsZXQgdGhlIGNvcmUgYXNzaWduIHRoZSBJTyBUQUcuCSovCisJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3N0YXJ0X2lvKGlob3N0LCBpZGV2LAorCQkJCQkJICBpcmVxKTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTICYmCisJICAgIHN0YXR1cyAhPSBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBmYWlsZWQgcmVxdWVzdCBzdGFydCAoMHgleClcbiIsCisJCQkgX19mdW5jX18sIHN0YXR1cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBFaXRoZXIgSS9PIHN0YXJ0ZWQgT0ssIG9yIHRoZSBjb3JlIGhhcyBzaWduYWxlZCB0aGF0CisJICogdGhlIGRldmljZSBuZWVkcyBhIHRhcmdldCByZXNldC4KKwkgKgorCSAqIEluIGVpdGhlciBjYXNlLCBob2xkIG9udG8gdGhlIEkvTyBmb3IgbGF0ZXIuCisJICoKKwkgKiBVcGRhdGUgaXQncyBzdGF0dXMgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBpbiB0aGUKKwkgKiByZW1vdGUgZGV2aWNlIG9iamVjdC4KKwkgKi8KKwlsaXN0X2FkZCgmaXJlcS0+ZGV2X25vZGUsICZpZGV2LT5yZXFzX2luX3Byb2Nlc3MpOworCisJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgeworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIHN0YXJ0ZWQpOworCX0gZWxzZSB7CisJCS8qIFRoZSByZXF1ZXN0IGRpZCBub3QgcmVhbGx5IHN0YXJ0IGluIHRoZQorCQkgKiBoYXJkd2FyZSwgc28gY2xlYXIgdGhlIHJlcXVlc3QgaGFuZGxlCisJCSAqIGhlcmUgc28gbm8gdGVybWluYXRpb25zIHdpbGwgYmUgZG9uZS4KKwkJICovCisJCXNldF9iaXQoSVJFUV9URVJNSU5BVEVELCAmaXJlcS0+ZmxhZ3MpOworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIGNvbXBsZXRlZCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmIChzdGF0dXMgPT0KKwkgICAgU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCkgeworCQkvKiBTaWduYWwgbGlic2FzIHRoYXQgd2UgbmVlZCB0aGUgU0NTSSBlcnJvcgorCQkgKiBoYW5kbGVyIHRocmVhZCB0byB3b3JrIG9uIHRoaXMgSS9PIGFuZCB0aGF0CisJCSAqIHdlIHdhbnQgYSBkZXZpY2UgcmVzZXQuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJCS8qIENhdXNlIHRoaXMgdGFzayB0byBiZSBzY2hlZHVsZWQgaW4gdGhlIFNDU0kgZXJyb3IKKwkJICogaGFuZGxlciB0aHJlYWQuCisJCSAqLworCQlpc2NpX2V4ZWNwYXRoX2NhbGxiYWNrKGlob3N0LCB0YXNrLAorCQkJCSAgICAgICBzYXNfdGFza19hYm9ydCk7CisKKwkJLyogQ2hhbmdlIHRoZSBzdGF0dXMsIHNpbmNlIHdlIGFyZSBob2xkaW5nCisJCSAqIHRoZSBJL08gdW50aWwgaXQgaXMgbWFuYWdlZCBieSB0aGUgU0NTSQorCQkgKiBlcnJvciBoYW5kbGVyLgorCQkgKi8KKwkJc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFkNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9JU0NJX1JFUVVFU1RfSF8KKyNkZWZpbmUgX0lTQ0lfUkVRVUVTVF9IXworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJzY3VfdGFza19jb250ZXh0LmgiCisKKy8qKgorICogc3RydWN0IGlzY2lfcmVxdWVzdF9zdGF0dXMgLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgc3RhdGVzIG9mIGFuIEkvTworICogICAgcmVxdWVzdC4KKyAqCisgKgorICovCitlbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgeworCXVuYWxsb2NhdGVkID0gMHgwMCwKKwlhbGxvY2F0ZWQgICA9IDB4MDEsCisJc3RhcnRlZCAgICAgPSAweDAyLAorCWNvbXBsZXRlZCAgID0gMHgwMywKKwlhYm9ydGluZyAgICA9IDB4MDQsCisJYWJvcnRlZCAgICAgPSAweDA1LAorCXRlcm1pbmF0aW5nID0gMHgwNiwKKwlkZWFkICAgICAgICA9IDB4MDcKK307CisKK2VudW0gdGFza190eXBlIHsKKwlpb190YXNrICA9IDAsCisJdG1mX3Rhc2sgPSAxCit9OworCitlbnVtIHNjaV9yZXF1ZXN0X3Byb3RvY29sIHsKKwlTQ0lDX05PX1BST1RPQ09MLAorCVNDSUNfU01QX1BST1RPQ09MLAorCVNDSUNfU1NQX1BST1RPQ09MLAorCVNDSUNfU1RQX1BST1RPQ09MCit9OyAvKiBYWFggcmVtb3ZlIG1lLCB1c2Ugc2FzX3Rhc2sue2Rldnx0YXNrX3Byb3RvfSBpbnN0ZWFkICovOworCisvKioKKyAqIGlzY2lfc3RwX3JlcXVlc3QgLSBleHRyYSByZXF1ZXN0IGluZnJhc3RydWN0dXJlIHRvIGhhbmRsZSBwaW8vYXRhcGkgcHJvdG9jb2wKKyAqIEBwaW9fbGVuIC0gbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCBhdCBQSU8gc2V0dXAKKyAqIEBzdGF0dXMgLSBwaW8gc2V0dXAgZW5kaW5nIHN0YXR1cyB2YWx1ZSB0byB0ZWxsIHVzIGlmIHdlIG5lZWQKKyAqCSAgICAgdG8gd2FpdCBmb3IgYW5vdGhlciBmaXMgb3IgaWYgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiAgVXBvbgorICogICAgICAgICAgIHJlY2VpcHQgb2YgYSBkMmggZmlzIHRoaXMgd2lsbCBiZSB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoYXQgZmlzLgorICogQHNnbCAtIHRyYWNrIHBpbyB0cmFuc2ZlciBwcm9ncmVzcyBhcyB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIHNnbAorICogQGRldmljZV9jZGJfbGVuIC0gYXRhcGkgZGV2aWNlIGFkdmVydGlzZXMgaXQncyB0cmFuc2ZlciBjb25zdHJhaW50cyBhdCBzZXR1cAorICovCitzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCB7CisJdTMyIHBpb19sZW47CisJdTggc3RhdHVzOworCisJc3RydWN0IGlzY2lfc3RwX3Bpb19zZ2wgeworCQlpbnQgaW5kZXg7CisJCXU4IHNldDsKKwkJdTMyIG9mZnNldDsKKwl9IHNnbDsKKwl1MzIgZGV2aWNlX2NkYl9sZW47Cit9OworCitzdHJ1Y3QgaXNjaV9yZXF1ZXN0IHsKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgc3RhdHVzOworCSNkZWZpbmUgSVJFUV9DT01QTEVURV9JTl9UQVJHRVQgMAorCSNkZWZpbmUgSVJFUV9URVJNSU5BVEVEIDEKKwkjZGVmaW5lIElSRVFfVE1GIDIKKwkjZGVmaW5lIElSRVFfQUNUSVZFIDMKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIFhYWCBraWxsIHR0eXBlIGFuZCB0dHlwZV9wdHIsIGFsbG9jYXRlIGZ1bGwgc2FzX3Rhc2sgKi8KKwllbnVtIHRhc2tfdHlwZSB0dHlwZTsKKwl1bmlvbiB0dHlwZV9wdHJfdW5pb24geworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKmlvX3Rhc2tfcHRyOyAgIC8qIFdoZW4gdHR5cGU9PWlvX3Rhc2sgICovCisJCXN0cnVjdCBpc2NpX3RtZiAqdG1mX3Rhc2tfcHRyOyAgLyogV2hlbiB0dHlwZT09dG1mX3Rhc2sgKi8KKwl9IHR0eXBlX3B0cjsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3Q7CisJLyogRm9yIHVzZSBpbiB0aGUgcmVxdWVzdHNfdG9fe2NvbXBsZXRlfGFib3J0fSBsaXN0czogKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbXBsZXRlZF9ub2RlOworCS8qIEZvciB1c2UgaW4gdGhlIHJlcXNfaW5fcHJvY2VzcyBsaXN0OiAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X25vZGU7CisJc3BpbmxvY2tfdCBzdGF0ZV9sb2NrOworCWRtYV9hZGRyX3QgcmVxdWVzdF9kYWRkcjsKKwlkbWFfYWRkcl90IHplcm9fc2NhdHRlcl9kYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtX3NnX2VudHJpZXM7CisJLyogTm90ZTogImlvX3JlcXVlc3RfY29tcGxldGlvbiIgaXMgY29tcGxldGVkIGluIHR3byBkaWZmZXJlbnQgd2F5cworCSAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgaXMgYSBUTUYgb3IgcmVndWxhciByZXF1ZXN0LgorCSAqIC0gVE1GIHJlcXVlc3RzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIHRocmVhZCB0aGF0IHN0YXJ0ZWQgdGhlbTsKKwkgKiAtIHJlZ3VsYXIgcmVxdWVzdHMgYXJlIGNvbXBsZXRlZCBpbiB0aGUgcmVxdWVzdCBjb21wbGV0aW9uIGNhbGxiYWNrCisJICogICBmdW5jdGlvbi4KKwkgKiBUaGlzIGRpZmZlcmVuY2UgaW4gb3BlcmF0aW9uIGFsbG93cyB0aGUgYWJvcnRlciBvZiBhIFRNRiByZXF1ZXN0CisJICogdG8gYmUgc3VyZSB0aGF0IG9uY2UgdGhlIFRNRiByZXF1ZXN0IGNvbXBsZXRlcywgdGhlIEkvTyB0aGF0IHRoZQorCSAqIFRNRiB3YXMgYWJvcnRpbmcgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBsZXRlZC4KKwkgKgorCSAqIFhYWCBraWxsIGlvX3JlcXVlc3RfY29tcGxldGlvbgorCSAqLworCXN0cnVjdCBjb21wbGV0aW9uICppb19yZXF1ZXN0X2NvbXBsZXRpb247CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgc207CisJc3RydWN0IGlzY2lfaG9zdCAqb3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqdGFyZ2V0X2RldmljZTsKKwl1MTYgaW9fdGFnOworCWVudW0gc2NpX3JlcXVlc3RfcHJvdG9jb2wgcHJvdG9jb2w7CisJdTMyIHNjdV9zdGF0dXM7IC8qIGhhcmR3YXJlIHJlc3VsdCAqLworCXUzMiBzY2lfc3RhdHVzOyAvKiB1cHBlciBsYXllciBkaXNwb3NpdGlvbiAqLworCXUzMiBwb3N0X2NvbnRleHQ7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRjOworCS8qIGNvdWxkIGJlIGxhcmdlciB3aXRoIHNnIGNoYWluaW5nICovCisJI2RlZmluZSBTQ1VfU0dMX1NJWkUgKChTQ0lfTUFYX1NDQVRURVJfR0FUSEVSX0VMRU1FTlRTICsgMSkgLyAyKQorCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ190YWJsZVtTQ1VfU0dMX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCS8qIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgcnggZnJhbWUgZGF0YS4gIEl0IGlzIHVzZWQgaW4KKwkgKiBTVFAgaW50ZXJuYWwgcmVxdWVzdHMgYW5kIFNNUCByZXNwb25zZSBmcmFtZXMuICBJZiB0aGlzIGZpZWxkIGlzCisJICogbm9uLU5VTEwgdGhlIHNhdmVkIGZyYW1lIG11c3QgYmUgcmVsZWFzZWQgb24gSU8gcmVxdWVzdCBjb21wbGV0aW9uLgorCSAqLworCXUzMiBzYXZlZF9yeF9mcmFtZV9pbmRleDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuaW9uIHsKKwkJCQlzdHJ1Y3Qgc3NwX2NtZF9pdSBjbWQ7CisJCQkJc3RydWN0IHNzcF90YXNrX2l1IHRtZjsKKwkJCX07CisJCQl1bmlvbiB7CisJCQkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSByc3A7CisJCQkJdTggcnNwX2J1ZltTU1BfUkVTUF9JVV9NQVhfU0laRV07CisJCQl9OworCQl9IHNzcDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBzbXBfcmVzcCByc3A7CisJCX0gc21wOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgcmVxOworCQkJc3RydWN0IGhvc3RfdG9fZGV2X2ZpcyBjbWQ7CisJCQlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzIHJzcDsKKwkJfSBzdHA7CisJfTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcmVxdWVzdCAqdG9faXJlcShzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IGNvbnRhaW5lcl9vZihzdHBfcmVxLCB0eXBlb2YoKmlyZXEpLCBzdHAucmVxKTsKKwlyZXR1cm4gaXJlcTsKK30KKworLyoqCisgKiBlbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCB0aGUgc3RhdGVzIGZvcgorICogICAgdGhlIGNvbW1vbiByZXF1ZXN0IHN0YXRlIG1hY2hpbmUuCisgKgorICoKKyAqLworZW51bSBzY2lfYmFzZV9yZXF1ZXN0X3N0YXRlcyB7CisJLyoKKwkgKiBTaW1wbHkgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSBiYXNlIHJlcXVlc3Qgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUkVRX0lOSVQsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29uc3RydWN0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUwgc3RhdGUuCisJICovCisJU0NJX1JFUV9DT05TVFJVQ1RFRCwKKworCS8qCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzdGFydGVkLiBUaGlzIHN0YXRlCisJICogaXMgZW50ZXJlZCBmcm9tIHRoZSBDT05TVFJVQ1RFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lfUkVRX1NUQVJURUQsCisKKwlTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUCwKKwlTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfRDJILAorCisJU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkQsCisJU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkgsCisKKwlTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVELAorCVNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRywKKwlTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfRDJILAorCisJLyoKKwkgKiBXaGlsZSBpbiB0aGlzIHN0YXRlIHRoZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvciB0aGUgVEMKKwkgKiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIEgyRCBSZWdpc3RlciBGSVMKKwkgKi8KKwlTQ0lfUkVRX1NUUF9QSU9fV0FJVF9IMkQsCisKKwkvKgorCSAqIFdoaWxlIGluIHRoaXMgc3RhdGUgdGhlIElPIHJlcXVlc3Qgb2JqZWN0IGlzIHdhaXRpbmcgZm9yIGVpdGhlciBhCisJICogUElPIFNldHVwIEZJUyBvciBhIEQySCByZWdpc3RlciBGSVMuICBUaGUgdHlwZSBvZiBmcmFtZSByZWNlaXZlZCBpcworCSAqIGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIHByaW9yIGZyYW1lIGFuZCBsaW5lIGNvbmRpdGlvbnMuCisJICovCisJU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUsCisKKwkvKgorCSAqIFdoaWxlIGluIHRoaXMgc3RhdGUgdGhlIElPIHJlcXVlc3Qgb2JqZWN0IGlzIHdhaXRpbmcgZm9yIGEgREFUQQorCSAqIGZyYW1lIGZyb20gdGhlIGRldmljZS4KKwkgKi8KKwlTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTiwKKworCS8qCisJICogV2hpbGUgaW4gdGhpcyBzdGF0ZSB0aGUgSU8gcmVxdWVzdCBvYmplY3QgaXMgd2FpdGluZyB0byB0cmFuc21pdAorCSAqIHRoZSBuZXh0IGRhdGEgZnJhbWUgdG8gdGhlIGRldmljZS4KKwkgKi8KKwlTQ0lfUkVRX1NUUF9QSU9fREFUQV9PVVQsCisKKwkvKgorCSAqIFRoZSBBV0FJVF9UQ19DT01QTEVUSU9OIHN1Yi1zdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhcnRlZCByYXcKKwkgKiB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZQorCSAqIGluaXRpYWwgZnJhbWUgKGkuZS4gY29tbWFuZCwgdGFzaywgZXRjLikuCisJICovCisJU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUCwKKworCS8qCisJICogVGhpcyBzdWItc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXJ0ZWQgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QKKwkgKiBpcyB3YWl0aW5nIGZvciB0aGUgcmVjZXB0aW9uIG9mIGFuIHVuc29saWNpdGVkIGZyYW1lCisJICogKGkuZS4gcmVzcG9uc2UgSVUpLgorCSAqLworCVNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1AsCisKKwkvKgorCSAqIFRoaXMgc3ViLXN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBzdGFydGVkIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0CisJICogaXMgd2FpdGluZyBmb3IgdGhlIHJlY2VwdGlvbiBvZiBhbiB1bnNvbGljaXRlZCBmcmFtZQorCSAqIChpLmUuIHJlc3BvbnNlIElVKS4KKwkgKi8KKwlTQ0lfUkVRX1NNUF9XQUlUX1JFU1AsCisKKwkvKgorCSAqIFRoZSBBV0FJVF9UQ19DT01QTEVUSU9OIHN1Yi1zdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhcnRlZCBTTVAKKwkgKiByZXF1ZXN0IGlzIHdhaXRpbmcgZm9yIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGluaXRpYWwgZnJhbWUKKwkgKiAoaS5lLiBjb21tYW5kLCB0YXNrLCBldGMuKS4KKwkgKi8KKwlTQ0lfUkVRX1NNUF9XQUlUX1RDX0NPTVAsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRFRCBzdGF0ZS4gVGhpcyBzdGF0ZSBpcyBlbnRlcmVkCisJICogZnJvbSB0aGUgQUJPUlRJTkcgc3RhdGUuCisJICovCisJU0NJX1JFUV9DT01QTEVURUQsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcKKwkgKiB0ZXJtaW5hdGVkL2Fib3J0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIENPTlNUUlVDVEVEIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVEVEIHN0YXRlLgorCSAqLworCVNDSV9SRVFfQUJPUlRJTkcsCisKKwkvKgorCSAqIFNpbXBseSB0aGUgZmluYWwgc3RhdGUgZm9yIHRoZSBiYXNlIHJlcXVlc3Qgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUkVRX0ZJTkFMLAorfTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZXF1ZXN0X3N0YXJ0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZW51bSBzY2lfc3RhdHVzIHNjaV9pb19yZXF1ZXN0X3Rlcm1pbmF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgdTMyIGV2ZW50X2NvZGUpOworZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJICB1MzIgZnJhbWVfaW5kZXgpOworZW51bSBzY2lfc3RhdHVzCitzY2lfdGFza19yZXF1ZXN0X3Rlcm1pbmF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2V4dGVybiBlbnVtIHNjaV9zdGF0dXMKK3NjaV9yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZXh0ZXJuIGVudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfdGNfY29tcGxldGlvbihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB1MzIgY29kZSk7CisKKy8qIFhYWCBvcGVuIGNvZGUgaW4gY2FsbGVyICovCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK3NjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB2b2lkICp2aXJ0X2FkZHIpCit7CisKKwljaGFyICpyZXF1ZXN0ZWRfYWRkciA9IChjaGFyICopdmlydF9hZGRyOworCWNoYXIgKmJhc2VfYWRkciA9IChjaGFyICopaXJlcTsKKworCUJVR19PTihyZXF1ZXN0ZWRfYWRkciA8IGJhc2VfYWRkcik7CisJQlVHX09OKChyZXF1ZXN0ZWRfYWRkciAtIGJhc2VfYWRkcikgPj0gc2l6ZW9mKCppcmVxKSk7CisKKwlyZXR1cm4gaXJlcS0+cmVxdWVzdF9kYWRkciArIChyZXF1ZXN0ZWRfYWRkciAtIGJhc2VfYWRkcik7Cit9CisKKy8qKgorICogaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZSgpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3QKKyAqICAgIG9iamVjdC4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIGlzY2lfcmVxdWVzdCBvYmplY3QKKyAqIEBzdGF0dXM6IFRoaXMgUGFyYW1ldGVyIGlzIHRoZSBuZXcgc3RhdHVzIG9mIHRoZSBvYmplY3QKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzCitpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdCwKKwkJCSAgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHN0YXR1cykKK3sKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgb2xkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpc2NpX3JlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcmVxdWVzdCA9ICVwLCBzdGF0ZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlpc2NpX3JlcXVlc3QsCisJCXN0YXR1cyk7CisKKwlCVUdfT04oaXNjaV9yZXF1ZXN0ID09IE5VTEwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCW9sZF9zdGF0ZSA9IGlzY2lfcmVxdWVzdC0+c3RhdHVzOworCWlzY2lfcmVxdWVzdC0+c3RhdHVzID0gc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG9sZF9zdGF0ZTsKK30KKworLyoqCisgKiBpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fbmV3c3RhdGUoKSAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RhdHVzIG9mCisgKiAgICB0aGUgcmVxdWVzdCBvYmplY3QuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBpc2NpX3JlcXVlc3Qgb2JqZWN0CisgKiBAc3RhdHVzOiBUaGlzIFBhcmFtZXRlciBpcyB0aGUgbmV3IHN0YXR1cyBvZiB0aGUgb2JqZWN0CisgKgorICogc3RhdGUgcHJldmlvdXMgdG8gYW55IGNoYW5nZS4KKyAqLworc3RhdGljIGlubGluZSBlbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMKK2lzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhcnRlZF90b19uZXdzdGF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QsCisJCQkJCXN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0aW9uX3B0ciwKKwkJCQkJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIG5ld3N0YXRlKQoreworCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBvbGRfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCW9sZF9zdGF0ZSA9IGlzY2lfcmVxdWVzdC0+c3RhdHVzOworCisJaWYgKG9sZF9zdGF0ZSA9PSBzdGFydGVkIHx8IG9sZF9zdGF0ZSA9PSBhYm9ydGluZykgeworCQlCVUdfT04oaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gIT0gTlVMTCk7CisKKwkJaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gPSBjb21wbGV0aW9uX3B0cjsKKwkJaXNjaV9yZXF1ZXN0LT5zdGF0dXMgPSBuZXdzdGF0ZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoJmlzY2lfcmVxdWVzdC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9yZXF1ZXN0ID0gJXAsIG9sZF9zdGF0ZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlpc2NpX3JlcXVlc3QsCisJCW9sZF9zdGF0ZSk7CisKKwlyZXR1cm4gb2xkX3N0YXRlOworfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhcnRlZF90b19hYm9ydGVkKCkgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0YXR1cyBvZgorICogICAgdGhlIHJlcXVlc3Qgb2JqZWN0LgorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgaXNjaV9yZXF1ZXN0IG9iamVjdAorICogQGNvbXBsZXRpb25fcHRyOiBUaGlzIHBhcmFtZXRlciBpcyBzYXZlZCBhcyB0aGUga2VybmVsIGNvbXBsZXRpb24gc3RydWN0dXJlCisgKiAgICBzaWduYWxsZWQgd2hlbiB0aGUgb2xkIHJlcXVlc3QgY29tcGxldGVzLgorICoKKyAqIHN0YXRlIHByZXZpb3VzIHRvIGFueSBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzCitpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fYWJvcnRlZChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QsCisJCQkJICAgICAgIHN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0aW9uX3B0cikKK3sKKwlyZXR1cm4gaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX25ld3N0YXRlKGlzY2lfcmVxdWVzdCwKKwkJCQkJCSAgICAgICBjb21wbGV0aW9uX3B0ciwKKwkJCQkJCSAgICAgICBhYm9ydGVkKTsKK30KKworI2RlZmluZSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2socmVxKSAoKHJlcSktPnR0eXBlX3B0ci5pb190YXNrX3B0cikKKworI2RlZmluZSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihyZXEpICgocmVxKS0+dHR5cGVfcHRyLnRtZl90YXNrX3B0cikKKworc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV90bWZfcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWYsCisJCQkJCSAgICAgICB1MTYgdGFnKTsKK2ludCBpc2NpX3JlcXVlc3RfZXhlY3V0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCSBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHUxNiB0YWcpOwordm9pZCBpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CitlbnVtIHNjaV9zdGF0dXMKK3NjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkgICAgdTE2IGlvX3RhZywKKwkJCSAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cworc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Rfc3NwKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZW51bSBzY2lfc3RhdHVzCitzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF9zYXRhKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOwordm9pZCBzY2lfc21wX3JlcXVlc3RfY29weV9yZXNwb25zZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworc3RhdGljIGlubGluZSBpbnQgaXNjaV90YXNrX2lzX25jcV9yZWNvdmVyeShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJcmV0dXJuIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pICYmCisJCXRhc2stPmF0YV90YXNrLmZpcy5jb21tYW5kID09IEFUQV9DTURfUkVBRF9MT0dfRVhUICYmCisJCXRhc2stPmF0YV90YXNrLmZpcy5sYmFsID09IEFUQV9MT0dfU0FUQV9OQ1EpOworCit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVNDSV9SRVFVRVNUX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9zYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjJiMTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSV9TQVNfSF8KKyNkZWZpbmUgX1NDSV9TQVNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvKgorICogU0FUQSBGSVMgVHlwZXMgVGhlc2UgY29uc3RhbnRzIGRlcGljdCB0aGUgdmFyaW91cyBTQVRBIEZJUyB0eXBlcyBkZXZpbmVkIGluCisgKiB0aGUgc2VyaWFsIEFUQSBzcGVjaWZpY2F0aW9uLgorICogWFhYOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gPHNjc2kvc2FzLmg+CisgKi8KKyNkZWZpbmUgRklTX1JFR0gyRCAgICAgICAgICAweDI3CisjZGVmaW5lIEZJU19SRUdEMkggICAgICAgICAgMHgzNAorI2RlZmluZSBGSVNfU0VUREVWQklUUyAgICAgIDB4QTEKKyNkZWZpbmUgRklTX0RNQV9BQ1RJVkFURSAgICAweDM5CisjZGVmaW5lIEZJU19ETUFfU0VUVVAgICAgICAgMHg0MQorI2RlZmluZSBGSVNfQklTVF9BQ1RJVkFURSAgIDB4NTgKKyNkZWZpbmUgRklTX1BJT19TRVRVUCAgICAgICAweDVGCisjZGVmaW5lIEZJU19EQVRBICAgICAgICAgICAgMHg0NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNTUF9SRVNQX0lVX01BWF9TSVpFCTI4MAorCisvKgorICogY29udGVudHMgb2YgdGhlIFNTUCBDT01NQU5EIElORk9STUFUSU9OIFVOSVQuCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UKKyAqIHJlZmVyZW5jZSB0aGUgU0FTIHNwZWNpZmljYXRpb24gU1NQIHRyYW5zcG9ydCBsYXllciBzZWN0aW9uLgorICogWFhYOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gPHNjc2kvc2FzLmg+CisgKi8KK3N0cnVjdCBzc3BfY21kX2l1IHsKKwl1OCBMVU5bOF07CisJdTggYWRkX2NkYl9sZW46NjsKKwl1OCBfcl9hOjI7CisJdTggX3JfYjsKKwl1OCBlbl9mYnVyc3Q6MTsKKwl1OCB0YXNrX3ByaW86NDsKKwl1OCB0YXNrX2F0dHI6MzsKKwl1OCBfcl9jOworCisJdTggY2RiWzE2XTsKK30gIF9fcGFja2VkOworCisvKgorICogY29udGVudHMgb2YgdGhlIFNTUCBUQVNLIElORk9STUFUSU9OIFVOSVQuCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UKKyAqIHJlZmVyZW5jZSB0aGUgU0FTIHNwZWNpZmljYXRpb24gU1NQIHRyYW5zcG9ydCBsYXllciBzZWN0aW9uLgorICogWFhYOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gPHNjc2kvc2FzLmg+CisgKi8KK3N0cnVjdCBzc3BfdGFza19pdSB7CisJdTggTFVOWzhdOworCXU4IF9yX2E7CisJdTggdGFza19mdW5jOworCXU4IF9yX2JbNF07CisJdTE2IHRhc2tfdGFnOworCXU4IF9yX2NbMTJdOworfSAgX19wYWNrZWQ7CisKKworLyoKKyAqIHN0cnVjdCBzbXBfcmVxX3BoeV9pZCAtIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRlbnRzIG9mCisgKiAgICBhbiBTTVAgUmVxdWVzdCB0aGF0IGlzIGNvbXByaXNlZCBvZiB0aGUgc3RydWN0IHNtcF9yZXF1ZXN0X2hlYWRlciBhbmQgYQorICogICAgcGh5IGlkZW50aWZpZXIuCisgKiAgICBFeGFtcGxlczogU01QX1JFUVVFU1RfRElTQ09WRVIsIFNNUF9SRVFVRVNUX1JFUE9SVF9QSFlfU0FUQS4KKyAqCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UgcmVmZXJlbmNlCisgKiB0aGUgU0FTIHNwZWNpZmljYXRpb24uCisgKi8KK3N0cnVjdCBzbXBfcmVxX3BoeV9pZCB7CisJdTggX3JfYVs0XTsJCS8qIGJ5dGVzIDQtNyAqLworCisJdTggaWduX3pvbmVfZ3JwOjE7CS8qIGJ5dGUgOCAqLworCXU4IF9yX2I6NzsKKworCXU4IHBoeV9pZDsJCS8qIGJ5dGUgOSAqLworCXU4IF9yX2M7CQkvKiBieXRlIDEwICovCisJdTggX3JfZDsJCS8qIGJ5dGUgMTEgKi8KK30gIF9fcGFja2VkOworCisvKgorICogc3RydWN0IHNtcF9yZXFfY29uZmlnX3JvdXRlX2luZm8gLSBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZQorICogICAgY29udGVudHMgb2YgYW4gU01QIENvbmZpZ3VyZSBSb3V0ZSBJbmZvcm1hdGlvbiByZXF1ZXN0LgorICoKKyAqIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZXNlIGluZGl2aWR1YWwgZmllbGRzIHBsZWFzZSByZWZlcmVuY2UKKyAqIHRoZSBTQVMgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RydWN0IHNtcF9yZXFfY29uZl9ydGluZm8geworCXUxNiBleHBfY2hhbmdlX2NudDsJCS8qIGJ5dGVzIDQtNSAqLworCXU4IGV4cF9ydF9pZHhfaGk7CQkvKiBieXRlIDYgKi8KKwl1OCBleHBfcnRfaWR4OwkJCS8qIGJ5dGUgNyAqLworCisJdTggX3JfYTsJCQkvKiBieXRlIDggKi8KKwl1OCBwaHlfaWQ7CQkJLyogYnl0ZSA5ICovCisJdTE2IF9yX2I7CQkJLyogYnl0ZXMgMTAtMTEgKi8KKworCXU4IF9yX2M6NzsJCQkvKiBieXRlIDEyICovCisJdTggZGlzX3J0X2VudHJ5OjE7CisJdTggX3JfZFszXTsJCQkvKiBieXRlcyAxMy0xNSAqLworCisJdTggcnRfc2FzX2FkZHJbOF07CQkvKiBieXRlcyAxNi0yMyAqLworCXU4IF9yX2VbMTZdOwkJCS8qIGJ5dGVzIDI0LTM5ICovCit9ICBfX3BhY2tlZDsKKworLyoKKyAqIHN0cnVjdCBzbXBfcmVxX3BoeWNudGwgLSBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZW50cyBvZiBhbgorICogICAgU01QIFBoeSBDb250cm9sbGVyIHJlcXVlc3QuCisgKgorICogRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlc2UgaW5kaXZpZHVhbCBmaWVsZHMgcGxlYXNlIHJlZmVyZW5jZQorICogdGhlIFNBUyBzcGVjaWZpY2F0aW9uLgorICovCitzdHJ1Y3Qgc21wX3JlcV9waHljbnRsIHsKKwl1MTYgZXhwX2NoYW5nZV9jbnQ7CQkvKiBieXRlIDQtNSAqLworCisJdTggX3JfYVszXTsJCQkvKiBieXRlcyA2LTggKi8KKworCXU4IHBoeV9pZDsJCQkvKiBieXRlIDkgKi8KKwl1OCBwaHlfb3A7CQkJLyogYnl0ZSAxMCAqLworCisJdTggdXBkX3BhdGh3YXk6MTsJCS8qIGJ5dGUgMTEgKi8KKwl1OCBfcl9iOjc7CisKKwl1OCBfcl9jWzEyXTsJCQkvKiBieXRlIDEyLTIzICovCisKKwl1OCBhdHRfZGV2X25hbWVbOF07ICAgICAgICAgICAgIC8qIGJ5dGUgMjQtMzEgKi8KKworCXU4IF9yX2Q6NDsJCQkvKiBieXRlIDMyICovCisJdTggbWluX2xpbmtyYXRlOjQ7CisKKwl1OCBfcl9lOjQ7CQkJLyogYnl0ZSAzMyAqLworCXU4IG1heF9saW5rcmF0ZTo0OworCisJdTggX3JfZlsyXTsJCQkvKiBieXRlIDM0LTM1ICovCisKKwl1OCBwYXRod2F5OjQ7CQkJLyogYnl0ZSAzNiAqLworCXU4IF9yX2c6NDsKKworCXU4IF9yX2hbM107CQkJLyogYnl0ZXMgMzctMzkgKi8KK30gIF9fcGFja2VkOworCisvKgorICogc3RydWN0IHNtcF9yZXEgLSBUaGlzIHN0cnVjdHVyZSBzaW1wbHkgdW5pb25pemVzIHRoZSBleGlzdGluZyByZXF1ZXN0CisgKiAgICBzdHJ1Y3R1cmVzIGludG8gYSBjb21tb24gcmVxdWVzdCB0eXBlLgorICoKKyAqIFhYWDogVGhpcyBkYXRhIHN0cnVjdHVyZSBtYXkgbmVlZCB0byBnbyB0byBzY3NpL3Nhcy5oCisgKi8KK3N0cnVjdCBzbXBfcmVxIHsKKwl1OCB0eXBlOwkJLyogYnl0ZSAwICovCisJdTggZnVuYzsJCS8qIGJ5dGUgMSAqLworCXU4IGFsbG9jX3Jlc3BfbGVuOwkvKiBieXRlIDIgKi8KKwl1OCByZXFfbGVuOwkJLyogYnl0ZSAzICovCisJdTggcmVxX2RhdGFbMF07Cit9ICBfX3BhY2tlZDsKKworI2RlZmluZSBTTVBfUkVTUF9IRFJfU1oJNAorCisvKgorICogc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAtIFRoaXMgc3RydWN0dXJlIGRlcGljdHMgaG93IGEgU0FTIGFkZHJlc3MgaXMKKyAqICAgIHJlcHJlc2VudGVkIGJ5IFNDSS4KKyAqIFhYWCBjb252ZXJ0IHRoaXMgdG8gdTggW1NBU19BRERSX1NJWkVdIGxpa2UgdGhlIHJlc3Qgb2YgbGlic2FzCisgKgorICovCitzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHsKKwl1MzIgaGlnaDsKKwl1MzIgbG93OworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2N1X2NvbXBsZXRpb25fY29kZXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9jb21wbGV0aW9uX2NvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMzI5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9jb21wbGV0aW9uX2NvZGVzLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDVV9DT01QTEVUSU9OX0NPREVTX0hFQURFUl8KKyNkZWZpbmUgX1NDVV9DT01QTEVUSU9OX0NPREVTX0hFQURFUl8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnN0YW50cyBhbmQgbWFjcm9zIGZvciB0aGUgU0NVIGhhcmR3YXJlIGNvbXBsZXRpb24KKyAqICAgIGNvZGVzLgorICoKKyAqCisgKi8KKworI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX1NISUZUICAgICAgMjgKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVFlQRV9NQVNLICAgICAgIDB4NzAwMDAwMDAKKworLyoqCisgKiBTQ1VfQ09NUExFVElPTl9UWVBFKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gY29uc3RydWN0cyBhbiBTQ1UgY29tcGxldGlvbiB0eXBlCisgKi8KKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVFlQRSh0eXBlKSBcCisJKCh1MzIpKHR5cGUpIDw8IFNDVV9DT01QTEVUSU9OX1RZUEVfU0hJRlQpCisKKy8qKgorICogU0NVX0NPTVBMRVRJT05fVFlQRSgpIC0KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udGFpbiB0aGUgU0NVIGNvbXBsZXRpb24gdHlwZXMgU0NVX0NPTVBMRVRJT05fVFlQRQorICovCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfVEFTSyAgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDApCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfU0RNQSAgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDEpCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfVUZJICAgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDIpCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfRVZFTlQgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDMpCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfTk9USUZZICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDQpCisKKy8qKgorICoKKyAqCisgKiBUaGVzZSBjb25zdGFudHMgcHJvdmlkZSB0aGUgc2hpZnQgYW5kIG1hc2sgdmFsdWVzIGZvciB0aGUgdmFyaW91cyBwYXJ0cyBvZgorICogYW4gU0NVIGNvbXBsZXRpb24gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfQ09NUExFVElPTl9TVEFUVVNfTUFTSyAgICAgICAweDBGRkMwMDAwCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19NQVNLICAgIDB4MEZDMDAwMDAKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUICAgMjIKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fU0RNQV9TVEFUVVNfTUFTSyAgMHgwMDNDMDAwMAorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9QRUdfTUFTSyAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1BPUlRfTUFTSyAgICAgICAgIDB4MDAwMDcwMDAKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fUEVfTUFTSyAgICAgICAgICAgU0NVX0NPTVBMRVRJT05fUE9SVF9NQVNLCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1BFX1NISUZUICAgICAgICAgIDEyCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX0lOREVYX01BU0sgICAgICAgIDB4MDAwMDBGRkYKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fVFlQRSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNDVSBjb21wbGV0aW9uIHR5cGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1RZUEUoY29tcGxldGlvbl9jb2RlKSBcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fVFlQRV9NQVNLKQorCisvKioKKyAqIFNDVV9HRVRfQ09NUExFVElPTl9TVEFUVVMoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBTQ1UgY29tcGxldGlvbiBzdGF0dXMuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpIFwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9TVEFUVVNfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgdHJhbnNwb3J0IGxheWVyIGNvbXBsZXRpb24gc3RhdHVzLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSBcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX01BU0spCisKKy8qKgorICogU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoKSAtCisgKgorICogVGhpcyBtYWNybyB0YWtlcyBhIGNvbXBsZXRpb24gY29kZSBhbmQgcGVyZm9ybXMgdGhlIHNoaWZ0IGFuZCBtYXNrCisgKiBvcGVyYXRpb25zIHRvIHR1cm4gaXQgaW50byBhIGNvbXBsZXRpb24gY29kZSB0aGF0IGNhbiBiZSBjb21wYXJlZCB0byBhCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTLgorICovCisjZGVmaW5lIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgXAorCSgodTMyKShjb21wbGV0aW9uX2NvZGUpIDw8IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCkKKworLyoqCisgKiBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gdGFrZXMgYSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTIGFuZCBub3JtYWxpemVzIGl0IGZvciBhCisgKiByZXR1cm4gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgXAorCShcCisJCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19NQVNLKSBcCisJCT4+IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCBcCisJKQorCisvKioKKyAqIFNDVV9HRVRfQ09NUExFVElPTl9TRE1BX1NUQVRVUygpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNETUEgY29tcGxldGlvbiBzdGF0dXMuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1NETUFfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkJXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1NETUFfU1RBVFVTX01BU0spCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX1BFRygpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFByb3RvY29sIEVuZ2luZSBHcm91cCBmcm9tIHRoZSBjb21wbGV0aW9uIGNvZGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1BFRyhjb21wbGV0aW9uX2NvZGUpCVwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9QRUdfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fUE9SVCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldXR1cm5zIHRoZSBsb2dpY2FsIHBvcnQgaW5kZXggZnJvbSB0aGUgY29tcGxldGlvbiBjb2RlLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9QT1JUKGNvbXBsZXRpb25fY29kZSkgXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1BPUlRfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFBFIGluZGV4IGZyb20gdGhlIGNvbXBsZXRpb24gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWChjb21wbGV0aW9uX2NvZGUpIFwKKwkoKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fUEVfTUFTSykgPj4gU0NVX0NPTVBMRVRJT05fUEVfU0hJRlQpCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNvbXBsZXRpb24gd2hpY2ggaXMgZWl0aGVyIGEgVENpIG9yIGFuCisgKiBSTmkgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV0aW9uIHR5cGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGNvbXBsZXRpb25fY29kZSkgXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX0lOREVYX01BU0spCisKKyNkZWZpbmUgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX01BU0sgICAgIDB4MEZGRjAwMDAKKyNkZWZpbmUgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX1NISUZUICAgIDE2CisKKy8qKgorICogU0NVX0dFVF9GUkFNRV9JTkRFWCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgYSBub3JtYWxpemVkIGZyYW1lIGluZGV4IGZyb20gYW4gdW5zb2xpY2l0ZWQgZnJhbWUKKyAqIGNvbXBsZXRpb24uCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9GUkFNRV9JTkRFWChjb21wbGV0aW9uX2NvZGUpIFwKKwkoXAorCQkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfTUFTSykgXAorCQk+PiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfU0hJRlQgXAorCSkKKworI2RlZmluZSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfRVJST1JfTUFTSyAgMHgwMDAwODAwMAorCisvKioKKyAqIFNDVV9HRVRfRlJBTUVfRVJST1IoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIGEgemVybyAoMCkgdmFsdWUgaWYgdGhlcmUgaXMgbm8gZnJhbWUgZXJyb3Igb3RoZXJ3aXNlIGl0CisgKiByZXR1cm5zIG5vbi16ZXJvICghMCkuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9GUkFNRV9FUlJPUihjb21wbGV0aW9uX2NvZGUpIFwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfRVJST1JfTUFTSykKKworLyoqCisgKgorICoKKyAqIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgbm9ybWFsaXplZCBjb21wbGV0aW9uIGNvZGVzIHdoaWNoIG11c3QgYmUgc2hpZnRlZAorICogMTggYml0cyB0byBtYXRjaCBpdCB3aXRoIHRoZSBoYXJkd2FyZSBjb21wbGV0aW9uIGNvZGUuIEluIGEgMTYtYml0IGNvbXBpbGVyLAorICogaW1tZWRpYXRlIGNvbnN0YW50cyBhcmUgMTYtYml0IHZhbHVlcyAodGhlIHNpemUgb2YgYW4gaW50KS4gSWYgd2Ugc2hpZnQKKyAqIHRob3NlIGJ5IDE4IGJpdHMsIHdlIGNvbXBsZXRlbHkgbG9zZSB0aGUgdmFsdWUuIFRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgYQorICogMzItYml0IHZhbHVlIGxpa2Ugd2Ugd2FudCwgZWFjaCBpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBjYXN0IHRvIGEgdTMyLgorICovCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfR09PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDAwKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0NSQ19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfR0VOX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE1KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX05BS19DTURfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9DTURfTExfUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTYpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE3KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0FDS19OQUtfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9QRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTgpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfU1lfVEVSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE5KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX05BS19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9MRl9URVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUEpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfREFUQV9MRU5fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFBKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0xMX0NMX1RFUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxQikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9BQk9SVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUIpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU0VRX0lOVl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFDKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1VORVhQX1hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxQykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9JTlZfRklTX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfWFJfSVVfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFEKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0lOVl9GSVNfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxRSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9YUl9XRF9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUUpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU0RNQV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFGKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX09GRlNFVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyMCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9NQVhfUExEX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjEpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfRVhDRVNTX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDIyKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0xGX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyMykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9VTkVYUF9GSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVU5FWFBfUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI0KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0VBUkxZX1JFU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyNSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9TTVBfUkVTUF9UT19FUlIgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjYpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfRE1BU0VUVVBfRElSRVJSICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI3KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NNUF9VRklfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyNykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9YRkVSQ05UX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjgpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUiAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI4KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NNUF9MTF9SWF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9SRVNQX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MkEpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVU5FWFBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDJCKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX09QRU5fRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyQykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9VTkVYUF9TREJGSVMgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MkQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfUkVHX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDJFKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NEQl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyRikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MzApCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfQ01EX1NETUFfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKFUzMikweDMyKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0NNRF9MTF9BQk9SVF9FUlIgICAgICAgICAgICAgICAgICAgICAgKChVMzIpMHgzMykKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfV1JPTkdfREVTVElOQVRJT04gICAgICAgICAgICAgICgodTMyKTB4MzQpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMSAgICAgICAgICAgICAoKHUzMikweDM1KQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzIgICAgICAgICAgICAgKCh1MzIpMHgzNikKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8zICAgICAgICAgICAgICgodTMyKTB4MzcpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX0JBRF9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAoKHUzMikweDM4KQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9aT05FX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgKCh1MzIpMHgzOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9WSUlUX0VOVFJZX05WICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4M0EpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfSUlUX0VOVFJZX05WICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDNCKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1JOQ05WX09VVEJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgzQykKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfU1RQX1JFU09VUkNFU19CVVNZICAgICAgICAgICAgICgodTMyKTB4M0QpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1BST1RPQ09MX05PVF9TVVBQT1JURUQgICAgICAgICAoKHUzMikweDNFKQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRCAgKCh1MzIpMHgzRikKKworI2VuZGlmIC8qIF9TQ1VfQ09NUExFVElPTl9DT0RFU19IRUFERVJfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfZXZlbnRfY29kZXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9ldmVudF9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTk0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfZXZlbnRfY29kZXMuaApAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX1NDVV9FVkVOVF9DT0RFU19IRUFERVJfXworI2RlZmluZSBfX1NDVV9FVkVOVF9DT0RFU19IRUFERVJfXworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29uc3RhbnRzIGFuZCBtYWNyb3MgZm9yIHRoZSBTQ1UgZXZlbnQgY29kZXMuCisgKgorICoKKyAqLworCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX0NPREVfU0hJRlQgICAgICAyNAorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9DT0RFX01BU0sgICAgICAgMHgwRjAwMDAwMAorCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJQ19DT0RFX1NISUZUICAxOAorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9NQVNLICAgMHgwMEZDMDAwMAorCisjZGVmaW5lIFNDVV9FVkVOVF9DT0RFX01BU0sgXAorCShTQ1VfRVZFTlRfVFlQRV9DT0RFX01BU0sgfCBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9NQVNLKQorCisvKioKKyAqIFNDVV9FVkVOVF9UWVBFKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gY29uc3RydWN0cyBhbiBTQ1UgZXZlbnQgdHlwZSBmcm9tIHRoZSB0eXBlIHZhbHVlLgorICovCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFKHR5cGUpIFwKKwkoKHUzMikodHlwZSkgPDwgU0NVX0VWRU5UX1RZUEVfQ09ERV9TSElGVCkKKworLyoqCisgKiBTQ1VfRVZFTlRfU1BFQ0lGSUMoKSAtCisgKgorICogVGhpcyBtYWNybyBjb25zdHJ1Y3RzIGFuIFNDVSBldmVudCBzcGVjaWZpZXIgZnJvbSB0aGUgY29kZSB2YWx1ZS4KKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUMoY29kZSkgXAorCSgodTMyKShjb2RlKSA8PCBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9TSElGVCkKKworLyoqCisgKiBTQ1VfRVZFTlRfTUVTU0FHRSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgYSBjb21iaW5lcyBhbiBTQ1UgZXZlbnQgdHlwZSBhbmQgU0NVIGV2ZW50IHNwZWNpZmllcgorICogZnJvbSB0aGUgdHlwZSBhbmQgY29kZSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX01FU1NBR0UodHlwZSwgY29kZSkgXAorCSgodHlwZSkgfCBTQ1VfRVZFTlRfU1BFQ0lGSUMoY29kZSkpCisKKy8qKgorICogU0NVX0VWRU5UX1RZUEUoKSAtCisgKgorICogU0NVX0VWRU5UX1RZUEVTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfU01VX0NPTU1BTkRfRVJST1IgIFNDVV9FVkVOVF9UWVBFKDB4MDgpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1NNVV9QQ1FfRVJST1IgICAgICBTQ1VfRVZFTlRfVFlQRSgweDA5KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IgICAgICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfVFJBTlNQT1JUX0VSUk9SICAgIFNDVV9FVkVOVF9UWVBFKDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UgICBTQ1VfRVZFTlRfVFlQRSgweDAyKQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5UICAgICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwMykKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfRkFUQUxfTUVNT1JZX0VSUk9SIFNDVV9FVkVOVF9UWVBFKDB4MEYpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYICAgICBTQ1VfRVZFTlRfVFlQRSgweDA0KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWF9SWCAgU0NVX0VWRU5UX1RZUEUoMHgwNSkKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDICAgICAgIFNDVV9FVkVOVF9UWVBFKDB4MDYpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1BUWF9TQ0hFRFVMRV9FVkVOVCBTQ1VfRVZFTlRfVFlQRSgweDA3KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9FUlJfQ05UX0VWRU5UICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwQSkKKworLyoqCisgKgorICoKKyAqIFNDVV9FVkVOVF9TUEVDSUZJRVJTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1NQRUNJRklFUl9EUklWRVJfU1VTUEVORCAweDIwCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJRVJfUk5DX1JFTEVBU0UgICAgMHgwMAorCisvKioKKyAqCisgKgorICogU01VX0NPTU1BTkRfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX0lOVkFMSURfQ09OVEVYVF9DT01NQU5EIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfQ09NTUFORF9FUlJPUiwgMHgwMCkKKworLyoqCisgKgorICoKKyAqIFNNVV9QQ1FfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1VOQ09SUkVDVEFCTEVfUENRX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfUENRX0VSUk9SLCAweDAwKQorCisvKioKKyAqCisgKgorICogU01VX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9VTkNPUlJFQ1RBQkxFX1JFR0lTVEVSX1dSSVRFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IsIDB4MDIpCisjZGVmaW5lIFNDVV9FVkVOVF9VTkNPUlJFQ1RBQkxFX1JFR0lTVEVSX1JFQUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1NNVV9FUlJPUiwgMHgwMykKKyNkZWZpbmUgU0NVX0VWRU5UX1BDSUVfSU5URVJGQUNFX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IsIDB4MDQpCisjZGVmaW5lIFNDVV9FVkVOVF9GVU5DVElPTl9MRVZFTF9SRVNFVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfU01VX0VSUk9SLCAweDA1KQorCisvKioKKyAqCisgKgorICogVFJBTlNQT1JUX0xFVkVMX0VSUk9SUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9BQ0tfTkFLX1RJTUVPVVRfRVJST1IJXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1RSQU5TUE9SVF9FUlJPUiwgMHgwMCkKKworLyoqCisgKgorICoKKyAqIEJST0FEQ0FTVF9DSEFOR0VfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9DSEFOR0UgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfUkVTRVJWRUQwIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDAyKQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX1JFU0VSVkVEMSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfQlJPQURDQVNUX0NIQU5HRSwgMHgwMykKKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9TRVMJXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDQpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfRVhQQU5ERVIgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDUpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfQUVOCVwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDA2KQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX1JFU0VSVkVEMyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfQlJPQURDQVNUX0NIQU5HRSwgMHgwNykKKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9SRVNFUlZFRDQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDgpCisjZGVmaW5lIFNDVV9FVkVOVF9QRV9TVVNQRU5ERUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDkpCisKKy8qKgorICoKKyAqCisgKiBPU1NQX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9QT1JUX1NFTEVDVE9SX0RFVEVDVEVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDEwKQorI2RlZmluZSBTQ1VfRVZFTlRfU0VOVF9QT1JUX1NFTEVDVElPTiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxMSkKKyNkZWZpbmUgU0NVX0VWRU5UX0hBUkRfUkVTRVRfVFJBTlNNSVRURUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTIpCisjZGVmaW5lIFNDVV9FVkVOVF9IQVJEX1JFU0VUX1JFQ0VJVkVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDEzKQorI2RlZmluZSBTQ1VfRVZFTlRfUkVDRUlWRURfSURFTlRJRllfVElNRU9VVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxNSkKKyNkZWZpbmUgU0NVX0VWRU5UX0xJTktfRkFJTFVSRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxNikKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTcpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfMTVfU1NDIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDE4KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTXzE1IFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDE5KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTXzMwX1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxQSkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBU18zMCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxQikKKyNkZWZpbmUgU0NVX0VWRU5UX1NBU182MF9TU0MgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUMpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfNjAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUQpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzE1X1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxRSkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfMTUgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUYpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzMwX1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgyMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfMzAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjEpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzYwX1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgyMikKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfNjAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjMpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDI0KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FUQV9QSFlfREVURUNURUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjUpCisKKy8qKgorICoKKyAqCisgKiBGQVRBTF9JTlRFUk5BTF9NRU1PUllfRVJST1JfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1RTQ19STlNDX1VOQ09SUkVDVEFCTEVfRVJST1IgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0ZBVEFMX01FTU9SWV9FUlJPUiwgIDB4MDApCisjZGVmaW5lIFNDVV9FVkVOVF9UQ19STkNfVU5DT1JSRUNUQUJMRV9FUlJPUiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfRkFUQUxfTUVNT1JZX0VSUk9SLCAgMHgwMSkKKyNkZWZpbmUgU0NVX0VWRU5UX1pQVF9VTkNPUlJFQ1RBQkxFX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9GQVRBTF9NRU1PUllfRVJST1IsICAweDAyKQorCisvKioKKyAqCisgKgorICogUkVNT1RFX05PREVfU1VTUEVORF9FVkVOVFMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfVExfUk5DX1NVU1BFTkRfVFggXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYLCAweDAwKQorI2RlZmluZSBTQ1VfRVZFTlRfVExfUk5DX1NVU1BFTkRfVFhfUlggXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYLCAweDAwKQorI2RlZmluZSBTQ1VfRVZFTlRfRFJJVkVSX1BPU1RfUk5DX1NVU1BFTkRfVFggXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYLCAweDIwKQorI2RlZmluZSBTQ1VfRVZFTlRfRFJJVkVSX1BPU1RfUk5DX1NVU1BFTkRfVFhfUlgJXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYLCAweDIwKQorCisvKioKKyAqCisgKgorICogUkVNT1RFX05PREVfTUlTQ19FVkVOVFMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9SQ05fUkVMRUFTRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDLCBTQ1VfRVZFTlRfU1BFQ0lGSUVSX1JOQ19SRUxFQVNFKQorI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9JVF9ORVhVU19MT1NTX1RJTUVSX0VOQUJMRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDLCAweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9JVF9ORVhVU19MT1NTX1RJTUVSX0RJU0FCTEUgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQywgMHgwMikKKyNkZWZpbmUgU0NVX0VWRU5UX1BPU1RfUk5DX0NPTVBMRVRFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0MsIDB4MDMpCisjZGVmaW5lIFNDVV9FVkVOVF9QT1NUX1JOQ19JTlZBTElEQVRFX0NPTVBMRVRFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0MsIDB4MDQpCisKKy8qKgorICoKKyAqCisgKiBFUlJPUl9DT1VOVF9FVkVOVAorICovCisjZGVmaW5lIFNDVV9FVkVOVF9SWF9DUkVESVRfQkxPQ0tFRF9SRUNFSVZFRCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfRVJSX0NOVF9FVkVOVCwgMHgwMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1RYX0RPTkVfQ1JFRElUX1RJTUVPVVQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0VSUl9DTlRfRVZFTlQsIDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9SWF9ET05FX0NSRURJVF9USU1FT1VUIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9FUlJfQ05UX0VWRU5ULCAweDAyKQorCisvKioKKyAqIHNjdV9nZXRfZXZlbnRfdHlwZSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNDVSBldmVudCB0eXBlIGZyb20gdGhlIGV2ZW50IGNvZGUuCisgKi8KKyNkZWZpbmUgc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpIFwKKwkoKGV2ZW50X2NvZGUpICYgU0NVX0VWRU5UX1RZUEVfQ09ERV9NQVNLKQorCisvKioKKyAqIHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgU0NVIGV2ZW50IHNwZWNpZmllciBmcm9tIHRoZSBldmVudCBjb2RlLgorICovCisjZGVmaW5lIHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpIFwKKwkoKGV2ZW50X2NvZGUpICYgU0NVX0VWRU5UX1NQRUNJRklDX0NPREVfTUFTSykKKworLyoqCisgKiBzY3VfZ2V0X2V2ZW50X2NvZGUoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBjb21iaW5lZCBTQ1UgZXZlbnQgdHlwZSBhbmQgU0NVIGV2ZW50IHNwZWNpZmllciBmcm9tCisgKiB0aGUgZXZlbnQgY29kZS4KKyAqLworI2RlZmluZSBzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkgXAorCSgoZXZlbnRfY29kZSkgJiBTQ1VfRVZFTlRfQ09ERV9NQVNLKQorCisKKy8qKgorICoKKyAqCisgKiBQVFNfU0NIRURVTEVfRVZFTlQKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfU01QX1JFU1BPTlNFX05PX1BFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9QVFhfU0NIRURVTEVfRVZFTlQsIDB4MDApCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJQ19TTVBfUkVTUE9OU0VfTk9fUEUgXAorCXNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKFNDVV9FVkVOVF9TTVBfUkVTUE9OU0VfTk9fUEUpCisKKyNkZWZpbmUgU0NVX0VWRU5UX1RBU0tfVElNRU9VVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5ULCAweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfVEFTS19USU1FT1VUCVwKKwlzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihTQ1VfRVZFTlRfVEFTS19USU1FT1VUKQorCisjZGVmaW5lIFNDVV9FVkVOVF9JVF9ORVhVU19USU1FT1VUIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9QVFhfU0NIRURVTEVfRVZFTlQsIDB4MDIpCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJQ19JVF9ORVhVU19USU1FT1VUIFwKKwlzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihTQ1VfRVZFTlRfSVRfTkVYVVNfVElNRU9VVCkKKworCisjZW5kaWYgLyogX19TQ1VfRVZFTlRfQ09ERVNfSEVBREVSX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9yZW1vdGVfbm9kZV9jb250ZXh0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfcmVtb3RlX25vZGVfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzQ1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfcmVtb3RlX25vZGVfY29udGV4dC5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fU0NVX1JFTU9URV9OT0RFX0NPTlRFWFRfSEVBREVSX18KKyNkZWZpbmUgX19TQ1VfUkVNT1RFX05PREVfQ09OVEVYVF9IRUFERVJfXworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RydWN0dXJlcyBhbmQgY29uc3RhdG5zIHVzZWQgYnkgdGhlIFNDVSBoYXJkd2FyZSB0bworICogICAgZGVzY3JpYmUgYSByZW1vdGUgbm9kZSBjb250ZXh0LgorICoKKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc3NwX3JlbW90ZV9ub2RlX2NvbnRleHQgLSBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgU0NVIGhhcmR3YXJlCisgKiAgICBkZWZpbml0aW9uIGZvciBhbiBTU1AgcmVtb3RlIG5vZGUuCisgKgorICoKKyAqLworc3RydWN0IHNzcF9yZW1vdGVfbm9kZV9jb250ZXh0IHsKKwkvKiBXT1JEIDAgKi8KKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHJlbW90ZSBub2RlIGluZGV4IGFzc2lnbmVkIGZvciB0aGlzIHJlbW90ZSBub2RlLiBBbGwKKwkgKiByZW1vdGUgbm9kZXMgbXVzdCBoYXZlIGEgdW5pcXVlIHJlbW90ZSBub2RlIGluZGV4LiBUaGUgdmFsdWUgb2YgdGhlIHJlbW90ZQorCSAqIG5vZGUgaW5kZXggY2FuIG5vdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlbW90ZSBub2RlcyByZXBvcnRlZCBpbgorCSAqIHRoZSBTQ1UgZGV2aWNlIGNvbnRleHQgY2FwYWNpdHkgcmVnaXN0ZXIuCisJICovCisJdTMyIHJlbW90ZV9ub2RlX2luZGV4OjEyOworCXUzMiByZXNlcnZlZDBfMTo0OworCisJLyoqCisJICogVGhpcyBmaWVsZCB0ZWxscyB0aGUgU0NVIGhhcmR3YXJlIGhvdyBtYW55IHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucyB0aGF0CisJICogdGhpcyByZW1vdGUgbm9kZSB3aWxsIHN1cHBvcnQuCisJICovCisJdTMyIHJlbW90ZV9ub2RlX3BvcnRfd2lkdGg6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSB3aGljaCBsb2dpY2FsIHBvcnQgdG8gYXNzb2NpYXRlIHdpdGggdGhpcworCSAqIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBsb2dpY2FsX3BvcnRfaW5kZXg6MzsKKwl1MzIgcmVzZXJ2ZWQwXzI6NTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgd2lsbCBlbmFibGUgdGhlIElfVCBuZXh1cyBsb3NzIHRpbWVyIGZvciB0aGlzIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBuZXh1c19sb3NzX3RpbWVyX2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgZm9yIGRyaXZlciBkZWJ1ZyBvbmx5IGFuZCBpcyBub3QgdXNlZC4KKwkgKi8KKwl1MzIgY2hlY2tfYml0OjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRydWUgd2hlbiB0aGUgaGFyZHdhcmUgRE1BcyB0aGUgcmVtb3RlIG5vZGUKKwkgKiBjb250ZXh0IHRvIHRoZSBoYXJkd2FyZSBTUkFNLiAgV2hlbiB0aGUgcmVtb3RlIG5vZGUgaXMgYmVpbmcgaW52YWxpZGF0ZWQKKwkgKiB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGZhbHNlLgorCSAqLworCXUzMiBpc192YWxpZDoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB0cnVlLgorCSAqLworCXUzMiBpc19yZW1vdGVfbm9kZV9jb250ZXh0OjE7CisKKwkvKiBXT1JEIDEgLSAyICovCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBsb3cgd29yZCBvZiB0aGUgcmVtb3RlIGRldmljZSBTQVMgQWRkcmVzcworCSAqLworCXUzMiByZW1vdGVfc2FzX2FkZHJlc3NfbG87CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBoaWdoIHdvcmQgb2YgdGhlIHJlbW90ZSBkZXZpY2UgU0FTIEFkZHJlc3MKKwkgKi8KKwl1MzIgcmVtb3RlX3Nhc19hZGRyZXNzX2hpOworCisJLyogV09SRCAzICovCisJLyoqCisJICogVGhpcyBmaWVsZCByZXByZW5zZXRzIHRoZSBmdW5jdGlvbiBudW1iZXIgYXNzaWduZWQgdG8gdGhpcyByZW1vdGUgZGV2aWNlLgorCSAqIFRoaXMgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmlydHVhbCBmdW5jdGlvbiBudW1iZXIgdGhhdCBpcyBiZWluZyB1c2VkIHRvCisJICogY29tbXVuaWNhdGUgdG8gdGhlIGRldmljZS4KKwkgKi8KKwl1MzIgZnVuY3Rpb25fbnVtYmVyOjg7CisJdTMyIHJlc2VydmVkM18xOjg7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHByb3ZpZGVzIHRoZSBkcml2ZXIgYSB3YXkgdG8gY2hlYXQgb24gdGhlIGFyYml0cmF0aW9uIHdhaXQgdGltZQorCSAqIGZvciB0aGlzIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBhcmJpdHJhdGlvbl93YWl0X3RpbWU6MTY7CisKKwkvKiBXT1JEIDQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgaG93IGxvbmcgdGhpcyBkZXZpY2UgbWF5IG9jY3VweSB0aGUKKwkgKiBjb25uZWN0aW9uIGJlZm9yZSBpdCBtdXN0IGJlIGNsb3NlZC4KKwkgKi8KKwl1MzIgY29ubmVjdGlvbl9vY2N1cGFuY3lfdGltZW91dDoxNjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSBob3cgbG9uZyB0byBtYWludGFpbiBhIGNvbm5lY3Rpb24gd2hlbgorCSAqIHRoZXJlIGFyZSBubyBmcmFtZXMgYmVpbmcgdHJhbnNtaXR0ZWQgb24gdGhlIGxpbmsuCisJICovCisJdTMyIGNvbm5lY3Rpb25faW5hY3Rpdml0eV90aW1lb3V0OjE2OworCisJLyogV09SRCAgNSAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgYWxsb3dzIHRoZSBkcml2ZXIgdG8gY2hlYXQgb24gdGhlIGFyYml0cmF0aW9uIHdhaXQgdGltZSBmb3IgdGhpcworCSAqIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBpbml0aWFsX2FyYml0cmF0aW9uX3dhaXRfdGltZToxNjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGVsbHMgdGhlIGhhcmR3YXJlIHdoYXQgdG8gcHJvZ3JhbSBmb3IgdGhlIGNvbm5lY3Rpb24gcmF0ZSBpbgorCSAqIHRoZSBvcGVuIGFkZHJlc3MgZnJhbWUuICBTZWUgdGhlIFNBUyBzcGVjIGZvciB2YWxpZCB2YWx1ZXMuCisJICovCisJdTMyIG9hZl9jb25uZWN0aW9uX3JhdGU6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSB3aGF0IHRvIHByb2dyYW0gZm9yIHRoZSBmZWF0dXJlcyBpbiB0aGUKKwkgKiBvcGVuIGFkZHJlc3MgZnJhbWUuICBTZWUgdGhlIFNBUyBzcGVjIGZvciB2YWxpZCB2YWx1ZXMuCisJICovCisJdTMyIG9hZl9mZWF0dXJlczo0OworCisJLyoqCisJICogVGhpcyBmaWVsZCB0ZWxscyB0aGUgU0NVIGhhcmR3YXJlIHdoYXQgdG8gdXNlIGZvciB0aGUgc291cmNlIHpvbmUgZ3JvdXAgaW4KKwkgKiB0aGUgb3BlbiBhZGRyZXNzIGZyYW1lLiAgU2VlIHRoZSBTQVMgc3BlYyBmb3IgbW9yZSBkZXRhaWxzIG9uIHpvbmluZy4KKwkgKi8KKwl1MzIgb2FmX3NvdXJjZV96b25lX2dyb3VwOjg7CisKKwkvKiBXT1JEIDYgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgd2hhdCB0byB1c2UgYXMgdGhlIG1vcmUgY2FwaWJpbGl0aWVzIGluCisJICogdGhlIG9wZW4gYWRkcmVzcyBmcmFtZS4gU2VlIHRoZSBTQVMgU3BlYyBmb3IgZGV0YWlscy4KKwkgKi8KKwl1MzIgb2FmX21vcmVfY29tcGF0aWJpbGl0eV9mZWF0dXJlczsKKworCS8qIFdPUkQgNyAqLworCXUzMiByZXNlcnZlZDc7CisKK307CisKKy8qKgorICogc3RydWN0IHN0cF9yZW1vdGVfbm9kZV9jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIFNDVSBoYXJkd2FyZQorICogICAgZGVmaW5pdGlvbiBmb3IgYSBTVFAgcmVtb3RlIG5vZGUuCisgKgorICogU1RQIFRhcmdldHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIHNvIHRoaXMgZGVmaW5pdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVudGlsCisgKiB3ZSBkbyBzdXBwb3J0IHRoZW0uCisgKi8KK3N0cnVjdCBzdHBfcmVtb3RlX25vZGVfY29udGV4dCB7CisJLyoqCisJICogUGxhY2Vob2xkZXIgZGF0YSBmb3IgdGhlIFNUUCByZW1vdGUgbm9kZS4KKwkgKi8KKwl1MzIgZGF0YVs4XTsKKworfTsKKworLyoqCisgKiBUaGlzIHVuaW9uIGNvbWJpbmVzIHRoZSBTQVMgYW5kIFNBVEEgcmVtb3RlIG5vZGUgZGVmaW5pdGlvbnMuCisgKgorICogdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQKKyAqLwordW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgeworCS8qKgorCSAqIFNTUCBSZW1vdGUgTm9kZQorCSAqLworCXN0cnVjdCBzc3BfcmVtb3RlX25vZGVfY29udGV4dCBzc3A7CisKKwkvKioKKwkgKiBTVFAgUmVtb3RlIE5vZGUKKwkgKi8KKwlzdHJ1Y3Qgc3RwX3JlbW90ZV9ub2RlX2NvbnRleHQgc3RwOworCit9OworCisjZW5kaWYgLyogX19TQ1VfUkVNT1RFX05PREVfQ09OVEVYVF9IRUFERVJfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3Rhc2tfY29udGV4dC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3Rhc2tfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjg3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfdGFza19jb250ZXh0LmgKQEAgLTAsMCArMSw5NDIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDVV9UQVNLX0NPTlRFWFRfSF8KKyNkZWZpbmUgX1NDVV9UQVNLX0NPTlRFWFRfSF8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBmb3IgdGhlIFNDVSBoYXJkd2FyZSB0YXNrCisgKiAgICBjb250ZXh0LgorICoKKyAqCisgKi8KKworCisvKioKKyAqIGVudW0gc2N1X3NzcF90YXNrX3R5cGUgLSBUaGlzIGVudW1iZXJhdGlvbiBkZWZpbmVzIHRoZSB2YXJpb3VzIFNTUCB0YXNrCisgKiAgICB0eXBlcyB0aGUgU0NVIGhhcmR3YXJlIHdpbGwgYWNjZXB0LiBUaGUgZGVmaW5pdGlvbiBmb3IgdGhlIHZhcmlvdXMgdGFzaworICogICAgdHlwZXMgdGhlIFNDVSBoYXJkd2FyZSB3aWxsIGFjY2VwdCBjYW4gYmUgZm91bmQgaW4gdGhlIERTIHNwZWNpZmljYXRpb24uCisgKgorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlTQ1VfVEFTS19UWVBFX0lPUkVBRCwgICAgICAgICAgIC8qIC88IElPIFJFQUQgZGlyZWN0aW9uIG9yIG5vIGRpcmVjdGlvbiAqLworCVNDVV9UQVNLX1RZUEVfSU9XUklURSwgICAgICAgICAgLyogLzwgSU8gV3JpdGUgZGlyZWN0aW9uICovCisJU0NVX1RBU0tfVFlQRV9TTVBfUkVRVUVTVCwgICAgICAvKiAvPCBTTVAgUmVxdWVzdCB0eXBlICovCisJU0NVX1RBU0tfVFlQRV9SRVNQT05TRSwgICAgICAgICAvKiAvPCBEcml2ZXIgZ2VuZXJhdGVkIHJlc3BvbnNlIGZyYW1lICh0YXJndCBtb2RlKSAqLworCVNDVV9UQVNLX1RZUEVfUkFXX0ZSQU1FLCAgICAgICAgLyogLzwgUmF3IGZyYW1lIHJlcXVlc3QgdHlwZSAqLworCVNDVV9UQVNLX1RZUEVfUFJJTUlUSVZFICAgICAgICAgLyogLzwgUmVxdWVzdCBmb3IgYSBwcmltaXRpdmUgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KK30gc2N1X3NzcF90YXNrX3R5cGU7CisKKy8qKgorICogZW51bSBzY3Vfc2F0YV90YXNrX3R5cGUgLSBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZhcmlvdXMgU0FUQSB0YXNrCisgKiAgICB0eXBlcyB0aGUgU0NVIGhhcmR3YXJlIHdpbGwgYWNjZXB0LiBUaGUgZGVmaW5pdGlvbiBmb3IgdGhlIHZhcmlvdXMgdGFzaworICogICAgdHlwZXMgdGhlIFNDVSBoYXJkd2FyZSB3aWxsIGFjY2VwdCBjYW4gYmUgZm91bmQgaW4gdGhlIERTIHNwZWNpZmljYXRpb24uCisgKgorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlTQ1VfVEFTS19UWVBFX0RNQV9JTiwgICAgICAgICAgIC8qIC88IFJlYWQgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfRlBETUFRX1JFQUQsICAgICAgLyogLzwgTkNRIHJlYWQgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfUEFDS0VUX0RNQV9JTiwgICAgLyogLzwgUGFja2V0IHJlYWQgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfU0FUQV9SQVdfRlJBTUUsICAgLyogLzwgUmF3IGZyYW1lIHJlcXVlc3QgKi8KKwlSRVNFUlZFRF80LAorCVJFU0VSVkVEXzUsCisJUkVTRVJWRURfNiwKKwlSRVNFUlZFRF83LAorCVNDVV9UQVNLX1RZUEVfRE1BX09VVCwgICAgICAgICAgLyogLzwgV3JpdGUgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfRlBETUFRX1dSSVRFLCAgICAgLyogLzwgTkNRIHdyaXRlIFJlcXVlc3QgKi8KKwlTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfT1VUICAgIC8qIC88IFBhY2tldCB3cml0ZSByZXF1ZXN0ICovCit9IHNjdV9zYXRhX3Rhc2tfdHlwZTsKKworCisvKioKKyAqCisgKgorICogU0NVX0NPTlRFWFRfVFlQRQorICovCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfVFlQRSAgMAorI2RlZmluZSBTQ1VfUk5DX0NPTlRFWFRfVFlQRSAgIDEKKworLyoqCisgKgorICoKKyAqIFNDVV9UQVNLX0NPTlRFWFRfVkFMSURJVFkKKyAqLworI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX0lOVkFMSUQgICAgICAgICAgMAorI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1ZBTElEICAgICAgICAgICAgMQorCisvKioKKyAqCisgKgorICogU0NVX0NPTU1BTkRfQ09ERQorICovCisjZGVmaW5lIFNDVV9DT01NQU5EX0NPREVfSU5JVElBVE9SX05FV19UQVNLICAgMAorI2RlZmluZSBTQ1VfQ09NTUFORF9DT0RFX0FDVElWRV9UQVNLICAgICAgICAgIDEKKyNkZWZpbmUgU0NVX0NPTU1BTkRfQ09ERV9QUklNSVRJVkVfU0VRX1RBU0sgICAyCisjZGVmaW5lIFNDVV9DT01NQU5EX0NPREVfVEFSR0VUX1JBV19GUkFNRVMgICAgMworCisvKioKKyAqCisgKgorICogU0NVX1RBU0tfUFJJT1JJVFkKKyAqLworLyoqCisgKgorICoKKyAqIFRoaXMgcHJpb3JpdHkgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW9yaXR5IHJlcXVlc3QgZm9yIHRoaXMgcmVxdWVzdC4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19QUklPUklUWV9OT1JNQUwgICAgICAgICAgMAorCisvKioKKyAqCisgKgorICogVGhpcyBwcmlvcml0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBzaG91bGQgYmUgc2NoZWR1bGVkIHRvIHRoZSBoZWFkIG9mIHRoZQorICogcXVldWUuICBUaGUgdGFzayB3aWxsIE5PVCBiZSBleGVjdXRlZCBpZiB0aGUgVFggaXMgc3VzcGVuZGVkIGZvciB0aGUgcmVtb3RlCisgKiBub2RlLgorICovCisjZGVmaW5lIFNDVV9UQVNLX1BSSU9SSVRZX0hFQURfT0ZfUSAgICAgICAxCisKKy8qKgorICoKKyAqCisgKiBUaGlzIHByaW9yaXR5IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIGFsbAorICogU0NVX1RBU0tfUFJJT1JJVFlfTk9STUFMIGFuZCBTQ1VfVEFTS19QUklPUklUWV9IRUFEX09GX1EgdGFza3MuIFRoZSB0YXNrCisgKiBXSUxMIGJlIGV4ZWN1dGVkIGlmIHRoZSBUWCBpcyBzdXNwZW5kZWQgZm9yIHRoZSByZW1vdGUgbm9kZS4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19QUklPUklUWV9ISUdIICAgICAgICAgICAgMgorCisvKioKKyAqCisgKgorICogVGhpcyB0YXNrIHByaW9yaXR5IGlzIHJlc2VydmVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuCisgKi8KKyNkZWZpbmUgU0NVX1RBU0tfUFJJT1JJVFlfUkVTRVJWRUQgICAgICAgIDMKKworI2RlZmluZSBTQ1VfVEFTS19JTklUSUFUT1JfTU9ERSAgICAgICAgICAgMQorI2RlZmluZSBTQ1VfVEFTS19UQVJHRVRfTU9ERSAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFNDVV9UQVNLX1JFR1VMQVIgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNDVV9UQVNLX0FCT1JURUQgICAgICAgICAgICAgICAgICAxCisKKy8qIGRpcmVjdGlvbiBiaXQgZGVmaW50aW9uICovCisvKioKKyAqCisgKgorICogU0FUQV9ESVJFQ1RJT04KKyAqLworI2RlZmluZSBTQ1VfU0FUQV9XUklURV9EQVRBX0RJUkVDVElPTiAgICAgMAorI2RlZmluZSBTQ1VfU0FUQV9SRUFEX0RBVEFfRElSRUNUSU9OICAgICAgMQorCisvKioKKyAqCisgKgorICogU0NVX0NPTU1BTkRfQ09OVEVYVF9NQUNST1MgVGhlc2UgbWFjcm9zIHByb3ZpZGUgdGhlIG1hc2sgYW5kIHNoaWZ0CisgKiBvcGVyYXRpb25zIHRvIGNvbnN0cnVjdCB0aGUgdmFyaW91cyBTQ1UgY29tbWFuZHMKKyAqLworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9TSElGVCAgICAgICAgICAgMjEKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfTUFTSyAgICAgICAgICAgIDB4MDBFMDAwMDAKKyNkZWZpbmUgc2N1X2dldF9jb21tYW5kX3JlcXVlc3RfdHlwZSh4KQlcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX01BU0spCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfU0hJRlQgICAgICAgIDE4CisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9TVUJUWVBFX01BU0sgICAgICAgICAweDAwMUMwMDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9yZXF1ZXN0X3N1YnR5cGUoeCkgXAorCSgoeCkgJiBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfU1VCVFlQRV9NQVNLKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9GVUxMVFlQRV9NQVNLCSBcCisJKFwKKwkJU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfTUFTSwkJICBcCisJCXwgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfTUFTSwkgICAgXAorCSkKKyNkZWZpbmUgc2N1X2dldF9jb21tYW5kX3JlcXVlc3RfZnVsbF90eXBlKHgpIFwKKwkoKHgpICYgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX0ZVTExUWVBFX01BU0spCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQgIDE2CisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX01BU0sgICAweDAwMDEwMDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9wcm90b2NsX2VuZ2luZV9ncm91cCh4KQlcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX01BU0spCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQgICAgICAgICAgIDEyCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX01BU0sgICAgICAgICAgICAweDAwMDA3MDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9yZXFldXN0X2xvZ2ljYWxfcG9ydCh4KQlcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX01BU0spCisKKworI2RlZmluZSBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSh0eXBlKSBcCisJKCh1MzIpKHR5cGUpIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1NISUZUKQorCisvKioKKyAqIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKCkgLQorICoKKyAqIFNDVV9DT01NQU5EX1RZUEVTIFRoZXNlIGNvbnN0YW50cyBwcm92aWRlIHRoZSBncm91cGluZyBvZiB0aGUgZGlmZmVyZW50IFNDVQorICogY29tbWFuZCB0eXBlcy4KKyAqLworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDICAgIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKDApCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX0RVTVBfVEMgICAgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1RZUEUoMSkKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9STkMgICBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSgyKQorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1JOQyAgIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKDMpCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQyAgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1RZUEUoNikKKworI2RlZmluZSBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVCh0eXBlLCBjb21tYW5kKQlcCisJKCh0eXBlKSB8ICgoY29tbWFuZCkgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfU0hJRlQpKQorCisvKioKKyAqCisgKgorICogU0NVX1JFUVVFU1RfVFlQRVMgVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgdmFyaW91cyByZXF1ZXN0IHR5cGVzIHRoYXQgY2FuIGJlCisgKiBwb3N0ZWQgdG8gdGhlIFNDVSBoYXJkd2FyZS4KKyAqLworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVTVF9QT1NUX1RDIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQywgMCkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1BPU1RfVENfQUJPUlQgXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDLCAxKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVTVF9EVU1QX1RDIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9UQywgMCkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ18zMglcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DLCAwKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DXzk2CVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9STkMsIDEpKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfSU5WQUxJREFURQlcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DLCAyKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX0RVTVBfUk5DXzMyCVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9STkMsIDApKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfRFVNUF9STkNfOTYJXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1JOQywgMSkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ19TVVNQRU5EX1RYCVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCAwKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX1NVU1BFTkRfVFhfUlggXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9PVEhFUl9STkMsIDEpKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfUkVTVU1FIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCAyKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9JVF9ORVhVU19MT1NTX1RJTUVSX0VOQUJMRSBcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQywgMykpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfSVRfTkVYVVNfTE9TU19USU1FUl9ESVNBQkxFCVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCA0KSkKKworLyoqCisgKgorICoKKyAqIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0wgU0NVIFRhc2sgY29udGV4dCBwcm90b2NvbCB0eXBlcyB0aGlzIGlzIHVlc2QgdG8KKyAqIHByb2dyYW0gdGhlIFNDVSBUYXNrIGNvbnRleHQgcHJvdG9jb2wgZmllbGQgaW4gd29yZCAweDAwLgorICovCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU01QICAgIDB4MDAKKyNkZWZpbmUgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1AgICAgMHgwMQorI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NUUCAgICAweDAyCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfTk9ORSAgIDB4MDcKKworLyoqCisgKiBzdHJ1Y3Qgc3NwX3Rhc2tfY29udGV4dCAtIFRoaXMgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uIGZvciBhbiBTU1AKKyAqICAgIHJlcXVlc3QuCisgKgorICoKKyAqLworc3RydWN0IHNzcF90YXNrX2NvbnRleHQgeworCS8qIE9GRlNFVCAweDE4ICovCisJdTMyIHJlc2VydmVkMDA6MjQ7CisJdTMyIGZyYW1lX3R5cGU6ODsKKworCS8qIE9GRlNFVCAweDFDICovCisJdTMyIHJlc2VydmVkMDE7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiBmaWxsX2J5dGVzOjI7CisJdTMyIHJlc2VydmVkMDI6NjsKKwl1MzIgY2hhbmdpbmdfZGF0YV9wb2ludGVyOjE7CisJdTMyIHJldHJhbnNtaXQ6MTsKKwl1MzIgcmV0cnlfZGF0YV9mcmFtZToxOworCXUzMiB0bHJfY29udHJvbDoyOworCXUzMiByZXNlcnZlZDAzOjE5OworCisJLyogT0ZGU0VUIDB4MjQgKi8KKwl1MzIgdWlSc3ZkNDsKKworCS8qIE9GRlNFVCAweDI4ICovCisJdTMyIHRhcmdldF9wb3J0X3RyYW5zZmVyX3RhZzoxNjsKKwl1MzIgdGFnOjE2OworCisJLyogT0ZGU0VUIDB4MkMgKi8KKwl1MzIgZGF0YV9vZmZzZXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBzdHBfdGFza19jb250ZXh0IC0gVGhpcyBpcyB0aGUgU0NVIGhhcmR3YXJlIGRlZmluaXRpb24gZm9yIGFuIFNUUAorICogICAgcmVxdWVzdC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc3RwX3Rhc2tfY29udGV4dCB7CisJLyogT0ZGU0VUIDB4MTggKi8KKwl1MzIgZmlzX3R5cGU6ODsKKwl1MzIgcG1fcG9ydDo0OworCXUzMiByZXNlcnZlZDA6MzsKKwl1MzIgY29udHJvbDoxOworCXUzMiBjb21tYW5kOjg7CisJdTMyIGZlYXR1cmVzOjg7CisKKwkvKiBPRkZTRVQgMHgxQyAqLworCXUzMiByZXNlcnZlZDE7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiByZXNlcnZlZDI7CisKKwkvKiBPRkZTRVQgMHgyNCAqLworCXUzMiByZXNlcnZlZDM7CisKKwkvKiBPRkZTRVQgMHgyOCAqLworCXUzMiBuY3FfdGFnOjU7CisJdTMyIHJlc2VydmVkNDoyNzsKKworCS8qIE9GRlNFVCAweDJDICovCisJdTMyIGRhdGFfb2Zmc2V0OyAvKiBUT0RPOiBXaGF0IGlzIHRoaXMgdXNlZCBmb3I/ICovCit9OworCisvKioKKyAqIHN0cnVjdCBzbXBfdGFza19jb250ZXh0IC0gVGhpcyBpcyB0aGUgU0NVIGhhcmR3YXJlIGRlZmluaXRpb24gZm9yIGFuIFNNUAorICogICAgcmVxdWVzdC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc21wX3Rhc2tfY29udGV4dCB7CisJLyogT0ZGU0VUIDB4MTggKi8KKwl1MzIgcmVzcG9uc2VfbGVuZ3RoOjg7CisJdTMyIGZ1bmN0aW9uX3Jlc3VsdDo4OworCXUzMiBmdW5jdGlvbjo4OworCXUzMiBmcmFtZV90eXBlOjg7CisKKwkvKiBPRkZTRVQgMHgxQyAqLworCXUzMiBzbXBfcmVzcG9uc2VfdWZpOjEyOworCXUzMiByZXNlcnZlZDE6MjA7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiByZXNlcnZlZDI7CisKKwkvKiBPRkZTRVQgMHgyNCAqLworCXUzMiByZXNlcnZlZDM7CisKKwkvKiBPRkZTRVQgMHgyOCAqLworCXUzMiByZXNlcnZlZDQ7CisKKwkvKiBPRkZTRVQgMHgyQyAqLworCXUzMiByZXNlcnZlZDU7Cit9OworCisvKioKKyAqIHN0cnVjdCBwcmltaXRpdmVfdGFza19jb250ZXh0IC0gVGhpcyBpcyB0aGUgU0NVIGhhcmR3YXJlIGRlZmluaXRpb24gdXNlZAorICogICAgd2hlbiB0aGUgZHJpdmVyIHdhbnRzIHRvIHNlbmQgYSBwcmltaXRpdmUgb24gdGhlIGxpbmsuCisgKgorICoKKyAqLworc3RydWN0IHByaW1pdGl2ZV90YXNrX2NvbnRleHQgeworCS8qIE9GRlNFVCAweDE4ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgY29udHJvbCB3b3JkIGFuZCBpdCBtdXN0IGJlIDAuCisJICovCisJdTMyIGNvbnRyb2w7IC8qIC88IG11c3QgYmUgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweDFDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHByaW1pdGl2ZSB0aGF0IGlzIHRvIGJlIHRyYW5zbWl0dGVkLgorCSAqLworCXUzMiBzZXF1ZW5jZTsKKworCS8qIE9GRlNFVCAweDIwICovCisJdTMyIHJlc2VydmVkMDsKKworCS8qIE9GRlNFVCAweDI0ICovCisJdTMyIHJlc2VydmVkMTsKKworCS8qIE9GRlNFVCAweDI4ICovCisJdTMyIHJlc2VydmVkMjsKKworCS8qIE9GRlNFVCAweDJDICovCisJdTMyIHJlc2VydmVkMzsKK307CisKKy8qKgorICogVGhlIHVuaW9uIG9mIHRoZSBwcm90b2NvbHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIFNDVSB0YXNrIGNvbnRleHQKKyAqICAgIGZpZWxkLgorICoKKyAqIHByb3RvY29sX2NvbnRleHQKKyAqLwordW5pb24gcHJvdG9jb2xfY29udGV4dCB7CisJc3RydWN0IHNzcF90YXNrX2NvbnRleHQgc3NwOworCXN0cnVjdCBzdHBfdGFza19jb250ZXh0IHN0cDsKKwlzdHJ1Y3Qgc21wX3Rhc2tfY29udGV4dCBzbXA7CisJc3RydWN0IHByaW1pdGl2ZV90YXNrX2NvbnRleHQgcHJpbWl0aXZlOworCXUzMiB3b3Jkc1s2XTsKK307CisKKy8qKgorICogc3RydWN0IHNjdV9zZ2xfZWxlbWVudCAtIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBzaW5nbGUgU0NVIGRlZmluZWQgU0dMCisgKiAgICBlbGVtZW50LiBTQ1UgU0dMcyBjb250YWluIGEgNjQgYml0IGFkZHJlc3Mgd2l0aCB0aGUgbWF4aW11bSBkYXRhIHRyYW5zZmVyCisgKiAgICBiZWluZyAyNCBiaXRzIGluIHNpemUuICBUaGUgU0dMIGNhbiBub3QgY3Jvc3MgYSA0R0IgYm91bmRhcnkuCisgKgorICogc3RydWN0IHNjdV9zZ2xfZWxlbWVudAorICovCitzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcy4KKwkgKi8KKwl1MzIgYWRkcmVzc191cHBlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIDY0IGJpdCBwaHlzaWNhbCBhZGRyZXNzLgorCSAqLworCXUzMiBhZGRyZXNzX2xvd2VyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorCSAqLworCXUzMiBsZW5ndGg6MjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBhZGRyZXNzIG1vZGlmaWVyIHRvIGJlIHVzZWQgd2hlbiBhIHZpcnR1YWwgZnVuY3Rpb24gaXMKKwkgKiByZXF1ZXN0aW5nIGEgZGF0YSB0cmFuc2Zlci4KKwkgKi8KKwl1MzIgYWRkcmVzc19tb2RpZmllcjo4OworCit9OworCisjZGVmaW5lIFNDVV9TR0xfRUxFTUVOVF9QQUlSX0EgICAwCisjZGVmaW5lIFNDVV9TR0xfRUxFTUVOVF9QQUlSX0IgICAxCisKKy8qKgorICogc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyIC0gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uCisgKiAgICBvZiBhIHBhaXIgb2YgU0dMIGVsZW1lbnRzLiBUaGUgU0NVIGhhcmR3YXJlIGFsd2F5cyB3b3JrcyBvbiBTR0wgcGFpcnMuCisgKiAgICBUaGV5IGFyZSByZWZlcmVkIHRvIGluIHRoZSBEUyBzcGVjaWZpY2F0aW9uIGFzIFNHTCBBIGFuZCBTR0wgQi4gIEVhY2ggU0dMCisgKiAgICBwYWlyIGlzIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHBhaXIuCisgKgorICoKKyAqLworc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyIHsKKwkvKiBPRkZTRVQgMHg2MC0weDY4ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgU0dMIGVsZW1lbnQgQSBvZiB0aGUgU0dMIHBhaXIuCisJICovCisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudCBBOworCisJLyogT0ZGU0VUIDB4NkMtMHg3NCAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIFNHTCBlbGVtZW50IEIgb2YgdGhlIFNHTCBwYWlyLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgQjsKKworCS8qIE9GRlNFVCAweDc4LTB4N0MgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgYWRkcmVzcyB0byB0aGUgbmV4dCBTR0wKKwkgKiBlbGVtZW50IHBhaXIuCisJICovCisJdTMyIG5leHRfcGFpcl91cHBlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIDY0IGJpdCBhZGRyZXNzIHRvIHRoZSBuZXh0IFNHTAorCSAqIGVsZW1lbnQgcGFpci4KKwkgKi8KKwl1MzIgbmV4dF9wYWlyX2xvd2VyOworCit9OworCisvKioKKyAqIHN0cnVjdCB0cmFuc3BvcnRfc25hcHNob3QgLSBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgU0NVIGhhcmR3YXJlIHNjcmF0Y2ggYXJlYQorICogICAgZm9yIHRoZSB0YXNrIGNvbnRleHQuIFRoaXMgaXMgc2V0IHRvIDAgYnkgdGhlIGRyaXZlciBidXQgY2FuIGJlIHJlYWQgYnkKKyAqICAgIGlzc3VpbmcgYSBkdW1wIFRDIHJlcXVlc3QgdG8gdGhlIFNDVS4KKyAqCisgKgorICovCitzdHJ1Y3QgdHJhbnNwb3J0X3NuYXBzaG90IHsKKwkvKiBPRkZTRVQgMHg0OCAqLworCXUzMiB4ZmVyX3JkeV93cml0ZV9kYXRhX2xlbmd0aDsKKworCS8qIE9GRlNFVCAweDRDICovCisJdTMyIGRhdGFfb2Zmc2V0OworCisJLyogT0ZGU0VUIDB4NTAgKi8KKwl1MzIgZGF0YV90cmFuc2Zlcl9zaXplOjI0OworCXUzMiByZXNlcnZlZF81MF8wOjg7CisKKwkvKiBPRkZTRVQgMHg1NCAqLworCXUzMiBuZXh0X2luaXRpYXRvcl93cml0ZV9kYXRhX29mZnNldDsKKworCS8qIE9GRlNFVCAweDU4ICovCisJdTMyIG5leHRfaW5pdGlhdG9yX3dyaXRlX2RhdGFfeGZlcl9zaXplOjI0OworCXUzMiByZXNlcnZlZF81OF8wOjg7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfdGFza19jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGVudHMgb2YgdGhlIFNDVQorICogICAgc2lsaWNvbiB0YXNrIGNvbnRleHQuIEl0IGxheXMgb3V0IGFsbCBvZiB0aGUgZmllbGRzIGFjY29yZGluZyB0byB0aGUKKyAqICAgIGV4cGVjdGVkIG9yZGVyIGFuZCBsb2NhdGlvbiBmb3IgdGhlIFN0b3JhZ2UgQ29udHJvbGxlciB1bml0LgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfdGFza19jb250ZXh0IHsKKwkvKiBPRkZTRVQgMHgwMCAtLS0tLS0gKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgZW5jb2RlZCB0byBvbmUgb2YgdGhlIHZhbGlkIFNDVSB0YXNrIHByaW9yaXR5IHZhbHVlcworCSAqICAgIC0gU0NVX1RBU0tfUFJJT1JJVFlfTk9STUFMCisJICogICAgLSBTQ1VfVEFTS19QUklPUklUWV9IRUFEX09GX1EKKwkgKiAgICAtIFNDVV9UQVNLX1BSSU9SSVRZX0hJR0gKKwkgKi8KKwl1MzIgcHJpb3JpdHk6MjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGlzIGlzIGFuIGluaXRpYXRvciBnZW5lcmF0ZWQgcmVxdWVzdC4KKwkgKiBVbnRpbCB0YXJnZXQgbW9kZSBpcyBzdXBwb3J0ZWQgYWxsIHRhc2sgcmVxdWVzdHMgYXJlIGluaXRpYXRvciByZXF1ZXN0cy4KKwkgKi8KKwl1MzIgaW5pdGlhdG9yX3JlcXVlc3Q6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gb25lIG9mIHRoZSB2YWxpZCBjb25uZWN0aW9uIHJhdGVzIHZhbGlkIHZhbHVlcworCSAqIGFyZSAweDgsIDB4OSwgYW5kIDB4QS4KKwkgKi8KKwl1MzIgY29ubmVjdGlvbl9yYXRlOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c2UgYmUgcHJvZ3JhbWVkIHdoZW4gZ2VuZXJhdGluZyBhbiBTTVAgcmVzcG9uc2Ugc2luY2UgdGhlIFNNUAorCSAqIGNvbm5lY3Rpb24gcmVtYWlucyBvcGVuIHVudGlsIHRoZSBTTVAgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkLgorCSAqLworCXUzMiBwcm90b2NvbF9lbmdpbmVfaW5kZXg6MzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBjb250YWluIHRoZSBsb2dpY2FsIHBvcnQgZm9yIHRoZSB0YXNrIHJlcXVlc3QuCisJICovCisJdTMyIGxvZ2ljYWxfcG9ydF9pbmRleDozOworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0wgdmFsdWVzCisJICogICAgLSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NNUAorCSAqICAgIC0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1AKKwkgKiAgICAtIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1RQCisJICogICAgLSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX05PTkUKKwkgKi8KKwl1MzIgcHJvdG9jb2xfdHlwZTozOworCisJLyoqCisJICogVGhpcyBmaWxlZCBtdXN0IGJlIHNldCB0byB0aGUgVENpIGFsbG9jYXRlZCBmb3IgdGhpcyB0YXNrCisJICovCisJdTMyIHRhc2tfaW5kZXg6MTI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCBtdXN0IGJlIHNldCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzAwXzA6MTsKKworCS8qKgorCSAqIEZvciBhIG5vcm1hbCB0YXNrIHJlcXVlc3QgdGhpcyBtdXN0IGJlIHNldCB0byAwLiAgSWYgdGhpcyBpcyBhbiBhYm9ydCBvZgorCSAqIHRoaXMgdGFzayByZXF1ZXN0IGl0IG11c3QgYmUgc2V0IHRvIDEuCisJICovCisJdTMyIGFib3J0OjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRydWUgZm9yIHRoZSBTQ1UgaGFyZHdhcmUgdG8gcHJvY2VzcyB0aGUgdGFzay4KKwkgKi8KKwl1MzIgdmFsaWQ6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gU0NVX1RBU0tfQ09OVEVYVF9UWVBFCisJICovCisJdTMyIGNvbnRleHRfdHlwZToxOworCisJLyogT0ZGU0VUIDB4MDQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBSTmkgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwl1MzIgcmVtb3RlX25vZGVfaW5kZXg6MTI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHByb2dyYW1tZWQgaWYgdGhpcyBpcyBhIG1pcnJvcmVkIHJlcXVlc3QsIHdoaWNoIHdlIGFyZSBub3QKKwkgKiB1c2luZywgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgUk5pIGZvciB0aGUgbWlycm9yZWQgdGFyZ2V0LgorCSAqLworCXUzMiBtaXJyb3JlZF9ub2RlX2luZGV4OjEyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBwcm9ncmFtbWVkIHdpdGggdGhlIGRpcmVjdGlvbiBvZiB0aGUgU0FUQSByZXFldXN0CisJICogICAgLSBTQ1VfU0FUQV9XUklURV9EQVRBX0RJUkVDVElPTgorCSAqICAgIC0gU0NVX1NBVEFfUkVBRF9EQVRBX0RJUkVDVElPTgorCSAqLworCXUzMiBzYXRhX2RpcmVjdGlvbjoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBwcm9ncmFtbXNlZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIFNDVV9DT01NQU5EX0NPREUKKwkgKiAgICAtIFNDVV9DT01NQU5EX0NPREVfSU5JVElBVE9SX05FV19UQVNLCisJICogICAgLSBTQ1VfQ09NTUFORF9DT0RFX0FDVElWRV9UQVNLCisJICogICAgLSBTQ1VfQ09NTUFORF9DT0RFX1BSSU1JVElWRV9TRVFfVEFTSworCSAqICAgIC0gU0NVX0NPTU1BTkRfQ09ERV9UQVJHRVRfUkFXX0ZSQU1FUworCSAqLworCXUzMiBjb21tYW5kX2NvZGU6MjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRydWUgaWYgdGhlIHJlbW90ZSBub2RlIHNob3VsZCBiZSBzdXNwZW5kZWQuCisJICogVGhpcyBiaXQgaXMgb25seSB2YWxpZCBmb3IgU1NQICYgU01QIHRhcmdldCBkZXZpY2VzLgorCSAqLworCXUzMiBzdXNwZW5kX25vZGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcHJvZ3JhbW1lZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdHlwZSBjb2RlcworCSAqCisJICogRm9yIFNBUyByZXF1ZXN0cyB1c2UgdGhlIHNjdV9zc3BfdGFza190eXBlCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0lPUkVBRAorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9JT1dSSVRFCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1NNUF9SRVFVRVNUCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1JFU1BPTlNFCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1JBV19GUkFNRQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9QUklNSVRJVkUKKwkgKgorCSAqIEZvciBTQVRBIHJlcXVlc3RzIHVzZSB0aGUgc2N1X3NhdGFfdGFza190eXBlCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0RNQV9JTgorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9GUERNQVFfUkVBRAorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9QQUNLRVRfRE1BX0lOCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1NBVEFfUkFXX0ZSQU1FCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0RNQV9PVVQKKwkgKiAgICAtIFNDVV9UQVNLX1RZUEVfRlBETUFRX1dSSVRFCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfT1VUCisJICovCisJdTMyIHRhc2tfdHlwZTo0OworCisJLyogT0ZGU0VUIDB4MDggKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgbXVzdCBiZSBzZXQgdG8gMHgwMAorCSAqLworCXUzMiBsaW5rX2xheWVyX2NvbnRyb2w6ODsgLyogcHJlc2VudGx5IGFsbCByZXNlcnZlZCAqLworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIFRMUiBpcyB0byBiZSBlbmFibGVkCisJICovCisJdTMyIHNzcF90bHJfZW5hYmxlOjE7CisKKwkvKioKKwkgKiBUaGlzIGlzIGZpZWxkIHNwZWNpZmllcyBpZiB0aGUgU0NVIERNQXMgYSByZXNwb25zZSBmcmFtZSB0byBob3N0CisJICogbWVtb3J5IGZvciBnb29kIHJlc3BvbnNlIGZyYW1lcyB3aGVuIG9wZXJhdGluZyBpbiB0YXJnZXQgbW9kZS4KKwkgKi8KKwl1MzIgZG1hX3NzcF90YXJnZXRfZ29vZF9yZXNwb25zZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgaWYgdGhlIFNDVSBzaG91bGQgRE1BIHRoZSByZXNwb25zZSBmcmFtZSB0bworCSAqIGhvc3QgbWVtb3J5LgorCSAqLworCXUzMiBkb19ub3RfZG1hX3NzcF9nb29kX3Jlc3BvbnNlOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB0byB0cnVlIHdoZW4gc3RyaWN0IG9yZGVyaW5nIGlzIHRvIGJlIGVuYWJsZWQKKwkgKi8KKwl1MzIgc3RyaWN0X29yZGVyaW5nOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgdHlwZSBvZiBlbmRpYW5lc3MgdG8gYmUgdXRpbGl6ZWQgZm9yIHRoZQorCSAqIGZyYW1lLiAgY29tbWFuZCwgdGFzaywgYW5kIHJlc3BvbnNlIGZyYW1lcyB1dGlsaXplZCBjb250cm9sX2ZyYW1lCisJICogc2V0IHRvIDEuCisJICovCisJdTMyIGNvbnRyb2xfZnJhbWU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHNldCB0byAweDAwCisJICovCisJdTMyIHRsX2NvbnRyb2xfcmVzZXJ2ZWQ6MzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgU0NVIGhhcmR3YXJlIHRhc2sgdGltZW91dCBjb250cm9sIGlzIHRvCisJICogYmUgZW5hYmxlZAorCSAqLworCXUzMiB0aW1lb3V0X2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBzaG91bGQgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcHRzX2NvbnRyb2xfcmVzZXJ2ZWQ6NzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0cnVlIHdoZW4gYmxvY2sgZ3VhcmQgaXMgdG8gYmUgZW5hYmxlZAorCSAqLworCXUzMiBibG9ja19ndWFyZF9lbmFibGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHNldCB0byAweDAwCisJICovCisJdTMyIHNkbWFfY29udHJvbF9yZXNlcnZlZDo3OworCisJLyogT0ZGU0VUIDB4MEMgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBhZGRyZXNzIG1vZGlmaWVyIGZvciB0aGlzIGlvIHJlcXVlc3QgaXQgc2hvdWxkIGJlCisJICogcHJvZ3JhbW1lZCB3aXRoIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRoYXQgaXMgbWFraW5nIHRoZSByZXF1ZXN0LgorCSAqLworCXUzMiBhZGRyZXNzX21vZGlmaWVyOjE2OworCisJLyoqCisJICogQHRvZG8gV2hhdCB3ZSBzdXBwb3J0IG1pcnJvcmVkIFNNUCByZXNwb25zZSBmcmFtZT8KKwkgKi8KKwl1MzIgbWlycm9yZWRfcHJvdG9jb2xfZW5naW5lOjM7ICAvKiBtaXJyb3JlZCBwcm90b2NvbCBFbmdpbmUgSW5kZXggKi8KKworCS8qKgorCSAqIElmIHRoaXMgaXMgYSBtaXJyb3JlZCByZXF1ZXN0IHRoZSBsb2dpY2FsIHBvcnQgaW5kZXggZm9yIHRoZSBtaXJyb3JlZCBSTmkKKwkgKiBtdXN0IGJlIHByb2dyYW1tZWQuCisJICovCisJdTMyIG1pcnJvcmVkX2xvZ2ljYWxfcG9ydDo0OyAgLyogbWlycm9yZWQgbG9jYWwgcG9ydCBpbmRleCAqLworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBtdXN0IHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzBDXzA6ODsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgbWlycm9yZWQgcmVxdWVzdCBwcm9jZXNzaW5nIGlzIHRvIGJlCisJICogZW5hYmxlZC4KKwkgKi8KKwl1MzIgbWlycm9yX3JlcXVlc3RfZW5hYmxlOjE7ICAvKiBNaXJyb3JlZCByZXF1ZXN0IEVuYWJsZSAqLworCisJLyogT0ZGU0VUIDB4MTAgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBjb21tYW5kIGl1IGxlbmd0aCBpbiBkd29yZHMKKwkgKi8KKwl1MzIgc3NwX2NvbW1hbmRfaXVfbGVuZ3RoOjg7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0YXJnZXQgVExSIGVuYWJsZSBiaXQgaXQgbXVzdCBiZSBzZXQgdG8gMCB3aGVuIGNyZWF0bmluZyB0aGUKKwkgKiB0YXNrIGNvbnRleHQuCisJICovCisJdTMyIHhmZXJfcmVhZHlfdGxyX2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBtdXN0IHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzEwXzA6NzsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1heGltdW0gYnVyc3Qgc2l6ZSB0aGF0IHRoZSBTQ1UgaGFyZHdhcmUgd2lsbCBzZW5kIGluIG9uZQorCSAqIGNvbm5lY3Rpb24gaXRzIHZhbHVlIGlzIChOIHggNTEyKSBhbmQgTiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4gIElmIHRoZQorCSAqIHZhbHVlIGlzIDB4MDAgdGhlbiBtYXhpbXVtIGJ1cnN0IHNpemUgaXMgZGlzYWJsZWQuCisJICovCisJdTMyIHNzcF9tYXhfYnVyc3Rfc2l6ZToxNjsKKworCS8qIE9GRlNFVCAweDE0ICovCisJLyoqCisJICogVGhpcyBmaWxlZCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcmVkIGluIHRoZSByZXF1ZXN0LgorCSAqLworCXUzMiB0cmFuc2Zlcl9sZW5ndGhfYnl0ZXM6MjQ7IC8qIEluIHRlcm1zIG9mIGJ5dGVzICovCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIHNob3VsZCBzZXQgaXQgdG8gMHgwMAorCSAqLworCXUzMiByZXNlcnZlZF8xNF8wOjg7CisKKwkvKiBPRkZTRVQgMHgxOC0weDJDICovCisJLyoqCisJICogVGhpcyB1bmlvbiBwcm92aWRlcyBmb3IgdGhlIHByb3RvY29sIHNwZWNpZiBwYXJ0IG9mIHRoZSBTQ1UgVGFzayBDb250ZXh0LgorCSAqLworCXVuaW9uIHByb3RvY29sX2NvbnRleHQgdHlwZTsKKworCS8qIE9GRlNFVCAweDMwLTB4MzQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiBjb21tYW5kIGl1IGJ1ZmZlcgorCSAqLworCXUzMiBjb21tYW5kX2l1X3VwcGVyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisJICogY29tbWFuZCBpdSBidWZmZXIKKwkgKi8KKwl1MzIgY29tbWFuZF9pdV9sb3dlcjsKKworCS8qIE9GRlNFVCAweDM4LTB4M0MgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiByZXNwb25zZSBpdSBidWZmZXIKKwkgKi8KKwl1MzIgcmVzcG9uc2VfaXVfdXBwZXI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiByZXNwb25zZSBpdSBidWZmZXIKKwkgKi8KKwl1MzIgcmVzcG9uc2VfaXVfbG93ZXI7CisKKwkvKiBPRkZTRVQgMHg0MCAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRoZSB0YXNrIHBoYXNlIG9mIHRoZSBTQ1UgaGFyZHdhcmUuIFRoZSBkcml2ZXIgbXVzdAorCSAqIHNldCB0aGlzIHRvIDB4MDEKKwkgKi8KKwl1MzIgdGFza19waGFzZTo4OworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBzZXQgdG8gdGhlIHRyYW5zcG9ydCBsYXllciB0YXNrIHN0YXR1cy4gIFRoZSBkcml2ZXIgbXVzdCBzZXQKKwkgKiB0aGlzIHRvIDB4MDAKKwkgKi8KKwl1MzIgdGFza19zdGF0dXM6ODsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdXNlZCBkdXJpbmcgaW5pdGlhdG9yIHdyaXRlIFRMUgorCSAqLworCXUzMiBwcmV2aW91c19leHRlbmRlZF90YWc6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciBhIFNUUCBub24tZGF0YSBGSVMKKwkgKi8KKwl1MzIgc3RwX3JldHJ5X2NvdW50OjI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIG11c3Qgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcmVzZXJ2ZWRfNDBfMToyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHRoZSBTQ1UgVEwgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gdGFrZSBhIHNuYXBzaG90IHdoZW4KKwkgKiB0cmFubWl0dGluZyByZWFkIGRhdGEgZnJhbWVzLgorCSAqICAgIC0gMHgwMCBUaGUgZW50aXJlIElPCisJICogICAgLSAweDAxIDMyaworCSAqICAgIC0gMHgwMiA2NGsKKwkgKiAgICAtIDB4MDQgMTI4aworCSAqICAgIC0gMHgwOCAyNTZrCisJICovCisJdTMyIHNzcF90bHJfdGhyZXNob2xkOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIG11c3Qgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcmVzZXJ2ZWRfNDBfMjo0OworCisJLyogT0ZGU0VUIDB4NDQgKi8KKwl1MzIgd3JpdGVfZGF0YV9sZW5ndGg7IC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCisJLyogT0ZGU0VUIDB4NDgtMHg1OCAqLworCXN0cnVjdCB0cmFuc3BvcnRfc25hcHNob3Qgc25hcHNob3Q7IC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCisJLyogT0ZGU0VUIDB4NUMgKi8KKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9lbmFibGU6MTsKKwl1MzIgYmxvY2tfc2l6ZToyOworCXUzMiBibG9ja19wcm90ZWN0aW9uX2Z1bmN0aW9uOjI7CisJdTMyIHJlc2VydmVkXzVDXzA6OTsKKwl1MzIgYWN0aXZlX3NnbF9lbGVtZW50OjI7ICAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKwl1MzIgc2dsX2V4aGF1c3RlZDoxOyAgLyogcmVhZCBvbmx5IHNldCB0byAwICovCisJdTMyIHBheWxvYWRfZGF0YV90cmFuc2Zlcl9lcnJvcjo0OyAgLyogcmVhZCBvbmx5IHNldCB0byAwICovCisJdTMyIGZyYW1lX2J1ZmZlcl9vZmZzZXQ6MTE7IC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCisJLyogT0ZGU0VUIDB4NjAtMHg3QyAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGZpcnN0IFNHTCBlbGVtZW50IHBhaXIgZm91bmQgaW4gdGhlIFRDIGRhdGEgc3RydWN0dXJlLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ2xfcGFpcl9hYjsKKwkvKiBPRkZTRVQgMHg4MC0weDlDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgc2Vjb25kIFNHTCBlbGVtZW50IHBhaXIgZm91bmQgaW4gdGhlIFRDIGRhdGEgc3RydWN0dXJlLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ2xfcGFpcl9jZDsKKworCS8qIE9GRlNFVCAweEEwLUJDICovCisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyIHNnbF9zbmFwc2hvdF9hYzsKKworCS8qIE9GRlNFVCAweEMwICovCisJdTMyIGFjdGl2ZV9zZ2xfZWxlbWVudF9wYWlyOyAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweEM0LTB4Q0MgKi8KKwl1MzIgcmVzZXJ2ZWRfQzRfQ0NbM107CisKKwkvKiBPRkZTRVQgMHhEMCAqLworCXUzMiBpbnRlcm1lZGlhdGVfY3JjX3ZhbHVlOjE2OworCXUzMiBpbml0aWFsX2NyY19zZWVkOjE2OworCisJLyogT0ZGU0VUIDB4RDQgKi8KKwl1MzIgYXBwbGljYXRpb25fdGFnX2Zvcl92ZXJpZnk6MTY7CisJdTMyIGFwcGxpY2F0aW9uX3RhZ19mb3JfZ2VuZXJhdGU6MTY7CisKKwkvKiBPRkZTRVQgMHhEOCAqLworCXUzMiByZWZlcmVuY2VfdGFnX3NlZWRfZm9yX3ZlcmlmeV9mdW5jdGlvbjsKKworCS8qIE9GRlNFVCAweERDICovCisJdTMyIHJlc2VydmVkX0RDOworCisJLyogT0ZGU0VUIDB4RTAgKi8KKwl1MzIgcmVzZXJ2ZWRfRTBfMDoxNjsKKwl1MzIgYXBwbGljYXRpb25fdGFnX21hc2tfZm9yX2dlbmVyYXRlOjE2OworCisJLyogT0ZGU0VUIDB4RTQgKi8KKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9jb250cm9sOjE2OworCXUzMiBhcHBsaWNhdGlvbl90YWdfbWFza19mb3JfdmVyaWZ5OjE2OworCisJLyogT0ZGU0VUIDB4RTggKi8KKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9lcnJvcjo4OworCXUzMiByZXNlcnZlZF9FOF8wOjI0OworCisJLyogT0ZGU0VUIDB4RUMgKi8KKwl1MzIgcmVmZXJlbmNlX3RhZ19zZWVkX2Zvcl92ZXJpZnk7CisKKwkvKiBPRkZTRVQgMHhGMCAqLworCXUzMiBpbnRlcm1lZGlhdGVfY3JjX3ZhbGlkX3NuYXBzaG90OjE2OworCXUzMiByZXNlcnZlZF9GMF8wOjE2OworCisJLyogT0ZGU0VUIDB4RjQgKi8KKwl1MzIgcmVmZXJlbmNlX3RhZ19zZWVkX2Zvcl92ZXJpZnlfZnVuY3Rpb25fc25hcHNob3Q7CisKKwkvKiBPRkZTRVQgMHhGOCAqLworCXUzMiBzbmFwc2hvdF9vZl9yZXNlcnZlZF9kd29yZF9EQ19vZl90YzsKKworCS8qIE9GRlNFVCAweEZDICovCisJdTMyIHJlZmVyZW5jZV90YWdfc2VlZF9mb3JfZ2VuZXJhdGVfZnVuY3Rpb25fc25hcHNob3Q7CisKK307CisKKyNlbmRpZiAvKiBfU0NVX1RBU0tfQ09OVEVYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmNkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmMKQEAgLTAsMCArMSwxNjc2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CisjaW5jbHVkZSAic2FzLmgiCisjaW5jbHVkZSA8c2NzaS9saWJzYXMuaD4KKyNpbmNsdWRlICJyZW1vdGVfZGV2aWNlLmgiCisjaW5jbHVkZSAicmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImhvc3QuaCIKKworLyoqCisqIGlzY2lfdGFza19yZWZ1c2UoKSAtIGNvbXBsZXRlIHRoZSByZXF1ZXN0IHRvIHRoZSB1cHBlciBsYXllciBkcml2ZXIgaW4KKyogICAgIHRoZSBjYXNlIHdoZXJlIGFuIEkvTyBuZWVkcyB0byBiZSBjb21wbGV0ZWQgYmFjayBpbiB0aGUgc3VibWl0IHBhdGguCisqIEBpaG9zdDogaG9zdCBvbiB3aGljaCB0aGUgdGhlIHJlcXVlc3Qgd2FzIHF1ZXVlZAorKiBAdGFzazogcmVxdWVzdCB0byBjb21wbGV0ZQorKiBAcmVzcG9uc2U6IHJlc3BvbnNlIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyogQHN0YXR1czogc3RhdHVzIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyoKKyovCitzdGF0aWMgdm9pZCBpc2NpX3Rhc2tfcmVmdXNlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJCQkgICAgIGVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSwKKwkJCSAgICAgZW51bSBleGVjX3N0YXR1cyBzdGF0dXMpCisKK3sKKwllbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24gZGlzcG9zaXRpb247CisKKwlkaXNwb3NpdGlvbiA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwlkaXNwb3NpdGlvbiA9IGlzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXModGFzaywgcmVzcG9uc2UsIHN0YXR1cywKKwkJCQkJCSAgICAgIGRpc3Bvc2l0aW9uKTsKKworCS8qIFRhc2tzIGFib3J0ZWQgc3BlY2lmaWNhbGx5IGJ5IGEgY2FsbCB0byB0aGUgbGxkZF9hYm9ydF90YXNrCisJICogZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjb21wbGV0ZWQgdG8gdGhlIGhvc3QgaW4gdGhlIHJlZ3VsYXIgcGF0aC4KKwkgKi8KKwlzd2l0Y2ggKGRpc3Bvc2l0aW9uKSB7CisJY2FzZSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb246CisJCS8qIE5vcm1hbCBub3RpZmljYXRpb24gKHRhc2tfZG9uZSkgKi8KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogTm9ybWFsIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCwgIgorCQkJInN0YXR1cz0lZFxuIiwKKwkJCV9fZnVuY19fLCB0YXNrLCByZXNwb25zZSwgc3RhdHVzKTsKKworCQl0YXNrLT5sbGRkX3Rhc2sgPSBOVUxMOworCisJCWlzY2lfZXhlY3BhdGhfY2FsbGJhY2soaWhvc3QsIHRhc2ssIHRhc2stPnRhc2tfZG9uZSk7CisJCWJyZWFrOworCisJY2FzZSBpc2NpX3BlcmZvcm1fYWJvcnRlZF9pb19jb21wbGV0aW9uOgorCQkvKgorCQkgKiBObyBub3RpZmljYXRpb24gYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgYWxyZWFkeSBpbiB0aGUKKwkJICogYWJvcnQgcGF0aC4KKwkJICovCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IEFib3J0ZWQgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkLCAiCisJCQkic3RhdHVzPSVkXG4iLAorCQkJX19mdW5jX18sIHRhc2ssIHJlc3BvbnNlLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb246CisJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBFcnJvciAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQsICIKKwkJCSJzdGF0dXM9JWRcbiIsCisJCQlfX2Z1bmNfXywgdGFzaywgcmVzcG9uc2UsIHN0YXR1cyk7CisKKwkJaXNjaV9leGVjcGF0aF9jYWxsYmFjayhpaG9zdCwgdGFzaywgc2FzX3Rhc2tfYWJvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlzY2kgdGFzayBub3RpZmljYXRpb24gZGVmYXVsdCBjYXNlISIsCisJCQlfX2Z1bmNfXyk7CisJCXNhc190YXNrX2Fib3J0KHRhc2spOworCQlicmVhazsKKwl9Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfc2FzX3Rhc2sobnVtLCB0YXNrKSBcCisJZm9yICg7IG51bSA+IDA7IG51bS0tLFwKKwkgICAgIHRhc2sgPSBsaXN0X2VudHJ5KHRhc2stPmxpc3QubmV4dCwgc3RydWN0IHNhc190YXNrLCBsaXN0KSkKKworCitzdGF0aWMgaW5saW5lIGludCBpc2NpX2RldmljZV9pb19yZWFkeShzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJcmV0dXJuIGlkZXYgPyB0ZXN0X2JpdChJREVWX0lPX1JFQURZLCAmaWRldi0+ZmxhZ3MpIHx8CisJCSAgICAgICh0ZXN0X2JpdChJREVWX0lPX05DUUVSUk9SLCAmaWRldi0+ZmxhZ3MpICYmCisJCSAgICAgICBpc2NpX3Rhc2tfaXNfbmNxX3JlY292ZXJ5KHRhc2spKQorCQkgICAgOiAwOworfQorLyoqCisgKiBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIG9uZSBvZiB0aGUgU0FTIERvbWFpbiBUZW1wbGF0ZQorICogICAgZnVuY3Rpb25zLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgdG8gc2VuZCBhIHRhc2sgZG93biB0bworICogICAgaGFyZHdhcmUuCisgKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBTQVMgdGFzayB0byBzZW5kLgorICogQG51bTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGFza3MgdG8gcXVldWUuCisgKiBAZ2ZwX2ZsYWdzOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvbnRleHQgb2YgdGhpcyBjYWxsLgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfdGFza19leGVjdXRlX3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrLCBpbnQgbnVtLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBkZXZfdG9faWhvc3QodGFzay0+ZGV2KTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBpb19yZWFkeTsKKwl1MTYgdGFnOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBudW09JWRcbiIsIF9fZnVuY19fLCBudW0pOworCisJZm9yX2VhY2hfc2FzX3Rhc2sobnVtLCB0YXNrKSB7CisJCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlpZGV2ID0gaXNjaV9sb29rdXBfZGV2aWNlKHRhc2stPmRldik7CisJCWlvX3JlYWR5ID0gaXNjaV9kZXZpY2VfaW9fcmVhZHkoaWRldiwgdGFzayk7CisJCXRhZyA9IGlzY2lfYWxsb2NfdGFnKGlob3N0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkidGFzazogJXAsIG51bTogJWQgZGV2OiAlcCBpZGV2OiAlcDolI2x4IGNtZCA9ICVwXG4iLAorCQkJdGFzaywgbnVtLCB0YXNrLT5kZXYsIGlkZXYsIGlkZXYgPyBpZGV2LT5mbGFncyA6IDAsCisJCQl0YXNrLT51bGRkX3Rhc2spOworCisJCWlmICghaWRldikgeworCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywgU0FTX1RBU0tfVU5ERUxJVkVSRUQsCisJCQkJCSBTQVNfREVWSUNFX1VOS05PV04pOworCQl9IGVsc2UgaWYgKCFpb19yZWFkeSB8fCB0YWcgPT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpIHsKKwkJCS8qIEluZGljYXRlIFFVRVVFX0ZVTEwgc28gdGhhdCB0aGUgc2NzaSBtaWRsYXllcgorCQkJICogcmV0cmllcy4KKwkJCSAgKi8KKwkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssIFNBU19UQVNLX0NPTVBMRVRFLAorCQkJCQkgU0FTX1FVRVVFX0ZVTEwpOworCQl9IGVsc2UgeworCQkJLyogVGhlcmUgaXMgYSBkZXZpY2UgYW5kIGl0J3MgcmVhZHkgZm9yIEkvTy4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSB7CisJCQkJLyogVGhlIEkvTyB3YXMgYWJvcnRlZC4gKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCisJCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywKKwkJCQkJCSBTQVNfVEFTS19VTkRFTElWRVJFRCwKKwkJCQkJCSBTQU1fU1RBVF9UQVNLX0FCT1JURUQpOworCQkJfSBlbHNlIHsKKwkJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX0FUX0lOSVRJQVRPUjsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSByZXF1ZXN0LiAqLworCQkJCXN0YXR1cyA9IGlzY2lfcmVxdWVzdF9leGVjdXRlKGlob3N0LCBpZGV2LCB0YXNrLCB0YWcpOworCisJCQkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCQkJLyogRGlkIG5vdCByZWFsbHkgc3RhcnQgdGhpcyBjb21tYW5kLiAqLworCQkJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJCQkJCS8qIEluZGljYXRlIFFVRVVFX0ZVTEwgc28gdGhhdCB0aGUgc2NzaQorCQkJCQkqIG1pZGxheWVyIHJldHJpZXMuIGlmIHRoZSByZXF1ZXN0CisJCQkJCSogZmFpbGVkIGZvciByZW1vdGUgZGV2aWNlIHJlYXNvbnMsCisJCQkJCSogaXQgZ2V0cyByZXR1cm5lZCBhcworCQkJCQkqIFNBU19UQVNLX1VOREVMSVZFUkVEIG5leHQgdGltZQorCQkJCQkqIHRocm91Z2guCisJCQkJCSovCisJCQkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssCisJCQkJCQkJIFNBU19UQVNLX0NPTVBMRVRFLAorCQkJCQkJCSBTQVNfUVVFVUVfRlVMTCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MgJiYgdGFnICE9IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQkJLyogY29tbWFuZCBuZXZlciBoaXQgdGhlIGRldmljZSwgc28ganVzdCBmcmVlCisJCQkgKiB0aGUgdGNpIGFuZCBza2lwIHRoZSBzZXF1ZW5jZSBpbmNyZW1lbnQKKwkJCSAqLworCQkJaXNjaV90Y2lfZnJlZShpaG9zdCwgSVNDSV9UQUdfVENJKHRhZykpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQl9CisJCWlzY2lfcHV0X2RldmljZShpZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9zYXRhX21hbmFnZW1lbnRfdGFza19yZXF1ZXN0X2J1aWxkKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKHRtZl90YXNrICE9IGlyZXEtPnR0eXBlKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisKKwlpc2NpX3RtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJc3dpdGNoIChpc2NpX3RtZi0+dG1mX2NvZGUpIHsKKworCWNhc2UgaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2g6CisJY2FzZSBpc2NpX3RtZl9zYXRhX3Nyc3RfbG93OiB7CisJCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmZpcyA9ICZpcmVxLT5zdHAuY21kOworCisJCW1lbXNldChmaXMsIDAsIHNpemVvZigqZmlzKSk7CisKKwkJZmlzLT5maXNfdHlwZSAgPSAgMHgyNzsKKwkJZmlzLT5mbGFncyAgICAgJj0gfjB4ODA7CisJCWZpcy0+ZmxhZ3MgICAgICY9IDB4RjA7CisJCWlmIChpc2NpX3RtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2gpCisJCQlmaXMtPmNvbnRyb2wgfD0gQVRBX1NSU1Q7CisJCWVsc2UKKwkJCWZpcy0+Y29udHJvbCAmPSB+QVRBX1NSU1Q7CisJCWJyZWFrOworCX0KKwkvKiBvdGhlciBtYW5hZ2VtZW50IGNvbW1uZCBnbyBoZXJlLi4uICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCS8qIGNvcmUgYnVpbGRzIHRoZSBwcm90b2NvbCBzcGVjaWZpYyByZXF1ZXN0CisJICogIGJhc2VkIG9uIHRoZSBoMmQgZmlzLgorCSAqLworCXN0YXR1cyA9IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NhdGEoaXJlcSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV90YXNrX3JlcXVlc3RfYnVpbGQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQkgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgICB1MTYgdGFnLCBzdHJ1Y3QgaXNjaV90bWYgKmlzY2lfdG1mKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRTsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gTlVMTDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2OworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3RtZiA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV90bWYpOworCisJZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCS8qIGRvIGNvbW1vbiBhbGxvY2F0aW9uIGFuZCBpbml0IG9mIHJlcXVlc3Qgb2JqZWN0LiAqLworCWlyZXEgPSBpc2NpX3RtZl9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCBpc2NpX3RtZiwgdGFnKTsKKwlpZiAoIWlyZXEpCisJCXJldHVybiBOVUxMOworCisJLyogbGV0IHRoZSBjb3JlIGRvIGl0J3MgY29uc3RydWN0LiAqLworCXN0YXR1cyA9IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0KGlob3N0LCBpZGV2LCB0YWcsCisJCQkJCSAgICAgaXJlcSk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3QgZmFpbGVkIC0gIgorCQkJICJzdGF0dXMgPSAweCV4XG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0YXR1cyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFhYWCBjb252ZXJ0IHRvIGdldCB0aGlzIGZyb20gdGFzay0+dHByb3RvIGxpa2Ugb3RoZXIgZHJpdmVycyAqLworCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKSB7CisJCWlzY2lfdG1mLT5wcm90byA9IFNBU19QUk9UT0NPTF9TU1A7CisJCXN0YXR1cyA9IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NzcChpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCWlzY2lfdG1mLT5wcm90byA9IFNBU19QUk9UT0NPTF9TQVRBOworCQlzdGF0dXMgPSBpc2NpX3NhdGFfbWFuYWdlbWVudF90YXNrX3JlcXVlc3RfYnVpbGQoaXJlcSk7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gaXJlcTsKK30KKworc3RhdGljIGludCBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJIHN0cnVjdCBpc2NpX3RtZiAqdG1mLCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXMpCit7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGxldGlvbik7CisJZW51bSBzY2lfdGFza19zdGF0dXMgc3RhdHVzID0gU0NJX1RBU0tfRkFJTFVSRTsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCWludCByZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CisJdTE2IHRhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJdGFnID0gaXNjaV9hbGxvY190YWcoaWhvc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0YWcgPT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpCisJCXJldHVybiByZXQ7CisKKwkvKiBzYW5pdHkgY2hlY2ssIHJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRAorCSAqIGlmIHRoZSBkZXZpY2UgaXMgbm90IHRoZXJlIGFuZCByZWFkeS4KKwkgKi8KKwlpZiAoIWlkZXYgfHwKKwkgICAgKCF0ZXN0X2JpdChJREVWX0lPX1JFQURZLCAmaWRldi0+ZmxhZ3MpICYmCisJICAgICAhdGVzdF9iaXQoSURFVl9JT19OQ1FFUlJPUiwgJmlkZXYtPmZsYWdzKSkpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaWRldiA9ICVwIG5vdCByZWFkeSAoJSNseClcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlkZXYsIGlkZXYgPyBpZGV2LT5mbGFncyA6IDApOworCQlnb3RvIGVycl90Y2k7CisJfSBlbHNlCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlkZXYgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpZGV2KTsKKworCS8qIEFzc2lnbiB0aGUgcG9pbnRlciB0byB0aGUgVE1GJ3MgY29tcGxldGlvbiBrZXJuZWwgd2FpdCBzdHJ1Y3R1cmUuICovCisJdG1mLT5jb21wbGV0ZSA9ICZjb21wbGV0aW9uOworCisJaXJlcSA9IGlzY2lfdGFza19yZXF1ZXN0X2J1aWxkKGlob3N0LCBpZGV2LCB0YWcsIHRtZik7CisJaWYgKCFpcmVxKQorCQlnb3RvIGVycl90Y2k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogc3RhcnQgdGhlIFRNRiBpby4gKi8KKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKGlob3N0LCBpZGV2LCBpcmVxKTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1RBU0tfU1VDQ0VTUykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogc3RhcnRfaW8gZmFpbGVkIC0gc3RhdHVzID0gMHgleCwgcmVxdWVzdCA9ICVwXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0YXR1cywKKwkJCSBpcmVxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlnb3RvIGVycl90Y2k7CisJfQorCisJaWYgKHRtZi0+Y2Jfc3RhdGVfZnVuYyAhPSBOVUxMKQorCQl0bWYtPmNiX3N0YXRlX2Z1bmMoaXNjaV90bWZfc3RhcnRlZCwgdG1mLCB0bWYtPmNiX2RhdGEpOworCisJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBzdGFydGVkKTsKKworCS8qIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUgcmVtb3RlIGRldmljZSByZXF1ZXN0IGxpc3QuICovCisJbGlzdF9hZGQoJmlyZXEtPmRldl9ub2RlLCAmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCS8qIFdhaXQgZm9yIHRoZSBUTUYgdG8gY29tcGxldGUsIG9yIGEgdGltZW91dC4gKi8KKwl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29tcGxldGlvbiwKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcykpOworCisJaWYgKHRpbWVsZWZ0ID09IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQlpZiAodG1mLT5jYl9zdGF0ZV9mdW5jICE9IE5VTEwpCisJCQl0bWYtPmNiX3N0YXRlX2Z1bmMoaXNjaV90bWZfdGltZWRfb3V0LCB0bWYsIHRtZi0+Y2JfZGF0YSk7CisKKwkJc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QoaWhvc3QsCisJCQkJCQkgIGlkZXYsCisJCQkJCQkgIGlyZXEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKHRtZi0+Y29tcGxldGUpOworCX0KKworCWlzY2lfcHJpbnRfdG1mKHRtZik7CisKKwlpZiAodG1mLT5zdGF0dXMgPT0gU0NJX1NVQ0NFU1MpCisJCXJldCA9ICBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCWVsc2UgaWYgKHRtZi0+c3RhdHVzID09IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHRtZi5zdGF0dXMgPT0gIgorCQkJIlNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAgVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwl9CisJLyogRWxzZSAtIGxlYXZlIHRoZSBkZWZhdWx0ICJmYWlsZWQiIHN0YXR1cyBhbG9uZS4gKi8KKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogY29tcGxldGVkIHJlcXVlc3QgPSAlcFxuIiwKKwkJX19mdW5jX18sCisJCWlyZXEpOworCisJcmV0dXJuIHJldDsKKworIGVycl90Y2k6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpc2NpX3RjaV9mcmVlKGlob3N0LCBJU0NJX1RBR19UQ0kodGFnKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXNjaV90YXNrX2J1aWxkX3RtZihzdHJ1Y3QgaXNjaV90bWYgKnRtZiwKKwkJCQllbnVtIGlzY2lfdG1mX2Z1bmN0aW9uX2NvZGVzIGNvZGUsCisJCQkJdm9pZCAoKnRtZl9zZW50X2NiKShlbnVtIGlzY2lfdG1mX2NiX3N0YXRlLAorCQkJCQkJICAgIHN0cnVjdCBpc2NpX3RtZiAqLAorCQkJCQkJICAgIHZvaWQgKiksCisJCQkJdm9pZCAqY2JfZGF0YSkKK3sKKwltZW1zZXQodG1mLCAwLCBzaXplb2YoKnRtZikpOworCisJdG1mLT50bWZfY29kZSAgICAgID0gY29kZTsKKwl0bWYtPmNiX3N0YXRlX2Z1bmMgPSB0bWZfc2VudF9jYjsKKwl0bWYtPmNiX2RhdGEgICAgICAgPSBjYl9kYXRhOworfQorCitzdGF0aWMgdm9pZCBpc2NpX3Rhc2tfYnVpbGRfYWJvcnRfdGFza190bWYoc3RydWN0IGlzY2lfdG1mICp0bWYsCisJCQkJCSAgIGVudW0gaXNjaV90bWZfZnVuY3Rpb25fY29kZXMgY29kZSwKKwkJCQkJICAgdm9pZCAoKnRtZl9zZW50X2NiKShlbnVtIGlzY2lfdG1mX2NiX3N0YXRlLAorCQkJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV90bWYgKiwKKwkJCQkJCQkgICAgICAgdm9pZCAqKSwKKwkJCQkJICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqb2xkX3JlcXVlc3QpCit7CisJaXNjaV90YXNrX2J1aWxkX3RtZih0bWYsIGNvZGUsIHRtZl9zZW50X2NiLCBvbGRfcmVxdWVzdCk7CisJdG1mLT5pb190YWcgPSBvbGRfcmVxdWVzdC0+aW9fdGFnOworfQorCisvKioKKyAqIGlzY2lfdGFza192YWxpZGF0ZV9yZXF1ZXN0X3RvX2Fib3J0KCkgLSBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZ2l2ZW4gSS9PCisgKiAgICBhZ2FpbnN0IHRoZSAic3RhcnRlZCIgc3RhdGUuICBJZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCAic3RhcnRlZCIsIGl0J3MKKyAqICAgIHN0YXRlIGlzIGNoYW5nZWQgdG8gYWJvcnRlZC4gTk9URTogaXNjaV9ob3N0LT5zY2ljX2xvY2sgTVVTVCBCRSBIRUxECisgKiAgICBCRUZPUkUgQ0FMTElORyBUSElTIEZVTkNUSU9OLgorICogQGlzY2lfcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZXF1ZXN0IG9iamVjdCB0byBjb250cm9sLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisgKiBAaXNjaV9kZXZpY2U6IFRoaXMgaXMgdGhlIGRldmljZSB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBwZW5kaW5nLgorICogQGFib3J0ZWRfaW9fY29tcGxldGlvbjogVGhpcyBpcyBhIGNvbXBsZXRpb24gc3RydWN0dXJlIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICogICAgdGhlIHJlcXVlc3QgaW4gY2FzZSBpdCBpcyBjaGFuZ2VkIHRvIGFib3J0aW5nOyB0aGlzIGNvbXBsZXRpb24gaXMKKyAqICAgIHRyaWdnZXJlZCB3aGVuIHRoZSByZXF1ZXN0IGlzIGZ1bGx5IGNvbXBsZXRlZC4KKyAqCisgKiBFaXRoZXIgInN0YXJ0ZWQiIG9uIHN1Y2Nlc3NmdWwgY2hhbmdlIG9mIHRoZSB0YXNrIHN0YXR1cyB0byAiYWJvcnRlZCIsIG9yCisgKiAidW5hbGxvY2F0ZWQiIGlmIHRoZSB0YXNrIGNhbm5vdCBiZSBjb250cm9sbGVkLgorICovCitzdGF0aWMgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIGlzY2lfdGFza192YWxpZGF0ZV9yZXF1ZXN0X3RvX2Fib3J0KAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdCwKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UsCisJc3RydWN0IGNvbXBsZXRpb24gKmFib3J0ZWRfaW9fY29tcGxldGlvbikKK3sKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgb2xkX3N0YXRlID0gdW5hbGxvY2F0ZWQ7CisKKwkvKiBPbmx5IGFib3J0IHRoZSB0YXNrIGlmIGl0J3MgaW4gdGhlCisJICogIGRldmljZSdzIHJlcXVlc3RfaW5fcHJvY2VzcyBsaXN0CisJICovCisJaWYgKGlzY2lfcmVxdWVzdCAmJiAhbGlzdF9lbXB0eSgmaXNjaV9yZXF1ZXN0LT5kZXZfbm9kZSkpIHsKKwkJb2xkX3N0YXRlID0gaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX2Fib3J0ZWQoCisJCQlpc2NpX3JlcXVlc3QsIGFib3J0ZWRfaW9fY29tcGxldGlvbik7CisKKwl9CisKKwlyZXR1cm4gb2xkX3N0YXRlOworfQorCisvKioKKyogaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mCisqICAgIHRoZSBmaW5hbCBjbGVhbnVwIG9uIGFueSByZXF1ZXN0IHdoaWNoIGhhcyBiZWVuIGV4cGxpY2l0bHkgdGVybWluYXRlZC4KKyogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisqIEBpc2NpX2RldmljZTogVGhpcyBpcyB0aGUgZGV2aWNlIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIHBlbmRpbmcuCisqIEBpc2NpX3JlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdGVybWluYXRlZCByZXF1ZXN0IG9iamVjdC4KKyogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBsaWJzYXMgSS9PIHJlcXVlc3QuCisqLworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKAorCXN0cnVjdCBpc2NpX2hvc3QgICAgICAgICAgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICAgICAgICppc2NpX3JlcXVlc3QsCisJc3RydWN0IHNhc190YXNrICAgICAgICAgICAqdGFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2U9JXAsIHJlcXVlc3Q9JXAsIHRhc2s9JXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2RldmljZSwgaXNjaV9yZXF1ZXN0LCB0YXNrKTsKKworCWlmICh0YXNrICE9IE5VTEwpIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPmxsZGRfdGFzayA9IE5VTEw7CisKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisKKwkJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7CisKKwkJLyogSWYgdGhpcyB0YXNrIGlzIG5vdCBpbiB0aGUgYWJvcnQgcGF0aCwgY2FsbCB0YXNrX2RvbmUuICovCisJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkgeworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKKwkJfSBlbHNlCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoaXNjaV9yZXF1ZXN0ICE9IE5VTEwpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWxpc3RfZGVsX2luaXQoJmlzY2lfcmVxdWVzdC0+ZGV2X25vZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rlcm1pbmF0ZV9yZXF1ZXN0X2NvcmUoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCB0ZXJtaW5hdGUgdGhlIGdpdmVuCisgKiAgICByZXF1ZXN0LCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQKKyAqICAgIGZyb20gYSB0aHJlYWQgdGhhdCBjYW4gd2FpdC4gIE5vdGUgdGhhdCB0aGUgcmVxdWVzdCBpcyB0ZXJtaW5hdGVkIGFuZAorICogICAgY29tcGxldGVkIChiYWNrIHRvIHRoZSBob3N0LCBpZiBzdGFydGVkIHRoZXJlKS4KKyAqIEBpaG9zdDogVGhpcyBTQ1UuCisgKiBAaWRldjogVGhlIHRhcmdldC4KKyAqIEBpc2NpX3JlcXVlc3Q6IFRoZSBJL08gcmVxdWVzdCB0byBiZSB0ZXJtaW5hdGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV90ZXJtaW5hdGVfcmVxdWVzdF9jb3JlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyAgICAgID0gU0NJX1NVQ0NFU1M7CisJYm9vbCB3YXNfdGVybWluYXRlZCAgICAgICAgID0gZmFsc2U7CisJYm9vbCBuZWVkc19jbGVhbnVwX2hhbmRsaW5nID0gZmFsc2U7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHJlcXVlc3Rfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICAgIHRlcm1pbmF0aW9uX2NvbXBsZXRlZCA9IDE7CisJc3RydWN0IGNvbXBsZXRpb24gKmlvX3JlcXVlc3RfY29tcGxldGlvbjsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgICAqdGFzazsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogZGV2aWNlID0gJXA7IHJlcXVlc3QgPSAlcFxuIiwKKwkJX19mdW5jX18sIGlkZXYsIGlzY2lfcmVxdWVzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaW9fcmVxdWVzdF9jb21wbGV0aW9uID0gaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb247CisKKwl0YXNrID0gKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykKKwkJPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXNjaV9yZXF1ZXN0KQorCQk6IE5VTEw7CisKKwkvKiBOb3RlIHRoYXQgd2UgYXJlIG5vdCBnb2luZyB0byBjb250cm9sCisJICogdGhlIHRhcmdldCB0byBhYm9ydCB0aGUgcmVxdWVzdC4KKwkgKi8KKwlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmaXNjaV9yZXF1ZXN0LT5mbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3Qgd2Fzbid0IGp1c3Qgc2l0dGluZyBhcm91bmQgc2lnbmFsbGluZworCSAqIGRldmljZSBjb25kaXRpb24gKGlmIHRoZSByZXF1ZXN0IGhhbmRsZSBpcyBOVUxMLCB0aGVuIHRoZQorCSAqIHJlcXVlc3QgY29tcGxldGVkIGJ1dCBuZWVkZWQgYWRkaXRpb25hbCBoYW5kbGluZyBoZXJlKS4KKwkgKi8KKwlpZiAoIXRlc3RfYml0KElSRVFfVEVSTUlOQVRFRCwgJmlzY2lfcmVxdWVzdC0+ZmxhZ3MpKSB7CisJCXdhc190ZXJtaW5hdGVkID0gdHJ1ZTsKKwkJbmVlZHNfY2xlYW51cF9oYW5kbGluZyA9IHRydWU7CisJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KGlob3N0LAorCQkJCQkJCSAgIGlkZXYsCisJCQkJCQkJICAgaXNjaV9yZXF1ZXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGUgb25seSB0aW1lIHRoZSByZXF1ZXN0IHRvIHRlcm1pbmF0ZSB3aWxsCisJICogZmFpbCBpcyB3aGVuIHRoZSBpbyByZXF1ZXN0IGlzIGNvbXBsZXRlZCBhbmQKKwkgKiBiZWluZyBhYm9ydGVkLgorCSAqLworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QiCisJCQkiIHJldHVybmVkID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCisJCWlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKworCX0gZWxzZSB7CisJCWlmICh3YXNfdGVybWluYXRlZCkgeworCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGJlZm9yZSBjb21wbGV0aW9uIHdhaXQgKCVwLyVwKVxuIiwKKwkJCQlfX2Z1bmNfXywgaXNjaV9yZXF1ZXN0LCBpb19yZXF1ZXN0X2NvbXBsZXRpb24pOworCisJCQkvKiBXYWl0IGhlcmUgZm9yIHRoZSByZXF1ZXN0IHRvIGNvbXBsZXRlLiAqLworCQkJI2RlZmluZSBURVJNSU5BVElPTl9USU1FT1VUX01TRUMgNTAwCisJCQl0ZXJtaW5hdGlvbl9jb21wbGV0ZWQKKwkJCQk9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCQkgICBpb19yZXF1ZXN0X2NvbXBsZXRpb24sCisJCQkJICAgbXNlY3NfdG9famlmZmllcyhURVJNSU5BVElPTl9USU1FT1VUX01TRUMpKTsKKworCQkJaWYgKCF0ZXJtaW5hdGlvbl9jb21wbGV0ZWQpIHsKKworCQkJCS8qIFRoZSByZXF1ZXN0IHRvIHRlcm1pbmF0ZSBoYXMgdGltZWQgb3V0LiAgKi8KKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywKKwkJCQkJCSAgZmxhZ3MpOworCisJCQkJLyogQ2hlY2sgZm9yIHN0YXRlIGNoYW5nZXMuICovCisJCQkJaWYgKCF0ZXN0X2JpdChJUkVRX1RFUk1JTkFURUQsICZpc2NpX3JlcXVlc3QtPmZsYWdzKSkgeworCisJCQkJCS8qIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBoYXZlIHRoZQorCQkJCQkgKiByZXF1ZXN0IGRpZSBhIHNpbGVudCBkZWF0aCBpZiBpdAorCQkJCQkgKiBldmVyIHJlYWxseSBjb21wbGV0ZXMuCisJCQkJCSAqCisJCQkJCSAqIFNldCB0aGUgcmVxdWVzdCBzdGF0ZSB0byAiZGVhZCIsCisJCQkJCSAqIGFuZCBjbGVhciB0aGUgdGFzayBwb2ludGVyIHNvIHRoYXQKKwkJCQkJICogYW4gYWN0dWFsIGNvbXBsZXRpb24gZXZlbnQgY2FsbGJhY2sKKwkJCQkJICogZG9lc24ndCBkbyBhbnl0aGluZy4KKwkJCQkJICovCisJCQkJCWlzY2lfcmVxdWVzdC0+c3RhdHVzID0gZGVhZDsKKwkJCQkJaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24KKwkJCQkJCT0gTlVMTDsKKworCQkJCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7CisKKwkJCQkJCS8qIEJyZWFrIGxpbmtzIHdpdGggdGhlCisJCQkJCQkqIHNhc190YXNrLgorCQkJCQkJKi8KKwkJCQkJCWlzY2lfcmVxdWVzdC0+dHR5cGVfcHRyLmlvX3Rhc2tfcHRyCisJCQkJCQkJPSBOVUxMOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCXRlcm1pbmF0aW9uX2NvbXBsZXRlZCA9IDE7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKworCQkJCWlmICghdGVybWluYXRpb25fY29tcGxldGVkKSB7CisKKwkJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJCSIlczogKioqIFRpbWVvdXQgd2FpdGluZyBmb3IgIgorCQkJCQkJInRlcm1pbmF0aW9uKCVwLyVwKVxuIiwKKwkJCQkJCV9fZnVuY19fLCBpb19yZXF1ZXN0X2NvbXBsZXRpb24sCisJCQkJCQlpc2NpX3JlcXVlc3QpOworCisJCQkJCS8qIFRoZSByZXF1ZXN0IGNhbiBubyBsb25nZXIgYmUgcmVmZXJlbmNlZAorCQkJCQkgKiBzYWZlbHkgc2luY2UgaXQgbWF5IGdvIGF3YXkgaWYgdGhlCisJCQkJCSAqIHRlcm1pbmF0aW9uIGV2ZXJ5IHJlYWxseSBkb2VzIGNvbXBsZXRlLgorCQkJCQkgKi8KKwkJCQkJaXNjaV9yZXF1ZXN0ID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlpZiAodGVybWluYXRpb25fY29tcGxldGVkKQorCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogYWZ0ZXIgY29tcGxldGlvbiB3YWl0ICglcC8lcClcbiIsCisJCQkJCV9fZnVuY19fLCBpc2NpX3JlcXVlc3QsIGlvX3JlcXVlc3RfY29tcGxldGlvbik7CisJCX0KKworCQlpZiAodGVybWluYXRpb25fY29tcGxldGVkKSB7CisKKwkJCWlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKworCQkJLyogUGVlayBhdCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIHRlbGwKKwkJCSAqIHVzIGlmIHRoZXJlIHdhcyBzcGVjaWFsIGhhbmRsaW5nIG9uIHRoZSByZXF1ZXN0IHN1Y2ggdGhhdCBpdAorCQkJICogbmVlZHMgdG8gYmUgZGV0YWNoZWQgYW5kIGZyZWVkIGhlcmUuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXJlcXVlc3Rfc3RhdHVzID0gaXNjaV9yZXF1ZXN0LT5zdGF0dXM7CisKKwkJCWlmICgoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSAvKiBUTUZzIGFyZSBpbiB0aGVpciBvd24gdGhyZWFkICovCisJCQkgICAgJiYgKChyZXF1ZXN0X3N0YXR1cyA9PSBhYm9ydGVkKQorCQkJCXx8IChyZXF1ZXN0X3N0YXR1cyA9PSBhYm9ydGluZykKKwkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gdGVybWluYXRpbmcpCisJCQkJfHwgKHJlcXVlc3Rfc3RhdHVzID09IGNvbXBsZXRlZCkKKwkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gZGVhZCkKKwkJCQkpCisJCQkgICAgKSB7CisKKwkJCQkvKiBUaGUgY29tcGxldGlvbiByb3V0aW5lIHdvbid0IGZyZWUgYSByZXF1ZXN0IGluCisJCQkJICogdGhlIGFib3J0ZWQvYWJvcnRpbmcvZXRjLiBzdGF0ZXMsIHNvIHdlIGRvCisJCQkJICogaXQgaGVyZS4KKwkJCQkgKi8KKwkJCQluZWVkc19jbGVhbnVwX2hhbmRsaW5nID0gdHJ1ZTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJCX0KKwkJaWYgKG5lZWRzX2NsZWFudXBfaGFuZGxpbmcpCisJCQlpc2NpX3JlcXVlc3RfY2xlYW51cF9jb21wbGV0ZWRfbG9pdGVyZXIoCisJCQkJaWhvc3QsIGlkZXYsIGlzY2lfcmVxdWVzdCwgdGFzayk7CisJfQorfQorCisvKioKKyAqIGlzY2lfdGVybWluYXRlX3BlbmRpbmdfcmVxdWVzdHMoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGFsbCBvZiB0aGUKKyAqICAgIHJlcXVlc3RzIG9uIHRoZSBnaXZlbiBkZXZpY2UncyBzdGF0ZSB0byAiYWJvcnRpbmciLCB3aWxsIHRlcm1pbmF0ZSB0aGUKKyAqICAgIHJlcXVlc3RzLCBhbmQgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlCisgKiAgICBjYWxsZWQgZnJvbSBhIHRocmVhZCB0aGF0IGNhbiB3YWl0LiAgTm90ZSB0aGF0IHRoZSByZXF1ZXN0cyBhcmUgYWxsCisgKiAgICB0ZXJtaW5hdGVkIGFuZCBjb21wbGV0ZWQgKGJhY2sgdG8gdGhlIGhvc3QsIGlmIHN0YXJ0ZWQgdGhlcmUpLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIFNDVS4KKyAqIEBpZGV2OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHRhcmdldC4KKyAqCisgKi8KK3ZvaWQgaXNjaV90ZXJtaW5hdGVfcGVuZGluZ19yZXF1ZXN0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGNvbXBsZXRpb24gcmVxdWVzdF9jb21wbGV0aW9uOworCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBvbGRfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQobGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWxpc3Rfc3BsaWNlX2luaXQoJmlkZXYtPnJlcXNfaW5fcHJvY2VzcywgJmxpc3QpOworCisJLyogYXNzdW1lcyB0aGF0IGlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZSBkZWxldGVzIGZyb20gdGhlIGxpc3QgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CisJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgdHlwZW9mKCppcmVxKSwgZGV2X25vZGUpOworCisJCS8qIENoYW5nZSBzdGF0ZSB0byAidGVybWluYXRpbmciIGlmIGl0IGlzIGN1cnJlbnRseQorCQkgKiAic3RhcnRlZCIuCisJCSAqLworCQlvbGRfc3RhdGUgPSBpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fbmV3c3RhdGUoaXJlcSwKKwkJCQkJCQkJICAgICZyZXF1ZXN0X2NvbXBsZXRpb24sCisJCQkJCQkJCSAgICB0ZXJtaW5hdGluZyk7CisJCXN3aXRjaCAob2xkX3N0YXRlKSB7CisJCWNhc2Ugc3RhcnRlZDoKKwkJY2FzZSBjb21wbGV0ZWQ6CisJCWNhc2UgYWJvcnRpbmc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHRlcm1pbmF0aW9uIGluIHByb2dyZXNzLCBvciBvdGhlcndpc2UgZGlzcG9zaXRpb25lZC4KKwkJCSAqIFdlIGtub3cgdGhlIHJlcXVlc3Qgd2FzIG9uICdsaXN0JyBzbyBzaG91bGQgYmUgc2FmZQorCQkJICogdG8gbW92ZSBpdCBiYWNrIHRvIHJlcXNfaW5fcHJvY2VzcworCQkJICovCisJCQlsaXN0X21vdmUoJmlyZXEtPmRldl9ub2RlLCAmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKwkJCWlyZXEgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWlyZXEpCisJCQljb250aW51ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCWluaXRfY29tcGxldGlvbigmcmVxdWVzdF9jb21wbGV0aW9uKTsKKworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogaWRldj0lcCByZXF1ZXN0PSVwOyB0YXNrPSVwIG9sZF9zdGF0ZT0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgaWRldiwgaXJlcSwKKwkJCWlyZXEtPnR0eXBlID09IGlvX3Rhc2sgPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSkgOiBOVUxMLAorCQkJb2xkX3N0YXRlKTsKKworCQkvKiBJZiB0aGUgb2xkX3N0YXRlIGlzIHN0YXJ0ZWQ6CisJCSAqIFRoaXMgcmVxdWVzdCB3YXMgbm90IGFscmVhZHkgYmVpbmcgYWJvcnRlZC4gSWYgaXQgaGFkIGJlZW4sCisJCSAqIHRoZW4gdGhlIGFib3J0aW5nIEkvTyAoaWUuIHRoZSBUTUYgcmVxdWVzdCkgd291bGQgbm90IGJlIGluCisJCSAqIHRoZSBhYm9ydGluZyBzdGF0ZSwgYW5kIHRodXMgd291bGQgYmUgdGVybWluYXRlZCBoZXJlLiAgTm90ZQorCQkgKiB0aGF0IHNpbmNlIHRoZSBUTUYgY29tcGxldGlvbidzIGNhbGwgdG8gdGhlIGtlcm5lbCBmdW5jdGlvbgorCQkgKiAiY29tcGxldGUoKSIgZG9lcyBub3QgaGFwcGVuIHVudGlsIHRoZSBwZW5kaW5nIEkvTyByZXF1ZXN0CisJCSAqIHRlcm1pbmF0ZSBmdWxseSBjb21wbGV0ZXMsIHdlIGRvIG5vdCBoYXZlIHRvIGltcGxlbWVudCBhCisJCSAqIHNwZWNpYWwgd2FpdCBoZXJlIGZvciBhbHJlYWR5IGFib3J0aW5nIHJlcXVlc3RzIC0gdGhlCisJCSAqIHRlcm1pbmF0aW9uIG9mIHRoZSBUTUYgcmVxdWVzdCB3aWxsIGZvcmNlIHRoZSByZXF1ZXN0CisJCSAqIHRvIGZpbmlzaCBpdCdzIGFscmVhZHkgc3RhcnRlZCB0ZXJtaW5hdGUuCisJCSAqCisJCSAqIElmIG9sZF9zdGF0ZSA9PSBjb21wbGV0ZWQ6CisJCSAqIFRoaXMgcmVxdWVzdCBjb21wbGV0ZWQgZnJvbSB0aGUgU0NVIGhhcmR3YXJlIHBlcnNwZWN0aXZlCisJCSAqIGFuZCBub3cganVzdCBuZWVkcyBjbGVhbmluZyB1cCBpbiB0ZXJtcyBvZiBmcmVlaW5nIHRoZQorCQkgKiByZXF1ZXN0IGFuZCBwb3RlbnRpYWxseSBjYWxsaW5nIHVwIHRvIGxpYnNhcy4KKwkJICoKKwkJICogSWYgb2xkX3N0YXRlID09IGFib3J0aW5nOgorCQkgKiBUaGlzIHJlcXVlc3QgaGFzIGFscmVhZHkgZ29uZSB0aHJvdWdoIGEgVE1GIHRpbWVvdXQsIGJ1dCBtYXkKKwkJICogbm90IGhhdmUgYmVlbiB0ZXJtaW5hdGVkOyBuZWVkcyBjbGVhbmluZyB1cCBhdCBsZWFzdC4KKwkJICovCisJCWlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZShpaG9zdCwgaWRldiwgaXJlcSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBpc2NpX3Rhc2tfc2VuZF9sdV9yZXNldF9zYXMoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG9mIHRoZSBTQVMgRG9tYWluCisgKiAgICBUZW1wbGF0ZSBmdW5jdGlvbnMuCisgKiBAbHVuOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGx1biB0byBiZSByZXNldC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgaXNjaV90YXNrX3NlbmRfbHVfcmVzZXRfc2FzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSwKKwl1OCAqbHVuKQoreworCXN0cnVjdCBpc2NpX3RtZiB0bWY7CisJaW50IHJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9ob3N0ID0gJXAsIGlzY2lfZGV2aWNlID0gJXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKwkvKiBTZW5kIHRoZSBMVU4gcmVzZXQgdG8gdGhlIHRhcmdldC4gIEJ5IHRoZSB0aW1lIHRoZSBjYWxsIHJldHVybnMsCisJICogdGhlIFRNRiBoYXMgZnVsbHkgZXhlY3RlZCBpbiB0aGUgdGFyZ2V0IChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm4KKwkgKiB2YWx1ZSBpcyAiVE1GX1JFU1BfRlVOQ19DT01QTEVURSIsIG9yIHRoZSByZXF1ZXN0IHRpbWVkLW91dCAob3IKKwkgKiB3YXMgb3RoZXJ3aXNlIHVuYWJsZSB0byBiZSBleGVjdXRlZCAoIlRNRl9SRVNQX0ZVTkNfRkFJTEVEIikuCisJICovCisJaXNjaV90YXNrX2J1aWxkX3RtZigmdG1mLCBpc2NpX3RtZl9zc3BfbHVuX3Jlc2V0LCBOVUxMLCBOVUxMKTsKKworCSNkZWZpbmUgSVNDSV9MVV9SRVNFVF9USU1FT1VUX01TIDIwMDAgLyogMiBzZWNvbmQgdGltZW91dC4gKi8KKwlyZXQgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgJnRtZiwgSVNDSV9MVV9SRVNFVF9USU1FT1VUX01TKTsKKworCWlmIChyZXQgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6ICVwOiBUTUZfTFVfUkVTRVQgcGFzc2VkXG4iLAorCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlKTsKKwllbHNlCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiAlcDogVE1GX0xVX1JFU0VUIGZhaWxlZCAoJXgpXG4iLAorCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc2NpX3Rhc2tfc2VuZF9sdV9yZXNldF9zYXRhKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCB1OCAqbHVuKQoreworCWludCByZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwlzdHJ1Y3QgaXNjaV90bWYgdG1mOworCisJLyogU2VuZCB0aGUgc29mdCByZXNldCB0byB0aGUgdGFyZ2V0ICovCisJI2RlZmluZSBJU0NJX1NSU1RfVElNRU9VVF9NUyAyNTAwMCAvKiAyNSBzZWNvbmQgdGltZW91dC4gKi8KKwlpc2NpX3Rhc2tfYnVpbGRfdG1mKCZ0bWYsIGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoLCBOVUxMLCBOVUxMKTsKKworCXJldCA9IGlzY2lfdGFza19leGVjdXRlX3RtZihpaG9zdCwgaWRldiwgJnRtZiwgSVNDSV9TUlNUX1RJTUVPVVRfTVMpOworCisJaWYgKHJldCAhPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBBc3NlcnQgU1JTVCBmYWlsZWQgKCVwKSA9ICV4IiwKKwkJCSBfX2Z1bmNfXywgaWRldiwgcmV0KTsKKworCQkvKiBSZXR1cm4gdGhlIGZhaWx1cmUgc28gdGhhdCB0aGUgTFVOIHJlc2V0IGlzIGVzY2FsYXRlZAorCQkgKiB0byBhIHRhcmdldCByZXNldC4KKwkJICovCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXNjaV90YXNrX2x1X3Jlc2V0KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIG9uZSBvZiB0aGUgU0FTIERvbWFpbiBUZW1wbGF0ZQorICogICAgZnVuY3Rpb25zLiBUaGlzIGlzIG9uZSBvZiB0aGUgVGFzayBNYW5hZ2VtZW50IGZ1bmN0b2lucyBjYWxsZWQgYnkgbGlic2FzLAorICogICAgdG8gcmVzZXQgdGhlIGdpdmVuIGx1bi4gTm90ZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHdoaWxlIHRoaXMgY2FsbCBpcworICogICAgZXhlY3V0aW5nLCBubyBJL08gd2lsbCBiZSBzZW50IGJ5IHRoZSBob3N0IHRvIHRoZSBkZXZpY2UuCisgKiBAbHVuOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGx1biB0byBiZSByZXNldC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfbHVfcmVzZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXZpY2UsIHU4ICpsdW4pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0ID0gZGV2X3RvX2lob3N0KGRvbWFpbl9kZXZpY2UpOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWlzY2lfZGV2aWNlID0gaXNjaV9sb29rdXBfZGV2aWNlKGRvbWFpbl9kZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBkb21haW5fZGV2aWNlPSVwLCBpc2NpX2hvc3Q9JXA7IGlzY2lfZGV2aWNlPSVwXG4iLAorCQkgX19mdW5jX18sIGRvbWFpbl9kZXZpY2UsIGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UpOworCisJaWYgKGlzY2lfZGV2aWNlKQorCQlzZXRfYml0KElERVZfRUgsICZpc2NpX2RldmljZS0+ZmxhZ3MpOworCisJLyogSWYgdGhlcmUgaXMgYSBkZXZpY2UgcmVzZXQgcGVuZGluZyBvbiBhbnkgcmVxdWVzdCBpbiB0aGUKKwkgKiBkZXZpY2UncyBsaXN0LCBmYWlsIHRoaXMgTFVOIHJlc2V0IHJlcXVlc3QgaW4gb3JkZXIgdG8KKwkgKiBlc2NhbGF0ZSB0byB0aGUgZGV2aWNlIHJlc2V0LgorCSAqLworCWlmICghaXNjaV9kZXZpY2UgfHwKKwkgICAgaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKSkgeworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IE5vIGRldiAoJXApLCBvciAiCisJCQkgIlJFU0VUIFBFTkRJTkc6IGRvbWFpbl9kZXZpY2U9JXBcbiIsCisJCQkgX19mdW5jX18sIGlzY2lfZGV2aWNlLCBkb21haW5fZGV2aWNlKTsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlbmQgdGhlIHRhc2sgbWFuYWdlbWVudCBwYXJ0IG9mIHRoZSByZXNldC4gKi8KKwlpZiAoc2FzX3Byb3RvY29sX2F0YShkb21haW5fZGV2aWNlLT50cHJvdG8pKSB7CisJCXJldCA9IGlzY2lfdGFza19zZW5kX2x1X3Jlc2V0X3NhdGEoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgbHVuKTsKKwl9IGVsc2UKKwkJcmV0ID0gaXNjaV90YXNrX3NlbmRfbHVfcmVzZXRfc2FzKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsIGx1bik7CisKKwkvKiBJZiB0aGUgTFVOIHJlc2V0IHdvcmtlZCwgYWxsIHRoZSBJL08gY2FuIG5vdyBiZSB0ZXJtaW5hdGVkLiAqLworCWlmIChyZXQgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJLyogVGVybWluYXRlIGFsbCBJL08gbm93LiAqLworCQlpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKGlzY2lfaG9zdCwKKwkJCQkJCWlzY2lfZGV2aWNlKTsKKworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaXNjaV9kZXZpY2UpOworCXJldHVybiByZXQ7Cit9CisKKworLyoJIGludCAoKmxsZGRfY2xlYXJfbmV4dXNfcG9ydCkoc3RydWN0IGFzZF9zYXNfcG9ydCAqKTsgKi8KK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfcG9ydChzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0KQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworCisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfaGEoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKmhhKQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworLyogVGFzayBNYW5hZ2VtZW50IEZ1bmN0aW9ucy4gTXVzdCBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQuCSAqLworCisvKioKKyAqIGlzY2lfYWJvcnRfdGFza19wcm9jZXNzX2NiKCkgLSBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgYWJvcnQgdGFzaworICogICAgVE1GIGNvbW1hbmQuICBJdCBtYW5hZ2VzIHRoZSByZXF1ZXN0IHN0YXRlIHdpdGggcmVzcGVjdCB0byB0aGUgc3VjY2Vzc2Z1bAorICogICAgdHJhbnNtaXNzaW9uIC8gY29tcGxldGlvbiBvZiB0aGUgYWJvcnQgdGFzayByZXF1ZXN0LgorICogQGNiX3N0YXRlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlbiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgLSBhZnRlcgorICogICAgdGhlIFRNRiByZXF1ZXN0IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGFmdGVyIGl0IGhhcyB0aW1lZC1vdXQuCisgKiBAdG1mOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIFRNRiBpbiBwcm9ncmVzcy4KKyAqCisgKgorICovCitzdGF0aWMgdm9pZCBpc2NpX2Fib3J0X3Rhc2tfcHJvY2Vzc19jYigKKwllbnVtIGlzY2lfdG1mX2NiX3N0YXRlIGNiX3N0YXRlLAorCXN0cnVjdCBpc2NpX3RtZiAqdG1mLAorCXZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqb2xkX3JlcXVlc3Q7CisKKwlvbGRfcmVxdWVzdCA9IChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICopY2JfZGF0YTsKKworCWRldl9kYmcoJm9sZF9yZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiB0bWY9JXAsIG9sZF9yZXF1ZXN0PSVwXG4iLAorCQlfX2Z1bmNfXywgdG1mLCBvbGRfcmVxdWVzdCk7CisKKwlzd2l0Y2ggKGNiX3N0YXRlKSB7CisKKwljYXNlIGlzY2lfdG1mX3N0YXJ0ZWQ6CisJCS8qIFRoZSBUTUYgaGFzIGJlZW4gc3RhcnRlZC4gIE5vdGhpbmcgdG8gZG8gaGVyZSwgc2luY2UgdGhlCisJCSAqIHJlcXVlc3Qgc3RhdGUgd2FzIGFscmVhZHkgc2V0IHRvICJhYm9ydGVkIiBieSB0aGUgYWJvcnQKKwkJICogdGFzayBmdW5jdGlvbi4KKwkJICovCisJCWlmICgob2xkX3JlcXVlc3QtPnN0YXR1cyAhPSBhYm9ydGVkKQorCQkJJiYgKG9sZF9yZXF1ZXN0LT5zdGF0dXMgIT0gY29tcGxldGVkKSkKKwkJCWRldl9kYmcoJm9sZF9yZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IEJhZCByZXF1ZXN0IHN0YXR1cyAoJWQpOiB0bWY9JXAsIG9sZF9yZXF1ZXN0PSVwXG4iLAorCQkJCV9fZnVuY19fLCBvbGRfcmVxdWVzdC0+c3RhdHVzLCB0bWYsIG9sZF9yZXF1ZXN0KTsKKwkJYnJlYWs7CisKKwljYXNlIGlzY2lfdG1mX3RpbWVkX291dDoKKworCQkvKiBTZXQgdGhlIHRhc2sncyBzdGF0ZSB0byAiYWJvcnRpbmciLCBzaW5jZSB0aGUgYWJvcnQgdGFzaworCQkgKiBmdW5jdGlvbiB0aHJlYWQgc2V0IGl0IHRvICJhYm9ydGVkIiAoYWJvdmUpIGluIGFudGljaXBhdGlvbgorCQkgKiBvZiB0aGUgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3Qgd29ya2luZyBjb3JyZWN0bHkuICBTaW5jZSB0aGUKKwkJICogdGltZW91dCBoYXMgbm93IGZpcmVkLCB0aGUgVE1GIHJlcXVlc3QgZmFpbGVkLiAgV2Ugc2V0IHRoZQorCQkgKiBzdGF0ZSBzdWNoIHRoYXQgdGhlIHJlcXVlc3QgY29tcGxldGlvbiB3aWxsIGluZGljYXRlIHRoZQorCQkgKiBkZXZpY2UgaXMgbm8gbG9uZ2VyIHByZXNlbnQuCisJCSAqLworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKG9sZF9yZXF1ZXN0LCBhYm9ydGluZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2RiZygmb2xkX3JlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBCYWQgY2Jfc3RhdGUgKCVkKTogdG1mPSVwLCBvbGRfcmVxdWVzdD0lcFxuIiwKKwkJCV9fZnVuY19fLCBjYl9zdGF0ZSwgdG1mLCBvbGRfcmVxdWVzdCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rhc2tfYWJvcnRfdGFzaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGlic2FzIHRvIGFib3J0IGEgc3BlY2lmaWVkIHRhc2suCisgKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBTQVMgdGFzayB0byBhYm9ydC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFzayhzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0ID0gZGV2X3RvX2lob3N0KHRhc2stPmRldik7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soYWJvcnRlZF9pb19jb21wbGV0aW9uKTsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICAgICAgICpvbGRfcmVxdWVzdCA9IE5VTEw7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzICBvbGRfc3RhdGU7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UgPSBOVUxMOworCXN0cnVjdCBpc2NpX3RtZiAgICAgICAgICAgdG1mOworCWludCAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBmbGFnczsKKwlib29sICAgICAgICAgICAgICAgICAgICAgIGFueV9kZXZfcmVzZXQgPSBmYWxzZTsKKworCS8qIEdldCB0aGUgaXNjaV9yZXF1ZXN0IHJlZmVyZW5jZSBmcm9tIHRoZSB0YXNrLiAgTm90ZSB0aGF0CisJICogdGhpcyBjaGVjayBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHBlbmRpbmcgcmVxdWVzdCBsaXN0CisJICogaW4gdGhlIGRldmljZSwgYmVjYXVzZSB0YXNrcyBkcml2aW5nIHJlc2V0cyBtYXkgbGFuZCBoZXJlCisJICogYWZ0ZXIgY29tcGxldGlvbiBpbiB0aGUgY29yZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CisKKwlvbGRfcmVxdWVzdCA9IHRhc2stPmxsZGRfdGFzazsKKworCS8qIElmIHRhc2sgaXMgYWxyZWFkeSBkb25lLCB0aGUgcmVxdWVzdCBpc24ndCB2YWxpZCAqLworCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSAmJgorCSAgICAodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX0FUX0lOSVRJQVRPUikgJiYKKwkgICAgb2xkX3JlcXVlc3QpCisJCWlzY2lfZGV2aWNlID0gaXNjaV9sb29rdXBfZGV2aWNlKHRhc2stPmRldik7CisKKwlzcGluX3VubG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogdGFzayA9ICVwXG4iLCBfX2Z1bmNfXywgdGFzayk7CisKKwlpZiAoIWlzY2lfZGV2aWNlIHx8ICFvbGRfcmVxdWVzdCkKKwkJZ290byBvdXQ7CisKKwlzZXRfYml0KElERVZfRUgsICZpc2NpX2RldmljZS0+ZmxhZ3MpOworCisJLyogVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgd2lsbCBmYWlsIGFib3J0IHJlcXVlc3RzIGZvcgorCSAqIFNBVEEvU1RQLiAgRmFpbGluZyB0aGUgYWJvcnQgcmVxdWVzdCB0aGlzIHdheSB3aWxsIGNhdXNlIHRoZQorCSAqIFNDU0kgZXJyb3IgaGFuZGxlciB0aHJlYWQgdG8gZXNjYWxhdGUgdG8gTFVOIHJlc2V0CisJICovCisJaWYgKHNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykpIHsKKwkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkgICAgIiB0YXNrICVwIGlzIGZvciBhIFNUUC9TQVRBIGRldmljZTsiCisJCQkgICAgIiByZXR1cm5pbmcgVE1GX1JFU1BfRlVOQ19GQUlMRURcbiIKKwkJCSAgICAiIHRvIGNhdXNlIGEgTFVOIHJlc2V0Li4uXG4iLCB0YXNrKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogb2xkX3JlcXVlc3QgPT0gJXBcbiIsIF9fZnVuY19fLCBvbGRfcmVxdWVzdCk7CisKKwlhbnlfZGV2X3Jlc2V0ID0gaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCWFueV9kZXZfcmVzZXQgPSBhbnlfZGV2X3Jlc2V0IHx8ICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpOworCisJLyogSWYgdGhlIGV4dHJhY3Rpb24gb2YgdGhlIHJlcXVlc3QgcmVmZXJlbmNlIGZyb20gdGhlIHRhc2sKKwkgKiBmYWlsZWQsIHRoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkIChvciBpZiB0aGVyZSBpcyBhCisJICogcGVuZGluZyByZXNldCB0aGVuIHRoaXMgYWJvcnQgcmVxdWVzdCBmdW5jdGlvbiBtdXN0IGJlIGZhaWxlZAorCSAqIGluIG9yZGVyIHRvIGVzY2FsYXRlIHRvIHRoZSB0YXJnZXQgcmVzZXQpLgorCSAqLworCWlmICgob2xkX3JlcXVlc3QgPT0gTlVMTCkgfHwgYW55X2Rldl9yZXNldCkgeworCisJCS8qIElmIHRoZSBkZXZpY2UgcmVzZXQgdGFzayBmbGFnIGlzIHNldCwgZmFpbCB0aGUgdGFzaworCQkgKiBtYW5hZ2VtZW50IHJlcXVlc3QuICBPdGhlcndpc2UsIHRoZSBvcmlnaW5hbCByZXF1ZXN0CisJCSAqIGhhcyBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoYW55X2Rldl9yZXNldCkgeworCisJCQkvKiBUdXJuIG9mZiB0aGUgdGFzaydzIERPTkUgdG8gbWFrZSBzdXJlIHRoaXMKKwkJCSAqIHRhc2sgaXMgZXNjYWxhdGVkIHRvIGEgdGFyZ2V0IHJlc2V0LgorCQkJICovCisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19TVEFURV9ET05FOworCisJCQkvKiBNYWtlIHRoZSByZXNldCBoYXBwZW4gYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KKwkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJCQkvKiBGYWlsIHRoZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBpbiBvcmRlciB0bworCQkJICogZXNjYWxhdGUgdG8gdGhlIHRhcmdldCByZXNldC4KKwkJCSAqLworCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisKKwkJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogRmFpbGluZyB0YXNrIGFib3J0IGluIG9yZGVyIHRvICIKKwkJCQkiZXNjYWxhdGUgdG8gdGFyZ2V0IHJlc2V0IGJlY2F1c2VcbiIKKwkJCQkiU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQgaXMgc2V0IGZvciAiCisJCQkJInRhc2sgJXAgb24gZGV2ICVwXG4iLAorCQkJCV9fZnVuY19fLCB0YXNrLCBpc2NpX2RldmljZSk7CisKKworCQl9IGVsc2UgeworCQkJLyogVGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgY29tcGxldGVkIGFuZCB0aGVyZQorCQkJICogaXMgbm90aGluZyB0byBkbyBoZXJlIG90aGVyIHRoYW4gdG8gc2V0IHRoZSB0YXNrCisJCQkgKiBkb25lIGJpdCwgYW5kIGluZGljYXRlIHRoYXQgdGhlIHRhc2sgYWJvcnQgZnVuY3Rpb24KKwkJCSAqIHdhcyBzdWNlc3NmdWwuCisJCQkgKi8KKwkJCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBhYm9ydCB0YXNrIG5vdCBuZWVkZWQgZm9yICVwXG4iLAorCQkJCV9fZnVuY19fLCB0YXNrKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHRoZSByZXF1ZXN0IHN0YXR1cyBhbmQgY2hhbmdlIHRvICJhYm9ydGVkIiBpZiBjdXJyZW50bHkKKwkgKiAic3RhcnRpbmciOyBpZiB0cnVlIHRoZW4gc2V0IHRoZSBJL08ga2VybmVsIGNvbXBsZXRpb24KKwkgKiBzdHJ1Y3QgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSByZXF1ZXN0IGNvbXBsZXRlcy4KKwkgKi8KKwlvbGRfc3RhdGUgPSBpc2NpX3Rhc2tfdmFsaWRhdGVfcmVxdWVzdF90b19hYm9ydCgKKwkJCQlvbGRfcmVxdWVzdCwgaXNjaV9ob3N0LCBpc2NpX2RldmljZSwKKwkJCQkmYWJvcnRlZF9pb19jb21wbGV0aW9uKTsKKwlpZiAoKG9sZF9zdGF0ZSAhPSBzdGFydGVkKSAmJgorCSAgICAob2xkX3N0YXRlICE9IGNvbXBsZXRlZCkgJiYKKwkgICAgKG9sZF9zdGF0ZSAhPSBhYm9ydGluZykpIHsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCS8qIFRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5IGJlaW5nIGhhbmRsZWQgYnkgc29tZW9uZSBlbHNlIChiZWNhdXNlCisJCSogdGhleSBnb3QgdG8gc2V0IHRoZSBzdGF0ZSBhd2F5IGZyb20gc3RhcnRlZCkuCisJCSovCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiAgZGV2aWNlID0gJXA7IG9sZF9yZXF1ZXN0ICVwIGFscmVhZHkgYmVpbmcgYWJvcnRlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaXNjaV9kZXZpY2UsIG9sZF9yZXF1ZXN0KTsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJZ290byBvdXQ7CisJfQorCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVAgfHwKKwkgICAgdGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKSB7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU01QIHJlcXVlc3QgKCVkKSIKKwkJCSIgb3IgY29tcGxldGVfaW5fdGFyZ2V0ICglZCksIHRodXMgbm8gVE1GXG4iLAorCQkJX19mdW5jX18sICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApLAorCQkJdGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKTsKKworCQkvKiBTZXQgdGhlIHN0YXRlIG9uIHRoZSB0YXNrLiAqLworCQlpc2NpX3Rhc2tfYWxsX2RvbmUodGFzayk7CisKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCQkvKiBTdG9wcGluZyBhbmQgU01QIGRldmljZXMgYXJlIG5vdCBzZW50IGEgVE1GLCBhbmQgYXJlIG5vdAorCQkgKiByZXNldCwgYnV0IHRoZSBvdXRzdGFuZGluZyBJL08gcmVxdWVzdCBpcyB0ZXJtaW5hdGVkIGJlbG93LgorCQkgKi8KKwl9IGVsc2UgeworCQkvKiBGaWxsIGluIHRoZSB0bWYgc3R1Y3R1cmUgKi8KKwkJaXNjaV90YXNrX2J1aWxkX2Fib3J0X3Rhc2tfdG1mKCZ0bWYsIGlzY2lfdG1mX3NzcF90YXNrX2Fib3J0LAorCQkJCQkgICAgICAgaXNjaV9hYm9ydF90YXNrX3Byb2Nlc3NfY2IsCisJCQkJCSAgICAgICBvbGRfcmVxdWVzdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQkjZGVmaW5lIElTQ0lfQUJPUlRfVEFTS19USU1FT1VUX01TIDUwMCAvKiBoYWxmIHNlY29uZCB0aW1lb3V0LiAqLworCQlyZXQgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgJnRtZiwKKwkJCQkJICAgIElTQ0lfQUJPUlRfVEFTS19USU1FT1VUX01TKTsKKworCQlpZiAocmV0ICE9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpCisJCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGlzY2lfdGFza19zZW5kX3RtZiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCX0KKwlpZiAocmV0ID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJm9sZF9yZXF1ZXN0LT5mbGFncyk7CisKKwkJLyogQ2xlYW4gdXAgdGhlIHJlcXVlc3Qgb24gb3VyIHNpZGUsIGFuZCB3YWl0IGZvciB0aGUgYWJvcnRlZAorCQkgKiBJL08gdG8gY29tcGxldGUuCisJCSAqLworCQlpc2NpX3Rlcm1pbmF0ZV9yZXF1ZXN0X2NvcmUoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgb2xkX3JlcXVlc3QpOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgbGVhdmUgYSByZWZlcmVuY2UgdG8gYWJvcnRlZF9pb19jb21wbGV0aW9uICovCisJb2xkX3JlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbiA9IE5VTEw7Cisgb3V0OgorCWlzY2lfcHV0X2RldmljZShpc2NpX2RldmljZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSBTQVMgRG9tYWluIFRlbXBsYXRlCisgKiAgICBmdW5jdGlvbnMuIFRoaXMgaXMgb25lIG9mIHRoZSBUYXNrIE1hbmFnZW1lbnQgZnVuY3RvaW5zIGNhbGxlZCBieSBsaWJzYXMsCisgKiAgICB0byBhYm9ydCBhbGwgdGFzayBmb3IgdGhlIGdpdmVuIGx1bi4KKyAqIEBkX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkb21haW4gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICByZXF1ZXN0LgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pCit7CisJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworfQorCisKKy8qKgorICogaXNjaV90YXNrX2NsZWFyX2FjYSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBvbmUgb2YgdGhlIFRhc2sgTWFuYWdlbWVudCBmdW5jdG9pbnMgY2FsbGVkIGJ5IGxpYnNhcy4KKyAqIEBkX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkb21haW4gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICByZXF1ZXN0LgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2NsZWFyX2FjYSgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bikKK3sKKwlyZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7Cit9CisKKworCisvKioKKyAqIGlzY2lfdGFza19jbGVhcl90YXNrX3NldCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBvbmUgb2YgdGhlIFRhc2sgTWFuYWdlbWVudCBmdW5jdG9pbnMgY2FsbGVkIGJ5IGxpYnNhcy4KKyAqIEBkX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkb21haW4gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICByZXF1ZXN0LgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2NsZWFyX3Rhc2tfc2V0KAorCXN0cnVjdCBkb21haW5fZGV2aWNlICpkX2RldmljZSwKKwl1OCAqbHVuKQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworCisvKioKKyAqIGlzY2lfdGFza19xdWVyeV90YXNrKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIHRvIGNhdXNlIGxpYnNhcyB0bworICogICAgY29ycmVjdGx5IGVzY2FsYXRlIHRoZSBmYWlsZWQgYWJvcnQgdG8gYSBMVU4gb3IgdGFyZ2V0IHJlc2V0ICh0aGlzIGlzCisgKiAgICBiZWNhdXNlIHNhc19zY3NpX2ZpbmRfdGFzayBsaWJzYXMgZnVuY3Rpb24gZG9lcyBub3QgY29ycmVjdGx5IGludGVycHJldAorICogICAgYWxsIHJldHVybiBjb2RlcyBmcm9tIHRoZSBhYm9ydCB0YXNrIGNhbGwpLiAgV2hlbiBUTUZfUkVTUF9GVU5DX1NVQ0MgaXMKKyAqICAgIHJldHVybmVkLCBsaWJzYXMgdHVybnMgdGhpcyBpbnRvIGEgTFVOIHJlc2V0OyB3aGVuIEZVTkNfRkFJTEVEIGlzCisgKiAgICByZXR1cm5lZCwgbGlic2FzIHdpbGwgdHVybiB0aGlzIGludG8gYSB0YXJnZXQgcmVzZXQKKyAqIEB0YXNrOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNhcyB0YXNrIGJlaW5nIHF1ZXJpZWQuCisgKiBAbHVuOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGx1biBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfdGFza19xdWVyeV90YXNrKAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaykKK3sKKwkvKiBTZWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIGRldmljZSByZXNldCBmb3IgdGhpcyBkZXZpY2UuICovCisJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCkKKwkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCWVsc2UKKwkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfU1VDQzsKK30KKworLyoKKyAqIGlzY2lfdGFza19yZXF1ZXN0X2NvbXBsZXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUgd2hlbgorICogICAgYW4gdGFzayByZXF1ZXN0IGNvbXBsZXRlcy4KKyAqIEBpaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisgKiBAaXJlcTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCBpc2NpX3JlcXVlc3Qgb2JqZWN0LgorICogQGNvbXBsZXRpb25fc3RhdHVzOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvbXBsZXRpb24gc3RhdHVzIGZyb20gdGhlCisgKiAgICBzY2kgY29yZS4KKyAqCisgKiBub25lLgorICovCit2b2lkCitpc2NpX3Rhc2tfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkgICBlbnVtIHNjaV90YXNrX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cykKK3sKKwlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCXN0cnVjdCBjb21wbGV0aW9uICp0bWZfY29tcGxldGU7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHJlcXVlc3QgPSAlcCwgc3RhdHVzPSVkXG4iLAorCQlfX2Z1bmNfXywgaXJlcSwgY29tcGxldGlvbl9zdGF0dXMpOworCisJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBjb21wbGV0ZWQpOworCisJdG1mLT5zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1czsKKwlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmaXJlcS0+ZmxhZ3MpOworCisJaWYgKHRtZi0+cHJvdG8gPT0gU0FTX1BST1RPQ09MX1NTUCkgeworCQltZW1jcHkoJnRtZi0+cmVzcC5yZXNwX2l1LAorCQkgICAgICAgJmlyZXEtPnNzcC5yc3AsCisJCSAgICAgICBTU1BfUkVTUF9JVV9NQVhfU0laRSk7CisJfSBlbHNlIGlmICh0bWYtPnByb3RvID09IFNBU19QUk9UT0NPTF9TQVRBKSB7CisJCW1lbWNweSgmdG1mLT5yZXNwLmQyaF9maXMsCisJCSAgICAgICAmaXJlcS0+c3RwLnJzcCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKSk7CisJfQorCisJLyogUFJJTlRfVE1GKCAoKHN0cnVjdCBpc2NpX3RtZiAqKXJlcXVlc3QtPnRhc2spKTsgKi8KKwl0bWZfY29tcGxldGUgPSB0bWYtPmNvbXBsZXRlOworCisJc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oaWhvc3QsIGlyZXEtPnRhcmdldF9kZXZpY2UsIGlyZXEpOworCS8qIHNldCB0aGUgJ3Rlcm1pbmF0ZWQnIGZsYWcgaGFuZGxlIHRvIG1ha2Ugc3VyZSBpdCBjYW5ub3QgYmUgdGVybWluYXRlZAorCSAqICBvciBjb21wbGV0ZWQgYWdhaW4uCisJICovCisJc2V0X2JpdChJUkVRX1RFUk1JTkFURUQsICZpcmVxLT5mbGFncyk7CisKKwlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIHVuYWxsb2NhdGVkKTsKKwlsaXN0X2RlbF9pbml0KCZpcmVxLT5kZXZfbm9kZSk7CisKKwkvKiBUaGUgdGFzayBtYW5hZ2VtZW50IHBhcnQgY29tcGxldGVzIGxhc3QuICovCisJY29tcGxldGUodG1mX2NvbXBsZXRlKTsKK30KKworc3RhdGljIHZvaWQgaXNjaV9zbXBfdGFza190aW1lZG91dCh1bnNpZ25lZCBsb25nIF90YXNrKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9ICh2b2lkICopIF90YXNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0RPTkUpKQorCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0FCT1JURUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfc21wX3Rhc2tfZG9uZShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJaWYgKCFkZWxfdGltZXIoJnRhc2stPnRpbWVyKSkKKwkJcmV0dXJuOworCWNvbXBsZXRlKCZ0YXNrLT5jb21wbGV0aW9uKTsKK30KKworc3RhdGljIHN0cnVjdCBzYXNfdGFzayAqaXNjaV9hbGxvY190YXNrKHZvaWQpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0ga3phbGxvYyhzaXplb2YoKnRhc2spLCBHRlBfS0VSTkVMKTsKKworCWlmICh0YXNrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOworCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7CisJCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7CisJfQorCisJcmV0dXJuIHRhc2s7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfZnJlZV90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3Qgc2FzX3Rhc2sgICp0YXNrKQoreworCWlmICh0YXNrKSB7CisJCUJVR19PTighbGlzdF9lbXB0eSgmdGFzay0+bGlzdCkpOworCQlrZnJlZSh0YXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNjaV9zbXBfZXhlY3V0ZV90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSBzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB2b2lkICpyZXEsCisJCQkJIGludCByZXFfc2l6ZSwgdm9pZCAqcmVzcCwgaW50IHJlc3Bfc2l6ZSkKK3sKKwlpbnQgcmVzLCByZXRyeTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBOVUxMOworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgeworCQl0YXNrID0gaXNjaV9hbGxvY190YXNrKCk7CisJCWlmICghdGFzaykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXRhc2stPmRldiA9IGRldjsKKwkJdGFzay0+dGFza19wcm90byA9IGRldi0+dHByb3RvOworCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3JlcSwgcmVxLCByZXFfc2l6ZSk7CisJCXNnX2luaXRfb25lKCZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcCwgcmVzcCwgcmVzcF9zaXplKTsKKworCQl0YXNrLT50YXNrX2RvbmUgPSBpc2NpX3NtcF90YXNrX2RvbmU7CisKKwkJdGFzay0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrOworCQl0YXNrLT50aW1lci5mdW5jdGlvbiA9IGlzY2lfc21wX3Rhc2tfdGltZWRvdXQ7CisJCXRhc2stPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAqSFo7CisJCWFkZF90aW1lcigmdGFzay0+dGltZXIpOworCisJCXJlcyA9IGlzY2lfdGFza19leGVjdXRlX3Rhc2sodGFzaywgMSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKHJlcykgeworCQkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7CisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogZXhlY3V0aW5nIFNNUCB0YXNrIGZhaWxlZDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJCWdvdG8gZXhfZXJyOworCQl9CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7CisJCXJlcyA9IC1FQ09NTTsKKwkJaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBzbXAgdGFzayB0aW1lZCBvdXQgb3IgYWJvcnRlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlpc2NpX3Rhc2tfYWJvcnRfdGFzayh0YXNrKTsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgeworCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogU01QIHRhc2sgYWJvcnRlZCBhbmQgbm90IGRvbmVcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlnb3RvIGV4X2VycjsKKwkJCX0KKwkJfQorCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fU1RBVF9HT09EKSB7CisJCQlyZXMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJICAgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9VTkRFUlJVTikgeworCQkJLyogbm8gZXJyb3IsIGJ1dCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZgorCQkJKiB1bmRlcnJ1biAqLworCQkJcmVzID0gdGFzay0+dGFza19zdGF0dXMucmVzaWR1YWw7CisJCQlicmVhazsKKwkJfQorCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkgICAgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBU19EQVRBX09WRVJSVU4pIHsKKwkJCXJlcyA9IC1FTVNHU0laRTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHRhc2sgdG8gZGV2ICUwMTZsbHggcmVzcG9uc2U6IDB4JXggIgorCQkJCSJzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sCisJCQkJU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCisJCQkJdGFzay0+dGFza19zdGF0dXMucmVzcCwKKwkJCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0KTsKKwkJCWlzY2lfZnJlZV90YXNrKGlob3N0LCB0YXNrKTsKKwkJCXRhc2sgPSBOVUxMOworCQl9CisJfQorZXhfZXJyOgorCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7CisJaXNjaV9mcmVlX3Rhc2soaWhvc3QsIHRhc2spOworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgRElTQ09WRVJfUkVRX1NJWkUgIDE2CisjZGVmaW5lIERJU0NPVkVSX1JFU1BfU0laRSA1NgorCitpbnQgaXNjaV9zbXBfZ2V0X3BoeV9hdHRhY2hlZF9kZXZfdHlwZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICAgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgaW50IHBoeV9pZCwgaW50ICphZHQpCit7CisJc3RydWN0IHNtcF9yZXNwICpkaXNjX3Jlc3A7CisJdTggKmRpc2NfcmVxOworCWludCByZXM7CisKKwlkaXNjX3Jlc3AgPSBremFsbG9jKERJU0NPVkVSX1JFU1BfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkaXNjX3Jlc3ApCisJCXJldHVybiAtRU5PTUVNOworCisJZGlzY19yZXEgPSBremFsbG9jKERJU0NPVkVSX1JFUV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGlzY19yZXEpIHsKKwkJZGlzY19yZXFbMF0gPSBTTVBfUkVRVUVTVDsKKwkJZGlzY19yZXFbMV0gPSBTTVBfRElTQ09WRVI7CisJCWRpc2NfcmVxWzldID0gcGh5X2lkOworCX0gZWxzZSB7CisJCWtmcmVlKGRpc2NfcmVzcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXMgPSBpc2NpX3NtcF9leGVjdXRlX3Rhc2soaWhvc3QsIGRldiwgZGlzY19yZXEsIERJU0NPVkVSX1JFUV9TSVpFLAorCQkJCSAgICBkaXNjX3Jlc3AsIERJU0NPVkVSX1JFU1BfU0laRSk7CisJaWYgKCFyZXMpIHsKKwkJaWYgKGRpc2NfcmVzcC0+cmVzdWx0ICE9IFNNUF9SRVNQX0ZVTkNfQUNDKQorCQkJcmVzID0gZGlzY19yZXNwLT5yZXN1bHQ7CisJCWVsc2UKKwkJCSphZHQgPSBkaXNjX3Jlc3AtPmRpc2MuYXR0YWNoZWRfZGV2X3R5cGU7CisJfQorCWtmcmVlKGRpc2NfcmVxKTsKKwlrZnJlZShkaXNjX3Jlc3ApOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgaXNjaV93YWl0X2Zvcl9zbXBfcGh5X3Jlc2V0KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsIGludCBwaHlfbnVtKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+aXNjaV9wb3J0OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPmlzY2lfaG9zdDsKKwlpbnQgcmVzLCBpdGVyYXRpb24gPSAwLCBhdHRhY2hlZF9kZXZpY2VfdHlwZTsKKwkjZGVmaW5lIFNUUF9XQUlUX01TRUNTIDI1MDAwCisJdW5zaWduZWQgbG9uZyB0bW8gPSBtc2Vjc190b19qaWZmaWVzKFNUUF9XQUlUX01TRUNTKTsKKwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lID0gamlmZmllcyArIHRtbzsKKwllbnVtIHsKKwkJU01QX1BIWVdBSVRfUEhZRE9XTiwKKwkJU01QX1BIWVdBSVRfUEhZVVAsCisJCVNNUF9QSFlXQUlUX0RPTkUKKwl9IHBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX1BIWURPV047CisKKwkvKiBXaGlsZSB0aGVyZSBpcyB0aW1lLCB3YWl0IGZvciB0aGUgcGh5IHRvIGdvIGF3YXkgYW5kIGNvbWUgYmFjayAqLworCXdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZGVhZGxpbmUpICYmIHBoeV9zdGF0ZSAhPSBTTVBfUEhZV0FJVF9ET05FKSB7CisJCWludCBldmVudCA9IGF0b21pY19yZWFkKCZpcG9ydC0+ZXZlbnQpOworCisJCSsraXRlcmF0aW9uOworCisJCXRtbyA9IHdhaXRfZXZlbnRfdGltZW91dChpaG9zdC0+ZXZlbnRxLAorCQkJCQkgZXZlbnQgIT0gYXRvbWljX3JlYWQoJmlwb3J0LT5ldmVudCkgfHwKKwkJCQkJICF0ZXN0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyksCisJCQkJCSB0bW8pOworCQkvKiBsaW5rIGRvd24sIHN0b3AgcG9sbGluZyAqLworCQlpZiAoIXRlc3RfYml0KElQT1JUX0JDTl9CTE9DS0VELCAmaXBvcnQtPmZsYWdzKSkKKwkJCWJyZWFrOworCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlwb3J0ICVwLCBpdGVyYXRpb24gJWQsIgorCQkJIiBwaGFzZSAlZDogdGltZV9yZW1haW5pbmcgJWx1LCBiY25zID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaXBvcnQsIGl0ZXJhdGlvbiwgcGh5X3N0YXRlLAorCQkJdG1vLCB0ZXN0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncykpOworCisJCXJlcyA9IGlzY2lfc21wX2dldF9waHlfYXR0YWNoZWRfZGV2X3R5cGUoaWhvc3QsIGRldiwgcGh5X251bSwKKwkJCQkJCQkgJmF0dGFjaGVkX2RldmljZV90eXBlKTsKKwkJdG1vID0gZGVhZGxpbmUgLSBqaWZmaWVzOworCisJCWlmIChyZXMpIHsKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogaXRlcmF0aW9uICVkLCBwaGFzZSAlZDoiCisJCQkJICIgU01QIGVycm9yPSVkLCB0aW1lX3JlbWFpbmluZz0lbHVcbiIsCisJCQkJIF9fZnVuY19fLCBpdGVyYXRpb24sIHBoeV9zdGF0ZSwgcmVzLCB0bW8pOworCQkJYnJlYWs7CisJCX0KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgJXAsIGl0ZXJhdGlvbiAlZCwiCisJCQkiIHBoYXNlICVkOiB0aW1lX3JlbWFpbmluZyAlbHUsIGJjbnMgPSAlZCwgIgorCQkJImF0dGRldnR5cGUgPSAleFxuIiwKKwkJCV9fZnVuY19fLCBpcG9ydCwgaXRlcmF0aW9uLCBwaHlfc3RhdGUsCisJCQl0bW8sIHRlc3RfYml0KElQT1JUX0JDTl9QRU5ESU5HLCAmaXBvcnQtPmZsYWdzKSwKKwkJCWF0dGFjaGVkX2RldmljZV90eXBlKTsKKworCQlzd2l0Y2ggKHBoeV9zdGF0ZSkgeworCQljYXNlIFNNUF9QSFlXQUlUX1BIWURPV046CisJCQkvKiBIYXMgdGhlIGRldmljZSBnb25lIGF3YXk/ICovCisJCQlpZiAoIWF0dGFjaGVkX2RldmljZV90eXBlKQorCQkJCXBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX1BIWVVQOworCisJCQlicmVhazsKKworCQljYXNlIFNNUF9QSFlXQUlUX1BIWVVQOgorCQkJLyogSGFzIHRoZSBkZXZpY2UgY29tZSBiYWNrPyAqLworCQkJaWYgKGF0dGFjaGVkX2RldmljZV90eXBlKQorCQkJCXBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX0RPTkU7CisJCQlicmVhazsKKworCQljYXNlIFNNUF9QSFlXQUlUX0RPTkU6CisJCQlicmVhazsKKwkJfQorCisJfQorCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogZG9uZVxuIiwgIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCBpc2NpX3Jlc2V0X2RldmljZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3Qgc2FzX3BoeSAqcGh5ID0gc2FzX2ZpbmRfbG9jYWxfcGh5KGlkZXYtPmRvbWFpbl9kZXYpOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+aXNjaV9wb3J0OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlkZXYgJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXQoaWRldik7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KCVwKSByZXR1cm5lZCAlZCFcbiIsCisJCQkgX19mdW5jX18sIGlkZXYsIHN0YXR1cyk7CisKKwkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXJlIGFibGUgdG8gYmUgZnVsbHkgdGVybWluYXRlZC4gKi8KKwlpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKGlob3N0LCBpZGV2KTsKKworCS8qIElmIHRoaXMgaXMgYSBkZXZpY2Ugb24gYW4gZXhwYW5kZXIsIGRpc2FibGUgQkNOIHByb2Nlc3NpbmcuICovCisJaWYgKCFzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkKKwkJc2V0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyk7CisKKwlyYyA9IHNhc19waHlfcmVzZXQocGh5LCB0cnVlKTsKKworCS8qIFRlcm1pbmF0ZSBpbi1wcm9ncmVzcyBJL08gbm93LiAqLworCWlzY2lfcmVtb3RlX2RldmljZV9udWtlX3JlcXVlc3RzKGlob3N0LCBpZGV2KTsKKworCS8qIFNpbmNlIGFsbCBwZW5kaW5nIFRDcyBoYXZlIGJlZW4gY2xlYW5lZCwgcmVzdW1lIHRoZSBSTkMuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9yZXNldF9jb21wbGV0ZShpZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGlzIGlzIGEgZGV2aWNlIG9uIGFuIGV4cGFuZGVyLCBicmluZyB0aGUgcGh5IGJhY2sgdXAuICovCisJaWYgKCFzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkgeworCQkvKiBBIHBoeSByZXNldCB3aWxsIGNhdXNlIHRoZSBkZXZpY2UgdG8gZ28gYXdheSB0aGVuIHJlYXBwZWFyLgorCQkgKiBTaW5jZSBsaWJzYXMgd2lsbCB0YWtlIGFjdGlvbiBvbiBpbmNvbWluZyBCQ05zIChlZy4gcmVtb3ZlCisJCSAqIGEgZGV2aWNlIGdvaW5nIHRocm91Z2ggYW4gU01QIHBoeS1jb250cm9sIGRyaXZlbiByZXNldCksCisJCSAqIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgcGh5IGNvbWVzIGJhY2sgdXAgYmVmb3JlIGxldHRpbmcKKwkJICogZGlzY292ZXJ5IHByb2NlZWQgaW4gbGlic2FzLgorCQkgKi8KKwkJaXNjaV93YWl0X2Zvcl9zbXBfcGh5X3Jlc2V0KGlkZXYsIHBoeS0+bnVtYmVyKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlpc2NpX3BvcnRfYmNuX2VuYWJsZShpaG9zdCwgaWRldi0+aXNjaV9wb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKCVwKSAiCisJCQkgInJldHVybmVkICVkIVxuIiwgX19mdW5jX18sIGlkZXYsIHN0YXR1cyk7CisJfQorCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBpZGV2ICVwIGNvbXBsZXRlLlxuIiwgX19mdW5jX18sIGlkZXYpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgaXNjaV90YXNrX0lfVF9uZXh1c19yZXNldChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGV2X3RvX2lob3N0KGRldik7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlkZXYgfHwgIXRlc3RfYml0KElERVZfRUgsICZpZGV2LT5mbGFncykpIHsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gaXNjaV9yZXNldF9kZXZpY2UoaWhvc3QsIGlkZXYpOworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisJcmV0dXJuIHJldDsKK30KKworaW50IGlzY2lfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoY21kLT5kZXZpY2UpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGV2X3RvX2lob3N0KGRldik7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlkZXYpIHsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gaXNjaV9yZXNldF9kZXZpY2UoaWhvc3QsIGlkZXYpOworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdmYTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5oCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfSVNDSV9UQVNLX0hfCisjZGVmaW5lIF9JU0NJX1RBU0tfSF8KKworI2luY2x1ZGUgPHNjc2kvc2FzX2F0YS5oPgorI2luY2x1ZGUgImhvc3QuaCIKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKKworLyoqCisgKiBlbnVtIGlzY2lfdG1mX2NiX3N0YXRlIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHBvc3NpYmxlIHN0YXRlcyBpbiB3aGljaCB0aGUKKyAqICAgIFRNRiBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnZva2VkIGR1cmluZyB0aGUgVE1GIGV4ZWN1dGlvbiBwcm9jZXNzLgorICoKKyAqCisgKi8KK2VudW0gaXNjaV90bWZfY2Jfc3RhdGUgeworCisJaXNjaV90bWZfaW5pdF9zdGF0ZSA9IDAsCisJaXNjaV90bWZfc3RhcnRlZCwKKwlpc2NpX3RtZl90aW1lZF9vdXQKK307CisKKy8qKgorICogZW51bSBpc2NpX3RtZl9mdW5jdGlvbl9jb2RlcyAtIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBwcmVwYXJhdGlvbnMKKyAqICAgIG9mIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cy4KKyAqCisgKgorICovCitlbnVtIGlzY2lfdG1mX2Z1bmN0aW9uX2NvZGVzIHsKKworCWlzY2lfdG1mX2Z1bmNfbm9uZSAgICAgID0gMCwKKwlpc2NpX3RtZl9zc3BfdGFza19hYm9ydCA9IFRNRl9BQk9SVF9UQVNLLAorCWlzY2lfdG1mX3NzcF9sdW5fcmVzZXQgID0gVE1GX0xVX1JFU0VULAorCWlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoID0gVE1GX0xVX1JFU0VUICsgMHgxMDAsIC8qIE5vbiBTQ1NJICovCisJaXNjaV90bWZfc2F0YV9zcnN0X2xvdyAgPSBUTUZfTFVfUkVTRVQgKyAweDEwMSAgLyogTm9uIFNDU0kgKi8KK307CisvKioKKyAqIHN0cnVjdCBpc2NpX3RtZiAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgdGFzayBtYW5hZ2VtZW50IG9iamVjdCB3aGljaAorICogICAgYWN0cyBhcyBhbiBpbnRlcmZhY2UgdG8gbGlic2FzIGZvciBwcm9jZXNzaW5nIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cworICoKKyAqCisgKi8KK3N0cnVjdCBpc2NpX3RtZiB7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGU7CisJZW51bSBzYXNfcHJvdG9jb2wgcHJvdG87CisJdW5pb24geworCQlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1IHJlc3BfaXU7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgZDJoX2ZpczsKKwkJdTggcnNwX2J1ZltTU1BfUkVTUF9JVV9NQVhfU0laRV07CisJfSByZXNwOworCXVuc2lnbmVkIGNoYXIgbHVuWzhdOworCXUxNiBpb190YWc7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqZGV2aWNlOworCWVudW0gaXNjaV90bWZfZnVuY3Rpb25fY29kZXMgdG1mX2NvZGU7CisJaW50IHN0YXR1czsKKworCS8qIFRoZSBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiBhbGxvd3MgdGhlIHVzZXIgcHJvY2VzcyB0bworCSAqIHRyYWNrIHRoZSBUTUYgdHJhbnNtaXQgLyB0aW1lb3V0IGNvbmRpdGlvbnMuCisJICovCisJdm9pZCAoKmNiX3N0YXRlX2Z1bmMpKAorCQllbnVtIGlzY2lfdG1mX2NiX3N0YXRlLAorCQlzdHJ1Y3QgaXNjaV90bWYgKiwgdm9pZCAqKTsKKwl2b2lkICpjYl9kYXRhOworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaXNjaV9wcmludF90bWYoc3RydWN0IGlzY2lfdG1mICp0bWYpCit7CisJaWYgKFNBU19QUk9UT0NPTF9TQVRBID09IHRtZi0+cHJvdG8pCisJCWRldl9kYmcoJnRtZi0+ZGV2aWNlLT5pc2NpX3BvcnQtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBzdGF0dXMgPSAleFxuIgorCQkJInRtZi0+cmVzcC5kMmhfZmlzLnN0YXR1cyA9ICV4XG4iCisJCQkidG1mLT5yZXNwLmQyaF9maXMuZXJyb3IgPSAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJdG1mLT5zdGF0dXMsCisJCQl0bWYtPnJlc3AuZDJoX2Zpcy5zdGF0dXMsCisJCQl0bWYtPnJlc3AuZDJoX2Zpcy5lcnJvcik7CisJZWxzZQorCQlkZXZfZGJnKCZ0bWYtPmRldmljZS0+aXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogc3RhdHVzID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5kYXRhX3ByZXNlbnQgPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LnN0YXR1cyA9ICV4XG4iCisJCQkidG1mLT5yZXNwLnJlc3BfaXUuZGF0YV9sZW5ndGggPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbMF0gPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbMV0gPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbMl0gPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbM10gPSAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJdG1mLT5zdGF0dXMsCisJCQl0bWYtPnJlc3AucmVzcF9pdS5kYXRhcHJlcywKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnN0YXR1cywKKwkJCWJlMzJfdG9fY3B1KHRtZi0+cmVzcC5yZXNwX2l1LnJlc3BvbnNlX2RhdGFfbGVuKSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVswXSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVsxXSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVsyXSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVszXSk7Cit9CisKKworaW50IGlzY2lfdGFza19leGVjdXRlX3Rhc2soCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWludCBudW0sCisJZ2ZwX3QgZ2ZwX2ZsYWdzKTsKKworaW50IGlzY2lfdGFza19hYm9ydF90YXNrKAorCXN0cnVjdCBzYXNfdGFzayAqdGFzayk7CisKK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pOworCitpbnQgaXNjaV90YXNrX2NsZWFyX2FjYSgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bik7CisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfdGFza19zZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pOworCitpbnQgaXNjaV90YXNrX3F1ZXJ5X3Rhc2soCisJc3RydWN0IHNhc190YXNrICp0YXNrKTsKKworaW50IGlzY2lfdGFza19sdV9yZXNldCgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bik7CisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfcG9ydCgKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0KTsKKworaW50IGlzY2lfdGFza19jbGVhcl9uZXh1c19oYSgKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqaGEpOworCitpbnQgaXNjaV90YXNrX0lfVF9uZXh1c19yZXNldCgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UpOworCit2b2lkIGlzY2lfdGFza19yZXF1ZXN0X2NvbXBsZXRlKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCWVudW0gc2NpX3Rhc2tfc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKTsKKwordTE2IGlzY2lfdGFza19zc3BfcmVxdWVzdF9nZXRfaW9fdGFnX3RvX21hbmFnZSgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KTsKKwordTggaXNjaV90YXNrX3NzcF9yZXF1ZXN0X2dldF9mdW5jdGlvbigKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KTsKKworCit2b2lkICppc2NpX3Rhc2tfc3NwX3JlcXVlc3RfZ2V0X3Jlc3BvbnNlX2RhdGFfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KTsKKwordTMyIGlzY2lfdGFza19zc3BfcmVxdWVzdF9nZXRfcmVzcG9uc2VfZGF0YV9sZW5ndGgoCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCk7CisKK2ludCBpc2NpX3F1ZXVlY29tbWFuZCgKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCwKKwl2b2lkICgqZG9uZWZ1bmMpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCitpbnQgaXNjaV9idXNfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworCisvKioKKyAqIGVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiAtIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBhY3Rpb25zIHRvCisgKiAgICB0YWtlIHdpdGggcmVzcGVjdCB0byBhIGdpdmVuIHJlcXVlc3QncyBub3RpZmljYXRpb24gYmFjayB0byBsaWJzYXMuCisgKgorICoKKyAqLworZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIHsKKworCWlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbiwgICAgICAvKiBOb3JtYWwgbm90aWZ5ICh0YXNrX2RvbmUpICovCisJaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbiwgICAgIC8qIE5vIG5vdGlmaWNhdGlvbi4gICAqLworCWlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uICAgICAgICAvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX3NldF90YXNrX2RvbmVmbGFncygKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJLyogU2luY2Ugbm8gZnV0aGVyIGFjdGlvbiB3aWxsIGJlIHRha2VuIG9uIHRoaXMgdGFzaywKKwkgKiBtYWtlIHN1cmUgdG8gbWFyayBpdCBjb21wbGV0ZSBmcm9tIHRoZSBsbGRkIHBlcnNwZWN0aXZlLgorCSAqLworCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7CisJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfUEVORElORzsKK30KKy8qKgorICogaXNjaV90YXNrX2FsbF9kb25lKCkgLSBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgdGFzayBiaXRzIHRvIGluZGljYXRlIHRoZQorICogICAgTExERCBpcyBkb25lIHdpdGggdGhlIHRhc2suCisgKgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfdGFza19hbGxfZG9uZSgKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNpbmNlIG5vIGZ1dGhlciBhY3Rpb24gd2lsbCBiZSB0YWtlbiBvbiB0aGlzIHRhc2ssCisJICogbWFrZSBzdXJlIHRvIG1hcmsgaXQgY29tcGxldGUgZnJvbSB0aGUgbGxkZCBwZXJzcGVjdGl2ZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogaXNjaV90YXNrX3NldF9jb21wbGV0aW9uX3N0YXR1cygpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjb21wbGV0aW9uIHN0YXR1cworICogICAgZm9yIHRoZSByZXF1ZXN0LgorICogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb21wbGV0ZWQgcmVxdWVzdC4KKyAqIEByZXNwb25zZTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHJlc3BvbnNlIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyAqIEBzdGF0dXM6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBzdGF0dXMgY29kZSBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorICoKKyogQHJldHVybiBUaGUgbmV3IG5vdGlmaWNhdGlvbiBtb2RlIGZvciB0aGUgcmVxdWVzdC4KKyovCitzdGF0aWMgaW5saW5lIGVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbgoraXNjaV90YXNrX3NldF9jb21wbGV0aW9uX3N0YXR1cygKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJZW51bSBzZXJ2aWNlX3Jlc3BvbnNlIHJlc3BvbnNlLAorCWVudW0gZXhlY19zdGF0dXMgc3RhdHVzLAorCWVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiB0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCS8qIElmIGEgZGV2aWNlIHJlc2V0IGlzIGJlaW5nIGluZGljYXRlZCwgbWFrZSBzdXJlIHRoZSBJL08KKwkqIGlzIGluIHRoZSBlcnJvciBwYXRoLgorCSovCisJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCkgeworCQkvKiBGYWlsIHRoZSBJL08gdG8gbWFrZSBzdXJlIGl0IGdvZXMgaW50byB0aGUgZXJyb3IgcGF0aC4gKi8KKwkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOworCisJCXRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbiA9IGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCX0KKwl0YXNrLT50YXNrX3N0YXR1cy5yZXNwID0gcmVzcG9uc2U7CisJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9IHN0YXR1czsKKworCXN3aXRjaCAodGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKSB7CisKKwljYXNlIGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOgorCisJCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKKwkJCS8qIFRoZXJlIGlzIG5vIGVycm9yIGVzY2FsYXRpb24gaW4gdGhlIFNNUCBjYXNlLgorCQkJICogQ29udmVydCB0byBhIG5vcm1hbCBjb21wbGV0aW9uIHRvIGF2b2lkIHRoZQorCQkJICogdGltZW91dCBpbiB0aGUgZGlzY292ZXJ5IHBhdGggYW5kIHRvIGxldCB0aGUKKwkJCSAqIG5leHQgYWN0aW9uIHRha2UgcGxhY2UgcXVpY2tseS4KKwkJCSAqLworCQkJdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uCisJCQkJPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisKKwkJCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGNhc2UuLi4gKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLworCQkJLyogTGVhdmUgU0FTX1RBU0tfU1RBVEVfRE9ORSBjbGVhcgorCQkJICogTGVhdmUgU0FTX1RBU0tfQVRfSU5JVElBVE9SIHNldC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjoKKwkJLyogVGhpcyBwYXRoIGNhbiBvY2N1ciB3aXRoIHRhc2stbWFuYWdlZCByZXF1ZXN0cyBhcyB3ZWxsIGFzCisJCSAqIHJlcXVlc3RzIHRlcm1pbmF0ZWQgYmVjYXVzZSBvZiBMVU4gb3IgZGV2aWNlIHJlc2V0cy4KKwkJICovCisJCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGNhc2UuLi4gKi8KKwljYXNlIGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjoKKwkJLyogTm9ybWFsIG5vdGlmaWNhdGlvbiAodGFza19kb25lKSAqLworCQlpc2NpX3NldF90YXNrX2RvbmVmbGFncyh0YXNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTkNFKDEsICJ1bmtub3duIHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbjogJWRcbiIsCisJCQkgdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uOworCit9CisvKioKKyogaXNjaV9leGVjcGF0aF9jYWxsYmFjaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgdGFzaworKiBleGVjdXRlIHBhdGggd2hlbiB0aGUgdGFzayBuZWVkcyB0byBjYWxsYmFjayBsaWJzYXMgYWJvdXQgdGhlIHN1Ym1pdC10aW1lCisqIHRhc2sgZmFpbHVyZS4gIFRoZSBjYWxsYmFjayBvY2N1cnMgZWl0aGVyIHRocm91Z2ggdGhlIHRhc2sncyBkb25lIGZ1bmN0aW9uCisqIG9yIHRocm91Z2ggc2FzX3Rhc2tfYWJvcnQuICBJbiB0aGUgY2FzZSBvZiByZWd1bGFyIG5vbi1kaXNjb3ZlcnkgU0FUQS9TVFAgSS9PCisqIHJlcXVlc3RzLCBsaWJzYXMgdGFrZXMgdGhlIGhvc3QgbG9jayBiZWZvcmUgY2FsbGluZyBleGVjdXRlIHRhc2suICBUaGVyZWZvcmUKKyogaW4gdGhpcyBzaXR1YXRpb24gdGhlIGhvc3QgbG9jayBtdXN0IGJlIG1hbmFnZWQgYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmMuCisqCisqIEBpaG9zdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIEkvTyByZXF1ZXN0IHdhcyBzZW50LgorKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIEkvTyByZXF1ZXN0LgorKiBAZnVuYzogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW4gdGhlIGNvcnJlY3QgY29udGV4dC4KKyogQHN0YXR1czogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHN0YXR1cyBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisqCisqLworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfZXhlY3BhdGhfY2FsbGJhY2soc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgc3RydWN0IHNhc190YXNrICAqdGFzaywKKwkJCQkJICB2b2lkICgqZnVuYykoc3RydWN0IHNhc190YXNrICopKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSB0YXNrLT5kZXY7CisKKwlpZiAoZGV2X2lzX3NhdGEoZGV2KSAmJiB0YXNrLT51bGRkX3Rhc2spIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBTaW5jZSB3ZSBhcmUgc3RpbGwgaW4gdGhlIHN1Ym1pdCBwYXRoLCBhbmQgc2luY2UKKwkJICogbGlic2FzIHRha2VzIHRoZSBob3N0IGxvY2sgb24gYmVoYWxmIG9mIFNBVEEKKwkJICogZGV2aWNlcyBiZWZvcmUgSS9PIHN0YXJ0cyAoaW4gdGhlIG5vbi1kaXNjb3ZlcnkgY2FzZSksCisJCSAqIHdlIG5lZWQgdG8gdW5sb2NrIGJlZm9yZSB3ZSBjYW4gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisJCSAqLworCQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzcGluX3VubG9jayhkZXYtPnNhdGFfZGV2LmFwLT5sb2NrKTsKKwkJZnVuYyh0YXNrKTsKKwkJc3Bpbl9sb2NrKGRldi0+c2F0YV9kZXYuYXAtPmxvY2spOworCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZQorCQlmdW5jKHRhc2spOworfQorI2VuZGlmIC8qICFkZWZpbmVkKF9TQ0lfVEFTS19IXykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWUxZTJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInVuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKworaW50IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wgPSAmaWhvc3QtPnVmX2NvbnRyb2w7CisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSAqdWY7CisJdTMyIGJ1Zl9sZW4sIGhlYWRlcl9sZW4sIGk7CisJZG1hX2FkZHJfdCBkbWE7CisJc2l6ZV90IHNpemU7CisJdm9pZCAqdmlydDsKKworCS8qCisJICogUHJlcGFyZSBhbGwgb2YgdGhlIG1lbW9yeSBzaXplcyBmb3IgdGhlIFVGIGhlYWRlcnMsIFVGIGFkZHJlc3MKKwkgKiB0YWJsZSwgYW5kIFVGIGJ1ZmZlcnMgdGhlbXNlbHZlcy4KKwkgKi8KKwlidWZfbGVuID0gU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgKiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkU7CisJaGVhZGVyX2xlbiA9IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTICogc2l6ZW9mKHN0cnVjdCBzY3VfdW5zb2xpY2l0ZWRfZnJhbWVfaGVhZGVyKTsKKwlzaXplID0gYnVmX2xlbiArIGhlYWRlcl9sZW4gKyBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyAqIHNpemVvZihkbWFfYWRkcl90KTsKKworCS8qCisJICogVGhlIFVuc29saWNpdGVkIEZyYW1lIGJ1ZmZlcnMgYXJlIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIFVGCisJICogbWVtb3J5IGRlc2NyaXB0b3IgZW50cnkuIFRoZSBoZWFkZXJzIGFuZCBhZGRyZXNzIHRhYmxlIHdpbGwgYmUKKwkgKiBwbGFjZWQgYWZ0ZXIgdGhlIGJ1ZmZlcnMuCisJICovCisJdmlydCA9IGRtYW1fYWxsb2NfY29oZXJlbnQoJmlob3N0LT5wZGV2LT5kZXYsIHNpemUsICZkbWEsIEdGUF9LRVJORUwpOworCWlmICghdmlydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIGxvY2F0aW9uIG9mIHRoZSBVRiBoZWFkZXIgdGFibGUgaW50byB0aGUgU0NVLgorCSAqIE5vdGVzOgorCSAqIC0gVGhlIGFkZHJlc3MgbXVzdCBhbGlnbiBvbiBhIDY0LWJ5dGUgYm91bmRhcnkuIEd1YXJhbnRlZWQgdG8gYmUKKwkgKiAgIG9uIDY0LWJ5dGUgYm91bmRhcnkgYWxyZWFkeSAxS0IgYm91bmRhcnkgZm9yIHVuc29saWNpdGVkIGZyYW1lcy4KKwkgKiAtIFByb2dyYW0gdW51c2VkIGhlYWRlciBlbnRyaWVzIHRvIG92ZXJsYXAgd2l0aCB0aGUgbGFzdAorCSAqICAgdW5zb2xpY2l0ZWQgZnJhbWUuICBUaGUgc2lsaWNvbiB3aWxsIG5ldmVyIERNQSB0byB0aGVzZSB1bnVzZWQKKwkgKiAgIGhlYWRlcnMsIHNpbmNlIHdlIHByb2dyYW0gdGhlIFVGIGFkZHJlc3MgdGFibGUgcG9pbnRlcnMgdG8KKwkgKiAgIE5VTEwuCisJICovCisJdWZfY29udHJvbC0+aGVhZGVycy5waHlzaWNhbF9hZGRyZXNzID0gZG1hICsgYnVmX2xlbjsKKwl1Zl9jb250cm9sLT5oZWFkZXJzLmFycmF5ID0gdmlydCArIGJ1Zl9sZW47CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIGxvY2F0aW9uIG9mIHRoZSBVRiBhZGRyZXNzIHRhYmxlIGludG8gdGhlIFNDVS4KKwkgKiBOb3RlczoKKwkgKiAtIFRoZSBhZGRyZXNzIG11c3QgYWxpZ24gb24gYSA2NC1iaXQgYm91bmRhcnkuIEd1YXJhbnRlZWQgdG8gYmUgb24gNjQKKwkgKiAgIGJ5dGUgYm91bmRhcnkgYWxyZWFkeSBkdWUgdG8gYWJvdmUgcHJvZ3JhbW1pbmcgaGVhZGVycyBiZWluZyBvbiBhCisJICogICA2NC1iaXQgYm91bmRhcnkgYW5kIGhlYWRlcnMgYXJlIG9uIGEgNjQtYnl0ZXMgaW4gc2l6ZS4KKwkgKi8KKwl1Zl9jb250cm9sLT5hZGRyZXNzX3RhYmxlLnBoeXNpY2FsX2FkZHJlc3MgPSBkbWEgKyBidWZfbGVuICsgaGVhZGVyX2xlbjsKKwl1Zl9jb250cm9sLT5hZGRyZXNzX3RhYmxlLmFycmF5ID0gdmlydCArIGJ1Zl9sZW4gKyBoZWFkZXJfbGVuOworCXVmX2NvbnRyb2wtPmdldCA9IDA7CisKKwkvKgorCSAqIFVGIGJ1ZmZlciByZXF1aXJlbWVudHMgYXJlOgorCSAqIC0gVGhlIGxhc3QgZW50cnkgaW4gdGhlIFVGIHF1ZXVlIGlzIG5vdCBOVUxMLgorCSAqIC0gVGhlcmUgaXMgYSBwb3dlciBvZiAyIG51bWJlciBvZiBlbnRyaWVzIChOVUxMIG9yIG5vdC1OVUxMKQorCSAqICAgcHJvZ3JhbW1lZCBpbnRvIHRoZSBxdWV1ZS4KKwkgKiAtIEFsaWduZWQgb24gYSAxS0IgYm91bmRhcnkuICovCisKKwkvKgorCSAqIFByb2dyYW0gdGhlIGFjdHVhbCB1c2VkIFVGIGJ1ZmZlcnMgaW50byB0aGUgVUYgYWRkcmVzcyB0YWJsZSBhbmQKKwkgKiB0aGUgY29udHJvbGxlcidzIGFycmF5IG9mIFVGcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVM7IGkrKykgeworCQl1ZiA9ICZ1Zl9jb250cm9sLT5idWZmZXJzLmFycmF5W2ldOworCisJCXVmX2NvbnRyb2wtPmFkZHJlc3NfdGFibGUuYXJyYXlbaV0gPSBkbWE7CisKKwkJdWYtPmJ1ZmZlciA9IHZpcnQ7CisJCXVmLT5oZWFkZXIgPSAmdWZfY29udHJvbC0+aGVhZGVycy5hcnJheVtpXTsKKwkJdWYtPnN0YXRlICA9IFVOU09MSUNJVEVEX0ZSQU1FX0VNUFRZOworCisJCS8qCisJCSAqIEluY3JlbWVudCB0aGUgYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwgYW5kIHZpcnR1YWwgbWVtb3J5CisJCSAqIHBvaW50ZXJzLiBFdmVyeXRoaW5nIGlzIGFsaWduZWQgb24gMWsgYm91bmRhcnkgd2l0aCBhbgorCQkgKiBpbmNyZW1lbnQgb2YgMWsuCisJCSAqLworCQl2aXJ0ICs9IFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRTsKKwkJZG1hICs9IFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCQkJCQkJCSB1MzIgZnJhbWVfaW5kZXgsCisJCQkJCQkJIHZvaWQgKipmcmFtZV9oZWFkZXIpCit7CisJaWYgKGZyYW1lX2luZGV4IDwgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMpIHsKKwkJLyogU2tpcCB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgZnJhbWUgc2luY2UgdGhpcyBpcyBhIGNvbnRyb2xsIHdvcmQgdXNlZAorCQkgKiBieSB0aGUgaGFyZHdhcmUuCisJCSAqLworCQkqZnJhbWVfaGVhZGVyID0gJnVmX2NvbnRyb2wtPmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLmhlYWRlci0+ZGF0YTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcihzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJCQkJCQkJIHUzMiBmcmFtZV9pbmRleCwKKwkJCQkJCQkgdm9pZCAqKmZyYW1lX2J1ZmZlcikKK3sKKwlpZiAoZnJhbWVfaW5kZXggPCBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUykgeworCQkqZnJhbWVfYnVmZmVyID0gdWZfY29udHJvbC0+YnVmZmVycy5hcnJheVtmcmFtZV9pbmRleF0uYnVmZmVyOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7Cit9CisKK2Jvb2wgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfcmVsZWFzZV9mcmFtZShzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJCQkJCQkgdTMyIGZyYW1lX2luZGV4KQoreworCXUzMiBmcmFtZV9nZXQ7CisJdTMyIGZyYW1lX2N5Y2xlOworCisJZnJhbWVfZ2V0ICAgPSB1Zl9jb250cm9sLT5nZXQgJiAoU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgLSAxKTsKKwlmcmFtZV9jeWNsZSA9IHVmX2NvbnRyb2wtPmdldCAmIFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTOworCisJLyoKKwkgKiBJbiB0aGUgZXZlbnQgdGhlcmUgYXJlIE5VTEwgZW50cmllcyBpbiB0aGUgVUYgdGFibGUsIHdlIG5lZWQgdG8KKwkgKiBhZHZhbmNlIHRoZSBnZXQgcG9pbnRlciBpbiBvcmRlciB0byBmaW5kIG91dCBpZiB0aGlzIGZyYW1lIHNob3VsZAorCSAqIGJlIHJlbGVhc2VkIChpLmUuIHVwZGF0ZSB0aGUgZ2V0IHBvaW50ZXIpCisJICovCisJd2hpbGUgKGxvd2VyXzMyX2JpdHModWZfY29udHJvbC0+YWRkcmVzc190YWJsZS5hcnJheVtmcmFtZV9nZXRdKSA9PSAwICYmCisJICAgICAgIHVwcGVyXzMyX2JpdHModWZfY29udHJvbC0+YWRkcmVzc190YWJsZS5hcnJheVtmcmFtZV9nZXRdKSA9PSAwICYmCisJICAgICAgIGZyYW1lX2dldCA8IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKQorCQlmcmFtZV9nZXQrKzsKKworCS8qCisJICogVGhlIHRhYmxlIGhhcyBhIE5VTEwgZW50cnkgYXMgaXQncyBsYXN0IGVsZW1lbnQuICBUaGlzIGlzCisJICogaWxsZWdhbC4KKwkgKi8KKwlCVUdfT04oZnJhbWVfZ2V0ID49IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKTsKKwlpZiAoZnJhbWVfaW5kZXggPj0gU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMpCisJCXJldHVybiBmYWxzZTsKKworCXVmX2NvbnRyb2wtPmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLnN0YXRlID0gVU5TT0xJQ0lURURfRlJBTUVfUkVMRUFTRUQ7CisKKwlpZiAoZnJhbWVfZ2V0ICE9IGZyYW1lX2luZGV4KSB7CisJCS8qCisJCSAqIEZyYW1lcyByZW1haW4gaW4gdXNlIHVudGlsIHdlIGFkdmFuY2UgdGhlIGdldCBwb2ludGVyCisJCSAqIHNvIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUKKwkJICovCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFRoZSBmcmFtZSBpbmRleCBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBnZXQgcG9pbnRlciBzbyB3ZQorCSAqIGNhbiBub3cgZnJlZSB1cCBhbGwgb2YgdGhlIGZyYW1lIGVudHJpZXMgdGhhdAorCSAqLworCXdoaWxlICh1Zl9jb250cm9sLT5idWZmZXJzLmFycmF5W2ZyYW1lX2dldF0uc3RhdGUgPT0gVU5TT0xJQ0lURURfRlJBTUVfUkVMRUFTRUQpIHsKKwkJdWZfY29udHJvbC0+YnVmZmVycy5hcnJheVtmcmFtZV9nZXRdLnN0YXRlID0gVU5TT0xJQ0lURURfRlJBTUVfRU1QVFk7CisKKwkJaWYgKGZyYW1lX2dldCsxID09IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTLTEpIHsKKwkJCWZyYW1lX2N5Y2xlIF49IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTOworCQkJZnJhbWVfZ2V0ID0gMDsKKwkJfSBlbHNlCisJCQlmcmFtZV9nZXQrKzsKKwl9CisKKwl1Zl9jb250cm9sLT5nZXQgPSBTQ1VfVUZRR1BfR0VOX0JJVChFTkFCTEVfQklUKSB8IGZyYW1lX2N5Y2xlIHwgZnJhbWVfZ2V0OworCisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmggYi9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjYjk1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuaApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfU0NJQ19TRFNfVU5TT0xJQ0lURURfRlJBTUVfQ09OVFJPTF9IXworI2RlZmluZSBfU0NJQ19TRFNfVU5TT0xJQ0lURURfRlJBTUVfQ09OVFJPTF9IXworCisjaW5jbHVkZSAiaXNjaS5oIgorCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9IRUFERVJfREFUQV9EV09SRFMgMTUKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3Vuc29saWNpdGVkX2ZyYW1lX2hlYWRlciAtCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVsaW5lYXRlcyB0aGUgZm9ybWF0IG9mIGFuIHVuc29saWNpdGVkIGZyYW1lIGhlYWRlci4gVGhlCisgKiBmaXJzdCBEV09SRCBhcmUgVUYgYXR0cmlidXRlcyBkZWZpbmVkIGJ5IHRoZSBzaWxpY29uIGFyY2hpdGVjdHVyZS4gVGhlIGRhdGEKKyAqIGRlcGljdHMgYWN0dWFsIGhlYWRlciBpbmZvcm1hdGlvbiByZWNlaXZlZCBvbiB0aGUgbGluay4KKyAqLworc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIGlmIHRoZXJlIGlzIGFuIEluaXRpYXRvciBJbmRleCBUYWJsZSBlbnRyeSB3aXRoCisJICogd2hpY2ggdGhpcyBoZWFkZXIgaXMgYXNzb2NpYXRlZC4KKwkgKi8KKwl1MzIgaWl0X2V4aXN0czoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBzaW1wbHkgaW5kaWNhdGVzIHRoZSBwcm90b2NvbCB0eXBlIChpLmUuIFNTUCwgU1RQLCBTTVApLgorCSAqLworCXUzMiBwcm90b2NvbF90eXBlOjM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyBpZiB0aGUgZnJhbWUgaXMgYW4gYWRkcmVzcyBmcmFtZSAoSUFGIG9yIE9BRikKKwkgKiBvciBpZiBpdCBpcyBhIGluZm9ybWF0aW9uIHVuaXQgZnJhbWUuCisJICovCisJdTMyIGlzX2FkZHJlc3NfZnJhbWU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc2ltcGx5IGluZGljYXRlcyB0aGUgY29ubmVjdGlvbiByYXRlIGF0IHdoaWNoIHRoZSBmcmFtZQorCSAqIHdhcyByZWNlaXZlZC4KKwkgKi8KKwl1MzIgY29ubmVjdGlvbl9yYXRlOjQ7CisKKwl1MzIgcmVzZXJ2ZWQ6MjM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBoZWFkZXIgZGF0YSByZWNlaXZlZCBvbiB0aGUgbGluay4KKwkgKi8KKwl1MzIgZGF0YVtTQ1VfVU5TT0xJQ0lURURfRlJBTUVfSEVBREVSX0RBVEFfRFdPUkRTXTsKKworfTsKKworCisKKy8qKgorICogZW51bSB1bnNvbGljaXRlZF9mcmFtZV9zdGF0ZSAtCisgKgorICogVGhpcyBlbnVtZXJhdGlvbiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHVuc29saWNpdGVkIGZyYW1lIHN0YXRlLiAgVGhlCisgKiBjb250cm9sbGVyIG9iamVjdCBjYW4gbm90IHVwZHRhdGUgdGhlIGhhcmR3YXJlIHVuc29saWNpdGVkIGZyYW1lIHB1dCBwb2ludGVyCisgKiB1bmxlc3MgaXQgaGFzIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBwcmlyb3IgdW5zb2xpY2l0ZWQgZnJhbWVzLgorICovCitlbnVtIHVuc29saWNpdGVkX2ZyYW1lX3N0YXRlIHsKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHdoZW4gdGhlIGZyYW1lIGlzIGVtcHR5IGFuZCBub3QgaW4gdXNlLiAgSXQgaXMKKwkgKiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVsZWFzZWQgc3RhdGUgaW4gdGhhdCB0aGUgaGFyZHdhcmUgY291bGQgRE1BCisJICogZGF0YSB0byB0aGlzIGZyYW1lIGJ1ZmZlci4KKwkgKi8KKwlVTlNPTElDSVRFRF9GUkFNRV9FTVBUWSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgc2V0IHdoZW4gdGhlIGZyYW1lIGJ1ZmZlciBpcyBpbiB1c2UgYnkgYnkgc29tZQorCSAqIG9iamVjdCBpbiB0aGUgc3lzdGVtLgorCSAqLworCVVOU09MSUNJVEVEX0ZSQU1FX0lOX1VTRSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgc2V0IHdoZW4gdGhlIGZyYW1lIGlzIHJldHVybmVkIHRvIHRoZSBmcmVlIHBvb2wKKwkgKiBidXQgb25lIG9yIG1vcmUgZnJhbWVzIHByaW9yIHRvIHRoaXMgb25lIGFyZSBzdGlsbCBpbiB1c2UuCisJICogT25jZSBhbGwgb2YgdGhlIGZyYW1lIGJlZm9yZSB0aGlzIG9uZSBhcmUgZnJlZWQgaXQgd2lsbCBnbyB0bworCSAqIHRoZSBlbXB0eSBzdGF0ZS4KKwkgKi8KKwlVTlNPTElDSVRFRF9GUkFNRV9SRUxFQVNFRCwKKworCVVOU09MSUNJVEVEX0ZSQU1FX01BWF9TVEFURVMKK307CisKKy8qKgorICogc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSAtCisgKgorICogVGhpcyBpcyB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgZGF0YSBzdHJ1Y3R1cmUgaXQgYWN0cyBhcyB0aGUgY29udGFpbmVyIGZvcgorICogdGhlIGN1cnJlbnQgZnJhbWUgc3RhdGUsIGZyYW1lIGhlYWRlciBhbmQgZnJhbWUgYnVmZmVyLgorICovCitzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBjdXJyZW50IGZyYW1lIHN0YXRlCisJICovCisJZW51bSB1bnNvbGljaXRlZF9mcmFtZV9zdGF0ZSBzdGF0ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgcG9pbnRzIHRvIHRoZSBmcmFtZSBoZWFkZXIgZGF0YS4KKwkgKi8KKwlzdHJ1Y3Qgc2N1X3Vuc29saWNpdGVkX2ZyYW1lX2hlYWRlciAqaGVhZGVyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBwb2ludHMgdG8gdGhlIGZyYW1lIGJ1ZmZlciBkYXRhLgorCSAqLworCXZvaWQgKmJ1ZmZlcjsKKworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3VmX2hlYWRlcl9hcnJheSAtCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBoZWFkZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBzY2lfdWZfaGVhZGVyX2FycmF5IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlcHJlc2VudHMgYSB2aXJ0dWFsIHBvaW50ZXIgdG8gdGhlIHN0YXJ0CisJICogYWRkcmVzcyBvZiB0aGUgVUYgYWRkcmVzcyB0YWJsZS4gIFRoZSB0YWJsZSBjb250YWlucworCSAqIDY0LWJpdCBwb2ludGVycyBhcyByZXF1aXJlZCBieSB0aGUgaGFyZHdhcmUuCisJICovCisJc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgKmFycmF5OworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgbG9jYXRpb24gZm9yIHRoZSBVRgorCSAqIGJ1ZmZlciBhcnJheS4KKwkgKi8KKwlkbWFfYWRkcl90IHBoeXNpY2FsX2FkZHJlc3M7CisKK307CisKKy8qKgorICogc3RydWN0IHNjaV91Zl9idWZmZXJfYXJyYXkgLQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBvZiB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgYnVmZmVyIChhY3R1YWwgcGF5bG9hZCkKKyAqIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3Qgc2NpX3VmX2J1ZmZlcl9hcnJheSB7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgZGF0YSBpdHMgdXNlZCB0byBtYW5hZ2UKKwkgKiB0aGUgZGF0YSBmb3IgdGhlIHVuc29saWNpdGVkIGZyYW1lIHJlcXVlc3RzLiAgSXQgYWxzbyByZXByZXNlbnRzCisJICogdGhlIHZpcnR1YWwgYWRkcmVzcyBsb2NhdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorCSAqIHBoeXNpY2FsX2FkZHJlc3MgZmllbGQuCisJICovCisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSBhcnJheVtTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FU107CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBsb2NhdGlvbiBmb3IgdGhlIFVGCisJICogYnVmZmVyIGFycmF5LgorCSAqLworCWRtYV9hZGRyX3QgcGh5c2ljYWxfYWRkcmVzczsKK307CisKKy8qKgorICogc3RydWN0IHNjaV91Zl9hZGRyZXNzX3RhYmxlX2FycmF5IC0KKyAqCisgKiBUaGlzIG9iamVjdCBtYWludGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBhZGRyZXNzIHRhYmxlIHNwZWNpZmljCisgKiBkYXRhLiAgVGhlIGFkZHJlc3MgdGFibGUgaXMgYSBjb2xsZWN0aW9uIG9mIDY0LWJpdCBwb2ludGVycyB0aGF0IHBvaW50IHRvCisgKiAxS0IgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBzaWxpY29uIHdpbGwgRE1BIHVuc29saWNpdGVkIGZyYW1lcy4KKyAqLworc3RydWN0IHNjaV91Zl9hZGRyZXNzX3RhYmxlX2FycmF5IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHJlcHJlc2VudHMgYSB2aXJ0dWFsIHBvaW50ZXIgdGhhdCByZWZlcnMgdG8gdGhlCisJICogc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgVUYgYWRkcmVzcyB0YWJsZS4KKwkgKiA2NC1iaXQgcG9pbnRlcnMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlkbWFfYWRkcl90ICphcnJheTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGxvY2F0aW9uIGZvciB0aGUgVUYKKwkgKiBhZGRyZXNzIHRhYmxlLgorCSAqLworCWRtYV9hZGRyX3QgcGh5c2ljYWxfYWRkcmVzczsKKworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgLQorICoKKyAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gaGFuZGxlIHVuc29saWNpdGVkIGZyYW1lcy4KKyAqLworc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBzb2Z0d2FyZSBjb3B5IG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBxdWV1ZQorCSAqIGdldCBwb2ludGVyLiAgVGhlIGNvbnRyb2xsZXIgb2JqZWN0IHdyaXRlcyB0aGlzIHZhbHVlIHRvIHRoZQorCSAqIGhhcmR3YXJlIHRvIGxldCB0aGUgaGFyZHdhcmUgcHV0IG1vcmUgdW5zb2xpY2l0ZWQgZnJhbWUgZW50cmllcy4KKwkgKi8KKwl1MzIgZ2V0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGhlYWRlcgorCSAqIHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX3VmX2hlYWRlcl9hcnJheSBoZWFkZXJzOworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGJ1ZmZlcgorCSAqIHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX3VmX2J1ZmZlcl9hcnJheSBidWZmZXJzOworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGFkZHJlc3MgdGFibGUKKwkgKiBzcGVjaWZpYyBmaWVsZHMuCisJICovCisJc3RydWN0IHNjaV91Zl9hZGRyZXNzX3RhYmxlX2FycmF5IGFkZHJlc3NfdGFibGU7CisKK307CisKK3N0cnVjdCBpc2NpX2hvc3Q7CisKK2ludCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJdTMyIGZyYW1lX2luZGV4LAorCXZvaWQgKipmcmFtZV9oZWFkZXIpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJdTMyIGZyYW1lX2luZGV4LAorCXZvaWQgKipmcmFtZV9idWZmZXIpOworCitib29sIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX3JlbGVhc2VfZnJhbWUoCisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCXUzMiBmcmFtZV9pbmRleCk7CisKKyNlbmRpZiAvKiBfU0NJQ19TRFNfVU5TT0xJQ0lURURfRlJBTUVfQ09OVFJPTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDU4NTg0ZGMuLjQ0ZThjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQlrZnJlZShzZGV2KTsKIAkJZ290byBvdXQ7CiAJfQotCisJYmxrX2dldF9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKIAlzZGV2LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZWRhdGEgPSBzZGV2OwogCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIDAsIHNkZXYtPmhvc3QtPmNtZF9wZXJfbHVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggZTYzOTEyNS4uZTBiZDNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC0zMjIsNiArMzIyLDcgQEAKIAkJa2ZyZWUoZXZ0KTsKIAl9CiAKKwlibGtfcHV0X3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOwogCS8qIE5VTEwgcXVldWUgbWVhbnMgdGhlIGRldmljZSBjYW4ndCBiZSB1c2VkICovCiAJc2Rldi0+cmVxdWVzdF9xdWV1ZSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvY2xrL2NvcmUuYyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwppbmRleCA0ZjY0MTgzLi43ZTljMzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKKysrIGIvZHJpdmVycy9zaC9jbGsvY29yZS5jCkBAIC02MzUsNyArNjM1LDcgQEAKIAlzdHJ1Y3QgY2xrICpjbGtwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtwLCAmY2xvY2tfbGlzdCwgbm9kZSkgewotCQlpZiAobGlrZWx5KGNsa3AtPm9wcykpIHsKKwkJaWYgKGxpa2VseShjbGtwLT51c2Vjb3VudCAmJiBjbGtwLT5vcHMpKSB7CiAJCQl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtwLT5yYXRlOwogCiAJCQlpZiAobGlrZWx5KGNsa3AtPm9wcy0+c2V0X3BhcmVudCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hbWJhLXBsMDIyLmMgYi9kcml2ZXJzL3NwaS9hbWJhLXBsMDIyLmMKaW5kZXggNmE5ZTU4ZC4uZDE4Y2U5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvYW1iYS1wbDAyMi5jCisrKyBiL2RyaXZlcnMvc3BpL2FtYmEtcGwwMjIuYwpAQCAtMTg2MSw2ICsxODYxLDcgQEAKIAl9CiAJaWYgKChjbGtfZnJlcS5jcHNkdnNyIDwgQ1BTRFZSX01JTikKIAkgICAgfHwgKGNsa19mcmVxLmNwc2R2c3IgPiBDUFNEVlJfTUFYKSkgeworCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlkZXZfZXJyKCZzcGktPmRldiwKIAkJCSJjcHNkdnNyIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOwogCQlnb3RvIGVycl9jb25maWdfcGFyYW1zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKaW5kZXggNmY4NmJhMC4uOTY5Y2RkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYworKysgYi9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIAl1bnNpZ25lZCBpbnQJCWNvdW50LCBjOwogCXVuc2lnbmVkIGxvbmcJCWJhc2UsIHR4X3JlZywgcnhfcmVnOwogCWludAkJCXdvcmRfbGVuLCBkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQ7Ci0JaW50CQkJZWxlbWVudHM7CisJaW50CQkJZWxlbWVudHMgPSAwOwogCXUzMgkJCWw7CiAJdTgJCQkqIHJ4OwogCWNvbnN0IHU4CQkqIHR4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2JmaW41eHguYyBiL2RyaXZlcnMvc3BpL3NwaV9iZmluNXh4LmMKaW5kZXggZjcwNmRiYS4uY2M4ODBjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2JmaW41eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGlfYmZpbjV4eC5jCkBAIC02ODEsMTMgKzY4MSwxNCBAQAogCWRydl9kYXRhLT5jc19jaGFuZ2UgPSB0cmFuc2Zlci0+Y3NfY2hhbmdlOwogCiAJLyogQml0cyBwZXIgd29yZCBzZXR1cCAqLwotCWJpdHNfcGVyX3dvcmQgPSB0cmFuc2Zlci0+Yml0c19wZXJfd29yZCA/IDogbWVzc2FnZS0+c3BpLT5iaXRzX3Blcl93b3JkOwotCWlmICgoYml0c19wZXJfd29yZCA+IDApICYmIChiaXRzX3Blcl93b3JkICUgMTYgPT0gMCkpIHsKKwliaXRzX3Blcl93b3JkID0gdHJhbnNmZXItPmJpdHNfcGVyX3dvcmQgPyA6CisJCW1lc3NhZ2UtPnNwaS0+Yml0c19wZXJfd29yZCA/IDogODsKKwlpZiAoYml0c19wZXJfd29yZCAlIDE2ID09IDApIHsKIAkJZHJ2X2RhdGEtPm5fYnl0ZXMgPSBiaXRzX3Blcl93b3JkLzg7CiAJCWRydl9kYXRhLT5sZW4gPSAodHJhbnNmZXItPmxlbikgPj4gMTsKIAkJY3Jfd2lkdGggPSBCSVRfQ1RMX1dPUkRTSVpFOwogCQlkcnZfZGF0YS0+b3BzID0gJmJmaW5fYmZpbl9zcGlfdHJhbnNmZXJfb3BzX3UxNjsKLQl9IGVsc2UgaWYgKChiaXRzX3Blcl93b3JkID4gMCkgJiYgKGJpdHNfcGVyX3dvcmQgJSA4ID09IDApKSB7CisJfSBlbHNlIGlmIChiaXRzX3Blcl93b3JkICUgOCA9PSAwKSB7CiAJCWRydl9kYXRhLT5uX2J5dGVzID0gYml0c19wZXJfd29yZC84OwogCQlkcnZfZGF0YS0+bGVuID0gdHJhbnNmZXItPmxlbjsKIAkJY3Jfd2lkdGggPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3MzYzY0eHguYyBiL2RyaXZlcnMvc3BpL3NwaV9zM2M2NHh4LmMKaW5kZXggNzk1ODI4Yi4uODk0NWUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3MzYzY0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGlfczNjNjR4eC5jCkBAIC0xMTYsOSArMTE2LDcgQEAKIAkJCQkJKCgoaSktPmZpZm9fbHZsX21hc2sgKyAxKSkpIFwKIAkJCQkJPyAxIDogMCkKIAotI2RlZmluZSBTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHYsIGkpICgoKCh2KSA+PiAoaSktPnJ4X2x2bF9vZmZzZXQpICYgXAotCQkJCQkoKChpKS0+Zmlmb19sdmxfbWFzayArIDEpIDw8IDEpKSBcCi0JCQkJCT8gMSA6IDApCisjZGVmaW5lIFMzQzY0WFhfU1BJX1NUX1RYX0RPTkUodiwgaSkgKCgodikgJiAoMSA8PCAoaSktPnR4X3N0X2RvbmUpKSA/IDEgOiAwKQogI2RlZmluZSBUWF9GSUZPX0xWTCh2LCBpKSAoKCh2KSA+PiA2KSAmIChpKS0+Zmlmb19sdmxfbWFzaykKICNkZWZpbmUgUlhfRklGT19MVkwodiwgaSkgKCgodikgPj4gKGkpLT5yeF9sdmxfb2Zmc2V0KSAmIChpKS0+Zmlmb19sdmxfbWFzaykKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKaW5kZXggODJmZWIzNC4uZDY2MjBhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCkBAIC01MTYsOCArNTE2LDE3IEBACiAKIHN0YXRpYyB2b2lkIHNzYl9wY2ljb3JlX2luaXRfY2xpZW50bW9kZShzdHJ1Y3Qgc3NiX3BjaWNvcmUgKnBjKQogeworCXNzYl9wY2ljb3JlX2ZpeF9zcHJvbV9jb3JlX2luZGV4KHBjKTsKKwogCS8qIERpc2FibGUgUENJIGludGVycnVwdHMuICovCiAJc3NiX3dyaXRlMzIocGMtPmRldiwgU1NCX0lOVFZFQywgMCk7CisKKwkvKiBBZGRpdGlvbmFsIFBDSWUgYWx3YXlzIG9uY2UtZXhlY3V0ZWQgd29ya2Fyb3VuZHMgKi8KKwlpZiAocGMtPmRldi0+aWQuY29yZWlkID09IFNTQl9ERVZfUENJRSkgeworCQlzc2JfcGNpY29yZV9zZXJkZXNfd29ya2Fyb3VuZChwYyk7CisJCS8qIFRPRE86IEFTUE0gKi8KKwkJLyogVE9ETzogQ2xvY2sgUmVxdWVzdCBVcGRhdGUgKi8KKwl9CiB9CiAKIHZvaWQgc3NiX3BjaWNvcmVfaW5pdChzdHJ1Y3Qgc3NiX3BjaWNvcmUgKnBjKQpAQCAtNTI5LDggKzUzOCw2IEBACiAJaWYgKCFzc2JfZGV2aWNlX2lzX2VuYWJsZWQoZGV2KSkKIAkJc3NiX2RldmljZV9lbmFibGUoZGV2LCAwKTsKIAotCXNzYl9wY2ljb3JlX2ZpeF9zcHJvbV9jb3JlX2luZGV4KHBjKTsKLQogI2lmZGVmIENPTkZJR19TU0JfUENJQ09SRV9IT1NUTU9ERQogCXBjLT5ob3N0bW9kZSA9IHBjaWNvcmVfaXNfaW5faG9zdG1vZGUocGMpOwogCWlmIChwYy0+aG9zdG1vZGUpCkBAIC01MzgsMTEgKzU0NSw2IEBACiAjZW5kaWYgLyogQ09ORklHX1NTQl9QQ0lDT1JFX0hPU1RNT0RFICovCiAJaWYgKCFwYy0+aG9zdG1vZGUpCiAJCXNzYl9wY2ljb3JlX2luaXRfY2xpZW50bW9kZShwYyk7Ci0KLQkvKiBBZGRpdGlvbmFsIGFsd2F5cyBvbmNlLWV4ZWN1dGVkIHdvcmthcm91bmRzICovCi0Jc3NiX3BjaWNvcmVfc2VyZGVzX3dvcmthcm91bmQocGMpOwotCS8qIFRPRE86IEFTUE0gKi8KLQkvKiBUT0RPOiBDbG9jayBSZXF1ZXN0IFVwZGF0ZSAqLwogfQogCiBzdGF0aWMgdTMyIHNzYl9wY2llX3JlYWQoc3RydWN0IHNzYl9wY2ljb3JlICpwYywgdTMyIGFkZHJlc3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IGRmYzE2ZjkuLjE5NjI4NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC0yNCwyMyArMjQsNiBAQAogCiBpZiBTVEFHSU5HCiAKLWNvbmZpZyBTVEFHSU5HX0VYQ0xVREVfQlVJTEQKLQlib29sICJFeGNsdWRlIFN0YWdpbmcgZHJpdmVycyBmcm9tIGJlaW5nIGJ1aWx0IiBpZiBTVEFHSU5HCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgQXJlIHlvdSBzdXJlIHlvdSByZWFsbHkgd2FudCB0byBidWlsZCB0aGUgc3RhZ2luZyBkcml2ZXJzPwotCSAgVGhleSB0YWludCB5b3VyIGtlcm5lbCwgZG9uJ3QgbGl2ZSB1cCB0byB0aGUgbm9ybWFsIExpbnV4Ci0JICBrZXJuZWwgcXVhbGl0eSBzdGFuZGFyZHMsIGFyZSBhIGJpdCBjcnVmdHkgYXJvdW5kIHRoZSBlZGdlcywKLQkgIGFuZCBtaWdodCBnbyBvZmYgYW5kIGtpY2sgeW91ciBkb2cgd2hlbiB5b3UgYXJlbid0IHBheWluZwotCSAgYXR0ZW50aW9uLgotCi0JICBTYXkgTiBoZXJlIHRvIGJlIGFibGUgdG8gc2VsZWN0IGFuZCBidWlsZCB0aGUgU3RhZ2luZyBkcml2ZXJzLgotCSAgVGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IGhlcmUgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgYnVpbHQKLQkgIHdoZW4gc2VsZWN0aW5nICdtYWtlIGFsbHllc2NvbmZnJyBhbmQgJ21ha2UgYWxsbW9kY29uZmlnJyBzbwotCSAgZG9uJ3QgYmUgYWxsIHRoYXQgcHV0IG9mZiwgeW91ciBkb2cgd2lsbCBiZSBqdXN0IGZpbmUuCi0KLWlmICFTVEFHSU5HX0VYQ0xVREVfQlVJTEQKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdHR5L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2dlbmVyaWNfc2VyaWFsL0tjb25maWciCkBAIC0xNzcsNSArMTYwLDQgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnIgogCi1lbmRpZiAjICFTVEFHSU5HX0VYQ0xVREVfQlVJTEQKIGVuZGlmICMgU1RBR0lORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCmluZGV4IDg3NjMwODguLjhiMTYyMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHN0YWdpbmcvYWx0ZXJhLmg+CisjaW5jbHVkZSAiYWx0ZXJhLmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKaW5kZXggMDVhYWQzNS4uOWNkNWU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8c3RhZ2luZy9hbHRlcmEuaD4KKyNpbmNsdWRlICJhbHRlcmEuaCIKICNpbmNsdWRlICJhbHRlcmEtZXhwcnQuaCIKICNpbmNsdWRlICJhbHRlcmEtanRhZy5oIgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YWdpbmcvYWx0ZXJhLmggYi9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL3N0YWdpbmcvYWx0ZXJhLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvS2NvbmZpZwppbmRleCAxZjE1ZTFmLi5hZmQ2Y2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIEFUSDZLX0xFR0FDWQogCXRyaXN0YXRlICJBdGhlcm9zIEFSNjAwMyBzdXBwb3J0IChub24gbWFjODAyMTEpIgogICAgICAgICBkZXBlbmRzIG9uIE1NQyAmJiBXTEFOCisJZGVwZW5kcyBvbiBDRkc4MDIxMQogICAgICAgICBzZWxlY3QgV0lSRUxFU1NfRVhUCiAgICAgICAgIHNlbGVjdCBXRVhUX1BSSVYKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2NmZzgwMjExLmMKaW5kZXggNzdkZmI0MC4uZDNhNzc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvY2ZnODAyMTEuYwpAQCAtODcwLDcgKzg3MCw4IEBACiAgICAgaWYoYXItPnNjYW5fcmVxdWVzdCkKICAgICB7CiAgICAgICAgIC8qIFRyYW5zbGF0ZSBkYXRhIHRvIGNmZzgwMjExIG1nbXQgZm9ybWF0ICovCi0gICAgICAgIHdtaV9pdGVyYXRlX25vZGVzKGFyLT5hcldtaSwgYXI2a19jZmc4MDIxMV9zY2FuX25vZGUsIGFyLT53ZGV2LT53aXBoeSk7CisJaWYgKGFyLT5hcldtaSkKKwkJd21pX2l0ZXJhdGVfbm9kZXMoYXItPmFyV21pLCBhcjZrX2NmZzgwMjExX3NjYW5fbm9kZSwgYXItPndkZXYtPndpcGh5KTsKIAogICAgICAgICBjZmc4MDIxMV9zY2FuX2RvbmUoYXItPnNjYW5fcmVxdWVzdCwKICAgICAgICAgICAgICgoc3RhdHVzICYgQV9FQ0FOQ0VMRUQpIHx8IChzdGF0dXMgJiBBX0VCVVNZKSkgPyB0cnVlIDogZmFsc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9LY29uZmlnCmluZGV4IGY0Y2Y5YjIuLjM3OWNmMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAJZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiBQQ0kKIAlkZXBlbmRzIG9uIFdMQU4gJiYgTUFDODAyMTEKKwlkZXBlbmRzIG9uIFg4NiB8fCBNSVBTCiAJc2VsZWN0IEJSQ01VVElMCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBDUkNfQ0NJVFQKQEAgLTIwLDYgKzIxLDcgQEAKIAlkZWZhdWx0IG4KIAlkZXBlbmRzIG9uIE1NQwogCWRlcGVuZHMgb24gV0xBTiAmJiBDRkc4MDIxMQorCWRlcGVuZHMgb24gWDg2IHx8IE1JUFMKIAlzZWxlY3QgQlJDTVVUSUwKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFdJUkVMRVNTX0VYVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jCmluZGV4IDkyOWNlYWYuLjE1ZTFiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMKQEAgLTY0LDggKzY0LDYgQEAKIGV4dGVybiBib29sIHdsX2l3X2Nvbm5fc3RhdHVzX3N0cih1MzIgZXZlbnRfdHlwZSwgdTMyIHN0YXR1cywKIAkJCQkgIHUzMiByZWFzb24sIGNoYXIgKnN0cmluZ0J1ZiwgdWludCBidWZsZW4pOwogCi11aW50IHdsX21zZ19sZXZlbCA9IFdMX0VSUk9SX1ZBTDsKLQogI2RlZmluZSBNQVhfV0xJV19JT0NUTF9MRU4gMTAyNAogCiAjaWZkZWYgQ09ORklHX1dJUkVMRVNTX0VYVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCmluZGV4IDE1MDJkODAuLjIwMDA4YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTIsNiArMiw3IEBACiAJdHJpc3RhdGUgIkRhdGEgYWNxdWlzaXRpb24gc3VwcG9ydCAoY29tZWRpKSIKIAlkZWZhdWx0IE4KIAlkZXBlbmRzIG9uIG0KKwlkZXBlbmRzIG9uIEJST0tFTiB8fCBGUlYgfHwgTTMyUiB8fCBNTjEwMzAwIHx8IFNVUEVSSCB8fCBUSUxFIHx8IFg4NgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGEgd2lkZSByYW5nZSBvZiBkYXRhIGFjcXVpc2l0aW9uIGRldmljZXMKIAkgIGZvciBMaW51eC4KQEAgLTE2MCw2ICsxNjEsNyBAQAogCiBjb25maWcgQ09NRURJX1BDTDgxMgogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTgxMi84MTMgYW5kIEFEbGluayBBQ0wtODExMi84MTEzLzgxMTMvODIxNiIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODEyL1BHLCBQQ0wtODEzL0IsIEFETGluawpAQCAtMTcxLDYgKzE3Myw3IEBACiAKIGNvbmZpZyBDT01FRElfUENMODE2CiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0wtODE0IGFuZCBQQ0wtODE2IElTQSBjYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxNCBhbmQgUENMLTgxNiBJU0EgY2FyZHMKQEAgLTE4MCw2ICsxODMsNyBAQAogCiBjb25maWcgQ09NRURJX1BDTDgxOAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTcxOCBhbmQgUENMLTgxOCBJU0EgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC04MTggSVNBIGNhcmRzCkBAIC0yNjksNiArMjczLDcgQEAKIAogY29uZmlnIENPTUVESV9EQVMxODAwCiAJdHJpc3RhdGUgIkRBUzE4MDAgYW5kIGNvbXBhdGlibGUgSVNBIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJc2VsZWN0IENPTUVESV9GQwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KQEAgLTM0MCw2ICszNDUsNyBAQAogY29uZmlnIENPTUVESV9EVDI4MlgKIAl0cmlzdGF0ZSAiRGF0YSBUcmFuc2xhdGlvbiBEVDI4MjEgc2VyaWVzIGFuZCBEVC1FWiBJU0EgY2FyZCBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfRkMKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERhdGEgVHJhbnNsYXRpb24gRFQyODIxIHNlcmllcyBpbmNsdWRpbmcgRFQtRVoKQEAgLTQxOSw2ICs0MjUsNyBAQAogY29uZmlnIENPTUVESV9OSV9BVF9BMjE1MAogCXRyaXN0YXRlICJOSSBBVC1BMjE1MCBJU0EgY2FyZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQ09NRURJX05JX0NPTU1PTgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgQVQtQTIxNTAgY2FyZHMKQEAgLTUzNiw2ICs1NDMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8wMzUKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMDM1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8wMzUgY2FyZHMKQEAgLTU0NSw2ICs1NTMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8xMDMyCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzEwMzIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzEwMzIgY2FyZHMKQEAgLTU1NCw2ICs1NjMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8xNTAwCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzE1MDAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzE1MDAgY2FyZHMKQEAgLTU2Myw2ICs1NzMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8xNTE2CiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzE1MTYgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzE1MTYgY2FyZHMKQEAgLTU3Miw2ICs1ODMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8xNTY0CiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzE1NjQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzE1NjQgY2FyZHMKQEAgLTU4MSw2ICs1OTMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8xNlhYCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzE2eHggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzE2eHggY2FyZHMKQEAgLTU5MCw2ICs2MDMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8yMDE2CiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzIwMTYgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzIwMTYgY2FyZHMKQEAgLTU5OSw2ICs2MTMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8yMDMyCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzIwMzIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzIwMzIgY2FyZHMKQEAgLTYwOCw2ICs2MjMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8yMjAwCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzIyMDAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzIyMDAgY2FyZHMKQEAgLTYxNyw2ICs2MzMsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8zMDAxCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzMwMDEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJc2VsZWN0IENPTUVESV9GQwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KQEAgLTYyNyw2ICs2NDQsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8zMTIwCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzM1MjAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJc2VsZWN0IENPTUVESV9GQwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KQEAgLTYzNyw2ICs2NTUsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8zNTAxCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzM1MDEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzM1MDEgY2FyZHMKQEAgLTY0Niw2ICs2NjUsNyBAQAogCiBjb25maWcgQ09NRURJX0FERElfQVBDSV8zWFhYCiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzN4eHggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzN4eHggY2FyZHMKQEAgLTcxMiw2ICs3MzIsNyBAQAogY29uZmlnIENPTUVESV9BRExfUENJOTExOAogCXRyaXN0YXRlICJBRExpbmsgUENJLTkxMThERywgUENJLTkxMThIRywgUENJLTkxMThIUiBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfRkMKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEbGluayBQQ0ktOTExOERHLCBQQ0ktOTExOEhHLCBQQ0ktOTExOEhSIGNhcmRzCkBAIC0xMjg3LDYgKzEzMDgsNyBAQAogCWRlcGVuZHMgb24gQ09NRURJX01JVEUKIAlzZWxlY3QgQ09NRURJXzgyNTUKIAlzZWxlY3QgQ09NRURJX0ZDCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBMYWItUEMgYW5kIGNvbXBhdGlibGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCmluZGV4IDFjNDVjMTEuLmFhODdiMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCkBAIC01NDIsNiArNTQyLDggQEAKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCWludCByZXQgPSAtRU5PTUVNOwogCXVpbnQzMl90IHR0X3BhZ2VzOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKnBzYl9pbnRlbF9vdXRwdXQ7CiAKIAlkZXZfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZfcHJpdiksIEdGUF9LRVJORUwpOwogCWlmIChkZXZfcHJpdiA9PSBOVUxMKQpAQCAtNjYzLDcgKzY2NSwxOCBAQAogCQlkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoZGV2KTsKIAl9CiAKLQlyZXQgPSBwc2JfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwkvKiBPbmx5IGFkZCBiYWNrbGlnaHQgc3VwcG9ydCBpZiB3ZSBoYXZlIExWRFMgb3V0cHV0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LAorCQkJICAgIGhlYWQpIHsKKwkJcHNiX2ludGVsX291dHB1dCA9IHRvX3BzYl9pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCQlzd2l0Y2ggKHBzYl9pbnRlbF9vdXRwdXQtPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfTFZEUzoKKwkJCXJldCA9IHBzYl9iYWNrbGlnaHRfaW5pdChkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jCmluZGV4IDk5YzAzYTIuLjA4NGMzNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ZiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZmIuYwpAQCAtNDQxLDYgKzQ0MSwxNiBAQAogCWluZm8tPnNjcmVlbl9zaXplID0gc2l6ZTsKIAltZW1zZXQoaW5mby0+c2NyZWVuX2Jhc2UsIDAsIHNpemUpOwogCisJaWYgKGRldl9wcml2LT5wZy0+c3RvbGVuX3NpemUpIHsKKwkJaW5mby0+YXBlcnR1cmVzID0gYWxsb2NfYXBlcnR1cmVzKDEpOworCQlpZiAoIWluZm8tPmFwZXJ0dXJlcykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2VycjA7CisJCX0KKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSA9IGRldi0+bW9kZV9jb25maWcuZmJfYmFzZTsKKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IGRldl9wcml2LT5wZy0+c3RvbGVuX3NpemU7CisJfQorCiAJZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChpbmZvLCBmYi0+cGl0Y2gsIGZiLT5kZXB0aCk7CiAJZHJtX2ZiX2hlbHBlcl9maWxsX3ZhcihpbmZvLCAmZmJkZXYtPnBzYl9mYl9oZWxwZXIsCiAJCQkJc2l6ZXMtPmZiX3dpZHRoLCBzaXplcy0+ZmJfaGVpZ2h0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2Jpb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2Jpb3MuYwppbmRleCA0OGFjOGJhLi40MTc5NjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9iaW9zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfYmlvcy5jCkBAIC0xNTQsMTAgKzE1NCwxNSBAQAogCiAJZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEocGFuZWxfZml4ZWRfbW9kZSwgZHZvX3RpbWluZyk7CiAKLQlkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwotCi0JRFJNX0RFQlVHKCJGb3VuZCBwYW5lbCBtb2RlIGluIEJJT1MgVkJUIHRhYmxlczpcbiIpOwotCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUocGFuZWxfZml4ZWRfbW9kZSk7CisJaWYgKHBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA+IDAgJiYgcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsID4gMCkgeworCQlkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOworCQlEUk1fREVCVUcoIkZvdW5kIHBhbmVsIG1vZGUgaW4gQklPUyBWQlQgdGFibGVzOlxuIik7CisJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUocGFuZWxfZml4ZWRfbW9kZSk7CisJfSBlbHNlIHsKKwkJRFJNX0RFQlVHKCJJZ25vcmluZyBib2d1cyBMVkRTIFZCVCBtb2RlLlxuIik7CisJCWRldl9wcml2LT5sdmRzX3ZidCA9IDA7CisJCWtmcmVlKHBhbmVsX2ZpeGVkX21vZGUpOworCX0KIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwppbmRleCBmOTZkNWI1Li5kMzI5NjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCkBAIC00LDcgKzQsNyBAQAogCiBtZW51Y29uZmlnIElJTwogCXRyaXN0YXRlICJJbmR1c3RyaWFsIEkvTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gIVMzOTAKKwlkZXBlbmRzIG9uIEdFTkVSSUNfSEFSRElSUVMKIAloZWxwCiAJICBUaGUgaW5kdXN0cmlhbCBJL08gc3Vic3lzdGVtIHByb3ZpZGVzIGEgdW5pZmllZCBmcmFtZXdvcmsgZm9yCiAJICBkcml2ZXJzIGZvciBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBlbWJlZGRlZCBzZW5zb3JzIHVzaW5nIGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oCmluZGV4IDBiOWI4NTQuLjRjYzFhNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaApAQCAtODEsNyArODEsNiBAQAogCiBpbnQgYWRpczE2MjAxX3NldF9pcnEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgYm9vbCBlbmFibGUpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogZW51bSBhZGlzMTYyMDFfc2NhbiB7CiAJQURJUzE2MjAxX1NDQU5fU1VQUExZLAogCUFESVMxNjIwMV9TQ0FOX0FDQ19YLApAQCAtOTIsNiArOTEsNyBAQAogCUFESVMxNjIwMV9TQ0FOX0lOQ0xJX1ksCiB9OwogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oCmluZGV4IDhiYjhjZTUuLjE3NWUyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaApAQCAtNzYsNyArNzYsNiBAQAogCiBpbnQgYWRpczE2MjAzX3NldF9pcnEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgYm9vbCBlbmFibGUpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogZW51bSBhZGlzMTYyMDNfc2NhbiB7CiAJQURJUzE2MjAzX1NDQU5fU1VQUExZLAogCUFESVMxNjIwM19TQ0FOX0FVWF9BREMsCkBAIC04NSw2ICs4NCw3IEBACiAJQURJUzE2MjAzX1NDQU5fSU5DTElfWSwKIH07CiAKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCiB2b2lkIGFkaXMxNjIwM19yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBhZGlzMTYyMDNfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKaW5kZXggNTMxMGE0Mi4uMTY5MGMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oCkBAIC04NCw3ICs4NCw2IEBACiAKIGludCBhZGlzMTYyMDRfc2V0X2lycShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBib29sIGVuYWJsZSk7CiAKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCiBlbnVtIGFkaXMxNjIwNF9zY2FuIHsKIAlBRElTMTYyMDRfU0NBTl9TVVBQTFksCiAJQURJUzE2MjA0X1NDQU5fQUNDX1gsCkBAIC05Myw2ICs5Miw3IEBACiAJQURJUzE2MjA0X1NDQU5fVEVNUCwKIH07CiAKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCiB2b2lkIGFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBhZGlzMTYyMDRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKaW5kZXggNThkMDhkYi4uMzE1M2NiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCkBAIC0xMjEsOCArMTIxLDYgQEAKIAogaW50IGFkaXMxNjIwOV9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKLQogI2RlZmluZSBBRElTMTYyMDlfU0NBTl9TVVBQTFkJMAogI2RlZmluZSBBRElTMTYyMDlfU0NBTl9BQ0NfWAkxCiAjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX0FDQ19ZCTIKQEAgLTEzMiw2ICsxMzAsOCBAQAogI2RlZmluZSBBRElTMTYyMDlfU0NBTl9JTkNMSV9ZCTYKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fUk9UCTcKIAorI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKwogdm9pZCBhZGlzMTYyMDlfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjA5X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvbWF4NTE3LmMKaW5kZXggODgxNzY4ZC4uMmZlMzRkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvbWF4NTE3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvbWF4NTE3LmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtYXg1MThfaW5mbyA9IHsKLQkuYXR0cnMgPSAmbWF4NTE3X2F0dHJpYnV0ZV9ncm91cCwKKwkuYXR0cnMgPSAmbWF4NTE4X2F0dHJpYnV0ZV9ncm91cCwKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCmluZGV4IDcwMmRjOTguLjI0YmY3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKQEAgLTEwNCw3ICsxMDQsNiBAQAogCiBpbnQgYWRpczE2MjYwX3NldF9pcnEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgYm9vbCBlbmFibGUpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQogICovCkBAIC0xMTUsNiArMTE0LDcgQEAKICNkZWZpbmUgQURJUzE2MjYwX1NDQU5fVEVNUAkzCiAjZGVmaW5lIEFESVMxNjI2MF9TQ0FOX0FOR0wJNAogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTYyNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjYwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwLmgKaW5kZXggZGIxODRkMS4uZTg3NzE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwLmgKQEAgLTE1OCw3ICsxNTgsNiBAQAogCiBpbnQgYWRpczE2NDAwX3NldF9pcnEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgYm9vbCBlbmFibGUpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQogICovCkBAIC0xODIsNiArMTgxLDcgQEAKICNkZWZpbmUgQURJUzE2MzAwX1NDQU5fSU5DTElfWAkxMgogI2RlZmluZSBBRElTMTYzMDBfU0NBTl9JTkNMSV9ZCTEzCiAKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCiB2b2lkIGFkaXMxNjQwMF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBhZGlzMTY0MDBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKaW5kZXggMjU4OWE3ZS4uMzYxMjM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCkBAIC0xMzcsMTMgKzEzNywxMyBAQAogCQlpZiAoc3QtPnZhcmlhbnQtPmZsYWdzICYgQURJUzE2NDAwX05PX0JVUlNUKSB7CiAJCQlyZXQgPSBhZGlzMTYzNTBfc3BpX3JlYWRfYWxsKCZpbmRpb19kZXYtPmRldiwgc3QtPnJ4KTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byBlcnI7CiAJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKIAkJCQlkYXRhW2ldCT0gKihzMTYgKikoc3QtPnJ4ICsgaSoyKTsKIAkJfSBlbHNlIHsKIAkJCXJldCA9IGFkaXMxNjQwMF9zcGlfcmVhZF9idXJzdCgmaW5kaW9fZGV2LT5kZXYsIHN0LT5yeCk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gZXJyOwogCQkJZm9yICg7IGkgPCBpbmRpb19kZXYtPnJpbmctPnNjYW5fY291bnQ7IGkrKykgewogCQkJCWogPSBfX2ZmcyhtYXNrKTsKIAkJCQltYXNrICY9IH4oMSA8PCBqKTsKQEAgLTE1OCw5ICsxNTgsMTMgQEAKIAlyaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+cmluZywgKHU4ICopIGRhdGEsIHBmLT50aW1lc3RhbXApOwogCiAJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKLQlrZnJlZShkYXRhKTsKIAorCWtmcmVlKGRhdGEpOwogCXJldHVybiBJUlFfSEFORExFRDsKKworZXJyOgorCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgYWRpczE2NDAwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwppbmRleCA2MTU5MDIzLi5kNTA0YWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCkBAIC0yOTQsNiArMjk0LDcgQEAKIAlwZi0+aCA9IGg7CiAJcGYtPnRocmVhZCA9IHRocmVhZDsKIAlwZi0+dHlwZSA9IHR5cGU7CisJcGYtPnByaXZhdGVfZGF0YSA9IHByaXZhdGU7CiAKIAlyZXR1cm4gcGY7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaW1vbi5jCmluZGV4IDQwMzllZGEuLjRhOWU1NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaW1vbi5jCkBAIC02NzIsOCArNjcyLDYgQEAKIHN0YXRpYyB2b2lkIHVzYl9yeF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dDsKLQl1bnNpZ25lZCBjaGFyICpidWY7Ci0JaW50IGxlbjsKIAlpbnQgaW50Zm51bSA9IDA7CiAKIAlpZiAoIXVyYikKQEAgLTY4Myw5ICs2ODEsNiBAQAogCWlmICghY29udGV4dCkKIAkJcmV0dXJuOwogCi0JYnVmID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCWNhc2UgLUVOT0VOVDoJCS8qIHVzYmNvcmUgdW5saW5rIHN1Y2Nlc3NmdWwhICovCiAJCXJldHVybjsKQEAgLTcyOCw3ICs3MjMsNiBAQAogCWludCBpcl9lcF9mb3VuZCA9IDA7CiAJaW50IGFsbG9jX3N0YXR1cyA9IDA7CiAJaW50IHZmZF9wcm90b182cCA9IDA7Ci0JaW50IGNvZGVfbGVuZ3RoOwogCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOwogCWludCBpOwogCXUxNiB2ZW5kb3IsIHByb2R1Y3Q7CkBAIC03NDksOCArNzQzLDYgQEAKIAllbHNlCiAJCWNvbnRleHQtPmRpc3BsYXkgPSAxOwogCi0JY29kZV9sZW5ndGggPSBCVUZfQ0hVTktfU0laRSAqIDg7Ci0KIAl1c2JkZXYgICAgID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKIAlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKIAludW1fZW5kcHRzID0gaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOwpAQCAtODU2LDcgKzg0OCw3IEBACiAKIAlzdHJjcHkoZHJpdmVyLT5uYW1lLCBNT0RfTkFNRSk7CiAJZHJpdmVyLT5taW5vciA9IC0xOwotCWRyaXZlci0+Y29kZV9sZW5ndGggPSBzaXplb2YoaW50KSAqIDg7CisJZHJpdmVyLT5jb2RlX2xlbmd0aCA9IEJVRl9DSFVOS19TSVpFICogODsKIAlkcml2ZXItPnNhbXBsZV9yYXRlID0gMDsKIAlkcml2ZXItPmZlYXR1cmVzID0gTElSQ19DQU5fUkVDX01PREUyOwogCWRyaXZlci0+ZGF0YSA9IGNvbnRleHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zZXJpYWwuYwppbmRleCA0YTNjY2EwLi44MDVkZjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMKQEAgLTgzOCw3ICs4MzgsMjMgQEAKIAogc3RhdGljIGludCBpbml0X3BvcnQodm9pZCkKIHsKLQlpbnQgaSwgbmxvdywgbmhpZ2g7CisJaW50IGksIG5sb3csIG5oaWdoLCByZXN1bHQ7CisKKwlyZXN1bHQgPSByZXF1ZXN0X2lycShpcnEsIGlycV9oYW5kbGVyLAorCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgKHNoYXJlX2lycSA/IElSUUZfU0hBUkVEIDogMCksCisJCQkgICAgIExJUkNfRFJJVkVSX05BTUUsICh2b2lkICopJmhhcmR3YXJlKTsKKworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSAtRUJVU1k6CisJCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FICI6IElSUSAlZCBidXN5XG4iLCBpcnEpOworCQlyZXR1cm4gLUVCVVNZOworCWNhc2UgLUVJTlZBTDoKKwkJcHJpbnRrKEtFUk5fRVJSIExJUkNfRFJJVkVSX05BTUUKKwkJICAgICAgICI6IEJhZCBpcnEgbnVtYmVyIG9yIGhhbmRsZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OwogCiAJLyogUmVzZXJ2ZSBpbyByZWdpb24uICovCiAJLyoKQEAgLTg5MywzNCArOTA5LDE3IEBACiAJCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRSAgIjogTWFudWFsbHkgdXNpbmcgYWN0aXZlICIKIAkJICAgICAgICIlcyByZWNlaXZlclxuIiwgc2Vuc2UgPyAibG93IiA6ICJoaWdoIik7CiAKKwlkcHJpbnRrKCJJbnRlcnJ1cHQgJWQsIHBvcnQgJTA0eCBvYnRhaW5lZFxuIiwgaXJxLCBpbyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2V0X3VzZV9pbmModm9pZCAqZGF0YSkKIHsKLQlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBpbml0aWFsaXplIHRpbWVzdGFtcCAqLwogCWRvX2dldHRpbWVvZmRheSgmbGFzdHR2KTsKIAotCXJlc3VsdCA9IHJlcXVlc3RfaXJxKGlycSwgaXJxX2hhbmRsZXIsCi0JCQkgICAgIElSUUZfRElTQUJMRUQgfCAoc2hhcmVfaXJxID8gSVJRRl9TSEFSRUQgOiAwKSwKLQkJCSAgICAgTElSQ19EUklWRVJfTkFNRSwgKHZvaWQgKikmaGFyZHdhcmUpOwotCi0Jc3dpdGNoIChyZXN1bHQpIHsKLQljYXNlIC1FQlVTWToKLQkJcHJpbnRrKEtFUk5fRVJSIExJUkNfRFJJVkVSX05BTUUgIjogSVJRICVkIGJ1c3lcbiIsIGlycSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JY2FzZSAtRUlOVkFMOgotCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRQotCQkgICAgICAgIjogQmFkIGlycSBudW1iZXIgb3IgaGFuZGxlclxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCWRlZmF1bHQ6Ci0JCWRwcmludGsoIkludGVycnVwdCAlZCwgcG9ydCAlMDR4IG9idGFpbmVkXG4iLCBpcnEsIGlvKTsKLQkJYnJlYWs7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKIAogCS8qIFNldCBETEFCIDAuICovCkBAIC05NDUsMTAgKzk0NCw2IEBACiAJc291dHAoVUFSVF9JRVIsIHNpbnAoVUFSVF9JRVIpICYKIAkgICAgICAofihVQVJUX0lFUl9NU0l8VUFSVF9JRVJfUkxTSXxVQVJUX0lFUl9USFJJfFVBUlRfSUVSX1JESSkpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXJkd2FyZVt0eXBlXS5sb2NrLCBmbGFncyk7Ci0KLQlmcmVlX2lycShpcnEsICh2b2lkICopJmhhcmR3YXJlKTsKLQotCWRwcmludGsoImZyZWVkIElSUSAlZFxuIiwgaXJxKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbGlyY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLApAQCAtMTI1Niw2ICsxMjUxLDkgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBsaXJjX3NlcmlhbF9leGl0X21vZHVsZSh2b2lkKQogewogCWxpcmNfc2VyaWFsX2V4aXQoKTsKKworCWZyZWVfaXJxKGlycSwgKHZvaWQgKikmaGFyZHdhcmUpOworCiAJaWYgKGlvbW1hcCAhPSAwKQogCQlyZWxlYXNlX21lbV9yZWdpb24oaW9tbWFwLCA4IDw8IGlvc2hpZnQpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jCmluZGV4IGE3YjQ2ZjIuLjBkMzg2NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYwpAQCAtNzM5LDIzICs3MzksMTYgQEAKIHN0YXRpYyB2b2lkIHNlbmRfcHVsc2UodW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJbG9uZyBieXRlc19vdXQgPSBsZW4gLyBUSU1FX0NPTlNUOwotCWxvbmcgdGltZV9sZWZ0OwogCi0JdGltZV9sZWZ0ID0gKGxvbmcpbGVuIC0gKGxvbmcpYnl0ZXNfb3V0ICogKGxvbmcpVElNRV9DT05TVDsKLQlpZiAoYnl0ZXNfb3V0ID09IDApIHsKKwlpZiAoYnl0ZXNfb3V0ID09IDApCiAJCWJ5dGVzX291dCsrOwotCQl0aW1lX2xlZnQgPSAwOwotCX0KKwogCXdoaWxlIChieXRlc19vdXQtLSkgewogCQlvdXRiKFBVTFNFLCBpbyArIFVBUlRfVFgpOwogCQkvKiBGSVhNRSB0cmViYSBzZXJpb3puZSBjYWthbmllIHogY2hhci9zZXJpYWwuYyAqLwogCQl3aGlsZSAoIShpbmIoaW8gKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkKIAkJCTsKIAl9Ci0jaWYgMAotCWlmICh0aW1lX2xlZnQgPiAwKQotCQlzYWZlX3VkZWxheSh0aW1lX2xlZnQpOwotI2VuZGlmCiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jCmluZGV4IGRkNmE1N2MuLjRlMDUxZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMKQEAgLTQ3NSwxNCArNDc1LDE0IEBACiAJZHByaW50aygicG9sbCB0aHJlYWQgc3RhcnRlZFxuIik7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCiAJCS8qIGlmIGRldmljZSBub3Qgb3BlbmVkLCB3ZSBjYW4gc2xlZXAgaGFsZiBhIHNlY29uZCAqLwogCQlpZiAoYXRvbWljX3JlYWQoJmlyLT5vcGVuX2NvdW50KSA9PSAwKSB7CiAJCQlzY2hlZHVsZV90aW1lb3V0KEhaLzIpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCiAJCS8qCiAJCSAqIFRoaXMgaXMgfjExMyoyICsgMjQgKyBqaXR0ZXIgKDIqcmVwZWF0IGdhcCArIGNvZGUgbGVuZ3RoKS4KIAkJICogV2UgdXNlIHRoaXMgaW50ZXJ2YWwgYXMgdGhlIGNoaXAgcmVzZXRzIGV2ZXJ5IHRpbWUgeW91IHBvbGwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL21laS9pbml0LmMKaW5kZXggMjgxODg1MS4uNjg1ZmNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laS9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laS9pbml0LmMKQEAgLTE4OSw3ICsxODksNyBAQAogCQltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAl9CiAKLQlpZiAoIWVyciAmJiAhZGV2LT5yZWN2ZF9tc2cpIHsKKwlpZiAoZXJyIDw9IDAgJiYgIWRldi0+cmVjdmRfbXNnKSB7CiAJCWRldi0+bWVpX3N0YXRlID0gTUVJX0RJU0FCTEVEOwogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKIAkJCSJ3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCBmYWlsZWQiCkBAIC0yMDUsMTAgKzIwNSwxMCBAQAogCQkJImhvc3RfaHdfc3RhdGUgPSAweCUwOHgsIG1lX2h3X3N0YXRlID0gMHglMDh4LlxuIiwKIAkJCWRldi0+aG9zdF9od19zdGF0ZSwgZGV2LT5tZV9od19zdGF0ZSk7CiAKLQkJaWYgKCEoZGV2LT5ob3N0X2h3X3N0YXRlICYgSF9SRFkpICE9IEhfUkRZKQorCQlpZiAoIShkZXYtPmhvc3RfaHdfc3RhdGUgJiBIX1JEWSkpCiAJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhvc3QgdHVybiBvZmYgSF9SRFkuXG4iKTsKIAotCQlpZiAoIShkZXYtPm1lX2h3X3N0YXRlICYgTUVfUkRZX0hSQSkgIT0gTUVfUkRZX0hSQSkKKwkJaWYgKCEoZGV2LT5tZV9od19zdGF0ZSAmIE1FX1JEWV9IUkEpKQogCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJNRSB0dXJuIG9mZiBNRV9SRFkuXG4iKTsKIAogCQlwcmludGsoS0VSTl9FUlIgIm1laTogbGluayBsYXllciBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvd2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvd2QuYwppbmRleCAyNTY0YjAzLi5mZmY1M2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpL3dkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laS93ZC5jCkBAIC0xNjksMTAgKzE2OSwxNSBAQAogCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+d2FpdF9zdG9wX3dkLAogCQkJCQlkZXYtPndkX3N0b3BwZWQsIDEwICogSFopOwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwotCWlmICghZGV2LT53ZF9zdG9wcGVkKQotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInN0b3Agd2QgZmFpbGVkIHRvIGNvbXBsZXRlLlxuIik7Ci0JZWxzZQotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInN0b3Agd2QgY29tcGxldGUuXG4iKTsKKwlpZiAoZGV2LT53ZF9zdG9wcGVkKSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic3RvcCB3ZCBjb21wbGV0ZSByZXQ9JWQuXG4iLCByZXQpOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZGV2X3dhcm4oJmRldi0+cGRldi0+ZGV2LAorCQkJInN0b3Agd2QgZmFpbGVkIHRvIGNvbXBsZXRlIHJldD0lZC5cbiIsIHJldCk7CisJfQogCiAJaWYgKHByZXNlcnZlKQogCQlkZXYtPndkX3RpbWVvdXQgPSB3ZF90aW1lb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9LY29uZmlnCmluZGV4IGIwNTMwNjcuLmZlNDBlMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWcKQEAgLTIsNiArMiw3IEBACiAJdHJpc3RhdGUgIk9uZSBMYXB0b3AgUGVyIENoaWxkIERpc3BsYXkgQ09OdHJvbGxlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gT0xQQyAmJiBGQgogCXNlbGVjdCBJMkMKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCS0tLWhlbHAtLS0KIAkgIEFkZCBzdXBwb3J0IGZvciB0aGUgT0xQQyBYTyBEQ09OIGNvbnRyb2xsZXIuICBUaGlzIGNvbnRyb2xsZXIgaXMKIAkgIG9ubHkgYXZhaWxhYmxlIG9uIE9MUEMgcGxhdGZvcm1zLiAgIFVubGVzcyB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3Ivc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3Ivc2QuYwppbmRleCBiZGRiMDMxLi5jZGFlNDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zZC5jCkBAIC0yMzI4LDcgKzIzMjgsNyBAQAogCiAJCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIElPX1NFTkRfT1BfQ09ORCwgMCwgU0RfUlNQX1RZUEVfUjQsIHJzcCwgNSk7CiAJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJaW50IGZ1bmNfbnVtID0gKHJzcFsxXSA+PiA0KSAmJiAweDA3OworCQkJCWludCBmdW5jX251bSA9IChyc3BbMV0gPj4gNCkgJiAweDA3OwogCQkJCWlmIChmdW5jX251bSkgewogCQkJCQlSVFNYX0RFQlVHUCgiU0RfSU8gY2FyZCAoRnVuY3Rpb24gbnVtYmVyOiAlZCkhXG4iLCBmdW5jX251bSk7CiAJCQkJCWNoaXAtPnNkX2lvID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKaW5kZXggNmU5OWVjOC4uOGNiZWE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKQEAgLTI2LDYgKzI2LDggQEAKIHN0YXRpYyBpbnQgc3R1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogc3RhdGljIHZvaWQgc3R1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworc3RhdGljIGludCBzdHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKK3N0YXRpYyBpbnQgc3R1Yl9wb3N0X3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogCiAvKgogICogRGVmaW5lIGRldmljZSBJRHMgaGVyZSBpZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IGxpbWl0IGV4cG9ydGFibGUgZGV2aWNlcy4KQEAgLTU5LDYgKzYxLDggQEAKIAkucHJvYmUJCT0gc3R1Yl9wcm9iZSwKIAkuZGlzY29ubmVjdAk9IHN0dWJfZGlzY29ubmVjdCwKIAkuaWRfdGFibGUJPSBzdHViX3RhYmxlLAorCS5wcmVfcmVzZXQJPSBzdHViX3ByZV9yZXNldCwKKwkucG9zdF9yZXNldAk9IHN0dWJfcG9zdF9yZXNldCwKIH07CiAKIC8qCkBAIC01NDEsMyArNTQ1LDIwIEBACiAJCWRlbF9tYXRjaF9idXNpZCgoY2hhciAqKXVkZXZfYnVzaWQpOwogCX0KIH0KKworLyogCisgKiBQcmVzZW5jZSBvZiBwcmVfcmVzZXQgYW5kIHBvc3RfcmVzZXQgcHJldmVudHMgdGhlIGRyaXZlciBmcm9tIGJlaW5nIHVuYm91bmQKKyAqIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyByZXNldAorICovCisgCitpbnQgc3R1Yl9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInByZV9yZXNldFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdHViX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInBvc3RfcmVzZXRcbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKaW5kZXggYTVjMWZhMS4uYmM1Nzg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCkBAIC0xNzUsMTYgKzE3NSwxOCBAQAogCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAidXNiX3F1ZXVlX3Jlc2V0X2RldmljZVxuIik7CiAKIAkvKgotCSAqIHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQgY2F1c2VkIGEgZGVhZGxvY2s6IGl0IGNhdXNlcyB0aGUgZHJpdmVyCi0JICogdG8gdW5iaW5kLiBJbiB0aGUgc2h1dGRvd24gdGhlIHJ4IHRocmVhZCBpcyBzaWduYWxsZWQgdG8gc2h1dCBkb3duCi0JICogYnV0IHRoaXMgdGhyZWFkIGlzIHBlbmRpbmcgaW4gdGhlIHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQuCi0JICoKLQkgKiBJbnN0ZWFkIHF1ZXVlIHRoZSByZXNldC4KLQkgKgotCSAqIFVuZm9ydHVuYXRseSBhbiBleGlzdGluZyB1c2JpcCBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZCBkdWUgdG8KLQkgKiBkcml2ZXIgdW5iaW5kaW5nLgorCSAqIFdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHByZV9yZXNldCBhbmQgcG9zdF9yZXNldCB0aGUgZHJpdmVyIG5vIAorCSAqIGxvbmdlciB1bmJpbmRzLiBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIHN5bmNocm9ub3VzIHJlc2V0LgogCSAqLwotCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2Uoc2Rldi0+aW50ZXJmYWNlKTsKKworCWlmICh1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHNkZXYtPnVkZXYsIHNkZXYtPmludGVyZmFjZSk8MCkKKwl7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJjb3VsZCBub3Qgb2J0YWluIGxvY2sgdG8gcmVzZXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXVzYl9yZXNldF9kZXZpY2Uoc2Rldi0+dWRldik7CisJdXNiX3VubG9ja19kZXZpY2Uoc2Rldi0+dWRldik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYyBiL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKaW5kZXggZGVlMmEyYy4uNzBjMmU3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYworKysgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCkBAIC0zODYsNyArMzg2LDcgQEAKIAkgKi8KIAlzZV9jbWQtPnNlX3Rtcl9yZXEgPSBjb3JlX3Rtcl9hbGxvY19yZXEoc2VfY21kLCAodm9pZCAqKXRsX3RtciwKIAkJCQlUTVJfTFVOX1JFU0VUKTsKLQlpZiAoIXNlX2NtZC0+c2VfdG1yX3JlcSkKKwlpZiAoSVNfRVJSKHNlX2NtZC0+c2VfdG1yX3JlcSkpCiAJCWdvdG8gcmVsZWFzZTsKIAkvKgogCSAqIExvY2F0ZSB0aGUgdW5kZXJseWluZyBUQ00gc3RydWN0IHNlX2x1biBmcm9tIHNjLT5kZXZpY2UtPmx1bgpAQCAtMTAxNyw2ICsxMDE3LDcgQEAKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGc7CiAJc3RydWN0IHRjbV9sb29wX2hiYSAqdGxfaGJhID0gdGxfdHBnLT50bF9oYmE7CiAJc3RydWN0IHRjbV9sb29wX25leHVzICp0bF9uZXh1czsKKwlpbnQgcmV0ID0gLUVOT01FTTsKIAogCWlmICh0bF90cGctPnRsX2hiYS0+dGxfbmV4dXMpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAidGxfdHBnLT50bF9oYmEtPnRsX25leHVzIGFscmVhZHkgZXhpc3RzXG4iKTsKQEAgLTEwMzMsOCArMTAzNCwxMCBAQAogCSAqIEluaXRpYWxpemUgdGhlIHN0cnVjdCBzZV9zZXNzaW9uIHBvaW50ZXIKIAkgKi8KIAl0bF9uZXh1cy0+c2Vfc2VzcyA9IHRyYW5zcG9ydF9pbml0X3Nlc3Npb24oKTsKLQlpZiAoIXRsX25leHVzLT5zZV9zZXNzKQorCWlmIChJU19FUlIodGxfbmV4dXMtPnNlX3Nlc3MpKSB7CisJCXJldCA9IFBUUl9FUlIodGxfbmV4dXMtPnNlX3Nlc3MpOwogCQlnb3RvIG91dDsKKwl9CiAJLyoKIAkgKiBTaW5jZSB3ZSBhcmUgcnVubmluZyBpbiAnZGVtbyBtb2RlJyB0aGlzIGNhbGwgd2l0aCBnZW5lcmF0ZSBhCiAJICogc3RydWN0IHNlX25vZGVfYWNsIGZvciB0aGUgdGNtX2xvb3Agc3RydWN0IHNlX3BvcnRhbF9ncm91cCB3aXRoIHRoZSBTQ1NJCkBAIC0xMDYwLDcgKzEwNjMsNyBAQAogCiBvdXQ6CiAJa2ZyZWUodGxfbmV4dXMpOwotCXJldHVybiAtRU5PTUVNOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdGNtX2xvb3BfZHJvcF9uZXh1cygKQEAgLTExNDAsNyArMTE0Myw3IEBACiAJICogdGhlIGZhYnJpYyBwcm90b2NvbF9pZCBzZXQgaW4gdGNtX2xvb3BfbWFrZV9zY3NpX2hiYSgpLCBhbmQgY2FsbAogCSAqIHRjbV9sb29wX21ha2VfbmV4dXMoKQogCSAqLwotCWlmIChzdHJsZW4ocGFnZSkgPiBUTF9XV05fQUREUl9MRU4pIHsKKwlpZiAoc3RybGVuKHBhZ2UpID49IFRMX1dXTl9BRERSX0xFTikgewogCQlwcmludGsoS0VSTl9FUlIgIkVtdWxhdGVkIE5BQSBTYXMgQWRkcmVzczogJXMsIGV4Y2VlZHMiCiAJCQkJIiBtYXg6ICVkXG4iLCBwYWdlLCBUTF9XV05fQUREUl9MRU4pOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzMjEsNyArMTMyNCw3IEBACiAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIGNoZWNrX2xlbjoKLQlpZiAoc3RybGVuKG5hbWUpID4gVExfV1dOX0FERFJfTEVOKSB7CisJaWYgKHN0cmxlbihuYW1lKSA+PSBUTF9XV05fQUREUl9MRU4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFbXVsYXRlZCBOQUEgJXMgQWRkcmVzczogJXMsIGV4Y2VlZHMiCiAJCQkiIG1heDogJWRcbiIsIG5hbWUsIHRjbV9sb29wX2R1bXBfcHJvdG9faWQodGxfaGJhKSwKIAkJCVRMX1dXTl9BRERSX0xFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYwppbmRleCBlZTZmYWQ5Li4yNWMxZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmMKQEAgLTMwNCw3ICszMDQsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgcGFzc2VkIGZhYnJpYyBuYW1lXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChzdHJsZW4obmFtZSkgPiBUQVJHRVRfRkFCUklDX05BTUVfU0laRSkgeworCWlmIChzdHJsZW4obmFtZSkgPj0gVEFSR0VUX0ZBQlJJQ19OQU1FX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQYXNzZWQgbmFtZTogJXMgZXhjZWVkcyBUQVJHRVRfRkFCUklDIgogCQkJIl9OQU1FX1NJWkVcbiIsIG5hbWUpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTMxMiw3ICszMTIsNyBAQAogCiAJdGYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyksIEdGUF9LRVJORUwpOwogCWlmICghKHRmKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiBOVUxMOwogCiAJSU5JVF9MSVNUX0hFQUQoJnRmLT50Zl9saXN0KTsKIAlhdG9taWNfc2V0KCZ0Zi0+dGZfYWNjZXNzX2NudCwgMCk7CkBAIC04NTEsNyArODUxLDcgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCWlmICgoc3RybGVuKHBhZ2UpICsgMSkgPiBJTlFVSVJZX1ZQRF9TRVJJQUxfTEVOKSB7CisJaWYgKHN0cmxlbihwYWdlKSA+PSBJTlFVSVJZX1ZQRF9TRVJJQUxfTEVOKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRW11bGF0ZWQgVlBEIFVuaXQgU2VyaWFsIGV4Y2VlZHMiCiAJCSIgSU5RVUlSWV9WUERfU0VSSUFMX0xFTjogJWRcbiIsIElOUVVJUllfVlBEX1NFUklBTF9MRU4pOwogCQlyZXR1cm4gLUVPVkVSRkxPVzsKQEAgLTkxNyw3ICs5MTcsNyBAQAogCiAJCXRyYW5zcG9ydF9kdW1wX3ZwZF9wcm90b19pZCh2cGQsIGJ1ZiwgVlBEX1RNUF9CVUZfU0laRSk7CiAKLQkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+IFBBR0VfU0laRSkpCisJCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPj0gUEFHRV9TSVpFKSkKIAkJCWJyZWFrOwogCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBidWYpOwpAQCAtOTYyLDE5ICs5NjIsMTkgQEAKIAkJCQkJCQkJCVwKIAkJbWVtc2V0KGJ1ZiwgMCwgVlBEX1RNUF9CVUZfU0laRSk7CQkJXAogCQl0cmFuc3BvcnRfZHVtcF92cGRfYXNzb2ModnBkLCBidWYsIFZQRF9UTVBfQlVGX1NJWkUpOwlcCi0JCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPiBQQUdFX1NJWkUpKQkJCVwKKwkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+PSBQQUdFX1NJWkUpKQkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIGJ1Zik7CQkJXAogCQkJCQkJCQkJXAogCQltZW1zZXQoYnVmLCAwLCBWUERfVE1QX0JVRl9TSVpFKTsJCQlcCiAJCXRyYW5zcG9ydF9kdW1wX3ZwZF9pZGVudF90eXBlKHZwZCwgYnVmLCBWUERfVE1QX0JVRl9TSVpFKTsgXAotCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID4gUEFHRV9TSVpFKSkJCQlcCisJCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPj0gUEFHRV9TSVpFKSkJCQlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBidWYpOwkJCVwKIAkJCQkJCQkJCVwKIAkJbWVtc2V0KGJ1ZiwgMCwgVlBEX1RNUF9CVUZfU0laRSk7CQkJXAogCQl0cmFuc3BvcnRfZHVtcF92cGRfaWRlbnQodnBkLCBidWYsIFZQRF9UTVBfQlVGX1NJWkUpOyBcCi0JCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPiBQQUdFX1NJWkUpKQkJCVwKKwkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+PSBQQUdFX1NJWkUpKQkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIGJ1Zik7CQkJXAogCX0JCQkJCQkJCVwKQEAgLTEyOTksNyArMTI5OSw3IEBACiAJCQkmaV9idWZbMF0gOiAiIiwgcHJfcmVnLT5wcl9yZXNfa2V5LAogCQkJcHJfcmVnLT5wcl9yZXNfZ2VuZXJhdGlvbik7CiAKLQkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+IFBBR0VfU0laRSkpCisJCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPj0gUEFHRV9TSVpFKSkKIAkJCWJyZWFrOwogCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBidWYpOwpAQCAtMTQ5Niw3ICsxNDk2LDcgQEAKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJaWYgKHN0cmxlbihpX3BvcnQpID4gUFJfQVBUUExfTUFYX0lQT1JUX0xFTikgeworCQkJaWYgKHN0cmxlbihpX3BvcnQpID49IFBSX0FQVFBMX01BWF9JUE9SVF9MRU4pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkFQVFBMIG1ldGFkYXRhIGluaXRpYXRvcl9ub2RlPSIKIAkJCQkJIiBleGNlZWRzIFBSX0FQVFBMX01BWF9JUE9SVF9MRU46ICVkXG4iLAogCQkJCQlQUl9BUFRQTF9NQVhfSVBPUlRfTEVOKTsKQEAgLTE1MTAsNyArMTUxMCw3IEBACiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWlmIChzdHJsZW4oaXNpZCkgPiBQUl9SRUdfSVNJRF9MRU4pIHsKKwkJCWlmIChzdHJsZW4oaXNpZCkgPj0gUFJfUkVHX0lTSURfTEVOKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJBUFRQTCBtZXRhZGF0YSBpbml0aWF0b3JfaXNpZCIKIAkJCQkJIj0gZXhjZWVkcyBQUl9SRUdfSVNJRF9MRU46ICVkXG4iLAogCQkJCQlQUl9SRUdfSVNJRF9MRU4pOwpAQCAtMTU3MSw3ICsxNTcxLDcgQEAKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJaWYgKHN0cmxlbih0X3BvcnQpID4gUFJfQVBUUExfTUFYX1RQT1JUX0xFTikgeworCQkJaWYgKHN0cmxlbih0X3BvcnQpID49IFBSX0FQVFBMX01BWF9UUE9SVF9MRU4pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkFQVFBMIG1ldGFkYXRhIHRhcmdldF9ub2RlPSIKIAkJCQkJIiBleGNlZWRzIFBSX0FQVFBMX01BWF9UUE9SVF9MRU46ICVkXG4iLAogCQkJCQlQUl9BUFRQTF9NQVhfVFBPUlRfTEVOKTsKQEAgLTMwNTIsNyArMzA1Miw3IEBACiAJaW50IHJldDsKIAogCW1lbXNldChidWYsIDAsIFRBUkdFVF9DT1JFX05BTUVfTUFYX0xFTik7Ci0JaWYgKHN0cmxlbihuYW1lKSA+IFRBUkdFVF9DT1JFX05BTUVfTUFYX0xFTikgeworCWlmIChzdHJsZW4obmFtZSkgPj0gVEFSR0VUX0NPUkVfTkFNRV9NQVhfTEVOKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUGFzc2VkICpuYW1lIHN0cmxlbigpOiAlZCBleGNlZWRzIgogCQkJIiBUQVJHRVRfQ09SRV9OQU1FX01BWF9MRU46ICVkXG4iLCAoaW50KXN0cmxlbihuYW1lKSwKIAkJCVRBUkdFVF9DT1JFX05BTUVfTUFYX0xFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCmluZGV4IDg0MDdmOWMuLmJhNjk4ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJCSZTRV9OT0RFX0FDTChzZV9zZXNzKS0+ZGV2aWNlX2xpc3RbdW5wYWNrZWRfbHVuXTsKIAlpZiAoZGV2ZS0+bHVuX2ZsYWdzICYgVFJBTlNQT1JUX0xVTkZMQUdTX0lOSVRJQVRPUl9BQ0NFU1MpIHsKIAkJc2VfbHVuID0gc2VfY21kLT5zZV9sdW4gPSBzZV90bXItPnRtcl9sdW4gPSBkZXZlLT5zZV9sdW47Ci0JCWRldiA9IHNlX3Rtci0+dG1yX2RldiA9IHNlX2x1bi0+bHVuX3NlX2RldjsKKwkJZGV2ID0gc2VfbHVuLT5sdW5fc2VfZGV2OwogCQlzZV9jbWQtPnByX3Jlc19rZXkgPSBkZXZlLT5wcl9yZXNfa2V5OwogCQlzZV9jbWQtPm9yaWdfZmVfbHVuID0gdW5wYWNrZWRfbHVuOwogCQlzZV9jbWQtPnNlX29yaWdfb2JqX3B0ciA9IFNFX0xVTihzZV9jbWQpLT5sdW5fc2VfZGV2OwpAQCAtMjE2LDYgKzIxNiw3IEBACiAJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CiAJCXJldHVybiAtMTsKIAl9CisJc2VfdG1yLT50bXJfZGV2ID0gZGV2OwogCiAJc3Bpbl9sb2NrKCZkZXYtPnNlX3Rtcl9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZzZV90bXItPnRtcl9saXN0LCAmZGV2LT5kZXZfdG1yX2xpc3QpOwpAQCAtMTQzMCw3ICsxNDMxLDcgQEAKIAlzdHJ1Y3Qgc2VfbHVuX2FjbCAqbGFjbDsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKm5hY2w7CiAKLQlpZiAoc3RybGVuKGluaXRpYXRvcm5hbWUpID4gVFJBTlNQT1JUX0lRTl9MRU4pIHsKKwlpZiAoc3RybGVuKGluaXRpYXRvcm5hbWUpID49IFRSQU5TUE9SVF9JUU5fTEVOKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXMgSW5pdGlhdG9yTmFtZSBleGNlZWRzIG1heGltdW0gc2l6ZS5cbiIsCiAJCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpKTsKIAkJKnJldCA9IC1FT1ZFUkZMT1c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuYwppbmRleCBhNzlmNTE4Li5iNjYyZGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMKQEAgLTE5MTYsNyArMTkxNiw3IEBACiAJCQkJcHJfcmVnLT5wcl9yZXNfbWFwcGVkX2x1bik7CiAJCX0KIAotCQlpZiAoKGxlbiArIHN0cmxlbih0bXApID4gcHJfYXB0cGxfYnVmX2xlbikpIHsKKwkJaWYgKChsZW4gKyBzdHJsZW4odG1wKSA+PSBwcl9hcHRwbF9idWZfbGVuKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gdXBkYXRlIHJlbmFtaW5nIgogCQkJCSIgQVBUUEwgbWV0YWRhdGFcbiIpOwogCQkJc3Bpbl91bmxvY2soJlQxMF9SRVMoc3VfZGV2KS0+cmVnaXN0cmF0aW9uX2xvY2spOwpAQCAtMTkzNCw3ICsxOTM0LDcgQEAKIAkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwKIAkJCWx1bi0+bHVuX3NlcC0+c2VwX3J0cGksIGx1bi0+dW5wYWNrZWRfbHVuLCByZWdfY291bnQpOwogCi0JCWlmICgobGVuICsgc3RybGVuKHRtcCkgPiBwcl9hcHRwbF9idWZfbGVuKSkgeworCQlpZiAoKGxlbiArIHN0cmxlbih0bXApID49IHByX2FwdHBsX2J1Zl9sZW4pKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byB1cGRhdGUgcmVuYW1pbmciCiAJCQkJIiBBUFRQTCBtZXRhZGF0YVxuIik7CiAJCQlzcGluX3VubG9jaygmVDEwX1JFUyhzdV9kZXYpLT5yZWdpc3RyYXRpb25fbG9jayk7CkBAIC0xOTg2LDcgKzE5ODYsNyBAQAogCW1lbXNldChpb3YsIDAsIHNpemVvZihzdHJ1Y3QgaW92ZWMpKTsKIAltZW1zZXQocGF0aCwgMCwgNTEyKTsKIAotCWlmIChzdHJsZW4oJnd3bi0+dW5pdF9zZXJpYWxbMF0pID4gNTEyKSB7CisJaWYgKHN0cmxlbigmd3duLT51bml0X3NlcmlhbFswXSkgPj0gNTEyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiV1dOIHZhbHVlIGZvciBzdHJ1Y3Qgc2VfZGV2aWNlIGRvZXMgbm90IGZpdCIKIAkJCSIgaW50byBwYXRoIGJ1ZmZlclxuIik7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMKaW5kZXggNTliOGI5Yy4uMTc5MDYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMKQEAgLTc1LDEwICs3NSwxNiBAQAogewogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IHRtci0+dG1yX2RldjsKIAorCWlmICghZGV2KSB7CisJCWttZW1fY2FjaGVfZnJlZShzZV90bXJfcmVxX2NhY2hlLCB0bXIpOworCQlyZXR1cm47CisJfQorCiAJc3Bpbl9sb2NrKCZkZXYtPnNlX3Rtcl9sb2NrKTsKIAlsaXN0X2RlbCgmdG1yLT50bXJfbGlzdCk7Ci0Ja21lbV9jYWNoZV9mcmVlKHNlX3Rtcl9yZXFfY2FjaGUsIHRtcik7CiAJc3Bpbl91bmxvY2soJmRldi0+c2VfdG1yX2xvY2spOworCisJa21lbV9jYWNoZV9mcmVlKHNlX3Rtcl9yZXFfY2FjaGUsIHRtcik7CiB9CiAKIHN0YXRpYyB2b2lkIGNvcmVfdG1yX2hhbmRsZV90YXNfYWJvcnQoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCmluZGV4IDRkYWZlYjguLjRiOWI3MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCkBAIC01MzYsMTMgKzUzNiwxMyBAQAogdm9pZCB0cmFuc3BvcnRfZGVyZWdpc3Rlcl9zZXNzaW9uX2NvbmZpZ2ZzKHN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzKQogewogCXN0cnVjdCBzZV9ub2RlX2FjbCAqc2VfbmFjbDsKLQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLyoKIAkgKiBVc2VkIGJ5IHN0cnVjdCBzZV9ub2RlX2FjbCdzIHVuZGVyIENvbmZpZ0ZTIHRvIGxvY2F0ZSBhY3RpdmUgc3RydWN0IHNlX3Nlc3Npb24KIAkgKi8KIAlzZV9uYWNsID0gc2Vfc2Vzcy0+c2Vfbm9kZV9hY2w7CiAJaWYgKChzZV9uYWNsKSkgewotCQlzcGluX2xvY2tfaXJxKCZzZV9uYWNsLT5uYWNsX3Nlc3NfbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZV9uYWNsLT5uYWNsX3Nlc3NfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2RlbCgmc2Vfc2Vzcy0+c2Vzc19hY2xfbGlzdCk7CiAJCS8qCiAJCSAqIElmIHRoZSBzZXNzaW9uIGxpc3QgaXMgZW1wdHksIHRoZW4gY2xlYXIgdGhlIHBvaW50ZXIuCkBAIC01NTYsNyArNTU2LDcgQEAKIAkJCQkJc2VfbmFjbC0+YWNsX3Nlc3NfbGlzdC5wcmV2LAogCQkJCQlzdHJ1Y3Qgc2Vfc2Vzc2lvbiwgc2Vzc19hY2xfbGlzdCk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZzZV9uYWNsLT5uYWNsX3Nlc3NfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlX25hY2wtPm5hY2xfc2Vzc19sb2NrLCBmbGFncyk7CiAJfQogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZGVyZWdpc3Rlcl9zZXNzaW9uX2NvbmZpZ2ZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaCBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaAppbmRleCBkZWZmZjMyLi43YjgyZjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAqLwogc3RydWN0IGZ0X2NtZCB7CiAJZW51bSBmdF9jbWRfc3RhdGUgc3RhdGU7Ci0JdTE2IGx1bjsJCQkvKiBMVU4gZnJvbSByZXF1ZXN0ICovCisJdTMyIGx1bjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBMVU4gZnJvbSByZXF1ZXN0ICovCiAJc3RydWN0IGZ0X3Nlc3MgKnNlc3M7CQkvKiBzZXNzaW9uIGhlbGQgZm9yIGNtZCAqLwogCXN0cnVjdCBmY19zZXEgKnNlcTsJCS8qIHNlcXVlbmNlIGluIGV4Y2hhbmdlIG1nciAqLwogCXN0cnVjdCBzZV9jbWQgc2VfY21kOwkJLyogTG9jYWwgVENNIEkvTyBkZXNjcmlwdG9yICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwppbmRleCBjMDU2YTExLi5iMmExMDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKQEAgLTk0LDI5ICs5NCw2IEBACiAJCTE2LCA0LCBjbWQtPmNkYiwgTUFYX0NPTU1BTkRfU0laRSwgMCk7CiB9CiAKLS8qCi0gKiBHZXQgTFVOIGZyb20gQ0RCLgotICovCi1zdGF0aWMgaW50IGZ0X2dldF9sdW5fZm9yX2NtZChzdHJ1Y3QgZnRfY21kICpjbWQsIHU4ICpsdW5wKQotewotCXU2NCBsdW47Ci0KLQlsdW4gPSBsdW5wWzFdOwotCXN3aXRjaCAobHVucFswXSA+PiA2KSB7Ci0JY2FzZSAwOgotCQlicmVhazsKLQljYXNlIDE6Ci0JCWx1biB8PSAobHVucFswXSAmIDB4M2YpIDw8IDg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGx1biA+PSBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRykKLQkJcmV0dXJuIC0xOwotCWNtZC0+bHVuID0gbHVuOwotCXJldHVybiB0cmFuc3BvcnRfZ2V0X2x1bl9mb3JfY21kKCZjbWQtPnNlX2NtZCwgTlVMTCwgbHVuKTsKLX0KLQogc3RhdGljIHZvaWQgZnRfcXVldWVfY21kKHN0cnVjdCBmdF9zZXNzICpzZXNzLCBzdHJ1Y3QgZnRfY21kICpjbWQpCiB7CiAJc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iajsKQEAgLTQxOCw2ICszOTUsNyBAQAogewogCXN0cnVjdCBzZV90bXJfcmVxICp0bXI7CiAJc3RydWN0IGZjcF9jbW5kICpmY3A7CisJc3RydWN0IGZ0X3Nlc3MgKnNlc3M7CiAJdTggdG1fZnVuYzsKIAogCWZjcCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGNtZC0+cmVxX2ZyYW1lLCBzaXplb2YoKmZjcCkpOwpAQCAtNDI1LDEzICs0MDMsNiBAQAogCXN3aXRjaCAoZmNwLT5mY190bV9mbGFncykgewogCWNhc2UgRkNQX1RNRl9MVU5fUkVTRVQ6CiAJCXRtX2Z1bmMgPSBUTVJfTFVOX1JFU0VUOwotCQlpZiAoZnRfZ2V0X2x1bl9mb3JfY21kKGNtZCwgZmNwLT5mY19sdW4pIDwgMCkgewotCQkJZnRfZHVtcF9jbWQoY21kLCBfX2Z1bmNfXyk7Ci0JCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKCZjbWQtPnNlX2NtZCwKLQkJCQljbWQtPnNlX2NtZC5zY3NpX3NlbnNlX3JlYXNvbiwgMCk7Ci0JCQlmdF9zZXNzX3B1dChjbWQtPnNlc3MpOwotCQkJcmV0dXJuOwotCQl9CiAJCWJyZWFrOwogCWNhc2UgRkNQX1RNRl9UR1RfUkVTRVQ6CiAJCXRtX2Z1bmMgPSBUTVJfVEFSR0VUX1dBUk1fUkVTRVQ7CkBAIC00NjMsNiArNDM0LDM2IEBACiAJCXJldHVybjsKIAl9CiAJY21kLT5zZV9jbWQuc2VfdG1yX3JlcSA9IHRtcjsKKworCXN3aXRjaCAoZmNwLT5mY190bV9mbGFncykgeworCWNhc2UgRkNQX1RNRl9MVU5fUkVTRVQ6CisJCWNtZC0+bHVuID0gc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKWZjcC0+ZmNfbHVuKTsKKwkJaWYgKHRyYW5zcG9ydF9nZXRfbHVuX2Zvcl90bXIoJmNtZC0+c2VfY21kLCBjbWQtPmx1bikgPCAwKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRvIGNsZWFuIHVwIG5ld2x5IGFsbG9jYXRlZCBUTVIgcmVxdWVzdAorCQkJICogc2luY2UgInVuYWJsZSB0byAgaGFuZGxlIFRNUiByZXF1ZXN0IGJlY2F1c2UgZmFpbGVkCisJCQkgKiB0byBnZXQgdG8gTFVOIgorCQkJICovCisJCQlGVF9UTV9EQkcoIkZhaWxlZCB0byBnZXQgTFVOIGZvciBUTVIgZnVuYyAlZCwgIgorCQkJCSAgInNlX2NtZCAlcCwgdW5wYWNrZWRfbHVuICVkXG4iLAorCQkJCSAgdG1fZnVuYywgJmNtZC0+c2VfY21kLCBjbWQtPmx1bik7CisJCQlmdF9kdW1wX2NtZChjbWQsIF9fZnVuY19fKTsKKwkJCXNlc3MgPSBjbWQtPnNlc3M7CisJCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKCZjbWQtPnNlX2NtZCwKKwkJCQljbWQtPnNlX2NtZC5zY3NpX3NlbnNlX3JlYXNvbiwgMCk7CisJCQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCgmY21kLT5zZV9jbWQsIDAsIDEsIDApOworCQkJZnRfc2Vzc19wdXQoc2Vzcyk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBGQ1BfVE1GX1RHVF9SRVNFVDoKKwljYXNlIEZDUF9UTUZfQ0xSX1RBU0tfU0VUOgorCWNhc2UgRkNQX1RNRl9BQlRfVEFTS19TRVQ6CisJY2FzZSBGQ1BfVE1GX0NMUl9BQ0E6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CiAJdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX3RtcigmY21kLT5zZV9jbWQpOwogfQogCkBAIC02MzUsNyArNjM2LDggQEAKIAogCWZjX3NlcV9leGNoKGNtZC0+c2VxKS0+bHAtPnR0LnNlcV9zZXRfcmVzcChjbWQtPnNlcSwgZnRfcmVjdl9zZXEsIGNtZCk7CiAKLQlyZXQgPSBmdF9nZXRfbHVuX2Zvcl9jbWQoY21kLCBmY3AtPmZjX2x1bik7CisJY21kLT5sdW4gPSBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopZmNwLT5mY19sdW4pOworCXJldCA9IHRyYW5zcG9ydF9nZXRfbHVuX2Zvcl9jbWQoJmNtZC0+c2VfY21kLCBOVUxMLCBjbWQtPmx1bik7CiAJaWYgKHJldCA8IDApIHsKIAkJZnRfZHVtcF9jbWQoY21kLCBfX2Z1bmNfXyk7CiAJCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoJmNtZC0+c2VfY21kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCmluZGV4IDRjM2MwZWYuLjhjNGEyNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQkJLyogWFhYIEZvciBub3csIGluaXRpYXRvciB3aWxsIHJldHJ5ICovCiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBzZW5kIGZyYW1lICVwLCAiCi0JCQkJCQkieGlkIDwweCV4PiwgcmVtYWluaW5nIDwweCV4PiwgIgorCQkJCQkJInhpZCA8MHgleD4sIHJlbWFpbmluZyAlenUsICIKIAkJCQkJCSJsc29fbWF4IDwweCV4PlxuIiwKIAkJCQkJCV9fZnVuY19fLCBmcCwgZXAtPnhpZCwKIAkJCQkJCXJlbWFpbmluZywgbHBvcnQtPmxzb19tYXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19zZXNzLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX3Nlc3MuYwppbmRleCBhM2JkNTdmLi43NDkxZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX3Nlc3MuYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX3Nlc3MuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJc2Vzcy0+c2Vfc2VzcyA9IHRyYW5zcG9ydF9pbml0X3Nlc3Npb24oKTsKLQlpZiAoIXNlc3MtPnNlX3Nlc3MpIHsKKwlpZiAoSVNfRVJSKHNlc3MtPnNlX3Nlc3MpKSB7CiAJCWtmcmVlKHNlc3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0zMzIsNyArMzMyLDcgQEAKIAlscG9ydCA9IHNlc3MtPnRwb3J0LT5scG9ydDsKIAlwb3J0X2lkID0gc2Vzcy0+cG9ydF9pZDsKIAlpZiAocG9ydF9pZCA9PSAtMSkgewotCQltdXRleF9sb2NrKCZmdF9scG9ydF9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZmdF9scG9ydF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAlGVF9TRVNTX0RCRygicG9ydF9pZCAleFxuIiwgcG9ydF9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9uX2dzbS5jIGIvZHJpdmVycy90dHkvbl9nc20uYwppbmRleCBhNGM0MmE3Li4xOWI0YWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9uX2dzbS5jCisrKyBiL2RyaXZlcnMvdHR5L25fZ3NtLmMKQEAgLTg3NSw3ICs4NzUsOCBAQAogCQkqZHArKyA9IGxhc3QgPDwgNyB8IGZpcnN0IDw8IDYgfCAxOwkvKiBFQSAqLwogCQlsZW4tLTsKIAl9Ci0JbWVtY3B5KGRwLCBza2JfcHVsbChkbGNpLT5za2IsIGxlbiksIGxlbik7CisJbWVtY3B5KGRwLCBkbGNpLT5za2ItPmRhdGEsIGxlbik7CisJc2tiX3B1bGwoZGxjaS0+c2tiLCBsZW4pOwogCV9fZ3NtX2RhdGFfcXVldWUoZGxjaSwgbXNnKTsKIAlpZiAobGFzdCkKIAkJZGxjaS0+c2tiID0gTlVMTDsKQEAgLTk4NCwxMCArOTg1LDIyIEBACiAgKi8KIAogc3RhdGljIHZvaWQgZ3NtX3Byb2Nlc3NfbW9kZW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGdzbV9kbGNpICpkbGNpLAotCQkJCQkJCXUzMiBtb2RlbSkKKwkJCQkJCQl1MzIgbW9kZW0sIGludCBjbGVuKQogewogCWludCAgbWxpbmVzID0gMDsKLQl1OCBicmsgPSBtb2RlbSA+PiA2OworCXU4IGJyayA9IDA7CisKKwkvKiBUaGUgbW9kZW0gc3RhdHVzIGNvbW1hbmQgY2FuIGVpdGhlciBjb250YWluIG9uZSBvY3RldCAodi4yNCBzaWduYWxzKQorCSAgIG9yIHR3byBvY3RldHMgKHYuMjQgc2lnbmFscyArIGJyZWFrIHNpZ25hbHMpLiBUaGUgbGVuZ3RoIGZpZWxkIHdpbGwKKwkgICBlaXRoZXIgYmUgMiBvciAzIHJlc3BlY3RpdmVseS4gVGhpcyBpcyBzcGVjaWZpZWQgaW4gc2VjdGlvbgorCSAgIDUuNC42LjMuNyBvZiB0aGUgIDI3LjAxMCBtdXggc3BlYy4gKi8KKworCWlmIChjbGVuID09IDIpCisJCW1vZGVtID0gbW9kZW0gJiAweDdmOworCWVsc2UgeworCQlicmsgPSBtb2RlbSAmIDB4N2Y7CisJCW1vZGVtID0gKG1vZGVtID4+IDcpICYgMHg3ZjsKKwl9OwogCiAJLyogRmxvdyBjb250cm9sL3JlYWR5IHRvIGNvbW11bmljYXRlICovCiAJaWYgKG1vZGVtICYgTURNX0ZDKSB7CkBAIC0xMDYxLDcgKzEwNzQsNyBAQAogCQkJcmV0dXJuOwogCX0KIAl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZkbGNpLT5wb3J0KTsKLQlnc21fcHJvY2Vzc19tb2RlbSh0dHksIGRsY2ksIG1vZGVtKTsKKwlnc21fcHJvY2Vzc19tb2RlbSh0dHksIGRsY2ksIG1vZGVtLCBjbGVuKTsKIAlpZiAodHR5KSB7CiAJCXR0eV93YWtldXAodHR5KTsKIAkJdHR5X2tyZWZfcHV0KHR0eSk7CkBAIC0xNDgyLDEyICsxNDk1LDEzIEBACiAgKglvcGVuIHdlIHNob3ZlbCB0aGUgYml0cyBkb3duIGl0LCBpZiBub3Qgd2UgZHJvcCB0aGVtLgogICovCiAKLXN0YXRpYyB2b2lkIGdzbV9kbGNpX2RhdGEoc3RydWN0IGdzbV9kbGNpICpkbGNpLCB1OCAqZGF0YSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGdzbV9kbGNpX2RhdGEoc3RydWN0IGdzbV9kbGNpICpkbGNpLCB1OCAqZGF0YSwgaW50IGNsZW4pCiB7CiAJLyoga3JlZnMgLi4gKi8KIAlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmZGxjaS0+cG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldChwb3J0KTsKIAl1bnNpZ25lZCBpbnQgbW9kZW0gPSAwOworCWludCBsZW4gPSBjbGVuOwogCiAJaWYgKGRlYnVnICYgMTYpCiAJCXByX2RlYnVnKCIlZCBieXRlcyBmb3IgdHR5ICVwXG4iLCBsZW4sIHR0eSk7CkBAIC0xNTA3LDcgKzE1MjEsNyBAQAogCQkJCWlmIChsZW4gPT0gMCkKIAkJCQkJcmV0dXJuOwogCQkJfQotCQkJZ3NtX3Byb2Nlc3NfbW9kZW0odHR5LCBkbGNpLCBtb2RlbSk7CisJCQlnc21fcHJvY2Vzc19tb2RlbSh0dHksIGRsY2ksIG1vZGVtLCBjbGVuKTsKIAkJLyogTGluZSBzdGF0ZSB3aWxsIGdvIHZpYSBETENJIDAgY29udHJvbHMgb25seSAqLwogCQljYXNlIDE6CiAJCWRlZmF1bHQ6CkBAIC0yMTI4LDggKzIxNDIsOCBAQAogCWdzbS0+dHR5ID0gTlVMTDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBnc21sZF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGdzbWxkX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJICAgICAgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgZ3NtX211eCAqZ3NtID0gdHR5LT5kaXNjX2RhdGE7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZHA7CkBAIC0yMTYyLDggKzIxNzYsNiBAQAogCX0KIAkvKiBGQVNZTkMgaWYgbmVlZGVkID8gKi8KIAkvKiBJZiBjbG9nZ2VkIGNhbGwgdHR5X3Rocm90dGxlKHR0eSk7ICovCi0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvbl9oZGxjLmMgYi9kcml2ZXJzL3R0eS9uX2hkbGMuYwppbmRleCBjYWM2NjYzLi5jZWE1NjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9uX2hkbGMuYworKysgYi9kcml2ZXJzL3R0eS9uX2hkbGMuYwpAQCAtMTg4LDggKzE4OCw4IEBACiAJCQkJICAgIHBvbGxfdGFibGUgKndhaXQpOwogc3RhdGljIGludCBuX2hkbGNfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHVuc2lnbmVkIGludCBuX2hkbGNfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJY29uc3QgX191OCAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgbl9oZGxjX3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IF9fdTggKmNwLAorCQkJICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOwogc3RhdGljIHZvaWQgbl9oZGxjX3R0eV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKICNkZWZpbmUgYnNldChwLGIpCSgocClbKGIpID4+IDVdIHw9ICgxIDw8ICgoYikgJiAweDFmKSkpCkBAIC01MDksOCArNTA5LDggQEAKICAqIENhbGxlZCBieSB0dHkgbG93IGxldmVsIGRyaXZlciB3aGVuIHJlY2VpdmUgZGF0YSBpcyBhdmFpbGFibGUuIERhdGEgaXMKICAqIGludGVycHJldGVkIGFzIG9uZSBIRExDIGZyYW1lLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG5faGRsY190dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCBfX3U4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQorc3RhdGljIHZvaWQgbl9oZGxjX3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IF9fdTggKmRhdGEsCisJCQkgICAgICAgY2hhciAqZmxhZ3MsIGludCBjb3VudCkKIHsKIAlyZWdpc3RlciBzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOwogCXJlZ2lzdGVyIHN0cnVjdCBuX2hkbGNfYnVmICpidWY7CkBAIC01MjEsMjAgKzUyMSwyMCBAQAogCQkKIAkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgc3R1ZmYgY29tZXMgaW4gb24gdGhlIGJhY2t1cCB0dHkgKi8KIAlpZiAoIW5faGRsYyB8fCB0dHkgIT0gbl9oZGxjLT50dHkpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAJCQogCS8qIHZlcmlmeSBsaW5lIGlzIHVzaW5nIEhETEMgZGlzY2lwbGluZSAqLwogCWlmIChuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMpIHsKIAkJcHJpbnRrKCIlcyglZCkgbGluZSBub3QgdXNpbmcgSERMQyBkaXNjaXBsaW5lXG4iLAogCQkJX19GSUxFX18sX19MSU5FX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCX0KIAkKIAlpZiAoIGNvdW50Pm1heGZyYW1lICkgewogCQlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKIAkJCXByaW50aygiJXMoJWQpIHJ4IGNvdW50Pm1heGZyYW1lc2l6ZSwgZGF0YSBkaXNjYXJkZWRcbiIsCiAJCQkgICAgICAgX19GSUxFX18sX19MSU5FX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCX0KIAogCS8qIGdldCBhIGZyZWUgSERMQyBidWZmZXIgKi8JCkBAIC01NTAsNyArNTUwLDcgQEAKIAkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCiAJCQlwcmludGsoIiVzKCVkKSBubyBtb3JlIHJ4IGJ1ZmZlcnMsIGRhdGEgZGlzY2FyZGVkXG4iLAogCQkJICAgICAgIF9fRklMRV9fLF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybjsKIAl9CiAJCQogCS8qIGNvcHkgcmVjZWl2ZWQgZGF0YSB0byBIRExDIGJ1ZmZlciAqLwpAQCAtNTY1LDggKzU2NSw2IEBACiAJaWYgKG5faGRsYy0+dHR5LT5mYXN5bmMgIT0gTlVMTCkKIAkJa2lsbF9mYXN5bmMgKCZuX2hkbGMtPnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAKLQlyZXR1cm4gY291bnQ7Ci0KIH0JLyogZW5kIG9mIG5faGRsY190dHlfcmVjZWl2ZSgpICovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvbl9yMzk2NC5jIGIvZHJpdmVycy90dHkvbl9yMzk2NC5jCmluZGV4IGE0YmMzOWMuLjVjNmMzMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25fcjM5NjQuYworKysgYi9kcml2ZXJzL3R0eS9uX3IzOTY0LmMKQEAgLTEzOSw4ICsxMzksOCBAQAogc3RhdGljIHZvaWQgcjM5NjRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGQpOwogc3RhdGljIHVuc2lnbmVkIGludCByMzk2NF9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOwotc3RhdGljIHVuc2lnbmVkIGludCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKwkJY2hhciAqZnAsIGludCBjb3VudCk7CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjX29wcyB0dHlfbGRpc2NfTl9SMzk2NCA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKQEAgLTEyMzksOCArMTIzOSw4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIHIzOTY0X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8gPSB0dHktPmRpc2NfZGF0YTsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpwOwpAQCAtMTI1Nyw4ICsxMjU3LDYgQEAKIAkJfQogCiAJfQotCi0JcmV0dXJuIGNvdW50OwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9uX3R0eS5jIGIvZHJpdmVycy90dHkvbl90dHkuYwppbmRleCA5NWQwYTljLi5jMzk1NGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9uX3R0eS5jCisrKyBiL2RyaXZlcnMvdHR5L25fdHR5LmMKQEAgLTgxLDYgKzgxLDM4IEBACiAJcmV0dXJuIHB1dF91c2VyKHgsIHB0cik7CiB9CiAKKy8qKgorICoJbl90dHlfc2V0X19yb29tCS0JcmVjZWl2ZSBzcGFjZQorICoJQHR0eTogdGVybWluYWwKKyAqCisgKglDYWxsZWQgYnkgdGhlIGRyaXZlciB0byBmaW5kIG91dCBob3cgbXVjaCBkYXRhIGl0IGlzCisgKglwZXJtaXR0ZWQgdG8gZmVlZCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIHdpdGhvdXQgYW55IGJlaW5nIGxvc3QKKyAqCWFuZCB0aHVzIHRvIG1hbmFnZSBmbG93IGNvbnRyb2wuIE5vdCBzZXJpYWxpemVkLiBBbnN3ZXJzIGZvciB0aGUKKyAqCSJpbnN0YW50Ii4KKyAqLworCitzdGF0aWMgdm9pZCBuX3R0eV9zZXRfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8qIHR0eS0+cmVhZF9jbnQgaXMgbm90IHJlYWQgbG9ja2VkID8gKi8KKwlpbnQJbGVmdCA9IE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2NudCAtIDE7CisJaW50IG9sZF9sZWZ0OworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgaW5wdXQgY2Fub25pY2FsaXphdGlvbiwgYW5kIHRoZXJlIGFyZSBubworCSAqIHBlbmRpbmcgbmV3bGluZXMsIGxldCBjaGFyYWN0ZXJzIHRocm91Z2ggd2l0aG91dCBsaW1pdCwgc28KKwkgKiB0aGF0IGVyYXNlIGNoYXJhY3RlcnMgd2lsbCBiZSBoYW5kbGVkLiAgT3RoZXIgZXhjZXNzCisJICogY2hhcmFjdGVycyB3aWxsIGJlIGJlZXBlZC4KKwkgKi8KKwlpZiAobGVmdCA8PSAwKQorCQlsZWZ0ID0gdHR5LT5pY2Fub24gJiYgIXR0eS0+Y2Fub25fZGF0YTsKKwlvbGRfbGVmdCA9IHR0eS0+cmVjZWl2ZV9yb29tOworCXR0eS0+cmVjZWl2ZV9yb29tID0gbGVmdDsKKworCS8qIERpZCB0aGlzIG9wZW4gdXAgdGhlIHJlY2VpdmUgYnVmZmVyPyBXZSBtYXkgbmVlZCB0byBmbGlwICovCisJaWYgKGxlZnQgJiYgIW9sZF9sZWZ0KQorCQlzY2hlZHVsZV93b3JrKCZ0dHktPmJ1Zi53b3JrKTsKK30KKwogc3RhdGljIHZvaWQgcHV0X3R0eV9xdWV1ZV9ub2xvY2sodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWlmICh0dHktPnJlYWRfY250IDwgTl9UVFlfQlVGX1NJWkUpIHsKQEAgLTE1Miw2ICsxODQsNyBAQAogCiAJdHR5LT5jYW5vbl9oZWFkID0gdHR5LT5jYW5vbl9kYXRhID0gdHR5LT5lcmFzaW5nID0gMDsKIAltZW1zZXQoJnR0eS0+cmVhZF9mbGFncywgMCwgc2l6ZW9mIHR0eS0+cmVhZF9mbGFncyk7CisJbl90dHlfc2V0X3Jvb20odHR5KTsKIAljaGVja191bnRocm90dGxlKHR0eSk7CiB9CiAKQEAgLTEzMjcsMTkgKzEzNjAsMTcgQEAKICAqCWNhbGxzIG9uZSBhdCBhIHRpbWUgYW5kIGluIG9yZGVyIChvciB1c2luZyBmbHVzaF90b19sZGlzYykKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IG5fdHR5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgbl90dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQogewogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAJY2hhciAqZiwgZmxhZ3MgPSBUVFlfTk9STUFMOwogCWludAlpOwogCWNoYXIJYnVmWzY0XTsKIAl1bnNpZ25lZCBsb25nIGNwdWZsYWdzOwotCWludCBsZWZ0OwotCWludCByZXQgPSAwOwogCiAJaWYgKCF0dHktPnJlYWRfYnVmKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJaWYgKHR0eS0+cmVhbF9yYXcpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBjcHVmbGFncyk7CkBAIC0xMzQ5LDcgKzEzODAsNiBAQAogCQltZW1jcHkodHR5LT5yZWFkX2J1ZiArIHR0eS0+cmVhZF9oZWFkLCBjcCwgaSk7CiAJCXR0eS0+cmVhZF9oZWFkID0gKHR0eS0+cmVhZF9oZWFkICsgaSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CiAJCXR0eS0+cmVhZF9jbnQgKz0gaTsKLQkJcmV0ICs9IGk7CiAJCWNwICs9IGk7CiAJCWNvdW50IC09IGk7CiAKQEAgLTEzNTksMTAgKzEzODksOCBAQAogCQltZW1jcHkodHR5LT5yZWFkX2J1ZiArIHR0eS0+cmVhZF9oZWFkLCBjcCwgaSk7CiAJCXR0eS0+cmVhZF9oZWFkID0gKHR0eS0+cmVhZF9oZWFkICsgaSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CiAJCXR0eS0+cmVhZF9jbnQgKz0gaTsKLQkJcmV0ICs9IGk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBjcHVmbGFncyk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gY291bnQ7CiAJCWZvciAoaSA9IGNvdW50LCBwID0gY3AsIGYgPSBmcDsgaTsgaS0tLCBwKyspIHsKIAkJCWlmIChmKQogCQkJCWZsYWdzID0gKmYrKzsKQEAgLTEzOTAsNiArMTQxOCw4IEBACiAJCQl0dHktPm9wcy0+Zmx1c2hfY2hhcnModHR5KTsKIAl9CiAKKwluX3R0eV9zZXRfcm9vbSh0dHkpOworCiAJaWYgKCghdHR5LT5pY2Fub24gJiYgKHR0eS0+cmVhZF9jbnQgPj0gdHR5LT5taW5pbXVtX3RvX3dha2UpKSB8fAogCQlMX0VYVFBST0ModHR5KSkgewogCQlraWxsX2Zhc3luYygmdHR5LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKQEAgLTE0MDIsMTIgKzE0MzIsOCBAQAogCSAqIG1vZGUuICBXZSBkb24ndCB3YW50IHRvIHRocm90dGxlIHRoZSBkcml2ZXIgaWYgd2UncmUgaW4KIAkgKiBjYW5vbmljYWwgbW9kZSBhbmQgZG9uJ3QgaGF2ZSBhIG5ld2xpbmUgeWV0IQogCSAqLwotCWxlZnQgPSBOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9jbnQgLSAxOwotCi0JaWYgKGxlZnQgPCBUVFlfVEhSRVNIT0xEX1RIUk9UVExFKQorCWlmICh0dHktPnJlY2VpdmVfcm9vbSA8IFRUWV9USFJFU0hPTERfVEhST1RUTEUpCiAJCXR0eV90aHJvdHRsZSh0dHkpOwotCi0JcmV0dXJuIHJldDsKIH0KIAogaW50IGlzX2lnbm9yZWQoaW50IHNpZykKQEAgLTE0NTEsNiArMTQ3Nyw3IEBACiAJaWYgKHRlc3RfYml0KFRUWV9IV19DT09LX0lOLCAmdHR5LT5mbGFncykpIHsKIAkJdHR5LT5yYXcgPSAxOwogCQl0dHktPnJlYWxfcmF3ID0gMTsKKwkJbl90dHlfc2V0X3Jvb20odHR5KTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoSV9JU1RSSVAodHR5KSB8fCBJX0lVQ0xDKHR0eSkgfHwgSV9JR05DUih0dHkpIHx8CkBAIC0xNTAzLDYgKzE1MzAsNyBAQAogCQllbHNlCiAJCQl0dHktPnJlYWxfcmF3ID0gMDsKIAl9CisJbl90dHlfc2V0X3Jvb20odHR5KTsKIAkvKiBUaGUgdGVybWlvcyBjaGFuZ2UgbWFrZSB0aGUgdHR5IHJlYWR5IGZvciBJL08gKi8KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7CkBAIC0xNzg0LDcgKzE4MTIsMTAgQEAKIAkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQkvKiBGSVhNRTogZG9lcyBuX3R0eV9zZXRfcm9vbSBuZWVkIGxvY2tpbmcgPyAqLworCQkJbl90dHlfc2V0X3Jvb20odHR5KTsKIAkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJQlVHX09OKCF0dHktPnJlYWRfYnVmKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKQEAgLTE4NTUsOCArMTg4NiwxMCBAQAogCQkgKiBsb25nZXIgdGhhbiBUVFlfVEhSRVNIT0xEX1VOVEhST1RUTEUgaW4gY2Fub25pY2FsIG1vZGUsCiAJCSAqIHdlIHdvbid0IGdldCBhbnkgbW9yZSBjaGFyYWN0ZXJzLgogCQkgKi8KLQkJaWYgKG5fdHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpIDw9IFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSkKKwkJaWYgKG5fdHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpIDw9IFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSkgeworCQkJbl90dHlfc2V0X3Jvb20odHR5KTsKIAkJCWNoZWNrX3VudGhyb3R0bGUodHR5KTsKKwkJfQogCiAJCWlmIChiIC0gYnVmID49IG1pbmltdW0pCiAJCQlicmVhazsKQEAgLTE4NzgsNiArMTkxMSw3IEBACiAJfSBlbHNlIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1BVU0gsICZ0dHktPmZsYWdzKSkKIAkJIGdvdG8gZG9faXRfYWdhaW47CiAKKwluX3R0eV9zZXRfcm9vbSh0dHkpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jCmluZGV4IGI0MGY3YjkuLmI0MTI5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYwpAQCAtMzMxOCw2ICszMzE4LDcgQEAKIAkJdWFydC0+cG9ydC5mbGFncyAmPSB+VVBGX0JPT1RfQVVUT0NPTkY7CiAJCXVhcnQtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKIAkJdWFydC0+cG9ydC5kZXYgPSAmc2VyaWFsODI1MF9pc2FfZGV2cy0+ZGV2OworCQl1YXJ0LT5jYXBhYmlsaXRpZXMgPSB1YXJ0X2NvbmZpZ1t1YXJ0LT5wb3J0LnR5cGVdLmZsYWdzOwogCQl1YXJ0X2FkZF9vbmVfcG9ydCgmc2VyaWFsODI1MF9yZWcsICZ1YXJ0LT5wb3J0KTsKIAl9IGVsc2UgewogCQl1YXJ0LT5wb3J0LmRldiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MF9wY2kuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwX3BjaS5jCmluZGV4IDRiNDk2OGEuLmY0MWI0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwX3BjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwX3BjaS5jCkBAIC05NzMsNyArOTczLDcgQEAKIAogc3RhdGljIGludAogcGNpX29tZWdhcGNpX3NldHVwKHN0cnVjdCBzZXJpYWxfcHJpdmF0ZSAqcHJpdiwKLQkJICAgICAgc3RydWN0IHBjaXNlcmlhbF9ib2FyZCAqYm9hcmQsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lzZXJpYWxfYm9hcmQgKmJvYXJkLAogCQkgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgaWR4KQogewogCXJldHVybiBzZXR1cF9wb3J0KHByaXYsIHBvcnQsIDIsIGlkeCAqIDgsIDApOwpAQCAtOTk0LDYgKzk5NCwxNSBAQAogCXJldHVybiBwY2lfZGVmYXVsdF9zZXR1cChwcml2LCBib2FyZCwgcG9ydCwgaWR4KTsKIH0KIAorc3RhdGljIGludCBwY2lfZWcyMHRfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9QQ0hfVUFSVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX1BDSF9VQVJUX01PRFVMRSkKKwlyZXR1cm4gLUVOT0RFVjsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKwogLyogVGhpcyBzaG91bGQgYmUgaW4gbGludXgvcGNpX2lkcy5oICovCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0JTTU9EVUxBUklPCTB4MTI0QgogI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX1NCU01PRFVMQVJJTwkweDEyNEIKQEAgLTE0NDYsNiArMTQ1NSw1NiBAQAogCQkuaW5pdAkJCT0gcGNpX294c2VtaV90b3JuYWRvX2luaXQsCiAJCS5zZXR1cAkJPSBwY2lfZGVmYXVsdF9zZXR1cCwKIAl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJLmRldmljZSAgICAgICAgID0gMHg4ODExLAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJLmRldmljZSAgICAgICAgID0gMHg4ODEyLAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJLmRldmljZSAgICAgICAgID0gMHg4ODEzLAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJLmRldmljZSAgICAgICAgID0gMHg4ODE0LAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gMHgxMERCLAorCQkuZGV2aWNlICAgICAgICAgPSAweDgwMjcsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSAweDEwREIsCisJCS5kZXZpY2UgICAgICAgICA9IDB4ODAyOCwKKwkJLmluaXQJCT0gcGNpX2VnMjB0X2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICAgICA9IDB4MTBEQiwKKwkJLmRldmljZSAgICAgICAgID0gMHg4MDI5LAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gMHgxMERCLAorCQkuZGV2aWNlICAgICAgICAgPSAweDgwMEMsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSAweDEwREIsCisJCS5kZXZpY2UgICAgICAgICA9IDB4ODAwRCwKKwkJLmluaXQJCT0gcGNpX2VnMjB0X2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICAgICA9IDB4MTBEQiwKKwkJLmRldmljZSAgICAgICAgID0gMHg4MDBELAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAogCS8qCiAJICogQ3Jvbnl4IE9tZWdhIFBDSSAoUExYLWNoaXAgYmFzZWQpCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCA4ZGMwNTQxLi5mNWY2ODMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgpAQCAtNjUsNiArNjYsMzAgQEAKICNkZWZpbmUgVUFSVF9EUl9FUlJPUgkJKFVBUlQwMTFfRFJfT0V8VUFSVDAxMV9EUl9CRXxVQVJUMDExX0RSX1BFfFVBUlQwMTFfRFJfRkUpCiAjZGVmaW5lIFVBUlRfRFVNTVlfRFJfUlgJKDEgPDwgMTYpCiAKKworI2RlZmluZSBVQVJUX1dBX1NBVkVfTlIgMTQKKworc3RhdGljIHZvaWQgcGwwMTFfbG9ja3VwX3dhKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgY29uc3QgdTMyIHVhcnRfd2FfcmVnW1VBUlRfV0FfU0FWRV9OUl0gPSB7CisJU1RfVUFSVDAxMV9ETUFXTSwKKwlTVF9VQVJUMDExX1RJTUVPVVQsCisJU1RfVUFSVDAxMV9MQ1JIX1JYLAorCVVBUlQwMTFfSUJSRCwKKwlVQVJUMDExX0ZCUkQsCisJU1RfVUFSVDAxMV9MQ1JIX1RYLAorCVVBUlQwMTFfSUZMUywKKwlTVF9VQVJUMDExX1hGQ1IsCisJU1RfVUFSVDAxMV9YT04xLAorCVNUX1VBUlQwMTFfWE9OMiwKKwlTVF9VQVJUMDExX1hPRkYxLAorCVNUX1VBUlQwMTFfWE9GRjIsCisJVUFSVDAxMV9DUiwKKwlVQVJUMDExX0lNU0MKK307CisKK3N0YXRpYyB1MzIgdWFydF93YV9yZWdkYXRhW1VBUlRfV0FfU0FWRV9OUl07CitzdGF0aWMgREVDTEFSRV9UQVNLTEVUKHBsMDExX2xvY2t1cF90bGV0LCBwbDAxMV9sb2NrdXBfd2EsIDApOworCiAvKiBUaGVyZSBpcyBieSBub3cgYXQgbGVhc3Qgb25lIHZlbmRvciB3aXRoIGRpZmZlcmluZyBkZXRhaWxzLCBzbyBoYW5kbGUgaXQgKi8KIHN0cnVjdCB2ZW5kb3JfZGF0YSB7CiAJdW5zaWduZWQgaW50CQlpZmxzOwpAQCAtNzIsNiArOTcsNyBAQAogCXVuc2lnbmVkIGludAkJbGNyaF90eDsKIAl1bnNpZ25lZCBpbnQJCWxjcmhfcng7CiAJYm9vbAkJCW92ZXJzYW1wbGluZzsKKwlib29sCQkJaW50ZXJydXB0X21heV9oYW5nOyAgIC8qIHZlbmRvci1zcGVjaWZpYyAqLwogCWJvb2wJCQlkbWFfdGhyZXNob2xkOwogfTsKIApAQCAtOTAsOSArMTE2LDEyIEBACiAJLmxjcmhfdHgJCT0gU1RfVUFSVDAxMV9MQ1JIX1RYLAogCS5sY3JoX3J4CQk9IFNUX1VBUlQwMTFfTENSSF9SWCwKIAkub3ZlcnNhbXBsaW5nCQk9IHRydWUsCisJLmludGVycnVwdF9tYXlfaGFuZwk9IHRydWUsCiAJLmRtYV90aHJlc2hvbGQJCT0gdHJ1ZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKmFtYmFfcG9ydHNbVUFSVF9OUl07CisKIC8qIERlYWxzIHdpdGggRE1BIHRyYW5zYWN0aW9ucyAqLwogCiBzdHJ1Y3QgcGwwMTFfc2didWYgewpAQCAtMTMyLDYgKzE2MSw3IEBACiAJdW5zaWduZWQgaW50CQlsY3JoX3J4OwkvKiB2ZW5kb3Itc3BlY2lmaWMgKi8KIAlib29sCQkJYXV0b3J0czsKIAljaGFyCQkJdHlwZVsxMl07CisJYm9vbAkJCWludGVycnVwdF9tYXlfaGFuZzsgLyogdmVuZG9yLXNwZWNpZmljICovCiAjaWZkZWYgQ09ORklHX0RNQV9FTkdJTkUKIAkvKiBETUEgc3R1ZmYgKi8KIAlib29sCQkJdXNpbmdfdHhfZG1hOwpAQCAtMTAwOCw2ICsxMDM4LDY4IEBACiAjZW5kaWYKIAogCisvKgorICogcGwwMTFfbG9ja3VwX3dhCisgKiBUaGlzIHdvcmthcm91bmQgYWltcyB0byBicmVhayB0aGUgZGVhZGxvY2sgc2l0dWF0aW9uCisgKiB3aGVuIGFmdGVyIGxvbmcgdHJhbnNmZXIgb3ZlciB1YXJ0IGluIGhhcmR3YXJlIGZsb3cKKyAqIGNvbnRyb2wsIHVhcnQgaW50ZXJydXB0IHJlZ2lzdGVycyBjYW5ub3QgYmUgY2xlYXJlZC4KKyAqIEhlbmNlIHVhcnQgdHJhbnNmZXIgZ2V0cyBibG9ja2VkLgorICoKKyAqIEl0IGlzIHNlZW4gdGhhdCBkdXJpbmcgc3VjaCBkZWFkbG9jayBjb25kaXRpb24gSUNSCisgKiBkb24ndCBnZXQgY2xlYXJlZCBldmVuIG9uIG11bHRpcGxlIHdyaXRlLiBUaGlzIGxlYWRzCisgKiBwYXNzX2NvdW50ZXIgdG8gZGVjcmVhc2UgYW5kIGZpbmFsbHkgcmVhY2ggemVyby4gVGhpcworICogY2FuIGJlIHRha2VuIGFzIHRyaWdnZXIgcG9pbnQgdG8gcnVuIHRoaXMgVUFSVF9CVF9XQS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHBsMDExX2xvY2t1cF93YSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHVhcnRfYW1iYV9wb3J0ICp1YXAgPSBhbWJhX3BvcnRzWzBdOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHVhcC0+cG9ydC5tZW1iYXNlOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZ1YXAtPnBvcnQuc3RhdGUtPnhtaXQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHVhcC0+cG9ydC5zdGF0ZS0+cG9ydC50dHk7CisJaW50IGJ1Zl9lbXB0eV9yZXRyaWVzID0gMjAwOworCWludCBsb29wOworCisJLyogU3RvcCBIQ0kgbGF5ZXIgZnJvbSBzdWJtaXR0aW5nIGRhdGEgZm9yIHR4ICovCisJdHR5LT5od19zdG9wcGVkID0gMTsKKwl3aGlsZSAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCQlpZiAoYnVmX2VtcHR5X3JldHJpZXMtLSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKworCS8qIEJhY2t1cCByZWdpc3RlcnMgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgVUFSVF9XQV9TQVZFX05SOyBsb29wKyspCisJCXVhcnRfd2FfcmVnZGF0YVtsb29wXSA9IHJlYWRsKGJhc2UgKyB1YXJ0X3dhX3JlZ1tsb29wXSk7CisKKwkvKiBEaXNhYmxlIFVBUlQgc28gdGhhdCBGSUZPIGRhdGEgaXMgZmx1c2hlZCBvdXQgKi8KKwl3cml0ZXcoMHgwMCwgdWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0NSKTsKKworCS8qIFNvZnQgcmVzZXQgVUFSVCBtb2R1bGUgKi8KKwlpZiAodWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhICpwbGF0OworCisJCXBsYXQgPSB1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGxhdC0+cmVzZXQpCisJCQlwbGF0LT5yZXNldCgpOworCX0KKworCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IFVBUlRfV0FfU0FWRV9OUjsgbG9vcCsrKQorCQl3cml0ZXcodWFydF93YV9yZWdkYXRhW2xvb3BdICwKKwkJCQl1YXAtPnBvcnQubWVtYmFzZSArIHVhcnRfd2FfcmVnW2xvb3BdKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIG9sZCBzdGF0dXMgb2YgdGhlIG1vZGVtIHNpZ25hbHMgKi8KKwl1YXAtPm9sZF9zdGF0dXMgPSByZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMXhfRlIpICYKKwkJVUFSVDAxeF9GUl9NT0RFTV9BTlk7CisKKwlpZiAocmVhZGwoYmFzZSArIFVBUlQwMTFfTUlTKSAmIDB4MikKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIlVBUlRfQlRfV0E6ICoqKkZBSUxFRCoqKlxuIik7CisKKwkvKiBTdGFydCBUeC9SeCAqLworCXR0eS0+aHdfc3RvcHBlZCA9IDA7Cit9CisKIHN0YXRpYyB2b2lkIHBsMDExX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKnVhcCA9IChzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKilwb3J0OwpAQCAtMTE1OCw4ICsxMjUwLDExIEBACiAJCQlpZiAoc3RhdHVzICYgVUFSVDAxMV9UWElTKQogCQkJCXBsMDExX3R4X2NoYXJzKHVhcCk7CiAKLQkJCWlmIChwYXNzX2NvdW50ZXItLSA9PSAwKQorCQkJaWYgKHBhc3NfY291bnRlci0tID09IDApIHsKKwkJCQlpZiAodWFwLT5pbnRlcnJ1cHRfbWF5X2hhbmcpCisJCQkJCXRhc2tsZXRfc2NoZWR1bGUoJnBsMDExX2xvY2t1cF90bGV0KTsKIAkJCQlicmVhazsKKwkJCX0KIAogCQkJc3RhdHVzID0gcmVhZHcodWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX01JUyk7CiAJCX0gd2hpbGUgKHN0YXR1cyAhPSAwKTsKQEAgLTEzMzksNiArMTQzNCwxNCBAQAogCXdyaXRldyh1YXAtPmltLCB1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfSU1TQyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ1YXAtPnBvcnQubG9jayk7CiAKKwlpZiAodWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhICpwbGF0OworCisJCXBsYXQgPSB1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGxhdC0+aW5pdCkKKwkJCXBsYXQtPmluaXQoKTsKKwl9CisKIAlyZXR1cm4gMDsKIAogIGNsa19kaXM6CkBAIC0xMzk0LDYgKzE0OTcsMTUgQEAKIAkgKiBTaHV0IGRvd24gdGhlIGNsb2NrIHByb2R1Y2VyCiAJICovCiAJY2xrX2Rpc2FibGUodWFwLT5jbGspOworCisJaWYgKHVhcC0+cG9ydC5kZXYtPnBsYXRmb3JtX2RhdGEpIHsKKwkJc3RydWN0IGFtYmFfcGwwMTFfZGF0YSAqcGxhdDsKKworCQlwbGF0ID0gdWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YTsKKwkJaWYgKHBsYXQtPmV4aXQpCisJCQlwbGF0LT5leGl0KCk7CisJfQorCiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNzAwLDYgKzE4MTIsMTQgQEAKIAlpZiAoIXVhcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAodWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhICpwbGF0OworCisJCXBsYXQgPSB1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGxhdC0+aW5pdCkKKwkJCXBsYXQtPmluaXQoKTsKKwl9CisKIAl1YXAtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZSh1YXAtPmNsayk7CiAKIAlpZiAob3B0aW9ucykKQEAgLTE3NzQsNiArMTg5NCw3IEBACiAJdWFwLT5sY3JoX3J4ID0gdmVuZG9yLT5sY3JoX3J4OwogCXVhcC0+bGNyaF90eCA9IHZlbmRvci0+bGNyaF90eDsKIAl1YXAtPmZpZm9zaXplID0gdmVuZG9yLT5maWZvc2l6ZTsKKwl1YXAtPmludGVycnVwdF9tYXlfaGFuZyA9IHZlbmRvci0+aW50ZXJydXB0X21heV9oYW5nOwogCXVhcC0+cG9ydC5kZXYgPSAmZGV2LT5kZXY7CiAJdWFwLT5wb3J0Lm1hcGJhc2UgPSBkZXYtPnJlcy5zdGFydDsKIAl1YXAtPnBvcnQubWVtYmFzZSA9IGJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggNmQ1ZDZlNi4uYWY5Yjc4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTcwOSwxMiArMTcwOSwxMyBAQAogc3RhdGljIGludCBfX2RldmluaXQgYXRtZWxfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXZvaWQgKmRhdGE7CiAJaW50IHJldDsKIAogCUJVSUxEX0JVR19PTihBVE1FTF9TRVJJQUxfUklOR1NJWkUgJiAoQVRNRUxfU0VSSUFMX1JJTkdTSVpFIC0gMSkpOwogCi0JcG9ydCA9ICZhdG1lbF9wb3J0c1twZGV2LT5pZF07CisJcG9ydCA9ICZhdG1lbF9wb3J0c1twZGF0YS0+bnVtXTsKIAlwb3J0LT5iYWNrdXBfaW1yID0gMDsKIAogCWF0bWVsX2luaXRfcG9ydChwb3J0LCBwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYwppbmRleCBhMWEwZTU1Li5jMGI2OGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCkBAIC0yNTAsNiArMjUwLDIwIEBACiAJCS8qIGdldCBvdmVycnVuL2ZpZm8gZW1wdHkgaW5mb3JtYXRpb24gZnJvbSBpZXIKIAkJICogcmVnaXN0ZXIgKi8KIAkJaWVzdGF0ID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9JUl9SRUcpOworCisJCWlmICh1bmxpa2VseShpZXN0YXQgJiBVQVJUX0lSX1NUQVQoVUFSVF9JUl9SWE9WRVIpKSkgeworCQkJdW5zaWduZWQgaW50IHZhbDsKKworCQkJLyogZmlmbyByZXNldCBpcyByZXF1aXJlZCB0byBjbGVhcgorCQkJICogaW50ZXJydXB0ICovCisJCQl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0NUTF9SRUcpOworCQkJdmFsIHw9IFVBUlRfQ1RMX1JTVFJYRklGT19NQVNLOworCQkJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9DVExfUkVHKTsKKworCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOworCQl9CisKIAkJaWYgKCEoaWVzdGF0ICYgVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhOT1RFTVBUWSkpKQogCQkJYnJlYWs7CiAKQEAgLTI4NCwxMCArMjk4LDYgQEAKIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgYykpCiAJCQljb250aW51ZTsKIAotCQlpZiAodW5saWtlbHkoaWVzdGF0ICYgVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhPVkVSKSkpIHsKLQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKLQkJfQogCiAJCWlmICgoY3N0YXQgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spID09IDApCiAJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGMsIGZsYWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fZHJpdmVyLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwppbmRleCAxOGY1NDg0Li45NmRhMTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJYnJkLT5iZF91YXJ0X29mZnNldCA9IDB4MjAwOwogCWJyZC0+YmRfZGl2aWRlbmQgPSA5MjE2MDA7CiAKLQlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIDB4MTAwMCk7CisJYnJkLT5yZV9tYXBfbWVtYmFzZSA9IGlvcmVtYXAoYnJkLT5tZW1iYXNlLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKIAlpZiAoIWJyZC0+cmVfbWFwX21lbWJhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJImNhcmQgaGFzIG5vIFBDSSBNZW1vcnkgcmVzb3VyY2VzLCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbXJzdF9tYXgzMTEwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXJzdF9tYXgzMTEwLmMKaW5kZXggMWJkMjg0NS4uYTc2NGJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21yc3RfbWF4MzExMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tcnN0X21heDMxMTAuYwpAQCAtNDIxLDcgKzQyMSw2IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJm1heC0+Y29uX3htaXQ7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKHdxKTsKIAlwcl9pbmZvKFBSX0ZNVCAic3RhcnQgbWFpbiB0aHJlYWRcbiIpOwogCiAJZG8gewpAQCAtODIzLDcgKzgyMiw3IEBACiAJcmVzID0gUkNfVEFHOwogCXJldCA9IG1heDMxMTBfd3JpdGVfdGhlbl9yZWFkKG1heCwgKHU4ICopJnJlcywgKHU4ICopJnJlcywgMiwgMCk7CiAJaWYgKHJldCA8IDAgfHwgcmVzID09IDAgfHwgcmVzID09IDB4ZmZmZikgewotCQlwcmludGsoS0VSTl9FUlIgIk1BWDMxMTEgZGVlbWVkIG5vdCBwcmVzZW50IChjb25mIHJlZyAlMDR4KSIsCisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiTUFYMzExMSBkZWVtZWQgbm90IHByZXNlbnQgKGNvbmYgcmVnICUwNHgpIiwKIAkJCQkJCQkJCXJlcyk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2dldF9wYWdlOwpAQCAtODM4LDYgKzgzNyw4IEBACiAJbWF4LT5jb25feG1pdC5oZWFkID0gMDsKIAltYXgtPmNvbl94bWl0LnRhaWwgPSAwOwogCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWF4LT53cSk7CisKIAltYXgtPm1haW5fdGhyZWFkID0ga3RocmVhZF9ydW4obWF4MzExMF9tYWluX3RocmVhZCwKIAkJCQkJbWF4LCAibWF4MzExMF9tYWluIik7CiAJaWYgKElTX0VSUihtYXgtPm1haW5fdGhyZWFkKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwppbmRleCBmMmNiNzUwLi40NjUyMTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwpAQCAtMTM5Nyw2ICsxMzk3LDcgQEAKIAlpbnQgZmlmb3NpemUsIGJhc2VfYmF1ZDsKIAlpbnQgcG9ydF90eXBlOwogCXN0cnVjdCBwY2hfdWFydF9kcml2ZXJfZGF0YSAqYm9hcmQ7CisJY29uc3QgY2hhciAqYm9hcmRfbmFtZTsKIAogCWJvYXJkID0gJmRydl9kYXRbaWQtPmRyaXZlcl9kYXRhXTsKIAlwb3J0X3R5cGUgPSBib2FyZC0+cG9ydF90eXBlOwpAQCAtMTQxMiw3ICsxNDEzLDggQEAKIAliYXNlX2JhdWQgPSAxODQzMjAwOyAvKiAxLjg0MzJNSHogKi8KIAogCS8qIHF1aXJrIGZvciBDTS1pVEMgYm9hcmQgKi8KLQlpZiAoc3Ryc3RyKGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpLCAiQ00taVRDIikpCisJYm9hcmRfbmFtZSA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpOworCWlmIChib2FyZF9uYW1lICYmIHN0cnN0cihib2FyZF9uYW1lLCAiQ00taVRDIikpCiAJCWJhc2VfYmF1ZCA9IDE5MjAwMDAwMDsgLyogMTkyLjBNSHogKi8KIAogCXN3aXRjaCAocG9ydF90eXBlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3M1cHYyMTAuYwppbmRleCBmYjI2MTlmLi5kZDE5NGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zNXB2MjEwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcgPSBwb3J0LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwogCi0JaWYgKChjZmctPmNsb2Nrc19zaXplKSA9PSAxKQorCWlmIChjZmctPmZsYWdzICYgTk9fTkVFRF9DSEVDS19DTEtTUkMpCiAJCXJldHVybiAwOwogCiAJaWYgKHN0cmNtcChjbGstPm5hbWUsICJwY2xrIikgPT0gMCkKQEAgLTU1LDcgKzU1LDcgQEAKIAogCWNsay0+ZGl2aXNvciA9IDE7CiAKLQlpZiAoKGNmZy0+Y2xvY2tzX3NpemUpID09IDEpCisJaWYgKGNmZy0+ZmxhZ3MgJiBOT19ORUVEX0NIRUNLX0NMS1NSQykKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHVjb24gJiBTNVBWMjEwX1VDT05fQ0xLTUFTSykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jIGIvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jCmluZGV4IDQ2ZGUyZTAuLjZjOWI3Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9idWZmZXIuYworKysgYi9kcml2ZXJzL3R0eS90dHlfYnVmZmVyLmMKQEAgLTQxMywxMCArNDEzLDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwogCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFRUWV9GTFVTSElORywgJnR0eS0+ZmxhZ3MpKSB7Ci0JCXN0cnVjdCB0dHlfYnVmZmVyICpoZWFkLCAqdGFpbCA9IHR0eS0+YnVmLnRhaWw7Ci0JCWludCBzZWVuX3RhaWwgPSAwOworCQlzdHJ1Y3QgdHR5X2J1ZmZlciAqaGVhZDsKIAkJd2hpbGUgKChoZWFkID0gdHR5LT5idWYuaGVhZCkgIT0gTlVMTCkgewotCQkJaW50IGNvcGllZDsKIAkJCWludCBjb3VudDsKIAkJCWNoYXIgKmNoYXJfYnVmOwogCQkJdW5zaWduZWQgY2hhciAqZmxhZ19idWY7CkBAIC00MjUsMTUgKzQyMyw2IEBACiAJCQlpZiAoIWNvdW50KSB7CiAJCQkJaWYgKGhlYWQtPm5leHQgPT0gTlVMTCkKIAkJCQkJYnJlYWs7Ci0JCQkJLyoKLQkJCQkgIFRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0dHkgbWlnaHQgZ2V0IG5ldyBidWZmZXIKLQkJCQkgIGFkZGVkIGR1cmluZyB0aGUgdW5sb2NrIHdpbmRvdyBiZWxvdy4gV2UgY291bGQKLQkJCQkgIGVuZCB1cCBzcGlubmluZyBpbiBoZXJlIGZvcmV2ZXIgaG9nZ2luZyB0aGUgQ1BVCi0JCQkJICBjb21wbGV0ZWx5LiBUbyBhdm9pZCB0aGlzIGxldCdzIGhhdmUgYSByZXN0IGVhY2gKLQkJCQkgIHRpbWUgd2UgcHJvY2Vzc2VkIHRoZSB0YWlsIGJ1ZmZlci4KLQkJCQkqLwotCQkJCWlmICh0YWlsID09IGhlYWQpCi0JCQkJCXNlZW5fdGFpbCA9IDE7CiAJCQkJdHR5LT5idWYuaGVhZCA9IGhlYWQtPm5leHQ7CiAJCQkJdHR5X2J1ZmZlcl9mcmVlKHR0eSwgaGVhZCk7CiAJCQkJY29udGludWU7CkBAIC00NDMsMTkgKzQzMiwxNyBAQAogCQkJICAgbGluZSBkaXNjaXBsaW5lIGFzIHdlIHdhbnQgdG8gZW1wdHkgdGhlIHF1ZXVlICovCiAJCQlpZiAodGVzdF9iaXQoVFRZX0ZMVVNIUEVORElORywgJnR0eS0+ZmxhZ3MpKQogCQkJCWJyZWFrOworCQkJaWYgKCF0dHktPnJlY2VpdmVfcm9vbSkKKwkJCQlicmVhazsKKwkJCWlmIChjb3VudCA+IHR0eS0+cmVjZWl2ZV9yb29tKQorCQkJCWNvdW50ID0gdHR5LT5yZWNlaXZlX3Jvb207CiAJCQljaGFyX2J1ZiA9IGhlYWQtPmNoYXJfYnVmX3B0ciArIGhlYWQtPnJlYWQ7CiAJCQlmbGFnX2J1ZiA9IGhlYWQtPmZsYWdfYnVmX3B0ciArIGhlYWQtPnJlYWQ7CisJCQloZWFkLT5yZWFkICs9IGNvdW50OwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCQkJY29waWVkID0gZGlzYy0+b3BzLT5yZWNlaXZlX2J1Zih0dHksIGNoYXJfYnVmLAorCQkJZGlzYy0+b3BzLT5yZWNlaXZlX2J1Zih0dHksIGNoYXJfYnVmLAogCQkJCQkJCWZsYWdfYnVmLCBjb3VudCk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCi0JCQloZWFkLT5yZWFkICs9IGNvcGllZDsKLQotCQkJaWYgKGNvcGllZCA9PSAwIHx8IHNlZW5fdGFpbCkgewotCQkJCXNjaGVkdWxlX3dvcmsoJnR0eS0+YnVmLndvcmspOwotCQkJCWJyZWFrOwotCQkJfQogCQl9CiAJCWNsZWFyX2JpdChUVFlfRkxVU0hJTkcsICZ0dHktPmZsYWdzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS90dHlfbGRpc2MuYyBiL2RyaXZlcnMvdHR5L3R0eV9sZGlzYy5jCmluZGV4IDVkMDFkMzIuLmVmOTI1ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9sZGlzYy5jCisrKyBiL2RyaXZlcnMvdHR5L3R0eV9sZGlzYy5jCkBAIC01NTUsNyArNTU1LDcgQEAKIHN0YXRpYyBpbnQgdHR5X2xkaXNjX3dhaXRfaWRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWludCByZXQ7Ci0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodHR5X2xkaXNjX2lkbGUsCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHR0eV9sZGlzY19pZGxlLAogCQkJYXRvbWljX3JlYWQoJnR0eS0+bGRpc2MtPnVzZXJzKSA9PSAxLCA1ICogSFopOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNzYzLDYgKzc2Myw4IEBACiAJaWYgKElTX0VSUihsZCkpCiAJCXJldHVybiAtMTsKIAorCVdBUk5fT05fT05DRSh0dHlfbGRpc2Nfd2FpdF9pZGxlKHR0eSkpOworCiAJdHR5X2xkaXNjX2Nsb3NlKHR0eSwgdHR5LT5sZGlzYyk7CiAJdHR5X2xkaXNjX3B1dCh0dHktPmxkaXNjKTsKIAl0dHktPmxkaXNjID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3Z0L3NlbGVjdGlvbi5jIGIvZHJpdmVycy90dHkvdnQvc2VsZWN0aW9uLmMKaW5kZXggNjdiMWQwZC4uZmI4NjRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvdnQvc2VsZWN0aW9uLmMKKysrIGIvZHJpdmVycy90dHkvdnQvc2VsZWN0aW9uLmMKQEAgLTMzMiw3ICszMzIsOCBAQAogCQkJY29udGludWU7CiAJCX0KIAkJY291bnQgPSBzZWxfYnVmZmVyX2x0aCAtIHBhc3RlZDsKLQkJY291bnQgPSB0dHktPmxkaXNjLT5vcHMtPnJlY2VpdmVfYnVmKHR0eSwgc2VsX2J1ZmZlciArIHBhc3RlZCwKKwkJY291bnQgPSBtaW4oY291bnQsIHR0eS0+cmVjZWl2ZV9yb29tKTsKKwkJdHR5LT5sZGlzYy0+b3BzLT5yZWNlaXZlX2J1Zih0dHksIHNlbF9idWZmZXIgKyBwYXN0ZWQsCiAJCQkJCQkJCU5VTEwsIGNvdW50KTsKIAkJcGFzdGVkICs9IGNvdW50OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCAzOTVhMzQ3Li5kYWM3Njc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0xNTMwLDYgKzE1MzAsOCBAQAogCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0Y2UpLCB9LCAvKiBOb2tpYSBFOTAgKi8KIAl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMWQ0KSwgfSwgLyogTm9raWEgRTU1ICovCiAJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDMwMiksIH0sIC8qIE5va2lhIE44ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDMzNSksIH0sIC8qIE5va2lhIEU3ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDNjZCksIH0sIC8qIE5va2lhIEM3ICovCiAJeyBTQU1TVU5HX1BDU1VJVEVfQUNNX0lORk8oMHg2NjUxKSwgfSwgLyogU2Ftc3VuZyBHVGk4NTEwIChJTk5PVjgpICovCiAKIAkvKiBOT1RFOiBub24tTm9raWEgQ09NTS9BQ00vMHhmZiBpcyBsaWtlbHkgTVNGVCBSTkRJUy4uLiBOT1QgYSBtb2RlbSEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IGUzNWExNzYuLjM0ZTNkYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCSAqIEp1c3QgcmUtZW5hYmxlIGl0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBlbmRwb2ludCB0b2dnbGVzLgogCQkgKi8KIAkJdXNiX2VuYWJsZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgZmFsc2UpOwotCX0gZWxzZSBpZiAoIWVycm9yICYmICFpbnRmLT5kZXYucG93ZXIuaW5fc3VzcGVuZCkgeworCX0gZWxzZSBpZiAoIWVycm9yICYmICFpbnRmLT5kZXYucG93ZXIuaXNfcHJlcGFyZWQpIHsKIAkJciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uCiAJCQkJZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAkJaWYgKHIgPCAwKQpAQCAtOTYwLDcgKzk2MCw3IEBACiAJfQogCiAJLyogVHJ5IHRvIHJlYmluZCB0aGUgaW50ZXJmYWNlICovCi0JaWYgKCFpbnRmLT5kZXYucG93ZXIuaW5fc3VzcGVuZCkgeworCWlmICghaW50Zi0+ZGV2LnBvd2VyLmlzX3ByZXBhcmVkKSB7CiAJCWludGYtPm5lZWRzX2JpbmRpbmcgPSAwOwogCQlyYyA9IGRldmljZV9hdHRhY2goJmludGYtPmRldik7CiAJCWlmIChyYyA8IDApCkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKSB7CiAKIAkJLyogQ2Fycnkgb3V0IGEgZGVmZXJyZWQgc3dpdGNoIHRvIGFsdHNldHRpbmcgMCAqLwotCQlpZiAoaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgJiYgIWludGYtPmRldi5wb3dlci5pbl9zdXNwZW5kKSB7CisJCWlmIChpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCAmJiAhaW50Zi0+ZGV2LnBvd2VyLmlzX3ByZXBhcmVkKSB7CiAJCQl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCQlkZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOwogCQkJaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgPSAwOwpAQCAtMTE4NywxMyArMTE4NywyMiBAQAogCQlmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKIAkJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCBtc2cpOworCisJCQkvKiBJZ25vcmUgZXJyb3JzIGR1cmluZyBzeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbnMgKi8KKwkJCWlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQorCQkJCXN0YXR1cyA9IDA7CiAJCQlpZiAoc3RhdHVzICE9IDApCiAJCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKHN0YXR1cyA9PSAwKQorCWlmIChzdGF0dXMgPT0gMCkgewogCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9kZXZpY2UodWRldiwgbXNnKTsKIAorCQkvKiBBZ2FpbiwgaWdub3JlIGVycm9ycyBkdXJpbmcgc3lzdGVtIHNsZWVwIHRyYW5zaXRpb25zICovCisJCWlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQorCQkJc3RhdHVzID0gMDsKKwl9CisKIAkvKiBJZiB0aGUgc3VzcGVuZCBmYWlsZWQsIHJlc3VtZSBpbnRlcmZhY2VzIHRoYXQgZGlkIGdldCBzdXNwZW5kZWQgKi8KIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJbXNnLmV2ZW50IF49IChQTV9FVkVOVF9TVVNQRU5EIHwgUE1fRVZFTlRfUkVTVU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDc5YTU4YzMuLmE0MjhhYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMzM5LDcgKzMzOSw4IEBACiB7CiAJaW50IGksIHN0YXR1cyA9IC1FVElNRURPVVQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVVNCX1NUU19SRVRSSUVTICYmIHN0YXR1cyA9PSAtRVRJTUVET1VUOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgVVNCX1NUU19SRVRSSUVTICYmCisJCQkoc3RhdHVzID09IC1FVElNRURPVVQgfHwgc3RhdHVzID09IC1FUElQRSk7IGkrKykgewogCQlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2coaGRldiwgdXNiX3JjdmN0cmxwaXBlKGhkZXYsIDApLAogCQkJVVNCX1JFUV9HRVRfU1RBVFVTLCBVU0JfRElSX0lOIHwgVVNCX1JUX0hVQiwgMCwgMCwKIAkJCWRhdGEsIHNpemVvZigqZGF0YSksIFVTQl9TVFNfVElNRU9VVCk7CkBAIC0zNTUsNyArMzU2LDggQEAKIHsKIAlpbnQgaSwgc3RhdHVzID0gLUVUSU1FRE9VVDsKIAotCWZvciAoaSA9IDA7IGkgPCBVU0JfU1RTX1JFVFJJRVMgJiYgc3RhdHVzID09IC1FVElNRURPVVQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBVU0JfU1RTX1JFVFJJRVMgJiYKKwkJCShzdGF0dXMgPT0gLUVUSU1FRE9VVCB8fCBzdGF0dXMgPT0gLUVQSVBFKTsgaSsrKSB7CiAJCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhoZGV2LCB1c2JfcmN2Y3RybHBpcGUoaGRldiwgMCksCiAJCQlVU0JfUkVRX0dFVF9TVEFUVVMsIFVTQl9ESVJfSU4gfCBVU0JfUlRfUE9SVCwgMCwgcG9ydDEsCiAJCQlkYXRhLCBzaXplb2YoKmRhdGEpLCBVU0JfU1RTX1RJTUVPVVQpOwpAQCAtMTYzMiw2ICsxNjM0LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9ICpwZGV2OwogCWludAkJCWk7CisJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CiAKIAlpZiAoIXVkZXYpIHsKIAkJcHJfZGVidWcgKCIlcyBub2RldlxuIiwgX19mdW5jX18pOwpAQCAtMTY1OSw3ICsxNjYyLDkgQEAKIAkgKiBzbyB0aGF0IHRoZSBoYXJkd2FyZSBpcyBub3cgZnVsbHkgcXVpZXNjZWQuCiAJICovCiAJZGV2X2RiZyAoJnVkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgZGV2aWNlXG4iKTsKKwltdXRleF9sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAl1c2JfZGlzYWJsZV9kZXZpY2UodWRldiwgMCk7CisJbXV0ZXhfdW5sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAl1c2JfaGNkX3N5bmNocm9uaXplX3VubGlua3ModWRldik7CiAKIAl1c2JfcmVtb3ZlX2VwX2RldnMoJnVkZXYtPmVwMCk7CkBAIC0yMzYwLDYgKzIzNjUsMTAgQEAKIAkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAsIDAsCiAJCQkJTlVMTCwgMCwKIAkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwkJLyogU3lzdGVtIHNsZWVwIHRyYW5zaXRpb25zIHNob3VsZCBuZXZlciBmYWlsICovCisJCWlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQorCQkJc3RhdHVzID0gMDsKIAl9IGVsc2UgewogCQkvKiBkZXZpY2UgaGFzIHVwIHRvIDEwIG1zZWMgdG8gZnVsbHkgc3VzcGVuZCAqLwogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNzdXNwZW5kXG4iLApAQCAtMjYwOSwxNiArMjYxOCwxNSBAQAogCXN0cnVjdCB1c2JfZGV2aWNlCSpoZGV2ID0gaHViLT5oZGV2OwogCXVuc2lnbmVkCQlwb3J0MTsKIAotCS8qIGZhaWwgaWYgY2hpbGRyZW4gYXJlbid0IGFscmVhZHkgc3VzcGVuZGVkICovCisJLyogV2FybiBpZiBjaGlsZHJlbiBhcmVuJ3QgYWxyZWFkeSBzdXNwZW5kZWQgKi8KIAlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7IHBvcnQxKyspIHsKIAkJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAKIAkJdWRldiA9IGhkZXYtPmNoaWxkcmVuIFtwb3J0MS0xXTsKIAkJaWYgKHVkZXYgJiYgdWRldi0+Y2FuX3N1Ym1pdCkgewotCQkJaWYgKCEobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpCi0JCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwKLQkJCQkJCXBvcnQxKTsKLQkJCXJldHVybiAtRUJVU1k7CisJCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwgcG9ydDEpOworCQkJaWYgKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pCisJCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCmluZGV4IDFiMTI1YzIuLjIyNzhkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKQEAgLTM4OSw3ICszODksNiBAQAogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmICghZXJyb3IpCiAJCWRfZGVsZXRlKGRlbnRyeSk7Ci0JZHB1dChkZW50cnkpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCA1NzAxZTg1Li4wYjVlYzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMTEzNSwxNSArMTEzNSwyNiBAQAogICogRGVhbGxvY2F0ZXMgaGNkL2hhcmR3YXJlIHN0YXRlIGZvciB0aGUgZW5kcG9pbnRzIChudWtpbmcgYWxsIG9yIG1vc3QKICAqIHBlbmRpbmcgdXJicykgYW5kIHVzYmNvcmUgc3RhdGUgZm9yIHRoZSBpbnRlcmZhY2VzLCBzbyB0aGF0IHVzYmNvcmUKICAqIG11c3QgdXNiX3NldF9jb25maWd1cmF0aW9uKCkgYmVmb3JlIGFueSBpbnRlcmZhY2VzIGNvdWxkIGJlIHVzZWQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBoY2QtPmJhbmR3aWR0aF9tdXRleCBoZWxkLgogICovCiB2b2lkIHVzYl9kaXNhYmxlX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgc2tpcF9lcDApCiB7CiAJaW50IGk7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwogCiAJLyogZ2V0dGluZyByaWQgb2YgaW50ZXJmYWNlcyB3aWxsIGRpc2Nvbm5lY3QKIAkgKiBhbnkgZHJpdmVycyBib3VuZCB0byB0aGVtIChhIGtleSBzaWRlIGVmZmVjdCkKIAkgKi8KIAlpZiAoZGV2LT5hY3Rjb25maWcpIHsKKwkJLyoKKwkJICogRklYTUU6IEluIG9yZGVyIHRvIGF2b2lkIHNlbGYtZGVhZGxvY2sgaW52b2x2aW5nIHRoZQorCQkgKiBiYW5kd2lkdGhfbXV0ZXgsIHdlIGhhdmUgdG8gbWFyayBhbGwgdGhlIGludGVyZmFjZXMKKwkJICogYmVmb3JlIHVucmVnaXN0ZXJpbmcgYW55IG9mIHRoZW0uCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykKKwkJCWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV0tPnVucmVnaXN0ZXJpbmcgPSAxOworCiAJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CiAJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZXJmYWNlOwogCkBAIC0xMTUzLDcgKzExNjQsNiBAQAogCQkJCWNvbnRpbnVlOwogCQkJZGV2X2RiZygmZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGludGVyZmFjZSAlc1xuIiwKIAkJCQlkZXZfbmFtZSgmaW50ZXJmYWNlLT5kZXYpKTsKLQkJCWludGVyZmFjZS0+dW5yZWdpc3RlcmluZyA9IDE7CiAJCQlyZW1vdmVfaW50Zl9lcF9kZXZzKGludGVyZmFjZSk7CiAJCQlkZXZpY2VfZGVsKCZpbnRlcmZhY2UtPmRldik7CiAJCX0KQEAgLTExNzIsNiArMTE4MiwxNiBAQAogCiAJZGV2X2RiZygmZGV2LT5kZXYsICIlcyBudWtpbmcgJXMgVVJCc1xuIiwgX19mdW5jX18sCiAJCXNraXBfZXAwID8gIm5vbi1lcDAiIDogImFsbCIpOworCWlmIChoY2QtPmRyaXZlci0+Y2hlY2tfYmFuZHdpZHRoKSB7CisJCS8qIEZpcnN0IHBhc3M6IENhbmNlbCBVUkJzLCBsZWF2ZSBlbmRwb2ludCBwb2ludGVycyBpbnRhY3QuICovCisJCWZvciAoaSA9IHNraXBfZXAwOyBpIDwgMTY7ICsraSkgeworCQkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpLCBmYWxzZSk7CisJCQl1c2JfZGlzYWJsZV9lbmRwb2ludChkZXYsIGkgKyBVU0JfRElSX0lOLCBmYWxzZSk7CisJCX0KKwkJLyogUmVtb3ZlIGVuZHBvaW50cyBmcm9tIHRoZSBob3N0IGNvbnRyb2xsZXIgaW50ZXJuYWwgc3RhdGUgKi8KKwkJdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJLyogU2Vjb25kIHBhc3M6IHJlbW92ZSBlbmRwb2ludCBwb2ludGVycyAqLworCX0KIAlmb3IgKGkgPSBza2lwX2VwMDsgaSA8IDE2OyArK2kpIHsKIAkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpLCB0cnVlKTsKIAkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpICsgVVNCX0RJUl9JTiwgdHJ1ZSk7CkBAIC0xMjczLDYgKzEyOTMsOCBAQAogCQkJaW50ZXJmYWNlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWlmIChpZmFjZS0+dW5yZWdpc3RlcmluZykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaWZhY2UsIGFsdGVybmF0ZSk7CiAJaWYgKCFhbHQpIHsKQEAgLTE3MjcsNiArMTc0OSw3IEBACiAJLyogaWYgaXQncyBhbHJlYWR5IGNvbmZpZ3VyZWQsIGNsZWFyIG91dCBvbGQgc3RhdGUgZmlyc3QuCiAJICogZ2V0dGluZyByaWQgb2Ygb2xkIGludGVyZmFjZXMgbWVhbnMgdW5iaW5kaW5nIHRoZWlyIGRyaXZlcnMuCiAJICovCisJbXV0ZXhfbG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJaWYgKGRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX0FERFJFU1MpCiAJCXVzYl9kaXNhYmxlX2RldmljZShkZXYsIDEpOwkvKiBTa2lwIGVwMCAqLwogCkBAIC0xNzM5LDcgKzE3NjIsNiBAQAogCSAqIGhvc3QgY29udHJvbGxlciB3aWxsIG5vdCBhbGxvdyBzdWJtaXNzaW9ucyB0byBkcm9wcGVkIGVuZHBvaW50cy4gIElmCiAJICogdGhpcyBjYWxsIGZhaWxzLCB0aGUgZGV2aWNlIHN0YXRlIGlzIHVuY2hhbmdlZC4KIAkgKi8KLQltdXRleF9sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAlyZXQgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIGNwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewogCQltdXRleF91bmxvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCA1ODQ1NmQxLi4wMjllMjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtNjMyLDEzICs2MzIsMTAgQEAKIAogZW5kY2hvaWNlCiAKKyMgU2VsZWN0ZWQgYnkgVURDIGRyaXZlcnMgdGhhdCBzdXBwb3J0IGhpZ2gtc3BlZWQgb3BlcmF0aW9uLgogY29uZmlnIFVTQl9HQURHRVRfRFVBTFNQRUVECiAJYm9vbAogCWRlcGVuZHMgb24gVVNCX0dBREdFVAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIE1lYW5zIHRoYXQgZ2FkZ2V0IGRyaXZlcnMgc2hvdWxkIGluY2x1ZGUgZXh0cmEgZGVzY3JpcHRvcnMKLQkgIGFuZCBjb2RlIHRvIGhhbmRsZSBkdWFsLXNwZWVkIGNvbnRyb2xsZXJzLgogCiAjCiAjIFVTQiBHYWRnZXQgRHJpdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hbWQ1NTM2dWRjLmMKaW5kZXggNmU0MmFhYi4uOTVlODEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYW1kNTUzNnVkYy5jCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKaW5kZXggNDFkYzA5My4uZjQ2OTBmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCmluZGV4IDYxZmY5MjcuLmQzZGNhYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKQEAgLTE5MDYsNiArMTkwNiw3IEBACiAJaWYgKCFoY2QpCiAJCXJldHVybiAtRU5PTUVNOwogCXRoZV9jb250cm9sbGVyID0gaGNkX3RvX2R1bW15IChoY2QpOworCWhjZC0+aGFzX3R0ID0gMTsKIAogCXJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7CiAJaWYgKHJldHZhbCAhPSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VkY19jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VkY19jb3JlLmMKaW5kZXggMmNkOWE2MC4uNGU0ODMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91ZGNfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdWRjX2NvcmUuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNpbmNsdWRlICJmc2xfdXNiMl91ZGMuaCIKIApAQCAtMTE4LDYgKzExNywxNyBAQAogI2RlZmluZSBmc2xfcmVhZGwocCkJCSgqX2ZzbF9yZWFkbCkoKHApKQogI2RlZmluZSBmc2xfd3JpdGVsKHYsIHApCSgqX2ZzbF93cml0ZWwpKCh2KSwgKHApKQogCitzdGF0aWMgaW5saW5lIHZvaWQgZnNsX3NldF9hY2Nlc3NvcnMoc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCWlmIChwZGF0YS0+YmlnX2VuZGlhbl9tbWlvKSB7CisJCV9mc2xfcmVhZGwgPSBfZnNsX3JlYWRsX2JlOworCQlfZnNsX3dyaXRlbCA9IF9mc2xfd3JpdGVsX2JlOworCX0gZWxzZSB7CisJCV9mc2xfcmVhZGwgPSBfZnNsX3JlYWRsX2xlOworCQlfZnNsX3dyaXRlbCA9IF9mc2xfd3JpdGVsX2xlOworCX0KK30KKwogc3RhdGljIGlubGluZSB1MzIgY3B1X3RvX2hjMzIoY29uc3QgdTMyIHgpCiB7CiAJcmV0dXJuIHVkY19jb250cm9sbGVyLT5wZGF0YS0+YmlnX2VuZGlhbl9kZXNjCkBAIC0xMzIsNiArMTQyLDggQEAKIAkJOiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpeCk7CiB9CiAjZWxzZSAvKiAhQ09ORklHX1BQQzMyICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNsX3NldF9hY2Nlc3NvcnMoc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgKnBkYXRhKSB7fQorCiAjZGVmaW5lIGZzbF9yZWFkbChhZGRyKQkJcmVhZGwoYWRkcikKICNkZWZpbmUgZnNsX3dyaXRlbCh2YWwzMiwgYWRkcikgd3JpdGVsKHZhbDMyLCBhZGRyKQogI2RlZmluZSBjcHVfdG9faGMzMih4KQkJY3B1X3RvX2xlMzIoeCkKQEAgLTEyNzcsNiArMTI4OSwxMSBAQAogCXJlcS0+cmVxLmNvbXBsZXRlID0gTlVMTDsKIAlyZXEtPmR0ZF9jb3VudCA9IDA7CiAKKwlyZXEtPnJlcS5kbWEgPSBkbWFfbWFwX3NpbmdsZShlcC0+dWRjLT5nYWRnZXQuZGV2LnBhcmVudCwKKwkJCXJlcS0+cmVxLmJ1ZiwgcmVxLT5yZXEubGVuZ3RoLAorCQkJZXBfaXNfaW4oZXApID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisJcmVxLT5tYXBwZWQgPSAxOworCiAJaWYgKGZzbF9yZXFfdG9fZHRkKHJlcSkgPT0gMCkKIAkJZnNsX3F1ZXVlX3RkKGVwLCByZXEpOwogCWVsc2UKQEAgLTEzNDgsOSArMTM2NSw2IEBACiAJLyogRmlsbCBpbiB0aGUgcmVxZXN0IHN0cnVjdHVyZSAqLwogCSooKHUxNiAqKSByZXEtPnJlcS5idWYpID0gY3B1X3RvX2xlMTYodG1wKTsKIAotCS8qIGZsdXNoIGNhY2hlIGZvciB0aGUgcmVxIGJ1ZmZlciAqLwotCWZsdXNoX2RjYWNoZV9yYW5nZSgodTMyKXJlcS0+cmVxLmJ1ZiwgKHUzMilyZXEtPnJlcS5idWYgKyA4KTsKLQogCXJlcS0+ZXAgPSBlcDsKIAlyZXEtPnJlcS5sZW5ndGggPSAyOwogCXJlcS0+cmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKQEAgLTEzNTgsNiArMTM3MiwxMSBAQAogCXJlcS0+cmVxLmNvbXBsZXRlID0gTlVMTDsKIAlyZXEtPmR0ZF9jb3VudCA9IDA7CiAKKwlyZXEtPnJlcS5kbWEgPSBkbWFfbWFwX3NpbmdsZShlcC0+dWRjLT5nYWRnZXQuZGV2LnBhcmVudCwKKwkJCQlyZXEtPnJlcS5idWYsIHJlcS0+cmVxLmxlbmd0aCwKKwkJCQllcF9pc19pbihlcCkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwlyZXEtPm1hcHBlZCA9IDE7CisKIAkvKiBwcmltZSB0aGUgZGF0YSBwaGFzZSAqLwogCWlmICgoZnNsX3JlcV90b19kdGQocmVxKSA9PSAwKSkKIAkJZnNsX3F1ZXVlX3RkKGVwLCByZXEpOwpAQCAtMjM1NCw3ICsyMzczLDYgQEAKIAkJCXN0cnVjdCBmc2xfcmVxLCByZXEpOwogCS8qIGFsbG9jYXRlIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSB0byBnZXQgdmFsaWQgYWRkcmVzcyAqLwogCXVkYy0+c3RhdHVzX3JlcS0+cmVxLmJ1ZiA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JdWRjLT5zdGF0dXNfcmVxLT5yZXEuZG1hID0gdmlydF90b19waHlzKHVkYy0+c3RhdHVzX3JlcS0+cmVxLmJ1Zik7CiAKIAl1ZGMtPnJlc3VtZV9zdGF0ZSA9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRDsKIAl1ZGMtPnVzYl9zdGF0ZSA9IFVTQl9TVEFURV9QT1dFUkVEOwpAQCAtMjQ3MCwxMyArMjQ4OCw3IEBACiAJfQogCiAJLyogU2V0IGFjY2Vzc29ycyBvbmx5IGFmdGVyIHBkYXRhLT5pbml0KCkgISAqLwotCWlmIChwZGF0YS0+YmlnX2VuZGlhbl9tbWlvKSB7Ci0JCV9mc2xfcmVhZGwgPSBfZnNsX3JlYWRsX2JlOwotCQlfZnNsX3dyaXRlbCA9IF9mc2xfd3JpdGVsX2JlOwotCX0gZWxzZSB7Ci0JCV9mc2xfcmVhZGwgPSBfZnNsX3JlYWRsX2xlOwotCQlfZnNsX3dyaXRlbCA9IF9mc2xfd3JpdGVsX2xlOwotCX0KKwlmc2xfc2V0X2FjY2Vzc29ycyhwZGF0YSk7CiAKICNpZm5kZWYgQ09ORklHX0FSQ0hfTVhDCiAJaWYgKHBkYXRhLT5oYXZlX3N5c2lmX3JlZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IGEwMTM4M2YuLmE1Njg3NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCkBAIC00MzEsOCArNDMxLDEwIEBACiAKIAkvKiBoYWx0IGFueSBlbmRwb2ludCBieSBkb2luZyBhICJ3cm9uZyBkaXJlY3Rpb24iIGkvbyBjYWxsICovCiAJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX2luKCZkYXRhLT5kZXNjKSkgewotCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYygmZGF0YS0+ZGVzYykpCisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZkYXRhLT5kZXNjKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCURCRyAoZGF0YS0+ZGV2LCAiJXMgaGFsdFxuIiwgZGF0YS0+bmFtZSk7CiAJCXNwaW5fbG9ja19pcnEgKCZkYXRhLT5kZXYtPmxvY2spOwogCQlpZiAobGlrZWx5IChkYXRhLT5lcCAhPSBOVUxMKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tdl91ZGNfY29yZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L212X3VkY19jb3JlLmMKaW5kZXggYjYyYjI2NC4uYjFhODE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L212X3VkY19jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L212X3VkY19jb3JlLmMKQEAgLTIwODMsNyArMjA4Myw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbXZfdWRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBtdl91ZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewogCXN0cnVjdCBtdl91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwogCkBAIC0yMDkyLDcgKzIwOTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12X3VkY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldikKK3N0YXRpYyBpbnQgbXZfdWRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewogCXN0cnVjdCBtdl91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwogCWludCByZXR2YWw7CkBAIC0yMTAwLDcgKzIxMDAsNyBAQAogCXJldHZhbCA9IG12X3VkY19waHlfaW5pdCh1ZGMtPnBoeV9yZWdzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoX2RldiwgInBoeSBpbml0aWFsaXphdGlvbiBlcnJvciAlZFxuIiwgcmV0dmFsKTsKLQkJZ290byBlcnJvcjsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAJdWRjX3Jlc2V0KHVkYyk7CiAJZXAwX3Jlc2V0KHVkYyk7CkBAIC0yMTIyLDcgKzIxMjIsNyBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAicHhhLXUybyIsCiAjaWZkZWYgQ09ORklHX1BNCi0JCS5wbQk9IG12X3VkY19wbV9vcHMsCisJCS5wbQk9ICZtdl91ZGNfcG1fb3BzLAogI2VuZGlmCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwppbmRleCAyNDY5NmY3Li40NzZkODhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKQEAgLTYzLDYgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYwppbmRleCAzNjVjMDJmLi43NzQ1NDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKQEAgLTIyMTYsNyArMjIxNiw2IEBACiAJCWlmIChyZXR2YWwgIT0gMCkgewogCQkJcHJfZXJyKCIlczogY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAogCQkJCWRyaXZlcl9uYW1lLCBMVUJCT0NLX1VTQl9ESVNDX0lSUSwgcmV0dmFsKTsKLWx1YmJvY2tfZmFpbDA6CiAJCQlnb3RvIGVycl9pcnFfbHViOwogCQl9CiAJCXJldHZhbCA9IHJlcXVlc3RfaXJxKExVQkJPQ0tfVVNCX0lSUSwKQEAgLTIyMjYsNyArMjIyNSw2IEBACiAJCWlmIChyZXR2YWwgIT0gMCkgewogCQkJcHJfZXJyKCIlczogY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAogCQkJCWRyaXZlcl9uYW1lLCBMVUJCT0NLX1VTQl9JUlEsIHJldHZhbCk7Ci0JCQlmcmVlX2lycShMVUJCT0NLX1VTQl9ESVNDX0lSUSwgZGV2KTsKIAkJCWdvdG8gbHViYm9ja19mYWlsMDsKIAkJfQogCX0gZWxzZQpAQCAtMjIzNiwxMCArMjIzNCwxMSBAQAogCXJldHVybiAwOwogCiAjaWZkZWYJQ09ORklHX0FSQ0hfTFVCQk9DSworbHViYm9ja19mYWlsMDoKIAlmcmVlX2lycShMVUJCT0NLX1VTQl9ESVNDX0lSUSwgZGV2KTsKICBlcnJfaXJxX2x1YjoKLSNlbmRpZgogCWZyZWVfaXJxKGlycSwgZGV2KTsKKyNlbmRpZgogIGVycl9pcnExOgogCWlmIChncGlvX2lzX3ZhbGlkKGRldi0+bWFjaC0+Z3Bpb19wdWxsdXApKQogCQlncGlvX2ZyZWUoZGV2LT5tYWNoLT5ncGlvX3B1bGx1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMKaW5kZXggYWNiOWNjNC4uMGRmZWUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc290Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYwpAQCAtMjY4MCw5ICsyNjgwLDkgQEAKIAogCXdyaXRlbCgwLCBoc290Zy0+cmVncyArIFMzQ19EQUlOVE1TSyk7CiAKLQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAiRVAwOiBESUVQQ1RMMD0weCUwOHgsIERPRVBDVEwwPTB4JTA4eFxuIiwKLQkJIHJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RJRVBDVEwwKSwKLQkJIHJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RPRVBDVEwwKSk7CisJZGV2X2RiZyhoc290Zy0+ZGV2LCAiRVAwOiBESUVQQ1RMMD0weCUwOHgsIERPRVBDVEwwPTB4JTA4eFxuIiwKKwkJcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRElFUENUTDApLAorCQlyZWFkbChoc290Zy0+cmVncyArIFMzQ19ET0VQQ1RMMCkpOwogCiAJLyogZW5hYmxlIGluIGFuZCBvdXQgZW5kcG9pbnQgaW50ZXJydXB0cyAqLwogCXMzY19oc290Z19lbl9nc2ludChoc290ZywgUzNDX0dJTlRTVFNfT0VQSW50IHwgUzNDX0dJTlRTVFNfSUVQSW50KTsKQEAgLTI3MDEsNyArMjcwMSw3IEBACiAJdWRlbGF5KDEwKTsgIC8qIHNlZSBvcGVuaWJvb3QgKi8KIAlfX2JpYzMyKGhzb3RnLT5yZWdzICsgUzNDX0RDVEwsIFMzQ19EQ1RMX1BXUk9uUHJnRG9uZSk7CiAKLQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAiRENUTD0weCUwOHhcbiIsIHJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RDVEwpKTsKKwlkZXZfZGJnKGhzb3RnLT5kZXYsICJEQ1RMPTB4JTA4eFxuIiwgcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRENUTCkpOwogCiAJLyogUzNDX0R4RVBDVExfVVNCQWN0RXAgc2F5cyBSTyBpbiBtYW51YWwsIGJ1dCBzZWVtcyB0byBiZSBzZXQgYnkKIAkgICB3cml0aW5nIHRvIHRoZSBFUENUTCByZWdpc3Rlci4uICovCkBAIC0yNzIxLDkgKzI3MjEsOSBAQAogCiAJczNjX2hzb3RnX2VucXVldWVfc2V0dXAoaHNvdGcpOwogCi0JZGV2X2luZm8oaHNvdGctPmRldiwgIkVQMDogRElFUENUTDA9MHglMDh4LCBET0VQQ1RMMD0weCUwOHhcbiIsCi0JCSByZWFkbChoc290Zy0+cmVncyArIFMzQ19ESUVQQ1RMMCksCi0JCSByZWFkbChoc290Zy0+cmVncyArIFMzQ19ET0VQQ1RMMCkpOworCWRldl9kYmcoaHNvdGctPmRldiwgIkVQMDogRElFUENUTDA9MHglMDh4LCBET0VQQ1RMMD0weCUwOHhcbiIsCisJCXJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RJRVBDVEwwKSwKKwkJcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRE9FUENUTDApKTsKIAogCS8qIGNsZWFyIGdsb2JhbCBOQUtzICovCiAJd3JpdGVsKFMzQ19EQ1RMX0NHT1VUTmFrIHwgUzNDX0RDVExfQ0dOUEluTkFLLApAQCAtMjkyMSw5ICsyOTIxLDkgQEAKIAogCS8qIHNldHVwIGZpZm9zICovCiAKLQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAiR1JYRlNJWj0weCUwOHgsIEdOUFRYRlNJWj0weCUwOHhcbiIsCi0JCSByZWFkbChoc290Zy0+cmVncyArIFMzQ19HUlhGU0laKSwKLQkJIHJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0dOUFRYRlNJWikpOworCWRldl9kYmcoaHNvdGctPmRldiwgIkdSWEZTSVo9MHglMDh4LCBHTlBUWEZTSVo9MHglMDh4XG4iLAorCQlyZWFkbChoc290Zy0+cmVncyArIFMzQ19HUlhGU0laKSwKKwkJcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfR05QVFhGU0laKSk7CiAKIAlzM2NfaHNvdGdfaW5pdF9maWZvKGhzb3RnKTsKIApAQCAtMjk0NSw2ICsyOTQ1LDcgQEAKIAogc3RhdGljIHZvaWQgczNjX2hzb3RnX2R1bXAoc3RydWN0IHMzY19oc290ZyAqaHNvdGcpCiB7CisjaWZkZWYgREVCVUcKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoc290Zy0+ZGV2OwogCXZvaWQgX19pb21lbSAqcmVncyA9IGhzb3RnLT5yZWdzOwogCXUzMiB2YWw7CkBAIC0yOTg3LDYgKzI5ODgsNyBAQAogCiAJZGV2X2luZm8oZGV2LCAiRFZCVVNESVM9MHglMDh4LCBEVkJVU1BVTFNFPSUwOHhcbiIsCiAJCSByZWFkbChyZWdzICsgUzNDX0RWQlVTRElTKSwgcmVhZGwocmVncyArIFMzQ19EVkJVU1BVTFNFKSk7CisjZW5kaWYKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMKaW5kZXggY2ZlM2NmNS4uZDVlM2UxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC91ZGMuaD4KQEAgLTEzMDEsNyArMTMwMiw4IEBACiAJaHN1ZGMtPnVjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ1c2ItZGV2aWNlIik7CiAJaWYgKElTX0VSUihoc3VkYy0+dWNsaykpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCB1c2ItZGV2aWNlIGNsb2NrIHNvdXJjZVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGhzdWRjLT51Y2xrKTsKKwkJcmV0ID0gUFRSX0VSUihoc3VkYy0+dWNsayk7CisJCWdvdG8gZXJyX2NsazsKIAl9CiAJY2xrX2VuYWJsZShoc3VkYy0+dWNsayk7CiAKQEAgLTEzMTAsNyArMTMxMiw4IEBACiAJZGlzYWJsZV9pcnEoaHN1ZGMtPmlycSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXJldHVybiAwOwotCitlcnJfY2xrOgorCWZyZWVfaXJxKGhzdWRjLT5pcnEsIGhzdWRjKTsKIGVycl9pcnE6CiAJaW91bm1hcChoc3VkYy0+cmVncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKaW5kZXggNmQ4YjA0MC4uMTAwZjI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWF0aDc5LmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXRoNzkuYwppbmRleCA5OGNjOGExLi5hYTI0OGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXRoNzkuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXRoNzkuYwpAQCAtNDQsNyArNDQsNiBAQAogCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShoY2QtPnNlbGYuY29udHJvbGxlcik7CiAJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWQ7Ci0JaW50IGhjbGVuZ3RoOwogCWludCByZXQ7CiAKIAlpZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7CkBAIC01MywyMCArNTIsMjMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaGNsZW5ndGggPSBIQ19MRU5HVEgoZWhjaSwgZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOwogCXN3aXRjaCAoaWQtPmRyaXZlcl9kYXRhKSB7CiAJY2FzZSBFSENJX0FUSDc5X0lQX1YxOgogCQllaGNpLT5oYXNfc3lub3BzeXNfaGNfYnVnID0gMTsKIAogCQllaGNpLT5jYXBzID0gaGNkLT5yZWdzOwotCQllaGNpLT5yZWdzID0gaGNkLT5yZWdzICsgaGNsZW5ndGg7CisJCWVoY2ktPnJlZ3MgPSBoY2QtPnJlZ3MgKworCQkJSENfTEVOR1RIKGVoY2ksCisJCQkJICBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBFSENJX0FUSDc5X0lQX1YyOgogCQloY2QtPmhhc190dCA9IDE7CiAKIAkJZWhjaS0+Y2FwcyA9IGhjZC0+cmVncyArIDB4MTAwOwotCQllaGNpLT5yZWdzID0gaGNkLT5yZWdzICsgMHgxMDAgKyBoY2xlbmd0aDsKKwkJZWhjaS0+cmVncyA9IGhjZC0+cmVncyArIDB4MTAwICsKKwkJCUhDX0xFTkdUSChlaGNpLAorCQkJCSAgZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggYjQzNWVkNi4uZjgwMzBlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtMSw0ICsxLDggQEAKIC8qCisgKiBFbmhhbmNlZCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIChFSENJKSBkcml2ZXIgZm9yIFVTQi4KKyAqCisgKiBNYWludGFpbmVyOiBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgorICoKICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IGJ5IERhdmlkIEJyb3duZWxsCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuYwppbmRleCBjOWU2ZTQ1Li41NWQzZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jCkBAIC0xNTU1LDcgKzE1NTUsNyBAQAogCiAJLyogV2UgbmVlZCB0byBmb3JjZWZ1bGx5IHJlY2xhaW0gdGhlIHNsb3Qgc2luY2Ugc29tZSB0cmFuc2ZlcnMgbmV2ZXIKIAkgICByZXR1cm4sIGUuZy4gaW50ZXJydXB0IHRyYW5zZmVycyBhbmQgTkFLZWQgYnVsayB0cmFuc2ZlcnMuICovCi0JaWYgKHVzYl9waXBlYnVsayh1cmItPnBpcGUpKSB7CisJaWYgKHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpIHx8IHVzYl9waXBlYnVsayh1cmItPnBpcGUpKSB7CiAJCXNraXBfbWFwID0gcmVnX3JlYWQzMihoY2QtPnJlZ3MsIEhDX0FUTF9QVERfU0tJUE1BUF9SRUcpOwogCQlza2lwX21hcCB8PSAoMSA8PCBxaC0+c2xvdCk7CiAJCXJlZ193cml0ZTMyKGhjZC0+cmVncywgSENfQVRMX1BURF9TS0lQTUFQX1JFRywgc2tpcF9tYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCmluZGV4IDlhYTEwYmQuLmY5Y2YzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKQEAgLTEsNSArMSw3IEBACiAvKgotICogT0hDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0IuCisgKiBPcGVuIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgKE9IQ0kpIGRyaXZlciBmb3IgVVNCLgorICoKKyAqIE1haW50YWluZXI6IEFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CiAgKgogICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KICAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA0IERhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCmluZGV4IGFmZWY3YjAuLjgwYmU1NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKQEAgLTMxMiw4ICszMTIsMTAgQEAKIAkJcmV0dXJuIFBUUl9FUlIodXNiX2Nsayk7CiAKIAloY2QgPSB1c2JfY3JlYXRlX2hjZCAoZHJpdmVyLCAmcGRldi0+ZGV2LCAicHhhMjd4Iik7Ci0JaWYgKCFoY2QpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghaGNkKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMDsKKwl9CiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXIpIHsKQEAgLTM2OCw2ICszNzAsNyBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwogIGVycjE6CiAJdXNiX3B1dF9oY2QoaGNkKTsKKyBlcnIwOgogCWNsa19wdXQodXNiX2Nsayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCmluZGV4IGRiNmY4YjkuLjQ1ODYzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwpAQCAtMjUxNyw2ICsyNTE3LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmcjhhNjY1OTctPmNoaWxkX2RldmljZSk7CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZXMtPnN0YXJ0OworCWhjZC0+aGFzX3R0ID0gMTsKIAogCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCBJUlFGX0RJU0FCTEVEIHwgaXJxX3RyaWdnZXIpOwogCWlmIChyZXQgIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jCmluZGV4IDJlMDQ4NjEuLjFmNTBiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZGJnLmMKQEAgLTQzOCwxMyArNDM4LDEzIEBACiAJc3RydWN0IHhoY2lfc2xvdF9jdHggKnNsb3RfY3R4ID0geGhjaV9nZXRfc2xvdF9jdHgoeGhjaSwgY3R4KTsKIAogCXN3aXRjaCAoR0VUX1NMT1RfU1RBVEUobGUzMl90b19jcHUoc2xvdF9jdHgtPmRldl9zdGF0ZSkpKSB7Ci0JY2FzZSAwOgorCWNhc2UgU0xPVF9TVEFURV9FTkFCTEVEOgogCQlyZXR1cm4gImVuYWJsZWQvZGlzYWJsZWQiOwotCWNhc2UgMToKKwljYXNlIFNMT1RfU1RBVEVfREVGQVVMVDoKIAkJcmV0dXJuICJkZWZhdWx0IjsKLQljYXNlIDI6CisJY2FzZSBTTE9UX1NUQVRFX0FERFJFU1NFRDoKIAkJcmV0dXJuICJhZGRyZXNzZWQiOwotCWNhc2UgMzoKKwljYXNlIFNMT1RfU1RBVEVfQ09ORklHVVJFRDoKIAkJcmV0dXJuICJjb25maWd1cmVkIjsKIAlkZWZhdWx0OgogCQlyZXR1cm4gInJlc2VydmVkIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwppbmRleCAyNmNhYmE0Li5mY2I3ZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCkBAIC05ODUsOSArOTg1LDE5IEBACiAJaW50ZXJ2YWwgPSBjbGFtcF92YWwoZXAtPmRlc2MuYkludGVydmFsLCAxLCAxNikgLSAxOwogCWlmIChpbnRlcnZhbCAhPSBlcC0+ZGVzYy5iSW50ZXJ2YWwgLSAxKQogCQlkZXZfd2FybigmdWRldi0+ZGV2LAotCQkJICJlcCAlI3ggLSByb3VuZGluZyBpbnRlcnZhbCB0byAlZCBtaWNyb2ZyYW1lc1xuIiwKKwkJCSAiZXAgJSN4IC0gcm91bmRpbmcgaW50ZXJ2YWwgdG8gJWQgJXNmcmFtZXNcbiIsCiAJCQkgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKLQkJCSAxIDw8IGludGVydmFsKTsKKwkJCSAxIDw8IGludGVydmFsLAorCQkJIHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMID8gIiIgOiAibWljcm8iKTsKKworCWlmICh1ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCkgeworCQkvKgorCQkgKiBGdWxsIHNwZWVkIGlzb2MgZW5kcG9pbnRzIHNwZWNpZnkgaW50ZXJ2YWwgaW4gZnJhbWVzLAorCQkgKiBub3QgbWljcm9mcmFtZXMuIFdlIGFyZSB1c2luZyBtaWNyb2ZyYW1lcyBldmVyeXdoZXJlLAorCQkgKiBzbyBhZGp1c3QgYWNjb3JkaW5nbHkuCisJCSAqLworCQlpbnRlcnZhbCArPSAzOwkvKiAxIGZyYW1lID0gMl4zIHVmcmFtZXMgKi8KKwl9CiAKIAlyZXR1cm4gaW50ZXJ2YWw7CiB9CkBAIC0xMjA1LDggKzEyMTUsNiBAQAogCQllcF9jdHgtPmVwX2luZm8yIHw9IGNwdV90b19sZTMyKE1BWF9QQUNLRVQobWF4X3BhY2tldCkpOwogCQkvKiBkaWcgb3V0IG1heCBidXJzdCBmcm9tIGVwIGNvbXBhbmlvbiBkZXNjICovCiAJCW1heF9wYWNrZXQgPSBlcC0+c3NfZXBfY29tcC5iTWF4QnVyc3Q7Ci0JCWlmICghbWF4X3BhY2tldCkKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBubyBTUyBlbmRwb2ludCBiTWF4QnVyc3RcbiIpOwogCQllcF9jdHgtPmVwX2luZm8yIHw9IGNwdV90b19sZTMyKE1BWF9CVVJTVChtYXhfcGFja2V0KSk7CiAJCWJyZWFrOwogCWNhc2UgVVNCX1NQRUVEX0hJR0g6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKaW5kZXggYzQwOGU5Zi4uY2IxNmRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwpAQCAtMjksNiArMjksOSBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0ZSRVNDT19MT0dJQwkweDFiNzMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9GUkVTQ09fTE9HSUNfUERLCTB4MTAwMAogCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVRST04JCTB4MWI2ZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FTUk9DS19QNjcJMHg3MDIzCisKIHN0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1lW10gPSAieGhjaV9oY2QiOwogCiAvKiBjYWxsZWQgYWZ0ZXIgcG93ZXJ1cCwgYnkgcHJvYmUgb3Igc3lzdGVtLXBtICJ3YWtldXAiICovCkBAIC0xMDYsMTIgKzEwOSwyMiBAQAogCiAJLyogTG9vayBmb3IgdmVuZG9yLXNwZWNpZmljIHF1aXJrcyAqLwogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9GUkVTQ09fTE9HSUMgJiYKLQkJCXBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0ZSRVNDT19MT0dJQ19QREsgJiYKLQkJCXBkZXYtPnJldmlzaW9uID09IDB4MCkgeworCQkJcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRlJFU0NPX0xPR0lDX1BESykgeworCQlpZiAocGRldi0+cmV2aXNpb24gPT0gMHgwKSB7CiAJCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9SRVNFVF9FUF9RVUlSSzsKIAkJCXhoY2lfZGJnKHhoY2ksICJRVUlSSzogRnJlc2NvIExvZ2ljIHhIQyBuZWVkcyBjb25maWd1cmUiCiAJCQkJCSIgZW5kcG9pbnQgY21kIGFmdGVyIHJlc2V0IGVuZHBvaW50XG4iKTsKKwkJfQorCQkvKiBGcmVzY28gTG9naWMgY29uZmlybXM6IGFsbCByZXZpc2lvbnMgb2YgdGhpcyBjaGlwIGRvIG5vdAorCQkgKiBzdXBwb3J0IE1TSSwgZXZlbiB0aG91Z2ggc29tZSBvZiB0aGVtIGNsYWltIHRvIGluIHRoZWlyIFBDSQorCQkgKiBjYXBhYmlsaXRpZXMuCisJCSAqLworCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9CUk9LRU5fTVNJOworCQl4aGNpX2RiZyh4aGNpLCAiUVVJUks6IEZyZXNjbyBMb2dpYyByZXZpc2lvbiAldSAiCisJCQkJImhhcyBicm9rZW4gTVNJIGltcGxlbWVudGF0aW9uXG4iLAorCQkJCXBkZXYtPnJldmlzaW9uKTsKIAl9CisKIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTkVDKQogCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9ORUNfSE9TVDsKIApAQCAtMTI0LDYgKzEzNywxMSBAQAogCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9FUF9MSU1JVF9RVUlSSzsKIAkJeGhjaS0+bGltaXRfYWN0aXZlX2VwcyA9IDY0OwogCX0KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRVRST04gJiYKKwkJCXBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FTUk9DS19QNjcpIHsKKwkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfUkVTRVRfT05fUkVTVU1FOworCQl4aGNpX2RiZyh4aGNpLCAiUVVJUks6IFJlc2V0dGluZyBvbiByZXN1bWVcbiIpOworCX0KIAogCS8qIE1ha2Ugc3VyZSB0aGUgSEMgaXMgaGFsdGVkLiAqLwogCXJldHZhbCA9IHhoY2lfaGFsdCh4aGNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IGNjMTQ4NWIuLjcwY2FjYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtMTczMyw2ICsxNzMzLDcgQEAKIAkJZnJhbWUtPnN0YXR1cyA9IC1FT1ZFUkZMT1c7CiAJCXNraXBfdGQgPSB0cnVlOwogCQlicmVhazsKKwljYXNlIENPTVBfREVWX0VSUjoKIAljYXNlIENPTVBfU1RBTEw6CiAJCWZyYW1lLT5zdGF0dXMgPSAtRVBST1RPOwogCQlza2lwX3RkID0gdHJ1ZTsKQEAgLTE3NjcsOSArMTc2OCw2IEBACiAJCX0KIAl9CiAKLQlpZiAoKGlkeCA9PSB1cmJfcHJpdi0+bGVuZ3RoIC0gMSkgJiYgKnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCi0JCSpzdGF0dXMgPSAwOwotCiAJcmV0dXJuIGZpbmlzaF90ZCh4aGNpLCB0ZCwgZXZlbnRfdHJiLCBldmVudCwgZXAsIHN0YXR1cywgZmFsc2UpOwogfQogCkBAIC0xNzgyLDEzICsxNzgwLDEyIEBACiAJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZyYW1lOwogCWludCBpZHg7CiAKLQllcF9yaW5nID0geGhjaV9kbWFfdG9fdHJhbnNmZXJfcmluZyhlcCwgZXZlbnQtPmJ1ZmZlcik7CisJZXBfcmluZyA9IHhoY2lfZG1hX3RvX3RyYW5zZmVyX3JpbmcoZXAsIGxlNjRfdG9fY3B1KGV2ZW50LT5idWZmZXIpKTsKIAl1cmJfcHJpdiA9IHRkLT51cmItPmhjcHJpdjsKIAlpZHggPSB1cmJfcHJpdi0+dGRfY250OwogCWZyYW1lID0gJnRkLT51cmItPmlzb19mcmFtZV9kZXNjW2lkeF07CiAKLQkvKiBUaGUgdHJhbnNmZXIgaXMgcGFydGx5IGRvbmUgKi8KLQkqc3RhdHVzID0gLUVYREVWOworCS8qIFRoZSB0cmFuc2ZlciBpcyBwYXJ0bHkgZG9uZS4gKi8KIAlmcmFtZS0+c3RhdHVzID0gLUVYREVWOwogCiAJLyogY2FsYyBhY3R1YWwgbGVuZ3RoICovCkBAIC0yMDE2LDYgKzIwMTMsMTAgQEAKIAkJCQkgVFJCX1RPX1NMT1RfSUQobGUzMl90b19jcHUoZXZlbnQtPmZsYWdzKSksCiAJCQkJIGVwX2luZGV4KTsKIAkJZ290byBjbGVhbnVwOworCWNhc2UgQ09NUF9ERVZfRVJSOgorCQl4aGNpX3dhcm4oeGhjaSwgIldBUk46IGRldGVjdCBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIik7CisJCXN0YXR1cyA9IC1FUFJPVE87CisJCWJyZWFrOwogCWNhc2UgQ09NUF9NSVNTRURfSU5UOgogCQkvKgogCQkgKiBXaGVuIGVuY291bnRlciBtaXNzZWQgc2VydmljZSBlcnJvciwgb25lIG9yIG1vcmUgaXNvYyB0ZHMKQEAgLTIwNjMsNiArMjA2NCwyMCBAQAogCQkvKiBJcyB0aGlzIGEgVFJCIGluIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIFREPyAqLwogCQlldmVudF9zZWcgPSB0cmJfaW5fdGQoZXBfcmluZy0+ZGVxX3NlZywgZXBfcmluZy0+ZGVxdWV1ZSwKIAkJCQl0ZC0+bGFzdF90cmIsIGV2ZW50X2RtYSk7CisKKwkJLyoKKwkJICogU2tpcCB0aGUgRm9yY2UgU3RvcHBlZCBFdmVudC4gVGhlIGV2ZW50X3RyYihldmVudF9kbWEpIG9mIEZTRQorCQkgKiBpcyBub3QgaW4gdGhlIGN1cnJlbnQgVEQgcG9pbnRlZCBieSBlcF9yaW5nLT5kZXF1ZXVlIGJlY2F1c2UKKwkJICogdGhhdCB0aGUgaGFyZHdhcmUgZGVxdWV1ZSBwb2ludGVyIHN0aWxsIGF0IHRoZSBwcmV2aW91cyBUUkIKKwkJICogb2YgdGhlIGN1cnJlbnQgVEQuIFRoZSBwcmV2aW91cyBUUkIgbWF5YmUgYSBMaW5rIFREIG9yIHRoZQorCQkgKiBsYXN0IFRSQiBvZiB0aGUgcHJldmlvdXMgVEQuIFRoZSBjb21tYW5kIGNvbXBsZXRpb24gaGFuZGxlCisJCSAqIHdpbGwgdGFrZSBjYXJlIHRoZSByZXN0LgorCQkgKi8KKwkJaWYgKCFldmVudF9zZWcgJiYgdHJiX2NvbXBfY29kZSA9PSBDT01QX1NUT1BfSU5WQUwpIHsKKwkJCXJldCA9IDA7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwogCQlpZiAoIWV2ZW50X3NlZykgewogCQkJaWYgKCFlcC0+c2tpcCB8fAogCQkJICAgICF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZ0ZC0+dXJiLT5lcC0+ZGVzYykpIHsKQEAgLTIxNTgsNiArMjE3MywxMSBAQAogCQkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJCQkJc3RhdHVzKTsKIAkJCXNwaW5fdW5sb2NrKCZ4aGNpLT5sb2NrKTsKKwkJCS8qIEVIQ0ksIFVIQ0ksIGFuZCBPSENJIGFsd2F5cyB1bmNvbmRpdGlvbmFsbHkgc2V0IHRoZQorCQkJICogdXJiLT5zdGF0dXMgb2YgYW4gaXNvY2hyb25vdXMgZW5kcG9pbnQgdG8gMC4KKwkJCSAqLworCQkJaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpCisJCQkJc3RhdHVzID0gMDsKIAkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGJ1c190b19oY2QodXJiLT5kZXYtPmJ1cyksIHVyYiwgc3RhdHVzKTsKIAkJCXNwaW5fbG9jaygmeGhjaS0+bG9jayk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKaW5kZXggZDk2NjBlYi4uZjVmZTFhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKQEAgLTQzMCwxMiArNDMwLDE5IEBACiAJCWZyZWVfaXJxKGhjZC0+aXJxLCBoY2QpOwogCWhjZC0+aXJxID0gLTE7CiAKKwkvKiBTb21lIEZyZXNjbyBMb2dpYyBob3N0IGNvbnRyb2xsZXJzIGFkdmVydGlzZSBNU0ksIGJ1dCBmYWlsIHRvCisJICogZ2VuZXJhdGUgaW50ZXJydXB0cy4gIERvbid0IGV2ZW4gdHJ5IHRvIGVuYWJsZSBNU0kuCisJICovCisJaWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfQlJPS0VOX01TSSkKKwkJZ290byBsZWdhY3lfaXJxOworCiAJcmV0ID0geGhjaV9zZXR1cF9tc2l4KHhoY2kpOwogCWlmIChyZXQpCiAJCS8qIGZhbGwgYmFjayB0byBtc2kqLwogCQlyZXQgPSB4aGNpX3NldHVwX21zaSh4aGNpKTsKIAogCWlmIChyZXQpIHsKK2xlZ2FjeV9pcnE6CiAJCS8qIGZhbGwgYmFjayB0byBsZWdhY3kgaW50ZXJydXB0Ki8KIAkJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAmdXNiX2hjZF9pcnEsIElSUUZfU0hBUkVELAogCQkJCQloY2QtPmlycV9kZXNjciwgaGNkKTsKQEAgLTc1Miw2ICs3NTksOCBAQAogCQltc2xlZXAoMTAwKTsKIAogCXNwaW5fbG9ja19pcnEoJnhoY2ktPmxvY2spOworCWlmICh4aGNpLT5xdWlya3MgJiBYSENJX1JFU0VUX09OX1JFU1VNRSkKKwkJaGliZXJuYXRlZCA9IHRydWU7CiAKIAlpZiAoIWhpYmVybmF0ZWQpIHsKIAkJLyogc3RlcCAxOiByZXN0b3JlIHJlZ2lzdGVyICovCkBAIC0xMzk0LDYgKzE0MDMsNyBAQAogCXUzMiBhZGRlZF9jdHhzOwogCXVuc2lnbmVkIGludCBsYXN0X2N0eDsKIAl1MzIgbmV3X2FkZF9mbGFncywgbmV3X2Ryb3BfZmxhZ3MsIG5ld19zbG90X2luZm87CisJc3RydWN0IHhoY2lfdmlydF9kZXZpY2UgKnZpcnRfZGV2OwogCWludCByZXQgPSAwOwogCiAJcmV0ID0geGhjaV9jaGVja19hcmdzKGhjZCwgdWRldiwgZXAsIDEsIHRydWUsIF9fZnVuY19fKTsKQEAgLTE0MTgsMTEgKzE0MjgsMjUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaW5fY3R4ID0geGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXS0+aW5fY3R4OwotCW91dF9jdHggPSB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdLT5vdXRfY3R4OworCXZpcnRfZGV2ID0geGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXTsKKwlpbl9jdHggPSB2aXJ0X2Rldi0+aW5fY3R4OworCW91dF9jdHggPSB2aXJ0X2Rldi0+b3V0X2N0eDsKIAljdHJsX2N0eCA9IHhoY2lfZ2V0X2lucHV0X2NvbnRyb2xfY3R4KHhoY2ksIGluX2N0eCk7CiAJZXBfaW5kZXggPSB4aGNpX2dldF9lbmRwb2ludF9pbmRleCgmZXAtPmRlc2MpOwogCWVwX2N0eCA9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCBvdXRfY3R4LCBlcF9pbmRleCk7CisKKwkvKiBJZiB0aGlzIGVuZHBvaW50IGlzIGFscmVhZHkgaW4gdXNlLCBhbmQgdGhlIHVwcGVyIGxheWVycyBhcmUgdHJ5aW5nCisJICogdG8gYWRkIGl0IGFnYWluIHdpdGhvdXQgZHJvcHBpbmcgaXQsIHJlamVjdCB0aGUgYWRkaXRpb24uCisJICovCisJaWYgKHZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLnJpbmcgJiYKKwkJCSEobGUzMl90b19jcHUoY3RybF9jdHgtPmRyb3BfZmxhZ3MpICYKKwkJCQl4aGNpX2dldF9lbmRwb2ludF9mbGFnKCZlcC0+ZGVzYykpKSB7CisJCXhoY2lfd2Fybih4aGNpLCAiVHJ5aW5nIHRvIGFkZCBlbmRwb2ludCAweCV4ICIKKwkJCQkid2l0aG91dCBkcm9wcGluZyBpdC5cbiIsCisJCQkJKHVuc2lnbmVkIGludCkgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIElmIHRoZSBIQ0QgaGFzIGFscmVhZHkgbm90ZWQgdGhlIGVuZHBvaW50IGlzIGVuYWJsZWQsCiAJICogaWdub3JlIHRoaXMgcmVxdWVzdC4KIAkgKi8KQEAgLTE0MzgsOCArMTQ2Miw3IEBACiAJICogcHJvY2VzcyBjb250ZXh0LCBub3QgaW50ZXJydXB0IGNvbnRleHQgKG9yIHNvIGRvY3VtZW5hdGlvbgogCSAqIGZvciB1c2Jfc2V0X2ludGVyZmFjZSgpIGFuZCB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oKSBjbGFpbSkuCiAJICovCi0JaWYgKHhoY2lfZW5kcG9pbnRfaW5pdCh4aGNpLCB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdLAotCQkJCXVkZXYsIGVwLCBHRlBfTk9JTykgPCAwKSB7CisJaWYgKHhoY2lfZW5kcG9pbnRfaW5pdCh4aGNpLCB2aXJ0X2RldiwgdWRldiwgZXAsIEdGUF9OT0lPKSA8IDApIHsKIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAiJXMgLSBjb3VsZCBub3QgaW5pdGlhbGl6ZSBlcCAlI3hcbiIsCiAJCQkJX19mdW5jX18sIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE1MzAsNiArMTU1MywxMSBAQAogCQkJCSJhbmQgZW5kcG9pbnQgaXMgbm90IGRpc2FibGVkLlxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOworCWNhc2UgQ09NUF9ERVZfRVJSOgorCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiRVJST1I6IEluY29tcGF0aWJsZSBkZXZpY2UgZm9yIGVuZHBvaW50ICIKKwkJCQkiY29uZmlndXJlIGNvbW1hbmQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJYnJlYWs7CiAJY2FzZSBDT01QX1NVQ0NFU1M6CiAJCWRldl9kYmcoJnVkZXYtPmRldiwgIlN1Y2Nlc3NmdWwgRW5kcG9pbnQgQ29uZmlndXJlIGNvbW1hbmRcbiIpOwogCQlyZXQgPSAwOwpAQCAtMTU2NCw2ICsxNTkyLDExIEBACiAJCXhoY2lfZGJnX2N0eCh4aGNpLCB2aXJ0X2Rldi0+b3V0X2N0eCwgMSk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOworCWNhc2UgQ09NUF9ERVZfRVJSOgorCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiRVJST1I6IEluY29tcGF0aWJsZSBkZXZpY2UgZm9yIGV2YWx1YXRlICIKKwkJCQkiY29udGV4dCBjb21tYW5kLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWJyZWFrOwogCWNhc2UgQ09NUF9NRUxfRVJSOgogCQkvKiBNYXggRXhpdCBMYXRlbmN5IHRvbyBsYXJnZSBlcnJvciAqLwogCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiV0FSTjogTWF4IEV4aXQgTGF0ZW5jeSB0b28gbGFyZ2VcbiIpOwpAQCAtMTg0OSw4ICsxODgyLDggQEAKIAogCS8qIEZyZWUgYW55IHJpbmdzIHRoYXQgd2VyZSBkcm9wcGVkLCBidXQgbm90IGNoYW5nZWQuICovCiAJZm9yIChpID0gMTsgaSA8IDMxOyArK2kpIHsKLQkJaWYgKChjdHJsX2N0eC0+ZHJvcF9mbGFncyAmICgxIDw8IChpICsgMSkpKSAmJgotCQkJCSEoY3RybF9jdHgtPmFkZF9mbGFncyAmICgxIDw8IChpICsgMSkpKSkKKwkJaWYgKChsZTMyX3RvX2NwdShjdHJsX2N0eC0+ZHJvcF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkgJiYKKwkJICAgICEobGUzMl90b19jcHUoY3RybF9jdHgtPmFkZF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkpCiAJCQl4aGNpX2ZyZWVfb3JfY2FjaGVfZW5kcG9pbnRfcmluZyh4aGNpLCB2aXJ0X2RldiwgaSk7CiAJfQogCXhoY2lfemVyb19pbl9jdHgoeGhjaSwgdmlydF9kZXYpOwpAQCAtMjQ2Nyw2ICsyNTAwLDcgQEAKIAlzdHJ1Y3QgeGhjaV9jb21tYW5kICpyZXNldF9kZXZpY2VfY21kOwogCWludCB0aW1lbGVmdDsKIAlpbnQgbGFzdF9mcmVlZF9lbmRwb2ludDsKKwlzdHJ1Y3QgeGhjaV9zbG90X2N0eCAqc2xvdF9jdHg7CiAKIAlyZXQgPSB4aGNpX2NoZWNrX2FyZ3MoaGNkLCB1ZGV2LCBOVUxMLCAwLCBmYWxzZSwgX19mdW5jX18pOwogCWlmIChyZXQgPD0gMCkKQEAgLTI0OTksNiArMjUzMywxMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogSWYgZGV2aWNlIGlzIG5vdCBzZXR1cCwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmVzZXR0aW5nIGl0ICovCisJc2xvdF9jdHggPSB4aGNpX2dldF9zbG90X2N0eCh4aGNpLCB2aXJ0X2Rldi0+b3V0X2N0eCk7CisJaWYgKEdFVF9TTE9UX1NUQVRFKGxlMzJfdG9fY3B1KHNsb3RfY3R4LT5kZXZfc3RhdGUpKSA9PQorCQkJCQkJU0xPVF9TVEFURV9ESVNBQkxFRCkKKwkJcmV0dXJuIDA7CisKIAl4aGNpX2RiZyh4aGNpLCAiUmVzZXR0aW5nIGRldmljZSB3aXRoIHNsb3QgSUQgJXVcbiIsIHNsb3RfaWQpOwogCS8qIEFsbG9jYXRlIHRoZSBjb21tYW5kIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBzdHJ1Y3QgY29tcGxldGlvbi4KIAkgKiBBc3N1bWUgd2UncmUgaW4gcHJvY2VzcyBjb250ZXh0LCBzaW5jZSB0aGUgbm9ybWFsIGRldmljZSByZXNldApAQCAtMjgzOSw2ICsyODc5LDExIEBACiAJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJEZXZpY2Ugbm90IHJlc3BvbmRpbmcgdG8gc2V0IGFkZHJlc3MuXG4iKTsKIAkJcmV0ID0gLUVQUk9UTzsKIAkJYnJlYWs7CisJY2FzZSBDT01QX0RFVl9FUlI6CisJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJFUlJPUjogSW5jb21wYXRpYmxlIGRldmljZSBmb3IgYWRkcmVzcyAiCisJCQkJImRldmljZSBjb21tYW5kLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWJyZWFrOwogCWNhc2UgQ09NUF9TVUNDRVNTOgogCQl4aGNpX2RiZyh4aGNpLCAiU3VjY2Vzc2Z1bCBBZGRyZXNzIERldmljZSBjb21tYW5kXG4iKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCmluZGV4IGFjMDE5NmUuLmQ4YmJmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCkBAIC01NjAsNiArNTYwLDExIEBACiAjZGVmaW5lIFNMT1RfU1RBVEUJKDB4MWYgPDwgMjcpCiAjZGVmaW5lIEdFVF9TTE9UX1NUQVRFKHApCSgoKHApICYgKDB4MWYgPDwgMjcpKSA+PiAyNykKIAorI2RlZmluZSBTTE9UX1NUQVRFX0RJU0FCTEVECTAKKyNkZWZpbmUgU0xPVF9TVEFURV9FTkFCTEVECVNMT1RfU1RBVEVfRElTQUJMRUQKKyNkZWZpbmUgU0xPVF9TVEFURV9ERUZBVUxUCTEKKyNkZWZpbmUgU0xPVF9TVEFURV9BRERSRVNTRUQJMgorI2RlZmluZSBTTE9UX1NUQVRFX0NPTkZJR1VSRUQJMwogCiAvKioKICAqIHN0cnVjdCB4aGNpX2VwX2N0eApAQCAtODY5LDYgKzg3NCw4IEBACiAjZGVmaW5lIENPTVBfUElOR19FUlIJMjAKIC8qIEV2ZW50IFJpbmcgaXMgZnVsbCAqLwogI2RlZmluZSBDT01QX0VSX0ZVTEwJMjEKKy8qIEluY29tcGF0aWJsZSBEZXZpY2UgRXJyb3IgKi8KKyNkZWZpbmUgQ09NUF9ERVZfRVJSCTIyCiAvKiBNaXNzZWQgU2VydmljZSBFcnJvciAtIEhDIGNvdWxkbid0IHNlcnZpY2UgYW4gaXNvYyBlcCB3aXRoaW4gaW50ZXJ2YWwgKi8KICNkZWZpbmUgQ09NUF9NSVNTRURfSU5UCTIzCiAvKiBTdWNjZXNzZnVsbHkgc3RvcHBlZCBjb21tYW5kIHJpbmcgKi8KQEAgLTEzMDIsNiArMTMwOSw4IEBACiAgKiBjb21tYW5kcy4KICAqLwogI2RlZmluZSBYSENJX0VQX0xJTUlUX1FVSVJLCSgxIDw8IDUpCisjZGVmaW5lIFhIQ0lfQlJPS0VOX01TSQkJKDEgPDwgNikKKyNkZWZpbmUgWEhDSV9SRVNFVF9PTl9SRVNVTUUJKDEgPDwgNykKIAl1bnNpZ25lZCBpbnQJCW51bV9hY3RpdmVfZXBzOwogCXVuc2lnbmVkIGludAkJbGltaXRfYWN0aXZlX2VwczsKIAkvKiBUaGVyZSBhcmUgdHdvIHJvb3RodWJzIHRvIGtlZXAgdHJhY2sgb2YgYnVzIHN1c3BlbmQgaW5mbyBmb3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCmluZGV4IGFiOGUxMDAuLmM3MWIwMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwpAQCAtOTYsNiArOTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCmluZGV4IDBhNTBhMzUuLjZhZWIzNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKQEAgLTE1MjQsNiArMTUyNCwxMiBAQAogCQljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpOwogCQlpZiAoY3NyICYgTVVTQl9UWENTUl9GSUZPTk9URU1QVFkpIHsKIAkJCWNzciB8PSBNVVNCX1RYQ1NSX0ZMVVNIRklGTyB8IE1VU0JfVFhDU1JfUF9XWkNfQklUUzsKKwkJCS8qCisJCQkgKiBTZXR0aW5nIGJvdGggVFhQS1RSRFkgYW5kIEZMVVNIRklGTyBtYWtlcyBjb250cm9sbGVyCisJCQkgKiB0byBpbnRlcnJ1cHQgY3VycmVudCBGSUZPIGxvYWRpbmcsIGJ1dCBub3QgZmx1c2hpbmcKKwkJCSAqIHRoZSBhbHJlYWR5IGxvYWRlZCBvbmVzLgorCQkJICovCisJCQljc3IgJj0gfk1VU0JfVFhDU1JfVFhQS1RSRFk7CiAJCQltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ1NSLCBjc3IpOwogCQkJLyogUkVWSVNJVCBtYXkgYmUgaW5hcHByb3ByaWF0ZSB3L28gRklGT05PVEVNUFRZIC4uLiAqLwogCQkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IDcyOTVlMzEuLjhiMjQ3M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtMTU3NSw3ICsxNTc1LDcgQEAKIAkJCS8qIGV2ZW4gaWYgdGhlcmUgd2FzIGFuIGVycm9yLCB3ZSBkaWQgdGhlIGRtYQogCQkJICogZm9yIGlzb19mcmFtZV9kZXNjLT5sZW5ndGgKIAkJCSAqLwotCQkJaWYgKGQtPnN0YXR1cyAhPSBFSUxTRVEgJiYgZC0+c3RhdHVzICE9IC1FT1ZFUkZMT1cpCisJCQlpZiAoZC0+c3RhdHVzICE9IC1FSUxTRVEgJiYgZC0+c3RhdHVzICE9IC1FT1ZFUkZMT1cpCiAJCQkJZC0+c3RhdHVzID0gMDsKIAogCQkJaWYgKCsrcWgtPmlzb19pZHggPj0gdXJiLT5udW1iZXJfb2ZfcGFja2V0cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMKaW5kZXggMjA2Y2ZhYi4uNTQ3NDg2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMKQEAgLTEzODAsNSArMTM4MCw2IEBACiB7CiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfcHJpdl90b19ncHJpdihwcml2KTsKIAorCWtmcmVlKGdwcml2LT51ZXApOwogCWtmcmVlKGdwcml2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZThkYmRlNS4uMmUwNmI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTE3OSw2ICsxNzksNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV8yMzJSTF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjIzMkNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80MjMySF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzIzMkhfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NSUNST19DSEFNRUxFT05fUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9PUEVORENDX1BJRCkgfSwKQEAgLTY0Nyw2ICs2NDgsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUykgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8zX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8wX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8yX1BJRCkgfSwKQEAgLTg0Nyw3ICs4NDksOCBAQAogCVtGVDIyMzJDXSA9ICJGVDIyMzJDIiwKIAlbRlQyMzJSTF0gPSAiRlQyMzJSTCIsCiAJW0ZUMjIzMkhdID0gIkZUMjIzMkgiLAotCVtGVDQyMzJIXSA9ICJGVDQyMzJIIgorCVtGVDQyMzJIXSA9ICJGVDQyMzJIIiwKKwlbRlQyMzJIXSAgPSAiRlQyMzJIIgogfTsKIAogCkBAIC0xMTY3LDYgKzExNzAsNyBAQAogCQlicmVhazsKIAljYXNlIEZUMjIzMkg6IC8qIEZUMjIzMkggY2hpcCAqLwogCWNhc2UgRlQ0MjMySDogLyogRlQ0MjMySCBjaGlwICovCisJY2FzZSBGVDIzMkg6ICAvKiBGVDIzMkggY2hpcCAqLwogCQlpZiAoKGJhdWQgPD0gMTIwMDAwMDApICYgKGJhdWQgPj0gMTIwMCkpIHsKIAkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjIzMmhfYmF1ZF90b19kaXZpc29yKGJhdWQpOwogCQl9IGVsc2UgaWYgKGJhdWQgPCAxMjAwKSB7CkBAIC0xNDI4LDkgKzE0MzIsMTIgQEAKIAl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDYwMCkgewogCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMkJNIChvciBGVDI0NUJNKSAqLwogCQlwcml2LT5jaGlwX3R5cGUgPSBGVDIzMkJNOwotCX0gZWxzZSB7Ci0JCS8qIEFzc3VtZSBpdCdzIGFuIEZUMjMyUiAqLworCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4OTAwKSB7CisJCS8qIEFzc3VtZSBpdCdzIGFuIEZUMjMyUkwgKi8KIAkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJSTDsKKwl9IGVsc2UgeworCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMkggKi8KKwkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJIOwogCX0KIAlkZXZfaW5mbygmdWRldi0+ZGV2LCAiRGV0ZWN0ZWQgJXNcbiIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwogfQpAQCAtMTU1OCw3ICsxNTY1LDggQEAKIAkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQyB8fAogCQkgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMlJMIHx8CiAJCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkggfHwKLQkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQ0MjMySCkpIHsKKwkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQ0MjMySCB8fAorCQkgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkgpKSB7CiAJCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBvcnQtPmRldiwKIAkJCQkJCSAgICAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CiAJCX0KQEAgLTE1NzksNyArMTU4Nyw4IEBACiAJCSAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQyB8fAogCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjMyUkwgfHwKIAkJICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJIIHx8Ci0JCSAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQ0MjMySCkgeworCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkggfHwKKyAgICAgICAgICAgICAgICAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjMySCkgewogCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwb3J0LT5kZXYsICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKIAkJfQogCX0KQEAgLTIyMTEsNiArMjIyMCw3IEBACiAJY2FzZSBGVDIzMlJMOgogCWNhc2UgRlQyMjMySDoKIAljYXNlIEZUNDIzMkg6CisJY2FzZSBGVDIzMkg6CiAJCWxlbiA9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCmluZGV4IDIxM2ZlM2QuLjE5NTg0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCkBAIC0xNTYsNyArMTU2LDggQEAKIAlGVDIyMzJDID0gNCwKIAlGVDIzMlJMID0gNSwKIAlGVDIyMzJIID0gNiwKLQlGVDQyMzJIID0gNworCUZUNDIzMkggPSA3LAorCUZUMjMySCAgPSA4CiB9OwogCiBlbnVtIGZ0ZGlfc2lvX2JhdWRyYXRlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaAppbmRleCAxZDk0NmNkLi4xOTE1NmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAjZGVmaW5lIEZURElfOFUyMzJBTV9BTFRfUElEIDB4NjAwNiAvKiBGVERJJ3MgYWx0ZXJuYXRlIFBJRCBmb3IgYWJvdmUgKi8KICNkZWZpbmUgRlRESV84VTIyMzJDX1BJRCAweDYwMTAgLyogRHVhbCBjaGFubmVsIGRldmljZSAqLwogI2RlZmluZSBGVERJXzQyMzJIX1BJRCAweDYwMTEgLyogUXVhZCBjaGFubmVsIGhpLXNwZWVkIGRldmljZSAqLworI2RlZmluZSBGVERJXzIzMkhfUElEICAweDYwMTQgLyogU2luZ2xlIGNoYW5uZWwgaGktc3BlZWQgZGV2aWNlICovCiAjZGVmaW5lIEZURElfU0lPX1BJRAkweDgzNzIJLyogUHJvZHVjdCBJZCBTSU8gYXBwbGljYXRpb24gb2YgOFUxMDBBWCAqLwogI2RlZmluZSBGVERJXzIzMlJMX1BJRCAgMHhGQkZBICAvKiBQcm9kdWN0IElEIGZvciBGVDIzMlJMICovCiAKQEAgLTM1MSw2ICszNTIsNyBAQAogICovCiAjZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzFfUElECTB4RjNDMAogI2RlZmluZSBGVERJXzROX0dBTEFYWV9ERV8yX1BJRAkweEYzQzEKKyNkZWZpbmUgRlRESV80Tl9HQUxBWFlfREVfM19QSUQJMHhGM0MyCiAKIC8qCiAgKiBMaW54IFRlY2hub2xvZ2llcyBwcm9kdWN0IGlkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IDMxOGRkMDAuLjYwYjI1ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKQEAgLTMxMSwxMCArMzExLDYgQEAKICNkZWZpbmUgWlRFX1BST0RVQ1RfQUMyNzI2CQkJMHhmZmY1CiAjZGVmaW5lIFpURV9QUk9EVUNUX0FDODcxMFQJCQkweGZmZmYKIAotLyogWlRFIFBST0RVQ1RTIC0tIGFsdGVybmF0ZSB2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgWlRFX1ZFTkRPUl9JRDIJCQkJMHgxZDZiCi0jZGVmaW5lIFpURV9QUk9EVUNUX01GXzMzMAkJCTB4MDAwMgotCiAjZGVmaW5lIEJFTlFfVkVORE9SX0lECQkJCTB4MDRhNQogI2RlZmluZSBCRU5RX1BST0RVQ1RfSDEwCQkJMHg0MDY4CiAKQEAgLTM0MCwxMSArMzM2LDEyIEBACiAjZGVmaW5lIFRPU0hJQkFfUFJPRFVDVF9HNDUwCQkJMHgwZDQ1CiAKICNkZWZpbmUgQUxJTktfVkVORE9SX0lECQkJCTB4MWUwZQorI2RlZmluZSBBTElOS19QUk9EVUNUX1BIMzAwCQkJMHg5MTAwCiAjZGVmaW5lIEFMSU5LX1BST0RVQ1RfM0dVCQkJMHg5MjAwCiAKIC8qIEFMQ0FURUwgUFJPRFVDVFMgKi8KICNkZWZpbmUgQUxDQVRFTF9WRU5ET1JfSUQJCQkweDFiYmIKLSNkZWZpbmUgQUxDQVRFTF9QUk9EVUNUX1gwNjBTCQkJMHgwMDAwCisjZGVmaW5lIEFMQ0FURUxfUFJPRFVDVF9YMDYwU19YMjAwCQkweDAwMDAKIAogI2RlZmluZSBQSVJFTExJX1ZFTkRPUl9JRAkJCTB4MTI2NgogI2RlZmluZSBQSVJFTExJX1BST0RVQ1RfQzEwMF8xCQkJMHgxMDAyCkBAIC0zNzksNiArMzc2LDkgQEAKICAqIEl0IHNlZW1zIHRvIGNvbnRhaW4gYSBRdWFsY29tbSBRU0M2MjQwLzYyOTAgY2hpcHNldCAgICAgICAgICAgICovCiAjZGVmaW5lIEZPVVJfR19TWVNURU1TX1BST0RVQ1RfVzE0CQkweDk2MDMKIAorLyogWm9vbSAqLworI2RlZmluZSBaT09NX1BST0RVQ1RfNDU5NwkJCTB4OTYwNworCiAvKiBIYWllciBwcm9kdWN0cyAqLwogI2RlZmluZSBIQUlFUl9WRU5ET1JfSUQJCQkJMHgyMDFlCiAjZGVmaW5lIEhBSUVSX1BST0RVQ1RfQ0UxMDAJCQkweDIwMDkKQEAgLTQzMiw2ICs0MzIsMjAgQEAKIAkucmVhc29uID0gT1BUSU9OX0JMQUNLTElTVF9TRU5EU0VUVVAKIH07CiAKK3N0YXRpYyBjb25zdCB1OCBhbGNhdGVsX3gyMDBfbm9fc2VuZHNldHVwW10gPSB7IDAsIDEgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uX2JsYWNrbGlzdF9pbmZvIGFsY2F0ZWxfeDIwMF9ibGFja2xpc3QgPSB7CisJLmluZm9sZW4gPSBBUlJBWV9TSVpFKGFsY2F0ZWxfeDIwMF9ub19zZW5kc2V0dXApLAorCS5pZmFjZWluZm8gPSBhbGNhdGVsX3gyMDBfbm9fc2VuZHNldHVwLAorCS5yZWFzb24gPSBPUFRJT05fQkxBQ0tMSVNUX1NFTkRTRVRVUAorfTsKKworc3RhdGljIGNvbnN0IHU4IHp0ZV9rMzc2NV96X25vX3NlbmRzZXR1cFtdID0geyAwLCAxLCAyIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbl9ibGFja2xpc3RfaW5mbyB6dGVfazM3NjVfel9ibGFja2xpc3QgPSB7CisJLmluZm9sZW4gPSBBUlJBWV9TSVpFKHp0ZV9rMzc2NV96X25vX3NlbmRzZXR1cCksCisJLmlmYWNlaW5mbyA9IHp0ZV9rMzc2NV96X25vX3NlbmRzZXR1cCwKKwkucmVhc29uID0gT1BUSU9OX0JMQUNLTElTVF9TRU5EU0VUVVAKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBvcHRpb25faWRzW10gPSB7CiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX0NPTFQpIH0sCiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX1JJQ09MQSkgfSwKQEAgLTkxNiwxMyArOTMwLDEzIEBACiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwNzMsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAxMzAsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAxNDEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDIsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDIsIDB4ZmYsCisJICAweGZmLCAweGZmKSwgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ6dGVfazM3NjVfel9ibGFja2xpc3QgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MjAwMywgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0NETUFfVEVDSCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDMjcyNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMFQsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFKFpURV9WRU5ET1JfSUQyLCBaVEVfUFJPRFVDVF9NRl8zMzApIH0sCiAJeyBVU0JfREVWSUNFKEJFTlFfVkVORE9SX0lELCBCRU5RX1BST0RVQ1RfSDEwKSB9LAogCXsgVVNCX0RFVklDRShETElOS19WRU5ET1JfSUQsIERMSU5LX1BST0RVQ1RfRFdNXzY1MikgfSwKIAl7IFVTQl9ERVZJQ0UoQUxJTktfVkVORE9SX0lELCBETElOS19QUk9EVUNUX0RXTV82NTJfVTUpIH0sIC8qIFllcywgQUxJTktfVkVORE9SX0lEICovCkBAIC05MzUsMTMgKzk0OSwxNyBAQAogCXsgVVNCX0RFVklDRShUT1NISUJBX1ZFTkRPUl9JRCwgVE9TSElCQV9QUk9EVUNUX0c0NTApIH0sCiAJeyBVU0JfREVWSUNFKFRPU0hJQkFfVkVORE9SX0lELCBUT1NISUJBX1BST0RVQ1RfSFNEUEFfTUlOSUNBUkQgKSB9LCAvKiBUb3NoaWJhIDNHIEhTRFBBID09IE5vdmF0ZWwgRXhwZWRpdGUgRVU4NzBEIE1pbmlDYXJkICovCiAJeyBVU0JfREVWSUNFKEFMSU5LX1ZFTkRPUl9JRCwgMHg5MDAwKSB9LAorCXsgVVNCX0RFVklDRShBTElOS19WRU5ET1JfSUQsIEFMSU5LX1BST0RVQ1RfUEgzMDApIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhBTElOS19WRU5ET1JfSUQsIEFMSU5LX1BST0RVQ1RfM0dVLCAweGZmLCAweGZmLCAweGZmKSB9LAotCXsgVVNCX0RFVklDRShBTENBVEVMX1ZFTkRPUl9JRCwgQUxDQVRFTF9QUk9EVUNUX1gwNjBTKSB9LAorCXsgVVNCX0RFVklDRShBTENBVEVMX1ZFTkRPUl9JRCwgQUxDQVRFTF9QUk9EVUNUX1gwNjBTX1gyMDApLAorCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZhbGNhdGVsX3gyMDBfYmxhY2tsaXN0CisJfSwKIAl7IFVTQl9ERVZJQ0UoQUlSUExVU19WRU5ET1JfSUQsIEFJUlBMVVNfUFJPRFVDVF9NQ0Q2NTApIH0sCiAJeyBVU0JfREVWSUNFKFRMQVlURUNIX1ZFTkRPUl9JRCwgVExBWVRFQ0hfUFJPRFVDVF9URVU4MDApIH0sCiAJeyBVU0JfREVWSUNFKExPTkdDSEVFUl9WRU5ET1JfSUQsIEZPVVJfR19TWVNURU1TX1BST0RVQ1RfVzE0KSwKICAgCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmb3VyX2dfdzE0X2JsYWNrbGlzdAogICAJfSwKKwl7IFVTQl9ERVZJQ0UoTE9OR0NIRUVSX1ZFTkRPUl9JRCwgWk9PTV9QUk9EVUNUXzQ1OTcpIH0sCiAJeyBVU0JfREVWSUNFKEhBSUVSX1ZFTkRPUl9JRCwgSEFJRVJfUFJPRFVDVF9DRTEwMCkgfSwKIAkvKiBQaXJlbGxpICAqLwogCXsgVVNCX0RFVklDRShQSVJFTExJX1ZFTkRPUl9JRCwgUElSRUxMSV9QUk9EVUNUX0MxMDBfMSl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKaW5kZXggYzZkOTJhNS4uZWE4NDQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCkBAIC0xNzQ1LDYgKzE3NDUsNyBAQAogCX0KIAlpZiAoZndfcC0+c2l6ZSA+IFRJX0ZJUk1XQVJFX0JVRl9TSVpFKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBmaXJtd2FyZSB0b28gbGFyZ2UgJXp1XG4iLCBfX2Z1bmNfXywgZndfcC0+c2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfcCk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKaW5kZXggMDA0MTg5OS4uZThhZTIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCkBAIC04MTksNiArODE5LDM1IEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyBkb24ndCB3b3JrIG9yIHJldHVybiBpbmNvcnJlY3QgZGF0YSB0aGUgZmlyc3QKKwkgKiB0aW1lIHRoZXkgZ2V0IGEgUkVBRCgxMCkgY29tbWFuZCwgb3IgZm9yIHRoZSBmaXJzdCBSRUFEKDEwKQorCSAqIGFmdGVyIGEgbWVkaWEgY2hhbmdlLiAgSWYgdGhlIElOSVRJQUxfUkVBRDEwIGZsYWcgaXMgc2V0LAorCSAqIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBSRUFEKDEwKSBjb21tYW5kcyBzdWNjZWVkLiAgSWYgdGhlCisJICogcHJldmlvdXMgb25lIHN1Y2NlZWRlZCBhbmQgdGhpcyBvbmUgZmFpbGVkLCBzZXQgdGhlIFJFRE9fUkVBRDEwCisJICogZmxhZyB0byBmb3JjZSBhIHJldHJ5LgorCSAqLworCWlmICh1bmxpa2VseSgodXMtPmZmbGFncyAmIFVTX0ZMX0lOSVRJQUxfUkVBRDEwKSAmJgorCQkJc3JiLT5jbW5kWzBdID09IFJFQURfMTApKSB7CisJCWlmIChzcmItPnJlc3VsdCA9PSBTQU1fU1RBVF9HT09EKSB7CisJCQlzZXRfYml0KFVTX0ZMSURYX1JFQUQxMF9XT1JLRUQsICZ1cy0+ZGZsYWdzKTsKKwkJfSBlbHNlIGlmICh0ZXN0X2JpdChVU19GTElEWF9SRUFEMTBfV09SS0VELCAmdXMtPmRmbGFncykpIHsKKwkJCWNsZWFyX2JpdChVU19GTElEWF9SRUFEMTBfV09SS0VELCAmdXMtPmRmbGFncyk7CisJCQlzZXRfYml0KFVTX0ZMSURYX1JFRE9fUkVBRDEwLCAmdXMtPmRmbGFncyk7CisJCX0KKworCQkvKgorCQkgKiBOZXh0LCBpZiB0aGUgUkVET19SRUFEMTAgZmxhZyBpcyBzZXQsIHJldHVybiBhIHJlc3VsdAorCQkgKiBjb2RlIHRoYXQgd2lsbCBjYXVzZSB0aGUgU0NTSSBjb3JlIHRvIHJldHJ5IHRoZSBSRUFEKDEwKQorCQkgKiBjb21tYW5kIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KFVTX0ZMSURYX1JFRE9fUkVBRDEwLCAmdXMtPmRmbGFncykpIHsKKwkJCWNsZWFyX2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpOworCQkJc3JiLT5yZXN1bHQgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQkJc3JiLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCQl9CisJfQorCiAJLyogRGlkIHdlIHRyYW5zZmVyIGxlc3MgdGhhbiB0aGUgbWluaW11bSBhbW91bnQgcmVxdWlyZWQ/ICovCiAJaWYgKChzcmItPnJlc3VsdCA9PSBTQU1fU1RBVF9HT09EIHx8IHNyYi0+c2Vuc2VfYnVmZmVyWzJdID09IDApICYmCiAJCQlzY3NpX2J1ZmZsZW4oc3JiKSAtIHNjc2lfZ2V0X3Jlc2lkKHNyYikgPCBzcmItPnVuZGVyZmxvdykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IGMxNjAyYjguLmNjZmYzNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMTExNCw2ICsxMTE0LDE2IEBACiAJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAogCisvKiBSZXBvcnRlZCBieSBQYXVsIEhhcnRtYW4gPHBhdWwuaGFydG1hbitsaW51eEBnbWFpbC5jb20+CisgKiBUaGlzIGNhcmQgcmVhZGVyIHJldHVybnMgIklsbGVnYWwgUmVxdWVzdCwgTG9naWNhbCBCbG9jayBBZGRyZXNzCisgKiBPdXQgb2YgUmFuZ2UiIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkgYWZ0ZXIgYSBuZXcgY2FyZCBpcyBpbnNlcnRlZC4KKyAqLworVU5VU1VBTF9ERVYoICAweDA5MGMsIDB4NjAwMCwgMHgwMTAwLCAweDAxMDAsCisJCSJGZWl5YSIsCisJCSJTRC9TREhDIENhcmQgUmVhZGVyIiwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSU5JVElBTF9SRUFEMTAgKSwKKwogLyogVGhpcyBQZW50YXggc3RpbGwgY2FtZXJhIGlzIG5vdCBjb25mb3JtYW50CiAgKiB0byB0aGUgVVNCIHN0b3JhZ2Ugc3BlY2lmaWNhdGlvbjogLQogICogLSBJdCBkb2VzIG5vdCBsaWtlIHRoZSBJTlFVSVJZIGNvbW1hbmQuIFNvIHdlIG11c3QgaGFuZGxlIHRoaXMgY29tbWFuZApAQCAtMTg4OCw2ICsxODk4LDE1IEBACiAJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX05PX1JFQURfRElTQ19JTkZPICksCiAKKy8qIFJlcG9ydGVkIGJ5IFN2ZW4gR2VnZ3VzIDxzdmVuLXVzYnN0QGdlZ2d1cy5uZXQ+CisgKiBUaGlzIGVuY3J5cHRlZCBwZW4gZHJpdmUgcmV0dXJucyBib2d1cyBkYXRhIGZvciB0aGUgaW5pdGlhbCBSRUFEKDEwKS4KKyAqLworVU5VU1VBTF9ERVYoICAweDFiMWMsIDB4MWFiNSwgMHgwMjAwLCAweDAyMDAsCisJCSJDb3JzYWlyIiwKKwkJIlBhZGxvY2sgdjIiLAorCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9JTklUSUFMX1JFQUQxMCApLAorCiAvKiBQYXRjaCBieSBSaWNoYXJkIFNjaPx0eiA8ci5zY2h0ekB0LW9ubGluZS5kZT4KICAqIFRoaXMgZXh0ZXJuYWwgaGFyZCBkcml2ZSBlbmNsb3N1cmUgdXNlcyBhIEpNaWNyb24gY2hpcCB3aGljaAogICogbmVlZHMgdGhlIFVTX0ZMX0lHTk9SRV9SRVNJRFVFIGZsYWcgdG8gd29yayBwcm9wZXJseS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IDVlZTdhYzQuLjBjYTA5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtNDQwLDcgKzQ0MCw4IEBACiAJCQlVU19GTF9OT1RfTE9DS0FCTEUgfCBVU19GTF9NQVhfU0VDVE9SU182NCB8CiAJCQlVU19GTF9DQVBBQ0lUWV9PSyB8IFVTX0ZMX0lHTk9SRV9SRVNJRFVFIHwKIAkJCVVTX0ZMX1NJTkdMRV9MVU4gfCBVU19GTF9OT19XUF9ERVRFQ1QgfAotCQkJVVNfRkxfTk9fUkVBRF9ESVNDX0lORk8gfCBVU19GTF9OT19SRUFEX0NBUEFDSVRZXzE2KTsKKwkJCVVTX0ZMX05PX1JFQURfRElTQ19JTkZPIHwgVVNfRkxfTk9fUkVBRF9DQVBBQ0lUWV8xNiB8CisJCQlVU19GTF9JTklUSUFMX1JFQUQxMCk7CiAKIAlwID0gcXVpcmtzOwogCXdoaWxlICgqcCkgewpAQCAtNDkwLDYgKzQ5MSw5IEBACiAJCWNhc2UgJ20nOgogCQkJZiB8PSBVU19GTF9NQVhfU0VDVE9SU182NDsKIAkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCWYgfD0gVVNfRkxfSU5JVElBTF9SRUFEMTA7CisJCQlicmVhazsKIAkJY2FzZSAnbyc6CiAJCQlmIHw9IFVTX0ZMX0NBUEFDSVRZX09LOwogCQkJYnJlYWs7CkBAIC05NTMsNiArOTU3LDEzIEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byBCYWREZXZpY2U7CiAKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgcmV0dXJucyBpbnZhbGlkIGRhdGEgZm9yIHRoZSBmaXJzdCBSRUFEKDEwKQorCSAqIGNvbW1hbmQsIGluZGljYXRlIHRoZSBjb21tYW5kIHNob3VsZCBiZSByZXRyaWVkLgorCSAqLworCWlmICh1cy0+ZmZsYWdzICYgVVNfRkxfSU5JVElBTF9SRUFEMTApCisJCXNldF9iaXQoVVNfRkxJRFhfUkVET19SRUFEMTAsICZ1cy0+ZGZsYWdzKTsKKwogCS8qIEFjcXVpcmUgYWxsIHRoZSBvdGhlciByZXNvdXJjZXMgYW5kIGFkZCB0aGUgaG9zdCAqLwogCXJlc3VsdCA9IHVzYl9zdG9yX2FjcXVpcmVfcmVzb3VyY2VzKHVzKTsKIAlpZiAocmVzdWx0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKaW5kZXggODlkM2JmZi4uN2IwZjIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCkBAIC03Myw2ICs3Myw4IEBACiAjZGVmaW5lIFVTX0ZMSURYX1JFU0VUVElORwk0CS8qIGRldmljZSByZXNldCBpbiBwcm9ncmVzcyAqLwogI2RlZmluZSBVU19GTElEWF9USU1FRF9PVVQJNQkvKiBTQ1NJIG1pZGxheWVyIHRpbWVkIG91dCAgKi8KICNkZWZpbmUgVVNfRkxJRFhfRE9OVF9TQ0FOCTYJLyogZG9uJ3Qgc2NhbiAoZGlzY29ubmVjdCkgICovCisjZGVmaW5lIFVTX0ZMSURYX1JFRE9fUkVBRDEwCTcJLyogcmVkbyBSRUFEKDEwKSBjb21tYW5kICAgICovCisjZGVmaW5lIFVTX0ZMSURYX1JFQUQxMF9XT1JLRUQJOAkvKiBwcmV2aW91cyBSRUFEKDEwKSBzdWNjZWVkZWQgKi8KIAogI2RlZmluZSBVU0JfU1RPUl9TVFJJTkdfTEVOIDMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvbmV0LmMgYi9kcml2ZXJzL3Zob3N0L25ldC5jCmluZGV4IDJmN2M3NmEuLmUyMjRhOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmMKKysrIGIvZHJpdmVycy92aG9zdC9uZXQuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmdnEtPm11dGV4KTsKLQl2aG9zdF9kaXNhYmxlX25vdGlmeSh2cSk7CisJdmhvc3RfZGlzYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSk7CiAKIAlpZiAod21lbSA8IHNvY2stPnNrLT5za19zbmRidWYgLyAyKQogCQl0eF9wb2xsX3N0b3AobmV0KTsKQEAgLTE2Niw4ICsxNjYsOCBAQAogCQkJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc29jay0+ZmxhZ3MpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkodnEpKSkgewotCQkJCXZob3N0X2Rpc2FibGVfbm90aWZ5KHZxKTsKKwkJCWlmICh1bmxpa2VseSh2aG9zdF9lbmFibGVfbm90aWZ5KCZuZXQtPmRldiwgdnEpKSkgeworCQkJCXZob3N0X2Rpc2FibGVfbm90aWZ5KCZuZXQtPmRldiwgdnEpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7CkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmdnEtPm11dGV4KTsKLQl2aG9zdF9kaXNhYmxlX25vdGlmeSh2cSk7CisJdmhvc3RfZGlzYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSk7CiAJdmhvc3RfaGxlbiA9IHZxLT52aG9zdF9obGVuOwogCXNvY2tfaGxlbiA9IHZxLT5zb2NrX2hsZW47CiAKQEAgLTMzNCwxMCArMzM0LDEwIEBACiAJCQlicmVhazsKIAkJLyogT0ssIG5vdyB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgYWRkZWQgZGVzY3JpcHRvcnMuICovCiAJCWlmICghaGVhZGNvdW50KSB7Ci0JCQlpZiAodW5saWtlbHkodmhvc3RfZW5hYmxlX25vdGlmeSh2cSkpKSB7CisJCQlpZiAodW5saWtlbHkodmhvc3RfZW5hYmxlX25vdGlmeSgmbmV0LT5kZXYsIHZxKSkpIHsKIAkJCQkvKiBUaGV5IGhhdmUgc2xpcHBlZCBvbmUgaW4gYXMgd2Ugd2VyZQogCQkJCSAqIGRvaW5nIHRoYXQ6IGNoZWNrIGFnYWluLiAqLwotCQkJCXZob3N0X2Rpc2FibGVfbm90aWZ5KHZxKTsKKwkJCQl2aG9zdF9kaXNhYmxlX25vdGlmeSgmbmV0LT5kZXYsIHZxKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCS8qIE5vdGhpbmcgbmV3PyAgV2FpdCBmb3IgZXZlbnRmZCB0byB0ZWxsIHVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Rlc3QuYyBiL2RyaXZlcnMvdmhvc3QvdGVzdC5jCmluZGV4IDA5OWYzMDIuLjczNGUxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3QvdGVzdC5jCisrKyBiL2RyaXZlcnMvdmhvc3QvdGVzdC5jCkBAIC00OSw3ICs0OSw3IEBACiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJnZxLT5tdXRleCk7Ci0Jdmhvc3RfZGlzYWJsZV9ub3RpZnkodnEpOworCXZob3N0X2Rpc2FibGVfbm90aWZ5KCZuLT5kZXYsIHZxKTsKIAogCWZvciAoOzspIHsKIAkJaGVhZCA9IHZob3N0X2dldF92cV9kZXNjKCZuLT5kZXYsIHZxLCB2cS0+aW92LApAQCAtNjEsOCArNjEsOCBAQAogCQkJYnJlYWs7CiAJCS8qIE5vdGhpbmcgbmV3PyAgV2FpdCBmb3IgZXZlbnRmZCB0byB0ZWxsIHVzIHRoZXkgcmVmaWxsZWQuICovCiAJCWlmIChoZWFkID09IHZxLT5udW0pIHsKLQkJCWlmICh1bmxpa2VseSh2aG9zdF9lbmFibGVfbm90aWZ5KHZxKSkpIHsKLQkJCQl2aG9zdF9kaXNhYmxlX25vdGlmeSh2cSk7CisJCQlpZiAodW5saWtlbHkodmhvc3RfZW5hYmxlX25vdGlmeSgmbi0+ZGV2LCB2cSkpKSB7CisJCQkJdmhvc3RfZGlzYWJsZV9ub3RpZnkoJm4tPmRldiwgdnEpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKaW5kZXggN2FhNGVlYS4uZWE5NjZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5jCisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwpAQCAtMzcsNiArMzcsOSBAQAogCVZIT1NUX01FTU9SWV9GX0xPRyA9IDB4MSwKIH07CiAKKyNkZWZpbmUgdmhvc3RfdXNlZF9ldmVudCh2cSkgKCh1MTYgX191c2VyICopJnZxLT5hdmFpbC0+cmluZ1t2cS0+bnVtXSkKKyNkZWZpbmUgdmhvc3RfYXZhaWxfZXZlbnQodnEpICgodTE2IF9fdXNlciAqKSZ2cS0+dXNlZC0+cmluZ1t2cS0+bnVtXSkKKwogc3RhdGljIHZvaWQgdmhvc3RfcG9sbF9mdW5jKHN0cnVjdCBmaWxlICpmaWxlLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoLAogCQkJICAgIHBvbGxfdGFibGUgKnB0KQogewpAQCAtMTYxLDYgKzE2NCw4IEBACiAJdnEtPmxhc3RfYXZhaWxfaWR4ID0gMDsKIAl2cS0+YXZhaWxfaWR4ID0gMDsKIAl2cS0+bGFzdF91c2VkX2lkeCA9IDA7CisJdnEtPnNpZ25hbGxlZF91c2VkID0gMDsKKwl2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQgPSBmYWxzZTsKIAl2cS0+dXNlZF9mbGFncyA9IDA7CiAJdnEtPmxvZ191c2VkID0gZmFsc2U7CiAJdnEtPmxvZ19hZGRyID0gLTF1bGw7CkBAIC00ODksMTYgKzQ5NCwxNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHZxX2FjY2Vzc19vayh1bnNpZ25lZCBpbnQgbnVtLAorc3RhdGljIGludCB2cV9hY2Nlc3Nfb2soc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IG51bSwKIAkJCXN0cnVjdCB2cmluZ19kZXNjIF9fdXNlciAqZGVzYywKIAkJCXN0cnVjdCB2cmluZ19hdmFpbCBfX3VzZXIgKmF2YWlsLAogCQkJc3RydWN0IHZyaW5nX3VzZWQgX191c2VyICp1c2VkKQogeworCXNpemVfdCBzID0gdmhvc3RfaGFzX2ZlYXR1cmUoZCwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpID8gMiA6IDA7CiAJcmV0dXJuIGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGVzYywgbnVtICogc2l6ZW9mICpkZXNjKSAmJgogCSAgICAgICBhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGF2YWlsLAotCQkJIHNpemVvZiAqYXZhaWwgKyBudW0gKiBzaXplb2YgKmF2YWlsLT5yaW5nKSAmJgorCQkJIHNpemVvZiAqYXZhaWwgKyBudW0gKiBzaXplb2YgKmF2YWlsLT5yaW5nICsgcykgJiYKIAkgICAgICAgYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXNlZCwKLQkJCXNpemVvZiAqdXNlZCArIG51bSAqIHNpemVvZiAqdXNlZC0+cmluZyk7CisJCQlzaXplb2YgKnVzZWQgKyBudW0gKiBzaXplb2YgKnVzZWQtPnJpbmcgKyBzKTsKIH0KIAogLyogQ2FuIHdlIGxvZyB3cml0ZXM/ICovCkBAIC01MTQsOSArNTIwLDExIEBACiAKIC8qIFZlcmlmeSBhY2Nlc3MgZm9yIHdyaXRlIGxvZ2dpbmcuICovCiAvKiBDYWxsZXIgc2hvdWxkIGhhdmUgdnEgbXV0ZXggYW5kIGRldmljZSBtdXRleCAqLwotc3RhdGljIGludCB2cV9sb2dfYWNjZXNzX29rKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCB2b2lkIF9fdXNlciAqbG9nX2Jhc2UpCitzdGF0aWMgaW50IHZxX2xvZ19hY2Nlc3Nfb2soc3RydWN0IHZob3N0X2RldiAqZCwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCisJCQkgICAgdm9pZCBfX3VzZXIgKmxvZ19iYXNlKQogewogCXN0cnVjdCB2aG9zdF9tZW1vcnkgKm1wOworCXNpemVfdCBzID0gdmhvc3RfaGFzX2ZlYXR1cmUoZCwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpID8gMiA6IDA7CiAKIAltcCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQodnEtPmRldi0+bWVtb3J5LAogCQkJCSAgICAgICBsb2NrZGVwX2lzX2hlbGQoJnZxLT5tdXRleCkpOwpAQCAtNTI0LDE1ICs1MzIsMTUgQEAKIAkJCSAgICB2aG9zdF9oYXNfZmVhdHVyZSh2cS0+ZGV2LCBWSE9TVF9GX0xPR19BTEwpKSAmJgogCQkoIXZxLT5sb2dfdXNlZCB8fCBsb2dfYWNjZXNzX29rKGxvZ19iYXNlLCB2cS0+bG9nX2FkZHIsCiAJCQkJCXNpemVvZiAqdnEtPnVzZWQgKwotCQkJCQl2cS0+bnVtICogc2l6ZW9mICp2cS0+dXNlZC0+cmluZykpOworCQkJCQl2cS0+bnVtICogc2l6ZW9mICp2cS0+dXNlZC0+cmluZyArIHMpKTsKIH0KIAogLyogQ2FuIHdlIHN0YXJ0IHZxPyAqLwogLyogQ2FsbGVyIHNob3VsZCBoYXZlIHZxIG11dGV4IGFuZCBkZXZpY2UgbXV0ZXggKi8KIGludCB2aG9zdF92cV9hY2Nlc3Nfb2soc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiB7Ci0JcmV0dXJuIHZxX2FjY2Vzc19vayh2cS0+bnVtLCB2cS0+ZGVzYywgdnEtPmF2YWlsLCB2cS0+dXNlZCkgJiYKLQkJdnFfbG9nX2FjY2Vzc19vayh2cSwgdnEtPmxvZ19iYXNlKTsKKwlyZXR1cm4gdnFfYWNjZXNzX29rKHZxLT5kZXYsIHZxLT5udW0sIHZxLT5kZXNjLCB2cS0+YXZhaWwsIHZxLT51c2VkKSAmJgorCQl2cV9sb2dfYWNjZXNzX29rKHZxLT5kZXYsIHZxLCB2cS0+bG9nX2Jhc2UpOwogfQogCiBzdGF0aWMgbG9uZyB2aG9zdF9zZXRfbWVtb3J5KHN0cnVjdCB2aG9zdF9kZXYgKmQsIHN0cnVjdCB2aG9zdF9tZW1vcnkgX191c2VyICptKQpAQCAtNTc3LDYgKzU4NSw3IEBACiAKIAlpZiAocikKIAkJcmV0dXJuIHI7CisJdnEtPnNpZ25hbGxlZF91c2VkX3ZhbGlkID0gZmFsc2U7CiAJcmV0dXJuIGdldF91c2VyKHZxLT5sYXN0X3VzZWRfaWR4LCAmdXNlZC0+aWR4KTsKIH0KIApAQCAtNjc0LDcgKzY4Myw3IEBACiAJCSAqIElmIGl0IGlzIG5vdCwgd2UgZG9uJ3QgYXMgc2l6ZSBtaWdodCBub3QgaGF2ZSBiZWVuIHNldHVwLgogCQkgKiBXZSB3aWxsIHZlcmlmeSB3aGVuIGJhY2tlbmQgaXMgY29uZmlndXJlZC4gKi8KIAkJaWYgKHZxLT5wcml2YXRlX2RhdGEpIHsKLQkJCWlmICghdnFfYWNjZXNzX29rKHZxLT5udW0sCisJCQlpZiAoIXZxX2FjY2Vzc19vayhkLCB2cS0+bnVtLAogCQkJCSh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWEuZGVzY191c2VyX2FkZHIsCiAJCQkJKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYS5hdmFpbF91c2VyX2FkZHIsCiAJCQkJKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYS51c2VkX3VzZXJfYWRkcikpIHsKQEAgLTgxOCw3ICs4MjcsNyBAQAogCQkJdnEgPSBkLT52cXMgKyBpOwogCQkJbXV0ZXhfbG9jaygmdnEtPm11dGV4KTsKIAkJCS8qIElmIHJpbmcgaXMgaW5hY3RpdmUsIHdpbGwgY2hlY2sgd2hlbiBpdCdzIGVuYWJsZWQuICovCi0JCQlpZiAodnEtPnByaXZhdGVfZGF0YSAmJiAhdnFfbG9nX2FjY2Vzc19vayh2cSwgYmFzZSkpCisJCQlpZiAodnEtPnByaXZhdGVfZGF0YSAmJiAhdnFfbG9nX2FjY2Vzc19vayhkLCB2cSwgYmFzZSkpCiAJCQkJciA9IC1FRkFVTFQ7CiAJCQllbHNlCiAJCQkJdnEtPmxvZ19iYXNlID0gYmFzZTsKQEAgLTEyMTksNiArMTIyOCwxMCBAQAogCiAJLyogT24gc3VjY2VzcywgaW5jcmVtZW50IGF2YWlsIGluZGV4LiAqLwogCXZxLT5sYXN0X2F2YWlsX2lkeCsrOworCisJLyogQXNzdW1lIG5vdGlmaWNhdGlvbnMgZnJvbSBndWVzdCBhcmUgZGlzYWJsZWQgYXQgdGhpcyBwb2ludCwKKwkgKiBpZiB0aGV5IGFyZW4ndCB3ZSB3b3VsZCBuZWVkIHRvIHVwZGF0ZSBhdmFpbF9ldmVudCBpbmRleC4gKi8KKwlCVUdfT04oISh2cS0+dXNlZF9mbGFncyAmIFZSSU5HX1VTRURfRl9OT19OT1RJRlkpKTsKIAlyZXR1cm4gaGVhZDsKIH0KIApAQCAtMTI2Nyw2ICsxMjgwLDEyIEBACiAJCQlldmVudGZkX3NpZ25hbCh2cS0+bG9nX2N0eCwgMSk7CiAJfQogCXZxLT5sYXN0X3VzZWRfaWR4Kys7CisJLyogSWYgdGhlIGRyaXZlciBuZXZlciBib3RoZXJzIHRvIHNpZ25hbCBpbiBhIHZlcnkgbG9uZyB3aGlsZSwKKwkgKiB1c2VkIGluZGV4IG1pZ2h0IHdyYXAgYXJvdW5kLiBJZiB0aGF0IGhhcHBlbnMsIGludmFsaWRhdGUKKwkgKiBzaWduYWxsZWRfdXNlZCBpbmRleCB3ZSBzdG9yZWQuIFRPRE86IG1ha2Ugc3VyZSBkcml2ZXIKKwkgKiBzaWduYWxzIGF0IGxlYXN0IG9uY2UgaW4gMl4xNiBhbmQgcmVtb3ZlIHRoaXMuICovCisJaWYgKHVubGlrZWx5KHZxLT5sYXN0X3VzZWRfaWR4ID09IHZxLT5zaWduYWxsZWRfdXNlZCkpCisJCXZxLT5zaWduYWxsZWRfdXNlZF92YWxpZCA9IGZhbHNlOwogCXJldHVybiAwOwogfQogCkBAIC0xMjc1LDYgKzEyOTQsNyBAQAogCQkJICAgIHVuc2lnbmVkIGNvdW50KQogewogCXN0cnVjdCB2cmluZ191c2VkX2VsZW0gX191c2VyICp1c2VkOworCXUxNiBvbGQsIG5ldzsKIAlpbnQgc3RhcnQ7CiAKIAlzdGFydCA9IHZxLT5sYXN0X3VzZWRfaWR4ICUgdnEtPm51bTsKQEAgLTEyOTIsNyArMTMxMiwxNCBAQAogCQkJICAgKCh2b2lkIF9fdXNlciAqKXVzZWQgLSAodm9pZCBfX3VzZXIgKil2cS0+dXNlZCksCiAJCQkgIGNvdW50ICogc2l6ZW9mICp1c2VkKTsKIAl9Ci0JdnEtPmxhc3RfdXNlZF9pZHggKz0gY291bnQ7CisJb2xkID0gdnEtPmxhc3RfdXNlZF9pZHg7CisJbmV3ID0gKHZxLT5sYXN0X3VzZWRfaWR4ICs9IGNvdW50KTsKKwkvKiBJZiB0aGUgZHJpdmVyIG5ldmVyIGJvdGhlcnMgdG8gc2lnbmFsIGluIGEgdmVyeSBsb25nIHdoaWxlLAorCSAqIHVzZWQgaW5kZXggbWlnaHQgd3JhcCBhcm91bmQuIElmIHRoYXQgaGFwcGVucywgaW52YWxpZGF0ZQorCSAqIHNpZ25hbGxlZF91c2VkIGluZGV4IHdlIHN0b3JlZC4gVE9ETzogbWFrZSBzdXJlIGRyaXZlcgorCSAqIHNpZ25hbHMgYXQgbGVhc3Qgb25jZSBpbiAyXjE2IGFuZCByZW1vdmUgdGhpcy4gKi8KKwlpZiAodW5saWtlbHkoKHUxNikobmV3IC0gdnEtPnNpZ25hbGxlZF91c2VkKSA8ICh1MTYpKG5ldyAtIG9sZCkpKQorCQl2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMzMSwyOSArMTM1OCw0NyBAQAogCXJldHVybiByOwogfQogCi0vKiBUaGlzIGFjdHVhbGx5IHNpZ25hbHMgdGhlIGd1ZXN0LCB1c2luZyBldmVudGZkLiAqLwotdm9pZCB2aG9zdF9zaWduYWwoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKK3N0YXRpYyBib29sIHZob3N0X25vdGlmeShzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewotCV9fdTE2IGZsYWdzOwotCisJX191MTYgb2xkLCBuZXcsIGV2ZW50OworCWJvb2wgdjsKIAkvKiBGbHVzaCBvdXQgdXNlZCBpbmRleCB1cGRhdGVzLiBUaGlzIGlzIHBhaXJlZAogCSAqIHdpdGggdGhlIGJhcnJpZXIgdGhhdCB0aGUgR3Vlc3QgZXhlY3V0ZXMgd2hlbiBlbmFibGluZwogCSAqIGludGVycnVwdHMuICovCiAJc21wX21iKCk7CiAKLQlpZiAoX19nZXRfdXNlcihmbGFncywgJnZxLT5hdmFpbC0+ZmxhZ3MpKSB7Ci0JCXZxX2Vycih2cSwgIkZhaWxlZCB0byBnZXQgZmxhZ3MiKTsKLQkJcmV0dXJuOworCWlmICh2aG9zdF9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSkgJiYKKwkgICAgdW5saWtlbHkodnEtPmF2YWlsX2lkeCA9PSB2cS0+bGFzdF9hdmFpbF9pZHgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICghdmhvc3RfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fUklOR19GX0VWRU5UX0lEWCkpIHsKKwkJX191MTYgZmxhZ3M7CisJCWlmIChfX2dldF91c2VyKGZsYWdzLCAmdnEtPmF2YWlsLT5mbGFncykpIHsKKwkJCXZxX2Vycih2cSwgIkZhaWxlZCB0byBnZXQgZmxhZ3MiKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiAhKGZsYWdzICYgVlJJTkdfQVZBSUxfRl9OT19JTlRFUlJVUFQpOwogCX0KKwlvbGQgPSB2cS0+c2lnbmFsbGVkX3VzZWQ7CisJdiA9IHZxLT5zaWduYWxsZWRfdXNlZF92YWxpZDsKKwluZXcgPSB2cS0+c2lnbmFsbGVkX3VzZWQgPSB2cS0+bGFzdF91c2VkX2lkeDsKKwl2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQgPSB0cnVlOwogCi0JLyogSWYgdGhleSBkb24ndCB3YW50IGFuIGludGVycnVwdCwgZG9uJ3Qgc2lnbmFsLCB1bmxlc3MgZW1wdHkuICovCi0JaWYgKChmbGFncyAmIFZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUKSAmJgotCSAgICAodnEtPmF2YWlsX2lkeCAhPSB2cS0+bGFzdF9hdmFpbF9pZHggfHwKLQkgICAgICF2aG9zdF9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSkpKQotCQlyZXR1cm47CisJaWYgKHVubGlrZWx5KCF2KSkKKwkJcmV0dXJuIHRydWU7CiAKKwlpZiAoZ2V0X3VzZXIoZXZlbnQsIHZob3N0X3VzZWRfZXZlbnQodnEpKSkgeworCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gZ2V0IHVzZWQgZXZlbnQgaWR4Iik7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gdnJpbmdfbmVlZF9ldmVudChldmVudCwgbmV3LCBvbGQpOworfQorCisvKiBUaGlzIGFjdHVhbGx5IHNpZ25hbHMgdGhlIGd1ZXN0LCB1c2luZyBldmVudGZkLiAqLwordm9pZCB2aG9zdF9zaWduYWwoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKK3sKIAkvKiBTaWduYWwgdGhlIEd1ZXN0IHRlbGwgdGhlbSB3ZSB1c2VkIHNvbWV0aGluZyB1cC4gKi8KLQlpZiAodnEtPmNhbGxfY3R4KQorCWlmICh2cS0+Y2FsbF9jdHggJiYgdmhvc3Rfbm90aWZ5KGRldiwgdnEpKQogCQlldmVudGZkX3NpZ25hbCh2cS0+Y2FsbF9jdHgsIDEpOwogfQogCkBAIC0xMzc2LDcgKzE0MjEsNyBAQAogfQogCiAvKiBPSywgbm93IHdlIG5lZWQgdG8ga25vdyBhYm91dCBhZGRlZCBkZXNjcmlwdG9ycy4gKi8KLWJvb2wgdmhvc3RfZW5hYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKK2Jvb2wgdmhvc3RfZW5hYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewogCXUxNiBhdmFpbF9pZHg7CiAJaW50IHI7CkBAIC0xMzg0LDExICsxNDI5LDM0IEBACiAJaWYgKCEodnEtPnVzZWRfZmxhZ3MgJiBWUklOR19VU0VEX0ZfTk9fTk9USUZZKSkKIAkJcmV0dXJuIGZhbHNlOwogCXZxLT51c2VkX2ZsYWdzICY9IH5WUklOR19VU0VEX0ZfTk9fTk9USUZZOwotCXIgPSBwdXRfdXNlcih2cS0+dXNlZF9mbGFncywgJnZxLT51c2VkLT5mbGFncyk7Ci0JaWYgKHIpIHsKLQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIGVuYWJsZSBub3RpZmljYXRpb24gYXQgJXA6ICVkXG4iLAotCQkgICAgICAgJnZxLT51c2VkLT5mbGFncywgcik7Ci0JCXJldHVybiBmYWxzZTsKKwlpZiAoIXZob3N0X2hhc19mZWF0dXJlKGRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpKSB7CisJCXIgPSBwdXRfdXNlcih2cS0+dXNlZF9mbGFncywgJnZxLT51c2VkLT5mbGFncyk7CisJCWlmIChyKSB7CisJCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gZW5hYmxlIG5vdGlmaWNhdGlvbiBhdCAlcDogJWRcbiIsCisJCQkgICAgICAgJnZxLT51c2VkLT5mbGFncywgcik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlyID0gcHV0X3VzZXIodnEtPmF2YWlsX2lkeCwgdmhvc3RfYXZhaWxfZXZlbnQodnEpKTsKKwkJaWYgKHIpIHsKKwkJCXZxX2Vycih2cSwgIkZhaWxlZCB0byB1cGRhdGUgYXZhaWwgZXZlbnQgaW5kZXggYXQgJXA6ICVkXG4iLAorCQkJICAgICAgIHZob3N0X2F2YWlsX2V2ZW50KHZxKSwgcik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KHZxLT5sb2dfdXNlZCkpIHsKKwkJdm9pZCBfX3VzZXIgKnVzZWQ7CisJCS8qIE1ha2Ugc3VyZSBkYXRhIGlzIHNlZW4gYmVmb3JlIGxvZy4gKi8KKwkJc21wX3dtYigpOworCQl1c2VkID0gdmhvc3RfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fUklOR19GX0VWRU5UX0lEWCkgPworCQkJJnZxLT51c2VkLT5mbGFncyA6IHZob3N0X2F2YWlsX2V2ZW50KHZxKTsKKwkJLyogTG9nIHVzZWQgZmxhZ3Mgb3IgZXZlbnQgaW5kZXggZW50cnkgd3JpdGUuIEJvdGggYXJlIDE2IGJpdAorCQkgKiBmaWVsZHMuICovCisJCWxvZ193cml0ZSh2cS0+bG9nX2Jhc2UsIHZxLT5sb2dfYWRkciArCisJCQkgICAodXNlZCAtICh2b2lkIF9fdXNlciAqKXZxLT51c2VkKSwKKwkJCSAgc2l6ZW9mKHUxNikpOworCQlpZiAodnEtPmxvZ19jdHgpCisJCQlldmVudGZkX3NpZ25hbCh2cS0+bG9nX2N0eCwgMSk7CiAJfQogCS8qIFRoZXkgY291bGQgaGF2ZSBzbGlwcGVkIG9uZSBpbiBhcyB3ZSB3ZXJlIGRvaW5nIHRoYXQ6IG1ha2UKIAkgKiBzdXJlIGl0J3Mgd3JpdHRlbiwgdGhlbiBjaGVjayBhZ2Fpbi4gKi8KQEAgLTE0MDQsMTUgKzE0NzIsMTcgQEAKIH0KIAogLyogV2UgZG9uJ3QgbmVlZCB0byBiZSBub3RpZmllZCBhZ2Fpbi4gKi8KLXZvaWQgdmhvc3RfZGlzYWJsZV9ub3RpZnkoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCit2b2lkIHZob3N0X2Rpc2FibGVfbm90aWZ5KHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiB7CiAJaW50IHI7CiAKIAlpZiAodnEtPnVzZWRfZmxhZ3MgJiBWUklOR19VU0VEX0ZfTk9fTk9USUZZKQogCQlyZXR1cm47CiAJdnEtPnVzZWRfZmxhZ3MgfD0gVlJJTkdfVVNFRF9GX05PX05PVElGWTsKLQlyID0gcHV0X3VzZXIodnEtPnVzZWRfZmxhZ3MsICZ2cS0+dXNlZC0+ZmxhZ3MpOwotCWlmIChyKQotCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gZW5hYmxlIG5vdGlmaWNhdGlvbiBhdCAlcDogJWRcbiIsCi0JCSAgICAgICAmdnEtPnVzZWQtPmZsYWdzLCByKTsKKwlpZiAoIXZob3N0X2hhc19mZWF0dXJlKGRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpKSB7CisJCXIgPSBwdXRfdXNlcih2cS0+dXNlZF9mbGFncywgJnZxLT51c2VkLT5mbGFncyk7CisJCWlmIChyKQorCQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIGVuYWJsZSBub3RpZmljYXRpb24gYXQgJXA6ICVkXG4iLAorCQkJICAgICAgICZ2cS0+dXNlZC0+ZmxhZ3MsIHIpOworCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaCBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAppbmRleCBiMzM2M2FlLi44ZTAzMzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKKysrIGIvZHJpdmVycy92aG9zdC92aG9zdC5oCkBAIC04NCw2ICs4NCwxMiBAQAogCS8qIFVzZWQgZmxhZ3MgKi8KIAl1MTYgdXNlZF9mbGFnczsKIAorCS8qIExhc3QgdXNlZCBpbmRleCB2YWx1ZSB3ZSBoYXZlIHNpZ25hbGxlZCBvbiAqLworCXUxNiBzaWduYWxsZWRfdXNlZDsKKworCS8qIExhc3QgdXNlZCBpbmRleCB2YWx1ZSB3ZSBoYXZlIHNpZ25hbGxlZCBvbiAqLworCWJvb2wgc2lnbmFsbGVkX3VzZWRfdmFsaWQ7CisKIAkvKiBMb2cgd3JpdGVzIHRvIHVzZWQgc3RydWN0dXJlLiAqLwogCWJvb2wgbG9nX3VzZWQ7CiAJdTY0IGxvZ19hZGRyOwpAQCAtMTQ5LDggKzE1NSw4IEBACiB2b2lkIHZob3N0X2FkZF91c2VkX2FuZF9zaWduYWxfbihzdHJ1Y3Qgdmhvc3RfZGV2ICosIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKiwKIAkJCSAgICAgICBzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtICpoZWFkcywgdW5zaWduZWQgY291bnQpOwogdm9pZCB2aG9zdF9zaWduYWwoc3RydWN0IHZob3N0X2RldiAqLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOwotdm9pZCB2aG9zdF9kaXNhYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOwotYm9vbCB2aG9zdF9lbmFibGVfbm90aWZ5KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKik7Cit2b2lkIHZob3N0X2Rpc2FibGVfbm90aWZ5KHN0cnVjdCB2aG9zdF9kZXYgKiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqKTsKK2Jvb2wgdmhvc3RfZW5hYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfZGV2ICosIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKik7CiAKIGludCB2aG9zdF9sb2dfd3JpdGUoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsIHN0cnVjdCB2aG9zdF9sb2cgKmxvZywKIAkJICAgIHVuc2lnbmVkIGludCBsb2dfbnVtLCB1NjQgbGVuKTsKQEAgLTE2MiwxMSArMTY4LDEyIEBACiAJfSB3aGlsZSAoMCkKIAogZW51bSB7Ci0JVkhPU1RfRkVBVFVSRVMgPSAoMSA8PCBWSVJUSU9fRl9OT1RJRllfT05fRU1QVFkpIHwKLQkJCSAoMSA8PCBWSVJUSU9fUklOR19GX0lORElSRUNUX0RFU0MpIHwKLQkJCSAoMSA8PCBWSE9TVF9GX0xPR19BTEwpIHwKLQkJCSAoMSA8PCBWSE9TVF9ORVRfRl9WSVJUSU9fTkVUX0hEUikgfAotCQkJICgxIDw8IFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpLAorCVZIT1NUX0ZFQVRVUkVTID0gKDFVTEwgPDwgVklSVElPX0ZfTk9USUZZX09OX0VNUFRZKSB8CisJCQkgKDFVTEwgPDwgVklSVElPX1JJTkdfRl9JTkRJUkVDVF9ERVNDKSB8CisJCQkgKDFVTEwgPDwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpIHwKKwkJCSAoMVVMTCA8PCBWSE9TVF9GX0xPR19BTEwpIHwKKwkJCSAoMVVMTCA8PCBWSE9TVF9ORVRfRl9WSVJUSU9fTkVUX0hEUikgfAorCQkJICgxVUxMIDw8IFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgdmhvc3RfaGFzX2ZlYXR1cmUoc3RydWN0IHZob3N0X2RldiAqZGV2LCBpbnQgYml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKaW5kZXggNWZjOTgzYy4uY2YwM2FkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCkBAIC00NDcsNiArNDQ3LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCisJZmItPmZiLmRldmljZQkJPSAmZmItPmRldi0+ZGV2OworCiAJZmItPmZiLmZpeC5tbWlvX3N0YXJ0CT0gZmItPmRldi0+cmVzLnN0YXJ0OwogCWZiLT5mYi5maXgubW1pb19sZW4JPSByZXNvdXJjZV9zaXplKCZmYi0+ZGV2LT5yZXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMKaW5kZXggM2VjNDkyMy4uYzIyZThkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hcmNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXJjZmIuYwpAQCAtNTE1LDExICs1MTUsMTAgQEAKIAogCS8qIFdlIG5lZWQgYSBmbGF0IGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBBcmMncwogCSAgIGxlc3MtZmxhdCBhY3R1YWwgcGFnZWQgZnJhbWVidWZmZXIgKi8KLQlpZiAoISh2aWRlb21lbW9yeSA9IHZtYWxsb2ModmlkZW9tZW1vcnlzaXplKSkpCisJdmlkZW9tZW1vcnkgPSB2emFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CisJaWYgKCF2aWRlb21lbW9yeSkKIAkJcmV0dXJuIHJldHZhbDsKIAotCW1lbXNldCh2aWRlb21lbW9yeSwgMCwgdmlkZW9tZW1vcnlzaXplKTsKLQogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGFyY2ZiX3BhciksICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCBlYmI4OTNjLi5kN2FhZWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC0yNDgsMTAgKzI0OCw2IEBACiAKIHN0YXRpYyBpbnQgYXR5X2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pOwogCi0jaWZkZWYgQ09ORklHX0FUQVJJCi1zdGF0aWMgaW50IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb3BhciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKTsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBhdHlfZ2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CiAKIHN0YXRpYyB2b2lkIGF0eV9zZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjKTsKQEAgLTIyNjgsMTEgKzIyNjQsMTMgQEAKIAlyZXR1cm47CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgdm9pZCBhdHlfYmxfZXhpdChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGJkKTsKIAlwcmludGsoImF0eTogQmFja2xpZ2h0IHVubG9hZGVkXG4iKTsKIH0KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKICNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVCAqLwogCkBAIC0yNzg5LDcgKzI3ODcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfQVRBUkkKKyNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkgJiYgIWRlZmluZWQoTU9EVUxFKQogc3RhdGljIGludCBfX2RldmluaXQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvX3N0ciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKQogewogCWNoYXIgKnA7CkBAIC0yODE4LDcgKzI4MTYsNyBAQAogCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSAwOwogCXJldHVybiAtMTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQVRBUkkgKi8KKyNlbmRpZiAvKiBDT05GSUdfQVRBUkkgJiYgIU1PRFVMRSAqLwogCiAvKgogICogQmxhbmsgdGhlIGRpc3BsYXkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZwppbmRleCAwYzkzNzNiLi4yZDkzYzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKQEAgLTMwMiw2ICszMDIsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIGFkcDg4NjBfYmwuCiAKK2NvbmZpZyBCQUNLTElHSFRfQURQODg3MAorCXRyaXN0YXRlICJCYWNrbGlnaHQgRHJpdmVyIGZvciBBRFA4ODcwIHVzaW5nIFdMRUQiCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFICYmIEkyQworCXNlbGVjdCBORVdfTEVEUworCXNlbGVjdCBMRURTX0NMQVNTCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBMQ0QgYmFja2xpZ2h0IGNvbm5lY3RlZCB0byB0aGUgQURQODg3MCwKKwkgIHNheSBZIGhlcmUgdG8gZW5hYmxlIHRoaXMgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBhZHA4ODcwX2JsLgorCiBjb25maWcgQkFDS0xJR0hUXzg4UE04NjBYCiAJdHJpc3RhdGUgIkJhY2tsaWdodCBEcml2ZXIgZm9yIDg4UE04NjA2IHVzaW5nIFdMRUQiCiAJZGVwZW5kcyBvbiBNRkRfODhQTTg2MFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKaW5kZXggYjljYTg0OS4uZWU3MmFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDcgQEAKIG9iai0kKENPTkZJR19CQUNLTElHSFRfQURYKSAgICArPSBhZHhfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9BRFA1NTIwKQkrPSBhZHA1NTIwX2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQURQODg2MCkJKz0gYWRwODg2MF9ibC5vCitvYmotJChDT05GSUdfQkFDS0xJR0hUX0FEUDg4NzApCSs9IGFkcDg4NzBfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF84OFBNODYwWCkgKz0gODhwbTg2MHhfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9QQ0Y1MDYzMykJKz0gcGNmNTA2MzMtYmFja2xpZ2h0Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTg4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODcwX2JsLmMKQEAgLTAsMCArMSwxMDEyIEBACisvKgorICogQmFja2xpZ2h0IGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgQURQODg3MCBCYWNrbGlnaHQgRGV2aWNlcworICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjL2FkcDg4NzAuaD4KKyNkZWZpbmUgQURQODg3MF9FWFRfRkVBVFVSRVMKKyNkZWZpbmUgQURQODg3MF9VU0VfTEVEUworCisKKyNkZWZpbmUgQURQODg3MF9NRkRWSUQJMHgwMCAgLyogTWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgQURQODg3MF9NRENSCTB4MDEgIC8qIERldmljZSBtb2RlIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgQURQODg3MF9JTlRfU1RBVCAweDAyICAvKiBJbnRlcnJ1cHRzIHN0YXR1cyAqLworI2RlZmluZSBBRFA4ODcwX0lOVF9FTgkweDAzICAvKiBJbnRlcnJ1cHRzIGVuYWJsZSAqLworI2RlZmluZSBBRFA4ODcwX0NGR1IJMHgwNCAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0JMU0VMCTB4MDUgIC8qIFNpbmsgZW5hYmxlIGJhY2tsaWdodCBvciBpbmRlcGVuZGVudCAqLworI2RlZmluZSBBRFA4ODcwX1BXTUxFRAkweDA2ICAvKiBQV00gRW5hYmxlIFNlbGVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0JMT0ZGCTB4MDcgIC8qIEJhY2tsaWdodCBvZmYgdGltZW91dCAqLworI2RlZmluZSBBRFA4ODcwX0JMRElNCTB4MDggIC8qIEJhY2tsaWdodCBkaW0gdGltZW91dCAqLworI2RlZmluZSBBRFA4ODcwX0JMRlIJMHgwOSAgLyogQmFja2xpZ2h0IGZhZGUgaW4gYW5kIG91dCByYXRlcyAqLworI2RlZmluZSBBRFA4ODcwX0JMTVgxCTB4MEEgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCAxLWRheWxpZ2h0KSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNMQkweDBCICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMS1kYXlsaWdodCkgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YMgkweDBDICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMi1icmlnaHQpIG1heGltdW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0JMRE0yCTB4MEQgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCAyLWJyaWdodCkgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YMwkweDBFICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMy1vZmZpY2UpIG1heGltdW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0JMRE0zCTB4MEYgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCAzLW9mZmljZSkgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YNAkweDEwICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNC1pbmRvb3IpIG1heGltdW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0JMRE00CTB4MTEgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCA0LWluZG9vcikgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YNQkweDEyICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNS1kYXJrKSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNNQkweDEzICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNS1kYXJrKSBkaW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0lTQ0xBVwkweDFBICAvKiBJbmRlcGVuZGVudCBzaW5rIGN1cnJlbnQgZmFkZSBsYXcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9JU0NDCTB4MUIgIC8qIEluZGVwZW5kZW50IHNpbmsgY3VycmVudCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfSVNDVDEJMHgxQyAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IFRpbWVyIFJlZ2lzdGVyIExFRFs3OjVdICovCisjZGVmaW5lIEFEUDg4NzBfSVNDVDIJMHgxRCAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IFRpbWVyIFJlZ2lzdGVyIExFRFs0OjFdICovCisjZGVmaW5lIEFEUDg4NzBfSVNDRgkweDFFICAvKiBJbmRlcGVuZGVudCBzaW5rIGN1cnJlbnQgZmFkZSByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0lTQzEJMHgxRiAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDEgKi8KKyNkZWZpbmUgQURQODg3MF9JU0MyCTB4MjAgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQyICovCisjZGVmaW5lIEFEUDg4NzBfSVNDMwkweDIxICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVEMyAqLworI2RlZmluZSBBRFA4ODcwX0lTQzQJMHgyMiAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDQgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M1CTB4MjMgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ1ICovCisjZGVmaW5lIEFEUDg4NzBfSVNDNgkweDI0ICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENiAqLworI2RlZmluZSBBRFA4ODcwX0lTQzcJMHgyNSAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDcgKEJyaWdodG5lc3MgTGV2ZWwgMS1kYXlsaWdodCkgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M3X0wyCTB4MjYgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ3IChCcmlnaHRuZXNzIExldmVsIDItYnJpZ2h0KSAqLworI2RlZmluZSBBRFA4ODcwX0lTQzdfTDMJMHgyNyAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDcgKEJyaWdodG5lc3MgTGV2ZWwgMy1vZmZpY2UpICovCisjZGVmaW5lIEFEUDg4NzBfSVNDN19MNAkweDI4ICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENyAoQnJpZ2h0bmVzcyBMZXZlbCA0LWluZG9vcikgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M3X0w1CTB4MjkgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ3IChCcmlnaHRuZXNzIExldmVsIDUtZGFyaykgKi8KKyNkZWZpbmUgQURQODg3MF9DTVBfQ1RMCTB4MkQgIC8qIEFMUyBDb21wYXJhdG9yIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9BTFMxX0VOCTB4MkUgIC8qIE1haW4gQUxTIGNvbXBhcmF0b3IgbGV2ZWwgZW5hYmxlICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMl9FTgkweDJGICAvKiBTZWNvbmQgQUxTIGNvbXBhcmF0b3IgbGV2ZWwgZW5hYmxlICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMV9TVEFUIDB4MzAgIC8qIE1haW4gQUxTIENvbXBhcmF0b3IgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMl9TVEFUIDB4MzEgIC8qIFNlY29uZCBBTFMgQ29tcGFyYXRvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9MMlRSUAkweDMyICAvKiBMMiBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0wySFlTCTB4MzMgIC8qIEwyIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9MM1RSUAkweDM0ICAvKiBMMyBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0wzSFlTCTB4MzUgIC8qIEwzIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9MNFRSUAkweDM2ICAvKiBMNCBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0w0SFlTCTB4MzcgIC8qIEw0IGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9MNVRSUAkweDM4ICAvKiBMNSBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0w1SFlTCTB4MzkgIC8qIEw1IGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9QSDFMRVZMCTB4NDAgIC8qIEZpcnN0IHBob3RvdHJhbnNpc3RvciBhbWJpZW50IGxpZ2h0IGxldmVsLWxvdyBieXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfUEgxTEVWSAkweDQxICAvKiBGaXJzdCBwaG90b3RyYW5zaXN0b3IgYW1iaWVudCBsaWdodCBsZXZlbC1oaWdoIGJ5dGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9QSDJMRVZMCTB4NDIgIC8qIFNlY29uZCBwaG90b3RyYW5zaXN0b3IgYW1iaWVudCBsaWdodCBsZXZlbC1sb3cgYnl0ZSByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX1BIMkxFVkgJMHg0MyAgLyogU2Vjb25kIHBob3RvdHJhbnNpc3RvciBhbWJpZW50IGxpZ2h0IGxldmVsLWhpZ2ggYnl0ZSByZWdpc3RlciAqLworCisjZGVmaW5lIEFEUDg4NzBfTUFOVUZJRAkJMHgzICAvKiBBbmFsb2cgRGV2aWNlcyBBRDg4NzAgTWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgQURQODg3MF9ERVZJRCh4KQkoKHgpICYgMHhGKQorI2RlZmluZSBBRFA4ODcwX01BTklEKHgpCSgoeCkgPj4gNCkKKworLyogTURDUiBEZXZpY2UgbW9kZSBhbmQgc3RhdHVzICovCisjZGVmaW5lIEQ3QUxTRU4JCQkoMSA8PCA3KQorI2RlZmluZSBJTlRfQ0ZHCQkJKDEgPDwgNikKKyNkZWZpbmUgTlNUQlkJCQkoMSA8PCA1KQorI2RlZmluZSBESU1fRU4JCQkoMSA8PCA0KQorI2RlZmluZSBHRFdOX0RJUwkJKDEgPDwgMykKKyNkZWZpbmUgU0lTX0VOCQkJKDEgPDwgMikKKyNkZWZpbmUgQ01QX0FVVE9FTgkJKDEgPDwgMSkKKyNkZWZpbmUgQkxFTgkJCSgxIDw8IDApCisKKy8qIEFEUDg4NzBfQUxTMV9FTiBNYWluIEFMUyBjb21wYXJhdG9yIGxldmVsIGVuYWJsZSAqLworI2RlZmluZSBMNV9FTgkJCSgxIDw8IDMpCisjZGVmaW5lIEw0X0VOCQkJKDEgPDwgMikKKyNkZWZpbmUgTDNfRU4JCQkoMSA8PCAxKQorI2RlZmluZSBMMl9FTgkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ0ZHUl9CTFZfU0hJRlQJCTMKKyNkZWZpbmUgQ0ZHUl9CTFZfTUFTSwkJMHg3CisjZGVmaW5lIEFEUDg4NzBfRkxBR19MRURfTUFTSwkweEZGCisKKyNkZWZpbmUgRkFERV9WQUwoaW4sIG91dCkJKCgweEYgJiAoaW4pKSB8ICgoMHhGICYgKG91dCkpIDw8IDQpKQorI2RlZmluZSBCTF9DRkdSX1ZBTChsYXcsIGJsdikJKCgoKGJsdikgJiBDRkdSX0JMVl9NQVNLKSA8PCBDRkdSX0JMVl9TSElGVCkgfCAoKDB4MyAmIChsYXcpKSA8PCAxKSkKKyNkZWZpbmUgQUxTX0NNUFJfQ0ZHX1ZBTChmaWx0KQkoKDB4NyAmIChmaWx0KSkgPDwgMSkKKworc3RydWN0IGFkcDg4NzBfYmwgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsOworCXN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkOworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1bnNpZ25lZCBsb25nIGNhY2hlZF9kYXlsaWdodF9tYXg7CisJaW50IGlkOworCWludCByZXZpZDsKKwlpbnQgY3VycmVudF9icmlnaHRuZXNzOworfTsKKworc3RydWN0IGFkcDg4NzBfbGVkIHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2CWNkZXY7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwllbnVtIGxlZF9icmlnaHRuZXNzCW5ld19icmlnaHRuZXNzOworCWludAkJCWlkOworCWludAkJCWZsYWdzOworfTsKKworc3RhdGljIGludCBhZHA4ODcwX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHJlZywgdWludDhfdCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHJlYWRpbmcgYXQgMHglMDJ4XG4iLCByZWcpOworCQlyZXR1cm4gcmV0OworCX0KKworCSp2YWwgPSByZXQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhZHA4ODcwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQoreworCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHdyaXRlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwODg3MF9zZXRfYml0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldCA9IGFkcDg4NzBfcmVhZChjbGllbnQsIHJlZywgJnJlZ192YWwpOworCisJaWYgKCFyZXQgJiYgKChyZWdfdmFsICYgYml0X21hc2spID09IDApKSB7CisJCXJlZ192YWwgfD0gYml0X21hc2s7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCByZWcsIHJlZ192YWwpOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHA4ODcwX2Nscl9iaXRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcsIHVpbnQ4X3QgYml0X21hc2spCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1aW50OF90IHJlZ192YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJcmV0ID0gYWRwODg3MF9yZWFkKGNsaWVudCwgcmVnLCAmcmVnX3ZhbCk7CisKKwlpZiAoIXJldCAmJiAocmVnX3ZhbCAmIGJpdF9tYXNrKSkgeworCQlyZWdfdmFsICY9IH5iaXRfbWFzazsKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIHJlZywgcmVnX3ZhbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSW5kZXBlbmRlbnQgc2luayAvIExFRAorICovCisjaWYgZGVmaW5lZChBRFA4ODcwX1VTRV9MRURTKQorc3RhdGljIHZvaWQgYWRwODg3MF9sZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFkcDg4NzBfbGVkICpsZWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkcDg4NzBfbGVkLCB3b3JrKTsKKwlhZHA4ODcwX3dyaXRlKGxlZC0+Y2xpZW50LCBBRFA4ODcwX0lTQzEgKyBsZWQtPmlkIC0gMSwKKwkJCSBsZWQtPm5ld19icmlnaHRuZXNzID4+IDEpOworfQorCitzdGF0aWMgdm9pZCBhZHA4ODcwX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkgICBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCXN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkOworCisJbGVkID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgYWRwODg3MF9sZWQsIGNkZXYpOworCWxlZC0+bmV3X2JyaWdodG5lc3MgPSB2YWx1ZTsKKwkvKgorCSAqIFVzZSB3b3JrcXVldWUgZm9yIElPIHNpbmNlIEkyQyBvcGVyYXRpb25zIGNhbiBzbGVlcC4KKwkgKi8KKwlzY2hlZHVsZV93b3JrKCZsZWQtPndvcmspOworfQorCitzdGF0aWMgaW50IGFkcDg4NzBfbGVkX3NldHVwKHN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBsZWQtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0lTQzEgKyBsZWQtPmlkIC0gMSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX0lTQ0MsIDEgPDwgKGxlZC0+aWQgLSAxKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChsZWQtPmlkID4gNCkKKwkJcmV0ID0gYWRwODg3MF9zZXRfYml0cyhjbGllbnQsIEFEUDg4NzBfSVNDVDEsCisJCQkJKGxlZC0+ZmxhZ3MgJiAweDMpIDw8ICgobGVkLT5pZCAtIDUpICogMikpOworCWVsc2UKKwkJcmV0ID0gYWRwODg3MF9zZXRfYml0cyhjbGllbnQsIEFEUDg4NzBfSVNDVDIsCisJCQkJKGxlZC0+ZmxhZ3MgJiAweDMpIDw8ICgobGVkLT5pZCAtIDEpICogMikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRwODg3MF9sZWRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkcDg4NzBfbGVkICpsZWQsICpsZWRfZGF0OworCXN0cnVjdCBsZWRfaW5mbyAqY3VyX2xlZDsKKwlpbnQgcmV0LCBpOworCisKKwlsZWQgPSBrY2FsbG9jKHBkYXRhLT5udW1fbGVkcywgc2l6ZW9mKCpsZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAobGVkID09IE5VTEwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfSVNDTEFXLCBwZGF0YS0+bGVkX2ZhZGVfbGF3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfSVNDVDEsCisJCQkocGRhdGEtPmxlZF9vbl90aW1lICYgMHgzKSA8PCA2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfSVNDRiwKKwkJCUZBREVfVkFMKHBkYXRhLT5sZWRfZmFkZV9pbiwgcGRhdGEtPmxlZF9mYWRlX291dCkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9sZWRzOyArK2kpIHsKKwkJY3VyX2xlZCA9ICZwZGF0YS0+bGVkc1tpXTsKKwkJbGVkX2RhdCA9ICZsZWRbaV07CisKKwkJbGVkX2RhdC0+aWQgPSBjdXJfbGVkLT5mbGFncyAmIEFEUDg4NzBfRkxBR19MRURfTUFTSzsKKworCQlpZiAobGVkX2RhdC0+aWQgPiA3IHx8IGxlZF9kYXQtPmlkIDwgMSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnZhbGlkIExFRCBJRCAlZFxuIiwKKwkJCQlsZWRfZGF0LT5pZCk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmIChwZGF0YS0+YmxfbGVkX2Fzc2lnbiAmICgxIDw8IChsZWRfZGF0LT5pZCAtIDEpKSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJMRUQgJWQgdXNlZCBieSBCYWNrbGlnaHRcbiIsCisJCQkJbGVkX2RhdC0+aWQpOworCQkJZ290byBlcnI7CisJCX0KKworCQlsZWRfZGF0LT5jZGV2Lm5hbWUgPSBjdXJfbGVkLT5uYW1lOworCQlsZWRfZGF0LT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IGN1cl9sZWQtPmRlZmF1bHRfdHJpZ2dlcjsKKwkJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IGFkcDg4NzBfbGVkX3NldDsKKwkJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzID0gTEVEX09GRjsKKwkJbGVkX2RhdC0+ZmxhZ3MgPSBjdXJfbGVkLT5mbGFncyA+PiBGTEFHX09GRlRfU0hJRlQ7CisJCWxlZF9kYXQtPmNsaWVudCA9IGNsaWVudDsKKwkJbGVkX2RhdC0+bmV3X2JyaWdodG5lc3MgPSBMRURfT0ZGOworCQlJTklUX1dPUksoJmxlZF9kYXQtPndvcmssIGFkcDg4NzBfbGVkX3dvcmspOworCisJCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZsZWRfZGF0LT5jZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgTEVEICVkXG4iLAorCQkJCWxlZF9kYXQtPmlkKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmV0ID0gYWRwODg3MF9sZWRfc2V0dXAobGVkX2RhdCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHdyaXRlXG4iKTsKKwkJCWkrKzsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJZGF0YS0+bGVkID0gbGVkOworCisJcmV0dXJuIDA7CisKKyBlcnI6CisJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgLS1pKSB7CisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsZWRbaV0uY2Rldik7CisJCWNhbmNlbF93b3JrX3N5bmMoJmxlZFtpXS53b3JrKTsKKwl9CisKKyBlcnJfZnJlZToKKwlrZnJlZShsZWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRwODg3MF9sZWRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkcDg4NzBfYmFja2xpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKSB7CisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkYXRhLT5sZWRbaV0uY2Rldik7CisJCWNhbmNlbF93b3JrX3N5bmMoJmRhdGEtPmxlZFtpXS53b3JrKTsKKwl9CisKKwlrZnJlZShkYXRhLT5sZWQpOworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDg4NzBfbGVkX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkcDg4NzBfbGVkX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRwODg3MF9ibF9zZXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsLCBpbnQgYnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpIHsKKwkJaWYgKChicmlnaHRuZXNzID4gMCkgJiYgKGJyaWdodG5lc3MgPCBBRFA4ODcwX01BWF9CUklHSFRORVNTKSkgeworCQkJLyogRGlzYWJsZSBBbWJpZW50IExpZ2h0IGF1dG8gYWRqdXN0ICovCisJCQlyZXQgPSBhZHA4ODcwX2Nscl9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLAorCQkJCQlDTVBfQVVUT0VOKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgxLCBicmlnaHRuZXNzKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBNQVhfQlJJR0hUTkVTUyAtPiBFbmFibGUgQW1iaWVudCBMaWdodCBhdXRvIGFkanVzdAorCQkJICogcmVzdG9yZSBkYXlsaWdodCBsMSBzeXNmcyBicmlnaHRuZXNzCisJCQkgKi8KKwkJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgxLAorCQkJCQkgZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsCisJCQkJCSBDTVBfQVVUT0VOKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgxLCBicmlnaHRuZXNzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzcyAmJiBicmlnaHRuZXNzID09IDApCisJCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LAorCQkJCUFEUDg4NzBfTURDUiwgRElNX0VOKTsKKwllbHNlIGlmIChkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPT0gMCAmJiBicmlnaHRuZXNzKQorCQlyZXQgPSBhZHA4ODcwX2Nscl9iaXRzKGNsaWVudCwKKwkJCQlBRFA4ODcwX01EQ1IsIERJTV9FTik7CisKKwlpZiAoIXJldCkKKwkJZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwODg3MF9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlpbnQgYnJpZ2h0bmVzcyA9IGJsLT5wcm9wcy5icmlnaHRuZXNzOworCWlmIChibC0+cHJvcHMucG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJYnJpZ2h0bmVzcyA9IDA7CisKKwlpZiAoYmwtPnByb3BzLmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWJyaWdodG5lc3MgPSAwOworCisJcmV0dXJuIGFkcDg4NzBfYmxfc2V0KGJsLCBicmlnaHRuZXNzKTsKK30KKworc3RhdGljIGludCBhZHA4ODcwX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKworCXJldHVybiBkYXRhLT5jdXJyZW50X2JyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhZHA4ODcwX2JsX29wcyA9IHsKKwkudXBkYXRlX3N0YXR1cwk9IGFkcDg4NzBfYmxfdXBkYXRlX3N0YXR1cywKKwkuZ2V0X2JyaWdodG5lc3MJPSBhZHA4ODcwX2JsX2dldF9icmlnaHRuZXNzLAorfTsKKworc3RhdGljIGludCBhZHA4ODcwX2JsX3NldHVwKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCWludCByZXQgPSAwOworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxTRUwsIH5wZGF0YS0+YmxfbGVkX2Fzc2lnbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX1BXTUxFRCwgcGRhdGEtPnB3bV9hc3NpZ24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMSwgcGRhdGEtPmwxX2RheWxpZ2h0X21heCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRE0xLCBwZGF0YS0+bDFfZGF5bGlnaHRfZGltKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBkYXRhLT5lbl9hbWJsX3NlbnMpIHsKKwkJZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCA9IHBkYXRhLT5sMV9kYXlsaWdodF9tYXg7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgyLAorCQkJCQkJcGRhdGEtPmwyX2JyaWdodF9tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxETTIsCisJCQkJCQlwZGF0YS0+bDJfYnJpZ2h0X2RpbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgzLAorCQkJCQkJcGRhdGEtPmwzX29mZmljZV9tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxETTMsCisJCQkJCQlwZGF0YS0+bDNfb2ZmaWNlX2RpbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVg0LAorCQkJCQkJcGRhdGEtPmw0X2luZG9vcl9tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTERNNCwKKwkJCQkJCXBkYXRhLT5sNF9pbmRvcl9kaW0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YNSwKKwkJCQkJCXBkYXRhLT5sNV9kYXJrX21heCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRE01LAorCQkJCQkJcGRhdGEtPmw1X2RhcmtfZGltKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDJUUlAsIHBkYXRhLT5sMl90cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDJIWVMsIHBkYXRhLT5sMl9oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDNUUlAsIHBkYXRhLT5sM190cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDNIWVMsIHBkYXRhLT5sM19oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDRUUlAsIHBkYXRhLT5sNF90cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDRIWVMsIHBkYXRhLT5sNF9oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDVUUlAsIHBkYXRhLT5sNV90cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDVIWVMsIHBkYXRhLT5sNV9oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQUxTMV9FTiwgTDVfRU4gfCBMNF9FTiB8CisJCQkJCQlMM19FTiB8IEwyX0VOKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQ01QX0NUTCwKKwkJCUFMU19DTVBSX0NGR19WQUwocGRhdGEtPmFibWxfZmlsdCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9DRkdSLAorCQkJQkxfQ0ZHUl9WQUwocGRhdGEtPmJsX2ZhZGVfbGF3LCAwKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRlIsIEZBREVfVkFMKHBkYXRhLT5ibF9mYWRlX2luLAorCQkJcGRhdGEtPmJsX2ZhZGVfb3V0KSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIEFEUDg4NzAgUmV2MCByZXF1aXJlcyBHRFdOX0RJUyBiaXQgc2V0CisJICovCisKKwlyZXQgPSBhZHA4ODcwX3NldF9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLCBCTEVOIHwgRElNX0VOIHwgTlNUQlkgfAorCQkJKGRhdGEtPnJldmlkID09IDAgPyBHRFdOX0RJUyA6IDApKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKwl1aW50OF90IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIHJlZywgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVnX3ZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBpbnQgcmVnKQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlhZHA4ODcwX3dyaXRlKGRhdGEtPmNsaWVudCwgcmVnLCB2YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDVfZGFya19tYXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTE1YNSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDVfZGFya19tYXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMTVg1KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsNV9kYXJrX21heCwgMDY2NCwgYWRwODg3MF9ibF9sNV9kYXJrX21heF9zaG93LAorCQkJYWRwODg3MF9ibF9sNV9kYXJrX21heF9zdG9yZSk7CisKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sNF9pbmRvb3JfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxNWDQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w0X2luZG9vcl9tYXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMTVg0KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsNF9pbmRvb3JfbWF4LCAwNjY0LCBhZHA4ODcwX2JsX2w0X2luZG9vcl9tYXhfc2hvdywKKwkJCWFkcDg4NzBfYmxfbDRfaW5kb29yX21heF9zdG9yZSk7CisKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sM19vZmZpY2VfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMTVgzKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sM19vZmZpY2VfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YMyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihsM19vZmZpY2VfbWF4LCAwNjY0LCBhZHA4ODcwX2JsX2wzX29mZmljZV9tYXhfc2hvdywKKwkJCWFkcDg4NzBfYmxfbDNfb2ZmaWNlX21heF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDJfYnJpZ2h0X21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMTVgyKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMl9icmlnaHRfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YMik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDJfYnJpZ2h0X21heCwgMDY2NCwgYWRwODg3MF9ibF9sMl9icmlnaHRfbWF4X3Nob3csCisJCQlhZHA4ODcwX2JsX2wyX2JyaWdodF9tYXhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTE1YMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDFfZGF5bGlnaHRfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhLT5jYWNoZWRfZGF5bGlnaHRfbWF4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMTVgxKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsMV9kYXlsaWdodF9tYXgsIDA2NjQsIGFkcDg4NzBfYmxfbDFfZGF5bGlnaHRfbWF4X3Nob3csCisJCQlhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X21heF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDVfZGFya19kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w1X2RhcmtfZGltX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMRE01KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsNV9kYXJrX2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sNV9kYXJrX2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sNV9kYXJrX2RpbV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDRfaW5kb29yX2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTERNNCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDRfaW5kb29yX2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNNCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDRfaW5kb29yX2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sNF9pbmRvb3JfZGltX3Nob3csCisJCQlhZHA4ODcwX2JsX2w0X2luZG9vcl9kaW1fc3RvcmUpOworCisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDNfb2ZmaWNlX2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTERNMyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDNfb2ZmaWNlX2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNMyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDNfb2ZmaWNlX2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sM19vZmZpY2VfZGltX3Nob3csCisJCQlhZHA4ODcwX2JsX2wzX29mZmljZV9kaW1fc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wyX2JyaWdodF9kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wyX2JyaWdodF9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxETTIpOworfQorc3RhdGljIERFVklDRV9BVFRSKGwyX2JyaWdodF9kaW0sIDA2NjQsIGFkcDg4NzBfYmxfbDJfYnJpZ2h0X2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sMl9icmlnaHRfZGltX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMV9kYXlsaWdodF9kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNMSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDFfZGF5bGlnaHRfZGltLCAwNjY0LCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sMV9kYXlsaWdodF9kaW1fc3RvcmUpOworCisjaWZkZWYgQURQODg3MF9FWFRfRkVBVFVSRVMKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfYW1iaWVudF9saWdodF9sZXZlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyb3I7CisJdWludDhfdCByZWdfdmFsOworCXVpbnQxNl90IHJldF92YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfUEgxTEVWTCwgJnJlZ192YWwpOworCWlmIChlcnJvciA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZXRfdmFsID0gcmVnX3ZhbDsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfUEgxTEVWSCwgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBSZXR1cm4gMTMtYml0IGNvbnZlcnNpb24gdmFsdWUgZm9yIHRoZSBmaXJzdCBsaWdodCBzZW5zb3IgKi8KKwlyZXRfdmFsICs9IChyZWdfdmFsICYgMHgxRikgPDwgODsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCByZXRfdmFsKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbWJpZW50X2xpZ2h0X2xldmVsLCAwNDQ0LAorCQlhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfbGV2ZWxfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfYW1iaWVudF9saWdodF96b25lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKwl1aW50OF90IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfQ0ZHUiwgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwKKwkJKChyZWdfdmFsID4+IENGR1JfQkxWX1NISUZUKSAmIENGR1JfQkxWX01BU0spICsgMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfYW1iaWVudF9saWdodF96b25lX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1aW50OF90IHJlZ192YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsID09IDApIHsKKwkJLyogRW5hYmxlIGF1dG9tYXRpYyBhbWJpZW50IGxpZ2h0IHNlbnNpbmcgKi8KKwkJYWRwODg3MF9zZXRfYml0cyhkYXRhLT5jbGllbnQsIEFEUDg4NzBfTURDUiwgQ01QX0FVVE9FTik7CisJfSBlbHNlIGlmICgodmFsID4gMCkgJiYgKHZhbCA8IDYpKSB7CisJCS8qIERpc2FibGUgYXV0b21hdGljIGFtYmllbnQgbGlnaHQgc2Vuc2luZyAqLworCQlhZHA4ODcwX2Nscl9iaXRzKGRhdGEtPmNsaWVudCwgQURQODg3MF9NRENSLCBDTVBfQVVUT0VOKTsKKworCQkvKiBTZXQgdXNlciBzdXBwbGllZCBhbWJpZW50IGxpZ2h0IHpvbmUgKi8KKwkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJCWFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfQ0ZHUiwgJnJlZ192YWwpOworCQlyZWdfdmFsICY9IH4oQ0ZHUl9CTFZfTUFTSyA8PCBDRkdSX0JMVl9TSElGVCk7CisJCXJlZ192YWwgfD0gKHZhbCAtIDEpIDw8IENGR1JfQkxWX1NISUZUOworCQlhZHA4ODcwX3dyaXRlKGRhdGEtPmNsaWVudCwgQURQODg3MF9DRkdSLCByZWdfdmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYW1iaWVudF9saWdodF96b25lLCAwNjY0LAorCQlhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfem9uZV9zaG93LAorCQlhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfem9uZV9zdG9yZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkcDg4NzBfYmxfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9sNV9kYXJrX21heC5hdHRyLAorCSZkZXZfYXR0cl9sNV9kYXJrX2RpbS5hdHRyLAorCSZkZXZfYXR0cl9sNF9pbmRvb3JfbWF4LmF0dHIsCisJJmRldl9hdHRyX2w0X2luZG9vcl9kaW0uYXR0ciwKKwkmZGV2X2F0dHJfbDNfb2ZmaWNlX21heC5hdHRyLAorCSZkZXZfYXR0cl9sM19vZmZpY2VfZGltLmF0dHIsCisJJmRldl9hdHRyX2wyX2JyaWdodF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbDJfYnJpZ2h0X2RpbS5hdHRyLAorCSZkZXZfYXR0cl9sMV9kYXlsaWdodF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbDFfZGF5bGlnaHRfZGltLmF0dHIsCisjaWZkZWYgQURQODg3MF9FWFRfRkVBVFVSRVMKKwkmZGV2X2F0dHJfYW1iaWVudF9saWdodF9sZXZlbC5hdHRyLAorCSZkZXZfYXR0cl9hbWJpZW50X2xpZ2h0X3pvbmUuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkcDg4NzBfYmxfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHA4ODcwX2JsX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHA4ODcwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsOworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhOworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlNNQlVTIEJ5dGUgRGF0YSBub3QgU3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gYWRwODg3MF9yZWFkKGNsaWVudCwgQURQODg3MF9NRkRWSUQsICZyZWdfdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoQURQODg3MF9NQU5JRChyZWdfdmFsKSAhPSBBRFA4ODcwX01BTlVGSUQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcHJvYmVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPnJldmlkID0gQURQODg3MF9ERVZJRChyZWdfdmFsKTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+cGRhdGEgPSBwZGF0YTsKKwlkYXRhLT5pZCA9IGlkLT5kcml2ZXJfZGF0YTsKKwlkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPSAwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisKKwltZW1zZXQoJnByb3BzLCAwLCBzaXplb2YocHJvcHMpKTsKKwlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKKwlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IHByb3BzLmJyaWdodG5lc3MgPSBBRFA4ODcwX01BWF9CUklHSFRORVNTOworCWJsID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihkZXZfZHJpdmVyX3N0cmluZygmY2xpZW50LT5kZXYpLAorCQkJJmNsaWVudC0+ZGV2LCBkYXRhLCAmYWRwODg3MF9ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihibCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmFja2xpZ2h0XG4iKTsKKwkJcmV0ID0gUFRSX0VSUihibCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlkYXRhLT5ibCA9IGJsOworCisJaWYgKHBkYXRhLT5lbl9hbWJsX3NlbnMpCisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYmwtPmRldi5rb2JqLAorCQkJJmFkcDg4NzBfYmxfYXR0cl9ncm91cCk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzXG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCXJldCA9IGFkcDg4NzBfYmxfc2V0dXAoYmwpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmwpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUmV2LiVkIEJhY2tsaWdodFxuIiwgZGF0YS0+cmV2aWQpOworCisJaWYgKHBkYXRhLT5udW1fbGVkcykKKwkJYWRwODg3MF9sZWRfcHJvYmUoY2xpZW50KTsKKworCXJldHVybiAwOworCitvdXQ6CisJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGF0YS0+YmwtPmRldi5rb2JqLAorCQkJJmFkcDg4NzBfYmxfYXR0cl9ncm91cCk7CitvdXQxOgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihibCk7CitvdXQyOgorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRwODg3MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWRwODg3MF9jbHJfYml0cyhjbGllbnQsIEFEUDg4NzBfTURDUiwgTlNUQlkpOworCisJaWYgKGRhdGEtPmxlZCkKKwkJYWRwODg3MF9sZWRfcmVtb3ZlKGNsaWVudCk7CisKKwlpZiAoZGF0YS0+cGRhdGEtPmVuX2FtYmxfc2VucykKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5ibC0+ZGV2LmtvYmosCisJCQkmYWRwODg3MF9ibF9hdHRyX2dyb3VwKTsKKworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5ibCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZHA4ODcwX2kyY19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWFkcDg4NzBfY2xyX2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsIE5TVEJZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcDg4NzBfaTJjX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsIE5TVEJZKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYWRwODg3MF9pMmNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGFkcDg4NzBfaTJjX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkcDg4NzBfaWRbXSA9IHsKKwl7ICJhZHA4ODcwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHA4ODcwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkcDg4NzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJfSwKKwkucHJvYmUgICAgPSBhZHA4ODcwX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGFkcDg4NzBfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkcDg4NzBfaTJjX3N1c3BlbmQsCisJLnJlc3VtZSAgPSBhZHA4ODcwX2kyY19yZXN1bWUsCisJLmlkX3RhYmxlID0gYWRwODg3MF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkcDg4NzBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWRwODg3MF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRwODg3MF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkcDg4NzBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHA4ODcwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHA4ODcwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFA4ODcwIEJhY2tsaWdodCBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YWRwODg3MC1iYWNrbGlnaHQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmY1MzctbHEwMzUuYyBiL2RyaXZlcnMvdmlkZW8vYmY1MzctbHEwMzUuYwppbmRleCA0N2MyMWZiLi5iZWE1M2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmNTM3LWxxMDM1LmMKKysrIGIvZHJpdmVycy92aWRlby9iZjUzNy1scTAzNS5jCkBAIC03ODksNiArNzg5LDcgQEAKIAlpMmNfYWRkX2RyaXZlcigmYWQ1MjgwX2RyaXZlcik7CiAKIAltZW1zZXQoJnByb3BzLCAwLCBzaXplb2YocHJvcHMpKTsKKwlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKIAlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IE1BWF9CUklHSEVORVNTOwogCWJsX2RldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImJmNTM3LWJsIiwgTlVMTCwgTlVMTCwKIAkJCQkJICAgJmJmaW5fbHEwMzVmYl9ibF9vcHMsICZwcm9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Jyb2Fkc2hlZXRmYi5jIGIvZHJpdmVycy92aWRlby9icm9hZHNoZWV0ZmIuYwppbmRleCBlYmRhNjg3Li4zNzdkZGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Jyb2Fkc2hlZXRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYnJvYWRzaGVldGZiLmMKQEAgLTExMDEsMTIgKzExMDEsMTAgQEAKIAogCXZpZGVvbWVtb3J5c2l6ZSA9IHJvdW5kdXAoKGRweXcqZHB5aCksIFBBR0VfU0laRSk7CiAKLQl2aWRlb21lbW9yeSA9IHZtYWxsb2ModmlkZW9tZW1vcnlzaXplKTsKKwl2aWRlb21lbW9yeSA9IHZ6YWxsb2ModmlkZW9tZW1vcnlzaXplKTsKIAlpZiAoIXZpZGVvbWVtb3J5KQogCQlnb3RvIGVycl9mYl9yZWw7CiAKLQltZW1zZXQodmlkZW9tZW1vcnksIDAsIHZpZGVvbWVtb3J5c2l6ZSk7Ci0KIAlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyICopdmlkZW9tZW1vcnk7CiAJaW5mby0+ZmJvcHMgPSAmYnJvYWRzaGVldGZiX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lZmlmYi5jIGIvZHJpdmVycy92aWRlby9lZmlmYi5jCmluZGV4IGZiMjA1ODQuLjc4NDEzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZWZpZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2VmaWZiLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDx2aWRlby92Z2EuaD4KIAorc3RhdGljIGJvb2wgcmVxdWVzdF9tZW1fc3VjY2VlZGVkID0gZmFsc2U7CisKIHN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZWZpZmJfZGVmaW5lZCBfX2RldmluaXRkYXRhID0gewogCS5hY3RpdmF0ZQkJPSBGQl9BQ1RJVkFURV9OT1csCiAJLmhlaWdodAkJCT0gLTEsCkBAIC0yODEsNyArMjgzLDkgQEAKIHsKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlLCBpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplKTsKKwlpZiAocmVxdWVzdF9tZW1fc3VjY2VlZGVkKQorCQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSwKKwkJCQkgICBpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplKTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogfQogCkBAIC0zMjYsMTQgKzMzMCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlZmlmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBlZmlmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgc2l6ZV92bW9kZTsKIAl1bnNpZ25lZCBpbnQgc2l6ZV9yZW1hcDsKIAl1bnNpZ25lZCBpbnQgc2l6ZV90b3RhbDsKLQlpbnQgcmVxdWVzdF9zdWNjZWVkZWQgPSAwOwogCiAJaWYgKCFzY3JlZW5faW5mby5sZmJfZGVwdGgpCiAJCXNjcmVlbl9pbmZvLmxmYl9kZXB0aCA9IDMyOwpAQCAtMzg3LDcgKzM5MCw3IEBACiAJZWZpZmJfZml4LnNtZW1fbGVuID0gc2l6ZV9yZW1hcDsKIAogCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oZWZpZmJfZml4LnNtZW1fc3RhcnQsIHNpemVfcmVtYXAsICJlZmlmYiIpKSB7Ci0JCXJlcXVlc3Rfc3VjY2VlZGVkID0gMTsKKwkJcmVxdWVzdF9tZW1fc3VjY2VlZGVkID0gdHJ1ZTsKIAl9IGVsc2UgewogCQkvKiBXZSBjYW5ub3QgbWFrZSB0aGlzIGZhdGFsLiBTb21ldGltZXMgdGhpcyBjb21lcyBmcm9tIG1hZ2ljCiAJCSAgIHNwYWNlcyBvdXIgcmVzb3VyY2UgaGFuZGxlcnMgc2ltcGx5IGRvbid0IGtub3cgYWJvdXQgKi8KQEAgLTQxMyw3ICs0MTYsNyBAQAogCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBlZmlmYl9maXguc21lbV9zdGFydDsKIAlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gc2l6ZV9yZW1hcDsKIAotCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChlZmlmYl9maXguc21lbV9zdGFydCwgZWZpZmJfZml4LnNtZW1fbGVuKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfd2MoZWZpZmJfZml4LnNtZW1fc3RhcnQsIGVmaWZiX2ZpeC5zbWVtX2xlbik7CiAJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgImVmaWZiOiBhYm9ydCwgY2Fubm90IGlvcmVtYXAgdmlkZW8gbWVtb3J5ICIKIAkJCQkiMHgleCBAIDB4JWx4XG4iLApAQCAtNDkxLDEzICs0OTQsMTIgQEAKIGVycl9yZWxlYXNlX2ZiOgogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiBlcnJfcmVsZWFzZV9tZW06Ci0JaWYgKHJlcXVlc3Rfc3VjY2VlZGVkKQorCWlmIChyZXF1ZXN0X21lbV9zdWNjZWVkZWQpCiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihlZmlmYl9maXguc21lbV9zdGFydCwgc2l6ZV90b3RhbCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWZpZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IGVmaWZiX3Byb2JlLAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lCT0gImVmaWZiIiwKIAl9LApAQCAtNTI4LDEzICs1MzAsMjEgQEAKIAlpZiAoIXNjcmVlbl9pbmZvLmxmYl9saW5lbGVuZ3RoKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWZpZmJfZHJpdmVyKTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVmaWZiX2RldmljZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCWlmICghcmV0KSB7Ci0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWZpZmJfZGV2aWNlKTsKLQkJaWYgKHJldCkKLQkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlZmlmYl9kcml2ZXIpOworCS8qCisJICogVGhpcyBpcyBub3QganVzdCBhbiBvcHRpbWl6YXRpb24uICBXZSB3aWxsIGludGVyZmVyZQorCSAqIHdpdGggYSByZWFsIGRyaXZlciBpZiB3ZSBnZXQgcmVwcm9iZWQsIHNvIGRvbid0IGFsbG93CisJICogaXQuCisJICovCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZlZmlmYl9kcml2ZXIsIGVmaWZiX3Byb2JlKTsKKwlpZiAocmV0KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZlZmlmYl9kZXZpY2UpOworCQlyZXR1cm4gcmV0OwogCX0KKwogCXJldHVybiByZXQ7CiB9CiBtb2R1bGVfaW5pdChlZmlmYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKaW5kZXggYmVkZjViZS4uMGFjYzdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKQEAgLTU1NSw4ICs1NTUsNiBAQAogc3RhdGljIGludCBmc2xfZGl1X2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBsb25nIGh0b3RhbCwgdnRvdGFsOwotCiAJcHJfZGVidWcoImNoZWNrX3ZhciB4cmVzOiAlZFxuIiwgdmFyLT54cmVzKTsKIAlwcl9kZWJ1ZygiY2hlY2tfdmFyIHlyZXM6ICVkXG4iLCB2YXItPnlyZXMpOwogCkBAIC02MzUsMjAgKzYzMyw2IEBACiAKIAkJYnJlYWs7CiAJfQotCS8qIElmIHRoZSBwaXhjbG9jayBpcyBiZWxvdyB0aGUgbWluaW11bSBzcGVjJ2QgdmFsdWUgdGhlbiBzZXQgdG8KLQkgKiByZWZyZXNoIHJhdGUgZm9yIDYwSHogc2luY2UgdGhpcyBpcyBzdXBwb3J0ZWQgYnkgbW9zdCBtb25pdG9ycy4KLQkgKiBSZWZlciB0byBEb2N1bWVudGF0aW9uL2ZiLyBmb3IgY2FsY3VsYXRpb25zLgotCSAqLwotCWlmICgodmFyLT5waXhjbG9jayA8IE1JTl9QSVhfQ0xLKSB8fCAodmFyLT5waXhjbG9jayA+IE1BWF9QSVhfQ0xLKSkgewotCQlodG90YWwgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuICsKLQkJICAgIHZhci0+bGVmdF9tYXJnaW47Ci0JCXZ0b3RhbCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW4gKwotCQkgICAgdmFyLT51cHBlcl9tYXJnaW47Ci0JCXZhci0+cGl4Y2xvY2sgPSAodnRvdGFsICogaHRvdGFsICogNlVMKSAvIDEwMFVMOwotCQl2YXItPnBpeGNsb2NrID0gS0haMlBJQ09TKHZhci0+cGl4Y2xvY2spOwotCQlwcl9kZWJ1ZygicGl4Y2xvY2sgc2V0IGZvciA2MEh6IHJlZnJlc2ggPSAldSBwc1xuIiwKLQkJCXZhci0+cGl4Y2xvY2spOwotCX0KIAogCXZhci0+aGVpZ2h0ID0gLTE7CiAJdmFyLT53aWR0aCA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYwppbmRleCBjNmI1NTRmLi41YTVkMDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYwpAQCAtMjksNyArMjksNyBAQAogc3RhdGljIGNoYXIgcGFuZWxfb3B0aW9uWzMyXSA9ICIiOwogCiAvKiBNb2RlcyByZWxldmFudCB0byB0aGUgR1gxICh0YWtlbiBmcm9tIG1vZGVkYi5jKSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgX19pbml0ZGF0YSBneDFfbW9kZWRiW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBfX2RldmluaXRkYXRhIGd4MV9tb2RlZGJbXSA9IHsKIAkvKiA2NDB4NDgwLTYwIFZFU0EgKi8KIAl7IE5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk2ODIsICA0OCwgMTYsIDMzLCAxMCwgOTYsIDIsCiAJICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBwYXItPnZpZF9vcHMtPmJsYW5rX2Rpc3BsYXkoaW5mbywgYmxhbmtfbW9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGd4MWZiX21hcF92aWRlb19tZW1vcnkoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGd4X2Jhc2U7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqIF9faW5pdCBneDFmYl9pbml0X2ZiaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGZiX2luZm8gKiBfX2RldmluaXQgZ3gxZmJfaW5pdF9mYmluZm8oc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyOwogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAJcmV0dXJuIGluZm87CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGd4MWZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBneDFmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyOwogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZ3gxZmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgX19kZXZleGl0IGd4MWZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCS5uYW1lCQk9ICJneDFmYiIsCiAJLmlkX3RhYmxlCT0gZ3gxZmJfaWRfdGFibGUsCiAJLnByb2JlCQk9IGd4MWZiX3Byb2JlLAotCS5yZW1vdmUJCT0gZ3gxZmJfcmVtb3ZlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3gxZmJfcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGd4MWZiX2luaXQodm9pZCkKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZneDFmYl9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZ3gxZmJfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZleGl0IGd4MWZiX2NsZWFudXAodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmd4MWZiX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hlY3ViYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hlY3ViYWZiLmMKaW5kZXggMWI5NDY0My4uNjE0MjUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oZWN1YmFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGVjdWJhZmIuYwpAQCAtMjMxLDEwICsyMzEsOSBAQAogCiAJdmlkZW9tZW1vcnlzaXplID0gKERQWV9XKkRQWV9IKS84OwogCi0JaWYgKCEodmlkZW9tZW1vcnkgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZSkpKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JbWVtc2V0KHZpZGVvbWVtb3J5LCAwLCB2aWRlb21lbW9yeXNpemUpOworCXZpZGVvbWVtb3J5ID0gdnphbGxvYyh2aWRlb21lbW9yeXNpemUpOworCWlmICghdmlkZW9tZW1vcnkpCisJCWdvdG8gZXJyX3ZpZGVvbWVtX2FsbG9jOwogCiAJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgaGVjdWJhZmJfcGFyKSwgJmRldi0+ZGV2KTsKIAlpZiAoIWluZm8pCkBAIC0yNzYsNiArMjc1LDcgQEAKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX2ZiYWxsb2M6CiAJdmZyZWUodmlkZW9tZW1vcnkpOworZXJyX3ZpZGVvbWVtX2FsbG9jOgogCW1vZHVsZV9wdXQoYm9hcmQtPm93bmVyKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbXhmYi5jIGIvZHJpdmVycy92aWRlby9pbXhmYi5jCmluZGV4IGQyY2NmZDYuLmYxMzVkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW14ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKQEAgLTg1NiwxMCArODU2LDEwIEBACiAJCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmcGRldi0+ZGV2LGZiaS0+bWFwX3NpemUsZmJpLT5tYXBfY3B1LAogCQkJZmJpLT5tYXBfZG1hKTsKIGZhaWxlZF9tYXA6Ci0JY2xrX3B1dChmYmktPmNsayk7Ci1mYWlsZWRfZ2V0Y2xvY2s6CiAJaW91bm1hcChmYmktPnJlZ3MpOwogZmFpbGVkX2lvcmVtYXA6CisJY2xrX3B1dChmYmktPmNsayk7CitmYWlsZWRfZ2V0Y2xvY2s6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiBmYWlsZWRfcmVxOgogCWtmcmVlKGluZm8tPnBzZXVkb19wYWxldHRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWV0cm9ub21lZmIuYyBiL2RyaXZlcnMvdmlkZW8vbWV0cm9ub21lZmIuYwppbmRleCBlZDY0ZWRmLi45N2Q0NWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jCkBAIC02MjgsMTIgKzYyOCwxMCBAQAogCS8qIHdlIG5lZWQgdG8gYWRkIGEgc3BhcmUgcGFnZSBiZWNhdXNlIG91ciBjc3VtIGNhY2hpbmcgc2NoZW1lIHdhbGtzCiAJICogdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSAqLwogCXZpZGVvbWVtb3J5c2l6ZSA9IFBBR0VfU0laRSArIChmdyAqIGZoKTsKLQl2aWRlb21lbW9yeSA9IHZtYWxsb2ModmlkZW9tZW1vcnlzaXplKTsKKwl2aWRlb21lbW9yeSA9IHZ6YWxsb2ModmlkZW9tZW1vcnlzaXplKTsKIAlpZiAoIXZpZGVvbWVtb3J5KQogCQlnb3RvIGVycl9mYl9yZWw7CiAKLQltZW1zZXQodmlkZW9tZW1vcnksIDAsIHZpZGVvbWVtb3J5c2l6ZSk7Ci0KIAlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyIF9fZm9yY2UgX19pb21lbSAqKXZpZGVvbWVtb3J5OwogCWluZm8tPmZib3BzID0gJm1ldHJvbm9tZWZiX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tb2RlZGIuYyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKaW5kZXggNDhjM2VhOC4uY2IxNzVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tb2RlZGIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCkBAIC0xMTI4LDMgKzExMjgsNCBAQAogRVhQT1JUX1NZTUJPTChmYl9maW5kX25lYXJlc3RfbW9kZSk7CiBFWFBPUlRfU1lNQk9MKGZiX3ZpZGVvbW9kZV90b19tb2RlbGlzdCk7CiBFWFBPUlRfU1lNQk9MKGZiX2ZpbmRfbW9kZSk7CitFWFBPUlRfU1lNQk9MKGZiX2ZpbmRfbW9kZV9jdnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGExNjhmYi5jIGIvZHJpdmVycy92aWRlby9weGExNjhmYi5jCmluZGV4IDM1ZjYxZGQuLmJiOTVlYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhMTY4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YTE2OGZiLmMKQEAgLTYyMywxOSArNjIzLDIxIEBACiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAocmVzID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gSU8gbWVtb3J5IGRlZmluZWRcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBmYWlsZWRfcHV0X2NsazsKIAl9CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChpcnEgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElSUSBkZWZpbmVkXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZmFpbGVkX3B1dF9jbGs7CiAJfQogCiAJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgcHhhMTY4ZmJfaW5mbyksICZwZGV2LT5kZXYpOwogCWlmIChpbmZvID09IE5VTEwpIHsKLQkJY2xrX3B1dChjbGspOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfcHV0X2NsazsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLwpAQCAtNjcxLDcgKzY3Myw3IEBACiAJZmJpLT5yZWdfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmIChmYmktPnJlZ19iYXNlID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWQ7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW5mbzsKIAl9CiAKIAkvKgpAQCAtNjgzLDcgKzY4NSw3IEBACiAJCQkJCQkmZmJpLT5mYl9zdGFydF9kbWEsIEdGUF9LRVJORUwpOwogCWlmIChpbmZvLT5zY3JlZW5fYmFzZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkOworCQlnb3RvIGZhaWxlZF9mcmVlX2luZm87CiAJfQogCiAJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZylmYmktPmZiX3N0YXJ0X2RtYTsKQEAgLTc3Miw4ICs3NzQsOSBAQAogZmFpbGVkX2ZyZWVfZmJtZW06CiAJZG1hX2ZyZWVfY29oZXJlbnQoZmJpLT5kZXYsIGluZm8tPmZpeC5zbWVtX2xlbiwKIAkJCWluZm8tPnNjcmVlbl9iYXNlLCBmYmktPmZiX3N0YXJ0X2RtYSk7Ci1mYWlsZWQ6CitmYWlsZWRfZnJlZV9pbmZvOgogCWtmcmVlKGluZm8pOworZmFpbGVkX3B1dF9jbGs6CiAJY2xrX3B1dChjbGspOwogCiAJZGV2X2VycigmcGRldi0+ZGV2LCAiZnJhbWUgYnVmZmVyIGRldmljZSBpbml0IGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zM2MtZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNjLWZiLmMKaW5kZXggMDM1MmFmYS4uNGFlY2YyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYy1mYi5jCkBAIC0yMzUsMTMgKzIzNSwxMiBAQAogCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzM2NfZmJfd2luICp3aW4gPSBpbmZvLT5wYXI7Ci0Jc3RydWN0IHMzY19mYl9wZF93aW4gKndpbmRhdGEgPSB3aW4tPndpbmRhdGE7CiAJc3RydWN0IHMzY19mYiAqc2ZiID0gd2luLT5wYXJlbnQ7CiAKIAlkZXZfZGJnKHNmYi0+ZGV2LCAiY2hlY2tpbmcgcGFyYW1ldGVyc1xuIik7CiAKLQl2YXItPnhyZXNfdmlydHVhbCA9IG1heCgodW5zaWduZWQgaW50KXdpbmRhdGEtPnZpcnR1YWxfeCwgdmFyLT54cmVzKTsKLQl2YXItPnlyZXNfdmlydHVhbCA9IG1heCgodW5zaWduZWQgaW50KXdpbmRhdGEtPnZpcnR1YWxfeSwgdmFyLT55cmVzKTsKKwl2YXItPnhyZXNfdmlydHVhbCA9IG1heCh2YXItPnhyZXNfdmlydHVhbCwgdmFyLT54cmVzKTsKKwl2YXItPnlyZXNfdmlydHVhbCA9IG1heCh2YXItPnlyZXNfdmlydHVhbCwgdmFyLT55cmVzKTsKIAogCWlmICghczNjX2ZiX3ZhbGlkYXRlX3dpbl9icHAod2luLCB2YXItPmJpdHNfcGVyX3BpeGVsKSkgewogCQlkZXZfZGJnKHNmYi0+ZGV2LCAid2luICVkOiB1bnN1cHBvcnRlZCBicHAgJWRcbiIsCkBAIC01NTgsNiArNTU3LDEzIEBACiAJdmlkb3NkX3NldF9hbHBoYSh3aW4sIGFscGhhKTsKIAl2aWRvc2Rfc2V0X3NpemUod2luLCBkYXRhKTsKIAorCS8qIEVuYWJsZSBETUEgY2hhbm5lbCBmb3IgdGhpcyB3aW5kb3cgKi8KKwlpZiAoc2ZiLT52YXJpYW50Lmhhc19zaGFkb3djb24pIHsKKwkJZGF0YSA9IHJlYWRsKHNmYi0+cmVncyArIFNIQURPV0NPTik7CisJCWRhdGEgfD0gU0hBRE9XQ09OX0NIeF9FTkFCTEUod2luX25vKTsKKwkJd3JpdGVsKGRhdGEsIHNmYi0+cmVncyArIFNIQURPV0NPTik7CisJfQorCiAJZGF0YSA9IFdJTkNPTnhfRU5XSU47CiAKIAkvKiBub3RlLCBzaW5jZSB3ZSBoYXZlIHRvIHJvdW5kIHVwIHRoZSBiaXRzLXBlci1waXhlbCwgd2UgZW5kIHVwCkBAIC02MzcsMTMgKzY0Myw2IEBACiAJd3JpdGVsKGRhdGEsIHJlZ3MgKyBzZmItPnZhcmlhbnQud2luY29uICsgKHdpbl9ubyAqIDQpKTsKIAl3cml0ZWwoMHgwLCByZWdzICsgc2ZiLT52YXJpYW50Lndpbm1hcCArICh3aW5fbm8gKiA0KSk7CiAKLQkvKiBFbmFibGUgRE1BIGNoYW5uZWwgZm9yIHRoaXMgd2luZG93ICovCi0JaWYgKHNmYi0+dmFyaWFudC5oYXNfc2hhZG93Y29uKSB7Ci0JCWRhdGEgPSByZWFkbChzZmItPnJlZ3MgKyBTSEFET1dDT04pOwotCQlkYXRhIHw9IFNIQURPV0NPTl9DSHhfRU5BQkxFKHdpbl9ubyk7Ci0JCXdyaXRlbChkYXRhLCBzZmItPnJlZ3MgKyBTSEFET1dDT04pOwotCX0KLQogCXNoYWRvd19wcm90ZWN0X3dpbih3aW4sIDApOwogCiAJcmV0dXJuIDA7CkBAIC0xNDg3LDExICsxNDg2LDEwIEBACiAKIAlyZWxlYXNlX21lbV9yZWdpb24oc2ZiLT5yZWdzX3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoc2ZiLT5yZWdzX3JlcykpOwogCi0Ja2ZyZWUoc2ZiKTsKLQogCXBtX3J1bnRpbWVfcHV0X3N5bmMoc2ZiLT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZShzZmItPmRldik7CiAKKwlrZnJlZShzZmIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IDNiN2YyZjUuLjRkZTU0MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC0yMjM3LDYgKzIyMzcsMjIgQEAKIAkJCQkgJmluZm8tPm1vZGVsaXN0KTsKICNlbmRpZgogCWluZm8tPnZhciA9IHNhdmFnZWZiX3ZhcjgwMHg2MDB4ODsKKwkvKiBpZiBhIHBhbmVsIHdhcyBkZXRlY3RlZCwgZGVmYXVsdCB0byBhIENWVCBtb2RlIGluc3RlYWQgKi8KKwlpZiAocGFyLT5TYXZhZ2VQYW5lbFdpZHRoKSB7CisJCXN0cnVjdCBmYl92aWRlb21vZGUgY3Z0X21vZGU7CisKKwkJbWVtc2V0KCZjdnRfbW9kZSwgMCwgc2l6ZW9mKGN2dF9tb2RlKSk7CisJCWN2dF9tb2RlLnhyZXMgPSBwYXItPlNhdmFnZVBhbmVsV2lkdGg7CisJCWN2dF9tb2RlLnlyZXMgPSBwYXItPlNhdmFnZVBhbmVsSGVpZ2h0OworCQljdnRfbW9kZS5yZWZyZXNoID0gNjA7CisJCS8qIEZJWE1FOiBpZiB3ZSBrbm93IHRoZXJlIGlzIG9ubHkgdGhlIHBhbmVsCisJCSAqIHdlIGNhbiBlbmFibGUgcmVkdWNlZCBibGFua2luZyBhcyB3ZWxsICovCisJCWlmIChmYl9maW5kX21vZGVfY3Z0KCZjdnRfbW9kZSwgMCwgMCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBDVlQgbW9kZSBmb3VuZCBmb3IgcGFuZWxcbiIpOworCQllbHNlIGlmIChmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgTlVMTCwgTlVMTCwgMCwKKwkJCQkgICAgICAmY3Z0X21vZGUsIDApICE9IDMpCisJCQlpbmZvLT52YXIgPSBzYXZhZ2VmYl92YXI4MDB4NjAweDg7CisJfQogCiAJaWYgKG1vZGVfb3B0aW9uKSB7CiAJCWZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlX29wdGlvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYwppbmRleCA2YWU0MGI2Li43ZDU0ZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jCkBAIC0xMTI3LDIzICsxMTI3LDE2IEBACiAJCXN0cnVjdCBmYl9pbmZvICppbmZvID0gaGRtaS0+aW5mbzsKIAkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IDAsIGhkbWlfcmF0ZTsKIAotCQkvKiBBIGRldmljZSBoYXMgYmVlbiBwbHVnZ2VkIGluICovCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMoaGRtaS0+ZGV2KTsKLQogCQlyZXQgPSBzaF9oZG1pX3JlYWRfZWRpZChoZG1pLCAmaGRtaV9yYXRlLCAmcGFyZW50X3JhdGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcG1fcnVudGltZV9wdXQoaGRtaS0+ZGV2KTsKKwkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKLQkJfQogCiAJCWhkbWktPmhwX3N0YXRlID0gSERNSV9IT1RQTFVHX0VESURfRE9ORTsKIAogCQkvKiBSZWNvbmZpZ3VyZSB0aGUgY2xvY2sgKi8KIAkJcmV0ID0gc2hfaGRtaV9jbGtfY29uZmlndXJlKGhkbWksIGhkbWlfcmF0ZSwgcGFyZW50X3JhdGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcG1fcnVudGltZV9wdXQoaGRtaS0+ZGV2KTsKKwkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKLQkJfQogCiAJCW1zbGVlcCgxMCk7CiAJCXNoX2hkbWlfY29uZmlndXJlKGhkbWkpOwpAQCAtMTE5MSw3ICsxMTg0LDYgQEAKIAkJZmJfc2V0X3N1c3BlbmQoaGRtaS0+aW5mbywgMSk7CiAKIAkJY29uc29sZV91bmxvY2soKTsKLQkJcG1fcnVudGltZV9wdXQoaGRtaS0+ZGV2KTsKIAl9CiAKIG91dDoKQEAgLTEzMTIsNyArMTMwNCw3IEBACiAJSU5JVF9ERUxBWUVEX1dPUksoJmhkbWktPmVkaWRfd29yaywgc2hfaGRtaV9lZGlkX3dvcmtfZm4pOwogCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9yZXN1bWUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKIAogCS8qIFByb2R1Y3QgYW5kIHJldmlzaW9uIElEcyBhcmUgMCBpbiBzaC1tb2JpbGUgdmVyc2lvbiAqLwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEZXRlY3RlZCBIRE1JIGNvbnRyb2xsZXIgMHgleDoweCV4XG4iLApAQCAtMTM0MCw3ICsxMzMyLDcgQEAKIGVjb2RlYzoKIAlmcmVlX2lycShpcnEsIGhkbWkpOwogZXJlcWlycToKLQlwbV9ydW50aW1lX3N1c3BlbmQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCWlvdW5tYXAoaGRtaS0+YmFzZSk7CiBlbWFwOgpAQCAtMTM3Nyw3ICsxMzY5LDcgQEAKIAlmcmVlX2lycShpcnEsIGhkbWkpOwogCS8qIFdhaXQgZm9yIGFscmVhZHkgc2NoZWR1bGVkIHdvcmsgKi8KIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhkbWktPmVkaWRfd29yayk7Ci0JcG1fcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAljbGtfZGlzYWJsZShoZG1pLT5oZG1pX2Nsayk7CiAJY2xrX3B1dChoZG1pLT5oZG1pX2Nsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCmluZGV4IDQwNGMwM2IuLjAxOWRiZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCkBAIC00NzAsNyArNDcwLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgYnBwID0gMDsKIAl1bnNpZ25lZCBsb25nIGxkZGRzcjsKLQlpbnQgaywgbTsKKwlpbnQgaywgbSwgcmV0OwogCiAJLyogZW5hYmxlIGNsb2NrcyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZSAqLwogCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7CkBAIC01NDAsNyArNTQwLDcgQEAKIAogCQlib2FyZF9jZmcgPSAmY2gtPmNmZy5ib2FyZF9jZmc7CiAJCWlmIChib2FyZF9jZmctPnNldHVwX3N5cykgewotCQkJaW50IHJldCA9IGJvYXJkX2NmZy0+c2V0dXBfc3lzKGJvYXJkX2NmZy0+Ym9hcmRfZGF0YSwKKwkJCXJldCA9IGJvYXJkX2NmZy0+c2V0dXBfc3lzKGJvYXJkX2NmZy0+Ym9hcmRfZGF0YSwKIAkJCQkJCWNoLCAmc2hfbW9iaWxlX2xjZGNfc3lzX2J1c19vcHMpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMKaW5kZXggOTE3MGM4Mi4uY2M3ZDczMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9tZXJhbS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJaWNiX29mZnNldCA9IDB4YzAwMDAwMDAgfCAoY2ZnLT5jdXJyZW50X3JlZyA8PCAyMyk7CiAKIAkqaWNiX2FkZHJfeSA9IGljYl9vZmZzZXQgfCAoY2ZnLT5pY2JbMF0ubWFya2VyX2ljYiA8PCAyNCk7Ci0JaWYgKCgqaWNiX2FkZHJfYykgJiYgaXNfbnZjb2xvcihjZmctPnBpeGVsZm9ybWF0KSkKKwlpZiAoaXNfbnZjb2xvcihjZmctPnBpeGVsZm9ybWF0KSkKIAkJKmljYl9hZGRyX2MgPSBpY2Jfb2Zmc2V0IHwgKGNmZy0+aWNiWzFdLm1hcmtlcl9pY2IgPDwgMjQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCmluZGV4IDg3ZjBiZTEuLjYyOTRkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCkBAIC0xNjY0LDcgKzE2NjQsNyBAQAogCQkJICAgcmVzb3VyY2Vfc2l6ZShpbmZvLT5yZWdzX3JlcykpOwogfQogCi1zdGF0aWMgaW50IHNtNTAxZmJfaW5pdF9mYihzdHJ1Y3QgZmJfaW5mbyAqZmIsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbTUwMWZiX2luaXRfZmIoc3RydWN0IGZiX2luZm8gKmZiLAogCQkJICAgZW51bSBzbTUwMV9jb250cm9sbGVyIGhlYWQsCiAJCQkgICBjb25zdCBjaGFyICpmYm5hbWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKaW5kZXggNTJiMGYzZS4uODE2YTRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby91ZGxmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdWRsZmIuYwpAQCAtMTIzMyw4ICsxMjMzLDEyIEBACiAJCQlpZiAoZGxmYl9pc192YWxpZF9tb2RlKCZpbmZvLT5tb25zcGVjcy5tb2RlZGJbaV0sIGluZm8pKQogCQkJCWZiX2FkZF92aWRlb21vZGUoJmluZm8tPm1vbnNwZWNzLm1vZGVkYltpXSwKIAkJCQkJJmluZm8tPm1vZGVsaXN0KTsKLQkJCWVsc2UgLyogaWYgd2UndmUgcmVtb3ZlZCB0b3AvYmVzdCBtb2RlICovCi0JCQkJaW5mby0+bW9uc3BlY3MubWlzYyAmPSB+RkJfTUlTQ18xU1RfREVUQUlMOworCQkJZWxzZSB7CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJLyogaWYgd2UndmUgcmVtb3ZlZCB0b3AvYmVzdCBtb2RlICovCisJCQkJCWluZm8tPm1vbnNwZWNzLm1pc2MKKwkJCQkJCSY9IH5GQl9NSVNDXzFTVF9ERVRBSUw7CisJCQl9CiAJCX0KIAogCQlkZWZhdWx0X3Ztb2RlID0gZmJfZmluZF9iZXN0X2Rpc3BsYXkoJmluZm8tPm1vbnNwZWNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKaW5kZXggYTk5YmJlOC4uNTAxYjM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92ZXNhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCkBAIC0xNzUsNiArMTc1LDcgQEAKIAogc3RhdGljIHZvaWQgdmVzYWZiX2Rlc3Ryb3koc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlLCBpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jIGIvZHJpdmVycy92aWRlby92Z2ExNmZiLmMKaW5kZXggNTNiMmM1YS4uMzA1Yzk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMKKysrIGIvZHJpdmVycy92aWRlby92Z2ExNmZiLmMKQEAgLTEyNjUsOSArMTI2NSwxMSBAQAogCiBzdGF0aWMgdm9pZCB2Z2ExNmZiX2Rlc3Ryb3koc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGluZm8tPmRldmljZSwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCS8qIFhYWCB1bnNoYXJlIFZHQSByZWdpb25zICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKaW5kZXggYTIwMjE4Yy4uYmVhYzUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCisrKyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwpAQCAtMzk1LDEwICszOTUsOSBAQAogCXNwaW5fbG9ja19pbml0KCZpbmZvLT5kaXJ0eV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaW5mby0+cmVzaXplX2xvY2spOwogCi0JaW5mby0+ZmIgPSB2bWFsbG9jKGZiX3NpemUpOworCWluZm8tPmZiID0gdnphbGxvYyhmYl9zaXplKTsKIAlpZiAoaW5mby0+ZmIgPT0gTlVMTCkKIAkJZ290byBlcnJvcl9ub21lbTsKLQltZW1zZXQoaW5mby0+ZmIsIDAsIGZiX3NpemUpOwogCiAJaW5mby0+bnJfcGFnZXMgPSAoZmJfc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCmluZGV4IDBmMWRhNDUuLmUwNThhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYwpAQCAtNDAsOSArNDAsNiBAQAogCS8qIFdhaXRpbmcgZm9yIGhvc3QgdG8gYWNrIHRoZSBwYWdlcyB3ZSByZWxlYXNlZC4gKi8KIAlzdHJ1Y3QgY29tcGxldGlvbiBhY2tlZDsKIAotCS8qIERvIHdlIGhhdmUgdG8gdGVsbCBIb3N0ICpiZWZvcmUqIHdlIHJldXNlIHBhZ2VzPyAqLwotCWJvb2wgdGVsbF9ob3N0X2ZpcnN0OwotCiAJLyogVGhlIHBhZ2VzIHdlJ3ZlIHRvbGQgdGhlIEhvc3Qgd2UncmUgbm90IHVzaW5nLiAqLwogCXVuc2lnbmVkIGludCBudW1fcGFnZXM7CiAJc3RydWN0IGxpc3RfaGVhZCBwYWdlczsKQEAgLTE1MSwxMyArMTQ4LDE0IEBACiAJCXZiLT5udW1fcGFnZXMtLTsKIAl9CiAKLQlpZiAodmItPnRlbGxfaG9zdF9maXJzdCkgewotCQl0ZWxsX2hvc3QodmIsIHZiLT5kZWZsYXRlX3ZxKTsKLQkJcmVsZWFzZV9wYWdlc19ieV9wZm4odmItPnBmbnMsIHZiLT5udW1fcGZucyk7Ci0JfSBlbHNlIHsKLQkJcmVsZWFzZV9wYWdlc19ieV9wZm4odmItPnBmbnMsIHZiLT5udW1fcGZucyk7Ci0JCXRlbGxfaG9zdCh2YiwgdmItPmRlZmxhdGVfdnEpOwotCX0KKworCS8qCisJICogTm90ZSB0aGF0IGlmCisJICogdmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19CQUxMT09OX0ZfTVVTVF9URUxMX0hPU1QpOworCSAqIGlzIHRydWUsIHdlICpoYXZlKiB0byBkbyBpdCBpbiB0aGlzIG9yZGVyCisJICovCisJdGVsbF9ob3N0KHZiLCB2Yi0+ZGVmbGF0ZV92cSk7CisJcmVsZWFzZV9wYWdlc19ieV9wZm4odmItPnBmbnMsIHZiLT5udW1fcGZucyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfc3RhdChzdHJ1Y3QgdmlydGlvX2JhbGxvb24gKnZiLCBpbnQgaWR4LApAQCAtMzI1LDkgKzMyMyw2IEBACiAJCWdvdG8gb3V0X2RlbF92cXM7CiAJfQogCi0JdmItPnRlbGxfaG9zdF9maXJzdAotCQk9IHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fQkFMTE9PTl9GX01VU1RfVEVMTF9IT1NUKTsKLQogCXJldHVybiAwOwogCiBvdXRfZGVsX3ZxczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCmluZGV4IGIwMDQzZmIuLjY4YjkxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYwpAQCAtODIsNiArODIsOSBAQAogCS8qIEhvc3Qgc3VwcG9ydHMgaW5kaXJlY3QgYnVmZmVycyAqLwogCWJvb2wgaW5kaXJlY3Q7CiAKKwkvKiBIb3N0IHB1Ymxpc2hlcyBhdmFpbCBldmVudCBpZHggKi8KKwlib29sIGV2ZW50OworCiAJLyogTnVtYmVyIG9mIGZyZWUgYnVmZmVycyAqLwogCXVuc2lnbmVkIGludCBudW1fZnJlZTsKIAkvKiBIZWFkIG9mIGZyZWUgYnVmZmVyIGxpc3QuICovCkBAIC0yMzcsMTggKzI0MCwyMiBAQAogdm9pZCB2aXJ0cXVldWVfa2ljayhzdHJ1Y3QgdmlydHF1ZXVlICpfdnEpCiB7CiAJc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEgPSB0b192dnEoX3ZxKTsKKwl1MTYgbmV3LCBvbGQ7CiAJU1RBUlRfVVNFKHZxKTsKIAkvKiBEZXNjcmlwdG9ycyBhbmQgYXZhaWxhYmxlIGFycmF5IG5lZWQgdG8gYmUgc2V0IGJlZm9yZSB3ZSBleHBvc2UgdGhlCiAJICogbmV3IGF2YWlsYWJsZSBhcnJheSBlbnRyaWVzLiAqLwogCXZpcnRpb193bWIoKTsKIAotCXZxLT52cmluZy5hdmFpbC0+aWR4ICs9IHZxLT5udW1fYWRkZWQ7CisJb2xkID0gdnEtPnZyaW5nLmF2YWlsLT5pZHg7CisJbmV3ID0gdnEtPnZyaW5nLmF2YWlsLT5pZHggPSBvbGQgKyB2cS0+bnVtX2FkZGVkOwogCXZxLT5udW1fYWRkZWQgPSAwOwogCiAJLyogTmVlZCB0byB1cGRhdGUgYXZhaWwgaW5kZXggYmVmb3JlIGNoZWNraW5nIGlmIHdlIHNob3VsZCBub3RpZnkgKi8KIAl2aXJ0aW9fbWIoKTsKIAotCWlmICghKHZxLT52cmluZy51c2VkLT5mbGFncyAmIFZSSU5HX1VTRURfRl9OT19OT1RJRlkpKQorCWlmICh2cS0+ZXZlbnQgPworCSAgICB2cmluZ19uZWVkX2V2ZW50KHZyaW5nX2F2YWlsX2V2ZW50KCZ2cS0+dnJpbmcpLCBuZXcsIG9sZCkgOgorCSAgICAhKHZxLT52cmluZy51c2VkLT5mbGFncyAmIFZSSU5HX1VTRURfRl9OT19OT1RJRlkpKQogCQkvKiBQcm9kIG90aGVyIHNpZGUgdG8gdGVsbCBpdCBhYm91dCBjaGFuZ2VzLiAqLwogCQl2cS0+bm90aWZ5KCZ2cS0+dnEpOwogCkBAIC0zMjQsNiArMzMxLDE0IEBACiAJcmV0ID0gdnEtPmRhdGFbaV07CiAJZGV0YWNoX2J1Zih2cSwgaSk7CiAJdnEtPmxhc3RfdXNlZF9pZHgrKzsKKwkvKiBJZiB3ZSBleHBlY3QgYW4gaW50ZXJydXB0IGZvciB0aGUgbmV4dCBlbnRyeSwgdGVsbCBob3N0CisJICogYnkgd3JpdGluZyBldmVudCBpbmRleCBhbmQgZmx1c2ggb3V0IHRoZSB3cml0ZSBiZWZvcmUKKwkgKiB0aGUgcmVhZCBpbiB0aGUgbmV4dCBnZXRfYnVmIGNhbGwuICovCisJaWYgKCEodnEtPnZyaW5nLmF2YWlsLT5mbGFncyAmIFZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUKSkgeworCQl2cmluZ191c2VkX2V2ZW50KCZ2cS0+dnJpbmcpID0gdnEtPmxhc3RfdXNlZF9pZHg7CisJCXZpcnRpb19tYigpOworCX0KKwogCUVORF9VU0UodnEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0zNDUsNyArMzYwLDExIEBACiAKIAkvKiBXZSBvcHRpbWlzdGljYWxseSB0dXJuIGJhY2sgb24gaW50ZXJydXB0cywgdGhlbiBjaGVjayBpZiB0aGVyZSB3YXMKIAkgKiBtb3JlIHRvIGRvLiAqLworCS8qIERlcGVuZGluZyBvbiB0aGUgVklSVElPX1JJTkdfRl9FVkVOVF9JRFggZmVhdHVyZSwgd2UgbmVlZCB0bworCSAqIGVpdGhlciBjbGVhciB0aGUgZmxhZ3MgYml0IG9yIHBvaW50IHRoZSBldmVudCBpbmRleCBhdCB0aGUgbmV4dAorCSAqIGVudHJ5LiBBbHdheXMgZG8gYm90aCB0byBrZWVwIGNvZGUgc2ltcGxlLiAqLwogCXZxLT52cmluZy5hdmFpbC0+ZmxhZ3MgJj0gflZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUOworCXZyaW5nX3VzZWRfZXZlbnQoJnZxLT52cmluZykgPSB2cS0+bGFzdF91c2VkX2lkeDsKIAl2aXJ0aW9fbWIoKTsKIAlpZiAodW5saWtlbHkobW9yZV91c2VkKHZxKSkpIHsKIAkJRU5EX1VTRSh2cSk7CkBAIC0zNTcsNiArMzc2LDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXJ0cXVldWVfZW5hYmxlX2NiKTsKIAorYm9vbCB2aXJ0cXVldWVfZW5hYmxlX2NiX2RlbGF5ZWQoc3RydWN0IHZpcnRxdWV1ZSAqX3ZxKQoreworCXN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxID0gdG9fdnZxKF92cSk7CisJdTE2IGJ1ZnM7CisKKwlTVEFSVF9VU0UodnEpOworCisJLyogV2Ugb3B0aW1pc3RpY2FsbHkgdHVybiBiYWNrIG9uIGludGVycnVwdHMsIHRoZW4gY2hlY2sgaWYgdGhlcmUgd2FzCisJICogbW9yZSB0byBkby4gKi8KKwkvKiBEZXBlbmRpbmcgb24gdGhlIFZJUlRJT19SSU5HX0ZfVVNFRF9FVkVOVF9JRFggZmVhdHVyZSwgd2UgbmVlZCB0bworCSAqIGVpdGhlciBjbGVhciB0aGUgZmxhZ3MgYml0IG9yIHBvaW50IHRoZSBldmVudCBpbmRleCBhdCB0aGUgbmV4dAorCSAqIGVudHJ5LiBBbHdheXMgZG8gYm90aCB0byBrZWVwIGNvZGUgc2ltcGxlLiAqLworCXZxLT52cmluZy5hdmFpbC0+ZmxhZ3MgJj0gflZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUOworCS8qIFRPRE86IHR1bmUgdGhpcyB0aHJlc2hvbGQgKi8KKwlidWZzID0gKHUxNikodnEtPnZyaW5nLmF2YWlsLT5pZHggLSB2cS0+bGFzdF91c2VkX2lkeCkgKiAzIC8gNDsKKwl2cmluZ191c2VkX2V2ZW50KCZ2cS0+dnJpbmcpID0gdnEtPmxhc3RfdXNlZF9pZHggKyBidWZzOworCXZpcnRpb19tYigpOworCWlmICh1bmxpa2VseSgodTE2KSh2cS0+dnJpbmcudXNlZC0+aWR4IC0gdnEtPmxhc3RfdXNlZF9pZHgpID4gYnVmcykpIHsKKwkJRU5EX1VTRSh2cSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlFTkRfVVNFKHZxKTsKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpcnRxdWV1ZV9lbmFibGVfY2JfZGVsYXllZCk7CisKIHZvaWQgKnZpcnRxdWV1ZV9kZXRhY2hfdW51c2VkX2J1ZihzdHJ1Y3QgdmlydHF1ZXVlICpfdnEpCiB7CiAJc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEgPSB0b192dnEoX3ZxKTsKQEAgLTQzOCw2ICs0ODQsNyBAQAogI2VuZGlmCiAKIAl2cS0+aW5kaXJlY3QgPSB2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX1JJTkdfRl9JTkRJUkVDVF9ERVNDKTsKKwl2cS0+ZXZlbnQgPSB2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpOwogCiAJLyogTm8gY2FsbGJhY2s/ICBUZWxsIG90aGVyIHNpZGUgbm90IHRvIGJvdGhlciB1cy4gKi8KIAlpZiAoIWNhbGxiYWNrKQpAQCAtNDcyLDYgKzUxOSw4IEBACiAJCXN3aXRjaCAoaSkgewogCQljYXNlIFZJUlRJT19SSU5HX0ZfSU5ESVJFQ1RfREVTQzoKIAkJCWJyZWFrOworCQljYXNlIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYOgorCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBXZSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgYml0LiAqLwogCQkJY2xlYXJfYml0KGksIHZkZXYtPmZlYXR1cmVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKaW5kZXggMDBkNjE1ZC4uOTc5ZDZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKQEAgLTQyLDcgKzQyLDcgQEAKIAogY29uZmlnIFcxX01BU1RFUl9EUzFXTQogCXRyaXN0YXRlICJNYXhpbSBEUzFXTSAxLXdpcmUgYnVzbWFzdGVyIgotCWRlcGVuZHMgb24gVzEKKwlkZXBlbmRzIG9uIFcxICYmIEdFTkVSSUNfSEFSRElSUVMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgRFMxV00gMS13aXJlIGRyaXZlciwgc3VjaCBhcyB0aGF0CiAJICBpbiBIUCBpUEFRIGRldmljZXMgbGlrZSBoNXh4eCwgaDIyMDAsIGFuZCBBU0lDMy1iYXNlZCBsaWtlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMxd20uYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jCmluZGV4IGFkNTc1OTMuLmEwYzg5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jCkBAIC0xMDksNiArMTA5LDcgQEAKIAkvKiBieXRlIHRvIHdyaXRlIHRoYXQgbWFrZXMgYWxsIGludHIgZGlzYWJsZWQsICovCiAJLyogY29uc2lkZXJpbmcgYWN0aXZlX3N0YXRlIChJQVMpIChvcHRpbWl6YXRpb24pICovCiAJdTggICAgICAgaW50X2VuX3JlZ19ub25lOworCXVuc2lnbmVkIGludCByZXNldF9yZWNvdmVyX2RlbGF5OyAvKiBzZWUgZHMxd20uaCAqLwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGRzMXdtX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBkczF3bV9kYXRhICpkczF3bV9kYXRhLCB1MzIgcmVnLApAQCAtMTg3LDYgKzE4OCw5IEBACiAJCXJldHVybiAxOwogCX0KIAorCWlmIChkczF3bV9kYXRhLT5yZXNldF9yZWNvdmVyX2RlbGF5KQorCQltc2xlZXAoZHMxd21fZGF0YS0+cmVzZXRfcmVjb3Zlcl9kZWxheSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDkwLDYgKzQ5NCw3IEBACiAJfQogCWRzMXdtX2RhdGEtPmlycSA9IHJlcy0+c3RhcnQ7CiAJZHMxd21fZGF0YS0+aW50X2VuX3JlZ19ub25lID0gKHBsYXQtPmFjdGl2ZV9oaWdoID8gRFMxV01fSU5URU5fSUFTIDogMCk7CisJZHMxd21fZGF0YS0+cmVzZXRfcmVjb3Zlcl9kZWxheSA9IHBsYXQtPnJlc2V0X3JlY292ZXJfZGVsYXk7CiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFKQogCQlpcnFfc2V0X2lycV90eXBlKGRzMXdtX2RhdGEtPmlycSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDAyMmY5ZWIuLjIxZDgxNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTUzNSw4ICs1MzUsNyBAQAogCiBjb25maWcgSU5URUxfU0NVX1dBVENIRE9HCiAJYm9vbCAiSW50ZWwgU0NVIFdhdGNoZG9nIGZvciBNb2JpbGUgUGxhdGZvcm1zIgotCWRlcGVuZHMgb24gV0FUQ0hET0cKLQlkZXBlbmRzIG9uIElOVEVMX1NDVV9JUEMKKwlkZXBlbmRzIG9uIFg4Nl9NUlNUCiAJLS0taGVscC0tLQogCSAgSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgd2F0Y2hkb2cgdGltZSBidWlsdCBpbnRvIHRoZSBJbnRlbCBTQ1UKIAkgIGZvciBJbnRlbCBNb2JpbGUgUGxhdGZvcm1zLgpAQCAtNjAwLDggKzU5OSw3IEBACiAKIGNvbmZpZyBIUF9XQVRDSERPRwogCXRyaXN0YXRlICJIUCBQcm9MaWFudCBpTE8yKyBIYXJkd2FyZSBXYXRjaGRvZyBUaW1lciIKLQlkZXBlbmRzIG9uIFg4NgotCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gWDg2ICYmIFBDSQogCWhlbHAKIAkgIEEgc29mdHdhcmUgbW9uaXRvcmluZyB3YXRjaGRvZyBhbmQgTk1JIHNvdXJjaW5nIGRyaXZlci4gVGhpcyBkcml2ZXIKIAkgIHdpbGwgZGV0ZWN0IGxvY2t1cHMgYW5kIHByb3ZpZGUgYSBzdGFjayB0cmFjZS4gVGhpcyBpcyBhIGRyaXZlciB0aGF0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMKaW5kZXggNzUwYmM1Mi4uNGNhNWQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9hdDMyYXA3MDB4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYwpAQCAtNDQ4LDcgKzQ0OCw3IEBACiB9CiBtb2R1bGVfZXhpdChhdDMyX3dkdF9leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGNlZ3R2ZWR0QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGVndHZlZHRAc2FtZnVuZGV0Lm5vPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJXYXRjaGRvZyBkcml2ZXIgZm9yIEF0bWVsIEFUMzJBUDcwMFgiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZ2VmX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9nZWZfd2R0LmMKaW5kZXggMjlhN2NkNC4uYjE0NjA4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9nZWZfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9nZWZfd2R0LmMKQEAgLTMyOSw0ICszMjksNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJHRSB3YXRjaGRvZyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06IGdlZl93ZHQiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Z2VmX3dkdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pbnRlbF9zY3Vfd2F0Y2hkb2cuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMKaW5kZXggOTE5YmRkMS4uYmE0Mzg2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pbnRlbF9zY3Vfd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jCkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZmkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCmluZGV4IDE0NzlkYzQuLjA0MzBlMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYwpAQCAtNjYsMjMgKzY2LDE4IEBACiAJaW50IGRlZmF1bHRfdGlja3M7CiAJdW5zaWduZWQgbG9uZyBpbnVzZTsKIAl1bnNpZ25lZCBncGlvOwotCWludCBnc3RhdGU7CisJdW5zaWduZWQgaW50IGdzdGF0ZTsKIH0gbXR4MV93ZHRfZGV2aWNlOwogCiBzdGF0aWMgdm9pZCBtdHgxX3dkdF90cmlnZ2VyKHVuc2lnbmVkIGxvbmcgdW51c2VkKQogewotCXUzMiB0bXA7Ci0KIAlzcGluX2xvY2soJm10eDFfd2R0X2RldmljZS5sb2NrKTsKIAlpZiAobXR4MV93ZHRfZGV2aWNlLnJ1bm5pbmcpCiAJCXRpY2tzLS07CiAKIAkvKiB0b2dnbGUgd2R0IGdwaW8gKi8KLQltdHgxX3dkdF9kZXZpY2UuZ3N0YXRlID0gfm10eDFfd2R0X2RldmljZS5nc3RhdGU7Ci0JaWYgKG10eDFfd2R0X2RldmljZS5nc3RhdGUpCi0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMSk7Ci0JZWxzZQotCQlncGlvX2RpcmVjdGlvbl9pbnB1dChtdHgxX3dkdF9kZXZpY2UuZ3Bpbyk7CisJbXR4MV93ZHRfZGV2aWNlLmdzdGF0ZSA9ICFtdHgxX3dkdF9kZXZpY2UuZ3N0YXRlOworCWdwaW9fc2V0X3ZhbHVlKG10eDFfd2R0X2RldmljZS5ncGlvLCBtdHgxX3dkdF9kZXZpY2UuZ3N0YXRlKTsKIAogCWlmIChtdHgxX3dkdF9kZXZpY2UucXVldWUgJiYgdGlja3MpCiAJCW1vZF90aW1lcigmbXR4MV93ZHRfZGV2aWNlLnRpbWVyLCBqaWZmaWVzICsgTVRYMV9XRFRfSU5URVJWQUwpOwpAQCAtMTA1LDcgKzEwMCw3IEBACiAJaWYgKCFtdHgxX3dkdF9kZXZpY2UucXVldWUpIHsKIAkJbXR4MV93ZHRfZGV2aWNlLnF1ZXVlID0gMTsKIAkJbXR4MV93ZHRfZGV2aWNlLmdzdGF0ZSA9IDE7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKG10eDFfd2R0X2RldmljZS5ncGlvLCAxKTsKIAkJbW9kX3RpbWVyKCZtdHgxX3dkdF9kZXZpY2UudGltZXIsIGppZmZpZXMgKyBNVFgxX1dEVF9JTlRFUlZBTCk7CiAJfQogCW10eDFfd2R0X2RldmljZS5ydW5uaW5nKys7CkBAIC0xMjAsNyArMTE1LDcgQEAKIAlpZiAobXR4MV93ZHRfZGV2aWNlLnF1ZXVlKSB7CiAJCW10eDFfd2R0X2RldmljZS5xdWV1ZSA9IDA7CiAJCW10eDFfd2R0X2RldmljZS5nc3RhdGUgPSAwOwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobXR4MV93ZHRfZGV2aWNlLmdwaW8sIDApOworCQlncGlvX3NldF92YWx1ZShtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMCk7CiAJfQogCXRpY2tzID0gbXR4MV93ZHRfZGV2aWNlLmRlZmF1bHRfdGlja3M7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXR4MV93ZHRfZGV2aWNlLmxvY2ssIGZsYWdzKTsKQEAgLTIxNCw2ICsyMDksMTIgQEAKIAlpbnQgcmV0OwogCiAJbXR4MV93ZHRfZGV2aWNlLmdwaW8gPSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKG10eDFfd2R0X2RldmljZS5ncGlvLAorCQkJCUdQSU9GX09VVF9JTklUX0hJR0gsICJtdHgxLXdkdCIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGdwaW8iKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlzcGluX2xvY2tfaW5pdCgmbXR4MV93ZHRfZGV2aWNlLmxvY2spOwogCWluaXRfY29tcGxldGlvbigmbXR4MV93ZHRfZGV2aWNlLnN0b3ApOwpAQCAtMjM5LDExICsyNDAsMTMgQEAKIAkJbXR4MV93ZHRfZGV2aWNlLnF1ZXVlID0gMDsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmbXR4MV93ZHRfZGV2aWNlLnN0b3ApOwogCX0KKworCWdwaW9fZnJlZShtdHgxX3dkdF9kZXZpY2UuZ3Bpbyk7CiAJbWlzY19kZXJlZ2lzdGVyKCZtdHgxX3dkdF9taXNjKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXR4MV93ZHQgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdHgxX3dkdF9kcml2ZXIgPSB7CiAJLnByb2JlID0gbXR4MV93ZHRfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG10eDFfd2R0X3JlbW92ZSksCiAJLmRyaXZlci5uYW1lID0gIm10eDEtd2R0IiwKQEAgLTI1MiwxMiArMjU1LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG10eDFfd2R0X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtdHgxX3dkdCk7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXR4MV93ZHRfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG10eDFfd2R0X2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXR4MV93ZHQpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdHgxX3dkdF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChtdHgxX3dkdF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd204MzF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKaW5kZXggOGM0YjJkNS4uODcxY2FlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKQEAgLTMyMCw2ICszMjAsMTEgQEAKIAlzdHJ1Y3Qgd204MzF4X3dhdGNoZG9nX3BkYXRhICpwZGF0YTsKIAlpbnQgcmVnLCByZXQ7CiAKKwlpZiAod204MzF4KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIndtODMxeCB3YXRjaGRvZyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwogCXdtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAogCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9XQVRDSERPRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMuYyBiL2RyaXZlcnMveGVuL2V2ZW50cy5jCmluZGV4IDNmZjgyMmIuLjMwZGY4NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy5jCkBAIC0zOTUsOSArMzk1LDkgQEAKIHN0YXRpYyB2b2lkIHhlbl9pcnFfaW5pdCh1bnNpZ25lZCBpcnEpCiB7CiAJc3RydWN0IGlycV9pbmZvICppbmZvOworI2lmZGVmIENPTkZJR19TTVAKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCi0jaWZkZWYgQ09ORklHX1NNUAogCS8qIEJ5IGRlZmF1bHQgYWxsIGV2ZW50IGNoYW5uZWxzIG5vdGlmeSBDUFUjMC4gKi8KIAljcHVtYXNrX2NvcHkoZGVzYy0+aXJxX2RhdGEuYWZmaW5pdHksIGNwdW1hc2tfb2YoMCkpOwogI2VuZGlmCkBAIC02MjYsNiArNjI2LDkgQEAKICAqCiAgKiBOb3RlOiBXZSBkb24ndCBhc3NpZ24gYW4gZXZlbnQgY2hhbm5lbCB1bnRpbCB0aGUgaXJxIGFjdHVhbGx5IHN0YXJ0ZWQKICAqIHVwLiAgUmV0dXJuIGFuIGV4aXN0aW5nIGlycSBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBvbmUgZm9yIHRoZSBnc2kuCisgKgorICogU2hhcmVhYmxlIGltcGxpZXMgbGV2ZWwgdHJpZ2dlcmVkLCBub3Qgc2hhcmVhYmxlIGltcGxpZXMgZWRnZQorICogdHJpZ2dlcmVkIGhlcmUuCiAgKi8KIGludCB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEodW5zaWduZWQgZ3NpLAogCQkJICAgICB1bnNpZ25lZCBwaXJxLCBpbnQgc2hhcmVhYmxlLCBjaGFyICpuYW1lKQpAQCAtNjY0LDE2ICs2NjcsMTMgQEAKIAogCXBpcnFfcXVlcnlfdW5tYXNrKGlycSk7CiAJLyogV2UgdHJ5IHRvIHVzZSB0aGUgaGFuZGxlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzZW1hbnRpYyBmb3IgdGhlCi0JICogdHlwZSBvZiBpbnRlcnJ1cHQ6IGlmIHRoZSBpbnRlcnJ1cHQgZG9lc24ndCBuZWVkIGFuIGVvaQotCSAqIChwaXJxX25lZWRzX2VvaSByZXR1cm5zIGZhbHNlKSwgd2UgdHJlYXQgaXQgbGlrZSBhbiBlZGdlCi0JICogdHJpZ2dlcmVkIGludGVycnVwdCBzbyB3ZSB1c2UgaGFuZGxlX2VkZ2VfaXJxLgotCSAqIEFzIGEgbWF0dGVyIG9mIGZhY3QgdGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB0aGUgY29ycmVzcG9uZGluZwotCSAqIHBoeXNpY2FsIGludGVycnVwdCBpcyBlZGdlIHRyaWdnZXJlZCBvciBhbiBtc2kuCisJICogdHlwZSBvZiBpbnRlcnJ1cHQ6IGlmIHRoZSBpbnRlcnJ1cHQgaXMgYW4gZWRnZSB0cmlnZ2VyZWQKKwkgKiBpbnRlcnJ1cHQgd2UgdXNlIGhhbmRsZV9lZGdlX2lycS4KIAkgKgotCSAqIE9uIHRoZSBvdGhlciBoYW5kIGlmIHRoZSBpbnRlcnJ1cHQgbmVlZHMgYW4gZW9pIChwaXJxX25lZWRzX2VvaQotCSAqIHJldHVybnMgdHJ1ZSkgd2UgdHJlYXQgaXQgbGlrZSBhIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHQgc28gd2UKLQkgKiB1c2UgaGFuZGxlX2Zhc3Rlb2lfaXJxIGxpa2UgdGhlIG5hdGl2ZSBjb2RlIGRvZXMgZm9yIHRoaXMga2luZCBvZgorCSAqIE9uIHRoZSBvdGhlciBoYW5kIGlmIHRoZSBpbnRlcnJ1cHQgaXMgbGV2ZWwgdHJpZ2dlcmVkIHdlIHVzZQorCSAqIGhhbmRsZV9mYXN0ZW9pX2lycSBsaWtlIHRoZSBuYXRpdmUgY29kZSBkb2VzIGZvciB0aGlzIGtpbmQgb2YKIAkgKiBpbnRlcnJ1cHRzLgorCSAqCiAJICogRGVwZW5kaW5nIG9uIHRoZSBYZW4gdmVyc2lvbiwgcGlycV9uZWVkc19lb2kgbWlnaHQgcmV0dXJuIHRydWUKIAkgKiBub3Qgb25seSBmb3IgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYnV0IGZvciBlZGdlIHRyaWdnZXJlZAogCSAqIGludGVycnVwdHMgdG9vLiBJbiBhbnkgY2FzZSBYZW4gYWx3YXlzIGhvbm9ycyB0aGUgZW9pIG1lY2hhbmlzbSwKQEAgLTY4MSw3ICs2ODEsNyBAQAogCSAqIGhhc24ndCByZWNlaXZlZCBhbiBlb2kgeWV0LiBUaGVyZWZvcmUgdXNpbmcgdGhlIGZhc3Rlb2kgaGFuZGxlcgogCSAqIGlzIHRoZSByaWdodCBjaG9pY2UgZWl0aGVyIHdheS4KIAkgKi8KLQlpZiAocGlycV9uZWVkc19lb2koaXJxKSkKKwlpZiAoc2hhcmVhYmxlKQogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZ4ZW5fcGlycV9jaGlwLAogCQkJCWhhbmRsZV9mYXN0ZW9pX2lycSwgbmFtZSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYyBiL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMKaW5kZXggNjVlYTIxYS4uNmU4YzE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYworKysgYi9kcml2ZXJzL3hlbi9zd2lvdGxiLXhlbi5jCkBAIC0xNDcsOSArMTQ3LDE1IEBACiB7CiAJdW5zaWduZWQgbG9uZyBieXRlczsKIAlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBucl90Ymw7CiAKLQl4ZW5faW9fdGxiX25zbGFicyA9ICg2NCAqIDEwMjQgKiAxMDI0ID4+IElPX1RMQl9TSElGVCk7Ci0JeGVuX2lvX3RsYl9uc2xhYnMgPSBBTElHTih4ZW5faW9fdGxiX25zbGFicywgSU9fVExCX1NFR1NJWkUpOworCW5yX3RibCA9IHN3aW9sdGJfbnJfdGJsKCk7CisJaWYgKG5yX3RibCkKKwkJeGVuX2lvX3RsYl9uc2xhYnMgPSBucl90Ymw7CisJZWxzZSB7CisJCXhlbl9pb190bGJfbnNsYWJzID0gKDY0ICogMTAyNCAqIDEwMjQgPj4gSU9fVExCX1NISUZUKTsKKwkJeGVuX2lvX3RsYl9uc2xhYnMgPSBBTElHTih4ZW5faW9fdGxiX25zbGFicywgSU9fVExCX1NFR1NJWkUpOworCX0KIAogCWJ5dGVzID0geGVuX2lvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUOwogCmRpZmYgLS1naXQgYS9maXJtd2FyZS9NYWtlZmlsZSBiL2Zpcm13YXJlL01ha2VmaWxlCmluZGV4IDBkMTVhM2QuLjVmNDNiZmIgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlL01ha2VmaWxlCisrKyBiL2Zpcm13YXJlL01ha2VmaWxlCkBAIC04Miw2ICs4Miw3IEBACiBmdy1zaGlwcGVkLSQoQ09ORklHX1BDTUNJQV9TTUM5MUM5MikgKz0gb3NpdGVjaC9YaWxpbng3T0QuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1NDU0lfQURWQU5TWVMpICs9IGFkdmFuc3lzL21jb2RlLmJpbiBhZHZhbnN5cy8zOEMxNjAwLmJpbiBcCiAJCQkJICAgICAgYWR2YW5zeXMvMzU1MC5iaW4gYWR2YW5zeXMvMzhDMDgwMC5iaW4KK2Z3LXNoaXBwZWQtJChDT05GSUdfU0NTSV9JU0NJKSArPSBpc2NpL2lzY2lfZmlybXdhcmUuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1NDU0lfUUxPR0lDXzEyODApICs9IHFsb2dpYy8xMDQwLmJpbiBxbG9naWMvMTI4MC5iaW4gXAogCQkJCQkgcWxvZ2ljLzEyMTYwLmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19TQ1NJX1FMT0dJQ1BUSSkgKz0gcWxvZ2ljL2lzcDEwMDAuYmluCmRpZmYgLS1naXQgYS9maXJtd2FyZS9pc2NpL2lzY2lfZmlybXdhcmUuYmluLmloZXggYi9maXJtd2FyZS9pc2NpL2lzY2lfZmlybXdhcmUuYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2NjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2lzY2kvaXNjaV9maXJtd2FyZS5iaW4uaWhleApAQCAtMCwwICsxLDE2IEBACis6MTAwMDAwMDA0OTUzNDM1NTRGNDU0RDQyRTgwMDE4MTAwMDAyMDAwMDg3Cis6MTAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDAwMDAwMDAwMERFCis6MTAwMDIwMDBGRkZGQ0Y1RjAxMDAwMDAwMDhERDBCMDAwMEZDMEYwMEE4Cis6MTAwMDMwMDAwOTdDMEIwMDZFRkMwQTAwRkZGRkNGNUYwMTAwMDAwMDhGCis6MTAwMDQwMDAwOEREMEIwMDAwRkMwRjAwMDk3QzBCMDA2RUZDMEEwMEIxCis6MTAwMDUwMDBGRkZGQ0Y1RjAxMDAwMDAwMDhERDBCMDAwMEZDMEYwMDc4Cis6MTAwMDYwMDAwOTdDMEIwMDZFRkMwQTAwRkZGRkNGNUYwMTAwMDAwMDVGCis6MTAwMDcwMDAwOEREMEIwMDAwRkMwRjAwMDk3QzBCMDA2RUZDMEEwMDgxCis6MTAwMDgwMDAwMTAxMDAwMDAwMDAwMDAwRkZGRkNGNUYwMjAwMDAwMDQwCis6MTAwMDkwMDAwOEREMEIwMDAwRkMwRjAwMDk3QzBCMDA2RUZDMEEwMDYxCis6MTAwMEEwMDBGRkZGQ0Y1RjAyMDAwMDAwMDhERDBCMDAwMEZDMEYwMDI3Cis6MTAwMEIwMDAwOTdDMEIwMDZFRkMwQTAwRkZGRkNGNUYwMjAwMDAwMDBFCis6MTAwMEMwMDAwOEREMEIwMDAwRkMwRjAwMDk3QzBCMDA2RUZDMEEwMDMxCis6MTAwMEQwMDBGRkZGQ0Y1RjAyMDAwMDAwMDhERDBCMDAwMEZDMEYwMEY3Cis6MDgwMEUwMDAwOTdDMEIwMDZFRkMwQTAwMTQKKzowMDAwMDAwMUZGCmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggMjBjMTA2Zi4uMWIwYjE5NSAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtNTg0LDExICs1ODQsMTEgQEAKIAogc3VjY2VzczoKIAlkX2FkZChkZW50cnksIGlub2RlKTsKLQlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JWxsdSB9IiwKKwlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JXUgfSIsCiAJICAgICAgIGZpZC52bm9kZSwKIAkgICAgICAgZmlkLnVuaXF1ZSwKIAkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX2lubywKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZW50cnktPmRfaW5vZGUtPmlfdmVyc2lvbik7CisJICAgICAgIGRlbnRyeS0+ZF9pbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtNjcxLDEwICs2NzEsMTAgQEAKIAkJICogYmVlbiBkZWxldGVkIGFuZCByZXBsYWNlZCwgYW5kIHRoZSBvcmlnaW5hbCB2bm9kZSBJRCBoYXMKIAkJICogYmVlbiByZXVzZWQgKi8KIAkJaWYgKGZpZC51bmlxdWUgIT0gdm5vZGUtPmZpZC51bmlxdWUpIHsKLQkJCV9kZWJ1ZygiJXM6IGZpbGUgZGVsZXRlZCAodXEgJXUgLT4gJXUgSTolbGx1KSIsCisJCQlfZGVidWcoIiVzOiBmaWxlIGRlbGV0ZWQgKHVxICV1IC0+ICV1IEk6JXUpIiwKIAkJCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCBmaWQudW5pcXVlLAogCQkJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGVudHJ5LT5kX2lub2RlLT5pX3ZlcnNpb24pOworCQkJICAgICAgIGRlbnRyeS0+ZF9pbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwogCQkJc2V0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncyk7CiAJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZzY2xpZW50LmMgYi9mcy9hZnMvZnNjbGllbnQuYwppbmRleCA0YmQwMjE4Li4zNDZlMzI4IDEwMDY0NAotLS0gYS9mcy9hZnMvZnNjbGllbnQuYworKysgYi9mcy9hZnMvZnNjbGllbnQuYwpAQCAtODksNyArODksNyBAQAogCQkJaV9zaXplX3dyaXRlKCZ2bm9kZS0+dmZzX2lub2RlLCBzaXplKTsKIAkJCXZub2RlLT52ZnNfaW5vZGUuaV91aWQgPSBzdGF0dXMtPm93bmVyOwogCQkJdm5vZGUtPnZmc19pbm9kZS5pX2dpZCA9IHN0YXR1cy0+Z3JvdXA7Ci0JCQl2bm9kZS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IHZub2RlLT5maWQudW5pcXVlOworCQkJdm5vZGUtPnZmc19pbm9kZS5pX2dlbmVyYXRpb24gPSB2bm9kZS0+ZmlkLnVuaXF1ZTsKIAkJCXZub2RlLT52ZnNfaW5vZGUuaV9ubGluayA9IHN0YXR1cy0+bmxpbms7CiAKIAkJCW1vZGUgPSB2bm9kZS0+dmZzX2lub2RlLmlfbW9kZTsKQEAgLTEwMiw2ICsxMDIsNyBAQAogCQl2bm9kZS0+dmZzX2lub2RlLmlfY3RpbWUudHZfc2VjCT0gc3RhdHVzLT5tdGltZV9zZXJ2ZXI7CiAJCXZub2RlLT52ZnNfaW5vZGUuaV9tdGltZQk9IHZub2RlLT52ZnNfaW5vZGUuaV9jdGltZTsKIAkJdm5vZGUtPnZmc19pbm9kZS5pX2F0aW1lCT0gdm5vZGUtPnZmc19pbm9kZS5pX2N0aW1lOworCQl2bm9kZS0+dmZzX2lub2RlLmlfdmVyc2lvbgk9IGRhdGFfdmVyc2lvbjsKIAl9CiAKIAlleHBlY3RlZF92ZXJzaW9uID0gc3RhdHVzLT5kYXRhX3ZlcnNpb247CmRpZmYgLS1naXQgYS9mcy9hZnMvaW5vZGUuYyBiL2ZzL2Fmcy9pbm9kZS5jCmluZGV4IGRiNjZjNTIuLjBmZGFiNmUgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbm9kZS5jCisrKyBiL2ZzL2Fmcy9pbm9kZS5jCkBAIC03NSw3ICs3NSw4IEBACiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYwk9IDA7CiAJaW5vZGUtPmlfYXRpbWUJCT0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZTsKIAlpbm9kZS0+aV9ibG9ja3MJCT0gMDsKLQlpbm9kZS0+aV92ZXJzaW9uCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbgk9IHZub2RlLT5maWQudW5pcXVlOworCWlub2RlLT5pX3ZlcnNpb24JPSB2bm9kZS0+c3RhdHVzLmRhdGFfdmVyc2lvbjsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcwk9ICZhZnNfZnNfYW9wczsKIAogCS8qIGNoZWNrIHRvIHNlZSB3aGV0aGVyIGEgc3ltYm9saWMgbGluayBpcyByZWFsbHkgYSBtb3VudHBvaW50ICovCkBAIC0xMDAsNyArMTAxLDcgQEAKIAlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSAqZGF0YSA9IG9wYXF1ZTsKIAogCXJldHVybiBpbm9kZS0+aV9pbm8gPT0gZGF0YS0+ZmlkLnZub2RlICYmCi0JCWlub2RlLT5pX3ZlcnNpb24gPT0gZGF0YS0+ZmlkLnVuaXF1ZTsKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9PSBkYXRhLT5maWQudW5pcXVlOwogfQogCiAvKgpAQCAtMTIyLDcgKzEyMyw3IEBACiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CiAKIAlpbm9kZS0+aV9pbm8gPSBkYXRhLT5maWQudm5vZGU7Ci0JaW5vZGUtPmlfdmVyc2lvbiA9IGRhdGEtPmZpZC51bmlxdWU7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGRhdGEtPmZpZC51bmlxdWU7CiAJdm5vZGUtPmZpZCA9IGRhdGEtPmZpZDsKIAl2bm9kZS0+dm9sdW1lID0gZGF0YS0+dm9sdW1lOwogCkBAIC0zODAsOCArMzgxLDcgQEAKIAogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCi0JX2VudGVyKCJ7IGlubz0lbHUgdj0lbGx1IH0iLCBpbm9kZS0+aV9pbm8sCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5vZGUtPmlfdmVyc2lvbik7CisJX2VudGVyKCJ7IGlubz0lbHUgdj0ldSB9IiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAogCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmMgYi9mcy9hZnMvc3VwZXIuYwppbmRleCBmYjI0MGU4Li4zNTZkY2YwIDEwMDY0NAotLS0gYS9mcy9hZnMvc3VwZXIuYworKysgYi9mcy9hZnMvc3VwZXIuYwpAQCAtMzEsOCArMzEsOCBAQAogc3RhdGljIHZvaWQgYWZzX2lfaW5pdF9vbmNlKHZvaWQgKmZvbyk7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFmc19raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHN0cnVjdCBpbm9kZSAqYWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotc3RhdGljIHZvaWQgYWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyB2b2lkIGFmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogc3RhdGljIGludCBhZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CiAKQEAgLTQwLDcgKzQwLDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImFmcyIsCiAJLm1vdW50CQk9IGFmc19tb3VudCwKLQkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKKwkua2lsbF9zYgk9IGFmc19raWxsX3N1cGVyLAogCS5mc19mbGFncwk9IDAsCiB9OwogCkBAIC01MCw3ICs1MCw2IEBACiAJLmRyb3BfaW5vZGUJPSBhZnNfZHJvcF9pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IGFmc19kZXN0cm95X2lub2RlLAogCS5ldmljdF9pbm9kZQk9IGFmc19ldmljdF9pbm9kZSwKLQkucHV0X3N1cGVyCT0gYWZzX3B1dF9zdXBlciwKIAkuc2hvd19vcHRpb25zCT0gZ2VuZXJpY19zaG93X29wdGlvbnMsCiB9OwogCkBAIC0yODIsMTkgKzI4MSwyNSBAQAogICovCiBzdGF0aWMgaW50IGFmc190ZXN0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGFmc19tb3VudF9wYXJhbXMgKnBhcmFtcyA9IGRhdGE7CisJc3RydWN0IGFmc19zdXBlcl9pbmZvICphczEgPSBkYXRhOwogCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOwogCi0JcmV0dXJuIGFzLT52b2x1bWUgPT0gcGFyYW1zLT52b2x1bWU7CisJcmV0dXJuIGFzLT52b2x1bWUgPT0gYXMxLT52b2x1bWU7Cit9CisKK3N0YXRpYyBpbnQgYWZzX3NldF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXNiLT5zX2ZzX2luZm8gPSBkYXRhOworCXJldHVybiBzZXRfYW5vbl9zdXBlcihzYiwgTlVMTCk7CiB9CiAKIC8qCiAgKiBmaWxsIGluIHRoZSBzdXBlcmJsb2NrCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgc3RydWN0IGFmc19tb3VudF9wYXJhbXMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zID0gZGF0YTsKLQlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gTlVMTDsKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3QgYWZzX2ZpZCBmaWQ7CiAJc3RydWN0IGRlbnRyeSAqcm9vdCA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CkBAIC0zMDIsMjMgKzMwNywxMyBAQAogCiAJX2VudGVyKCIiKTsKIAotCS8qIGFsbG9jYXRlIGEgc3VwZXJibG9jayBpbmZvIHJlY29yZCAqLwotCWFzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFmc19zdXBlcl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhcykgewotCQlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYWZzX2dldF92b2x1bWUocGFyYW1zLT52b2x1bWUpOwotCWFzLT52b2x1bWUgPSBwYXJhbXMtPnZvbHVtZTsKLQogCS8qIGZpbGwgaW4gdGhlIHN1cGVyYmxvY2sgKi8KIAlzYi0+c19ibG9ja3NpemUJCT0gUEFHRV9DQUNIRV9TSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzCT0gUEFHRV9DQUNIRV9TSElGVDsKIAlzYi0+c19tYWdpYwkJPSBBRlNfRlNfTUFHSUM7CiAJc2ItPnNfb3AJCT0gJmFmc19zdXBlcl9vcHM7Ci0Jc2ItPnNfZnNfaW5mbwkJPSBhczsKIAlzYi0+c19iZGkJCT0gJmFzLT52b2x1bWUtPmJkaTsKKwlzdHJsY3B5KHNiLT5zX2lkLCBhcy0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwgc2l6ZW9mKHNiLT5zX2lkKSk7CiAKIAkvKiBhbGxvY2F0ZSB0aGUgcm9vdCBpbm9kZSBhbmQgZGVudHJ5ICovCiAJZmlkLnZpZAkJPSBhcy0+dm9sdW1lLT52aWQ7CkBAIC0zMjYsNyArMzIxLDcgQEAKIAlmaWQudW5pcXVlCT0gMTsKIAlpbm9kZSA9IGFmc19pZ2V0KHNiLCBwYXJhbXMtPmtleSwgJmZpZCwgTlVMTCwgTlVMTCk7CiAJaWYgKElTX0VSUihpbm9kZSkpCi0JCWdvdG8gZXJyb3JfaW5vZGU7CisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKIAogCWlmIChwYXJhbXMtPmF1dG9jZWxsKQogCQlzZXRfYml0KEFGU19WTk9ERV9BVVRPQ0VMTCwgJkFGU19GU19JKGlub2RlKS0+ZmxhZ3MpOwpAQCAtMzQyLDE2ICszMzcsOCBAQAogCV9sZWF2ZSgiID0gMCIpOwogCXJldHVybiAwOwogCi1lcnJvcl9pbm9kZToKLQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKLQlpbm9kZSA9IE5VTEw7CiBlcnJvcjoKIAlpcHV0KGlub2RlKTsKLQlhZnNfcHV0X3ZvbHVtZShhcy0+dm9sdW1lKTsKLQlrZnJlZShhcyk7Ci0KLQlzYi0+c19mc19pbmZvID0gTlVMTDsKLQogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC0zNjcsNiArMzU0LDcgQEAKIAlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sOwogCXN0cnVjdCBrZXkgKmtleTsKIAljaGFyICpuZXdfb3B0cyA9IGtzdHJkdXAob3B0aW9ucywgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGFmc19zdXBlcl9pbmZvICphczsKIAlpbnQgcmV0OwogCiAJX2VudGVyKCIsLCVzLCVwIiwgZGV2X25hbWUsIG9wdGlvbnMpOwpAQCAtMzk5LDEyICszODcsMjIgQEAKIAkJcmV0ID0gUFRSX0VSUih2b2wpOwogCQlnb3RvIGVycm9yOwogCX0KLQlwYXJhbXMudm9sdW1lID0gdm9sOworCisJLyogYWxsb2NhdGUgYSBzdXBlcmJsb2NrIGluZm8gcmVjb3JkICovCisJYXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3N1cGVyX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWFmc19wdXRfdm9sdW1lKHZvbCk7CisJCWdvdG8gZXJyb3I7CisJfQorCWFzLT52b2x1bWUgPSB2b2w7CiAKIAkvKiBhbGxvY2F0ZSBhIGRldmljZWxlc3Mgc3VwZXJibG9jayAqLwotCXNiID0gc2dldChmc190eXBlLCBhZnNfdGVzdF9zdXBlciwgc2V0X2Fub25fc3VwZXIsICZwYXJhbXMpOworCXNiID0gc2dldChmc190eXBlLCBhZnNfdGVzdF9zdXBlciwgYWZzX3NldF9zdXBlciwgYXMpOwogCWlmIChJU19FUlIoc2IpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2IpOworCQlhZnNfcHV0X3ZvbHVtZSh2b2wpOworCQlrZnJlZShhcyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC00MjIsMTYgKzQyMCwxNiBAQAogCX0gZWxzZSB7CiAJCV9kZWJ1ZygicmV1c2UiKTsKIAkJQVNTRVJUQ01QKHNiLT5zX2ZsYWdzLCAmLCBNU19BQ1RJVkUpOworCQlhZnNfcHV0X3ZvbHVtZSh2b2wpOworCQlrZnJlZShhcyk7CiAJfQogCi0JYWZzX3B1dF92b2x1bWUocGFyYW1zLnZvbHVtZSk7CiAJYWZzX3B1dF9jZWxsKHBhcmFtcy5jZWxsKTsKIAlrZnJlZShuZXdfb3B0cyk7CiAJX2xlYXZlKCIgPSAwIFslcF0iLCBzYik7CiAJcmV0dXJuIGRnZXQoc2ItPnNfcm9vdCk7CiAKIGVycm9yOgotCWFmc19wdXRfdm9sdW1lKHBhcmFtcy52b2x1bWUpOwogCWFmc19wdXRfY2VsbChwYXJhbXMuY2VsbCk7CiAJa2V5X3B1dChwYXJhbXMua2V5KTsKIAlrZnJlZShuZXdfb3B0cyk7CkBAIC00MzksMTggKzQzNywxMiBAQAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKLS8qCi0gKiBmaW5pc2ggdGhlIHVubW91bnRpbmcgcHJvY2VzcyBvbiB0aGUgc3VwZXJibG9jawotICovCi1zdGF0aWMgdm9pZCBhZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgdm9pZCBhZnNfa2lsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOwotCi0JX2VudGVyKCIiKTsKLQorCWtpbGxfYW5vbl9zdXBlcihzYik7CiAJYWZzX3B1dF92b2x1bWUoYXMtPnZvbHVtZSk7Ci0KLQlfbGVhdmUoIiIpOworCWtmcmVlKGFzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2Fmcy93cml0ZS5jIGIvZnMvYWZzL3dyaXRlLmMKaW5kZXggNzg5YjNhZi4uYjgwNjI4NSAxMDA2NDQKLS0tIGEvZnMvYWZzL3dyaXRlLmMKKysrIGIvZnMvYWZzL3dyaXRlLmMKQEAgLTg0LDIzICs4NCwyMSBAQAogICogcGFydGx5IG9yIHdob2xseSBmaWxsIGEgcGFnZSB0aGF0J3MgdW5kZXIgcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKICAqLwogc3RhdGljIGludCBhZnNfZmlsbF9wYWdlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXksCi0JCQkgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKKwkJCSBsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlsb2ZmX3QgaV9zaXplOwotCXVuc2lnbmVkIGVvZjsKIAlpbnQgcmV0OworCWludCBsZW47CiAKLQlfZW50ZXIoIiwsJWxsdSwldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9zLCBsZW4pOwotCi0JQVNTRVJUQ01QKGxlbiwgPD0sIFBBR0VfQ0FDSEVfU0laRSk7CisJX2VudGVyKCIsLCVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKXBvcyk7CiAKIAlpX3NpemUgPSBpX3NpemVfcmVhZCgmdm5vZGUtPnZmc19pbm9kZSk7Ci0JaWYgKHBvcyArIGxlbiA+IGlfc2l6ZSkKLQkJZW9mID0gaV9zaXplOworCWlmIChwb3MgKyBQQUdFX0NBQ0hFX1NJWkUgPiBpX3NpemUpCisJCWxlbiA9IGlfc2l6ZSAtIHBvczsKIAllbHNlCi0JCWVvZiA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJbGVuID0gUEFHRV9DQUNIRV9TSVpFOwogCi0JcmV0ID0gYWZzX3Zub2RlX2ZldGNoX2RhdGEodm5vZGUsIGtleSwgMCwgZW9mLCBwYWdlKTsKKwlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfZGF0YSh2bm9kZSwga2V5LCBwb3MsIGxlbiwgcGFnZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCA9PSAtRU5PRU5UKSB7CiAJCQlfZGVidWcoImdvdCBOT0VOVCBmcm9tIHNlcnZlciIKQEAgLTE1Myw5ICsxNTEsOCBAQAogCSpwYWdlcCA9IHBhZ2U7CiAJLyogcGFnZSB3b24ndCBsZWFrIGluIGVycm9yIGNhc2U6IGl0IGV2ZW50dWFsbHkgZ2V0cyBjbGVhbmVkIG9mZiBMUlUgKi8KIAotCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7Ci0JCV9kZWJ1Zygibm90IHVwIHRvIGRhdGUiKTsKLQkJcmV0ID0gYWZzX2ZpbGxfcGFnZSh2bm9kZSwga2V5LCBwb3MsIGxlbiwgcGFnZSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgJiYgbGVuICE9IFBBR0VfQ0FDSEVfU0laRSkgeworCQlyZXQgPSBhZnNfZmlsbF9wYWdlKHZub2RlLCBrZXksIGluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQsIHBhZ2UpOwogCQlpZiAocmV0IDwgMCkgewogCQkJa2ZyZWUoY2FuZGlkYXRlKTsKIAkJCV9sZWF2ZSgiID0gJWQgW3ByZXBdIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvcm9vdC5jIGIvZnMvYXV0b2ZzNC9yb290LmMKaW5kZXggODdkOTVhOC4uZjU1YWUyMyAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9yb290LmMKKysrIGIvZnMvYXV0b2ZzNC9yb290LmMKQEAgLTU4Myw4ICs1ODMsNiBAQAogCWlmICghYXV0b2ZzNF9vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JZGVudHJ5X3VuaGFzaChkZW50cnkpOwotCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmluby0+Y291bnQpKSB7CiAJCXBfaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeS0+ZF9wYXJlbnQpOwogCQlpZiAocF9pbm8gJiYgZGVudHJ5LT5kX3BhcmVudCAhPSBkZW50cnkpCmRpZmYgLS1naXQgYS9mcy9iYWRfaW5vZGUuYyBiL2ZzL2JhZF9pbm9kZS5jCmluZGV4IDlhZDIzNjkuLmJmY2IxOGYgMTAwNjQ0Ci0tLSBhL2ZzL2JhZF9pbm9kZS5jCisrKyBiL2ZzL2JhZF9pbm9kZS5jCkBAIC0yMzEsOSArMjMxLDYgQEAKIAogc3RhdGljIGludCBiYWRfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQogCXJldHVybiAtRUlPOwogfQogCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKaW5kZXggNjMwMzllZC4uMmJjNWRjNiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZl9mZHBpYy5jCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtMTg2NCw2ICsxODY0LDcgQEAKIAlrZnJlZShwc2luZm8pOwogCWtmcmVlKG5vdGVzKTsKIAlrZnJlZShmcHUpOworCWtmcmVlKHNoZHI0ZXh0bnVtKTsKICNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKIAlrZnJlZSh4ZnB1KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCAxZjJiMTk5Li42MTBlOGUwIDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtNzYyLDcgKzc2MiwxOSBAQAogCWlmICghZGlzaykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOWElPKTsKIAotCXdob2xlID0gYmRnZXRfZGlzayhkaXNrLCAwKTsKKwkvKgorCSAqIE5vcm1hbGx5LCBAYmRldiBzaG91bGQgZXF1YWwgd2hhdCdzIHJldHVybmVkIGZyb20gYmRnZXRfZGlzaygpCisJICogaWYgcGFydG5vIGlzIDA7IGhvd2V2ZXIsIHNvbWUgZHJpdmVycyAoZmxvcHB5KSB1c2UgbXVsdGlwbGUKKwkgKiBiZGV2J3MgZm9yIHRoZSBzYW1lIHBoeXNpY2FsIGRldmljZSBhbmQgQGJkZXYgbWF5IGJlIG9uZSBvZiB0aGUKKwkgKiBhbGlhc2VzLiAgS2VlcCBAYmRldiBpZiBwYXJ0bm8gaXMgMC4gIFRoaXMgbWVhbnMgY2xhaW1lcgorCSAqIHRyYWNraW5nIGlzIGJyb2tlbiBmb3IgdGhvc2UgZGV2aWNlcyBidXQgaXQgaGFzIGFsd2F5cyBiZWVuIHRoYXQKKwkgKiB3YXkuCisJICovCisJaWYgKHBhcnRubykKKwkJd2hvbGUgPSBiZGdldF9kaXNrKGRpc2ssIDApOworCWVsc2UKKwkJd2hvbGUgPSBiZGdyYWIoYmRldik7CisKIAltb2R1bGVfcHV0KGRpc2stPmZvcHMtPm93bmVyKTsKIAlwdXRfZGlzayhkaXNrKTsKIAlpZiAoIXdob2xlKQpAQCAtMTI3Miw4ICsxMjg0LDggQEAKIAkJICogaW5kaXZpZHVhbCB3cml0ZWFibGUgcmVmZXJlbmNlIGlzIHRvbyBmcmFnaWxlIGdpdmVuIHRoZQogCQkgKiB3YXkgQG1vZGUgaXMgdXNlZCBpbiBibGtkZXZfZ2V0L3B1dCgpLgogCQkgKi8KLQkJaWYgKChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFKSAmJgotCQkgICAgIXJlcyAmJiAobW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAhYmRldi0+YmRfd3JpdGVfaG9sZGVyKSB7CisJCWlmICghcmVzICYmIChtb2RlICYgRk1PREVfV1JJVEUpICYmICFiZGV2LT5iZF93cml0ZV9ob2xkZXIgJiYKKwkJICAgIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFKSkgewogCQkJYmRldi0+YmRfd3JpdGVfaG9sZGVyID0gdHJ1ZTsKIAkJCWRpc2tfYmxvY2tfZXZlbnRzKGRpc2spOwogCQl9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9idHJmc19pbm9kZS5oIGIvZnMvYnRyZnMvYnRyZnNfaW5vZGUuaAppbmRleCA5M2IxYWE5Li41MmQ3ZWNhIDEwMDY0NAotLS0gYS9mcy9idHJmcy9idHJmc19pbm9kZS5oCisrKyBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKQEAgLTEyMSw5ICsxMjEsNiBAQAogCSAqLwogCXU2NCBpbmRleF9jbnQ7CiAKLQkvKiB0aGUgc3RhcnQgb2YgYmxvY2sgZ3JvdXAgcHJlZmVycmVkIGZvciBhbGxvY2F0aW9ucy4gKi8KLQl1NjQgYmxvY2tfZ3JvdXA7Ci0KIAkvKiB0aGUgZnN5bmMgbG9nIGhhcyBzb21lIGNvcm5lciBjYXNlcyB0aGF0IG1lYW4gd2UgaGF2ZSB0byBjaGVjawogCSAqIGRpcmVjdG9yaWVzIHRvIHNlZSBpZiBhbnkgdW5saW5rcyBoYXZlIGJlZW4gZG9uZSBiZWZvcmUKIAkgKiB0aGUgZGlyZWN0b3J5IHdhcyBsb2dnZWQuICBTZWUgdHJlZS1sb2cuYyBmb3IgYWxsIHRoZQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuYyBiL2ZzL2J0cmZzL2N0cmVlLmMKaW5kZXggYjBlMThkOTguLjJlNjY3ODYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmMKKysrIGIvZnMvYnRyZnMvY3RyZWUuYwpAQCAtNDMsOCArNDMsNiBAQAogewogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXBhdGggPSBrbWVtX2NhY2hlX3phbGxvYyhidHJmc19wYXRoX2NhY2hlcCwgR0ZQX05PRlMpOwotCWlmIChwYXRoKQotCQlwYXRoLT5yZWFkYSA9IDE7CiAJcmV0dXJuIHBhdGg7CiB9CiAKQEAgLTEyMjQsMTEgKzEyMjIsMTMgQEAKIAl1NjQgc2VhcmNoOwogCXU2NCB0YXJnZXQ7CiAJdTY0IG5yZWFkID0gMDsKKwl1NjQgZ2VuOwogCWludCBkaXJlY3Rpb24gPSBwYXRoLT5yZWFkYTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CiAJdTMyIG5yOwogCXUzMiBibG9ja3NpemU7CiAJdTMyIG5zY2FuID0gMDsKKwlib29sIG1hcCA9IHRydWU7CiAKIAlpZiAobGV2ZWwgIT0gMSkKIAkJcmV0dXJuOwpAQCAtMTI1MCw3ICsxMjUwLDE5IEBACiAKIAlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobm9kZSk7CiAJbnIgPSBzbG90OworCWlmIChub2RlLT5tYXBfdG9rZW4gfHwgcGF0aC0+c2tpcF9sb2NraW5nKQorCQltYXAgPSBmYWxzZTsKKwogCXdoaWxlICgxKSB7CisJCWlmIChtYXAgJiYgIW5vZGUtPm1hcF90b2tlbikgeworCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KG5yKTsKKwkJCW1hcF9wcml2YXRlX2V4dGVudF9idWZmZXIobm9kZSwgb2Zmc2V0LAorCQkJCQkJICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpLAorCQkJCQkJICAmbm9kZS0+bWFwX3Rva2VuLAorCQkJCQkJICAmbm9kZS0+a2FkZHIsCisJCQkJCQkgICZub2RlLT5tYXBfc3RhcnQsCisJCQkJCQkgICZub2RlLT5tYXBfbGVuLCBLTV9VU0VSMSk7CisJCX0KIAkJaWYgKGRpcmVjdGlvbiA8IDApIHsKIAkJCWlmIChuciA9PSAwKQogCQkJCWJyZWFrOwpAQCAtMTI2OCwxNCArMTI4MCwyMyBAQAogCQlzZWFyY2ggPSBidHJmc19ub2RlX2Jsb2NrcHRyKG5vZGUsIG5yKTsKIAkJaWYgKChzZWFyY2ggPD0gdGFyZ2V0ICYmIHRhcmdldCAtIHNlYXJjaCA8PSA2NTUzNikgfHwKIAkJICAgIChzZWFyY2ggPiB0YXJnZXQgJiYgc2VhcmNoIC0gdGFyZ2V0IDw9IDY1NTM2KSkgewotCQkJcmVhZGFoZWFkX3RyZWVfYmxvY2socm9vdCwgc2VhcmNoLCBibG9ja3NpemUsCi0JCQkJICAgICBidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKG5vZGUsIG5yKSk7CisJCQlnZW4gPSBidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKG5vZGUsIG5yKTsKKwkJCWlmIChtYXAgJiYgbm9kZS0+bWFwX3Rva2VuKSB7CisJCQkJdW5tYXBfZXh0ZW50X2J1ZmZlcihub2RlLCBub2RlLT5tYXBfdG9rZW4sCisJCQkJCQkgICAgS01fVVNFUjEpOworCQkJCW5vZGUtPm1hcF90b2tlbiA9IE5VTEw7CisJCQl9CisJCQlyZWFkYWhlYWRfdHJlZV9ibG9jayhyb290LCBzZWFyY2gsIGJsb2Nrc2l6ZSwgZ2VuKTsKIAkJCW5yZWFkICs9IGJsb2Nrc2l6ZTsKIAkJfQogCQluc2NhbisrOwogCQlpZiAoKG5yZWFkID4gNjU1MzYgfHwgbnNjYW4gPiAzMikpCiAJCQlicmVhazsKIAl9CisJaWYgKG1hcCAmJiBub2RlLT5tYXBfdG9rZW4pIHsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihub2RlLCBub2RlLT5tYXBfdG9rZW4sIEtNX1VTRVIxKTsKKwkJbm9kZS0+bWFwX3Rva2VuID0gTlVMTDsKKwl9CiB9CiAKIC8qCkBAIC0xNjQ4LDkgKzE2NjksNiBAQAogCQl9CiBjb3dfZG9uZToKIAkJQlVHX09OKCFjb3cgJiYgaW5zX2xlbik7Ci0JCWlmIChsZXZlbCAhPSBidHJmc19oZWFkZXJfbGV2ZWwoYikpCi0JCQlXQVJOX09OKDEpOwotCQlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChiKTsKIAogCQlwLT5ub2Rlc1tsZXZlbF0gPSBiOwogCQlpZiAoIXAtPnNraXBfbG9ja2luZykKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCmluZGV4IDZjMDkzZmE5Li4zYjg1OWEzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5oCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmgKQEAgLTE5LDcgKzE5LDYgQEAKICNpZm5kZWYgX19CVFJGU19DVFJFRV9fCiAjZGVmaW5lIF9fQlRSRlNfQ1RSRUVfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC05MzAsNyArOTI5LDYgQEAKIAkgKiBpcyByZXF1aXJlZCBpbnN0ZWFkIG9mIHRoZSBmYXN0ZXIgc2hvcnQgZnN5bmMgbG9nIGNvbW1pdHMKIAkgKi8KIAl1NjQgbGFzdF90cmFuc19sb2dfZnVsbF9jb21taXQ7Ci0JdTY0IG9wZW5faW9jdGxfdHJhbnM7CiAJdW5zaWduZWQgbG9uZyBtb3VudF9vcHQ6MjA7CiAJdW5zaWduZWQgbG9uZyBjb21wcmVzc190eXBlOjQ7CiAJdTY0IG1heF9pbmxpbmU7CkBAIC05NDcsNyArOTQ1LDYgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGU7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gYmRpOwotCXN0cnVjdCBtdXRleCB0cmFuc19tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggdHJlZV9sb2dfbXV0ZXg7CiAJc3RydWN0IG11dGV4IHRyYW5zYWN0aW9uX2t0aHJlYWRfbXV0ZXg7CiAJc3RydWN0IG11dGV4IGNsZWFuZXJfbXV0ZXg7CkBAIC05NjgsNiArOTY1LDEzIEBACiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBzdWJ2b2xfc2VtOwogCXN0cnVjdCBzcmN1X3N0cnVjdCBzdWJ2b2xfc3JjdTsKIAorCXNwaW5sb2NrX3QgdHJhbnNfbG9jazsKKwkvKgorCSAqIHRoZSByZWxvYyBtdXRleCBnb2VzIHdpdGggdGhlIHRyYW5zIGxvY2ssIGl0IGlzIHRha2VuCisJICogZHVyaW5nIGNvbW1pdCB0byBwcm90ZWN0IHVzIGZyb20gdGhlIHJlbG9jYXRpb24gY29kZQorCSAqLworCXN0cnVjdCBtdXRleCByZWxvY19tdXRleDsKKwogCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hlcnM7CiAJc3RydWN0IGxpc3RfaGVhZCBkZWFkX3Jvb3RzOwpAQCAtOTgwLDYgKzk4NCw3IEBACiAJYXRvbWljX3QgYXN5bmNfc3VibWl0X2RyYWluaW5nOwogCWF0b21pY190IG5yX2FzeW5jX2Jpb3M7CiAJYXRvbWljX3QgYXN5bmNfZGVsYWxsb2NfcGFnZXM7CisJYXRvbWljX3Qgb3Blbl9pb2N0bF90cmFuczsKIAogCS8qCiAJICogdGhpcyBpcyB1c2VkIGJ5IHRoZSBiYWxhbmNpbmcgY29kZSB0byB3YWl0IGZvciBhbGwgdGhlIHBlbmRpbmcKQEAgLTEwNDQsNiArMTA0OSw3IEBACiAJaW50IGNsb3Npbmc7CiAJaW50IGxvZ19yb290X3JlY292ZXJpbmc7CiAJaW50IGVub3NwY191bmxpbms7CisJaW50IHRyYW5zX25vX2pvaW47CiAKIAl1NjQgdG90YWxfcGlubmVkOwogCkBAIC0xMDY1LDcgKzEwNzEsNiBAQAogCXN0cnVjdCByZWxvY19jb250cm9sICpyZWxvY19jdGw7CiAKIAlzcGlubG9ja190IGRlbGFsbG9jX2xvY2s7Ci0Jc3BpbmxvY2tfdCBuZXdfdHJhbnNfbG9jazsKIAl1NjQgZGVsYWxsb2NfYnl0ZXM7CiAKIAkvKiBkYXRhX2FsbG9jX2NsdXN0ZXIgaXMgb25seSB1c2VkIGluIHNzZCBtb2RlICovCkBAIC0xMTcyLDYgKzExNzcsMTQgQEAKIAl1MzIgdHlwZTsKIAogCXU2NCBoaWdoZXN0X29iamVjdGlkOworCisJLyogYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMgaXMgYSBtdWx0aS1zdGVwIHByb2Nlc3MsCisJICogYW5kIGl0IGNhbiByYWNlIHdpdGggdGhlIGJhbGFuY2luZyBjb2RlLiAgIEJ1dCB0aGUKKwkgKiByYWNlIGlzIHZlcnkgc21hbGwsIGFuZCBvbmx5IHRoZSBmaXJzdCB0aW1lIHRoZSByb290CisJICogaXMgYWRkZWQgdG8gZWFjaCB0cmFuc2FjdGlvbi4gIFNvIGluX3RyYW5zX3NldHVwCisJICogaXMgdXNlZCB0byB0ZWxsIHVzIHdoZW4gbW9yZSBjaGVja3MgYXJlIHJlcXVpcmVkCisJICovCisJdW5zaWduZWQgbG9uZyBpbl90cmFuc19zZXR1cDsKIAlpbnQgcmVmX2Nvd3M7CiAJaW50IHRyYWNrX2RpcnR5OwogCWludCBpbl9yYWRpeDsKQEAgLTExODEsNyArMTE5NCw2IEBACiAJc3RydWN0IGJ0cmZzX2tleSBkZWZyYWdfbWF4OwogCWludCBkZWZyYWdfcnVubmluZzsKIAljaGFyICpuYW1lOwotCWludCBpbl9zeXNmczsKIAogCS8qIHRoZSBkaXJ0eSBsaXN0IGlzIG9ubHkgdXNlZCBieSBub24tcmVmZXJlbmNlIGNvdW50ZWQgcm9vdHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGRpcnR5X2xpc3Q7CkBAIC0xMzIzLDYgKzEzMzUsMTEgQEAKICAqLwogI2RlZmluZSBCVFJGU19TVFJJTkdfSVRFTV9LRVkJMjUzCiAKKy8qCisgKiBGbGFncyBmb3IgbW91bnQgb3B0aW9ucy4KKyAqCisgKiBOb3RlOiBkb24ndCBmb3JnZXQgdG8gYWRkIG5ldyBvcHRpb25zIHRvIGJ0cmZzX3Nob3dfb3B0aW9ucygpCisgKi8KICNkZWZpbmUgQlRSRlNfTU9VTlRfTk9EQVRBU1VNCQkoMSA8PCAwKQogI2RlZmluZSBCVFJGU19NT1VOVF9OT0RBVEFDT1cJCSgxIDw8IDEpCiAjZGVmaW5lIEJUUkZTX01PVU5UX05PQkFSUklFUgkJKDEgPDwgMikKQEAgLTEzNDAsNiArMTM1Nyw3IEBACiAjZGVmaW5lIEJUUkZTX01PVU5UX1VTRVJfU1VCVk9MX1JNX0FMTE9XRUQgKDEgPDwgMTQpCiAjZGVmaW5lIEJUUkZTX01PVU5UX0VOT1NQQ19ERUJVRwkgKDEgPDwgMTUpCiAjZGVmaW5lIEJUUkZTX01PVU5UX0FVVE9fREVGUkFHCQkoMSA8PCAxNikKKyNkZWZpbmUgQlRSRlNfTU9VTlRfSU5PREVfTUFQX0NBQ0hFCSgxIDw8IDE3KQogCiAjZGVmaW5lIGJ0cmZzX2NsZWFyX29wdChvLCBvcHQpCQkoKG8pICY9IH5CVFJGU19NT1VOVF8jI29wdCkKICNkZWZpbmUgYnRyZnNfc2V0X29wdChvLCBvcHQpCQkoKG8pIHw9IEJUUkZTX01PVU5UXyMjb3B0KQpAQCAtMjIzOCw2ICsyMjU2LDkgQEAKIHZvaWQgYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkgICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKIAkJCSAgICAgdTY0IG51bV9ieXRlcyk7CitpbnQgYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdik7CiBpbnQgYnRyZnNfc2V0X2Jsb2NrX2dyb3VwX3JvKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKTsKIGludCBidHJmc19zZXRfYmxvY2tfZ3JvdXBfcncoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCkBAIC0yMzUwLDYgKzIzNzEsMTUgQEAKIAkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUsCiAJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50KTsKK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX2ZzX2Nsb3Npbmcoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJLyoKKwkgKiBHZXQgc3luY2VkIHdpdGggY2xvc2VfY3RyZWUoKQorCSAqLworCXNtcF9tYigpOworCXJldHVybiBmc19pbmZvLT5jbG9zaW5nOworfQorCiAvKiByb290LWl0ZW0uYyAqLwogaW50IGJ0cmZzX2ZpbmRfcm9vdF9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCwKIAkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLApAQCAtMjUxMiw4ICsyNTQyLDcgQEAKIGludCBidHJmc193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKIGludCBidHJmc19jcmVhdGVfc3Vidm9sX3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCwKLQkJCSAgICAgdTY0IG5ld19kaXJpZCwgdTY0IGFsbG9jX2hpbnQpOworCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3QsIHU2NCBuZXdfZGlyaWQpOwogaW50IGJ0cmZzX21lcmdlX2Jpb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCSBzaXplX3Qgc2l6ZSwgc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBsb25nIGJpb19mbGFncyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYyBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYwppbmRleCAwMWUyOTUwLi45OGM2OGU2IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCkBAIC04Miw2ICs4MiwzOSBAQAogCXJldHVybiByb290LT5mc19pbmZvLT5kZWxheWVkX3Jvb3Q7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpidHJmc19nZXRfZGVsYXllZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX2lub2RlICpidHJmc19pbm9kZSA9IEJUUkZTX0koaW5vZGUpOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYnRyZnNfaW5vZGUtPnJvb3Q7CisJdTY0IGlubyA9IGJ0cmZzX2lubyhpbm9kZSk7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqbm9kZTsKKworCW5vZGUgPSBBQ0NFU1NfT05DRShidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKTsKKwlpZiAobm9kZSkgeworCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsKKwkJcmV0dXJuIG5vZGU7CisJfQorCisJc3Bpbl9sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKwlub2RlID0gcmFkaXhfdHJlZV9sb29rdXAoJnJvb3QtPmRlbGF5ZWRfbm9kZXNfdHJlZSwgaW5vKTsKKwlpZiAobm9kZSkgeworCQlpZiAoYnRyZnNfaW5vZGUtPmRlbGF5ZWRfbm9kZSkgeworCQkJYXRvbWljX2luYygmbm9kZS0+cmVmcyk7CS8qIGNhbiBiZSBhY2Nlc3NlZCAqLworCQkJQlVHX09OKGJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUgIT0gbm9kZSk7CisJCQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CisJCQlyZXR1cm4gbm9kZTsKKwkJfQorCQlidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlID0gbm9kZTsKKwkJYXRvbWljX2luYygmbm9kZS0+cmVmcyk7CS8qIGNhbiBiZSBhY2Nlc3NlZCAqLworCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FjaGVkIGluIHRoZSBpbm9kZSAqLworCQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CisJCXJldHVybiBub2RlOworCX0KKwlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmJ0cmZzX2dldF9vcl9jcmVhdGVfZGVsYXllZF9ub2RlKAogCQkJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC05MiwyNiArMTI1LDkgQEAKIAlpbnQgcmV0OwogCiBhZ2FpbjoKLQlub2RlID0gQUNDRVNTX09OQ0UoYnRyZnNfaW5vZGUtPmRlbGF5ZWRfbm9kZSk7Ci0JaWYgKG5vZGUpIHsKLQkJYXRvbWljX2luYygmbm9kZS0+cmVmcyk7CS8qIGNhbiBiZSBhY2Nlc3NlZCAqLworCW5vZGUgPSBidHJmc19nZXRfZGVsYXllZF9ub2RlKGlub2RlKTsKKwlpZiAobm9kZSkKIAkJcmV0dXJuIG5vZGU7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKLQlub2RlID0gcmFkaXhfdHJlZV9sb29rdXAoJnJvb3QtPmRlbGF5ZWRfbm9kZXNfdHJlZSwgaW5vKTsKLQlpZiAobm9kZSkgewotCQlpZiAoYnRyZnNfaW5vZGUtPmRlbGF5ZWRfbm9kZSkgewotCQkJc3Bpbl91bmxvY2soJnJvb3QtPmlub2RlX2xvY2spOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCQlidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlID0gbm9kZTsKLQkJYXRvbWljX2luYygmbm9kZS0+cmVmcyk7CS8qIGNhbiBiZSBhY2Nlc3NlZCAqLwotCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FjaGVkIGluIHRoZSBpbm9kZSAqLwotCQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7Ci0JCXJldHVybiBub2RlOwotCX0KLQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CiAKIAlub2RlID0ga21lbV9jYWNoZV9hbGxvYyhkZWxheWVkX25vZGVfY2FjaGUsIEdGUF9OT0ZTKTsKIAlpZiAoIW5vZGUpCkBAIC0yOTcsNyArMzEzLDYgQEAKIAkJaXRlbS0+ZGF0YV9sZW4gPSBkYXRhX2xlbjsKIAkJaXRlbS0+aW5zX29yX2RlbCA9IDA7CiAJCWl0ZW0tPmJ5dGVzX3Jlc2VydmVkID0gMDsKLQkJaXRlbS0+YmxvY2tfcnN2ID0gTlVMTDsKIAkJaXRlbS0+ZGVsYXllZF9ub2RlID0gTlVMTDsKIAkJYXRvbWljX3NldCgmaXRlbS0+cmVmcywgMSk7CiAJfQpAQCAtNTQ5LDE5ICs1NjQsNiBAQAogCXJldHVybiBuZXh0OwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmJ0cmZzX2dldF9kZWxheWVkX25vZGUoCi0JCQkJCQkJc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlzdHJ1Y3QgYnRyZnNfaW5vZGUgKmJ0cmZzX2lub2RlID0gQlRSRlNfSShpbm9kZSk7Ci0Jc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlOwotCi0JZGVsYXllZF9ub2RlID0gYnRyZnNfaW5vZGUtPmRlbGF5ZWRfbm9kZTsKLQlpZiAoZGVsYXllZF9ub2RlKQotCQlhdG9taWNfaW5jKCZkZWxheWVkX25vZGUtPnJlZnMpOwotCi0JcmV0dXJuIGRlbGF5ZWRfbm9kZTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfZ2V0X2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJCQkgICB1NjQgcm9vdF9pZCkKIHsKQEAgLTU5MywxMCArNTk1LDggQEAKIAogCW51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKIAlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZShzcmNfcnN2LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwotCWlmICghcmV0KSB7CisJaWYgKCFyZXQpCiAJCWl0ZW0tPmJ5dGVzX3Jlc2VydmVkID0gbnVtX2J5dGVzOwotCQlpdGVtLT5ibG9ja19yc3YgPSBkc3RfcnN2OwotCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC02MDQsMTAgKzYwNCwxMyBAQAogc3RhdGljIHZvaWQgYnRyZnNfZGVsYXllZF9pdGVtX3JlbGVhc2VfbWV0YWRhdGEoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJCQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9pdGVtICppdGVtKQogeworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdjsKKwogCWlmICghaXRlbS0+Ynl0ZXNfcmVzZXJ2ZWQpCiAJCXJldHVybjsKIAotCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIGl0ZW0tPmJsb2NrX3JzdiwKKwlyc3YgPSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKKwlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCByc3YsCiAJCQkJaXRlbS0+Ynl0ZXNfcmVzZXJ2ZWQpOwogfQogCkBAIC02NzgsNiArNjgxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmaGVhZCk7CiAKIAluZXh0ID0gaXRlbTsKKwluaXRlbXMgPSAwOwogCiAJLyoKIAkgKiBjb3VudCB0aGUgbnVtYmVyIG9mIHRoZSBjb250aW51b3VzIGl0ZW1zIHRoYXQgd2UgY2FuIGluc2VydCBpbiBiYXRjaApAQCAtMTAxMyw2ICsxMDE3LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqY3Vycl9ub2RlLCAqcHJldl9ub2RlOwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKIAlpbnQgcmV0ID0gMDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CkBAIC0xMDIwLDYgKzEwMjUsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAKKwlibG9ja19yc3YgPSB0cmFucy0+YmxvY2tfcnN2OworCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKKwogCWRlbGF5ZWRfcm9vdCA9IGJ0cmZzX2dldF9kZWxheWVkX3Jvb3Qocm9vdCk7CiAKIAljdXJyX25vZGUgPSBidHJmc19maXJzdF9kZWxheWVkX25vZGUoZGVsYXllZF9yb290KTsKQEAgLTEwNDQsNiArMTA1Miw3IEBACiAJfQogCiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXRyYW5zLT5ibG9ja19yc3YgPSBibG9ja19yc3Y7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA1MSw2ICsxMDYwLDcgQEAKIAkJCQkJICAgICAgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CiAJaW50IHJldDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CkBAIC0xMDU4LDYgKzEwNjgsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAKKwlibG9ja19yc3YgPSB0cmFucy0+YmxvY2tfcnN2OworCXRyYW5zLT5ibG9ja19yc3YgPSAmbm9kZS0+cm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKKwogCXJldCA9IGJ0cmZzX2luc2VydF9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCBub2RlLT5yb290LCBub2RlKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gYnRyZnNfZGVsZXRlX2RlbGF5ZWRfaXRlbXModHJhbnMsIHBhdGgsIG5vZGUtPnJvb3QsIG5vZGUpOwpAQCAtMTA2NSw2ICsxMDc4LDcgQEAKIAkJcmV0ID0gYnRyZnNfdXBkYXRlX2RlbGF5ZWRfaW5vZGUodHJhbnMsIG5vZGUtPnJvb3QsIHBhdGgsIG5vZGUpOwogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAorCXRyYW5zLT5ibG9ja19yc3YgPSBibG9ja19yc3Y7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTExNSw2ICsxMTI5LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGUgPSBOVUxMOwogCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKIAl1bnNpZ25lZCBsb25nIG5yID0gMDsKIAlpbnQgbmVlZF9yZXF1ZXVlID0gMDsKIAlpbnQgcmV0OwpAQCAtMTEyOSwxMCArMTE0NCwxMyBAQAogCWRlbGF5ZWRfbm9kZSA9IGFzeW5jX25vZGUtPmRlbGF5ZWRfbm9kZTsKIAlyb290ID0gZGVsYXllZF9ub2RlLT5yb290OwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDApOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJZ290byBmcmVlX3BhdGg7CiAKKwlibG9ja19yc3YgPSB0cmFucy0+YmxvY2tfcnN2OworCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKKwogCXJldCA9IGJ0cmZzX2luc2VydF9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCByb290LCBkZWxheWVkX25vZGUpOwogCWlmICghcmV0KQogCQlyZXQgPSBidHJmc19kZWxldGVfZGVsYXllZF9pdGVtcyh0cmFucywgcGF0aCwgcm9vdCwKQEAgLTExNzUsNiArMTE5Myw3IEBACiAKIAluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKIAorCXRyYW5zLT5ibG9ja19yc3YgPSBibG9ja19yc3Y7CiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX2RtZXRhKHRyYW5zLCByb290KTsKIAlfX2J0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOwogZnJlZV9wYXRoOgpAQCAtMTIyMSw2ICsxMjQwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgYnRyZnNfYXNzZXJ0X2RlbGF5ZWRfcm9vdF9lbXB0eShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3Q7CisJZGVsYXllZF9yb290ID0gYnRyZnNfZ2V0X2RlbGF5ZWRfcm9vdChyb290KTsKKwlXQVJOX09OKGJ0cmZzX2ZpcnN0X2RlbGF5ZWRfbm9kZShkZWxheWVkX3Jvb3QpKTsKK30KKwogdm9pZCBidHJmc19iYWxhbmNlX2RlbGF5ZWRfaXRlbXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcm9vdCAqZGVsYXllZF9yb290OwpAQCAtMTM4MSw4ICsxNDA3LDcgQEAKIAogaW50IGJ0cmZzX2lub2RlX2RlbGF5ZWRfZGlyX2luZGV4X2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlID0gQlRSRlNfSShpbm9kZSktPmRlbGF5ZWRfbm9kZTsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGUgPSBidHJmc19nZXRfZGVsYXllZF9ub2RlKGlub2RlKTsKIAogCWlmICghZGVsYXllZF9ub2RlKQogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTEzOTIsMTEgKzE0MTcsMTQgQEAKIAkgKiBhIG5ldyBkaXJlY3RvcnkgaW5kZXggaXMgYWRkZWQgaW50byB0aGUgZGVsYXllZCBub2RlIGFuZCBpbmRleF9jbnQKIAkgKiBpcyB1cGRhdGVkIG5vdy4gU28gd2UgbmVlZG4ndCBsb2NrIHRoZSBkZWxheWVkIG5vZGUuCiAJICovCi0JaWYgKCFkZWxheWVkX25vZGUtPmluZGV4X2NudCkKKwlpZiAoIWRlbGF5ZWRfbm9kZS0+aW5kZXhfY250KSB7CisJCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9ub2RlKGRlbGF5ZWRfbm9kZSk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSBkZWxheWVkX25vZGUtPmluZGV4X2NudDsKLQlyZXR1cm4gcmV0OworCWJ0cmZzX3JlbGVhc2VfZGVsYXllZF9ub2RlKGRlbGF5ZWRfbm9kZSk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgYnRyZnNfZ2V0X2RlbGF5ZWRfaXRlbXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxpc3RfaGVhZCAqaW5zX2xpc3QsCkBAIC0xNTcyLDggKzE2MDAsNyBAQAogCWJ0cmZzX3NldF9zdGFja19pbm9kZV90cmFuc2lkKGlub2RlX2l0ZW0sIHRyYW5zLT50cmFuc2lkKTsKIAlidHJmc19zZXRfc3RhY2tfaW5vZGVfcmRldihpbm9kZV9pdGVtLCBpbm9kZS0+aV9yZGV2KTsKIAlidHJmc19zZXRfc3RhY2tfaW5vZGVfZmxhZ3MoaW5vZGVfaXRlbSwgQlRSRlNfSShpbm9kZSktPmZsYWdzKTsKLQlidHJmc19zZXRfc3RhY2tfaW5vZGVfYmxvY2tfZ3JvdXAoaW5vZGVfaXRlbSwKLQkJCQkJICBCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXApOworCWJ0cmZzX3NldF9zdGFja19pbm9kZV9ibG9ja19ncm91cChpbm9kZV9pdGVtLCAwKTsKIAogCWJ0cmZzX3NldF9zdGFja190aW1lc3BlY19zZWMoYnRyZnNfaW5vZGVfYXRpbWUoaW5vZGVfaXRlbSksCiAJCQkJICAgICBpbm9kZS0+aV9hdGltZS50dl9zZWMpOwpAQCAtMTU5MSwxMSArMTYxOCw2MiBAQAogCQkJCSAgICAgIGlub2RlLT5pX2N0aW1lLnR2X25zZWMpOwogfQogCitpbnQgYnRyZnNfZmlsbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKnJkZXYpCit7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlOworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOworCXN0cnVjdCBidHJmc190aW1lc3BlYyAqdHNwZWM7CisKKwlkZWxheWVkX25vZGUgPSBidHJmc19nZXRfZGVsYXllZF9ub2RlKGlub2RlKTsKKwlpZiAoIWRlbGF5ZWRfbm9kZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwltdXRleF9sb2NrKCZkZWxheWVkX25vZGUtPm11dGV4KTsKKwlpZiAoIWRlbGF5ZWRfbm9kZS0+aW5vZGVfZGlydHkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZWxheWVkX25vZGUtPm11dGV4KTsKKwkJYnRyZnNfcmVsZWFzZV9kZWxheWVkX25vZGUoZGVsYXllZF9ub2RlKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaW5vZGVfaXRlbSA9ICZkZWxheWVkX25vZGUtPmlub2RlX2l0ZW07CisKKwlpbm9kZS0+aV91aWQgPSBidHJmc19zdGFja19pbm9kZV91aWQoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfZ2lkID0gYnRyZnNfc3RhY2tfaW5vZGVfZ2lkKGlub2RlX2l0ZW0pOworCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfc2l6ZShpbm9kZV9pdGVtKSk7CisJaW5vZGUtPmlfbW9kZSA9IGJ0cmZzX3N0YWNrX2lub2RlX21vZGUoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfbmxpbmsgPSBidHJmc19zdGFja19pbm9kZV9ubGluayhpbm9kZV9pdGVtKTsKKwlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIGJ0cmZzX3N0YWNrX2lub2RlX25ieXRlcyhpbm9kZV9pdGVtKSk7CisJQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24gPSBidHJmc19zdGFja19pbm9kZV9nZW5lcmF0aW9uKGlub2RlX2l0ZW0pOworCUJUUkZTX0koaW5vZGUpLT5zZXF1ZW5jZSA9IGJ0cmZzX3N0YWNrX2lub2RlX3NlcXVlbmNlKGlub2RlX2l0ZW0pOworCWlub2RlLT5pX3JkZXYgPSAwOworCSpyZGV2ID0gYnRyZnNfc3RhY2tfaW5vZGVfcmRldihpbm9kZV9pdGVtKTsKKwlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgPSBidHJmc19zdGFja19pbm9kZV9mbGFncyhpbm9kZV9pdGVtKTsKKworCXRzcGVjID0gYnRyZnNfaW5vZGVfYXRpbWUoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gYnRyZnNfc3RhY2tfdGltZXNwZWNfc2VjKHRzcGVjKTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gYnRyZnNfc3RhY2tfdGltZXNwZWNfbnNlYyh0c3BlYyk7CisKKwl0c3BlYyA9IGJ0cmZzX2lub2RlX210aW1lKGlub2RlX2l0ZW0pOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGJ0cmZzX3N0YWNrX3RpbWVzcGVjX3NlYyh0c3BlYyk7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGJ0cmZzX3N0YWNrX3RpbWVzcGVjX25zZWModHNwZWMpOworCisJdHNwZWMgPSBidHJmc19pbm9kZV9jdGltZShpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBidHJmc19zdGFja190aW1lc3BlY19zZWModHNwZWMpOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBidHJmc19zdGFja190aW1lc3BlY19uc2VjKHRzcGVjKTsKKworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbjsKKwlCVFJGU19JKGlub2RlKS0+aW5kZXhfY250ID0gKHU2NCktMTsKKworCW11dGV4X3VubG9jaygmZGVsYXllZF9ub2RlLT5tdXRleCk7CisJYnRyZnNfcmVsZWFzZV9kZWxheWVkX25vZGUoZGVsYXllZF9ub2RlKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmRlbGF5ZWRfbm9kZTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJZGVsYXllZF9ub2RlID0gYnRyZnNfZ2V0X29yX2NyZWF0ZV9kZWxheWVkX25vZGUoaW5vZGUpOwogCWlmIChJU19FUlIoZGVsYXllZF9ub2RlKSkKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuaCBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuaAppbmRleCBlYjdkMjQwLi44ZDI3YWY0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmgKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5oCkBAIC03NSw3ICs3NSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCB0cmVlX2xpc3Q7CS8qIHVzZWQgZm9yIGJhdGNoIGluc2VydC9kZWxldGUgaXRlbXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJlYWRkaXJfbGlzdDsJLyogdXNlZCBmb3IgcmVhZGRpciBpdGVtcyAqLwogCXU2NCBieXRlc19yZXNlcnZlZDsKLQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlOwogCWF0b21pY190IHJlZnM7CiAJaW50IGluc19vcl9kZWw7CkBAIC0xMjAsNiArMTE5LDcgQEAKIAogaW50IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCBidHJmc19maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqcmRldik7CiAKIC8qIFVzZWQgZm9yIGRyb3AgZGVhZCByb290ICovCiB2b2lkIGJ0cmZzX2tpbGxfYWxsX2RlbGF5ZWRfbm9kZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwpAQCAtMTM4LDQgKzEzOCw4IEBACiAvKiBmb3IgaW5pdCAqLwogaW50IF9faW5pdCBidHJmc19kZWxheWVkX2lub2RlX2luaXQodm9pZCk7CiB2b2lkIGJ0cmZzX2RlbGF5ZWRfaW5vZGVfZXhpdCh2b2lkKTsKKworLyogZm9yIGRlYnVnZ2luZyAqLwordm9pZCBidHJmc19hc3NlcnRfZGVsYXllZF9yb290X2VtcHR5KHN0cnVjdCBidHJmc19yb290ICpyb290KTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmMgYi9mcy9idHJmcy9kaXNrLWlvLmMKaW5kZXggOThiNmE3MS4uMWFjOGRiNWQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpc2staW8uYworKysgYi9mcy9idHJmcy9kaXNrLWlvLmMKQEAgLTEwNDQsNyArMTA0NCw2IEBACiAJcm9vdC0+bGFzdF90cmFucyA9IDA7CiAJcm9vdC0+aGlnaGVzdF9vYmplY3RpZCA9IDA7CiAJcm9vdC0+bmFtZSA9IE5VTEw7Ci0Jcm9vdC0+aW5fc3lzZnMgPSAwOwogCXJvb3QtPmlub2RlX3RyZWUgPSBSQl9ST09UOwogCUlOSVRfUkFESVhfVFJFRSgmcm9vdC0+ZGVsYXllZF9ub2Rlc190cmVlLCBHRlBfQVRPTUlDKTsKIAlyb290LT5ibG9ja19yc3YgPSBOVUxMOwpAQCAtMTMwMCwxOSArMTI5OSwyMSBAQAogCQlyZXR1cm4gcm9vdDsKIAogCXJvb3QtPmZyZWVfaW5vX2N0bCA9IGt6YWxsb2Moc2l6ZW9mKCpyb290LT5mcmVlX2lub19jdGwpLCBHRlBfTk9GUyk7Ci0JaWYgKCFyb290LT5mcmVlX2lub19jdGwpCi0JCWdvdG8gZmFpbDsKIAlyb290LT5mcmVlX2lub19waW5uZWQgPSBremFsbG9jKHNpemVvZigqcm9vdC0+ZnJlZV9pbm9fcGlubmVkKSwKIAkJCQkJR0ZQX05PRlMpOwotCWlmICghcm9vdC0+ZnJlZV9pbm9fcGlubmVkKQorCWlmICghcm9vdC0+ZnJlZV9pbm9fcGlubmVkIHx8ICFyb290LT5mcmVlX2lub19jdGwpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOworCX0KIAogCWJ0cmZzX2luaXRfZnJlZV9pbm9fY3RsKHJvb3QpOwogCW11dGV4X2luaXQoJnJvb3QtPmZzX2NvbW1pdF9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJnJvb3QtPmNhY2hlX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJvb3QtPmNhY2hlX3dhaXQpOwogCi0Jc2V0X2Fub25fc3VwZXIoJnJvb3QtPmFub25fc3VwZXIsIE5VTEwpOworCXJldCA9IHNldF9hbm9uX3N1cGVyKCZyb290LT5hbm9uX3N1cGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CiAKIAlpZiAoYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApIHsKIAkJcmV0ID0gLUVOT0VOVDsKQEAgLTE1MDUsMjQgKzE1MDYsMjQgQEAKIAkJdmZzX2NoZWNrX2Zyb3plbihyb290LT5mc19pbmZvLT5zYiwgU0JfRlJFRVpFX1dSSVRFKTsKIAkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleCk7CiAKLQkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJCWN1ciA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247CiAJCWlmICghY3VyKSB7Ci0JCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQkJZ290byBzbGVlcDsKIAkJfQogCiAJCW5vdyA9IGdldF9zZWNvbmRzKCk7CiAJCWlmICghY3VyLT5ibG9ja2VkICYmCiAJCSAgICAobm93IDwgY3VyLT5zdGFydF90aW1lIHx8IG5vdyAtIGN1ci0+c3RhcnRfdGltZSA8IDMwKSkgewotCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJCWRlbGF5ID0gSFogKiA1OwogCQkJZ290byBzbGVlcDsKIAkJfQogCQl0cmFuc2lkID0gY3VyLT50cmFuc2lkOwotCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAKLQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKIAkJaWYgKHRyYW5zaWQgPT0gdHJhbnMtPnRyYW5zaWQpIHsKIAkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0xNjEzLDExICsxNjE0LDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPm9yZGVyZWRfb3BlcmF0aW9ucyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPmNhY2hpbmdfYmxvY2tfZ3JvdXBzKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPnJlZl9jYWNoZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmRlbGF5ZWRfaXB1dF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+ZGVmcmFnX2lub2Rlc19sb2NrKTsKKwltdXRleF9pbml0KCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiAKIAlpbml0X2NvbXBsZXRpb24oJmZzX2luZm8tPmtvYmpfdW5yZWdpc3Rlcik7CiAJZnNfaW5mby0+dHJlZV9yb290ID0gdHJlZV9yb290OwpAQCAtMTY0NSw2ICsxNjQ3LDcgQEAKIAlmc19pbmZvLT5tYXhfaW5saW5lID0gODE5MiAqIDEwMjQ7CiAJZnNfaW5mby0+bWV0YWRhdGFfcmF0aW8gPSAwOwogCWZzX2luZm8tPmRlZnJhZ19pbm9kZXMgPSBSQl9ST09UOworCWZzX2luZm8tPnRyYW5zX25vX2pvaW4gPSAwOwogCiAJZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsCiAJCQkJCSAgbnVtX29ubGluZV9jcHVzKCkgKyAyLCA4KTsKQEAgLTE2NjcsOCArMTY3MCw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7CiAJaW5pdF9yd3NlbSgmZnNfaW5mby0+c2NydWJfc3VwZXJfbG9jayk7CiAJZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPSAwOwotCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+c2NydWJfd29ya2VycywgInNjcnViIiwKLQkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CiAKIAlzYi0+c19ibG9ja3NpemUgPSA0MDk2OwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gYmxrc2l6ZV9iaXRzKDQwOTYpOwpAQCAtMTcwOSw3ICsxNzEwLDYgQEAKIAlmc19pbmZvLT5kb19iYXJyaWVycyA9IDE7CiAKIAotCW11dGV4X2luaXQoJmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAltdXRleF9pbml0KCZmc19pbmZvLT5vcmRlcmVkX29wZXJhdGlvbnNfbXV0ZXgpOwogCW11dGV4X2luaXQoJmZzX2luZm8tPnRyZWVfbG9nX211dGV4KTsKIAltdXRleF9pbml0KCZmc19pbmZvLT5jaHVua19tdXRleCk7CkBAIC0yNDc5LDEzICsyNDc5LDEzIEBACiAJZG93bl93cml0ZSgmcm9vdC0+ZnNfaW5mby0+Y2xlYW51cF93b3JrX3NlbSk7CiAJdXBfd3JpdGUoJnJvb3QtPmZzX2luZm8tPmNsZWFudXBfd29ya19zZW0pOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJQlVHX09OKHJldCk7CiAJLyogcnVuIGNvbW1pdCBhZ2FpbiB0byBkcm9wIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCAqLwotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpCiAJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIAlidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwpAQCAtMjkxMSw5ICsyOTExLDggQEAKIAogCUlOSVRfTElTVF9IRUFEKCZzcGxpY2UpOwogCi0JbGlzdF9zcGxpY2VfaW5pdCgmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfaW5vZGVzLCAmc3BsaWNlKTsKLQogCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7CisJbGlzdF9zcGxpY2VfaW5pdCgmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfaW5vZGVzLCAmc3BsaWNlKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmc3BsaWNlKSkgewogCQlidHJmc19pbm9kZSA9IGxpc3RfZW50cnkoc3BsaWNlLm5leHQsIHN0cnVjdCBidHJmc19pbm9kZSwKQEAgLTMwMjQsMTAgKzMwMjMsMTMgQEAKIAogCVdBUk5fT04oMSk7CiAKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleCk7CiAKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xpc3QsICZsaXN0KTsKKwlyb290LT5mc19pbmZvLT50cmFuc19ub19qb2luID0gMTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CiAJCXQgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uLCBsaXN0KTsKIAkJaWYgKCF0KQpAQCAtMzA1MiwyMyArMzA1NCwxOCBAQAogCQl0LT5ibG9ja2VkID0gMDsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQpKQogCQkJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCk7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCi0JCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJdC0+Y29tbWl0X2RvbmUgPSAxOwogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdC0+Y29tbWl0X3dhaXQpKQogCQkJd2FrZV91cCgmdC0+Y29tbWl0X3dhaXQpOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAkJYnRyZnNfZGVzdHJveV9wZW5kaW5nX3NuYXBzaG90cyh0KTsKIAogCQlidHJmc19kZXN0cm95X2RlbGFsbG9jX2lub2Rlcyhyb290KTsKIAotCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAogCQlidHJmc19kZXN0cm95X21hcmtlZF9leHRlbnRzKHJvb3QsICZ0LT5kaXJ0eV9wYWdlcywKIAkJCQkJICAgICBFWFRFTlRfRElSVFkpOwpAQCAtMzA4Miw4ICszMDc5LDEwIEBACiAJCWttZW1fY2FjaGVfZnJlZShidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsIHQpOwogCX0KIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJcm9vdC0+ZnNfaW5mby0+dHJhbnNfbm9fam9pbiA9IDA7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDE2OWJkNjIuLjcxY2Q0NTYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJICovCiAJcGF0aC0+c2tpcF9sb2NraW5nID0gMTsKIAlwYXRoLT5zZWFyY2hfY29tbWl0X3Jvb3QgPSAxOwotCXBhdGgtPnJlYWRhID0gMjsKKwlwYXRoLT5yZWFkYSA9IDE7CiAKIAlrZXkub2JqZWN0aWQgPSBsYXN0OwogCWtleS5vZmZzZXQgPSAwOwpAQCAtMzY2LDggKzM2Niw3IEBACiAJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOwogCiAJd2hpbGUgKDEpIHsKLQkJc21wX21iKCk7Ci0JCWlmIChmc19pbmZvLT5jbG9zaW5nID4gMSkgeworCQlpZiAoYnRyZnNfZnNfY2xvc2luZyhmc19pbmZvKSA+IDEpIHsKIAkJCWxhc3QgPSAodTY0KS0xOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM3OSwxNSArMzc4LDE4IEBACiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCi0JCQljYWNoaW5nX2N0bC0+cHJvZ3Jlc3MgPSBsYXN0OwotCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwotCQkJdXBfcmVhZCgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOwotCQkJbXV0ZXhfdW5sb2NrKCZjYWNoaW5nX2N0bC0+bXV0ZXgpOwotCQkJaWYgKGJ0cmZzX3RyYW5zYWN0aW9uX2luX2NvbW1pdChmc19pbmZvKSkKLQkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQkJZWxzZQorCQkJaWYgKG5lZWRfcmVzY2hlZCgpIHx8CisJCQkgICAgYnRyZnNfbmV4dF9sZWFmKGV4dGVudF9yb290LCBwYXRoKSkgeworCQkJCWNhY2hpbmdfY3RsLT5wcm9ncmVzcyA9IGxhc3Q7CisJCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCQkJCXVwX3JlYWQoJmZzX2luZm8tPmV4dGVudF9jb21taXRfc2VtKTsKKwkJCQltdXRleF91bmxvY2soJmNhY2hpbmdfY3RsLT5tdXRleCk7CiAJCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlnb3RvIGFnYWluOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCQljb250aW51ZTsKIAkJfQogCiAJCWlmIChrZXkub2JqZWN0aWQgPCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkKSB7CkBAIC0zMDY1LDcgKzMwNjcsNyBAQAogCQkJc3Bpbl91bmxvY2soJmRhdGFfc2luZm8tPmxvY2spOwogYWxsb2M6CiAJCQlhbGxvY190YXJnZXQgPSBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCAxKTsKLQkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJCWlmIChJU19FUlIodHJhbnMpKQogCQkJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIApAQCAtMzA4NywxMyArMzA4OSwyMSBAQAogCQkJfQogCQkJZ290byBhZ2FpbjsKIAkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgbGVzcyBwaW5uZWQgYnl0ZXMgdGhhbiB3ZSB3YW50IHRvIGFsbG9jYXRlIHRoZW4KKwkJICogZG9uJ3QgYm90aGVyIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uLCBpdCB3b24ndCBoZWxwIHVzLgorCQkgKi8KKwkJaWYgKGRhdGFfc2luZm8tPmJ5dGVzX3Bpbm5lZCA8IGJ5dGVzKQorCQkJY29tbWl0dGVkID0gMTsKIAkJc3Bpbl91bmxvY2soJmRhdGFfc2luZm8tPmxvY2spOwogCiAJCS8qIGNvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhbmQgdHJ5IGFnYWluICovCiBjb21taXRfdHJhbnM6Ci0JCWlmICghY29tbWl0dGVkICYmICFyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKSB7CisJCWlmICghY29tbWl0dGVkICYmCisJCSAgICAhYXRvbWljX3JlYWQoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpKSB7CiAJCQljb21taXR0ZWQgPSAxOwotCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQkJaWYgKElTX0VSUih0cmFucykpCiAJCQkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKQEAgLTMzMDQsMTAgKzMzMTQsNiBAQAogCWlmIChyZXNlcnZlZCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCS8qIG5vdGhpbmcgdG8gc2hyaW5rIC0gbm90aGluZyB0byByZWNsYWltICovCi0JaWYgKHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzID09IDApCi0JCXJldHVybiAwOwotCiAJbWF4X3JlY2xhaW0gPSBtaW4ocmVzZXJ2ZWQsIHRvX3JlY2xhaW0pOwogCiAJd2hpbGUgKGxvb3BzIDwgMTAyNCkgewpAQCAtMzQ3Miw3ICszNDc4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSAtRU5PU1BDOwotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpCiAJCWdvdG8gb3V0OwogCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0zNjk5LDcgKzM3MDUsNyBAQAogCQlpZiAodHJhbnMpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJQlVHX09OKElTX0VSUih0cmFucykpOwogCQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQlyZXR1cm4gMDsKQEAgLTM4MzcsNiArMzg0MywzNyBAQAogCVdBUk5fT04oZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2LnJlc2VydmVkID4gMCk7CiB9CiAKK2ludCBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2KQoreworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKnRyYW5zX3JzdiA9ICZyb290LT5mc19pbmZvLT50cmFuc19ibG9ja19yc3Y7CisJdTY0IG51bV9ieXRlczsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUcnVuY2F0ZSBzaG91bGQgYmUgZnJlZWluZyBkYXRhLCBidXQgZ2l2ZSB1cyAyIGl0ZW1zIGp1c3QgaW4gY2FzZSBpdAorCSAqIG5lZWRzIHRvIHVzZSBzb21lIHNwYWNlLiAgV2UgbWF5IHdhbnQgdG8gYmUgc21hcnRlciBhYm91dCB0aGlzIGluIHRoZQorCSAqIGZ1dHVyZS4KKwkgKi8KKwludW1fYnl0ZXMgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgMik7CisKKwkvKiBXZSBhbHJlYWR5IGhhdmUgZW5vdWdoIGJ5dGVzLCBqdXN0IHJldHVybiAqLworCWlmIChyc3YtPnJlc2VydmVkID49IG51bV9ieXRlcykKKwkJcmV0dXJuIDA7CisKKwludW1fYnl0ZXMgLT0gcnN2LT5yZXNlcnZlZDsKKworCS8qCisJICogWW91IHNob3VsZCBoYXZlIHJlc2VydmVkIGVub3VnaCBzcGFjZSBiZWZvcmUgaGFuZCB0byBkbyB0aGlzLCBzbyB0aGlzCisJICogc2hvdWxkIG5vdCBmYWlsLgorCSAqLworCXJldCA9IGJsb2NrX3Jzdl9taWdyYXRlX2J5dGVzKHRyYW5zX3JzdiwgcnN2LCBudW1fYnl0ZXMpOworCUJVR19PTihyZXQpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBidHJmc190cmFuc19yZXNlcnZlX21ldGFkYXRhKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgaW50IG51bV9pdGVtcykKQEAgLTM4NzcsMjMgKzM5MTQsMTggQEAKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpkc3RfcnN2ID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdjsKIAogCS8qCi0JICogb25lIGZvciBkZWxldGluZyBvcnBoYW4gaXRlbSwgb25lIGZvciB1cGRhdGluZyBpbm9kZSBhbmQKLQkgKiB0d28gZm9yIGNhbGxpbmcgYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXMuCi0JICoKLQkgKiBidHJmc190cnVuY2F0ZV9pbm9kZV9pdGVtcyBpcyBhIGRlbGV0ZSBvcGVyYXRpb24sIGl0IGZyZWVzCi0JICogbW9yZSBzcGFjZSB0aGFuIGl0IHVzZXMgaW4gbW9zdCBjYXNlcy4gU28gdHdvIHVuaXRzIG9mCi0JICogbWV0YWRhdGEgc3BhY2Ugc2hvdWxkIGJlIGVub3VnaCBmb3IgY2FsbGluZyBpdCBtYW55IHRpbWVzLgotCSAqIElmIGFsbCBvZiB0aGUgbWV0YWRhdGEgc3BhY2UgaXMgdXNlZCwgd2UgY2FuIGNvbW1pdAotCSAqIHRyYW5zYWN0aW9uIGFuZCB1c2Ugc3BhY2UgaXQgZnJlZWQuCisJICogV2UgbmVlZCB0byBob2xkIHNwYWNlIGluIG9yZGVyIHRvIGRlbGV0ZSBvdXIgb3JwaGFuIGl0ZW0gb25jZSB3ZSd2ZQorCSAqIGFkZGVkIGl0LCBzbyB0aGlzIHRha2VzIHRoZSByZXNlcnZhdGlvbiBzbyB3ZSBjYW4gcmVsZWFzZSBpdCBsYXRlcgorCSAqIHdoZW4gd2UgYXJlIHRydWx5IGRvbmUgd2l0aCB0aGUgb3JwaGFuIGl0ZW0uCiAJICovCi0JdTY0IG51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCA0KTsKKwl1NjQgbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCXJldHVybiBibG9ja19yc3ZfbWlncmF0ZV9ieXRlcyhzcmNfcnN2LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwogfQogCiB2b2lkIGJ0cmZzX29ycGhhbl9yZWxlYXNlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKLQl1NjQgbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDQpOworCXU2NCBudW1fYnl0ZXMgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgMSk7CiAJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdiwgbnVtX2J5dGVzKTsKIH0KIApAQCAtNDgxMCw3ICs0ODQyLDcgQEAKIAkJCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCBlbXB0eV9zaXplLAogCQkJCSAgICAgdTY0IHNlYXJjaF9zdGFydCwgdTY0IHNlYXJjaF9lbmQsCiAJCQkJICAgICB1NjQgaGludF9ieXRlLCBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMsCi0JCQkJICAgICBpbnQgZGF0YSkKKwkJCQkgICAgIHU2NCBkYXRhKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gb3JpZ19yb290LT5mc19pbmZvLT5leHRlbnRfcm9vdDsKQEAgLTQ4MzcsNyArNDg2OSw3IEBACiAKIAlzcGFjZV9pbmZvID0gX19maW5kX3NwYWNlX2luZm8ocm9vdC0+ZnNfaW5mbywgZGF0YSk7CiAJaWYgKCFzcGFjZV9pbmZvKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTm8gc3BhY2UgaW5mbyBmb3IgJWRcbiIsIGRhdGEpOworCQlwcmludGsoS0VSTl9FUlIgIk5vIHNwYWNlIGluZm8gZm9yICVsbHVcbiIsIGRhdGEpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKQEAgLTQ5ODcsNiArNTAxOSwxNSBAQAogCQlpZiAodW5saWtlbHkoYmxvY2tfZ3JvdXAtPnJvKSkKIAkJCWdvdG8gbG9vcDsKIAorCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bC0+dHJlZV9sb2NrKTsKKwkJaWYgKGNhY2hlZCAmJgorCQkgICAgYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsLT5mcmVlX3NwYWNlIDwKKwkJICAgIG51bV9ieXRlcyArIGVtcHR5X3NpemUpIHsKKwkJCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9jdGwtPnRyZWVfbG9jayk7CisJCQlnb3RvIGxvb3A7CisJCX0KKwkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bC0+dHJlZV9sb2NrKTsKKwogCQkvKgogCQkgKiBPayB3ZSB3YW50IHRvIHRyeSBhbmQgdXNlIHRoZSBjbHVzdGVyIGFsbG9jYXRvciwgc28gbGV0cyBsb29rCiAJCSAqIHRoZXJlLCB1bmxlc3Mgd2UgYXJlIG9uIExPT1BfTk9fRU1QVFlfU0laRSwgc2luY2Ugd2Ugd2lsbApAQCAtNTE1MCw2ICs1MTkxLDcgQEAKIAkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBvZmZzZXQsCiAJCQkJCSAgICAgc2VhcmNoX3N0YXJ0IC0gb2Zmc2V0KTsKIAkJQlVHX09OKG9mZnNldCA+IHNlYXJjaF9zdGFydCk7CisJCWJ0cmZzX3B1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CiAJCWJyZWFrOwogbG9vcDoKIAkJZmFpbGVkX2NsdXN0ZXJfcmVmaWxsID0gZmFsc2U7CkBAIC01MTcyLDkgKzUyMTQsNyBAQAogCSAqIExPT1BfTk9fRU1QVFlfU0laRSwgc2V0IGVtcHR5X3NpemUgYW5kIGVtcHR5X2NsdXN0ZXIgdG8gMCBhbmQgdHJ5CiAJICoJCQlhZ2FpbgogCSAqLwotCWlmICghaW5zLT5vYmplY3RpZCAmJiBsb29wIDwgTE9PUF9OT19FTVBUWV9TSVpFICYmCi0JICAgIChmb3VuZF91bmNhY2hlZF9iZyB8fCBlbXB0eV9zaXplIHx8IGVtcHR5X2NsdXN0ZXIgfHwKLQkgICAgIGFsbG93ZWRfY2h1bmtfYWxsb2MpKSB7CisJaWYgKCFpbnMtPm9iamVjdGlkICYmIGxvb3AgPCBMT09QX05PX0VNUFRZX1NJWkUpIHsKIAkJaW5kZXggPSAwOwogCQlpZiAobG9vcCA9PSBMT09QX0ZJTkRfSURFQUwgJiYgZm91bmRfdW5jYWNoZWRfYmcpIHsKIAkJCWZvdW5kX3VuY2FjaGVkX2JnID0gZmFsc2U7CkBAIC01MjE0LDQyICs1MjU0LDM5IEBACiAJCQlnb3RvIHNlYXJjaDsKIAkJfQogCi0JCWlmIChsb29wIDwgTE9PUF9DQUNISU5HX1dBSVQpIHsKLQkJCWxvb3ArKzsKLQkJCWdvdG8gc2VhcmNoOwotCQl9CisJCWxvb3ArKzsKIAogCQlpZiAobG9vcCA9PSBMT09QX0FMTE9DX0NIVU5LKSB7CisJCSAgICAgICBpZiAoYWxsb3dlZF9jaHVua19hbGxvYykgeworCQkJCXJldCA9IGRvX2NodW5rX2FsbG9jKHRyYW5zLCByb290LCBudW1fYnl0ZXMgKworCQkJCQkJICAgICAyICogMTAyNCAqIDEwMjQsIGRhdGEsCisJCQkJCQkgICAgIENIVU5LX0FMTE9DX0xJTUlURUQpOworCQkJCWFsbG93ZWRfY2h1bmtfYWxsb2MgPSAwOworCQkJCWlmIChyZXQgPT0gMSkKKwkJCQkJZG9uZV9jaHVua19hbGxvYyA9IDE7CisJCQl9IGVsc2UgaWYgKCFkb25lX2NodW5rX2FsbG9jICYmCisJCQkJICAgc3BhY2VfaW5mby0+Zm9yY2VfYWxsb2MgPT0KKwkJCQkgICBDSFVOS19BTExPQ19OT19GT1JDRSkgeworCQkJCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gQ0hVTktfQUxMT0NfTElNSVRFRDsKKwkJCX0KKworCQkgICAgICAgLyoKKwkJCSogV2UgZGlkbid0IGFsbG9jYXRlIGEgY2h1bmssIGdvIGFoZWFkIGFuZCBkcm9wIHRoZQorCQkJKiBlbXB0eSBzaXplIGFuZCBsb29wIGFnYWluLgorCQkJKi8KKwkJICAgICAgIGlmICghZG9uZV9jaHVua19hbGxvYykKKwkJCSAgICAgICBsb29wID0gTE9PUF9OT19FTVBUWV9TSVpFOworCQl9CisKKwkJaWYgKGxvb3AgPT0gTE9PUF9OT19FTVBUWV9TSVpFKSB7CiAJCQllbXB0eV9zaXplID0gMDsKIAkJCWVtcHR5X2NsdXN0ZXIgPSAwOwogCQl9CiAKLQkJaWYgKGFsbG93ZWRfY2h1bmtfYWxsb2MpIHsKLQkJCXJldCA9IGRvX2NodW5rX2FsbG9jKHRyYW5zLCByb290LCBudW1fYnl0ZXMgKwotCQkJCQkgICAgIDIgKiAxMDI0ICogMTAyNCwgZGF0YSwKLQkJCQkJICAgICBDSFVOS19BTExPQ19MSU1JVEVEKTsKLQkJCWFsbG93ZWRfY2h1bmtfYWxsb2MgPSAwOwotCQkJZG9uZV9jaHVua19hbGxvYyA9IDE7Ci0JCX0gZWxzZSBpZiAoIWRvbmVfY2h1bmtfYWxsb2MgJiYKLQkJCSAgIHNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID09IENIVU5LX0FMTE9DX05PX0ZPUkNFKSB7Ci0JCQlzcGFjZV9pbmZvLT5mb3JjZV9hbGxvYyA9IENIVU5LX0FMTE9DX0xJTUlURUQ7Ci0JCX0KLQotCQlpZiAobG9vcCA8IExPT1BfTk9fRU1QVFlfU0laRSkgewotCQkJbG9vcCsrOwotCQkJZ290byBzZWFyY2g7Ci0JCX0KLQkJcmV0ID0gLUVOT1NQQzsKKwkJZ290byBzZWFyY2g7CiAJfSBlbHNlIGlmICghaW5zLT5vYmplY3RpZCkgewogCQlyZXQgPSAtRU5PU1BDOwotCX0KLQotCS8qIHdlIGZvdW5kIHdoYXQgd2UgbmVlZGVkICovCi0JaWYgKGlucy0+b2JqZWN0aWQpIHsKLQkJaWYgKCEoZGF0YSAmIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpKQotCQkJdHJhbnMtPmJsb2NrX2dyb3VwID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZDsKLQotCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOworCX0gZWxzZSBpZiAoaW5zLT5vYmplY3RpZCkgewogCQlyZXQgPSAwOwogCX0KIApAQCAtNjUyNiw3ICs2NTYzLDcgQEAKIAogCUJVR19PTihjYWNoZS0+cm8pOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAKIAlhbGxvY19mbGFncyA9IHVwZGF0ZV9ibG9ja19ncm91cF9mbGFncyhyb290LCBjYWNoZS0+ZmxhZ3MpOwpAQCAtNjg4Miw2ICs2OTE5LDcgQEAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CisJcGF0aC0+cmVhZGEgPSAxOwogCiAJY2FjaGVfZ2VuID0gYnRyZnNfc3VwZXJfY2FjaGVfZ2VuZXJhdGlvbigmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAJaWYgKGNhY2hlX2dlbiAhPSAwICYmCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uYyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCmluZGV4IGM1ZDlmYmIuLjcwNTVkMTEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCkBAIC0xNDc2LDcgKzE0NzYsNyBAQAogCQkJaWYgKHRvdGFsX2J5dGVzID49IG1heF9ieXRlcykKIAkJCQlicmVhazsKIAkJCWlmICghZm91bmQpIHsKLQkJCQkqc3RhcnQgPSBzdGF0ZS0+c3RhcnQ7CisJCQkJKnN0YXJ0ID0gbWF4KGN1cl9zdGFydCwgc3RhdGUtPnN0YXJ0KTsKIAkJCQlmb3VuZCA9IDE7CiAJCQl9CiAJCQlsYXN0ID0gc3RhdGUtPmVuZDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5oIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKaW5kZXggNGU4NDQ1YS4uYTExYTkyZSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmgKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKQEAgLTEyNiw5ICsxMjYsOSBAQAogCXVuc2lnbmVkIGxvbmcgbWFwX2xlbjsKIAlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZTsKIAl1bnNpZ25lZCBsb25nIGJmbGFnczsKLQlhdG9taWNfdCByZWZzOwogCXN0cnVjdCBsaXN0X2hlYWQgbGVha19saXN0OwogCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKKwlhdG9taWNfdCByZWZzOwogCiAJLyogdGhlIHNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBtb3N0IG9wZXJhdGlvbnMgKi8KIAlzcGlubG9ja190IGxvY2s7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggYzZhMjJkNy4uZmE0ZWYxOCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBBVVRPX0RFRlJBRykpCiAJCXJldHVybiAwOwogCi0JaWYgKHJvb3QtPmZzX2luZm8tPmNsb3NpbmcpCisJaWYgKGJ0cmZzX2ZzX2Nsb3Npbmcocm9vdC0+ZnNfaW5mbykpCiAJCXJldHVybiAwOwogCiAJaWYgKEJUUkZTX0koaW5vZGUpLT5pbl9kZWZyYWcpCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlpZiAoIWRlZnJhZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZWZyYWctPmlubyA9IGlub2RlLT5pX2lubzsKKwlkZWZyYWctPmlubyA9IGJ0cmZzX2lubyhpbm9kZSk7CiAJZGVmcmFnLT50cmFuc2lkID0gdHJhbnNpZDsKIAlkZWZyYWctPnJvb3QgPSByb290LT5yb290X2tleS5vYmplY3RpZDsKIApAQCAtMjI5LDcgKzIyOSw3IEBACiAJCWZpcnN0X2lubyA9IGRlZnJhZy0+aW5vICsgMTsKIAkJcmJfZXJhc2UoJmRlZnJhZy0+cmJfbm9kZSwgJmZzX2luZm8tPmRlZnJhZ19pbm9kZXMpOwogCi0JCWlmIChmc19pbmZvLT5jbG9zaW5nKQorCQlpZiAoYnRyZnNfZnNfY2xvc2luZyhmc19pbmZvKSkKIAkJCWdvdG8gbmV4dF9mcmVlOwogCiAJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5kZWZyYWdfaW5vZGVzX2xvY2spOwpAQCAtMTQ4MCwxNCArMTQ4MCwxMiBAQAogCSAqIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCB3ZSBjYW4gYmFpbCBvdXQgbm93IHdpdGhvdXQgYW55CiAJICogc3luY2luZwogCSAqLwotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlzbXBfbWIoKTsKIAlpZiAoQlRSRlNfSShpbm9kZSktPmxhc3RfdHJhbnMgPD0KIAkgICAgcm9vdC0+ZnNfaW5mby0+bGFzdF90cmFuc19jb21taXR0ZWQpIHsKIAkJQlRSRlNfSShpbm9kZSktPmxhc3RfdHJhbnMgPSAwOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJZ290byBvdXQ7CiAJfQotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCiAJLyoKIAkgKiBvayB3ZSBoYXZlbid0IGNvbW1pdHRlZCB0aGUgdHJhbnNhY3Rpb24geWV0LCBsZXRzIGRvIGEgY29tbWl0CmRpZmYgLS1naXQgYS9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKaW5kZXggNzBkNDU3OS4uYmYwZDYxNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCisrKyBiL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYwpAQCAtOTgsNyArOTgsNyBAQAogCQlyZXR1cm4gaW5vZGU7CiAKIAlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKLQlpZiAoIXJvb3QtPmZzX2luZm8tPmNsb3NpbmcpIHsKKwlpZiAoIWJ0cmZzX2ZzX2Nsb3Npbmcocm9vdC0+ZnNfaW5mbykpIHsKIAkJYmxvY2tfZ3JvdXAtPmlub2RlID0gaWdyYWIoaW5vZGUpOwogCQlibG9ja19ncm91cC0+aXJlZiA9IDE7CiAJfQpAQCAtMjUwLDcgKzI1MCw3IEBACiAJcGdvZmZfdCBpbmRleCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlX29mZnNldDsKIAlpbnQgbnVtX2NoZWNrc3VtczsKLQlpbnQgcmV0ID0gMCwgcmV0MjsKKwlpbnQgcmV0ID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBzKTsKIApAQCAtNDAyLDcgKzQwMiwxNCBAQAogCQkJCXNwaW5fbG9jaygmY3RsLT50cmVlX2xvY2spOwogCQkJCXJldCA9IGxpbmtfZnJlZV9zcGFjZShjdGwsIGUpOwogCQkJCXNwaW5fdW5sb2NrKCZjdGwtPnRyZWVfbG9jayk7Ci0JCQkJQlVHX09OKHJldCk7CisJCQkJaWYgKHJldCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIkR1cGxpY2F0ZSBlbnRyaWVzIGluICIKKwkJCQkJICAgICAgICJmcmVlIHNwYWNlIGNhY2hlLCBkdW1waW5nXG4iKTsKKwkJCQkJa3VubWFwKHBhZ2UpOworCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlnb3RvIGZyZWVfY2FjaGU7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQllLT5iaXRtYXAgPSBremFsbG9jKFBBR0VfQ0FDSEVfU0laRSwgR0ZQX05PRlMpOwogCQkJCWlmICghZS0+Yml0bWFwKSB7CkBAIC00MTQsMTAgKzQyMSwxOCBAQAogCQkJCQlnb3RvIGZyZWVfY2FjaGU7CiAJCQkJfQogCQkJCXNwaW5fbG9jaygmY3RsLT50cmVlX2xvY2spOwotCQkJCXJldDIgPSBsaW5rX2ZyZWVfc3BhY2UoY3RsLCBlKTsKKwkJCQlyZXQgPSBsaW5rX2ZyZWVfc3BhY2UoY3RsLCBlKTsKIAkJCQljdGwtPnRvdGFsX2JpdG1hcHMrKzsKIAkJCQljdGwtPm9wLT5yZWNhbGNfdGhyZXNob2xkcyhjdGwpOwogCQkJCXNwaW5fdW5sb2NrKCZjdGwtPnRyZWVfbG9jayk7CisJCQkJaWYgKHJldCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIkR1cGxpY2F0ZSBlbnRyaWVzIGluICIKKwkJCQkJICAgICAgICJmcmVlIHNwYWNlIGNhY2hlLCBkdW1waW5nXG4iKTsKKwkJCQkJa3VubWFwKHBhZ2UpOworCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlnb3RvIGZyZWVfY2FjaGU7CisJCQkJfQogCQkJCWxpc3RfYWRkX3RhaWwoJmUtPmxpc3QsICZiaXRtYXBzKTsKIAkJCX0KIApAQCAtNDc4LDggKzQ5Myw3IEBACiAJICogSWYgd2UncmUgdW5tb3VudGluZyB0aGVuIGp1c3QgcmV0dXJuLCBzaW5jZSB0aGlzIGRvZXMgYSBzZWFyY2ggb24gdGhlCiAJICogbm9ybWFsIHJvb3QgYW5kIG5vdCB0aGUgY29tbWl0IHJvb3QgYW5kIHdlIGNvdWxkIGRlYWRsb2NrLgogCSAqLwotCXNtcF9tYigpOwotCWlmIChmc19pbmZvLT5jbG9zaW5nKQorCWlmIChidHJmc19mc19jbG9zaW5nKGZzX2luZm8pKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC01NzUsMTAgKzU4OSwyNSBAQAogCiAJbnVtX3BhZ2VzID0gKGlfc2l6ZV9yZWFkKGlub2RlKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+CiAJCVBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkvKiBTaW5jZSB0aGUgZmlyc3QgcGFnZSBoYXMgYWxsIG9mIG91ciBjaGVja3N1bXMgYW5kIG91ciBnZW5lcmF0aW9uIHdlCisJICogbmVlZCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbnRvIHRoZSBwYWdlIHRoYXQgd2UgY2FuIHN0YXJ0IHdyaXRpbmcKKwkgKiBvdXIgZW50cmllcy4KKwkgKi8KKwlmaXJzdF9wYWdlX29mZnNldCA9IChzaXplb2YodTMyKSAqIG51bV9wYWdlcykgKyBzaXplb2YodTY0KTsKKwogCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaW5vZGUtPmlfbWFwcGluZyk7CiAJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBpbm9kZS0+aV9zaXplICYKIAkJCQkgfihyb290LT5zZWN0b3JzaXplIC0gMSksICh1NjQpLTEpOwogCisJLyogbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoYXQgZmlyc3QgcGFnZSAqLworCWlmIChmaXJzdF9wYWdlX29mZnNldCArIHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSkgPj0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCS8qIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLCB3aGVyZSB3ZSBhbHNvIHJldHVybiAwICovCisJCXByaW50ayhLRVJOX0NSSVQgIkJ0cmZzOiBmcmVlIHNwYWNlIGNhY2hlIHdhcyB0b28gYmlnIGZvciB0aGUgY3JjIHBhZ2VcbiIpOworCQlyZXQgPSAwOworCQlnb3RvIG91dF91cGRhdGU7CisJfQorCiAJLyogV2UgbmVlZCBhIGNoZWNrc3VtIHBlciBwYWdlLiAqLwogCWNyYyA9IGNoZWNrc3VtcyA9IGt6YWxsb2Moc2l6ZW9mKHUzMikgKiBudW1fcGFnZXMsIEdGUF9OT0ZTKTsKIAlpZiAoIWNyYykKQEAgLTU5MCwxMiArNjE5LDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCS8qIFNpbmNlIHRoZSBmaXJzdCBwYWdlIGhhcyBhbGwgb2Ygb3VyIGNoZWNrc3VtcyBhbmQgb3VyIGdlbmVyYXRpb24gd2UKLQkgKiBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGludG8gdGhlIHBhZ2UgdGhhdCB3ZSBjYW4gc3RhcnQgd3JpdGluZwotCSAqIG91ciBlbnRyaWVzLgotCSAqLwotCWZpcnN0X3BhZ2Vfb2Zmc2V0ID0gKHNpemVvZih1MzIpICogbnVtX3BhZ2VzKSArIHNpemVvZih1NjQpOwotCiAJLyogR2V0IHRoZSBjbHVzdGVyIGZvciB0aGlzIGJsb2NrX2dyb3VwIGlmIGl0IGV4aXN0cyAqLwogCWlmIChibG9ja19ncm91cCAmJiAhbGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmNsdXN0ZXJfbGlzdCkpCiAJCWNsdXN0ZXIgPSBsaXN0X2VudHJ5KGJsb2NrX2dyb3VwLT5jbHVzdGVyX2xpc3QubmV4dCwKQEAgLTg1NywxMiArODgwLDE0IEBACiAJcmV0ID0gMTsKIAogb3V0X2ZyZWU6CisJa2ZyZWUoY2hlY2tzdW1zKTsKKwlrZnJlZShwYWdlcyk7CisKK291dF91cGRhdGU6CiAJaWYgKHJldCAhPSAxKSB7CiAJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIDAsIGluZGV4KTsKIAkJQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24gPSAwOwogCX0KLQlrZnJlZShjaGVja3N1bXMpOwotCWtmcmVlKHBhZ2VzKTsKIAlidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTYzLDEwICs5ODgsMTYgQEAKIAkJCSAqIGxvZ2ljYWxseS4KIAkJCSAqLwogCQkJaWYgKGJpdG1hcCkgewotCQkJCVdBUk5fT04oaW5mby0+Yml0bWFwKTsKKwkJCQlpZiAoaW5mby0+Yml0bWFwKSB7CisJCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQkJfQogCQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CiAJCQl9IGVsc2UgewotCQkJCVdBUk5fT04oIWluZm8tPmJpdG1hcCk7CisJCQkJaWYgKCFpbmZvLT5iaXRtYXApIHsKKwkJCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCQl9CiAJCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwogCQkJfQogCQl9CkBAIC0xMzg2LDYgKzE0MTcsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHU2NCBhZGRfYnl0ZXNfdG9fYml0bWFwKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlICppbmZvLCB1NjQgb2Zmc2V0LAorCQkJICAgICAgIHU2NCBieXRlcykKK3sKKwl1NjQgYnl0ZXNfdG9fc2V0ID0gMDsKKwl1NjQgZW5kOworCisJZW5kID0gaW5mby0+b2Zmc2V0ICsgKHU2NCkoQklUU19QRVJfQklUTUFQICogY3RsLT51bml0KTsKKworCWJ5dGVzX3RvX3NldCA9IG1pbihlbmQgLSBvZmZzZXQsIGJ5dGVzKTsKKworCWJpdG1hcF9zZXRfYml0cyhjdGwsIGluZm8sIG9mZnNldCwgYnl0ZXNfdG9fc2V0KTsKKworCXJldHVybiBieXRlc190b19zZXQ7CisKK30KKwogc3RhdGljIGJvb2wgdXNlX2JpdG1hcChzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCwKIAkJICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm8pCiB7CkBAIC0xNDIyLDEyICsxNDcwLDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9vcCBmcmVlX3NwYWNlX29wID0geworCS5yZWNhbGNfdGhyZXNob2xkcwk9IHJlY2FsY3VsYXRlX3RocmVzaG9sZHMsCisJLnVzZV9iaXRtYXAJCT0gdXNlX2JpdG1hcCwKK307CisKIHN0YXRpYyBpbnQgaW5zZXJ0X2ludG9fYml0bWFwKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsLAogCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm8pCiB7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmJpdG1hcF9pbmZvOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAgPSBOVUxMOwogCWludCBhZGRlZCA9IDA7Ci0JdTY0IGJ5dGVzLCBvZmZzZXQsIGVuZDsKKwl1NjQgYnl0ZXMsIG9mZnNldCwgYnl0ZXNfYWRkZWQ7CiAJaW50IHJldDsKIAogCWJ5dGVzID0gaW5mby0+Ynl0ZXM7CkBAIC0xNDM2LDcgKzE0OTAsNDkgQEAKIAlpZiAoIWN0bC0+b3AtPnVzZV9iaXRtYXAoY3RsLCBpbmZvKSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoY3RsLT5vcCA9PSAmZnJlZV9zcGFjZV9vcCkKKwkJYmxvY2tfZ3JvdXAgPSBjdGwtPnByaXZhdGU7CiBhZ2FpbjoKKwkvKgorCSAqIFNpbmNlIHdlIGxpbmsgYml0bWFwcyByaWdodCBpbnRvIHRoZSBjbHVzdGVyIHdlIG5lZWQgdG8gc2VlIGlmIHdlCisJICogaGF2ZSBhIGNsdXN0ZXIgaGVyZSwgYW5kIGlmIHNvIGFuZCBpdCBoYXMgb3VyIGJpdG1hcCB3ZSBuZWVkIHRvIGFkZAorCSAqIHRoZSBmcmVlIHNwYWNlIHRvIHRoYXQgYml0bWFwLgorCSAqLworCWlmIChibG9ja19ncm91cCAmJiAhbGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmNsdXN0ZXJfbGlzdCkpIHsKKwkJc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqY2x1c3RlcjsKKwkJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplbnRyeTsKKworCQljbHVzdGVyID0gbGlzdF9lbnRyeShibG9ja19ncm91cC0+Y2x1c3Rlcl9saXN0Lm5leHQsCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyLAorCQkJCSAgICAgYmxvY2tfZ3JvdXBfbGlzdCk7CisJCXNwaW5fbG9jaygmY2x1c3Rlci0+bG9jayk7CisJCW5vZGUgPSByYl9maXJzdCgmY2x1c3Rlci0+cm9vdCk7CisJCWlmICghbm9kZSkgeworCQkJc3Bpbl91bmxvY2soJmNsdXN0ZXItPmxvY2spOworCQkJZ290byBub19jbHVzdGVyX2JpdG1hcDsKKwkJfQorCisJCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CisJCWlmICghZW50cnktPmJpdG1hcCkgeworCQkJc3Bpbl91bmxvY2soJmNsdXN0ZXItPmxvY2spOworCQkJZ290byBub19jbHVzdGVyX2JpdG1hcDsKKwkJfQorCisJCWlmIChlbnRyeS0+b2Zmc2V0ID09IG9mZnNldF90b19iaXRtYXAoY3RsLCBvZmZzZXQpKSB7CisJCQlieXRlc19hZGRlZCA9IGFkZF9ieXRlc190b19iaXRtYXAoY3RsLCBlbnRyeSwKKwkJCQkJCQkgIG9mZnNldCwgYnl0ZXMpOworCQkJYnl0ZXMgLT0gYnl0ZXNfYWRkZWQ7CisJCQlvZmZzZXQgKz0gYnl0ZXNfYWRkZWQ7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNsdXN0ZXItPmxvY2spOworCQlpZiAoIWJ5dGVzKSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK25vX2NsdXN0ZXJfYml0bWFwOgogCWJpdG1hcF9pbmZvID0gdHJlZV9zZWFyY2hfb2Zmc2V0KGN0bCwgb2Zmc2V0X3RvX2JpdG1hcChjdGwsIG9mZnNldCksCiAJCQkJCSAxLCAwKTsKIAlpZiAoIWJpdG1hcF9pbmZvKSB7CkBAIC0xNDQ0LDE5ICsxNTQwLDEwIEBACiAJCWdvdG8gbmV3X2JpdG1hcDsKIAl9CiAKLQllbmQgPSBiaXRtYXBfaW5mby0+b2Zmc2V0ICsgKHU2NCkoQklUU19QRVJfQklUTUFQICogY3RsLT51bml0KTsKLQotCWlmIChvZmZzZXQgPj0gYml0bWFwX2luZm8tPm9mZnNldCAmJiBvZmZzZXQgKyBieXRlcyA+IGVuZCkgewotCQliaXRtYXBfc2V0X2JpdHMoY3RsLCBiaXRtYXBfaW5mbywgb2Zmc2V0LCBlbmQgLSBvZmZzZXQpOwotCQlieXRlcyAtPSBlbmQgLSBvZmZzZXQ7Ci0JCW9mZnNldCA9IGVuZDsKLQkJYWRkZWQgPSAwOwotCX0gZWxzZSBpZiAob2Zmc2V0ID49IGJpdG1hcF9pbmZvLT5vZmZzZXQgJiYgb2Zmc2V0ICsgYnl0ZXMgPD0gZW5kKSB7Ci0JCWJpdG1hcF9zZXRfYml0cyhjdGwsIGJpdG1hcF9pbmZvLCBvZmZzZXQsIGJ5dGVzKTsKLQkJYnl0ZXMgPSAwOwotCX0gZWxzZSB7Ci0JCUJVRygpOwotCX0KKwlieXRlc19hZGRlZCA9IGFkZF9ieXRlc190b19iaXRtYXAoY3RsLCBiaXRtYXBfaW5mbywgb2Zmc2V0LCBieXRlcyk7CisJYnl0ZXMgLT0gYnl0ZXNfYWRkZWQ7CisJb2Zmc2V0ICs9IGJ5dGVzX2FkZGVkOworCWFkZGVkID0gMDsKIAogCWlmICghYnl0ZXMpIHsKIAkJcmV0ID0gMTsKQEAgLTE3MzUsMTEgKzE4MjIsNiBAQAogCSAgICAgICAiXG4iLCBjb3VudCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9vcCBmcmVlX3NwYWNlX29wID0gewotCS5yZWNhbGNfdGhyZXNob2xkcwk9IHJlY2FsY3VsYXRlX3RocmVzaG9sZHMsCi0JLnVzZV9iaXRtYXAJCT0gdXNlX2JpdG1hcCwKLX07Ci0KIHZvaWQgYnRyZnNfaW5pdF9mcmVlX3NwYWNlX2N0bChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwKQogewogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsOwpAQCAtMTgxMSw5ICsxODkzLDEyIEBACiAKIAl3aGlsZSAoKG5vZGUgPSByYl9sYXN0KCZjdGwtPmZyZWVfc3BhY2Vfb2Zmc2V0KSkgIT0gTlVMTCkgewogCQlpbmZvID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7Ci0JCXVubGlua19mcmVlX3NwYWNlKGN0bCwgaW5mbyk7Ci0JCWtmcmVlKGluZm8tPmJpdG1hcCk7Ci0JCWttZW1fY2FjaGVfZnJlZShidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgaW5mbyk7CisJCWlmICghaW5mby0+Yml0bWFwKSB7CisJCQl1bmxpbmtfZnJlZV9zcGFjZShjdGwsIGluZm8pOworCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBpbmZvKTsKKwkJfSBlbHNlIHsKKwkJCWZyZWVfYml0bWFwKGN0bCwgaW5mbyk7CisJCX0KIAkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CiAJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwogCQkJY29uZF9yZXNjaGVkKCk7CkBAIC0yMTExLDkgKzIxOTYsMTEgQEAKIC8qCiAgKiBUaGlzIHNlYXJjaGVzIHRoZSBibG9jayBncm91cCBmb3IganVzdCBleHRlbnRzIHRvIGZpbGwgdGhlIGNsdXN0ZXIgd2l0aC4KICAqLwotc3RhdGljIGludCBzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAotCQkJCSAgIHN0cnVjdCBidHJmc19mcmVlX2NsdXN0ZXIgKmNsdXN0ZXIsCi0JCQkJICAgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLCB1NjQgbWluX2J5dGVzKQorc3RhdGljIG5vaW5saW5lIGludAorc2V0dXBfY2x1c3Rlcl9ub19iaXRtYXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJCXN0cnVjdCBidHJmc19mcmVlX2NsdXN0ZXIgKmNsdXN0ZXIsCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpiaXRtYXBzLCB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMsCisJCQl1NjQgbWluX2J5dGVzKQogewogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsOwogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpmaXJzdCA9IE5VTEw7CkBAIC0yMTM1LDYgKzIyMjIsOCBAQAogCSAqIGV4dGVudCBlbnRyeS4KIAkgKi8KIAl3aGlsZSAoZW50cnktPmJpdG1hcCkgeworCQlpZiAobGlzdF9lbXB0eSgmZW50cnktPmxpc3QpKQorCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGJpdG1hcHMpOwogCQlub2RlID0gcmJfbmV4dCgmZW50cnktPm9mZnNldF9pbmRleCk7CiAJCWlmICghbm9kZSkKIAkJCXJldHVybiAtRU5PU1BDOwpAQCAtMjE1NCw4ICsyMjQzLDEyIEBACiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKIAotCQlpZiAoZW50cnktPmJpdG1hcCkKKwkJaWYgKGVudHJ5LT5iaXRtYXApIHsKKwkJCWlmIChsaXN0X2VtcHR5KCZlbnRyeS0+bGlzdCkpCisJCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGJpdG1hcHMpOwogCQkJY29udGludWU7CisJCX0KKwogCQkvKgogCQkgKiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgZW1wdHkgc2l6ZSBhbmQgdGhlIHdpbmRvdyBpcwogCQkgKiB2ZXJ5IGxhcmdlLiAgcmVzZXQgYW5kIHRyeSBhZ2FpbgpAQCAtMjIwNyw5ICsyMzAwLDExIEBACiAgKiBUaGlzIHNwZWNpZmljYWxseSBsb29rcyBmb3IgYml0bWFwcyB0aGF0IG1heSB3b3JrIGluIHRoZSBjbHVzdGVyLCB3ZSBhc3N1bWUKICAqIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCB0byBmaW5kIGV4dGVudHMgdGhhdCB3aWxsIHdvcmsuCiAgKi8KLXN0YXRpYyBpbnQgc2V0dXBfY2x1c3Rlcl9iaXRtYXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKLQkJCQlzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyICpjbHVzdGVyLAotCQkJCXU2NCBvZmZzZXQsIHU2NCBieXRlcywgdTY0IG1pbl9ieXRlcykKK3N0YXRpYyBub2lubGluZSBpbnQKK3NldHVwX2NsdXN0ZXJfYml0bWFwKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCSAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqY2x1c3RlciwKKwkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpiaXRtYXBzLCB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMsCisJCSAgICAgdTY0IG1pbl9ieXRlcykKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCA9IGJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bDsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnk7CkBAIC0yMjE5LDEwICsyMzE0LDM5IEBACiAJaWYgKGN0bC0+dG90YWxfYml0bWFwcyA9PSAwKQogCQlyZXR1cm4gLUVOT1NQQzsKIAorCS8qCisJICogRmlyc3QgY2hlY2sgb3VyIGNhY2hlZCBsaXN0IG9mIGJpdG1hcHMgYW5kIHNlZSBpZiB0aGVyZSBpcyBhbiBlbnRyeQorCSAqIGhlcmUgdGhhdCB3aWxsIHdvcmsuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgYml0bWFwcywgbGlzdCkgeworCQlpZiAoZW50cnktPmJ5dGVzIDwgbWluX2J5dGVzKQorCQkJY29udGludWU7CisJCXJldCA9IGJ0cmZzX2JpdG1hcF9jbHVzdGVyKGJsb2NrX2dyb3VwLCBlbnRyeSwgY2x1c3Rlciwgb2Zmc2V0LAorCQkJCQkgICBieXRlcywgbWluX2J5dGVzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGRvIGhhdmUgZW50cmllcyBvbiBvdXIgbGlzdCBhbmQgd2UgYXJlIGhlcmUgdGhlbiB3ZSBkaWRuJ3QgZmluZAorCSAqIGFueXRoaW5nLCBzbyBnbyBhaGVhZCBhbmQgZ2V0IHRoZSBuZXh0IGVudHJ5IGFmdGVyIHRoZSBsYXN0IGVudHJ5IGluCisJICogdGhpcyBsaXN0IGFuZCBzdGFydCB0aGUgc2VhcmNoIGZyb20gdGhlcmUuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KGJpdG1hcHMpKSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShiaXRtYXBzLT5wcmV2LCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwKKwkJCQkgICBsaXN0KTsKKwkJbm9kZSA9IHJiX25leHQoJmVudHJ5LT5vZmZzZXRfaW5kZXgpOworCQlpZiAoIW5vZGUpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKKwkJZ290byBzZWFyY2g7CisJfQorCiAJZW50cnkgPSB0cmVlX3NlYXJjaF9vZmZzZXQoY3RsLCBvZmZzZXRfdG9fYml0bWFwKGN0bCwgb2Zmc2V0KSwgMCwgMSk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9TUEM7CiAKK3NlYXJjaDoKIAlub2RlID0gJmVudHJ5LT5vZmZzZXRfaW5kZXg7CiAJZG8gewogCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBvZmZzZXRfaW5kZXgpOwpAQCAtMjI1Myw2ICsyMzc3LDggQEAKIAkJCSAgICAgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLCB1NjQgZW1wdHlfc2l6ZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCA9IGJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJpdG1hcHM7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmVudHJ5LCAqdG1wOwogCXU2NCBtaW5fYnl0ZXM7CiAJaW50IHJldDsKIApAQCAtMjI5MSwxMSArMjQxNywxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3Rlciwgb2Zmc2V0LCBieXRlcywKLQkJCQkgICAgICBtaW5fYnl0ZXMpOworCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBzKTsKKwlyZXQgPSBzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3RlciwgJmJpdG1hcHMsIG9mZnNldCwKKwkJCQkgICAgICBieXRlcywgbWluX2J5dGVzKTsKIAlpZiAocmV0KQotCQlyZXQgPSBzZXR1cF9jbHVzdGVyX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3Rlciwgb2Zmc2V0LAotCQkJCQkgICBieXRlcywgbWluX2J5dGVzKTsKKwkJcmV0ID0gc2V0dXBfY2x1c3Rlcl9iaXRtYXAoYmxvY2tfZ3JvdXAsIGNsdXN0ZXIsICZiaXRtYXBzLAorCQkJCQkgICBvZmZzZXQsIGJ5dGVzLCBtaW5fYnl0ZXMpOworCisJLyogQ2xlYXIgb3VyIHRlbXBvcmFyeSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZiaXRtYXBzLCBsaXN0KQorCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+bGlzdCk7CiAKIAlpZiAoIXJldCkgewogCQlhdG9taWNfaW5jKCZibG9ja19ncm91cC0+Y291bnQpOwpAQCAtMjQ4MSw3ICsyNjEyLDcgQEAKIAkJcmV0dXJuIGlub2RlOwogCiAJc3Bpbl9sb2NrKCZyb290LT5jYWNoZV9sb2NrKTsKLQlpZiAoIXJvb3QtPmZzX2luZm8tPmNsb3NpbmcpCisJaWYgKCFidHJmc19mc19jbG9zaW5nKHJvb3QtPmZzX2luZm8pKQogCQlyb290LT5jYWNoZV9pbm9kZSA9IGlncmFiKGlub2RlKTsKIAlzcGluX3VubG9jaygmcm9vdC0+Y2FjaGVfbG9jayk7CiAKQEAgLTI1MDQsMTIgKzI2MzUsMTQgQEAKIAlpbnQgcmV0ID0gMDsKIAl1NjQgcm9vdF9nZW4gPSBidHJmc19yb290X2dlbmVyYXRpb24oJnJvb3QtPnJvb3RfaXRlbSk7CiAKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybiAwOworCiAJLyoKIAkgKiBJZiB3ZSdyZSB1bm1vdW50aW5nIHRoZW4ganVzdCByZXR1cm4sIHNpbmNlIHRoaXMgZG9lcyBhIHNlYXJjaCBvbiB0aGUKIAkgKiBub3JtYWwgcm9vdCBhbmQgbm90IHRoZSBjb21taXQgcm9vdCBhbmQgd2UgY291bGQgZGVhZGxvY2suCiAJICovCi0Jc21wX21iKCk7Ci0JaWYgKGZzX2luZm8tPmNsb3NpbmcpCisJaWYgKGJ0cmZzX2ZzX2Nsb3NpbmcoZnNfaW5mbykpCiAJCXJldHVybiAwOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKQEAgLTI1NDMsNiArMjY3Niw5IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgcmV0OwogCisJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBJTk9ERV9NQVBfQ0FDSEUpKQorCQlyZXR1cm4gMDsKKwogCWlub2RlID0gbG9va3VwX2ZyZWVfaW5vX2lub2RlKHJvb3QsIHBhdGgpOwogCWlmIChJU19FUlIoaW5vZGUpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKaW5kZXggMzI2MmNkMS4uYjQwODdlMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUtbWFwLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKQEAgLTM4LDYgKzM4LDkgQEAKIAlpbnQgc2xvdDsKIAlpbnQgcmV0OwogCisJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBJTk9ERV9NQVBfQ0FDSEUpKQorCQlyZXR1cm4gMDsKKwogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU5LDggKzYyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAl3aGlsZSAoMSkgewotCQlzbXBfbWIoKTsKLQkJaWYgKGZzX2luZm8tPmNsb3NpbmcpCisJCWlmIChidHJmc19mc19jbG9zaW5nKGZzX2luZm8pKQogCQkJZ290byBvdXQ7CiAKIAkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwpAQCAtMTQxLDYgKzE0Myw5IEBACiAJaW50IHJldDsKIAl1NjQgb2JqZWN0aWQ7CiAKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybjsKKwogCXNwaW5fbG9jaygmcm9vdC0+Y2FjaGVfbG9jayk7CiAJaWYgKHJvb3QtPmNhY2hlZCAhPSBCVFJGU19DQUNIRV9OTykgewogCQlzcGluX3VubG9jaygmcm9vdC0+Y2FjaGVfbG9jayk7CkBAIC0xNzgsNiArMTgzLDkgQEAKIAogaW50IGJ0cmZzX2ZpbmRfZnJlZV9pbm8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCAqb2JqZWN0aWQpCiB7CisJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBJTk9ERV9NQVBfQ0FDSEUpKQorCQlyZXR1cm4gYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHJvb3QsIG9iamVjdGlkKTsKKwogYWdhaW46CiAJKm9iamVjdGlkID0gYnRyZnNfZmluZF9pbm9fZm9yX2FsbG9jKHJvb3QpOwogCkBAIC0yMDEsNiArMjA5LDEwIEBACiB7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfY3RsICpjdGwgPSByb290LT5mcmVlX2lub19jdGw7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfY3RsICpwaW5uZWQgPSByb290LT5mcmVlX2lub19waW5uZWQ7CisKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybjsKKwogYWdhaW46CiAJaWYgKHJvb3QtPmNhY2hlZCA9PSBCVFJGU19DQUNIRV9GSU5JU0hFRCkgewogCQlfX2J0cmZzX2FkZF9mcmVlX3NwYWNlKGN0bCwgb2JqZWN0aWQsIDEpOwpAQCAtMjUwLDYgKzI2Miw5IEBACiAJc3RydWN0IHJiX25vZGUgKm47CiAJdTY0IGNvdW50OwogCisJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBJTk9ERV9NQVBfQ0FDSEUpKQorCQlyZXR1cm47CisKIAl3aGlsZSAoMSkgewogCQluID0gcmJfZmlyc3QocmJyb290KTsKIAkJaWYgKCFuKQpAQCAtMzg4LDkgKzQwMywyNCBAQAogCWludCBwcmVhbGxvYzsKIAlib29sIHJldHJ5ID0gZmFsc2U7CiAKKwkvKiBvbmx5IGZzIHRyZWUgYW5kIHN1YnZvbC9zbmFwIG5lZWRzIGlubyBjYWNoZSAqLworCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19GU19UUkVFX09CSkVDVElEICYmCisJICAgIChyb290LT5yb290X2tleS5vYmplY3RpZCA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQgfHwKKwkgICAgIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID4gQlRSRlNfTEFTVF9GUkVFX09CSkVDVElEKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEb24ndCBzYXZlIGlub2RlIGNhY2hlIGlmIHdlIGFyZSBkZWxldGluZyB0aGlzIHJvb3QgKi8KKwlpZiAoYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDAgJiYKKwkgICAgcm9vdCAhPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3QpCisJCXJldHVybiAwOworCisJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBJTk9ERV9NQVBfQ0FDSEUpKQorCQlyZXR1cm4gMDsKKwogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKKwogYWdhaW46CiAJaW5vZGUgPSBsb29rdXBfZnJlZV9pbm9faW5vZGUocm9vdCwgcGF0aCk7CiAJaWYgKElTX0VSUihpbm9kZSkgJiYgUFRSX0VSUihpbm9kZSkgIT0gLUVOT0VOVCkgewpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUuYyBiL2ZzL2J0cmZzL2lub2RlLmMKaW5kZXggMzlhOWQ1Ny4uMzYwMWYwYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUuYworKysgYi9mcy9idHJmcy9pbm9kZS5jCkBAIC0xMzgsNyArMTM4LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7Ci0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAKIAlrZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOwogCWtleS5vZmZzZXQgPSBzdGFydDsKQEAgLTQyNiw5ICs0MjUsOCBAQAogCQl9CiAJfQogCWlmIChzdGFydCA9PSAwKSB7Ci0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQlCVUdfT04oSVNfRVJSKHRyYW5zKSk7Ci0JCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAogCQkvKiBsZXRzIHRyeSB0byBtYWtlIGFuIGlubGluZSBleHRlbnQgKi8KQEAgLTYyMyw4ICs2MjEsOSBAQAogCQkJICAgIGFzeW5jX2V4dGVudC0+c3RhcnQgKyBhc3luY19leHRlbnQtPnJhbV9zaXplIC0gMSwKIAkJCSAgICBHRlBfTk9GUyk7CiAKLQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKKwkJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Y7CiAJCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHRyYW5zLCByb290LAogCQkJCQkgICBhc3luY19leHRlbnQtPmNvbXByZXNzZWRfc2l6ZSwKIAkJCQkJICAgYXN5bmNfZXh0ZW50LT5jb21wcmVzc2VkX3NpemUsCkBAIC03OTMsOSArNzkyLDggQEAKIAlpbnQgcmV0ID0gMDsKIAogCUJVR19PTihpc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKSk7Ci0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7Ci0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Y7CiAKIAludW1fYnl0ZXMgPSAoZW5kIC0gc3RhcnQgKyBibG9ja3NpemUpICYgfihibG9ja3NpemUgLSAxKTsKQEAgLTEwNzcsMTAgKzEwNzUsMTIgQEAKIAlub2xvY2sgPSBpc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKTsKIAogCWlmIChub2xvY2spCi0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCk7CiAJZWxzZQotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKKwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKKwl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAogCWNvd19zdGFydCA9ICh1NjQpLTE7CiAJY3VyX29mZnNldCA9IHN0YXJ0OwpAQCAtMTUxOSw4ICsxNTE5LDYgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bTsKIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdW0sIGxpc3QsIGxpc3QpIHsKIAkJYnRyZnNfY3N1bV9maWxlX2Jsb2Nrcyh0cmFucywKIAkJICAgICAgIEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5jc3VtX3Jvb3QsIHN1bSk7CkBAIC0xNzM1LDExICsxNzMzLDEwIEBACiAJCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZF9leHRlbnQpOwogCQlpZiAoIXJldCkgewogCQkJaWYgKG5vbG9jaykKLQkJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb25fbm9sb2NrKHJvb3QsIDEpOworCQkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCk7CiAJCQllbHNlCi0JCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCQkJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Y7CiAJCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAkJCUJVR19PTihyZXQpOwpAQCAtMTc1MiwxMSArMTc0OSwxMCBAQAogCQkJIDAsICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKIAogCWlmIChub2xvY2spCi0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCk7CiAJZWxzZQotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7Ci0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Y7CiAKIAlpZiAodGVzdF9iaXQoQlRSRlNfT1JERVJFRF9DT01QUkVTU0VELCAmb3JkZXJlZF9leHRlbnQtPmZsYWdzKSkKQEAgLTE5OTAsNyArMTk4Niw3IEBACiAJfQogCiAJaWYgKEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTSkKLQkJcmV0dXJuIDA7CisJCWdvdG8gZ29vZDsKIAogCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCA9PSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQgJiYKIAkgICAgdGVzdF9yYW5nZV9iaXQoaW9fdHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX05PREFUQVNVTSwgMSwgTlVMTCkpIHsKQEAgLTI0MzEsNyArMjQyNyw3IEBACiAJCQkJCSh1NjQpLTEpOwogCiAJaWYgKHJvb3QtPm9ycGhhbl9ibG9ja19yc3YgfHwgcm9vdC0+b3JwaGFuX2l0ZW1faW5zZXJ0ZWQpIHsKLQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCWlmICghSVNfRVJSKHRyYW5zKSkKIAkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJfQpAQCAtMjUxMSwxMiArMjUwNywxNyBAQAogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKIAlpbnQgbWF5YmVfYWNsczsKLQl1NjQgYWxsb2NfZ3JvdXBfYmxvY2s7CiAJdTMyIHJkZXY7CiAJaW50IHJldDsKKwlib29sIGZpbGxlZCA9IGZhbHNlOworCisJcmV0ID0gYnRyZnNfZmlsbF9pbm9kZShpbm9kZSwgJnJkZXYpOworCWlmICghcmV0KQorCQlmaWxsZWQgPSB0cnVlOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlCVUdfT04oIXBhdGgpOworCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIAltZW1jcHkoJmxvY2F0aW9uLCAmQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLCBzaXplb2YobG9jYXRpb24pKTsKIAogCXJldCA9IGJ0cmZzX2xvb2t1cF9pbm9kZShOVUxMLCByb290LCBwYXRoLCAmbG9jYXRpb24sIDApOwpAQCAtMjUyNCw4ICsyNTI1LDE4IEBACiAJCWdvdG8gbWFrZV9iYWQ7CiAKIAlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisKKwlpZiAoZmlsbGVkKQorCQlnb3RvIGNhY2hlX2FjbDsKKwogCWlub2RlX2l0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKIAkJCQkgICAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCWlmICghbGVhZi0+bWFwX3Rva2VuKQorCQltYXBfcHJpdmF0ZV9leHRlbnRfYnVmZmVyKGxlYWYsICh1bnNpZ25lZCBsb25nKWlub2RlX2l0ZW0sCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBidHJmc19pbm9kZV9pdGVtKSwKKwkJCQkJICAmbGVhZi0+bWFwX3Rva2VuLCAmbGVhZi0+a2FkZHIsCisJCQkJCSAgJmxlYWYtPm1hcF9zdGFydCwgJmxlYWYtPm1hcF9sZW4sCisJCQkJCSAgS01fVVNFUjEpOwogCiAJaW5vZGUtPmlfbW9kZSA9IGJ0cmZzX2lub2RlX21vZGUobGVhZiwgaW5vZGVfaXRlbSk7CiAJaW5vZGUtPmlfbmxpbmsgPSBidHJmc19pbm9kZV9ubGluayhsZWFmLCBpbm9kZV9pdGVtKTsKQEAgLTI1NTQsOSArMjU2NSw3IEBACiAKIAlCVFJGU19JKGlub2RlKS0+aW5kZXhfY250ID0gKHU2NCktMTsKIAlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgPSBidHJmc19pbm9kZV9mbGFncyhsZWFmLCBpbm9kZV9pdGVtKTsKLQotCWFsbG9jX2dyb3VwX2Jsb2NrID0gYnRyZnNfaW5vZGVfYmxvY2tfZ3JvdXAobGVhZiwgaW5vZGVfaXRlbSk7Ci0KK2NhY2hlX2FjbDoKIAkvKgogCSAqIHRyeSB0byBwcmVjYWNoZSBhIE5VTEwgYWNsIGVudHJ5IGZvciBmaWxlcyB0aGF0IGRvbid0IGhhdmUKIAkgKiBhbnkgeGF0dHJzIG9yIGFjbHMKQEAgLTI1NjYsMTAgKzI1NzUsMTIgQEAKIAlpZiAoIW1heWJlX2FjbHMpCiAJCWNhY2hlX25vX2FjbChpbm9kZSk7CiAKLQlCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXAgPSBidHJmc19maW5kX2Jsb2NrX2dyb3VwKHJvb3QsIDAsCi0JCQkJCQlhbGxvY19ncm91cF9ibG9jaywgMCk7CisJaWYgKGxlYWYtPm1hcF90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKGxlYWYsIGxlYWYtPm1hcF90b2tlbiwgS01fVVNFUjEpOworCQlsZWFmLT5tYXBfdG9rZW4gPSBOVUxMOworCX0KKwogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKLQlpbm9kZV9pdGVtID0gTlVMTDsKIAogCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgewogCWNhc2UgU19JRlJFRzoKQEAgLTI2NDcsNyArMjY1OCw3IEBACiAJYnRyZnNfc2V0X2lub2RlX3RyYW5zaWQobGVhZiwgaXRlbSwgdHJhbnMtPnRyYW5zaWQpOwogCWJ0cmZzX3NldF9pbm9kZV9yZGV2KGxlYWYsIGl0ZW0sIGlub2RlLT5pX3JkZXYpOwogCWJ0cmZzX3NldF9pbm9kZV9mbGFncyhsZWFmLCBpdGVtLCBCVFJGU19JKGlub2RlKS0+ZmxhZ3MpOwotCWJ0cmZzX3NldF9pbm9kZV9ibG9ja19ncm91cChsZWFmLCBpdGVtLCBCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXApOworCWJ0cmZzX3NldF9pbm9kZV9ibG9ja19ncm91cChsZWFmLCBpdGVtLCAwKTsKIAogCWlmIChsZWFmLT5tYXBfdG9rZW4pIHsKIAkJdW5tYXBfZXh0ZW50X2J1ZmZlcihsZWFmLCBsZWFmLT5tYXBfdG9rZW4sIEtNX1VTRVIxKTsKQEAgLTI2NjcsMTIgKzI2NzgsMTQgQEAKIAlpbnQgcmV0OwogCiAJLyoKLQkgKiBJZiByb290IGlzIHRyZWUgcm9vdCwgaXQgbWVhbnMgdGhpcyBpbm9kZSBpcyB1c2VkIHRvCi0JICogc3RvcmUgZnJlZSBzcGFjZSBpbmZvcm1hdGlvbi4gQW5kIHRoZXNlIGlub2RlcyBhcmUgdXBkYXRlZAotCSAqIHdoZW4gY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24sIHNvIHRoZXkgbmVlZG4ndCBkZWxheWUgdG8KLQkgKiBiZSB1cGRhdGVkLCBvciBkZWFkbG9jayB3aWxsIG9jY3VyZWQuCisJICogSWYgdGhlIGlub2RlIGlzIGEgZnJlZSBzcGFjZSBpbm9kZSwgd2UgY2FuIGRlYWRsb2NrIGR1cmluZyBjb21taXQKKwkgKiBpZiB3ZSBwdXQgaXQgaW50byB0aGUgZGVsYXllZCBjb2RlLgorCSAqCisJICogVGhlIGRhdGEgcmVsb2NhdGlvbiBpbm9kZSBzaG91bGQgYWxzbyBiZSBkaXJlY3RseSB1cGRhdGVkCisJICogd2l0aG91dCBkZWxheQogCSAqLwotCWlmICghaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkpIHsKKwlpZiAoIWlzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpCisJICAgICYmIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkICE9IEJUUkZTX0RBVEFfUkVMT0NfVFJFRV9PQkpFQ1RJRCkgewogCQlyZXQgPSBidHJmc19kZWxheWVkX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCQlpZiAoIXJldCkKIAkJCWJ0cmZzX3NldF9pbm9kZV9sYXN0X3RyYW5zKHRyYW5zLCBpbm9kZSk7CkBAIC0zMDA0LDggKzMwMTcsNiBAQAogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7Ci0KIAlidHJmc19yZWNvcmRfdW5saW5rX2Rpcih0cmFucywgZGlyLCBkZW50cnktPmRfaW5vZGUsIDApOwogCiAJcmV0ID0gYnRyZnNfdW5saW5rX2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9pbm9kZSwKQEAgLTMwNzUsNiArMzA4Niw3IEBACiAJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBkaXIpOwogCUJVR19PTihyZXQpOwogCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiAwOwogfQogCkBAIC0zMDk0LDggKzMxMDYsNiBAQAogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7Ci0KIAlpZiAodW5saWtlbHkoYnRyZnNfaW5vKGlub2RlKSA9PSBCVFJGU19FTVBUWV9TVUJWT0xfRElSX09CSkVDVElEKSkgewogCQllcnIgPSBidHJmc191bmxpbmtfc3Vidm9sKHRyYW5zLCByb290LCBkaXIsCiAJCQkJCSAgQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLm9iamVjdGlkLApAQCAtMzUxNCw3ICszNTI0LDYgQEAKIAkJCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCiAJCQllcnIgPSBidHJmc19kcm9wX2V4dGVudHModHJhbnMsIGlub2RlLCBjdXJfb2Zmc2V0LAogCQkJCQkJIGN1cl9vZmZzZXQgKyBob2xlX3NpemUsCkBAIC0zNjQ4LDkgKzM2NTcsOCBAQAogCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgMCk7CiAKIAl3aGlsZSAoMSkgewotCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJCXRyYW5zLT5ibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwogCiAJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayh0cmFucywgcm9vdCwKQEAgLTQxMzMsNyArNDE0MSw4IEBACiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwotCXBhdGgtPnJlYWRhID0gMjsKKworCXBhdGgtPnJlYWRhID0gMTsKIAogCWlmIChrZXlfdHlwZSA9PSBCVFJGU19ESVJfSU5ERVhfS0VZKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZpbnNfbGlzdCk7CkBAIC00MjY4LDE4ICs0Mjc3LDE2IEBACiAJaWYgKEJUUkZTX0koaW5vZGUpLT5kdW1teV9pbm9kZSkKIAkJcmV0dXJuIDA7CiAKLQlzbXBfbWIoKTsKLQlpZiAocm9vdC0+ZnNfaW5mby0+Y2xvc2luZyAmJiBpc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKSkKKwlpZiAoYnRyZnNfZnNfY2xvc2luZyhyb290LT5mc19pbmZvKSAmJiBpc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKSkKIAkJbm9sb2NrID0gdHJ1ZTsKIAogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkgewogCQlpZiAobm9sb2NrKQotCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290LCAxKTsKKwkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCk7CiAJCWVsc2UKLQkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJaWYgKElTX0VSUih0cmFucykpCiAJCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7Ci0JCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCQlpZiAobm9sb2NrKQogCQkJcmV0ID0gYnRyZnNfZW5kX3RyYW5zYWN0aW9uX25vbG9jayh0cmFucywgcm9vdCk7CiAJCWVsc2UKQEAgLTQzMDMsOSArNDMxMCw4IEBACiAJaWYgKEJUUkZTX0koaW5vZGUpLT5kdW1teV9pbm9kZSkKIAkJcmV0dXJuOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7Ci0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAlpZiAocmV0ICYmIHJldCA9PSAtRU5PU1BDKSB7CkBAIC00MzE5LDcgKzQzMjUsNiBAQAogCQkJCSAgICAgICBQVFJfRVJSKHRyYW5zKSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAKIAkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCWlmIChyZXQpIHsKQEAgLTQ0MTgsOCArNDQyMyw4IEBACiAJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAotCQkJCSAgICAgdTY0IHJlZl9vYmplY3RpZCwgdTY0IG9iamVjdGlkLAotCQkJCSAgICAgdTY0IGFsbG9jX2hpbnQsIGludCBtb2RlLCB1NjQgKmluZGV4KQorCQkJCSAgICAgdTY0IHJlZl9vYmplY3RpZCwgdTY0IG9iamVjdGlkLCBpbnQgbW9kZSwKKwkJCQkgICAgIHU2NCAqaW5kZXgpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaW5vZGVfaXRlbTsKQEAgLTQ0NzIsOCArNDQ3Nyw2IEBACiAJCW93bmVyID0gMDsKIAllbHNlCiAJCW93bmVyID0gMTsKLQlCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXAgPQotCQkJYnRyZnNfZmluZF9ibG9ja19ncm91cChyb290LCAwLCBhbGxvY19oaW50LCBvd25lcik7CiAKIAlrZXlbMF0ub2JqZWN0aWQgPSBvYmplY3RpZDsKIAlidHJmc19zZXRfa2V5X3R5cGUoJmtleVswXSwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOwpAQCAtNDUyNyw2ICs0NTMwLDcgQEAKIAlpbm9kZV90cmVlX2FkZChpbm9kZSk7CiAKIAl0cmFjZV9idHJmc19pbm9kZV9uZXcoaW5vZGUpOworCWJ0cmZzX3NldF9pbm9kZV9sYXN0X3RyYW5zKHRyYW5zLCBpbm9kZSk7CiAKIAlyZXR1cm4gaW5vZGU7CiBmYWlsOgpAQCAtNDYyOSwxNSArNDYzMywxMyBAQAogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7Ci0KIAllcnIgPSBidHJmc19maW5kX2ZyZWVfaW5vKHJvb3QsICZvYmplY3RpZCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJaW5vZGUgPSBidHJmc19uZXdfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQlkZW50cnktPmRfbmFtZS5sZW4sIGJ0cmZzX2lubyhkaXIpLCBvYmplY3RpZCwKLQkJCQlCVFJGU19JKGRpciktPmJsb2NrX2dyb3VwLCBtb2RlLCAmaW5kZXgpOworCQkJCW1vZGUsICZpbmRleCk7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTQ2NDksNyArNDY1MSw2IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAllcnIgPSBidHJmc19hZGRfbm9uZGlyKHRyYW5zLCBkaXIsIGRlbnRyeSwgaW5vZGUsIDAsIGluZGV4KTsKIAlpZiAoZXJyKQogCQlkcm9wX2lub2RlID0gMTsKQEAgLTQ2NTgsOCArNDY1OSw2IEBACiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CiAJCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCX0KLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiBvdXRfdW5sb2NrOgogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CkBAIC00NjkyLDE1ICs0NjkxLDEzIEBACiAJaWYgKElTX0VSUih0cmFucykpCiAJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKLQogCWVyciA9IGJ0cmZzX2ZpbmRfZnJlZV9pbm8ocm9vdCwgJm9iamVjdGlkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlpbm9kZSA9IGJ0cmZzX25ld19pbm9kZSh0cmFucywgcm9vdCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCWRlbnRyeS0+ZF9uYW1lLmxlbiwgYnRyZnNfaW5vKGRpciksIG9iamVjdGlkLAotCQkJCUJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXAsIG1vZGUsICZpbmRleCk7CisJCQkJbW9kZSwgJmluZGV4KTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNDcxMiw3ICs0NzA5LDYgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCWVyciA9IGJ0cmZzX2FkZF9ub25kaXIodHJhbnMsIGRpciwgZGVudHJ5LCBpbm9kZSwgMCwgaW5kZXgpOwogCWlmIChlcnIpCiAJCWRyb3BfaW5vZGUgPSAxOwpAQCAtNDcyMyw4ICs0NzE5LDYgQEAKIAkJaW5vZGUtPmlfb3AgPSAmYnRyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogCQlCVFJGU19JKGlub2RlKS0+aW9fdHJlZS5vcHMgPSAmYnRyZnNfZXh0ZW50X2lvX29wczsKIAl9Ci0JYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0JYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwogb3V0X3VubG9jazoKIAluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKIAlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOwpAQCAtNDc3MSw4ICs0NzY1LDYgQEAKIAogCWJ0cmZzX2luY19ubGluayhpbm9kZSk7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0KLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiAJaWhvbGQoaW5vZGUpOwogCiAJZXJyID0gYnRyZnNfYWRkX25vbmRpcih0cmFucywgZGlyLCBkZW50cnksIGlub2RlLCAxLCBpbmRleCk7CkBAIC00NzgxLDcgKzQ3NzMsNiBAQAogCQlkcm9wX2lub2RlID0gMTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOwotCQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiAJCWVyciA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCQlCVUdfT04oZXJyKTsKIAkJYnRyZnNfbG9nX25ld19uYW1lKHRyYW5zLCBpbm9kZSwgTlVMTCwgcGFyZW50KTsKQEAgLTQ4MTgsNyArNDgwOSw2IEBACiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCA1KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKIAogCWVyciA9IGJ0cmZzX2ZpbmRfZnJlZV9pbm8ocm9vdCwgJm9iamVjdGlkKTsKIAlpZiAoZXJyKQpAQCAtNDgyNiw4ICs0ODE2LDcgQEAKIAogCWlub2RlID0gYnRyZnNfbmV3X2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJZGVudHJ5LT5kX25hbWUubGVuLCBidHJmc19pbm8oZGlyKSwgb2JqZWN0aWQsCi0JCQkJQlRSRlNfSShkaXIpLT5ibG9ja19ncm91cCwgU19JRkRJUiB8IG1vZGUsCi0JCQkJJmluZGV4KTsKKwkJCQlTX0lGRElSIHwgbW9kZSwgJmluZGV4KTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBvdXRfZmFpbDsKQEAgLTQ4NDEsNyArNDgzMCw2IEBACiAKIAlpbm9kZS0+aV9vcCA9ICZidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAogCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgMCk7CiAJZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CkBAIC00ODU1LDggKzQ4NDMsNiBAQAogCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlkcm9wX29uX2VyciA9IDA7Ci0JYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0JYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwogCiBvdXRfZmFpbDoKIAluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKQEAgLTQ5ODksNyArNDk3NSwxNSBAQAogCiAJaWYgKCFwYXRoKSB7CiAJCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JCUJVR19PTighcGF0aCk7CisJCWlmICghcGF0aCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qCisJCSAqIENoYW5jZXMgYXJlIHdlJ2xsIGJlIGNhbGxlZCBhZ2Fpbiwgc28gZ28gYWhlYWQgYW5kIGRvCisJCSAqIHJlYWRhaGVhZAorCQkgKi8KKwkJcGF0aC0+cmVhZGEgPSAxOwogCX0KIAogCXJldCA9IGJ0cmZzX2xvb2t1cF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgcGF0aCwKQEAgLTUxMzAsOCArNTEyNCwxMCBAQAogCQkJCWt1bm1hcChwYWdlKTsKIAkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQkJCWVtID0gTlVMTDsKKwogCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKLQkJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOworCiAJCQkJaWYgKElTX0VSUih0cmFucykpCiAJCQkJCXJldHVybiBFUlJfQ0FTVCh0cmFucyk7CiAJCQkJZ290byBhZ2FpbjsKQEAgLTUzNzUsNyArNTM3MSw3IEBACiAJCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBzdGFydCwgc3RhcnQgKyBsZW4gLSAxLCAwKTsKIAl9CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gRVJSX0NBU1QodHJhbnMpOwogCkBAIC01NjExLDcgKzU2MDcsNyBAQAogCQkgKiB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gc3RheXMgb3BlbgogCQkgKiB3aGlsZSB3ZSBsb29rIGZvciBub2NvdyBjcm9zcyByZWZzCiAJCSAqLwotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJaWYgKElTX0VSUih0cmFucykpCiAJCQlnb3RvIG11c3RfY293OwogCkBAIC01NzUwLDcgKzU3NDYsNyBAQAogCiAJQlVHX09OKCFvcmRlcmVkKTsKIAotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC02NTAwLDYgKzY0OTYsNyBAQAogc3RhdGljIGludCBidHJmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2OwogCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CkBAIC02NTEzLDI4ICs2NTEwLDgwIEBACiAJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBpbm9kZS0+aV9zaXplICYgKH5tYXNrKSwgKHU2NCktMSk7CiAJYnRyZnNfb3JkZXJlZF91cGRhdGVfaV9zaXplKGlub2RlLCBpbm9kZS0+aV9zaXplLCBOVUxMKTsKIAotCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgNSk7Ci0JaWYgKElTX0VSUih0cmFucykpCi0JCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKKwkvKgorCSAqIFllcyBsYWRpZXMgYW5kIGdlbnRlbG1lbnQsIHRoaXMgaXMgaW5kZWVkIHVnbHkuICBUaGUgZmFjdCBpcyB3ZSBoYXZlCisJICogMyB0aGluZ3MgZ29pbmcgb24gaGVyZQorCSAqCisJICogMSkgV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBvdXIgb3JwaGFuIGl0ZW0gYW5kIHRoZSBzcGFjZSB0bworCSAqIGRlbGV0ZSBvdXIgb3JwaGFuIGl0ZW0uICBMb3JkIGtub3dzIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSBhIGRhbmdsaW5nCisJICogb3JwaGFuIGl0ZW0gYmVjYXVzZSB3ZSBkaWRuJ3QgcmVzZXJ2ZSBzcGFjZSB0byByZW1vdmUgaXQuCisJICoKKwkgKiAyKSBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgdG8gdXBkYXRlIG91ciBpbm9kZS4KKwkgKgorCSAqIDMpIFdlIG5lZWQgdG8gaGF2ZSBzb21ldGhpbmcgdG8gY2FjaGUgYWxsIHRoZSBzcGFjZSB0aGF0IGlzIGdvaW5nIHRvCisJICogYmUgZnJlZSdkIHVwIGJ5IHRoZSB0cnVuY2F0ZSBvcGVyYXRpb24sIGJ1dCBhbHNvIGhhdmUgc29tZSBzbGFjaworCSAqIHNwYWNlIHJlc2VydmVkIGluIGNhc2UgaXQgdXNlcyBzcGFjZSBkdXJpbmcgdGhlIHRydW5jYXRlICh0aGFuayB5b3UKKwkgKiB2ZXJ5IG11Y2ggc25hcHNob3R0aW5nKS4KKwkgKgorCSAqIEFuZCB3ZSBuZWVkIHRoZXNlIHRvIGFsbCBiZSBzZXBlcmF0ZS4gIFRoZSBmYWN0IGlzIHdlIGNhbiB1c2UgYWxvdCBvZgorCSAqIHNwYWNlIGRvaW5nIHRoZSB0cnVuY2F0ZSwgYW5kIHdlIGhhdmUgbm8gZWFydGhseSBpZGVhIGhvdyBtdWNoIHNwYWNlCisJICogd2Ugd2lsbCB1c2UsIHNvIHdlIG5lZWQgdGhlIHRydW5jYXRlIHJlc2VydmF0aW9uIHRvIGJlIHNlcGVyYXRlIHNvIGl0CisJICogZG9lc24ndCBlbmQgdXAgdXNpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZSBvcgorCSAqIHJlbW92aW5nIHRoZSBvcnBoYW4gaXRlbS4gIFdlIGFsc28gbmVlZCB0byBiZSBhYmxlIHRvIHN0b3AgdGhlCisJICogdHJhbnNhY3Rpb24gYW5kIHN0YXJ0IGEgbmV3IG9uZSwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBiZSBhYmxlIHRvCisJICogdXBkYXRlIHRoZSBpbm9kZSBzZXZlcmFsIHRpbWVzLCBhbmQgd2UgaGF2ZSBubyBpZGVhIG9mIGtub3dpbmcgaG93CisJICogbWFueSB0aW1lcyB0aGF0IHdpbGwgYmUsIHNvIHdlIGNhbid0IGp1c3QgcmVzZXJ2ZSAxIGl0ZW0gZm9yIHRoZQorCSAqIGVudGlyZXR5IG9mIHRoZSBvcHJhdGlvbiwgc28gdGhhdCBoYXMgdG8gYmUgZG9uZSBzZXBlcmF0ZWx5IGFzIHdlbGwuCisJICogVGhlbiB0aGVyZSBpcyB0aGUgb3JwaGFuIGl0ZW0sIHdoaWNoIGRvZXMgaW5kZWVkIG5lZWQgdG8gYmUgaGVsZCBvbgorCSAqIHRvIGZvciB0aGUgd2hvbGUgb3BlcmF0aW9uLCBhbmQgd2UgbmVlZCBub2JvZHkgdG8gdG91Y2ggdGhpcyByZXNlcnZlZAorCSAqIHNwYWNlIGV4Y2VwdCB0aGUgb3JwaGFuIGNvZGUuCisJICoKKwkgKiBTbyB0aGF0IGxlYXZlcyB1cyB3aXRoCisJICoKKwkgKiAxKSByb290LT5vcnBoYW5fYmxvY2tfcnN2IC0gZm9yIHRoZSBvcnBoYW4gZGVsZXRpb24uCisJICogMikgcnN2IC0gZm9yIHRoZSB0cnVuY2F0ZSByZXNlcnZhdGlvbiwgd2hpY2ggd2Ugd2lsbCBzdGVhbCBmcm9tIHRoZQorCSAqIHRyYW5zYWN0aW9uIHJlc2VydmF0aW9uLgorCSAqIDMpIGZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdiAtIHRoaXMgd2lsbCBoYXZlIDEgaXRlbXMgd29ydGggbGVmdCBmb3IKKwkgKiB1cGRhdGluZyB0aGUgaW5vZGUuCisJICovCisJcnN2ID0gYnRyZnNfYWxsb2NfYmxvY2tfcnN2KHJvb3QpOworCWlmICghcnN2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlidHJmc19hZGRfZHVyYWJsZV9ibG9ja19yc3Yocm9vdC0+ZnNfaW5mbywgcnN2KTsKIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgNCk7CisJaWYgKElTX0VSUih0cmFucykpIHsKKwkJZXJyID0gUFRSX0VSUih0cmFucyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHRydW5jYXRlIHByb2Nlc3MuICBUcnVuY2F0ZSBzaG91bGQgYmUgYWRkaW5nCisJICogc3BhY2UsIGJ1dCBpZiB0aGVyZSBhcmUgc25hcHNob3RzIGl0IG1heSBlbmQgdXAgdXNpbmcgc3BhY2UuCisJICovCisJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgcm9vdCwgcnN2KTsKKwlCVUdfT04ocmV0KTsKIAogCXJldCA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKIAlpZiAocmV0KSB7CiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CiAKLQkvKiBOb3cgc3RhcnQgYSB0cmFuc2FjdGlvbiBmb3IgdGhlIHRydW5jYXRlICovCi0JdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAwKTsKLQlpZiAoSVNfRVJSKHRyYW5zKSkKLQkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwotCXRyYW5zLT5ibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OworCS8qCisJICogT2sgc28gd2UndmUgYWxyZWFkeSBtaWdyYXRlZCBvdXIgYnl0ZXMgb3ZlciBmb3IgdGhlIHRydW5jYXRlLCBzbyBoZXJlCisJICoganVzdCByZXNlcnZlIHRoZSBvbmUgc2xvdCB3ZSBuZWVkIGZvciB1cGRhdGluZyB0aGUgaW5vZGUuCisJICovCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKKwkJZ290byBvdXQ7CisJfQorCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CiAKIAkvKgogCSAqIHNldGF0dHIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdGhlIG9yZGVyZWRfZGF0YV9jbG9zZSBmbGFnLApAQCAtNjU1OCwyNCArNjYwNywxNyBAQAogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKCF0cmFucykgewotCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAwKTsKLQkJCWlmIChJU19FUlIodHJhbnMpKQotCQkJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKLQkJCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwotCQkJdHJhbnMtPmJsb2NrX3JzdiA9IHJvb3QtPm9ycGhhbl9ibG9ja19yc3Y7Ci0JCX0KKwkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMyk7CisJCQlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQkJCWVyciA9IFBUUl9FUlIodHJhbnMpOworCQkJCWdvdG8gb3V0OworCQkJfQogCi0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayh0cmFucywgcm9vdCwKLQkJCQkJICAgIHJvb3QtPm9ycGhhbl9ibG9ja19yc3YsIDAsIDUpOwotCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQl0cmFucyA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChyZXQpIHsKLQkJCWVyciA9IHJldDsKLQkJCWJyZWFrOworCQkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgcm9vdCwKKwkJCQkJCQkgICAgICByc3YpOworCQkJQlVHX09OKHJldCk7CisKKwkJCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CiAJCX0KIAogCQlyZXQgPSBidHJmc190cnVuY2F0ZV9pbm9kZV9pdGVtcyh0cmFucywgcm9vdCwgaW5vZGUsCkBAIC02NTg2LDYgKzY2MjgsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKIAkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCWlmIChyZXQpIHsKIAkJCWVyciA9IHJldDsKQEAgLTY1OTksNiArNjY0Miw3IEBACiAJfQogCiAJaWYgKHJldCA9PSAwICYmIGlub2RlLT5pX25saW5rID4gMCkgeworCQl0cmFucy0+YmxvY2tfcnN2ID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdjsKIAkJcmV0ID0gYnRyZnNfb3JwaGFuX2RlbCh0cmFucywgaW5vZGUpOwogCQlpZiAocmV0KQogCQkJZXJyID0gcmV0OwpAQCAtNjYxMCwxNSArNjY1NCwyMCBAQAogCQlyZXQgPSBidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKIAl9CiAKKwl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAlpZiAocmV0ICYmICFlcnIpCiAJCWVyciA9IHJldDsKIAogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CisJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisKK291dDoKKwlidHJmc19mcmVlX2Jsb2NrX3Jzdihyb290LCByc3YpOworCiAJaWYgKHJldCAmJiAhZXJyKQogCQllcnIgPSByZXQ7Ci0JYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNjYyNywxNSArNjY3NiwxNCBAQAogICogY3JlYXRlIGEgbmV3IHN1YnZvbHVtZSBkaXJlY3RvcnkvaW5vZGUgKGhlbHBlciBmb3IgdGhlIGlvY3RsKS4KICAqLwogaW50IGJ0cmZzX2NyZWF0ZV9zdWJ2b2xfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290LAotCQkJICAgICB1NjQgbmV3X2RpcmlkLCB1NjQgYWxsb2NfaGludCkKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290LCB1NjQgbmV3X2RpcmlkKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVycjsKIAl1NjQgaW5kZXggPSAwOwogCiAJaW5vZGUgPSBidHJmc19uZXdfaW5vZGUodHJhbnMsIG5ld19yb290LCBOVUxMLCAiLi4iLCAyLCBuZXdfZGlyaWQsCi0JCQkJbmV3X2RpcmlkLCBhbGxvY19oaW50LCBTX0lGRElSIHwgMDcwMCwgJmluZGV4KTsKKwkJCQluZXdfZGlyaWQsIFNfSUZESVIgfCAwNzAwLCAmaW5kZXgpOwogCWlmIChJU19FUlIoaW5vZGUpKQogCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CiAJaW5vZGUtPmlfb3AgPSAmYnRyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC02NzQ4LDIxICs2Nzk2LDYgQEAKIAkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50X2xvY2spOwogCX0KIAotCWlmIChyb290ID09IHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCkgewotCQlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwOwotCi0JCWJsb2NrX2dyb3VwID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKHJvb3QtPmZzX2luZm8sCi0JCQkJCQlCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXApOwotCQlpZiAoYmxvY2tfZ3JvdXAgJiYgYmxvY2tfZ3JvdXAtPmlub2RlID09IGlub2RlKSB7Ci0JCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKLQkJCWJsb2NrX2dyb3VwLT5pbm9kZSA9IE5VTEw7Ci0JCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwotCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKLQkJfSBlbHNlIGlmIChibG9ja19ncm91cCkgewotCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKLQkJfQotCX0KLQogCXNwaW5fbG9jaygmcm9vdC0+b3JwaGFuX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmQlRSRlNfSShpbm9kZSktPmlfb3JwaGFuKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJCVFJGUzogaW5vZGUgJWxsdSBzdGlsbCBvbiB0aGUgb3JwaGFuIGxpc3RcbiIsCkBAIC02OTQ4LDggKzY5ODEsNiBAQAogICAgICAgICAgICAgICAgIGdvdG8gb3V0X25vdHJhbnM7CiAgICAgICAgIH0KIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgbmV3X2Rpcik7Ci0KIAlpZiAoZGVzdCAhPSByb290KQogCQlidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyh0cmFucywgZGVzdCk7CiAKQEAgLTcxMzEsMTYgKzcxNjIsMTMgQEAKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwotCiAJZXJyID0gYnRyZnNfZmluZF9mcmVlX2lubyhyb290LCAmb2JqZWN0aWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWlub2RlID0gYnRyZnNfbmV3X2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJZGVudHJ5LT5kX25hbWUubGVuLCBidHJmc19pbm8oZGlyKSwgb2JqZWN0aWQsCi0JCQkJQlRSRlNfSShkaXIpLT5ibG9ja19ncm91cCwgU19JRkxOS3xTX0lSV1hVR08sCi0JCQkJJmluZGV4KTsKKwkJCQlTX0lGTE5LfFNfSVJXWFVHTywgJmluZGV4KTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNzE1Miw3ICs3MTgwLDYgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCWVyciA9IGJ0cmZzX2FkZF9ub25kaXIodHJhbnMsIGRpciwgZGVudHJ5LCBpbm9kZSwgMCwgaW5kZXgpOwogCWlmIChlcnIpCiAJCWRyb3BfaW5vZGUgPSAxOwpAQCAtNzE2Myw4ICs3MTkwLDYgQEAKIAkJaW5vZGUtPmlfb3AgPSAmYnRyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogCQlCVFJGU19JKGlub2RlKS0+aW9fdHJlZS5vcHMgPSAmYnRyZnNfZXh0ZW50X2lvX29wczsKIAl9Ci0JYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0JYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwogCWlmIChkcm9wX2lub2RlKQogCQlnb3RvIG91dF91bmxvY2s7CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IDg1ZTgxOGMuLmEzYzQ3NTEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJCWlwLT5mbGFncyAmPSB+KEJUUkZTX0lOT0RFX0NPTVBSRVNTIHwgQlRSRlNfSU5PREVfTk9DT01QUkVTUyk7CiAJfQogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKQEAgLTQxNCw4ICs0MTQsNyBAQAogCiAJYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnModHJhbnMsIG5ld19yb290KTsKIAotCXJldCA9IGJ0cmZzX2NyZWF0ZV9zdWJ2b2xfcm9vdCh0cmFucywgbmV3X3Jvb3QsIG5ld19kaXJpZCwKLQkJCQkgICAgICAgQlRSRlNfSShkaXIpLT5ibG9ja19ncm91cCk7CisJcmV0ID0gYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHRyYW5zLCBuZXdfcm9vdCwgbmV3X2RpcmlkKTsKIAkvKgogCSAqIGluc2VydCB0aGUgZGlyZWN0b3J5IGl0ZW0KIAkgKi8KQEAgLTQ4Myw4ICs0ODIsMTAgQEAKIAlyZXQgPSBidHJmc19zbmFwX3Jlc2VydmVfbWV0YWRhdGEodHJhbnMsIHBlbmRpbmdfc25hcHNob3QpOwogCUJVR19PTihyZXQpOwogCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAlsaXN0X2FkZCgmcGVuZGluZ19zbmFwc2hvdC0+bGlzdCwKIAkJICZ0cmFucy0+dHJhbnNhY3Rpb24tPnBlbmRpbmdfc25hcHNob3RzKTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJaWYgKGFzeW5jX3RyYW5zaWQpIHsKIAkJKmFzeW5jX3RyYW5zaWQgPSB0cmFucy0+dHJhbnNpZDsKIAkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uX2FzeW5jKHRyYW5zLApAQCAtNzA3LDE2ICs3MDgsMTcgQEAKIAlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZXh0ZW50OwogCWludCB0eXBlOwogCWludCByZXQ7CisJdTY0IGlubyA9IGJ0cmZzX2lubyhpbm9kZSk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltaW5fa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCW1pbl9rZXkub2JqZWN0aWQgPSBpbm87CiAJbWluX2tleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOwogCW1pbl9rZXkub2Zmc2V0ID0gKm9mZjsKIAotCW1heF9rZXkub2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisJbWF4X2tleS5vYmplY3RpZCA9IGlubzsKIAltYXhfa2V5LnR5cGUgPSAodTgpLTE7CiAJbWF4X2tleS5vZmZzZXQgPSAodTY0KS0xOwogCkBAIC03MjcsNyArNzI5LDcgQEAKIAkJCQkJICAgcGF0aCwgMCwgbmV3ZXJfdGhhbik7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWdvdG8gbm9uZTsKLQkJaWYgKG1pbl9rZXkub2JqZWN0aWQgIT0gaW5vZGUtPmlfaW5vKQorCQlpZiAobWluX2tleS5vYmplY3RpZCAhPSBpbm8pCiAJCQlnb3RvIG5vbmU7CiAJCWlmIChtaW5fa2V5LnR5cGUgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKQogCQkJZ290byBub25lOwpAQCAtMjA1NCwyOSArMjA1NiwzNCBAQAogCiBzdGF0aWMgbG9uZyBidHJmc19pb2N0bF9mc19pbmZvKHN0cnVjdCBidHJmc19yb290ICpyb290LCB2b2lkIF9fdXNlciAqYXJnKQogewotCXN0cnVjdCBidHJmc19pb2N0bF9mc19pbmZvX2FyZ3MgZmlfYXJnczsKKwlzdHJ1Y3QgYnRyZnNfaW9jdGxfZnNfaW5mb19hcmdzICpmaV9hcmdzOwogCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpuZXh0OwogCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlczsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWZpX2FyZ3MubnVtX2RldmljZXMgPSBmc19kZXZpY2VzLT5udW1fZGV2aWNlczsKLQlmaV9hcmdzLm1heF9pZCA9IDA7Ci0JbWVtY3B5KCZmaV9hcmdzLmZzaWQsIHJvb3QtPmZzX2luZm8tPmZzaWQsIHNpemVvZihmaV9hcmdzLmZzaWQpKTsKKwlmaV9hcmdzID0ga3phbGxvYyhzaXplb2YoKmZpX2FyZ3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpX2FyZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlfYXJncy0+bnVtX2RldmljZXMgPSBmc19kZXZpY2VzLT5udW1fZGV2aWNlczsKKwltZW1jcHkoJmZpX2FyZ3MtPmZzaWQsIHJvb3QtPmZzX2luZm8tPmZzaWQsIHNpemVvZihmaV9hcmdzLT5mc2lkKSk7CiAKIAltdXRleF9sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldmljZSwgbmV4dCwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7Ci0JCWlmIChkZXZpY2UtPmRldmlkID4gZmlfYXJncy5tYXhfaWQpCi0JCQlmaV9hcmdzLm1heF9pZCA9IGRldmljZS0+ZGV2aWQ7CisJCWlmIChkZXZpY2UtPmRldmlkID4gZmlfYXJncy0+bWF4X2lkKQorCQkJZmlfYXJncy0+bWF4X2lkID0gZGV2aWNlLT5kZXZpZDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmZpX2FyZ3MsIHNpemVvZihmaV9hcmdzKSkpCi0JCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBmaV9hcmdzLCBzaXplb2YoKmZpX2FyZ3MpKSkKKwkJcmV0ID0gLUVGQVVMVDsKIAotCXJldHVybiAwOworCWtmcmVlKGZpX2FyZ3MpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBsb25nIGJ0cmZzX2lvY3RsX2Rldl9pbmZvKHN0cnVjdCBidHJmc19yb290ICpyb290LCB2b2lkIF9fdXNlciAqYXJnKQpAQCAtMjQ4OSwxMiArMjQ5NiwxMCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMrKzsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlhdG9taWNfaW5jKCZyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKTsKIAogCXJldCA9IC1FTk9NRU07Ci0JdHJhbnMgPSBidHJmc19zdGFydF9pb2N0bF90cmFuc2FjdGlvbihyb290LCAwKTsKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X2lvY3RsX3RyYW5zYWN0aW9uKHJvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQlnb3RvIG91dF9kcm9wOwogCkBAIC0yNTAyLDkgKzI1MDcsNyBAQAogCXJldHVybiAwOwogCiBvdXRfZHJvcDoKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0Jcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucy0tOwotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCWF0b21pY19kZWMoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpOwogCW1udF9kcm9wX3dyaXRlKGZpbGUtPmZfcGF0aC5tbnQpOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC0yNzM4LDkgKzI3NDEsNyBAQAogCiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQlyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zLS07Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJYXRvbWljX2RlYygmcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucyk7CiAKIAltbnRfZHJvcF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3JlbG9jYXRpb24uYyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwppbmRleCBjYTM4ZWNhLi41ZTBhM2RjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMKKysrIGIvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCkBAIC02NzcsNiArNjc3LDggQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQorCXBhdGgxLT5yZWFkYSA9IDE7CisJcGF0aDItPnJlYWRhID0gMjsKIAogCW5vZGUgPSBhbGxvY19iYWNrcmVmX25vZGUoY2FjaGUpOwogCWlmICghbm9kZSkgewpAQCAtMTM2Niw3ICsxMzY4LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCFyb290LT5yZWxvY19yb290KQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAlyZWxvY19yb290ID0gcm9vdC0+cmVsb2Nfcm9vdDsKIAlyb290X2l0ZW0gPSAmcmVsb2Nfcm9vdC0+cm9vdF9pdGVtOwpAQCAtMTM4OCw2ICsxMzkwLDggQEAKIAlyZXQgPSBidHJmc191cGRhdGVfcm9vdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LAogCQkJCSZyZWxvY19yb290LT5yb290X2tleSwgcm9vdF9pdGVtKTsKIAlCVUdfT04ocmV0KTsKKworb3V0OgogCXJldHVybiAwOwogfQogCkBAIC0xOTk5LDYgKzIwMDMsNyBAQAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKKwlwYXRoLT5yZWFkYSA9IDE7CiAKIAlyZWxvY19yb290ID0gcm9vdC0+cmVsb2Nfcm9vdDsKIAlyb290X2l0ZW0gPSAmcmVsb2Nfcm9vdC0+cm9vdF9pdGVtOwpAQCAtMjEzOSwxMCArMjE0NCwxMSBAQAogCXU2NCBudW1fYnl0ZXMgPSAwOwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCXJjLT5tZXJnaW5nX3Jzdl9zaXplICs9IHJvb3QtPm5vZGVzaXplICogKEJUUkZTX01BWF9MRVZFTCAtIDEpICogMjsKIAlyYy0+bWVyZ2luZ19yc3Zfc2l6ZSArPSByYy0+bm9kZXNfcmVsb2NhdGVkICogMjsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKKwogYWdhaW46CiAJaWYgKCFlcnIpIHsKIAkJbnVtX2J5dGVzID0gcmMtPm1lcmdpbmdfcnN2X3NpemU7CkBAIC0yMTUyLDcgKzIxNTgsNyBAQAogCQkJZXJyID0gcmV0OwogCX0KIAotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCWlmICghZXJyKQogCQkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2UocmMtPmV4dGVudF9yb290LApAQCAtMjIxMSw5ICsyMjE3LDE2IEBACiAJaW50IHJldDsKIGFnYWluOgogCXJvb3QgPSByYy0+ZXh0ZW50X3Jvb3Q7Ci0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCisJLyoKKwkgKiB0aGlzIHNlcmlhbGl6ZXMgdXMgd2l0aCBidHJmc19yZWNvcmRfcm9vdF9pbl90cmFuc2FjdGlvbiwKKwkgKiB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBub2JvZHkgaXMgaW4gdGhlIG1pZGRsZSBvZgorCSAqIGFkZGluZyB0aGVpciByb290cyB0byB0aGUgbGlzdCB3aGlsZSB3ZSBhcmUKKwkgKiBkb2luZyB0aGlzIHNwbGljZQorCSAqLworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAlsaXN0X3NwbGljZV9pbml0KCZyYy0+cmVsb2Nfcm9vdHMsICZyZWxvY19yb290cyk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJlbG9jX3Jvb3RzKSkgewogCQlmb3VuZCA9IDE7CkBAIC0zMjM2LDcgKzMyNDksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAkJcmV0ID0gUFRSX0VSUih0cmFucyk7CkBAIC0zMzAwLDYgKzMzMTMsNyBAQAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKKwlwYXRoLT5yZWFkYSA9IDE7CiAKIAlyb290ID0gcmVhZF9mc19yb290KHJjLT5leHRlbnRfcm9vdC0+ZnNfaW5mbywgcmVmX3Jvb3QpOwogCWlmIChJU19FUlIocm9vdCkpIHsKQEAgLTM1ODYsMTcgKzM2MDAsMTkgQEAKIHN0YXRpYyB2b2lkIHNldF9yZWxvY19jb250cm9sKHN0cnVjdCByZWxvY19jb250cm9sICpyYykKIHsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJjLT5leHRlbnRfcm9vdC0+ZnNfaW5mbzsKLQltdXRleF9sb2NrKCZmc19pbmZvLT50cmFuc19tdXRleCk7CisKKwltdXRleF9sb2NrKCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiAJZnNfaW5mby0+cmVsb2NfY3RsID0gcmM7Ci0JbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT50cmFuc19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVuc2V0X3JlbG9jX2NvbnRyb2woc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJjKQogewogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcmMtPmV4dGVudF9yb290LT5mc19pbmZvOwotCW11dGV4X2xvY2soJmZzX2luZm8tPnRyYW5zX211dGV4KTsKKworCW11dGV4X2xvY2soJmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAlmc19pbmZvLT5yZWxvY19jdGwgPSBOVUxMOwotCW11dGV4X3VubG9jaygmZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IGNoZWNrX2V4dGVudF9mbGFncyh1NjQgZmxhZ3MpCkBAIC0zNjQ1LDcgKzM2NjEsNyBAQAogCXJjLT5jcmVhdGVfcmVsb2NfdHJlZSA9IDE7CiAJc2V0X3JlbG9jX2NvbnRyb2wocmMpOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCk7CiAJQlVHX09OKElTX0VSUih0cmFucykpOwogCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcmMtPmV4dGVudF9yb290KTsKIAlyZXR1cm4gMDsKQEAgLTM2NjgsNiArMzY4NCw3IEBACiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gMTsKIAogCXJldCA9IHByZXBhcmVfdG9fcmVsb2NhdGUocmMpOwogCWlmIChyZXQpIHsKQEAgLTM4MzQsNyArMzg1MSw3IEBACiAJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2UocmMtPmV4dGVudF9yb290LCByYy0+YmxvY2tfcnN2LCAodTY0KS0xKTsKIAogCS8qIGdldCByaWQgb2YgcGlubmVkIGV4dGVudHMgKi8KLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocmMtPmV4dGVudF9yb290LCAxKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocmMtPmV4dGVudF9yb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJZXJyID0gUFRSX0VSUih0cmFucyk7CiAJZWxzZQpAQCAtNDA5Myw2ICs0MTEwLDcgQEAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CisJcGF0aC0+cmVhZGEgPSAtMTsKIAogCWtleS5vYmplY3RpZCA9IEJUUkZTX1RSRUVfUkVMT0NfT0JKRUNUSUQ7CiAJa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOwpAQCAtNDE1OSw3ICs0MTc3LDcgQEAKIAogCXNldF9yZWxvY19jb250cm9sKHJjKTsKIAotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCXVuc2V0X3JlbG9jX2NvbnRyb2wocmMpOwogCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKQEAgLTQxOTMsNyArNDIxMSw3IEBACiAKIAl1bnNldF9yZWxvY19jb250cm9sKHJjKTsKIAotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKIAllbHNlCmRpZmYgLS1naXQgYS9mcy9idHJmcy9zY3J1Yi5jIGIvZnMvYnRyZnMvc2NydWIuYwppbmRleCA2ZGZlZDBjLi5hOGQwM2Q1IDEwMDY0NAotLS0gYS9mcy9idHJmcy9zY3J1Yi5jCisrKyBiL2ZzL2J0cmZzL3NjcnViLmMKQEAgLTE2LDEzICsxNiw3IEBACiAgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlICJjdHJlZS5oIgogI2luY2x1ZGUgInZvbHVtZXMuaCIKICNpbmNsdWRlICJkaXNrLWlvLmgiCkBAIC0xMTcsMzMgKzExMSwzNyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc2NydWJfZnJlZV9iaW8oc3RydWN0IGJpbyAqYmlvKQoreworCWludCBpOworCXN0cnVjdCBwYWdlICpsYXN0X3BhZ2UgPSBOVUxMOworCisJaWYgKCFiaW8pCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7ICsraSkgeworCQlpZiAoYmlvLT5iaV9pb192ZWNbaV0uYnZfcGFnZSA9PSBsYXN0X3BhZ2UpCisJCQljb250aW51ZTsKKwkJbGFzdF9wYWdlID0gYmlvLT5iaV9pb192ZWNbaV0uYnZfcGFnZTsKKwkJX19mcmVlX3BhZ2UobGFzdF9wYWdlKTsKKwl9CisJYmlvX3B1dChiaW8pOworfQorCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHZvaWQgc2NydWJfZnJlZV9kZXYoc3RydWN0IHNjcnViX2RldiAqc2RldikKIHsKIAlpbnQgaTsKLQlpbnQgajsKLQlzdHJ1Y3QgcGFnZSAqbGFzdF9wYWdlOwogCiAJaWYgKCFzZGV2KQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgU0NSVUJfQklPU19QRVJfREVWOyArK2kpIHsKIAkJc3RydWN0IHNjcnViX2JpbyAqc2JpbyA9IHNkZXYtPmJpb3NbaV07Ci0JCXN0cnVjdCBiaW8gKmJpbzsKIAogCQlpZiAoIXNiaW8pCiAJCQlicmVhazsKIAotCQliaW8gPSBzYmlvLT5iaW87Ci0JCWlmIChiaW8pIHsKLQkJCWxhc3RfcGFnZSA9IE5VTEw7Ci0JCQlmb3IgKGogPSAwOyBqIDwgYmlvLT5iaV92Y250OyArK2opIHsKLQkJCQlpZiAoYmlvLT5iaV9pb192ZWNbal0uYnZfcGFnZSA9PSBsYXN0X3BhZ2UpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWxhc3RfcGFnZSA9IGJpby0+YmlfaW9fdmVjW2pdLmJ2X3BhZ2U7Ci0JCQkJX19mcmVlX3BhZ2UobGFzdF9wYWdlKTsKLQkJCX0KLQkJCWJpb19wdXQoYmlvKTsKLQkJfQorCQlzY3J1Yl9mcmVlX2JpbyhzYmlvLT5iaW8pOwogCQlrZnJlZShzYmlvKTsKIAl9CiAKQEAgLTE1Niw4ICsxNTQsNiBAQAogewogCXN0cnVjdCBzY3J1Yl9kZXYgKnNkZXY7CiAJaW50CQlpOwotCWludAkJajsKLQlpbnQJCXJldDsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IGRldi0+ZGV2X3Jvb3QtPmZzX2luZm87CiAKIAlzZGV2ID0ga3phbGxvYyhzaXplb2YoKnNkZXYpLCBHRlBfTk9GUyk7CkBAIC0xNjUsNyArMTYxLDYgQEAKIAkJZ290byBub21lbTsKIAlzZGV2LT5kZXYgPSBkZXY7CiAJZm9yIChpID0gMDsgaSA8IFNDUlVCX0JJT1NfUEVSX0RFVjsgKytpKSB7Ci0JCXN0cnVjdCBiaW8gKmJpbzsKIAkJc3RydWN0IHNjcnViX2JpbyAqc2JpbzsKIAogCQlzYmlvID0ga3phbGxvYyhzaXplb2YoKnNiaW8pLCBHRlBfTk9GUyk7CkBAIC0xNzMsMzIgKzE2OCwxMCBAQAogCQkJZ290byBub21lbTsKIAkJc2Rldi0+Ymlvc1tpXSA9IHNiaW87CiAKLQkJYmlvID0gYmlvX2ttYWxsb2MoR0ZQX05PRlMsIFNDUlVCX1BBR0VTX1BFUl9CSU8pOwotCQlpZiAoIWJpbykKLQkJCWdvdG8gbm9tZW07Ci0KIAkJc2Jpby0+aW5kZXggPSBpOwogCQlzYmlvLT5zZGV2ID0gc2RldjsKLQkJc2Jpby0+YmlvID0gYmlvOwogCQlzYmlvLT5jb3VudCA9IDA7CiAJCXNiaW8tPndvcmsuZnVuYyA9IHNjcnViX2NoZWNrc3VtOwotCQliaW8tPmJpX3ByaXZhdGUgPSBzZGV2LT5iaW9zW2ldOwotCQliaW8tPmJpX2VuZF9pbyA9IHNjcnViX2Jpb19lbmRfaW87Ci0JCWJpby0+Ymlfc2VjdG9yID0gMDsKLQkJYmlvLT5iaV9iZGV2ID0gZGV2LT5iZGV2OwotCQliaW8tPmJpX3NpemUgPSAwOwotCi0JCWZvciAoaiA9IDA7IGogPCBTQ1JVQl9QQUdFU19QRVJfQklPOyArK2opIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlOwotCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOwotCQkJaWYgKCFwYWdlKQotCQkJCWdvdG8gbm9tZW07Ci0KLQkJCXJldCA9IGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7Ci0JCQlpZiAoIXJldCkKLQkJCQlnb3RvIG5vbWVtOwotCQl9Ci0JCVdBUk5fT04oYmlvLT5iaV92Y250ICE9IFNDUlVCX1BBR0VTX1BFUl9CSU8pOwogCiAJCWlmIChpICE9IFNDUlVCX0JJT1NfUEVSX0RFVi0xKQogCQkJc2Rldi0+Ymlvc1tpXS0+bmV4dF9mcmVlID0gaSArIDE7CkBAIC0zNjksOSArMzQyLDYgQEAKIAlpbnQgcmV0OwogCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRlKTsKIAotCS8qIHdlIGFyZSBnb2luZyB0byB3YWl0IG9uIHRoaXMgSU8gKi8KLQlydyB8PSBSRVFfU1lOQzsKLQogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7CiAJYmlvLT5iaV9iZGV2ID0gYmRldjsKIAliaW8tPmJpX3NlY3RvciA9IHNlY3RvcjsKQEAgLTM4MCw2ICszNTAsNyBAQAogCWJpby0+YmlfcHJpdmF0ZSA9ICZjb21wbGV0ZTsKIAlzdWJtaXRfYmlvKHJ3LCBiaW8pOwogCisJLyogdGhpcyB3aWxsIGFsc28gdW5wbHVnIHRoZSBxdWV1ZSAqLwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRlKTsKIAogCXJldCA9ICF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKQEAgLTM5NCw2ICszNjUsNyBAQAogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gc2Rldi0+ZGV2LT5kZXZfcm9vdC0+ZnNfaW5mbzsKIAogCXNiaW8tPmVyciA9IGVycjsKKwlzYmlvLT5iaW8gPSBiaW87CiAKIAlidHJmc19xdWV1ZV93b3JrZXIoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMsICZzYmlvLT53b3JrKTsKIH0KQEAgLTQ1Myw2ICs0MjUsOCBAQAogCX0KIAogb3V0OgorCXNjcnViX2ZyZWVfYmlvKHNiaW8tPmJpbyk7CisJc2Jpby0+YmlvID0gTlVMTDsKIAlzcGluX2xvY2soJnNkZXYtPmxpc3RfbG9jayk7CiAJc2Jpby0+bmV4dF9mcmVlID0gc2Rldi0+Zmlyc3RfZnJlZTsKIAlzZGV2LT5maXJzdF9mcmVlID0gc2Jpby0+aW5kZXg7CkBAIC01ODMsMjUgKzU1Nyw1MCBAQAogc3RhdGljIGludCBzY3J1Yl9zdWJtaXQoc3RydWN0IHNjcnViX2RldiAqc2RldikKIHsKIAlzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvOworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgaTsKIAogCWlmIChzZGV2LT5jdXJyID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXNiaW8gPSBzZGV2LT5iaW9zW3NkZXYtPmN1cnJdOwogCi0Jc2Jpby0+YmlvLT5iaV9zZWN0b3IgPSBzYmlvLT5waHlzaWNhbCA+PiA5OwotCXNiaW8tPmJpby0+Ymlfc2l6ZSA9IHNiaW8tPmNvdW50ICogUEFHRV9TSVpFOwotCXNiaW8tPmJpby0+YmlfbmV4dCA9IE5VTEw7Ci0Jc2Jpby0+YmlvLT5iaV9mbGFncyB8PSAxIDw8IEJJT19VUFRPREFURTsKLQlzYmlvLT5iaW8tPmJpX2NvbXBfY3B1ID0gLTE7Ci0Jc2Jpby0+YmlvLT5iaV9iZGV2ID0gc2Rldi0+ZGV2LT5iZGV2OworCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgc2Jpby0+Y291bnQpOworCWlmICghYmlvKQorCQlnb3RvIG5vbWVtOworCisJYmlvLT5iaV9wcml2YXRlID0gc2JpbzsKKwliaW8tPmJpX2VuZF9pbyA9IHNjcnViX2Jpb19lbmRfaW87CisJYmlvLT5iaV9iZGV2ID0gc2Rldi0+ZGV2LT5iZGV2OworCWJpby0+Ymlfc2VjdG9yID0gc2Jpby0+cGh5c2ljYWwgPj4gOTsKKworCWZvciAoaSA9IDA7IGkgPCBzYmlvLT5jb3VudDsgKytpKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlpbnQgcmV0OworCisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0ZTKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBub21lbTsKKworCQlyZXQgPSBiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBQQUdFX1NJWkUsIDApOworCQlpZiAoIXJldCkgeworCQkJX19mcmVlX3BhZ2UocGFnZSk7CisJCQlnb3RvIG5vbWVtOworCQl9CisJfQorCiAJc2Jpby0+ZXJyID0gMDsKIAlzZGV2LT5jdXJyID0gLTE7CiAJYXRvbWljX2luYygmc2Rldi0+aW5fZmxpZ2h0KTsKIAotCXN1Ym1pdF9iaW8oMCwgc2Jpby0+YmlvKTsKKwlzdWJtaXRfYmlvKFJFQUQsIGJpbyk7CiAKIAlyZXR1cm4gMDsKKworbm9tZW06CisJc2NydWJfZnJlZV9iaW8oYmlvKTsKKworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW50IHNjcnViX3BhZ2Uoc3RydWN0IHNjcnViX2RldiAqc2RldiwgdTY0IGxvZ2ljYWwsIHU2NCBsZW4sCkBAIC02MzMsNyArNjMyLDExIEBACiAJCXNiaW8tPmxvZ2ljYWwgPSBsb2dpY2FsOwogCX0gZWxzZSBpZiAoc2Jpby0+cGh5c2ljYWwgKyBzYmlvLT5jb3VudCAqIFBBR0VfU0laRSAhPSBwaHlzaWNhbCB8fAogCQkgICBzYmlvLT5sb2dpY2FsICsgc2Jpby0+Y291bnQgKiBQQUdFX1NJWkUgIT0gbG9naWNhbCkgewotCQlzY3J1Yl9zdWJtaXQoc2Rldik7CisJCWludCByZXQ7CisKKwkJcmV0ID0gc2NydWJfc3VibWl0KHNkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAkJZ290byBhZ2FpbjsKIAl9CiAJc2Jpby0+c3BhZ1tzYmlvLT5jb3VudF0uZmxhZ3MgPSBmbGFnczsKQEAgLTY0NSw4ICs2NDgsMTMgQEAKIAkJbWVtY3B5KHNiaW8tPnNwYWdbc2Jpby0+Y291bnRdLmNzdW0sIGNzdW0sIHNkZXYtPmNzdW1fc2l6ZSk7CiAJfQogCSsrc2Jpby0+Y291bnQ7Ci0JaWYgKHNiaW8tPmNvdW50ID09IFNDUlVCX1BBR0VTX1BFUl9CSU8gfHwgZm9yY2UpCi0JCXNjcnViX3N1Ym1pdChzZGV2KTsKKwlpZiAoc2Jpby0+Y291bnQgPT0gU0NSVUJfUEFHRVNfUEVSX0JJTyB8fCBmb3JjZSkgeworCQlpbnQgcmV0OworCisJCXJldCA9IHNjcnViX3N1Ym1pdChzZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC03MjcsNiArNzM1LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGZzX2luZm8tPmV4dGVudF9yb290OwogCXN0cnVjdCBidHJmc19yb290ICpjc3VtX3Jvb3QgPSBmc19pbmZvLT5jc3VtX3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtICpleHRlbnQ7CisJc3RydWN0IGJsa19wbHVnIHBsdWc7CiAJdTY0IGZsYWdzOwogCWludCByZXQ7CiAJaW50IHNsb3Q7CkBAIC03ODksMTggKzc5OCwxMiBAQAogCiAJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfbm9wbHVnOwogCi0JCWwgPSBwYXRoLT5ub2Rlc1swXTsKLQkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwotCQlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmtleSwgc2xvdCk7Ci0JCWlmIChrZXkub2JqZWN0aWQgIT0gbG9naWNhbCkgewotCQkJcmV0ID0gYnRyZnNfcHJldmlvdXNfaXRlbShyb290LCBwYXRoLCAwLAotCQkJCQkJICBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQorCQkvKgorCQkgKiB3ZSBtaWdodCBtaXNzIGhhbGYgYW4gZXh0ZW50IGhlcmUsIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyLAorCQkgKiBhcyBpdCdzIG9ubHkgdGhlIHByZWZldGNoCisJCSAqLwogCQl3aGlsZSAoMSkgewogCQkJbCA9IHBhdGgtPm5vZGVzWzBdOwogCQkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwpAQCAtODA5LDcgKzgxMiw3IEBACiAJCQkJaWYgKHJldCA9PSAwKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBvdXQ7CisJCQkJCWdvdG8gb3V0X25vcGx1ZzsKIAogCQkJCWJyZWFrOwogCQkJfQpAQCAtODMxLDYgKzgzNCw3IEBACiAJICogdGhlIHNjcnViLiBUaGlzIG1pZ2h0IGN1cnJlbnRseSAoY3JjMzIpIGVuZCB1cCB0byBiZSBhYm91dCAxTUIKIAkgKi8KIAlzdGFydF9zdHJpcGUgPSAwOworCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIGFnYWluOgogCWxvZ2ljYWwgPSBiYXNlICsgb2Zmc2V0ICsgc3RhcnRfc3RyaXBlICogaW5jcmVtZW50OwogCWZvciAoaSA9IHN0YXJ0X3N0cmlwZTsgaSA8IG5zdHJpcGVzOyArK2kpIHsKQEAgLTg5MCwxNSArODk0LDIwIEBACiAJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwotCi0JCWwgPSBwYXRoLT5ub2Rlc1swXTsKLQkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwotCQlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmtleSwgc2xvdCk7Ci0JCWlmIChrZXkub2JqZWN0aWQgIT0gbG9naWNhbCkgeworCQlpZiAocmV0ID4gMCkgewogCQkJcmV0ID0gYnRyZnNfcHJldmlvdXNfaXRlbShyb290LCBwYXRoLCAwLAogCQkJCQkJICBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CisJCQlpZiAocmV0ID4gMCkgeworCQkJCS8qIHRoZXJlJ3Mgbm8gc21hbGxlciBpdGVtLCBzbyBzdGljayB3aXRoIHRoZQorCQkJCSAqIGxhcmdlciBvbmUgKi8KKwkJCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisJCQkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwKKwkJCQkJCQlwYXRoLCAwLCAwKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CiAJCX0KIAogCQl3aGlsZSAoMSkgewpAQCAtOTcyLDYgKzk4MSw4IEBACiAJc2NydWJfc3VibWl0KHNkZXYpOwogCiBvdXQ6CisJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKK291dF9ub3BsdWc6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KQEAgLTEwNDcsOCArMTA1OCwxNSBAQAogCXdoaWxlICgxKSB7CiAJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWlmIChyZXQgPiAwKSB7CisJCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0KKwkJCSAgICBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSkpIHsKKwkJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KIAogCQlsID0gcGF0aC0+bm9kZXNbMF07CiAJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKQEAgLTEwNTgsNyArMTA3Niw3IEBACiAJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gc2Rldi0+ZGV2LT5kZXZpZCkKIAkJCWJyZWFrOwogCi0JCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSAhPSBCVFJGU19ERVZfRVhURU5UX0tFWSkKKwkJaWYgKGJ0cmZzX2tleV90eXBlKCZmb3VuZF9rZXkpICE9IEJUUkZTX0RFVl9FWFRFTlRfS0VZKQogCQkJYnJlYWs7CiAKIAkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPj0gZW5kKQpAQCAtMTA4Nyw3ICsxMTA1LDcgQEAKIAkJY2FjaGUgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAoZnNfaW5mbywgY2h1bmtfb2Zmc2V0KTsKIAkJaWYgKCFjYWNoZSkgewogCQkJcmV0ID0gLUVOT0VOVDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAkJcmV0ID0gc2NydWJfY2h1bmsoc2RldiwgY2h1bmtfdHJlZSwgY2h1bmtfb2JqZWN0aWQsCiAJCQkJICBjaHVua19vZmZzZXQsIGxlbmd0aCk7CkBAIC0xMDk5LDkgKzExMTcsMTMgQEAKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCX0KIAotb3V0OgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKLQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiByZXQgY2FuIHN0aWxsIGJlIDEgZnJvbSBzZWFyY2hfc2xvdCBvciBuZXh0X2xlYWYsCisJICogdGhhdCdzIG5vdCBhbiBlcnJvcgorCSAqLworCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KIAogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQgc2NydWJfc3VwZXJzKHN0cnVjdCBzY3J1Yl9kZXYgKnNkZXYpCkBAIC0xMTM4LDggKzExNjAsMTIgQEAKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CiAKIAltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQlpZiAoZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPT0gMCkKKwlpZiAoZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPT0gMCkgeworCQlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMsICJzY3J1YiIsCisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLCAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOworCQlmc19pbmZvLT5zY3J1Yl93b3JrZXJzLmlkbGVfdGhyZXNoID0gNDsKIAkJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+c2NydWJfd29ya2VycywgMSk7CisJfQogCSsrZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQ7CiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKIApAQCAtMTE2Niw3ICsxMTkyLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKIAotCWlmIChyb290LT5mc19pbmZvLT5jbG9zaW5nKQorCWlmIChidHJmc19mc19jbG9zaW5nKHJvb3QtPmZzX2luZm8pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCmRpZmYgLS1naXQgYS9mcy9idHJmcy9zdXBlci5jIGIvZnMvYnRyZnMvc3VwZXIuYwppbmRleCA5YjJlN2U1Li4xNTYzNGQ0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9zdXBlci5jCisrKyBiL2ZzL2J0cmZzL3N1cGVyLmMKQEAgLTE2MSw3ICsxNjEsOCBAQAogCU9wdF9jb21wcmVzc190eXBlLCBPcHRfY29tcHJlc3NfZm9yY2UsIE9wdF9jb21wcmVzc19mb3JjZV90eXBlLAogCU9wdF9ub3RyZWVsb2csIE9wdF9yYXRpbywgT3B0X2ZsdXNob25jb21taXQsIE9wdF9kaXNjYXJkLAogCU9wdF9zcGFjZV9jYWNoZSwgT3B0X2NsZWFyX2NhY2hlLCBPcHRfdXNlcl9zdWJ2b2xfcm1fYWxsb3dlZCwKLQlPcHRfZW5vc3BjX2RlYnVnLCBPcHRfc3Vidm9scm9vdGlkLCBPcHRfZGVmcmFnLCBPcHRfZXJyLAorCU9wdF9lbm9zcGNfZGVidWcsIE9wdF9zdWJ2b2xyb290aWQsIE9wdF9kZWZyYWcsCisJT3B0X2lub2RlX2NhY2hlLCBPcHRfZXJyLAogfTsKIAogc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewpAQCAtMTkzLDYgKzE5NCw3IEBACiAJe09wdF9lbm9zcGNfZGVidWcsICJlbm9zcGNfZGVidWcifSwKIAl7T3B0X3N1YnZvbHJvb3RpZCwgInN1YnZvbHJvb3RpZD0lZCJ9LAogCXtPcHRfZGVmcmFnLCAiYXV0b2RlZnJhZyJ9LAorCXtPcHRfaW5vZGVfY2FjaGUsICJpbm9kZV9jYWNoZSJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIH07CiAKQEAgLTM2MSw2ICszNjMsMTAgQEAKIAkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBlbmFibGluZyBkaXNrIHNwYWNlIGNhY2hpbmdcbiIpOwogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIFNQQUNFX0NBQ0hFKTsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9pbm9kZV9jYWNoZToKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBlbmFibGluZyBpbm9kZSBtYXAgY2FjaGluZ1xuIik7CisJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgSU5PREVfTUFQX0NBQ0hFKTsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9jbGVhcl9jYWNoZToKIAkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBmb3JjZSBjbGVhcmluZyBvZiBkaXNrIGNhY2hlXG4iKTsKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBDTEVBUl9DQUNIRSk7CkBAIC03MTcsNiArNzIzLDEyIEBACiAJCXNlcV9wdXRzKHNlcSwgIixjbGVhcl9jYWNoZSIpOwogCWlmIChidHJmc190ZXN0X29wdChyb290LCBVU0VSX1NVQlZPTF9STV9BTExPV0VEKSkKIAkJc2VxX3B1dHMoc2VxLCAiLHVzZXJfc3Vidm9sX3JtX2FsbG93ZWQiKTsKKwlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgRU5PU1BDX0RFQlVHKSkKKwkJc2VxX3B1dHMoc2VxLCAiLGVub3NwY19kZWJ1ZyIpOworCWlmIChidHJmc190ZXN0X29wdChyb290LCBBVVRPX0RFRlJBRykpCisJCXNlcV9wdXRzKHNlcSwgIixhdXRvZGVmcmFnIik7CisJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXNlcV9wdXRzKHNlcSwgIixpbm9kZV9jYWNoZSIpOwogCXJldHVybiAwOwogfQogCkBAIC04MTksNyArODMxLDcgQEAKIAl9IGVsc2UgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLQkJcy0+c19mbGFncyA9IGZsYWdzOworCQlzLT5zX2ZsYWdzID0gZmxhZ3MgfCBNU19OT1NFQzsKIAkJc3RybGNweShzLT5zX2lkLCBiZGV2bmFtZShiZGV2LCBiKSwgc2l6ZW9mKHMtPnNfaWQpKTsKIAkJZXJyb3IgPSBidHJmc19maWxsX3N1cGVyKHMsIGZzX2RldmljZXMsIGRhdGEsCiAJCQkJCSBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3N5c2ZzLmMgYi9mcy9idHJmcy9zeXNmcy5jCmluZGV4IGMzYzIyM2EuLmRhYWM5YWUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3N5c2ZzLmMKKysrIGIvZnMvYnRyZnMvc3lzZnMuYwpAQCAtMjgsMTUyICsyOCw2IEBACiAjaW5jbHVkZSAiZGlzay1pby5oIgogI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCiAKLXN0YXRpYyBzc2l6ZV90IHJvb3RfYmxvY2tzX3VzZWRfc2hvdyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfcm9vdF91c2VkKCZyb290LT5yb290X2l0ZW0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgcm9vdF9ibG9ja19saW1pdF9zaG93KHN0cnVjdCBidHJmc19yb290ICpyb290LCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19yb290X2xpbWl0KCZyb290LT5yb290X2l0ZW0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3VwZXJfYmxvY2tzX3VzZWRfc2hvdyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMsIGNoYXIgKmJ1ZikKLXsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfc3VwZXJfYnl0ZXNfdXNlZCgmZnMtPnN1cGVyX2NvcHkpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3VwZXJfdG90YWxfYmxvY2tzX3Nob3coc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19zdXBlcl90b3RhbF9ieXRlcygmZnMtPnN1cGVyX2NvcHkpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3VwZXJfYmxvY2tzaXplX3Nob3coc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19zdXBlcl9zZWN0b3JzaXplKCZmcy0+c3VwZXJfY29weSkpOwotfQotCi0vKiB0aGlzIGlzIGZvciByb290IGF0dHJzIChzdWJ2b2xzL3NuYXBzaG90cykgKi8KLXN0cnVjdCBidHJmc19yb290X2F0dHIgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGJ0cmZzX3Jvb3QgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBidHJmc19yb290ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLSNkZWZpbmUgUk9PVF9BVFRSKG5hbWUsIG1vZGUsIHNob3csIHN0b3JlKSBcCi1zdGF0aWMgc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciBidHJmc19yb290X2F0dHJfIyNuYW1lID0gX19BVFRSKG5hbWUsIG1vZGUsIFwKLQkJCQkJCQkgICAgICBzaG93LCBzdG9yZSkKLQotUk9PVF9BVFRSKGJsb2Nrc191c2VkLAkwNDQ0LAlyb290X2Jsb2Nrc191c2VkX3Nob3csCU5VTEwpOwotUk9PVF9BVFRSKGJsb2NrX2xpbWl0LAkwNjQ0LAlyb290X2Jsb2NrX2xpbWl0X3Nob3csCU5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYnRyZnNfcm9vdF9hdHRyc1tdID0gewotCSZidHJmc19yb290X2F0dHJfYmxvY2tzX3VzZWQuYXR0ciwKLQkmYnRyZnNfcm9vdF9hdHRyX2Jsb2NrX2xpbWl0LmF0dHIsCi0JTlVMTCwKLX07Ci0KLS8qIHRoaXMgaXMgZm9yIHN1cGVyIGF0dHJzIChhY3R1YWwgZnVsbCBmcykgKi8KLXN0cnVjdCBidHJmc19zdXBlcl9hdHRyIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBidHJmc19mc19pbmZvICosIGNoYXIgKik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19OwotCi0jZGVmaW5lIFNVUEVSX0FUVFIobmFtZSwgbW9kZSwgc2hvdywgc3RvcmUpIFwKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciBidHJmc19zdXBlcl9hdHRyXyMjbmFtZSA9IF9fQVRUUihuYW1lLCBtb2RlLCBcCi0JCQkJCQkJCXNob3csIHN0b3JlKQotCi1TVVBFUl9BVFRSKGJsb2Nrc191c2VkLAkJMDQ0NCwJc3VwZXJfYmxvY2tzX3VzZWRfc2hvdywJCU5VTEwpOwotU1VQRVJfQVRUUih0b3RhbF9ibG9ja3MsCTA0NDQsCXN1cGVyX3RvdGFsX2Jsb2Nrc19zaG93LAlOVUxMKTsKLVNVUEVSX0FUVFIoYmxvY2tzaXplLAkJMDQ0NCwJc3VwZXJfYmxvY2tzaXplX3Nob3csCQlOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJ0cmZzX3N1cGVyX2F0dHJzW10gPSB7Ci0JJmJ0cmZzX3N1cGVyX2F0dHJfYmxvY2tzX3VzZWQuYXR0ciwKLQkmYnRyZnNfc3VwZXJfYXR0cl90b3RhbF9ibG9ja3MuYXR0ciwKLQkmYnRyZnNfc3VwZXJfYXR0cl9ibG9ja3NpemUuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIHNzaXplX3QgYnRyZnNfc3VwZXJfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19mc19pbmZvLAotCQkJCQkJc3VwZXJfa29iaik7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSAgc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIsCi0JCQkJCQkgIGF0dHIpOwotCi0JcmV0dXJuIGEtPnNob3cgPyBhLT5zaG93KGZzLCBidWYpIDogMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYnRyZnNfc3VwZXJfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19mc19pbmZvLAotCQkJCQkJc3VwZXJfa29iaik7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSAgc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIsCi0JCQkJCQkgIGF0dHIpOwotCi0JcmV0dXJuIGEtPnN0b3JlID8gYS0+c3RvcmUoZnMsIGJ1ZiwgbGVuKSA6IDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJ0cmZzX3Jvb3RfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX3Jvb3QsCi0JCQkJCQlyb290X2tvYmopOwotCXN0cnVjdCBidHJmc19yb290X2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyLAotCQkJCQkJIGF0dHIpOwotCi0JcmV0dXJuIGEtPnNob3cgPyBhLT5zaG93KHJvb3QsIGJ1ZikgOiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBidHJmc19yb290X2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19yb290LAotCQkJCQkJcm9vdF9rb2JqKTsKLQlzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyICphID0gY29udGFpbmVyX29mKGF0dHIsCi0JCQkJCQkgc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciwKLQkJCQkJCSBhdHRyKTsKLQlyZXR1cm4gYS0+c3RvcmUgPyBhLT5zdG9yZShyb290LCBidWYsIGxlbikgOiAwOwotfQotCi1zdGF0aWMgdm9pZCBidHJmc19zdXBlcl9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBidHJmc19mc19pbmZvICpmcyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfZnNfaW5mbywKLQkJCQkJCXN1cGVyX2tvYmopOwotCWNvbXBsZXRlKCZmcy0+a29ial91bnJlZ2lzdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgYnRyZnNfcm9vdF9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19yb290LAotCQkJCQkJcm9vdF9rb2JqKTsKLQljb21wbGV0ZSgmcm9vdC0+a29ial91bnJlZ2lzdGVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgYnRyZnNfc3VwZXJfYXR0cl9vcHMgPSB7Ci0JLnNob3cJPSBidHJmc19zdXBlcl9hdHRyX3Nob3csCi0JLnN0b3JlCT0gYnRyZnNfc3VwZXJfYXR0cl9zdG9yZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGJ0cmZzX3Jvb3RfYXR0cl9vcHMgPSB7Ci0JLnNob3cJPSBidHJmc19yb290X2F0dHJfc2hvdywKLQkuc3RvcmUJPSBidHJmc19yb290X2F0dHJfc3RvcmUsCi19OwotCiAvKiAvc3lzL2ZzL2J0cmZzLyBlbnRyeSAqLwogc3RhdGljIHN0cnVjdCBrc2V0ICpidHJmc19rc2V0OwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwppbmRleCBkYzgwZjcxLi41MWRjZWM4IDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKQEAgLTM1LDYgKzM1LDcgQEAKIHsKIAlXQVJOX09OKGF0b21pY19yZWFkKCZ0cmFuc2FjdGlvbi0+dXNlX2NvdW50KSA9PSAwKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHJhbnNhY3Rpb24tPnVzZV9jb3VudCkpIHsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZ0cmFuc2FjdGlvbi0+bGlzdCkpOwogCQltZW1zZXQodHJhbnNhY3Rpb24sIDAsIHNpemVvZigqdHJhbnNhY3Rpb24pKTsKIAkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX3RyYW5zYWN0aW9uX2NhY2hlcCwgdHJhbnNhY3Rpb24pOwogCX0KQEAgLTQ5LDQ2ICs1MCw3MiBAQAogLyoKICAqIGVpdGhlciBhbGxvY2F0ZSBhIG5ldyB0cmFuc2FjdGlvbiBvciBob3AgaW50byB0aGUgZXhpc3Rpbmcgb25lCiAgKi8KLXN0YXRpYyBub2lubGluZSBpbnQgam9pbl90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3N0YXRpYyBub2lubGluZSBpbnQgam9pbl90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IG5vZmFpbCkKIHsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cl90cmFuczsKKworCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJaWYgKHJvb3QtPmZzX2luZm8tPnRyYW5zX25vX2pvaW4pIHsKKwkJaWYgKCFub2ZhaWwpIHsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKIAljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOwotCWlmICghY3VyX3RyYW5zKSB7Ci0JCWN1cl90cmFucyA9IGttZW1fY2FjaGVfYWxsb2MoYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwLAotCQkJCQkgICAgIEdGUF9OT0ZTKTsKLQkJaWYgKCFjdXJfdHJhbnMpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbisrOwotCQlhdG9taWNfc2V0KCZjdXJfdHJhbnMtPm51bV93cml0ZXJzLCAxKTsKLQkJY3VyX3RyYW5zLT5udW1fam9pbmVkID0gMDsKLQkJY3VyX3RyYW5zLT50cmFuc2lkID0gcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbjsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY3VyX3RyYW5zLT53cml0ZXJfd2FpdCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN1cl90cmFucy0+Y29tbWl0X3dhaXQpOwotCQljdXJfdHJhbnMtPmluX2NvbW1pdCA9IDA7Ci0JCWN1cl90cmFucy0+YmxvY2tlZCA9IDA7Ci0JCWF0b21pY19zZXQoJmN1cl90cmFucy0+dXNlX2NvdW50LCAxKTsKLQkJY3VyX3RyYW5zLT5jb21taXRfZG9uZSA9IDA7Ci0JCWN1cl90cmFucy0+c3RhcnRfdGltZSA9IGdldF9zZWNvbmRzKCk7Ci0KLQkJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMucm9vdCA9IFJCX1JPT1Q7Ci0JCWN1cl90cmFucy0+ZGVsYXllZF9yZWZzLm51bV9lbnRyaWVzID0gMDsKLQkJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2hlYWRzX3JlYWR5ID0gMDsKLQkJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2hlYWRzID0gMDsKLQkJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMuZmx1c2hpbmcgPSAwOwotCQljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5ydW5fZGVsYXllZF9zdGFydCA9IDA7Ci0JCXNwaW5fbG9ja19pbml0KCZjdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5sb2NrKTsKLQotCQlJTklUX0xJU1RfSEVBRCgmY3VyX3RyYW5zLT5wZW5kaW5nX3NuYXBzaG90cyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmN1cl90cmFucy0+bGlzdCwgJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xpc3QpOwotCQlleHRlbnRfaW9fdHJlZV9pbml0KCZjdXJfdHJhbnMtPmRpcnR5X3BhZ2VzLAotCQkJCSAgICAgcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7Ci0JCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOwotCQlyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uID0gY3VyX3RyYW5zOwotCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOwotCX0gZWxzZSB7CisJaWYgKGN1cl90cmFucykgeworCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CiAJCWF0b21pY19pbmMoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMpOwogCQljdXJfdHJhbnMtPm51bV9qb2luZWQrKzsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCQlyZXR1cm4gMDsKIAl9CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCisJY3VyX3RyYW5zID0ga21lbV9jYWNoZV9hbGxvYyhidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsIEdGUF9OT0ZTKTsKKwlpZiAoIWN1cl90cmFucykKKwkJcmV0dXJuIC1FTk9NRU07CisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwlpZiAocm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbikgeworCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwLCBjdXJfdHJhbnMpOworCQljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOworCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CisJCWF0b21pY19pbmMoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMpOworCQljdXJfdHJhbnMtPm51bV9qb2luZWQrKzsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJYXRvbWljX3NldCgmY3VyX3RyYW5zLT5udW1fd3JpdGVycywgMSk7CisJY3VyX3RyYW5zLT5udW1fam9pbmVkID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdXJfdHJhbnMtPndyaXRlcl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdXJfdHJhbnMtPmNvbW1pdF93YWl0KTsKKwljdXJfdHJhbnMtPmluX2NvbW1pdCA9IDA7CisJY3VyX3RyYW5zLT5ibG9ja2VkID0gMDsKKwkvKgorCSAqIE9uZSBmb3IgdGhpcyB0cmFucyBoYW5kbGUsIG9uZSBzbyBpdCB3aWxsIGxpdmUgb24gdW50aWwgd2UKKwkgKiBjb21taXQgdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCWF0b21pY19zZXQoJmN1cl90cmFucy0+dXNlX2NvdW50LCAyKTsKKwljdXJfdHJhbnMtPmNvbW1pdF9kb25lID0gMDsKKwljdXJfdHJhbnMtPnN0YXJ0X3RpbWUgPSBnZXRfc2Vjb25kcygpOworCisJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMucm9vdCA9IFJCX1JPT1Q7CisJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2VudHJpZXMgPSAwOworCWN1cl90cmFucy0+ZGVsYXllZF9yZWZzLm51bV9oZWFkc19yZWFkeSA9IDA7CisJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2hlYWRzID0gMDsKKwljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5mbHVzaGluZyA9IDA7CisJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMucnVuX2RlbGF5ZWRfc3RhcnQgPSAwOworCXNwaW5fbG9ja19pbml0KCZjdXJfdHJhbnMtPmNvbW1pdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmY3VyX3RyYW5zLT5wZW5kaW5nX3NuYXBzaG90cyk7CisJbGlzdF9hZGRfdGFpbCgmY3VyX3RyYW5zLT5saXN0LCAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCk7CisJZXh0ZW50X2lvX3RyZWVfaW5pdCgmY3VyX3RyYW5zLT5kaXJ0eV9wYWdlcywKKwkJCSAgICAgcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CisJcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbisrOworCWN1cl90cmFucy0+dHJhbnNpZCA9IHJvb3QtPmZzX2luZm8tPmdlbmVyYXRpb247CisJcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbiA9IGN1cl90cmFuczsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk5LDM2ICsxMjYsODIgQEAKICAqIHRvIG1ha2Ugc3VyZSB0aGUgb2xkIHJvb3QgZnJvbSBiZWZvcmUgd2Ugam9pbmVkIHRoZSB0cmFuc2FjdGlvbiBpcyBkZWxldGVkCiAgKiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzCiAgKi8KLXN0YXRpYyBub2lubGluZSBpbnQgcmVjb3JkX3Jvb3RfaW5fdHJhbnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3N0YXRpYyBpbnQgcmVjb3JkX3Jvb3RfaW5fdHJhbnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJaWYgKHJvb3QtPnJlZl9jb3dzICYmIHJvb3QtPmxhc3RfdHJhbnMgPCB0cmFucy0+dHJhbnNpZCkgewogCQlXQVJOX09OKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QpOwogCQlXQVJOX09OKHJvb3QtPmNvbW1pdF9yb290ICE9IHJvb3QtPm5vZGUpOwogCisJCS8qCisJCSAqIHNlZSBiZWxvdyBmb3IgaW5fdHJhbnNfc2V0dXAgdXNhZ2UgcnVsZXMKKwkJICogd2UgaGF2ZSB0aGUgcmVsb2MgbXV0ZXggaGVsZCBub3csIHNvIHRoZXJlCisJCSAqIGlzIG9ubHkgb25lIHdyaXRlciBpbiB0aGlzIGZ1bmN0aW9uCisJCSAqLworCQlyb290LT5pbl90cmFuc19zZXR1cCA9IDE7CisKKwkJLyogbWFrZSBzdXJlIHJlYWRlcnMgZmluZCBpbl90cmFuc19zZXR1cCBiZWZvcmUKKwkJICogdGhleSBmaW5kIG91ciByb290LT5sYXN0X3RyYW5zIHVwZGF0ZQorCQkgKi8KKwkJc21wX3dtYigpOworCisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CisJCWlmIChyb290LT5sYXN0X3RyYW5zID09IHRyYW5zLT50cmFuc2lkKSB7CisJCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQogCQlyYWRpeF90cmVlX3RhZ19zZXQoJnJvb3QtPmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAogCQkJICAgKHVuc2lnbmVkIGxvbmcpcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkgICBCVFJGU19ST09UX1RSQU5TX1RBRyk7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAkJcm9vdC0+bGFzdF90cmFucyA9IHRyYW5zLT50cmFuc2lkOworCisJCS8qIHRoaXMgaXMgcHJldHR5IHRyaWNreS4gIFdlIGRvbid0IHdhbnQgdG8KKwkJICogdGFrZSB0aGUgcmVsb2NhdGlvbiBsb2NrIGluIGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zCisJCSAqIHVubGVzcyB3ZSdyZSByZWFsbHkgZG9pbmcgdGhlIGZpcnN0IHNldHVwIGZvciB0aGlzIHJvb3QgaW4KKwkJICogdGhpcyB0cmFuc2FjdGlvbi4KKwkJICoKKwkJICogTm9ybWFsbHkgd2UnZCB1c2Ugcm9vdC0+bGFzdF90cmFucyBhcyBhIGZsYWcgdG8gZGVjaWRlCisJCSAqIGlmIHdlIHdhbnQgdG8gdGFrZSB0aGUgZXhwZW5zaXZlIG11dGV4LgorCQkgKgorCQkgKiBCdXQsIHdlIGhhdmUgdG8gc2V0IHJvb3QtPmxhc3RfdHJhbnMgYmVmb3JlIHdlCisJCSAqIGluaXQgdGhlIHJlbG9jYXRpb24gcm9vdCwgb3RoZXJ3aXNlLCB3ZSB0cmlwIG92ZXIgd2FybmluZ3MKKwkJICogaW4gY3RyZWUuYy4gIFRoZSBzb2x1dGlvbiB1c2VkIGhlcmUgaXMgdG8gZmxhZyBvdXJzZWx2ZXMKKwkJICogd2l0aCByb290LT5pbl90cmFuc19zZXR1cC4gIFdoZW4gdGhpcyBpcyAxLCB3ZSdyZSBzdGlsbAorCQkgKiBmaXhpbmcgdXAgdGhlIHJlbG9jIHRyZWVzIGFuZCBldmVyeW9uZSBtdXN0IHdhaXQuCisJCSAqCisJCSAqIFdoZW4gdGhpcyBpcyB6ZXJvLCB0aGV5IGNhbiB0cnVzdCByb290LT5sYXN0X3RyYW5zIGFuZCBmbHkKKwkJICogdGhyb3VnaCBidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyB3aXRob3V0IGhhdmluZyB0byB0YWtlIHRoZQorCQkgKiBsb2NrLiAgc21wX3dtYigpIG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIHdyaXRlcyBhYm92ZSBhcmUKKwkJICogZG9uZSBiZWZvcmUgd2UgcG9wIGluIHRoZSB6ZXJvIGJlbG93CisJCSAqLwogCQlidHJmc19pbml0X3JlbG9jX3Jvb3QodHJhbnMsIHJvb3QpOworCQlzbXBfd21iKCk7CisJCXJvb3QtPmluX3RyYW5zX3NldHVwID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKKwogaW50IGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewogCWlmICghcm9vdC0+cmVmX2Nvd3MpCiAJCXJldHVybiAwOwogCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCWlmIChyb290LT5sYXN0X3RyYW5zID09IHRyYW5zLT50cmFuc2lkKSB7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCS8qCisJICogc2VlIHJlY29yZF9yb290X2luX3RyYW5zIGZvciBjb21tZW50cyBhYm91dCBpbl90cmFuc19zZXR1cCB1c2FnZQorCSAqIGFuZCBiYXJyaWVycworCSAqLworCXNtcF9ybWIoKTsKKwlpZiAocm9vdC0+bGFzdF90cmFucyA9PSB0cmFucy0+dHJhbnNpZCAmJgorCSAgICAhcm9vdC0+aW5fdHJhbnNfc2V0dXApCiAJCXJldHVybiAwOwotCX0KIAorCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAlyZWNvcmRfcm9vdF9pbl90cmFucyh0cmFucywgcm9vdCk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQwLDIxICsyMTMsMjMgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cl90cmFuczsKIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJY3VyX3RyYW5zID0gcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbjsKIAlpZiAoY3VyX3RyYW5zICYmIGN1cl90cmFucy0+YmxvY2tlZCkgewogCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJCXdoaWxlICgxKSB7CiAJCQlwcmVwYXJlX3RvX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsICZ3YWl0LAogCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlpZiAoIWN1cl90cmFucy0+YmxvY2tlZCkKIAkJCQlicmVhazsKLQkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQkJc2NoZWR1bGUoKTsKLQkJCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJfQogCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwgJndhaXQpOwogCQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJfQogfQogCkBAIC0xNjcsMTAgKzI0MiwxNiBAQAogCiBzdGF0aWMgaW50IG1heV93YWl0X3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgdHlwZSkKIHsKLQlpZiAoIXJvb3QtPmZzX2luZm8tPmxvZ19yb290X3JlY292ZXJpbmcgJiYKLQkgICAgKCh0eXBlID09IFRSQU5TX1NUQVJUICYmICFyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKSB8fAotCSAgICAgdHlwZSA9PSBUUkFOU19VU0VSU1BBQ0UpKQorCWlmIChyb290LT5mc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nKQorCQlyZXR1cm4gMDsKKworCWlmICh0eXBlID09IFRSQU5TX1VTRVJTUEFDRSkKIAkJcmV0dXJuIDE7CisKKwlpZiAodHlwZSA9PSBUUkFOU19TVEFSVCAmJgorCSAgICAhYXRvbWljX3JlYWQoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpKQorCQlyZXR1cm4gMTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODQsMzYgKzI2NSw0NCBAQAogCiAJaWYgKHJvb3QtPmZzX2luZm8tPmZzX3N0YXRlICYgQlRSRlNfU1VQRVJfRkxBR19FUlJPUikKIAkJcmV0dXJuIEVSUl9QVFIoLUVST0ZTKTsKKworCWlmIChjdXJyZW50LT5qb3VybmFsX2luZm8pIHsKKwkJV0FSTl9PTih0eXBlICE9IFRSQU5TX0pPSU4gJiYgdHlwZSAhPSBUUkFOU19KT0lOX05PTE9DSyk7CisJCWggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJCWgtPnVzZV9jb3VudCsrOworCQloLT5vcmlnX3JzdiA9IGgtPmJsb2NrX3JzdjsKKwkJaC0+YmxvY2tfcnN2ID0gTlVMTDsKKwkJZ290byBnb3RfaXQ7CisJfQogYWdhaW46CiAJaCA9IGttZW1fY2FjaGVfYWxsb2MoYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCwgR0ZQX05PRlMpOwogCWlmICghaCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlpZiAodHlwZSAhPSBUUkFOU19KT0lOX05PTE9DSykKLQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCWlmIChtYXlfd2FpdF90cmFuc2FjdGlvbihyb290LCB0eXBlKSkKIAkJd2FpdF9jdXJyZW50X3RyYW5zKHJvb3QpOwogCi0JcmV0ID0gam9pbl90cmFuc2FjdGlvbihyb290KTsKKwlkbyB7CisJCXJldCA9IGpvaW5fdHJhbnNhY3Rpb24ocm9vdCwgdHlwZSA9PSBUUkFOU19KT0lOX05PTE9DSyk7CisJCWlmIChyZXQgPT0gLUVCVVNZKQorCQkJd2FpdF9jdXJyZW50X3RyYW5zKHJvb3QpOworCX0gd2hpbGUgKHJldCA9PSAtRUJVU1kpOworCiAJaWYgKHJldCA8IDApIHsKIAkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX3RyYW5zX2hhbmRsZV9jYWNoZXAsIGgpOwotCQlpZiAodHlwZSAhPSBUUkFOU19KT0lOX05PTE9DSykKLQkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAogCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247Ci0JYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOwotCWlmICh0eXBlICE9IFRSQU5TX0pPSU5fTk9MT0NLKQotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAogCWgtPnRyYW5zaWQgPSBjdXJfdHJhbnMtPnRyYW5zaWQ7CiAJaC0+dHJhbnNhY3Rpb24gPSBjdXJfdHJhbnM7CiAJaC0+YmxvY2tzX3VzZWQgPSAwOwotCWgtPmJsb2NrX2dyb3VwID0gMDsKIAloLT5ieXRlc19yZXNlcnZlZCA9IDA7CiAJaC0+ZGVsYXllZF9yZWZfdXBkYXRlcyA9IDA7CisJaC0+dXNlX2NvdW50ID0gMTsKIAloLT5ibG9ja19yc3YgPSBOVUxMOworCWgtPm9yaWdfcnN2ID0gTlVMTDsKIAogCXNtcF9tYigpOwogCWlmIChjdXJfdHJhbnMtPmJsb2NrZWQgJiYgbWF5X3dhaXRfdHJhbnNhY3Rpb24ocm9vdCwgdHlwZSkpIHsKQEAgLTI0MSwxMSArMzMwLDggQEAKIAkJfQogCX0KIAotCWlmICh0eXBlICE9IFRSQU5TX0pPSU5fTk9MT0NLKQotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0JcmVjb3JkX3Jvb3RfaW5fdHJhbnMoaCwgcm9vdCk7Ci0JaWYgKHR5cGUgIT0gVFJBTlNfSk9JTl9OT0xPQ0spCi0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworZ290X2l0OgorCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKGgsIHJvb3QpOwogCiAJaWYgKCFjdXJyZW50LT5qb3VybmFsX2luZm8gJiYgdHlwZSAhPSBUUkFOU19VU0VSU1BBQ0UpCiAJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IGg7CkBAIC0yNTcsMjIgKzM0MywxOSBAQAogewogCXJldHVybiBzdGFydF90cmFuc2FjdGlvbihyb290LCBudW1faXRlbXMsIFRSQU5TX1NUQVJUKTsKIH0KLXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJCQkgICBpbnQgbnVtX2Jsb2NrcykKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJcmV0dXJuIHN0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDAsIFRSQU5TX0pPSU4pOwogfQogCi1zdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJCQkJCQkgIGludCBudW1fYmxvY2tzKQorc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJcmV0dXJuIHN0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDAsIFRSQU5TX0pPSU5fTk9MT0NLKTsKIH0KIAotc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnIsCi0JCQkJCQkJIGludCBudW1fYmxvY2tzKQorc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7Ci0JcmV0dXJuIHN0YXJ0X3RyYW5zYWN0aW9uKHIsIDAsIFRSQU5TX1VTRVJTUEFDRSk7CisJcmV0dXJuIHN0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDAsIFRSQU5TX1VTRVJTUEFDRSk7CiB9CiAKIC8qIHdhaXQgZm9yIGEgdHJhbnNhY3Rpb24gY29tbWl0IHRvIGJlIGZ1bGx5IGNvbXBsZXRlICovCkBAIC0yODAsMTcgKzM2MywxMyBAQAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmNvbW1pdCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJd2hpbGUgKCFjb21taXQtPmNvbW1pdF9kb25lKSB7CiAJCXByZXBhcmVfdG9fd2FpdCgmY29tbWl0LT5jb21taXRfd2FpdCwgJndhaXQsCiAJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlpZiAoY29tbWl0LT5jb21taXRfZG9uZSkKIAkJCWJyZWFrOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJc2NoZWR1bGUoKTsKLQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCX0KLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAlmaW5pc2hfd2FpdCgmY29tbWl0LT5jb21taXRfd2FpdCwgJndhaXQpOwogCXJldHVybiAwOwogfQpAQCAtMzAwLDU5ICszNzksNTYgQEAKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cl90cmFucyA9IE5VTEwsICp0OwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0KIAlyZXQgPSAwOwogCWlmICh0cmFuc2lkKSB7CiAJCWlmICh0cmFuc2lkIDw9IHJvb3QtPmZzX2luZm8tPmxhc3RfdHJhbnNfY29tbWl0dGVkKQotCQkJZ290byBvdXRfdW5sb2NrOworCQkJZ290byBvdXQ7CiAKIAkJLyogZmluZCBzcGVjaWZpZWQgdHJhbnNhY3Rpb24gKi8KKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCwgbGlzdCkgewogCQkJaWYgKHQtPnRyYW5zaWQgPT0gdHJhbnNpZCkgewogCQkJCWN1cl90cmFucyA9IHQ7CisJCQkJYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKHQtPnRyYW5zaWQgPiB0cmFuc2lkKQogCQkJCWJyZWFrOwogCQl9CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJaWYgKCFjdXJfdHJhbnMpCi0JCQlnb3RvIG91dF91bmxvY2s7ICAvKiBiYWQgdHJhbnNpZCAqLworCQkJZ290byBvdXQ7ICAvKiBiYWQgdHJhbnNpZCAqLwogCX0gZWxzZSB7CiAJCS8qIGZpbmQgbmV3ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaXMgY29tbWl0dGluZyB8IGNvbW1pdHRlZCAqLworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodCwgJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xpc3QsCiAJCQkJCSAgICBsaXN0KSB7CiAJCQlpZiAodC0+aW5fY29tbWl0KSB7CiAJCQkJaWYgKHQtPmNvbW1pdF9kb25lKQotCQkJCQlnb3RvIG91dF91bmxvY2s7CisJCQkJCWJyZWFrOwogCQkJCWN1cl90cmFucyA9IHQ7CisJCQkJYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJaWYgKCFjdXJfdHJhbnMpCi0JCQlnb3RvIG91dF91bmxvY2s7ICAvKiBub3RoaW5nIGNvbW1pdHRpbmd8Y29tbWl0dGVkICovCisJCQlnb3RvIG91dDsgIC8qIG5vdGhpbmcgY29tbWl0dGluZ3xjb21taXR0ZWQgKi8KIAl9CiAKLQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0KIAl3YWl0X2Zvcl9jb21taXQocm9vdCwgY3VyX3RyYW5zKTsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAlyZXQgPSAwOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGJ0cmZzX3Rocm90dGxlKHN0cnVjdCBidHJmc19yb290ICpyb290KQogewotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQlpZiAoIXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpCisJaWYgKCFhdG9taWNfcmVhZCgmcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucykpCiAJCXdhaXRfY3VycmVudF90cmFucyhyb290KTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIH0KIAogc3RhdGljIGludCBzaG91bGRfZW5kX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMzcwLDYgKzQ0Niw3IEBACiAJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpjdXJfdHJhbnMgPSB0cmFucy0+dHJhbnNhY3Rpb247CiAJaW50IHVwZGF0ZXM7CiAKKwlzbXBfbWIoKTsKIAlpZiAoY3VyX3RyYW5zLT5ibG9ja2VkIHx8IGN1cl90cmFucy0+ZGVsYXllZF9yZWZzLmZsdXNoaW5nKQogCQlyZXR1cm4gMTsKIApAQCAtMzg4LDYgKzQ2NSwxMSBAQAogCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gcm9vdC0+ZnNfaW5mbzsKIAlpbnQgY291bnQgPSAwOwogCisJaWYgKC0tdHJhbnMtPnVzZV9jb3VudCkgeworCQl0cmFucy0+YmxvY2tfcnN2ID0gdHJhbnMtPm9yaWdfcnN2OworCQlyZXR1cm4gMDsKKwl9CisKIAl3aGlsZSAoY291bnQgPCA0KSB7CiAJCXVuc2lnbmVkIGxvbmcgY3VyID0gdHJhbnMtPmRlbGF5ZWRfcmVmX3VwZGF0ZXM7CiAJCXRyYW5zLT5kZWxheWVkX3JlZl91cGRhdGVzID0gMDsKQEAgLTQxMCw5ICs0OTIsMTEgQEAKIAogCWJ0cmZzX3RyYW5zX3JlbGVhc2VfbWV0YWRhdGEodHJhbnMsIHJvb3QpOwogCi0JaWYgKGxvY2sgJiYgIXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMgJiYKLQkgICAgc2hvdWxkX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCkpCisJaWYgKGxvY2sgJiYgIWF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKSAmJgorCSAgICBzaG91bGRfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KSkgewogCQl0cmFucy0+dHJhbnNhY3Rpb24tPmJsb2NrZWQgPSAxOworCQlzbXBfd21iKCk7CisJfQogCiAJaWYgKGxvY2sgJiYgY3VyX3RyYW5zLT5ibG9ja2VkICYmICFjdXJfdHJhbnMtPmluX2NvbW1pdCkgewogCQlpZiAodGhyb3R0bGUpCkBAIC03MDMsOSArNzg3LDkgQEAKICAqLwogaW50IGJ0cmZzX2FkZF9kZWFkX3Jvb3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7Ci0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJbGlzdF9hZGQoJnJvb3QtPnJvb3RfbGlzdCwgJnJvb3QtPmZzX2luZm8tPmRlYWRfcm9vdHMpOwotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzIxLDYgKzgwNSw3IEBACiAJaW50IHJldDsKIAlpbnQgZXJyID0gMDsKIAorCXNwaW5fbG9jaygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CiAJd2hpbGUgKDEpIHsKIAkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAogCQkJCQkJICh2b2lkICoqKWdhbmcsIDAsCkBAIC03MzMsNiArODE4LDcgQEAKIAkJCXJhZGl4X3RyZWVfdGFnX2NsZWFyKCZmc19pbmZvLT5mc19yb290c19yYWRpeCwKIAkJCQkJKHVuc2lnbmVkIGxvbmcpcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkJCUJUUkZTX1JPT1RfVFJBTlNfVEFHKTsKKwkJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAogCQkJYnRyZnNfZnJlZV9sb2codHJhbnMsIHJvb3QpOwogCQkJYnRyZnNfdXBkYXRlX3JlbG9jX3Jvb3QodHJhbnMsIHJvb3QpOwpAQCAtNzUzLDEwICs4MzksMTIgQEAKIAkJCWVyciA9IGJ0cmZzX3VwZGF0ZV9yb290KHRyYW5zLCBmc19pbmZvLT50cmVlX3Jvb3QsCiAJCQkJCQkmcm9vdC0+cm9vdF9rZXksCiAJCQkJCQkmcm9vdC0+cm9vdF9pdGVtKTsKKwkJCXNwaW5fbG9jaygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CiAJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC03ODYsNyArODc0LDcgQEAKIAkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShpbmZvLT50cmVlX3Jvb3QsIG5yKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAKLQkJaWYgKHJvb3QtPmZzX2luZm8tPmNsb3NpbmcgfHwgcmV0ICE9IC1FQUdBSU4pCisJCWlmIChidHJmc19mc19jbG9zaW5nKHJvb3QtPmZzX2luZm8pIHx8IHJldCAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CiAJfQogCXJvb3QtPmRlZnJhZ19ydW5uaW5nID0gMDsKQEAgLTg2OSw2ICs5NTcsMTUgQEAKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHBhcmVudF9yb290LCBwYXJlbnRfaW5vZGUpOwogCUJVR19PTihyZXQpOwogCisJLyoKKwkgKiBwdWxsIGluIHRoZSBkZWxheWVkIGRpcmVjdG9yeSB1cGRhdGUKKwkgKiBhbmQgdGhlIGRlbGF5ZWQgaW5vZGUgaXRlbQorCSAqIG90aGVyd2lzZSB3ZSBjb3JydXB0IHRoZSBGUyBkdXJpbmcKKwkgKiBzbmFwc2hvdAorCSAqLworCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX2l0ZW1zKHRyYW5zLCByb290KTsKKwlCVUdfT04ocmV0KTsKKwogCXJlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCByb290KTsKIAlidHJmc19zZXRfcm9vdF9sYXN0X3NuYXBzaG90KCZyb290LT5yb290X2l0ZW0sIHRyYW5zLT50cmFuc2lkKTsKIAltZW1jcHkobmV3X3Jvb3RfaXRlbSwgJnJvb3QtPnJvb3RfaXRlbSwgc2l6ZW9mKCpuZXdfcm9vdF9pdGVtKSk7CkBAIC05MzAsMTQgKzEwMjcsNiBAQAogCWludCByZXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlbmRpbmcsIGhlYWQsIGxpc3QpIHsKLQkJLyoKLQkJICogV2UgbXVzdCBkZWFsIHdpdGggdGhlIGRlbGF5ZWQgaXRlbXMgYmVmb3JlIGNyZWF0aW5nCi0JCSAqIHNuYXBzaG90cywgb3Igd2Ugd2lsbCBjcmVhdGUgYSBzbmFwdGhvdCB3aXRoIGluY29uc2lzdGVudAotCQkgKiBpbmZvcm1hdGlvbi4KLQkJKi8KLQkJcmV0ID0gYnRyZnNfcnVuX2RlbGF5ZWRfaXRlbXModHJhbnMsIGZzX2luZm8tPmZzX3Jvb3QpOwotCQlCVUdfT04ocmV0KTsKLQogCQlyZXQgPSBjcmVhdGVfcGVuZGluZ19zbmFwc2hvdCh0cmFucywgZnNfaW5mbywgcGVuZGluZyk7CiAJCUJVR19PTihyZXQpOwogCX0KQEAgLTk2NywyMCArMTA1NiwyMCBAQAogaW50IGJ0cmZzX3RyYW5zYWN0aW9uX2luX2NvbW1pdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0ID0gMDsKLQlzcGluX2xvY2soJmluZm8tPm5ld190cmFuc19sb2NrKTsKKwlzcGluX2xvY2soJmluZm8tPnRyYW5zX2xvY2spOwogCWlmIChpbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uKQogCQlyZXQgPSBpbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uLT5pbl9jb21taXQ7Ci0Jc3Bpbl91bmxvY2soJmluZm8tPm5ld190cmFuc19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5mby0+dHJhbnNfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAogaW50IGJ0cmZzX3RyYW5zYWN0aW9uX2Jsb2NrZWQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8pCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3Bpbl9sb2NrKCZpbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJc3Bpbl9sb2NrKCZpbmZvLT50cmFuc19sb2NrKTsKIAlpZiAoaW5mby0+cnVubmluZ190cmFuc2FjdGlvbikKIAkJcmV0ID0gaW5mby0+cnVubmluZ190cmFuc2FjdGlvbi0+YmxvY2tlZDsKLQlzcGluX3VubG9jaygmaW5mby0+bmV3X3RyYW5zX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbmZvLT50cmFuc19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDA0LDkgKzEwOTMsNyBAQAogCQkJCSAgICAmd2FpdCk7CiAJCQlicmVhazsKIAkJfQotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJc2NoZWR1bGUoKTsKLQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fYmxvY2tlZF93YWl0LCAmd2FpdCk7CiAJfQogfQpAQCAtMTAzMiw5ICsxMTE5LDcgQEAKIAkJCQkgICAgJndhaXQpOwogCQkJYnJlYWs7CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJCXNjaGVkdWxlKCk7Ci0JCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJZmluaXNoX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsCiAJCQkgICAgJndhaXQpOwogCX0KQEAgLTEwNzIsNyArMTE1Nyw3IEBACiAKIAlJTklUX0RFTEFZRURfV09SSygmYWMtPndvcmssIGRvX2FzeW5jX2NvbW1pdCk7CiAJYWMtPnJvb3QgPSByb290OwotCWFjLT5uZXd0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJYWMtPm5ld3RyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlpZiAoSVNfRVJSKGFjLT5uZXd0cmFucykpIHsKIAkJaW50IGVyciA9IFBUUl9FUlIoYWMtPm5ld3RyYW5zKTsKIAkJa2ZyZWUoYWMpOwpAQCAtMTA4MCwyMyArMTE2NSwyMiBAQAogCX0KIAogCS8qIHRha2UgdHJhbnNhY3Rpb24gcmVmZXJlbmNlICovCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCWN1cl90cmFucyA9IHRyYW5zLT50cmFuc2FjdGlvbjsKIAlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWMtPndvcmssIDApOwogCiAJLyogd2FpdCBmb3IgdHJhbnNhY3Rpb24gdG8gc3RhcnQgYW5kIHVuYmxvY2sgKi8KLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJaWYgKHdhaXRfZm9yX3VuYmxvY2spCiAJCXdhaXRfY3VycmVudF90cmFuc19jb21taXRfc3RhcnRfYW5kX3VuYmxvY2socm9vdCwgY3VyX3RyYW5zKTsKIAllbHNlCiAJCXdhaXRfY3VycmVudF90cmFuc19jb21taXRfc3RhcnQocm9vdCwgY3VyX3RyYW5zKTsKLQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAorCWlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gPT0gdHJhbnMpCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CisKKwlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzOSwzOCArMTIyMyw0MSBAQAogCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsIDApOwogCUJVR19PTihyZXQpOwogCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXNwaW5fbG9jaygmY3VyX3RyYW5zLT5jb21taXRfbG9jayk7CiAJaWYgKGN1cl90cmFucy0+aW5fY29tbWl0KSB7CisJCXNwaW5fdW5sb2NrKCZjdXJfdHJhbnMtPmNvbW1pdF9sb2NrKTsKIAkJYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAogCQlyZXQgPSB3YWl0X2Zvcl9jb21taXQocm9vdCwgY3VyX3RyYW5zKTsKIAkJQlVHX09OKHJldCk7CiAKLQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAkJcmV0dXJuIDA7CiAJfQogCiAJdHJhbnMtPnRyYW5zYWN0aW9uLT5pbl9jb21taXQgPSAxOwogCXRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCA9IDE7CisJc3Bpbl91bmxvY2soJmN1cl90cmFucy0+Y29tbWl0X2xvY2spOwogCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdCk7CiAKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCWlmIChjdXJfdHJhbnMtPmxpc3QucHJldiAhPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCkgewogCQlwcmV2X3RyYW5zID0gbGlzdF9lbnRyeShjdXJfdHJhbnMtPmxpc3QucHJldiwKIAkJCQkJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uLCBsaXN0KTsKIAkJaWYgKCFwcmV2X3RyYW5zLT5jb21taXRfZG9uZSkgewogCQkJYXRvbWljX2luYygmcHJldl90cmFucy0+dXNlX2NvdW50KTsKLQkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCiAJCQl3YWl0X2Zvcl9jb21taXQocm9vdCwgcHJldl90cmFucyk7CiAKLQkJCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJCXB1dF90cmFuc2FjdGlvbihwcmV2X3RyYW5zKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAl9CiAKIAlpZiAobm93IDwgY3VyX3RyYW5zLT5zdGFydF90aW1lIHx8IG5vdyAtIGN1cl90cmFucy0+c3RhcnRfdGltZSA8IDEpCkBAIC0xMTc4LDEyICsxMjY1LDEyIEBACiAKIAlkbyB7CiAJCWludCBzbmFwX3BlbmRpbmcgPSAwOworCiAJCWpvaW5lZCA9IGN1cl90cmFucy0+bnVtX2pvaW5lZDsKIAkJaWYgKCFsaXN0X2VtcHR5KCZ0cmFucy0+dHJhbnNhY3Rpb24tPnBlbmRpbmdfc25hcHNob3RzKSkKIAkJCXNuYXBfcGVuZGluZyA9IDE7CiAKIAkJV0FSTl9PTihjdXJfdHJhbnMgIT0gdHJhbnMtPnRyYW5zYWN0aW9uKTsKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAkJaWYgKGZsdXNoX29uX2NvbW1pdCB8fCBzbmFwX3BlbmRpbmcpIHsKIAkJCWJ0cmZzX3N0YXJ0X2RlbGFsbG9jX2lub2Rlcyhyb290LCAxKTsKQEAgLTEyMDYsMjYgKzEyOTMsNDggQEAKIAkJcHJlcGFyZV90b193YWl0KCZjdXJfdHJhbnMtPndyaXRlcl93YWl0LCAmd2FpdCwKIAkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAKLQkJc21wX21iKCk7CiAJCWlmIChhdG9taWNfcmVhZCgmY3VyX3RyYW5zLT5udW1fd3JpdGVycykgPiAxKQogCQkJc2NoZWR1bGVfdGltZW91dChNQVhfU0NIRURVTEVfVElNRU9VVCk7CiAJCWVsc2UgaWYgKHNob3VsZF9ncm93KQogCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKIAotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJCWZpbmlzaF93YWl0KCZjdXJfdHJhbnMtPndyaXRlcl93YWl0LCAmd2FpdCk7CiAJfSB3aGlsZSAoYXRvbWljX3JlYWQoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMpID4gMSB8fAogCQkgKHNob3VsZF9ncm93ICYmIGN1cl90cmFucy0+bnVtX2pvaW5lZCAhPSBqb2luZWQpKTsKIAotCXJldCA9IGNyZWF0ZV9wZW5kaW5nX3NuYXBzaG90cyh0cmFucywgcm9vdC0+ZnNfaW5mbyk7Ci0JQlVHX09OKHJldCk7CisJLyoKKwkgKiBPayBub3cgd2UgbmVlZCB0byBtYWtlIHN1cmUgdG8gYmxvY2sgb3V0IGFueSBvdGhlciBqb2lucyB3aGlsZSB3ZQorCSAqIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uICBXZSBjb3VsZCBoYXZlIHN0YXJ0ZWQgYSBqb2luIGJlZm9yZSBzZXR0aW5nCisJICogbm9fam9pbiBzbyBtYWtlIHN1cmUgdG8gd2FpdCBmb3IgbnVtX3dyaXRlcnMgdG8gPT0gMSBhZ2Fpbi4KKwkgKi8KKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCXJvb3QtPmZzX2luZm8tPnRyYW5zX25vX2pvaW4gPSAxOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwl3YWl0X2V2ZW50KGN1cl90cmFucy0+d3JpdGVyX3dhaXQsCisJCSAgIGF0b21pY19yZWFkKCZjdXJfdHJhbnMtPm51bV93cml0ZXJzKSA9PSAxKTsKKworCS8qCisJICogdGhlIHJlbG9jIG11dGV4IG1ha2VzIHN1cmUgdGhhdCB3ZSBzdG9wCisJICogdGhlIGJhbGFuY2luZyBjb2RlIGZyb20gY29taW5nIGluIGFuZCBtb3ZpbmcKKwkgKiBleHRlbnRzIGFyb3VuZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjb21taXQKKwkgKi8KKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CiAKIAlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9pdGVtcyh0cmFucywgcm9vdCk7CiAJQlVHX09OKHJldCk7CiAKKwlyZXQgPSBjcmVhdGVfcGVuZGluZ19zbmFwc2hvdHModHJhbnMsIHJvb3QtPmZzX2luZm8pOworCUJVR19PTihyZXQpOworCiAJcmV0ID0gYnRyZnNfcnVuX2RlbGF5ZWRfcmVmcyh0cmFucywgcm9vdCwgKHVuc2lnbmVkIGxvbmcpLTEpOwogCUJVR19PTihyZXQpOwogCisJLyoKKwkgKiBtYWtlIHN1cmUgbm9uZSBvZiB0aGUgY29kZSBhYm92ZSBtYW5hZ2VkIHRvIHNsaXAgaW4gYQorCSAqIGRlbGF5ZWQgaXRlbQorCSAqLworCWJ0cmZzX2Fzc2VydF9kZWxheWVkX3Jvb3RfZW1wdHkocm9vdCk7CisKIAlXQVJOX09OKGN1cl90cmFucyAhPSB0cmFucy0+dHJhbnNhY3Rpb24pOwogCiAJYnRyZnNfc2NydWJfcGF1c2Uocm9vdCk7CkBAIC0xMjU4LDkgKzEzNjcsNiBAQAogCWJ0cmZzX3ByZXBhcmVfZXh0ZW50X2NvbW1pdCh0cmFucywgcm9vdCk7CiAKIAljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOwotCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOwotCXJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24gPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CiAKIAlidHJmc19zZXRfcm9vdF9ub2RlKCZyb290LT5mc19pbmZvLT50cmVlX3Jvb3QtPnJvb3RfaXRlbSwKIAkJCSAgICByb290LT5mc19pbmZvLT50cmVlX3Jvb3QtPm5vZGUpOwpAQCAtMTI4MSwxMCArMTM4NywxNCBAQAogCSAgICAgICBzaXplb2Yocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkpOwogCiAJdHJhbnMtPnRyYW5zYWN0aW9uLT5ibG9ja2VkID0gMDsKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCXJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24gPSBOVUxMOworCXJvb3QtPmZzX2luZm8tPnRyYW5zX25vX2pvaW4gPSAwOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAogCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQpOwogCi0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJcmV0ID0gYnRyZnNfd3JpdGVfYW5kX3dhaXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCUJVR19PTihyZXQpOwogCXdyaXRlX2N0cmVlX3N1cGVyKHRyYW5zLCByb290LCAwKTsKQEAgLTEyOTcsMjIgKzE0MDcsMjEgQEAKIAogCWJ0cmZzX2ZpbmlzaF9leHRlbnRfY29tbWl0KHRyYW5zLCByb290KTsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQogCWN1cl90cmFucy0+Y29tbWl0X2RvbmUgPSAxOwogCiAJcm9vdC0+ZnNfaW5mby0+bGFzdF90cmFuc19jb21taXR0ZWQgPSBjdXJfdHJhbnMtPnRyYW5zaWQ7CiAKIAl3YWtlX3VwKCZjdXJfdHJhbnMtPmNvbW1pdF93YWl0KTsKIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmY3VyX3RyYW5zLT5saXN0KTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisKIAlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAogCXRyYWNlX2J0cmZzX3RyYW5zYWN0aW9uX2NvbW1pdChyb290KTsKIAotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCiAJYnRyZnNfc2NydWJfY29udGludWUocm9vdCk7CiAKIAlpZiAoY3VycmVudC0+am91cm5hbF9pbmZvID09IHRyYW5zKQpAQCAtMTMzNCw5ICsxNDQzLDkgQEAKIAlMSVNUX0hFQUQobGlzdCk7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOwogCi0JbXV0ZXhfbG9jaygmZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXNwaW5fbG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmZnNfaW5mby0+ZGVhZF9yb290cywgJmxpc3QpOwotCW11dGV4X3VubG9jaygmZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT50cmFuc19sb2NrKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmbGlzdCkpIHsKIAkJcm9vdCA9IGxpc3RfZW50cnkobGlzdC5uZXh0LCBzdHJ1Y3QgYnRyZnNfcm9vdCwgcm9vdF9saXN0KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmggYi9mcy9idHJmcy90cmFuc2FjdGlvbi5oCmluZGV4IDgwNGM4ODYuLjAyNTY0ZTYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmgKKysrIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uaApAQCAtMjgsMTAgKzI4LDEyIEBACiAJICogdHJhbnNhY3Rpb24gY2FuIGVuZAogCSAqLwogCWF0b21pY190IG51bV93cml0ZXJzOworCWF0b21pY190IHVzZV9jb3VudDsKIAogCXVuc2lnbmVkIGxvbmcgbnVtX2pvaW5lZDsKKworCXNwaW5sb2NrX3QgY29tbWl0X2xvY2s7CiAJaW50IGluX2NvbW1pdDsKLQlhdG9taWNfdCB1c2VfY291bnQ7CiAJaW50IGNvbW1pdF9kb25lOwogCWludCBibG9ja2VkOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTQ1LDEzICs0NywxNCBAQAogCiBzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlIHsKIAl1NjQgdHJhbnNpZDsKLQl1NjQgYmxvY2tfZ3JvdXA7CiAJdTY0IGJ5dGVzX3Jlc2VydmVkOworCXVuc2lnbmVkIGxvbmcgdXNlX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgYmxvY2tzX3Jlc2VydmVkOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tzX3VzZWQ7CiAJdW5zaWduZWQgbG9uZyBkZWxheWVkX3JlZl91cGRhdGVzOwogCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKm9yaWdfcnN2OwogfTsKIAogc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgewpAQCAtNjYsMTkgKzY5LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQl0cmFucy0+YmxvY2tfZ3JvdXAgPSBCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAoCi0JCQkJCSAgc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXAgPSB0cmFucy0+YmxvY2tfZ3JvdXA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfaW5vZGVfbGFzdF90cmFucyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTkyLDEyICs4Miw5IEBACiAJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKIHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkJICAgaW50IG51bV9pdGVtcyk7Ci1zdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19qb2luX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCQkJICBpbnQgbnVtX2Jsb2Nrcyk7Ci1zdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJCQkJCQkgIGludCBudW1fYmxvY2tzKTsKLXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX3N0YXJ0X2lvY3RsX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyLAotCQkJCQkJCSBpbnQgbnVtX2Jsb2Nrcyk7CitzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19qb2luX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb25fbm9sb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX3N0YXJ0X2lvY3RsX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKIGludCBidHJmc193YWl0X2Zvcl9jb21taXQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCB0cmFuc2lkKTsKIGludCBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMgYi9mcy9idHJmcy90cmVlLWxvZy5jCmluZGV4IDU5MjM5NmMuLjRjZThhOWYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMKKysrIGIvZnMvYnRyZnMvdHJlZS1sb2cuYwpAQCAtMzE3Nyw3ICszMTc3LDcgQEAKIAkJdG1wX2tleS5vZmZzZXQgPSAodTY0KS0xOwogCiAJCXdjLnJlcGxheV9kZXN0ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZnNfaW5mbywgJnRtcF9rZXkpOwotCQlCVUdfT04oIXdjLnJlcGxheV9kZXN0KTsKKwkJQlVHX09OKElTX0VSUl9PUl9OVUxMKHdjLnJlcGxheV9kZXN0KSk7CiAKIAkJd2MucmVwbGF5X2Rlc3QtPmxvZ19yb290ID0gbG9nOwogCQlidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyh0cmFucywgd2MucmVwbGF5X2Rlc3QpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5jIGIvZnMvYnRyZnMvdm9sdW1lcy5jCmluZGV4IGM0ODIxNGUuLjE5NDUwYmMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuYworKysgYi9mcy9idHJmcy92b2x1bWVzLmMKQEAgLTUwNCw3ICs1MDQsNyBAQAogCQlCVUdfT04oIW5ld19kZXZpY2UpOwogCQltZW1jcHkobmV3X2RldmljZSwgZGV2aWNlLCBzaXplb2YoKm5ld19kZXZpY2UpKTsKIAkJbmV3X2RldmljZS0+bmFtZSA9IGtzdHJkdXAoZGV2aWNlLT5uYW1lLCBHRlBfTk9GUyk7Ci0JCUJVR19PTighbmV3X2RldmljZS0+bmFtZSk7CisJCUJVR19PTihkZXZpY2UtPm5hbWUgJiYgIW5ld19kZXZpY2UtPm5hbWUpOwogCQluZXdfZGV2aWNlLT5iZGV2ID0gTlVMTDsKIAkJbmV3X2RldmljZS0+d3JpdGVhYmxlID0gMDsKIAkJbmV3X2RldmljZS0+aW5fZnNfbWV0YWRhdGEgPSAwOwpAQCAtNjg5LDEyICs2ODksOCBAQAogCXRyYW5zaWQgPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKGRpc2tfc3VwZXIpOwogCWlmIChkaXNrX3N1cGVyLT5sYWJlbFswXSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZGV2aWNlIGxhYmVsICVzICIsIGRpc2tfc3VwZXItPmxhYmVsKTsKLQllbHNlIHsKLQkJLyogRklYTUUsIG1ha2UgYSByZWFkbCB1dWlkIHBhcnNlciAqLwotCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgZnNpZCAlbGx4LSVsbHggIiwKLQkJICAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopZGlza19zdXBlci0+ZnNpZCwKLQkJICAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopKGRpc2tfc3VwZXItPmZzaWQgKyA4KSk7Ci0JfQorCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGV2aWNlIGZzaWQgJXBVICIsIGRpc2tfc3VwZXItPmZzaWQpOwogCXByaW50ayhLRVJOX0NPTlQgImRldmlkICVsbHUgdHJhbnNpZCAlbGx1ICVzXG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldmlkLCAodW5zaWduZWQgbG9uZyBsb25nKXRyYW5zaWQsIHBhdGgpOwogCXJldCA9IGRldmljZV9saXN0X2FkZChwYXRoLCBkaXNrX3N1cGVyLCBkZXZpZCwgZnNfZGV2aWNlc19yZXQpOwpAQCAtMjEwMiw3ICsyMDk4LDggQEAKIAkJCQkJICAgY2h1bmtfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkJCSAgIGZvdW5kX2tleS5vYmplY3RpZCwKIAkJCQkJICAgZm91bmRfa2V5Lm9mZnNldCk7Ci0JCUJVR19PTihyZXQgJiYgcmV0ICE9IC1FTk9TUEMpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PU1BDKQorCQkJZ290byBlcnJvcjsKIAkJa2V5Lm9mZnNldCA9IGZvdW5kX2tleS5vZmZzZXQgLSAxOwogCX0KIAlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMveGF0dHIuYyBiL2ZzL2J0cmZzL3hhdHRyLmMKaW5kZXggZjMxMDdlNC4uNTM2NmZlNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMveGF0dHIuYworKysgYi9mcy9idHJmcy94YXR0ci5jCkBAIC0xNTgsOCArMTU4LDYgQEAKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0KIAlyZXQgPSBkb19zZXR4YXR0cih0cmFucywgaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDQ5YzlhYWQuLjFhODBiMDQgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0xOTAyLDEwICsxOTAyLDggQEAKIAkJaWYgKCFidWZmZXJfdXB0b2RhdGUoKndhaXRfYmgpKQogCQkJZXJyID0gLUVJTzsKIAl9Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKKwlpZiAodW5saWtlbHkoZXJyKSkKIAkJcGFnZV96ZXJvX25ld19idWZmZXJzKHBhZ2UsIGZyb20sIHRvKTsKLQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7Ci0JfQogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKF9fYmxvY2tfd3JpdGVfYmVnaW4pOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9hZGRyLmMgYi9mcy9jZXBoL2FkZHIuYwppbmRleCAzM2RhNDlkLi41YTM5NTNkIDEwMDY0NAotLS0gYS9mcy9jZXBoL2FkZHIuYworKysgYi9mcy9jZXBoL2FkZHIuYwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlCVUdfT04oIWlub2RlKTsKLQlpZ3JhYihpbm9kZSk7CisJaWhvbGQoaW5vZGUpOwogCWVyciA9IHdyaXRlcGFnZV9ub3VubG9jayhwYWdlLCB3YmMpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9jYXBzLmMgYi9mcy9jZXBoL2NhcHMuYwppbmRleCAxZjcyYjAwLi5mNjA1NzUzIDEwMDY0NAotLS0gYS9mcy9jZXBoL2NhcHMuYworKysgYi9mcy9jZXBoL2NhcHMuYwpAQCAtMjk0MCwxNCArMjk0MCwxMiBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmbWRzYy0+Y2FwX2RpcnR5KSkgewogCQljaSA9IGxpc3RfZmlyc3RfZW50cnkoJm1kc2MtPmNhcF9kaXJ0eSwgc3RydWN0IGNlcGhfaW5vZGVfaW5mbywKIAkJCQkgICAgICBpX2RpcnR5X2l0ZW0pOwotCQlpbm9kZSA9IGlncmFiKCZjaS0+dmZzX2lub2RlKTsKKwkJaW5vZGUgPSAmY2ktPnZmc19pbm9kZTsKKwkJaWhvbGQoaW5vZGUpOwogCQlkb3V0KCJmbHVzaF9kaXJ0eV9jYXBzICVwXG4iLCBpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZtZHNjLT5jYXBfZGlydHlfbG9jayk7Ci0JCWlmIChpbm9kZSkgewotCQkJY2VwaF9jaGVja19jYXBzKGNpLCBDSEVDS19DQVBTX05PREVMQVl8Q0hFQ0tfQ0FQU19GTFVTSCwKLQkJCQkJTlVMTCk7Ci0JCQlpcHV0KGlub2RlKTsKLQkJfQorCQljZXBoX2NoZWNrX2NhcHMoY2ksIENIRUNLX0NBUFNfTk9ERUxBWXxDSEVDS19DQVBTX0ZMVVNILCBOVUxMKTsKKwkJaXB1dChpbm9kZSk7CiAJCXNwaW5fbG9jaygmbWRzYy0+Y2FwX2RpcnR5X2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmbWRzYy0+Y2FwX2RpcnR5X2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggMzM3MjllOC4uZWY4ZjA4YyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC0zMDgsNyArMzA4LDggQEAKIAkJcmVxID0gY2VwaF9tZHNjX2NyZWF0ZV9yZXF1ZXN0KG1kc2MsIG9wLCBVU0VfQVVUSF9NRFMpOwogCQlpZiAoSVNfRVJSKHJlcSkpCiAJCQlyZXR1cm4gUFRSX0VSUihyZXEpOwotCQlyZXEtPnJfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCQlpaG9sZChpbm9kZSk7CiAJCXJlcS0+cl9kZW50cnkgPSBkZ2V0KGZpbHAtPmZfZGVudHJ5KTsKIAkJLyogaGludHMgdG8gcmVxdWVzdCAtPiBtZHMgc2VsZWN0aW9uIGNvZGUgKi8KIAkJcmVxLT5yX2RpcmVjdF9tb2RlID0gVVNFX0FVVEhfTURTOwpAQCAtNzg3LDEwICs3ODgsMTIgQEAKIAlyZXEtPnJfZGVudHJ5X2Ryb3AgPSBDRVBIX0NBUF9GSUxFX1NIQVJFRDsKIAlyZXEtPnJfZGVudHJ5X3VubGVzcyA9IENFUEhfQ0FQX0ZJTEVfRVhDTDsKIAllcnIgPSBjZXBoX21kc2NfZG9fcmVxdWVzdChtZHNjLCBkaXIsIHJlcSk7Ci0JaWYgKGVycikKKwlpZiAoZXJyKSB7CiAJCWRfZHJvcChkZW50cnkpOwotCWVsc2UgaWYgKCFyZXEtPnJfcmVwbHlfaW5mby5oZWFkLT5pc19kZW50cnkpCi0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpZ3JhYihvbGRfZGVudHJ5LT5kX2lub2RlKSk7CisJfSBlbHNlIGlmICghcmVxLT5yX3JlcGx5X2luZm8uaGVhZC0+aXNfZGVudHJ5KSB7CisJCWlob2xkKG9sZF9kZW50cnktPmRfaW5vZGUpOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisJfQogCWNlcGhfbWRzY19wdXRfcmVxdWVzdChyZXEpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9jZXBoL2V4cG9ydC5jIGIvZnMvY2VwaC9leHBvcnQuYwppbmRleCBhNjEwZDNkLi5mNjdiNjg3IDEwMDY0NAotLS0gYS9mcy9jZXBoL2V4cG9ydC5jCisrKyBiL2ZzL2NlcGgvZXhwb3J0LmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCQllcnIgPSBjZXBoX21kc2NfZG9fcmVxdWVzdChtZHNjLCBOVUxMLCByZXEpOwogCQlpbm9kZSA9IHJlcS0+cl90YXJnZXRfaW5vZGU7CiAJCWlmIChpbm9kZSkKLQkJCWlncmFiKGlub2RlKTsKKwkJCWlob2xkKGlub2RlKTsKIAkJY2VwaF9tZHNjX3B1dF9yZXF1ZXN0KHJlcSk7CiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCQllcnIgPSBjZXBoX21kc2NfZG9fcmVxdWVzdChtZHNjLCBOVUxMLCByZXEpOwogCQlpbm9kZSA9IHJlcS0+cl90YXJnZXRfaW5vZGU7CiAJCWlmIChpbm9kZSkKLQkJCWlncmFiKGlub2RlKTsKKwkJCWlob2xkKGlub2RlKTsKIAkJY2VwaF9tZHNjX3B1dF9yZXF1ZXN0KHJlcSk7CiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gRVJSX1BUUihlcnIgPyBlcnIgOiAtRVNUQUxFKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvZmlsZS5jIGIvZnMvY2VwaC9maWxlLmMKaW5kZXggMjAzMjUyZC4uNDY5OGE1YyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9maWxlLmMKKysrIGIvZnMvY2VwaC9maWxlLmMKQEAgLTE5MSw3ICsxOTEsOCBAQAogCQllcnIgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KLQlyZXEtPnJfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJaWhvbGQoaW5vZGUpOwogCXJlcS0+cl9udW1fY2FwcyA9IDE7CiAJZXJyID0gY2VwaF9tZHNjX2RvX3JlcXVlc3QobWRzYywgcGFyZW50X2lub2RlLCByZXEpOwogCWlmICghZXJyKQpAQCAtMjgyLDE0ICsyODMsMTMgQEAKIHN0YXRpYyBpbnQgc3RyaXBlZF9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQl1NjQgb2ZmLCB1NjQgbGVuLAogCQkJc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bV9wYWdlcywKLQkJCWludCAqY2hlY2tlb2YsIGJvb2wgYWxpZ25fdG9fcGFnZXMsCisJCQlpbnQgKmNoZWNrZW9mLCBib29sIG9fZGlyZWN0LAogCQkJdW5zaWduZWQgbG9uZyBidWZfYWxpZ24pCiB7CiAJc3RydWN0IGNlcGhfZnNfY2xpZW50ICpmc2MgPSBjZXBoX2lub2RlX3RvX2NsaWVudChpbm9kZSk7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAl1NjQgcG9zLCB0aGlzX2xlbjsKIAlpbnQgaW9fYWxpZ24sIHBhZ2VfYWxpZ247Ci0JaW50IHBhZ2Vfb2ZmID0gb2ZmICYgflBBR0VfQ0FDSEVfTUFTSzsgLyogZmlyc3QgYnl0ZSdzIG9mZnNldCBpbiBwYWdlICovCiAJaW50IGxlZnQsIHBhZ2VzX2xlZnQ7CiAJaW50IHJlYWQ7CiAJc3RydWN0IHBhZ2UgKipwYWdlX3BvczsKQEAgLTMwNyw3ICszMDcsNyBAQAogCWlvX2FsaWduID0gb2ZmICYgflBBR0VfTUFTSzsKIAogbW9yZToKLQlpZiAoYWxpZ25fdG9fcGFnZXMpCisJaWYgKG9fZGlyZWN0KQogCQlwYWdlX2FsaWduID0gKHBvcyAtIGlvX2FsaWduICsgYnVmX2FsaWduKSAmIH5QQUdFX01BU0s7CiAJZWxzZQogCQlwYWdlX2FsaWduID0gcG9zICYgflBBR0VfTUFTSzsKQEAgLTMxNywyMCArMzE3LDE5IEBACiAJCQkJICBjaS0+aV90cnVuY2F0ZV9zZXEsCiAJCQkJICBjaS0+aV90cnVuY2F0ZV9zaXplLAogCQkJCSAgcGFnZV9wb3MsIHBhZ2VzX2xlZnQsIHBhZ2VfYWxpZ24pOwotCWhpdF9zdHJpcGUgPSB0aGlzX2xlbiA8IGxlZnQ7Ci0Jd2FzX3Nob3J0ID0gcmV0ID49IDAgJiYgcmV0IDwgdGhpc19sZW47CiAJaWYgKHJldCA9PSAtRU5PRU5UKQogCQlyZXQgPSAwOworCWhpdF9zdHJpcGUgPSB0aGlzX2xlbiA8IGxlZnQ7CisJd2FzX3Nob3J0ID0gcmV0ID49IDAgJiYgcmV0IDwgdGhpc19sZW47CiAJZG91dCgic3RyaXBlZF9yZWFkICVsbHV+JXUgKHJlYWQgJXUpIGdvdCAlZCVzJXNcbiIsIHBvcywgbGVmdCwgcmVhZCwKIAkgICAgIHJldCwgaGl0X3N0cmlwZSA/ICIgSElUU1RSSVBFIiA6ICIiLCB3YXNfc2hvcnQgPyAiIFNIT1JUIiA6ICIiKTsKIAogCWlmIChyZXQgPiAwKSB7Ci0JCWludCBkaWRwYWdlcyA9Ci0JCQkoKHBvcyAmIH5QQUdFX0NBQ0hFX01BU0spICsgcmV0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpbnQgZGlkcGFnZXMgPSAocGFnZV9hbGlnbiArIHJldCkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAogCQlpZiAocmVhZCA8IHBvcyAtIG9mZikgewogCQkJZG91dCgiIHplcm8gZ2FwICVsbHUgdG8gJWxsdVxuIiwgb2ZmICsgcmVhZCwgcG9zKTsKLQkJCWNlcGhfemVyb19wYWdlX3ZlY3Rvcl9yYW5nZShwYWdlX29mZiArIHJlYWQsCisJCQljZXBoX3plcm9fcGFnZV92ZWN0b3JfcmFuZ2UocGFnZV9hbGlnbiArIHJlYWQsCiAJCQkJCQkgICAgcG9zIC0gb2ZmIC0gcmVhZCwgcGFnZXMpOwogCQl9CiAJCXBvcyArPSByZXQ7CkBAIC0zNDUsMjAgKzM0NCwyMiBAQAogCX0KIAogCWlmICh3YXNfc2hvcnQpIHsKLQkJLyogd2FzIG9yaWdpbmFsIGV4dGVudCBmdWxseSBpbnNpZGUgaV9zaXplPyAqLwotCQlpZiAocG9zICsgbGVmdCA8PSBpbm9kZS0+aV9zaXplKSB7Ci0JCQlkb3V0KCJ6ZXJvIHRhaWxcbiIpOwotCQkJY2VwaF96ZXJvX3BhZ2VfdmVjdG9yX3JhbmdlKHBhZ2Vfb2ZmICsgcmVhZCwgbGVuIC0gcmVhZCwKLQkJCQkJCSAgICBwYWdlcyk7Ci0JCQlyZWFkID0gbGVuOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJLyogZGlkIHdlIGJvdW5jZSBvZmYgZW9mPyAqLworCQlpZiAocG9zICsgbGVmdCA+IGlub2RlLT5pX3NpemUpCisJCQkqY2hlY2tlb2YgPSAxOwogCi0JCS8qIGNoZWNrIGlfc2l6ZSAqLwotCQkqY2hlY2tlb2YgPSAxOworCQkvKiB6ZXJvIHRyYWlsaW5nIGJ5dGVzIChpbnNpZGUgaV9zaXplKSAqLworCQlpZiAobGVmdCA+IDAgJiYgcG9zIDwgaW5vZGUtPmlfc2l6ZSkgeworCQkJaWYgKHBvcyArIGxlZnQgPiBpbm9kZS0+aV9zaXplKQorCQkJCWxlZnQgPSBpbm9kZS0+aV9zaXplIC0gcG9zOworCisJCQlkb3V0KCJ6ZXJvIHRhaWwgJWRcbiIsIGxlZnQpOworCQkJY2VwaF96ZXJvX3BhZ2VfdmVjdG9yX3JhbmdlKHBhZ2VfYWxpZ24gKyByZWFkLCBsZWZ0LAorCQkJCQkJICAgIHBhZ2VzKTsKKwkJCXJlYWQgKz0gbGVmdDsKKwkJfQogCX0KIAotb3V0OgogCWlmIChyZXQgPj0gMCkKIAkJcmV0ID0gcmVhZDsKIAlkb3V0KCJzdHJpcGVkX3JlYWQgcmV0dXJucyAlZFxuIiwgcmV0KTsKQEAgLTQ3NSw5ICs0NzYsNiBAQAogCWVsc2UKIAkJcG9zID0gKm9mZnNldDsKIAotCWlvX2FsaWduID0gcG9zICYgflBBR0VfTUFTSzsKLQlidWZfYWxpZ24gPSAodW5zaWduZWQgbG9uZylkYXRhICYgflBBR0VfTUFTSzsKLQogCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgcG9zLCBwb3MgKyBsZWZ0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTUwMSw2ICs0OTksOCBAQAogCSAqIGJvdW5kYXJ5LiAgdGhpcyBpc24ndCBhdG9taWMsIHVuZm9ydHVuYXRlbHkuICA6KAogCSAqLwogbW9yZToKKwlpb19hbGlnbiA9IHBvcyAmIH5QQUdFX01BU0s7CisJYnVmX2FsaWduID0gKHVuc2lnbmVkIGxvbmcpZGF0YSAmIH5QQUdFX01BU0s7CiAJbGVuID0gbGVmdDsKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB7CiAJCS8qIHdyaXRlIGZyb20gYmVnaW5uaW5nIG9mIGZpcnN0IHBhZ2UsIHJlZ2FyZGxlc3Mgb2YKQEAgLTU5MCw2ICs1OTAsNyBAQAogCQlwb3MgKz0gbGVuOwogCQl3cml0dGVuICs9IGxlbjsKIAkJbGVmdCAtPSBsZW47CisJCWRhdGEgKz0gd3JpdHRlbjsKIAkJaWYgKGxlZnQpCiAJCQlnb3RvIG1vcmU7CiAKQEAgLTY1OCw3ICs2NTksNyBAQAogCiAJCS8qIGhpdCBFT0Ygb3IgaG9sZT8gKi8KIAkJaWYgKHN0YXRyZXQgPT0gMCAmJiAqcHBvcyA8IGlub2RlLT5pX3NpemUpIHsKLQkJCWRvdXQoImFpb19yZWFkIHN5bmNfcmVhZCBoaXQgaG9sZSwgcmVhZGluZyBtb3JlXG4iKTsKKwkJCWRvdXQoImFpb19yZWFkIHN5bmNfcmVhZCBoaXQgaG9sZSwgcHBvcyAlbGxkIDwgc2l6ZSAlbGxkLCByZWFkaW5nIG1vcmVcbiIsICpwcG9zLCBpbm9kZS0+aV9zaXplKTsKIAkJCXJlYWQgKz0gcmV0OwogCQkJYmFzZSArPSByZXQ7CiAJCQlsZW4gLT0gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9pbm9kZS5jIGIvZnMvY2VwaC9pbm9kZS5jCmluZGV4IDcwYjZhNDguLmQ4ODU4ZTkgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvaW5vZGUuYworKysgYi9mcy9jZXBoL2lub2RlLmMKQEAgLTExMDEsMTAgKzExMDEsMTAgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCQlyZXEtPnJfZGVudHJ5ID0gZG47ICAvKiBtYXkgaGF2ZSBzcGxpY2VkICovCi0JCQlpZ3JhYihpbik7CisJCQlpaG9sZChpbik7CiAJCX0gZWxzZSBpZiAoY2VwaF9pbm8oaW4pID09IHZpbm8uaW5vICYmCiAJCQkgICBjZXBoX3NuYXAoaW4pID09IHZpbm8uc25hcCkgewotCQkJaWdyYWIoaW4pOworCQkJaWhvbGQoaW4pOwogCQl9IGVsc2UgewogCQkJZG91dCgiICVwIGxpbmtzIHRvICVwICVsbHguJWxseCwgbm90ICVsbHguJWxseFxuIiwKIAkJCSAgICAgZG4sIGluLCBjZXBoX2lubyhpbiksIGNlcGhfc25hcChpbiksCkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogCQkJZ290byBkb25lOwogCQl9CiAJCXJlcS0+cl9kZW50cnkgPSBkbjsgIC8qIG1heSBoYXZlIHNwbGljZWQgKi8KLQkJaWdyYWIoaW4pOworCQlpaG9sZChpbik7CiAJCXJpbmZvLT5oZWFkLT5pc19kZW50cnkgPSAxOyAgLyogZm9vbCBub3RyYWNlIGhhbmRsZXJzICovCiAJfQogCkBAIC0xMzI4LDcgKzEzMjgsNyBAQAogCWlmIChxdWV1ZV93b3JrKGNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+d2Jfd3EsCiAJCSAgICAgICAmY2VwaF9pbm9kZShpbm9kZSktPmlfd2Jfd29yaykpIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV93cml0ZWJhY2sgJXBcbiIsIGlub2RlKTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJfSBlbHNlIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV93cml0ZWJhY2sgJXAgZmFpbGVkXG4iLCBpbm9kZSk7CiAJfQpAQCAtMTM1Myw3ICsxMzUzLDcgQEAKIAlpZiAocXVldWVfd29yayhjZXBoX2lub2RlX3RvX2NsaWVudChpbm9kZSktPnBnX2ludl93cSwKIAkJICAgICAgICZjZXBoX2lub2RlKGlub2RlKS0+aV9wZ19pbnZfd29yaykpIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV9pbnZhbGlkYXRlICVwXG4iLCBpbm9kZSk7Ci0JCWlncmFiKGlub2RlKTsKKwkJaWhvbGQoaW5vZGUpOwogCX0gZWxzZSB7CiAJCWRvdXQoImNlcGhfcXVldWVfaW52YWxpZGF0ZSAlcCBmYWlsZWRcbiIsIGlub2RlKTsKIAl9CkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogCWlmIChxdWV1ZV93b3JrKGNlcGhfc2JfdG9fY2xpZW50KGlub2RlLT5pX3NiKS0+dHJ1bmNfd3EsCiAJCSAgICAgICAmY2ktPmlfdm10cnVuY2F0ZV93b3JrKSkgewogCQlkb3V0KCJjZXBoX3F1ZXVlX3ZtdHJ1bmNhdGUgJXBcbiIsIGlub2RlKTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJfSBlbHNlIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV92bXRydW5jYXRlICVwIGZhaWxlZCwgcGVuZGluZz0lZFxuIiwKIAkJICAgICBpbm9kZSwgY2ktPmlfdHJ1bmNhdGVfcGVuZGluZyk7CkBAIC0xNzM4LDcgKzE3MzgsOCBAQAogCQlfX21hcmtfaW5vZGVfZGlydHkoaW5vZGUsIGlub2RlX2RpcnR5X2ZsYWdzKTsKIAogCWlmIChtYXNrKSB7Ci0JCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwkJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJCWlob2xkKGlub2RlKTsKIAkJcmVxLT5yX2lub2RlX2Ryb3AgPSByZWxlYXNlOwogCQlyZXEtPnJfYXJncy5zZXRhdHRyLm1hc2sgPSBjcHVfdG9fbGUzMihtYXNrKTsKIAkJcmVxLT5yX251bV9jYXBzID0gMTsKQEAgLTE3NzksNyArMTc4MCw4IEBACiAJcmVxID0gY2VwaF9tZHNjX2NyZWF0ZV9yZXF1ZXN0KG1kc2MsIENFUEhfTURTX09QX0dFVEFUVFIsIFVTRV9BTllfTURTKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfbnVtX2NhcHMgPSAxOwogCXJlcS0+cl9hcmdzLmdldGF0dHIubWFzayA9IGNwdV90b19sZTMyKG1hc2spOwogCWVyciA9IGNlcGhfbWRzY19kb19yZXF1ZXN0KG1kc2MsIE5VTEwsIHJlcSk7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2lvY3RsLmMgYi9mcy9jZXBoL2lvY3RsLmMKaW5kZXggODg4OGM5YmEuLmVmMGI1ZjQgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvaW9jdGwuYworKysgYi9mcy9jZXBoL2lvY3RsLmMKQEAgLTczLDcgKzczLDggQEAKIAkJCQkgICAgICAgVVNFX0FVVEhfTURTKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfaW5vZGVfZHJvcCA9IENFUEhfQ0FQX0ZJTEVfU0hBUkVEIHwgQ0VQSF9DQVBfRklMRV9FWENMOwogCiAJcmVxLT5yX2FyZ3Muc2V0bGF5b3V0LmxheW91dC5mbF9zdHJpcGVfdW5pdCA9CkBAIC0xMzUsNyArMTM2LDggQEAKIAogCWlmIChJU19FUlIocmVxKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVxKTsKLQlyZXEtPnJfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJaWhvbGQoaW5vZGUpOwogCiAJcmVxLT5yX2FyZ3Muc2V0bGF5b3V0LmxheW91dC5mbF9zdHJpcGVfdW5pdCA9CiAJCQljcHVfdG9fbGUzMihsLnN0cmlwZV91bml0KTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvbG9ja3MuYyBiL2ZzL2NlcGgvbG9ja3MuYwppbmRleCA0NzZiMzI5Li44MDU3NmQwIDEwMDY0NAotLS0gYS9mcy9jZXBoL2xvY2tzLmMKKysrIGIvZnMvY2VwaC9sb2Nrcy5jCkBAIC0yMyw3ICsyMyw4IEBACiAJcmVxID0gY2VwaF9tZHNjX2NyZWF0ZV9yZXF1ZXN0KG1kc2MsIG9wZXJhdGlvbiwgVVNFX0FVVEhfTURTKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAogCS8qIG1kcyByZXF1aXJlcyBzdGFydCBhbmQgbGVuZ3RoIHJhdGhlciB0aGFuIHN0YXJ0IGFuZCBlbmQgKi8KIAlpZiAoTExPTkdfTUFYID09IGZsLT5mbF9lbmQpCkBAIC0zMiwxMSArMzMsMTAgQEAKIAkJbGVuZ3RoID0gZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDE7CiAKIAlkb3V0KCJjZXBoX2xvY2tfbWVzc2FnZTogcnVsZTogJWQsIG9wOiAlZCwgcGlkOiAlbGx1LCBzdGFydDogJWxsdSwgIgotCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGVgOiAlZCIsIChpbnQpbG9ja190eXBlLAorCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGU6ICVkIiwgKGludClsb2NrX3R5cGUsCiAJICAgICAoaW50KW9wZXJhdGlvbiwgKHU2NClmbC0+ZmxfcGlkLCBmbC0+Zmxfc3RhcnQsCiAJICAgICBsZW5ndGgsIHdhaXQsIGZsLT5mbF90eXBlKTsKIAotCiAJcmVxLT5yX2FyZ3MuZmlsZWxvY2tfY2hhbmdlLnJ1bGUgPSBsb2NrX3R5cGU7CiAJcmVxLT5yX2FyZ3MuZmlsZWxvY2tfY2hhbmdlLnR5cGUgPSBjbWQ7CiAJcmVxLT5yX2FyZ3MuZmlsZWxvY2tfY2hhbmdlLnBpZCA9IGNwdV90b19sZTY0KCh1NjQpZmwtPmZsX3BpZCk7CkBAIC03MCw3ICs3MCw3IEBACiAJfQogCWNlcGhfbWRzY19wdXRfcmVxdWVzdChyZXEpOwogCWRvdXQoImNlcGhfbG9ja19tZXNzYWdlOiBydWxlOiAlZCwgb3A6ICVkLCBwaWQ6ICVsbHUsIHN0YXJ0OiAlbGx1LCAiCi0JICAgICAibGVuZ3RoOiAlbGx1LCB3YWl0OiAlZCwgdHlwZWA6ICVkLCBlcnIgY29kZSAlZCIsIChpbnQpbG9ja190eXBlLAorCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGU6ICVkLCBlcnIgY29kZSAlZCIsIChpbnQpbG9ja190eXBlLAogCSAgICAgKGludClvcGVyYXRpb24sICh1NjQpZmwtPmZsX3BpZCwgZmwtPmZsX3N0YXJ0LAogCSAgICAgbGVuZ3RoLCB3YWl0LCBmbC0+ZmxfdHlwZSwgZXJyKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTA5LDE2ICsxMDksMjAgQEAKIAkJCWRvdXQoIm1kcyBsb2NrZWQsIGxvY2tpbmcgbG9jYWxseSIpOwogCQkJZXJyID0gcG9zaXhfbG9ja19maWxlKGZpbGUsIGZsLCBOVUxMKTsKIAkJCWlmIChlcnIgJiYgKENFUEhfTURTX09QX1NFVEZJTEVMT0NLID09IG9wKSkgewotCQkJCS8qIHVuZG8hIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBrZXJuZWwgZGV0ZWN0cwotCQkJCSAqIGxvY2FsIGRlYWRsb2NrLiAqLworCQkJCS8qIHVuZG8hIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmCisJCQkJICogdGhlIGtlcm5lbCBkZXRlY3RzIGxvY2FsCisJCQkJICogZGVhZGxvY2suICovCiAJCQkJY2VwaF9sb2NrX21lc3NhZ2UoQ0VQSF9MT0NLX0ZDTlRMLCBvcCwgZmlsZSwKIAkJCQkJCSAgQ0VQSF9MT0NLX1VOTE9DSywgMCwgZmwpOwotCQkJCWRvdXQoImdvdCAlZCBvbiBwb3NpeF9sb2NrX2ZpbGUsIHVuZGlkIGxvY2siLCBlcnIpOworCQkJCWRvdXQoImdvdCAlZCBvbiBwb3NpeF9sb2NrX2ZpbGUsIHVuZGlkIGxvY2siLAorCQkJCSAgICAgZXJyKTsKIAkJCX0KIAkJfQogCi0JfSBlbHNlIHsKLQkJZG91dCgibWRzIHJldHVybmVkIGVycm9yIGNvZGUgJWQiLCBlcnIpOworCX0gZWxzZSBpZiAoZXJyID09IC1FUkVTVEFSVFNZUykgeworCQlkb3V0KCJ1bmRvaW5nIGxvY2tcbiIpOworCQljZXBoX2xvY2tfbWVzc2FnZShDRVBIX0xPQ0tfRkNOVEwsIG9wLCBmaWxlLAorCQkJCSAgQ0VQSF9MT0NLX1VOTE9DSywgMCwgZmwpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMTU1LDggKzE1OSwxMSBAQAogCQkJCQkgIGZpbGUsIENFUEhfTE9DS19VTkxPQ0ssIDAsIGZsKTsKIAkJCWRvdXQoImdvdCAlZCBvbiBmbG9ja19sb2NrX2ZpbGVfd2FpdCwgdW5kaWQgbG9jayIsIGVycik7CiAJCX0KLQl9IGVsc2UgewotCQlkb3V0KCJtZHMgZXJyb3IgY29kZSAlZCIsIGVycik7CisJfSBlbHNlIGlmIChlcnIgPT0gLUVSRVNUQVJUU1lTKSB7CisJCWRvdXQoInVuZG9pbmcgbG9ja1xuIik7CisJCWNlcGhfbG9ja19tZXNzYWdlKENFUEhfTE9DS19GTE9DSywKKwkJCQkgIENFUEhfTURTX09QX1NFVEZJTEVMT0NLLAorCQkJCSAgZmlsZSwgQ0VQSF9MT0NLX1VOTE9DSywgMCwgZmwpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9tZHNfY2xpZW50LmMgYi9mcy9jZXBoL21kc19jbGllbnQuYwppbmRleCA3OTc0M2QxLi4wYzFkOTE3IDEwMDY0NAotLS0gYS9mcy9jZXBoL21kc19jbGllbnQuYworKysgYi9mcy9jZXBoL21kc19jbGllbnQuYwpAQCAtMTQzOCwxMiArMTQzOCwxNSBAQAogCXN0cnVjdCBkZW50cnkgKnRlbXA7CiAJY2hhciAqcGF0aDsKIAlpbnQgbGVuLCBwb3M7CisJdW5zaWduZWQgc2VxOwogCiAJaWYgKGRlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogcmV0cnk6CiAJbGVuID0gMDsKKwlzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAodGVtcCA9IGRlbnRyeTsgIUlTX1JPT1QodGVtcCk7KSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB0ZW1wLT5kX2lub2RlOwogCQlpZiAoaW5vZGUgJiYgY2VwaF9zbmFwKGlub2RlKSA9PSBDRVBIX1NOQVBESVIpCkBAIC0xNDU1LDEwICsxNDU4LDEyIEBACiAJCQlsZW4gKz0gMSArIHRlbXAtPmRfbmFtZS5sZW47CiAJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKIAkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlwcl9lcnIoImJ1aWxkX3BhdGggY29ycnVwdCBkZW50cnkgJXBcbiIsIGRlbnRyeSk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAobGVuKQogCQlsZW4tLTsgIC8qIG5vIGxlYWRpbmcgJy8nICovCiAKQEAgLTE0NjcsOSArMTQ3MiwxMiBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlwb3MgPSBsZW47CiAJcGF0aFtwb3NdID0gMDsJLyogdHJhaWxpbmcgbnVsbCAqLworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKHRlbXAgPSBkZW50cnk7ICFJU19ST09UKHRlbXApICYmIHBvcyAhPSAwOyApIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IHRlbXAtPmRfaW5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKKwkJc3Bpbl9sb2NrKCZ0ZW1wLT5kX2xvY2spOworCQlpbm9kZSA9IHRlbXAtPmRfaW5vZGU7CiAJCWlmIChpbm9kZSAmJiBjZXBoX3NuYXAoaW5vZGUpID09IENFUEhfU05BUERJUikgewogCQkJZG91dCgiYnVpbGRfcGF0aCBwYXRoKyVkOiAlcCBTTkFQRElSXG4iLAogCQkJICAgICBwb3MsIHRlbXApOwpAQCAtMTQ3OCwyMSArMTQ4NiwyNiBAQAogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlwb3MgLT0gdGVtcC0+ZF9uYW1lLmxlbjsKLQkJCWlmIChwb3MgPCAwKQorCQkJaWYgKHBvcyA8IDApIHsKKwkJCQlzcGluX3VubG9jaygmdGVtcC0+ZF9sb2NrKTsKIAkJCQlicmVhazsKKwkJCX0KIAkJCXN0cm5jcHkocGF0aCArIHBvcywgdGVtcC0+ZF9uYW1lLm5hbWUsCiAJCQkJdGVtcC0+ZF9uYW1lLmxlbik7CiAJCX0KKwkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCWlmIChwb3MpCiAJCQlwYXRoWy0tcG9zXSA9ICcvJzsKIAkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OwogCQlpZiAodGVtcCA9PSBOVUxMKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXByX2VycigiYnVpbGRfcGF0aCBjb3JydXB0IGRlbnRyeVxuIik7CiAJCQlrZnJlZShwYXRoKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCQl9CiAJfQotCWlmIChwb3MgIT0gMCkgeworCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChwb3MgIT0gMCB8fCByZWFkX3NlcXJldHJ5KCZyZW5hbWVfbG9jaywgc2VxKSkgewogCQlwcl9lcnIoImJ1aWxkX3BhdGggZGlkIG5vdCBlbmQgcGF0aCBsb29rdXAgd2hlcmUgIgogCQkgICAgICAgImV4cGVjdGVkLCBuYW1lbGVuIGlzICVkLCBwb3MgaXMgJWRcbiIsIGxlbiwgcG9zKTsKIAkJLyogcHJlc3VtYWJseSB0aGlzIGlzIG9ubHkgcG9zc2libGUgaWYgcmFjaW5nIHdpdGggYQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zbmFwLmMgYi9mcy9jZXBoL3NuYXAuYwppbmRleCAyNDA2N2Q2Li41NGIxNGRlIDEwMDY0NAotLS0gYS9mcy9jZXBoL3NuYXAuYworKysgYi9mcy9jZXBoL3NuYXAuYwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJCWNpID0gbGlzdF9maXJzdF9lbnRyeSgmbWRzYy0+c25hcF9mbHVzaF9saXN0LAogCQkJCXN0cnVjdCBjZXBoX2lub2RlX2luZm8sIGlfc25hcF9mbHVzaF9pdGVtKTsKIAkJaW5vZGUgPSAmY2ktPnZmc19pbm9kZTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZtZHNjLT5zbmFwX2ZsdXNoX2xvY2spOwogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQlfX2NlcGhfZmx1c2hfc25hcHMoY2ksICZzZXNzaW9uLCAwKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgveGF0dHIuYyBiL2ZzL2NlcGgveGF0dHIuYwppbmRleCBmMmI2Mjg2Li5mNDJkNzMwIDEwMDY0NAotLS0gYS9mcy9jZXBoL3hhdHRyLmMKKysrIGIvZnMvY2VwaC94YXR0ci5jCkBAIC02NjUsNyArNjY1LDggQEAKIAkJZXJyID0gUFRSX0VSUihyZXEpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfaW5vZGVfZHJvcCA9IENFUEhfQ0FQX1hBVFRSX1NIQVJFRDsKIAlyZXEtPnJfbnVtX2NhcHMgPSAxOwogCXJlcS0+cl9hcmdzLnNldHhhdHRyLmZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwpAQCAtNzk1LDcgKzc5Niw4IEBACiAJCQkJICAgICAgIFVTRV9BVVRIX01EUyk7CiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwotCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwlpaG9sZChpbm9kZSk7CiAJcmVxLT5yX2lub2RlX2Ryb3AgPSBDRVBIX0NBUF9YQVRUUl9TSEFSRUQ7CiAJcmVxLT5yX251bV9jYXBzID0gMTsKIAlyZXEtPnJfcGF0aDIgPSBrc3RyZHVwKG5hbWUsIEdGUF9OT0ZTKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvS2NvbmZpZyBiL2ZzL2NpZnMvS2NvbmZpZwppbmRleCAxY2Q0YzNhLi5mNjZjYzE2IDEwMDY0NAotLS0gYS9mcy9jaWZzL0tjb25maWcKKysrIGIvZnMvY2lmcy9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCXNlbGVjdCBDUllQVE9fTUQ1CiAJc2VsZWN0IENSWVBUT19ITUFDCiAJc2VsZWN0IENSWVBUT19BUkM0CisJc2VsZWN0IENSWVBUT19FQ0IKIAlzZWxlY3QgQ1JZUFRPX0RFUwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGNsaWVudCBWRlMgbW9kdWxlIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtCkBAIC0xNDgsMTMgKzE0OSwxMyBAQAogCiBjb25maWcgQ0lGU19BQ0wKIAkgIGJvb2wgIlByb3ZpZGUgQ0lGUyBBQ0wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQkgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIENJRlNfWEFUVFIKKwkgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIENJRlNfWEFUVFIgJiYgS0VZUwogCSAgaGVscAogCSAgICBBbGxvd3MgdG8gZmV0Y2ggQ0lGUy9OVEZTIEFDTCBmcm9tIHRoZSBzZXJ2ZXIuICBUaGUgREFDTCBibG9iCiAJICAgIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBhcHBsaWNhdGlvbi9jYWxsZXIuCiAKIGNvbmZpZyBDSUZTX05GU0RfRVhQT1JUCiAJICBib29sICJBbGxvdyBuZnNkIHRvIGV4cG9ydCBDSUZTIGZpbGUgc3lzdGVtIChFWFBFUklNRU5UQUwpIgotCSAgZGVwZW5kcyBvbiBDSUZTICYmIEVYUEVSSU1FTlRBTAorCSAgZGVwZW5kcyBvbiBDSUZTICYmIEVYUEVSSU1FTlRBTCAmJiBCUk9LRU4KIAkgIGhlbHAKIAkgICBBbGxvd3MgTkZTIHNlcnZlciB0byBleHBvcnQgYSBDSUZTIG1vdW50ZWQgc2hhcmUgKG5mc2Qgb3ZlciBjaWZzKQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jYWNoZS5jIGIvZnMvY2lmcy9jYWNoZS5jCmluZGV4IGRkODU4NGQuLjU0NTUwOWMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2FjaGUuYworKysgYi9mcy9jaWZzL2NhY2hlLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQljRVJST1IoMSwgIkNJRlM6IFVua25vd24gbmV0d29yayBmYW1pbHkgJyVkJyIsIHNhLT5zYV9mYW1pbHkpOworCQljRVJST1IoMSwgIlVua25vd24gbmV0d29yayBmYW1pbHkgJyVkJyIsIHNhLT5zYV9mYW1pbHkpOwogCQlrZXlfbGVuID0gMDsKIAkJYnJlYWs7CiAJfQpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIAlzaGFyZW5hbWUgPSBleHRyYWN0X3NoYXJlbmFtZSh0Y29uLT50cmVlTmFtZSk7CiAJaWYgKElTX0VSUihzaGFyZW5hbWUpKSB7Ci0JCWNGWUkoMSwgIkNJRlM6IGNvdWxkbid0IGV4dHJhY3Qgc2hhcmVuYW1lXG4iKTsKKwkJY0ZZSSgxLCAiJXM6IGNvdWxkbid0IGV4dHJhY3Qgc2hhcmVuYW1lXG4iLCBfX2Z1bmNfXyk7CiAJCXNoYXJlbmFtZSA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KQEAgLTMwMiw3ICszMDIsNyBAQAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJZmlyc3QgPSAwOwogCi0JY0ZZSSgxLCAiY2lmcyBpbm9kZSAweCVwIG5vdyB1bmNhY2hlZCIsIGNpZnNpKTsKKwljRllJKDEsICIlczogY2lmcyBpbm9kZSAweCVwIG5vdyB1bmNhY2hlZCIsIF9fZnVuY19fLCBjaWZzaSk7CiAKIAlmb3IgKDs7KSB7CiAJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXAoJnB2ZWMsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNfZnNfc2IuaCBiL2ZzL2NpZnMvY2lmc19mc19zYi5oCmluZGV4IGZmYjE0NTkuLjcyNjBlMTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc19mc19zYi5oCisrKyBiL2ZzL2NpZnMvY2lmc19mc19zYi5oCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIENJRlNfTU9VTlRfTVVMVElVU0VSCTB4MjAwMDAgLyogbXVsdGl1c2VyIG1vdW50ICovCiAjZGVmaW5lIENJRlNfTU9VTlRfU1RSSUNUX0lPCTB4NDAwMDAgLyogc3RyaWN0IGNhY2hlIG1vZGUgKi8KICNkZWZpbmUgQ0lGU19NT1VOVF9SV1BJREZPUldBUkQJMHg4MDAwMCAvKiB1c2UgcGlkIGZvcndhcmRpbmcgZm9yIHJ3ICovCisjZGVmaW5lIENJRlNfTU9VTlRfUE9TSVhBQ0wJMHgxMDAwMDAgLyogbWlycm9yIG9mIE1TX1BPU0lYQUNMIGluIG1udF9jaWZzX2ZsYWdzICovCiAKIHN0cnVjdCBjaWZzX3NiX2luZm8gewogCXN0cnVjdCByYl9yb290IHRsaW5rX3RyZWU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMgYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKaW5kZXggZGZiZDlmMS4uNWEwZWU3ZiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJaWYgKGNpZnNfcGR1ID09IE5VTEwgfHwgc2VydmVyID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNpZnNfcGR1LT5Db21tYW5kID09IFNNQl9DT01fTkVHT1RJQVRFKQorCWlmICghc2VydmVyLT5zZXNzaW9uX2VzdGFiKQogCQlyZXR1cm4gMDsKIAogCWlmIChjaWZzX3BkdS0+Q29tbWFuZCA9PSBTTUJfQ09NX0xPQ0tJTkdfQU5EWCkgewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggOTg5NDQyZC4uM2UyOTg5OSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0xMDQsOCArMTA0LDcgQEAKIH0KIAogc3RhdGljIGludAotY2lmc19yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbywKLQkJY29uc3QgY2hhciAqZGV2bmFtZSwgaW50IHNpbGVudCkKK2NpZnNfcmVhZF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKQEAgLTExMywyMiArMTEyLDE2IEBACiAKIAljaWZzX3NiID0gQ0lGU19TQihzYik7CiAKLQlzcGluX2xvY2tfaW5pdCgmY2lmc19zYi0+dGxpbmtfdHJlZV9sb2NrKTsKLQljaWZzX3NiLT50bGlua190cmVlID0gUkJfUk9PVDsKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1BPU0lYQUNMKQorCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotCXJjID0gYmRpX3NldHVwX2FuZF9yZWdpc3RlcigmY2lmc19zYi0+YmRpLCAiY2lmcyIsIEJESV9DQVBfTUFQX0NPUFkpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOworCWlmIChjaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9GSUxFUykKKwkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCWVsc2UKKwkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTk9OX0xGUzsKIAotCWNpZnNfc2ItPmJkaS5yYV9wYWdlcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKLQotCXJjID0gY2lmc19tb3VudChzYiwgY2lmc19zYiwgdm9sdW1lX2luZm8sIGRldm5hbWUpOwotCi0JaWYgKHJjKSB7Ci0JCWlmICghc2lsZW50KQotCQkJY0VSUk9SKDEsICJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWQiLCByYyk7Ci0JCWdvdG8gb3V0X21vdW50X2ZhaWxlZDsKLQl9CisJLyogQkIgRklYTUUgZml4IHRpbWVfZ3JhbiB0byBiZSBsYXJnZXIgZm9yIExBTk1BTiBzZXNzaW9ucyAqLworCXNiLT5zX3RpbWVfZ3JhbiA9IDEwMDsKIAogCXNiLT5zX21hZ2ljID0gQ0lGU19NQUdJQ19OVU1CRVI7CiAJc2ItPnNfb3AgPSAmY2lmc19zdXBlcl9vcHM7CkBAIC0xNzAsMzcgKzE2MywxNCBAQAogCWlmIChpbm9kZSkKIAkJaXB1dChpbm9kZSk7CiAKLQljaWZzX3Vtb3VudChzYiwgY2lmc19zYik7Ci0KLW91dF9tb3VudF9mYWlsZWQ6Ci0JYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZAotY2lmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIGNpZnNfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKLQotCWNGWUkoMSwgIkluIGNpZnNfcHV0X3N1cGVyIik7Ci0JY2lmc19zYiA9IENJRlNfU0Ioc2IpOwotCWlmIChjaWZzX3NiID09IE5VTEwpIHsKLQkJY0ZZSSgxLCAiRW1wdHkgY2lmcyBzdXBlcmJsb2NrIGluZm8gcGFzc2VkIHRvIHVubW91bnQiKTsKLQkJcmV0dXJuOwotCX0KLQotCXJjID0gY2lmc191bW91bnQoc2IsIGNpZnNfc2IpOwotCWlmIChyYykKLQkJY0VSUk9SKDEsICJjaWZzX3Vtb3VudCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAlZCIsIHJjKTsKLQlpZiAoY2lmc19zYi0+bW91bnRkYXRhKSB7Ci0JCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7Ci0JCWNpZnNfc2ItPm1vdW50ZGF0YSA9IE5VTEw7Ci0JfQotCi0JdW5sb2FkX25scyhjaWZzX3NiLT5sb2NhbF9ubHMpOwotCWJkaV9kZXN0cm95KCZjaWZzX3NiLT5iZGkpOwotCWtmcmVlKGNpZnNfc2IpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlraWxsX2Fub25fc3VwZXIoc2IpOworCWNpZnNfdW1vdW50KGNpZnNfc2IpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yNTcsOSArMjI3LDYgQEAKIHsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCiAJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19QRVJNKSB7CkBAIC0zNTIsNiArMzE5LDM3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorY2lmc19zaG93X3NlY3VyaXR5KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCXNlcV9wcmludGYocywgIixzZWM9Iik7CisKKwlzd2l0Y2ggKHNlcnZlci0+c2VjVHlwZSkgeworCWNhc2UgTEFOTUFOOgorCQlzZXFfcHJpbnRmKHMsICJsYW5tYW4iKTsKKwkJYnJlYWs7CisJY2FzZSBOVExNdjI6CisJCXNlcV9wcmludGYocywgIm50bG12MiIpOworCQlicmVhazsKKwljYXNlIE5UTE06CisJCXNlcV9wcmludGYocywgIm50bG0iKTsKKwkJYnJlYWs7CisJY2FzZSBLZXJiZXJvczoKKwkJc2VxX3ByaW50ZihzLCAia3JiNSIpOworCQlicmVhazsKKwljYXNlIFJhd05UTE1TU1A6CisJCXNlcV9wcmludGYocywgIm50bG1zc3AiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogc2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisJCXNlcV9wcmludGYocywgInVua25vd24iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNlcnZlci0+c2VjX21vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQlzZXFfcHJpbnRmKHMsICJpIik7Cit9CisKIC8qCiAgKiBjaWZzX3Nob3dfb3B0aW9ucygpIGlzIGZvciBkaXNwbGF5aW5nIG1vdW50IG9wdGlvbnMgaW4gL3Byb2MvbW91bnRzLgogICogTm90IGFsbCBzZXR0YWJsZSBvcHRpb25zIGFyZSBkaXNwbGF5ZWQgYnV0IG1vc3Qgb2YgdGhlIGltcG9ydGFudApAQCAtMzY1LDYgKzM2Myw4IEBACiAJc3RydWN0IHNvY2thZGRyICpzcmNhZGRyOwogCXNyY2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnRjb24tPnNlcy0+c2VydmVyLT5zcmNhZGRyOwogCisJY2lmc19zaG93X3NlY3VyaXR5KHMsIHRjb24tPnNlcy0+c2VydmVyKTsKKwogCXNlcV9wcmludGYocywgIix1bmM9JXMiLCB0Y29uLT50cmVlTmFtZSk7CiAKIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01VTFRJVVNFUikKQEAgLTUxOCw3ICs1MTgsNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHMgPSB7Ci0JLnB1dF9zdXBlciA9IGNpZnNfcHV0X3N1cGVyLAogCS5zdGF0ZnMgPSBjaWZzX3N0YXRmcywKIAkuYWxsb2NfaW5vZGUgPSBjaWZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlID0gY2lmc19kZXN0cm95X2lub2RlLApAQCAtNTU1LDcgKzU1NCw3IEBACiAJZnVsbF9wYXRoID0gY2lmc19idWlsZF9wYXRoX3RvX3Jvb3Qodm9sLCBjaWZzX3NiLAogCQkJCQkgICAgY2lmc19zYl9tYXN0ZXJfdGNvbihjaWZzX3NiKSk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAljRllJKDEsICJHZXQgcm9vdCBkZW50cnkgZm9yICVzIiwgZnVsbF9wYXRoKTsKIApAQCAtNTg0LDcgKzU4Myw3IEBACiAJCQlkY2hpbGQgPSBkX2FsbG9jKGRwYXJlbnQsICZuYW1lKTsKIAkJCWlmIChkY2hpbGQgPT0gTlVMTCkgewogCQkJCWRwdXQoZHBhcmVudCk7Ci0JCQkJZHBhcmVudCA9IE5VTEw7CisJCQkJZHBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTYwMiw3ICs2MDEsNyBAQAogCQkJaWYgKHJjKSB7CiAJCQkJZHB1dChkY2hpbGQpOwogCQkJCWRwdXQoZHBhcmVudCk7Ci0JCQkJZHBhcmVudCA9IE5VTEw7CisJCQkJZHBhcmVudCA9IEVSUl9QVFIocmMpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJYWxpYXMgPSBkX21hdGVyaWFsaXNlX3VuaXF1ZShkY2hpbGQsIGlub2RlKTsKQEAgLTYxMCw3ICs2MDksNyBAQAogCQkJCWRwdXQoZGNoaWxkKTsKIAkJCQlpZiAoSVNfRVJSKGFsaWFzKSkgewogCQkJCQlkcHV0KGRwYXJlbnQpOwotCQkJCQlkcGFyZW50ID0gTlVMTDsKKwkJCQkJZHBhcmVudCA9IEVSUl9QVFIoLUVJTlZBTCk7IC8qIFhYWCAqLwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJZGNoaWxkID0gYWxpYXM7CkBAIC02MzAsNiArNjI5LDEzIEBACiAJcmV0dXJuIGRwYXJlbnQ7CiB9CiAKK3N0YXRpYyBpbnQgY2lmc19zZXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2lmc19tbnRfZGF0YSAqbW50X2RhdGEgPSBkYXRhOworCXNiLT5zX2ZzX2luZm8gPSBtbnRfZGF0YS0+Y2lmc19zYjsKKwlyZXR1cm4gc2V0X2Fub25fc3VwZXIoc2IsIE5VTEwpOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqCiBjaWZzX2RvX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCkBAIC02NDMsODIgKzY0OSw4MCBAQAogCiAJY0ZZSSgxLCAiRGV2bmFtZTogJXMgZmxhZ3M6ICVkICIsIGRldl9uYW1lLCBmbGFncyk7CiAKLQlyYyA9IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8oJnZvbHVtZV9pbmZvLCAoY2hhciAqKWRhdGEsIGRldl9uYW1lKTsKLQlpZiAocmMpCi0JCXJldHVybiBFUlJfUFRSKHJjKTsKKwl2b2x1bWVfaW5mbyA9IGNpZnNfZ2V0X3ZvbHVtZV9pbmZvKChjaGFyICopZGF0YSwgZGV2X25hbWUpOworCWlmIChJU19FUlIodm9sdW1lX2luZm8pKQorCQlyZXR1cm4gRVJSX0NBU1Qodm9sdW1lX2luZm8pOwogCiAJY2lmc19zYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaWZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2lmc19zYiA9PSBOVUxMKSB7CiAJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfbmxzOworCX0KKworCWNpZnNfc2ItPm1vdW50ZGF0YSA9IGtzdHJuZHVwKGRhdGEsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNpZnNfc2ItPm1vdW50ZGF0YSA9PSBOVUxMKSB7CisJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dF9jaWZzX3NiOwogCX0KIAogCWNpZnNfc2V0dXBfY2lmc19zYih2b2x1bWVfaW5mbywgY2lmc19zYik7CiAKKwlyYyA9IGNpZnNfbW91bnQoY2lmc19zYiwgdm9sdW1lX2luZm8pOworCWlmIChyYykgeworCQlpZiAoIShmbGFncyAmIE1TX1NJTEVOVCkpCisJCQljRVJST1IoMSwgImNpZnNfbW91bnQgZmFpbGVkIHcvcmV0dXJuIGNvZGUgPSAlZCIsIHJjKTsKKwkJcm9vdCA9IEVSUl9QVFIocmMpOworCQlnb3RvIG91dF9tb3VudGRhdGE7CisJfQorCiAJbW50X2RhdGEudm9sID0gdm9sdW1lX2luZm87CiAJbW50X2RhdGEuY2lmc19zYiA9IGNpZnNfc2I7CiAJbW50X2RhdGEuZmxhZ3MgPSBmbGFnczsKIAotCXNiID0gc2dldChmc190eXBlLCBjaWZzX21hdGNoX3N1cGVyLCBzZXRfYW5vbl9zdXBlciwgJm1udF9kYXRhKTsKKwlzYiA9IHNnZXQoZnNfdHlwZSwgY2lmc19tYXRjaF9zdXBlciwgY2lmc19zZXRfc3VwZXIsICZtbnRfZGF0YSk7CiAJaWYgKElTX0VSUihzYikpIHsKIAkJcm9vdCA9IEVSUl9DQVNUKHNiKTsKLQkJZ290byBvdXRfY2lmc19zYjsKKwkJY2lmc191bW91bnQoY2lmc19zYik7CisJCWdvdG8gb3V0OwogCX0KIAotCWlmIChzYi0+c19mc19pbmZvKSB7CisJaWYgKHNiLT5zX3Jvb3QpIHsKIAkJY0ZZSSgxLCAiVXNlIGV4aXN0aW5nIHN1cGVyYmxvY2siKTsKLQkJZ290byBvdXRfc2hhcmVkOworCQljaWZzX3Vtb3VudChjaWZzX3NiKTsKKwl9IGVsc2UgeworCQlzYi0+c19mbGFncyA9IGZsYWdzOworCQkvKiBCQiBzaG91bGQgd2UgbWFrZSB0aGlzIGNvbnRpbmdlbnQgb24gbW91bnQgcGFybT8gKi8KKwkJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRSB8IE1TX05PQVRJTUU7CisKKwkJcmMgPSBjaWZzX3JlYWRfc3VwZXIoc2IpOworCQlpZiAocmMpIHsKKwkJCXJvb3QgPSBFUlJfUFRSKHJjKTsKKwkJCWdvdG8gb3V0X3N1cGVyOworCQl9CisKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwogCX0KIAotCS8qCi0JICogQ29weSBtb3VudCBwYXJhbXMgZm9yIHVzZSBpbiBzdWJtb3VudHMuIEJldHRlciB0byBkbwotCSAqIHRoZSBjb3B5IGhlcmUgYW5kIGRlYWwgd2l0aCB0aGUgZXJyb3IgYmVmb3JlIGNsZWFudXAgZ2V0cwotCSAqIGNvbXBsaWNhdGVkIHBvc3QtbW91bnQuCi0JICovCi0JY2lmc19zYi0+bW91bnRkYXRhID0ga3N0cm5kdXAoZGF0YSwgUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2lmc19zYi0+bW91bnRkYXRhID09IE5VTEwpIHsKLQkJcm9vdCA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCWdvdG8gb3V0X3N1cGVyOwotCX0KLQotCXNiLT5zX2ZsYWdzID0gZmxhZ3M7Ci0JLyogQkIgc2hvdWxkIHdlIG1ha2UgdGhpcyBjb250aW5nZW50IG9uIG1vdW50IHBhcm0/ICovCi0Jc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRSB8IE1TX05PQVRJTUU7Ci0Jc2ItPnNfZnNfaW5mbyA9IGNpZnNfc2I7Ci0KLQlyYyA9IGNpZnNfcmVhZF9zdXBlcihzYiwgdm9sdW1lX2luZm8sIGRldl9uYW1lLAotCQkJICAgICBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQlpZiAocmMpIHsKLQkJcm9vdCA9IEVSUl9QVFIocmMpOwotCQlnb3RvIG91dF9zdXBlcjsKLQl9Ci0KLQlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0KIAlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwotCWlmIChyb290ID09IE5VTEwpCisJaWYgKElTX0VSUihyb290KSkKIAkJZ290byBvdXRfc3VwZXI7CiAKIAljRllJKDEsICJkZW50cnkgcm9vdCBpczogJXAiLCByb290KTsKIAlnb3RvIG91dDsKIAotb3V0X3NoYXJlZDoKLQlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwotCWlmIChyb290KQotCQljRllJKDEsICJkZW50cnkgcm9vdCBpczogJXAiLCByb290KTsKLQlnb3RvIG91dDsKLQogb3V0X3N1cGVyOgotCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7CiAJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIoc2IpOwotCi1vdXRfY2lmc19zYjoKLQl1bmxvYWRfbmxzKGNpZnNfc2ItPmxvY2FsX25scyk7Ci0Ja2ZyZWUoY2lmc19zYik7Ci0KIG91dDoKLQljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8oJnZvbHVtZV9pbmZvKTsKKwljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8pOwogCXJldHVybiByb290OworCitvdXRfbW91bnRkYXRhOgorCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7CitvdXRfY2lmc19zYjoKKwlrZnJlZShjaWZzX3NiKTsKK291dF9ubHM6CisJdW5sb2FkX25scyh2b2x1bWVfaW5mby0+bG9jYWxfbmxzKTsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIHNzaXplX3QgY2lmc19maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LApAQCAtODA3LDcgKzgxMSw3IEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgPSAiY2lmcyIsCiAJLm1vdW50ID0gY2lmc19kb19tb3VudCwKLQkua2lsbF9zYiA9IGtpbGxfYW5vbl9zdXBlciwKKwkua2lsbF9zYiA9IGNpZnNfa2lsbF9zYiwKIAkvKiAgLmZzX2ZsYWdzICovCiB9OwogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY2lmc19kaXJfaW5vZGVfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuaCBiL2ZzL2NpZnMvY2lmc2ZzLmgKaW5kZXggNjQzMTNmNy4uMDM2Y2E4MyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuaAorKysgYi9mcy9jaWZzL2NpZnNmcy5oCkBAIC0xMjksNSArMTI5LDUgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgY2lmc19leHBvcnRfb3BzOwogI2VuZGlmIC8qIENJRlNfTkZTRF9FWFBPUlQgKi8KIAotI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS43MiIKKyNkZWZpbmUgQ0lGU19WRVJTSU9OICAgIjEuNzQiCiAjZW5kaWYJCQkJLyogX0NJRlNGU19IICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNwcm90by5oIGIvZnMvY2lmcy9jaWZzcHJvdG8uaAppbmRleCA5NTNmODQ0Li44ZGYyOGU5IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwcm90by5oCisrKyBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKQEAgLTE1NCwxMiArMTU0LDExIEBACiBleHRlcm4gdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKIAkJCSAgICAgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKTsKIGV4dGVybiBpbnQgY2lmc19tYXRjaF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGNpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqKnB2b2x1bWVfaW5mbyk7Ci1leHRlcm4gaW50IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKipwdm9sdW1lX2luZm8sCi0JCQkJICBjaGFyICptb3VudF9kYXRhLCBjb25zdCBjaGFyICpkZXZuYW1lKTsKLWV4dGVybiBpbnQgY2lmc19tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGNpZnNfc2JfaW5mbyAqLAotCQkgICAgICBzdHJ1Y3Qgc21iX3ZvbCAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBjaWZzX3Vtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGNpZnNfc2JfaW5mbyAqKTsKK2V4dGVybiB2b2lkIGNpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqcHZvbHVtZV9pbmZvKTsKK2V4dGVybiBzdHJ1Y3Qgc21iX3ZvbCAqY2lmc19nZXRfdm9sdW1lX2luZm8oY2hhciAqbW91bnRfZGF0YSwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmRldm5hbWUpOworZXh0ZXJuIGludCBjaWZzX21vdW50KHN0cnVjdCBjaWZzX3NiX2luZm8gKiwgc3RydWN0IHNtYl92b2wgKik7CitleHRlcm4gdm9pZCBjaWZzX3Vtb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICopOwogZXh0ZXJuIHZvaWQgY2lmc19kZnNfcmVsZWFzZV9hdXRvbW91bnRfdGltZXIodm9pZCk7CiB2b2lkIGNpZnNfcHJvY19pbml0KHZvaWQpOwogdm9pZCBjaWZzX3Byb2NfY2xlYW4odm9pZCk7CkBAIC0yMTgsNyArMjE3LDggQEAKIAkJCXN0cnVjdCBkZnNfaW5mbzNfcGFyYW0gKipwcmVmZXJyYWxzLAogCQkJaW50IHJlbWFwKTsKIGV4dGVybiB2b2lkIHJlc2V0X2NpZnNfdW5peF9jYXBzKGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2wpOworCQkJCSBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQkJCSBzdHJ1Y3Qgc21iX3ZvbCAqdm9sKTsKIGV4dGVybiBpbnQgQ0lGU1NNQlFGU0luZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJCXN0cnVjdCBrc3RhdGZzICpGU0RhdGEpOwogZXh0ZXJuIGludCBTTUJPbGRRRlNJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDZkODhiODIuLmNjYzFhZmEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC02NSw2ICs2NSw4IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwogc3RhdGljIHZvaWQgdGxpbmtfcmJfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgdGNvbl9saW5rICpuZXdfdGxpbmspOwogc3RhdGljIHZvaWQgY2lmc19wcnVuZV90bGlua3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBpbnQgY2lmc19zZXR1cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8sIGNoYXIgKm1vdW50X2RhdGEsCisJCQkJCWNvbnN0IGNoYXIgKmRldm5hbWUpOwogCiAvKgogICogY2lmcyB0Y3Agc2Vzc2lvbiByZWNvbm5lY3Rpb24KQEAgLTE1Miw3ICsxNTQsNyBAQAogCQltaWRfZW50cnktPmNhbGxiYWNrKG1pZF9lbnRyeSk7CiAJfQogCi0Jd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJZG8gewogCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJLyogd2Ugc2hvdWxkIHRyeSBvbmx5IHRoZSBwb3J0IHdlIGNvbm5lY3RlZCB0byBiZWZvcmUgKi8KQEAgLTE2Nyw3ICsxNjksNyBAQAogCQkJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc05lZWROZWdvdGlhdGU7CiAJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCQl9Ci0JfQorCX0gd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KTsKIAogCXJldHVybiByYzsKIH0KQEAgLTc4NCw3ICs3ODYsNyBAQAogCQkJIHN0cnVjdCBzbWJfdm9sICp2b2wpCiB7CiAJY2hhciAqdmFsdWUsICpkYXRhLCAqZW5kOwotCWNoYXIgKm1vdW50ZGF0YV9jb3B5LCAqb3B0aW9uczsKKwljaGFyICptb3VudGRhdGFfY29weSA9IE5VTEwsICpvcHRpb25zOwogCXVuc2lnbmVkIGludCAgdGVtcF9sZW4sIGksIGo7CiAJY2hhciBzZXBhcmF0b3JbMl07CiAJc2hvcnQgaW50IG92ZXJyaWRlX3VpZCA9IC0xOwpAQCAtMTM5MSw3ICsxMzkzLDcgQEAKIAkJCQkiL3Byb2MvZnMvY2lmcy9Mb29rdXBDYWNoZUVuYWJsZWQgdG8gMFxuIik7CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImZzYyIsIDMpID09IDApIHsKICNpZm5kZWYgQ09ORklHX0NJRlNfRlNDQUNIRQotCQkJY0VSUk9SKDEsICJGUy1DYWNoZSBzdXBwb3J0IG5lZWRzIENPTkZJR19DSUZTX0ZTQ0FDSEUiCisJCQljRVJST1IoMSwgIkZTLUNhY2hlIHN1cHBvcnQgbmVlZHMgQ09ORklHX0NJRlNfRlNDQUNIRSAiCiAJCQkJICAia2VybmVsIGNvbmZpZyBvcHRpb24gc2V0Iik7CiAJCQlnb3RvIGNpZnNfcGFyc2VfbW91bnRfZXJyOwogI2VuZGlmCkBAIC0xOTc2LDcgKzE5NzgsNyBAQAogCQl3YXJuZWRfb25fbnRsbSA9IHRydWU7CiAJCWNFUlJPUigxLCAiZGVmYXVsdCBzZWN1cml0eSBtZWNoYW5pc20gcmVxdWVzdGVkLiAgVGhlIGRlZmF1bHQgIgogCQkJInNlY3VyaXR5IG1lY2hhbmlzbSB3aWxsIGJlIHVwZ3JhZGVkIGZyb20gbnRsbSB0byAiCi0JCQkibnRsbXYyIGluIGtlcm5lbCByZWxlYXNlIDIuNi40MSIpOworCQkJIm50bG12MiBpbiBrZXJuZWwgcmVsZWFzZSAzLjEiKTsKIAl9CiAJc2VzLT5vdmVycmlkZVNlY0ZsZyA9IHZvbHVtZV9pbmZvLT5zZWNGbGc7CiAKQEAgLTIxNDksNyArMjE1MSwxMCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y29uX2xpbmsgKgotY2lmc19zYl9tYXN0ZXJfdGxpbmsoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYik7CitjaWZzX3NiX21hc3Rlcl90bGluayhzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQoreworCXJldHVybiBjaWZzX3NiLT5tYXN0ZXJfdGxpbms7Cit9CiAKIHN0YXRpYyBpbnQKIGNvbXBhcmVfbW91bnRfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY2lmc19tbnRfZGF0YSAqbW50X2RhdGEpCkBAIC0yMjM3LDggKzIyNDIsOCBAQAogCiAJcmMgPSBjb21wYXJlX21vdW50X29wdGlvbnMoc2IsIG1udF9kYXRhKTsKIG91dDoKLQljaWZzX3B1dF90bGluayh0bGluayk7CiAJc3Bpbl91bmxvY2soJmNpZnNfdGNwX3Nlc19sb2NrKTsKKwljaWZzX3B1dF90bGluayh0bGluayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNDcxLDE0ICsyNDc2LDYgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwgc2FkZHIsIHNsZW4sIDApOwotCWlmIChyYyA8IDApIHsKLQkJY0ZZSSgxLCAiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIiLCByYyk7Ci0JCXNvY2tfcmVsZWFzZShzb2NrZXQpOwotCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwotCQlyZXR1cm4gcmM7Ci0JfQotCiAJLyoKIAkgKiBFdmVudHVhbGx5IGNoZWNrIGZvciBvdGhlciBzb2NrZXQgb3B0aW9ucyB0byBjaGFuZ2UgZnJvbQogCSAqIHRoZSBkZWZhdWx0LiBzb2NrX3NldHNvY2tvcHQgbm90IHVzZWQgYmVjYXVzZSBpdCBleHBlY3RzCkBAIC0yNTA3LDYgKzI1MDQsMTQgQEAKIAkJIHNvY2tldC0+c2stPnNrX3NuZGJ1ZiwKIAkJIHNvY2tldC0+c2stPnNrX3JjdmJ1Ziwgc29ja2V0LT5zay0+c2tfcmN2dGltZW8pOwogCisJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIHNhZGRyLCBzbGVuLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWNGWUkoMSwgIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc2VydmVyIiwgcmMpOworCQlzb2NrX3JlbGVhc2Uoc29ja2V0KTsKKwkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKKwkJcmV0dXJuIHJjOworCX0KKwogCWlmIChzcG9ydCA9PSBodG9ucyhSRkMxMDAxX1BPUlQpKQogCQlyYyA9IGlwX3JmYzEwMDFfY29ubmVjdChzZXJ2ZXIpOwogCkBAIC0yNTQzLDcgKzI1NDgsNyBAQAogfQogCiB2b2lkIHJlc2V0X2NpZnNfdW5peF9jYXBzKGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2xfaW5mbykKKwkJCSAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IHNtYl92b2wgKnZvbF9pbmZvKQogewogCS8qIGlmIHdlIGFyZSByZWNvbm5lY3RpbmcgdGhlbiBzaG91bGQgd2UgY2hlY2sgdG8gc2VlIGlmCiAJICogYW55IHJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgY2hhbmdlZCBsb2NhbGx5IGUuZy4gdmlhCkBAIC0yNTk3LDIyICsyNjAyLDIzIEBACiAJCQljYXAgJj0gfkNJRlNfVU5JWF9QT1NJWF9BQ0xfQ0FQOwogCQllbHNlIGlmIChDSUZTX1VOSVhfUE9TSVhfQUNMX0NBUCAmIGNhcCkgewogCQkJY0ZZSSgxLCAibmVnb3RpYXRlZCBwb3NpeCBhY2wgc3VwcG9ydCIpOwotCQkJaWYgKHNiKQotCQkJCXNiLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMOworCQkJaWYgKGNpZnNfc2IpCisJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0KKwkJCQkJQ0lGU19NT1VOVF9QT1NJWEFDTDsKIAkJfQogCiAJCWlmICh2b2xfaW5mbyAmJiB2b2xfaW5mby0+cG9zaXhfcGF0aHMgPT0gMCkKIAkJCWNhcCAmPSB+Q0lGU19VTklYX1BPU0lYX1BBVEhOQU1FU19DQVA7CiAJCWVsc2UgaWYgKGNhcCAmIENJRlNfVU5JWF9QT1NJWF9QQVRITkFNRVNfQ0FQKSB7CiAJCQljRllJKDEsICJuZWdvdGlhdGUgcG9zaXggcGF0aG5hbWVzIik7Ci0JCQlpZiAoc2IpCi0JCQkJQ0lGU19TQihzYiktPm1udF9jaWZzX2ZsYWdzIHw9CisJCQlpZiAoY2lmc19zYikKKwkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PQogCQkJCQlDSUZTX01PVU5UX1BPU0lYX1BBVEhTOwogCQl9CiAKLQkJaWYgKHNiICYmIChDSUZTX1NCKHNiKS0+cnNpemUgPiAxMjcgKiAxMDI0KSkgeworCQlpZiAoY2lmc19zYiAmJiAoY2lmc19zYi0+cnNpemUgPiAxMjcgKiAxMDI0KSkgewogCQkJaWYgKChjYXAgJiBDSUZTX1VOSVhfTEFSR0VfUkVBRF9DQVApID09IDApIHsKLQkJCQlDSUZTX1NCKHNiKS0+cnNpemUgPSAxMjcgKiAxMDI0OworCQkJCWNpZnNfc2ItPnJzaXplID0gMTI3ICogMTAyNDsKIAkJCQljRllJKERCRzIsICJsYXJnZXIgcmVhZHMgbm90IHN1cHBvcnRlZCBieSBzcnYiKTsKIAkJCX0KIAkJfQpAQCAtMjY1OSw2ICsyNjY1LDkgQEAKIHsKIAlJTklUX0RFTEFZRURfV09SSygmY2lmc19zYi0+cHJ1bmVfdGxpbmtzLCBjaWZzX3BydW5lX3RsaW5rcyk7CiAKKwlzcGluX2xvY2tfaW5pdCgmY2lmc19zYi0+dGxpbmtfdHJlZV9sb2NrKTsKKwljaWZzX3NiLT50bGlua190cmVlID0gUkJfUk9PVDsKKwogCWlmIChwdm9sdW1lX2luZm8tPnJzaXplID4gQ0lGU01heEJ1ZlNpemUpIHsKIAkJY0VSUk9SKDEsICJyc2l6ZSAlZCB0b28gbGFyZ2UsIHVzaW5nIE1heEJ1ZlNpemUiLAogCQkJcHZvbHVtZV9pbmZvLT5yc2l6ZSk7CkBAIC0yNzQ3LDIxICsyNzU2LDIxIEBACiAKIC8qCiAgKiBXaGVuIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdmVyeSBsYXJnZSB3cml0ZXMgdmlhIFBPU0lYIGV4dGVuc2lvbnMsIHdlIGNhbgotICogYWxsb3cgdXAgdG8gMl4yNCAtIFBBR0VfQ0FDSEVfU0laRS4KKyAqIGFsbG93IHVwIHRvIDJeMjQtMSwgbWludXMgdGhlIHNpemUgb2YgYSBXUklURV9BTkRfWCBoZWFkZXIsIG5vdCBpbmNsdWRpbmcKKyAqIHRoZSBSRkMxMDAxIGxlbmd0aC4KICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBtaWdodCBtYWtlIGZvciAiaW50ZXJlc3RpbmciIGFsbG9jYXRpb24gcHJvYmxlbXMgZHVyaW5nCi0gKiB3cml0ZWJhY2sgaG93ZXZlciAoYXMgd2UgaGF2ZSB0byBhbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVycyBmb3IgdGhlCi0gKiBwYWdlcykuIEEgMTZNIHdyaXRlIG1lYW5zIH4zMmtiIHBhZ2UgYXJyYXkgd2l0aCBQQUdFX0NBQ0hFX1NJWkUgPT0gNDA5Ni4KKyAqIHdyaXRlYmFjayBob3dldmVyIGFzIHdlIGhhdmUgdG8gYWxsb2NhdGUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgZm9yIHRoZQorICogcGFnZXMuIEEgMTZNIHdyaXRlIG1lYW5zIH4zMmtiIHBhZ2UgYXJyYXkgd2l0aCBQQUdFX0NBQ0hFX1NJWkUgPT0gNDA5Ni4KICAqLwotI2RlZmluZSBDSUZTX01BWF9XU0laRSAoKDE8PDI0KSAtIFBBR0VfQ0FDSEVfU0laRSkKKyNkZWZpbmUgQ0lGU19NQVhfV1NJWkUgKCgxPDwyNCkgLSAxIC0gc2l6ZW9mKFdSSVRFX1JFUSkgKyA0KQogCiAvKgotICogV2hlbiB0aGUgc2VydmVyIGRvZXNuJ3QgYWxsb3cgbGFyZ2UgcG9zaXggd3JpdGVzLCBkZWZhdWx0IHRvIGEgd3NpemUgb2YKLSAqIDEyOGsgLSBQQUdFX0NBQ0hFX1NJWkUgLS0gb25lIHBhZ2UgbGVzcyB0aGFuIHRoZSBsYXJnZXN0IGZyYW1lIHNpemUKLSAqIGRlc2NyaWJlZCBpbiBSRkMxMDAxLiBUaGlzIGFsbG93cyBzcGFjZSBmb3IgdGhlIGhlYWRlciB3aXRob3V0IGdvaW5nIG92ZXIKLSAqIHRoYXQgYnkgZGVmYXVsdC4KKyAqIFdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IGFsbG93IGxhcmdlIHBvc2l4IHdyaXRlcywgb25seSBhbGxvdyBhIHdzaXplIG9mCisgKiAxMjhrIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBXUklURV9BTkRfWCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHdyaXRlIHVwCisgKiB0byB0aGUgbWF4aW11bSBzaXplIGRlc2NyaWJlZCBieSBSRkMxMDAyLgogICovCi0jZGVmaW5lIENJRlNfTUFYX1JGQzEwMDFfV1NJWkUgKDEyOCAqIDEwMjQgLSBQQUdFX0NBQ0hFX1NJWkUpCisjZGVmaW5lIENJRlNfTUFYX1JGQzEwMDJfV1NJWkUgKDEyOCAqIDEwMjQgLSBzaXplb2YoV1JJVEVfUkVRKSArIDQpCiAKIC8qCiAgKiBUaGUgZGVmYXVsdCB3c2l6ZSBpcyAxTS4gZmluZF9nZXRfcGFnZXMgc2VlbXMgdG8gcmV0dXJuIGEgbWF4aW11bSBvZiAyNTYKQEAgLTI3ODAsMTEgKzI3ODksMTggQEAKIAogCS8qIGNhbiBzZXJ2ZXIgc3VwcG9ydCAyNC1iaXQgd3JpdGUgc2l6ZXM/ICh2aWEgVU5JWCBleHRlbnNpb25zKSAqLwogCWlmICghdGNvbi0+dW5peF9leHQgfHwgISh1bml4X2NhcCAmIENJRlNfVU5JWF9MQVJHRV9XUklURV9DQVApKQotCQl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1JGQzEwMDFfV1NJWkUpOworCQl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1JGQzEwMDJfV1NJWkUpOwogCi0JLyogbm8gQ0FQX0xBUkdFX1dSSVRFX1g/IExpbWl0IGl0IHRvIDE2IGJpdHMgKi8KLQlpZiAoIShzZXJ2ZXItPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9XUklURV9YKSkKLQkJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLCBVU0hSVF9NQVgpOworCS8qCisJICogbm8gQ0FQX0xBUkdFX1dSSVRFX1ggb3IgaXMgc2lnbmluZyBlbmFibGVkIHdpdGhvdXQgQ0FQX1VOSVggc2V0PworCSAqIExpbWl0IGl0IHRvIG1heCBidWZmZXIgb2ZmZXJlZCBieSB0aGUgc2VydmVyLCBtaW51cyB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBXUklURVggaGVhZGVyLCBub3QgaW5jbHVkaW5nIHRoZSA0IGJ5dGUgUkZDMTAwMSBsZW5ndGguCisJICovCisJaWYgKCEoc2VydmVyLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfV1JJVEVfWCkgfHwKKwkgICAgKCEoc2VydmVyLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgJiYKKwkgICAgIChzZXJ2ZXItPnNlY19tb2RlICYgKFNFQ01PREVfU0lHTl9FTkFCTEVEfFNFQ01PREVfU0lHTl9SRVFVSVJFRCkpKSkKKwkJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLAorCQkJCXNlcnZlci0+bWF4QnVmIC0gc2l6ZW9mKFdSSVRFX1JFUSkgKyA0KTsKIAogCS8qIGhhcmQgbGltaXQgb2YgQ0lGU19NQVhfV1NJWkUgKi8KIAl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1dTSVpFKTsKQEAgLTI4MTYsMTUgKzI4MzIsOSBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZAotY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICoqcHZvbHVtZV9pbmZvKQorc3RhdGljIHZvaWQKK2NsZWFudXBfdm9sdW1lX2luZm9fY29udGVudHMoc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvKQogewotCXN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbzsKLQotCWlmICghcHZvbHVtZV9pbmZvIHx8ICEqcHZvbHVtZV9pbmZvKQotCQlyZXR1cm47Ci0KLQl2b2x1bWVfaW5mbyA9ICpwdm9sdW1lX2luZm87CiAJa2ZyZWUodm9sdW1lX2luZm8tPnVzZXJuYW1lKTsKIAlremZyZWUodm9sdW1lX2luZm8tPnBhc3N3b3JkKTsKIAlrZnJlZSh2b2x1bWVfaW5mby0+VU5DKTsKQEAgLTI4MzIsMjggKzI4NDIsNDQgQEAKIAlrZnJlZSh2b2x1bWVfaW5mby0+ZG9tYWlubmFtZSk7CiAJa2ZyZWUodm9sdW1lX2luZm8tPmlvY2hhcnNldCk7CiAJa2ZyZWUodm9sdW1lX2luZm8tPnByZXBhdGgpOwotCWtmcmVlKHZvbHVtZV9pbmZvKTsKLQkqcHZvbHVtZV9pbmZvID0gTlVMTDsKLQlyZXR1cm47CiB9CiAKK3ZvaWQKK2NpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8pCit7CisJaWYgKCF2b2x1bWVfaW5mbykKKwkJcmV0dXJuOworCWNsZWFudXBfdm9sdW1lX2luZm9fY29udGVudHModm9sdW1lX2luZm8pOworCWtmcmVlKHZvbHVtZV9pbmZvKTsKK30KKworCiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogLyogYnVpbGRfcGF0aF90b19yb290IHJldHVybnMgZnVsbCBwYXRoIHRvIHJvb3Qgd2hlbgogICogd2UgZG8gbm90IGhhdmUgYW4gZXhpdGluZyBjb25uZWN0aW9uICh0Y29uKSAqLwogc3RhdGljIGNoYXIgKgotYnVpbGRfdW5jX3BhdGhfdG9fcm9vdChjb25zdCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8sCitidWlsZF91bmNfcGF0aF90b19yb290KGNvbnN0IHN0cnVjdCBzbWJfdm9sICp2b2wsCiAJCWNvbnN0IHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7Ci0JY2hhciAqZnVsbF9wYXRoOworCWNoYXIgKmZ1bGxfcGF0aCwgKnBvczsKKwl1bnNpZ25lZCBpbnQgcHBsZW4gPSB2b2wtPnByZXBhdGggPyBzdHJsZW4odm9sLT5wcmVwYXRoKSA6IDA7CisJdW5zaWduZWQgaW50IHVuY19sZW4gPSBzdHJubGVuKHZvbC0+VU5DLCBNQVhfVFJFRV9TSVpFICsgMSk7CiAKLQlpbnQgdW5jX2xlbiA9IHN0cm5sZW4odm9sdW1lX2luZm8tPlVOQywgTUFYX1RSRUVfU0laRSArIDEpOwotCWZ1bGxfcGF0aCA9IGttYWxsb2ModW5jX2xlbiArIDEsIEdGUF9LRVJORUwpOworCWZ1bGxfcGF0aCA9IGttYWxsb2ModW5jX2xlbiArIHBwbGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXN0cm5jcHkoZnVsbF9wYXRoLCB2b2x1bWVfaW5mby0+VU5DLCB1bmNfbGVuKTsKLQlmdWxsX3BhdGhbdW5jX2xlbl0gPSAwOyAvKiBhZGQgdHJhaWxpbmcgbnVsbCAqLworCXN0cm5jcHkoZnVsbF9wYXRoLCB2b2wtPlVOQywgdW5jX2xlbik7CisJcG9zID0gZnVsbF9wYXRoICsgdW5jX2xlbjsKKworCWlmIChwcGxlbikgeworCQlzdHJuY3B5KHBvcywgdm9sLT5wcmVwYXRoLCBwcGxlbik7CisJCXBvcyArPSBwcGxlbjsKKwl9CisKKwkqcG9zID0gJ1wwJzsgLyogYWRkIHRyYWlsaW5nIG51bGwgKi8KIAljb252ZXJ0X2RlbGltaXRlcihmdWxsX3BhdGgsIENJRlNfRElSX1NFUChjaWZzX3NiKSk7CisJY0ZZSSgxLCAiJXM6IGZ1bGxfcGF0aD0lcyIsIF9fZnVuY19fLCBmdWxsX3BhdGgpOwogCXJldHVybiBmdWxsX3BhdGg7CiB9CiAKQEAgLTI4OTYsMTUgKzI5MjIsMTggQEAKIAkJCQkJCSAgICZmYWtlX2Rldm5hbWUpOwogCiAJCWZyZWVfZGZzX2luZm9fYXJyYXkocmVmZXJyYWxzLCBudW1fcmVmZXJyYWxzKTsKLQkJa2ZyZWUoZmFrZV9kZXZuYW1lKTsKLQotCQlpZiAoY2lmc19zYi0+bW91bnRkYXRhICE9IE5VTEwpCi0JCQlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOwogCiAJCWlmIChJU19FUlIobWRhdGEpKSB7CiAJCQlyYyA9IFBUUl9FUlIobWRhdGEpOwogCQkJbWRhdGEgPSBOVUxMOworCQl9IGVsc2UgeworCQkJY2xlYW51cF92b2x1bWVfaW5mb19jb250ZW50cyh2b2x1bWVfaW5mbyk7CisJCQltZW1zZXQodm9sdW1lX2luZm8sICdcMCcsIHNpemVvZigqdm9sdW1lX2luZm8pKTsKKwkJCXJjID0gY2lmc19zZXR1cF92b2x1bWVfaW5mbyh2b2x1bWVfaW5mbywgbWRhdGEsCisJCQkJCQkJZmFrZV9kZXZuYW1lKTsKIAkJfQorCQlrZnJlZShmYWtlX2Rldm5hbWUpOworCQlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOwogCQljaWZzX3NiLT5tb3VudGRhdGEgPSBtZGF0YTsKIAl9CiAJa2ZyZWUoZnVsbF9wYXRoKTsKQEAgLTI5MTIsMjkgKzI5NDEsMjAgQEAKIH0KICNlbmRpZgogCi1pbnQgY2lmc19zZXR1cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqKnB2b2x1bWVfaW5mbywgY2hhciAqbW91bnRfZGF0YSwKLQkJCSAgIGNvbnN0IGNoYXIgKmRldm5hbWUpCitzdGF0aWMgaW50CitjaWZzX3NldHVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbywgY2hhciAqbW91bnRfZGF0YSwKKwkJCWNvbnN0IGNoYXIgKmRldm5hbWUpCiB7Ci0Jc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvOwogCWludCByYyA9IDA7CiAKLQkqcHZvbHVtZV9pbmZvID0gTlVMTDsKLQotCXZvbHVtZV9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNtYl92b2wpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZvbHVtZV9pbmZvKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGNpZnNfcGFyc2VfbW91bnRfb3B0aW9ucyhtb3VudF9kYXRhLCBkZXZuYW1lLAotCQkJCSAgICAgdm9sdW1lX2luZm8pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChjaWZzX3BhcnNlX21vdW50X29wdGlvbnMobW91bnRfZGF0YSwgZGV2bmFtZSwgdm9sdW1lX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2b2x1bWVfaW5mby0+bnVsbGF1dGgpIHsKIAkJY0ZZSSgxLCAibnVsbCB1c2VyIik7Ci0JCXZvbHVtZV9pbmZvLT51c2VybmFtZSA9ICIiOworCQl2b2x1bWVfaW5mby0+dXNlcm5hbWUgPSBremFsbG9jKDEsIEdGUF9LRVJORUwpOworCQlpZiAodm9sdW1lX2luZm8tPnVzZXJuYW1lID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UgaWYgKHZvbHVtZV9pbmZvLT51c2VybmFtZSkgewogCQkvKiBCQiBmaXhtZSBwYXJzZSBmb3IgZG9tYWluIG5hbWUgaGVyZSAqLwogCQljRllJKDEsICJVc2VybmFtZTogJXMiLCB2b2x1bWVfaW5mby0+dXNlcm5hbWUpOwpAQCAtMjk0Miw4ICsyOTYyLDcgQEAKIAkJY2lmc2Vycm9yKCJObyB1c2VybmFtZSBzcGVjaWZpZWQiKTsKIAkvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCiAJICAgbG9jYXRpb25zIHN1Y2ggYXMgZW52IHZhcmlhYmxlcyBhbmQgZmlsZXMgb24gZGlzayAqLwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiB0aGlzIGlzIG5lZWRlZCBmb3IgQVNDSUkgY3AgdG8gVW5pY29kZSBjb252ZXJ0cyAqLwpAQCAtMjk1NSwyMSArMjk3NCwzNCBAQAogCQlpZiAodm9sdW1lX2luZm8tPmxvY2FsX25scyA9PSBOVUxMKSB7CiAJCQljRVJST1IoMSwgIkNJRlMgbW91bnQgZXJyb3I6IGlvY2hhcnNldCAlcyBub3QgZm91bmQiLAogCQkJCSB2b2x1bWVfaW5mby0+aW9jaGFyc2V0KTsKLQkJCXJjID0gLUVMSUJBQ0M7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiAtRUxJQkFDQzsKIAkJfQogCX0KIAotCSpwdm9sdW1lX2luZm8gPSB2b2x1bWVfaW5mbzsKLQlyZXR1cm4gcmM7Ci1vdXQ6Ci0JY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKCZ2b2x1bWVfaW5mbyk7CiAJcmV0dXJuIHJjOwogfQogCitzdHJ1Y3Qgc21iX3ZvbCAqCitjaWZzX2dldF92b2x1bWVfaW5mbyhjaGFyICptb3VudF9kYXRhLCBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm87CisKKwl2b2x1bWVfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWJfdm9sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2b2x1bWVfaW5mbykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyYyA9IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8sIG1vdW50X2RhdGEsIGRldm5hbWUpOworCWlmIChyYykgeworCQljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8pOworCQl2b2x1bWVfaW5mbyA9IEVSUl9QVFIocmMpOworCX0KKworCXJldHVybiB2b2x1bWVfaW5mbzsKK30KKwogaW50Ci1jaWZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCi0JICAgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvLCBjb25zdCBjaGFyICpkZXZuYW1lKQorY2lmc19tb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8pCiB7CiAJaW50IHJjID0gMDsKIAlpbnQgeGlkOwpAQCAtMjk4MCw2ICszMDEyLDE1IEBACiAJc3RydWN0IHRjb25fbGluayAqdGxpbms7CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogCWludCByZWZlcnJhbF93YWxrc19jb3VudCA9IDA7CisjZW5kaWYKKworCXJjID0gYmRpX3NldHVwX2FuZF9yZWdpc3RlcigmY2lmc19zYi0+YmRpLCAiY2lmcyIsIEJESV9DQVBfTUFQX0NPUFkpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJY2lmc19zYi0+YmRpLnJhX3BhZ2VzID0gZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzOworCisjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogdHJ5X21vdW50X2FnYWluOgogCS8qIGNsZWFudXAgYWN0aXZpdGllcyBpZiB3ZSdyZSBjaGFzaW5nIGEgcmVmZXJyYWwgKi8KIAlpZiAocmVmZXJyYWxfd2Fsa3NfY291bnQpIHsKQEAgLTI5ODgsNyArMzAyOSw2IEBACiAJCWVsc2UgaWYgKHBTZXNJbmZvKQogCQkJY2lmc19wdXRfc21iX3NlcyhwU2VzSW5mbyk7CiAKLQkJY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKCZ2b2x1bWVfaW5mbyk7CiAJCUZyZWVYaWQoeGlkKTsKIAl9CiAjZW5kaWYKQEAgLTMwMDQsNiArMzA0NCw3IEBACiAJc3J2VGNwID0gY2lmc19nZXRfdGNwX3Nlc3Npb24odm9sdW1lX2luZm8pOwogCWlmIChJU19FUlIoc3J2VGNwKSkgewogCQlyYyA9IFBUUl9FUlIoc3J2VGNwKTsKKwkJYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzAxNSwxNCArMzA1Niw2IEBACiAJCWdvdG8gbW91bnRfZmFpbF9jaGVjazsKIAl9CiAKLQlpZiAocFNlc0luZm8tPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9GSUxFUykKLQkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwotCWVsc2UKLQkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTk9OX0xGUzsKLQotCS8qIEJCIEZJWE1FIGZpeCB0aW1lX2dyYW4gdG8gYmUgbGFyZ2VyIGZvciBMQU5NQU4gc2Vzc2lvbnMgKi8KLQlzYi0+c190aW1lX2dyYW4gPSAxMDA7Ci0KIAkvKiBzZWFyY2ggZm9yIGV4aXN0aW5nIHRjb24gdG8gdGhpcyBzZXJ2ZXIgc2hhcmUgKi8KIAl0Y29uID0gY2lmc19nZXRfdGNvbihwU2VzSW5mbywgdm9sdW1lX2luZm8pOwogCWlmIChJU19FUlIodGNvbikpIHsKQEAgLTMwMzUsNyArMzA2OCw3IEBACiAJaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpIHsKIAkJLyogcmVzZXQgb2YgY2FwcyBjaGVja3MgbW91bnQgdG8gc2VlIGlmIHVuaXggZXh0ZW5zaW9ucwogCQkgICBkaXNhYmxlZCBmb3IganVzdCB0aGlzIG1vdW50ICovCi0JCXJlc2V0X2NpZnNfdW5peF9jYXBzKHhpZCwgdGNvbiwgc2IsIHZvbHVtZV9pbmZvKTsKKwkJcmVzZXRfY2lmc191bml4X2NhcHMoeGlkLCB0Y29uLCBjaWZzX3NiLCB2b2x1bWVfaW5mbyk7CiAJCWlmICgodGNvbi0+c2VzLT5zZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgJiYKIAkJICAgIChsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpICYKIAkJICAgICBDSUZTX1VOSVhfVFJBTlNQT1JUX0VOQ1JZUFRJT05fTUFOREFUT1JZX0NBUCkpIHsKQEAgLTMxNTgsNiArMzE5MSw3IEBACiAJCQljaWZzX3B1dF9zbWJfc2VzKHBTZXNJbmZvKTsKIAkJZWxzZQogCQkJY2lmc19wdXRfdGNwX3Nlc3Npb24oc3J2VGNwKTsKKwkJYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzE3MSw2ICszMjA1LDEwIEBACiAJcmV0dXJuIHJjOwogfQogCisvKgorICogSXNzdWUgYSBUUkVFX0NPTk5FQ1QgcmVxdWVzdC4gTm90ZSB0aGF0IGZvciBJUEMkIHNoYXJlcywgdGhhdCB0aGUgdGNvbgorICogcG9pbnRlciBtYXkgYmUgTlVMTC4KKyAqLwogaW50CiBDSUZTVENvbih1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19zZXMgKnNlcywKIAkgY29uc3QgY2hhciAqdHJlZSwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKQEAgLTMyMDUsNyArMzI0Myw3IEBACiAJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOwogCXBTTUItPkZsYWdzID0gY3B1X3RvX2xlMTYoVENPTl9FWFRFTkRFRF9TRUNJTkZPKTsKIAliY2NfcHRyID0gJnBTTUItPlBhc3N3b3JkWzBdOwotCWlmICgoc2VzLT5zZXJ2ZXItPnNlY19tb2RlKSAmIFNFQ01PREVfVVNFUikgeworCWlmICghdGNvbiB8fCAoc2VzLT5zZXJ2ZXItPnNlY19tb2RlICYgU0VDTU9ERV9VU0VSKSkgewogCQlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KDEpOwkvKiBtaW5pbXVtICovCiAJCSpiY2NfcHRyID0gMDsgLyogcGFzc3dvcmQgaXMgbnVsbCBieXRlICovCiAJCWJjY19wdHIrKzsgICAgICAgICAgICAgIC8qIHNraXAgcGFzc3dvcmQgKi8KQEAgLTMzMjgsOCArMzM2Niw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKLWNpZnNfdW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCit2b2lkCitjaWZzX3Vtb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQogewogCXN0cnVjdCByYl9yb290ICpyb290ID0gJmNpZnNfc2ItPnRsaW5rX3RyZWU7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CkBAIC0zMzUwLDcgKzMzODgsMTAgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmNpZnNfc2ItPnRsaW5rX3RyZWVfbG9jayk7CiAKLQlyZXR1cm4gMDsKKwliZGlfZGVzdHJveSgmY2lmc19zYi0+YmRpKTsKKwlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOworCXVubG9hZF9ubHMoY2lmc19zYi0+bG9jYWxfbmxzKTsKKwlrZnJlZShjaWZzX3NiKTsKIH0KIAogaW50IGNpZnNfbmVnb3RpYXRlX3Byb3RvY29sKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3NlcyAqc2VzKQpAQCAtMzM3MSw3ICszNDEyLDcgQEAKIAl9CiAJaWYgKHJjID09IDApIHsKIAkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0JCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykKKwkJaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkTmVnb3RpYXRlKQogCQkJc2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzR29vZDsKIAkJZWxzZQogCQkJcmMgPSAtRUhPU1RET1dOOwpAQCAtMzQ0NCw3ICszNDg1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc25wcmludGYodXNlcm5hbWUsIE1BWF9VU0VSTkFNRV9TSVpFLCAia3JiNTB4JXgiLCBmc3VpZCk7CisJc25wcmludGYodXNlcm5hbWUsIHNpemVvZih1c2VybmFtZSksICJrcmI1MHgleCIsIGZzdWlkKTsKIAl2b2xfaW5mby0+dXNlcm5hbWUgPSB1c2VybmFtZTsKIAl2b2xfaW5mby0+bG9jYWxfbmxzID0gY2lmc19zYi0+bG9jYWxfbmxzOwogCXZvbF9pbmZvLT5saW51eF91aWQgPSBmc3VpZDsKQEAgLTM0ODQsMTIgKzM1MjUsNiBAQAogCXJldHVybiB0Y29uOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0Y29uX2xpbmsgKgotY2lmc19zYl9tYXN0ZXJfdGxpbmsoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKLXsKLQlyZXR1cm4gY2lmc19zYi0+bWFzdGVyX3RsaW5rOwotfQotCiBzdHJ1Y3QgY2lmc190Y29uICoKIGNpZnNfc2JfbWFzdGVyX3Rjb24oc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IDgxOTE0ZGYuLmZhOGMyMWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtNTUsNiArNTUsNyBAQAogCWNoYXIgZGlyc2VwOwogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGRpcmVudHJ5LT5kX3NiKTsKIAlzdHJ1Y3QgY2lmc190Y29uICp0Y29uID0gY2lmc19zYl9tYXN0ZXJfdGNvbihjaWZzX3NiKTsKKwl1bnNpZ25lZCBzZXE7CiAKIAlpZiAoZGlyZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7ICAvKiBub3QgbXVjaCB3ZSBjYW4gZG8gaWYgZGVudHJ5IGlzIGZyZWVkIGFuZApAQCAtNjgsMjIgKzY5LDI5IEBACiAJCWRmc3BsZW4gPSAwOwogY2lmc19icF9yZW5hbWVfcmV0cnk6CiAJbmFtZWxlbiA9IGRmc3BsZW47CisJc2VxID0gcmVhZF9zZXFiZWdpbigmcmVuYW1lX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKHRlbXAgPSBkaXJlbnRyeTsgIUlTX1JPT1QodGVtcCk7KSB7CiAJCW5hbWVsZW4gKz0gKDEgKyB0ZW1wLT5kX25hbWUubGVuKTsKIAkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OwogCQlpZiAodGVtcCA9PSBOVUxMKSB7CiAJCQljRVJST1IoMSwgImNvcnJ1cHQgZGVudHJ5Iik7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCiAJZnVsbF9wYXRoID0ga21hbGxvYyhuYW1lbGVuKzEsIEdGUF9LRVJORUwpOwogCWlmIChmdWxsX3BhdGggPT0gTlVMTCkKIAkJcmV0dXJuIGZ1bGxfcGF0aDsKIAlmdWxsX3BhdGhbbmFtZWxlbl0gPSAwOwkvKiB0cmFpbGluZyBudWxsICovCisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAodGVtcCA9IGRpcmVudHJ5OyAhSVNfUk9PVCh0ZW1wKTspIHsKKwkJc3Bpbl9sb2NrKCZ0ZW1wLT5kX2xvY2spOwogCQluYW1lbGVuIC09IDEgKyB0ZW1wLT5kX25hbWUubGVuOwogCQlpZiAobmFtZWxlbiA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZ0ZW1wLT5kX2xvY2spOwogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlmdWxsX3BhdGhbbmFtZWxlbl0gPSBkaXJzZXA7CkBAIC05MSwxNCArOTksMTcgQEAKIAkJCQl0ZW1wLT5kX25hbWUubGVuKTsKIAkJCWNGWUkoMCwgIm5hbWU6ICVzIiwgZnVsbF9wYXRoICsgbmFtZWxlbik7CiAJCX0KKwkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKIAkJaWYgKHRlbXAgPT0gTlVMTCkgewogCQkJY0VSUk9SKDEsICJjb3JydXB0IGRlbnRyeSIpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlrZnJlZShmdWxsX3BhdGgpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9Ci0JaWYgKG5hbWVsZW4gIT0gZGZzcGxlbikgeworCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChuYW1lbGVuICE9IGRmc3BsZW4gfHwgcmVhZF9zZXFyZXRyeSgmcmVuYW1lX2xvY2ssIHNlcSkpIHsKIAkJY0VSUk9SKDEsICJkaWQgbm90IGVuZCBwYXRoIGxvb2t1cCB3aGVyZSBleHBlY3RlZCBuYW1lbGVuIGlzICVkIiwKIAkJCW5hbWVsZW4pOwogCQkvKiBwcmVzdW1hYmx5IHRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiByYWNpbmcgd2l0aCBhIHJlbmFtZQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9mc2NhY2hlLmMgYi9mcy9jaWZzL2ZzY2FjaGUuYwppbmRleCBkMzY4YTQ3Li40MmU1MzYzIDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZzY2FjaGUuYworKysgYi9mcy9jaWZzL2ZzY2FjaGUuYwpAQCAtMjgsMTQgKzI4LDE0IEBACiAJc2VydmVyLT5mc2NhY2hlID0KIAkJZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZShjaWZzX2ZzY2FjaGVfbmV0ZnMucHJpbWFyeV9pbmRleCwKIAkJCQkmY2lmc19mc2NhY2hlX3NlcnZlcl9pbmRleF9kZWYsIHNlcnZlcik7Ci0JY0ZZSSgxLCAiQ0lGUzogZ2V0IGNsaWVudCBjb29raWUgKDB4JXAvMHglcCkiLCBzZXJ2ZXIsCi0JCQkJc2VydmVyLT5mc2NhY2hlKTsKKwljRllJKDEsICIlczogKDB4JXAvMHglcCkiLCBfX2Z1bmNfXywgc2VydmVyLAorCQkJc2VydmVyLT5mc2NhY2hlKTsKIH0KIAogdm9pZCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9jbGllbnRfY29va2llKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKIHsKLQljRllJKDEsICJDSUZTOiByZWxlYXNlIGNsaWVudCBjb29raWUgKDB4JXAvMHglcCkiLCBzZXJ2ZXIsCi0JCQkJc2VydmVyLT5mc2NhY2hlKTsKKwljRllJKDEsICIlczogKDB4JXAvMHglcCkiLCBfX2Z1bmNfXywgc2VydmVyLAorCQkJc2VydmVyLT5mc2NhY2hlKTsKIAlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHNlcnZlci0+ZnNjYWNoZSwgMCk7CiAJc2VydmVyLT5mc2NhY2hlID0gTlVMTDsKIH0KQEAgLTQ3LDEzICs0NywxMyBAQAogCXRjb24tPmZzY2FjaGUgPQogCQlmc2NhY2hlX2FjcXVpcmVfY29va2llKHNlcnZlci0+ZnNjYWNoZSwKIAkJCQkmY2lmc19mc2NhY2hlX3N1cGVyX2luZGV4X2RlZiwgdGNvbik7Ci0JY0ZZSSgxLCAiQ0lGUzogZ2V0IHN1cGVyYmxvY2sgY29va2llICgweCVwLzB4JXApIiwKLQkJCQlzZXJ2ZXItPmZzY2FjaGUsIHRjb24tPmZzY2FjaGUpOworCWNGWUkoMSwgIiVzOiAoMHglcC8weCVwKSIsIF9fZnVuY19fLCBzZXJ2ZXItPmZzY2FjaGUsCisJCQl0Y29uLT5mc2NhY2hlKTsKIH0KIAogdm9pZCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9zdXBlcl9jb29raWUoc3RydWN0IGNpZnNfdGNvbiAqdGNvbikKIHsKLQljRllJKDEsICJDSUZTOiByZWxlYXNpbmcgc3VwZXJibG9jayBjb29raWUgKDB4JXApIiwgdGNvbi0+ZnNjYWNoZSk7CisJY0ZZSSgxLCAiJXM6ICgweCVwKSIsIF9fZnVuY19fLCB0Y29uLT5mc2NhY2hlKTsKIAlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHRjb24tPmZzY2FjaGUsIDApOwogCXRjb24tPmZzY2FjaGUgPSBOVUxMOwogfQpAQCAtNzAsOCArNzAsOCBAQAogCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfRlNDQUNIRSkgewogCQljaWZzaS0+ZnNjYWNoZSA9IGZzY2FjaGVfYWNxdWlyZV9jb29raWUodGNvbi0+ZnNjYWNoZSwKIAkJCQkmY2lmc19mc2NhY2hlX2lub2RlX29iamVjdF9kZWYsIGNpZnNpKTsKLQkJY0ZZSSgxLCAiQ0lGUzogZ290IEZIIGNvb2tpZSAoMHglcC8weCVwKSIsIHRjb24tPmZzY2FjaGUsCi0JCQkJY2lmc2ktPmZzY2FjaGUpOworCQljRllJKDEsICIlczogZ290IEZIIGNvb2tpZSAoMHglcC8weCVwKSIsIF9fZnVuY19fLAorCQkJCXRjb24tPmZzY2FjaGUsIGNpZnNpLT5mc2NhY2hlKTsKIAl9CiB9CiAKQEAgLTgwLDggKzgwLDcgQEAKIAlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBDSUZTX0koaW5vZGUpOwogCiAJaWYgKGNpZnNpLT5mc2NhY2hlKSB7Ci0JCWNGWUkoMSwgIkNJRlMgcmVsZWFzaW5nIGlub2RlIGNvb2tpZSAoMHglcCkiLAotCQkJCWNpZnNpLT5mc2NhY2hlKTsKKwkJY0ZZSSgxLCAiJXM6ICgweCVwKSIsIF9fZnVuY19fLCBjaWZzaS0+ZnNjYWNoZSk7CiAJCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUoY2lmc2ktPmZzY2FjaGUsIDApOwogCQljaWZzaS0+ZnNjYWNoZSA9IE5VTEw7CiAJfQpAQCAtOTIsOCArOTEsOCBAQAogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IENJRlNfSShpbm9kZSk7CiAKIAlpZiAoY2lmc2ktPmZzY2FjaGUpIHsKLQkJY0ZZSSgxLCAiQ0lGUyBkaXNhYmxpbmcgaW5vZGUgY29va2llICgweCVwKSIsCi0JCQkJY2lmc2ktPmZzY2FjaGUpOworCQljRllJKDEsICIlczogKDB4JXApIiwgX19mdW5jX18sIGNpZnNpLT5mc2NhY2hlKTsKKwkJZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhjaWZzaS0+ZnNjYWNoZSwgaW5vZGUpOwogCQlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKGNpZnNpLT5mc2NhY2hlLCAxKTsKIAkJY2lmc2ktPmZzY2FjaGUgPSBOVUxMOwogCX0KQEAgLTEyMSw4ICsxMjAsOCBAQAogCQkJCQljaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpLT5mc2NhY2hlLAogCQkJCQkmY2lmc19mc2NhY2hlX2lub2RlX29iamVjdF9kZWYsCiAJCQkJCWNpZnNpKTsKLQkJY0ZZSSgxLCAiQ0lGUzogbmV3IGNvb2tpZSAweCVwIG9sZGNvb2tpZSAweCVwIiwKLQkJCQljaWZzaS0+ZnNjYWNoZSwgb2xkKTsKKwkJY0ZZSSgxLCAiJXM6IG5ldyBjb29raWUgMHglcCBvbGRjb29raWUgMHglcCIsCisJCQkJX19mdW5jX18sIGNpZnNpLT5mc2NhY2hlLCBvbGQpOwogCX0KIH0KIApAQCAtMTMyLDggKzEzMSw4IEBACiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBDSUZTX0koaW5vZGUpOwogCi0JCWNGWUkoMSwgIkNJRlM6IGZzY2FjaGUgcmVsZWFzZSBwYWdlICgweCVwLzB4JXApIiwKLQkJCQlwYWdlLCBjaWZzaS0+ZnNjYWNoZSk7CisJCWNGWUkoMSwgIiVzOiAoMHglcC8weCVwKSIsIF9fZnVuY19fLCBwYWdlLAorCQkJCWNpZnNpLT5mc2NhY2hlKTsKIAkJaWYgKCFmc2NhY2hlX21heWJlX3JlbGVhc2VfcGFnZShjaWZzaS0+ZnNjYWNoZSwgcGFnZSwgZ2ZwKSkKIAkJCXJldHVybiAwOwogCX0KQEAgLTE0NCw4ICsxNDMsNyBAQAogc3RhdGljIHZvaWQgY2lmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGVfY29tcGxldGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmN0eCwKIAkJCQkJCWludCBlcnJvcikKIHsKLQljRllJKDEsICJDRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZV9jb21wbGV0ZSAoMHglcC8lZCkiLAotCQkJcGFnZSwgZXJyb3IpOworCWNGWUkoMSwgIiVzOiAoMHglcC8lZCkiLCBfX2Z1bmNfXywgcGFnZSwgZXJyb3IpOwogCWlmICghZXJyb3IpCiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTE1OCw3ICsxNTYsNyBAQAogewogCWludCByZXQ7CiAKLQljRllJKDEsICJDSUZTOiByZWFkcGFnZV9mcm9tX2ZzY2FjaGUoZnNjOiVwLCBwOiVwLCBpOjB4JXAiLAorCWNGWUkoMSwgIiVzOiAoZnNjOiVwLCBwOiVwLCBpOjB4JXAiLCBfX2Z1bmNfXywKIAkJCUNJRlNfSShpbm9kZSktPmZzY2FjaGUsIHBhZ2UsIGlub2RlKTsKIAlyZXQgPSBmc2NhY2hlX3JlYWRfb3JfYWxsb2NfcGFnZShDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCBwYWdlLAogCQkJCQkgY2lmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGVfY29tcGxldGUsCkBAIC0xNjcsMTEgKzE2NSwxMSBAQAogCXN3aXRjaCAocmV0KSB7CiAKIAljYXNlIDA6IC8qIHBhZ2UgZm91bmQgaW4gZnNjYWNoZSwgcmVhZCBzdWJtaXR0ZWQgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VfZnJvbV9mc2NhY2hlOiBzdWJtaXR0ZWQiKTsKKwkJY0ZZSSgxLCAiJXM6IHN1Ym1pdHRlZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldDsKIAljYXNlIC1FTk9CVUZTOgkvKiBwYWdlIHdvbid0IGJlIGNhY2hlZCAqLwogCWNhc2UgLUVOT0RBVEE6CS8qIHBhZ2Ugbm90IGluIGNhY2hlICovCi0JCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZSAlZCIsIHJldCk7CisJCWNGWUkoMSwgIiVzOiAlZCIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gMTsKIAogCWRlZmF1bHQ6CkBAIC0xOTAsNyArMTg4LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JY0ZZSSgxLCAiQ0lGUzogX19jaWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUgKDB4JXAvJXUvMHglcCkiLAorCWNGWUkoMSwgIiVzOiAoMHglcC8ldS8weCVwKSIsIF9fZnVuY19fLAogCQkJQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgKm5yX3BhZ2VzLCBpbm9kZSk7CiAJcmV0ID0gZnNjYWNoZV9yZWFkX29yX2FsbG9jX3BhZ2VzKENJRlNfSShpbm9kZSktPmZzY2FjaGUsIG1hcHBpbmcsCiAJCQkJCSAgcGFnZXMsIG5yX3BhZ2VzLApAQCAtMTk5LDEyICsxOTcsMTIgQEAKIAkJCQkJICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKIAlzd2l0Y2ggKHJldCkgewogCWNhc2UgMDoJLyogcmVhZCBzdWJtaXR0ZWQgdG8gdGhlIGNhY2hlIGZvciBhbGwgcGFnZXMgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZTogc3VibWl0dGVkIik7CisJCWNGWUkoMSwgIiVzOiBzdWJtaXR0ZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXQ7CiAKIAljYXNlIC1FTk9CVUZTOgkvKiBzb21lIHBhZ2VzIGFyZSBub3QgY2FjaGVkIGFuZCBjYW4ndCBiZSAqLwogCWNhc2UgLUVOT0RBVEE6CS8qIHNvbWUgcGFnZXMgYXJlIG5vdCBjYWNoZWQgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZTogbm8gcGFnZSIpOworCQljRllJKDEsICIlczogbm8gcGFnZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDE7CiAKIAlkZWZhdWx0OgpAQCAtMjE4LDcgKzIxNiw3IEBACiB7CiAJaW50IHJldDsKIAotCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX3RvX2ZzY2FjaGUoZnNjOiAlcCwgcDogJXAsIGk6ICVwIiwKKwljRllJKDEsICIlczogKGZzYzogJXAsIHA6ICVwLCBpOiAlcCkiLCBfX2Z1bmNfXywKIAkJCUNJRlNfSShpbm9kZSktPmZzY2FjaGUsIHBhZ2UsIGlub2RlKTsKIAlyZXQgPSBmc2NhY2hlX3dyaXRlX3BhZ2UoQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgcGFnZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJldCAhPSAwKQpAQCAtMjMwLDcgKzIyOCw3IEBACiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKGlub2RlKTsKIAlzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSA9IGNpZnNpLT5mc2NhY2hlOwogCi0JY0ZZSSgxLCAiQ0lGUzogZnNjYWNoZSBpbnZhbGlkYXRlcGFnZSAoMHglcC8weCVwKSIsIHBhZ2UsIGNvb2tpZSk7CisJY0ZZSSgxLCAiJXM6ICgweCVwLzB4JXApIiwgX19mdW5jX18sIHBhZ2UsIGNvb2tpZSk7CiAJZnNjYWNoZV93YWl0X29uX3BhZ2Vfd3JpdGUoY29va2llLCBwYWdlKTsKIAlmc2NhY2hlX3VuY2FjaGVfcGFnZShjb29raWUsIHBhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCAzODkyYWI4Li5kM2U2MTk2IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtNDI4LDggKzQyOCw3IEBACiAJCQkoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKSB7CiAJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX1NJR047CiAJCWlmICghc2VzLT5zZXJ2ZXItPnNlc3Npb25fZXN0YWIpCi0JCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9LRVlfWENIIHwKLQkJCQlOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CisJCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9LRVlfWENIOwogCX0KIAogCXNlY19ibG9iLT5OZWdvdGlhdGVGbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKQEAgLTQ2NSwxMCArNDY0LDExIEBACiAJCU5UTE1TU1BfTkVHT1RJQVRFXzEyOCB8IE5UTE1TU1BfTkVHT1RJQVRFX1VOSUNPREUgfAogCQlOVExNU1NQX05FR09USUFURV9OVExNIHwgTlRMTVNTUF9ORUdPVElBVEVfRVhURU5ERURfU0VDOwogCWlmIChzZXMtPnNlcnZlci0+c2VjX21vZGUgJgotCSAgIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJICAgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkgewogCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9TSUdOOwotCWlmIChzZXMtPnNlcnZlci0+c2VjX21vZGUgJiBTRUNNT0RFX1NJR05fUkVRVUlSRUQpCi0JCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOOworCQlpZiAoIXNlcy0+c2VydmVyLT5zZXNzaW9uX2VzdGFiKQorCQkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfS0VZX1hDSDsKKwl9CiAKIAl0bXAgPSBwYnVmZmVyICsgc2l6ZW9mKEFVVEhFTlRJQ0FURV9NRVNTQUdFKTsKIAlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVuY3J5cHQuYyBiL2ZzL2NpZnMvc21iZW5jcnlwdC5jCmluZGV4IDE1MjVkNWUuLjFjNWI3NzAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc21iZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvc21iZW5jcnlwdC5jCkBAIC05MCwxMiArOTAsMTAgQEAKIAlzZ19pbml0X29uZSgmc2dvdXQsIG91dCwgOCk7CiAKIAlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnb3V0LCAmc2dpbiwgOCk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjKQogCQljRVJST1IoMSwgImNvdWxkIG5vdCBlbmNyeXB0IGNyeXB0IGtleSByYzogJWRcbiIsIHJjKTsKLQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbV9kZXMpOwotCQlnb3RvIHNtYmhhc2hfZXJyOwotCX0KIAorCWNyeXB0b19mcmVlX2Jsa2NpcGhlcih0Zm1fZGVzKTsKIHNtYmhhc2hfZXJyOgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NvZGEvcGlvY3RsLmMgYi9mcy9jb2RhL3Bpb2N0bC5jCmluZGV4IDZjYmIzYWYuLmNiMTQwZWYgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvcGlvY3RsLmMKKysrIGIvZnMvY29kYS9waW9jdGwuYwpAQCAtNDMsOCArNDMsNiBAQAogLyogdGhlIGNvZGEgcGlvY3RsIGlub2RlIG9wcyAqLwogc3RhdGljIGludCBjb2RhX2lvY3RsX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7CiAJcmV0dXJuIChtYXNrICYgTUFZX0VYRUMpID8gLUVBQ0NFUyA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NyYW1mcy9pbm9kZS5jIGIvZnMvY3JhbWZzL2lub2RlLmMKaW5kZXggZTE0MTkzOS4uNzM5ZmI1OSAxMDA2NDQKLS0tIGEvZnMvY3JhbWZzL2lub2RlLmMKKysrIGIvZnMvY3JhbWZzL2lub2RlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIC8qIFRoZXNlIG1hY3JvcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSwgdG8gcHJvdmlkZSBiZXR0ZXIgc3RfaW5vIHNlbWFudGljcy4gKi8KICNkZWZpbmUgT0ZGU0VUKHgpCSgoeCktPmlfaW5vKQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFtaW5vKHN0cnVjdCBjcmFtZnNfaW5vZGUgKmNpbm8sIHVuc2lnbmVkIGludCBvZmZzZXQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFtaW5vKGNvbnN0IHN0cnVjdCBjcmFtZnNfaW5vZGUgKmNpbm8sIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJaWYgKCFjaW5vLT5vZmZzZXQpCiAJCXJldHVybiBvZmZzZXQgKyAxOwpAQCAtNjEsNyArNjEsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlub2RlICpnZXRfY3JhbWZzX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0Jc3RydWN0IGNyYW1mc19pbm9kZSAqY3JhbWZzX2lub2RlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQorCWNvbnN0IHN0cnVjdCBjcmFtZnNfaW5vZGUgKmNyYW1mc19pbm9kZSwgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgemVyb3RpbWU7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAkvKiBTZXQgaXQgYWxsIHVwLi4gKi8KIAlzYi0+c19vcCA9ICZjcmFtZnNfb3BzOwogCXJvb3QgPSBnZXRfY3JhbWZzX2lub2RlKHNiLCAmc3VwZXIucm9vdCwgMCk7Ci0JaWYgKCFyb290KQorCWlmIChJU19FUlIocm9vdCkpCiAJCWdvdG8gb3V0OwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CkBAIC00MjMsNiArNDIzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogY3JhbWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlpbnQgc29ydGVkOwogCiAJbXV0ZXhfbG9jaygmcmVhZF9tdXRleCk7CkBAIC00NDksOCArNDUwLDggQEAKIAogCQlmb3IgKDs7KSB7CiAJCQlpZiAoIW5hbWVsZW4pIHsKLQkJCQltdXRleF91bmxvY2soJnJlYWRfbXV0ZXgpOwotCQkJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCQkJCWlub2RlID0gRVJSX1BUUigtRUlPKTsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChuYW1lW25hbWVsZW4tMV0pCiAJCQkJYnJlYWs7CkBAIC00NjIsMTcgKzQ2MywxOCBAQAogCQlpZiAocmV0dmFsID4gMCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXJldHZhbCkgewotCQkJc3RydWN0IGNyYW1mc19pbm9kZSBlbnRyeSA9ICpkZTsKLQkJCW11dGV4X3VubG9jaygmcmVhZF9tdXRleCk7Ci0JCQlkX2FkZChkZW50cnksIGdldF9jcmFtZnNfaW5vZGUoZGlyLT5pX3NiLCAmZW50cnksIGRpcl9vZmYpKTsKLQkJCXJldHVybiBOVUxMOworCQkJaW5vZGUgPSBnZXRfY3JhbWZzX2lub2RlKGRpci0+aV9zYiwgZGUsIGRpcl9vZmYpOworCQkJYnJlYWs7CiAJCX0KIAkJLyogZWxzZSAocmV0dmFsIDwgMCkgKi8KIAkJaWYgKHNvcnRlZCkKIAkJCWJyZWFrOwogCX0KK291dDoKIAltdXRleF91bmxvY2soJnJlYWRfbXV0ZXgpOwotCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggMzdmNzJlZS4uNmU0ZWE2ZCAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTIyMTMsMTQgKzIyMTMsMTUgQEAKICAqIFRoZSBoYXNoIHZhbHVlIGhhcyB0byBtYXRjaCB0aGUgaGFzaCBxdWV1ZSB0aGF0IHRoZSBkZW50cnkgaXMgb24uLgogICovCiAvKgotICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogX19kX21vdmUgLSBtb3ZlIGEgZGVudHJ5CiAgKiBAZGVudHJ5OiBlbnRyeSB0byBtb3ZlCiAgKiBAdGFyZ2V0OiBuZXcgZGVudHJ5CiAgKgogICogVXBkYXRlIHRoZSBkY2FjaGUgdG8gcmVmbGVjdCB0aGUgbW92ZSBvZiBhIGZpbGUgbmFtZS4gTmVnYXRpdmUKLSAqIGRjYWNoZSBlbnRyaWVzIHNob3VsZCBub3QgYmUgbW92ZWQgaW4gdGhpcyB3YXkuCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LiAgQ2FsbGVyIGhvbGQKKyAqIHJlbmFtZV9sb2NrLgogICovCi12b2lkIGRfbW92ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICogdGFyZ2V0KQorc3RhdGljIHZvaWQgX19kX21vdmUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGRlbnRyeSAqIHRhcmdldCkKIHsKIAlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBtb3ZpbmcgbmVnYXRpdmUgZGNhY2hlIGVudHJ5XG4iKTsKQEAgLTIyMjgsOCArMjIyOSw2IEBACiAJQlVHX09OKGRfYW5jZXN0b3IoZGVudHJ5LCB0YXJnZXQpKTsKIAlCVUdfT04oZF9hbmNlc3Rvcih0YXJnZXQsIGRlbnRyeSkpOwogCi0Jd3JpdGVfc2VxbG9jaygmcmVuYW1lX2xvY2spOwotCiAJZGVudHJ5X2xvY2tfZm9yX21vdmUoZGVudHJ5LCB0YXJnZXQpOwogCiAJd3JpdGVfc2VxY291bnRfYmVnaW4oJmRlbnRyeS0+ZF9zZXEpOwpAQCAtMjI3NSw2ICsyMjc0LDIwIEBACiAJc3Bpbl91bmxvY2soJnRhcmdldC0+ZF9sb2NrKTsKIAlmc25vdGlmeV9kX21vdmUoZGVudHJ5KTsKIAlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworfQorCisvKgorICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogQGRlbnRyeTogZW50cnkgdG8gbW92ZQorICogQHRhcmdldDogbmV3IGRlbnRyeQorICoKKyAqIFVwZGF0ZSB0aGUgZGNhY2hlIHRvIHJlZmxlY3QgdGhlIG1vdmUgb2YgYSBmaWxlIG5hbWUuIE5lZ2F0aXZlCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LgorICovCit2b2lkIGRfbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnRhcmdldCkKK3sKKwl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7CisJX19kX21vdmUoZGVudHJ5LCB0YXJnZXQpOwogCXdyaXRlX3NlcXVubG9jaygmcmVuYW1lX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTChkX21vdmUpOwpAQCAtMjMwMiw3ICsyMzE1LDcgQEAKICAqIFRoaXMgaGVscGVyIGF0dGVtcHRzIHRvIGNvcGUgd2l0aCByZW1vdGVseSByZW5hbWVkIGRpcmVjdG9yaWVzCiAgKgogICogSXQgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBob2xkaW5nCi0gKiBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4IGFuZCB0aGUgaW5vZGUtPmlfbG9jaworICogZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCwgaW5vZGUtPmlfbG9jayBhbmQgcmVuYW1lX2xvY2sKICAqCiAgKiBOb3RlOiBJZiBldmVyIHRoZSBsb2NraW5nIGluIGxvY2tfcmVuYW1lKCkgY2hhbmdlcywgdGhlbiBwbGVhc2UKICAqIHJlbWVtYmVyIHRvIHVwZGF0ZSB0aGlzIHRvby4uLgpAQCAtMjMxNywxMSArMjMzMCw2IEBACiAJaWYgKGFsaWFzLT5kX3BhcmVudCA9PSBkZW50cnktPmRfcGFyZW50KQogCQlnb3RvIG91dF91bmFsaWFzOwogCi0JLyogQ2hlY2sgZm9yIGxvb3BzICovCi0JcmV0ID0gRVJSX1BUUigtRUxPT1ApOwotCWlmIChkX2FuY2VzdG9yKGFsaWFzLCBkZW50cnkpKQotCQlnb3RvIG91dF9lcnI7Ci0KIAkvKiBTZWUgbG9ja19yZW5hbWUoKSAqLwogCXJldCA9IEVSUl9QVFIoLUVCVVNZKTsKIAlpZiAoIW11dGV4X3RyeWxvY2soJmRlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX211dGV4KSkKQEAgLTIzMzEsNyArMjMzOSw3IEBACiAJCWdvdG8gb3V0X2VycjsKIAltMiA9ICZhbGlhcy0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXg7CiBvdXRfdW5hbGlhczoKLQlkX21vdmUoYWxpYXMsIGRlbnRyeSk7CisJX19kX21vdmUoYWxpYXMsIGRlbnRyeSk7CiAJcmV0ID0gYWxpYXM7CiBvdXRfZXJyOgogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKQEAgLTI0MTYsMTUgKzI0MjQsMjQgQEAKIAkJYWxpYXMgPSBfX2RfZmluZF9hbGlhcyhpbm9kZSwgMCk7CiAJCWlmIChhbGlhcykgewogCQkJYWN0dWFsID0gYWxpYXM7Ci0JCQkvKiBJcyB0aGlzIGFuIGFub255bW91cyBtb3VudHBvaW50IHRoYXQgd2UgY291bGQgc3BsaWNlCi0JCQkgKiBpbnRvIG91ciB0cmVlPyAqLwotCQkJaWYgKElTX1JPT1QoYWxpYXMpKSB7CisJCQl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7CisKKwkJCWlmIChkX2FuY2VzdG9yKGFsaWFzLCBkZW50cnkpKSB7CisJCQkJLyogQ2hlY2sgZm9yIGxvb3BzICovCisJCQkJYWN0dWFsID0gRVJSX1BUUigtRUxPT1ApOworCQkJfSBlbHNlIGlmIChJU19ST09UKGFsaWFzKSkgeworCQkJCS8qIElzIHRoaXMgYW4gYW5vbnltb3VzIG1vdW50cG9pbnQgdGhhdCB3ZQorCQkJCSAqIGNvdWxkIHNwbGljZSBpbnRvIG91ciB0cmVlPyAqLwogCQkJCV9fZF9tYXRlcmlhbGlzZV9kZW50cnkoZGVudHJ5LCBhbGlhcyk7CisJCQkJd3JpdGVfc2VxdW5sb2NrKCZyZW5hbWVfbG9jayk7CiAJCQkJX19kX2Ryb3AoYWxpYXMpOwogCQkJCWdvdG8gZm91bmQ7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vcGUsIGJ1dCB3ZSBtdXN0KCEpIGF2b2lkIGRpcmVjdG9yeQorCQkJCSAqIGFsaWFzaW5nICovCisJCQkJYWN0dWFsID0gX19kX3VuYWxpYXMoaW5vZGUsIGRlbnRyeSwgYWxpYXMpOwogCQkJfQotCQkJLyogTm9wZSwgYnV0IHdlIG11c3QoISkgYXZvaWQgZGlyZWN0b3J5IGFsaWFzaW5nICovCi0JCQlhY3R1YWwgPSBfX2RfdW5hbGlhcyhpbm9kZSwgZGVudHJ5LCBhbGlhcyk7CisJCQl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKIAkJCWlmIChJU19FUlIoYWN0dWFsKSkKIAkJCQlkcHV0KGFsaWFzKTsKIAkJCWdvdG8gb3V0X25vbG9jazsKZGlmZiAtLWdpdCBhL2ZzL2Rjb29raWVzLmMgYi9mcy9kY29va2llcy5jCmluZGV4IGEyMWNhYmQuLmRkYTBkYzcgMTAwNjQ0Ci0tLSBhL2ZzL2Rjb29raWVzLmMKKysrIGIvZnMvZGNvb2tpZXMuYwpAQCAtMTc4LDYgKzE3OCw4IEBACiAJLyogRklYTUU6IChkZWxldGVkKSA/ICovCiAJcGF0aCA9IGRfcGF0aCgmZGNzLT5wYXRoLCBrYnVmLCBQQUdFX1NJWkUpOwogCisJbXV0ZXhfdW5sb2NrKCZkY29va2llX211dGV4KTsKKwogCWlmIChJU19FUlIocGF0aCkpIHsKIAkJZXJyID0gUFRSX0VSUihwYXRoKTsKIAkJZ290byBvdXRfZnJlZTsKQEAgLTE5NCw2ICsxOTYsNyBAQAogCiBvdXRfZnJlZToKIAlrZnJlZShrYnVmKTsKKwlyZXR1cm4gZXJyOwogb3V0OgogCW11dGV4X3VubG9jaygmZGNvb2tpZV9tdXRleCk7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCBlYTVmNzQ4Li42MDc1YTFlIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC0xMDkzLDYgKzEwOTMsNyBAQAogCiAJYnBybS0+bW0gPSBOVUxMOwkJLyogV2UncmUgdXNpbmcgaXQgbm93ICovCiAKKwlzZXRfZnMoVVNFUl9EUyk7CiAJY3VycmVudC0+ZmxhZ3MgJj0gfihQRl9SQU5ET01JWkUgfCBQRl9LVEhSRUFEKTsKIAlmbHVzaF90aHJlYWQoKTsKIAljdXJyZW50LT5wZXJzb25hbGl0eSAmPSB+YnBybS0+cGVyX2NsZWFyOwpAQCAtMTM1NywxMCArMTM1OCw2IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCS8qIGtlcm5lbCBtb2R1bGUgbG9hZGVyIGZpeHVwICovCi0JLyogc28gd2UgZG9uJ3QgdHJ5IHRvIGxvYWQgcnVuIG1vZHByb2JlIGluIGtlcm5lbCBzcGFjZS4gKi8KLQlzZXRfZnMoVVNFUl9EUyk7Ci0KIAlyZXR2YWwgPSBhdWRpdF9icHJtKGJwcm0pOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC0xOTk5LDcgKzE5OTYsNyBAQAogICogaXMgYSBzcGVjaWFsIHZhbHVlIHRoYXQgd2UgdXNlIHRvIHRyYXAgcmVjdXJzaXZlCiAgKiBjb3JlIGR1bXBzCiAgKi8KLXN0YXRpYyBpbnQgdW1oX3BpcGVfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdW1oX3BpcGVfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldykKIHsKIAlzdHJ1Y3QgZmlsZSAqcnAsICp3cDsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvc3VwZXIuYyBiL2ZzL2V4b2ZzL3N1cGVyLmMKaW5kZXggMDYwNjViZC4uYzU3YmVkZCAxMDA2NDQKLS0tIGEvZnMvZXhvZnMvc3VwZXIuYworKysgYi9mcy9leG9mcy9zdXBlci5jCkBAIC05MTMsNyArOTEzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGlubyA9IGV4b2ZzX3BhcmVudF9pbm8oY2hpbGQpOwogCiAJaWYgKCFpbm8pCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAogCXJldHVybiBkX29idGFpbl9hbGlhcyhleG9mc19pZ2V0KGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmggYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCmluZGV4IDJlMjlhYmIuLjA5NWMzNmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKKysrIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaApAQCAtMTI1LDcgKzEyNSw3IEBACiAgKiBwb3NpdGl2ZSByZXRjb2RlIC0gc2lnbmFsIGZvciBleHQ0X2V4dF93YWxrX3NwYWNlKCksIHNlZSBiZWxvdwogICogY2FsbGJhY2sgbXVzdCByZXR1cm4gdmFsaWQgZXh0ZW50IChwYXNzZWQgb3IgbmV3bHkgY3JlYXRlZCkKICAqLwotdHlwZWRlZiBpbnQgKCpleHRfcHJlcGFyZV9jYWxsYmFjaykoc3RydWN0IGlub2RlICosIHN0cnVjdCBleHQ0X2V4dF9wYXRoICosCit0eXBlZGVmIGludCAoKmV4dF9wcmVwYXJlX2NhbGxiYWNrKShzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsCiAJCQkJCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqLAogCQkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKiwgdm9pZCAqKTsKIApAQCAtMTMzLDggKzEzMywxMSBAQAogI2RlZmluZSBFWFRfQlJFQUsgICAgICAxCiAjZGVmaW5lIEVYVF9SRVBFQVQgICAgIDIKIAotLyogTWF4aW11bSBsb2dpY2FsIGJsb2NrIGluIGEgZmlsZTsgZXh0NF9leHRlbnQncyBlZV9ibG9jayBpcyBfX2xlMzIgKi8KLSNkZWZpbmUgRVhUX01BWF9CTE9DSwkweGZmZmZmZmZmCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbG9naWNhbCBibG9ja3MgaW4gYSBmaWxlOyBleHQ0X2V4dGVudCdzIGVlX2Jsb2NrIGlzCisgKiBfX2xlMzIuCisgKi8KKyNkZWZpbmUgRVhUX01BWF9CTE9DS1MJMHhmZmZmZmZmZgogCiAvKgogICogRVhUX0lOSVRfTUFYX0xFTiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHdlIGNhbiBoYXZlIGluIGFuCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IDUxOTliYWMuLmY4MTVjYzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogCiAvKgogICogZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2s6Ci0gKiByZXR1cm5zIGFsbG9jYXRlZCBibG9jayBpbiBzdWJzZXF1ZW50IGV4dGVudCBvciBFWFRfTUFYX0JMT0NLLgorICogcmV0dXJucyBhbGxvY2F0ZWQgYmxvY2sgaW4gc3Vic2VxdWVudCBleHRlbnQgb3IgRVhUX01BWF9CTE9DS1MuCiAgKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXMKICAqIGFsbG9jYXRlZCBibG9jay4gVGh1cywgaW5kZXggZW50cmllcyBoYXZlIHRvIGJlIGNvbnNpc3RlbnQKICAqIHdpdGggbGVhdmVzLgpAQCAtMTQyMiw3ICsxNDIyLDcgQEAKIAlkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CiAKIAlpZiAoZGVwdGggPT0gMCAmJiBwYXRoLT5wX2V4dCA9PSBOVUxMKQotCQlyZXR1cm4gRVhUX01BWF9CTE9DSzsKKwkJcmV0dXJuIEVYVF9NQVhfQkxPQ0tTOwogCiAJd2hpbGUgKGRlcHRoID49IDApIHsKIAkJaWYgKGRlcHRoID09IHBhdGgtPnBfZGVwdGgpIHsKQEAgLTE0MzksMTIgKzE0MzksMTIgQEAKIAkJZGVwdGgtLTsKIAl9CiAKLQlyZXR1cm4gRVhUX01BWF9CTE9DSzsKKwlyZXR1cm4gRVhUX01BWF9CTE9DS1M7CiB9CiAKIC8qCiAgKiBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2s6Ci0gKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLCisgKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLUwogICovCiBzdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIAogCS8qIHplcm8tdHJlZSBoYXMgbm8gbGVhZiBibG9ja3MgYXQgYWxsICovCiAJaWYgKGRlcHRoID09IDApCi0JCXJldHVybiBFWFRfTUFYX0JMT0NLOworCQlyZXR1cm4gRVhUX01BWF9CTE9DS1M7CiAKIAkvKiBnbyB0byBpbmRleCBibG9jayAqLwogCWRlcHRoLS07CkBAIC0xNDY5LDcgKzE0NjksNyBAQAogCQlkZXB0aC0tOwogCX0KIAotCXJldHVybiBFWFRfTUFYX0JMT0NLOworCXJldHVybiBFWFRfTUFYX0JMT0NLUzsKIH0KIAogLyoKQEAgLTE2NzcsMTMgKzE2NzcsMTMgQEAKIAkgKi8KIAlpZiAoYjIgPCBiMSkgewogCQliMiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpOwotCQlpZiAoYjIgPT0gRVhUX01BWF9CTE9DSykKKwkJaWYgKGIyID09IEVYVF9NQVhfQkxPQ0tTKQogCQkJZ290byBvdXQ7CiAJfQogCiAJLyogY2hlY2sgZm9yIHdyYXAgdGhyb3VnaCB6ZXJvIG9uIGV4dGVudCBsb2dpY2FsIHN0YXJ0IGJsb2NrKi8KIAlpZiAoYjEgKyBsZW4xIDwgYjEpIHsKLQkJbGVuMSA9IEVYVF9NQVhfQkxPQ0sgLSBiMTsKKwkJbGVuMSA9IEVYVF9NQVhfQkxPQ0tTIC0gYjE7CiAJCW5ld2V4dC0+ZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuMSk7CiAJCXJldCA9IDE7CiAJfQpAQCAtMTc2Nyw3ICsxNzY3LDcgQEAKIAlmZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpOwogCW5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soaW5vZGUsIHBhdGgpOwogCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSA+IGxlMzJfdG9fY3B1KGZleC0+ZWVfYmxvY2spCi0JICAgICYmIG5leHQgIT0gRVhUX01BWF9CTE9DSykgeworCSAgICAmJiBuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7CiAJCWV4dF9kZWJ1ZygibmV4dCBsZWFmIGJsb2NrIC0gJWRcbiIsIG5leHQpOwogCQlCVUdfT04obnBhdGggIT0gTlVMTCk7CiAJCW5wYXRoID0gZXh0NF9leHRfZmluZF9leHRlbnQoaW5vZGUsIG5leHQsIE5VTEwpOwpAQCAtMTg4Nyw3ICsxODg3LDcgQEAKIAlCVUdfT04oZnVuYyA9PSBOVUxMKTsKIAlCVUdfT04oaW5vZGUgPT0gTlVMTCk7CiAKLQl3aGlsZSAoYmxvY2sgPCBsYXN0ICYmIGJsb2NrICE9IEVYVF9NQVhfQkxPQ0spIHsKKwl3aGlsZSAoYmxvY2sgPCBsYXN0ICYmIGJsb2NrICE9IEVYVF9NQVhfQkxPQ0tTKSB7CiAJCW51bSA9IGxhc3QgLSBibG9jazsKIAkJLyogZmluZCBleHRlbnQgZm9yIHRoaXMgYmxvY2sgKi8KIAkJZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKQEAgLTE5NTgsNyArMTk1OCw3IEBACiAJCQllcnIgPSAtRUlPOwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gZnVuYyhpbm9kZSwgcGF0aCwgJmNiZXgsIGV4LCBjYmRhdGEpOworCQllcnIgPSBmdW5jKGlub2RlLCBuZXh0LCAmY2JleCwgZXgsIGNiZGF0YSk7CiAJCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKIAogCQlpZiAoZXJyIDwgMCkKQEAgLTIwMjAsNyArMjAyMCw3IEBACiAJaWYgKGV4ID09IE5VTEwpIHsKIAkJLyogdGhlcmUgaXMgbm8gZXh0ZW50IHlldCwgc28gZ2FwIGlzIFswOy1dICovCiAJCWxibG9jayA9IDA7Ci0JCWxlbiA9IEVYVF9NQVhfQkxPQ0s7CisJCWxlbiA9IEVYVF9NQVhfQkxPQ0tTOwogCQlleHRfZGVidWcoImNhY2hlIGdhcCh3aG9sZSBmaWxlKToiKTsKIAl9IGVsc2UgaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSkgewogCQlsYmxvY2sgPSBibG9jazsKQEAgLTIzNTAsNyArMjM1MCw3IEBACiAJCQkgKiBuZXZlciBoYXBwZW4gYmVjYXVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGVuZCBwb2ludHMKIAkJCSAqIG5lZWRzIHRvIGJlIG9uIHRoZSBlZGdlIG9mIHRoZSBleHRlbnQuCiAJCQkgKi8KLQkJCWlmIChlbmQgPT0gRVhUX01BWF9CTE9DSykgeworCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKIAkJCQlleHRfZGVidWcoIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAogCQkJCQkJc3RhcnQsIGVuZCk7CiAJCQkJYmxvY2sgPSAwOwpAQCAtMjM5OCw3ICsyMzk4LDcgQEAKIAkJCSAqIElmIHRoaXMgaXMgYSB0cnVuY2F0ZSwgdGhpcyBjb25kaXRpb24KIAkJCSAqIHNob3VsZCBuZXZlciBoYXBwZW4KIAkJCSAqLwotCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLKSB7CisJCQlpZiAoZW5kID09IEVYVF9NQVhfQkxPQ0tTIC0gMSkgewogCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCiAJCQkJCXN0YXJ0LCBlbmQpOwogCQkJCWVyciA9IC1FSU87CkBAIC0yNDc4LDcgKzI0NzgsNyBAQAogCQkgKiB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsZWFmCiAJCSAqLwogCQlpZiAobnVtID09IDApIHsKLQkJCWlmIChlbmQgIT0gRVhUX01BWF9CTE9DSykgeworCQkJaWYgKGVuZCAhPSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKIAkJCQkvKgogCQkJCSAqIEZvciBob2xlIHB1bmNoaW5nLCB3ZSBuZWVkIHRvIHNjb290IGFsbCB0aGUKIAkJCQkgKiBleHRlbnRzIHVwIHdoZW4gYW4gZXh0ZW50IGlzIHJlbW92ZWQgc28gdGhhdApAQCAtMzY5OSw3ICszNjk5LDcgQEAKIAogCWxhc3RfYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpCiAJCQk+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7Ci0JZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLKTsKKwllcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CiAKIAkvKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsCiAJICogdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCkBAIC0zOTE0LDE0ICszOTE0LDEzIEBACiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIGV4dGVudCB0byBnYXRoZXIgRklFTUFQIGluZm9ybWF0aW9uLgogICovCi1zdGF0aWMgaW50IGV4dDRfZXh0X2ZpZW1hcF9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKK3N0YXRpYyBpbnQgZXh0NF9leHRfZmllbWFwX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IG5leHQsCiAJCSAgICAgICBzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgKm5ld2V4LCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAogCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKIAlfX3U2NAlsb2dpY2FsOwogCV9fdTY0CXBoeXNpY2FsOwogCV9fdTY0CWxlbmd0aDsKLQlsb2ZmX3QJc2l6ZTsKIAlfX3UzMglmbGFncyA9IDA7CiAJaW50CQlyZXQgPSAwOwogCXN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8gPSBkYXRhOwpAQCAtNDEwMyw4ICs0MTAyLDcgQEAKIAlpZiAoZXggJiYgZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpCiAJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOOwogCi0Jc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlpZiAobG9naWNhbCArIGxlbmd0aCA+PSBzaXplKQorCWlmIChuZXh0ID09IEVYVF9NQVhfQkxPQ0tTKQogCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX0xBU1Q7CiAKIAlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChmaWVpbmZvLCBsb2dpY2FsLCBwaHlzaWNhbCwKQEAgLTQzNDcsOCArNDM0NSw4IEBACiAKIAkJc3RhcnRfYmxrID0gc3RhcnQgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJCWxhc3RfYmxrID0gKHN0YXJ0ICsgbGVuIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCWlmIChsYXN0X2JsayA+PSBFWFRfTUFYX0JMT0NLKQotCQkJbGFzdF9ibGsgPSBFWFRfTUFYX0JMT0NLLTE7CisJCWlmIChsYXN0X2JsayA+PSBFWFRfTUFYX0JMT0NLUykKKwkJCWxhc3RfYmxrID0gRVhUX01BWF9CTE9DS1MtMTsKIAkJbGVuX2Jsa3MgPSAoKGV4dDRfbGJsa190KSBsYXN0X2JsaykgLSBzdGFydF9ibGsgKyAxOwogCiAJCS8qCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggYTU3NjNlMy4uZTMxMjZjMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMjYzNCw3ICsyNjM0LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhZ2VfYnVmcyA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAKLQl0cmFjZV9leHQ0X3dyaXRlcGFnZShpbm9kZSwgcGFnZSk7CisJdHJhY2VfZXh0NF93cml0ZXBhZ2UocGFnZSk7CiAJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlpZiAocGFnZS0+aW5kZXggPT0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggODU5ZjJhZS4uNmVkODU5ZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM1NzgsOCArMzU3OCw4IEBACiAJCWZyZWUgKz0gbmV4dCAtIGJpdDsKIAogCQl0cmFjZV9leHQ0X21iYWxsb2NfZGlzY2FyZChzYiwgTlVMTCwgZ3JvdXAsIGJpdCwgbmV4dCAtIGJpdCk7Ci0JCXRyYWNlX2V4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYShzYiwgcGEtPnBhX2lub2RlLCBwYSwKLQkJCQkJICAgICAgIGdycF9ibGtfc3RhcnQgKyBiaXQsIG5leHQgLSBiaXQpOworCQl0cmFjZV9leHQ0X21iX3JlbGVhc2VfaW5vZGVfcGEocGEsIGdycF9ibGtfc3RhcnQgKyBiaXQsCisJCQkJCSAgICAgICBuZXh0IC0gYml0KTsKIAkJbWJfZnJlZV9ibG9ja3MocGEtPnBhX2lub2RlLCBlNGIsIGJpdCwgbmV4dCAtIGJpdCk7CiAJCWJpdCA9IG5leHQgKyAxOwogCX0KQEAgLTM2MDgsNyArMzYwOCw3IEBACiAJZXh0NF9ncm91cF90IGdyb3VwOwogCWV4dDRfZ3JwYmxrX3QgYml0OwogCi0JdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2dyb3VwX3BhKHNiLCBwYSk7CisJdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2dyb3VwX3BhKHBhKTsKIAlCVUdfT04ocGEtPnBhX2RlbGV0ZWQgPT0gMCk7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgcGEtPnBhX3BzdGFydCwgJmdyb3VwLCAmYml0KTsKIAlCVUdfT04oZ3JvdXAgIT0gZTRiLT5iZF9ncm91cCAmJiBwYS0+cGFfbGVuICE9IDApOwpAQCAtNDQ0OCw3ICs0NDQ4LDcgQEAKICAqIEBpbm9kZToJCWlub2RlCiAgKiBAYmxvY2s6CQlzdGFydCBwaHlzaWNhbCBibG9jayB0byBmcmVlCiAgKiBAY291bnQ6CQludW1iZXIgb2YgYmxvY2tzIHRvIGNvdW50Ci0gKiBAbWV0YWRhdGE6IAkJQXJlIHRoZXNlIG1ldGFkYXRhIGJsb2NrcworICogQGZsYWdzOgkJZmxhZ3MgdXNlZCBieSBleHQ0X2ZyZWVfYmxvY2tzCiAgKi8KIHZvaWQgZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2ssCmRpZmYgLS1naXQgYS9mcy9leHQ0L21vdmVfZXh0ZW50LmMgYi9mcy9leHQ0L21vdmVfZXh0ZW50LmMKaW5kZXggMmI4MzA0Yi4uZjU3NDU1YSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCisrKyBiL2ZzL2V4dDQvbW92ZV9leHRlbnQuYwpAQCAtMTAwMiwxMiArMTAwMiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoKG9yaWdfc3RhcnQgPiBFWFRfTUFYX0JMT0NLKSB8fAotCSAgICAoZG9ub3Jfc3RhcnQgPiBFWFRfTUFYX0JMT0NLKSB8fAotCSAgICAoKmxlbiA+IEVYVF9NQVhfQkxPQ0spIHx8Ci0JICAgIChvcmlnX3N0YXJ0ICsgKmxlbiA+IEVYVF9NQVhfQkxPQ0spKSAgeworCWlmICgob3JpZ19zdGFydCA+PSBFWFRfTUFYX0JMT0NLUykgfHwKKwkgICAgKGRvbm9yX3N0YXJ0ID49IEVYVF9NQVhfQkxPQ0tTKSB8fAorCSAgICAoKmxlbiA+IEVYVF9NQVhfQkxPQ0tTKSB8fAorCSAgICAob3JpZ19zdGFydCArICpsZW4gPj0gRVhUX01BWF9CTE9DS1MpKSAgewogCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBDYW4ndCBoYW5kbGUgb3ZlciBbJXVdIGJsb2NrcyAiCi0JCQkiW2lubzpvcmlnICVsdSwgZG9ub3IgJWx1XVxuIiwgRVhUX01BWF9CTE9DSywKKwkJCSJbaW5vOm9yaWcgJWx1LCBkb25vciAlbHVdXG4iLCBFWFRfTUFYX0JMT0NLUywKIAkJCW9yaWdfaW5vZGUtPmlfaW5vLCBkb25vcl9pbm9kZS0+aV9pbm8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggY2M1YzE1Ny4uOWVhNzFhYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMjI0Myw2ICsyMjQzLDEyIEBACiAgKiBpbiB0aGUgdmZzLiAgZXh0NCBpbm9kZSBoYXMgNDggYml0cyBvZiBpX2Jsb2NrIGluIGZzYmxvY2sgdW5pdHMsCiAgKiBzbyB0aGF0IHdvbid0IGJlIGEgbGltaXRpbmcgZmFjdG9yLgogICoKKyAqIEhvd2V2ZXIgdGhlcmUgaXMgb3RoZXIgbGltaXRpbmcgZmFjdG9yLiBXZSBkbyBzdG9yZSBleHRlbnRzIGluIHRoZSBmb3JtCisgKiBvZiBzdGFydGluZyBibG9jayBhbmQgbGVuZ3RoLCBoZW5jZSB0aGUgcmVzdWx0aW5nIGxlbmd0aCBvZiB0aGUgZXh0ZW50CisgKiBjb3ZlcmluZyBtYXhpbXVtIGZpbGUgc2l6ZSBtdXN0IGZpdCBpbnRvIG9uLWRpc2sgZm9ybWF0IGNvbnRhaW5lcnMgYXMKKyAqIHdlbGwuIEdpdmVuIHRoYXQgbGVuZ3RoIGlzIGFsd2F5cyBieSAxIHVuaXQgYmlnZ2VyIHRoYW4gbWF4IHVuaXQgKGJlY2F1c2UKKyAqIHdlIGNvdW50IDAgYXMgd2VsbCkgd2UgaGF2ZSB0byBsb3dlciB0aGUgc19tYXhieXRlcyBieSBvbmUgZnMgYmxvY2suCisgKgogICogTm90ZSwgdGhpcyBkb2VzICpub3QqIGNvbnNpZGVyIGFueSBtZXRhZGF0YSBvdmVyaGVhZCBmb3IgdmZzIGlfYmxvY2tzLgogICovCiBzdGF0aWMgbG9mZl90IGV4dDRfbWF4X3NpemUoaW50IGJsa2JpdHMsIGludCBoYXNfaHVnZV9maWxlcykKQEAgLTIyNjQsMTAgKzIyNzAsMTMgQEAKIAkJdXBwZXJfbGltaXQgPDw9IGJsa2JpdHM7CiAJfQogCi0JLyogMzItYml0IGV4dGVudC1zdGFydCBjb250YWluZXIsIGVlX2Jsb2NrICovCi0JcmVzID0gMUxMIDw8IDMyOworCS8qCisJICogMzItYml0IGV4dGVudC1zdGFydCBjb250YWluZXIsIGVlX2Jsb2NrLiBXZSBsb3dlciB0aGUgbWF4Ynl0ZXMKKwkgKiBieSBvbmUgZnMgYmxvY2ssIHNvIGVlX2xlbiBjYW4gY292ZXIgdGhlIGV4dGVudCBvZiBtYXhpbXVtIGZpbGUKKwkgKiBzaXplCisJICovCisJcmVzID0gKDFMTCA8PCAzMikgLSAxOwogCXJlcyA8PD0gYmxrYml0czsKLQlyZXMgLT0gMTsKIAogCS8qIFNhbml0eSBjaGVjayBhZ2FpbnN0IHZtLSAmIHZmcy0gaW1wb3NlZCBsaW1pdHMgKi8KIAlpZiAocmVzID4gdXBwZXJfbGltaXQpCmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCA3MjU3NzUyLi43MDE4ZTFkIDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQlpZiAoYXR0ciAmIEFUVFJfU1lTKQogCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJCWVsc2UKLQkJCWlub2RlLT5pX2ZsYWdzICY9IFNfSU1NVVRBQkxFOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOwogCX0KIAogCWZhdF9zYXZlX2F0dHJzKGlub2RlLCBhdHRyKTsKZGlmZiAtLWdpdCBhL2ZzL2ZzY2FjaGUvcGFnZS5jIGIvZnMvZnNjYWNoZS9wYWdlLmMKaW5kZXggYTJhNWQxOS4uMmYzNDNiNCAxMDA2NDQKLS0tIGEvZnMvZnNjYWNoZS9wYWdlLmMKKysrIGIvZnMvZnNjYWNoZS9wYWdlLmMKQEAgLTk1NCwzICs5NTQsNDcgQEAKIAlwYWdldmVjX3JlaW5pdChwYWdldmVjKTsKIH0KIEVYUE9SVF9TWU1CT0woZnNjYWNoZV9tYXJrX3BhZ2VzX2NhY2hlZCk7CisKKy8qCisgKiBVbmNhY2hlIGFsbCB0aGUgcGFnZXMgaW4gYW4gaW5vZGUgdGhhdCBhcmUgbWFya2VkIFBHX2ZzY2FjaGUsIGFzc3VtaW5nIHRoZW0KKyAqIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29va2llLgorICovCit2b2lkIF9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IG5leHQ7CisJaW50IGk7CisKKwlfZW50ZXIoIiVwLCVwIiwgY29va2llLCBpbm9kZSk7CisKKwlpZiAoIW1hcHBpbmcgfHwgbWFwcGluZy0+bnJwYWdlcyA9PSAwKSB7CisJCV9sZWF2ZSgiIFtubyBwYWdlc10iKTsKKwkJcmV0dXJuOworCX0KKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJbmV4dCA9IDA7CisJd2hpbGUgKG5leHQgPD0gKGxvZmZfdCktMSAmJgorCSAgICAgICBwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgbmV4dCwgUEFHRVZFQ19TSVpFKQorCSAgICAgICApIHsKKwkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKwkJCXBnb2ZmX3QgcGFnZV9pbmRleCA9IHBhZ2UtPmluZGV4OworCisJCQlBU1NFUlRDTVAocGFnZV9pbmRleCwgPj0sIG5leHQpOworCQkJbmV4dCA9IHBhZ2VfaW5kZXggKyAxOworCisJCQlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpIHsKKwkJCQlfX2ZzY2FjaGVfd2FpdF9vbl9wYWdlX3dyaXRlKGNvb2tpZSwgcGFnZSk7CisJCQkJX19mc2NhY2hlX3VuY2FjaGVfcGFnZShjb29raWUsIHBhZ2UpOworCQkJfQorCQl9CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CitFWFBPUlRfU1lNQk9MKF9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggY2M2ZWM0Yi4uMzhmODRjZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtOTIxLDYgKzkyMSw4IEBACiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfTUFORExPQ0spCiAJCWdvdG8gZXJyOwogCisJc2ItPnNfZmxhZ3MgJj0gfk1TX05PU0VDOworCiAJaWYgKCFwYXJzZV9mdXNlX29wdCgoY2hhciAqKSBkYXRhLCAmZCwgaXNfYmRldikpCiAJCWdvdG8gZXJyOwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2FvcHMuYyBiL2ZzL2dmczIvYW9wcy5jCmluZGV4IDgwMmFjNWUuLmY5ZmJiZTkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYW9wcy5jCisrKyBiL2ZzL2dmczIvYW9wcy5jCkBAIC0xMDY5LDYgKzEwNjksNyBAQAogCQlyZXR1cm4gMDsKIAogCWdmczJfbG9nX2xvY2soc2RwKTsKKwlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWhlYWQgPSBiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAlkbyB7CiAJCWlmIChhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpKQpAQCAtMTA4MCw2ICsxMDgxLDcgQEAKIAkJCWdvdG8gbm90X3Bvc3NpYmxlOwogCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKIAl9IHdoaWxlKGJoICE9IGhlYWQpOworCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2FpbF9sb2NrKTsKIAlnZnMyX2xvZ191bmxvY2soc2RwKTsKIAogCWhlYWQgPSBiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKQEAgLTExMTIsNiArMTExNCw3IEBACiAJV0FSTl9PTihidWZmZXJfZGlydHkoYmgpKTsKIAlXQVJOX09OKGJ1ZmZlcl9waW5uZWQoYmgpKTsKIGNhbm5vdF9yZWxlYXNlOgorCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2FpbF9sb2NrKTsKIAlnZnMyX2xvZ191bmxvY2soc2RwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suYyBiL2ZzL2dmczIvZ2xvY2suYwppbmRleCAyNzkyYTc5Li4xYzEzMzZlIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmMKKysrIGIvZnMvZ2ZzMi9nbG9jay5jCkBAIC02NjMsMTQgKzY2MywxOSBAQAogCQlkcm9wX3JlZiA9IDE7CiAJfQogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoR0xGX1BFTkRJTkdfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKSAmJgorCWlmICh0ZXN0X2JpdChHTEZfUEVORElOR19ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpICYmCiAJICAgIGdsLT5nbF9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCAmJgogCSAgICBnbC0+Z2xfZGVtb3RlX3N0YXRlICE9IExNX1NUX0VYQ0xVU0lWRSkgewogCQl1bnNpZ25lZCBsb25nIGhvbGR0aW1lLCBub3cgPSBqaWZmaWVzOworCiAJCWhvbGR0aW1lID0gZ2wtPmdsX3RjaGFuZ2UgKyBnbC0+Z2xfb3BzLT5nb19taW5faG9sZF90aW1lOwogCQlpZiAodGltZV9iZWZvcmUobm93LCBob2xkdGltZSkpCiAJCQlkZWxheSA9IGhvbGR0aW1lIC0gbm93OwotCQlzZXRfYml0KGRlbGF5ID8gR0xGX1BFTkRJTkdfREVNT1RFIDogR0xGX0RFTU9URSwgJmdsLT5nbF9mbGFncyk7CisKKwkJaWYgKCFkZWxheSkgeworCQkJY2xlYXJfYml0KEdMRl9QRU5ESU5HX0RFTU9URSwgJmdsLT5nbF9mbGFncyk7CisJCQlzZXRfYml0KEdMRl9ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpOworCQl9CiAJfQogCXJ1bl9xdWV1ZShnbCwgMCk7CiAJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvcHMuYyBiL2ZzL2dmczIvZ2xvcHMuYwppbmRleCA4ZWY3MGY0Li4yY2NhMjkzIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmMKKysrIGIvZnMvZ2ZzMi9nbG9wcy5jCkBAIC00NywxMCArNDcsMTAgQEAKIAkJCQliZF9haWxfZ2xfbGlzdCk7CiAJCWJoID0gYmQtPmJkX2JoOwogCQlnZnMyX3JlbW92ZV9mcm9tX2FpbChiZCk7Ci0JCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2FpbF9sb2NrKTsKLQogCQliZC0+YmRfYmggPSBOVUxMOwogCQliaC0+Yl9wcml2YXRlID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOworCiAJCWJkLT5iZF9ibGtubyA9IGJoLT5iX2Jsb2NrbnI7CiAJCWdmczJfbG9nX2xvY2soc2RwKTsKIAkJZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCAhYnVmZmVyX2J1c3koYmgpKTsKQEAgLTIyMSw4ICsyMjEsMTAgQEAKIAkJfQogCX0KIAotCWlmIChpcCA9PSBHRlMyX0koZ2wtPmdsX3NiZC0+c2RfcmluZGV4KSkKKwlpZiAoaXAgPT0gR0ZTMl9JKGdsLT5nbF9zYmQtPnNkX3JpbmRleCkpIHsKKwkJZ2ZzMl9sb2dfZmx1c2goZ2wtPmdsX3NiZCwgTlVMTCk7CiAJCWdsLT5nbF9zYmQtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDA7CisJfQogCWlmIChpcCAmJiBTX0lTUkVHKGlwLT5pX2lub2RlLmlfbW9kZSkpCiAJCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlwLT5pX2lub2RlLmlfbWFwcGluZywgMCk7CiB9CmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCAwYTA2NGU5Li44MTIwNmU3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdF9ibC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogI2RlZmluZSBESU9fV0FJVAkweDAwMDAwMDEwCiAjZGVmaW5lIERJT19NRVRBREFUQQkweDAwMDAwMDIwCkBAIC01NDYsNiArNTQ3LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqc2RfdHJhbnNfZ2w7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgc2RfZ2xvY2tfd2FpdDsKIAlhdG9taWNfdCBzZF9nbG9ja19kaXNwb3NhbDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzZF9sb2NraW5nX2luaXQ7CiAKIAkvKiBJbm9kZSBTdHVmZiAqLwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvZy5jIGIvZnMvZ2ZzMi9sb2cuYwppbmRleCA5MDMxMTVmLi44NWM2MjkyIDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvZy5jCisrKyBiL2ZzL2dmczIvbG9nLmMKQEAgLTkwMyw2ICs5MDMsNyBAQAogCQlpZiAoZ2ZzMl9haWwxX2VtcHR5KHNkcCkpCiAJCQlicmVhazsKIAl9CisJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2ZzMl9qcm5sX2ZsdXNoX3JlcWQoc3RydWN0IGdmczJfc2JkICpzZHApCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19mc3R5cGUuYyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCmluZGV4IDhhYzlhZTEuLjJhNzcwNzEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCisrKyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCkBAIC03Miw2ICs3Miw3IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZHAtPnNkX2dsb2NrX3dhaXQpOwogCWF0b21pY19zZXQoJnNkcC0+c2RfZ2xvY2tfZGlzcG9zYWwsIDApOworCWluaXRfY29tcGxldGlvbigmc2RwLT5zZF9sb2NraW5nX2luaXQpOwogCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX3N0YXRmc19zcGluKTsKIAogCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX3JpbmRleF9zcGluKTsKQEAgLTEwMTcsMTEgKzEwMTgsMTMgQEAKIAkJZnNuYW1lKys7CiAJaWYgKGxtLT5sbV9tb3VudCA9PSBOVUxMKSB7CiAJCWZzX2luZm8oc2RwLCAiTm93IG1vdW50aW5nIEZTLi4uXG4iKTsKKwkJY29tcGxldGUoJnNkcC0+c2RfbG9ja2luZ19pbml0KTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldCA9IGxtLT5sbV9tb3VudChzZHAsIGZzbmFtZSk7CiAJaWYgKHJldCA9PSAwKQogCQlmc19pbmZvKHNkcCwgIkpvaW5lZCBjbHVzdGVyLiBOb3cgbW91bnRpbmcgRlMuLi5cbiIpOworCWNvbXBsZXRlKCZzZHAtPnNkX2xvY2tpbmdfaW5pdCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5jIGIvZnMvZ2ZzMi9zdXBlci5jCmluZGV4IGVkNTQwZTcuLmZiMGVkZjcgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuYworKysgYi9mcy9nZnMyL3N1cGVyLmMKQEAgLTc1NywxMyArNzU3LDE3IEBACiAJc3RydWN0IHRpbWVzcGVjIGF0aW1lOwogCXN0cnVjdCBnZnMyX2Rpbm9kZSAqZGk7CiAJaW50IHJldCA9IC1FQUdBSU47CisJaW50IHVubG9ja19yZXF1aXJlZCA9IDA7CiAKIAkvKiBTa2lwIHRpbWVzdGFtcCB1cGRhdGUsIGlmIHRoaXMgaXMgZnJvbSBhIG1lbWFsbG9jICovCiAJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpCiAJCWdvdG8gZG9fZmx1c2g7Ci0JcmV0ID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsICZnaCk7Ci0JaWYgKHJldCkKLQkJZ290byBkb19mbHVzaDsKKwlpZiAoIWdmczJfZ2xvY2tfaXNfbG9ja2VkX2J5X21lKGlwLT5pX2dsKSkgeworCQlyZXQgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZG9fZmx1c2g7CisJCXVubG9ja19yZXF1aXJlZCA9IDE7CisJfQogCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFLCAwKTsKIAlpZiAocmV0KQogCQlnb3RvIGRvX3VubG9jazsKQEAgLTc4MCw3ICs3ODQsOCBAQAogCX0KIAlnZnMyX3RyYW5zX2VuZChzZHApOwogZG9fdW5sb2NrOgotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7CisJaWYgKHVubG9ja19yZXF1aXJlZCkKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKIGRvX2ZsdXNoOgogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKIAkJZ2ZzMl9sb2dfZmx1c2goR0ZTMl9TQihpbm9kZSksIGlwLT5pX2dsKTsKQEAgLTE0MjcsNyArMTQzMiwyMCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoKKy8qKgorICogZ2ZzMl9ldmljdF9pbm9kZSAtIFJlbW92ZSBhbiBpbm9kZSBmcm9tIGNhY2hlCisgKiBAaW5vZGU6IFRoZSBpbm9kZSB0byBldmljdAorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBjb25zaWRlcjoKKyAqIDEuIGlfbmxpbmsgPT0gMCwgd2UgYXJlIGZpbmFsIG9wZW5lciAoYW5kIG11c3QgZGVhbGxvY2F0ZSkKKyAqIDIuIGlfbmxpbmsgPT0gMCwgd2UgYXJlIG5vdCB0aGUgZmluYWwgb3BlbmVyIChhbmQgY2Fubm90IGRlYWxsb2NhdGUpCisgKiAzLiBpX25saW5rID4gMAorICoKKyAqIElmIHRoZSBmcyBpcyByZWFkIG9ubHksIHRoZW4gd2UgaGF2ZSB0byB0cmVhdCBhbGwgY2FzZXMgYXMgcGVyICMzCisgKiBzaW5jZSB3ZSBhcmUgdW5hYmxlIHRvIGRvIGFueSBkZWFsbG9jYXRpb24uIFRoZSBpbm9kZSB3aWxsIGJlCisgKiBkZWFsbG9jYXRlZCBieSB0aGUgbmV4dCByZWFkL3dyaXRlIG5vZGUgdG8gYXR0ZW1wdCBhbiBhbGxvY2F0aW9uCisgKiBpbiB0aGUgc2FtZSByZXNvdXJjZSBncm91cAorICoKICAqIFdlIGhhdmUgdG8gKGF0IHRoZSBtb21lbnQpIGhvbGQgdGhlIGlub2RlcyBtYWluIGxvY2sgdG8gY292ZXIKICAqIHRoZSBnYXAgYmV0d2VlbiB1bmxvY2tpbmcgdGhlIHNoYXJlZCBsb2NrIG9uIHRoZSBpb3BlbiBsb2NrIGFuZAogICogdGFraW5nIHRoZSBleGNsdXNpdmUgbG9jay4gSSdkIHJhdGhlciBkbyBhIHNoYXJlZCAtPiBleGNsdXNpdmUKQEAgLTE0NzAsNiArMTQ4OCw4IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF90cnVuY2F0ZTsKIAorCS8qIENhc2UgMSBzdGFydHMgaGVyZSAqLworCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKIAkgICAgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKIAkJZXJyb3IgPSBnZnMyX2Rpcl9leGhhc2hfZGVhbGxvYyhpcCk7CkBAIC0xNDkzLDEzICsxNTEzLDE2IEBACiAJZ290byBvdXRfdW5sb2NrOwogCiBvdXRfdHJ1bmNhdGU6CisJLyogQ2FzZSAyIHN0YXJ0cyBoZXJlICovCiAJZXJyb3IgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgMCwgc2RwLT5zZF9qZGVzYy0+amRfYmxvY2tzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKLQlnZnMyX2ZpbmFsX3JlbGVhc2VfcGFnZXMoaXApOworCS8qIE5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGdsb2NrIHJlbGVhc2UgJiBhbHNvIGluIGEgdHJhbnNhY3Rpb24gKi8KKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAogb3V0X3VubG9jazoKKwkvKiBFcnJvciBwYXRoIGZvciBjYXNlIDEgKi8KIAlpZiAodGVzdF9iaXQoSElGX0hPTERFUiwgJmlwLT5pX2lvcGVuX2doLmdoX2lmbGFncykpCiAJCWdmczJfZ2xvY2tfZHEoJmlwLT5pX2lvcGVuX2doKTsKIAlnZnMyX2hvbGRlcl91bmluaXQoJmlwLT5pX2lvcGVuX2doKTsKQEAgLTE1MDcsNiArMTUzMCw3IEBACiAJaWYgKGVycm9yICYmIGVycm9yICE9IEdMUl9UUllGQUlMRUQgJiYgZXJyb3IgIT0gLUVST0ZTKQogCQlmc193YXJuKHNkcCwgImdmczJfZXZpY3RfaW5vZGU6ICVkXG4iLCBlcnJvcik7CiBvdXQ6CisJLyogQ2FzZSAzIHN0YXJ0cyBoZXJlICovCiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWVuZF93cml0ZWJhY2soaW5vZGUpOwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3N5cy5jIGIvZnMvZ2ZzMi9zeXMuYwppbmRleCBlMjBlYWIzLi40NDNjYWJjIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N5cy5jCisrKyBiL2ZzL2dmczIvc3lzLmMKQEAgLTMzOCw2ICszMzgsOSBAQAogCXJ2ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmZpcnN0KTsKIAlpZiAocnYgIT0gMSB8fCBmaXJzdCA+IDEpCiAJCXJldHVybiAtRUlOVkFMOworCXJ2ID0gd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZSgmc2RwLT5zZF9sb2NraW5nX2luaXQpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OwogCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CiAJcnYgPSAtRUJVU1k7CiAJaWYgKHRlc3RfYml0KFNERl9OT0pPVVJOQUxJRCwgJnNkcC0+c2RfZmxhZ3MpID09IDApCkBAIC00MTQsNyArNDE3LDkgQEAKIAlydiA9IHNzY2FuZihidWYsICIlZCIsICZqaWQpOwogCWlmIChydiAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQorCXJ2ID0gd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZSgmc2RwLT5zZF9sb2NraW5nX2luaXQpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OwogCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CiAJcnYgPSAtRUlOVkFMOwogCWlmIChzZHAtPnNkX2xvY2tzdHJ1Y3QubHNfb3BzLT5sbV9tb3VudCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9zdXBlci5jIGIvZnMvaGZzcGx1cy9zdXBlci5jCmluZGV4IGI0OWI1NTUuLjg0YTQ3YjcgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvc3VwZXIuYworKysgYi9mcy9oZnNwbHVzL3N1cGVyLmMKQEAgLTUwMCw3ICs1MDAsNyBAQAogb3V0X3B1dF9oaWRkZW5fZGlyOgogCWlwdXQoc2JpLT5oaWRkZW5fZGlyKTsKIG91dF9wdXRfcm9vdDoKLQlpcHV0KHNiaS0+YWxsb2NfZmlsZSk7CisJaXB1dChyb290KTsKIG91dF9wdXRfYWxsb2NfZmlsZToKIAlpcHV0KHNiaS0+YWxsb2NfZmlsZSk7CiBvdXRfY2xvc2VfY2F0X3RyZWU6CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3dyYXBwZXIuYyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCmluZGV4IDMwMzFkODEuLjRhYzg4ZmYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvd3JhcHBlci5jCisrKyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCkBAIC0zNiw2ICszNiw3IEBACiB7CiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7CiAJc3RydWN0IGJpbyAqYmlvOworCWludCByZXQgPSAwOwogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCAxKTsKIAliaW8tPmJpX3NlY3RvciA9IHNlY3RvcjsKQEAgLTU0LDggKzU1LDEwIEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CiAKIAlpZiAoIWJpb19mbGFnZ2VkKGJpbywgQklPX1VQVE9EQVRFKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7CisJCXJldCA9IC1FSU87CisKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBoZnNwbHVzX3JlYWRfbWRiKHZvaWQgKmJ1ZnB0ciwgc3RydWN0IGhmc3BsdXNfd2QgKndkKQpkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvaHBwZnMuYyBiL2ZzL2hwcGZzL2hwcGZzLmMKaW5kZXggODdlZDQ4ZS4uODVjMDk4YSAxMDA2NDQKLS0tIGEvZnMvaHBwZnMvaHBwZnMuYworKysgYi9mcy9ocHBmcy9ocHBmcy5jCkBAIC0xMzksNyArMTM5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpocHBmc19sb29rdXAoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSwgKm5ldywgKnBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSwgKnBhcmVudDsKKwlzdHJ1Y3QgcXN0ciAqbmFtZSA9ICZkZW50cnktPmRfbmFtZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBlcnIsIGRlbGV0ZWQ7CiAKQEAgLTE0OSwyMyArMTUwLDkgQEAKIAllbHNlIGlmIChkZWxldGVkKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAotCWVyciA9IC1FTk9NRU07CiAJcGFyZW50ID0gSFBQRlNfSShpbm8pLT5wcm9jX2RlbnRyeTsKIAltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXByb2NfZGVudHJ5ID0gZF9sb29rdXAocGFyZW50LCAmZGVudHJ5LT5kX25hbWUpOwotCWlmIChwcm9jX2RlbnRyeSA9PSBOVUxMKSB7Ci0JCXByb2NfZGVudHJ5ID0gZF9hbGxvYyhwYXJlbnQsICZkZW50cnktPmRfbmFtZSk7Ci0JCWlmIChwcm9jX2RlbnRyeSA9PSBOVUxMKSB7Ci0JCQltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQluZXcgPSAoKnBhcmVudC0+ZF9pbm9kZS0+aV9vcC0+bG9va3VwKShwYXJlbnQtPmRfaW5vZGUsCi0JCQkJCQkgICAgICAgcHJvY19kZW50cnksIE5VTEwpOwotCQlpZiAobmV3KSB7Ci0JCQlkcHV0KHByb2NfZGVudHJ5KTsKLQkJCXByb2NfZGVudHJ5ID0gbmV3OwotCQl9Ci0JfQorCXByb2NfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZS0+bmFtZSwgcGFyZW50LCBuYW1lLT5sZW4pOwogCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAogCWlmIChJU19FUlIocHJvY19kZW50cnkpKQpAQCAtMTc0LDEzICsxNjEsMTEgQEAKIAllcnIgPSAtRU5PTUVNOwogCWlub2RlID0gZ2V0X2lub2RlKGluby0+aV9zYiwgcHJvY19kZW50cnkpOwogCWlmICghaW5vZGUpCi0JCWdvdG8gb3V0X2RwdXQ7CisJCWdvdG8gb3V0OwogCiAgCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiBOVUxMOwogCi0gb3V0X2RwdXQ6Ci0JZHB1dChwcm9jX2RlbnRyeSk7CiAgb3V0OgogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC02OTAsOCArNjc1LDEwIEBACiAJc3RydWN0IGlub2RlICpwcm9jX2lubyA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKIAotCWlmICghaW5vZGUpCisJaWYgKCFpbm9kZSkgeworCQlkcHV0KGRlbnRyeSk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KIAogCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgewogCQlpbm9kZS0+aV9vcCA9ICZocHBmc19kaXJfaW9wczsKQEAgLTcwNCw3ICs2OTEsNyBAQAogCQlpbm9kZS0+aV9mb3AgPSAmaHBwZnNfZmlsZV9mb3BzOwogCX0KIAotCUhQUEZTX0koaW5vZGUpLT5wcm9jX2RlbnRyeSA9IGRnZXQoZGVudHJ5KTsKKwlIUFBGU19JKGlub2RlKS0+cHJvY19kZW50cnkgPSBkZW50cnk7CiAKIAlpbm9kZS0+aV91aWQgPSBwcm9jX2luby0+aV91aWQ7CiAJaW5vZGUtPmlfZ2lkID0gcHJvY19pbm8tPmlfZ2lkOwpAQCAtNzM3LDcgKzcyNCw3IEBACiAJc2ItPnNfZnNfaW5mbyA9IHByb2NfbW50OwogCiAJZXJyID0gLUVOT01FTTsKLQlyb290X2lub2RlID0gZ2V0X2lub2RlKHNiLCBwcm9jX21udC0+bW50X3NiLT5zX3Jvb3QpOworCXJvb3RfaW5vZGUgPSBnZXRfaW5vZGUoc2IsIGRnZXQocHJvY19tbnQtPm1udF9zYi0+c19yb290KSk7CiAJaWYgKCFyb290X2lub2RlKQogCQlnb3RvIG91dF9tbnRwdXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDBmN2U4OGEuLjQzNTY2ZDEgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtNDIzLDcgKzQyMywxNCBAQAogdm9pZCBlbmRfd3JpdGViYWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJbWlnaHRfc2xlZXAoKTsKKwkvKgorCSAqIFdlIGhhdmUgdG8gY3ljbGUgdHJlZV9sb2NrIGhlcmUgYmVjYXVzZSByZWNsYWltIGNhbiBiZSBzdGlsbCBpbiB0aGUKKwkgKiBwcm9jZXNzIG9mIHJlbW92aW5nIHRoZSBsYXN0IHBhZ2UgKGluIF9fZGVsZXRlX2Zyb21fcGFnZV9jYWNoZSgpKQorCSAqIGFuZCB3ZSBtdXN0IG5vdCBmcmVlIG1hcHBpbmcgdW5kZXIgaXQuCisJICovCisJc3Bpbl9sb2NrX2lycSgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOwogCUJVR19PTihpbm9kZS0+aV9kYXRhLm5ycGFnZXMpOworCXNwaW5fdW5sb2NrX2lycSgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOwogCUJVR19PTighbGlzdF9lbXB0eSgmaW5vZGUtPmlfZGF0YS5wcml2YXRlX2xpc3QpKTsKIAlCVUdfT04oIShpbm9kZS0+aV9zdGF0ZSAmIElfRlJFRUlORykpOwogCUJVR19PTihpbm9kZS0+aV9zdGF0ZSAmIElfQ0xFQVIpOwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKaW5kZXggM2RiNWJhNC4uYjNjYzg1OCAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvaW5vZGUuYworKysgYi9mcy9pc29mcy9pbm9kZS5jCkBAIC05NzQsNyArOTc0LDcgQEAKIG91dF9ub19yZWFkOgogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBicmVhZCBmYWlsZWQsIGRldj0lcywgaXNvX2Jsa251bT0lZCwgYmxvY2s9JWRcbiIsCiAJCV9fZnVuY19fLCBzLT5zX2lkLCBpc29fYmxrbnVtLCBibG9jayk7Ci0JZ290byBvdXRfZnJlZXNiaTsKKwlnb3RvIG91dF9mcmVlYmg7CiBvdXRfYmFkX3pvbmVfc2l6ZToKIAlwcmludGsoS0VSTl9XQVJOSU5HICJJU09GUzogQmFkIGxvZ2ljYWwgem9uZSBzaXplICVsZFxuIiwKIAkJc2JpLT5zX2xvZ196b25lX3NpemUpOwpAQCAtOTg5LDYgKzk4OSw3IEBACiAKIG91dF9mcmVlYmg6CiAJYnJlbHNlKGJoKTsKKwlicmVsc2UocHJpX2JoKTsKIG91dF9mcmVlc2JpOgogCWtmcmVlKG9wdC5pb2NoYXJzZXQpOwogCWtmcmVlKHNiaSk7CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NoZWNrcG9pbnQuYyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCmluZGV4IDZhNzlmZDAuLjJjNjJjNWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCkBAIC05NywxMCArOTcsMTQgQEAKIAogCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJgogCSAgICAhYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX3dyaXRlX2lvX2Vycm9yKGJoKSkgeworCQkvKgorCQkgKiBHZXQgb3VyIHJlZmVyZW5jZSBzbyB0aGF0IGJoIGNhbm5vdCBiZSBmcmVlZCBiZWZvcmUKKwkJICogd2UgdW5sb2NrIGl0CisJCSAqLworCQlnZXRfYmgoYmgpOwogCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CiAJCXJldCA9IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKSArIDE7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CiAJCUJVRkZFUl9UUkFDRShiaCwgInJlbGVhc2UiKTsKIAkJX19icmVsc2UoYmgpOwogCX0gZWxzZSB7CkBAIC0yMjMsOCArMjI3LDggQEAKIAkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQkJZ290byByZXN0YXJ0OwogCQl9CisJCWdldF9iaChiaCk7CiAJCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgewotCQkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOwogCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQkJd2FpdF9vbl9idWZmZXIoYmgpOwpAQCAtMjQzLDcgKzI0Nyw2IEBACiAJCSAqLwogCQlyZWxlYXNlZCA9IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKIAkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKIAkJX19icmVsc2UoYmgpOwogCX0KIApAQCAtMjg0LDcgKzI4Nyw3IEBACiAJaW50IHJldCA9IDA7CiAKIAlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOworCQlnZXRfYmgoYmgpOwogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIAkJd2FpdF9vbl9idWZmZXIoYmgpOwpAQCAtMzE2LDEyICszMTksMTIgQEAKIAkJcmV0ID0gMTsKIAkJaWYgKHVubGlrZWx5KGJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpKQogCQkJcmV0ID0gLUVJTzsKKwkJZ2V0X2JoKGJoKTsKIAkJSl9BU1NFUlRfSkgoamgsICFidWZmZXJfamJkZGlydHkoYmgpKTsKIAkJQlVGRkVSX1RSQUNFKGJoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCIpOwogCQlfX2piZDJfam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCk7CiAJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CiAJCV9fYnJlbHNlKGJoKTsKIAl9IGVsc2UgewogCQkvKgpAQCAtNTU0LDcgKzU1Nyw4IEBACiAvKgogICogam91cm5hbF9jbGVhbl9vbmVfY3BfbGlzdAogICoKLSAqIEZpbmQgYWxsIHRoZSB3cml0dGVuLWJhY2sgY2hlY2twb2ludCBidWZmZXJzIGluIHRoZSBnaXZlbiBsaXN0IGFuZCByZWxlYXNlIHRoZW0uCisgKiBGaW5kIGFsbCB0aGUgd3JpdHRlbi1iYWNrIGNoZWNrcG9pbnQgYnVmZmVycyBpbiB0aGUgZ2l2ZW4gbGlzdCBhbmQKKyAqIHJlbGVhc2UgdGhlbS4KICAqCiAgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCiAgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgpAQCAtNjYzLDggKzY2Nyw4IEBACiAgKiBjaGVja3BvaW50IGxpc3RzLgogICoKICAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgaXQgZnJlZXMgdGhlIHRyYW5zYWN0aW9uLCAwIG90aGVyd2lzZS4KKyAqIFRoZSBmdW5jdGlvbiBjYW4gZnJlZSBqaCBhbmQgYmguCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkKICAqLwpAQCAtNjg0LDEzICs2ODgsMTQgQEAKIAl9CiAJam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CiAKKwlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZpbmcgZnJvbSB0cmFuc2FjdGlvbiIpOwogCV9fYnVmZmVyX3VubGluayhqaCk7CiAJamgtPmJfY3BfdHJhbnNhY3Rpb24gPSBOVUxMOworCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKIAogCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgIT0gTlVMTCB8fAogCSAgICB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgIT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JSkJVRkZFUl9UUkFDRShqaCwgInRyYW5zYWN0aW9uIGhhcyBubyBtb3JlIGJ1ZmZlcnMiKTsKIAogCS8qCiAJICogVGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSB0byB3b3JyeSBhYm91dDogaWYgd2UgaGF2ZSBqdXN0IHB1bGxlZCB0aGUKQEAgLTcwMSwxMCArNzA2LDggQEAKIAkgKiBUaGUgbG9ja2luZyBoZXJlIGFyb3VuZCB0X3N0YXRlIGlzIGEgYml0IHNsZWF6eS4KIAkgKiBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiBqYmQyX2pvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKCkuCiAJICovCi0JaWYgKHRyYW5zYWN0aW9uLT50X3N0YXRlICE9IFRfRklOSVNIRUQpIHsKLQkJSkJVRkZFUl9UUkFDRShqaCwgImJlbG9uZ3MgdG8gcnVubmluZy9jb21taXR0aW5nIHRyYW5zYWN0aW9uIik7CisJaWYgKHRyYW5zYWN0aW9uLT50X3N0YXRlICE9IFRfRklOSVNIRUQpCiAJCWdvdG8gb3V0OwotCX0KIAogCS8qIE9LLCB0aGF0IHdhcyB0aGUgbGFzdCBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbjogd2UgY2FuIG5vdwogCSAgIHNhZmVseSByZW1vdmUgdGhpcyB0cmFuc2FjdGlvbiBmcm9tIHRoZSBsb2cgKi8KQEAgLTcyMyw3ICs3MjYsNiBAQAogCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9sb2dzcGFjZSk7CiAJcmV0ID0gMTsKIG91dDoKLQlKQlVGRkVSX1RSQUNFKGpoLCAiZXhpdCIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc0Miw2ICs3NDQsOCBAQAogCUpfQVNTRVJUX0pIKGpoLCBidWZmZXJfZGlydHkoamgyYmgoamgpKSB8fCBidWZmZXJfamJkZGlydHkoamgyYmgoamgpKSk7CiAJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2NwX3RyYW5zYWN0aW9uID09IE5VTEwpOwogCisJLyogR2V0IHJlZmVyZW5jZSBmb3IgY2hlY2twb2ludGluZyB0cmFuc2FjdGlvbiAqLworCWpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChqaDJiaChqaCkpOwogCWpoLT5iX2NwX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CiAKIAlpZiAoIXRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCkgewpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggN2YyMWNmMy4uZWVmNjk3OSAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC04NDgsMTAgKzg0OCwxNiBAQAogCXdoaWxlIChjb21taXRfdHJhbnNhY3Rpb24tPnRfZm9yZ2V0KSB7CiAJCXRyYW5zYWN0aW9uX3QgKmNwX3RyYW5zYWN0aW9uOwogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlpbnQgdHJ5X3RvX2ZyZWUgPSAwOwogCiAJCWpoID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X2ZvcmdldDsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJYmggPSBqaDJiaChqaCk7CisJCS8qCisJCSAqIEdldCBhIHJlZmVyZW5jZSBzbyB0aGF0IGJoIGNhbm5vdCBiZSBmcmVlZCBiZWZvcmUgd2UgYXJlCisJCSAqIGRvbmUgd2l0aCBpdC4KKwkJICovCisJCWdldF9iaChiaCk7CiAJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAkJSl9BU1NFUlRfSkgoamgsCWpoLT5iX3RyYW5zYWN0aW9uID09IGNvbW1pdF90cmFuc2FjdGlvbik7CiAKQEAgLTkxNCwyOCArOTIwLDI3IEBACiAJCQlfX2piZDJfam91cm5hbF9pbnNlcnRfY2hlY2twb2ludChqaCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKIAkJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCiAJCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKLQkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgZm9yIGNoZWNrcG9pbnQgd3JpdGViYWNrIik7Ci0JCQlfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpoKTsKLQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQl9IGVsc2UgewogCQkJSl9BU1NFUlRfQkgoYmgsICFidWZmZXJfZGlydHkoYmgpKTsKLQkJCS8qIFRoZSBidWZmZXIgb24gQkpfRm9yZ2V0IGxpc3QgYW5kIG5vdCBqYmRkaXJ0eSBtZWFucworCQkJLyoKKwkJCSAqIFRoZSBidWZmZXIgb24gQkpfRm9yZ2V0IGxpc3QgYW5kIG5vdCBqYmRkaXJ0eSBtZWFucwogCQkJICogaXQgaGFzIGJlZW4gZnJlZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiBhbmQgaGVuY2UgaXQKIAkJCSAqIGNvdWxkIG5vdCBoYXZlIGJlZW4gcmVhbGxvY2F0ZWQgdW50aWwgdGhpcwogCQkJICogdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZC4gKkJVVCogaXQgY291bGQgYmUKIAkJCSAqIHJlYWxsb2NhdGVkIG9uY2Ugd2UgaGF2ZSB3cml0dGVuIGFsbCB0aGUgZGF0YSB0bwogCQkJICogZGlzayBhbmQgYmVmb3JlIHdlIHByb2Nlc3MgdGhlIGJ1ZmZlciBvbiBCSl9Gb3JnZXQKLQkJCSAqIGxpc3QuICovCi0JCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVmaWxlIG9yIHVuZmlsZSBmcmVlZCBidWZmZXIiKTsKLQkJCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOwotCQkJaWYgKCFqaC0+Yl90cmFuc2FjdGlvbikgewotCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQkJCSAvKiBuZWVkcyBhIGJyZWxzZSAqLwotCQkJCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQkJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsKLQkJCX0gZWxzZQotCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJICogbGlzdC4KKwkJCSAqLworCQkJaWYgKCFqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKQorCQkJCXRyeV90b19mcmVlID0gMTsKIAkJfQorCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVmaWxlIG9yIHVuZmlsZSBidWZmZXIiKTsKKwkJX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlpZiAodHJ5X3RvX2ZyZWUpCisJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsJLyogRHJvcHMgYmggcmVmZXJlbmNlICovCisJCWVsc2UKKwkJCV9fYnJlbHNlKGJoKTsKIAkJY29uZF9yZXNjaGVkX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggOWE3ODI2OS4uMGRmYTViNSAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTIwNzgsMTAgKzIwNzgsOSBAQAogICogV2hlbiBhIGJ1ZmZlciBoYXMgaXRzIEJIX0pCRCBiaXQgc2V0IGl0IGlzIGltbXVuZSBmcm9tIGJlaW5nIHJlbGVhc2VkIGJ5CiAgKiBjb3JlIGtlcm5lbCBjb2RlLCBtYWlubHkgdmlhIC0+Yl9jb3VudC4KICAqCi0gKiBBIGpvdXJuYWxfaGVhZCBtYXkgYmUgZGV0YWNoZWQgZnJvbSBpdHMgYnVmZmVyX2hlYWQgd2hlbiB0aGUgam91cm5hbF9oZWFkJ3MKLSAqIGJfdHJhbnNhY3Rpb24sIGJfY3BfdHJhbnNhY3Rpb24gYW5kIGJfbmV4dF90cmFuc2FjdGlvbiBwb2ludGVycyBhcmUgTlVMTC4KLSAqIFZhcmlvdXMgcGxhY2VzIGluIEpCRCBjYWxsIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgdG8gaW5kaWNhdGUgdGhhdCB0aGUKLSAqIGpvdXJuYWxfaGVhZCBjYW4gYmUgZHJvcHBlZCBpZiBuZWVkZWQuCisgKiBBIGpvdXJuYWxfaGVhZCBpcyBkZXRhY2hlZCBmcm9tIGl0cyBidWZmZXJfaGVhZCB3aGVuIHRoZSBqb3VybmFsX2hlYWQncworICogYl9qY291bnQgcmVhY2hlcyB6ZXJvLiBSdW5uaW5nIHRyYW5zYWN0aW9uIChiX3RyYW5zYWN0aW9uKSBhbmQgY2hlY2twb2ludAorICogdHJhbnNhY3Rpb24gKGJfY3BfdHJhbnNhY3Rpb24pIGhvbGQgdGhlaXIgcmVmZXJlbmNlcyB0byBiX2pjb3VudC4KICAqCiAgKiBWYXJpb3VzIHBsYWNlcyBpbiB0aGUga2VybmVsIHdhbnQgdG8gYXR0YWNoIGEgam91cm5hbF9oZWFkIHRvIGEgYnVmZmVyX2hlYWQKICAqIF9iZWZvcmVfIGF0dGFjaGluZyB0aGUgam91cm5hbF9oZWFkIHRvIGEgdHJhbnNhY3Rpb24uICBUbyBwcm90ZWN0IHRoZQpAQCAtMjA5NCwxNyArMjA5MywxNiBAQAogICoJKEF0dGFjaCBhIGpvdXJuYWxfaGVhZCBpZiBuZWVkZWQuICBJbmNyZW1lbnRzIGJfamNvdW50KQogICoJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CiAgKgkuLi4KKyAqICAgICAgKEdldCBhbm90aGVyIHJlZmVyZW5jZSBmb3IgdHJhbnNhY3Rpb24pCisgKglqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoYmgpOwogICoJamgtPmJfdHJhbnNhY3Rpb24gPSB4eHg7CisgKgkoUHV0IG9yaWdpbmFsIHJlZmVyZW5jZSkKICAqCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKLSAqCi0gKiBOb3csIHRoZSBqb3VybmFsX2hlYWQncyBiX2pjb3VudCBpcyB6ZXJvLCBidXQgaXQgaXMgc2FmZSBmcm9tIGJlaW5nIHJlbGVhc2VkCi0gKiBiZWNhdXNlIGl0IGhhcyBhIG5vbi16ZXJvIGJfdHJhbnNhY3Rpb24uCiAgKi8KIAogLyoKICAqIEdpdmUgYSBidWZmZXJfaGVhZCBhIGpvdXJuYWxfaGVhZC4KICAqCi0gKiBEb2Vzbid0IG5lZWQgdGhlIGpvdXJuYWwgbG9jay4KICAqIE1heSBzbGVlcC4KICAqLwogc3RydWN0IGpvdXJuYWxfaGVhZCAqamJkMl9qb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKQEAgLTIxNjgsNjEgKzIxNjYsMjkgQEAKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKIAogCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qY291bnQgPj0gMCk7Ci0KLQlnZXRfYmgoYmgpOwotCWlmIChqaC0+Yl9qY291bnQgPT0gMCkgewotCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gPT0gTlVMTCAmJgotCQkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gTlVMTCAmJgotCQkJCWpoLT5iX2NwX3RyYW5zYWN0aW9uID09IE5VTEwpIHsKLQkJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKTsKLQkJCUpfQVNTRVJUX0JIKGJoLCBidWZmZXJfamJkKGJoKSk7Ci0JCQlKX0FTU0VSVF9CSChiaCwgamgyYmgoamgpID09IGJoKTsKLQkJCUJVRkZFUl9UUkFDRShiaCwgInJlbW92ZSBqb3VybmFsX2hlYWQiKTsKLQkJCWlmIChqaC0+Yl9mcm96ZW5fZGF0YSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nICIKLQkJCQkJCSJiX2Zyb3plbl9kYXRhXG4iLAotCQkJCQkJX19mdW5jX18pOwotCQkJCWpiZDJfZnJlZShqaC0+Yl9mcm96ZW5fZGF0YSwgYmgtPmJfc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZnJlZWluZyAiCi0JCQkJCQkiYl9jb21taXR0ZWRfZGF0YVxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQlqYmQyX2ZyZWUoamgtPmJfY29tbWl0dGVkX2RhdGEsIGJoLT5iX3NpemUpOwotCQkJfQotCQkJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7Ci0JCQlqaC0+Yl9iaCA9IE5VTEw7CS8qIGRlYnVnLCByZWFsbHkgKi8KLQkJCWNsZWFyX2J1ZmZlcl9qYmQoYmgpOwotCQkJX19icmVsc2UoYmgpOwotCQkJam91cm5hbF9mcmVlX2pvdXJuYWxfaGVhZChqaCk7Ci0JCX0gZWxzZSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmgsICJqb3VybmFsX2hlYWQgd2FzIGxvY2tlZCIpOwotCQl9CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09IE5VTEwpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9jcF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfamxpc3QgPT0gQkpfTm9uZSk7CisJSl9BU1NFUlRfQkgoYmgsIGJ1ZmZlcl9qYmQoYmgpKTsKKwlKX0FTU0VSVF9CSChiaCwgamgyYmgoamgpID09IGJoKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgam91cm5hbF9oZWFkIik7CisJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nIGJfZnJvemVuX2RhdGFcbiIsIF9fZnVuY19fKTsKKwkJamJkMl9mcmVlKGpoLT5iX2Zyb3plbl9kYXRhLCBiaC0+Yl9zaXplKTsKIAl9CisJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nIGJfY29tbWl0dGVkX2RhdGFcbiIsIF9fZnVuY19fKTsKKwkJamJkMl9mcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhLCBiaC0+Yl9zaXplKTsKKwl9CisJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJamgtPmJfYmggPSBOVUxMOwkvKiBkZWJ1ZywgcmVhbGx5ICovCisJY2xlYXJfYnVmZmVyX2piZChiaCk7CisJam91cm5hbF9mcmVlX2pvdXJuYWxfaGVhZChqaCk7CiB9CiAKIC8qCi0gKiBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpOiBpZiB0aGUgYnVmZmVyIGlzbid0IGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24KLSAqIGFuZCBoYXMgYSB6ZXJvIGJfamNvdW50IHRoZW4gcmVtb3ZlIGFuZCByZWxlYXNlIGl0cyBqb3VybmFsX2hlYWQuICAgSWYgd2UgZGlkCi0gKiBzZWUgdGhhdCB0aGUgYnVmZmVyIGlzIG5vdCB1c2VkIGJ5IGFueSB0cmFuc2FjdGlvbiB3ZSBhbHNvICJsb2dpY2FsbHkiCi0gKiBkZWNyZW1lbnQgLT5iX2NvdW50LgotICoKLSAqIFdlIGluIGZhY3QgdGFrZSBhbiBhZGRpdGlvbmFsIGluY3JlbWVudCBvbiAtPmJfY291bnQgYXMgYSBjb252ZW5pZW5jZSwKLSAqIGJlY2F1c2UgdGhlIGNhbGxlciB1c3VhbGx5IHdhbnRzIHRvIGRvIGFkZGl0aW9uYWwgdGhpbmdzIHdpdGggdGhlIGJoCi0gKiBhZnRlciBjYWxsaW5nIGhlcmUuCi0gKiBUaGUgY2FsbGVyIG9mIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgKm11c3QqIHJ1biBfX2JyZWxzZShiaCkgYXQgc29tZQotICogdGltZS4gIE9uY2UgdGhlIGNhbGxlciBoYXMgcnVuIF9fYnJlbHNlKCksIHRoZSBidWZmZXIgaXMgZWxpZ2libGUgZm9yCi0gKiByZWFwaW5nIGJ5IHRyeV90b19mcmVlX2J1ZmZlcnMoKS4KLSAqLwotdm9pZCBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7Ci0JX19qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOwotCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKLX0KLQotLyoKLSAqIERyb3AgYSByZWZlcmVuY2Ugb24gdGhlIHBhc3NlZCBqb3VybmFsX2hlYWQuICBJZiBpdCBmZWxsIHRvIHplcm8gdGhlbiB0cnkgdG8KKyAqIERyb3AgYSByZWZlcmVuY2Ugb24gdGhlIHBhc3NlZCBqb3VybmFsX2hlYWQuICBJZiBpdCBmZWxsIHRvIHplcm8gdGhlbgogICogcmVsZWFzZSB0aGUgam91cm5hbF9oZWFkIGZyb20gdGhlIGJ1ZmZlcl9oZWFkLgogICovCiB2b2lkIGpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQpAQCAtMjIzMiwxMSArMjE5OCwxMiBAQAogCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CiAJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2pjb3VudCA+IDApOwogCS0tamgtPmJfamNvdW50OwotCWlmICghamgtPmJfamNvdW50ICYmICFqaC0+Yl90cmFuc2FjdGlvbikgeworCWlmICghamgtPmJfamNvdW50KSB7CiAJCV9fam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOwogCQlfX2JyZWxzZShiaCk7Ci0JfQotCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwl9IGVsc2UKKwkJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvamJkMi90cmFuc2FjdGlvbi5jIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCmluZGV4IDNlZWM4MmQuLjJkNzEwOTQgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHZvaWQgX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKK3N0YXRpYyB2b2lkIF9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwogCiAvKgogICogamJkMl9nZXRfdHJhbnNhY3Rpb246IG9idGFpbiBhIG5ldyB0cmFuc2FjdGlvbl90IG9iamVjdC4KQEAgLTc2NCw3ICs3NjUsNiBAQAogCWlmICghamgtPmJfdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgIm5vIHRyYW5zYWN0aW9uIik7CiAJCUpfQVNTRVJUX0pIKGpoLCAhamgtPmJfbmV4dF90cmFuc2FjdGlvbik7Ci0JCWpoLT5iX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIEJKX1Jlc2VydmVkIik7CiAJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQlfX2piZDJfam91cm5hbF9maWxlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24sIEJKX1Jlc2VydmVkKTsKQEAgLTgxNCw3ICs4MTQsNiBAQAogICogaW50IGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkgLSBub3RpZnkgaW50ZW50IHRvIG1vZGlmeSBhIGJ1ZmZlciBmb3IgbWV0YWRhdGEgKG5vdCBkYXRhKSB1cGRhdGUuCiAgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbiB0byBhZGQgYnVmZmVyIG1vZGlmaWNhdGlvbnMgdG8KICAqIEBiaDogICAgIGJoIHRvIGJlIHVzZWQgZm9yIG1ldGFkYXRhIHdyaXRlcwotICogQGNyZWRpdHM6IHZhcmlhYmxlIHRoYXQgd2lsbCByZWNlaXZlIGNyZWRpdHMgZm9yIHRoZSBidWZmZXIKICAqCiAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb3IgMCBvbiBzdWNjZXNzLgogICoKQEAgLTg5Niw4ICs4OTUsNiBAQAogCQkgKiBjb21taXR0ZWQgYW5kIHNvIGl0J3Mgc2FmZSB0byBjbGVhciB0aGUgZGlydHkgYml0LgogCQkgKi8KIAkJY2xlYXJfYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSk7Ci0JCWpoLT5iX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247Ci0KIAkJLyogZmlyc3QgYWNjZXNzIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KIAkJamgtPmJfbW9kaWZpZWQgPSAwOwogCkBAIC05MzIsNyArOTI5LDYgQEAKICAqICAgICBub24tcmV3aW5kYWJsZSBjb25zZXF1ZW5jZXMKICAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uCiAgKiBAYmg6IGJ1ZmZlciB0byB1bmRvCi0gKiBAY3JlZGl0czogc3RvcmUgdGhlIG51bWJlciBvZiB0YWtlbiBjcmVkaXRzIGhlcmUgKGlmIG5vdCBOVUxMKQogICoKICAqIFNvbWV0aW1lcyB0aGVyZSBpcyBhIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZXRhZGF0YSB3aGljaCBoYXMKICAqIGJlZW4gY29tbWl0dGVkIHRvIGRpc2sgYW5kIHRoYXQgd2hpY2ggaGFzIG5vdC4gIFRoZSBleHQzZnMgY29kZSB1c2VzCkBAIC0xMjMyLDggKzEyMjgsNiBAQAogCQkJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uLCBCSl9Gb3JnZXQpOwogCQl9IGVsc2UgewogCQkJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7Ci0JCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7Ci0JCQlfX2JyZWxzZShiaCk7CiAJCQlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CiAJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKQEAgLTE1NTYsMTkgKzE1NTAsMzIgQEAKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwkvKiBFeHBvc2UgaXQgdG8gdGhlIFZNICovCiB9CiAKLXZvaWQgX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKKy8qCisgKiBSZW1vdmUgYnVmZmVyIGZyb20gYWxsIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBDYWxsZWQgd2l0aCBiaF9zdGF0ZSBsb2NrIGFuZCBqX2xpc3RfbG9jaworICoKKyAqIGpoIGFuZCBiaCBtYXkgYmUgYWxyZWFkeSBmcmVlZCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqLworc3RhdGljIHZvaWQgX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKIAlfX2piZDJfam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOwogCWpoLT5iX3RyYW5zYWN0aW9uID0gTlVMTDsKKwlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CiB9CiAKIHZvaWQgamJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKLQlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwkvKiBHZXQgcmVmZXJlbmNlIHNvIHRoYXQgYnVmZmVyIGNhbm5vdCBiZSBmcmVlZCBiZWZvcmUgd2UgdW5sb2NrIGl0ICovCisJZ2V0X2JoKGJoKTsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQlqYmRfdW5sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJX19icmVsc2UoYmgpOwogfQogCiAvKgpAQCAtMTU5NSw4ICsxNjAyLDYgQEAKIAkJaWYgKGpoLT5iX2psaXN0ID09IEJKX05vbmUpIHsKIAkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50IGxpc3QiKTsKIAkJCV9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKLQkJCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQkJCV9fYnJlbHNlKGJoKTsKIAkJfQogCX0KIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwpAQCAtMTY1OSw3ICsxNjY0LDYgQEAKIAkJLyoKIAkJICogV2UgdGFrZSBvdXIgb3duIHJlZiBhZ2FpbnN0IHRoZSBqb3VybmFsX2hlYWQgaGVyZSB0byBhdm9pZAogCQkgKiBoYXZpbmcgdG8gYWRkIHRvbnMgb2YgbG9ja2luZyBhcm91bmQgZWFjaCBpbnN0YW5jZSBvZgotCQkgKiBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpIGFuZAogCQkgKiBqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZCgpLgogCQkgKi8KIAkJamggPSBqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoYmgpOwpAQCAtMTY5NywxMCArMTcwMSw5IEBACiAJaW50IG1heV9mcmVlID0gMTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOwogCi0JX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7Ci0KIAlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcrY3AgdHJhbnNhY3Rpb24iKTsKKwkJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKIAkJLyoKIAkJICogV2UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgYnVmZmVyIGFueW1vcmUsIGNsZWFyIHRoZQogCQkgKiBiaXQgc28gdGhhdCB3ZSBkb24ndCBjb25mdXNlIGNoZWNrcyBpbgpAQCAtMTcxMSw4ICsxNzE0LDcgQEAKIAkJbWF5X2ZyZWUgPSAwOwogCX0gZWxzZSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBydW5uaW5nIHRyYW5zYWN0aW9uIik7Ci0JCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQkJX19icmVsc2UoYmgpOworCQlfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKIAl9CiAJcmV0dXJuIG1heV9mcmVlOwogfQpAQCAtMTk5MCw2ICsxOTkyLDggQEAKIAogCWlmIChqaC0+Yl90cmFuc2FjdGlvbikKIAkJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwllbHNlCisJCWpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChiaCk7CiAJamgtPmJfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKIAogCXN3aXRjaCAoamxpc3QpIHsKQEAgLTIwNDEsOSArMjA0NSwxMCBAQAogICogYWxyZWFkeSBzdGFydGVkIHRvIGJlIHVzZWQgYnkgYSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uLCByZWZpbGUgdGhlCiAgKiBidWZmZXIgb24gdGhhdCB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCiAgKgotICogQ2FsbGVkIHVuZGVyIGpvdXJuYWwtPmpfbGlzdF9sb2NrCi0gKgorICogQ2FsbGVkIHVuZGVyIGpfbGlzdF9sb2NrCiAgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKQorICoKKyAqIGpoIGFuZCBiaCBtYXkgYmUgYWxyZWFkeSBmcmVlIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zCiAgKi8KIHZvaWQgX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKQEAgLTIwNjcsNiArMjA3MiwxMSBAQAogCiAJd2FzX2RpcnR5ID0gdGVzdF9jbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOwogCV9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJLyoKKwkgKiBXZSBzZXQgYl90cmFuc2FjdGlvbiBoZXJlIGJlY2F1c2UgYl9uZXh0X3RyYW5zYWN0aW9uIHdpbGwgaW5oZXJpdAorCSAqIG91ciBqaCByZWZlcmVuY2UgYW5kIHRodXMgX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoKSBtdXN0IG5vdAorCSAqIHRha2UgYSBuZXcgb25lLgorCSAqLwogCWpoLT5iX3RyYW5zYWN0aW9uID0gamgtPmJfbmV4dF90cmFuc2FjdGlvbjsKIAlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gTlVMTDsKIAlpZiAoYnVmZmVyX2ZyZWVkKGJoKSkKQEAgLTIwODMsMzAgKzIwOTMsMjEgQEAKIH0KIAogLyoKLSAqIEZvciB0aGUgdW5sb2NrZWQgdmVyc2lvbiBvZiB0aGlzIGNhbGwsIGFsc28gbWFrZSBzdXJlIHRoYXQgYW55Ci0gKiBoYW5naW5nIGpvdXJuYWxfaGVhZCBpcyBjbGVhbmVkIHVwIGlmIG5lY2Vzc2FyeS4KKyAqIF9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoKSB3aXRoIG5lY2Vzc2FyeSBsb2NraW5nIGFkZGVkLiBXZSB0YWtlIG91cgorICogYmggcmVmZXJlbmNlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSB1bmxvY2sgYmguCiAgKgotICogX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlciBpcyB1c3VhbGx5IGNhbGxlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIGxvY2tlZAotICogb3BlcmF0aW9uIG9uIGEgYnVmZmVyX2hlYWQsIGluIHdoaWNoIHRoZSBjYWxsZXIgaXMgcHJvYmFibHkgZ29pbmcgdG8KLSAqIGJlIGhvb2tpbmcgdGhlIGpvdXJuYWxfaGVhZCBvbnRvIG90aGVyIGxpc3RzLiAgSW4gdGhhdCBjYXNlIGl0IGlzIHVwCi0gKiB0byB0aGUgY2FsbGVyIHRvIHJlbW92ZSB0aGUgam91cm5hbF9oZWFkIGlmIG5lY2Vzc2FyeS4gIEZvciB0aGUKLSAqIHVubG9ja2VkIGpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyIGNhbGwsIHRoZSBjYWxsZXIgaXNuJ3QgZ29pbmcgdG8gYmUKLSAqIGRvaW5nIGFueXRoaW5nIGVsc2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBuZWVkIHRvIGRvIHRoZSBjbGVhbnVwCi0gKiBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBqaCBsZWFrLgotICoKLSAqICoqKiBUaGUgam91cm5hbF9oZWFkIG1heSBiZSBmcmVlZCBieSB0aGlzIGNhbGwhICoqKgorICogVGhlIGpoIGFuZCBiaCBtYXkgYmUgZnJlZWQgYnkgdGhpcyBjYWxsLgogICovCiB2b2lkIGpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKIAorCS8qIEdldCByZWZlcmVuY2Ugc28gdGhhdCBidWZmZXIgY2Fubm90IGJlIGZyZWVkIGJlZm9yZSB3ZSB1bmxvY2sgaXQgKi8KKwlnZXRfYmgoYmgpOwogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQogCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOwogCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJX19icmVsc2UoYmgpOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2ZpbGUuYyBiL2ZzL2pmcy9maWxlLmMKaW5kZXggYzVjZTZjMS4uMmYzZjUzMSAxMDA2NDQKLS0tIGEvZnMvamZzL2ZpbGUuYworKysgYi9mcy9qZnMvZmlsZS5jCkBAIC02Niw5ICs2Niw5IEBACiAJCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOwogCQlzcGluX2xvY2tfaXJxKCZqaS0+YWdfbG9jayk7CiAJCWlmIChqaS0+YWN0aXZlX2FnID09IC0xKSB7Ci0JCQlqaS0+YWN0aXZlX2FnID0gamktPmFnbm87Ci0JCQlhdG9taWNfaW5jKAotCQkJICAgICZKRlNfU0JJKGlub2RlLT5pX3NiKS0+Ym1hcC0+ZGJfYWN0aXZlW2ppLT5hZ25vXSk7CisJCQlzdHJ1Y3QgamZzX3NiX2luZm8gKmpmc19zYiA9IEpGU19TQkkoaW5vZGUtPmlfc2IpOworCQkJamktPmFjdGl2ZV9hZyA9IEJMS1RPQUcoYWRkcmVzc1BYRCgmamktPml4cHhkKSwgamZzX3NiKTsKKwkJCWF0b21pY19pbmMoICZqZnNfc2ItPmJtYXAtPmRiX2FjdGl2ZVtqaS0+YWN0aXZlX2FnXSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKCZqaS0+YWdfbG9jayk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmMgYi9mcy9qZnMvamZzX2ltYXAuYwppbmRleCBlZDUzYTQ3Li5iNzhiMmY5IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ltYXAuYworKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJcmVsZWFzZV9tZXRhcGFnZShtcCk7CiAKIAkvKiBzZXQgdGhlIGFnIGZvciB0aGUgaW5vZGUgKi8KLQlKRlNfSVAoaXApLT5hZ25vID0gQkxLVE9BRyhhZ3N0YXJ0LCBzYmkpOworCUpGU19JUChpcCktPmFnc3RhcnQgPSBhZ3N0YXJ0OwogCUpGU19JUChpcCktPmFjdGl2ZV9hZyA9IC0xOwogCiAJcmV0dXJuIChyYyk7CkBAIC05MDEsNyArOTAxLDcgQEAKIAogCS8qIGdldCB0aGUgYWxsb2NhdGlvbiBncm91cCBmb3IgdGhpcyBpbm8uCiAJICovCi0JYWdubyA9IEpGU19JUChpcCktPmFnbm87CisJYWdubyA9IEJMS1RPQUcoSkZTX0lQKGlwKS0+YWdzdGFydCwgSkZTX1NCSShpcC0+aV9zYikpOwogCiAJLyogTG9jayB0aGUgQUcgc3BlY2lmaWMgaW5vZGUgbWFwIGluZm9ybWF0aW9uCiAJICovCkBAIC0xMzE1LDEyICsxMzE1LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGRpSW5pdElub2RlKHN0cnVjdCBpbm9kZSAqaXAsIGludCBpYWdubywgaW50IGlubywgaW50IGV4dG5vLCBzdHJ1Y3QgaWFnICogaWFncCkKIHsKLQlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoaXAtPmlfc2IpOwogCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKIAogCWlwLT5pX2lubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgaW5vOwogCWpmc19pcC0+aXhweGQgPSBpYWdwLT5pbm9leHRbZXh0bm9dOwotCWpmc19pcC0+YWdubyA9IEJMS1RPQUcobGU2NF90b19jcHUoaWFncC0+YWdzdGFydCksIHNiaSk7CisJamZzX2lwLT5hZ3N0YXJ0ID0gbGU2NF90b19jcHUoaWFncC0+YWdzdGFydCk7CiAJamZzX2lwLT5hY3RpdmVfYWcgPSAtMTsKIH0KIApAQCAtMTM3OSw3ICsxMzc4LDcgQEAKIAkgKi8KIAogCS8qIGdldCB0aGUgYWcgbnVtYmVyIG9mIHRoaXMgaWFnICovCi0JYWdubyA9IEpGU19JUChwaXApLT5hZ25vOworCWFnbm8gPSBCTEtUT0FHKEpGU19JUChwaXApLT5hZ3N0YXJ0LCBKRlNfU0JJKHBpcC0+aV9zYikpOwogCiAJaWYgKGF0b21pY19yZWFkKCZKRlNfU0JJKHBpcC0+aV9zYiktPmJtYXAtPmRiX2FjdGl2ZVthZ25vXSkpIHsKIAkJLyoKQEAgLTI5MjEsMTAgKzI5MjAsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBhZ3N0YXJ0IHRoYXQgY29tcHV0ZXMgdG8gdGhlIHNhbWUgYWcgaXMgdHJlYXRlZCBhcyBzYW1lOyAqLwogCQlhZ3N0YXJ0ID0gbGU2NF90b19jcHUoaWFncC0+YWdzdGFydCk7Ci0JCS8qIGlhZ3AtPmFnc3RhcnQgPSBhZ3N0YXJ0ICYgfihtcC0+ZGJfYWdzaXplIC0gMSk7ICovCiAJCW4gPSBhZ3N0YXJ0ID4+IG1wLT5kYl9hZ2wyc2l6ZTsKKwkJaWFncC0+YWdzdGFydCA9IGNwdV90b19sZTY0KChzNjQpbiA8PCBtcC0+ZGJfYWdsMnNpemUpOwogCiAJCS8qIGNvbXB1dGUgYmFja2VkIGlub2RlcyAqLwogCQludW1pbm9zID0gKEVYVFNQRVJJQUcgLSBsZTMyX3RvX2NwdShpYWdwLT5uZnJlZWV4dHMpKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbmNvcmUuaCBiL2ZzL2pmcy9qZnNfaW5jb3JlLmgKaW5kZXggMTQzOWYxMS4uNTg0YTRhMSAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbmNvcmUuaAorKysgYi9mcy9qZnMvamZzX2luY29yZS5oCkBAIC01MCw4ICs1MCw5IEBACiAJc2hvcnQJYnRpbmRleDsJLyogYnRwYWdlIGVudHJ5IGluZGV4Ki8KIAlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsJLyogaW5vZGUgbWFwCQkJKi8KIAl1bnNpZ25lZCBsb25nIGNmbGFnOwkvKiBjb21taXQgZmxhZ3MJCSovCisJdTY0CWFnc3RhcnQ7CS8qIGFnc3RhcnQgb2YgdGhlIGNvbnRhaW5pbmcgSUFHICovCiAJdTE2CWJ4ZmxhZzsJCS8qIHhmbGFnIG9mIHBzZXVkbyBidWZmZXI/CSovCi0JdW5jaGFyCWFnbm87CQkvKiBhZyBudW1iZXIJCQkqLworCXVuY2hhcglwYWQ7CiAJc2lnbmVkIGNoYXIgYWN0aXZlX2FnOwkvKiBhZyBjdXJyZW50bHkgYWxsb2NhdGluZyBmcm9tCSovCiAJbGlkX3QJYmxpZDsJCS8qIGxpZCBvZiBwc2V1ZG8gYnVmZmVyPwkqLwogCWxpZF90CWF0bGhlYWQ7CS8qIGFub255bW91cyB0bG9jayBsaXN0IGhlYWQJKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IDI3OGUzZmIuLjU4MzYzNmYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKIAliZGV2ID0gYmxrZGV2X2dldF9ieV9kZXYoc2JpLT5sb2dkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCwKIAkJCQkgbG9nKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7Ci0JCXJjID0gLVBUUl9FUlIoYmRldik7CisJCXJjID0gUFRSX0VSUihiZGV2KTsKIAkJZ290byBmcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvamZzL3Jlc2l6ZS5jIGIvZnMvamZzL3Jlc2l6ZS5jCmluZGV4IDhlYTVlZmIuLjhkMGMxYzcgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9yZXNpemUuYworKysgYi9mcy9qZnMvcmVzaXplLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAlpbnQgbG9nX2Zvcm1hdHRlZCA9IDA7CiAJc3RydWN0IGlub2RlICppcGxpc3RbMV07CiAJc3RydWN0IGpmc19zdXBlcmJsb2NrICpqX3NiLCAqal9zYjI7Ci0JdWludCBvbGRfYWdzaXplOworCXM2NCBvbGRfYWdzaXplOwogCWludCBhZ3NpemVjaGFuZ2VkID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmgyOwogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50cHJvYy5jIGIvZnMvbG9ja2QvY2xudHByb2MuYwppbmRleCBhZGI0NWVjLi5lMzc0MDUwIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9jbG50cHJvYy5jCisrKyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKQEAgLTcwOCw3ICs3MDgsMTMgQEAKIAogCWlmICh0YXNrLT50a19zdGF0dXMgPCAwKSB7CiAJCWRwcmludGsoImxvY2tkOiB1bmxvY2sgZmFpbGVkIChlcnIgPSAlZClcbiIsIC10YXNrLT50a19zdGF0dXMpOwotCQlnb3RvIHJldHJ5X3JlYmluZDsKKwkJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKKwkJY2FzZSAtRUFDQ0VTOgorCQljYXNlIC1FSU86CisJCQlnb3RvIGRpZTsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcmV0cnlfcmViaW5kOworCQl9CiAJfQogCWlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CiAJCXJwY19kZWxheSh0YXNrLCBOTE1DTE5UX0dSQUNFX1dBSVQpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggMGE0ZjUwZC4uYjI4NjUzOSAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0xNjAsMTAgKzE2MCwyOCBAQAogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZpbGVsb2NrX2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKK3N0YXRpYyB2b2lkIGxvY2tzX2luaXRfbG9ja19hbHdheXMoc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJZmwtPmZsX25leHQgPSBOVUxMOworCWZsLT5mbF9mYXN5bmMgPSBOVUxMOworCWZsLT5mbF9vd25lciA9IE5VTEw7CisJZmwtPmZsX3BpZCA9IDA7CisJZmwtPmZsX25zcGlkID0gTlVMTDsKKwlmbC0+ZmxfZmlsZSA9IE5VTEw7CisJZmwtPmZsX2ZsYWdzID0gMDsKKwlmbC0+ZmxfdHlwZSA9IDA7CisJZmwtPmZsX3N0YXJ0ID0gZmwtPmZsX2VuZCA9IDA7Cit9CisKIC8qIEFsbG9jYXRlIGFuIGVtcHR5IGxvY2sgc3RydWN0dXJlLiAqLwogc3RydWN0IGZpbGVfbG9jayAqbG9ja3NfYWxsb2NfbG9jayh2b2lkKQogewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZpbGVsb2NrX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZWxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOworCisJaWYgKGZsKQorCQlsb2Nrc19pbml0X2xvY2tfYWx3YXlzKGZsKTsKKworCXJldHVybiBmbDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tzX2FsbG9jX2xvY2spOwogCkBAIC0yMDAsMTcgKzIxOCw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF9saW5rKTsKIAlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2Jsb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmbC0+Zmxfd2FpdCk7Ci0JZmwtPmZsX25leHQgPSBOVUxMOwotCWZsLT5mbF9mYXN5bmMgPSBOVUxMOwotCWZsLT5mbF9vd25lciA9IE5VTEw7Ci0JZmwtPmZsX3BpZCA9IDA7Ci0JZmwtPmZsX25zcGlkID0gTlVMTDsKLQlmbC0+ZmxfZmlsZSA9IE5VTEw7Ci0JZmwtPmZsX2ZsYWdzID0gMDsKLQlmbC0+ZmxfdHlwZSA9IDA7Ci0JZmwtPmZsX3N0YXJ0ID0gZmwtPmZsX2VuZCA9IDA7CiAJZmwtPmZsX29wcyA9IE5VTEw7CiAJZmwtPmZsX2xtb3BzID0gTlVMTDsKKwlsb2Nrc19pbml0X2xvY2tfYWx3YXlzKGZsKTsKIH0KIAogRVhQT1JUX1NZTUJPTChsb2Nrc19pbml0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvZGlyLmMgYi9mcy9sb2dmcy9kaXIuYwppbmRleCA5ZWQ4OWQxLi4xYWZhZTI2IDEwMDY0NAotLS0gYS9mcy9sb2dmcy9kaXIuYworKysgYi9mcy9sb2dmcy9kaXIuYwpAQCAtNTU1LDEzICs1NTUsNiBAQAogCXJldHVybiBfX2xvZ2ZzX2NyZWF0ZShkaXIsIGRlbnRyeSwgaW5vZGUsIHRhcmdldCwgZGVzdGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgbG9nZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7Ci19Ci0KIHN0YXRpYyBpbnQgbG9nZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtODIwLDcgKzgxMyw2IEBACiAJLm1rbm9kCQk9IGxvZ2ZzX21rbm9kLAogCS5yZW5hbWUJCT0gbG9nZnNfcmVuYW1lLAogCS5ybWRpcgkJPSBsb2dmc19ybWRpciwKLQkucGVybWlzc2lvbgk9IGxvZ2ZzX3Blcm1pc3Npb24sCiAJLnN5bWxpbmsJPSBsb2dmc19zeW1saW5rLAogCS51bmxpbmsJCT0gbG9nZnNfdW5saW5rLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDFhYjY0MWYuLjVjODY3ZGQgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMjM4LDcgKzIzOCw4IEBACiAKIAkvKgogCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgotCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KKwkgKiBFeGVjdXRhYmxlIERBQ3MgYXJlIG92ZXJyaWRhYmxlIGZvciBhbGwgZGlyZWN0b3JpZXMgYW5kCisJICogZm9yIG5vbi1kaXJlY3RvcmllcyB0aGF0IGhhdmUgbGVhc3Qgb25lIGV4ZWMgYml0IHNldC4KIAkgKi8KIAlpZiAoIShtYXNrICYgTUFZX0VYRUMpIHx8IGV4ZWN1dGVfb2soaW5vZGUpKQogCQlpZiAobnNfY2FwYWJsZShpbm9kZV91c2VybnMoaW5vZGUpLCBDQVBfREFDX09WRVJSSURFKSkKQEAgLTQzMiw2ICs0MzMsOCBAQAogCQkJZ290byBlcnJfcGFyZW50OwogCQlCVUdfT04obmQtPmlub2RlICE9IHBhcmVudC0+ZF9pbm9kZSk7CiAJfSBlbHNlIHsKKwkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQorCQkJZ290byBlcnJfcGFyZW50OwogCQlzcGluX2xvY2tfbmVzdGVkKCZkZW50cnktPmRfbG9jaywgREVOVFJZX0RfTE9DS19ORVNURUQpOwogCQlpZiAoIV9fZF9yY3VfdG9fcmVmY291bnQoZGVudHJ5LCBuZC0+c2VxKSkKIAkJCWdvdG8gZXJyX2NoaWxkOwpAQCAtODEyLDYgKzgxNSwxMSBAQAogCWlmICghbW50KSAvKiBtb3VudCBjb2xsaXNpb24gKi8KIAkJcmV0dXJuIDA7CiAKKwlpZiAoISpuZWVkX21udHB1dCkgeworCQkvKiBsb2NrX21vdW50KCkgbWF5IHJlbGVhc2UgcGF0aC0+bW50IG9uIGVycm9yICovCisJCW1udGdldChwYXRoLT5tbnQpOworCQkqbmVlZF9tbnRwdXQgPSB0cnVlOworCX0KIAllcnIgPSBmaW5pc2hfYXV0b21vdW50KG1udCwgcGF0aCk7CiAKIAlzd2l0Y2ggKGVycikgewpAQCAtODE5LDEyICs4MjcsOSBAQAogCQkvKiBTb21lb25lIGVsc2UgbWFkZSBhIG1vdW50IGhlcmUgd2hpbHN0IHdlIHdlcmUgYnVzeSAqLwogCQlyZXR1cm4gMDsKIAljYXNlIDA6Ci0JCWRwdXQocGF0aC0+ZGVudHJ5KTsKLQkJaWYgKCpuZWVkX21udHB1dCkKLQkJCW1udHB1dChwYXRoLT5tbnQpOworCQlwYXRoX3B1dChwYXRoKTsKIAkJcGF0aC0+bW50ID0gbW50OwogCQlwYXRoLT5kZW50cnkgPSBkZ2V0KG1udC0+bW50X3Jvb3QpOwotCQkqbmVlZF9tbnRwdXQgPSB0cnVlOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZXJyOwpAQCAtODQ0LDkgKzg0OSwxMCBAQAogICovCiBzdGF0aWMgaW50IGZvbGxvd19tYW5hZ2VkKHN0cnVjdCBwYXRoICpwYXRoLCB1bnNpZ25lZCBmbGFncykKIHsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHBhdGgtPm1udDsgLyogaGVsZCBieSBjYWxsZXIsIG11c3QgYmUgbGVmdCBhbG9uZSAqLwogCXVuc2lnbmVkIG1hbmFnZWQ7CiAJYm9vbCBuZWVkX21udHB1dCA9IGZhbHNlOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAkvKiBHaXZlbiB0aGF0IHdlJ3JlIG5vdCBob2xkaW5nIGEgbG9jayBoZXJlLCB3ZSByZXRhaW4gdGhlIHZhbHVlIGluIGEKIAkgKiBsb2NhbCB2YXJpYWJsZSBmb3IgZWFjaCBkZW50cnkgYXMgd2UgbG9vayBhdCBpdCBzbyB0aGF0IHdlIGRvbid0IHNlZQpAQCAtODYxLDcgKzg2Nyw3IEBACiAJCQlCVUdfT04oIXBhdGgtPmRlbnRyeS0+ZF9vcC0+ZF9tYW5hZ2UpOwogCQkJcmV0ID0gcGF0aC0+ZGVudHJ5LT5kX29wLT5kX21hbmFnZShwYXRoLT5kZW50cnksIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQgPT0gLUVJU0RJUiA/IDAgOiByZXQ7CisJCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBUcmFuc2l0IHRvIGEgbW91bnRlZCBmaWxlc3lzdGVtLiAqLwpAQCAtODg3LDE0ICs4OTMsMTkgQEAKIAkJaWYgKG1hbmFnZWQgJiBEQ0FDSEVfTkVFRF9BVVRPTU9VTlQpIHsKIAkJCXJldCA9IGZvbGxvd19hdXRvbW91bnQocGF0aCwgZmxhZ3MsICZuZWVkX21udHB1dCk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0ID09IC1FSVNESVIgPyAwIDogcmV0OworCQkJCWJyZWFrOwogCQkJY29udGludWU7CiAJCX0KIAogCQkvKiBXZSBkaWRuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHBhdGggcG9pbnQgKi8KIAkJYnJlYWs7CiAJfQotCXJldHVybiAwOworCisJaWYgKG5lZWRfbW50cHV0ICYmIHBhdGgtPm1udCA9PSBtbnQpCisJCW1udHB1dChwYXRoLT5tbnQpOworCWlmIChyZXQgPT0gLUVJU0RJUikKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgZm9sbG93X2Rvd25fb25lKHN0cnVjdCBwYXRoICpwYXRoKQpAQCAtMTAwMyw5ICsxMDE0LDYgQEAKICAqIEZvbGxvdyBkb3duIHRvIHRoZSBjb3ZlcmluZyBtb3VudCBjdXJyZW50bHkgdmlzaWJsZSB0byB1c2Vyc3BhY2UuICBBdCBlYWNoCiAgKiBwb2ludCwgdGhlIGZpbGVzeXN0ZW0gb3duaW5nIHRoYXQgZGVudHJ5IG1heSBiZSBxdWVyaWVkIGFzIHRvIHdoZXRoZXIgdGhlCiAgKiBjYWxsZXIgaXMgcGVybWl0dGVkIHRvIHByb2NlZWQgb3Igbm90LgotICoKLSAqIENhcmUgbXVzdCBiZSB0YWtlbiBhcyBuYW1lc3BhY2Vfc2VtIG1heSBiZSBoZWxkIChpbmRpY2F0ZWQgYnkgbW91bnRpbmdfaGVyZQotICogYmVpbmcgdHJ1ZSkuCiAgKi8KIGludCBmb2xsb3dfZG93bihzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKQEAgLTI1NzksNiArMjU4Nyw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAorCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CiAJZXJyb3IgPSBkaXItPmlfb3AtPnJtZGlyKGRpciwgZGVudHJ5KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwpAQCAtMjYyMyw2ICsyNjMyLDEwIEBACiAJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CiAJaWYgKElTX0VSUihkZW50cnkpKQogCQlnb3RvIGV4aXQyOworCWlmICghZGVudHJ5LT5kX2lub2RlKSB7CisJCWVycm9yID0gLUVOT0VOVDsKKwkJZ290byBleGl0MzsKKwl9CiAJZXJyb3IgPSBtbnRfd2FudF93cml0ZShuZC5wYXRoLm1udCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGV4aXQzOwpAQCAtMjcxMSw4ICsyNzI0LDkgQEAKIAkJaWYgKG5kLmxhc3QubmFtZVtuZC5sYXN0Lmxlbl0pCiAJCQlnb3RvIHNsYXNoZXM7CiAJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCQlpZiAoaW5vZGUpCi0JCQlpaG9sZChpbm9kZSk7CisJCWlmICghaW5vZGUpCisJCQlnb3RvIHNsYXNoZXM7CisJCWlob2xkKGlub2RlKTsKIAkJZXJyb3IgPSBtbnRfd2FudF93cml0ZShuZC5wYXRoLm1udCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXhpdDI7CkBAIC0yOTkzLDYgKzMwMDcsOCBAQAogCWlmIChkX21vdW50cG9pbnQob2xkX2RlbnRyeSkgfHwgZF9tb3VudHBvaW50KG5ld19kZW50cnkpKQogCQlnb3RvIG91dDsKIAorCWlmICh0YXJnZXQpCisJCXNocmlua19kY2FjaGVfcGFyZW50KG5ld19kZW50cnkpOwogCWVycm9yID0gb2xkX2Rpci0+aV9vcC0+cmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksIG5ld19kaXIsIG5ld19kZW50cnkpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvZnNjYWNoZS5jIGIvZnMvbmZzL2ZzY2FjaGUuYwppbmRleCBjZTE1M2E2Li40MTkxMTljIDEwMDY0NAotLS0gYS9mcy9uZnMvZnNjYWNoZS5jCisrKyBiL2ZzL25mcy9mc2NhY2hlLmMKQEAgLTI1OSwxMiArMjU5LDEwIEBACiAJCWRmcHJpbnRrKEZTQ0FDSEUsCiAJCQkgIk5GUzogbmZzaSAweCVwIHR1cm5pbmcgY2FjaGUgb2ZmXG4iLCBORlNfSShpbm9kZSkpOwogCi0JCS8qIE5lZWQgdG8gaW52YWxpZGF0ZSBhbnkgbWFwcGVkIHBhZ2VzIHRoYXQgd2VyZSByZWFkIGluIGJlZm9yZQotCQkgKiB0dXJuaW5nIG9mZiB0aGUgY2FjaGUuCisJCS8qIE5lZWQgdG8gdW5jYWNoZSBhbnkgcGFnZXMgYXR0YWNoZWQgdG8gdGhpcyBpbm9kZSB0aGF0CisJCSAqIGZzY2FjaGUga25vd3MgYWJvdXQgYmVmb3JlIHR1cm5pbmcgb2ZmIHRoZSBjYWNoZS4KIAkJICovCi0JCWlmIChpbm9kZS0+aV9tYXBwaW5nICYmIGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMpCi0JCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihpbm9kZS0+aV9tYXBwaW5nKTsKLQorCQlmc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKE5GU19JKGlub2RlKS0+ZnNjYWNoZSwgaW5vZGUpOwogCQluZnNfZnNjYWNoZV96YXBfaW5vZGVfY29va2llKGlub2RlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IDE0NGYyYTMuLjZmNDg1MGQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0yNTYsNyArMjU2LDggQEAKIAogCW5mc19hdHRyX2NoZWNrX21vdW50cG9pbnQoc2IsIGZhdHRyKTsKIAotCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKSA9PSAwICYmIChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9NT1VOVFBPSU5UKSA9PSAwKQorCWlmICgoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX0ZJTEVJRCkgPT0gMCkgJiYKKwkgICAgIW5mc19hdHRyX3VzZV9tb3VudGVkX29uX2ZpbGVpZChmYXR0cikpCiAJCWdvdG8gb3V0X25vX2lub2RlOwogCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVFlQRSkgPT0gMCkKIAkJZ290byBvdXRfbm9faW5vZGU7CkBAIC0xMjk0LDcgKzEyOTUsOCBAQAogCQlpZiAobmV3X2lzaXplICE9IGN1cl9pc2l6ZSkgewogCQkJLyogRG8gd2UgcGVyaGFwcyBoYXZlIGFueSBvdXRzdGFuZGluZyB3cml0ZXMsIG9yIGhhcwogCQkJICogdGhlIGZpbGUgZ3Jvd24gYmV5b25kIG91ciBsYXN0IHdyaXRlPyAqLwotCQkJaWYgKG5mc2ktPm5wYWdlcyA9PSAwIHx8IG5ld19pc2l6ZSA+IGN1cl9pc2l6ZSkgeworCQkJaWYgKChuZnNpLT5ucGFnZXMgPT0gMCAmJiAhdGVzdF9iaXQoTkZTX0lOT19MQVlPVVRDT01NSVQsICZuZnNpLT5mbGFncykpIHx8CisJCQkgICAgIG5ld19pc2l6ZSA+IGN1cl9pc2l6ZSkgewogCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgbmV3X2lzaXplKTsKIAkJCQlpbnZhbGlkIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaAppbmRleCBiOTA1NmNiLi4yYTU1MzQ3IDEwMDY0NAotLS0gYS9mcy9uZnMvaW50ZXJuYWwuaAorKysgYi9mcy9uZnMvaW50ZXJuYWwuaApAQCAtNDUsNiArNDUsMTcgQEAKIAkJZmF0dHItPnZhbGlkIHw9IE5GU19BVFRSX0ZBVFRSX01PVU5UUE9JTlQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG5mc19hdHRyX3VzZV9tb3VudGVkX29uX2ZpbGVpZChzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlpZiAoKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9NT1VOVEVEX09OX0ZJTEVJRCkgPT0gMCkgfHwKKwkgICAgKCgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfTU9VTlRQT0lOVCkgPT0gMCkgJiYKKwkgICAgICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpID09IDApKSkKKwkJcmV0dXJuIDA7CisKKwlmYXR0ci0+ZmlsZWlkID0gZmF0dHItPm1vdW50ZWRfb25fZmlsZWlkOworCXJldHVybiAxOworfQorCiBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50IHsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jIGIvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMKaW5kZXggNDI2OTA4OC4uZjlkMDNhYiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMKKysrIGIvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMKQEAgLTMwLDYgKzMwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibmZzNGZpbGVsYXlvdXQuaCIKQEAgLTM5Nyw3ICszOTgsNiBAQAogCSAqIHRoaXMgb2Zmc2V0IGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBvZmZzZXQuCiAJICovCiAJZGF0YS0+YXJncy5vZmZzZXQgPSBmaWxlbGF5b3V0X2dldF9kc2VydmVyX29mZnNldChsc2VnLCBvZmZzZXQpOwotCWRhdGEtPm1kc19vZmZzZXQgPSBvZmZzZXQ7CiAKIAkvKiBQZXJmb3JtIGFuIGFzeW5jaHJvbm91cyB3cml0ZSAqLwogCXN0YXR1cyA9IG5mc19pbml0aWF0ZV93cml0ZShkYXRhLCBkcy0+ZHNfY2xwLT5jbF9ycGNjbGllbnQsCkBAIC01NTIsMTMgKzU1MiwxOCBAQAogCQlfX2Z1bmNfXywgbmZsX3V0aWwsIGZsLT5udW1fZmgsIGZsLT5maXJzdF9zdHJpcGVfaW5kZXgsCiAJCWZsLT5wYXR0ZXJuX29mZnNldCk7CiAKLQlpZiAoIWZsLT5udW1fZmgpCisJLyogTm90ZSB0aGF0IGEgemVybyB2YWx1ZSBmb3IgbnVtX2ZoIGlzIGxlZ2FsIGZvciBTVFJJUEVfU1BBUlNFLgorCSAqIEZ1dGhlciBjaGVja2luZyBpcyBkb25lIGluIGZpbGVsYXlvdXRfY2hlY2tfbGF5b3V0ICovCisJaWYgKGZsLT5udW1fZmggPCAwIHx8IGZsLT5udW1fZmggPgorCSAgICBtYXgoTkZTNF9QTkZTX01BWF9TVFJJUEVfQ05ULCBORlM0X1BORlNfTUFYX01VTFRJX0NOVCkpCiAJCWdvdG8gb3V0X2VycjsKIAotCWZsLT5maF9hcnJheSA9IGt6YWxsb2MoZmwtPm51bV9maCAqIHNpemVvZihzdHJ1Y3QgbmZzX2ZoICopLAotCQkJICAgICAgIGdmcF9mbGFncyk7Ci0JaWYgKCFmbC0+ZmhfYXJyYXkpCi0JCWdvdG8gb3V0X2VycjsKKwlpZiAoZmwtPm51bV9maCA+IDApIHsKKwkJZmwtPmZoX2FycmF5ID0ga3phbGxvYyhmbC0+bnVtX2ZoICogc2l6ZW9mKHN0cnVjdCBuZnNfZmggKiksCisJCQkJICAgICAgIGdmcF9mbGFncyk7CisJCWlmICghZmwtPmZoX2FycmF5KQorCQkJZ290byBvdXRfZXJyOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBmbC0+bnVtX2ZoOyBpKyspIHsKIAkJLyogRG8gd2Ugd2FudCB0byB1c2UgYSBtZW1wb29sIGhlcmU/ICovCkBAIC02NjEsOCArNjY2LDkgQEAKIAl1NjQgcF9zdHJpcGUsIHJfc3RyaXBlOwogCXUzMiBzdHJpcGVfdW5pdDsKIAotCWlmICghcG5mc19nZW5lcmljX3BnX3Rlc3QocGdpbywgcHJldiwgcmVxKSkKLQkJcmV0dXJuIDA7CisJaWYgKCFwbmZzX2dlbmVyaWNfcGdfdGVzdChwZ2lvLCBwcmV2LCByZXEpIHx8CisJICAgICFuZnNfZ2VuZXJpY19wZ190ZXN0KHBnaW8sIHByZXYsIHJlcSkpCisJCXJldHVybiBmYWxzZTsKIAogCWlmICghcGdpby0+cGdfbHNlZykKIAkJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHByb2MuYyBiL2ZzL25mcy9uZnM0cHJvYy5jCmluZGV4IGQyYzRiNTkuLjU4NzliMjMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0cHJvYy5jCisrKyBiL2ZzL25mcy9uZnM0cHJvYy5jCkBAIC0yMjY1LDEyICsyMjY1LDE0IEBACiAJcmV0dXJuIG5mczRfbWFwX2Vycm9ycyhzdGF0dXMpOwogfQogCitzdGF0aWMgdm9pZCBuZnNfZml4dXBfcmVmZXJyYWxfYXR0cmlidXRlcyhzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cik7CiAvKgogICogR2V0IGxvY2F0aW9ucyBhbmQgKG1heWJlKSBvdGhlciBhdHRyaWJ1dGVzIG9mIGEgcmVmZXJyYWwuCiAgKiBOb3RlIHRoYXQgd2UnbGwgYWN0dWFsbHkgZm9sbG93IHRoZSByZWZlcnJhbCBsYXRlciB3aGVuCiAgKiB3ZSBkZXRlY3QgZnNpZCBtaXNtYXRjaCBpbiBpbm9kZSByZXZhbGlkYXRpb24KICAqLwotc3RhdGljIGludCBuZnM0X2dldF9yZWZlcnJhbChzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQorc3RhdGljIGludCBuZnM0X2dldF9yZWZlcnJhbChzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCisJCQkgICAgIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQogewogCWludCBzdGF0dXMgPSAtRU5PTUVNOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKQEAgLTIyODgsMTUgKzIyOTAsMTYgQEAKIAkJZ290byBvdXQ7CiAJLyogTWFrZSBzdXJlIHNlcnZlciByZXR1cm5lZCBhIGRpZmZlcmVudCBmc2lkIGZvciB0aGUgcmVmZXJyYWwgKi8KIAlpZiAobmZzX2ZzaWRfZXF1YWwoJk5GU19TRVJWRVIoZGlyKS0+ZnNpZCwgJmxvY2F0aW9ucy0+ZmF0dHIuZnNpZCkpIHsKLQkJZHByaW50aygiJXM6IHNlcnZlciBkaWQgbm90IHJldHVybiBhIGRpZmZlcmVudCBmc2lkIGZvciBhIHJlZmVycmFsIGF0ICVzXG4iLCBfX2Z1bmNfXywgbmFtZS0+bmFtZSk7CisJCWRwcmludGsoIiVzOiBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYSBkaWZmZXJlbnQgZnNpZCBmb3IiCisJCQkiIGEgcmVmZXJyYWwgYXQgJXNcbiIsIF9fZnVuY19fLCBuYW1lLT5uYW1lKTsKIAkJc3RhdHVzID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQorCS8qIEZpeHVwIGF0dHJpYnV0ZXMgZm9yIHRoZSBuZnNfbG9va3VwKCkgY2FsbCB0byBuZnNfZmhnZXQoKSAqLworCW5mc19maXh1cF9yZWZlcnJhbF9hdHRyaWJ1dGVzKCZsb2NhdGlvbnMtPmZhdHRyKTsKIAorCS8qIHJlcGxhY2UgdGhlIGxvb2t1cCBuZnNfZmF0dHIgd2l0aCB0aGUgbG9jYXRpb25zIG5mc19mYXR0ciAqLwogCW1lbWNweShmYXR0ciwgJmxvY2F0aW9ucy0+ZmF0dHIsIHNpemVvZihzdHJ1Y3QgbmZzX2ZhdHRyKSk7Ci0JZmF0dHItPnZhbGlkIHw9IE5GU19BVFRSX0ZBVFRSX1Y0X1JFRkVSUkFMOwotCWlmICghZmF0dHItPm1vZGUpCi0JCWZhdHRyLT5tb2RlID0gU19JRkRJUjsKIAltZW1zZXQoZmhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBuZnNfZmgpKTsKIG91dDoKIAlpZiAocGFnZSkKQEAgLTQ2NjcsMTEgKzQ2NzAsMTUgQEAKIAlyZXR1cm4gbGVuOwogfQogCisvKgorICogbmZzX2ZoZ2V0IHdpbGwgdXNlIGVpdGhlciB0aGUgbW91bnRlZF9vbl9maWxlaWQgb3IgdGhlIGZpbGVpZAorICovCiBzdGF0aWMgdm9pZCBuZnNfZml4dXBfcmVmZXJyYWxfYXR0cmlidXRlcyhzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKLQlpZiAoISgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKSAmJgotCQkoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRlNJRCkgJiYKLQkJKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0X1JFRkVSUkFMKSkpCisJaWYgKCEoKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9NT1VOVEVEX09OX0ZJTEVJRCkgfHwKKwkgICAgICAgKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX0ZJTEVJRCkpICYmCisJICAgICAgKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX0ZTSUQpICYmCisJICAgICAgKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0X1JFRkVSUkFMKSkpCiAJCXJldHVybjsKIAogCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUl9UWVBFIHwgTkZTX0FUVFJfRkFUVFJfTU9ERSB8CkBAIC00Njg2LDcgKzQ2OTMsNiBAQAogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CiAJdTMyIGJpdG1hc2tbMl0gPSB7CiAJCVswXSA9IEZBVFRSNF9XT1JEMF9GU0lEIHwgRkFUVFI0X1dPUkQwX0ZTX0xPQ0FUSU9OUywKLQkJWzFdID0gRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlELAogCX07CiAJc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyBhcmdzID0gewogCQkuZGlyX2ZoID0gTkZTX0ZIKGRpciksCkBAIC00NzA1LDExICs0NzExLDE4IEBACiAJaW50IHN0YXR1czsKIAogCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOworCisJLyogQXNrIGZvciB0aGUgZmlsZWlkIG9mIHRoZSBhYnNlbnQgZmlsZXN5c3RlbSBpZiBtb3VudGVkX29uX2ZpbGVpZAorCSAqIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoTkZTX1NFUlZFUihkaXIpLT5hdHRyX2JpdG1hc2tbMV0gJiBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQpCisJCWJpdG1hc2tbMV0gfD0gRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEOworCWVsc2UKKwkJYml0bWFza1swXSB8PSBGQVRUUjRfV09SRDBfRklMRUlEOworCiAJbmZzX2ZhdHRyX2luaXQoJmZzX2xvY2F0aW9ucy0+ZmF0dHIpOwogCWZzX2xvY2F0aW9ucy0+c2VydmVyID0gc2VydmVyOwogCWZzX2xvY2F0aW9ucy0+bmxvY2F0aW9ucyA9IDA7CiAJc3RhdHVzID0gbmZzNF9jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsIHNlcnZlciwgJm1zZywgJmFyZ3Muc2VxX2FyZ3MsICZyZXMuc2VxX3JlcywgMCk7Ci0JbmZzX2ZpeHVwX3JlZmVycmFsX2F0dHJpYnV0ZXMoJmZzX2xvY2F0aW9ucy0+ZmF0dHIpOwogCWRwcmludGsoIiVzOiByZXR1cm5lZCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTUwOTgsNyArNTExMSw2IEBACiAJaWYgKG14cmVzcF9zeiA9PSAwKQogCQlteHJlc3Bfc3ogPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKIAkvKiBGb3JlIGNoYW5uZWwgYXR0cmlidXRlcyAqLwotCWFyZ3MtPmZjX2F0dHJzLmhlYWRlcnBhZHN6ID0gMDsKIAlhcmdzLT5mY19hdHRycy5tYXhfcnFzdF9zeiA9IG14cnFzdF9zejsKIAlhcmdzLT5mY19hdHRycy5tYXhfcmVzcF9zeiA9IG14cmVzcF9zejsKIAlhcmdzLT5mY19hdHRycy5tYXhfb3BzID0gTkZTNF9NQVhfT1BTOwpAQCAtNTExMSw3ICs1MTIzLDYgQEAKIAkJYXJncy0+ZmNfYXR0cnMubWF4X29wcywgYXJncy0+ZmNfYXR0cnMubWF4X3JlcXMpOwogCiAJLyogQmFjayBjaGFubmVsIGF0dHJpYnV0ZXMgKi8KLQlhcmdzLT5iY19hdHRycy5oZWFkZXJwYWRzeiA9IDA7CiAJYXJncy0+YmNfYXR0cnMubWF4X3Jxc3Rfc3ogPSBQQUdFX1NJWkU7CiAJYXJncy0+YmNfYXR0cnMubWF4X3Jlc3Bfc3ogPSBQQUdFX1NJWkU7CiAJYXJncy0+YmNfYXR0cnMubWF4X3Jlc3Bfc3pfY2FjaGVkID0gMDsKQEAgLTUxMzEsOCArNTE0Miw2IEBACiAJc3RydWN0IG5mczRfY2hhbm5lbF9hdHRycyAqc2VudCA9ICZhcmdzLT5mY19hdHRyczsKIAlzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzICpyY3ZkID0gJnNlc3Npb24tPmZjX2F0dHJzOwogCi0JaWYgKHJjdmQtPmhlYWRlcnBhZHN6ID4gc2VudC0+aGVhZGVycGFkc3opCi0JCXJldHVybiAtRUlOVkFMOwogCWlmIChyY3ZkLT5tYXhfcmVzcF9zeiA+IHNlbnQtPm1heF9yZXNwX3N6KQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKgpAQCAtNTY5Nyw2ICs1NzA2LDcgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRyZXR1cm4gKmxycCA9IGNhbGxkYXRhOwogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8gPSBORlNfSShscnAtPmFyZ3MuaW5vZGUpLT5sYXlvdXQ7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtNTcwOCwxNiArNTcxOCwxNSBAQAogCQluZnNfcmVzdGFydF9ycGModGFzaywgbHJwLT5jbHApOwogCQlyZXR1cm47CiAJfQorCXNwaW5fbG9jaygmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKIAlpZiAodGFzay0+dGtfc3RhdHVzID09IDApIHsKLQkJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8gPSBORlNfSShscnAtPmFyZ3MuaW5vZGUpLT5sYXlvdXQ7Ci0KIAkJaWYgKGxycC0+cmVzLmxyc19wcmVzZW50KSB7Ci0JCQlzcGluX2xvY2soJmxvLT5wbGhfaW5vZGUtPmlfbG9jayk7CiAJCQlwbmZzX3NldF9sYXlvdXRfc3RhdGVpZChsbywgJmxycC0+cmVzLnN0YXRlaWQsIHRydWUpOwotCQkJc3Bpbl91bmxvY2soJmxvLT5wbGhfaW5vZGUtPmlfbG9jayk7CiAJCX0gZWxzZQogCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKTsKIAl9CisJbG8tPnBsaF9ibG9ja19sZ2V0cy0tOworCXNwaW5fdW5sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwogCWRwcmludGsoIjwtLSAlc1xuIiwgX19mdW5jX18pOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCBkODY5YTVlLi5lNmU4ZjNiIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTkxLDcgKzkxLDcgQEAKICNkZWZpbmUgZW5jb2RlX2dldGZoX21heHN6ICAgICAgKG9wX2VuY29kZV9oZHJfbWF4c3opCiAjZGVmaW5lIGRlY29kZV9nZXRmaF9tYXhzeiAgICAgIChvcF9kZWNvZGVfaGRyX21heHN6ICsgMSArIFwKIAkJCQkoKDMrTkZTNF9GSFNJWkUpID4+IDIpKQotI2RlZmluZSBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiAzCisjZGVmaW5lIG5mczRfZmF0dHJfYml0bWFwX21heHN6IDQKICNkZWZpbmUgZW5jb2RlX2dldGF0dHJfbWF4c3ogICAgKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeikKICNkZWZpbmUgbmZzNF9uYW1lX21heHN6CQkoMSArICgoMyArIE5GUzRfTUFYTkFNTEVOKSA+PiAyKSkKICNkZWZpbmUgbmZzNF9wYXRoX21heHN6CQkoMSArICgoMyArIE5GUzRfTUFYUEFUSExFTikgPj4gMikpCkBAIC0yNTUsNyArMjU1LDcgQEAKICNkZWZpbmUgZGVjb2RlX2ZzX2xvY2F0aW9uc19tYXhzeiBcCiAJCQkJKDApCiAjZGVmaW5lIGVuY29kZV9zZWNpbmZvX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgbmZzNF9uYW1lX21heHN6KQotI2RlZmluZSBkZWNvZGVfc2VjaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDQgKyAoTkZTX01BWF9TRUNGTEFWT1JTICogKDE2ICsgR1NTX09JRF9NQVhfTEVOKSkpCisjZGVmaW5lIGRlY29kZV9zZWNpbmZvX21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6ICsgMSArICgoTkZTX01BWF9TRUNGTEFWT1JTICogKDE2ICsgR1NTX09JRF9NQVhfTEVOKSkgLyA0KSkKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQogI2RlZmluZSBORlM0X01BWF9NQUNISU5FX05BTUVfTEVOICg2NCkKQEAgLTE3MjUsNyArMTcyNSw3IEBACiAJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmZsYWdzKTsJCQkvKmZsYWdzICovCiAKIAkvKiBGb3JlIENoYW5uZWwgKi8KLQkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+ZmNfYXR0cnMuaGVhZGVycGFkc3opOwkvKiBoZWFkZXIgcGFkZGluZyBzaXplICovCisJKnArKyA9IGNwdV90b19iZTMyKDApOwkJCQkvKiBoZWFkZXIgcGFkZGluZyBzaXplICovCiAJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmZjX2F0dHJzLm1heF9ycXN0X3N6KTsJLyogbWF4IHJlcSBzaXplICovCiAJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmZjX2F0dHJzLm1heF9yZXNwX3N6KTsJLyogbWF4IHJlc3Agc2l6ZSAqLwogCSpwKysgPSBjcHVfdG9fYmUzMihtYXhfcmVzcF9zel9jYWNoZWQpOwkJLyogTWF4IHJlc3Agc3ogY2FjaGVkICovCkBAIC0xNzM0LDcgKzE3MzQsNyBAQAogCSpwKysgPSBjcHVfdG9fYmUzMigwKTsJCQkJLyogcmRtYWNoYW5uZWxfYXR0cnMgKi8KIAogCS8qIEJhY2sgQ2hhbm5lbCAqLwotCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5mY19hdHRycy5oZWFkZXJwYWRzeik7CS8qIGhlYWRlciBwYWRkaW5nIHNpemUgKi8KKwkqcCsrID0gY3B1X3RvX2JlMzIoMCk7CQkJCS8qIGhlYWRlciBwYWRkaW5nIHNpemUgKi8KIAkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+YmNfYXR0cnMubWF4X3Jxc3Rfc3opOwkvKiBtYXggcmVxIHNpemUgKi8KIAkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+YmNfYXR0cnMubWF4X3Jlc3Bfc3opOwkvKiBtYXggcmVzcCBzaXplICovCiAJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmJjX2F0dHJzLm1heF9yZXNwX3N6X2NhY2hlZCk7CS8qIE1heCByZXNwIHN6IGNhY2hlZCAqLwpAQCAtMzA5OCw3ICszMDk4LDcgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfYXR0cl9lcnJvcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwKQorc3RhdGljIGludCBkZWNvZGVfYXR0cl9lcnJvcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBpbnQzMl90ICpyZXMpCiB7CiAJX19iZTMyICpwOwogCkBAIC0zMTA5LDcgKzMxMDksNyBAQAogCQlpZiAodW5saWtlbHkoIXApKQogCQkJZ290byBvdXRfb3ZlcmZsb3c7CiAJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUjsKLQkJcmV0dXJuIC1iZTMyX3RvX2NwdXAocCk7CisJCSpyZXMgPSAtYmUzMl90b19jcHVwKHApOwogCX0KIAlyZXR1cm4gMDsKIG91dF9vdmVyZmxvdzoKQEAgLTQwNzAsNiArNDA3MCw3IEBACiAJaW50IHN0YXR1czsKIAl1bW9kZV90IGZtb2RlID0gMDsKIAl1aW50MzJfdCB0eXBlOworCWludDMyX3QgZXJyOwogCiAJc3RhdHVzID0gZGVjb2RlX2F0dHJfdHlwZSh4ZHIsIGJpdG1hcCwgJnR5cGUpOwogCWlmIChzdGF0dXMgPCAwKQpAQCAtNDA5NSwxMyArNDA5NiwxMiBAQAogCQlnb3RvIHhkcl9lcnJvcjsKIAlmYXR0ci0+dmFsaWQgfD0gc3RhdHVzOwogCi0Jc3RhdHVzID0gZGVjb2RlX2F0dHJfZXJyb3IoeGRyLCBiaXRtYXApOwotCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfV1JPTkdTRUMpIHsKLQkJbmZzX2ZpeHVwX3NlY2luZm9fYXR0cmlidXRlcyhmYXR0ciwgZmgpOwotCQlzdGF0dXMgPSAwOwotCX0KKwllcnIgPSAwOworCXN0YXR1cyA9IGRlY29kZV9hdHRyX2Vycm9yKHhkciwgYml0bWFwLCAmZXJyKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byB4ZHJfZXJyb3I7CisJaWYgKGVyciA9PSAtTkZTNEVSUl9XUk9OR1NFQykKKwkJbmZzX2ZpeHVwX3NlY2luZm9fYXR0cmlidXRlcyhmYXR0ciwgZmgpOwogCiAJc3RhdHVzID0gZGVjb2RlX2F0dHJfZmlsZWhhbmRsZSh4ZHIsIGJpdG1hcCwgZmgpOwogCWlmIChzdGF0dXMgPCAwKQpAQCAtNDk5NywxMiArNDk5NywxNCBAQAogCQkJICAgICBzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzICphdHRycykKIHsKIAlfX2JlMzIgKnA7Ci0JdTMyIG5yX2F0dHJzOworCXUzMiBucl9hdHRycywgdmFsOwogCiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgMjgpOwogCWlmICh1bmxpa2VseSghcCkpCiAJCWdvdG8gb3V0X292ZXJmbG93OwotCWF0dHJzLT5oZWFkZXJwYWRzeiA9IGJlMzJfdG9fY3B1cChwKyspOworCXZhbCA9IGJlMzJfdG9fY3B1cChwKyspOwkvKiBoZWFkZXJwYWRzeiAqLworCWlmICh2YWwpCisJCXJldHVybiAtRUlOVkFMOwkJLyogbm8gc3VwcG9ydCBmb3IgaGVhZGVyIHBhZGRpbmcgeWV0ICovCiAJYXR0cnMtPm1heF9ycXN0X3N6ID0gYmUzMl90b19jcHVwKHArKyk7CiAJYXR0cnMtPm1heF9yZXNwX3N6ID0gYmUzMl90b19jcHVwKHArKyk7CiAJYXR0cnMtPm1heF9yZXNwX3N6X2NhY2hlZCA9IGJlMzJfdG9fY3B1cChwKyspOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYyBiL2ZzL25mcy9vYmpsYXlvdXQvb2JqaW9fb3NkLmMKaW5kZXggOWNmMjA4ZC4uOGZmMmVhMyAxMDA2NDQKLS0tIGEvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYworKysgYi9mcy9uZnMvb2JqbGF5b3V0L29iamlvX29zZC5jCkBAIC0xMDgsNyArMTA4LDYgQEAKIAkJZGUgPSBuOwogCX0KIAotCWF0b21pY19pbmMoJmRlLT5pZF9ub2RlLnJlZik7CiAJcmV0dXJuIGRlOwogfQogCkBAIC0xMDAxLDYgKzEwMDAsOSBAQAogCWlmICghcG5mc19nZW5lcmljX3BnX3Rlc3QocGdpbywgcHJldiwgcmVxKSkKIAkJcmV0dXJuIGZhbHNlOwogCisJaWYgKHBnaW8tPnBnX2xzZWcgPT0gTlVMTCkKKwkJcmV0dXJuIHRydWU7CisKIAlyZXR1cm4gcGdpby0+cGdfY291bnQgKyByZXEtPndiX2J5dGVzIDw9CiAJCQlPQkpJT19MU0VHKHBnaW8tPnBnX2xzZWcpLT5tYXhfaW9fc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmMgYi9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5jCmluZGV4IGRjMzk1NmMuLjFkMDZmOGUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmMKKysrIGIvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhOwogCiAJc3RhdGUtPnN0YXR1cyA9IHN0YXR1czsKLQlkcHJpbnRrKCIlczogQmVnaW4gc3RhdHVzPSVsZCBlb2Y9JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMsIGVvZik7CisJZHByaW50aygiJXM6IEJlZ2luIHN0YXR1cz0lemQgZW9mPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzLCBlb2YpOwogCXJkYXRhID0gc3RhdGUtPnJwY2RhdGE7CiAJcmRhdGEtPnRhc2sudGtfc3RhdHVzID0gc3RhdHVzOwogCWlmIChzdGF0dXMgPj0gMCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BhZ2VsaXN0LmMgYi9mcy9uZnMvcGFnZWxpc3QuYwppbmRleCA3OTEzOTYxLi4wMDk4NTU3IDEwMDY0NAotLS0gYS9mcy9uZnMvcGFnZWxpc3QuYworKysgYi9mcy9uZnMvcGFnZWxpc3QuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiB9CiAKLXN0YXRpYyBib29sIG5mc19nZW5lcmljX3BnX3Rlc3Qoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqZGVzYywgc3RydWN0IG5mc19wYWdlICpwcmV2LCBzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK2Jvb2wgbmZzX2dlbmVyaWNfcGdfdGVzdChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICpkZXNjLCBzdHJ1Y3QgbmZzX3BhZ2UgKnByZXYsIHN0cnVjdCBuZnNfcGFnZSAqcmVxKQogewogCS8qCiAJICogRklYTUU6IGlkZWFsbHkgd2Ugc2hvdWxkIGJlIGFibGUgdG8gY29hbGVzY2UgYWxsIHJlcXVlc3RzCkBAIC0yMTgsNiArMjE4LDcgQEAKIAogCXJldHVybiBkZXNjLT5wZ19jb3VudCArIHJlcS0+d2JfYnl0ZXMgPD0gZGVzYy0+cGdfYnNpemU7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZnNfZ2VuZXJpY19wZ190ZXN0KTsKIAogLyoqCiAgKiBuZnNfcGFnZWlvX2luaXQgLSBpbml0aWFsaXNlIGEgcGFnZSBpbyBkZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5jIGIvZnMvbmZzL3BuZnMuYwppbmRleCA4YzEzMDlkLi4yOWMwY2E3IDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5jCisrKyBiL2ZzL25mcy9wbmZzLmMKQEAgLTYzNCwxNCArNjM0LDE2IEBACiAKIAlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKIAlsbyA9IG5mc2ktPmxheW91dDsKLQlpZiAoIWxvIHx8ICFtYXJrX21hdGNoaW5nX2xzZWdzX2ludmFsaWQobG8sICZ0bXBfbGlzdCwgTlVMTCkpIHsKKwlpZiAoIWxvKSB7CiAJCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7Ci0JCWRwcmludGsoIiVzOiBubyBsYXlvdXQgc2VnbWVudHMgdG8gcmV0dXJuXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OworCQlkcHJpbnRrKCIlczogbm8gbGF5b3V0IHRvIHJldHVyblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAlzdGF0ZWlkID0gbmZzaS0+bGF5b3V0LT5wbGhfc3RhdGVpZDsKIAkvKiBSZWZlcmVuY2UgbWF0Y2hlZCBpbiBuZnM0X2xheW91dHJldHVybl9yZWxlYXNlICovCiAJZ2V0X2xheW91dF9oZHIobG8pOworCW1hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChsbywgJnRtcF9saXN0LCBOVUxMKTsKKwlsby0+cGxoX2Jsb2NrX2xnZXRzKys7CiAJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKIAlwbmZzX2ZyZWVfbHNlZ19saXN0KCZ0bXBfbGlzdCk7CiAKQEAgLTY1MCw2ICs2NTIsOSBAQAogCWxycCA9IGt6YWxsb2Moc2l6ZW9mKCpscnApLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkobHJwID09IE5VTEwpKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CisJCXNldF9iaXQoTkZTX0xBWU9VVF9SV19GQUlMRUQsICZsby0+cGxoX2ZsYWdzKTsKKwkJc2V0X2JpdChORlNfTEFZT1VUX1JPX0ZBSUxFRCwgJmxvLT5wbGhfZmxhZ3MpOworCQlwdXRfbGF5b3V0X2hkcihsbyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODg3LDcgKzg5Miw3IEBACiAJCQlyZXQgPSBnZXRfbHNlZyhsc2VnKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChjbXBfbGF5b3V0KHJhbmdlLCAmbHNlZy0+cGxzX3JhbmdlKSA+IDApCisJCWlmIChsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0ID4gcmFuZ2UtPm9mZnNldCkKIAkJCWJyZWFrOwogCX0KIApAQCAtMTA1OSwyMyArMTA2NCwzNiBAQAogCQlnZnBfZmxhZ3MgPSBHRlBfTk9GUzsKIAl9CiAKLQlpZiAocGdpby0+cGdfY291bnQgPT0gcHJldi0+d2JfYnl0ZXMpIHsKKwlpZiAocGdpby0+cGdfbHNlZyA9PSBOVUxMKSB7CisJCWlmIChwZ2lvLT5wZ19jb3VudCAhPSBwcmV2LT53Yl9ieXRlcykKKwkJCXJldHVybiB0cnVlOwogCQkvKiBUaGlzIGlzIGZpcnN0IGNvZWxlc2NlIGNhbGwgZm9yIGEgc2VyaWVzIG9mIG5mc19wYWdlcyAqLwogCQlwZ2lvLT5wZ19sc2VnID0gcG5mc191cGRhdGVfbGF5b3V0KHBnaW8tPnBnX2lub2RlLAogCQkJCQkJICAgcHJldi0+d2JfY29udGV4dCwKLQkJCQkJCSAgIHJlcV9vZmZzZXQocmVxKSwKKwkJCQkJCSAgIHJlcV9vZmZzZXQocHJldiksCiAJCQkJCQkgICBwZ2lvLT5wZ19jb3VudCwKIAkJCQkJCSAgIGFjY2Vzc190eXBlLAogCQkJCQkJICAgZ2ZwX2ZsYWdzKTsKLQkJcmV0dXJuIHRydWU7CisJCWlmIChwZ2lvLT5wZ19sc2VnID09IE5VTEwpCisJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZiAocGdpby0+cGdfbHNlZyAmJgotCSAgICByZXFfb2Zmc2V0KHJlcSkgPiBlbmRfb2Zmc2V0KHBnaW8tPnBnX2xzZWctPnBsc19yYW5nZS5vZmZzZXQsCi0JCQkJCSBwZ2lvLT5wZ19sc2VnLT5wbHNfcmFuZ2UubGVuZ3RoKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7CisJLyoKKwkgKiBUZXN0IGlmIGEgbmZzX3BhZ2UgaXMgZnVsbHkgY29udGFpbmVkIGluIHRoZSBwbmZzX2xheW91dF9yYW5nZS4KKwkgKiBOb3RlIHRoYXQgdGhpcyB0ZXN0IG1ha2VzIHNldmVyYWwgYXNzdW1wdGlvbnM6CisJICogLSB0aGF0IHRoZSBwcmV2aW91cyBuZnNfcGFnZSBpbiB0aGUgc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvcgorCSAqICAgaXMga25vd24gdG8gbGllIHdpdGhpbiB0aGUgcmFuZ2UuCisJICogICAtIHRoYXQgdGhlIG5mc19wYWdlIGJlaW5nIHRlc3RlZCBpcyBrbm93biB0byBiZSBjb250aWd1b3VzIHdpdGggdGhlCisJICogICBwcmV2aW91cyBuZnNfcGFnZS4KKwkgKiAgIC0gTGF5b3V0IHJhbmdlcyBhcmUgcGFnZSBhbGlnbmVkLCBzbyB3ZSBvbmx5IGhhdmUgdG8gdGVzdCB0aGUKKwkgKiAgIHN0YXJ0IG9mZnNldCBvZiB0aGUgcmVxdWVzdC4KKwkgKgorCSAqIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCAnZW5kX29mZnNldCcgaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBvZiB0aGUKKwkgKiBmaXJzdCBieXRlIHRoYXQgbGllcyBvdXRzaWRlIHRoZSBwbmZzX2xheW91dF9yYW5nZS4gRklYTUU/CisJICoKKwkgKi8KKwlyZXR1cm4gcmVxX29mZnNldChyZXEpIDwgZW5kX29mZnNldChwZ2lvLT5wZ19sc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAorCQkJCQkgcGdpby0+cGdfbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbmZzX2dlbmVyaWNfcGdfdGVzdCk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmggYi9mcy9uZnMvcG5mcy5oCmluZGV4IDQ4ZDBhOGUuLjk2YmY0ZTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmgKKysrIGIvZnMvbmZzL3BuZnMuaApAQCAtMTg2LDYgKzE4Niw3IEBACiAvKiBwbmZzX2Rldi5jICovCiBzdHJ1Y3QgbmZzNF9kZXZpY2VpZF9ub2RlIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQkJbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkJdG1wbm9kZTsKIAljb25zdCBzdHJ1Y3QgcG5mc19sYXlvdXRkcml2ZXJfdHlwZSAqbGQ7CiAJY29uc3Qgc3RydWN0IG5mc19jbGllbnQJCSpuZnNfY2xpZW50OwogCXN0cnVjdCBuZnM0X2RldmljZWlkCQlkZXZpY2VpZDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzX2Rldi5jIGIvZnMvbmZzL3BuZnNfZGV2LmMKaW5kZXggYzY1ZTEzMy4uZjBmOGUxZSAxMDA2NDQKLS0tIGEvZnMvbmZzL3BuZnNfZGV2LmMKKysrIGIvZnMvbmZzL3BuZnNfZGV2LmMKQEAgLTE3NCw2ICsxNzQsNyBAQAogCQkJY29uc3Qgc3RydWN0IG5mczRfZGV2aWNlaWQgKmlkKQogewogCUlOSVRfSExJU1RfTk9ERSgmZC0+bm9kZSk7CisJSU5JVF9ITElTVF9OT0RFKCZkLT50bXBub2RlKTsKIAlkLT5sZCA9IGxkOwogCWQtPm5mc19jbGllbnQgPSBuZnNfY2xpZW50OwogCWQtPmRldmljZWlkID0gKmlkOwpAQCAtMjA4LDYgKzIwOSw3IEBACiAKIAlobGlzdF9hZGRfaGVhZF9yY3UoJm5ldy0+bm9kZSwgJm5mczRfZGV2aWNlaWRfY2FjaGVbaGFzaF0pOwogCXNwaW5fdW5sb2NrKCZuZnM0X2RldmljZWlkX2xvY2spOworCWF0b21pY19pbmMoJm5ldy0+cmVmKTsKIAogCXJldHVybiBuZXc7CiB9CkBAIC0yMzgsMjQgKzI0MCwyOSBAQAogX2RldmljZWlkX3B1cmdlX2NsaWVudChjb25zdCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBsb25nIGhhc2gpCiB7CiAJc3RydWN0IG5mczRfZGV2aWNlaWRfbm9kZSAqZDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwgKm5leHQ7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJSExJU1RfSEVBRCh0bXApOwogCisJc3Bpbl9sb2NrKCZuZnM0X2RldmljZWlkX2xvY2spOwogCXJjdV9yZWFkX2xvY2soKTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZCwgbiwgJm5mczRfZGV2aWNlaWRfY2FjaGVbaGFzaF0sIG5vZGUpCiAJCWlmIChkLT5uZnNfY2xpZW50ID09IGNscCAmJiBhdG9taWNfcmVhZCgmZC0+cmVmKSkgewogCQkJaGxpc3RfZGVsX2luaXRfcmN1KCZkLT5ub2RlKTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZkLT5ub2RlLCAmdG1wKTsKKwkJCWhsaXN0X2FkZF9oZWFkKCZkLT50bXBub2RlLCAmdG1wKTsKIAkJfQogCXJjdV9yZWFkX3VubG9jaygpOworCXNwaW5fdW5sb2NrKCZuZnM0X2RldmljZWlkX2xvY2spOwogCiAJaWYgKGhsaXN0X2VtcHR5KCZ0bXApKQogCQlyZXR1cm47CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGQsIG4sIG5leHQsICZ0bXAsIG5vZGUpCisJd2hpbGUgKCFobGlzdF9lbXB0eSgmdG1wKSkgeworCQlkID0gaGxpc3RfZW50cnkodG1wLmZpcnN0LCBzdHJ1Y3QgbmZzNF9kZXZpY2VpZF9ub2RlLCB0bXBub2RlKTsKKwkJaGxpc3RfZGVsKCZkLT50bXBub2RlKTsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmQtPnJlZikpCiAJCQlkLT5sZC0+ZnJlZV9kZXZpY2VpZF9ub2RlKGQpOworCX0KIH0KIAogdm9pZApAQCAtMjYzLDggKzI3MCw4IEBACiB7CiAJbG9uZyBoOwogCi0Jc3Bpbl9sb2NrKCZuZnM0X2RldmljZWlkX2xvY2spOworCWlmICghKGNscC0+Y2xfZXhjaGFuZ2VfZmxhZ3MgJiBFWENIR0lENF9GTEFHX1VTRV9QTkZTX01EUykpCisJCXJldHVybjsKIAlmb3IgKGggPSAwOyBoIDwgTkZTNF9ERVZJQ0VfSURfSEFTSF9TSVpFOyBoKyspCiAJCV9kZXZpY2VpZF9wdXJnZV9jbGllbnQoY2xwLCBoKTsKLQlzcGluX3VubG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggZTI2OGUzYi4uNzI3MTY4MCAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTg2NCw2ICs4NjQsOCBAQAogCiAJZGF0YS0+YXJncy5maCAgICAgPSBORlNfRkgoaW5vZGUpOwogCWRhdGEtPmFyZ3Mub2Zmc2V0ID0gcmVxX29mZnNldChyZXEpICsgb2Zmc2V0OworCS8qIHBuZnNfc2V0X2xheW91dGNvbW1pdCBuZWVkcyB0aGlzICovCisJZGF0YS0+bWRzX29mZnNldCA9IGRhdGEtPmFyZ3Mub2Zmc2V0OwogCWRhdGEtPmFyZ3MucGdiYXNlID0gcmVxLT53Yl9wZ2Jhc2UgKyBvZmZzZXQ7CiAJZGF0YS0+YXJncy5wYWdlcyAgPSBkYXRhLT5wYWdldmVjOwogCWRhdGEtPmFyZ3MuY291bnQgID0gY291bnQ7CmRpZmYgLS1naXQgYS9mcy9uZnNkL0tjb25maWcgYi9mcy9uZnNkL0tjb25maWcKaW5kZXggMThiM2U4OS4uZmJiMmE1ZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9LY29uZmlnCisrKyBiL2ZzL25mc2QvS2NvbmZpZwpAQCAtODIsNiArODIsNyBAQAogCXNlbGVjdCBORlNEX1YzCiAJc2VsZWN0IEZTX1BPU0lYX0FDTAogCXNlbGVjdCBTVU5SUENfR1NTCisJc2VsZWN0IENSWVBUTwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBpbiB5b3VyIHN5c3RlbSdzIE5GUyBzZXJ2ZXIgZm9yCiAJICB2ZXJzaW9uIDQgb2YgdGhlIE5GUyBwcm90b2NvbCAoUkZDIDM1MzApLgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggMWY1ZWFlNC4uMmIxNDQ5ZCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19rcmI1X2VuY3R5cGVzLmg+CiAKICNpbmNsdWRlICJpZG1hcC5oIgogI2luY2x1ZGUgIm5mc2QuaCIKQEAgLTE4OSwxOCArMTkwLDEwIEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLSNpZmRlZiBDT05GSUdfU1VOUlBDX0dTUworI2lmIGRlZmluZWQoQ09ORklHX1NVTlJQQ19HU1MpIHx8IGRlZmluZWQoQ09ORklHX1NVTlJQQ19HU1NfTU9EVUxFKQogc3RhdGljIGludCBzdXBwb3J0ZWRfZW5jdHlwZXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IGdzc19hcGlfbWVjaCAqazVtZWNoOwotCi0JazVtZWNoID0gZ3NzX21lY2hfZ2V0X2J5X25hbWUoImtyYjUiKTsKLQlpZiAoazVtZWNoID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCWlmIChrNW1lY2gtPmdtX3VwY2FsbF9lbmN0eXBlcyAhPSBOVUxMKQotCQlzZXFfcHJpbnRmKG0sIGs1bWVjaC0+Z21fdXBjYWxsX2VuY3R5cGVzKTsKLQlnc3NfbWVjaF9wdXQoazVtZWNoKTsKLW91dDoKKwlzZXFfcHJpbnRmKG0sIEtSQjVfU1VQUE9SVEVEX0VOQ1RZUEVTKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE1LDcgKzIwOCw3IEBACiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07Ci0jZW5kaWYgLyogQ09ORklHX1NVTlJQQ19HU1MgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1VOUlBDX0dTUyBvciBDT05GSUdfU1VOUlBDX0dTU19NT0RVTEUgKi8KIAogZXh0ZXJuIGludCBuZnNkX3Bvb2xfc3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBleHRlcm4gaW50IG5mc2RfcG9vbF9zdGF0c19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKQEAgLTE0MjcsOSArMTQyMCw5IEBACiAJCVtORlNEX1ZlcnNpb25zXSA9IHsidmVyc2lvbnMiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAogCQlbTkZTRF9Qb3J0c10gPSB7InBvcnRsaXN0IiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVUdPfSwKIAkJW05GU0RfTWF4QmxrU2l6ZV0gPSB7Im1heF9ibG9ja19zaXplIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVUdPfSwKLSNpZmRlZiBDT05GSUdfU1VOUlBDX0dTUworI2lmIGRlZmluZWQoQ09ORklHX1NVTlJQQ19HU1MpIHx8IGRlZmluZWQoQ09ORklHX1NVTlJQQ19HU1NfTU9EVUxFKQogCQlbTkZTRF9TdXBwb3J0ZWRFbmN0eXBlc10gPSB7InN1cHBvcnRlZF9rcmI1X2VuY3R5cGVzIiwgJnN1cHBvcnRlZF9lbmN0eXBlc19vcHMsIFNfSVJVR099LAotI2VuZGlmIC8qIENPTkZJR19TVU5SUENfR1NTICovCisjZW5kaWYgLyogQ09ORklHX1NVTlJQQ19HU1Mgb3IgQ09ORklHX1NVTlJQQ19HU1NfTU9EVUxFICovCiAjaWZkZWYgQ09ORklHX05GU0RfVjQKIAkJW05GU0RfTGVhc2V0aW1lXSA9IHsibmZzdjRsZWFzZXRpbWUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAogCQlbTkZTRF9HcmFjZXRpbWVdID0geyJuZnN2NGdyYWNldGltZSIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCBkNTcxODI3Li5mZDBhY2NhIDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTY5Niw3ICs2OTYsMTUgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfTkZTRF9WMyAqLwogCitzdGF0aWMgaW50IG5mc2Rfb3Blbl9icmVha19sZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYWNjZXNzKQoreworCXVuc2lnbmVkIGludCBtb2RlOwogCisJaWYgKGFjY2VzcyAmIE5GU0RfTUFZX05PVF9CUkVBS19MRUFTRSkKKwkJcmV0dXJuIDA7CisJbW9kZSA9IChhY2Nlc3MgJiBORlNEX01BWV9XUklURSkgPyBPX1dST05MWSA6IE9fUkRPTkxZOworCXJldHVybiBicmVha19sZWFzZShpbm9kZSwgbW9kZSB8IE9fTk9OQkxPQ0spOworfQogCiAvKgogICogT3BlbiBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeS4KQEAgLTc0NCwxMiArNzUyLDcgQEAKIAlpZiAoIWlub2RlLT5pX2ZvcCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGxlYXNlcyBvbiB0aGlzIGZpbGUuCi0JICogVGhpcyBtYXkgYmxvY2sgd2hpbGUgbGVhc2VzIGFyZSBicm9rZW4uCi0JICovCi0JaWYgKCEoYWNjZXNzICYgTkZTRF9NQVlfTk9UX0JSRUFLX0xFQVNFKSkKLQkJaG9zdF9lcnIgPSBicmVha19sZWFzZShpbm9kZSwgT19OT05CTE9DSyB8ICgoYWNjZXNzICYgTkZTRF9NQVlfV1JJVEUpID8gT19XUk9OTFkgOiAwKSk7CisJaG9zdF9lcnIgPSBuZnNkX29wZW5fYnJlYWtfbGVhc2UoaW5vZGUsIGFjY2Vzcyk7CiAJaWYgKGhvc3RfZXJyKSAvKiBOT01FTSBvciBXT1VMREJMT0NLICovCiAJCWdvdG8gb3V0X25mc2VycjsKIApAQCAtMTY2MCw4ICsxNjYzLDEwIEBACiAJaWYgKCFkb2xkLT5kX2lub2RlKQogCQlnb3RvIG91dF9kcm9wX3dyaXRlOwogCWhvc3RfZXJyID0gbmZzZF9icmVha19sZWFzZShkb2xkLT5kX2lub2RlKTsKLQlpZiAoaG9zdF9lcnIpCisJaWYgKGhvc3RfZXJyKSB7CisJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKKwl9CiAJaG9zdF9lcnIgPSB2ZnNfbGluayhkb2xkLCBkaXJwLCBkbmV3KTsKIAlpZiAoIWhvc3RfZXJyKSB7CiAJCWVyciA9IG5mc2Vycm5vKGNvbW1pdF9tZXRhZGF0YShmZmhwKSk7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYnRyZWUuYyBiL2ZzL25pbGZzMi9idHJlZS5jCmluZGV4IDdlYWZlNDYuLmIyZTNmZjMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9idHJlZS5jCisrKyBiL2ZzL25pbGZzMi9idHJlZS5jCkBAIC0xMzQ2LDYgKzEzNDYsMTEgQEAKIAlwYXRoW2xldmVsXS5icF9iaCA9IE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIG5pbGZzX2J0cmVlX25vcChzdHJ1Y3QgbmlsZnNfYm1hcCAqYnRyZWUsCisJCQkgICAgc3RydWN0IG5pbGZzX2J0cmVlX3BhdGggKnBhdGgsCisJCQkgICAgaW50IGxldmVsLCBfX3U2NCAqa2V5cCwgX191NjQgKnB0cnApCit7Cit9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYnRyZWVfcHJlcGFyZV9kZWxldGUoc3RydWN0IG5pbGZzX2JtYXAgKmJ0cmVlLAogCQkJCSAgICAgIHN0cnVjdCBuaWxmc19idHJlZV9wYXRoICpwYXRoLApAQCAtMTM1NiwyMCArMTM2MSwxOSBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKm5vZGUsICpwYXJlbnQsICpzaWI7CiAJX191NjQgc2licHRyOwotCWludCBwaW5kZXgsIGxldmVsLCBuY21pbiwgbmNtYXgsIG5jYmxrLCByZXQ7CisJaW50IHBpbmRleCwgZGluZGV4LCBsZXZlbCwgbmNtaW4sIG5jbWF4LCBuY2JsaywgcmV0OwogCiAJcmV0ID0gMDsKIAlzdGF0cy0+YnNfbmJsb2NrcyA9IDA7CiAJbmNtaW4gPSBOSUxGU19CVFJFRV9OT0RFX05DSElMRFJFTl9NSU4obmlsZnNfYnRyZWVfbm9kZV9zaXplKGJ0cmVlKSk7CiAJbmNibGsgPSBuaWxmc19idHJlZV9uY2hpbGRyZW5fcGVyX2Jsb2NrKGJ0cmVlKTsKIAotCWZvciAobGV2ZWwgPSBOSUxGU19CVFJFRV9MRVZFTF9OT0RFX01JTjsKKwlmb3IgKGxldmVsID0gTklMRlNfQlRSRUVfTEVWRUxfTk9ERV9NSU4sIGRpbmRleCA9IHBhdGhbbGV2ZWxdLmJwX2luZGV4OwogCSAgICAgbGV2ZWwgPCBuaWxmc19idHJlZV9oZWlnaHQoYnRyZWUpIC0gMTsKIAkgICAgIGxldmVsKyspIHsKIAkJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCQlwYXRoW2xldmVsXS5icF9vbGRyZXEuYnByX3B0ciA9Ci0JCQluaWxmc19idHJlZV9ub2RlX2dldF9wdHIobm9kZSwgcGF0aFtsZXZlbF0uYnBfaW5kZXgsCi0JCQkJCQkgbmNibGspOworCQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKG5vZGUsIGRpbmRleCwgbmNibGspOwogCQlyZXQgPSBuaWxmc19ibWFwX3ByZXBhcmVfZW5kX3B0cihidHJlZSwKIAkJCQkJCSAmcGF0aFtsZXZlbF0uYnBfb2xkcmVxLCBkYXQpOwogCQlpZiAocmV0IDwgMCkKQEAgLTEzODMsNiArMTM4Nyw3IEBACiAKIAkJcGFyZW50ID0gbmlsZnNfYnRyZWVfZ2V0X25vZGUoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwgJm5jbWF4KTsKIAkJcGluZGV4ID0gcGF0aFtsZXZlbCArIDFdLmJwX2luZGV4OworCQlkaW5kZXggPSBwaW5kZXg7CiAKIAkJaWYgKHBpbmRleCA+IDApIHsKIAkJCS8qIGxlZnQgc2libGluZyAqLwpAQCAtMTQyMSw2ICsxNDI2LDE0IEBACiAJCQkJcGF0aFtsZXZlbF0uYnBfc2liX2JoID0gYmg7CiAJCQkJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9jb25jYXRfcmlnaHQ7CiAJCQkJc3RhdHMtPmJzX25ibG9ja3MrKzsKKwkJCQkvKgorCQkJCSAqIFdoZW4gbWVyZ2luZyByaWdodCBzaWJsaW5nIG5vZGUKKwkJCQkgKiBpbnRvIHRoZSBjdXJyZW50IG5vZGUsIHBvaW50ZXIgdG8KKwkJCQkgKiB0aGUgcmlnaHQgc2libGluZyBub2RlIG11c3QgYmUKKwkJCQkgKiB0ZXJtaW5hdGVkIGluc3RlYWQuICBUaGUgYWRqdXN0bWVudAorCQkJCSAqIGJlbG93IGlzIHJlcXVpcmVkIGZvciB0aGF0LgorCQkJCSAqLworCQkJCWRpbmRleCA9IHBpbmRleCArIDE7CiAJCQkJLyogY29udGludWU7ICovCiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xNDMxLDI5ICsxNDQ0LDMxIEBACiAJCQkgICAgTklMRlNfQlRSRUVfUk9PVF9OQ0hJTERSRU5fTUFYKSB7CiAJCQkJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9zaHJpbms7CiAJCQkJc3RhdHMtPmJzX25ibG9ja3MgKz0gMjsKKwkJCQlsZXZlbCsrOworCQkJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfbm9wOworCQkJCWdvdG8gc2hyaW5rX3Jvb3RfY2hpbGQ7CiAJCQl9IGVsc2UgewogCQkJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfZG9fZGVsZXRlOwogCQkJCXN0YXRzLT5ic19uYmxvY2tzKys7CisJCQkJZ290byBvdXQ7CiAJCQl9Ci0KLQkJCWdvdG8gb3V0OwotCiAJCX0KIAl9CiAKKwkvKiBjaGlsZCBvZiB0aGUgcm9vdCBub2RlIGlzIGRlbGV0ZWQgKi8KKwlwYXRoW2xldmVsXS5icF9vcCA9IG5pbGZzX2J0cmVlX2RvX2RlbGV0ZTsKKwlzdGF0cy0+YnNfbmJsb2NrcysrOworCitzaHJpbmtfcm9vdF9jaGlsZDoKIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X3Jvb3QoYnRyZWUpOwogCXBhdGhbbGV2ZWxdLmJwX29sZHJlcS5icHJfcHRyID0KLQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKG5vZGUsIHBhdGhbbGV2ZWxdLmJwX2luZGV4LAorCQluaWxmc19idHJlZV9ub2RlX2dldF9wdHIobm9kZSwgZGluZGV4LAogCQkJCQkgTklMRlNfQlRSRUVfUk9PVF9OQ0hJTERSRU5fTUFYKTsKIAogCXJldCA9IG5pbGZzX2JtYXBfcHJlcGFyZV9lbmRfcHRyKGJ0cmVlLCAmcGF0aFtsZXZlbF0uYnBfb2xkcmVxLCBkYXQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9vdXRfY2hpbGRfbm9kZTsKIAotCS8qIGNoaWxkIG9mIHRoZSByb290IG5vZGUgaXMgZGVsZXRlZCAqLwotCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfZG9fZGVsZXRlOwotCXN0YXRzLT5ic19uYmxvY2tzKys7Ci0KIAkvKiBzdWNjZXNzICovCiAgb3V0OgogCSpsZXZlbHAgPSBsZXZlbDsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggYjk1NDg3OC4uYjliNDVmYyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTgwMSwxMiArODAxLDcgQEAKIAogaW50IG5pbGZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgbmlsZnNfcm9vdCAqcm9vdDsKLQotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQotCXJvb3QgPSBOSUxGU19JKGlub2RlKS0+aV9yb290OworCXN0cnVjdCBuaWxmc19yb290ICpyb290ID0gTklMRlNfSShpbm9kZSktPmlfcm9vdDsKIAlpZiAoKG1hc2sgJiBNQVlfV1JJVEUpICYmIHJvb3QgJiYKIAkgICAgcm9vdC0+Y25vICE9IE5JTEZTX0NQVFJFRV9DVVJSRU5UX0NOTykKIAkJcmV0dXJuIC1FUk9GUzsgLyogc25hcHNob3QgaXMgbm90IHdyaXRhYmxlICovCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2VnbWVudC5jIGIvZnMvbmlsZnMyL3NlZ21lbnQuYwppbmRleCAxNDE2NDZlLi5iYjI0YWI2IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2VnbWVudC5jCisrKyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKQEAgLTI1NzMsNyArMjU3Myw3IEBACiAJc2NpLT5zY193YXRlcm1hcmsgPSBOSUxGU19TQ19ERUZBVUxUX1dBVEVSTUFSSzsKIAogCWlmIChuaWxmcy0+bnNfaW50ZXJ2YWwpCi0JCXNjaS0+c2NfaW50ZXJ2YWwgPSBuaWxmcy0+bnNfaW50ZXJ2YWw7CisJCXNjaS0+c2NfaW50ZXJ2YWwgPSBIWiAqIG5pbGZzLT5uc19pbnRlcnZhbDsKIAlpZiAobmlsZnMtPm5zX3dhdGVybWFyaykKIAkJc2NpLT5zY193YXRlcm1hcmsgPSBuaWxmcy0+bnNfd2F0ZXJtYXJrOwogCXJldHVybiBzY2k7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCBjZGJhZjVlLi41NmY2MTAyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTEwNzIsNyArMTA3Miw3IEBACiAKIAlzYi0+c19tYWdpYyA9IE9DRlMyX1NVUEVSX01BR0lDOwogCi0Jc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpIHwKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH4oTVNfUE9TSVhBQ0wgfCBNU19OT1NFQykpIHwKIAkJKChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CiAKIAkvKiBIYXJkIHJlYWRvbmx5IG1vZGUgb25seSBpZjogYmRldl9yZWFkX29ubHksIE1TX1JET05MWSwKZGlmZiAtLWdpdCBhL2ZzL29tZnMvZmlsZS5jIGIvZnMvb21mcy9maWxlLmMKaW5kZXggZDczOGE3ZS4uMmM2ZDk1MiAxMDA2NDQKLS0tIGEvZnMvb21mcy9maWxlLmMKKysrIGIvZnMvb21mcy9maWxlLmMKQEAgLTQsNyArNCw2IEBACiAgKiBSZWxlYXNlZCB1bmRlciBHUEwgdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKaW5kZXggZjgyZTc2Mi4uZDU0NWU5NyAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9jaGVjay5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwpAQCAtMjU1LDEzICsyNTUsNyBAQAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGhkX3N0cnVjdCAqcCA9IGRldl90b19wYXJ0KGRldik7Ci0Jc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOwotCXVuc2lnbmVkIGludCBhbGlnbm1lbnQgPSAwOwotCi0JaWYgKGRpc2stPnF1ZXVlKQotCQlhbGlnbm1lbnQgPSBxdWV1ZV9saW1pdF9kaXNjYXJkX2FsaWdubWVudCgmZGlzay0+cXVldWUtPmxpbWl0cywKLQkJCQkJCQkJcC0+c3RhcnRfc2VjdCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGFsaWdubWVudCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHAtPmRpc2NhcmRfYWxpZ25tZW50KTsKIH0KIAogc3NpemVfdCBwYXJ0X3N0YXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC00NTUsNiArNDQ5LDggQEAKIAlwLT5zdGFydF9zZWN0ID0gc3RhcnQ7CiAJcC0+YWxpZ25tZW50X29mZnNldCA9CiAJCXF1ZXVlX2xpbWl0X2FsaWdubWVudF9vZmZzZXQoJmRpc2stPnF1ZXVlLT5saW1pdHMsIHN0YXJ0KTsKKwlwLT5kaXNjYXJkX2FsaWdubWVudCA9CisJCXF1ZXVlX2xpbWl0X2Rpc2NhcmRfYWxpZ25tZW50KCZkaXNrLT5xdWV1ZS0+bGltaXRzLCBzdGFydCk7CiAJcC0+bnJfc2VjdHMgPSBsZW47CiAJcC0+cGFydG5vID0gcGFydG5vOwogCXAtPnBvbGljeSA9IGdldF9kaXNrX3JvKGRpc2spOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCAxNGRlZjk5Li5mYzViYzI3IDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtMjE2OSwxMSArMjE2OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHJvY19mZF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJ2OwotCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCXJ2ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CisJaW50IHJ2ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CiAJaWYgKHJ2ID09IDApCiAJCXJldHVybiAwOwogCWlmICh0YXNrX3BpZChjdXJyZW50KSA9PSBwcm9jX3BpZChpbm9kZSkpCkBAIC0yNzEyLDYgKzI3MDgsOSBAQAogCXN0cnVjdCB0YXNrX2lvX2FjY291bnRpbmcgYWNjdCA9IHRhc2stPmlvYWM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRCkpCisJCXJldHVybiAtRUFDQ0VTOworCiAJaWYgKHdob2xlICYmIGxvY2tfdGFza19zaWdoYW5kKHRhc2ssICZmbGFncykpIHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0ID0gdGFzazsKIApAQCAtMjg0Myw3ICsyODQyLDcgQEAKIAlSRUcoImNvcmVkdW1wX2ZpbHRlciIsIFNfSVJVR098U19JV1VTUiwgcHJvY19jb3JlZHVtcF9maWx0ZXJfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HCi0JSU5GKCJpbyIsCVNfSVJVR08sIHByb2NfdGdpZF9pb19hY2NvdW50aW5nKSwKKwlJTkYoImlvIiwJU19JUlVTUiwgcHJvY190Z2lkX2lvX2FjY291bnRpbmcpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hBUkRXQUxMCiAJSU5GKCJoYXJkd2FsbCIsICAgU19JUlVHTywgcHJvY19waWRfaGFyZHdhbGwpLApAQCAtMzE4NSw3ICszMTg0LDcgQEAKIAlSRUcoIm1ha2UtaXQtZmFpbCIsIFNfSVJVR098U19JV1VTUiwgcHJvY19mYXVsdF9pbmplY3Rfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HCi0JSU5GKCJpbyIsCVNfSVJVR08sIHByb2NfdGlkX2lvX2FjY291bnRpbmcpLAorCUlORigiaW8iLAlTX0lSVVNSLCBwcm9jX3RpZF9pb19hY2NvdW50aW5nKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVJEV0FMTAogCUlORigiaGFyZHdhbGwiLCAgIFNfSVJVR08sIHByb2NfcGlkX2hhcmR3YWxsKSwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvbmFtZXNwYWNlcy5jIGIvZnMvcHJvYy9uYW1lc3BhY2VzLmMKaW5kZXggNzgxZGVjNS4uYmUxNzdmNyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9uYW1lc3BhY2VzLmMKKysrIGIvZnMvcHJvYy9uYW1lc3BhY2VzLmMKQEAgLTM4LDE4ICszOCwyMSBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHByb2NfaW5vZGUgKmVpOwogCXN0cnVjdCBkZW50cnkgKmVycm9yID0gRVJSX1BUUigtRU5PRU5UKTsKKwl2b2lkICpuczsKIAogCWlub2RlID0gcHJvY19waWRfbWFrZV9pbm9kZShkaXItPmlfc2IsIHRhc2spOwogCWlmICghaW5vZGUpCiAJCWdvdG8gb3V0OwogCisJbnMgPSBuc19vcHMtPmdldCh0YXNrKTsKKwlpZiAoIW5zKQorCQlnb3RvIG91dF9pcHV0OworCiAJZWkgPSBQUk9DX0koaW5vZGUpOwogCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHfFNfSVJVU1I7CiAJaW5vZGUtPmlfZm9wICA9ICZuc19maWxlX29wZXJhdGlvbnM7CiAJZWktPm5zX29wcyAgICA9IG5zX29wczsKLQllaS0+bnMJICAgICAgPSBuc19vcHMtPmdldCh0YXNrKTsKLQlpZiAoIWVpLT5ucykKLQkJZ290byBvdXRfaXB1dDsKKwllaS0+bnMJICAgICAgPSBuczsKIAogCWRlbnRyeS0+ZF9vcCA9ICZwaWRfZGVudHJ5X29wZXJhdGlvbnM7CiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKaW5kZXggZjUwMTMzYy4uZDE2N2RlMyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCisrKyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwpAQCAtMzA0LDkgKzMwNCw2IEBACiAJc3RydWN0IGN0bF90YWJsZSAqdGFibGU7CiAJaW50IGVycm9yOwogCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCiAJLyogRXhlY3V0YWJsZSBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdW5kZXIgL3Byb2Mvc3lzLyAqLwogCWlmICgobWFzayAmIE1BWV9FWEVDKSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVBQ0NFUzsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvcm9vdC5jIGIvZnMvcHJvYy9yb290LmMKaW5kZXggYTkwMDBlOS4uZDZjM2I0MSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9yb290LmMKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTI4LDExICsyOCwxMiBAQAogCiBzdGF0aWMgaW50IHByb2Nfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zOwotCi0JbnMgPSAoc3RydWN0IHBpZF9uYW1lc3BhY2UgKilkYXRhOwotCXNiLT5zX2ZzX2luZm8gPSBnZXRfcGlkX25zKG5zKTsKLQlyZXR1cm4gc2V0X2Fub25fc3VwZXIoc2IsIE5VTEwpOworCWludCBlcnIgPSBzZXRfYW5vbl9zdXBlcihzYiwgTlVMTCk7CisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zID0gKHN0cnVjdCBwaWRfbmFtZXNwYWNlICopZGF0YTsKKwkJc2ItPnNfZnNfaW5mbyA9IGdldF9waWRfbnMobnMpOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IGU4YTYyZjQuLmQ3ODA4OTYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtOTU0LDggKzk1NCw2IEBACiAKIGludCByZWlzZXJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwogCS8qCiAJICogV2UgZG9uJ3QgZG8gcGVybWlzc2lvbiBjaGVja3Mgb24gdGhlIGludGVybmFsIG9iamVjdHMuCiAJICogUGVybWlzc2lvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICJvd25pbmciIG9iamVjdC4KZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL21tYXAtbm9tbXUuYyBiL2ZzL3JvbWZzL21tYXAtbm9tbXUuYwppbmRleCBmMDUxMWU4Li5lZWQ5OTQyIDEwMDY0NAotLS0gYS9mcy9yb21mcy9tbWFwLW5vbW11LmMKKysrIGIvZnMvcm9tZnMvbW1hcC1ub21tdS5jCkBAIC0yNywxNCArMjcsMTggQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gaW5vZGUtPmlfc2ItPnNfbXRkOwotCXVuc2lnbmVkIGxvbmcgaXNpemUsIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGlzaXplLCBvZmZzZXQsIG1heHBhZ2VzLCBscGFnZXM7CiAKIAlpZiAoIW10ZCkKIAkJZ290byBjYW50X21hcF9kaXJlY3RseTsKIAorCS8qIHRoZSBtYXBwaW5nIG11c3RuJ3QgZXh0ZW5kIGJleW9uZCB0aGUgRU9GICovCisJbHBhZ2VzID0gKGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJb2Zmc2V0ID0gcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlpZiAob2Zmc2V0ID4gaXNpemUgfHwgbGVuID4gaXNpemUgfHwgb2Zmc2V0ID4gaXNpemUgLSBsZW4pCisKKwltYXhwYWdlcyA9IChpc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJaWYgKChwZ29mZiA+PSBtYXhwYWdlcykgfHwgKG1heHBhZ2VzIC0gcGdvZmYgPCBscGFnZXMpKQogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FSU5WQUw7CiAKIAkvKiB3ZSBuZWVkIHRvIGNhbGwgZG93biB0byB0aGUgTVREIGxheWVyIHRvIGRvIHRoZSBhY3R1YWwgbWFwcGluZyAqLwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggYzc1NTkzOS4uYWIzZDY3MiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC04MjIsNyArODIyLDcgQEAKIAl9IGVsc2UgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLQkJcy0+c19mbGFncyA9IGZsYWdzOworCQlzLT5zX2ZsYWdzID0gZmxhZ3MgfCBNU19OT1NFQzsKIAkJcy0+c19tb2RlID0gbW9kZTsKIAkJc3RybGNweShzLT5zX2lkLCBiZGV2bmFtZShiZGV2LCBiKSwgc2l6ZW9mKHMtPnNfaWQpKTsKIAkJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBibG9ja19zaXplKGJkZXYpKTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL21vdW50LmMgYi9mcy9zeXNmcy9tb3VudC5jCmluZGV4IDI2Njg5NTcuLmUzNGYwZDkgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL21vdW50LmMKKysrIGIvZnMvc3lzZnMvbW91bnQuYwpAQCAtOTUsNiArOTUsMTQgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyB2b2lkIGZyZWVfc3lzZnNfc3VwZXJfaW5mbyhzdHJ1Y3Qgc3lzZnNfc3VwZXJfaW5mbyAqaW5mbykKK3sKKwlpbnQgdHlwZTsKKwlmb3IgKHR5cGUgPSBLT0JKX05TX1RZUEVfTk9ORTsgdHlwZSA8IEtPQkpfTlNfVFlQRVM7IHR5cGUrKykKKwkJa29ial9uc19kcm9wKHR5cGUsIGluZm8tPm5zW3R5cGVdKTsKKwlrZnJlZShpbmZvKTsKK30KKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKnN5c2ZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7CkBAIC0xMDgsMTEgKzExNiwxMSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWZvciAodHlwZSA9IEtPQkpfTlNfVFlQRV9OT05FOyB0eXBlIDwgS09CSl9OU19UWVBFUzsgdHlwZSsrKQotCQlpbmZvLT5uc1t0eXBlXSA9IGtvYmpfbnNfY3VycmVudCh0eXBlKTsKKwkJaW5mby0+bnNbdHlwZV0gPSBrb2JqX25zX2dyYWJfY3VycmVudCh0eXBlKTsKIAogCXNiID0gc2dldChmc190eXBlLCBzeXNmc190ZXN0X3N1cGVyLCBzeXNmc19zZXRfc3VwZXIsIGluZm8pOwogCWlmIChJU19FUlIoc2IpIHx8IHNiLT5zX2ZzX2luZm8gIT0gaW5mbykKLQkJa2ZyZWUoaW5mbyk7CisJCWZyZWVfc3lzZnNfc3VwZXJfaW5mbyhpbmZvKTsKIAlpZiAoSVNfRVJSKHNiKSkKIAkJcmV0dXJuIEVSUl9DQVNUKHNiKTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKQEAgLTEzMSwxMiArMTM5LDExIEBACiBzdGF0aWMgdm9pZCBzeXNmc19raWxsX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gKmluZm8gPSBzeXNmc19pbmZvKHNiKTsKLQogCS8qIFJlbW92ZSB0aGUgc3VwZXJibG9jayBmcm9tIGZzX3N1cGVycy9zX2luc3RhbmNlcwogCSAqIHNvIHdlIGNhbid0IGZpbmQgaXQsIGJlZm9yZSBmcmVlaW5nIHN5c2ZzX3N1cGVyX2luZm8uCiAJICovCiAJa2lsbF9hbm9uX3N1cGVyKHNiKTsKLQlrZnJlZShpbmZvKTsKKwlmcmVlX3N5c2ZzX3N1cGVyX2luZm8oaW5mbyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzeXNmc19mc190eXBlID0gewpAQCAtMTQ1LDI4ICsxNTIsNiBAQAogCS5raWxsX3NiCT0gc3lzZnNfa2lsbF9zYiwKIH07CiAKLXZvaWQgc3lzZnNfZXhpdF9ucyhlbnVtIGtvYmpfbnNfdHlwZSB0eXBlLCBjb25zdCB2b2lkICpucykKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCi0JbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwotCXNwaW5fbG9jaygmc2JfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShzYiwgJnN5c2ZzX2ZzX3R5cGUuZnNfc3VwZXJzLCBzX2luc3RhbmNlcykgewotCQlzdHJ1Y3Qgc3lzZnNfc3VwZXJfaW5mbyAqaW5mbyA9IHN5c2ZzX2luZm8oc2IpOwotCQkvKgotCQkgKiBJZiB3ZSBzZWUgYSBzdXBlcmJsb2NrIG9uIHRoZSBmc19zdXBlcnMvc19pbnN0YW5jZXMKLQkJICogbGlzdCB0aGUgdW5tb3VudCBoYXMgbm90IGNvbXBsZXRlZCBhbmQgc2ItPnNfZnNfaW5mbwotCQkgKiBwb2ludHMgdG8gYSB2YWxpZCBzdHJ1Y3Qgc3lzZnNfc3VwZXJfaW5mby4KLQkJICovCi0JCS8qIElnbm9yZSBzdXBlcmJsb2NrcyB3aXRoIHRoZSB3cm9uZyBucyAqLwotCQlpZiAoaW5mby0+bnNbdHlwZV0gIT0gbnMpCi0JCQljb250aW51ZTsKLQkJaW5mby0+bnNbdHlwZV0gPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmc2JfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7Ci19Ci0KIGludCBfX2luaXQgc3lzZnNfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvc3lzZnMuaCBiL2ZzL3N5c2ZzL3N5c2ZzLmgKaW5kZXggM2QyOGFmMy4uMmVkMjQwNCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvc3lzZnMuaAorKysgYi9mcy9zeXNmcy9zeXNmcy5oCkBAIC0xMzYsNyArMTM2LDcgQEAKICAqIGluc3RhbmNlKS4KICAqLwogc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gewotCWNvbnN0IHZvaWQgKm5zW0tPQkpfTlNfVFlQRVNdOworCXZvaWQgKm5zW0tPQkpfTlNfVFlQRVNdOwogfTsKICNkZWZpbmUgc3lzZnNfaW5mbyhTQikgKChzdHJ1Y3Qgc3lzZnNfc3VwZXJfaW5mbyAqKShTQi0+c19mc19pbmZvKSkKIGV4dGVybiBzdHJ1Y3Qgc3lzZnNfZGlyZW50IHN5c2ZzX3Jvb3Q7CmRpZmYgLS1naXQgYS9mcy90aW1lcmZkLmMgYi9mcy90aW1lcmZkLmMKaW5kZXggZjY3YWNiZC4uZGZmZWIzNyAxMDA2NDQKLS0tIGEvZnMvdGltZXJmZC5jCisrKyBiL2ZzL3RpbWVyZmQuYwpAQCAtNjEsNyArNjEsOSBAQAogCiAvKgogICogQ2FsbGVkIHdoZW4gdGhlIGNsb2NrIHdhcyBzZXQgdG8gY2FuY2VsIHRoZSB0aW1lcnMgaW4gdGhlIGNhbmNlbAotICogbGlzdC4KKyAqIGxpc3QuIFRoaXMgd2lsbCB3YWtlIHVwIHByb2Nlc3NlcyB3YWl0aW5nIG9uIHRoZXNlIHRpbWVycy4gVGhlCisgKiB3YWtlLXVwIHJlcXVpcmVzIGN0eC0+dGlja3MgdG8gYmUgbm9uIHplcm8sIHRoZXJlZm9yZSB3ZSBpbmNyZW1lbnQKKyAqIGl0IGJlZm9yZSBjYWxsaW5nIHdha2VfdXBfbG9ja2VkKCkuCiAgKi8KIHZvaWQgdGltZXJmZF9jbG9ja193YXNfc2V0KHZvaWQpCiB7CkBAIC03Niw2ICs3OCw3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPndxaC5sb2NrLCBmbGFncyk7CiAJCWlmIChjdHgtPm1vZmZzLnR2NjQgIT0gbW9mZnMudHY2NCkgewogCQkJY3R4LT5tb2Zmcy50djY0ID0gS1RJTUVfTUFYOworCQkJY3R4LT50aWNrcysrOwogCQkJd2FrZV91cF9sb2NrZWQoJmN0eC0+d3FoKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPndxaC5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9pby5jIGIvZnMvdWJpZnMvaW8uYwppbmRleCAxNjY5NTFlLi4zYmU2NDVlIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9pby5jCisrKyBiL2ZzL3ViaWZzL2lvLmMKQEAgLTU4MSw2ICs1ODEsNyBAQAogCXViaWZzX2Fzc2VydCh3YnVmLT5zaXplICUgYy0+bWluX2lvX3NpemUgPT0gMCk7CiAJdWJpZnNfYXNzZXJ0KG11dGV4X2lzX2xvY2tlZCgmd2J1Zi0+aW9fbXV0ZXgpKTsKIAl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7CisJdWJpZnNfYXNzZXJ0KCFjLT5zcGFjZV9maXh1cCk7CiAJaWYgKGMtPmxlYl9zaXplIC0gd2J1Zi0+b2ZmcyA+PSBjLT5tYXhfd3JpdGVfc2l6ZSkKIAkJdWJpZnNfYXNzZXJ0KCEoKHdidWYtPm9mZnMgKyB3YnVmLT5zaXplKSAlIGMtPm1heF93cml0ZV9zaXplKSk7CiAKQEAgLTc1OSw2ICs3NjAsNyBAQAogCXViaWZzX2Fzc2VydChsbnVtID49IDAgJiYgbG51bSA8IGMtPmxlYl9jbnQgJiYgb2ZmcyA+PSAwKTsKIAl1Ymlmc19hc3NlcnQob2ZmcyAlIGMtPm1pbl9pb19zaXplID09IDAgJiYgb2ZmcyA8IGMtPmxlYl9zaXplKTsKIAl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7CisJdWJpZnNfYXNzZXJ0KCFjLT5zcGFjZV9maXh1cCk7CiAKIAlpZiAoYy0+cm9fZXJyb3IpCiAJCXJldHVybiAtRVJPRlM7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9qb3VybmFsLmMgYi9mcy91Ymlmcy9qb3VybmFsLmMKaW5kZXggMzRiMTY3OS4uY2VmMDQ2MCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvam91cm5hbC5jCisrKyBiL2ZzL3ViaWZzL2pvdXJuYWwuYwpAQCAtNjY5LDYgKzY2OSw3IEBACiAKIG91dF9yZWxlYXNlOgogCXJlbGVhc2VfaGVhZChjLCBCQVNFSEQpOworCWtmcmVlKGRlbnQpOwogb3V0X3JvOgogCXViaWZzX3JvX21vZGUoYywgZXJyKTsKIAlpZiAobGFzdF9yZWZlcmVuY2UpCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9vcnBoYW4uYyBiL2ZzL3ViaWZzL29ycGhhbi5jCmluZGV4IGJkNjQ0YmYuLmE1NDIyZmYgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL29ycGhhbi5jCisrKyBiL2ZzL3ViaWZzL29ycGhhbi5jCkBAIC02NzQsNyArNjc0LDcgQEAKIAkJaWYgKElTX0VSUihzbGViKSkgewogCQkJaWYgKFBUUl9FUlIoc2xlYikgPT0gLUVVQ0xFQU4pCiAJCQkJc2xlYiA9IHViaWZzX3JlY292ZXJfbGViKGMsIGxudW0sIDAsCi0JCQkJCQkJIGMtPnNidWYsIDApOworCQkJCQkJCSBjLT5zYnVmLCAtMSk7CiAJCQlpZiAoSVNfRVJSKHNsZWIpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihzbGViKTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3JlY292ZXJ5LmMgYi9mcy91Ymlmcy9yZWNvdmVyeS5jCmluZGV4IDczMWQ5ZTIuLjc4M2Q4ZTAgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3JlY292ZXJ5LmMKKysrIGIvZnMvdWJpZnMvcmVjb3ZlcnkuYwpAQCAtNTY0LDE5ICs1NjQsMTUgQEAKIH0KIAogLyoqCi0gKiBkcm9wX2xhc3Rfbm9kZSAtIGRyb3AgdGhlIGxhc3Qgbm9kZSBvciBncm91cCBvZiBub2Rlcy4KKyAqIGRyb3BfbGFzdF9ncm91cCAtIGRyb3AgdGhlIGxhc3QgZ3JvdXAgb2Ygbm9kZXMuCiAgKiBAc2xlYjogc2Nhbm5lZCBMRUIgaW5mb3JtYXRpb24KICAqIEBvZmZzOiBvZmZzZXQgb2YgZHJvcHBlZCBub2RlcyBpcyByZXR1cm5lZCBoZXJlCi0gKiBAZ3JvdXBlZDogbm9uLXplcm8gaWYgd2hvbGUgZ3JvdXAgb2Ygbm9kZXMgaGF2ZSB0byBiZSBkcm9wcGVkCiAgKgogICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgJ3ViaWZzX3JlY292ZXJfbGViKCknIHdoaWNoIGRyb3BzIHRoZSBsYXN0Ci0gKiBub2RlIG9mIHRoZSBzY2FubmVkIExFQiBvciB0aGUgbGFzdCBncm91cCBvZiBub2RlcyBpZiBAZ3JvdXBlZCBpcyBub3QgemVyby4KLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMSBpZiBhIG5vZGUgd2FzIGRyb3BwZWQgYW5kICUwIG90aGVyd2lzZS4KKyAqIGdyb3VwIG9mIG5vZGVzIG9mIHRoZSBzY2FubmVkIExFQi4KICAqLwotc3RhdGljIGludCBkcm9wX2xhc3Rfbm9kZShzdHJ1Y3QgdWJpZnNfc2Nhbl9sZWIgKnNsZWIsIGludCAqb2ZmcywgaW50IGdyb3VwZWQpCitzdGF0aWMgdm9pZCBkcm9wX2xhc3RfZ3JvdXAoc3RydWN0IHViaWZzX3NjYW5fbGViICpzbGViLCBpbnQgKm9mZnMpCiB7Ci0JaW50IGRyb3BwZWQgPSAwOwotCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZzbGViLT5ub2RlcykpIHsKIAkJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc25vZDsKIAkJc3RydWN0IHViaWZzX2NoICpjaDsKQEAgLTU4NSwxNyArNTgxLDQwIEBACiAJCQkJICBsaXN0KTsKIAkJY2ggPSBzbm9kLT5ub2RlOwogCQlpZiAoY2gtPmdyb3VwX3R5cGUgIT0gVUJJRlNfSU5fTk9ERV9HUk9VUCkKLQkJCXJldHVybiBkcm9wcGVkOwotCQlkYmdfcmN2cnkoImRyb3BwaW5nIG5vZGUgYXQgJWQ6JWQiLCBzbGViLT5sbnVtLCBzbm9kLT5vZmZzKTsKKwkJCWJyZWFrOworCisJCWRiZ19yY3ZyeSgiZHJvcHBpbmcgZ3JvdXBlZCBub2RlIGF0ICVkOiVkIiwKKwkJCSAgc2xlYi0+bG51bSwgc25vZC0+b2Zmcyk7CiAJCSpvZmZzID0gc25vZC0+b2ZmczsKIAkJbGlzdF9kZWwoJnNub2QtPmxpc3QpOwogCQlrZnJlZShzbm9kKTsKIAkJc2xlYi0+bm9kZXNfY250IC09IDE7Ci0JCWRyb3BwZWQgPSAxOwotCQlpZiAoIWdyb3VwZWQpCi0JCQlicmVhazsKIAl9Ci0JcmV0dXJuIGRyb3BwZWQ7Cit9CisKKy8qKgorICogZHJvcF9sYXN0X25vZGUgLSBkcm9wIHRoZSBsYXN0IG5vZGUuCisgKiBAc2xlYjogc2Nhbm5lZCBMRUIgaW5mb3JtYXRpb24KKyAqIEBvZmZzOiBvZmZzZXQgb2YgZHJvcHBlZCBub2RlcyBpcyByZXR1cm5lZCBoZXJlCisgKiBAZ3JvdXBlZDogbm9uLXplcm8gaWYgd2hvbGUgZ3JvdXAgb2Ygbm9kZXMgaGF2ZSB0byBiZSBkcm9wcGVkCisgKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgJ3ViaWZzX3JlY292ZXJfbGViKCknIHdoaWNoIGRyb3BzIHRoZSBsYXN0CisgKiBub2RlIG9mIHRoZSBzY2FubmVkIExFQi4KKyAqLworc3RhdGljIHZvaWQgZHJvcF9sYXN0X25vZGUoc3RydWN0IHViaWZzX3NjYW5fbGViICpzbGViLCBpbnQgKm9mZnMpCit7CisJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc25vZDsKKworCWlmICghbGlzdF9lbXB0eSgmc2xlYi0+bm9kZXMpKSB7CisJCXNub2QgPSBsaXN0X2VudHJ5KHNsZWItPm5vZGVzLnByZXYsIHN0cnVjdCB1Ymlmc19zY2FuX25vZGUsCisJCQkJICBsaXN0KTsKKworCQlkYmdfcmN2cnkoImRyb3BwaW5nIGxhc3Qgbm9kZSBhdCAlZDolZCIsIHNsZWItPmxudW0sIHNub2QtPm9mZnMpOworCQkqb2ZmcyA9IHNub2QtPm9mZnM7CisJCWxpc3RfZGVsKCZzbm9kLT5saXN0KTsKKwkJa2ZyZWUoc25vZCk7CisJCXNsZWItPm5vZGVzX2NudCAtPSAxOworCX0KIH0KIAogLyoqCkBAIC02MDQsNyArNjIzLDggQEAKICAqIEBsbnVtOiBMRUIgbnVtYmVyCiAgKiBAb2Zmczogb2Zmc2V0CiAgKiBAc2J1ZjogTEVCLXNpemVkIGJ1ZmZlciB0byB1c2UKLSAqIEBncm91cGVkOiBub2RlcyBtYXkgYmUgZ3JvdXBlZCBmb3IgcmVjb3ZlcnkKKyAqIEBqaGVhZDogam91cm5hbCBoZWFkIG51bWJlciB0aGlzIExFQiBiZWxvbmdzIHRvICglLTEgaWYgdGhlIExFQiBkb2VzIG5vdAorICogICAgICAgICBiZWxvbmcgdG8gYW55IGpvdXJuYWwgaGVhZCkKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYSBzY2FuIG9mIGEgTEVCLCBidXQgY2F0ZXJzIGZvciBlcnJvcnMgdGhhdCBtaWdodCBoYXZlCiAgKiBiZWVuIGNhdXNlZCBieSB0aGUgdW5jbGVhbiB1bm1vdW50IGZyb20gd2hpY2ggd2UgYXJlIGF0dGVtcHRpbmcgdG8gcmVjb3Zlci4KQEAgLTYxMiwxMyArNjMyLDE0IEBACiAgKiBmb3VuZCwgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KIHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqdWJpZnNfcmVjb3Zlcl9sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAotCQkJCQkgaW50IG9mZnMsIHZvaWQgKnNidWYsIGludCBncm91cGVkKQorCQkJCQkgaW50IG9mZnMsIHZvaWQgKnNidWYsIGludCBqaGVhZCkKIHsKIAlpbnQgcmV0ID0gMCwgZXJyLCBsZW4gPSBjLT5sZWJfc2l6ZSAtIG9mZnMsIHN0YXJ0ID0gb2ZmcywgbWluX2lvX3VuaXQ7CisJaW50IGdyb3VwZWQgPSBqaGVhZCA9PSAtMSA/IDAgOiBjLT5qaGVhZHNbamhlYWRdLmdyb3VwZWQ7CiAJc3RydWN0IHViaWZzX3NjYW5fbGViICpzbGViOwogCXZvaWQgKmJ1ZiA9IHNidWYgKyBvZmZzOwogCi0JZGJnX3JjdnJ5KCIlZDolZCIsIGxudW0sIG9mZnMpOworCWRiZ19yY3ZyeSgiJWQ6JWQsIGpoZWFkICVkLCBncm91cGVkICVkIiwgbG51bSwgb2ZmcywgamhlYWQsIGdyb3VwZWQpOwogCiAJc2xlYiA9IHViaWZzX3N0YXJ0X3NjYW4oYywgbG51bSwgb2Zmcywgc2J1Zik7CiAJaWYgKElTX0VSUihzbGViKSkKQEAgLTYzNSw3ICs2NTYsNyBAQAogCQkgKiBTY2FuIHF1aWV0bHkgdW50aWwgdGhlcmUgaXMgYW4gZXJyb3IgZnJvbSB3aGljaCB3ZSBjYW5ub3QKIAkJICogcmVjb3ZlcgogCQkgKi8KLQkJcmV0ID0gdWJpZnNfc2Nhbl9hX25vZGUoYywgYnVmLCBsZW4sIGxudW0sIG9mZnMsIDApOworCQlyZXQgPSB1Ymlmc19zY2FuX2Ffbm9kZShjLCBidWYsIGxlbiwgbG51bSwgb2ZmcywgMSk7CiAJCWlmIChyZXQgPT0gU0NBTk5FRF9BX05PREUpIHsKIAkJCS8qIEEgdmFsaWQgbm9kZSwgYW5kIG5vdCBhIHBhZGRpbmcgbm9kZSAqLwogCQkJc3RydWN0IHViaWZzX2NoICpjaCA9IGJ1ZjsKQEAgLTY5NSw1OSArNzE2LDYyIEBACiAJCSAqIElmIG5vZGVzIGFyZSBncm91cGVkLCBhbHdheXMgZHJvcCB0aGUgaW5jb21wbGV0ZSBncm91cCBhdAogCQkgKiB0aGUgZW5kLgogCQkgKi8KLQkJZHJvcF9sYXN0X25vZGUoc2xlYiwgJm9mZnMsIDEpOworCQlkcm9wX2xhc3RfZ3JvdXAoc2xlYiwgJm9mZnMpOwogCi0JLyoKLQkgKiBXaGlsZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc2FtZSBtaW4uIEkvTyB1bml0IGtlZXAgZHJvcHBpbmcKLQkgKiBub2Rlcy4gU28gYmFzaWNhbGx5LCB3aGF0IHdlIHdhbnQgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxhc3QgbWluLgotCSAqIEkvTyB1bml0IHdoZXJlIHdlIHNhdyB0aGUgY29ycnVwdGlvbiBpcyBkcm9wcGVkIGNvbXBsZXRlbHkgd2l0aCBhbGwKLQkgKiB0aGUgdW5jb3JydXB0ZWQgbm9kZSB3aGljaCBtYXkgcG9zc2libHkgc2l0IHRoZXJlLgotCSAqCi0JICogSW4gb3RoZXIgd29yZHMsIGxldCdzIG5hbWUgdGhlIG1pbi4gSS9PIHVuaXQgd2hlcmUgdGhlIGNvcnJ1cHRpb24KLQkgKiBzdGFydHMgQiwgYW5kIHRoZSBwcmV2aW91cyBtaW4uIEkvTyB1bml0IEEuIFRoZSBiZWxvdyBjb2RlIHRyaWVzIHRvCi0JICogZGVhbCB3aXRoIGEgc2l0dWF0aW9uIHdoZW4gaGFsZiBvZiBCIGNvbnRhaW5zIHZhbGlkIG5vZGVzIG9yIHRoZSBlbmQKLQkgKiBvZiBhIHZhbGlkIG5vZGUsIGFuZCB0aGUgc2Vjb25kIGhhbGYgb2YgQiBjb250YWlucyBjb3JydXB0ZWQgZGF0YSBvcgotCSAqIGdhcmJhZ2UuIFRoaXMgbWVhbnMgdGhhdCBVQklGUyBoYWQgYmVlbiB3cml0aW5nIHRvIEIganVzdCBiZWZvcmUgdGhlCi0JICogcG93ZXIgY3V0IGhhcHBlbmVkLiBJIGRvIG5vdCBrbm93IGhvdyByZWFsaXN0aWMgaXMgdGhpcyBzY2VuYXJpbwotCSAqIHRoYXQgaGFsZiBvZiB0aGUgbWluLiBJL08gdW5pdCBoYWQgYmVlbiB3cml0dGVuIHN1Y2Nlc3NmdWxseSBhbmQgdGhlCi0JICogb3RoZXIgaGFsZiBub3QsIGJ1dCB0aGlzIGlzIHBvc3NpYmxlIGluIG91ciAnZmFpbHVyZSBtb2RlIGVtdWxhdGlvbicKLQkgKiBpbmZyYXN0cnVjdHVyZSBhdCBsZWFzdC4KLQkgKgotCSAqIFNvIHdoYXQgaXMgdGhlIHByb2JsZW0sIHdoeSB3ZSBuZWVkIHRvIGRyb3AgdGhvc2Ugbm9kZXM/IFdoZXkgY2FuJ3QKLQkgKiB3ZSBqdXN0IGNsZWFuLXVwIHRoZSBzZWNvbmQgaGFsZiBvZiBCIGJ5IHB1dHRpbmcgYSBwYWRkaW5nIG5vZGUKLQkgKiB0aGVyZT8gV2UgY2FuLCBhbmQgdGhpcyB3b3JrcyBmaW5lIHdpdGggb25lIGV4Y2VwdGlvbiB3aGljaCB3YXMKLQkgKiByZXByb2R1Y2VkIHdpdGggcG93ZXIgY3V0IGVtdWxhdGlvbiB0ZXN0aW5nIGFuZCBoYXBwZW5zIGV4dHJlbWVseQotCSAqIHJhcmVseS4gVGhlIGRlc2NyaXB0aW9uIGZvbGxvd3MsIGJ1dCBpdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGF0IGlzCi0JICogb25seSBhYm91dCB0aGUgR0MgaGVhZCwgc28gd2UgY291bGQgZG8gdGhpcyB0cmljayBvbmx5IGlmIHRoZSBidWQKLQkgKiBiZWxvbmdzIHRvIHRoZSBHQyBoZWFkLCBidXQgaXQgZG9lcyBub3Qgc2VlbSB0byBiZSB3b3J0aCBhbgotCSAqIGFkZGl0aW9uYWwgImlmIiBzdGF0ZW1lbnQuCi0JICoKLQkgKiBTbywgaW1hZ2luZSB0aGUgZmlsZS1zeXN0ZW0gaXMgZnVsbCwgd2UgcnVuIEdDIHdoaWNoIGlzIG1vdmluZyB2YWxpZAotCSAqIG5vZGVzIGZyb20gTEVCIFggdG8gTEVCIFkgKG9idmlvdXNseSwgTEVCIFkgaXMgdGhlIGN1cnJlbnQgR0MgaGVhZAotCSAqIExFQikuIFRoZSBAYy0+Z2NfbG51bSBpcyAtMSwgd2hpY2ggbWVhbnMgdGhhdCBHQyB3aWxsIHJldGFpbiBMRUIgWAotCSAqIGFuZCB3aWxsIHRyeSB0byBjb250aW51ZS4gSW1hZ2luZSB0aGF0IExFQiBYIGlzIGN1cnJlbnRseSB0aGUKLQkgKiBkaXJ0aWVzdCBMRUIsIGFuZCB0aGUgYW1vdW50IG9mIHVzZWQgc3BhY2UgaW4gTEVCIFkgaXMgZXhhY3RseSB0aGUKLQkgKiBzYW1lIGFzIGFtb3VudCBvZiBmcmVlIHNwYWNlIGluIExFQiBYLgotCSAqCi0JICogQW5kIGEgcG93ZXIgY3V0IGhhcHBlbnMgd2hlbiBub2RlcyBhcmUgbW92ZWQgZnJvbSBMRUIgWCB0byBMRUIgWS4gV2UKLQkgKiBhcmUgaGVyZSB0cnlpbmcgdG8gcmVjb3ZlciBMRUIgWSB3aGljaCBpcyB0aGUgR0MgaGVhZCBMRUIuIFdlIGZpbmQKLQkgKiB0aGUgbWluLiBJL08gdW5pdCBCIGFzIGRlc2NyaWJlZCBhYm92ZS4gVGhlbiB3ZSBjbGVhbi11cCBMRUIgWSBieQotCSAqIHBhZGRpbmcgbWluLiBJL08gdW5pdC4gQW5kIGxhdGVyICd1Ymlmc19yY3ZyeV9nY19jb21taXQoKScgZnVuY3Rpb24KLQkgKiBmYWlscywgYmVjYXVzZSBpdCBjYW5ub3QgZmluZCBhIGRpcnR5IExFQiB3aGljaCBjb3VsZCBiZSBHQydkIGludG8KLQkgKiBMRUIgWSEgRXZlbiBMRUIgWCBkb2VzIG5vdCBtYXRjaCBiZWNhdXNlIHRoZSBhbW91bnQgb2YgdmFsaWQgbm9kZXMKLQkgKiB0aGVyZSBkb2VzIG5vdCBmaXQgdGhlIGZyZWUgc3BhY2UgaW4gTEVCIFkgYW55IG1vcmUhIEFuZCB0aGlzIGlzCi0JICogYmVjYXVzZSBvZiB0aGUgcGFkZGluZyBub2RlIHdoaWNoIHdlIGFkZGVkIHRvIExFQiBZLiBUaGUKLQkgKiB1c2VyLXZpc2libGUgZWZmZWN0IG9mIHRoaXMgd2hpY2ggSSBvbmNlIG9ic2VydmVkIGFuZCBhbmFseXNlZCBpcwotCSAqIHRoYXQgd2UgY2Fubm90IG1vdW50IHRoZSBmaWxlLXN5c3RlbSB3aXRoIC1FTk9TUEMgZXJyb3IuCi0JICoKLQkgKiBTbyBvYnZpb3VzbHksIHRvIG1ha2Ugc3VyZSB0aGF0IHNpdHVhdGlvbiBkb2VzIG5vdCBoYXBwZW4gd2Ugc2hvdWxkCi0JICogZnJlZSBtaW4uIEkvTyB1bml0IEIgaW4gTEVCIFkgY29tcGxldGVseSBhbmQgdGhlIGxhc3QgdXNlZCBtaW4uIEkvTwotCSAqIHVuaXQgaW4gTEVCIFkgc2hvdWxkIGJlIEEuIFRoaXMgaXMgYmFzaWNhbGx5IHdoYXQgdGhlIGJlbG93IGNvZGUKLQkgKiB0cmllcyB0byBkby4KLQkgKi8KLQl3aGlsZSAobWluX2lvX3VuaXQgPT0gcm91bmRfZG93bihvZmZzLCBjLT5taW5faW9fc2l6ZSkgJiYKLQkgICAgICAgbWluX2lvX3VuaXQgIT0gb2ZmcyAmJgotCSAgICAgICBkcm9wX2xhc3Rfbm9kZShzbGViLCAmb2ZmcywgZ3JvdXBlZCkpOworCWlmIChqaGVhZCA9PSBHQ0hEKSB7CisJCS8qCisJCSAqIElmIHRoaXMgTEVCIGJlbG9uZ3MgdG8gdGhlIEdDIGhlYWQgdGhlbiB3aGlsZSB3ZSBhcmUgaW4gdGhlCisJCSAqIG1pZGRsZSBvZiB0aGUgc2FtZSBtaW4uIEkvTyB1bml0IGtlZXAgZHJvcHBpbmcgbm9kZXMuIFNvCisJCSAqIGJhc2ljYWxseSwgd2hhdCB3ZSB3YW50IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsYXN0IG1pbi4KKwkJICogSS9PIHVuaXQgd2hlcmUgd2Ugc2F3IHRoZSBjb3JydXB0aW9uIGlzIGRyb3BwZWQgY29tcGxldGVseQorCQkgKiB3aXRoIGFsbCB0aGUgdW5jb3JydXB0ZWQgbm9kZXMgd2hpY2ggbWF5IHBvc3NpYmx5IHNpdCB0aGVyZS4KKwkJICoKKwkJICogSW4gb3RoZXIgd29yZHMsIGxldCdzIG5hbWUgdGhlIG1pbi4gSS9PIHVuaXQgd2hlcmUgdGhlCisJCSAqIGNvcnJ1cHRpb24gc3RhcnRzIEIsIGFuZCB0aGUgcHJldmlvdXMgbWluLiBJL08gdW5pdCBBLiBUaGUKKwkJICogYmVsb3cgY29kZSB0cmllcyB0byBkZWFsIHdpdGggYSBzaXR1YXRpb24gd2hlbiBoYWxmIG9mIEIKKwkJICogY29udGFpbnMgdmFsaWQgbm9kZXMgb3IgdGhlIGVuZCBvZiBhIHZhbGlkIG5vZGUsIGFuZCB0aGUKKwkJICogc2Vjb25kIGhhbGYgb2YgQiBjb250YWlucyBjb3JydXB0ZWQgZGF0YSBvciBnYXJiYWdlLiBUaGlzCisJCSAqIG1lYW5zIHRoYXQgVUJJRlMgaGFkIGJlZW4gd3JpdGluZyB0byBCIGp1c3QgYmVmb3JlIHRoZSBwb3dlcgorCQkgKiBjdXQgaGFwcGVuZWQuIEkgZG8gbm90IGtub3cgaG93IHJlYWxpc3RpYyBpcyB0aGlzIHNjZW5hcmlvCisJCSAqIHRoYXQgaGFsZiBvZiB0aGUgbWluLiBJL08gdW5pdCBoYWQgYmVlbiB3cml0dGVuIHN1Y2Nlc3NmdWxseQorCQkgKiBhbmQgdGhlIG90aGVyIGhhbGYgbm90LCBidXQgdGhpcyBpcyBwb3NzaWJsZSBpbiBvdXIgJ2ZhaWx1cmUKKwkJICogbW9kZSBlbXVsYXRpb24nIGluZnJhc3RydWN0dXJlIGF0IGxlYXN0LgorCQkgKgorCQkgKiBTbyB3aGF0IGlzIHRoZSBwcm9ibGVtLCB3aHkgd2UgbmVlZCB0byBkcm9wIHRob3NlIG5vZGVzPyBXaHkKKwkJICogY2FuJ3Qgd2UganVzdCBjbGVhbi11cCB0aGUgc2Vjb25kIGhhbGYgb2YgQiBieSBwdXR0aW5nIGEKKwkJICogcGFkZGluZyBub2RlIHRoZXJlPyBXZSBjYW4sIGFuZCB0aGlzIHdvcmtzIGZpbmUgd2l0aCBvbmUKKwkJICogZXhjZXB0aW9uIHdoaWNoIHdhcyByZXByb2R1Y2VkIHdpdGggcG93ZXIgY3V0IGVtdWxhdGlvbgorCQkgKiB0ZXN0aW5nIGFuZCBoYXBwZW5zIGV4dHJlbWVseSByYXJlbHkuCisJCSAqCisJCSAqIEltYWdpbmUgdGhlIGZpbGUtc3lzdGVtIGlzIGZ1bGwsIHdlIHJ1biBHQyB3aGljaCBzdGFydHMKKwkJICogbW92aW5nIHZhbGlkIG5vZGVzIGZyb20gTEVCIFggdG8gTEVCIFkgKG9idmlvdXNseSwgTEVCIFkgaXMKKwkJICogdGhlIGN1cnJlbnQgR0MgaGVhZCBMRUIpLiBUaGUgQGMtPmdjX2xudW0gaXMgLTEsIHdoaWNoIG1lYW5zCisJCSAqIHRoYXQgR0Mgd2lsbCByZXRhaW4gTEVCIFggYW5kIHdpbGwgdHJ5IHRvIGNvbnRpbnVlLiBJbWFnaW5lCisJCSAqIHRoYXQgTEVCIFggaXMgY3VycmVudGx5IHRoZSBkaXJ0aWVzdCBMRUIsIGFuZCB0aGUgYW1vdW50IG9mCisJCSAqIHVzZWQgc3BhY2UgaW4gTEVCIFkgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBhbW91bnQgb2YgZnJlZQorCQkgKiBzcGFjZSBpbiBMRUIgWC4KKwkJICoKKwkJICogQW5kIGEgcG93ZXIgY3V0IGhhcHBlbnMgd2hlbiBub2RlcyBhcmUgbW92ZWQgZnJvbSBMRUIgWCB0bworCQkgKiBMRUIgWS4gV2UgYXJlIGhlcmUgdHJ5aW5nIHRvIHJlY292ZXIgTEVCIFkgd2hpY2ggaXMgdGhlIEdDCisJCSAqIGhlYWQgTEVCLiBXZSBmaW5kIHRoZSBtaW4uIEkvTyB1bml0IEIgYXMgZGVzY3JpYmVkIGFib3ZlLgorCQkgKiBUaGVuIHdlIGNsZWFuLXVwIExFQiBZIGJ5IHBhZGRpbmcgbWluLiBJL08gdW5pdC4gQW5kIGxhdGVyCisJCSAqICd1Ymlmc19yY3ZyeV9nY19jb21taXQoKScgZnVuY3Rpb24gZmFpbHMsIGJlY2F1c2UgaXQgY2Fubm90CisJCSAqIGZpbmQgYSBkaXJ0eSBMRUIgd2hpY2ggY291bGQgYmUgR0MnZCBpbnRvIExFQiBZISBFdmVuIExFQiBYCisJCSAqIGRvZXMgbm90IG1hdGNoIGJlY2F1c2UgdGhlIGFtb3VudCBvZiB2YWxpZCBub2RlcyB0aGVyZSBkb2VzCisJCSAqIG5vdCBmaXQgdGhlIGZyZWUgc3BhY2UgaW4gTEVCIFkgYW55IG1vcmUhIEFuZCB0aGlzIGlzCisJCSAqIGJlY2F1c2Ugb2YgdGhlIHBhZGRpbmcgbm9kZSB3aGljaCB3ZSBhZGRlZCB0byBMRUIgWS4gVGhlCisJCSAqIHVzZXItdmlzaWJsZSBlZmZlY3Qgb2YgdGhpcyB3aGljaCBJIG9uY2Ugb2JzZXJ2ZWQgYW5kCisJCSAqIGFuYWx5c2VkIGlzIHRoYXQgd2UgY2Fubm90IG1vdW50IHRoZSBmaWxlLXN5c3RlbSB3aXRoCisJCSAqIC1FTk9TUEMgZXJyb3IuCisJCSAqCisJCSAqIFNvIG9idmlvdXNseSwgdG8gbWFrZSBzdXJlIHRoYXQgc2l0dWF0aW9uIGRvZXMgbm90IGhhcHBlbiB3ZQorCQkgKiBzaG91bGQgZnJlZSBtaW4uIEkvTyB1bml0IEIgaW4gTEVCIFkgY29tcGxldGVseSBhbmQgdGhlIGxhc3QKKwkJICogdXNlZCBtaW4uIEkvTyB1bml0IGluIExFQiBZIHNob3VsZCBiZSBBLiBUaGlzIGlzIGJhc2ljYWxseQorCQkgKiB3aGF0IHRoZSBiZWxvdyBjb2RlIHRyaWVzIHRvIGRvLgorCQkgKi8KKwkJd2hpbGUgKG9mZnMgPiBtaW5faW9fdW5pdCkKKwkJCWRyb3BfbGFzdF9ub2RlKHNsZWIsICZvZmZzKTsKKwl9CiAKIAlidWYgPSBzYnVmICsgb2ZmczsKIAlsZW4gPSBjLT5sZWJfc2l6ZSAtIG9mZnM7CkBAIC04ODEsNyArOTA1LDcgQEAKIAkJfQogCQl1Ymlmc19zY2FuX2Rlc3Ryb3koc2xlYik7CiAJfQotCXJldHVybiB1Ymlmc19yZWNvdmVyX2xlYihjLCBsbnVtLCBvZmZzLCBzYnVmLCAwKTsKKwlyZXR1cm4gdWJpZnNfcmVjb3Zlcl9sZWIoYywgbG51bSwgb2Zmcywgc2J1ZiwgLTEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3JlcGxheS5jIGIvZnMvdWJpZnMvcmVwbGF5LmMKaW5kZXggNjYxNzI4MC4uNWU5NzE2MSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvcmVwbGF5LmMKKysrIGIvZnMvdWJpZnMvcmVwbGF5LmMKQEAgLTU1Nyw4ICs1NTcsNyBAQAogCQkgKiB0aGVzZSBMRUJzIGNvdWxkIHBvc3NpYmx5IGJlIHdyaXR0ZW4gdG8gYXQgdGhlIHBvd2VyIGN1dAogCQkgKiB0aW1lLgogCQkgKi8KLQkJc2xlYiA9IHViaWZzX3JlY292ZXJfbGViKGMsIGxudW0sIG9mZnMsIGMtPnNidWYsCi0JCQkJCSBiLT5idWQtPmpoZWFkICE9IEdDSEQpOworCQlzbGViID0gdWJpZnNfcmVjb3Zlcl9sZWIoYywgbG51bSwgb2ZmcywgYy0+c2J1ZiwgYi0+YnVkLT5qaGVhZCk7CiAJZWxzZQogCQlzbGViID0gdWJpZnNfc2NhbihjLCBsbnVtLCBvZmZzLCBjLT5zYnVmLCAwKTsKIAlpZiAoSVNfRVJSKHNsZWIpKQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvc2hyaW5rZXIuYyBiL2ZzL3ViaWZzL3Nocmlua2VyLmMKaW5kZXggY2E5NTNhOS4uOWUxZDA1NiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvc2hyaW5rZXIuYworKysgYi9mcy91Ymlmcy9zaHJpbmtlci5jCkBAIC0yODQsNyArMjg0LDExIEBACiAJbG9uZyBjbGVhbl96bl9jbnQgPSBhdG9taWNfbG9uZ19yZWFkKCZ1Ymlmc19jbGVhbl96bl9jbnQpOwogCiAJaWYgKG5yID09IDApCi0JCXJldHVybiBjbGVhbl96bl9jbnQ7CisJCS8qCisJCSAqIER1ZSB0byB0aGUgd2F5IFVCSUZTIHVwZGF0ZXMgdGhlIGNsZWFuIHpub2RlIGNvdW50ZXIgaXQgbWF5CisJCSAqIHRlbXBvcmFyaWx5IGJlIG5lZ2F0aXZlLgorCQkgKi8KKwkJcmV0dXJuIGNsZWFuX3puX2NudCA+PSAwID8gY2xlYW5fem5fY250IDogMTsKIAogCWlmICghY2xlYW5fem5fY250KSB7CiAJCS8qCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zdXBlci5jIGIvZnMvdWJpZnMvc3VwZXIuYwppbmRleCAxYWIwZDIyLi41MjliZTA1IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zdXBlci5jCisrKyBiL2ZzL3ViaWZzL3N1cGVyLmMKQEAgLTgxMSwxNSArODExLDE4IEBACiAKIAkJYy0+amhlYWRzW2ldLndidWYuc3luY19jYWxsYmFjayA9ICZidWRfd2J1Zl9jYWxsYmFjazsKIAkJYy0+amhlYWRzW2ldLndidWYuamhlYWQgPSBpOworCQljLT5qaGVhZHNbaV0uZ3JvdXBlZCA9IDE7CiAJfQogCiAJYy0+amhlYWRzW0JBU0VIRF0ud2J1Zi5kdHlwZSA9IFVCSV9TSE9SVFRFUk07CiAJLyoKIAkgKiBHYXJiYWdlIENvbGxlY3RvciBoZWFkIGxpa2VseSBjb250YWlucyBsb25nLXRlcm0gZGF0YSBhbmQKLQkgKiBkb2VzIG5vdCBuZWVkIHRvIGJlIHN5bmNocm9uaXplZCBieSB0aW1lci4KKwkgKiBkb2VzIG5vdCBuZWVkIHRvIGJlIHN5bmNocm9uaXplZCBieSB0aW1lci4gQWxzbyBHQyBoZWFkIG5vZGVzIGFyZQorCSAqIG5vdCBncm91cGVkLgogCSAqLwogCWMtPmpoZWFkc1tHQ0hEXS53YnVmLmR0eXBlID0gVUJJX0xPTkdURVJNOwogCWMtPmpoZWFkc1tHQ0hEXS53YnVmLm5vX3RpbWVyID0gMTsKKwljLT5qaGVhZHNbR0NIRF0uZ3JvdXBlZCA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyODQsMTIgKzEyODcsMjUgQEAKIAlpZiAoKGMtPm1zdF9ub2RlLT5mbGFncyAmIGNwdV90b19sZTMyKFVCSUZTX01TVF9ESVJUWSkpICE9IDApIHsKIAkJdWJpZnNfbXNnKCJyZWNvdmVyeSBuZWVkZWQiKTsKIAkJYy0+bmVlZF9yZWNvdmVyeSA9IDE7Ci0JCWlmICghYy0+cm9fbW91bnQpIHsKLQkJCWVyciA9IHViaWZzX3JlY292ZXJfaW5sX2hlYWRzKGMsIGMtPnNidWYpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIG91dF9tYXN0ZXI7Ci0JCX0KLQl9IGVsc2UgaWYgKCFjLT5yb19tb3VudCkgeworCX0KKworCWlmIChjLT5uZWVkX3JlY292ZXJ5ICYmICFjLT5yb19tb3VudCkgeworCQllcnIgPSB1Ymlmc19yZWNvdmVyX2lubF9oZWFkcyhjLCBjLT5zYnVmKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X21hc3RlcjsKKwl9CisKKwllcnIgPSB1Ymlmc19scHRfaW5pdChjLCAxLCAhYy0+cm9fbW91bnQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X21hc3RlcjsKKworCWlmICghYy0+cm9fbW91bnQgJiYgYy0+c3BhY2VfZml4dXApIHsKKwkJZXJyID0gdWJpZnNfZml4dXBfZnJlZV9zcGFjZShjKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X21hc3RlcjsKKwl9CisKKwlpZiAoIWMtPnJvX21vdW50KSB7CiAJCS8qCiAJCSAqIFNldCB0aGUgImRpcnR5IiBmbGFnIHNvIHRoYXQgaWYgd2UgcmVib290IHVuY2xlYW5seSB3ZQogCQkgKiB3aWxsIG5vdGljZSB0aGlzIGltbWVkaWF0ZWx5IG9uIHRoZSBuZXh0IG1vdW50LgpAQCAtMTI5NywxMyArMTMxMyw5IEBACiAJCWMtPm1zdF9ub2RlLT5mbGFncyB8PSBjcHVfdG9fbGUzMihVQklGU19NU1RfRElSVFkpOwogCQllcnIgPSB1Ymlmc193cml0ZV9tYXN0ZXIoYyk7CiAJCWlmIChlcnIpCi0JCQlnb3RvIG91dF9tYXN0ZXI7CisJCQlnb3RvIG91dF9scHQ7CiAJfQogCi0JZXJyID0gdWJpZnNfbHB0X2luaXQoYywgMSwgIWMtPnJvX21vdW50KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9scHQ7Ci0KIAllcnIgPSBkYmdfY2hlY2tfaWR4X3NpemUoYywgYy0+Ymkub2xkX2lkeF9zeik7CiAJaWYgKGVycikKIAkJZ290byBvdXRfbHB0OwpAQCAtMTM5NiwxMiArMTQwOCw2IEBACiAJfSBlbHNlCiAJCXViaWZzX2Fzc2VydChjLT5sc3QudGFrZW5fZW1wdHlfbGVicyA+IDApOwogCi0JaWYgKCFjLT5yb19tb3VudCAmJiBjLT5zcGFjZV9maXh1cCkgewotCQllcnIgPSB1Ymlmc19maXh1cF9mcmVlX3NwYWNlKGMpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfaW5mb3M7Ci0JfQotCiAJZXJyID0gZGJnX2NoZWNrX2ZpbGVzeXN0ZW0oYyk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfaW5mb3M7CkBAIC0xODQyLDcgKzE4NDgsNiBAQAogCWJkaV9kZXN0cm95KCZjLT5iZGkpOwogCXViaV9jbG9zZV92b2x1bWUoYy0+dWJpKTsKIAltdXRleF91bmxvY2soJmMtPnVtb3VudF9tdXRleCk7Ci0Ja2ZyZWUoYyk7CiB9CiAKIHN0YXRpYyBpbnQgdWJpZnNfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpAQCAtMTk2NSw2MSArMTk3MCw2NSBAQAogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQogCitzdGF0aWMgc3RydWN0IHViaWZzX2luZm8gKmFsbG9jX3ViaWZzX2luZm8oc3RydWN0IHViaV92b2x1bWVfZGVzYyAqdWJpKQoreworCXN0cnVjdCB1Ymlmc19pbmZvICpjOworCisJYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlmc19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGMpIHsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPmNudF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPmNzX2xvY2spOworCQlzcGluX2xvY2tfaW5pdCgmYy0+YnVkc19sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPnNwYWNlX2xvY2spOworCQlzcGluX2xvY2tfaW5pdCgmYy0+b3JwaGFuX2xvY2spOworCQlpbml0X3J3c2VtKCZjLT5jb21taXRfc2VtKTsKKwkJbXV0ZXhfaW5pdCgmYy0+bHBfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT50bmNfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT5sb2dfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT5tc3RfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT51bW91bnRfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT5idV9tdXRleCk7CisJCW11dGV4X2luaXQoJmMtPndyaXRlX3Jlc2VydmVfbXV0ZXgpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT5jbXRfd3EpOworCQljLT5idWRzID0gUkJfUk9PVDsKKwkJYy0+b2xkX2lkeCA9IFJCX1JPT1Q7CisJCWMtPnNpemVfdHJlZSA9IFJCX1JPT1Q7CisJCWMtPm9ycGhfdHJlZSA9IFJCX1JPT1Q7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5pbmZvc19saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPmlkeF9nYyk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5yZXBsYXlfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5yZXBsYXlfYnVkcyk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT51bmNhdF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPmVtcHR5X2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+ZnJlZWFibGVfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5mcmRpX2lkeF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPnVuY2xlYW5fbGViX2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+b2xkX2J1ZHMpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+b3JwaF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbmV3KTsKKwkJYy0+bm9fY2hrX2RhdGFfY3JjID0gMTsKKworCQljLT5oaWdoZXN0X2ludW0gPSBVQklGU19GSVJTVF9JTk87CisJCWMtPmxoZWFkX2xudW0gPSBjLT5sdGFpbF9sbnVtID0gVUJJRlNfTE9HX0xOVU07CisKKwkJdWJpX2dldF92b2x1bWVfaW5mbyh1YmksICZjLT52aSk7CisJCXViaV9nZXRfZGV2aWNlX2luZm8oYy0+dmkudWJpX251bSwgJmMtPmRpKTsKKwl9CisJcmV0dXJuIGM7Cit9CisKIHN0YXRpYyBpbnQgdWJpZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewotCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnViaSA9IHNiLT5zX2ZzX2luZm87Ci0Jc3RydWN0IHViaWZzX2luZm8gKmM7CisJc3RydWN0IHViaWZzX2luZm8gKmMgPSBzYi0+c19mc19pbmZvOwogCXN0cnVjdCBpbm9kZSAqcm9vdDsKIAlpbnQgZXJyOwogCi0JYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlmc19pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pbml0KCZjLT5jbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmMtPmNzX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjLT5idWRzX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjLT5zcGFjZV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+b3JwaGFuX2xvY2spOwotCWluaXRfcndzZW0oJmMtPmNvbW1pdF9zZW0pOwotCW11dGV4X2luaXQoJmMtPmxwX211dGV4KTsKLQltdXRleF9pbml0KCZjLT50bmNfbXV0ZXgpOwotCW11dGV4X2luaXQoJmMtPmxvZ19tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+bXN0X211dGV4KTsKLQltdXRleF9pbml0KCZjLT51bW91bnRfbXV0ZXgpOwotCW11dGV4X2luaXQoJmMtPmJ1X211dGV4KTsKLQltdXRleF9pbml0KCZjLT53cml0ZV9yZXNlcnZlX211dGV4KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT5jbXRfd3EpOwotCWMtPmJ1ZHMgPSBSQl9ST09UOwotCWMtPm9sZF9pZHggPSBSQl9ST09UOwotCWMtPnNpemVfdHJlZSA9IFJCX1JPT1Q7Ci0JYy0+b3JwaF90cmVlID0gUkJfUk9PVDsKLQlJTklUX0xJU1RfSEVBRCgmYy0+aW5mb3NfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPmlkeF9nYyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPnJlcGxheV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+cmVwbGF5X2J1ZHMpOwotCUlOSVRfTElTVF9IRUFEKCZjLT51bmNhdF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+ZW1wdHlfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPmZyZWVhYmxlX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5mcmRpX2lkeF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+dW5jbGVhbl9sZWJfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPm9sZF9idWRzKTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+b3JwaF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+b3JwaF9uZXcpOwotCWMtPm5vX2Noa19kYXRhX2NyYyA9IDE7Ci0KIAljLT52ZnNfc2IgPSBzYjsKLQljLT5oaWdoZXN0X2ludW0gPSBVQklGU19GSVJTVF9JTk87Ci0JYy0+bGhlYWRfbG51bSA9IGMtPmx0YWlsX2xudW0gPSBVQklGU19MT0dfTE5VTTsKLQotCXViaV9nZXRfdm9sdW1lX2luZm8odWJpLCAmYy0+dmkpOwotCXViaV9nZXRfZGV2aWNlX2luZm8oYy0+dmkudWJpX251bSwgJmMtPmRpKTsKLQogCS8qIFJlLW9wZW4gdGhlIFVCSSBkZXZpY2UgaW4gcmVhZC13cml0ZSBtb2RlICovCiAJYy0+dWJpID0gdWJpX29wZW5fdm9sdW1lKGMtPnZpLnViaV9udW0sIGMtPnZpLnZvbF9pZCwgVUJJX1JFQURXUklURSk7CiAJaWYgKElTX0VSUihjLT51YmkpKSB7CiAJCWVyciA9IFBUUl9FUlIoYy0+dWJpKTsKLQkJZ290byBvdXRfZnJlZTsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTIwODUsMjQgKzIwOTQsMjkgQEAKIAliZGlfZGVzdHJveSgmYy0+YmRpKTsKIG91dF9jbG9zZToKIAl1YmlfY2xvc2Vfdm9sdW1lKGMtPnViaSk7Ci1vdXRfZnJlZToKLQlrZnJlZShjKTsKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHNiX3Rlc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKIHsKLQlkZXZfdCAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYzEgPSBkYXRhOwogCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gc2ItPnNfZnNfaW5mbzsKIAotCXJldHVybiBjLT52aS5jZGV2ID09ICpkZXY7CisJcmV0dXJuIGMtPnZpLmNkZXYgPT0gYzEtPnZpLmNkZXY7Cit9CisKK3N0YXRpYyBpbnQgc2Jfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc2ItPnNfZnNfaW5mbyA9IGRhdGE7CisJcmV0dXJuIHNldF9hbm9uX3N1cGVyKHNiLCBOVUxMKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnViaWZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCiAJCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnViaTsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZV9pbmZvIHZpOworCXN0cnVjdCB1Ymlmc19pbmZvICpjOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJaW50IGVycjsKIApAQCAtMjExOSwxOSArMjEzMywyNSBAQAogCQkJbmFtZSwgKGludClQVFJfRVJSKHViaSkpOwogCQlyZXR1cm4gRVJSX0NBU1QodWJpKTsKIAl9Ci0JdWJpX2dldF92b2x1bWVfaW5mbyh1YmksICZ2aSk7CiAKLQlkYmdfZ2VuKCJvcGVuZWQgdWJpJWRfJWQiLCB2aS51YmlfbnVtLCB2aS52b2xfaWQpOworCWMgPSBhbGxvY191Ymlmc19pbmZvKHViaSk7CisJaWYgKCFjKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KIAotCXNiID0gc2dldChmc190eXBlLCAmc2JfdGVzdCwgJnNldF9hbm9uX3N1cGVyLCAmdmkuY2Rldik7CisJZGJnX2dlbigib3BlbmVkIHViaSVkXyVkIiwgYy0+dmkudWJpX251bSwgYy0+dmkudm9sX2lkKTsKKworCXNiID0gc2dldChmc190eXBlLCBzYl90ZXN0LCBzYl9zZXQsIGMpOwogCWlmIChJU19FUlIoc2IpKSB7CiAJCWVyciA9IFBUUl9FUlIoc2IpOworCQlrZnJlZShjKTsKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCiAJaWYgKHNiLT5zX3Jvb3QpIHsKIAkJc3RydWN0IHViaWZzX2luZm8gKmMxID0gc2ItPnNfZnNfaW5mbzsKLQorCQlrZnJlZShjKTsKIAkJLyogQSBuZXcgbW91bnQgcG9pbnQgZm9yIGFscmVhZHkgbW91bnRlZCBVQklGUyAqLwogCQlkYmdfZ2VuKCJ0aGlzIHViaSB2b2x1bWUgaXMgYWxyZWFkeSBtb3VudGVkIik7CiAJCWlmICghIShmbGFncyAmIE1TX1JET05MWSkgIT0gYzEtPnJvX21vdW50KSB7CkBAIC0yMTQwLDExICsyMTYwLDYgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXNiLT5zX2ZsYWdzID0gZmxhZ3M7Ci0JCS8qCi0JCSAqIFBhc3MgJ3ViaScgdG8gJ2ZpbGxfc3VwZXIoKScgaW4gc2ItPnNfZnNfaW5mbyB3aGVyZSBpdCBpcwotCQkgKiByZXBsYWNlZCBieSAnYycuCi0JCSAqLwotCQlzYi0+c19mc19pbmZvID0gdWJpOwogCQllcnIgPSB1Ymlmc19maWxsX3N1cGVyKHNiLCBkYXRhLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2RlYWN0OwpAQCAtMjE2NCwxMSArMjE3OSwxOCBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKK3N0YXRpYyB2b2lkIGtpbGxfdWJpZnNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gcy0+c19mc19pbmZvOworCWtpbGxfYW5vbl9zdXBlcihzKTsKKwlrZnJlZShjKTsKK30KKwogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHViaWZzX2ZzX3R5cGUgPSB7CiAJLm5hbWUgICAgPSAidWJpZnMiLAogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCiAJLm1vdW50ICAgPSB1Ymlmc19tb3VudCwKLQkua2lsbF9zYiA9IGtpbGxfYW5vbl9zdXBlciwKKwkua2lsbF9zYiA9IGtpbGxfdWJpZnNfc3VwZXIsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvdG5jLmMgYi9mcy91Ymlmcy90bmMuYwppbmRleCA4MTE5YjFmLi45MWI0MjEzIDEwMDY0NAotLS0gYS9mcy91Ymlmcy90bmMuYworKysgYi9mcy91Ymlmcy90bmMuYwpAQCAtMjg3NiwxMiArMjg3NiwxMyBAQAogICovCiB2b2lkIHViaWZzX3RuY19jbG9zZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKIHsKLQlsb25nIGNsZWFuX2ZyZWVkOwotCiAJdG5jX2Rlc3Ryb3lfY25leHQoYyk7CiAJaWYgKGMtPnpyb290Lnpub2RlKSB7Ci0JCWNsZWFuX2ZyZWVkID0gdWJpZnNfZGVzdHJveV90bmNfc3VidHJlZShjLT56cm9vdC56bm9kZSk7Ci0JCWF0b21pY19sb25nX3N1YihjbGVhbl9mcmVlZCwgJnViaWZzX2NsZWFuX3puX2NudCk7CisJCWxvbmcgbjsKKworCQl1Ymlmc19kZXN0cm95X3RuY19zdWJ0cmVlKGMtPnpyb290Lnpub2RlKTsKKwkJbiA9IGF0b21pY19sb25nX3JlYWQoJmMtPmNsZWFuX3puX2NudCk7CisJCWF0b21pY19sb25nX3N1YihuLCAmdWJpZnNfY2xlYW5fem5fY250KTsKIAl9CiAJa2ZyZWUoYy0+Z2FwX2xlYnMpOwogCWtmcmVlKGMtPmlsZWJzKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3ViaWZzLmggYi9mcy91Ymlmcy91Ymlmcy5oCmluZGV4IGE3MGQ3YjQuLmY3OTk4M2QgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3ViaWZzLmgKKysrIGIvZnMvdWJpZnMvdWJpZnMuaApAQCAtNzIyLDEyICs3MjIsMTQgQEAKICAqIHN0cnVjdCB1Ymlmc19qaGVhZCAtIGpvdXJuYWwgaGVhZC4KICAqIEB3YnVmOiBoZWFkJ3Mgd3JpdGUtYnVmZmVyCiAgKiBAYnVkc19saXN0OiBsaXN0IG9mIGJ1ZCBMRUJzIGJlbG9uZ2luZyB0byB0aGlzIGpvdXJuYWwgaGVhZAorICogQGdyb3VwZWQ6IG5vbi16ZXJvIGlmIFVCSUZTIGdyb3VwcyBub2RlcyB3aGVuIHdyaXRpbmcgdG8gdGhpcyBqb3VybmFsIGhlYWQKICAqCiAgKiBOb3RlLCB0aGUgQGJ1ZHMgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgdGhlIEBjLT5idWRzX2xvY2suCiAgKi8KIHN0cnVjdCB1Ymlmc19qaGVhZCB7CiAJc3RydWN0IHViaWZzX3didWYgd2J1ZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZHNfbGlzdDsKKwl1bnNpZ25lZCBpbnQgZ3JvdXBlZDoxOwogfTsKIAogLyoqCkBAIC0xNzQyLDcgKzE3NDQsNyBAQAogaW50IHViaWZzX3JlY292ZXJfbWFzdGVyX25vZGUoc3RydWN0IHViaWZzX2luZm8gKmMpOwogaW50IHViaWZzX3dyaXRlX3JjdnJkX21zdF9ub2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKIHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqdWJpZnNfcmVjb3Zlcl9sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAotCQkJCQkgaW50IG9mZnMsIHZvaWQgKnNidWYsIGludCBncm91cGVkKTsKKwkJCQkJIGludCBvZmZzLCB2b2lkICpzYnVmLCBpbnQgamhlYWQpOwogc3RydWN0IHViaWZzX3NjYW5fbGViICp1Ymlmc19yZWNvdmVyX2xvZ19sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAogCQkJCQkgICAgIGludCBvZmZzLCB2b2lkICpzYnVmKTsKIGludCB1Ymlmc19yZWNvdmVyX2lubF9oZWFkcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdm9pZCAqc2J1Zik7CmRpZmYgLS1naXQgYS9mcy91ZnMvbmFtZWkuYyBiL2ZzL3Vmcy9uYW1laS5jCmluZGV4IDI5MzA5ZTIuLmI1N2FhYjkgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9uYW1laS5jCisrKyBiL2ZzL3Vmcy9uYW1laS5jCkBAIC01NiwxNiArNTYsMTIgQEAKIAogCWxvY2tfdWZzKGRpci0+aV9zYik7CiAJaW5vID0gdWZzX2lub2RlX2J5X25hbWUoZGlyLCAmZGVudHJ5LT5kX25hbWUpOwotCWlmIChpbm8pIHsKKwlpZiAoaW5vKQogCQlpbm9kZSA9IHVmc19pZ2V0KGRpci0+aV9zYiwgaW5vKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCXVubG9ja191ZnMoZGlyLT5pX3NiKTsKLQkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7Ci0JCX0KLQl9CiAJdW5sb2NrX3VmcyhkaXItPmlfc2IpOwotCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCXJldHVybiBOVUxMOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOworCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCBmNDIxM2JhLi43Zjc4MmFmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0xMzEsMTkgKzEzMSwzNCBAQAogewogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CiAJc3RydWN0IHhmc190cmFucwkqdHA7CiAJaW50CQkJZXJyb3IgPSAwOwogCWludAkJCWxvZ19mbHVzaGVkID0gMDsKIAogCXRyYWNlX3hmc19maWxlX2ZzeW5jKGlwKTsKIAotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTyk7CiAKIAl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSVRSVU5DQVRFRCk7CiAKIAl4ZnNfaW9lbmRfd2FpdChpcCk7CiAKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGFuIFJUIGFuZC9vciBsb2cgc3Vidm9sdW1lIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisJCSAqIHRvIGZsdXNoIHRoZSB3cml0ZSBjYWNoZSB0aGUgZGV2aWNlIHVzZWQgZm9yIGZpbGUgZGF0YQorCQkgKiBmaXJzdC4gIFRoaXMgaXMgdG8gZW5zdXJlIG5ld2x5IHdyaXR0ZW4gZmlsZSBkYXRhIG1ha2UKKwkJICogaXQgdG8gZGlzayBiZWZvcmUgbG9nZ2luZyB0aGUgbmV3IGlub2RlIHNpemUgaW4gY2FzZSBvZgorCQkgKiBhbiBleHRlbmRpbmcgd3JpdGUuCisJCSAqLworCQlpZiAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkKKwkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2gobXAtPm1fcnRkZXZfdGFyZ3ApOworCQllbHNlIGlmIChtcC0+bV9sb2dkZXZfdGFyZ3AgIT0gbXAtPm1fZGRldl90YXJncCkKKwkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJfQorCiAJLyoKIAkgKiBXZSBhbHdheXMgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgaW5vZGUgc3RhdGUgaXMgc2FmZSBvbgogCSAqIGRpc2suICBUaGUgaW5vZGUgbWlnaHQgYmUgY2xlYW4gYnV0IHdlIHN0aWxsIG1pZ2h0IG5lZWQgdG8gZm9yY2UgdGhlCkBAIC0xNzUsOSArMTkwLDkgQEAKIAkJICogdXBkYXRlcy4gIFRoZSBzeW5jIHRyYW5zYWN0aW9uIHdpbGwgYWxzbyBmb3JjZSB0aGUgbG9nLgogCQkgKi8KIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCQl0cCA9IHhmc190cmFuc19hbGxvYyhpcC0+aV9tb3VudCwgWEZTX1RSQU5TX0ZTWU5DX1RTKTsKKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19GU1lOQ19UUyk7CiAJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCi0JCQkJWEZTX0ZTWU5DX1RTX0xPR19SRVMoaXAtPmlfbW91bnQpLCAwLCAwLCAwKTsKKwkJCQlYRlNfRlNZTkNfVFNfTE9HX1JFUyhtcCksIDAsIDAsIDApOwogCQlpZiAoZXJyb3IpIHsKIAkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwogCQkJcmV0dXJuIC1lcnJvcjsKQEAgLTIwOSwyOCArMjI0LDI1IEBACiAJCSAqIGZvcmNlIHRoZSBsb2cuCiAJCSAqLwogCQlpZiAoeGZzX2lwaW5jb3VudChpcCkpIHsKLQkJCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKGlwLT5pX21vdW50LAorCQkJZXJyb3IgPSBfeGZzX2xvZ19mb3JjZV9sc24obXAsCiAJCQkJCWlwLT5pX2l0ZW1wLT5pbGlfbGFzdF9sc24sCiAJCQkJCVhGU19MT0dfU1lOQywgJmxvZ19mbHVzaGVkKTsKIAkJfQogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAJfQogCi0JaWYgKGlwLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpIHsKLQkJLyoKLQkJICogSWYgdGhlIGxvZyB3cml0ZSBkaWRuJ3QgaXNzdWUgYW4gb3JkZXJlZCB0YWcgd2UgbmVlZAotCQkgKiB0byBmbHVzaCB0aGUgZGlzayBjYWNoZSBmb3IgdGhlIGRhdGEgZGV2aWNlIG5vdy4KLQkJICovCi0JCWlmICghbG9nX2ZsdXNoZWQpCi0JCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKGlwLT5pX21vdW50LT5tX2RkZXZfdGFyZ3ApOwotCi0JCS8qCi0JCSAqIElmIHRoaXMgaW5vZGUgaXMgb24gdGhlIFJUIGRldiB3ZSBuZWVkIHRvIGZsdXNoIHRoYXQKLQkJICogY2FjaGUgYXMgd2VsbC4KLQkJICovCi0JCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKQotCQkJeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChpcC0+aV9tb3VudC0+bV9ydGRldl90YXJncCk7Ci0JfQorCS8qCisJICogSWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRldmljZSwgYW5kIHRoZSBsb2cgZm9yY2UgYWJvdXQgd2FzCisJICogYSBuby1vcCB3ZSBtaWdodCBoYXZlIHRvIGZsdXNoIHRoZSBkYXRhIGRldmljZSBjYWNoZSBoZXJlLgorCSAqIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvciBmZGF0YXN5bmMvT19EU1lOQyBpZiB3ZSB3ZXJlIG92ZXJ3cml0aW5nCisJICogYW4gYWxyZWFkeSBhbGxvY2F0ZWQgZmlsZSBhbmQgdGh1cyBkbyBub3QgaGF2ZSBhbnkgbWV0YWRhdGEgdG8KKwkgKiBjb21taXQuCisJICovCisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKSAmJgorCSAgICBtcC0+bV9sb2dkZXZfdGFyZ3AgPT0gbXAtPm1fZGRldl90YXJncCAmJgorCSAgICAhWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSAmJgorCSAgICAhbG9nX2ZsdXNoZWQpCisJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2gobXAtPm1fZGRldl90YXJncCk7CiAKIAlyZXR1cm4gLWVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCmluZGV4IGRkMjE3ODQuLmQ0NGQ5MmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCWlmIChJU19QT1NJWEFDTChkaXIpKSB7CiAJCWRlZmF1bHRfYWNsID0geGZzX2dldF9hY2woZGlyLCBBQ0xfVFlQRV9ERUZBVUxUKTsKIAkJaWYgKElTX0VSUihkZWZhdWx0X2FjbCkpCi0JCQlyZXR1cm4gLVBUUl9FUlIoZGVmYXVsdF9hY2wpOworCQkJcmV0dXJuIFBUUl9FUlIoZGVmYXVsdF9hY2wpOwogCiAJCWlmICghZGVmYXVsdF9hY2wpCiAJCQltb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAxZTNhN2NlLi5hMWE4ODFlIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTYyNyw2OCArNjI3LDYgQEAKIAkJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wpOwogfQogCi0vKgotICogVHJ5IHRvIHdyaXRlIG91dCB0aGUgc3VwZXJibG9jayB1c2luZyBiYXJyaWVycy4KLSAqLwotU1RBVElDIGludAoteGZzX2JhcnJpZXJfdGVzdCgKLQl4ZnNfbW91bnRfdAkqbXApCi17Ci0JeGZzX2J1Zl90CSpzYnAgPSB4ZnNfZ2V0c2IobXAsIDApOwotCWludAkJZXJyb3I7Ci0KLQlYRlNfQlVGX1VORE9ORShzYnApOwotCVhGU19CVUZfVU5SRUFEKHNicCk7Ci0JWEZTX0JVRl9VTkRFTEFZV1JJVEUoc2JwKTsKLQlYRlNfQlVGX1dSSVRFKHNicCk7Ci0JWEZTX0JVRl9VTkFTWU5DKHNicCk7Ci0JWEZTX0JVRl9PUkRFUkVEKHNicCk7Ci0KLQl4ZnNiZHN0cmF0KG1wLCBzYnApOwotCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoc2JwKTsKLQotCS8qCi0JICogQ2xlYXIgYWxsIHRoZSBmbGFncyB3ZSBzZXQgYW5kIHBvc3NpYmxlIGVycm9yIHN0YXRlIGluIHRoZQotCSAqIGJ1ZmZlci4gIFdlIG9ubHkgZGlkIHRoZSB3cml0ZSB0byB0cnkgb3V0IHdoZXRoZXIgYmFycmllcnMKLQkgKiB3b3JrZWQgYW5kIHNob3VsZG4ndCBsZWF2ZSBhbnkgdHJhY2VzIGluIHRoZSBzdXBlcmJsb2NrCi0JICogYnVmZmVyLgotCSAqLwotCVhGU19CVUZfRE9ORShzYnApOwotCVhGU19CVUZfRVJST1Ioc2JwLCAwKTsKLQlYRlNfQlVGX1VOT1JERVJFRChzYnApOwotCi0JeGZzX2J1Zl9yZWxzZShzYnApOwotCXJldHVybiBlcnJvcjsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19tb3VudGZzX2NoZWNrX2JhcnJpZXJzKHhmc19tb3VudF90ICptcCkKLXsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApIHsKLQkJeGZzX25vdGljZShtcCwKLQkJICAiRGlzYWJsaW5nIGJhcnJpZXJzLCBub3Qgc3VwcG9ydGVkIHdpdGggZXh0ZXJuYWwgbG9nIGRldmljZSIpOwotCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoeGZzX3JlYWRvbmx5X2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCkpIHsKLQkJeGZzX25vdGljZShtcCwKLQkJCSJEaXNhYmxpbmcgYmFycmllcnMsIHVuZGVybHlpbmcgZGV2aWNlIGlzIHJlYWRvbmx5Iik7Ci0JCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKLQkJcmV0dXJuOwotCX0KLQotCWVycm9yID0geGZzX2JhcnJpZXJfdGVzdChtcCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXhmc19ub3RpY2UobXAsCi0JCQkiRGlzYWJsaW5nIGJhcnJpZXJzLCB0cmlhbCBiYXJyaWVyIHdyaXRlIGZhaWxlZCIpOwotCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7Ci0JCXJldHVybjsKLQl9Ci19Ci0KIHZvaWQKIHhmc19ibGtkZXZfaXNzdWVfZmx1c2goCiAJeGZzX2J1ZnRhcmdfdAkJKmJ1ZnRhcmcpCkBAIC0xMjQwLDE0ICsxMTc4LDYgQEAKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIE9wdF9iYXJyaWVyOgogCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0JBUlJJRVI7Ci0KLQkJCS8qCi0JCQkgKiBUZXN0IGlmIGJhcnJpZXJzIGFyZSBhY3R1YWxseSB3b3JraW5nIGlmIHdlIGNhbiwKLQkJCSAqIGVsc2UgZGVsYXkgdGhpcyBjaGVjayB1bnRpbCB0aGUgZmlsZXN5c3RlbSBpcwotCQkJICogbWFya2VkIHdyaXRlYWJsZS4KLQkJCSAqLwotCQkJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKSkKLQkJCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9iYXJyaWVyOgogCQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwpAQCAtMTI4Miw4ICsxMjEyLDYgQEAKIAkvKiBybyAtPiBydyAqLwogCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKSAmJiAhKCpmbGFncyAmIE1TX1JET05MWSkpIHsKIAkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9SRE9OTFk7Ci0JCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQotCQkJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMobXApOwogCiAJCS8qCiAJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJlbW91bnQgdG8gd3JpdGVhYmxlIHN0YXRlIHdlCkBAIC0xNDY1LDkgKzEzOTMsNiBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9zYjsKIAotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQotCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7Ci0KIAllcnJvciA9IHhmc19maWxlc3RyZWFtX21vdW50KG1wKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfc2I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHIuYyBiL2ZzL3hmcy94ZnNfYXR0ci5jCmluZGV4IGM4NjM3NTMuLjAxZDIwNzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0ci5jCisrKyBiL2ZzL3hmcy94ZnNfYXR0ci5jCkBAIC00OTAsNiArNDkwLDEzIEBACiAJYXJncy53aGljaGZvcmsgPSBYRlNfQVRUUl9GT1JLOwogCiAJLyoKKwkgKiB3ZSBoYXZlIG5vIGNvbnRyb2wgb3ZlciB0aGUgYXR0cmlidXRlIG5hbWVzIHRoYXQgdXNlcnNwYWNlIHBhc3NlcyB1cworCSAqIHRvIHJlbW92ZSwgc28gd2UgaGF2ZSB0byBhbGxvdyB0aGUgbmFtZSBsb29rdXAgcHJpb3IgdG8gYXR0cmlidXRlCisJICogcmVtb3ZhbCB0byBmYWlsLgorCSAqLworCWFyZ3Mub3BfZmxhZ3MgPSBYRlNfREFfT1BfT0tOT0VOVDsKKworCS8qCiAJICogQXR0YWNoIHRoZSBkcXVvdHMgdG8gdGhlIGlub2RlLgogCSAqLwogCWVycm9yID0geGZzX3FtX2RxYXR0YWNoKGRwLCAwKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggY2I5YjZkMS4uMzYzMTc4MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTI1MywxNiArMjUzLDIxIEBACiAJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCi0JCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lORVc7Ci0JCQlpcC0+aV9mbGFncyB8PSBYRlNfSVJFQ0xBSU1BQkxFOwotCQkJX194ZnNfaW5vZGVfc2V0X3JlY2xhaW1fdGFnKHBhZywgaXApOworCQkJaXAtPmlfZmxhZ3MgJj0gfihYRlNfSU5FVyB8IFhGU19JUkVDTEFJTSk7CisJCQlBU1NFUlQoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU1BQkxFKTsKIAkJCXRyYWNlX3hmc19pZ2V0X3JlY2xhaW1fZmFpbChpcCk7CiAJCQlnb3RvIG91dF9lcnJvcjsKIAkJfQogCiAJCXNwaW5fbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlpcC0+aV9mbGFncyAmPSB+KFhGU19JUkVDTEFJTUFCTEUgfCBYRlNfSVJFQ0xBSU0pOworCisJCS8qCisJCSAqIENsZWFyIHRoZSBwZXItbGlmZXRpbWUgc3RhdGUgaW4gdGhlIGlub2RlIGFzIHdlIGFyZSBub3cKKwkJICogZWZmZWN0aXZlbHkgYSBuZXcgaW5vZGUgYW5kIG5lZWQgdG8gcmV0dXJuIHRvIHRoZSBpbml0aWFsCisJCSAqIHN0YXRlIGJlZm9yZSByZXVzZSBvY2N1cnMuCisJCSAqLworCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lSRUNMQUlNX1JFU0VUX0ZMQUdTOwogCQlpcC0+aV9mbGFncyB8PSBYRlNfSU5FVzsKIAkJX194ZnNfaW5vZGVfY2xlYXJfcmVjbGFpbV90YWcobXAsIHBhZywgaXApOwogCQlpbm9kZS0+aV9zdGF0ZSA9IElfTkVXOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5oIGIvZnMveGZzL3hmc19pbm9kZS5oCmluZGV4IDNhZTZkNTguLjk2NGNmZWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuaAorKysgYi9mcy94ZnMveGZzX2lub2RlLmgKQEAgLTM4NCw2ICszODQsMTYgQEAKICNkZWZpbmUgWEZTX0lESVJUWV9SRUxFQVNFCTB4MDA0MAkvKiBkaXJ0eSByZWxlYXNlIGFscmVhZHkgc2VlbiAqLwogCiAvKgorICogUGVyLWxpZmV0aW1lIGZsYWdzIG5lZWQgdG8gYmUgcmVzZXQgd2hlbiByZS11c2luZyBhIHJlY2xhaW1hYmxlIGlub2RlIGR1cmluZworICogaW5vZGUgbG9va3VwLiBUaGkgcHJldmVudHMgdW5pbnRlbmRlZCBiZWhhdmlvdXIgb24gdGhlIG5ldyBpbm9kZSBmcm9tCisgKiBvY3VycmluZy4KKyAqLworI2RlZmluZSBYRlNfSVJFQ0xBSU1fUkVTRVRfRkxBR1MJXAorCShYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNIHwgXAorCSBYRlNfSURJUlRZX1JFTEVBU0UgfCBYRlNfSVRSVU5DQVRFRCB8IFwKKwkgWEZTX0lGSUxFU1RSRUFNKTsKKworLyoKICAqIEZsYWdzIGZvciBpbm9kZSBsb2NraW5nLgogICogQml0IHJhbmdlczoJMTw8MSAgLSAxPDwxNi0xIC0tIGlvbG9jay9pbG9jayBtb2RlcyAoYml0ZmllbGQpCiAgKgkJMTw8MTYgLSAxPDwzMi0xIC0tIGxvY2tkZXAgYW5ub3RhdGlvbiAoaW50ZWdlcnMpCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCmluZGV4IDA5OTgzYTMuLmIxZTg4ZDUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCkBAIC02ODEsMTUgKzY4MSwxNSBAQAogICogd2hlcmUgdGhlIGNsdXN0ZXIgYnVmZmVyIG1heSBiZSB1bnBpbm5lZCBiZWZvcmUgdGhlIGlub2RlIGlzIGluc2VydGVkIGludG8KICAqIHRoZSBBSUwgZHVyaW5nIHRyYW5zYWN0aW9uIGNvbW1pdHRlZCBwcm9jZXNzaW5nLiBJZiB0aGUgYnVmZmVyIGlzIHVucGlubmVkCiAgKiBiZWZvcmUgdGhlIGlub2RlIGl0ZW0gaGFzIGJlZW4gY29tbWl0dGVkIGFuZCBpbnNlcnRlZCwgdGhlbiBpdCBpcyBwb3NzaWJsZQotICogZm9yIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbiBhbmQgSU8gY29tcGxldGlvbnMgYmVmb3JlIHRoZSBpbm9kZSBpcyBpbnNlcnRlZAorICogZm9yIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbiBhbmQgSU8gY29tcGxldGVzIGJlZm9yZSB0aGUgaW5vZGUgaXMgaW5zZXJ0ZWQKICAqIGludG8gdGhlIEFJTC4gSW4gdGhhdCBjYXNlLCB3ZSdkIGJlIGluc2VydGluZyBhIGNsZWFuLCBzdGFsZSBpbm9kZSBpbnRvIHRoZQogICogQUlMIHdoaWNoIHdpbGwgbmV2ZXIgZ2V0IHJlbW92ZWQuIEl0IHdpbGwsIGhvd2V2ZXIsIGdldCByZWNsYWltZWQgd2hpY2gKICAqIHRyaWdnZXJzIGFuIGFzc2VydCBpbiB4ZnNfaW5vZGVfZnJlZSgpIGNvbXBsYWluaW5nIGFib3V0IGZyZWVpbiBhbiBpbm9kZQogICogc3RpbGwgaW4gdGhlIEFJTC4KICAqCi0gKiBUbyBhdm9pZCB0aGlzLCByZXR1cm4gYSBsb3dlciBMU04gdGhhbiB0aGUgb25lIHBhc3NlZCBpbiBzbyB0aGF0IHRoZQotICogdHJhbnNhY3Rpb24gY29tbWl0dGVkIGNvZGUgd2lsbCBub3QgbW92ZSB0aGUgaW5vZGUgZm9yd2FyZCBpbiB0aGUgQUlMIGJ1dAotICogd2lsbCBzdGlsbCB1bnBpbiBpdCBwcm9wZXJseS4KKyAqIFRvIGF2b2lkIHRoaXMsIGp1c3QgdW5waW4gdGhlIGlub2RlIGRpcmVjdGx5IGFuZCByZXR1cm4gYSBMU04gb2YgLTEgc28gdGhlCisgKiB0cmFuc2FjdGlvbiBjb21taXR0ZWQgY29kZSBrbm93cyB0aGF0IGl0IGRvZXMgbm90IG5lZWQgdG8gZG8gYW55IGZ1cnRoZXIKKyAqIHByb2Nlc3Npbmcgb24gdGhlIGl0ZW0uCiAgKi8KIFNUQVRJQyB4ZnNfbHNuX3QKIHhmc19pbm9kZV9pdGVtX2NvbW1pdHRlZCgKQEAgLTY5OSw4ICs2OTksMTAgQEAKIAlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppaXAgPSBJTk9ERV9JVEVNKGxpcCk7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBpaXAtPmlsaV9pbm9kZTsKIAotCWlmICh4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JU1RBTEUpKQotCQlyZXR1cm4gbHNuIC0gMTsKKwlpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVNUQUxFKSkgeworCQl4ZnNfaW5vZGVfaXRlbV91bnBpbihsaXAsIDApOworCQlyZXR1cm4gLTE7CisJfQogCXJldHVybiBsc247CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmMgYi9mcy94ZnMveGZzX2xvZy5jCmluZGV4IDIxMTkzMDIuLjQxZDViOGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmMKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtMTM3Miw4ICsxMzcyLDE3IEBACiAJWEZTX0JVRl9BU1lOQyhicCk7CiAJYnAtPmJfZmxhZ3MgfD0gWEJGX0xPR19CVUZGRVI7CiAKLQlpZiAobG9nLT5sX21wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpCisJaWYgKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWwgbG9nIGRldmljZSwgZmx1c2ggdGhlIGRhdGEgZGV2aWNlCisJCSAqIGJlZm9yZSBmbHVzaGluZyB0aGUgbG9nIHRvIG1ha2Ugc3VyZSBhbGwgbWV0YSBkYXRhCisJCSAqIHdyaXR0ZW4gYmFjayBmcm9tIHRoZSBBSUwgYWN0dWFsbHkgbWFkZSBpdCB0byBkaXNrCisJCSAqIGJlZm9yZSB3cml0aW5nIG91dCB0aGUgbmV3IGxvZyB0YWlsIExTTiBpbiB0aGUgbG9nIGJ1ZmZlci4KKwkJICovCisJCWlmIChsb2ctPmxfbXAtPm1fbG9nZGV2X3RhcmdwICE9IGxvZy0+bF9tcC0+bV9kZGV2X3RhcmdwKQorCQkJeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChsb2ctPmxfbXAtPm1fZGRldl90YXJncCk7CiAJCVhGU19CVUZfT1JERVJFRChicCk7CisJfQogCiAJQVNTRVJUKFhGU19CVUZfQUREUihicCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZS0xKTsKIAlBU1NFUlQoWEZTX0JVRl9BRERSKGJwKSArIEJUT0JCKGNvdW50KSA8PSBsb2ctPmxfbG9nQkJzaXplKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCA3YzdiYzJiLi5jODNmNjNiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9BQk9SVEVEOwogCWl0ZW1fbHNuID0gSU9QX0NPTU1JVFRFRChsaXAsIGNvbW1pdF9sc24pOwogCi0JLyogSWYgdGhlIGNvbW1pdHRlZCByb3V0aW5lIHJldHVybnMgLTEsIGl0ZW0gaGFzIGJlZW4gZnJlZWQuICovCisJLyogaXRlbV9sc24gb2YgLTEgbWVhbnMgdGhlIGl0ZW0gbmVlZHMgbm8gZnVydGhlciBwcm9jZXNzaW5nICovCiAJaWYgKFhGU19MU05fQ01QKGl0ZW1fbHNuLCAoeGZzX2xzbl90KS0xKSA9PSAwKQogCQlyZXR1cm47CiAKQEAgLTE0NzQsNyArMTQ3NCw3IEBACiAJCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9BQk9SVEVEOwogCQlpdGVtX2xzbiA9IElPUF9DT01NSVRURUQobGlwLCBjb21taXRfbHNuKTsKIAotCQkvKiBpdGVtX2xzbiBvZiAtMSBtZWFucyB0aGUgaXRlbSB3YXMgZnJlZWQgKi8KKwkJLyogaXRlbV9sc24gb2YgLTEgbWVhbnMgdGhlIGl0ZW0gbmVlZHMgbm8gZnVydGhlciBwcm9jZXNzaW5nICovCiAJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgKHhmc19sc25fdCktMSkgPT0gMCkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggYjdhNWZlNy4uNjE5NzIwNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtOTYwLDggKzk2MCwxMSBAQAogCQkgKiBiZSBleHBvc2VkIHRvIHRoYXQgcHJvYmxlbS4KIAkJICovCiAJCXRydW5jYXRlZCA9IHhmc19pZmxhZ3NfdGVzdF9hbmRfY2xlYXIoaXAsIFhGU19JVFJVTkNBVEVEKTsKLQkJaWYgKHRydW5jYXRlZCAmJiBWTl9ESVJUWShWRlNfSShpcCkpICYmIGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApCi0JCQl4ZnNfZmx1c2hfcGFnZXMoaXAsIDAsIC0xLCBYQkZfQVNZTkMsIEZJX05PTkUpOworCQlpZiAodHJ1bmNhdGVkKSB7CisJCQl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSURJUlRZX1JFTEVBU0UpOworCQkJaWYgKFZOX0RJUlRZKFZGU19JKGlwKSkgJiYgaXAtPmlfZGVsYXllZF9ibGtzID4gMCkKKwkJCQl4ZnNfZmx1c2hfcGFnZXMoaXAsIDAsIC0xLCBYQkZfQVNZTkMsIEZJX05PTkUpOworCQl9CiAJfQogCiAJaWYgKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggM2ExMGVmNS4uNmNkNWI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTIxMCw3ICsyMTAsNyBAQAogc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyIHsKIAlpbnQgc3RhdGU7CQkvKiBDdXJyZW50IHN0YXRlICovCiAJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX2ZsYWdzIGZsYWdzOwotCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSBzdGF0ZXNbNF07CS8qIFBvd2VyIHN0YXRlcyAoRDAtRDMpICovCisJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX3N0YXRlIHN0YXRlc1tBQ1BJX0RfU1RBVEVfQ09VTlRdOwkvKiBQb3dlciBzdGF0ZXMgKEQwLUQzQ29sZCkgKi8KIH07CiAKIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggYTc1NmJjOC4uNDU0M2I2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTk4LDggKzk4LDExIEBACiAvKgogICogU3BpbmxvY2sgcHJpbWl0aXZlcwogICovCisKKyNpZm5kZWYgYWNwaV9vc19jcmVhdGVfbG9jawogYWNwaV9zdGF0dXMKIGFjcGlfb3NfY3JlYXRlX2xvY2soYWNwaV9zcGlubG9jayAqb3V0X2hhbmRsZSk7CisjZW5kaWYKIAogdm9pZCBhY3BpX29zX2RlbGV0ZV9sb2NrKGFjcGlfc3BpbmxvY2sgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggNWQyYTVlOS4uMmNlMWJlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC0xNTksNiArMTU5LDI0IEBACiAJfSB3aGlsZSAoMCkKICNlbmRpZgogCisvKgorICogV2hlbiBsb2NrZGVwIGlzIGVuYWJsZWQsIHRoZSBzcGluX2xvY2tfaW5pdCgpIG1hY3JvIHN0cmluZ2lmaWVzIGl0J3MKKyAqIGFyZ3VtZW50IGFuZCB1c2VzIHRoYXQgYXMgYSBuYW1lIGZvciB0aGUgbG9jayBpbiBkZWJ1Z2dpbmcuCisgKiBCeSBleGVjdXRpbmcgc3Bpbl9sb2NrX2luaXQoKSBpbiBhIG1hY3JvIHRoZSBrZXkgY2hhbmdlcyBmcm9tICJsb2NrIiBmb3IKKyAqIGFsbCBsb2NrcyB0byB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgb2YgYWNwaV9vc19jcmVhdGVfbG9jaygpLCB3aGljaAorICogcHJldmVudHMgbG9ja2RlcCBmcm9tIHJlcG9ydGluZyBmYWxzZSBwb3NpdGl2ZXMgZm9yIEFDUElDQSBsb2Nrcy4KKyAqLworI2RlZmluZSBhY3BpX29zX2NyZWF0ZV9sb2NrKF9faGFuZGxlKQkJCQlcCisoewkJCQkJCQkJXAorCXNwaW5sb2NrX3QgKmxvY2sgPSBBQ1BJX0FMTE9DQVRFKHNpemVvZigqbG9jaykpOwlcCisJCQkJCQkJCVwKKwlpZiAobG9jaykgewkJCQkJCVwKKwkJKihfX2hhbmRsZSkgPSBsb2NrOwkJCQlcCisJCXNwaW5fbG9ja19pbml0KCooX19oYW5kbGUpKTsJCQlcCisJfQkJCQkJCQlcCisJbG9jayA/IEFFX09LIDogQUVfTk9fTUVNT1JZOwkJCQlcCit9KQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BQ0xJTlVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAppbmRleCBmY2RjYjVkLi5kNDk0MDAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaApAQCAtMTcwLDE2ICsxNzAsNiBAQAogCiBleHRlcm4gaW50IF9fZ3Bpb190b19pcnEodW5zaWduZWQgZ3Bpbyk7CiAKLSNkZWZpbmUgR1BJT0ZfRElSX09VVAkoMCA8PCAwKQotI2RlZmluZSBHUElPRl9ESVJfSU4JKDEgPDwgMCkKLQotI2RlZmluZSBHUElPRl9JTklUX0xPVwkoMCA8PCAxKQotI2RlZmluZSBHUElPRl9JTklUX0hJR0gJKDEgPDwgMSkKLQotI2RlZmluZSBHUElPRl9JTgkJKEdQSU9GX0RJUl9JTikKLSNkZWZpbmUgR1BJT0ZfT1VUX0lOSVRfTE9XCShHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9MT1cpCi0jZGVmaW5lIEdQSU9GX09VVF9JTklUX0hJR0gJKEdQSU9GX0RJUl9PVVQgfCBHUElPRl9JTklUX0hJR0gpCi0KIC8qKgogICogc3RydWN0IGdwaW8gLSBhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgR1BJTyB3aXRoIGNvbmZpZ3VyYXRpb24KICAqIEBncGlvOgl0aGUgR1BJTyBudW1iZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKaW5kZXggZTliOGU1OS4uNzZiZmYyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKQEAgLTg4LDcgKzg4LDcgQEAKIAlwbWRfdCBwbWQgPSAqcG1kcDsKIAlwbWRfY2xlYXIobW0sIGFkZHJlc3MsIHBtZHApOwogCXJldHVybiBwbWQ7Ci19KQorfQogI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCmluZGV4IGFlOTBlMGYuLjRmNzY5NTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmgKQEAgLTY4Myw5ICs2ODMsMTEgQEAKIF9fU1lTQ0FMTChfX05SX3N5bmNmcywgc3lzX3N5bmNmcykKICNkZWZpbmUgX19OUl9zZXRucyAyNjgKIF9fU1lTQ0FMTChfX05SX3NldG5zLCBzeXNfc2V0bnMpCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cgMjY5CitfX1NDX0NPTVAoX19OUl9zZW5kbW1zZywgc3lzX3NlbmRtbXNnLCBjb21wYXRfc3lzX3NlbmRtbXNnKQogCiAjdW5kZWYgX19OUl9zeXNjYWxscwotI2RlZmluZSBfX05SX3N5c2NhbGxzIDI2OQorI2RlZmluZSBfX05SX3N5c2NhbGxzIDI3MAogCiAvKgogICogQWxsIHN5c2NhbGxzIGJlbG93IGhlcmUgc2hvdWxkIGdvIGF3YXkgcmVhbGx5LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaCBiL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKaW5kZXggOTU3M2UwYy4uMzNkMTJmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCkBAIC01MjAsNiArNTIwLDggQEAKIAl1aW50MzJfdCBlbmNvZGVyX2lkc1tEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSXTsKIAl1aW50MzJfdCBmb3JjZV9lbmNvZGVyX2lkOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsgLyogY3VycmVudGx5IGFjdGl2ZSBlbmNvZGVyICovCisKKwlpbnQgbnVsbF9lZGlkX2NvdW50ZXI7IC8qIG5lZWRlZCB0byB3b3JrYXJvdW5kIHNvbWUgSFcgYnVncyB3aGVyZSB3ZSBnZXQgYWxsIDBzICovCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaCBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaAppbmRleCBmMDRiMmEzLi4zZDUzZWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCkBAIC0xODIsNiArMTgyLDcgQEAKIAl7MHgxMDAyLCAweDY3NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc1OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NUYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKQEAgLTE5Miw2ICsxOTMsNyBAQAogCXsweDEwMDIsIDB4Njc2NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzY4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc3OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2Nzc5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ1lQUkVTU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC00NjcsNiArNDY5LDE3IEBACiAJezB4MTAwMiwgMHg5NjE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTNzgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NjE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTNzgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NjE2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTNzgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNTzJ8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNTzJ8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU8yfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU8yfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCisJezB4MTAwMiwgMHg5NjQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LFwKKwl7MHgxMDAyLCAweDk2NGEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCisJezB4MTAwMiwgMHg5NjRmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LFwKIAl7MHgxMDAyLCAweDk3MTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlM4ODB8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKIAl7MHgxMDAyLCAweDk3MTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlM4ODB8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKIAl7MHgxMDAyLCAweDk3MTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlM4ODB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmgKaW5kZXggNTQ3OWZkYy4uNTE0ZWQ0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaApAQCAtMjAxLDYgKzIwMSw5IEBACiAJYm9vbCAoKmRtYV9maWx0ZXIpKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqZmlsdGVyX3BhcmFtKTsKIAl2b2lkICpkbWFfcnhfcGFyYW07CiAJdm9pZCAqZG1hX3R4X3BhcmFtOworICAgICAgICB2b2lkICgqaW5pdCkgKHZvaWQpOworCXZvaWQgKCpleGl0KSAodm9pZCk7CisJdm9pZCAoKnJlc2V0KSAodm9pZCk7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmFzaWNfbW1pb19ncGlvLmggYi9pbmNsdWRlL2xpbnV4L2Jhc2ljX21taW9fZ3Bpby5oCmluZGV4IDFhZTEyNzEuLjk4OTk5Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFzaWNfbW1pb19ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9iYXNpY19tbWlvX2dwaW8uaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAogc3RydWN0IGJncGlvX3BkYXRhIHsKIAlpbnQgYmFzZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCmluZGV4IDJhN2NlYTUuLjYzOTU2OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJKFJFUV9GQUlMRkFTVF9ERVYgfCBSRVFfRkFJTEZBU1RfVFJBTlNQT1JUIHwgUkVRX0ZBSUxGQVNUX0RSSVZFUikKICNkZWZpbmUgUkVRX0NPTU1PTl9NQVNLIFwKIAkoUkVRX1dSSVRFIHwgUkVRX0ZBSUxGQVNUX01BU0sgfCBSRVFfU1lOQyB8IFJFUV9NRVRBIHwgUkVRX0RJU0NBUkQgfCBcCi0JIFJFUV9OT0lETEUgfCBSRVFfRkxVU0ggfCBSRVFfRlVBKQorCSBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSB8IFJFUV9TRUNVUkUpCiAjZGVmaW5lIFJFUV9DTE9ORV9NQVNLCQlSRVFfQ09NTU9OX01BU0sKIAogI2RlZmluZSBSRVFfUkFIRUFECQkoMSA8PCBfX1JFUV9SQUhFQUQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBhZTkwOTFhLi4xYTIzNzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTEyODIsOCArMTI4Miw4IEBACiAjZGVmaW5lIGJsa19nZXRfaW50ZWdyaXR5KGEpCQkJKDApCiAjZGVmaW5lIGJsa19pbnRlZ3JpdHlfY29tcGFyZShhLCBiKQkJKDApCiAjZGVmaW5lIGJsa19pbnRlZ3JpdHlfcmVnaXN0ZXIoYSwgYikJCSgwKQotI2RlZmluZSBibGtfaW50ZWdyaXR5X3VucmVnaXN0ZXIoYSkJCWRvIHsgfSB3aGlsZSAoMCk7Ci0jZGVmaW5lIGJsa19xdWV1ZV9tYXhfaW50ZWdyaXR5X3NlZ21lbnRzKGEsIGIpCWRvIHsgfSB3aGlsZSAoMCk7CisjZGVmaW5lIGJsa19pbnRlZ3JpdHlfdW5yZWdpc3RlcihhKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBibGtfcXVldWVfbWF4X2ludGVncml0eV9zZWdtZW50cyhhLCBiKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHF1ZXVlX21heF9pbnRlZ3JpdHlfc2VnbWVudHMoYSkJCSgwKQogI2RlZmluZSBibGtfaW50ZWdyaXR5X21lcmdlX3JxKGEsIGIsIGMpCQkoMCkKICNkZWZpbmUgYmxrX2ludGVncml0eV9tZXJnZV9iaW8oYSwgYiwgYykJKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAppbmRleCBiMjJmYjBkLi44YzdjMmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTE2OSw3ICsxNjksOCBAQAogZXh0ZXJuIGludCBkb19ibGtfdHJhY2Vfc2V0dXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUsCiAJCQkgICAgICBkZXZfdCBkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgKmJ1dHMpOwotZXh0ZXJuIHZvaWQgX190cmFjZV9ub3RlX21lc3NhZ2Uoc3RydWN0IGJsa190cmFjZSAqLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQordm9pZCBfX3RyYWNlX25vdGVfbWVzc2FnZShzdHJ1Y3QgYmxrX3RyYWNlICosIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogLyoqCiAgKiBibGtfYWRkX3RyYWNlX21zZyAtIEFkZCBhIChzaW1wbGUpIG1lc3NhZ2UgdG8gdGhlIGJsa3RyYWNlIHN0cmVhbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCmluZGV4IGQ0NjQ2YjQuLjE4YTFiYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKQEAgLTE4OCw2ICsxODgsNyBAQAogI2lmZGVmIENPTkZJR19DTE9DS1NPVVJDRV9XQVRDSERPRwogCS8qIFdhdGNoZG9nIHJlbGF0ZWQgZGF0YSwgdXNlZCBieSB0aGUgZnJhbWV3b3JrICovCiAJc3RydWN0IGxpc3RfaGVhZCB3ZF9saXN0OworCWN5Y2xlX3QgY3NfbGFzdDsKIAljeWNsZV90IHdkX2xhc3Q7CiAjZW5kaWYKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggZGRjYjdkYi4uODQ2YmIxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC00NjcsNiArNDY3LDggQEAKIAkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbmRtc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywKIAkJCQkgICB1bnNpZ25lZCBmbGFncyk7Cithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbW1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKm1tc2csCisJCQkJICAgIHVuc2lnbmVkIHZsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2bXNnKGludCBmZCwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2csCiAJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3YoaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaCBiL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKaW5kZXggN2M2MGQwOS4uZjY5NmJjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIENOX1ZBTF9EUkJECQkJMHgxCiAjZGVmaW5lIENOX0tWUF9JRFgJCQkweDkJLyogSHlwZXJWIEtWUCAqLwogCi0jZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTkKKyNkZWZpbmUgQ05fTkVUTElOS19VU0VSUwkJMTAJLyogSGlnaGVzdCBpbmRleCArIDEgKi8KIAogLyoKICAqIE1heGltdW0gY29ubmVjdG9yJ3MgbWVzc2FnZSBzaXplLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggYzY2MTExYS4uZTRmNjJkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC01MzAsNyArNTMwLDYgQEAKICAqIEBkbWFfbWVtOglJbnRlcm5hbCBmb3IgY29oZXJlbnQgbWVtIG92ZXJyaWRlLgogICogQGFyY2hkYXRhOglGb3IgYXJjaC1zcGVjaWZpYyBhZGRpdGlvbnMuCiAgKiBAb2Zfbm9kZToJQXNzb2NpYXRlZCBkZXZpY2UgdHJlZSBub2RlLgotICogQG9mX21hdGNoOglNYXRjaGluZyBvZl9kZXZpY2VfaWQgZnJvbSBkcml2ZXIuCiAgKiBAZGV2dDoJRm9yIGNyZWF0aW5nIHRoZSBzeXNmcyAiZGV2Ii4KICAqIEBkZXZyZXNfbG9jazogU3BpbmxvY2sgdG8gcHJvdGVjdCB0aGUgcmVzb3VyY2Ugb2YgdGhlIGRldmljZS4KICAqIEBkZXZyZXNfaGVhZDogVGhlIHJlc291cmNlcyBsaXN0IG9mIHRoZSBkZXZpY2UuCkBAIC02NTQsMTMgKzY1MywxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoIWRldi0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IHRydWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2VfZGlzYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoIWRldi0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oCmluZGV4IDBiMGQ5YzMuLjdhYWQxZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oCkBAIC0yLDggKzIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9ERVZJQ0UKLWV4dGVybiBpbnQgZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOworZXh0ZXJuIGludCBfX2RldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIGV4dGVybiBpbnQgZGV2Y2dyb3VwX2lub2RlX21rbm9kKGludCBtb2RlLCBkZXZfdCBkZXYpOworc3RhdGljIGlubGluZSBpbnQgZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJaWYgKGxpa2VseSghaW5vZGUtPmlfcmRldikpCisJCXJldHVybiAwOworCWlmICghU19JU0JMSyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF9fZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOworfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGRldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFfcmVtYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaAppbmRleCA1NjE5Zjg1Li5iYmQ4NjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaApAQCAtOSw4ICs5LDEyIEBACiAjZGVmaW5lIFZURF9QQUdFX01BU0sJCSgoKHU2NCktMSkgPDwgVlREX1BBR0VfU0hJRlQpCiAjZGVmaW5lIFZURF9QQUdFX0FMSUdOKGFkZHIpCSgoKGFkZHIpICsgVlREX1BBR0VfU0laRSAtIDEpICYgVlREX1BBR0VfTUFTSykKIAorI2RlZmluZSBWVERfU1RSSURFX1NISUZUICAgICAgICAoOSkKKyNkZWZpbmUgVlREX1NUUklERV9NQVNLICAgICAgICAgKCgodTY0KS0xKSA8PCBWVERfU1RSSURFX1NISUZUKQorCiAjZGVmaW5lIERNQV9QVEVfUkVBRCAoMSkKICNkZWZpbmUgRE1BX1BURV9XUklURSAoMikKKyNkZWZpbmUgRE1BX1BURV9MQVJHRV9QQUdFICgxIDw8IDcpCiAjZGVmaW5lIERNQV9QVEVfU05QICgxIDw8IDExKQogCiAjZGVmaW5lIENPTlRFWFRfVFRfTVVMVElfTEVWRUwJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcmJkX2xpbWl0cy5oIGIvaW5jbHVkZS9saW51eC9kcmJkX2xpbWl0cy5oCmluZGV4IDI0NmY1NzYuLjQ0N2MzNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHJiZF9saW1pdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RyYmRfbGltaXRzLmgKQEAgLTExNywxMCArMTE3LDEwIEBACiAvKiBkcmJkc2V0dXAgWFkgcmVzaXplIC1kIFoKICAqIHlvdSBhcmUgZnJlZSB0byByZWR1Y2UgdGhlIGRldmljZSBzaXplIHRvIG5vdGhpbmcsIGlmIHlvdSB3YW50IHRvLgogICogdGhlIHVwcGVyIGxpbWl0IHdpdGggNjRiaXQga2VybmVsLCBlbm91Z2ggcmFtIGFuZCBmbGV4aWJsZSBtZXRhIGRhdGEKLSAqIGlzIDE2IFRCLCBjdXJyZW50bHkuICovCisgKiBpcyAxIFBpQiwgY3VycmVudGx5LiAqLwogLyogRFJCRF9NQVhfU0VDVE9SUyAqLwogI2RlZmluZSBEUkJEX0RJU0tfU0laRV9TRUNUX01JTiAgMAotI2RlZmluZSBEUkJEX0RJU0tfU0laRV9TRUNUX01BWCAgKDE2ICogKDJMTFUgPDwgMzApKQorI2RlZmluZSBEUkJEX0RJU0tfU0laRV9TRUNUX01BWCAgKDEgKiAoMkxMVSA8PCA0MCkpCiAjZGVmaW5lIERSQkRfRElTS19TSVpFX1NFQ1RfREVGICAwIC8qID0gZGlzYWJsZWQgPSBubyB1c2VyIHNpemUuLi4gKi8KIAogI2RlZmluZSBEUkJEX09OX0lPX0VSUk9SX0RFRiBFUF9QQVNTX09OCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaCBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCmluZGV4IGM2YTg1MGEuLjQzOWIxNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlfX3UzMgljbWQ7CS8qIEVUSFRPT0xfe0csU31QQVVTRVBBUkFNICovCiAKIAkvKiBJZiB0aGUgbGluayBpcyBiZWluZyBhdXRvLW5lZ290aWF0ZWQgKHZpYSBldGh0b29sX2NtZC5hdXRvbmVnCi0JICogYmVpbmcgdHJ1ZSkgdGhlIHVzZXIgbWF5IHNldCAnYXV0b25ldCcgaGVyZSBub24temVybyB0byBoYXZlIHRoZQorCSAqIGJlaW5nIHRydWUpIHRoZSB1c2VyIG1heSBzZXQgJ2F1dG9uZWcnIGhlcmUgbm9uLXplcm8gdG8gaGF2ZSB0aGUKIAkgKiBwYXVzZSBwYXJhbWV0ZXJzIGJlIGF1dG8tbmVnb3RpYXRlZCB0b28uICBJbiBzdWNoIGEgY2FzZSwgdGhlCiAJICoge3J4LHR4fV9wYXVzZSB2YWx1ZXMgYmVsb3cgZGV0ZXJtaW5lIHdoYXQgY2FwYWJpbGl0aWVzIGFyZQogCSAqIGFkdmVydGlzZWQuCkBAIC04MTEsNyArODExLDcgQEAKICAqIEBnZXRfdHhfY3N1bTogRGVwcmVjYXRlZCBhcyByZWR1bmRhbnQuIFJlcG9ydCB3aGV0aGVyIHRyYW5zbWl0IGNoZWNrc3VtcwogICoJYXJlIHR1cm5lZCBvbiBvciBvZmYuCiAgKiBAc2V0X3R4X2NzdW06IERlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGdlbmVyaWMgbmV0ZGV2IGZlYXR1cmVzLiAgVHVybgotICoJdHJhbnNtaXQgY2hlY2tzdW1zIG9uIG9yIG9mZi4gIFJldHVybnMgYSBlZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KKyAqCXRyYW5zbWl0IGNoZWNrc3VtcyBvbiBvciBvZmYuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvLgogICogQGdldF9zZzogRGVwcmVjYXRlZCBhcyByZWR1bmRhbnQuICBSZXBvcnQgd2hldGhlciBzY2F0dGVyLWdhdGhlciBpcwogICoJZW5hYmxlZC4gIAogICogQHNldF9zZzogRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2VuZXJpYyBuZXRkZXYgZmVhdHVyZXMuICBUdXJuCkBAIC0xMDg3LDcgKzEwODcsNyBAQAogLyogVGhlIGZvbGxvd2luZyBhcmUgYWxsIGludm9sdmVkIGluIGZvcmNpbmcgYSBwYXJ0aWN1bGFyIGxpbmsKICAqIG1vZGUgZm9yIHRoZSBkZXZpY2UgZm9yIHNldHRpbmcgdGhpbmdzLiAgV2hlbiBnZXR0aW5nIHRoZQogICogZGV2aWNlcyBzZXR0aW5ncywgdGhlc2UgaW5kaWNhdGUgdGhlIGN1cnJlbnQgbW9kZSBhbmQgd2hldGhlcgotICogaXQgd2FzIGZvY2VkIHVwIGludG8gdGhpcyBtb2RlIG9yIGF1dG9uZWdvdGlhdGVkLgorICogaXQgd2FzIGZvcmNlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KICAqLwogCiAvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdCwgMi41R2IsIDEwR2JFLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGM1NWQ2YjcuLmI1Yjk3OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTIwOCw2ICsyMDgsNyBAQAogI2RlZmluZSBNU19LRVJOTU9VTlQJKDE8PDIyKSAvKiB0aGlzIGlzIGEga2Vybl9tb3VudCBjYWxsICovCiAjZGVmaW5lIE1TX0lfVkVSU0lPTgkoMTw8MjMpIC8qIFVwZGF0ZSBpbm9kZSBJX3ZlcnNpb24gZmllbGQgKi8KICNkZWZpbmUgTVNfU1RSSUNUQVRJTUUJKDE8PDI0KSAvKiBBbHdheXMgcGVyZm9ybSBhdGltZSB1cGRhdGVzICovCisjZGVmaW5lIE1TX05PU0VDCSgxPDwyOCkKICNkZWZpbmUgTVNfQk9STgkJKDE8PDI5KQogI2RlZmluZSBNU19BQ1RJVkUJKDE8PDMwKQogI2RlZmluZSBNU19OT1VTRVIJKDE8PDMxKQpAQCAtNjM4LDYgKzYzOSw3IEBACiAJc3RydWN0IHByaW9fdHJlZV9yb290CWlfbW1hcDsJCS8qIHRyZWUgb2YgcHJpdmF0ZSBhbmQgc2hhcmVkIG1hcHBpbmdzICovCiAJc3RydWN0IGxpc3RfaGVhZAlpX21tYXBfbm9ubGluZWFyOy8qbGlzdCBWTV9OT05MSU5FQVIgbWFwcGluZ3MgKi8KIAlzdHJ1Y3QgbXV0ZXgJCWlfbW1hcF9tdXRleDsJLyogcHJvdGVjdCB0cmVlLCBjb3VudCwgbGlzdCAqLworCS8qIFByb3RlY3RlZCBieSB0cmVlX2xvY2sgdG9nZXRoZXIgd2l0aCB0aGUgcmFkaXggdHJlZSAqLwogCXVuc2lnbmVkIGxvbmcJCW5ycGFnZXM7CS8qIG51bWJlciBvZiB0b3RhbCBwYWdlcyAqLwogCXBnb2ZmX3QJCQl3cml0ZWJhY2tfaW5kZXg7Lyogd3JpdGViYWNrIHN0YXJ0cyBoZXJlICovCiAJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYV9vcHM7CS8qIG1ldGhvZHMgKi8KQEAgLTc0Myw5ICs3NDUsMTMgQEAKIAogCXNwaW5sb2NrX3QJCWlfbG9jazsJLyogaV9ibG9ja3MsIGlfYnl0ZXMsIG1heWJlIGlfc2l6ZSAqLwogCXVuc2lnbmVkIGludAkJaV9mbGFnczsKKwl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOworI2lmZGVmIENPTkZJR19TRUNVUklUWQorCXZvaWQJCQkqaV9zZWN1cml0eTsKKyNlbmRpZgogCXN0cnVjdCBtdXRleAkJaV9tdXRleDsKIAotCXVuc2lnbmVkIGxvbmcJCWlfc3RhdGU7CisKIAl1bnNpZ25lZCBsb25nCQlkaXJ0aWVkX3doZW47CS8qIGppZmZpZXMgb2YgZmlyc3QgZGlydHlpbmcgKi8KIAogCXN0cnVjdCBobGlzdF9ub2RlCWlfaGFzaDsKQEAgLTc5Nyw5ICs4MDMsNiBAQAogCWF0b21pY190CQlpX3JlYWRjb3VudDsgLyogc3RydWN0IGZpbGVzIG9wZW4gUk8gKi8KICNlbmRpZgogCWF0b21pY190CQlpX3dyaXRlY291bnQ7Ci0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZCi0Jdm9pZAkJCSppX3NlY3VyaXR5OwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOwogCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7CkBAIC0yNTkxLDcgKzI1OTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5vZGVfaGFzX25vX3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaWYgKCFpc19zeGlkKGlub2RlLT5pX21vZGUpKQorCWlmICghaXNfc3hpZChpbm9kZS0+aV9tb2RlKSAmJiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT1NFQykpCiAJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9TRUM7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKaW5kZXggN2M0ZDcyZi4uOWVjMjBkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKQEAgLTIwNCw2ICsyMDQsOCBAQAogZXh0ZXJuIHZvaWQgX19mc2NhY2hlX3dhaXRfb25fcGFnZV93cml0ZShzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKiwgc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gYm9vbCBfX2ZzY2FjaGVfbWF5YmVfcmVsZWFzZV9wYWdlKHN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqLCBzdHJ1Y3QgcGFnZSAqLAogCQkJCQkgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgX19mc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKHN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqLAorCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qKgogICogZnNjYWNoZV9yZWdpc3Rlcl9uZXRmcyAtIFJlZ2lzdGVyIGEgZmlsZXN5c3RlbSBhcyBkZXNpcmluZyBjYWNoaW5nIHNlcnZpY2VzCkBAIC02NDMsNCArNjQ1LDIzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisvKioKKyAqIGZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMgLSBVbmNhY2hlIGFsbCBhbiBpbm9kZSdzIHBhZ2VzCisgKiBAY29va2llOiBUaGUgY29va2llIHJlcHJlc2VudGluZyB0aGUgaW5vZGUncyBjYWNoZSBvYmplY3QuCisgKiBAaW5vZGU6IFRoZSBpbm9kZSB0byB1bmNhY2hlIHBhZ2VzIGZyb20uCisgKgorICogVW5jYWNoZSBhbGwgdGhlIHBhZ2VzIGluIGFuIGlub2RlIHRoYXQgYXJlIG1hcmtlZCBQR19mc2NhY2hlLCBhc3N1bWluZyB0aGVtCisgKiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvb2tpZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4gIEl0IHdpbGwgd2FpdCBmb3IgcGFnZXMgdGhhdCBhcmUgYmVpbmcgd3JpdHRlbiBvdXQKKyAqIGFuZCB3aWxsIHdhaXQgd2hpbHN0IHRoZSBQR19mc2NhY2hlIG1hcmsgaXMgcmVtb3ZlZCBieSB0aGUgY2FjaGUuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSwKKwkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGZzY2FjaGVfY29va2llX3ZhbGlkKGNvb2tpZSkpCisJCV9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhjb29raWUsIGlub2RlKTsKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9GU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNsLWRpdS1mYi5oIGIvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKaW5kZXggNzgxZDQ2Ny4uZGFhOTk1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKQEAgLTI0LDEyICsyNCw2IEBACiAgKiBTZWUgbXBjODYxMGZiX3NldF9wYXIoKSwgbWFwX3ZpZGVvX21lbW9yeSgpLCBhbmQgdW5tYXBfdmlkZW9fbWVtb3J5KCkKICAqLwogI2RlZmluZSBNRU1fQUxMT0NfVEhSRVNIT0xEICgxMDI0Kjc2OCo0KzMyKQotLyogTWluaW11bSB2YWx1ZSB0aGF0IHRoZSBwaXhlbCBjbG9jayBjYW4gYmUgc2V0IHRvIGluIHBpY28gc2Vjb25kcwotICogVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHBsYXRmb3JtIGNsb2NrLzMgd2hlcmUgdGhlIG1pbmltdW0gcGxhdGZvcm0KLSAqIGNsb2NrIGlzIDUzM01Iei4gVGhpcyBnaXZlcyA1NjI5IHBpY28gc2Vjb25kcy4KLSAqLwotI2RlZmluZSBNSU5fUElYX0NMSyA1NjI5Ci0jZGVmaW5lIE1BWF9QSVhfQ0xLIDk2MDk2CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggYjc4OTU2Yi4uMzAwZDc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAJc2VjdG9yX3Qgc3RhcnRfc2VjdDsKIAlzZWN0b3JfdCBucl9zZWN0czsKIAlzZWN0b3JfdCBhbGlnbm1lbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkaXNjYXJkX2FsaWdubWVudDsKIAlzdHJ1Y3QgZGV2aWNlIF9fZGV2OwogCXN0cnVjdCBrb2JqZWN0ICpob2xkZXJfZGlyOwogCWludCBwb2xpY3ksIHBhcnRubzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKaW5kZXggMzJkNDdlNy4uMTdiNWEwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKQEAgLTMsNiArMywxNyBAQAogCiAvKiBzZWUgRG9jdW1lbnRhdGlvbi9ncGlvLnR4dCAqLwogCisvKiBtYWtlIHRoZXNlIGZsYWcgdmFsdWVzIGF2YWlsYWJsZSByZWdhcmRsZXNzIG9mIEdQSU8ga2NvbmZpZyBvcHRpb25zICovCisjZGVmaW5lIEdQSU9GX0RJUl9PVVQJKDAgPDwgMCkKKyNkZWZpbmUgR1BJT0ZfRElSX0lOCSgxIDw8IDApCisKKyNkZWZpbmUgR1BJT0ZfSU5JVF9MT1cJKDAgPDwgMSkKKyNkZWZpbmUgR1BJT0ZfSU5JVF9ISUdICSgxIDw8IDEpCisKKyNkZWZpbmUgR1BJT0ZfSU4JCShHUElPRl9ESVJfSU4pCisjZGVmaW5lIEdQSU9GX09VVF9JTklUX0xPVwkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfTE9XKQorI2RlZmluZSBHUElPRl9PVVRfSU5JVF9ISUdICShHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9ISUdIKQorCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfR1BJTwogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggNTE5MzJlNS4uZmQwZGMzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTEzNSw2ICsxMzUsNyBAQAogICogQGNwdV9iYXNlOgkJcGVyIGNwdSBjbG9jayBiYXNlCiAgKiBAaW5kZXg6CQljbG9jayB0eXBlIGluZGV4IGZvciBwZXJfY3B1IHN1cHBvcnQgd2hlbiBtb3ZpbmcgYQogICoJCQl0aW1lciB0byBhIGJhc2Ugb24gYW5vdGhlciBjcHUuCisgKiBAY2xvY2tpZDoJCWNsb2NrIGlkIGZvciBwZXJfY3B1IHN1cHBvcnQKICAqIEBhY3RpdmU6CQlyZWQgYmxhY2sgdHJlZSByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgdGltZXJzCiAgKiBAcmVzb2x1dGlvbjoJCXRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jaywgaW4gbmFub3NlY29uZHMKICAqIEBnZXRfdGltZToJCWZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIGNsb2NrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9hZHA4ODcwLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9hZHA4ODcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ZGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2FkcDg4NzAuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIERlZmluaXRpb25zIGFuZCBwbGF0Zm9ybSBkYXRhIGZvciBBbmFsb2cgRGV2aWNlcworICogQmFja2xpZ2h0IGRyaXZlcnMgQURQODg3MAorICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSTJDX0FEUDg4NzBfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19BRFA4ODcwX0gKKworI2RlZmluZSBJRF9BRFA4ODcwCQk4ODcwCisKKyNkZWZpbmUgQURQODg3MF9NQVhfQlJJR0hUTkVTUwkweDdGCisjZGVmaW5lIEZMQUdfT0ZGVF9TSElGVCA4CisKKy8qCisgKiBMRURzIHN1YmRldmljZSBwbGF0Zm9ybSBkYXRhCisgKi8KKworI2RlZmluZSBBRFA4ODcwX0xFRF9ESVNfQkxJTksJKDAgPDwgRkxBR19PRkZUX1NISUZUKQorI2RlZmluZSBBRFA4ODcwX0xFRF9PRkZUXzYwMG1zCSgxIDw8IEZMQUdfT0ZGVF9TSElGVCkKKyNkZWZpbmUgQURQODg3MF9MRURfT0ZGVF8xMjAwbXMJKDIgPDwgRkxBR19PRkZUX1NISUZUKQorI2RlZmluZSBBRFA4ODcwX0xFRF9PRkZUXzE4MDBtcwkoMyA8PCBGTEFHX09GRlRfU0hJRlQpCisKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzIwMG1zCTAKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzYwMG1zCTEKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzgwMG1zCTIKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzEyMDBtcwkzCisKKyNkZWZpbmUgQURQODg3MF9MRURfRDcJCSg3KQorI2RlZmluZSBBRFA4ODcwX0xFRF9ENgkJKDYpCisjZGVmaW5lIEFEUDg4NzBfTEVEX0Q1CQkoNSkKKyNkZWZpbmUgQURQODg3MF9MRURfRDQJCSg0KQorI2RlZmluZSBBRFA4ODcwX0xFRF9EMwkJKDMpCisjZGVmaW5lIEFEUDg4NzBfTEVEX0QyCQkoMikKKyNkZWZpbmUgQURQODg3MF9MRURfRDEJCSgxKQorCisvKgorICogQmFja2xpZ2h0IHN1YmRldmljZSBwbGF0Zm9ybSBkYXRhCisgKi8KKworI2RlZmluZSBBRFA4ODcwX0JMX0Q3CQkoMSA8PCA2KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q2CQkoMSA8PCA1KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q1CQkoMSA8PCA0KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q0CQkoMSA8PCAzKQorI2RlZmluZSBBRFA4ODcwX0JMX0QzCQkoMSA8PCAyKQorI2RlZmluZSBBRFA4ODcwX0JMX0QyCQkoMSA8PCAxKQorI2RlZmluZSBBRFA4ODcwX0JMX0QxCQkoMSA8PCAwKQorCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UX0RJUwkwCS8qIEZhZGUgVGltZXIgRGlzYWJsZWQgKi8KKyNkZWZpbmUgQURQODg3MF9GQURFX1RfMzAwbXMJMQkvKiAwLjMgU2VjICovCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzYwMG1zCTIKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfOTAwbXMJMworI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xMjAwbXMJNAorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xNTAwbXMJNQorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xODAwbXMJNgorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yMTAwbXMJNworI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yNDAwbXMJOAorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yNzAwbXMJOQorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8zMDAwbXMJMTAKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfMzUwMG1zCTExCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzQwMDBtcwkxMgorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF80NTAwbXMJMTMKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfNTAwMG1zCTE0CisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzU1MDBtcwkxNQkvKiA1LjUgU2VjICovCisKKyNkZWZpbmUgQURQODg3MF9GQURFX0xBV19MSU5FQVIJMAorI2RlZmluZSBBRFA4ODcwX0ZBREVfTEFXX1NRVUFSRQkxCisjZGVmaW5lIEFEUDg4NzBfRkFERV9MQVdfQ1VCSUMxCTIKKyNkZWZpbmUgQURQODg3MF9GQURFX0xBV19DVUJJQzIJMworCisjZGVmaW5lIEFEUDg4NzBfQkxfQU1CTF9GSUxUXzgwbXMJMAkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTYwbXMJMQorI2RlZmluZSBBRFA4ODcwX0JMX0FNQkxfRklMVF8zMjBtcwkyCisjZGVmaW5lIEFEUDg4NzBfQkxfQU1CTF9GSUxUXzY0MG1zCTMKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTI4MG1zCTQKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMjU2MG1zCTUKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfNTEyMG1zCTYKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTAyNDBtcwk3CS8qIDEwLjI0IHNlYyAqLworCisvKgorICogQmxhY2tsaWdodCBjdXJyZW50IDAuLjMwbUEKKyAqLworI2RlZmluZSBBRFA4ODcwX0JMX0NVUl9tQShJKQkJKChJICogMTI3KSAvIDMwKQorCisvKgorICogTDIgY29tcGFyYXRvciBjdXJyZW50IDAuLjExMDZ1QQorICovCisjZGVmaW5lIEFEUDg4NzBfTDJfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAxMTA2KQorCisvKgorICogTDMgY29tcGFyYXRvciBjdXJyZW50IDAuLjU1MXVBCisgKi8KKyNkZWZpbmUgQURQODg3MF9MM19DT01QX0NVUlJfdUEoSSkJKChJICogMjU1KSAvIDU1MSkKKworLyoKKyAqIEw0IGNvbXBhcmF0b3IgY3VycmVudCAwLi4yNzV1QQorICovCisjZGVmaW5lIEFEUDg4NzBfTDRfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAyNzUpCisKKy8qCisgKiBMNSBjb21wYXJhdG9yIGN1cnJlbnQgMC4uMTM4dUEKKyAqLworI2RlZmluZSBBRFA4ODcwX0w1X0NPTVBfQ1VSUl91QShJKQkoKEkgKiAyNTUpIC8gMTM4KQorCitzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSB7CisJdTggYmxfbGVkX2Fzc2lnbjsJLyogMSA9IEJhY2tsaWdodCAwID0gSW5kaXZpZHVhbCBMRUQgKi8KKwl1OCBwd21fYXNzaWduOwkJLyogMSA9IEVuYWJsZXMgUFdNIG1vZGUgKi8KKworCXU4IGJsX2ZhZGVfaW47CQkvKiBCYWNrbGlnaHQgRmFkZS1JbiBUaW1lciAqLworCXU4IGJsX2ZhZGVfb3V0OwkJLyogQmFja2xpZ2h0IEZhZGUtT3V0IFRpbWVyICovCisJdTggYmxfZmFkZV9sYXc7CQkvKiBmYWRlLW9uL2ZhZGUtb2ZmIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICovCisKKwl1OCBlbl9hbWJsX3NlbnM7CS8qIDEgPSBlbmFibGUgYW1iaWVudCBsaWdodCBzZW5zb3IgKi8KKwl1OCBhYm1sX2ZpbHQ7CQkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKworCXU4IGwxX2RheWxpZ2h0X21heDsJLyogdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsMV9kYXlsaWdodF9kaW07CS8qIHR5cCA9IDAsIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDJfYnJpZ2h0X21heDsJLyogdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsMl9icmlnaHRfZGltOwkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGwzX29mZmljZV9tYXg7CS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDNfb2ZmaWNlX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsNF9pbmRvb3JfbWF4OwkvKiB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGw0X2luZG9yX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsNV9kYXJrX21heDsJCS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDVfZGFya19kaW07CQkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCisJdTggbDJfdHJpcDsJCS8qIHVzZSBMMl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDExMDYgdUEgKi8KKwl1OCBsMl9oeXN0OwkJLyogdXNlIEwyX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTEwNiB1QSAqLworCXU4IGwzX3RyaXA7CQkvKiB1c2UgTDNfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSA1NTEgdUEgKi8KKwl1OCBsM19oeXN0OwkJLyogdXNlIEwzX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gNTUxIHVBICovCisJdTggbDRfdHJpcDsJCS8qIHVzZSBMNF9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDI3NSB1QSAqLworCXU4IGw0X2h5c3Q7CQkvKiB1c2UgTDRfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSAyNzUgdUEgKi8KKwl1OCBsNV90cmlwOwkJLyogdXNlIEw1X0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTM4IHVBICovCisJdTggbDVfaHlzdDsJCS8qIHVzZSBMNl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDEzOCB1QSAqLworCisJLyoqCisJICogSW5kZXBlbmRlbnQgQ3VycmVudCBTaW5rcyAvIExFRFMKKwkgKiBTaW5rcyBub3QgYXNzaWduZWQgdG8gdGhlIEJhY2tsaWdodCBjYW4gYmUgZXhwb3NlZCB0bworCSAqIHVzZXIgc3BhY2UgdXNpbmcgdGhlIExFRFMgQ0xBU1MgaW50ZXJmYWNlCisJICovCisKKwlpbnQgbnVtX2xlZHM7CisJc3RydWN0IGxlZF9pbmZvCSpsZWRzOworCXU4IGxlZF9mYWRlX2luOwkJLyogTEVEIEZhZGUtSW4gVGltZXIgKi8KKwl1OCBsZWRfZmFkZV9vdXQ7CS8qIExFRCBGYWRlLU91dCBUaW1lciAqLworCXU4IGxlZF9mYWRlX2xhdzsJLyogZmFkZS1vbi9mYWRlLW9mZiB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAqLworCXU4IGxlZF9vbl90aW1lOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfSTJDX0FEUDg4NzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKaW5kZXggYjJlZWU1OC4uYmY1NmI2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCkBAIC0xMDAzLDggKzEwMDMsMTIgQEAKICNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0VTUwkJKDE8PDApCiAjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTCQkoMTw8MSkKIAotLyogQSBtZXNoIFNUQSBzZXRzIHRoZSBFU1MgYW5kIElCU1MgY2FwYWJpbGl0eSBiaXRzIHRvIHplcm8gKi8KLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lTX01CU1MoY2FwKQlcCisvKgorICogQSBtZXNoIFNUQSBzZXRzIHRoZSBFU1MgYW5kIElCU1MgY2FwYWJpbGl0eSBiaXRzIHRvIHplcm8uCisgKiBob3dldmVyLCB0aGlzIGhvbGRzIHRydWUgZm9yIHAycCBwcm9iZSByZXNwb25zZXMgKGluIHRoZSBwMnBfZmluZAorICogcGhhc2UpIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lTX1NUQV9CU1MoY2FwKQlcCiAJKCEoKGNhcCkgJiAoV0xBTl9DQVBBQklMSVRZX0VTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkpCiAKICNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFCSgxPDwyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaCBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKaW5kZXggNzJiZmE1YS4uN2IzMTg2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCkBAIC02Miw2ICs2Miw3IEBACiAJX191MTYJCXRwX21hYzsKIAlfX3UxNgkJdHBfbmV0OwogCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKIH07CiAKIC8qIFJ4IHJpbmcgLSBoZWFkZXIgc3RhdHVzICovCkBAIC03MCw2ICs3MSw3IEBACiAjZGVmaW5lIFRQX1NUQVRVU19DT1BZCQkweDIKICNkZWZpbmUgVFBfU1RBVFVTX0xPU0lORwkweDQKICNkZWZpbmUgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWQkweDgKKyNkZWZpbmUgVFBfU1RBVFVTX1ZMQU5fVkFMSUQgICAweDEwIC8qIGF1eGRhdGEgaGFzIHZhbGlkIHRwX3ZsYW5fdGNpICovCiAKIC8qIFR4IHJpbmcgLSBoZWFkZXIgc3RhdHVzICovCiAjZGVmaW5lIFRQX1NUQVRVU19BVkFJTEFCTEUJMHgwCkBAIC0xMDAsNiArMTAyLDcgQEAKIAlfX3UzMgkJdHBfc2VjOwogCV9fdTMyCQl0cF9uc2VjOwogCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKIH07CiAKICNkZWZpbmUgVFBBQ0tFVDJfSERSTEVOCQkoVFBBQ0tFVF9BTElHTihzaXplb2Yoc3RydWN0IHRwYWNrZXQyX2hkcikpICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaCBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCmluZGV4IGRjMDE2ODEuLmFmZmEyNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCkBAIC0yMjUsNyArMjI1LDcgQEAKIH0KIAogLyoqCi0gKiBfX3ZsYW5fcHV0X3RhZyAtIHJlZ3VsYXIgVkxBTiB0YWcgaW5zZXJ0aW5nCisgKiB2bGFuX2luc2VydF90YWcgLSByZWd1bGFyIFZMQU4gdGFnIGluc2VydGluZwogICogQHNrYjogc2tidWZmIHRvIHRhZwogICogQHZsYW5fdGNpOiBWTEFOIFRDSSB0byBpbnNlcnQKICAqCkBAIC0yMzQsOCArMjM0LDEwIEBACiAgKgogICogRm9sbG93aW5nIHRoZSBza2JfdW5zaGFyZSgpIGV4YW1wbGUsIGluIGNhc2Ugb2YgZXJyb3IsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCiAgKiBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZnJlZWluZyB0aGUgb3JpZ2luYWwgc2tiLgorICoKKyAqIERvZXMgbm90IGNoYW5nZSBza2ItPnByb3RvY29sIHNvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZHVyaW5nIHJlY2VpdmUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fdmxhbl9wdXRfdGFnKHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RjaSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnZsYW5faW5zZXJ0X3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgdmxhbl90Y2kpCiB7CiAJc3RydWN0IHZsYW5fZXRoaGRyICp2ZXRoOwogCkBAIC0yNTUsOCArMjU3LDI1IEBACiAJLyogbm93LCB0aGUgVENJICovCiAJdmV0aC0+aF92bGFuX1RDSSA9IGh0b25zKHZsYW5fdGNpKTsKIAotCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDIxUSk7CisJcmV0dXJuIHNrYjsKK30KIAorLyoqCisgKiBfX3ZsYW5fcHV0X3RhZyAtIHJlZ3VsYXIgVkxBTiB0YWcgaW5zZXJ0aW5nCisgKiBAc2tiOiBza2J1ZmYgdG8gdGFnCisgKiBAdmxhbl90Y2k6IFZMQU4gVENJIHRvIGluc2VydAorICoKKyAqIEluc2VydHMgdGhlIFZMQU4gdGFnIGludG8gQHNrYiBhcyBwYXJ0IG9mIHRoZSBwYXlsb2FkCisgKiBSZXR1cm5zIGEgVkxBTiB0YWdnZWQgc2tiLiBJZiBhIG5ldyBza2IgaXMgY3JlYXRlZCwgQHNrYiBpcyBmcmVlZC4KKyAqCisgKiBGb2xsb3dpbmcgdGhlIHNrYl91bnNoYXJlKCkgZXhhbXBsZSwgaW4gY2FzZSBvZiBlcnJvciwgdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAqIGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBmcmVlaW5nIHRoZSBvcmlnaW5hbCBza2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fdmxhbl9wdXRfdGFnKHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RjaSkKK3sKKwlza2IgPSB2bGFuX2luc2VydF90YWcoc2tiLCB2bGFuX3RjaSk7CisJaWYgKHNrYikKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAlyZXR1cm4gc2tiOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmggYi9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmgKaW5kZXggNjQ5ZGM3Zi4uNWQyNTNjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC9zaF9rZXlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvc2hfa2V5c2MuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19TSF9LRVlTQ19IX18KICNkZWZpbmUgX19TSF9LRVlTQ19IX18KIAotI2RlZmluZSBTSF9LRVlTQ19NQVhLRVlTIDQ5CisjZGVmaW5lIFNIX0tFWVNDX01BWEtFWVMgNjQKIAogc3RydWN0IHNoX2tleXNjX2luZm8gewogCWVudW0geyBTSF9LRVlTQ19NT0RFXzEsIFNIX0tFWVNDX01PREVfMiwgU0hfS0VZU0NfTU9ERV8zLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNmMxMjk4OS4uZjZlZmVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC00MTQsNiArNDE0LDcgQEAKIAlUQVNLTEVUX1NPRlRJUlEsCiAJU0NIRURfU09GVElSUSwKIAlIUlRJTUVSX1NPRlRJUlEsCisJUkNVX1NPRlRJUlEsICAgIC8qIFByZWZlcmFibGUgUkNVIHNob3VsZCBhbHdheXMgYmUgdGhlIGxhc3Qgc29mdGlycSAqLwogCiAJTlJfU09GVElSUVMKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA4YjQ1Mzg0Li5iYWEzOTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTY3Niw3ICs2NzYsOCBAQAogdm9pZCBpcnFfZ2NfbWFza19zZXRfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7CiB2b2lkIGlycV9nY19tYXNrX2Nscl9iaXQoc3RydWN0IGlycV9kYXRhICpkKTsKIHZvaWQgaXJxX2djX3VubWFza19lbmFibGVfcmVnKHN0cnVjdCBpcnFfZGF0YSAqZCk7Ci12b2lkIGlycV9nY19hY2soc3RydWN0IGlycV9kYXRhICpkKTsKK3ZvaWQgaXJxX2djX2Fja19zZXRfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7Cit2b2lkIGlycV9nY19hY2tfY2xyX2JpdChzdHJ1Y3QgaXJxX2RhdGEgKmQpOwogdm9pZCBpcnFfZ2NfbWFza19kaXNhYmxlX3JlZ19hbmRfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCk7CiB2b2lkIGlycV9nY19lb2koc3RydWN0IGlycV9kYXRhICpkKTsKIGludCBpcnFfZ2Nfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFyZXR1cm4uaCBiL2luY2x1ZGUvbGludXgvaXJxcmV0dXJuLmgKaW5kZXggODE5YWNhYS4uNzE0YmEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFyZXR1cm4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycXJldHVybi5oCkBAIC04LDkgKzgsOSBAQAogICogQElSUV9XQUtFX1RIUkVBRAloYW5kbGVyIHJlcXVlc3RzIHRvIHdha2UgdGhlIGhhbmRsZXIgdGhyZWFkCiAgKi8KIGVudW0gaXJxcmV0dXJuIHsKLQlJUlFfTk9ORSwKLQlJUlFfSEFORExFRCwKLQlJUlFfV0FLRV9USFJFQUQsCisJSVJRX05PTkUJCT0gKDAgPDwgMCksCisJSVJRX0hBTkRMRUQJCT0gKDEgPDwgMCksCisJSVJRX1dBS0VfVEhSRUFECQk9ICgxIDw8IDEpLAogfTsKIAogdHlwZWRlZiBlbnVtIGlycXJldHVybiBpcnFyZXR1cm5fdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggNGVjYjdiMS4uZDA4N2MyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTEwMjQsNyArMTAyNCw2IEBACiAKIC8qIEZpbGluZyBidWZmZXJzICovCiBleHRlcm4gdm9pZCBqYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqb3VybmFsX3QgKiwgc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKLWV4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIGV4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIGV4dGVybiB2b2lkIGpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICopOwogZXh0ZXJuIHZvaWQgX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqLCB0cmFuc2FjdGlvbl90ICosIGludCk7CkBAIC0xMTY1LDcgKzExNjQsNiBAQAogICovCiBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLXZvaWQgamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiB2b2lkIGpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGZiMGU3MzIuLjk1MzM1MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNjcxLDggKzY3MSw4IEBACiAKICNpZmRlZiBfX0NIRUNLRVJfXwogI2RlZmluZSBCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIobikKLSNkZWZpbmUgQlVJTERfQlVHX09OX1pFUk8oZSkKLSNkZWZpbmUgQlVJTERfQlVHX09OX05VTEwoZSkKKyNkZWZpbmUgQlVJTERfQlVHX09OX1pFUk8oZSkgKDApCisjZGVmaW5lIEJVSUxEX0JVR19PTl9OVUxMKGUpICgodm9pZCopMCkKICNkZWZpbmUgQlVJTERfQlVHX09OKGNvbmRpdGlvbikKICNlbHNlIC8qIF9fQ0hFQ0tFUl9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva21vZC5oIGIvaW5jbHVkZS9saW51eC9rbW9kLmgKaW5kZXggZDRhNWM4NC4uMGRhMzhjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbW9kLmgKKysrIGIvaW5jbHVkZS9saW51eC9rbW9kLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNlbmRpZgogCiAKLXN0cnVjdCBrZXk7CitzdHJ1Y3QgY3JlZDsKIHN0cnVjdCBmaWxlOwogCiBlbnVtIHVtaF93YWl0IHsKQEAgLTYyLDcgKzYyLDcgQEAKIAljaGFyICoqZW52cDsKIAllbnVtIHVtaF93YWl0IHdhaXQ7CiAJaW50IHJldHZhbDsKLQlpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKTsKKwlpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqbmV3KTsKIAl2b2lkICgqY2xlYW51cCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbyk7CiAJdm9pZCAqZGF0YTsKIH07CkBAIC03Myw3ICs3Myw3IEBACiAKIC8qIFNldCB2YXJpb3VzIHBpZWNlcyBvZiBzdGF0ZSBpbnRvIHRoZSBzdWJwcm9jZXNzX2luZm8gc3RydWN0dXJlICovCiB2b2lkIGNhbGxfdXNlcm1vZGVoZWxwZXJfc2V0Zm5zKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sCi0JCSAgICBpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKSwKKwkJICAgIGludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpLAogCQkgICAgdm9pZCAoKmNsZWFudXApKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pLAogCQkgICAgdm9pZCAqZGF0YSk7CiAKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjYWxsX3VzZXJtb2RlaGVscGVyX2ZucyhjaGFyICpwYXRoLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnAsCiAJCQllbnVtIHVtaF93YWl0IHdhaXQsCi0JCQlpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKSwKKwkJCWludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpLAogCQkJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKiksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva21zZ19kdW1wLmggYi9pbmNsdWRlL2xpbnV4L2ttc2dfZHVtcC5oCmluZGV4IDJhMGQ3ZDYuLmVlMGM5NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva21zZ19kdW1wLmgKKysrIGIvaW5jbHVkZS9saW51eC9rbXNnX2R1bXAuaApAQCAtMTIsNiArMTIsNyBAQAogI2lmbmRlZiBfTElOVVhfS01TR19EVU1QX0gKICNkZWZpbmUgX0xJTlVYX0tNU0dfRFVNUF9ICiAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogZW51bSBrbXNnX2R1bXBfcmVhc29uIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva29iamVjdF9ucy5oIGIvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmgKaW5kZXggODJjYjViZi4uZjY2YjA2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmgKKysrIGIvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmgKQEAgLTMyLDE1ICszMiwxNyBAQAogCiAvKgogICogQ2FsbGJhY2tzIHNvIHN5c2ZzIGNhbiBkZXRlcm1pbmUgbmFtZXNwYWNlcwotICogICBAY3VycmVudF9uczogcmV0dXJuIGNhbGxpbmcgdGFzaydzIG5hbWVzcGFjZQorICogICBAZ3JhYl9jdXJyZW50X25zOiByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIGNhbGxpbmcgdGFzaydzIG5hbWVzcGFjZQogICogICBAbmV0bGlua19uczogcmV0dXJuIG5hbWVzcGFjZSB0byB3aGljaCBhIHNvY2sgYmVsb25ncyAocmlnaHQ/KQogICogICBAaW5pdGlhbF9uczogcmV0dXJuIHRoZSBpbml0aWFsIG5hbWVzcGFjZSAoaS5lLiBpbml0X25ldF9ucykKKyAqICAgQGRyb3BfbnM6IGRyb3BzIGEgcmVmZXJlbmNlIHRvIG5hbWVzcGFjZQogICovCiBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgewogCWVudW0ga29ial9uc190eXBlIHR5cGU7Ci0JY29uc3Qgdm9pZCAqKCpjdXJyZW50X25zKSh2b2lkKTsKKwl2b2lkICooKmdyYWJfY3VycmVudF9ucykodm9pZCk7CiAJY29uc3Qgdm9pZCAqKCpuZXRsaW5rX25zKShzdHJ1Y3Qgc29jayAqc2spOwogCWNvbnN0IHZvaWQgKigqaW5pdGlhbF9ucykodm9pZCk7CisJdm9pZCAoKmRyb3BfbnMpKHZvaWQgKik7CiB9OwogCiBpbnQga29ial9uc190eXBlX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqb3BzKTsKQEAgLTQ4LDkgKzUwLDkgQEAKIGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqa29ial9jaGlsZF9uc19vcHMoc3RydWN0IGtvYmplY3QgKnBhcmVudCk7CiBjb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKmtvYmpfbnNfb3BzKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKIAotY29uc3Qgdm9pZCAqa29ial9uc19jdXJyZW50KGVudW0ga29ial9uc190eXBlIHR5cGUpOwordm9pZCAqa29ial9uc19ncmFiX2N1cnJlbnQoZW51bSBrb2JqX25zX3R5cGUgdHlwZSk7CiBjb25zdCB2b2lkICprb2JqX25zX25ldGxpbmsoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgc3RydWN0IHNvY2sgKnNrKTsKIGNvbnN0IHZvaWQgKmtvYmpfbnNfaW5pdGlhbChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKTsKLXZvaWQga29ial9uc19leGl0KGVudW0ga29ial9uc190eXBlIHR5cGUsIGNvbnN0IHZvaWQgKm5zKTsKK3ZvaWQga29ial9uc19kcm9wKGVudW0ga29ial9uc190eXBlIHR5cGUsIHZvaWQgKm5zKTsKIAogI2VuZGlmIC8qIF9MSU5VWF9LT0JKRUNUX05TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKaW5kZXggOTcyNGEzOC4uNTA5NDBkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKQEAgLTg0LDYgKzg0LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICp0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogCiBzdGF0aWMgaW5saW5lCiBpbnQgbW1fbWF0Y2hfY2dyb3VwKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqY2dyb3VwKQpAQCAtMjQ2LDYgKzI0NywxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1fY2dyb3VwICp0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgbW1fbWF0Y2hfY2dyb3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQogewogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKaW5kZXggZTFlM2IyYi4uOTM1Njk5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCisjZGVmaW5lIE1JTl9NRU1PUllfQkxPQ0tfU0laRSAgICAgKDEgPDwgU0VDVElPTl9TSVpFX0JJVFMpCisKIHN0cnVjdCBtZW1vcnlfYmxvY2sgewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfc2VjdGlvbl9ucjsKIAl1bnNpZ25lZCBsb25nIGVuZF9zZWN0aW9uX25yOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvZHMxd20uaCBiL2luY2x1ZGUvbGludXgvbWZkL2RzMXdtLmgKaW5kZXggYmU0NjlhMy4uMzhhMzcyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZHMxd20uaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kczF3bS5oCkBAIC0zLDQgKzMsMTEgQEAKIHN0cnVjdCBkczF3bV9kcml2ZXJfZGF0YSB7CiAJaW50IGFjdGl2ZV9oaWdoOwogCWludCBjbG9ja19yYXRlOworCS8qIGluIG1pbGxpc2Vjb25kcywgdGhlIGFtb3VudCBvZiB0aW1lIHRvICovCisJLyogc2xlZXAgZm9sbG93aW5nIGEgcmVzZXQgcHVsc2UuIFplcm8gICAgKi8KKwkvKiBzaG91bGQgd29yayBpZiB5b3VyIGJ1cyBkZXZpY2VzIHJlY292ZXIqLworCS8qIHRpbWUgcmVzcGVjdHMgdGhlIDEtd2lyZSBzcGVjIHNpbmNlIHRoZSovCisJLyogZHMxd20gaW1wbGVtZW50cyB0aGUgcHJlY2lzZSB0aW1pbmdzIG9mKi8KKwkvKiBhIHJlc2V0IHB1bHNlL3ByZXNlbmNlIGRldGVjdCBzZXF1ZW5jZS4qLworCXVuc2lnbmVkIGludCByZXNldF9yZWNvdmVyX2RlbGF5OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCBjNjkyN2E0Li42YWQ0MzU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC02NCw2ICs2NCwxOSBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZwllbmhhbmNlZF9hcmVhX29mZnNldDsJLyogVW5pdHM6IEJ5dGUgKi8KIAl1bnNpZ25lZCBpbnQJCWVuaGFuY2VkX2FyZWFfc2l6ZTsJLyogVW5pdHM6IEtCICovCiAJdW5zaWduZWQgaW50CQlib290X3NpemU7CQkvKiBpbiBieXRlcyAqLworCXU4CQkJcmF3X3BhcnRpdGlvbl9zdXBwb3J0OwkvKiAxNjAgKi8KKwl1OAkJCXJhd19lcmFzZWRfbWVtX2NvdW50OwkvKiAxODEgKi8KKwl1OAkJCXJhd19leHRfY3NkX3N0cnVjdHVyZTsJLyogMTk0ICovCisJdTgJCQlyYXdfY2FyZF90eXBlOwkJLyogMTk2ICovCisJdTgJCQlyYXdfc19hX3RpbWVvdXQ7CQkvKiAyMTcgKi8KKwl1OAkJCXJhd19oY19lcmFzZV9nYXBfc2l6ZTsJLyogMjIxICovCisJdTgJCQlyYXdfZXJhc2VfdGltZW91dF9tdWx0OwkvKiAyMjMgKi8KKwl1OAkJCXJhd19oY19lcmFzZV9ncnBfc2l6ZTsJLyogMjI0ICovCisJdTgJCQlyYXdfc2VjX3RyaW1fbXVsdDsJLyogMjI5ICovCisJdTgJCQlyYXdfc2VjX2VyYXNlX211bHQ7CS8qIDIzMCAqLworCXU4CQkJcmF3X3NlY19mZWF0dXJlX3N1cHBvcnQ7LyogMjMxICovCisJdTgJCQlyYXdfdHJpbV9tdWx0OwkJLyogMjMyICovCisJdTgJCQlyYXdfc2VjdG9yc1s0XTsJCS8qIDIxMiAtIDQgYnl0ZXMgKi8KIH07CiAKIHN0cnVjdCBzZF9zY3IgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggYzkyOGRhYy4uOWY3YzNlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC02NDcsNiArNjQ3LDEzIEBACiAjZW5kaWYKICNkZWZpbmUgbmlkX3BhZ2VfbnIobmlkLCBwYWdlbnIpIAlwZ2RhdF9wYWdlX25yKE5PREVfREFUQShuaWQpLChwYWdlbnIpKQogCisjZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKKworI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKSAoe1wKKwlwZ19kYXRhX3QgKl9fcGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcCisJX19wZ2RhdC0+bm9kZV9zdGFydF9wZm4gKyBfX3BnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXM7XAorfSkKKwogI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggem9uZWxpc3RzX211dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCmluZGV4IGQ0MGJmYTEuLmU1ZjIxZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9waHlzbWFwLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCiBzdHJ1Y3QgbWFwX2luZm87CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogCiBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHsKIAl1bnNpZ25lZCBpbnQJCXdpZHRoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggY2EzMzNlNy4uOWUxOTQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0xMDk3LDEyICsxMDk3LDYgQEAKICNkZWZpbmUgTkVUSUZfRl9BTExfRkNPRQkoTkVUSUZfRl9GQ09FX0NSQyB8IE5FVElGX0ZfRkNPRV9NVFUgfCBcCiAJCQkJIE5FVElGX0ZfRlNPKQogCi0jZGVmaW5lIE5FVElGX0ZfQUxMX1RYX09GRkxPQURTCShORVRJRl9GX0FMTF9DU1VNIHwgTkVUSUZfRl9TRyB8IFwKLQkJCQkgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfQUxMX1RTTyB8IFwKLQkJCQkgTkVUSUZfRl9ISUdIRE1BIHwgXAotCQkJCSBORVRJRl9GX1NDVFBfQ1NVTSB8IFwKLQkJCQkgTkVUSUZfRl9BTExfRkNPRSkKLQogCS8qCiAJICogSWYgb25lIGRldmljZSBzdXBwb3J0cyBvbmUgb2YgdGhlc2UgZmVhdHVyZXMsIHRoZW4gZW5hYmxlIHRoZW0KIAkgKiBmb3IgYWxsIGluIG5ldGRldl9pbmNyZW1lbnRfZmVhdHVyZXMuCkBAIC0yNTU1LDcgKzI1NDksNyBAQAogCiBleHRlcm4gc3RydWN0IGtvYmpfbnNfdHlwZV9vcGVyYXRpb25zIG5ldF9uc190eXBlX29wZXJhdGlvbnM7CiAKLWV4dGVybiBjaGFyICpuZXRkZXZfZHJpdmVybmFtZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pOworZXh0ZXJuIGNvbnN0IGNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBleHRlcm4gdm9pZCBsaW5rd2F0Y2hfcnVuX3F1ZXVlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKaW5kZXggNTBjZGMyNS4uMGQzZGQ2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApAQCAtMTgsNiArMTgsOSBAQAogCS8qID49IHRoaXMgaW5kaWNhdGVzIHJlcGx5IGRpcmVjdGlvbiAqLwogCUlQX0NUX0lTX1JFUExZLAogCisJSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkgPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZLAorCUlQX0NUX1JFTEFURURfUkVQTFkgPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFksCisJSVBfQ1RfTkVXX1JFUExZID0gSVBfQ1RfTkVXICsgSVBfQ1RfSVNfUkVQTFksCQogCS8qIE51bWJlciBvZiBkaXN0aW5jdCBJUF9DVCB0eXBlcyAobm8gTkVXIGluIHJlcGx5IGRpcm4pLiAqLwogCUlQX0NUX05VTUJFUiA9IElQX0NUX0lTX1JFUExZICogMiAtIDEKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmggYi9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgKaW5kZXggM2EzNGU4MC4uMjUzMTFiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaApAQCAtOTIsNiArOTIsOSBAQAogCQkJCSAgIHN0cnVjdCBuZnNfcGFnZSAqKTsKIGV4dGVybgl2b2lkIG5mc19wYWdlaW9fY29tcGxldGUoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqZGVzYyk7CiBleHRlcm4Jdm9pZCBuZnNfcGFnZWlvX2NvbmRfY29tcGxldGUoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqLCBwZ29mZl90KTsKK2V4dGVybiBib29sIG5mc19nZW5lcmljX3BnX3Rlc3Qoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqZGVzYywKKwkJCQlzdHJ1Y3QgbmZzX3BhZ2UgKnByZXYsCisJCQkJc3RydWN0IG5mc19wYWdlICpyZXEpOwogZXh0ZXJuICBpbnQgbmZzX3dhaXRfb25fcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKik7CiBleHRlcm4Jdm9pZCBuZnNfdW5sb2NrX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpOwogZXh0ZXJuCWludCBuZnNfc2V0X3BhZ2VfdGFnX2xvY2tlZChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaCBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCmluZGV4IDVlODQ0NGEuLjAwODQ4ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCkBAIC0xNTgsNyArMTU4LDYgQEAKIAogLyogbmZzNDEgc2Vzc2lvbnMgY2hhbm5lbCBhdHRyaWJ1dGVzICovCiBzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzIHsKLQl1MzIJCQloZWFkZXJwYWRzejsKIAl1MzIJCQltYXhfcnFzdF9zejsKIAl1MzIJCQltYXhfcmVzcF9zejsKIAl1MzIJCQltYXhfcmVzcF9zel9jYWNoZWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGEzMTEwMDguLmY4OTEwZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0xNTM3LDYgKzE1MzcsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NzYJMHgwNDc2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3OAkweDA0NzgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MjIJMHgwODIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDRTgyMwkweGU4MjMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MzIJMHgwODMyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODQzCTB4MDg0MwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaAppbmRleCA4Yjk3MzA4Li45Y2EwMDhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKQEAgLTI1OSw2ICsyNTksOSBAQAogICogU3BlY2lhbCBoYW5kbGluZyBmb3IgY21weGNoZ19kb3VibGUuICBjbXB4Y2hnX2RvdWJsZSBpcyBwYXNzZWQgdHdvCiAgKiBwZXJjcHUgdmFyaWFibGVzLiAgVGhlIGZpcnN0IGhhcyB0byBiZSBhbGlnbmVkIHRvIGEgZG91YmxlIHdvcmQKICAqIGJvdW5kYXJ5IGFuZCB0aGUgc2Vjb25kIGhhcyB0byBmb2xsb3cgZGlyZWN0bHkgdGhlcmVhZnRlci4KKyAqIFdlIGVuZm9yY2UgdGhpcyBvbiBhbGwgYXJjaGl0ZWN0dXJlcyBldmVuIGlmIHRoZXkgZG9uJ3Qgc3VwcG9ydAorICogYSBkb3VibGUgY21weGNoZyBpbnN0cnVjdGlvbiwgc2luY2UgaXQncyBhIGNoZWFwIHJlcXVpcmVtZW50LCBhbmQgaXQKKyAqIGF2b2lkcyBicmVha2luZyB0aGUgcmVxdWlyZW1lbnQgZm9yIGFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24uCiAgKi8KICNkZWZpbmUgX19wY3B1X2RvdWJsZV9jYWxsX3JldHVybl9ib29sKHN0ZW0sIHBjcDEsIHBjcDIsIC4uLikJCVwKICh7CQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCAzNDEyNjg0Li5lMDc4NmUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtMTM3LDE0ICsxMzcsMTQgQEAKICAqCiAgKiBzdHJ1Y3QgcmVhZF9mb3JtYXQgewogICoJeyB1NjQJCXZhbHVlOwotICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX0VOQUJMRUQKLSAqCSAgeyB1NjQJCXRpbWVfcnVubmluZzsgfSAmJiBQRVJGX0ZPUk1BVF9SVU5OSU5HCisgKgkgIHsgdTY0CQl0aW1lX2VuYWJsZWQ7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECisgKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCiAgKgkgIHsgdTY0CQlpZDsgICAgICAgICAgIH0gJiYgUEVSRl9GT1JNQVRfSUQKICAqCX0gJiYgIVBFUkZfRk9STUFUX0dST1VQCiAgKgogICoJeyB1NjQJCW5yOwotICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX0VOQUJMRUQKLSAqCSAgeyB1NjQJCXRpbWVfcnVubmluZzsgfSAmJiBQRVJGX0ZPUk1BVF9SVU5OSU5HCisgKgkgIHsgdTY0CQl0aW1lX2VuYWJsZWQ7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECisgKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCiAgKgkgIHsgdTY0CQl2YWx1ZTsKICAqCSAgICB7IHU2NAlpZDsgICAgICAgICAgIH0gJiYgUEVSRl9GT1JNQVRfSUQKICAqCSAgfQkJY250cltucl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggMzE2MDY0OC4uNDExZTRmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDI1LDcgKzQyNSw4IEBACiAJcG1fbWVzc2FnZV90CQlwb3dlcl9zdGF0ZTsKIAl1bnNpZ25lZCBpbnQJCWNhbl93YWtldXA6MTsKIAl1bnNpZ25lZCBpbnQJCWFzeW5jX3N1c3BlbmQ6MTsKLQl1bnNpZ25lZCBpbnQJCWluX3N1c3BlbmQ6MTsJLyogT3duZWQgYnkgdGhlIFBNIGNvcmUgKi8KKwlib29sCQkJaXNfcHJlcGFyZWQ6MTsJLyogT3duZWQgYnkgdGhlIFBNIGNvcmUgKi8KKwlib29sCQkJaXNfc3VzcGVuZGVkOjE7CS8qIERpdHRvICovCiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDJhODYyMWMuLjQ5Njc3MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTgwOCw3ICs4MDgsNyBAQAogICogd2hlbiBCSVRTX1BFUl9MT05HIDw9IDMyIGFyZSBwcmV0dHkgaGlnaCBhbmQgdGhlIHJldHVybnMgZG8gbm90IGp1c3RpZnkgdGhlCiAgKiBpbmNyZWFzZWQgY29zdHMuCiAgKi8KLSNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyNpZiAwIC8qIEJJVFNfUEVSX0xPTkcgPiAzMiAtLSBjdXJyZW50bHkgYnJva2VuOiBpdCBpbmNyZWFzZXMgcG93ZXIgdXNhZ2UgdW5kZXIgbGlnaHQgbG9hZCAgKi8KICMgZGVmaW5lIFNDSEVEX0xPQURfUkVTT0xVVElPTgkxMAogIyBkZWZpbmUgc2NhbGVfbG9hZCh3KQkJKCh3KSA8PCBTQ0hFRF9MT0FEX1JFU09MVVRJT04pCiAjIGRlZmluZSBzY2FsZV9sb2FkX2Rvd24odykJKCh3KSA+PiBTQ0hFRF9MT0FEX1JFU09MVVRJT04pCkBAIC0xMDYzLDYgKzEwNjMsNyBAQAogICovCiAjZGVmaW5lIFdGX1NZTkMJCTB4MDEJCS8qIHdha2VyIGdvZXMgdG8gc2xlZXAgYWZ0ZXIgd2FrdXAgKi8KICNkZWZpbmUgV0ZfRk9SSwkJMHgwMgkJLyogY2hpbGQgd2FrZXVwIGFmdGVyIGZvcmsgKi8KKyNkZWZpbmUgV0ZfTUlHUkFURUQJMHgwNAkJLyogaW50ZXJuYWwgdXNlLCB0YXNrIGdvdCBtaWdyYXRlZCAqLwogCiAjZGVmaW5lIEVOUVVFVUVfV0FLRVVQCQkxCiAjZGVmaW5lIEVOUVVFVUVfSEVBRAkJMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAppbmRleCBlOTgxMTg5Li5jNmRiOWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaApAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgc2VxdWVuY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKaW5kZXggMmI3ZmVjOC4uYWEwOGZhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KIAogLyogaW5vZGUgaW4ta2VybmVsIGRhdGEgKi8KQEAgLTQ1LDcgKzQ2LDI3IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHNobWVtX2lub2RlX2luZm8sIHZmc19pbm9kZSk7CiB9CiAKKy8qCisgKiBGdW5jdGlvbnMgaW4gbW0vc2htZW0uYyBjYWxsZWQgZGlyZWN0bHkgZnJvbSBlbHNld2hlcmU6CisgKi8KIGV4dGVybiBpbnQgaW5pdF90bXBmcyh2b2lkKTsKIGV4dGVybiBpbnQgc2htZW1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KTsKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqc2htZW1fZmlsZV9zZXR1cChjb25zdCBjaGFyICpuYW1lLAorCQkJCQlsb2ZmX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IHNobWVtX3plcm9fc2V0dXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworZXh0ZXJuIGludCBzaG1lbV9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbG9jaywgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyKTsKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2VfZ2ZwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCQlwZ29mZl90IGluZGV4LCBnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gdm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpOworZXh0ZXJuIGludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgcGdvZmYsCisJCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHN3cF9lbnRyeV90ICplbnQpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9yZWFkX21hcHBpbmdfcGFnZSgKKwkJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBpbmRleCkKK3sKKwlyZXR1cm4gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2VfZ2ZwKG1hcHBpbmcsIGluZGV4LAorCQkJCQltYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKK30KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCBlOGI3OGNlLi5jMGE0ZjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTEyNTYsNiArMTI1NiwxMSBAQAogCXNrYi0+dGFpbCArPSBsZW47CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfbWFjX2xlbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bWFjX2xlbiA9IHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXI7Cit9CisKICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX3RyYW5zcG9ydF9oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wLmggYi9pbmNsdWRlL2xpbnV4L3NtcC5oCmluZGV4IDdhZDgyNGQuLjhjYzM4ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXAuaApAQCAtODUsMTIgKzg1LDE1IEBACiAgKiBHZW5lcmljIGFuZCBhcmNoIGhlbHBlcnMKICAqLwogI2lmZGVmIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUwordm9pZCBfX2luaXQgY2FsbF9mdW5jdGlvbl9pbml0KHZvaWQpOwogdm9pZCBnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQodm9pZCk7CiB2b2lkIGdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KHZvaWQpOwogdm9pZCBpcGlfY2FsbF9sb2NrKHZvaWQpOwogdm9pZCBpcGlfY2FsbF91bmxvY2sodm9pZCk7CiB2b2lkIGlwaV9jYWxsX2xvY2tfaXJxKHZvaWQpOwogdm9pZCBpcGlfY2FsbF91bmxvY2tfaXJxKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxsX2Z1bmN0aW9uX2luaXQodm9pZCkgeyB9CiAjZW5kaWYKIAogLyoKQEAgLTEzNCw3ICsxMzcsNyBAQAogI2RlZmluZSBzbXBfcHJlcGFyZV9ib290X2NwdSgpCQkJZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIHNtcF9jYWxsX2Z1bmN0aW9uX21hbnkobWFzaywgZnVuYywgaW5mbywgd2FpdCkgXAogCQkJKHVwX3NtcF9jYWxsX2Z1bmN0aW9uKGZ1bmMsIGluZm8pKQotc3RhdGljIGlubGluZSB2b2lkIGluaXRfY2FsbF9zaW5nbGVfZGF0YSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxsX2Z1bmN0aW9uX2luaXQodm9pZCkgeyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBzbXBfY2FsbF9mdW5jdGlvbl9hbnkoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHNtcF9jYWxsX2Z1bmNfdCBmdW5jLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19rcmI1X2VuY3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2MjM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19rcmI1X2VuY3R5cGVzLmgKQEAgLTAsMCArMSw0IEBACisvKgorICogRHVtYiB3YXkgdG8gc2hhcmUgdGhpcyBzdGF0aWMgcGllY2Ugb2YgaW5mb3JtYXRpb24gd2l0aCBuZnNkCisgKi8KKyNkZWZpbmUgS1JCNV9TVVBQT1JURURfRU5DVFlQRVMgIjE4LDE3LDE2LDIzLDMsMSwyIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgKaW5kZXggZjczYzQ4Mi4uZmUyZDhlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oCkBAIC04NCw3ICs4NCw4IEBACiAjZW5kaWYKIAl1bnNpZ25lZCBjaGFyCQl0a19wcmlvcml0eSA6IDIsLyogVGFzayBwcmlvcml0eSAqLwogCQkJCXRrX2dhcmJfcmV0cnkgOiAyLAotCQkJCXRrX2NyZWRfcmV0cnkgOiAyOworCQkJCXRrX2NyZWRfcmV0cnkgOiAyLAorCQkJCXRrX3JlYmluZF9yZXRyeSA6IDI7CiB9OwogI2RlZmluZSB0a194cHJ0CQkJdGtfY2xpZW50LT5jbF94cHJ0CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggMzg0ZWI1Zi4uYTI3MzQ2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTMwMCwxNiArMzAwLDYgQEAKIGV4dGVybiBpbnQga3N3YXBkX3J1bihpbnQgbmlkKTsKIGV4dGVybiB2b2lkIGtzd2FwZF9zdG9wKGludCBuaWQpOwogCi0jaWZkZWYgQ09ORklHX01NVQotLyogbGludXgvbW0vc2htZW0uYyAqLwotZXh0ZXJuIGludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwotI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KLQotI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCi1leHRlcm4gdm9pZCBtZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBwZ29mZiwKLQkJCQkJc3RydWN0IHBhZ2UgKipwYWdlcCwgc3dwX2VudHJ5X3QgKmVudCk7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19TV0FQCiAvKiBsaW51eC9tbS9wYWdlX2lvLmMgKi8KIGV4dGVybiBpbnQgc3dhcF9yZWFkcGFnZShzdHJ1Y3QgcGFnZSAqKTsKQEAgLTM1OCw2ICszNDgsNyBAQAogZXh0ZXJuIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW07CiBleHRlcm4gdm9pZCBncmFiX3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIF9fcHV0X3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIGRpc2FibGVfc3dhcF90b2tlbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogCiBzdGF0aWMgaW5saW5lIGludCBoYXNfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKQEAgLTM3MCwxMSArMzYxLDYgQEAKIAkJX19wdXRfc3dhcF90b2tlbihtbSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX3N3YXBfdG9rZW4odm9pZCkKLXsKLQlwdXRfc3dhcF90b2tlbihzd2FwX3Rva2VuX21tKTsKLX0KLQogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCiBleHRlcm4gdm9pZAogbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN3cF9lbnRyeV90IGVudCwgYm9vbCBzd2Fwb3V0KTsKQEAgLTUwMCw3ICs0ODYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9zd2FwX3Rva2VuKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9zd2FwX3Rva2VuKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmggYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAppbmRleCA4YzBlMzQ5Li40NDU3MDJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaApAQCAtMjQsNiArMjQsNyBAQAogCiBleHRlcm4gdm9pZCBzd2lvdGxiX2luaXQoaW50IHZlcmJvc2UpOwogZXh0ZXJuIHZvaWQgc3dpb3RsYl9pbml0X3dpdGhfdGJsKGNoYXIgKnRsYiwgdW5zaWduZWQgbG9uZyBuc2xhYnMsIGludCB2ZXJib3NlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN3aW9sdGJfbnJfdGJsKHZvaWQpOwogCiAvKgogICogRW51bWVyYXRpb24gZm9yIHN5bmMgdGFyZ2V0cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNmcy5oIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCmluZGV4IGMzYWNkYTYuLmUyNjk2ZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKQEAgLTE3Nyw5ICsxNzcsNiBAQAogc3RydWN0IHN5c2ZzX2RpcmVudCAqc3lzZnNfZ2V0KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKIHZvaWQgc3lzZnNfcHV0KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKIAotLyogQ2FsbGVkIHRvIGNsZWFyIGEgbnMgdGFnIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCi12b2lkIHN5c2ZzX2V4aXRfbnMoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgY29uc3Qgdm9pZCAqdGFnKTsKLQogaW50IF9fbXVzdF9jaGVjayBzeXNmc19pbml0KHZvaWQpOwogCiAjZWxzZSAvKiBDT05GSUdfU1lTRlMgKi8KQEAgLTMzOCwxMCArMzM1LDYgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX2V4aXRfbnMoaW50IHR5cGUsIGNvbnN0IHZvaWQgKnRhZykKLXsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAppbmRleCBiOTFhNDBlLi5mYzgzOWJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCkBAIC02MCw3ICs2MCw3IEBACiAgKiAoaW4gd2hhdGV2ZXIgYXJjaCBzcGVjaWZpYyBtZWFzdXJlbWVudCB1bml0cyByZXR1cm5lZCBieSBub2RlX2Rpc3RhbmNlKCkpCiAgKiB0aGVuIHN3aXRjaCBvbiB6b25lIHJlY2xhaW0gb24gYm9vdC4KICAqLwotI2RlZmluZSBSRUNMQUlNX0RJU1RBTkNFIDIwCisjZGVmaW5lIFJFQ0xBSU1fRElTVEFOQ0UgMzAKICNlbmRpZgogI2lmbmRlZiBQRU5BTFRZX0ZPUl9OT0RFX1dJVEhfQ1BVUwogI2RlZmluZSBQRU5BTFRZX0ZPUl9OT0RFX1dJVEhfQ1BVUwkoMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmggYi9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCmluZGV4IDViMDc3OTIuLmZmN2RjMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKKysrIGIvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaApAQCAtNzYsNyArNzYsNyBAQAogICogCXR0eSBkZXZpY2UuICBJdCBpcyBzb2xlbHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBsaW5lCiAgKiAJZGlzY2lwbGluZSB0byBoYW5kbGUgcG9sbCByZXF1ZXN0cy4KICAqCi0gKiB1bnNpZ25lZCBpbnQgKCpyZWNlaXZlX2J1Zikoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisgKiB2b2lkCSgqcmVjZWl2ZV9idWYpKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAogICogCQkgICAgICAgY2hhciAqZnAsIGludCBjb3VudCk7CiAgKgogICogCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBsb3ctbGV2ZWwgdHR5IGRyaXZlciB0byBzZW5kCkBAIC04NCw4ICs4NCw3IEBACiAgKiAJcHJvY2Vzc2luZy4gIDxjcD4gaXMgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgaW5wdXQKICAqIAljaGFyYWN0ZXIgcmVjZWl2ZWQgYnkgdGhlIGRldmljZS4gIDxmcD4gaXMgYSBwb2ludGVyIHRvIGEKICAqIAlwb2ludGVyIG9mIGZsYWcgYnl0ZXMgd2hpY2ggaW5kaWNhdGUgd2hldGhlciBhIGNoYXJhY3RlciB3YXMKLSAqIAlyZWNlaXZlZCB3aXRoIGEgcGFyaXR5IGVycm9yLCBldGMuIFJldHVybnMgdGhlIGFtb3VudCBvZiBieXRlcwotICogCXJlY2VpdmVkLgorICogCXJlY2VpdmVkIHdpdGggYSBwYXJpdHkgZXJyb3IsIGV0Yy4KICAqIAogICogdm9pZAkoKndyaXRlX3dha2V1cCkoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiAgKgpAQCAtMTQxLDggKzE0MCw4IEBACiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSBjYWxsZWQgZnJvbSBiZWxvdy4KIAkgKi8KLQl1bnNpZ25lZCBpbnQgKCpyZWNlaXZlX2J1Zikoc3RydWN0IHR0eV9zdHJ1Y3QgKiwKLQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KTsKKwl2b2lkCSgqcmVjZWl2ZV9idWYpKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOwogCXZvaWQJKCp3cml0ZV93YWtldXApKHN0cnVjdCB0dHlfc3RydWN0ICopOwogCXZvaWQJKCpkY2RfY2hhbmdlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBpbnQsCiAJCQkJc3RydWN0IHBwc19ldmVudF90aW1lICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggNzE2OTNkNC4uMTdkZjM2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC02Miw3ICs2Miw5IEBACiAJVVNfRkxBRyhOT19SRUFEX0RJU0NfSU5GTywJMHgwMDA0MDAwMCkJCVwKIAkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0RJU0NfSU5GTyAqLwkJXAogCVVTX0ZMQUcoTk9fUkVBRF9DQVBBQ0lUWV8xNiwJMHgwMDA4MDAwMCkJCVwKLQkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzE2ICovCisJCS8qIGNhbm5vdCBoYW5kbGUgUkVBRF9DQVBBQ0lUWV8xNiAqLwkJXAorCVVTX0ZMQUcoSU5JVElBTF9SRUFEMTAsCTB4MDAxMDAwMDApCQkJXAorCQkvKiBJbml0aWFsIFJFQUQoMTApIChhbmQgb3RoZXJzKSBtdXN0IGJlIHJldHJpZWQgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3V0cy5oIGIvaW5jbHVkZS9saW51eC91dHMuaAppbmRleCA3M2ViMWVkLi42ZGRiZDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXRzLmgKQEAgLTksNyArOSw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBVVFNfTk9ERU5BTUUKLSNkZWZpbmUgVVRTX05PREVOQU1FICIobm9uZSkiCS8qIHNldCBieSBzZXRob3N0bmFtZSgpICovCisjZGVmaW5lIFVUU19OT0RFTkFNRSBDT05GSUdfREVGQVVMVF9IT1NUTkFNRSAvKiBzZXQgYnkgc2V0aG9zdG5hbWUoKSAqLwogI2VuZGlmCiAKICNpZm5kZWYgVVRTX0RPTUFJTk5BTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpby5oCmluZGV4IGFmZjViNGYuLjcxMDg4NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW8uaApAQCAtNTEsNiArNTEsMTMgQEAKICAqCVRoaXMgcmUtZW5hYmxlcyBjYWxsYmFja3M7IGl0IHJldHVybnMgImZhbHNlIiBpZiB0aGVyZSBhcmUgcGVuZGluZwogICoJYnVmZmVycyBpbiB0aGUgcXVldWUsIHRvIGRldGVjdCBhIHBvc3NpYmxlIHJhY2UgYmV0d2VlbiB0aGUgZHJpdmVyCiAgKgljaGVja2luZyBmb3IgbW9yZSB3b3JrLCBhbmQgZW5hYmxpbmcgY2FsbGJhY2tzLgorICogdmlydHF1ZXVlX2VuYWJsZV9jYl9kZWxheWVkOiByZXN0YXJ0IGNhbGxiYWNrcyBhZnRlciBkaXNhYmxlX2NiLgorICoJdnE6IHRoZSBzdHJ1Y3QgdmlydHF1ZXVlIHdlJ3JlIHRhbGtpbmcgYWJvdXQuCisgKglUaGlzIHJlLWVuYWJsZXMgY2FsbGJhY2tzIGJ1dCBoaW50cyB0byB0aGUgb3RoZXIgc2lkZSB0byBkZWxheQorICoJaW50ZXJydXB0cyB1bnRpbCBtb3N0IG9mIHRoZSBhdmFpbGFibGUgYnVmZmVycyBoYXZlIGJlZW4gcHJvY2Vzc2VkOworICoJaXQgcmV0dXJucyAiZmFsc2UiIGlmIHRoZXJlIGFyZSBtYW55IHBlbmRpbmcgYnVmZmVycyBpbiB0aGUgcXVldWUsCisgKgl0byBkZXRlY3QgYSBwb3NzaWJsZSByYWNlIGJldHdlZW4gdGhlIGRyaXZlciBjaGVja2luZyBmb3IgbW9yZSB3b3JrLAorICoJYW5kIGVuYWJsaW5nIGNhbGxiYWNrcy4KICAqIHZpcnRxdWV1ZV9kZXRhY2hfdW51c2VkX2J1ZjogZGV0YWNoIGZpcnN0IHVudXNlZCBidWZmZXIKICAqIAl2cTogdGhlIHN0cnVjdCB2aXJ0cXVldWUgd2UncmUgdGFsa2luZyBhYm91dC4KICAqIAlSZXR1cm5zIE5VTEwgb3IgdGhlICJkYXRhIiB0b2tlbiBoYW5kZWQgdG8gYWRkX2J1ZgpAQCAtODYsNiArOTMsOCBAQAogCiBib29sIHZpcnRxdWV1ZV9lbmFibGVfY2Ioc3RydWN0IHZpcnRxdWV1ZSAqdnEpOwogCitib29sIHZpcnRxdWV1ZV9lbmFibGVfY2JfZGVsYXllZChzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7CisKIHZvaWQgKnZpcnRxdWV1ZV9kZXRhY2hfdW51c2VkX2J1ZihzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmgKaW5kZXggZTY4YjQzOS4uMjc3YzRhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oCkBAIC0xLDcgKzEsMzAgQEAKICNpZm5kZWYgX0xJTlVYX1ZJUlRJT185UF9ICiAjZGVmaW5lIF9MSU5VWF9WSVJUSU9fOVBfSAogLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKLSAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oCmluZGV4IGE1MGVjZDEuLjY1MmRjOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2JhbGxvb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmgKQEAgLTEsNyArMSwzMCBAQAogI2lmbmRlZiBfTElOVVhfVklSVElPX0JBTExPT05fSAogI2RlZmluZSBfTElOVVhfVklSVElPX0JBTExPT05fSAogLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKLSAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fYmxrLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaAppbmRleCAxNjc3MjBkLi5lMGVkYjQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaApAQCAtMSw3ICsxLDMwIEBACiAjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQkxLX0gKICNkZWZpbmUgX0xJTlVYX1ZJUlRJT19CTEtfSAogLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKLSAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaAppbmRleCA4MDA2MTdiLi4zOWM4OGM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaApAQCAtMSw3ICsxLDMwIEBACiAjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQ09ORklHX0gKICNkZWZpbmUgX0xJTlVYX1ZJUlRJT19DT05GSUdfSAogLyogVGhpcyBoZWFkZXIsIGV4Y2x1ZGluZyB0aGUgI2lmZGVmIF9fS0VSTkVMX18gcGFydCwgaXMgQlNEIGxpY2Vuc2VkIHNvCi0gKiBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworICogYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudCBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KIAogLyogVmlydGlvIGRldmljZXMgdXNlIGEgc3RhbmRhcmRpemVkIGNvbmZpZ3VyYXRpb24gc3BhY2UgdG8gZGVmaW5lIHRoZWlyCiAgKiBmZWF0dXJlcyBhbmQgcGFzcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLCBidXQgZWFjaCBpbXBsZW1lbnRhdGlvbiBjYW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbnNvbGUuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbnNvbGUuaAppbmRleCBlNGQzMzM1Li5iZGY0YjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oCkBAIC01LDcgKzUsMzEgQEAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CiAvKgogICogVGhpcyBoZWFkZXIsIGV4Y2x1ZGluZyB0aGUgI2lmZGVmIF9fS0VSTkVMX18gcGFydCwgaXMgQlNEIGxpY2Vuc2VkIHNvCi0gKiBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICogYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudCBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVyczoKKyAqCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCiAgKgogICogQ29weXJpZ2h0IChDKSBSZWQgSGF0LCBJbmMuLCAyMDA5LCAyMDEwLCAyMDExCiAgKiBDb3B5cmlnaHQgKEMpIEFtaXQgU2hhaCA8YW1pdC5zaGFoQHJlZGhhdC5jb20+LCAyMDA5LCAyMDEwLCAyMDExCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19pZHMuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX2lkcy5oCmluZGV4IDA2NjYwYzAuLjg1YmIwYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX2lkcy5oCkBAIC01LDcgKzUsMjkgQEAKICAqCiAgKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAogICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCi0gKi8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KIAogI2RlZmluZSBWSVJUSU9fSURfTkVUCQkxIC8qIHZpcnRpbyBuZXQgKi8KICNkZWZpbmUgVklSVElPX0lEX0JMT0NLCQkyIC8qIHZpcnRpbyBibG9jayAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaAppbmRleCAwODVlNDIyLi4xMzYwNDBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaApAQCAtMSw3ICsxLDMwIEBACiAjaWZuZGVmIF9MSU5VWF9WSVJUSU9fTkVUX0gKICNkZWZpbmUgX0xJTlVYX1ZJUlRJT19ORVRfSAogLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKLSAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fcGNpLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaAppbmRleCA5YTNkN2M0Li5lYTY2ZjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaApAQCAtMTEsNiArMTEsMjkgQEAKICAqCiAgKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAogICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfVklSVElPX1BDSV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmgKaW5kZXggZTRkMTQ0Yi4uNGEzMmNiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaApAQCAtNyw2ICs3LDI5IEBACiAgKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAogICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCiAgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgogICogQ29weXJpZ2h0IFJ1c3R5IFJ1c3NlbGwgSUJNIENvcnBvcmF0aW9uIDIwMDcuICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApAQCAtMjksNiArNTIsMTIgQEAKIC8qIFdlIHN1cHBvcnQgaW5kaXJlY3QgYnVmZmVyIGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIFZJUlRJT19SSU5HX0ZfSU5ESVJFQ1RfREVTQwkyOAogCisvKiBUaGUgR3Vlc3QgcHVibGlzaGVzIHRoZSB1c2VkIGluZGV4IGZvciB3aGljaCBpdCBleHBlY3RzIGFuIGludGVycnVwdAorICogYXQgdGhlIGVuZCBvZiB0aGUgYXZhaWwgcmluZy4gSG9zdCBzaG91bGQgaWdub3JlIHRoZSBhdmFpbC0+ZmxhZ3MgZmllbGQuICovCisvKiBUaGUgSG9zdCBwdWJsaXNoZXMgdGhlIGF2YWlsIGluZGV4IGZvciB3aGljaCBpdCBleHBlY3RzIGEga2ljaworICogYXQgdGhlIGVuZCBvZiB0aGUgdXNlZCByaW5nLiBHdWVzdCBzaG91bGQgaWdub3JlIHRoZSB1c2VkLT5mbGFncyBmaWVsZC4gKi8KKyNkZWZpbmUgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgJCTI5CisKIC8qIFZpcnRpbyByaW5nIGRlc2NyaXB0b3JzOiAxNiBieXRlcy4gIFRoZXNlIGNhbiBjaGFpbiB0b2dldGhlciB2aWEgIm5leHQiLiAqLwogc3RydWN0IHZyaW5nX2Rlc2MgewogCS8qIEFkZHJlc3MgKGd1ZXN0LXBoeXNpY2FsKS4gKi8KQEAgLTgzLDYgKzExMiw3IEBACiAgKglfX3UxNiBhdmFpbF9mbGFnczsKICAqCV9fdTE2IGF2YWlsX2lkeDsKICAqCV9fdTE2IGF2YWlsYWJsZVtudW1dOworICoJX191MTYgdXNlZF9ldmVudF9pZHg7CiAgKgogICoJLy8gUGFkZGluZyB0byB0aGUgbmV4dCBhbGlnbiBib3VuZGFyeS4KICAqCWNoYXIgcGFkW107CkBAIC05MSw4ICsxMjEsMTQgQEAKICAqCV9fdTE2IHVzZWRfZmxhZ3M7CiAgKglfX3UxNiB1c2VkX2lkeDsKICAqCXN0cnVjdCB2cmluZ191c2VkX2VsZW0gdXNlZFtudW1dOworICoJX191MTYgYXZhaWxfZXZlbnRfaWR4OwogICogfTsKICAqLworLyogV2UgcHVibGlzaCB0aGUgdXNlZCBldmVudCBpbmRleCBhdCB0aGUgZW5kIG9mIHRoZSBhdmFpbGFibGUgcmluZywgYW5kIHZpY2UKKyAqIHZlcnNhLiBUaGV5IGFyZSBhdCB0aGUgZW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgdnJpbmdfdXNlZF9ldmVudCh2cikgKCh2ciktPmF2YWlsLT5yaW5nWyh2ciktPm51bV0pCisjZGVmaW5lIHZyaW5nX2F2YWlsX2V2ZW50KHZyKSAoKihfX3UxNiAqKSYodnIpLT51c2VkLT5yaW5nWyh2ciktPm51bV0pCisKIHN0YXRpYyBpbmxpbmUgdm9pZCB2cmluZ19pbml0KHN0cnVjdCB2cmluZyAqdnIsIHVuc2lnbmVkIGludCBudW0sIHZvaWQgKnAsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsaWduKQogewpAQCAtMTA3LDcgKzE0MywyMSBAQAogewogCXJldHVybiAoKHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYykgKiBudW0gKyBzaXplb2YoX191MTYpICogKDIgKyBudW0pCiAJCSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSkpCi0JCSsgc2l6ZW9mKF9fdTE2KSAqIDIgKyBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkgKiBudW07CisJCSsgc2l6ZW9mKF9fdTE2KSAqIDMgKyBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkgKiBudW07Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCB3aXRoIFVTRURfRVZFTlRfSURYIGFuZCBBVkFJTF9FVkVOVF9JRFggKi8KKy8qIEFzc3VtaW5nIGEgZ2l2ZW4gZXZlbnRfaWR4IHZhbHVlIGZyb20gdGhlIG90aGVyIHNpemUsIGlmCisgKiB3ZSBoYXZlIGp1c3QgaW5jcmVtZW50ZWQgaW5kZXggZnJvbSBvbGQgdG8gbmV3X2lkeCwKKyAqIHNob3VsZCB3ZSB0cmlnZ2VyIGFuIGV2ZW50PyAqLworc3RhdGljIGlubGluZSBpbnQgdnJpbmdfbmVlZF9ldmVudChfX3UxNiBldmVudF9pZHgsIF9fdTE2IG5ld19pZHgsIF9fdTE2IG9sZCkKK3sKKwkvKiBOb3RlOiBYZW4gaGFzIHNpbWlsYXIgbG9naWMgZm9yIG5vdGlmaWNhdGlvbiBob2xkLW9mZgorCSAqIGluIGluY2x1ZGUveGVuL2ludGVyZmFjZS9pby9yaW5nLmggd2l0aCByZXFfZXZlbnQgYW5kIHJlcV9wcm9kCisJICogY29ycmVzcG9uZGluZyB0byBldmVudF9pZHggKyAxIGFuZCBuZXdfaWR4IHJlc3BlY3RpdmVseS4KKwkgKiBOb3RlIGFsc28gdGhhdCByZXFfZXZlbnQgYW5kIHJlcV9wcm9kIGluIFhlbiBzdGFydCBhdCAxLAorCSAqIGV2ZW50IGluZGV4ZXMgaW4gdmlydGlvIHN0YXJ0IGF0IDAuICovCisJcmV0dXJuIChfX3UxNikobmV3X2lkeCAtIGV2ZW50X2lkeCAtIDEpIDwgKF9fdTE2KShuZXdfaWR4IC0gb2xkKTsKIH0KIAogI2lmZGVmIF9fS0VSTkVMX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbGlyY19kZXYuaCBiL2luY2x1ZGUvbWVkaWEvbGlyY19kZXYuaAppbmRleCA2MzBlNzAyLi4xNjhkZDBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2xpcmNfZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9saXJjX2Rldi5oCkBAIC05LDcgKzksNyBAQAogI2lmbmRlZiBfTElOVVhfTElSQ19ERVZfSAogI2RlZmluZSBfTElOVVhfTElSQ19ERVZfSAogCi0jZGVmaW5lIE1BWF9JUkNUTF9ERVZJQ0VTIDQKKyNkZWZpbmUgTUFYX0lSQ1RMX0RFVklDRVMgOAogI2RlZmluZSBCVUZMRU4gICAgICAgICAgICAxNgogCiAjZGVmaW5lIG1vZChuLCBkaXYpICgobikgJSAoZGl2KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmggYi9pbmNsdWRlL21lZGlhL201bW9scy5oCmluZGV4IDJkN2U3Y2EuLmFhYzJjMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tNW1vbHMuaApAQCAtMiwxMCArMiwxMCBAQAogICogRHJpdmVyIGhlYWRlciBmb3IgTS01TU9MUyA4TSBQaXhlbCBjYW1lcmEgc2Vuc29yIHdpdGggSVNQCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IEhldW5nSnVuIEtpbSwgcml2ZXJmdWwua2ltQHNhbXN1bmcuY29tCisgKiBBdXRob3I6IEhldW5nSnVuIEtpbSA8cml2ZXJmdWwua2ltQHNhbXN1bmcuY29tPgogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0sIGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogRG9uZ3NvbyBOYXRoYW5pZWwgS2ltIDxkb25nc29vNDUua2ltQHNhbXN1bmcuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCmluZGV4IDkzZTk2ZmIuLmM3YzQwZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKQEAgLTEyOCw4ICsxMjgsOCBAQAogCXN0cnVjdCBtdXRleCAqbG9jazsKIH07CiAKLSNkZWZpbmUgbWVkaWFfZW50aXR5X3RvX3ZpZGVvX2RldmljZShlbnRpdHkpIFwKLQljb250YWluZXJfb2YoZW50aXR5LCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBlbnRpdHkpCisjZGVmaW5lIG1lZGlhX2VudGl0eV90b192aWRlb19kZXZpY2UoX19lKSBcCisJY29udGFpbmVyX29mKF9fZSwgc3RydWN0IHZpZGVvX2RldmljZSwgZW50aXR5KQogLyogZGV2IHRvIHZpZGVvLWRldmljZSAqLwogI2RlZmluZSB0b192aWRlb19kZXZpY2UoY2QpIGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgZGV2KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKaW5kZXggMTU2MmM0Zi4uMjg4NGUzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaApAQCAtMTczLDE2ICsxNzMsMjAgQEAKIAkJCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpOwogfTsKIAotLyogc19tb2RlOiBzd2l0Y2ggdGhlIHR1bmVyIHRvIGEgc3BlY2lmaWMgdHVuZXIgbW9kZS4gUmVwbGFjZW1lbnQgb2Ygc19yYWRpby4KKy8qIHNfcmFkaW86IHY0bCBkZXZpY2Ugd2FzIG9wZW5lZCBpbiByYWRpbyBtb2RlLgogCi0gICBzX3JhZGlvOiB2NGwgZGV2aWNlIHdhcyBvcGVuZWQgaW4gUmFkaW8gbW9kZSwgdG8gYmUgcmVwbGFjZWQgYnkgc19tb2RlLgorICAgZ19mcmVxdWVuY3k6IGZyZXEtPnR5cGUgbXVzdCBiZSBmaWxsZWQgaW4uIE5vcm1hbGx5IGRvbmUgYnkgdmlkZW9faW9jdGwyCisJb3IgdGhlIGJyaWRnZSBkcml2ZXIuCisKKyAgIGdfdHVuZXI6CisgICBzX3R1bmVyOiB2dC0+dHlwZSBtdXN0IGJlIGZpbGxlZCBpbi4gTm9ybWFsbHkgZG9uZSBieSB2aWRlb19pb2N0bDIgb3IgdGhlCisJYnJpZGdlIGRyaXZlci4KIAogICAgc190eXBlX2FkZHI6IHNldHMgdHVuZXIgdHlwZSBhbmQgaXRzIEkyQyBhZGRyLgogCiAgICBzX2NvbmZpZzogc2V0cyB0ZGE5ODg3IHNwZWNpZmljIHN0dWZmLCBsaWtlIHBvcnQxLCBwb3J0MiBhbmQgcXNzCiAgKi8KIHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgewotCWludCAoKnNfbW9kZSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgZW51bSB2NGwyX3R1bmVyX3R5cGUpOwogCWludCAoKnNfcmFkaW8pKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpOwogCWludCAoKnNfZnJlcXVlbmN5KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpOwogCWludCAoKmdfZnJlcXVlbmN5KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKaW5kZXggMDU4OWY1NS4uMzk2ZThmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCkBAIC0yNjg4LDcgKzI2ODgsNyBAQAogICogQGRldjogbmV0d29yayBkZXZpY2UKICAqIEBhZGRyOiBUaGUgc291cmNlIE1BQyBhZGRyZXNzIG9mIHRoZSBmcmFtZQogICogQGtleV90eXBlOiBUaGUga2V5IHR5cGUgdGhhdCB0aGUgcmVjZWl2ZWQgZnJhbWUgdXNlZAotICogQGtleV9pZDogS2V5IGlkZW50aWZpZXIgKDAuLjMpCisgKiBAa2V5X2lkOiBLZXkgaWRlbnRpZmllciAoMC4uMykuIENhbiBiZSAtMSBpZiBtaXNzaW5nLgogICogQHRzYzogVGhlIFRTQyB2YWx1ZSBvZiB0aGUgZnJhbWUgdGhhdCBnZW5lcmF0ZWQgdGhlIE1JQyBmYWlsdXJlICg2IG9jdGV0cykKICAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc3QuaCBiL2luY2x1ZGUvbmV0L2RzdC5oCmluZGV4IDdkMTVkMjMuLmUxMmRkZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzdC5oCisrKyBiL2luY2x1ZGUvbmV0L2RzdC5oCkBAIC03Nyw2ICs3Nyw3IEBACiAjZGVmaW5lIERTVF9OT1BPTElDWQkJMHgwMDA0CiAjZGVmaW5lIERTVF9OT0hBU0gJCTB4MDAwOAogI2RlZmluZSBEU1RfTk9DQUNIRQkJMHgwMDEwCisjZGVmaW5lIERTVF9OT0NPVU5UCQkweDAwMjAKIAl1bmlvbiB7CiAJCXN0cnVjdCBkc3RfZW50cnkJKm5leHQ7CiAJCXN0cnVjdCBydGFibGUgX19yY3UJKnJ0X25leHQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKaW5kZXggMmJmOWVkOS4uYWVmNDMwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaApAQCAtMzUsOCArMzUsMTEgQEAKICNkZWZpbmUgTkVUREVWX0hBU0hFTlRSSUVTICgxIDw8IE5FVERFVl9IQVNIQklUUykKIAogc3RydWN0IG5ldCB7CisJYXRvbWljX3QJCXBhc3NpdmU7CS8qIFRvIGRlY2lkZWQgd2hlbiB0aGUgbmV0d29yaworCQkJCQkJICogbmFtZXNwYWNlIHNob3VsZCBiZSBmcmVlZC4KKwkJCQkJCSAqLwogCWF0b21pY190CQljb3VudDsJCS8qIFRvIGRlY2lkZWQgd2hlbiB0aGUgbmV0d29yawotCQkJCQkJICogIG5hbWVzcGFjZSBzaG91bGQgYmUgZnJlZWQuCisJCQkJCQkgKiAgbmFtZXNwYWNlIHNob3VsZCBiZSBzaHV0IGRvd24uCiAJCQkJCQkgKi8KICNpZmRlZiBORVROU19SRUZDTlRfREVCVUcKIAlhdG9taWNfdAkJdXNlX2NvdW50OwkvKiBUbyB0cmFjayByZWZlcmVuY2VzIHdlCkBAIC0xNTQsNiArMTU3LDkgQEAKIHsKIAlyZXR1cm4gbmV0MSA9PSBuZXQyOwogfQorCitleHRlcm4gdm9pZCBuZXRfZHJvcF9ucyh2b2lkICopOworCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKmdldF9uZXQoc3RydWN0IG5ldCAqbmV0KQpAQCAtMTc1LDYgKzE4MSw4IEBACiB7CiAJcmV0dXJuIDE7CiB9CisKKyNkZWZpbmUgbmV0X2Ryb3BfbnMgTlVMTAogI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IGM3YzQyZTcuLjVkNGY4ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTMwNyw2ICszMDcsMTIgQEAKIAlyZXR1cm4gdGVzdF9iaXQoSVBTX1VOVFJBQ0tFRF9CSVQsICZjdC0+c3RhdHVzKTsKIH0KIAorLyogUGFja2V0IGlzIHJlY2VpdmVkIGZyb20gbG9vcGJhY2sgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBuZl9pc19sb29wYmFja19wYWNrZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5kZXYgJiYgc2tiLT5za2JfaWlmICYmIHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSzsKK30KKwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaCBiL2luY2x1ZGUvbmV0L3NjdHAvY29tbWFuZC5oCmluZGV4IDJiNDQ3NjQuLjY1MDY0NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvY29tbWFuZC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvY29tbWFuZC5oCkBAIC02Myw2ICs2Myw3IEBACiAJU0NUUF9DTURfRUNOX0VDTkUsCS8qIERvIGRlbGF5ZWQgRUNORSBwcm9jZXNzaW5nLiAqLwogCVNDVFBfQ01EX0VDTl9DV1IsCS8qIERvIGRlbGF5ZWQgQ1dSIHByb2Nlc3NpbmcuICAqLwogCVNDVFBfQ01EX1RJTUVSX1NUQVJULAkvKiBTdGFydCBhIHRpbWVyLiAgKi8KKwlTQ1RQX0NNRF9USU1FUl9TVEFSVF9PTkNFLCAvKiBTdGFydCBhIHRpbWVyIG9uY2UgKi8KIAlTQ1RQX0NNRF9USU1FUl9SRVNUQVJULAkvKiBSZXN0YXJ0IGEgdGltZXIuICovCiAJU0NUUF9DTURfVElNRVJfU1RPUCwJLyogU3RvcCBhIHRpbWVyLiAqLwogCVNDVFBfQ01EX0lOSVRfQ0hPT1NFX1RSQU5TUE9SVCwgLyogQ2hvb3NlIHRyYW5zcG9ydCBmb3IgYW4gSU5JVC4gKi8KQEAgLTEwNyw2ICsxMDgsNyBAQAogCVNDVFBfQ01EX1VQREFURV9JTklUVEFHLCAvKiBVcGRhdGUgcGVlciBpbml0dGFnICovCiAJU0NUUF9DTURfU0VORF9NU0csCSAvKiBTZW5kIHRoZSB3aG9sZSB1c2UgbWVzc2FnZSAqLwogCVNDVFBfQ01EX1NFTkRfTkVYVF9BU0NPTkYsIC8qIFNlbmQgdGhlIG5leHQgQVNDT05GIGFmdGVyIEFDSyAqLworCVNDVFBfQ01EX1BVUkdFX0FTQ09ORl9RVUVVRSwgLyogUHVyZ2UgYWxsIGFzY29uZiBxdWV1ZXMuKi8KIAlTQ1RQX0NNRF9MQVNUCiB9IHNjdHBfdmVyYl90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCmluZGV4IDc5NWY0ODguLjdkZjMyN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCkBAIC0xOTkzLDcgKzE5OTMsNyBAQAogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfYXNzb2NfbG9va3VwX2FzY29uZl9hY2soCiAJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCQlfX2JlMzIgc2VyaWFsKTsKLQordm9pZCBzY3RwX2FzY29uZl9xdWV1ZV90ZWFyZG93bihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyk7CiAKIGludCBzY3RwX2NtcF9hZGRyX2V4YWN0KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqc3MxLAogCQkJY29uc3QgdW5pb24gc2N0cF9hZGRyICpzczIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCmluZGV4IDk5YjAyN2IuLmNhNDY5M2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKQEAgLTgwLDcgKzgwLDcgQEAKIAogdm9pZCBzY3RwX3VscGV2ZW50X2ZyZWUoc3RydWN0IHNjdHBfdWxwZXZlbnQgKik7CiBpbnQgc2N0cF91bHBldmVudF9pc19ub3RpZmljYXRpb24oY29uc3Qgc3RydWN0IHNjdHBfdWxwZXZlbnQgKik7Ci12b2lkIHNjdHBfcXVldWVfcHVyZ2VfdWxwZXZlbnRzKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpOwordW5zaWduZWQgaW50IHNjdHBfcXVldWVfcHVyZ2VfdWxwZXZlbnRzKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBmMjA0NmU0Li5jMGI5MzhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0xNzgsNyArMTc4LDYgQEAKICAgKglAc2tfZHN0X2NhY2hlOiBkZXN0aW5hdGlvbiBjYWNoZQogICAqCUBza19kc3RfbG9jazogZGVzdGluYXRpb24gY2FjaGUgbG9jawogICAqCUBza19wb2xpY3k6IGZsb3cgcG9saWN5Ci0gICoJQHNrX3JtZW1fYWxsb2M6IHJlY2VpdmUgcXVldWUgYnl0ZXMgY29tbWl0dGVkCiAgICoJQHNrX3JlY2VpdmVfcXVldWU6IGluY29taW5nIHBhY2tldHMKICAgKglAc2tfd21lbV9hbGxvYzogdHJhbnNtaXQgcXVldWUgYnl0ZXMgY29tbWl0dGVkCiAgICoJQHNrX3dyaXRlX3F1ZXVlOiBQYWNrZXQgc2VuZGluZyBxdWV1ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oIGIvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oCmluZGV4IDczNmVhYzcuLmFmMWI0OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2IxNl9jc3AuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKQEAgLTk5LDcgKzk5LDE0IEBACiAvKiBnZXQgQ1NQIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9JTkZPCQlfSU9SKCdIJywgMHgxMCwgc3RydWN0IHNuZF9zYl9jc3BfaW5mbykKIC8qIGxvYWQgbWljcm9jb2RlIHRvIENTUCAqLwotI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfTE9BRF9DT0RFCV9JT1coJ0gnLCAweDExLCBzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUpCisvKiBOT1RFOiBzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUgb3ZlcmZsb3dzIHRoZSBtYXggc2l6ZSAoMTMgYml0cykKKyAqIGRlZmluZWQgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyBsaWtlIE1JUFMsIGFuZCBpdCBsZWFkcyB0byBidWlsZCBlcnJvcnMuCisgKiAoeDg2IGFuZCBjbyBoYXZlIDE0LWJpdCBzaXplLCB0aHVzIGl0J3MgdmFsaWQsIHRob3VnaC4pCisgKiBBcyBhIHdvcmthcm91bmQgZm9yIHNraXBwaW5nIHRoZSBzaXplLWxpbWl0IGNoZWNrLCBoZXJlIHdlIGRvbid0IHVzZSB0aGUKKyAqIG5vcm1hbCBfSU9XKCkgbWFjcm8gYnV0IF9JT0MoKSB3aXRoIHRoZSBtYW51YWwgYXJndW1lbnQuCisgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0xPQURfQ09ERQlcCisJX0lPQyhfSU9DX1dSSVRFLCAnSCcsIDB4MTEsIHNpemVvZihzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUpKQogLyogdW5sb2FkIG1pY3JvY29kZSBmcm9tIENTUCAqLwogI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfVU5MT0FEX0NPREUJX0lPKCdIJywgMHgxMikKIC8qIHN0YXJ0IENTUCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCmluZGV4IGUwOTU5MmQuLjVjZTJiMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKQEAgLTI2LDcgKzI2LDcgQEAKIAkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKIAkJX19maWVsZCgJdWlkX3QsCXVpZAkJCSkKIAkJX19maWVsZCgJZ2lkX3QsCWdpZAkJCSkKLQkJX19maWVsZCgJYmxrY250X3QsIGJsb2NrcwkJKQorCQlfX2ZpZWxkKAlfX3U2NCwgYmxvY2tzCQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTQwLDkgKzQwLDggQEAKIAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbW9kZSAwJW8gdWlkICV1IGdpZCAldSBibG9ja3MgJWxsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPm1vZGUsIF9fZW50cnktPnVpZCwgX19lbnRyeS0+Z2lkLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmJsb2NrcykKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5tb2RlLAorCQkgIF9fZW50cnktPnVpZCwgX19lbnRyeS0+Z2lkLCBfX2VudHJ5LT5ibG9ja3MpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X3JlcXVlc3RfaW5vZGUsCkBAIC0xNzgsNyArMTc3LDcgQEAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IG5ld19zaXplICVsbGQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAobG9uZyBsb25nKSBfX2VudHJ5LT5uZXdfc2l6ZSkKKwkJICBfX2VudHJ5LT5uZXdfc2l6ZSkKICk7CiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoZXh0NF9fd3JpdGVfYmVnaW4sCkBAIC0yMDQsNyArMjAzLDcgQEAKIAkJX19lbnRyeS0+ZmxhZ3MJPSBmbGFnczsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgZmxhZ3MgJXUiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbGQgbGVuICV1IGZsYWdzICV1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzKQpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJCV9fZW50cnktPmNvcGllZAk9IGNvcGllZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgY29waWVkICV1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGxlbiAldSBjb3BpZWQgJXUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5wb3MsIF9fZW50cnktPmxlbiwgX19lbnRyeS0+Y29waWVkKQpAQCAtMjg2LDI5ICsyODUsNiBAQAogCVRQX0FSR1MoaW5vZGUsIHBvcywgbGVuLCBjb3BpZWQpCiApOwogCi1UUkFDRV9FVkVOVChleHQ0X3dyaXRlcGFnZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSksCi0KLQlUUF9BUkdTKGlub2RlLCBwYWdlKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCi0JCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXBnb2ZmX3QsIGluZGV4CQkJKQotCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7Ci0JCV9fZW50cnktPmlubwk9IGlub2RlLT5pX2lubzsKLQkJX19lbnRyeS0+aW5kZXgJPSBwYWdlLT5pbmRleDsKLQkpLAotCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwYWdlX2luZGV4ICVsdSIsCi0JCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5pbmRleCkKLSk7Ci0KIFRSQUNFX0VWRU5UKGV4dDRfZGFfd3JpdGVwYWdlcywKIAlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyksCiAKQEAgLTM0MSw3ICszMTcsNyBAQAogCSksCiAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IG5yX3RvX3dyaXRlICVsZCBwYWdlc19za2lwcGVkICVsZCAiCi0JCSAgInJhbmdlX3N0YXJ0ICVsbHUgcmFuZ2VfZW5kICVsbHUgc3luY19tb2RlICVkIgorCQkgICJyYW5nZV9zdGFydCAlbGxkIHJhbmdlX2VuZCAlbGxkIHN5bmNfbW9kZSAlZCIKIAkJICAiZm9yX2t1cGRhdGUgJWQgcmFuZ2VfY3ljbGljICVkIHdyaXRlYmFja19pbmRleCAlbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+bnJfdG9fd3JpdGUsCkBAIC00NDksNyArNDI1LDE0IEBACiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwYWdlX2luZGV4ICVsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPmluZGV4KQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCkKKyk7CisKK0RFRklORV9FVkVOVChleHQ0X19wYWdlX29wLCBleHQ0X3dyaXRlcGFnZSwKKworCVRQX1BST1RPKHN0cnVjdCBwYWdlICpwYWdlKSwKKworCVRQX0FSR1MocGFnZSkKICk7CiAKIERFRklORV9FVkVOVChleHQ0X19wYWdlX29wLCBleHQ0X3JlYWRwYWdlLApAQCAtNDg5LDcgKzQ3Miw3IEBACiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwYWdlX2luZGV4ICVsdSBvZmZzZXQgJWx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgX19lbnRyeS0+aW5kZXgsIF9fZW50cnktPm9mZnNldCkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5kZXgsIF9fZW50cnktPm9mZnNldCkKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZGlzY2FyZF9ibG9ja3MsCkBAIC01NjIsMTIgKzU0NSwxMCBAQAogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9tYl9yZWxlYXNlX2lub2RlX3BhLAotCVRQX1BST1RPKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhLAorCVRQX1BST1RPKHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSwKIAkJIHVuc2lnbmVkIGxvbmcgbG9uZyBibG9jaywgdW5zaWduZWQgaW50IGNvdW50KSwKIAotCVRQX0FSR1Moc2IsIGlub2RlLCBwYSwgYmxvY2ssIGNvdW50KSwKKwlUUF9BUkdTKHBhLCBibG9jaywgY291bnQpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKQEAgLTU3OCw4ICs1NTksOCBAQAogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+ZGV2CQk9IHNiLT5zX2RldjsKLQkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IHBhLT5wYV9pbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmlubwkJPSBwYS0+cGFfaW5vZGUtPmlfaW5vOwogCQlfX2VudHJ5LT5ibG9jawkJPSBibG9jazsKIAkJX19lbnRyeS0+Y291bnQJCT0gY291bnQ7CiAJKSwKQEAgLTU5MSwxMCArNTcyLDkgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfbWJfcmVsZWFzZV9ncm91cF9wYSwKLQlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKSwKKwlUUF9QUk9UTyhzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSAqcGEpLAogCi0JVFBfQVJHUyhzYiwgcGEpLAorCVRQX0FSR1MocGEpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKQEAgLTYwNCw3ICs1ODQsNyBAQAogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+ZGV2CQk9IHNiLT5zX2RldjsKKwkJX19lbnRyeS0+ZGV2CQk9IHBhLT5wYV9pbm9kZS0+aV9zYi0+c19kZXY7CiAJCV9fZW50cnktPnBhX3BzdGFydAk9IHBhLT5wYV9wc3RhcnQ7CiAJCV9fZW50cnktPnBhX2xlbgkJPSBwYS0+cGFfbGVuOwogCSksCkBAIC02NjYsMTAgKzY0NiwxMCBAQAogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsIGZsYWdzCQkpCiAJCV9fZmllbGQoCXVuc2lnbmVkIGludCwgbGVuCQkpCi0JCV9fZmllbGQoCV9fdTY0LCAgbG9naWNhbAkJCSkKKwkJX19maWVsZCgJX191MzIsICBsb2dpY2FsCQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwJbGxlZnQJCQkpCisJCV9fZmllbGQoCV9fdTMyLAlscmlnaHQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlnb2FsCQkJKQotCQlfX2ZpZWxkKAlfX3U2NCwJbGxlZnQJCQkpCi0JCV9fZmllbGQoCV9fdTY0LAlscmlnaHQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlwbGVmdAkJCSkKIAkJX19maWVsZCgJX191NjQsCXByaWdodAkJCSkKIAkpLApAQCAtNjg3LDE3ICs2NjcsMTMgQEAKIAkJX19lbnRyeS0+cHJpZ2h0CT0gYXItPnByaWdodDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBmbGFncyAldSBsZW4gJXUgbGJsayAlbGx1IGdvYWwgJWxsdSAiCi0JCSAgImxsZWZ0ICVsbHUgbHJpZ2h0ICVsbHUgcGxlZnQgJWxsdSBwcmlnaHQgJWxsdSAiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgZmxhZ3MgJXUgbGVuICV1IGxibGsgJXUgZ29hbCAlbGx1ICIKKwkJICAibGxlZnQgJXUgbHJpZ2h0ICV1IHBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUgIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAotCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgX19lbnRyeS0+ZmxhZ3MsIF9fZW50cnktPmxlbiwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5sb2dpY2FsLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmdvYWwsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bGxlZnQsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bHJpZ2h0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBsZWZ0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnByaWdodCkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5mbGFncywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmxvZ2ljYWwsIF9fZW50cnktPmdvYWwsCisJCSAgX19lbnRyeS0+bGxlZnQsIF9fZW50cnktPmxyaWdodCwgX19lbnRyeS0+cGxlZnQsCisJCSAgX19lbnRyeS0+cHJpZ2h0KQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9hbGxvY2F0ZV9ibG9ja3MsCkBAIC03MTEsMTAgKzY4NywxMCBAQAogCQlfX2ZpZWxkKAlfX3U2NCwJYmxvY2sJCQkpCiAJCV9fZmllbGQoCXVuc2lnbmVkIGludCwgZmxhZ3MJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgaW50LCBsZW4JCSkKLQkJX19maWVsZCgJX191NjQsICBsb2dpY2FsCQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwgIGxvZ2ljYWwJCQkpCisJCV9fZmllbGQoCV9fdTMyLAlsbGVmdAkJCSkKKwkJX19maWVsZCgJX191MzIsCWxyaWdodAkJCSkKIAkJX19maWVsZCgJX191NjQsCWdvYWwJCQkpCi0JCV9fZmllbGQoCV9fdTY0LAlsbGVmdAkJCSkKLQkJX19maWVsZCgJX191NjQsCWxyaWdodAkJCSkKIAkJX19maWVsZCgJX191NjQsCXBsZWZ0CQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJcHJpZ2h0CQkJKQogCSksCkBAIC03MzMsMTcgKzcwOSwxMyBAQAogCQlfX2VudHJ5LT5wcmlnaHQJPSBhci0+cHJpZ2h0OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGZsYWdzICV1IGxlbiAldSBibG9jayAlbGx1IGxibGsgJWxsdSAiCi0JCSAgImdvYWwgJWxsdSBsbGVmdCAlbGx1IGxyaWdodCAlbGx1IHBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgZmxhZ3MgJXUgbGVuICV1IGJsb2NrICVsbHUgbGJsayAldSAiCisJCSAgImdvYWwgJWxsdSBsbGVmdCAldSBscmlnaHQgJXUgcGxlZnQgJWxsdSBwcmlnaHQgJWxsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPmZsYWdzLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmJsb2NrLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmxvZ2ljYWwsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+Z29hbCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5sbGVmdCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5scmlnaHQsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGxlZnQsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cHJpZ2h0KQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sIF9fZW50cnktPmZsYWdzLAorCQkgIF9fZW50cnktPmxlbiwgX19lbnRyeS0+YmxvY2ssIF9fZW50cnktPmxvZ2ljYWwsCisJCSAgX19lbnRyeS0+Z29hbCwgIF9fZW50cnktPmxsZWZ0LCBfX2VudHJ5LT5scmlnaHQsCisJCSAgX19lbnRyeS0+cGxlZnQsIF9fZW50cnktPnByaWdodCkKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZnJlZV9ibG9ja3MsCkBAIC03NTUsMTAgKzcyNywxMCBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoICAgICAgdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKIAkJX19maWVsZCgJX191NjQsCWJsb2NrCQkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljb3VudAkJKQotCQlfX2ZpZWxkKAkgaW50LAlmbGFncwkJCSkKKwkJX19maWVsZCgJaW50LAlmbGFncwkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC03OTgsNyArNzcwLDcgQEAKIAkJX19lbnRyeS0+cGFyZW50CQk9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHBhcmVudCAlbGQgZGF0YXN5bmMgJWQgIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBhcmVudCAlbHUgZGF0YXN5bmMgJWQgIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPnBhcmVudCwgX19lbnRyeS0+ZGF0YXN5bmMpCkBAIC04MjEsNyArNzkzLDcgQEAKIAkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCByZXQgJWQiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcmV0ICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgX19lbnRyeS0+cmV0KQpAQCAtMTAwNSw3ICs5NzcsNyBAQAogCQlfX2VudHJ5LT5yZXN1bHRfbGVuCT0gbGVuOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm9kZSAlbHUgZXh0ZW50ICV1LyVkLyV1ICIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vZGUgJWx1IGV4dGVudCAldS8lZC8lZCAiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5yZXN1bHRfZ3JvdXAsIF9fZW50cnktPnJlc3VsdF9zdGFydCwKQEAgLTEwOTMsNyArMTA2NSw3IEBACiAJCSAgImFsbG9jYXRlZF9tZXRhX2Jsb2NrcyAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPm1vZGUsICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5pX2Jsb2NrcywKKwkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5pX2Jsb2NrcywKIAkJICBfX2VudHJ5LT51c2VkX2Jsb2NrcywgX19lbnRyeS0+cmVzZXJ2ZWRfZGF0YV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+cmVzZXJ2ZWRfbWV0YV9ibG9ja3MsIF9fZW50cnktPmFsbG9jYXRlZF9tZXRhX2Jsb2NrcykKICk7CkBAIC0xMTI3LDcgKzEwOTksNyBAQAogCQkgICJyZXNlcnZlZF9kYXRhX2Jsb2NrcyAlZCByZXNlcnZlZF9tZXRhX2Jsb2NrcyAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPm1vZGUsICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmlfYmxvY2tzLAorCQkgIF9fZW50cnktPm1vZGUsIF9fZW50cnktPmlfYmxvY2tzLAogCQkgIF9fZW50cnktPm1kX25lZWRlZCwgX19lbnRyeS0+cmVzZXJ2ZWRfZGF0YV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+cmVzZXJ2ZWRfbWV0YV9ibG9ja3MpCiApOwpAQCAtMTE2NCw3ICsxMTM2LDcgQEAKIAkJICAiYWxsb2NhdGVkX21ldGFfYmxvY2tzICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgX19lbnRyeS0+bW9kZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+aV9ibG9ja3MsCisJCSAgX19lbnRyeS0+bW9kZSwgX19lbnRyeS0+aV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+ZnJlZWRfYmxvY2tzLCBfX2VudHJ5LT5yZXNlcnZlZF9kYXRhX2Jsb2NrcywKIAkJICBfX2VudHJ5LT5yZXNlcnZlZF9tZXRhX2Jsb2NrcywgX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzKQogKTsKQEAgLTEyMzksMTQgKzEyMTEsMTUgQEAKIAkJX19lbnRyeS0+cncJPSBydzsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsdSBsZW4gJWx1IHJ3ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGxlbiAlbHUgcncgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wb3MsIF9fZW50cnktPmxlbiwgX19lbnRyeS0+cncpCisJCSAgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPnJ3KQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9kaXJlY3RfSU9fZXhpdCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHJ3LCBpbnQgcmV0KSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJIGludCBydywgaW50IHJldCksCiAKIAlUUF9BUkdTKGlub2RlLCBvZmZzZXQsIGxlbiwgcncsIHJldCksCiAKQEAgLTEyNjgsMTAgKzEyNDEsMTAgQEAKIAkJX19lbnRyeS0+cmV0CT0gcmV0OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGx1IGxlbiAlbHUgcncgJWQgcmV0ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGxlbiAlbHUgcncgJWQgcmV0ICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sCisJCSAgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sCiAJCSAgX19lbnRyeS0+cncsIF9fZW50cnktPnJldCkKICk7CiAKQEAgLTEyOTYsMTUgKzEyNjksMTUgQEAKIAkJX19lbnRyeS0+bW9kZQk9IG1vZGU7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbGQgcG9zICVsbHUgbGVuICVsbHUgbW9kZSAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJWxsZCBtb2RlICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAotCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cG9zLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmxlbiwgX19lbnRyeS0+bW9kZSkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5wb3MsCisJCSAgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5tb2RlKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9mYWxsb2NhdGVfZXhpdCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywgaW50IHJldCksCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwKKwkJIHVuc2lnbmVkIGludCBtYXhfYmxvY2tzLCBpbnQgcmV0KSwKIAogCVRQX0FSR1MoaW5vZGUsIG9mZnNldCwgbWF4X2Jsb2NrcywgcmV0KSwKIApAQCAtMTMxMiw3ICsxMjg1LDcgQEAKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJbG9mZl90LAlwb3MJCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkLAlibG9ja3MJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlibG9ja3MJCSkKIAkJX19maWVsZCgJaW50LCAJcmV0CQkJKQogCSksCiAKQEAgLTEzMjQsMTAgKzEyOTcsMTAgQEAKIAkJX19lbnRyeS0+cmV0CT0gcmV0OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHBvcyAlbGx1IGJsb2NrcyAlZCByZXQgJWQiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbGQgYmxvY2tzICV1IHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBvcywgX19lbnRyeS0+YmxvY2tzLAorCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+YmxvY2tzLAogCQkgIF9fZW50cnktPnJldCkKICk7CiAKQEAgLTEzNTAsNyArMTMyMyw3IEBACiAJCV9fZW50cnktPmRldgkJPSBkZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfZGV2OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHNpemUgJWxsZCBwYXJlbnQgJWxkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHNpemUgJWxsZCBwYXJlbnQgJWx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sIF9fZW50cnktPnNpemUsCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPnBhcmVudCkKQEAgLTEzNzMsNyArMTM0Niw3IEBACiAJCV9fZW50cnktPnJldAkJPSByZXQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbGQgcmV0ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgIF9fZW50cnktPnJldCkKQEAgLTEzODcsNyArMTM2MCw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJaW5vX3QsICAJaW5vCQkpCiAJCV9fZmllbGQoCWRldl90LCAgCWRldgkJKQotCQlfX2ZpZWxkKAlibGtjbnRfdCwJYmxvY2tzCQkpCisJCV9fZmllbGQoCV9fdTY0LAkJYmxvY2tzCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtMTM5Niw5ICsxMzY5LDkgQEAKIAkJX19lbnRyeS0+YmxvY2tzCT0gaW5vZGUtPmlfYmxvY2tzOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGJsb2NrcyAlbHUiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgYmxvY2tzICVsbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmJsb2NrcykKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5ibG9ja3MpCiApOwogCiBERUZJTkVfRVZFTlQoZXh0NF9fdHJ1bmNhdGUsIGV4dDRfdHJ1bmNhdGVfZW50ZXIsCkBAIC0xNDE3LDcgKzEzOTAsNyBAQAogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGV4dDRfX21hcF9ibG9ja3NfZW50ZXIsCiAJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywKLQkJIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MpLAorCQkgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKSwKIAogCVRQX0FSR1MoaW5vZGUsIGxibGssIGxlbiwgZmxhZ3MpLAogCkBAIC0xNDI1LDggKzEzOTgsOCBAQAogCQlfX2ZpZWxkKAlpbm9fdCwgIAlpbm8JCSkKIAkJX19maWVsZCgJZGV2X3QsICAJZGV2CQkpCiAJCV9fZmllbGQoCWV4dDRfbGJsa190LAlsYmxrCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkLAlsZW4JCSkKLQkJX19maWVsZCgJdW5zaWduZWQsCWZsYWdzCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJbGVuCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJZmxhZ3MJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC0xNDQwLDcgKzE0MTMsNyBAQAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbGJsayAldSBsZW4gJXUgZmxhZ3MgJXUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAodW5zaWduZWQpIF9fZW50cnktPmxibGssIF9fZW50cnktPmxlbiwgX19lbnRyeS0+ZmxhZ3MpCisJCSAgX19lbnRyeS0+bGJsaywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5mbGFncykKICk7CiAKIERFRklORV9FVkVOVChleHQ0X19tYXBfYmxvY2tzX2VudGVyLCBleHQ0X2V4dF9tYXBfYmxvY2tzX2VudGVyLApAQCAtMTQ1OSw3ICsxNDMyLDcgQEAKIAogREVDTEFSRV9FVkVOVF9DTEFTUyhleHQ0X19tYXBfYmxvY2tzX2V4aXQsCiAJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywKLQkJIGV4dDRfZnNibGtfdCBwYmxrLCB1bnNpZ25lZCBsZW4sIGludCByZXQpLAorCQkgZXh0NF9mc2Jsa190IHBibGssIHVuc2lnbmVkIGludCBsZW4sIGludCByZXQpLAogCiAJVFBfQVJHUyhpbm9kZSwgbGJsaywgcGJsaywgbGVuLCByZXQpLAogCkBAIC0xNDY4LDcgKzE0NDEsNyBAQAogCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkJKQogCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkJKQogCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBibGsJCSkKLQkJX19maWVsZCgJdW5zaWduZWQsCWxlbgkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWxlbgkJKQogCQlfX2ZpZWxkKAlpbnQsCQlyZXQJCSkKIAkpLAogCkBAIC0xNDg0LDcgKzE0NTcsNyBAQAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbGJsayAldSBwYmxrICVsbHUgbGVuICV1IHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaywKKwkJICBfX2VudHJ5LT5sYmxrLCBfX2VudHJ5LT5wYmxrLAogCQkgIF9fZW50cnktPmxlbiwgX19lbnRyeS0+cmV0KQogKTsKIApAQCAtMTUyNCw3ICsxNDk3LDcgQEAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgcGJsayAlbGx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5sYmxrLCAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wYmxrKQorCQkgIF9fZW50cnktPmxibGssIF9fZW50cnktPnBibGspCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2xvYWRfaW5vZGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oCmluZGV4IGFlMDQ1Y2EuLjFjMDk4MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oCkBAIC0yMCw3ICsyMCw4IEBACiAJCQkgc29mdGlycV9uYW1lKEJMT0NLX0lPUE9MTCksCVwKIAkJCSBzb2Z0aXJxX25hbWUoVEFTS0xFVCksCQlcCiAJCQkgc29mdGlycV9uYW1lKFNDSEVEKSwJCVwKLQkJCSBzb2Z0aXJxX25hbWUoSFJUSU1FUikpCisJCQkgc29mdGlycV9uYW1lKEhSVElNRVIpLAkJXAorCQkJIHNvZnRpcnFfbmFtZShSQ1UpKQogCiAvKioKICAqIGlycV9oYW5kbGVyX2VudHJ5IC0gY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgaXJxIGFjdGlvbiBoYW5kbGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9uZXQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL25ldC5oCmluZGV4IDVmMjQ3ZjUuLmY5OTY0NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL25ldC5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL25ldC5oCkBAIC0xMiwyMiArMTIsMjQgQEAKIFRSQUNFX0VWRU5UKG5ldF9kZXZfeG1pdCwKIAogCVRQX1BST1RPKHN0cnVjdCBza19idWZmICpza2IsCi0JCSBpbnQgcmMpLAorCQkgaW50IHJjLAorCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJIHVuc2lnbmVkIGludCBza2JfbGVuKSwKIAotCVRQX0FSR1Moc2tiLCByYyksCisJVFBfQVJHUyhza2IsIHJjLCBkZXYsIHNrYl9sZW4pLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJdm9pZCAqLAkJc2tiYWRkcgkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWxlbgkJKQogCQlfX2ZpZWxkKAlpbnQsCQlyYwkJKQotCQlfX3N0cmluZygJbmFtZSwJCXNrYi0+ZGV2LT5uYW1lCSkKKwkJX19zdHJpbmcoCW5hbWUsCQlkZXYtPm5hbWUJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+c2tiYWRkciA9IHNrYjsKLQkJX19lbnRyeS0+bGVuID0gc2tiLT5sZW47CisJCV9fZW50cnktPmxlbiA9IHNrYl9sZW47CiAJCV9fZW50cnktPnJjID0gcmM7Ci0JCV9fYXNzaWduX3N0cihuYW1lLCBza2ItPmRldi0+bmFtZSk7CisJCV9fYXNzaWduX3N0cihuYW1lLCBkZXYtPm5hbWUpOwogCSksCiAKIAlUUF9wcmludGsoImRldj0lcyBza2JhZGRyPSVwIGxlbj0ldSByYz0lZCIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Ztc2Nhbi5oCmluZGV4IGVhNDIyYWEuLmIyYzMzYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Ztc2Nhbi5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Ztc2Nhbi5oCkBAIC02LDYgKzYsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAjaW5jbHVkZSAiZ2ZwZmxhZ3MuaCIKIAogI2RlZmluZSBSRUNMQUlNX1dCX0FOT04JCTB4MDAwMXUKQEAgLTMxMCw2ICszMTIsODcgQEAKIAkJc2hvd19yZWNsYWltX2ZsYWdzKF9fZW50cnktPnJlY2xhaW1fZmxhZ3MpKQogKTsKIAorVFJBQ0VfRVZFTlQocmVwbGFjZV9zd2FwX3Rva2VuLAorCVRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZF9tbSwKKwkJIHN0cnVjdCBtbV9zdHJ1Y3QgKm5ld19tbSksCisKKwlUUF9BUkdTKG9sZF9tbSwgbmV3X21tKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCosCW9sZF9tbSkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsCQlvbGRfcHJpbykKKwkJX19maWVsZChzdHJ1Y3QgbW1fc3RydWN0KiwJbmV3X21tKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwJCW5ld19wcmlvKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+b2xkX21tICAgPSBvbGRfbW07CisJCV9fZW50cnktPm9sZF9wcmlvID0gb2xkX21tID8gb2xkX21tLT50b2tlbl9wcmlvcml0eSA6IDA7CisJCV9fZW50cnktPm5ld19tbSAgID0gbmV3X21tOworCQlfX2VudHJ5LT5uZXdfcHJpbyA9IG5ld19tbS0+dG9rZW5fcHJpb3JpdHk7CisJKSwKKworCVRQX3ByaW50aygib2xkX3Rva2VuX21tPSVwIG9sZF9wcmlvPSV1IG5ld190b2tlbl9tbT0lcCBuZXdfcHJpbz0ldSIsCisJCSAgX19lbnRyeS0+b2xkX21tLCBfX2VudHJ5LT5vbGRfcHJpbywKKwkJICBfX2VudHJ5LT5uZXdfbW0sIF9fZW50cnktPm5ld19wcmlvKQorKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhwdXRfc3dhcF90b2tlbl90ZW1wbGF0ZSwKKwlUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICpzd2FwX3Rva2VuX21tKSwKKworCVRQX0FSR1Moc3dhcF90b2tlbl9tbSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QqLCBzd2FwX3Rva2VuX21tKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+c3dhcF90b2tlbl9tbSA9IHN3YXBfdG9rZW5fbW07CisJKSwKKworCVRQX3ByaW50aygidG9rZW5fbW09JXAiLCBfX2VudHJ5LT5zd2FwX3Rva2VuX21tKQorKTsKKworREVGSU5FX0VWRU5UKHB1dF9zd2FwX3Rva2VuX3RlbXBsYXRlLCBwdXRfc3dhcF90b2tlbiwKKwlUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICpzd2FwX3Rva2VuX21tKSwKKwlUUF9BUkdTKHN3YXBfdG9rZW5fbW0pCispOworCitERUZJTkVfRVZFTlRfQ09ORElUSU9OKHB1dF9zd2FwX3Rva2VuX3RlbXBsYXRlLCBkaXNhYmxlX3N3YXBfdG9rZW4sCisJVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbSksCisJVFBfQVJHUyhzd2FwX3Rva2VuX21tKSwKKwlUUF9DT05ESVRJT04oc3dhcF90b2tlbl9tbSAhPSBOVUxMKQorKTsKKworVFJBQ0VfRVZFTlRfQ09ORElUSU9OKHVwZGF0ZV9zd2FwX3Rva2VuX3ByaW9yaXR5LAorCVRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkgdW5zaWduZWQgaW50IG9sZF9wcmlvLAorCQkgc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbSksCisKKwlUUF9BUkdTKG1tLCBvbGRfcHJpbywgc3dhcF90b2tlbl9tbSksCisKKwlUUF9DT05ESVRJT04obW0tPnRva2VuX3ByaW9yaXR5ICE9IG9sZF9wcmlvKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCosIG1tKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwgb2xkX3ByaW8pCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBuZXdfcHJpbykKKwkJX19maWVsZChzdHJ1Y3QgbW1fc3RydWN0Kiwgc3dhcF90b2tlbl9tbSkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsIHN3YXBfdG9rZW5fcHJpbykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm1tCQk9IG1tOworCQlfX2VudHJ5LT5vbGRfcHJpbwk9IG9sZF9wcmlvOworCQlfX2VudHJ5LT5uZXdfcHJpbwk9IG1tLT50b2tlbl9wcmlvcml0eTsKKwkJX19lbnRyeS0+c3dhcF90b2tlbl9tbQk9IHN3YXBfdG9rZW5fbW07CisJCV9fZW50cnktPnN3YXBfdG9rZW5fcHJpbyA9IHN3YXBfdG9rZW5fbW0gPyBzd2FwX3Rva2VuX21tLT50b2tlbl9wcmlvcml0eSA6IDA7CisJKSwKKworCVRQX3ByaW50aygibW09JXAgb2xkX3ByaW89JXUgbmV3X3ByaW89JXUgc3dhcF90b2tlbl9tbT0lcCB0b2tlbl9wcmlvPSV1IiwKKwkJICBfX2VudHJ5LT5tbSwgX19lbnRyeS0+b2xkX3ByaW8sIF9fZW50cnktPm5ld19wcmlvLAorCQkgIF9fZW50cnktPnN3YXBfdG9rZW5fbW0sIF9fZW50cnktPnN3YXBfdG9rZW5fcHJpbykKKyk7CiAKICNlbmRpZiAvKiBfVFJBQ0VfVk1TQ0FOX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGViYWZhYzQuLjQxMmMyMWIgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTE5LDcgKzE5LDYgQEAKIGNvbmZpZyBDT05TVFJVQ1RPUlMKIAlib29sCiAJZGVwZW5kcyBvbiAhVU1MCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBIQVZFX0lSUV9XT1JLCiAJYm9vbApAQCAtMjA0LDYgKzIwMywxNSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIERFRkFVTFRfSE9TVE5BTUUKKwlzdHJpbmcgIkRlZmF1bHQgaG9zdG5hbWUiCisJZGVmYXVsdCAiKG5vbmUpIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGRldGVybWluZXMgdGhlIGRlZmF1bHQgc3lzdGVtIGhvc3RuYW1lIGJlZm9yZSB1c2Vyc3BhY2UKKwkgIGNhbGxzIHNldGhvc3RuYW1lKDIpLiBUaGUga2VybmVsIHRyYWRpdGlvbmFsbHkgdXNlcyAiKG5vbmUpIiBoZXJlLAorCSAgYnV0IHlvdSBtYXkgd2lzaCB0byB1c2UgYSBkaWZmZXJlbnQgZGVmYXVsdCBoZXJlIHRvIG1ha2UgYSBtaW5pbWFsCisJICBzeXN0ZW0gbW9yZSB1c2FibGUgd2l0aCBsZXNzIGNvbmZpZ3VyYXRpb24uCisKIGNvbmZpZyBTV0FQCiAJYm9vbCAiU3VwcG9ydCBmb3IgcGFnaW5nIG9mIGFub255bW91cyBtZW1vcnkgKHN3YXApIgogCWRlcGVuZHMgb24gTU1VICYmIEJMT0NLCmRpZmYgLS1naXQgYS9pbml0L2NhbGlicmF0ZS5jIGIvaW5pdC9jYWxpYnJhdGUuYwppbmRleCBjZmQ3MDAwLi5hYWUyZjQwIDEwMDY0NAotLS0gYS9pbml0L2NhbGlicmF0ZS5jCisrKyBiL2luaXQvY2FsaWJyYXRlLmMKQEAgLTkzLDkgKzkzLDYgQEAKIAkJICogSWYgdGhlIHVwcGVyIGxpbWl0IGFuZCBsb3dlciBsaW1pdCBvZiB0aGUgdGltZXJfcmF0ZSBpcwogCQkgKiA+PSAxMi41JSBhcGFydCwgcmVkbyBjYWxpYnJhdGlvbi4KIAkJICovCi0JCXByaW50ayhLRVJOX0RFQlVHICJjYWxpYnJhdGVfZGVsYXlfZGlyZWN0KCkgdGltZXJfcmF0ZV9tYXg9JWx1ICIKLQkJCSAgICAidGltZXJfcmF0ZV9taW49JWx1IHByZV9zdGFydD0lbHUgcHJlX2VuZD0lbHVcbiIsCi0JCQkgIHRpbWVyX3JhdGVfbWF4LCB0aW1lcl9yYXRlX21pbiwgcHJlX3N0YXJ0LCBwcmVfZW5kKTsKIAkJaWYgKHN0YXJ0ID49IHBvc3RfZW5kKQogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJjYWxpYnJhdGVfZGVsYXlfZGlyZWN0KCkgaWdub3JpbmcgIgogCQkJCQkidGltZXJfcmF0ZSBhcyB3ZSBoYWQgYSBUU0Mgd3JhcCBhcm91bmQiCkBAIC0yNDgsMzAgKzI0NSwzMiBAQAogCiB2b2lkIF9fY3B1aW5pdCBjYWxpYnJhdGVfZGVsYXkodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGxwajsKIAlzdGF0aWMgYm9vbCBwcmludGVkOwogCiAJaWYgKHByZXNldF9scGopIHsKLQkJbG9vcHNfcGVyX2ppZmZ5ID0gcHJlc2V0X2xwajsKKwkJbHBqID0gcHJlc2V0X2xwajsKIAkJaWYgKCFwcmludGVkKQogCQkJcHJfaW5mbygiQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCkgIgogCQkJCSJwcmVzZXQgdmFsdWUuLiAiKTsKIAl9IGVsc2UgaWYgKCghcHJpbnRlZCkgJiYgbHBqX2ZpbmUpIHsKLQkJbG9vcHNfcGVyX2ppZmZ5ID0gbHBqX2ZpbmU7CisJCWxwaiA9IGxwal9maW5lOwogCQlwcl9pbmZvKCJDYWxpYnJhdGluZyBkZWxheSBsb29wIChza2lwcGVkKSwgIgogCQkJInZhbHVlIGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIgZnJlcXVlbmN5Li4gIik7Ci0JfSBlbHNlIGlmICgobG9vcHNfcGVyX2ppZmZ5ID0gY2FsaWJyYXRlX2RlbGF5X2RpcmVjdCgpKSAhPSAwKSB7CisJfSBlbHNlIGlmICgobHBqID0gY2FsaWJyYXRlX2RlbGF5X2RpcmVjdCgpKSAhPSAwKSB7CiAJCWlmICghcHJpbnRlZCkKIAkJCXByX2luZm8oIkNhbGlicmF0aW5nIGRlbGF5IHVzaW5nIHRpbWVyICIKIAkJCQkic3BlY2lmaWMgcm91dGluZS4uICIpOwogCX0gZWxzZSB7CiAJCWlmICghcHJpbnRlZCkKIAkJCXByX2luZm8oIkNhbGlicmF0aW5nIGRlbGF5IGxvb3AuLi4gIik7Ci0JCWxvb3BzX3Blcl9qaWZmeSA9IGNhbGlicmF0ZV9kZWxheV9jb252ZXJnZSgpOworCQlscGogPSBjYWxpYnJhdGVfZGVsYXlfY29udmVyZ2UoKTsKIAl9CiAJaWYgKCFwcmludGVkKQogCQlwcl9jb250KCIlbHUuJTAybHUgQm9nb01JUFMgKGxwaj0lbHUpXG4iLAotCQkJbG9vcHNfcGVyX2ppZmZ5Lyg1MDAwMDAvSFopLAotCQkJKGxvb3BzX3Blcl9qaWZmeS8oNTAwMC9IWikpICUgMTAwLCBsb29wc19wZXJfamlmZnkpOworCQkJbHBqLyg1MDAwMDAvSFopLAorCQkJKGxwai8oNTAwMC9IWikpICUgMTAwLCBscGopOwogCisJbG9vcHNfcGVyX2ppZmZ5ID0gbHBqOwogCXByaW50ZWQgPSB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBjYWZiYTY3Li5kNzIxMWZhIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNTQyLDYgKzU0Miw3IEBACiAJdGltZWtlZXBpbmdfaW5pdCgpOwogCXRpbWVfaW5pdCgpOwogCXByb2ZpbGVfaW5pdCgpOworCWNhbGxfZnVuY3Rpb25faW5pdCgpOwogCWlmICghaXJxc19kaXNhYmxlZCgpKQogCQlwcmludGsoS0VSTl9DUklUICJzdGFydF9rZXJuZWwoKTogYnVnOiBpbnRlcnJ1cHRzIHdlcmUgIgogCQkJCSAiZW5hYmxlZCBlYXJseVxuIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2NvcmUuYyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCmluZGV4IGQ4NjNiM2MuLjllZmU3MTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvY29yZS5jCisrKyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCkBAIC03NDAyLDI2ICs3NDAyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfY2dyb3VwX21vdmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIHZvaWQKK3BlcmZfY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAl0YXNrX2Z1bmN0aW9uX2NhbGwodGFzaywgX19wZXJmX2Nncm91cF9tb3ZlLCB0YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9jZ3JvdXBfYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCwKLQkJc3RydWN0IGNncm91cCAqb2xkX2NncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJYm9vbCB0aHJlYWRncm91cCkKLXsKLQlwZXJmX2Nncm91cF9tb3ZlKHRhc2spOwotCWlmICh0aHJlYWRncm91cCkgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmM7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYywgJnRhc2stPnRocmVhZF9ncm91cCwgdGhyZWFkX2dyb3VwKSB7Ci0JCQlwZXJmX2Nncm91cF9tb3ZlKGMpOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgcGVyZl9jZ3JvdXBfZXhpdChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJCXN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CkBAIC03NDMzLDcgKzc0MTksNyBAQAogCWlmICghKHRhc2stPmZsYWdzICYgUEZfRVhJVElORykpCiAJCXJldHVybjsKIAotCXBlcmZfY2dyb3VwX21vdmUodGFzayk7CisJcGVyZl9jZ3JvdXBfYXR0YWNoX3Rhc2soY2dycCwgdGFzayk7CiB9CiAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzIHBlcmZfc3Vic3lzID0gewpAQCAtNzQ0Miw2ICs3NDI4LDYgQEAKIAkuY3JlYXRlCQk9IHBlcmZfY2dyb3VwX2NyZWF0ZSwKIAkuZGVzdHJveQk9IHBlcmZfY2dyb3VwX2Rlc3Ryb3ksCiAJLmV4aXQJCT0gcGVyZl9jZ3JvdXBfZXhpdCwKLQkuYXR0YWNoCQk9IHBlcmZfY2dyb3VwX2F0dGFjaCwKKwkuYXR0YWNoX3Rhc2sJPSBwZXJmX2Nncm91cF9hdHRhY2hfdGFzaywKIH07CiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9QRVJGICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAyMGE0MDY0Li5mMmIzMjFiIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTU2MSwyOSArNTYxLDI4IEBACiAKICNpZmRlZiBDT05GSUdfTU1fT1dORVIKIC8qCi0gKiBUYXNrIHAgaXMgZXhpdGluZyBhbmQgaXQgb3duZWQgbW0sIGxldHMgZmluZCBhIG5ldyBvd25lciBmb3IgaXQKKyAqIEEgdGFzayBpcyBleGl0aW5nLiAgIElmIGl0IG93bmVkIHRoaXMgbW0sIGZpbmQgYSBuZXcgb3duZXIgZm9yIHRoZSBtbS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKLW1tX25lZWRfbmV3X293bmVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgb3RoZXIgdXNlcnMgb2YgdGhlIG1tIGFuZCB0aGUgb3duZXIgKHVzKSBpcyBleGl0aW5nCi0JICogd2UgbmVlZCB0byBmaW5kIGEgbmV3IG93bmVyIHRvIHRha2Ugb24gdGhlIHJlc3BvbnNpYmlsaXR5LgotCSAqLwotCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA8PSAxKQotCQlyZXR1cm4gMDsKLQlpZiAobW0tPm93bmVyICE9IHApCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCiB2b2lkIG1tX3VwZGF0ZV9uZXh0X293bmVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqYywgKmcsICpwID0gY3VycmVudDsKIAogcmV0cnk6Ci0JaWYgKCFtbV9uZWVkX25ld19vd25lcihtbSwgcCkpCisJLyoKKwkgKiBJZiB0aGUgZXhpdGluZyBvciBleGVjaW5nIHRhc2sgaXMgbm90IHRoZSBvd25lciwgaXQncworCSAqIHNvbWVvbmUgZWxzZSdzIHByb2JsZW0uCisJICovCisJaWYgKG1tLT5vd25lciAhPSBwKQogCQlyZXR1cm47CisJLyoKKwkgKiBUaGUgY3VycmVudCBvd25lciBpcyBleGl0aW5nL2V4ZWNpbmcgYW5kIHRoZXJlIGFyZSBubyBvdGhlcgorCSAqIGNhbmRpZGF0ZXMuICBEbyBub3QgbGVhdmUgdGhlIG1tIHBvaW50aW5nIHRvIGEgcG9zc2libHkKKwkgKiBmcmVlZCB0YXNrIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPD0gMSkgeworCQltbS0+b3duZXIgPSBOVUxMOworCQlyZXR1cm47CisJfQogCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkvKgpkaWZmIC0tZ2l0IGEva2VybmVsL2djb3YvS2NvbmZpZyBiL2tlcm5lbC9nY292L0tjb25maWcKaW5kZXggYjhjYWRmNy4uNWJmOTI0ZCAxMDA2NDQKLS0tIGEva2VybmVsL2djb3YvS2NvbmZpZworKysgYi9rZXJuZWwvZ2Nvdi9LY29uZmlnCkBAIC0yLDcgKzIsOCBAQAogCiBjb25maWcgR0NPVl9LRVJORUwKIAlib29sICJFbmFibGUgZ2Nvdi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nIgotCWRlcGVuZHMgb24gREVCVUdfRlMgJiYgQ09OU1RSVUNUT1JTCisJZGVwZW5kcyBvbiBERUJVR19GUworCXNlbGVjdCBDT05TVFJVQ1RPUlMKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb24gZW5hYmxlcyBnY292LWJhc2VkIGNvZGUgcHJvZmlsaW5nIChlLmcuIGZvciBjb2RlIGNvdmVyYWdlCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jIGIva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYwppbmRleCAzMWE5ZGI3Li4zYTJjYWI0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKQEAgLTEwMSwxMCArMTAxLDEwIEBACiB9CiAKIC8qKgotICogaXJxX2djX2FjayAtIEFjayBwZW5kaW5nIGludGVycnVwdAorICogaXJxX2djX2Fja19zZXRfYml0IC0gQWNrIHBlbmRpbmcgaW50ZXJydXB0IHZpYSBzZXR0aW5nIGJpdAogICogQGQ6IGlycV9kYXRhCiAgKi8KLXZvaWQgaXJxX2djX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit2b2lkIGlycV9nY19hY2tfc2V0X2JpdChzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJdTMyIG1hc2sgPSAxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpOwpAQCAtMTE1LDYgKzExNSwyMCBAQAogfQogCiAvKioKKyAqIGlycV9nY19hY2tfY2xyX2JpdCAtIEFjayBwZW5kaW5nIGludGVycnVwdCB2aWEgY2xlYXJpbmcgYml0CisgKiBAZDogaXJxX2RhdGEKKyAqLwordm9pZCBpcnFfZ2NfYWNrX2Nscl9iaXQoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiBtYXNrID0gfigxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpKTsKKworCWlycV9nY19sb2NrKGdjKTsKKwlpcnFfcmVnX3dyaXRlbChtYXNrLCBnYy0+cmVnX2Jhc2UgKyBjdXJfcmVncyhkKS0+YWNrKTsKKwlpcnFfZ2NfdW5sb2NrKGdjKTsKK30KKworLyoqCiAgKiBpcnFfZ2NfbWFza19kaXNhYmxlX3JlZ19hbmRfYWNrLSBNYXNrIGFuZCBhY2sgcGVuZGluZyBpbnRlcnJ1cHQKICAqIEBkOiBpcnFfZGF0YQogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2hhbmRsZS5jIGIva2VybmVsL2lycS9oYW5kbGUuYwppbmRleCA5MGNiNTVmLi40NzBkMDhjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2hhbmRsZS5jCisrKyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKQEAgLTEzMywxMiArMTMzLDYgQEAKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSBJUlFfV0FLRV9USFJFQUQ6CiAJCQkvKgotCQkJICogU2V0IHJlc3VsdCB0byBoYW5kbGVkIHNvIHRoZSBzcHVyaW91cyBjaGVjawotCQkJICogZG9lcyBub3QgdHJpZ2dlci4KLQkJCSAqLwotCQkJcmVzID0gSVJRX0hBTkRMRUQ7Ci0KLQkJCS8qCiAJCQkgKiBDYXRjaCBkcml2ZXJzIHdoaWNoIHJldHVybiBXQUtFX1RIUkVBRCBidXQKIAkJCSAqIGRpZCBub3Qgc2V0IHVwIGEgdGhyZWFkIGZ1bmN0aW9uCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZGVzYy5jIGIva2VybmVsL2lycS9pcnFkZXNjLmMKaW5kZXggODg2ZTgwMy4uNGM2MGE1MCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pcnFkZXNjLmMKKysrIGIva2VybmVsL2lycS9pcnFkZXNjLmMKQEAgLTI1NywxMyArMjU3LDExIEBACiAJY291bnQgPSBBUlJBWV9TSVpFKGlycV9kZXNjKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWRlc2NbaV0uaXJxX2RhdGEuaXJxID0gaTsKLQkJZGVzY1tpXS5pcnFfZGF0YS5jaGlwID0gJm5vX2lycV9jaGlwOwogCQlkZXNjW2ldLmtzdGF0X2lycXMgPSBhbGxvY19wZXJjcHUodW5zaWduZWQgaW50KTsKLQkJaXJxX3NldHRpbmdzX2Nscl9hbmRfc2V0KGRlc2MsIH4wLCBfSVJRX0RFRkFVTFRfSU5JVF9GTEFHUyk7Ci0JCWFsbG9jX21hc2tzKGRlc2MgKyBpLCBHRlBfS0VSTkVMLCBub2RlKTsKLQkJZGVzY19zbXBfaW5pdChkZXNjICsgaSwgbm9kZSk7CisJCWFsbG9jX21hc2tzKCZkZXNjW2ldLCBHRlBfS0VSTkVMLCBub2RlKTsKKwkJcmF3X3NwaW5fbG9ja19pbml0KCZkZXNjW2ldLmxvY2spOwogCQlsb2NrZGVwX3NldF9jbGFzcygmZGVzY1tpXS5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7CisJCWRlc2Nfc2V0X2RlZmF1bHRzKGksICZkZXNjW2ldLCBub2RlKTsKIAl9CiAJcmV0dXJuIGFyY2hfZWFybHlfaXJxX2luaXQoKTsKIH0KQEAgLTM0Niw2ICszNDQsMTIgQEAKIAlpZiAoIWNudCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoaXJxID49IDApIHsKKwkJaWYgKGZyb20gPiBpcnEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZnJvbSA9IGlycTsKKwl9CisKIAltdXRleF9sb2NrKCZzcGFyc2VfaXJxX2xvY2spOwogCiAJc3RhcnQgPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYShhbGxvY2F0ZWRfaXJxcywgSVJRX0JJVE1BUF9CSVRTLApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggZjdjZTAwMi4uMGE3ODQwYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtNDkxLDYgKzQ5MSw5IEBACiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2dldF9kZXNjX2J1c2xvY2soaXJxLCAmZmxhZ3MpOwogCWludCByZXQgPSAwOwogCisJaWYgKCFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIHdha2V1cC1jYXBhYmxlIGlycXMgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGRyaXZlcnMgdGhhdAogCSAqIGRvbid0IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSBzbGVlcCBtb2RlIGJlaGF2aW9ycy4KIAkgKi8KQEAgLTcyMywxMyArNzI2LDE2IEBACiAgKiBjb250ZXh0LiBTbyB3ZSBuZWVkIHRvIGRpc2FibGUgYmggaGVyZSB0byBhdm9pZCBkZWFkbG9ja3MgYW5kIG90aGVyCiAgKiBzaWRlIGVmZmVjdHMuCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaXJxcmV0dXJuX3QKIGlycV9mb3JjZWRfdGhyZWFkX2ZuKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogeworCWlycXJldHVybl90IHJldDsKKwogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlhY3Rpb24tPnRocmVhZF9mbihhY3Rpb24tPmlycSwgYWN0aW9uLT5kZXZfaWQpOworCXJldCA9IGFjdGlvbi0+dGhyZWFkX2ZuKGFjdGlvbi0+aXJxLCBhY3Rpb24tPmRldl9pZCk7CiAJaXJxX2ZpbmFsaXplX29uZXNob3QoZGVzYywgYWN0aW9uLCBmYWxzZSk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTczNywxMCArNzQzLDE0IEBACiAgKiBwcmVlbXRpYmxlIC0gbWFueSBvZiB0aGVtIG5lZWQgdG8gc2xlZXAgYW5kIHdhaXQgZm9yIHNsb3cgYnVzc2VzIHRvCiAgKiBjb21wbGV0ZS4KICAqLwotc3RhdGljIHZvaWQgaXJxX3RocmVhZF9mbihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfdGhyZWFkX2ZuKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKKwkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogewotCWFjdGlvbi0+dGhyZWFkX2ZuKGFjdGlvbi0+aXJxLCBhY3Rpb24tPmRldl9pZCk7CisJaXJxcmV0dXJuX3QgcmV0OworCisJcmV0ID0gYWN0aW9uLT50aHJlYWRfZm4oYWN0aW9uLT5pcnEsIGFjdGlvbi0+ZGV2X2lkKTsKIAlpcnFfZmluYWxpemVfb25lc2hvdChkZXNjLCBhY3Rpb24sIGZhbHNlKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNzUzLDcgKzc2Myw4IEBACiAJfTsKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24gPSBkYXRhOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGFjdGlvbi0+aXJxKTsKLQl2b2lkICgqaGFuZGxlcl9mbikoc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOworCWlycXJldHVybl90ICgqaGFuZGxlcl9mbikoc3RydWN0IGlycV9kZXNjICpkZXNjLAorCQkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKIAlpbnQgd2FrZTsKIAogCWlmIChmb3JjZV9pcnF0aHJlYWRzICYgdGVzdF9iaXQoSVJRVEZfRk9SQ0VEX1RIUkVBRCwKQEAgLTc4Myw4ICs3OTQsMTIgQEAKIAkJCWRlc2MtPmlzdGF0ZSB8PSBJUlFTX1BFTkRJTkc7CiAJCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKIAkJfSBlbHNlIHsKKwkJCWlycXJldHVybl90IGFjdGlvbl9yZXQ7CisKIAkJCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOwotCQkJaGFuZGxlcl9mbihkZXNjLCBhY3Rpb24pOworCQkJYWN0aW9uX3JldCA9IGhhbmRsZXJfZm4oZGVzYywgYWN0aW9uKTsKKwkJCWlmICghbm9pcnFkZWJ1ZykKKwkJCQlub3RlX2ludGVycnVwdChhY3Rpb24tPmlycSwgZGVzYywgYWN0aW9uX3JldCk7CiAJCX0KIAogCQl3YWtlID0gYXRvbWljX2RlY19hbmRfdGVzdCgmZGVzYy0+dGhyZWFkc19hY3RpdmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9zcHVyaW91cy5jIGIva2VybmVsL2lycS9zcHVyaW91cy5jCmluZGV4IGRmYmQ1NTAuLmFhNTdkNWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYworKysgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKQEAgLTE2Nyw2ICsxNjcsMTMgQEAKIAkJICBqaWZmaWVzICsgUE9MTF9TUFVSSU9VU19JUlFfSU5URVJWQUwpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBiYWRfYWN0aW9uX3JldChpcnFyZXR1cm5fdCBhY3Rpb25fcmV0KQoreworCWlmIChsaWtlbHkoYWN0aW9uX3JldCA8PSAoSVJRX0hBTkRMRUQgfCBJUlFfV0FLRV9USFJFQUQpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiBJZiA5OSw5MDAgb2YgdGhlIHByZXZpb3VzIDEwMCwwMDAgaW50ZXJydXB0cyBoYXZlIG5vdCBiZWVuIGhhbmRsZWQKICAqIHRoZW4gYXNzdW1lIHRoYXQgdGhlIElSUSBpcyBzdHVjayBpbiBzb21lIG1hbm5lci4gRHJvcCBhIGRpYWdub3N0aWMKQEAgLTE4Miw3ICsxODksNyBAQAogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGFjdGlvbl9yZXQgIT0gSVJRX0hBTkRMRUQgJiYgYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkgeworCWlmIChiYWRfYWN0aW9uX3JldChhY3Rpb25fcmV0KSkgewogCQlwcmludGsoS0VSTl9FUlIgImlycSBldmVudCAlZDogYm9ndXMgcmV0dXJuIHZhbHVlICV4XG4iLAogCQkJCWlycSwgYWN0aW9uX3JldCk7CiAJfSBlbHNlIHsKQEAgLTIwMSwxMCArMjA4LDExIEBACiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAJYWN0aW9uID0gZGVzYy0+YWN0aW9uOwogCXdoaWxlIChhY3Rpb24pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJbPCVwPl0iLCBhY3Rpb24tPmhhbmRsZXIpOwotCQlwcmludF9zeW1ib2woIiAoJXMpIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFjdGlvbi0+aGFuZGxlcik7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJbPCVwPl0gJXBmIiwgYWN0aW9uLT5oYW5kbGVyLCBhY3Rpb24tPmhhbmRsZXIpOworCQlpZiAoYWN0aW9uLT50aHJlYWRfZm4pCisJCQlwcmludGsoS0VSTl9DT05UICIgdGhyZWFkZWQgWzwlcD5dICVwZiIsCisJCQkJCWFjdGlvbi0+dGhyZWFkX2ZuLCBhY3Rpb24tPnRocmVhZF9mbik7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJCWFjdGlvbiA9IGFjdGlvbi0+bmV4dDsKIAl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKQEAgLTI2Miw3ICsyNzAsMTYgQEAKIAlpZiAoZGVzYy0+aXN0YXRlICYgSVJRU19QT0xMX0lOUFJPR1JFU1MpCiAJCXJldHVybjsKIAotCWlmICh1bmxpa2VseShhY3Rpb25fcmV0ICE9IElSUV9IQU5ETEVEKSkgeworCS8qIHdlIGdldCBoZXJlIGFnYWluIHZpYSB0aGUgdGhyZWFkZWQgaGFuZGxlciAqLworCWlmIChhY3Rpb25fcmV0ID09IElSUV9XQUtFX1RIUkVBRCkKKwkJcmV0dXJuOworCisJaWYgKGJhZF9hY3Rpb25fcmV0KGFjdGlvbl9yZXQpKSB7CisJCXJlcG9ydF9iYWRfaXJxKGlycSwgZGVzYywgYWN0aW9uX3JldCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoYWN0aW9uX3JldCA9PSBJUlFfTk9ORSkpIHsKIAkJLyoKIAkJICogSWYgd2UgYXJlIHNlZWluZyBvbmx5IHRoZSBvZGQgc3B1cmlvdXMgSVJRIGNhdXNlZCBieQogCQkgKiBidXMgYXN5bmNocm9uaWNpdHkgdGhlbiBkb24ndCBldmVudHVhbGx5IHRyaWdnZXIgYW4gZXJyb3IsCkBAIC0yNzQsOCArMjkxLDYgQEAKIAkJZWxzZQogCQkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKIAkJZGVzYy0+bGFzdF91bmhhbmRsZWQgPSBqaWZmaWVzOwotCQlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkpCi0JCQlyZXBvcnRfYmFkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOwogCX0KIAogCWlmICh1bmxpa2VseSh0cnlfbWlzcm91dGVkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpKSkgewpkaWZmIC0tZ2l0IGEva2VybmVsL2p1bXBfbGFiZWwuYyBiL2tlcm5lbC9qdW1wX2xhYmVsLmMKaW5kZXggZmEyN2U3NS4uYThjZTQ1MCAxMDA2NDQKLS0tIGEva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9rZXJuZWwvanVtcF9sYWJlbC5jCkBAIC0zNzUsMTUgKzM3NSwxOSBAQAogCiBzdGF0aWMgdm9pZCBqdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwgaW50IGVuYWJsZSkKIHsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnkgPSBrZXktPmVudHJpZXM7Ci0KLQkvKiBpZiB0aGVyZSBhcmUgbm8gdXNlcnMsIGVudHJ5IGNhbiBiZSBOVUxMICovCi0JaWYgKGVudHJ5KQotCQlfX2p1bXBfbGFiZWxfdXBkYXRlKGtleSwgZW50cnksIF9fc3RvcF9fX2p1bXBfdGFibGUsIGVuYWJsZSk7CisJc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5ID0ga2V5LT5lbnRyaWVzLCAqc3RvcCA9IF9fc3RvcF9fX2p1bXBfdGFibGU7CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUworCXN0cnVjdCBtb2R1bGUgKm1vZCA9IF9fbW9kdWxlX2FkZHJlc3MoKGp1bXBfbGFiZWxfdClrZXkpOworCiAJX19qdW1wX2xhYmVsX21vZF91cGRhdGUoa2V5LCBlbmFibGUpOworCisJaWYgKG1vZCkKKwkJc3RvcCA9IG1vZC0+anVtcF9lbnRyaWVzICsgbW9kLT5udW1fanVtcF9lbnRyaWVzOwogI2VuZGlmCisJLyogaWYgdGhlcmUgYXJlIG5vIHVzZXJzLCBlbnRyeSBjYW4gYmUgTlVMTCAqLworCWlmIChlbnRyeSkKKwkJX19qdW1wX2xhYmVsX3VwZGF0ZShrZXksIGVudHJ5LCBzdG9wLCBlbmFibGUpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9rbW9kLmMgYi9rZXJuZWwva21vZC5jCmluZGV4IGFkNmE4MWMuLjQ3NjEzZGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rbW9kLmMKKysrIGIva2VybmVsL2ttb2QuYwpAQCAtMTU2LDEyICsxNTYsNiBAQAogCSAqLwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMCk7CiAKLQlpZiAoc3ViX2luZm8tPmluaXQpIHsKLQkJcmV0dmFsID0gc3ViX2luZm8tPmluaXQoc3ViX2luZm8pOwotCQlpZiAocmV0dmFsKQotCQkJZ290byBmYWlsOwotCX0KLQogCXJldHZhbCA9IC1FTk9NRU07CiAJbmV3ID0gcHJlcGFyZV9rZXJuZWxfY3JlZChjdXJyZW50KTsKIAlpZiAoIW5ldykKQEAgLTE3Myw2ICsxNjcsMTQgQEAKIAkJCQkJICAgICBuZXctPmNhcF9pbmhlcml0YWJsZSk7CiAJc3Bpbl91bmxvY2soJnVtaF9zeXNjdGxfbG9jayk7CiAKKwlpZiAoc3ViX2luZm8tPmluaXQpIHsKKwkJcmV0dmFsID0gc3ViX2luZm8tPmluaXQoc3ViX2luZm8sIG5ldyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWFib3J0X2NyZWRzKG5ldyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKIAljb21taXRfY3JlZHMobmV3KTsKIAogCXJldHZhbCA9IGtlcm5lbF9leGVjdmUoc3ViX2luZm8tPnBhdGgsCkBAIC0zODgsNyArMzkwLDcgQEAKICAqIGNvbnRleHQgaW4gd2hpY2ggY2FsbF91c2VybW9kZWhlbHBlcl9leGVjIGlzIGNhbGxlZC4KICAqLwogdm9pZCBjYWxsX3VzZXJtb2RlaGVscGVyX3NldGZucyhzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLAotCQkgICAgaW50ICgqaW5pdCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbyksCisJCSAgICBpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqbmV3KSwKIAkJICAgIHZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKSwKIAkJICAgIHZvaWQgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCA2MzQzN2QwLi4yOThjOTI3IDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTM0MjYsNyArMzQyNiw3IEBACiAJaW50IHJldCA9IDA7CiAKIAlpZiAodW5saWtlbHkoY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24pKQotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gMTsgLyogYXZvaWQgZmFsc2UgbmVnYXRpdmUgbG9ja2RlcF9hc3NlcnRfaGVsZCgpICovCiAKIAlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWNoZWNrX2ZsYWdzKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKaW5kZXggYWNlNTU4OC4uMDZlZmE1NCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKKysrIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKQEAgLTEyMTEsNyArMTIxMSwxMSBAQAogCQl0b19mcmVlX2hpZ2htZW0gPSBhbGxvY19oaWdobWVtIC0gc2F2ZTsKIAl9IGVsc2UgewogCQl0b19mcmVlX2hpZ2htZW0gPSAwOwotCQl0b19mcmVlX25vcm1hbCAtPSBzYXZlIC0gYWxsb2NfaGlnaG1lbTsKKwkJc2F2ZSAtPSBhbGxvY19oaWdobWVtOworCQlpZiAodG9fZnJlZV9ub3JtYWwgPiBzYXZlKQorCQkJdG9fZnJlZV9ub3JtYWwgLT0gc2F2ZTsKKwkJZWxzZQorCQkJdG9fZnJlZV9ub3JtYWwgPSAwOwogCX0KIAogCW1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldCgmY29weV9ibSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5jIGIva2VybmVsL3Bvd2VyL3VzZXIuYwppbmRleCA3ZDAyZDMzLi40MmRkYmM2IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvdXNlci5jCisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmMKQEAgLTExMyw4ICsxMTMsMTAgQEAKIAkJaWYgKGVycm9yKQogCQkJcG1fbm90aWZpZXJfY2FsbF9jaGFpbihQTV9QT1NUX1JFU1RPUkUpOwogCX0KLQlpZiAoZXJyb3IpCisJaWYgKGVycm9yKSB7CisJCWZyZWVfYmFzaWNfbWVtb3J5X2JpdG1hcHMoKTsKIAkJYXRvbWljX2luYygmc25hcHNob3RfZGV2aWNlX2F2YWlsYWJsZSk7CisJfQogCWRhdGEtPmZyb3plbiA9IDA7CiAJZGF0YS0+cmVhZHkgPSAwOwogCWRhdGEtPnBsYXRmb3JtX3N1cHBvcnQgPSAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuYyBiL2tlcm5lbC9yY3V0cmVlLmMKaW5kZXggNzdhNzY3MS4uYmEwNjIwNyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWUuYworKysgYi9rZXJuZWwvcmN1dHJlZS5jCkBAIC04NCwxMCArODQsMzUgQEAKIAogc3RhdGljIHN0cnVjdCByY3Vfc3RhdGUgKnJjdV9zdGF0ZTsKIAorLyoKKyAqIFRoZSByY3Vfc2NoZWR1bGVyX2FjdGl2ZSB2YXJpYWJsZSB0cmFuc2l0aW9ucyBmcm9tIHplcm8gdG8gb25lIGp1c3QKKyAqIGJlZm9yZSB0aGUgZmlyc3QgdGFzayBpcyBzcGF3bmVkLiAgU28gd2hlbiB0aGlzIHZhcmlhYmxlIGlzIHplcm8sIFJDVQorICogY2FuIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGJ1dCBvbmUgdGFzaywgYWxsb3dpbmcgUkNVIHRvIChmb3IgZXhhbXBsZSkKKyAqIG9wdGltaXplZCBzeW5jaHJvbml6ZV9zY2hlZCgpIHRvIGEgc2ltcGxlIGJhcnJpZXIoKS4gIFdoZW4gdGhpcyB2YXJpYWJsZQorICogaXMgb25lLCBSQ1UgbXVzdCBhY3R1YWxseSBkbyBhbGwgdGhlIGhhcmQgd29yayByZXF1aXJlZCB0byBkZXRlY3QgcmVhbAorICogZ3JhY2UgcGVyaW9kcy4gIFRoaXMgdmFyaWFibGUgaXMgYWxzbyB1c2VkIHRvIHN1cHByZXNzIGJvb3QtdGltZSBmYWxzZQorICogcG9zaXRpdmVzIGZyb20gbG9ja2RlcC1SQ1UgZXJyb3IgY2hlY2tpbmcuCisgKi8KIGludCByY3Vfc2NoZWR1bGVyX2FjdGl2ZSBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTF9HUEwocmN1X3NjaGVkdWxlcl9hY3RpdmUpOwogCiAvKgorICogVGhlIHJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlIHZhcmlhYmxlIHRyYW5zaXRpb25zIGZyb20gemVybyB0byBvbmUKKyAqIGR1cmluZyB0aGUgZWFybHlfaW5pdGNhbGwoKSBwcm9jZXNzaW5nLCB3aGljaCBpcyBhZnRlciB0aGUgc2NoZWR1bGVyCisgKiBpcyBjYXBhYmxlIG9mIGNyZWF0aW5nIG5ldyB0YXNrcy4gIFNvIFJDVSBwcm9jZXNzaW5nIChmb3IgZXhhbXBsZSwKKyAqIGNyZWF0aW5nIHRhc2tzIGZvciBSQ1UgcHJpb3JpdHkgYm9vc3RpbmcpIG11c3QgYmUgZGVsYXllZCB1bnRpbCBhZnRlcgorICogcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgdHJhbnNpdGlvbnMgZnJvbSB6ZXJvIHRvIG9uZS4gIFdlIGFsc28KKyAqIGN1cnJlbnRseSBkZWxheSBpbnZvY2F0aW9uIG9mIGFueSBSQ1UgY2FsbGJhY2tzIHVudGlsIGFmdGVyIHRoaXMgcG9pbnQuCisgKgorICogSXQgbWlnaHQgbGF0ZXIgcHJvdmUgYmV0dGVyIGZvciBwZW9wbGUgcmVnaXN0ZXJpbmcgUkNVIGNhbGxiYWNrcyBkdXJpbmcKKyAqIGVhcmx5IGJvb3QgdG8gdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlc2UgY2FsbGJhY2tzLCBidXQgb25lIHN0ZXAgYXQKKyAqIGEgdGltZS4KKyAqLworc3RhdGljIGludCByY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSBfX3JlYWRfbW9zdGx5OworCisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCisvKgogICogQ29udHJvbCB2YXJpYWJsZXMgZm9yIHBlci1DUFUgYW5kIHBlci1yY3Vfbm9kZSBrdGhyZWFkcy4gIFRoZXNlCiAgKiBoYW5kbGUgYWxsIGZsYXZvcnMgb2YgUkNVLgogICovCkBAIC05NiwxMCArMTIxLDEyIEBACiBERUZJTkVfUEVSX0NQVShpbnQsIHJjdV9jcHVfa3RocmVhZF9jcHUpOwogREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCByY3VfY3B1X2t0aHJlYWRfbG9vcHMpOwogREVGSU5FX1BFUl9DUFUoY2hhciwgcmN1X2NwdV9oYXNfd29yayk7Ci1zdGF0aWMgY2hhciByY3Vfa3RocmVhZHNfc3Bhd25hYmxlOworCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIAogc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KTsKLXN0YXRpYyB2b2lkIGludm9rZV9yY3VfY3B1X2t0aHJlYWQodm9pZCk7CitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NvcmUodm9pZCk7CitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NhbGxiYWNrcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3VfZGF0YSAqcmRwKTsKIAogI2RlZmluZSBSQ1VfS1RIUkVBRF9QUklPIDEJLyogUlQgcHJpb3JpdHkgZm9yIHBlci1DUFUga3RocmVhZHMuICovCiAKQEAgLTEwODgsMTQgKzExMTUsOCBAQAogCWludCBuZWVkX3JlcG9ydCA9IDA7CiAJc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyc3AtPnJkYSwgY3B1KTsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CiAKLQkvKiBTdG9wIHRoZSBDUFUncyBrdGhyZWFkLiAqLwotCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOwotCWlmICh0ICE9IE5VTEwpIHsKLQkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSA9IE5VTEw7Ci0JCWt0aHJlYWRfc3RvcCh0KTsKLQl9CisJcmN1X3N0b3BfY3B1X2t0aHJlYWQoY3B1KTsKIAogCS8qIEV4Y2x1ZGUgYW55IGF0dGVtcHRzIHRvIHN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZC4gKi8KIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJzcC0+b25vZmZsb2NrLCBmbGFncyk7CkBAIC0xMjMxLDcgKzEyNTIsNyBAQAogCiAJLyogUmUtcmFpc2UgdGhlIFJDVSBzb2Z0aXJxIGlmIHRoZXJlIGFyZSBjYWxsYmFja3MgcmVtYWluaW5nLiAqLwogCWlmIChjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2UocmRwKSkKLQkJaW52b2tlX3JjdV9jcHVfa3RocmVhZCgpOworCQlpbnZva2VfcmN1X2NvcmUoKTsKIH0KIAogLyoKQEAgLTEyNzcsNyArMTI5OCw3IEBACiAJfQogCXJjdV9wcmVlbXB0X2NoZWNrX2NhbGxiYWNrcyhjcHUpOwogCWlmIChyY3VfcGVuZGluZyhjcHUpKQotCQlpbnZva2VfcmN1X2NwdV9rdGhyZWFkKCk7CisJCWludm9rZV9yY3VfY29yZSgpOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMTQ0MiwxMyArMTQ2MywxNCBAQAogCX0KIAogCS8qIElmIHRoZXJlIGFyZSBjYWxsYmFja3MgcmVhZHksIGludm9rZSB0aGVtLiAqLwotCXJjdV9kb19iYXRjaChyc3AsIHJkcCk7CisJaWYgKGNwdV9oYXNfY2FsbGJhY2tzX3JlYWR5X3RvX2ludm9rZShyZHApKQorCQlpbnZva2VfcmN1X2NhbGxiYWNrcyhyc3AsIHJkcCk7CiB9CiAKIC8qCiAgKiBEbyBzb2Z0aXJxIHByb2Nlc3NpbmcgZm9yIHRoZSBjdXJyZW50IENQVS4KICAqLwotc3RhdGljIHZvaWQgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKHZvaWQpCitzdGF0aWMgdm9pZCByY3VfcHJvY2Vzc19jYWxsYmFja3Moc3RydWN0IHNvZnRpcnFfYWN0aW9uICp1bnVzZWQpCiB7CiAJX19yY3VfcHJvY2Vzc19jYWxsYmFja3MoJnJjdV9zY2hlZF9zdGF0ZSwKIAkJCQkmX19nZXRfY3B1X3ZhcihyY3Vfc2NoZWRfZGF0YSkpOwpAQCAtMTQ2NSwzMzAgKzE0ODcsMjIgQEAKICAqIHRoZSBjdXJyZW50IENQVSB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIHRoZSByY3VfY3B1X2t0aHJlYWRfdGFzawogICogY2Fubm90IGRpc2FwcGVhciBvdXQgZnJvbSB1bmRlciB1cy4KICAqLwotc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jcHVfa3RocmVhZCh2b2lkKQorc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Moc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9fdGhpc19jcHVfd3JpdGUocmN1X2NwdV9oYXNfd29yaywgMSk7Ci0JaWYgKF9fdGhpc19jcHVfcmVhZChyY3VfY3B1X2t0aHJlYWRfdGFzaykgPT0gTlVMTCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJaWYgKHVubGlrZWx5KCFBQ0NFU1NfT05DRShyY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSkpKQorCQlyZXR1cm47CisJaWYgKGxpa2VseSghcnNwLT5ib29zdCkpIHsKKwkJcmN1X2RvX2JhdGNoKHJzcCwgcmRwKTsKIAkJcmV0dXJuOwogCX0KLQl3YWtlX3VwX3Byb2Nlc3MoX190aGlzX2NwdV9yZWFkKHJjdV9jcHVfa3RocmVhZF90YXNrKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWludm9rZV9yY3VfY2FsbGJhY2tzX2t0aHJlYWQoKTsKIH0KIAotLyoKLSAqIFdha2UgdXAgdGhlIHNwZWNpZmllZCBwZXItcmN1X25vZGUtc3RydWN0dXJlIGt0aHJlYWQuCi0gKiBCZWNhdXNlIHRoZSBwZXItcmN1X25vZGUga3RocmVhZHMgYXJlIGltbW9ydGFsLCB3ZSBkb24ndCBuZWVkCi0gKiB0byBkbyBhbnl0aGluZyB0byBrZWVwIHRoZW0gYWxpdmUuCi0gKi8KLXN0YXRpYyB2b2lkIGludm9rZV9yY3Vfbm9kZV9rdGhyZWFkKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQorc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jb3JlKHZvaWQpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0OwotCi0JdCA9IHJucC0+bm9kZV9rdGhyZWFkX3Rhc2s7Ci0JaWYgKHQgIT0gTlVMTCkKLQkJd2FrZV91cF9wcm9jZXNzKHQpOworCXJhaXNlX3NvZnRpcnEoUkNVX1NPRlRJUlEpOwogfQogCi0vKgotICogU2V0IHRoZSBzcGVjaWZpZWQgQ1BVJ3Mga3RocmVhZCB0byBydW4gUlQgb3Igbm90LCBhcyBzcGVjaWZpZWQgYnkKLSAqIHRoZSB0b19ydCBhcmd1bWVudC4gIFRoZSBDUFUtaG90cGx1ZyBsb2NrcyBhcmUgaGVsZCwgc28gdGhlIHRhc2sKLSAqIGlzIG5vdCBnb2luZyBhd2F5LgotICovCi1zdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KQotewotCWludCBwb2xpY3k7Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOwotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAodG9fcnQpIHsKLQkJcG9saWN5ID0gU0NIRURfRklGTzsKLQkJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOwotCX0gZWxzZSB7Ci0JCXBvbGljeSA9IFNDSEVEX05PUk1BTDsKLQkJc3Auc2NoZWRfcHJpb3JpdHkgPSAwOwotCX0KLQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBwb2xpY3ksICZzcCk7Ci19Ci0KLS8qCi0gKiBUaW1lciBoYW5kbGVyIHRvIGluaXRpYXRlIHRoZSB3YWtpbmcgdXAgb2YgcGVyLUNQVSBrdGhyZWFkcyB0aGF0Ci0gKiBoYXZlIHlpZWxkZWQgdGhlIENQVSBkdWUgdG8gZXhjZXNzIG51bWJlcnMgb2YgUkNVIGNhbGxiYWNrcy4KLSAqIFdlIHdha2UgdXAgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkLCB3aGljaCBpbiB0dXJuIHdpbGwgd2FrZSB1cAotICogdGhlIGJvb3N0ZXIga3RocmVhZC4KLSAqLwotc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocmN1X3N0YXRlLT5yZGEsIGFyZyk7Ci0Jc3RydWN0IHJjdV9ub2RlICpybnAgPSByZHAtPm15bm9kZTsKLQotCWF0b21pY19vcihyZHAtPmdycG1hc2ssICZybnAtPndha2VtYXNrKTsKLQlpbnZva2VfcmN1X25vZGVfa3RocmVhZChybnApOwotfQotCi0vKgotICogRHJvcCB0byBub24tcmVhbC10aW1lIHByaW9yaXR5IGFuZCB5aWVsZCwgYnV0IG9ubHkgYWZ0ZXIgcG9zdGluZyBhCi0gKiB0aW1lciB0aGF0IHdpbGwgY2F1c2UgdXMgdG8gcmVnYWluIG91ciByZWFsLXRpbWUgcHJpb3JpdHkgaWYgd2UKLSAqIHJlbWFpbiBwcmVlbXB0ZWQuICBFaXRoZXIgd2F5LCB3ZSByZXN0b3JlIG91ciByZWFsLXRpbWUgcHJpb3JpdHkKLSAqIGJlZm9yZSByZXR1cm5pbmcuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV95aWVsZCh2b2lkICgqZikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKLQlzdHJ1Y3QgdGltZXJfbGlzdCB5aWVsZF90aW1lcjsKLQotCXNldHVwX3RpbWVyX29uX3N0YWNrKCZ5aWVsZF90aW1lciwgZiwgYXJnKTsKLQltb2RfdGltZXIoJnlpZWxkX3RpbWVyLCBqaWZmaWVzICsgMik7Ci0Jc3Auc2NoZWRfcHJpb3JpdHkgPSAwOwotCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKGN1cnJlbnQsIFNDSEVEX05PUk1BTCwgJnNwKTsKLQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQlzY2hlZHVsZSgpOwotCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKLQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LCBTQ0hFRF9GSUZPLCAmc3ApOwotCWRlbF90aW1lcigmeWllbGRfdGltZXIpOwotfQotCi0vKgotICogSGFuZGxlIGNhc2VzIHdoZXJlIHRoZSByY3VfY3B1X2t0aHJlYWQoKSBlbmRzIHVwIG9uIHRoZSB3cm9uZyBDUFUuCi0gKiBUaGlzIGNhbiBoYXBwZW4gd2hpbGUgdGhlIGNvcnJlc3BvbmRpbmcgQ1BVIGlzIGVpdGhlciBjb21pbmcgb25saW5lCi0gKiBvciBnb2luZyBvZmZsaW5lLiAgV2UgY2Fubm90IHdhaXQgdW50aWwgdGhlIENQVSBpcyBmdWxseSBvbmxpbmUKLSAqIGJlZm9yZSBzdGFydGluZyB0aGUga3RocmVhZCwgYmVjYXVzZSB0aGUgdmFyaW91cyBub3RpZmllciBmdW5jdGlvbnMKLSAqIGNhbiB3YWl0IGZvciBSQ1UgZ3JhY2UgcGVyaW9kcy4gIFNvIHdlIHBhcmsgcmN1X2NwdV9rdGhyZWFkKCkgdW50aWwKLSAqIHRoZSBjb3JyZXNwb25kaW5nIENQVSBpcyBvbmxpbmUuCi0gKgotICogUmV0dXJuIDEgaWYgdGhlIGt0aHJlYWQgbmVlZHMgdG8gc3RvcCwgMCBvdGhlcndpc2UuCi0gKgotICogQ2FsbGVyIG11c3QgZGlzYWJsZSBiaC4gIFRoaXMgZnVuY3Rpb24gY2FuIG1vbWVudGFyaWx5IGVuYWJsZSBpdC4KLSAqLwotc3RhdGljIGludCByY3VfY3B1X2t0aHJlYWRfc2hvdWxkX3N0b3AoaW50IGNwdSkKLXsKLQl3aGlsZSAoY3B1X2lzX29mZmxpbmUoY3B1KSB8fAotCSAgICAgICAhY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpIHx8Ci0JICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpIHsKLQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJCXJldHVybiAxOwotCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsIGNwdSkgPSBSQ1VfS1RIUkVBRF9PRkZDUFU7Ci0JCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWxvY2FsX2JoX2VuYWJsZSgpOwotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQkJaWYgKCFjcHVtYXNrX2VxdWFsKCZjdXJyZW50LT5jcHVzX2FsbG93ZWQsIGNwdW1hc2tfb2YoY3B1KSkpCi0JCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKGNwdSkpOwotCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JfQotCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IGNwdTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFBlci1DUFUga2VybmVsIHRocmVhZCB0aGF0IGludm9rZXMgUkNVIGNhbGxiYWNrcy4gIFRoaXMgcmVwbGFjZXMgdGhlCi0gKiBlYXJsaWVyIFJDVSBzb2Z0aXJxLgotICovCi1zdGF0aWMgaW50IHJjdV9jcHVfa3RocmVhZCh2b2lkICphcmcpCi17Ci0JaW50IGNwdSA9IChpbnQpKGxvbmcpYXJnOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHNwaW5jbnQgPSAwOwotCXVuc2lnbmVkIGludCAqc3RhdHVzcCA9ICZwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsIGNwdSk7Ci0JY2hhciB3b3JrOwotCWNoYXIgKndvcmtwID0gJnBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgY3B1KTsKLQotCWZvciAoOzspIHsKLQkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9XQUlUSU5HOwotCQlyY3Vfd2FpdCgqd29ya3AgIT0gMCB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwotCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCWlmIChyY3VfY3B1X2t0aHJlYWRfc2hvdWxkX3N0b3AoY3B1KSkgewotCQkJbG9jYWxfYmhfZW5hYmxlKCk7Ci0JCQlicmVhazsKLQkJfQotCQkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1JVTk5JTkc7Ci0JCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2xvb3BzLCBjcHUpKys7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJd29yayA9ICp3b3JrcDsKLQkJKndvcmtwID0gMDsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlpZiAod29yaykKLQkJCXJjdV9wcm9jZXNzX2NhbGxiYWNrcygpOwotCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJaWYgKCp3b3JrcCAhPSAwKQotCQkJc3BpbmNudCsrOwotCQllbHNlCi0JCQlzcGluY250ID0gMDsKLQkJaWYgKHNwaW5jbnQgPiAxMCkgewotCQkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9ZSUVMRElORzsKLQkJCXJjdV95aWVsZChyY3VfY3B1X2t0aHJlYWRfdGltZXIsICh1bnNpZ25lZCBsb25nKWNwdSk7Ci0JCQlzcGluY250ID0gMDsKLQkJfQotCX0KLQkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1NUT1BQRUQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTcGF3biBhIHBlci1DUFUga3RocmVhZCwgc2V0dGluZyB1cCBhZmZpbml0eSBhbmQgcHJpb3JpdHkuCi0gKiBCZWNhdXNlIHRoZSBDUFUgaG90cGx1ZyBsb2NrIGlzIGhlbGQsIG5vIG90aGVyIENQVSB3aWxsIGJlIGF0dGVtcHRpbmcKLSAqIHRvIG1hbmlwdWxhdGUgcmN1X2NwdV9rdGhyZWFkX3Rhc2suICBUaGVyZSBtaWdodCBiZSBhbm90aGVyIENQVQotICogYXR0ZW1wdGluZyB0byBhY2Nlc3MgaXQgZHVyaW5nIGJvb3QsIGJ1dCB0aGUgbG9ja2luZyBpbiBrdGhyZWFkX2JpbmQoKQotICogd2lsbCBlbmZvcmNlIHN1ZmZpY2llbnQgb3JkZXJpbmcuCi0gKi8KLXN0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoaW50IGNwdSkKLXsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0OwotCi0JaWYgKCFyY3Vfa3RocmVhZHNfc3Bhd25hYmxlIHx8Ci0JICAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgIT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JdCA9IGt0aHJlYWRfY3JlYXRlKHJjdV9jcHVfa3RocmVhZCwgKHZvaWQgKikobG9uZyljcHUsICJyY3VjJWQiLCBjcHUpOwotCWlmIChJU19FUlIodCkpCi0JCXJldHVybiBQVFJfRVJSKHQpOwotCWt0aHJlYWRfYmluZCh0LCBjcHUpOwotCXNldF90YXNrX3N0YXRlKHQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfY3B1LCBjcHUpID0gY3B1OwotCVdBUk5fT05fT05DRShwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpICE9IE5VTEwpOwotCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgPSB0OwotCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKLQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOwotCXJldHVybiAwOwotfQotCi0vKgotICogUGVyLXJjdV9ub2RlIGt0aHJlYWQsIHdoaWNoIGlzIGluIGNoYXJnZSBvZiB3YWtpbmcgdXAgdGhlIHBlci1DUFUKLSAqIGt0aHJlYWRzIHdoZW4gbmVlZGVkLiAgV2UgaWdub3JlIHJlcXVlc3RzIHRvIHdha2UgdXAga3RocmVhZHMKLSAqIGZvciBvZmZsaW5lIENQVXMsIHdoaWNoIGlzIE9LIGJlY2F1c2UgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkKLSAqIHRha2VzIGNhcmUgb2YgdGhpcyBjYXNlLgotICovCi1zdGF0aWMgaW50IHJjdV9ub2RlX2t0aHJlYWQodm9pZCAqYXJnKQotewotCWludCBjcHU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0Jc3RydWN0IHJjdV9ub2RlICpybnAgPSAoc3RydWN0IHJjdV9ub2RlICopYXJnOwotCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7Ci0KLQlmb3IgKDs7KSB7Ci0JCXJucC0+bm9kZV9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1dBSVRJTkc7Ci0JCXJjdV93YWl0KGF0b21pY19yZWFkKCZybnAtPndha2VtYXNrKSAhPSAwKTsKLQkJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfUlVOTklORzsKLQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKLQkJbWFzayA9IGF0b21pY194Y2hnKCZybnAtPndha2VtYXNrLCAwKTsKLQkJcmN1X2luaXRpYXRlX2Jvb3N0KHJucCwgZmxhZ3MpOyAvKiByZWxlYXNlcyBybnAtPmxvY2suICovCi0JCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrLCBtYXNrID4+PSAxKSB7Ci0JCQlpZiAoKG1hc2sgJiAweDEpID09IDApCi0JCQkJY29udGludWU7Ci0JCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOwotCQkJaWYgKCFjcHVfb25saW5lKGNwdSkgfHwgdCA9PSBOVUxMKSB7Ci0JCQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgY3B1KSA9IDE7Ci0JCQlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87Ci0JCQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOwotCQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJfQotCX0KLQkvKiBOT1RSRUFDSEVEICovCi0Jcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfU1RPUFBFRDsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNldCB0aGUgcGVyLXJjdV9ub2RlIGt0aHJlYWQncyBhZmZpbml0eSB0byBjb3ZlciBhbGwgQ1BVcyB0aGF0IGFyZQotICogc2VydmVkIGJ5IHRoZSByY3Vfbm9kZSBpbiBxdWVzdGlvbi4gIFRoZSBDUFUgaG90cGx1ZyBsb2NrIGlzIHN0aWxsCi0gKiBoZWxkLCBzbyB0aGUgdmFsdWUgb2Ygcm5wLT5xc21hc2tpbml0IHdpbGwgYmUgc3RhYmxlLgotICoKLSAqIFdlIGRvbid0IGluY2x1ZGUgb3V0Z29pbmdjcHUgaW4gdGhlIGFmZmluaXR5IHNldCwgdXNlIC0xIGlmIHRoZXJlIGlzCi0gKiBubyBvdXRnb2luZyBDUFUuICBJZiB0aGVyZSBhcmUgbm8gQ1BVcyBsZWZ0IGluIHRoZSBhZmZpbml0eSBzZXQsCi0gKiB0aGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUga3RocmVhZCB0byBleGVjdXRlIG9uIGFueSBDUFUuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV9ub2RlX2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSkKLXsKLQljcHVtYXNrX3Zhcl90IGNtOwotCWludCBjcHU7Ci0JdW5zaWduZWQgbG9uZyBtYXNrID0gcm5wLT5xc21hc2tpbml0OwotCi0JaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNtLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuOwotCWNwdW1hc2tfY2xlYXIoY20pOwotCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrLCBtYXNrID4+PSAxKQotCQlpZiAoKG1hc2sgJiAweDEpICYmIGNwdSAhPSBvdXRnb2luZ2NwdSkKLQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNtKTsKLQlpZiAoY3B1bWFza193ZWlnaHQoY20pID09IDApIHsKLQkJY3B1bWFza19zZXRhbGwoY20pOwotCQlmb3IgKGNwdSA9IHJucC0+Z3JwbG87IGNwdSA8PSBybnAtPmdycGhpOyBjcHUrKykKLQkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY20pOwotCQlXQVJOX09OX09OQ0UoY3B1bWFza193ZWlnaHQoY20pID09IDApOwotCX0KLQlzZXRfY3B1c19hbGxvd2VkX3B0cihybnAtPm5vZGVfa3RocmVhZF90YXNrLCBjbSk7Ci0JcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkocm5wLCBjbSk7Ci0JZnJlZV9jcHVtYXNrX3ZhcihjbSk7Ci19Ci0KLS8qCi0gKiBTcGF3biBhIHBlci1yY3Vfbm9kZSBrdGhyZWFkLCBzZXR0aW5nIHByaW9yaXR5IGFuZCBhZmZpbml0eS4KLSAqIENhbGxlZCBkdXJpbmcgYm9vdCBiZWZvcmUgb25saW5lL29mZmxpbmUgY2FuIGhhcHBlbiwgb3IsIGlmCi0gKiBkdXJpbmcgcnVudGltZSwgd2l0aCB0aGUgbWFpbiBDUFUtaG90cGx1ZyBsb2NrcyBoZWxkLiAgU28gb25seQotICogb25lIG9mIHRoZXNlIGNhbiBiZSBleGVjdXRpbmcgYXQgYSB0aW1lLgotICovCi1zdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCi0JCQkJCQlzdHJ1Y3QgcmN1X25vZGUgKnJucCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBybnBfaW5kZXggPSBybnAgLSAmcnNwLT5ub2RlWzBdOwotCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7Ci0KLQlpZiAoIXJjdV9rdGhyZWFkc19zcGF3bmFibGUgfHwKLQkgICAgcm5wLT5xc21hc2tpbml0ID09IDApCi0JCXJldHVybiAwOwotCWlmIChybnAtPm5vZGVfa3RocmVhZF90YXNrID09IE5VTEwpIHsKLQkJdCA9IGt0aHJlYWRfY3JlYXRlKHJjdV9ub2RlX2t0aHJlYWQsICh2b2lkICopcm5wLAotCQkJCSAgICJyY3VuJWQiLCBybnBfaW5kZXgpOwotCQlpZiAoSVNfRVJSKHQpKQotCQkJcmV0dXJuIFBUUl9FUlIodCk7Ci0JCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7Ci0JCXNldF90YXNrX3N0YXRlKHQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPSB0OwotCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7Ci0JCXNwLnNjaGVkX3ByaW9yaXR5ID0gOTk7Ci0JCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7Ci0JfQotCXJldHVybiByY3Vfc3Bhd25fb25lX2Jvb3N0X2t0aHJlYWQocnNwLCBybnAsIHJucF9pbmRleCk7Ci19Ci0KLS8qCi0gKiBTcGF3biBhbGwga3RocmVhZHMgLS0gY2FsbGVkIGFzIHNvb24gYXMgdGhlIHNjaGVkdWxlciBpcyBydW5uaW5nLgotICovCi1zdGF0aWMgaW50IF9faW5pdCByY3Vfc3Bhd25fa3RocmVhZHModm9pZCkKLXsKLQlpbnQgY3B1OwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wOwotCi0JcmN1X2t0aHJlYWRzX3NwYXduYWJsZSA9IDE7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSkgPSAwOwotCQlpZiAoY3B1X29ubGluZShjcHUpKQotCQkJKHZvaWQpcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChjcHUpOwotCX0KLQlybnAgPSByY3VfZ2V0X3Jvb3QocmN1X3N0YXRlKTsKLQkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7Ci0JaWYgKE5VTV9SQ1VfTk9ERVMgPiAxKSB7Ci0JCXJjdV9mb3JfZWFjaF9sZWFmX25vZGUocmN1X3N0YXRlLCBybnApCi0JCQkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7Ci0JfQotCXJldHVybiAwOwotfQotZWFybHlfaW5pdGNhbGwocmN1X3NwYXduX2t0aHJlYWRzKTsKLQogc3RhdGljIHZvaWQKIF9fY2FsbF9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkLCB2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpyY3UpLAogCSAgIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKQEAgLTIxODgsMjYgKzE5MDIsMTMgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwLT5vbm9mZmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9vbmxpbmVfY3B1KGludCBjcHUpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X3ByZXBhcmVfY3B1KGludCBjcHUpCiB7CiAJcmN1X2luaXRfcGVyY3B1X2RhdGEoY3B1LCAmcmN1X3NjaGVkX3N0YXRlLCAwKTsKIAlyY3VfaW5pdF9wZXJjcHVfZGF0YShjcHUsICZyY3VfYmhfc3RhdGUsIDApOwogCXJjdV9wcmVlbXB0X2luaXRfcGVyY3B1X2RhdGEoY3B1KTsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9vbmxpbmVfa3RocmVhZHMoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBjcHUpOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7Ci0KLQkvKiBGaXJlIHVwIHRoZSBpbmNvbWluZyBDUFUncyBrdGhyZWFkIGFuZCBsZWFmIHJjdV9ub2RlIGt0aHJlYWQuICovCi0JaWYgKHJjdV9rdGhyZWFkc19zcGF3bmFibGUpIHsKLQkJKHZvaWQpcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChjcHUpOwotCQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQotCQkJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOwotCX0KLX0KLQogLyoKICAqIEhhbmRsZSBDUFUgb25saW5lL29mZmxpbmUgbm90aWZpY2F0aW9uIGV2ZW50cy4KICAqLwpAQCAtMjIyMSw4ICsxOTIyLDggQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CiAJY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCXJjdV9vbmxpbmVfY3B1KGNwdSk7Ci0JCXJjdV9vbmxpbmVfa3RocmVhZHMoY3B1KTsKKwkJcmN1X3ByZXBhcmVfY3B1KGNwdSk7CisJCXJjdV9wcmVwYXJlX2t0aHJlYWRzKGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX09OTElORToKIAljYXNlIENQVV9ET1dOX0ZBSUxFRDoKQEAgLTIzNzIsNiArMjA3Myw3IEBACiAJcmN1X2luaXRfb25lKCZyY3Vfc2NoZWRfc3RhdGUsICZyY3Vfc2NoZWRfZGF0YSk7CiAJcmN1X2luaXRfb25lKCZyY3VfYmhfc3RhdGUsICZyY3VfYmhfZGF0YSk7CiAJX19yY3VfaW5pdF9wcmVlbXB0KCk7CisJIG9wZW5fc29mdGlycShSQ1VfU09GVElSUSwgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKTsKIAogCS8qCiAJICogV2UgZG9uJ3QgbmVlZCBwcm90ZWN0aW9uIGFnYWluc3QgQ1BVLWhvdHBsdWcgaGVyZSBiZWNhdXNlCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5oIGIva2VybmVsL3JjdXRyZWUuaAppbmRleCA3YjlhMDhiLi4wMWIyY2NkIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5oCisrKyBiL2tlcm5lbC9yY3V0cmVlLmgKQEAgLTM2OSw2ICszNjksNyBAQAogCQkJCQkJLyogIHBlcmlvZCBiZWNhdXNlICovCiAJCQkJCQkvKiAgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkgKi8KIAkJCQkJCS8qICB3YXMgcnVubmluZy4gKi8KKwl1OAlib29zdDsJCQkJLyogU3ViamVjdCB0byBwcmlvcml0eSBib29zdC4gKi8KIAl1bnNpZ25lZCBsb25nIGdwbnVtOwkJCS8qIEN1cnJlbnQgZ3AgbnVtYmVyLiAqLwogCXVuc2lnbmVkIGxvbmcgY29tcGxldGVkOwkJLyogIyBvZiBsYXN0IGNvbXBsZXRlZCBncC4gKi8KIApAQCAtNDI2LDYgKzQyNyw3IEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgdm9pZCByY3VfcmVwb3J0X3VuYmxvY2tfcXNfcm5wKHN0cnVjdCByY3Vfbm9kZSAqcm5wLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RhdGljIHZvaWQgcmN1X3N0b3BfY3B1X2t0aHJlYWQoaW50IGNwdSk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwogc3RhdGljIHZvaWQgcmN1X3ByaW50X2RldGFpbF90YXNrX3N0YWxsKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCk7CiBzdGF0aWMgdm9pZCByY3VfcHJpbnRfdGFza19zdGFsbChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CkBAIC00NTAsMTEgKzQ1MiwxOSBAQAogc3RhdGljIHZvaWQgX19pbml0IF9fcmN1X2luaXRfcHJlZW1wdCh2b2lkKTsKIHN0YXRpYyB2b2lkIHJjdV9uZWVkc19jcHVfZmx1c2godm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfaW5pdGlhdGVfYm9vc3Qoc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Nfa3RocmVhZCh2b2lkKTsKKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9kb19jYWxsYmFja3Modm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwKIAkJCQkJICBjcHVtYXNrX3Zhcl90IGNtKTsKLXN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2Jvb3N0X3N0YXJ0X2dwKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKIHN0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCiAJCQkJCQkgc3RydWN0IHJjdV9ub2RlICpybnAsCiAJCQkJCQkgaW50IHJucF9pbmRleCk7CitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CitzdGF0aWMgdm9pZCByY3VfeWllbGQodm9pZCAoKmYpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KK3N0YXRpYyB2b2lkIHJjdV9jcHVfa3RocmVhZF9zZXRydChpbnQgY3B1LCBpbnQgdG9fcnQpOworc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9wcmVwYXJlX2t0aHJlYWRzKGludCBjcHUpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBSQ1VfVFJFRV9OT05DT1JFICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaCBiL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oCmluZGV4IGE3NjdiN2QuLjc1MTEzY2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oCkBAIC02MDIsNiArNjAyLDE1IEBACiAJCQkJJl9fZ2V0X2NwdV92YXIocmN1X3ByZWVtcHRfZGF0YSkpOwogfQogCisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9kb19jYWxsYmFja3Modm9pZCkKK3sKKwlyY3VfZG9fYmF0Y2goJnJjdV9wcmVlbXB0X3N0YXRlLCAmX19nZXRfY3B1X3ZhcihyY3VfcHJlZW1wdF9kYXRhKSk7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCiAvKgogICogUXVldWUgYSBwcmVlbXB0aWJsZS1SQ1UgY2FsbGJhY2sgZm9yIGludm9jYXRpb24gYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCiAgKi8KQEAgLTEyNDksNiArMTI1OCwyMyBAQAogfQogCiAvKgorICogV2FrZSB1cCB0aGUgcGVyLUNQVSBrdGhyZWFkIHRvIGludm9rZSBSQ1UgY2FsbGJhY2tzLgorICovCitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NhbGxiYWNrc19rdGhyZWFkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX3RoaXNfY3B1X3dyaXRlKHJjdV9jcHVfaGFzX3dvcmssIDEpOworCWlmIChfX3RoaXNfY3B1X3JlYWQocmN1X2NwdV9rdGhyZWFkX3Rhc2spID09IE5VTEwpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXdha2VfdXBfcHJvY2VzcyhfX3RoaXNfY3B1X3JlYWQocmN1X2NwdV9rdGhyZWFkX3Rhc2spKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCiAgKiBTZXQgdGhlIGFmZmluaXR5IG9mIHRoZSBib29zdCBrdGhyZWFkLiAgVGhlIENQVS1ob3RwbHVnIGxvY2tzIGFyZQogICogaGVsZCwgc28gbm8gb25lIHNob3VsZCBiZSBtZXNzaW5nIHdpdGggdGhlIGV4aXN0ZW5jZSBvZiB0aGUgYm9vc3QKICAqIGt0aHJlYWQuCkBAIC0xMjg4LDYgKzEzMTQsNyBAQAogCiAJaWYgKCZyY3VfcHJlZW1wdF9zdGF0ZSAhPSByc3ApCiAJCXJldHVybiAwOworCXJzcC0+Ym9vc3QgPSAxOwogCWlmIChybnAtPmJvb3N0X2t0aHJlYWRfdGFzayAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAl0ID0ga3RocmVhZF9jcmVhdGUocmN1X2Jvb3N0X2t0aHJlYWQsICh2b2lkICopcm5wLApAQCAtMTI5NSwxNCArMTMyMiwzNzggQEAKIAlpZiAoSVNfRVJSKHQpKQogCQlyZXR1cm4gUFRSX0VSUih0KTsKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCXNldF90YXNrX3N0YXRlKHQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJcm5wLT5ib29zdF9rdGhyZWFkX3Rhc2sgPSB0OwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CiAJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKKwl3YWtlX3VwX3Byb2Nlc3ModCk7IC8qIGdldCB0byBUQVNLX0lOVEVSUlVQVElCTEUgcXVpY2tseS4gKi8KIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCisvKgorICogU3RvcCB0aGUgUkNVJ3MgcGVyLUNQVSBrdGhyZWFkIHdoZW4gaXRzIENQVSBnb2VzIG9mZmxpbmUsLgorICovCitzdGF0aWMgdm9pZCByY3Vfc3RvcF9jcHVfa3RocmVhZChpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCS8qIFN0b3AgdGhlIENQVSdzIGt0aHJlYWQuICovCisJdCA9IHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSk7CisJaWYgKHQgIT0gTlVMTCkgeworCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpID0gTlVMTDsKKwkJa3RocmVhZF9zdG9wKHQpOworCX0KK30KKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RhdGljIHZvaWQgcmN1X2t0aHJlYWRfZG9fd29yayh2b2lkKQoreworCXJjdV9kb19iYXRjaCgmcmN1X3NjaGVkX3N0YXRlLCAmX19nZXRfY3B1X3ZhcihyY3Vfc2NoZWRfZGF0YSkpOworCXJjdV9kb19iYXRjaCgmcmN1X2JoX3N0YXRlLCAmX19nZXRfY3B1X3ZhcihyY3VfYmhfZGF0YSkpOworCXJjdV9wcmVlbXB0X2RvX2NhbGxiYWNrcygpOworfQorCisvKgorICogV2FrZSB1cCB0aGUgc3BlY2lmaWVkIHBlci1yY3Vfbm9kZS1zdHJ1Y3R1cmUga3RocmVhZC4KKyAqIEJlY2F1c2UgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkcyBhcmUgaW1tb3J0YWwsIHdlIGRvbid0IG5lZWQKKyAqIHRvIGRvIGFueXRoaW5nIHRvIGtlZXAgdGhlbSBhbGl2ZS4KKyAqLworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQoc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJdCA9IHJucC0+bm9kZV9rdGhyZWFkX3Rhc2s7CisJaWYgKHQgIT0gTlVMTCkKKwkJd2FrZV91cF9wcm9jZXNzKHQpOworfQorCisvKgorICogU2V0IHRoZSBzcGVjaWZpZWQgQ1BVJ3Mga3RocmVhZCB0byBydW4gUlQgb3Igbm90LCBhcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSB0b19ydCBhcmd1bWVudC4gIFRoZSBDUFUtaG90cGx1ZyBsb2NrcyBhcmUgaGVsZCwgc28gdGhlIHRhc2sKKyAqIGlzIG5vdCBnb2luZyBhd2F5LgorICovCitzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KQoreworCWludCBwb2xpY3k7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOworCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAodG9fcnQpIHsKKwkJcG9saWN5ID0gU0NIRURfRklGTzsKKwkJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOworCX0gZWxzZSB7CisJCXBvbGljeSA9IFNDSEVEX05PUk1BTDsKKwkJc3Auc2NoZWRfcHJpb3JpdHkgPSAwOworCX0KKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBwb2xpY3ksICZzcCk7Cit9CisKKy8qCisgKiBUaW1lciBoYW5kbGVyIHRvIGluaXRpYXRlIHRoZSB3YWtpbmcgdXAgb2YgcGVyLUNQVSBrdGhyZWFkcyB0aGF0CisgKiBoYXZlIHlpZWxkZWQgdGhlIENQVSBkdWUgdG8gZXhjZXNzIG51bWJlcnMgb2YgUkNVIGNhbGxiYWNrcy4KKyAqIFdlIHdha2UgdXAgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkLCB3aGljaCBpbiB0dXJuIHdpbGwgd2FrZSB1cAorICogdGhlIGJvb3N0ZXIga3RocmVhZC4KKyAqLworc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocmN1X3N0YXRlLT5yZGEsIGFyZyk7CisJc3RydWN0IHJjdV9ub2RlICpybnAgPSByZHAtPm15bm9kZTsKKworCWF0b21pY19vcihyZHAtPmdycG1hc2ssICZybnAtPndha2VtYXNrKTsKKwlpbnZva2VfcmN1X25vZGVfa3RocmVhZChybnApOworfQorCisvKgorICogRHJvcCB0byBub24tcmVhbC10aW1lIHByaW9yaXR5IGFuZCB5aWVsZCwgYnV0IG9ubHkgYWZ0ZXIgcG9zdGluZyBhCisgKiB0aW1lciB0aGF0IHdpbGwgY2F1c2UgdXMgdG8gcmVnYWluIG91ciByZWFsLXRpbWUgcHJpb3JpdHkgaWYgd2UKKyAqIHJlbWFpbiBwcmVlbXB0ZWQuICBFaXRoZXIgd2F5LCB3ZSByZXN0b3JlIG91ciByZWFsLXRpbWUgcHJpb3JpdHkKKyAqIGJlZm9yZSByZXR1cm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV95aWVsZCh2b2lkICgqZikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB5aWVsZF90aW1lcjsKKworCXNldHVwX3RpbWVyX29uX3N0YWNrKCZ5aWVsZF90aW1lciwgZiwgYXJnKTsKKwltb2RfdGltZXIoJnlpZWxkX3RpbWVyLCBqaWZmaWVzICsgMik7CisJc3Auc2NoZWRfcHJpb3JpdHkgPSAwOworCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKGN1cnJlbnQsIFNDSEVEX05PUk1BTCwgJnNwKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKKwlzY2hlZHVsZSgpOworCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LCBTQ0hFRF9GSUZPLCAmc3ApOworCWRlbF90aW1lcigmeWllbGRfdGltZXIpOworfQorCisvKgorICogSGFuZGxlIGNhc2VzIHdoZXJlIHRoZSByY3VfY3B1X2t0aHJlYWQoKSBlbmRzIHVwIG9uIHRoZSB3cm9uZyBDUFUuCisgKiBUaGlzIGNhbiBoYXBwZW4gd2hpbGUgdGhlIGNvcnJlc3BvbmRpbmcgQ1BVIGlzIGVpdGhlciBjb21pbmcgb25saW5lCisgKiBvciBnb2luZyBvZmZsaW5lLiAgV2UgY2Fubm90IHdhaXQgdW50aWwgdGhlIENQVSBpcyBmdWxseSBvbmxpbmUKKyAqIGJlZm9yZSBzdGFydGluZyB0aGUga3RocmVhZCwgYmVjYXVzZSB0aGUgdmFyaW91cyBub3RpZmllciBmdW5jdGlvbnMKKyAqIGNhbiB3YWl0IGZvciBSQ1UgZ3JhY2UgcGVyaW9kcy4gIFNvIHdlIHBhcmsgcmN1X2NwdV9rdGhyZWFkKCkgdW50aWwKKyAqIHRoZSBjb3JyZXNwb25kaW5nIENQVSBpcyBvbmxpbmUuCisgKgorICogUmV0dXJuIDEgaWYgdGhlIGt0aHJlYWQgbmVlZHMgdG8gc3RvcCwgMCBvdGhlcndpc2UuCisgKgorICogQ2FsbGVyIG11c3QgZGlzYWJsZSBiaC4gIFRoaXMgZnVuY3Rpb24gY2FuIG1vbWVudGFyaWx5IGVuYWJsZSBpdC4KKyAqLworc3RhdGljIGludCByY3VfY3B1X2t0aHJlYWRfc2hvdWxkX3N0b3AoaW50IGNwdSkKK3sKKwl3aGlsZSAoY3B1X2lzX29mZmxpbmUoY3B1KSB8fAorCSAgICAgICAhY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpIHx8CisJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpIHsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCXJldHVybiAxOworCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsIGNwdSkgPSBSQ1VfS1RIUkVBRF9PRkZDUFU7CisJCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJaWYgKCFjcHVtYXNrX2VxdWFsKCZjdXJyZW50LT5jcHVzX2FsbG93ZWQsIGNwdW1hc2tfb2YoY3B1KSkpCisJCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKGNwdSkpOworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJfQorCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IGNwdTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlci1DUFUga2VybmVsIHRocmVhZCB0aGF0IGludm9rZXMgUkNVIGNhbGxiYWNrcy4gIFRoaXMgcmVwbGFjZXMgdGhlCisgKiBlYXJsaWVyIFJDVSBzb2Z0aXJxLgorICovCitzdGF0aWMgaW50IHJjdV9jcHVfa3RocmVhZCh2b2lkICphcmcpCit7CisJaW50IGNwdSA9IChpbnQpKGxvbmcpYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNwaW5jbnQgPSAwOworCXVuc2lnbmVkIGludCAqc3RhdHVzcCA9ICZwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsIGNwdSk7CisJY2hhciB3b3JrOworCWNoYXIgKndvcmtwID0gJnBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgY3B1KTsKKworCWZvciAoOzspIHsKKwkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9XQUlUSU5HOworCQlyY3Vfd2FpdCgqd29ya3AgIT0gMCB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCWlmIChyY3VfY3B1X2t0aHJlYWRfc2hvdWxkX3N0b3AoY3B1KSkgeworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQlicmVhazsKKwkJfQorCQkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1JVTk5JTkc7CisJCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2xvb3BzLCBjcHUpKys7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJd29yayA9ICp3b3JrcDsKKwkJKndvcmtwID0gMDsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlpZiAod29yaykKKwkJCXJjdV9rdGhyZWFkX2RvX3dvcmsoKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCWlmICgqd29ya3AgIT0gMCkKKwkJCXNwaW5jbnQrKzsKKwkJZWxzZQorCQkJc3BpbmNudCA9IDA7CisJCWlmIChzcGluY250ID4gMTApIHsKKwkJCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfWUlFTERJTkc7CisJCQlyY3VfeWllbGQocmN1X2NwdV9rdGhyZWFkX3RpbWVyLCAodW5zaWduZWQgbG9uZyljcHUpOworCQkJc3BpbmNudCA9IDA7CisJCX0KKwl9CisJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9TVE9QUEVEOworCXJldHVybiAwOworfQorCisvKgorICogU3Bhd24gYSBwZXItQ1BVIGt0aHJlYWQsIHNldHRpbmcgdXAgYWZmaW5pdHkgYW5kIHByaW9yaXR5LgorICogQmVjYXVzZSB0aGUgQ1BVIGhvdHBsdWcgbG9jayBpcyBoZWxkLCBubyBvdGhlciBDUFUgd2lsbCBiZSBhdHRlbXB0aW5nCisgKiB0byBtYW5pcHVsYXRlIHJjdV9jcHVfa3RocmVhZF90YXNrLiAgVGhlcmUgbWlnaHQgYmUgYW5vdGhlciBDUFUKKyAqIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGl0IGR1cmluZyBib290LCBidXQgdGhlIGxvY2tpbmcgaW4ga3RocmVhZF9iaW5kKCkKKyAqIHdpbGwgZW5mb3JjZSBzdWZmaWNpZW50IG9yZGVyaW5nLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgd2UgY2Fubm90IHNpbXBseSByZWZ1c2UgdG8gd2FrZSB1cCB0aGUgcGVyLUNQVQorICoga3RocmVhZCBiZWNhdXNlIGt0aHJlYWRzIGFyZSBjcmVhdGVkIGluIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHN0YXRlLAorICogd2hpY2ggY2FuIHJlc3VsdCBpbiBzb2Z0bG9ja3VwIGNvbXBsYWludHMgaWYgdGhlIHRhc2sgZW5kcyB1cCBiZWluZworICogaWRsZSBmb3IgbW9yZSB0aGFuIGEgY291cGxlIG9mIG1pbnV0ZXMuCisgKgorICogSG93ZXZlciwgcGxlYXNlIG5vdGUgYWxzbyB0aGF0IHdlIGNhbm5vdCBiaW5kIHRoZSBwZXItQ1BVIGt0aHJlYWQgdG8gaXRzCisgKiBDUFUgdW50aWwgdGhhdCBDUFUgaXMgZnVsbHkgb25saW5lLiAgV2UgYWxzbyBjYW5ub3Qgd2FpdCB1bnRpbCB0aGUKKyAqIENQVSBpcyBmdWxseSBvbmxpbmUgYmVmb3JlIHdlIGNyZWF0ZSBpdHMgcGVyLUNQVSBrdGhyZWFkLCBhcyB0aGlzIHdvdWxkCisgKiBkZWFkbG9jayB0aGUgc3lzdGVtIHdoZW4gQ1BVIG5vdGlmaWVycyB0cmllZCB3YWl0aW5nIGZvciBncmFjZQorICogcGVyaW9kcy4gIFNvIHdlIGJpbmQgdGhlIHBlci1DUFUga3RocmVhZCB0byBpdHMgQ1BVIG9ubHkgaWYgdGhlIENQVQorICogaXMgb25saW5lLiAgSWYgaXRzIENQVSBpcyBub3QgeWV0IGZ1bGx5IG9ubGluZSwgdGhlbiB0aGUgY29kZSBpbgorICogcmN1X2NwdV9rdGhyZWFkKCkgd2lsbCB3YWl0IHVudGlsIGl0IGlzIGZ1bGx5IG9ubGluZSwgYW5kIHRoZW4gZG8KKyAqIHRoZSBiaW5kaW5nLgorICovCitzdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX2NwdV9rdGhyZWFkKGludCBjcHUpCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmICghcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgfHwKKwkgICAgcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSAhPSBOVUxMKQorCQlyZXR1cm4gMDsKKwl0ID0ga3RocmVhZF9jcmVhdGUocmN1X2NwdV9rdGhyZWFkLCAodm9pZCAqKShsb25nKWNwdSwgInJjdWMlZCIsIGNwdSk7CisJaWYgKElTX0VSUih0KSkKKwkJcmV0dXJuIFBUUl9FUlIodCk7CisJaWYgKGNwdV9vbmxpbmUoY3B1KSkKKwkJa3RocmVhZF9iaW5kKHQsIGNwdSk7CisJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfY3B1LCBjcHUpID0gY3B1OworCVdBUk5fT05fT05DRShwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpICE9IE5VTEwpOworCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOworCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgPSB0OworCXdha2VfdXBfcHJvY2Vzcyh0KTsgLyogR2V0IHRvIFRBU0tfSU5URVJSVVBUSUJMRSBxdWlja2x5LiAqLworCXJldHVybiAwOworfQorCisvKgorICogUGVyLXJjdV9ub2RlIGt0aHJlYWQsIHdoaWNoIGlzIGluIGNoYXJnZSBvZiB3YWtpbmcgdXAgdGhlIHBlci1DUFUKKyAqIGt0aHJlYWRzIHdoZW4gbmVlZGVkLiAgV2UgaWdub3JlIHJlcXVlc3RzIHRvIHdha2UgdXAga3RocmVhZHMKKyAqIGZvciBvZmZsaW5lIENQVXMsIHdoaWNoIGlzIE9LIGJlY2F1c2UgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkKKyAqIHRha2VzIGNhcmUgb2YgdGhpcyBjYXNlLgorICovCitzdGF0aWMgaW50IHJjdV9ub2RlX2t0aHJlYWQodm9pZCAqYXJnKQoreworCWludCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJc3RydWN0IHJjdV9ub2RlICpybnAgPSAoc3RydWN0IHJjdV9ub2RlICopYXJnOworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwlmb3IgKDs7KSB7CisJCXJucC0+bm9kZV9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1dBSVRJTkc7CisJCXJjdV93YWl0KGF0b21pY19yZWFkKCZybnAtPndha2VtYXNrKSAhPSAwKTsKKwkJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfUlVOTklORzsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJbWFzayA9IGF0b21pY194Y2hnKCZybnAtPndha2VtYXNrLCAwKTsKKwkJcmN1X2luaXRpYXRlX2Jvb3N0KHJucCwgZmxhZ3MpOyAvKiByZWxlYXNlcyBybnAtPmxvY2suICovCisJCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrLCBtYXNrID4+PSAxKSB7CisJCQlpZiAoKG1hc2sgJiAweDEpID09IDApCisJCQkJY29udGludWU7CisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOworCQkJaWYgKCFjcHVfb25saW5lKGNwdSkgfHwgdCA9PSBOVUxMKSB7CisJCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgY3B1KSA9IDE7CisJCQlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CisJCQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOworCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJfQorCX0KKwkvKiBOT1RSRUFDSEVEICovCisJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfU1RPUFBFRDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgcGVyLXJjdV9ub2RlIGt0aHJlYWQncyBhZmZpbml0eSB0byBjb3ZlciBhbGwgQ1BVcyB0aGF0IGFyZQorICogc2VydmVkIGJ5IHRoZSByY3Vfbm9kZSBpbiBxdWVzdGlvbi4gIFRoZSBDUFUgaG90cGx1ZyBsb2NrIGlzIHN0aWxsCisgKiBoZWxkLCBzbyB0aGUgdmFsdWUgb2Ygcm5wLT5xc21hc2tpbml0IHdpbGwgYmUgc3RhYmxlLgorICoKKyAqIFdlIGRvbid0IGluY2x1ZGUgb3V0Z29pbmdjcHUgaW4gdGhlIGFmZmluaXR5IHNldCwgdXNlIC0xIGlmIHRoZXJlIGlzCisgKiBubyBvdXRnb2luZyBDUFUuICBJZiB0aGVyZSBhcmUgbm8gQ1BVcyBsZWZ0IGluIHRoZSBhZmZpbml0eSBzZXQsCisgKiB0aGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUga3RocmVhZCB0byBleGVjdXRlIG9uIGFueSBDUFUuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9ub2RlX2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSkKK3sKKwljcHVtYXNrX3Zhcl90IGNtOworCWludCBjcHU7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gcm5wLT5xc21hc2tpbml0OworCisJaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNtLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuOworCWNwdW1hc2tfY2xlYXIoY20pOworCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrLCBtYXNrID4+PSAxKQorCQlpZiAoKG1hc2sgJiAweDEpICYmIGNwdSAhPSBvdXRnb2luZ2NwdSkKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNtKTsKKwlpZiAoY3B1bWFza193ZWlnaHQoY20pID09IDApIHsKKwkJY3B1bWFza19zZXRhbGwoY20pOworCQlmb3IgKGNwdSA9IHJucC0+Z3JwbG87IGNwdSA8PSBybnAtPmdycGhpOyBjcHUrKykKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY20pOworCQlXQVJOX09OX09OQ0UoY3B1bWFza193ZWlnaHQoY20pID09IDApOworCX0KKwlzZXRfY3B1c19hbGxvd2VkX3B0cihybnAtPm5vZGVfa3RocmVhZF90YXNrLCBjbSk7CisJcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkocm5wLCBjbSk7CisJZnJlZV9jcHVtYXNrX3ZhcihjbSk7Cit9CisKKy8qCisgKiBTcGF3biBhIHBlci1yY3Vfbm9kZSBrdGhyZWFkLCBzZXR0aW5nIHByaW9yaXR5IGFuZCBhZmZpbml0eS4KKyAqIENhbGxlZCBkdXJpbmcgYm9vdCBiZWZvcmUgb25saW5lL29mZmxpbmUgY2FuIGhhcHBlbiwgb3IsIGlmCisgKiBkdXJpbmcgcnVudGltZSwgd2l0aCB0aGUgbWFpbiBDUFUtaG90cGx1ZyBsb2NrcyBoZWxkLiAgU28gb25seQorICogb25lIG9mIHRoZXNlIGNhbiBiZSBleGVjdXRpbmcgYXQgYSB0aW1lLgorICovCitzdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCisJCQkJCQlzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBybnBfaW5kZXggPSBybnAgLSAmcnNwLT5ub2RlWzBdOworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwlpZiAoIXJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlIHx8CisJICAgIHJucC0+cXNtYXNraW5pdCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKSB7CisJCXQgPSBrdGhyZWFkX2NyZWF0ZShyY3Vfbm9kZV9rdGhyZWFkLCAodm9pZCAqKXJucCwKKwkJCQkgICAicmN1biVkIiwgcm5wX2luZGV4KTsKKwkJaWYgKElTX0VSUih0KSkKKwkJCXJldHVybiBQVFJfRVJSKHQpOworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOworCQlybnAtPm5vZGVfa3RocmVhZF90YXNrID0gdDsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCQlzcC5zY2hlZF9wcmlvcml0eSA9IDk5OworCQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOworCQl3YWtlX3VwX3Byb2Nlc3ModCk7IC8qIGdldCB0byBUQVNLX0lOVEVSUlVQVElCTEUgcXVpY2tseS4gKi8KKwl9CisJcmV0dXJuIHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChyc3AsIHJucCwgcm5wX2luZGV4KTsKK30KKworLyoKKyAqIFNwYXduIGFsbCBrdGhyZWFkcyAtLSBjYWxsZWQgYXMgc29vbiBhcyB0aGUgc2NoZWR1bGVyIGlzIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJjdV9zcGF3bl9rdGhyZWFkcyh2b2lkKQoreworCWludCBjcHU7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisKKwlyY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSA9IDE7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSkgPSAwOworCQlpZiAoY3B1X29ubGluZShjcHUpKQorCQkJKHZvaWQpcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChjcHUpOworCX0KKwlybnAgPSByY3VfZ2V0X3Jvb3QocmN1X3N0YXRlKTsKKwkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7CisJaWYgKE5VTV9SQ1VfTk9ERVMgPiAxKSB7CisJCXJjdV9mb3JfZWFjaF9sZWFmX25vZGUocmN1X3N0YXRlLCBybnApCisJCQkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7CisJfQorCXJldHVybiAwOworfQorZWFybHlfaW5pdGNhbGwocmN1X3NwYXduX2t0aHJlYWRzKTsKKworc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9wcmVwYXJlX2t0aHJlYWRzKGludCBjcHUpCit7CisJc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyY3Vfc3RhdGUtPnJkYSwgY3B1KTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJkcC0+bXlub2RlOworCisJLyogRmlyZSB1cCB0aGUgaW5jb21pbmcgQ1BVJ3Mga3RocmVhZCBhbmQgbGVhZiByY3Vfbm9kZSBrdGhyZWFkLiAqLworCWlmIChyY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSkgeworCQkodm9pZClyY3Vfc3Bhd25fb25lX2NwdV9rdGhyZWFkKGNwdSk7CisJCWlmIChybnAtPm5vZGVfa3RocmVhZF90YXNrID09IE5VTEwpCisJCQkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7CisJfQorfQorCiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLwogCiBzdGF0aWMgdm9pZCByY3VfaW5pdGlhdGVfYm9vc3Qoc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCkBAIC0xMzEwLDIxICsxNzAxLDQxIEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCByY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwKLQkJCQkJICBjcHVtYXNrX3Zhcl90IGNtKQorc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Nfa3RocmVhZCh2b2lkKQogeworCVdBUk5fT05fT05DRSgxKTsKIH0KIAogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApCiB7CiB9CiAKLXN0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCi0JCQkJCQkgc3RydWN0IHJjdV9ub2RlICpybnAsCi0JCQkJCQkgaW50IHJucF9pbmRleCkKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIHZvaWQgcmN1X3N0b3BfY3B1X2t0aHJlYWQoaW50IGNwdSkKIHsKK30KKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KQoreworfQorCitzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KQoreworfQorCitzdGF0aWMgaW50IF9faW5pdCByY3Vfc2NoZWR1bGVyX3JlYWxseV9zdGFydGVkKHZvaWQpCit7CisJcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgPSAxOwogCXJldHVybiAwOwogfQorZWFybHlfaW5pdGNhbGwocmN1X3NjaGVkdWxlcl9yZWFsbHlfc3RhcnRlZCk7CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlcGFyZV9rdGhyZWFkcyhpbnQgY3B1KQoreworfQogCiAjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIApAQCAtMTUwMCw3ICsxOTExLDcgQEAKICAqCiAgKiBCZWNhdXNlIGl0IGlzIG5vdCBsZWdhbCB0byBpbnZva2UgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgd2l0aCBpcnFzCiAgKiBkaXNhYmxlZCwgd2UgZG8gb25lIHBhc3Mgb2YgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCksIHRoZW4gZG8gYQotICogaW52b2tlX3JjdV9jcHVfa3RocmVhZCgpIHRvIGNhdXNlIHJjdV9wcm9jZXNzX2NhbGxiYWNrcygpIHRvIGJlIGludm9rZWQKKyAqIGludm9rZV9yY3VfY29yZSgpIHRvIGNhdXNlIHJjdV9wcm9jZXNzX2NhbGxiYWNrcygpIHRvIGJlIGludm9rZWQKICAqIGxhdGVyLiAgVGhlIHBlci1jcHUgcmN1X2R5bnRpY2tfZHJhaW4gdmFyaWFibGUgY29udHJvbHMgdGhlIHNlcXVlbmNpbmcuCiAgKi8KIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUpCkBAIC0xNTUxLDcgKzE5NjIsNyBAQAogCiAJLyogSWYgUkNVIGNhbGxiYWNrcyBhcmUgc3RpbGwgcGVuZGluZywgUkNVIHN0aWxsIG5lZWRzIHRoaXMgQ1BVLiAqLwogCWlmIChjKQotCQlpbnZva2VfcmN1X2NwdV9rdGhyZWFkKCk7CisJCWludm9rZV9yY3VfY29yZSgpOwogCXJldHVybiBjOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZV90cmFjZS5jIGIva2VybmVsL3JjdXRyZWVfdHJhY2UuYwppbmRleCA5Njc4Y2MzLi40ZTE0NDg3IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCisrKyBiL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKQEAgLTQ2LDYgKzQ2LDggQEAKICNkZWZpbmUgUkNVX1RSRUVfTk9OQ09SRQogI2luY2x1ZGUgInJjdXRyZWUuaCIKIAorI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwogREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX3N0YXR1cyk7CiBERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgaW50LCByY3VfY3B1X2t0aHJlYWRfY3B1KTsKIERFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHJjdV9jcHVfa3RocmVhZF9sb29wcyk7CkBAIC01OCw2ICs2MCw4IEBACiAJcmV0dXJuICJTUldPWSJba3RocmVhZF9zdGF0dXNdOwogfQogCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKwogc3RhdGljIHZvaWQgcHJpbnRfb25lX3JjdV9kYXRhKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CiAJaWYgKCFyZHAtPmJlZW5vbmxpbmUpCkBAIC03Niw3ICs4MCw3IEBACiAJCSAgIHJkcC0+ZHludGlja3NfZnFzKTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAJc2VxX3ByaW50ZihtLCAiIG9mPSVsdSByaT0lbHUiLCByZHAtPm9mZmxpbmVfZnFzLCByZHAtPnJlc2NoZWRfaXBpKTsKLQlzZXFfcHJpbnRmKG0sICIgcWw9JWxkIHFzPSVjJWMlYyVjIGt0PSVkLyVjLyVkIGt0bD0leCBiPSVsZCIsCisJc2VxX3ByaW50ZihtLCAiIHFsPSVsZCBxcz0lYyVjJWMlYyIsCiAJCSAgIHJkcC0+cWxlbiwKIAkJICAgIi5OIltyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0gIT0KIAkJCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXV0sCkBAIC04NCwxMyArODgsMTYgQEAKIAkJCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXV0sCiAJCSAgICIuVyJbcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdICE9CiAJCQlyZHAtPm54dHRhaWxbUkNVX1dBSVRfVEFJTF1dLAotCQkgICAiLkQiWyZyZHAtPm54dGxpc3QgIT0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdXSwKKwkJICAgIi5EIlsmcmRwLT5ueHRsaXN0ICE9IHJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXV0pOworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwlzZXFfcHJpbnRmKG0sICIga3Q9JWQvJWMvJWQga3RsPSV4IiwKIAkJICAgcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCByZHAtPmNwdSksCiAJCSAgIGNvbnZlcnRfa3RocmVhZF9zdGF0dXMocGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLAogCQkJCQkgIHJkcC0+Y3B1KSksCiAJCSAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgcmRwLT5jcHUpLAotCQkgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9sb29wcywgcmRwLT5jcHUpICYgMHhmZmZmLAotCQkgICByZHAtPmJsaW1pdCk7CisJCSAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2xvb3BzLCByZHAtPmNwdSkgJiAweGZmZmYpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisJc2VxX3ByaW50ZihtLCAiIGI9JWxkIiwgcmRwLT5ibGltaXQpOwogCXNlcV9wcmludGYobSwgIiBjaT0lbHUgY289JWx1IGNhPSVsdVxuIiwKIAkJICAgcmRwLT5uX2Nic19pbnZva2VkLCByZHAtPm5fY2JzX29ycGhhbmVkLCByZHAtPm5fY2JzX2Fkb3B0ZWQpOwogfQpAQCAtMTQ3LDE4ICsxNTQsMjEgQEAKIAkJICAgcmRwLT5keW50aWNrc19mcXMpOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KIAlzZXFfcHJpbnRmKG0sICIsJWx1LCVsdSIsIHJkcC0+b2ZmbGluZV9mcXMsIHJkcC0+cmVzY2hlZF9pcGkpOwotCXNlcV9wcmludGYobSwgIiwlbGQsXCIlYyVjJWMlY1wiLCVkLFwiJWNcIiwlbGQiLCByZHAtPnFsZW4sCisJc2VxX3ByaW50ZihtLCAiLCVsZCxcIiVjJWMlYyVjXCIiLCByZHAtPnFsZW4sCiAJCSAgICIuTiJbcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdICE9CiAJCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF1dLAogCQkgICAiLlIiW3JkcC0+bnh0dGFpbFtSQ1VfV0FJVF9UQUlMXSAhPQogCQkJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdXSwKIAkJICAgIi5XIltyZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF0gIT0KIAkJCXJkcC0+bnh0dGFpbFtSQ1VfV0FJVF9UQUlMXV0sCi0JCSAgICIuRCJbJnJkcC0+bnh0bGlzdCAhPSByZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF1dLAorCQkgICAiLkQiWyZyZHAtPm54dGxpc3QgIT0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdXSk7CisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCXNlcV9wcmludGYobSwgIiwlZCxcIiVjXCIiLAogCQkgICBwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIHJkcC0+Y3B1KSwKIAkJICAgY29udmVydF9rdGhyZWFkX3N0YXR1cyhwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsCi0JCQkJCSAgcmRwLT5jcHUpKSwKLQkJICAgcmRwLT5ibGltaXQpOworCQkJCQkgIHJkcC0+Y3B1KSkpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisJc2VxX3ByaW50ZihtLCAiLCVsZCIsIHJkcC0+YmxpbWl0KTsKIAlzZXFfcHJpbnRmKG0sICIsJWx1LCVsdSwlbHVcbiIsCiAJCSAgIHJkcC0+bl9jYnNfaW52b2tlZCwgcmRwLT5uX2Nic19vcnBoYW5lZCwgcmRwLT5uX2Nic19hZG9wdGVkKTsKIH0KQEAgLTE2OSw3ICsxNzksMTEgQEAKICNpZmRlZiBDT05GSUdfTk9fSFoKIAlzZXFfcHV0cyhtLCAiXCJkdFwiLFwiZHQgbmVzdGluZ1wiLFwiZHQgTk1JIG5lc3RpbmdcIixcImRmXCIsIik7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwotCXNlcV9wdXRzKG0sICJcIm9mXCIsXCJyaVwiLFwicWxcIixcImJcIixcImNpXCIsXCJjb1wiLFwiY2FcIlxuIik7CisJc2VxX3B1dHMobSwgIlwib2ZcIixcInJpXCIsXCJxbFwiLFwicXNcIiIpOworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwlzZXFfcHV0cyhtLCAiXCJrdFwiLFwia3RsXCIiKTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCXNlcV9wdXRzKG0sICIsXCJiXCIsXCJjaVwiLFwiY29cIixcImNhXCJcbiIpOwogI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVCiAJc2VxX3B1dHMobSwgIlwicmN1X3ByZWVtcHQ6XCJcbiIpOwogCVBSSU5UX1JDVV9EQVRBKHJjdV9wcmVlbXB0X2RhdGEsIHByaW50X29uZV9yY3VfZGF0YV9jc3YsIG0pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCA3OThlMmZhLi4zZmY0MDE3IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMzgsNiArMzgsMTQgQEAKIH07CiBFWFBPUlRfU1lNQk9MKGlvbWVtX3Jlc291cmNlKTsKIAorLyogY29uc3RyYWludHMgdG8gYmUgbWV0IHdoaWxlIGFsbG9jYXRpbmcgcmVzb3VyY2VzICovCitzdHJ1Y3QgcmVzb3VyY2VfY29uc3RyYWludCB7CisJcmVzb3VyY2Vfc2l6ZV90IG1pbiwgbWF4LCBhbGlnbjsKKwlyZXNvdXJjZV9zaXplX3QgKCphbGlnbmYpKHZvaWQgKiwgY29uc3Qgc3RydWN0IHJlc291cmNlICosCisJCQlyZXNvdXJjZV9zaXplX3QsIHJlc291cmNlX3NpemVfdCk7CisJdm9pZCAqYWxpZ25mX2RhdGE7Cit9OworCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhyZXNvdXJjZV9sb2NrKTsKIAogc3RhdGljIHZvaWQgKnJfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpAQCAtMzg0LDE2ICszOTIsMTMgQEAKIH0KIAogLyoKLSAqIEZpbmQgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSBnaXZlbiByYW5nZSBhbmQgYWxpZ25tZW50LgorICogRmluZCBlbXB0eSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIHdpdGggdGhlIGdpdmVuIHJhbmdlIGFuZAorICogYWxpZ25tZW50IGNvbnN0cmFpbnRzCiAgKi8KLXN0YXRpYyBpbnQgZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXJjZSAqbmV3LAotCQkJIHJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgbWluLAotCQkJIHJlc291cmNlX3NpemVfdCBtYXgsIHJlc291cmNlX3NpemVfdCBhbGlnbiwKLQkJCSByZXNvdXJjZV9zaXplX3QgKCphbGlnbmYpKHZvaWQgKiwKLQkJCQkJCSAgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqLAotCQkJCQkJICAgcmVzb3VyY2Vfc2l6ZV90LAotCQkJCQkJICAgcmVzb3VyY2Vfc2l6ZV90KSwKLQkJCSB2b2lkICphbGlnbmZfZGF0YSkKK3N0YXRpYyBpbnQgX19maW5kX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpvbGQsCisJCQkgc3RydWN0IHJlc291cmNlICpuZXcsCisJCQkgcmVzb3VyY2Vfc2l6ZV90ICBzaXplLAorCQkJIHN0cnVjdCByZXNvdXJjZV9jb25zdHJhaW50ICpjb25zdHJhaW50KQogewogCXN0cnVjdCByZXNvdXJjZSAqdGhpcyA9IHJvb3QtPmNoaWxkOwogCXN0cnVjdCByZXNvdXJjZSB0bXAgPSAqbmV3LCBhdmFpbCwgYWxsb2M7CkBAIC00MDQsMjUgKzQwOSwyNiBAQAogCSAqIFNraXAgcGFzdCBhbiBhbGxvY2F0ZWQgcmVzb3VyY2UgdGhhdCBzdGFydHMgYXQgMCwgc2luY2UgdGhlIGFzc2lnbm1lbnQKIAkgKiBvZiB0aGlzLT5zdGFydCAtIDEgdG8gdG1wLT5lbmQgYmVsb3cgd291bGQgY2F1c2UgYW4gdW5kZXJmbG93LgogCSAqLwotCWlmICh0aGlzICYmIHRoaXMtPnN0YXJ0ID09IDApIHsKLQkJdG1wLnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKKwlpZiAodGhpcyAmJiB0aGlzLT5zdGFydCA9PSByb290LT5zdGFydCkgeworCQl0bXAuc3RhcnQgPSAodGhpcyA9PSBvbGQpID8gb2xkLT5zdGFydCA6IHRoaXMtPmVuZCArIDE7CiAJCXRoaXMgPSB0aGlzLT5zaWJsaW5nOwogCX0KIAlmb3IoOzspIHsKIAkJaWYgKHRoaXMpCi0JCQl0bXAuZW5kID0gdGhpcy0+c3RhcnQgLSAxOworCQkJdG1wLmVuZCA9ICh0aGlzID09IG9sZCkgPyAgdGhpcy0+ZW5kIDogdGhpcy0+c3RhcnQgLSAxOwogCQllbHNlCiAJCQl0bXAuZW5kID0gcm9vdC0+ZW5kOwogCi0JCXJlc291cmNlX2NsaXAoJnRtcCwgbWluLCBtYXgpOworCQlyZXNvdXJjZV9jbGlwKCZ0bXAsIGNvbnN0cmFpbnQtPm1pbiwgY29uc3RyYWludC0+bWF4KTsKIAkJYXJjaF9yZW1vdmVfcmVzZXJ2YXRpb25zKCZ0bXApOwogCiAJCS8qIENoZWNrIGZvciBvdmVyZmxvdyBhZnRlciBBTElHTigpICovCiAJCWF2YWlsID0gKm5ldzsKLQkJYXZhaWwuc3RhcnQgPSBBTElHTih0bXAuc3RhcnQsIGFsaWduKTsKKwkJYXZhaWwuc3RhcnQgPSBBTElHTih0bXAuc3RhcnQsIGNvbnN0cmFpbnQtPmFsaWduKTsKIAkJYXZhaWwuZW5kID0gdG1wLmVuZDsKIAkJaWYgKGF2YWlsLnN0YXJ0ID49IHRtcC5zdGFydCkgewotCQkJYWxsb2Muc3RhcnQgPSBhbGlnbmYoYWxpZ25mX2RhdGEsICZhdmFpbCwgc2l6ZSwgYWxpZ24pOworCQkJYWxsb2Muc3RhcnQgPSBjb25zdHJhaW50LT5hbGlnbmYoY29uc3RyYWludC0+YWxpZ25mX2RhdGEsICZhdmFpbCwKKwkJCQkJc2l6ZSwgY29uc3RyYWludC0+YWxpZ24pOwogCQkJYWxsb2MuZW5kID0gYWxsb2Muc3RhcnQgKyBzaXplIC0gMTsKIAkJCWlmIChyZXNvdXJjZV9jb250YWlucygmYXZhaWwsICZhbGxvYykpIHsKIAkJCQluZXctPnN0YXJ0ID0gYWxsb2Muc3RhcnQ7CkBAIC00MzIsMTQgKzQzOCw3NSBAQAogCQl9CiAJCWlmICghdGhpcykKIAkJCWJyZWFrOwotCQl0bXAuc3RhcnQgPSB0aGlzLT5lbmQgKyAxOworCQlpZiAodGhpcyAhPSBvbGQpCisJCQl0bXAuc3RhcnQgPSB0aGlzLT5lbmQgKyAxOwogCQl0aGlzID0gdGhpcy0+c2libGluZzsKIAl9CiAJcmV0dXJuIC1FQlVTWTsKIH0KIAorLyoKKyAqIEZpbmQgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSBnaXZlbiByYW5nZSBhbmQgYWxpZ25tZW50LgorICovCitzdGF0aWMgaW50IGZpbmRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldywKKwkJCXJlc291cmNlX3NpemVfdCBzaXplLAorCQkJc3RydWN0IHJlc291cmNlX2NvbnN0cmFpbnQgICpjb25zdHJhaW50KQoreworCXJldHVybiAgX19maW5kX3Jlc291cmNlKHJvb3QsIE5VTEwsIG5ldywgc2l6ZSwgY29uc3RyYWludCk7Cit9CisKIC8qKgotICogYWxsb2NhdGVfcmVzb3VyY2UgLSBhbGxvY2F0ZSBlbXB0eSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIGdpdmVuIHJhbmdlICYgYWxpZ25tZW50CisgKiByZWFsbG9jYXRlX3Jlc291cmNlIC0gYWxsb2NhdGUgYSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIGdpdmVuIHJhbmdlICYgYWxpZ25tZW50LgorICoJVGhlIHJlc291cmNlIHdpbGwgYmUgcmVsb2NhdGVkIGlmIHRoZSBuZXcgc2l6ZSBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQgaW4gdGhlCisgKgljdXJyZW50IGxvY2F0aW9uLgorICoKKyAqIEByb290OiByb290IHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIEBvbGQ6ICByZXNvdXJjZSBkZXNjcmlwdG9yIGRlc2lyZWQgYnkgY2FsbGVyCisgKiBAbmV3c2l6ZTogbmV3IHNpemUgb2YgdGhlIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIEBjb25zdHJhaW50OiB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50IGNvbnN0cmFpbnRzIHRvIGJlIG1ldC4KKyAqLworaW50IHJlYWxsb2NhdGVfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm9sZCwKKwkJCXJlc291cmNlX3NpemVfdCBuZXdzaXplLAorCQkJc3RydWN0IHJlc291cmNlX2NvbnN0cmFpbnQgICpjb25zdHJhaW50KQoreworCWludCBlcnI9MDsKKwlzdHJ1Y3QgcmVzb3VyY2UgbmV3ID0gKm9sZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmNvbmZsaWN0OworCisJd3JpdGVfbG9jaygmcmVzb3VyY2VfbG9jayk7CisKKwlpZiAoKGVyciA9IF9fZmluZF9yZXNvdXJjZShyb290LCBvbGQsICZuZXcsIG5ld3NpemUsIGNvbnN0cmFpbnQpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAocmVzb3VyY2VfY29udGFpbnMoJm5ldywgb2xkKSkgeworCQlvbGQtPnN0YXJ0ID0gbmV3LnN0YXJ0OworCQlvbGQtPmVuZCA9IG5ldy5lbmQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChvbGQtPmNoaWxkKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJlc291cmNlX2NvbnRhaW5zKG9sZCwgJm5ldykpIHsKKwkJb2xkLT5zdGFydCA9IG5ldy5zdGFydDsKKwkJb2xkLT5lbmQgPSBuZXcuZW5kOworCX0gZWxzZSB7CisJCV9fcmVsZWFzZV9yZXNvdXJjZShvbGQpOworCQkqb2xkID0gbmV3OworCQljb25mbGljdCA9IF9fcmVxdWVzdF9yZXNvdXJjZShyb290LCBvbGQpOworCQlCVUdfT04oY29uZmxpY3QpOworCX0KK291dDoKKwl3cml0ZV91bmxvY2soJnJlc291cmNlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKworLyoqCisgKiBhbGxvY2F0ZV9yZXNvdXJjZSAtIGFsbG9jYXRlIGVtcHR5IHNsb3QgaW4gdGhlIHJlc291cmNlIHRyZWUgZ2l2ZW4gcmFuZ2UgJiBhbGlnbm1lbnQuCisgKiAJVGhlIHJlc291cmNlIHdpbGwgYmUgcmVhbGxvY2F0ZWQgd2l0aCBhIG5ldyBzaXplIGlmIGl0IHdhcyBhbHJlYWR5IGFsbG9jYXRlZAogICogQHJvb3Q6IHJvb3QgcmVzb3VyY2UgZGVzY3JpcHRvcgogICogQG5ldzogcmVzb3VyY2UgZGVzY3JpcHRvciBkZXNpcmVkIGJ5IGNhbGxlcgogICogQHNpemU6IHJlcXVlc3RlZCByZXNvdXJjZSByZWdpb24gc2l6ZQpAQCAtNDU5LDEyICs1MjYsMjUgQEAKIAkJICAgICAgdm9pZCAqYWxpZ25mX2RhdGEpCiB7CiAJaW50IGVycjsKKwlzdHJ1Y3QgcmVzb3VyY2VfY29uc3RyYWludCBjb25zdHJhaW50OwogCiAJaWYgKCFhbGlnbmYpCiAJCWFsaWduZiA9IHNpbXBsZV9hbGlnbl9yZXNvdXJjZTsKIAorCWNvbnN0cmFpbnQubWluID0gbWluOworCWNvbnN0cmFpbnQubWF4ID0gbWF4OworCWNvbnN0cmFpbnQuYWxpZ24gPSBhbGlnbjsKKwljb25zdHJhaW50LmFsaWduZiA9IGFsaWduZjsKKwljb25zdHJhaW50LmFsaWduZl9kYXRhID0gYWxpZ25mX2RhdGE7CisKKwlpZiAoIG5ldy0+cGFyZW50ICkgeworCQkvKiByZXNvdXJjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCwgdHJ5IHJlYWxsb2NhdGluZyB3aXRoCisJCSAgIHRoZSBuZXcgY29uc3RyYWludHMgKi8KKwkJcmV0dXJuIHJlYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgbmV3LCBzaXplLCAmY29uc3RyYWludCk7CisJfQorCiAJd3JpdGVfbG9jaygmcmVzb3VyY2VfbG9jayk7Ci0JZXJyID0gZmluZF9yZXNvdXJjZShyb290LCBuZXcsIHNpemUsIG1pbiwgbWF4LCBhbGlnbiwgYWxpZ25mLCBhbGlnbmZfZGF0YSk7CisJZXJyID0gZmluZF9yZXNvdXJjZShyb290LCBuZXcsIHNpemUsICZjb25zdHJhaW50KTsKIAlpZiAoZXJyID49IDAgJiYgX19yZXF1ZXN0X3Jlc291cmNlKHJvb3QsIG5ldykpCiAJCWVyciA9IC1FQlVTWTsKIAl3cml0ZV91bmxvY2soJnJlc291cmNlX2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBjYmIzYTBlLi4zZGM3MTZmIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMjkyLDggKzI5Miw4IEBACiAgKiAoVGhlIGRlZmF1bHQgd2VpZ2h0IGlzIDEwMjQgLSBzbyB0aGVyZSdzIG5vIHByYWN0aWNhbAogICogIGxpbWl0YXRpb24gZnJvbSB0aGlzLikKICAqLwotI2RlZmluZSBNSU5fU0hBUkVTCTIKLSNkZWZpbmUgTUFYX1NIQVJFUwkoMVVMIDw8ICgxOCArIFNDSEVEX0xPQURfUkVTT0xVVElPTikpCisjZGVmaW5lIE1JTl9TSEFSRVMJKDFVTCA8PCAgMSkKKyNkZWZpbmUgTUFYX1NIQVJFUwkoMVVMIDw8IDE4KQogCiBzdGF0aWMgaW50IHJvb3RfdGFza19ncm91cF9sb2FkID0gUk9PVF9UQVNLX0dST1VQX0xPQUQ7CiAjZW5kaWYKQEAgLTYwNSwxMCArNjA1LDEwIEBACiAvKgogICogUmV0dXJuIHRoZSBncm91cCB0byB3aGljaCB0aGlzIHRhc2tzIGJlbG9uZ3MuCiAgKgotICogV2UgdXNlIHRhc2tfc3Vic3lzX3N0YXRlX2NoZWNrKCkgYW5kIGV4dGVuZCB0aGUgUkNVIHZlcmlmaWNhdGlvbgotICogd2l0aCBsb2NrZGVwX2lzX2hlbGQoJnAtPnBpX2xvY2spIGJlY2F1c2UgY3B1X2Nncm91cF9hdHRhY2goKQotICogaG9sZHMgdGhhdCBsb2NrIGZvciBlYWNoIHRhc2sgaXQgbW92ZXMgaW50byB0aGUgY2dyb3VwLiBUaGVyZWZvcmUKLSAqIGJ5IGhvbGRpbmcgdGhhdCBsb2NrLCB3ZSBwaW4gdGhlIHRhc2sgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLgorICogV2UgdXNlIHRhc2tfc3Vic3lzX3N0YXRlX2NoZWNrKCkgYW5kIGV4dGVuZCB0aGUgUkNVIHZlcmlmaWNhdGlvbiB3aXRoCisgKiBwaS0+bG9jayBhbmQgcnEtPmxvY2sgYmVjYXVzZSBjcHVfY2dyb3VwX2F0dGFjaCgpIGhvbGRzIHRob3NlIGxvY2tzIGZvciBlYWNoCisgKiB0YXNrIGl0IG1vdmVzIGludG8gdGhlIGNncm91cC4gVGhlcmVmb3JlIGJ5IGhvbGRpbmcgZWl0aGVyIG9mIHRob3NlIGxvY2tzLAorICogd2UgcGluIHRoZSB0YXNrIHRvIHRoZSBjdXJyZW50IGNncm91cC4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19ncm91cCAqdGFza19ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CkBAIC02MTYsNyArNjE2LDggQEAKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwogCiAJY3NzID0gdGFza19zdWJzeXNfc3RhdGVfY2hlY2socCwgY3B1X2Nncm91cF9zdWJzeXNfaWQsCi0JCQlsb2NrZGVwX2lzX2hlbGQoJnAtPnBpX2xvY2spKTsKKwkJCWxvY2tkZXBfaXNfaGVsZCgmcC0+cGlfbG9jaykgfHwKKwkJCWxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykpOwogCXRnID0gY29udGFpbmVyX29mKGNzcywgc3RydWN0IHRhc2tfZ3JvdXAsIGNzcyk7CiAKIAlyZXR1cm4gYXV0b2dyb3VwX3Rhc2tfZ3JvdXAocCwgdGcpOwpAQCAtMjIwMCw2ICsyMjAxLDE2IEBACiAJCQkhKHRhc2tfdGhyZWFkX2luZm8ocCktPnByZWVtcHRfY291bnQgJiBQUkVFTVBUX0FDVElWRSkpOwogCiAjaWZkZWYgQ09ORklHX0xPQ0tERVAKKwkvKgorCSAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgZWl0aGVyIHAtPnBpX2xvY2sgb3IgcnEtPmxvY2ssIHdoZW4gY2hhbmdpbmcKKwkgKiBhIHRhc2sncyBDUFUuIC0+cGlfbG9jayBmb3Igd2FraW5nIHRhc2tzLCBycS0+bG9jayBmb3IgcnVubmFibGUgdGFza3MuCisJICoKKwkgKiBzY2hlZF9tb3ZlX3Rhc2soKSBob2xkcyBib3RoIGFuZCB0aHVzIGhvbGRpbmcgZWl0aGVyIHBpbnMgdGhlIGNncm91cCwKKwkgKiBzZWUgc2V0X3Rhc2tfcnEoKS4KKwkgKgorCSAqIEZ1cnRoZXJtb3JlLCBhbGwgdGFza19ycSB1c2VycyBzaG91bGQgYWNxdWlyZSBib3RoIGxvY2tzLCBzZWUKKwkgKiB0YXNrX3JxX2xvY2soKS4KKwkgKi8KIAlXQVJOX09OX09OQ0UoZGVidWdfbG9ja3MgJiYgIShsb2NrZGVwX2lzX2hlbGQoJnAtPnBpX2xvY2spIHx8CiAJCQkJICAgICAgbG9ja2RlcF9pc19oZWxkKCZ0YXNrX3JxKHApLT5sb2NrKSkpOwogI2VuZGlmCkBAIC0yNDQ3LDYgKzI0NTgsMTAgQEAKIAkJfQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CisKKwlpZiAod2FrZV9mbGFncyAmIFdGX01JR1JBVEVEKQorCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKKwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogCXNjaGVkc3RhdF9pbmMocnEsIHR0d3VfY291bnQpOwpAQCAtMjQ1NSw5ICsyNDcwLDYgQEAKIAlpZiAod2FrZV9mbGFncyAmIFdGX1NZTkMpCiAJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3N5bmMpOwogCi0JaWYgKGNwdSAhPSB0YXNrX2NwdShwKSkKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSk7Ci0KICNlbmRpZiAvKiBDT05GSUdfU0NIRURTVEFUUyAqLwogfQogCkBAIC0yNjAwLDYgKzI2MTIsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogCWlmIChzY2hlZF9mZWF0KFRUV1VfUVVFVUUpICYmIGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJc2NoZWRfY2xvY2tfY3B1KGNwdSk7IC8qIHN5bmMgY2xvY2tzIHgtY3B1ICovCiAJCXR0d3VfcXVldWVfcmVtb3RlKHAsIGNwdSk7CiAJCXJldHVybjsKIAl9CkBAIC0yNjc0LDggKzI2ODcsMTAgQEAKIAkJcC0+c2NoZWRfY2xhc3MtPnRhc2tfd2FraW5nKHApOwogCiAJY3B1ID0gc2VsZWN0X3Rhc2tfcnEocCwgU0RfQkFMQU5DRV9XQUtFLCB3YWtlX2ZsYWdzKTsKLQlpZiAodGFza19jcHUocCkgIT0gY3B1KQorCWlmICh0YXNrX2NwdShwKSAhPSBjcHUpIHsKKwkJd2FrZV9mbGFncyB8PSBXRl9NSUdSQVRFRDsKIAkJc2V0X3Rhc2tfY3B1KHAsIGNwdSk7CisJfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogCXR0d3VfcXVldWUocCwgY3B1KTsKQEAgLTc3NDIsNiArNzc1Nyw5IEBACiAjZW5kaWYKICNlbmRpZgogCWNmc19ycS0+bWluX3ZydW50aW1lID0gKHU2NCkoLSgxTEwgPDwgMjApKTsKKyNpZm5kZWYgQ09ORklHXzY0QklUCisJY2ZzX3JxLT5taW5fdnJ1bnRpbWVfY29weSA9IGNmc19ycS0+bWluX3ZydW50aW1lOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSwgc3RydWN0IHJxICpycSkKQEAgLTg0MzUsMTAgKzg0NTMsNyBAQAogCWlmICghdGctPnNlWzBdKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzaGFyZXMgPCBNSU5fU0hBUkVTKQotCQlzaGFyZXMgPSBNSU5fU0hBUkVTOwotCWVsc2UgaWYgKHNoYXJlcyA+IE1BWF9TSEFSRVMpCi0JCXNoYXJlcyA9IE1BWF9TSEFSRVM7CisJc2hhcmVzID0gY2xhbXAoc2hhcmVzLCBzY2FsZV9sb2FkKE1JTl9TSEFSRVMpLCBzY2FsZV9sb2FkKE1BWF9TSEFSRVMpKTsKIAogCW11dGV4X2xvY2soJnNoYXJlc19tdXRleCk7CiAJaWYgKHRnLT5zaGFyZXMgPT0gc2hhcmVzKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX3J0LmMgYi9rZXJuZWwvc2NoZWRfcnQuYwppbmRleCA4ODcyNWM5Li4xMGQwMTgyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfcnQuYworKysgYi9rZXJuZWwvc2NoZWRfcnQuYwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAkgKiB0byBtb3ZlIGN1cnJlbnQgc29tZXdoZXJlIGVsc2UsIG1ha2luZyByb29tIGZvciBvdXIgbm9uLW1pZ3JhdGFibGUKIAkgKiB0YXNrLgogCSAqLwotCWlmIChwLT5wcmlvID09IHJxLT5jdXJyLT5wcmlvICYmICFuZWVkX3Jlc2NoZWQoKSkKKwlpZiAocC0+cHJpbyA9PSBycS0+Y3Vyci0+cHJpbyAmJiAhdGVzdF90c2tfbmVlZF9yZXNjaGVkKHJxLT5jdXJyKSkKIAkJY2hlY2tfcHJlZW1wdF9lcXVhbF9wcmlvKHJxLCBwKTsKICNlbmRpZgogfQpAQCAtMTIzOSw2ICsxMjM5LDEwIEBACiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBjcHUgICAgICA9IHRhc2tfY3B1KHRhc2spOwogCisJLyogTWFrZSBzdXJlIHRoZSBtYXNrIGlzIGluaXRpYWxpemVkIGZpcnN0ICovCisJaWYgKHVubGlrZWx5KCFsb3dlc3RfbWFzaykpCisJCXJldHVybiAtMTsKKwogCWlmICh0YXNrLT5ydC5ucl9jcHVzX2FsbG93ZWQgPT0gMSkKIAkJcmV0dXJuIC0xOyAvKiBObyBvdGhlciB0YXJnZXRzIHBvc3NpYmxlICovCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4NmMzMmI4Li5mZjc2Nzg2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0yMzY1LDcgKzIzNjUsNyBAQAogLyoqCiAgKiAgc3lzX3J0X3NpZ3Byb2NtYXNrIC0gY2hhbmdlIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBibG9ja2VkIHNpZ25hbHMKICAqICBAaG93OiB3aGV0aGVyIHRvIGFkZCwgcmVtb3ZlLCBvciBzZXQgc2lnbmFscwotICogIEBzZXQ6IHN0b3JlcyBwZW5kaW5nIHNpZ25hbHMKKyAqICBAbnNldDogc3RvcmVzIHBlbmRpbmcgc2lnbmFscwogICogIEBvc2V0OiBwcmV2aW91cyB2YWx1ZSBvZiBzaWduYWwgbWFzayBpZiBub24tbnVsbAogICogIEBzaWdzZXRzaXplOiBzaXplIG9mIHNpZ3NldF90IHR5cGUKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IDczYTE5NTEuLmZiNjdkZmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAkubm90aWZpZXJfY2FsbAkJPSBob3RwbHVnX2NmZCwKIH07CiAKLXN0YXRpYyBpbnQgX19jcHVpbml0IGluaXRfY2FsbF9zaW5nbGVfZGF0YSh2b2lkKQordm9pZCBfX2luaXQgY2FsbF9mdW5jdGlvbl9pbml0KHZvaWQpCiB7CiAJdm9pZCAqY3B1ID0gKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IGk7CkBAIC04OCwxMCArODgsNyBAQAogCiAJaG90cGx1Z19jZmQoJmhvdHBsdWdfY2ZkX25vdGlmaWVyLCBDUFVfVVBfUFJFUEFSRSwgY3B1KTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmhvdHBsdWdfY2ZkX25vdGlmaWVyKTsKLQotCXJldHVybiAwOwogfQotZWFybHlfaW5pdGNhbGwoaW5pdF9jYWxsX3NpbmdsZV9kYXRhKTsKIAogLyoKICAqIGNzZF9sb2NrL2NzZF91bmxvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHBlci1jcHUgY3NkIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMTM5NjAxNy4uNDBjZjYzZCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC01OCw3ICs1OCw3IEBACiAKIGNoYXIgKnNvZnRpcnFfdG9fbmFtZVtOUl9TT0ZUSVJRU10gPSB7CiAJIkhJIiwgIlRJTUVSIiwgIk5FVF9UWCIsICJORVRfUlgiLCAiQkxPQ0siLCAiQkxPQ0tfSU9QT0xMIiwKLQkiVEFTS0xFVCIsICJTQ0hFRCIsICJIUlRJTUVSIgorCSJUQVNLTEVUIiwgIlNDSEVEIiwgIkhSVElNRVIiLCAiUkNVIgogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCA0ZmM5MjQ0Li5mMTc1ZDk4IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC05MzgsNiArOTM4LDEyIEBACiAJfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUworCS8qCisJICogVXNlci1zcGFjZSBzY3JpcHRzIHJlbHkgb24gdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGZpbGUKKwkgKiBhcyBhIGZlYXR1cmUgY2hlY2sgZm9yIHBlcmZfZXZlbnRzIGJlaW5nIGVuYWJsZWQuCisJICoKKwkgKiBTbyBpdCdzIGFuIEFCSSwgZG8gbm90IHJlbW92ZSEKKwkgKi8KIAl7CiAJCS5wcm9jbmFtZQk9ICJwZXJmX2V2ZW50X3BhcmFub2lkIiwKIAkJLmRhdGEJCT0gJnN5c2N0bF9wZXJmX2V2ZW50X3BhcmFub2lkLApkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IDlmZmVhMzYuLmZjMGYyMjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTI4NSwxNiArMjg1LDE4IEBACiBzdGF0aWMgaW50IGFkZF9kZWxfbGlzdGVuZXIocGlkX3QgcGlkLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgaW50IGlzYWRkKQogewogCXN0cnVjdCBsaXN0ZW5lcl9saXN0ICpsaXN0ZW5lcnM7Ci0Jc3RydWN0IGxpc3RlbmVyICpzLCAqdG1wOworCXN0cnVjdCBsaXN0ZW5lciAqcywgKnRtcCwgKnMyOwogCXVuc2lnbmVkIGludCBjcHU7CiAKIAlpZiAoIWNwdW1hc2tfc3Vic2V0KG1hc2ssIGNwdV9wb3NzaWJsZV9tYXNrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlzID0gTlVMTDsKIAlpZiAoaXNhZGQgPT0gUkVHSVNURVIpIHsKIAkJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykgewotCQkJcyA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGxpc3RlbmVyKSwgR0ZQX0tFUk5FTCwKLQkJCQkJIGNwdV90b19ub2RlKGNwdSkpOworCQkJaWYgKCFzKQorCQkJCXMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBsaXN0ZW5lciksCisJCQkJCQkgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CiAJCQlpZiAoIXMpCiAJCQkJZ290byBjbGVhbnVwOwogCQkJcy0+cGlkID0gcGlkOwpAQCAtMzAzLDkgKzMwNSwxNiBAQAogCiAJCQlsaXN0ZW5lcnMgPSAmcGVyX2NwdShsaXN0ZW5lcl9hcnJheSwgY3B1KTsKIAkJCWRvd25fd3JpdGUoJmxpc3RlbmVycy0+c2VtKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzMiwgdG1wLCAmbGlzdGVuZXJzLT5saXN0LCBsaXN0KSB7CisJCQkJaWYgKHMyLT5waWQgPT0gcGlkKQorCQkJCQlnb3RvIG5leHRfY3B1OworCQkJfQogCQkJbGlzdF9hZGQoJnMtPmxpc3QsICZsaXN0ZW5lcnMtPmxpc3QpOworCQkJcyA9IE5VTEw7CituZXh0X2NwdToKIAkJCXVwX3dyaXRlKCZsaXN0ZW5lcnMtPnNlbSk7CiAJCX0KKwkJa2ZyZWUocyk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvYWxhcm10aW1lci5jIGIva2VybmVsL3RpbWUvYWxhcm10aW1lci5jCmluZGV4IDJkOTY2MjQuLjU5ZjM2OWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYworKysgYi9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMKQEAgLTQyLDE1ICs0Miw3NSBAQAogCWNsb2NraWRfdAkJYmFzZV9jbG9ja2lkOwogfSBhbGFybV9iYXNlc1tBTEFSTV9OVU1UWVBFXTsKIAorLyogZnJlZXplciBkZWx0YSAmIGxvY2sgdXNlZCB0byBoYW5kbGUgY2xvY2tfbmFub3NsZWVwIHRyaWdnZXJlZCB3YWtldXBzICovCitzdGF0aWMga3RpbWVfdCBmcmVlemVyX2RlbHRhOworc3RhdGljIERFRklORV9TUElOTE9DSyhmcmVlemVyX2RlbHRhX2xvY2spOworCiAjaWZkZWYgQ09ORklHX1JUQ19DTEFTUwogLyogcnRjIHRpbWVyIGFuZCBkZXZpY2UgZm9yIHNldHRpbmcgYWxhcm0gd2FrZXVwcyBhdCBzdXNwZW5kICovCiBzdGF0aWMgc3RydWN0IHJ0Y190aW1lcgkJcnRjdGltZXI7CiBzdGF0aWMgc3RydWN0IHJ0Y19kZXZpY2UJKnJ0Y2RldjsKLSNlbmRpZgorc3RhdGljIERFRklORV9TUElOTE9DSyhydGNkZXZfbG9jayk7CiAKLS8qIGZyZWV6ZXIgZGVsdGEgJiBsb2NrIHVzZWQgdG8gaGFuZGxlIGNsb2NrX25hbm9zbGVlcCB0cmlnZ2VyZWQgd2FrZXVwcyAqLwotc3RhdGljIGt0aW1lX3QgZnJlZXplcl9kZWx0YTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnJlZXplcl9kZWx0YV9sb2NrKTsKKy8qKgorICogaGFzX3dha2VhbGFybSAtIGNoZWNrIHJ0YyBkZXZpY2UgaGFzIHdha2VhbGFybSBhYmlsaXR5CisgKiBAZGV2OiBjdXJyZW50IGRldmljZQorICogQG5hbWVfcHRyOiBuYW1lIHRvIGJlIHJldHVybmVkCisgKgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcnRjIGRldmljZSBjYW4gd2FrZQorICogZnJvbSBzdXNwZW5kLgorICovCitzdGF0aWMgaW50IGhhc193YWtlYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpuYW1lX3B0cikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqY2FuZGlkYXRlID0gdG9fcnRjX2RldmljZShkZXYpOworCisJaWYgKCFjYW5kaWRhdGUtPm9wcy0+c2V0X2FsYXJtKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRldmljZV9tYXlfd2FrZXVwKGNhbmRpZGF0ZS0+ZGV2LnBhcmVudCkpCisJCXJldHVybiAwOworCisJKihjb25zdCBjaGFyICoqKW5hbWVfcHRyID0gZGV2X25hbWUoZGV2KTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBhbGFybXRpbWVyX2dldF9ydGNkZXYgLSBSZXR1cm4gc2VsZWN0ZWQgcnRjZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBydGMgZGV2aWNlIHRvIHVzZSBmb3Igd2FrZWFsYXJtcy4KKyAqIElmIG9uZSBoYXMgbm90IGFscmVhZHkgYmVlbiBjaG9zZW4sIGl0IGNoZWNrcyB0byBzZWUgaWYgYQorICogZnVuY3Rpb25hbCBydGMgZGV2aWNlIGlzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBydGNfZGV2aWNlICphbGFybXRpbWVyX2dldF9ydGNkZXYodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY2hhciAqc3RyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNkZXZfbG9jaywgZmxhZ3MpOworCWlmICghcnRjZGV2KSB7CisJCS8qIEZpbmQgYW4gcnRjIGRldmljZSBhbmQgaW5pdCB0aGUgcnRjX3RpbWVyICovCisJCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKHJ0Y19jbGFzcywgTlVMTCwgJnN0ciwgaGFzX3dha2VhbGFybSk7CisJCS8qIElmIHdlIGhhdmUgYSBkZXZpY2UgdGhlbiBzdHIgaXMgdmFsaWQuIFNlZSBoYXNfd2FrZWFsYXJtKCkgKi8KKwkJaWYgKGRldikgeworCQkJcnRjZGV2ID0gcnRjX2NsYXNzX29wZW4oc3RyKTsKKwkJCS8qCisJCQkgKiBEcm9wIHRoZSByZWZlcmVuY2Ugd2UgZ290IGluIGNsYXNzX2ZpbmRfZGV2aWNlLAorCQkJICogcnRjX29wZW4gdGFrZXMgaXRzIG93bi4KKwkJCSAqLworCQkJcHV0X2RldmljZShkZXYpOworCQkJcnRjX3RpbWVyX2luaXQoJnJ0Y3RpbWVyLCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwlyZXQgPSBydGNkZXY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjZGV2X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisjZWxzZQorI2RlZmluZSBhbGFybXRpbWVyX2dldF9ydGNkZXYoKSAoMCkKKyNkZWZpbmUgcnRjZGV2ICgwKQorI2VuZGlmCiAKIAogLyoqCkBAIC0xNjYsNiArMjI2LDcgQEAKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAJa3RpbWVfdCBtaW4sIG5vdzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJaW50IGk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZXplcl9kZWx0YV9sb2NrLCBmbGFncyk7CkBAIC0xNzMsOCArMjM0LDkgQEAKIAlmcmVlemVyX2RlbHRhID0ga3RpbWVfc2V0KDAsIDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWV6ZXJfZGVsdGFfbG9jaywgZmxhZ3MpOwogCisJcnRjID0gcnRjZGV2OwogCS8qIElmIHdlIGhhdmUgbm8gcnRjZGV2LCBqdXN0IHJldHVybiAqLwotCWlmICghcnRjZGV2KQorCWlmICghcnRjKQogCQlyZXR1cm4gMDsKIAogCS8qIEZpbmQgdGhlIHNvb25lc3QgdGltZXIgdG8gZXhwaXJlKi8KQEAgLTE5OSwxMiArMjYxLDEyIEBACiAJV0FSTl9PTihtaW4udHY2NCA8IE5TRUNfUEVSX1NFQyk7CiAKIAkvKiBTZXR1cCBhbiBydGMgdGltZXIgdG8gZmlyZSB0aGF0IGZhciBpbiB0aGUgZnV0dXJlICovCi0JcnRjX3RpbWVyX2NhbmNlbChydGNkZXYsICZydGN0aW1lcik7Ci0JcnRjX3JlYWRfdGltZShydGNkZXYsICZ0bSk7CisJcnRjX3RpbWVyX2NhbmNlbChydGMsICZydGN0aW1lcik7CisJcnRjX3JlYWRfdGltZShydGMsICZ0bSk7CiAJbm93ID0gcnRjX3RtX3RvX2t0aW1lKHRtKTsKIAlub3cgPSBrdGltZV9hZGQobm93LCBtaW4pOwogCi0JcnRjX3RpbWVyX3N0YXJ0KHJ0Y2RldiwgJnJ0Y3RpbWVyLCBub3csIGt0aW1lX3NldCgwLCAwKSk7CisJcnRjX3RpbWVyX3N0YXJ0KHJ0YywgJnJ0Y3RpbWVyLCBub3csIGt0aW1lX3NldCgwLCAwKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMyMiw2ICszODQsOSBAQAogewogCWNsb2NraWRfdCBiYXNlaWQgPSBhbGFybV9iYXNlc1tjbG9jazJhbGFybSh3aGljaF9jbG9jayldLmJhc2VfY2xvY2tpZDsKIAorCWlmICghYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAlyZXR1cm4gaHJ0aW1lcl9nZXRfcmVzKGJhc2VpZCwgdHApOwogfQogCkBAIC0zMzYsNiArNDAxLDkgQEAKIHsKIAlzdHJ1Y3QgYWxhcm1fYmFzZSAqYmFzZSA9ICZhbGFybV9iYXNlc1tjbG9jazJhbGFybSh3aGljaF9jbG9jayldOwogCisJaWYgKCFhbGFybXRpbWVyX2dldF9ydGNkZXYoKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCSp0cCA9IGt0aW1lX3RvX3RpbWVzcGVjKGJhc2UtPmdldHRpbWUoKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTEsNiArNDE5LDkgQEAKIAllbnVtICBhbGFybXRpbWVyX3R5cGUgdHlwZTsKIAlzdHJ1Y3QgYWxhcm1fYmFzZSAqYmFzZTsKIAorCWlmICghYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAlpZiAoIWNhcGFibGUoQ0FQX1dBS0VfQUxBUk0pKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0zODUsNiArNDU2LDkgQEAKICAqLwogc3RhdGljIGludCBhbGFybV90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1yKQogeworCWlmICghcnRjZGV2KQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJYWxhcm1fY2FuY2VsKCZ0aW1yLT5pdC5hbGFybXRpbWVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQwMiw2ICs0NzYsOSBAQAogCQkJCXN0cnVjdCBpdGltZXJzcGVjICpuZXdfc2V0dGluZywKIAkJCQlzdHJ1Y3QgaXRpbWVyc3BlYyAqb2xkX3NldHRpbmcpCiB7CisJaWYgKCFydGNkZXYpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAkvKiBTYXZlIG9sZCB2YWx1ZXMgKi8KIAlvbGRfc2V0dGluZy0+aXRfaW50ZXJ2YWwgPQogCQkJa3RpbWVfdG9fdGltZXNwZWModGltci0+aXQuYWxhcm10aW1lci5wZXJpb2QpOwpAQCAtNTQxLDYgKzYxOCw5IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQ7CiAKKwlpZiAoIWFsYXJtdGltZXJfZ2V0X3J0Y2RldigpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJaWYgKCFjYXBhYmxlKENBUF9XQUtFX0FMQVJNKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtNjM4LDY1ICs3MTgsMyBAQAogfQogZGV2aWNlX2luaXRjYWxsKGFsYXJtdGltZXJfaW5pdCk7CiAKLSNpZmRlZiBDT05GSUdfUlRDX0NMQVNTCi0vKioKLSAqIGhhc193YWtlYWxhcm0gLSBjaGVjayBydGMgZGV2aWNlIGhhcyB3YWtlYWxhcm0gYWJpbGl0eQotICogQGRldjogY3VycmVudCBkZXZpY2UKLSAqIEBuYW1lX3B0cjogbmFtZSB0byBiZSByZXR1cm5lZAotICoKLSAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHJ0YyBkZXZpY2UgY2FuIHdha2UKLSAqIGZyb20gc3VzcGVuZC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgaGFzX3dha2VhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKm5hbWVfcHRyKQotewotCXN0cnVjdCBydGNfZGV2aWNlICpjYW5kaWRhdGUgPSB0b19ydGNfZGV2aWNlKGRldik7Ci0KLQlpZiAoIWNhbmRpZGF0ZS0+b3BzLT5zZXRfYWxhcm0pCi0JCXJldHVybiAwOwotCWlmICghZGV2aWNlX21heV93YWtldXAoY2FuZGlkYXRlLT5kZXYucGFyZW50KSkKLQkJcmV0dXJuIDA7Ci0KLQkqKGNvbnN0IGNoYXIgKiopbmFtZV9wdHIgPSBkZXZfbmFtZShkZXYpOwotCXJldHVybiAxOwotfQotCi0vKioKLSAqIGFsYXJtdGltZXJfaW5pdF9sYXRlIC0gTGF0ZSBpbml0aWFsaXppbmcgb2YgYWxhcm10aW1lciBjb2RlCi0gKgotICogVGhpcyBmdW5jdGlvbiBsb2NhdGVzIGEgcnRjIGRldmljZSB0byB1c2UgZm9yIHdha2VhbGFybXMuCi0gKiBSdW4gYXMgbGF0ZV9pbml0Y2FsbCB0byBtYWtlIHN1cmUgcnRjIGRldmljZXMgaGF2ZSBiZWVuCi0gKiByZWdpc3RlcmVkLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBhbGFybXRpbWVyX2luaXRfbGF0ZSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljaGFyICpzdHI7Ci0KLQkvKiBGaW5kIGFuIHJ0YyBkZXZpY2UgYW5kIGluaXQgdGhlIHJ0Y190aW1lciAqLwotCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKHJ0Y19jbGFzcywgTlVMTCwgJnN0ciwgaGFzX3dha2VhbGFybSk7Ci0JLyogSWYgd2UgaGF2ZSBhIGRldmljZSB0aGVuIHN0ciBpcyB2YWxpZC4gU2VlIGhhc193YWtlYWxhcm0oKSAqLwotCWlmIChkZXYpIHsKLQkJcnRjZGV2ID0gcnRjX2NsYXNzX29wZW4oc3RyKTsKLQkJLyoKLQkJICogRHJvcCB0aGUgcmVmZXJlbmNlIHdlIGdvdCBpbiBjbGFzc19maW5kX2RldmljZSwKLQkJICogcnRjX29wZW4gdGFrZXMgaXRzIG93bi4KLQkJICovCi0JCXB1dF9kZXZpY2UoZGV2KTsKLQl9Ci0JaWYgKCFydGNkZXYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gUlRDIGRldmljZSBmb3VuZCwgQUxBUk0gdGltZXJzIHdpbGwiCi0JCQkiIG5vdCB3YWtlIGZyb20gc3VzcGVuZCIpOwotCX0KLQlydGNfdGltZXJfaW5pdCgmcnRjdGltZXIsIE5VTEwsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotc3RhdGljIGludCBfX2luaXQgYWxhcm10aW1lcl9pbml0X2xhdGUodm9pZCkKLXsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJLZXJuZWwgbm90IGJ1aWx0IHdpdGggUlRDIHN1cHBvcnQsIEFMQVJNIHRpbWVycyIKLQkJIiB3aWxsIG5vdCB3YWtlIGZyb20gc3VzcGVuZCIpOwotCXJldHVybiAwOwotfQotI2VuZGlmCi1sYXRlX2luaXRjYWxsKGFsYXJtdGltZXJfaW5pdF9sYXRlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IGMwMjdkNGYuLmU0YzY5OWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtMTgyLDcgKzE4MiwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlCVUdfT04oZGV2LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7Ci0JQlVHX09OKCFkZXYtPmNwdW1hc2spOworCWlmICghZGV2LT5jcHVtYXNrKSB7CisJCVdBUk5fT04obnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpOworCQlkZXYtPmNwdW1hc2sgPSBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfQogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2V2ZW50c19sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IDFjOTVmZDYuLmUwOTgwZjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtMTg1LDcgKzE4NSw2IEBACiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CiBzdGF0aWMgREVDTEFSRV9XT1JLKHdhdGNoZG9nX3dvcmssIGNsb2Nrc291cmNlX3dhdGNoZG9nX3dvcmspOwogc3RhdGljIERFRklORV9TUElOTE9DSyh3YXRjaGRvZ19sb2NrKTsKLXN0YXRpYyBjeWNsZV90IHdhdGNoZG9nX2xhc3Q7CiBzdGF0aWMgaW50IHdhdGNoZG9nX3J1bm5pbmc7CiAKIHN0YXRpYyBpbnQgY2xvY2tzb3VyY2Vfd2F0Y2hkb2dfa3RocmVhZCh2b2lkICpkYXRhKTsKQEAgLTI1NCwxMSArMjUzLDYgQEAKIAlpZiAoIXdhdGNoZG9nX3J1bm5pbmcpCiAJCWdvdG8gb3V0OwogCi0Jd2Rub3cgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7Ci0Jd2RfbnNlYyA9IGNsb2Nrc291cmNlX2N5YzJucygod2Rub3cgLSB3YXRjaGRvZ19sYXN0KSAmIHdhdGNoZG9nLT5tYXNrLAotCQkJCSAgICAgd2F0Y2hkb2ctPm11bHQsIHdhdGNoZG9nLT5zaGlmdCk7Ci0Jd2F0Y2hkb2dfbGFzdCA9IHdkbm93OwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcywgJndhdGNoZG9nX2xpc3QsIHdkX2xpc3QpIHsKIAogCQkvKiBDbG9ja3NvdXJjZSBhbHJlYWR5IG1hcmtlZCB1bnN0YWJsZT8gKi8KQEAgLTI2OCwxOSArMjYyLDI4IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCWNzbm93ID0gY3MtPnJlYWQoY3MpOworCQl3ZG5vdyA9IHdhdGNoZG9nLT5yZWFkKHdhdGNoZG9nKTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJCS8qIENsb2Nrc291cmNlIGluaXRpYWxpemVkID8gKi8KIAkJaWYgKCEoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1dBVENIRE9HKSkgewogCQkJY3MtPmZsYWdzIHw9IENMT0NLX1NPVVJDRV9XQVRDSERPRzsKLQkJCWNzLT53ZF9sYXN0ID0gY3Nub3c7CisJCQljcy0+d2RfbGFzdCA9IHdkbm93OworCQkJY3MtPmNzX2xhc3QgPSBjc25vdzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJLyogQ2hlY2sgdGhlIGRldmlhdGlvbiBmcm9tIHRoZSB3YXRjaGRvZyBjbG9ja3NvdXJjZS4gKi8KLQkJY3NfbnNlYyA9IGNsb2Nrc291cmNlX2N5YzJucygoY3Nub3cgLSBjcy0+d2RfbGFzdCkgJgorCQl3ZF9uc2VjID0gY2xvY2tzb3VyY2VfY3ljMm5zKCh3ZG5vdyAtIGNzLT53ZF9sYXN0KSAmIHdhdGNoZG9nLT5tYXNrLAorCQkJCQkgICAgIHdhdGNoZG9nLT5tdWx0LCB3YXRjaGRvZy0+c2hpZnQpOworCisJCWNzX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKGNzbm93IC0gY3MtPmNzX2xhc3QpICYKIAkJCQkJICAgICBjcy0+bWFzaywgY3MtPm11bHQsIGNzLT5zaGlmdCk7Ci0JCWNzLT53ZF9sYXN0ID0gY3Nub3c7CisJCWNzLT5jc19sYXN0ID0gY3Nub3c7CisJCWNzLT53ZF9sYXN0ID0gd2Rub3c7CisKKwkJLyogQ2hlY2sgdGhlIGRldmlhdGlvbiBmcm9tIHRoZSB3YXRjaGRvZyBjbG9ja3NvdXJjZS4gKi8KIAkJaWYgKGFicyhjc19uc2VjIC0gd2RfbnNlYykgPiBXQVRDSERPR19USFJFU0hPTEQpIHsKIAkJCWNsb2Nrc291cmNlX3Vuc3RhYmxlKGNzLCBjc19uc2VjIC0gd2RfbnNlYyk7CiAJCQljb250aW51ZTsKQEAgLTMxOCw3ICszMjEsNiBAQAogCQlyZXR1cm47CiAJaW5pdF90aW1lcigmd2F0Y2hkb2dfdGltZXIpOwogCXdhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gY2xvY2tzb3VyY2Vfd2F0Y2hkb2c7Ci0Jd2F0Y2hkb2dfbGFzdCA9IHdhdGNoZG9nLT5yZWFkKHdhdGNoZG9nKTsKIAl3YXRjaGRvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIFdBVENIRE9HX0lOVEVSVkFMOwogCWFkZF90aW1lcl9vbigmd2F0Y2hkb2dfdGltZXIsIGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKSk7CiAJd2F0Y2hkb2dfcnVubmluZyA9IDE7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IGZkNjE5ODYuLjhjZmYzNjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC03NDksMTYgKzc0OSwxNSBAQAogCXVuc2lnbmVkIGxvbmcgZXhwaXJlc19saW1pdCwgbWFzazsKIAlpbnQgYml0OwogCi0JZXhwaXJlc19saW1pdCA9IGV4cGlyZXM7Ci0KIAlpZiAodGltZXItPnNsYWNrID49IDApIHsKIAkJZXhwaXJlc19saW1pdCA9IGV4cGlyZXMgKyB0aW1lci0+c2xhY2s7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCQlsb25nIGRlbHRhID0gZXhwaXJlcyAtIGppZmZpZXM7CiAKLQkJLyogTm8gc2xhY2ssIGlmIGFscmVhZHkgZXhwaXJlZCBlbHNlIGF1dG8gc2xhY2sgMC40JSAqLwotCQlpZiAodGltZV9hZnRlcihleHBpcmVzLCBub3cpKQotCQkJZXhwaXJlc19saW1pdCA9IGV4cGlyZXMgKyAoZXhwaXJlcyAtIG5vdykvMjU2OworCQlpZiAoZGVsdGEgPCAyNTYpCisJCQlyZXR1cm4gZXhwaXJlczsKKworCQlleHBpcmVzX2xpbWl0ID0gZXhwaXJlcyArIGRlbHRhIC8gMjU2OwogCX0KIAltYXNrID0gZXhwaXJlcyBeIGV4cGlyZXNfbGltaXQ7CiAJaWYgKG1hc2sgPT0gMCkKQEAgLTc5NSw2ICs3OTQsOCBAQAogICovCiBpbnQgbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKQogeworCWV4cGlyZXMgPSBhcHBseV9zbGFjayh0aW1lciwgZXhwaXJlcyk7CisKIAkvKgogCSAqIFRoaXMgaXMgYSBjb21tb24gb3B0aW1pemF0aW9uIHRyaWdnZXJlZCBieSB0aGUKIAkgKiBuZXR3b3JraW5nIGNvZGUgLSBpZiB0aGUgdGltZXIgaXMgcmUtbW9kaWZpZWQKQEAgLTgwMyw4ICs4MDQsNiBAQAogCWlmICh0aW1lcl9wZW5kaW5nKHRpbWVyKSAmJiB0aW1lci0+ZXhwaXJlcyA9PSBleHBpcmVzKQogCQlyZXR1cm4gMTsKIAotCWV4cGlyZXMgPSBhcHBseV9zbGFjayh0aW1lciwgZXhwaXJlcyk7Ci0KIAlyZXR1cm4gX19tb2RfdGltZXIodGltZXIsIGV4cGlyZXMsIGZhbHNlLCBUSU1FUl9OT1RfUElOTkVEKTsKIH0KIEVYUE9SVF9TWU1CT0wobW9kX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCAxZWU0MTdmLi45MDgwMzhmIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC0yNzQwLDcgKzI3NDAsNyBAQAogewogCWNoYXIgKmZ1bmMsICpjb21tYW5kLCAqbmV4dCA9IGJ1ZmY7CiAJc3RydWN0IGZ0cmFjZV9mdW5jX2NvbW1hbmQgKnA7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWZ1bmMgPSBzdHJzZXAoJm5leHQsICI6Iik7CiAKQEAgLTMzMzAsNiArMzMzMCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyAqcDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKIAlwID0gc3RhcnQ7CkBAIC0zMzQ2LDcgKzMzNDcsMTMgQEAKIAkJZnRyYWNlX3JlY29yZF9pcChhZGRyKTsKIAl9CiAKKwkvKgorCSAqIERpc2FibGUgaW50ZXJydXB0cyB0byBwcmV2ZW50IGludGVycnVwdHMgZnJvbSBleGVjdXRpbmcKKwkgKiBjb2RlIHRoYXQgaXMgYmVpbmcgbW9kaWZpZWQuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWZ0cmFjZV91cGRhdGVfY29kZShtb2QpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAltdXRleF91bmxvY2soJmZ0cmFjZV9sb2NrKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCmluZGV4IGY5MjVjNDUuLjI3ZDEzYjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKQEAgLTE4NzAsOCArMTg3MCwxMiBAQAogCiAjaWZkZWYgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QKIAotc3RhdGljIGludCBrcHJvYmVfdHJhY2Vfc2VsZnRlc3RfdGFyZ2V0KGludCBhMSwgaW50IGEyLCBpbnQgYTMsCi0JCQkJCWludCBhNCwgaW50IGE1LCBpbnQgYTYpCisvKgorICogVGhlICJfX3VzZWQiIGtlZXBzIGdjYyBmcm9tIHJlbW92aW5nIHRoZSBmdW5jdGlvbiBzeW1ib2wKKyAqIGZyb20gdGhlIGthbGxzeW1zIHRhYmxlLgorICovCitzdGF0aWMgX191c2VkIGludCBrcHJvYmVfdHJhY2Vfc2VsZnRlc3RfdGFyZ2V0KGludCBhMSwgaW50IGEyLCBpbnQgYTMsCisJCQkJCSAgICAgICBpbnQgYTQsIGludCBhNSwgaW50IGE2KQogewogCXJldHVybiBhMSArIGEyICsgYTMgKyBhNCArIGE1ICsgYTY7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMKaW5kZXggZGZmNzYzYi4uMWYwNjQ2OCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYwpAQCAtMjQwLDEzICsyNDAsMTAgQEAKIAljb25zdCBjaGFyICoqZm10ID0gdjsKIAlpbnQgc3RhcnRfaW5kZXg7CiAKLQlpZiAoIWZtdCkKLQkJZm10ID0gX19zdGFydF9fX3RyYWNlX2JwcmludGtfZm10ICsgKnBvczsKLQogCXN0YXJ0X2luZGV4ID0gX19zdG9wX19fdHJhY2VfYnByaW50a19mbXQgLSBfX3N0YXJ0X19fdHJhY2VfYnByaW50a19mbXQ7CiAKIAlpZiAoKnBvcyA8IHN0YXJ0X2luZGV4KQotCQlyZXR1cm4gZm10OworCQlyZXR1cm4gX19zdGFydF9fX3RyYWNlX2JwcmludGtfZm10ICsgKnBvczsKIAogCXJldHVybiBmaW5kX25leHRfbW9kX2Zvcm1hdChzdGFydF9pbmRleCwgdiwgZm10LCBwb3MpOwogfQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCAyOGFmYTRjLi5kZDM3M2M4IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAJYm9vbCAiVmVyYm9zZSBCVUcoKSByZXBvcnRpbmcgKGFkZHMgNzBLKSIgaWYgREVCVUdfS0VSTkVMICYmIEVYUEVSVAogCWRlcGVuZHMgb24gQlVHCiAJZGVwZW5kcyBvbiBBUk0gfHwgQVZSMzIgfHwgTTMyUiB8fCBNNjhLIHx8IFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBcCi0JCSAgIEZSViB8fCBTVVBFUkggfHwgR0VORVJJQ19CVUcgfHwgQkxBQ0tGSU4gfHwgTU4xMDMwMAorCQkgICBGUlYgfHwgU1VQRVJIIHx8IEdFTkVSSUNfQlVHIHx8IEJMQUNLRklOIHx8IE1OMTAzMDAgfHwgVElMRQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gbWFrZSBCVUcoKSBwYW5pY3Mgb3V0cHV0IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggNDFiYWYwMi4uM2YzYjY4MSAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtNTcyLDcgKzU3Miw3IEBACiAKIC8qKgogICogX19iaXRtYXBfcGFyc2VsaXN0IC0gY29udmVydCBsaXN0IGZvcm1hdCBBU0NJSSBzdHJpbmcgdG8gYml0bWFwCi0gKiBAYnA6IHJlYWQgbnVsLXRlcm1pbmF0ZWQgdXNlciBzdHJpbmcgZnJvbSB0aGlzIGJ1ZmZlcgorICogQGJ1ZjogcmVhZCBudWwtdGVybWluYXRlZCB1c2VyIHN0cmluZyBmcm9tIHRoaXMgYnVmZmVyCiAgKiBAYnVmbGVuOiBidWZmZXIgc2l6ZSBpbiBieXRlcy4gIElmIHN0cmluZyBpcyBzbWFsbGVyIHRoYW4gdGhpcwogICogICAgdGhlbiBpdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIFwwLgogICogQGlzX3VzZXI6IGxvY2F0aW9uIG9mIGJ1ZmZlciwgMCBpbmRpY2F0ZXMga2VybmVsIHNwYWNlCmRpZmYgLS1naXQgYS9saWIvZGVidWdvYmplY3RzLmMgYi9saWIvZGVidWdvYmplY3RzLmMKaW5kZXggOWQ4NmU0NS4uYTc4YjdjNiAxMDA2NDQKLS0tIGEvbGliL2RlYnVnb2JqZWN0cy5jCisrKyBiL2xpYi9kZWJ1Z29iamVjdHMuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJICogaW5pdGlhbGl6ZWQ6CiAJICovCiAJaWYgKG9ial9wb29sX2ZyZWUgPiBPREVCVUdfUE9PTF9TSVpFICYmIG9ial9jYWNoZSkKLQkJc2NoZWQgPSAhd29ya19wZW5kaW5nKCZkZWJ1Z19vYmpfd29yayk7CisJCXNjaGVkID0ga2V2ZW50ZF91cCgpICYmICF3b3JrX3BlbmRpbmcoJmRlYnVnX29ial93b3JrKTsKIAlobGlzdF9hZGRfaGVhZCgmb2JqLT5ub2RlLCAmb2JqX3Bvb2wpOwogCW9ial9wb29sX2ZyZWUrKzsKIAlvYmpfcG9vbF91c2VkLS07CmRpZmYgLS1naXQgYS9saWIva29iamVjdC5jIGIvbGliL2tvYmplY3QuYwppbmRleCA4MmRjMzRjLi42NDBiZDk4IDEwMDY0NAotLS0gYS9saWIva29iamVjdC5jCisrKyBiL2xpYi9rb2JqZWN0LmMKQEAgLTk0OCwxNCArOTQ4LDE0IEBACiB9CiAKIAotY29uc3Qgdm9pZCAqa29ial9uc19jdXJyZW50KGVudW0ga29ial9uc190eXBlIHR5cGUpCit2b2lkICprb2JqX25zX2dyYWJfY3VycmVudChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKQogewotCWNvbnN0IHZvaWQgKm5zID0gTlVMTDsKKwl2b2lkICpucyA9IE5VTEw7CiAKIAlzcGluX2xvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKIAlpZiAoKHR5cGUgPiBLT0JKX05TX1RZUEVfTk9ORSkgJiYgKHR5cGUgPCBLT0JKX05TX1RZUEVTKSAmJgogCSAgICBrb2JqX25zX29wc190YmxbdHlwZV0pCi0JCW5zID0ga29ial9uc19vcHNfdGJsW3R5cGVdLT5jdXJyZW50X25zKCk7CisJCW5zID0ga29ial9uc19vcHNfdGJsW3R5cGVdLT5ncmFiX2N1cnJlbnRfbnMoKTsKIAlzcGluX3VubG9jaygma29ial9uc190eXBlX2xvY2spOwogCiAJcmV0dXJuIG5zOwpAQCAtOTg3LDIzICs5ODcsMTUgQEAKIAlyZXR1cm4gbnM7CiB9CiAKLS8qCi0gKiBrb2JqX25zX2V4aXQgLSBpbnZhbGlkYXRlIGEgbmFtZXNwYWNlIHRhZwotICoKLSAqIEB0eXBlOiB0aGUgbmFtZXNwYWNlIHR5cGUgKGkuZS4gS09CSl9OU19UWVBFX05FVCkKLSAqIEBuczogdGhlIGFjdHVhbCBuYW1lc3BhY2UgYmVpbmcgaW52YWxpZGF0ZWQKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgdGFnIGlzIG5vIGxvbmdlciB2YWxpZC4gIEZvciBpbnN0YW5jZSwKLSAqIHdoZW4gYSBuZXR3b3JrIG5hbWVzcGFjZSBleGl0cywgaXQgdXNlcyB0aGlzIGhlbHBlciB0bwotICogbWFrZSBzdXJlIG5vIHNiJ3Mgc3lzZnNfaW5mbyBwb2ludHMgdG8gdGhlIG5vdy1pbnZhbGlkYXRlZAotICogbmV0bnMuCi0gKi8KLXZvaWQga29ial9uc19leGl0KGVudW0ga29ial9uc190eXBlIHR5cGUsIGNvbnN0IHZvaWQgKm5zKQordm9pZCBrb2JqX25zX2Ryb3AoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgdm9pZCAqbnMpCiB7Ci0Jc3lzZnNfZXhpdF9ucyh0eXBlLCBucyk7CisJc3Bpbl9sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisJaWYgKCh0eXBlID4gS09CSl9OU19UWVBFX05PTkUpICYmICh0eXBlIDwgS09CSl9OU19UWVBFUykgJiYKKwkgICAga29ial9uc19vcHNfdGJsW3R5cGVdICYmIGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+ZHJvcF9ucykKKwkJa29ial9uc19vcHNfdGJsW3R5cGVdLT5kcm9wX25zKG5zKTsKKwlzcGluX3VubG9jaygma29ial9uc190eXBlX2xvY2spOwogfQogCi0KIEVYUE9SVF9TWU1CT0woa29iamVjdF9nZXQpOwogRVhQT1JUX1NZTUJPTChrb2JqZWN0X3B1dCk7CiBFWFBPUlRfU1lNQk9MKGtvYmplY3RfZGVsKTsKZGlmZiAtLWdpdCBhL2xpYi9zd2lvdGxiLmMgYi9saWIvc3dpb3RsYi5jCmluZGV4IDkzY2EwOGIuLjk5MDkzYjMgMTAwNjQ0Ci0tLSBhL2xpYi9zd2lvdGxiLmMKKysrIGIvbGliL3N3aW90bGIuYwpAQCAtMTEwLDYgKzExMCwxMSBAQAogX19zZXR1cCgic3dpb3RsYj0iLCBzZXR1cF9pb190bGJfbnBhZ2VzKTsKIC8qIG1ha2UgaW9fdGxiX292ZXJmbG93IHR1bmFibGUgdG9vPyAqLwogCit1bnNpZ25lZCBsb25nIHN3aW9sdGJfbnJfdGJsKHZvaWQpCit7CisJcmV0dXJuIGlvX3RsYl9uc2xhYnM7Cit9CisKIC8qIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIGhpZ2htZW0gcGFnZSAqLwogc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl92aXJ0X3RvX2J1cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwKIAkJCQkgICAgICB2b2xhdGlsZSB2b2lkICphZGRyZXNzKQpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBjMTEyMDU2Li40MzY1ZGYzIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtNjY2LDYgKzY2Niw4IEBACiAJCQljb2xvbnBvcyA9IGk7CiAJCX0KIAl9CisJaWYgKGxvbmdlc3QgPT0gMSkJCS8qIGRvbid0IGNvbXByZXNzIGEgc2luZ2xlIDAgKi8KKwkJY29sb25wb3MgPSAtMTsKIAogCS8qIGVtaXQgYWRkcmVzcyAqLwogCWZvciAoaSA9IDA7IGkgPCByYW5nZTsgaSsrKSB7CkBAIC04MjYsNyArODI4LDcgQEAKICAqICAgICAgIElQdjQgdXNlcyBkb3Qtc2VwYXJhdGVkIGRlY2ltYWwgd2l0aCBsZWFkaW5nIDAncyAoMDEwLjEyMy4wNDUuMDA2KQogICogLSAnW0lpXTRbaG5ibF0nIElQdjQgYWRkcmVzc2VzIGluIGhvc3QsIG5ldHdvcmssIGJpZyBvciBsaXR0bGUgZW5kaWFuIG9yZGVyCiAgKiAtICdJNmMnIGZvciBJUHY2IGFkZHJlc3NlcyBwcmludGVkIGFzIHNwZWNpZmllZCBieQotICogICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi02bWFuLXRleHQtYWRkci1yZXByZXNlbnRhdGlvbi0wMAorICogICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk1MgogICogLSAnVScgRm9yIGEgMTYgYnl0ZSBVVUlEL0dVSUQsIGl0IHByaW50cyB0aGUgVVVJRC9HVUlEIGluIHRoZSBmb3JtCiAgKiAgICAgICAieHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IgogICogICAgICAgT3B0aW9ucyBmb3IgJXBVIGFyZToKZGlmZiAtLWdpdCBhL21tL2NvbXBhY3Rpb24uYyBiL21tL2NvbXBhY3Rpb24uYwppbmRleCAwMjFhMjk2Li42Y2M2MDRiIDEwMDY0NAotLS0gYS9tbS9jb21wYWN0aW9uLmMKKysrIGIvbW0vY29tcGFjdGlvbi5jCkBAIC0xNDQsOSArMTQ0LDIwIEBACiAJaW50IG5yX2ZyZWVwYWdlcyA9IGNjLT5ucl9mcmVlcGFnZXM7CiAJc3RydWN0IGxpc3RfaGVhZCAqZnJlZWxpc3QgPSAmY2MtPmZyZWVwYWdlczsKIAorCS8qCisJICogSW5pdGlhbGlzZSB0aGUgZnJlZSBzY2FubmVyLiBUaGUgc3RhcnRpbmcgcG9pbnQgaXMgd2hlcmUgd2UgbGFzdAorCSAqIHNjYW5uZWQgZnJvbSAob3IgdGhlIGVuZCBvZiB0aGUgem9uZSBpZiBzdGFydGluZykuIFRoZSBsb3cgcG9pbnQKKwkgKiBpcyB0aGUgZW5kIG9mIHRoZSBwYWdlYmxvY2sgdGhlIG1pZ3JhdGlvbiBzY2FubmVyIGlzIHVzaW5nLgorCSAqLwogCXBmbiA9IGNjLT5mcmVlX3BmbjsKIAlsb3dfcGZuID0gY2MtPm1pZ3JhdGVfcGZuICsgcGFnZWJsb2NrX25yX3BhZ2VzOwotCWhpZ2hfcGZuID0gbG93X3BmbjsKKworCS8qCisJICogVGFrZSBjYXJlIHRoYXQgaWYgdGhlIG1pZ3JhdGlvbiBzY2FubmVyIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHpvbmUKKwkgKiB0aGF0IHRoZSBmcmVlIHNjYW5uZXIgZG9lcyBub3QgYWNjaWRlbnRhbGx5IG1vdmUgdG8gdGhlIG5leHQgem9uZQorCSAqIGluIHRoZSBuZXh0IGlzb2xhdGlvbiBjeWNsZS4KKwkgKi8KKwloaWdoX3BmbiA9IG1pbihsb3dfcGZuLCBwZm4pOwogCiAJLyoKIAkgKiBJc29sYXRlIGZyZWUgcGFnZXMgdW50aWwgZW5vdWdoIGFyZSBhdmFpbGFibGUgdG8gbWlncmF0ZSB0aGUKQEAgLTI0MCwxMSArMjUxLDE4IEBACiAJcmV0dXJuIGlzb2xhdGVkID4gKGluYWN0aXZlICsgYWN0aXZlKSAvIDI7CiB9CiAKKy8qIHBvc3NpYmxlIG91dGNvbWUgb2YgaXNvbGF0ZV9taWdyYXRlcGFnZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJSVNPTEFURV9BQk9SVCwJCS8qIEFib3J0IGNvbXBhY3Rpb24gbm93ICovCisJSVNPTEFURV9OT05FLAkJLyogTm8gcGFnZXMgaXNvbGF0ZWQsIGNvbnRpbnVlIHNjYW5uaW5nICovCisJSVNPTEFURV9TVUNDRVNTLAkvKiBQYWdlcyBpc29sYXRlZCwgbWlncmF0ZSAqLworfSBpc29sYXRlX21pZ3JhdGVfdDsKKwogLyoKICAqIElzb2xhdGUgYWxsIHBhZ2VzIHRoYXQgY2FuIGJlIG1pZ3JhdGVkIGZyb20gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKICAqIHRoZSBtaWdyYXRlIHNjYW5uZXIgd2l0aGluIGNvbXBhY3RfY29udHJvbC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNvbGF0ZV9taWdyYXRlcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsCitzdGF0aWMgaXNvbGF0ZV9taWdyYXRlX3QgaXNvbGF0ZV9taWdyYXRlcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsCiAJCQkJCXN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKQogewogCXVuc2lnbmVkIGxvbmcgbG93X3BmbiwgZW5kX3BmbjsKQEAgLTI2MSw3ICsyNzksNyBAQAogCS8qIERvIG5vdCBjcm9zcyB0aGUgZnJlZSBzY2FubmVyIG9yIHNjYW4gd2l0aGluIGEgbWVtb3J5IGhvbGUgKi8KIAlpZiAoZW5kX3BmbiA+IGNjLT5mcmVlX3BmbiB8fCAhcGZuX3ZhbGlkKGxvd19wZm4pKSB7CiAJCWNjLT5taWdyYXRlX3BmbiA9IGVuZF9wZm47Ci0JCXJldHVybiAwOworCQlyZXR1cm4gSVNPTEFURV9OT05FOwogCX0KIAogCS8qCkBAIC0yNzAsMTAgKzI4OCwxNCBAQAogCSAqIGRlbGF5IGZvciBzb21lIHRpbWUgdW50aWwgZmV3ZXIgcGFnZXMgYXJlIGlzb2xhdGVkCiAJICovCiAJd2hpbGUgKHVubGlrZWx5KHRvb19tYW55X2lzb2xhdGVkKHpvbmUpKSkgeworCQkvKiBhc3luYyBtaWdyYXRpb24gc2hvdWxkIGp1c3QgYWJvcnQgKi8KKwkJaWYgKCFjYy0+c3luYykKKwkJCXJldHVybiBJU09MQVRFX0FCT1JUOworCiAJCWNvbmdlc3Rpb25fd2FpdChCTEtfUldfQVNZTkMsIEhaLzEwKTsKIAogCQlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBJU09MQVRFX0FCT1JUOwogCX0KIAogCS8qIFRpbWUgdG8gaXNvbGF0ZSBzb21lIHBhZ2VzIGZvciBtaWdyYXRpb24gKi8KQEAgLTM1OCw3ICszODAsNyBAQAogCiAJdHJhY2VfbW1fY29tcGFjdGlvbl9pc29sYXRlX21pZ3JhdGVwYWdlcyhucl9zY2FubmVkLCBucl9pc29sYXRlZCk7CiAKLQlyZXR1cm4gY2MtPm5yX21pZ3JhdGVwYWdlczsKKwlyZXR1cm4gSVNPTEFURV9TVUNDRVNTOwogfQogCiAvKgpAQCAtNDIwLDEzICs0NDIsNiBAQAogCWlmIChjYy0+ZnJlZV9wZm4gPD0gY2MtPm1pZ3JhdGVfcGZuKQogCQlyZXR1cm4gQ09NUEFDVF9DT01QTEVURTsKIAotCS8qIENvbXBhY3Rpb24gcnVuIGlzIG5vdCBmaW5pc2hlZCBpZiB0aGUgd2F0ZXJtYXJrIGlzIG5vdCBtZXQgKi8KLQl3YXRlcm1hcmsgPSBsb3dfd21hcmtfcGFnZXMoem9uZSk7Ci0Jd2F0ZXJtYXJrICs9ICgxIDw8IGNjLT5vcmRlcik7Ci0KLQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIGNjLT5vcmRlciwgd2F0ZXJtYXJrLCAwLCAwKSkKLQkJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7Ci0KIAkvKgogCSAqIG9yZGVyID09IC0xIGlzIGV4cGVjdGVkIHdoZW4gY29tcGFjdGluZyB2aWEKIAkgKiAvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnkKQEAgLTQzNCw2ICs0NDksMTMgQEAKIAlpZiAoY2MtPm9yZGVyID09IC0xKQogCQlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKIAorCS8qIENvbXBhY3Rpb24gcnVuIGlzIG5vdCBmaW5pc2hlZCBpZiB0aGUgd2F0ZXJtYXJrIGlzIG5vdCBtZXQgKi8KKwl3YXRlcm1hcmsgPSBsb3dfd21hcmtfcGFnZXMoem9uZSk7CisJd2F0ZXJtYXJrICs9ICgxIDw8IGNjLT5vcmRlcik7CisKKwlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIGNjLT5vcmRlciwgd2F0ZXJtYXJrLCAwLCAwKSkKKwkJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7CisKIAkvKiBEaXJlY3QgY29tcGFjdG9yOiBJcyBhIHN1aXRhYmxlIHBhZ2UgZnJlZT8gKi8KIAlmb3IgKG9yZGVyID0gY2MtPm9yZGVyOyBvcmRlciA8IE1BWF9PUkRFUjsgb3JkZXIrKykgewogCQkvKiBKb2IgZG9uZSBpZiBwYWdlIGlzIGZyZWUgb2YgdGhlIHJpZ2h0IG1pZ3JhdGV0eXBlICovCkBAIC00NjEsNiArNDgzLDEzIEBACiAJdW5zaWduZWQgbG9uZyB3YXRlcm1hcms7CiAKIAkvKgorCSAqIG9yZGVyID09IC0xIGlzIGV4cGVjdGVkIHdoZW4gY29tcGFjdGluZyB2aWEKKwkgKiAvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnkKKwkgKi8KKwlpZiAob3JkZXIgPT0gLTEpCisJCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOworCisJLyoKIAkgKiBXYXRlcm1hcmtzIGZvciBvcmRlci0wIG11c3QgYmUgbWV0IGZvciBjb21wYWN0aW9uLiBOb3RlIHRoZSAyVUwuCiAJICogVGhpcyBpcyBiZWNhdXNlIGR1cmluZyBtaWdyYXRpb24sIGNvcGllcyBvZiBwYWdlcyBuZWVkIHRvIGJlCiAJICogYWxsb2NhdGVkIGFuZCBmb3IgYSBzaG9ydCB0aW1lLCB0aGUgZm9vdHByaW50IGlzIGhpZ2hlcgpAQCAtNDcwLDE3ICs0OTksMTEgQEAKIAkJcmV0dXJuIENPTVBBQ1RfU0tJUFBFRDsKIAogCS8qCi0JICogb3JkZXIgPT0gLTEgaXMgZXhwZWN0ZWQgd2hlbiBjb21wYWN0aW5nIHZpYQotCSAqIC9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeQotCSAqLwotCWlmIChvcmRlciA9PSAtMSkKLQkJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7Ci0KLQkvKgogCSAqIGZyYWdtZW50YXRpb24gaW5kZXggZGV0ZXJtaW5lcyBpZiBhbGxvY2F0aW9uIGZhaWx1cmVzIGFyZSBkdWUgdG8KIAkgKiBsb3cgbWVtb3J5IG9yIGV4dGVybmFsIGZyYWdtZW50YXRpb24KIAkgKgotCSAqIGluZGV4IG9mIC0xIGltcGxpZXMgYWxsb2NhdGlvbnMgbWlnaHQgc3VjY2VlZCBkZXBlbmRpbmdvbiB3YXRlcm1hcmtzCisJICogaW5kZXggb2YgLTEwMDAgaW1wbGllcyBhbGxvY2F0aW9ucyBtaWdodCBzdWNjZWVkIGRlcGVuZGluZyBvbgorCSAqIHdhdGVybWFya3MKIAkgKiBpbmRleCB0b3dhcmRzIDAgaW1wbGllcyBmYWlsdXJlIGlzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeQogCSAqIGluZGV4IHRvd2FyZHMgMTAwMCBpbXBsaWVzIGZhaWx1cmUgaXMgZHVlIHRvIGZyYWdtZW50YXRpb24KIAkgKgpAQCAtNDkwLDcgKzUxMyw4IEBACiAJaWYgKGZyYWdpbmRleCA+PSAwICYmIGZyYWdpbmRleCA8PSBzeXNjdGxfZXh0ZnJhZ190aHJlc2hvbGQpCiAJCXJldHVybiBDT01QQUNUX1NLSVBQRUQ7CiAKLQlpZiAoZnJhZ2luZGV4ID09IC0xICYmIHpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCB3YXRlcm1hcmssIDAsIDApKQorCWlmIChmcmFnaW5kZXggPT0gLTEwMDAgJiYgem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsIHdhdGVybWFyaywKKwkgICAgMCwgMCkpCiAJCXJldHVybiBDT01QQUNUX1BBUlRJQUw7CiAKIAlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKQEAgLTUyMiw4ICs1NDYsMTUgQEAKIAkJdW5zaWduZWQgbG9uZyBucl9taWdyYXRlLCBucl9yZW1haW5pbmc7CiAJCWludCBlcnI7CiAKLQkJaWYgKCFpc29sYXRlX21pZ3JhdGVwYWdlcyh6b25lLCBjYykpCisJCXN3aXRjaCAoaXNvbGF0ZV9taWdyYXRlcGFnZXMoem9uZSwgY2MpKSB7CisJCWNhc2UgSVNPTEFURV9BQk9SVDoKKwkJCXJldCA9IENPTVBBQ1RfUEFSVElBTDsKKwkJCWdvdG8gb3V0OworCQljYXNlIElTT0xBVEVfTk9ORToKIAkJCWNvbnRpbnVlOworCQljYXNlIElTT0xBVEVfU1VDQ0VTUzoKKwkJCTsKKwkJfQogCiAJCW5yX21pZ3JhdGUgPSBjYy0+bnJfbWlncmF0ZXBhZ2VzOwogCQllcnIgPSBtaWdyYXRlX3BhZ2VzKCZjYy0+bWlncmF0ZXBhZ2VzLCBjb21wYWN0aW9uX2FsbG9jLApAQCAtNTQ3LDYgKzU3OCw3IEBACiAKIAl9CiAKK291dDoKIAkvKiBSZWxlYXNlIGZyZWUgcGFnZXMgYW5kIGNoZWNrIGFjY291bnRpbmcgKi8KIAljYy0+bnJfZnJlZXBhZ2VzIC09IHJlbGVhc2VfZnJlZXBhZ2VzKCZjYy0+ZnJlZXBhZ2VzKTsKIAlWTV9CVUdfT04oY2MtPm5yX2ZyZWVwYWdlcyAhPSAwKTsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBkN2IxMDU3Li5hODI1MWE4IDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0yMDAwLDcgKzIwMDAsNyBAQAogCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2tpbGxwcml2KGRlbnRyeSk7CiAJaWYgKCFlcnJvciAmJiBraWxsc3VpZCkKIAkJZXJyb3IgPSBfX3JlbW92ZV9zdWlkKGRlbnRyeSwga2lsbHN1aWQpOwotCWlmICghZXJyb3IpCisJaWYgKCFlcnJvciAmJiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT1NFQykpCiAJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9TRUM7CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCA2MTVkOTc0Li44MTUzMmYyIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCisrKyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTIyMzQsMTEgKzIyMzQsOCBAQAogCXdoaWxlIChsaWtlbHkoa2h1Z2VwYWdlZF9lbmFibGVkKCkpKSB7CiAjaWZuZGVmIENPTkZJR19OVU1BCiAJCWhwYWdlID0ga2h1Z2VwYWdlZF9hbGxvY19odWdlcGFnZSgpOwotCQlpZiAodW5saWtlbHkoIWhwYWdlKSkgewotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CisJCWlmICh1bmxpa2VseSghaHBhZ2UpKQogCQkJYnJlYWs7Ci0JCX0KLQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DKTsKICNlbHNlCiAJCWlmIChJU19FUlIoaHBhZ2UpKSB7CiAJCQlraHVnZXBhZ2VkX2FsbG9jX3NsZWVwKCk7CmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggZjMzYmIzMS4uYmZjZjE1MyAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMTAzMywxMCArMTAzMywxMCBAQAogCSAqLwogCWNoZyA9IHZtYV9uZWVkc19yZXNlcnZhdGlvbihoLCB2bWEsIGFkZHIpOwogCWlmIChjaGcgPCAwKQotCQlyZXR1cm4gRVJSX1BUUihjaGcpOworCQlyZXR1cm4gRVJSX1BUUigtVk1fRkFVTFRfT09NKTsKIAlpZiAoY2hnKQogCQlpZiAoaHVnZXRsYl9nZXRfcXVvdGEoaW5vZGUtPmlfbWFwcGluZywgY2hnKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCQkJcmV0dXJuIEVSUl9QVFIoLVZNX0ZBVUxUX1NJR0JVUyk7CiAKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CiAJcGFnZSA9IGRlcXVldWVfaHVnZV9wYWdlX3ZtYShoLCB2bWEsIGFkZHIsIGF2b2lkX3Jlc2VydmUpOwpAQCAtMTExMSw2ICsxMTExLDE0IEBACiAJCVdBUk5fT04ocGFnZV9jb3VudChwYWdlKSAhPSAxKTsKIAkJcHJlcF9jb21wb3VuZF9odWdlX3BhZ2UocGFnZSwgaC0+b3JkZXIpOwogCQlwcmVwX25ld19odWdlX3BhZ2UoaCwgcGFnZSwgcGFnZV90b19uaWQocGFnZSkpOworCQkvKgorCQkgKiBJZiB3ZSBoYWQgZ2lnYW50aWMgaHVnZXBhZ2VzIGFsbG9jYXRlZCBhdCBib290IHRpbWUsIHdlIG5lZWQKKwkJICogdG8gcmVzdG9yZSB0aGUgJ3N0b2xlbicgcGFnZXMgdG8gdG90YWxyYW1fcGFnZXMgaW4gb3JkZXIgdG8KKwkJICogZml4IGNvbmZ1c2luZyBtZW1vcnkgcmVwb3J0cyBmcm9tIGZyZWUoMSkgYW5kIGFub3RoZXIKKwkJICogc2lkZS1lZmZlY3RzLCBsaWtlIENvbW1pdExpbWl0IGdvaW5nIG5lZ2F0aXZlLgorCQkgKi8KKwkJaWYgKGgtPm9yZGVyID4gKE1BWF9PUkRFUiAtIDEpKQorCQkJdG90YWxyYW1fcGFnZXMgKz0gMSA8PCBoLT5vcmRlcjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL21tL2tzbS5jIGIvbW0va3NtLmMKaW5kZXggZDcwOGIzZS4uOWE2OGIwYyAxMDA2NDQKLS0tIGEvbW0va3NtLmMKKysrIGIvbW0va3NtLmMKQEAgLTEzMDIsNiArMTMwMiwxMiBAQAogCQlzbG90ID0gbGlzdF9lbnRyeShzbG90LT5tbV9saXN0Lm5leHQsIHN0cnVjdCBtbV9zbG90LCBtbV9saXN0KTsKIAkJa3NtX3NjYW4ubW1fc2xvdCA9IHNsb3Q7CiAJCXNwaW5fdW5sb2NrKCZrc21fbW1saXN0X2xvY2spOworCQkvKgorCQkgKiBBbHRob3VnaCB3ZSB0ZXN0ZWQgbGlzdF9lbXB0eSgpIGFib3ZlLCBhIHJhY2luZyBfX2tzbV9leGl0CisJCSAqIG9mIHRoZSBsYXN0IG1tIG9uIHRoZSBsaXN0IG1heSBoYXZlIHJlbW92ZWQgaXQgc2luY2UgdGhlbi4KKwkJICovCisJCWlmIChzbG90ID09ICZrc21fbW1faGVhZCkKKwkJCXJldHVybiBOVUxMOwogbmV4dF9tbToKIAkJa3NtX3NjYW4uYWRkcmVzcyA9IDA7CiAJCWtzbV9zY2FuLnJtYXBfbGlzdCA9ICZzbG90LT5ybWFwX2xpc3Q7CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggYmQ5MDUyYS4uZTAxM2I4ZSAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KQEAgLTEwNywxMCArMTA4LDEyIEBACiBlbnVtIG1lbV9jZ3JvdXBfZXZlbnRzX3RhcmdldCB7CiAJTUVNX0NHUk9VUF9UQVJHRVRfVEhSRVNILAogCU1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCwKKwlNRU1fQ0dST1VQX1RBUkdFVF9OVU1BSU5GTywKIAlNRU1fQ0dST1VQX05UQVJHRVRTLAogfTsKICNkZWZpbmUgVEhSRVNIT0xEU19FVkVOVFNfVEFSR0VUICgxMjgpCiAjZGVmaW5lIFNPRlRMSU1JVF9FVkVOVFNfVEFSR0VUICgxMDI0KQorI2RlZmluZSBOVU1BSU5GT19FVkVOVFNfVEFSR0VUCSgxMDI0KQogCiBzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSB7CiAJbG9uZyBjb3VudFtNRU1fQ0dST1VQX1NUQVRfTlNUQVRTXTsKQEAgLTIzNiw3ICsyMzksOCBAQAogCWludCBsYXN0X3NjYW5uZWRfbm9kZTsKICNpZiBNQVhfTlVNTk9ERVMgPiAxCiAJbm9kZW1hc2tfdAlzY2FuX25vZGVzOwotCXVuc2lnbmVkIGxvbmcgICBuZXh0X3NjYW5fbm9kZV91cGRhdGU7CisJYXRvbWljX3QJbnVtYWluZm9fZXZlbnRzOworCWF0b21pY190CW51bWFpbmZvX3VwZGF0aW5nOwogI2VuZGlmCiAJLyoKIAkgKiBTaG91bGQgdGhlIGFjY291bnRpbmcgYW5kIGNvbnRyb2wgYmUgaGllcmFyY2hpY2FsLCBwZXIgc3VidHJlZT8KQEAgLTM1OSw3ICszNjMsNyBAQAogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9nZXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3B1dChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7Ci1zdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmModm9pZCk7CitzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqCiBtZW1fY2dyb3VwX3pvbmVpbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBuaWQsIGludCB6aWQpCkBAIC01NzYsMTUgKzU4MCw2IEBACiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIGxvbmcgbWVtX2Nncm91cF9sb2NhbF91c2FnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQotewotCWxvbmcgcmV0OwotCi0JcmV0ID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKLQlyZXQgKz0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfc3dhcF9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCSBib29sIGNoYXJnZSkKIHsKQEAgLTY4OCw2ICs2ODMsOSBAQAogCWNhc2UgTUVNX0NHUk9VUF9UQVJHRVRfU09GVExJTUlUOgogCQluZXh0ID0gdmFsICsgU09GVExJTUlUX0VWRU5UU19UQVJHRVQ7CiAJCWJyZWFrOworCWNhc2UgTUVNX0NHUk9VUF9UQVJHRVRfTlVNQUlORk86CisJCW5leHQgPSB2YWwgKyBOVU1BSU5GT19FVkVOVFNfVEFSR0VUOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm47CiAJfQpAQCAtNzA2LDExICs3MDQsMTkgQEAKIAkJbWVtX2Nncm91cF90aHJlc2hvbGQobWVtKTsKIAkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLCBNRU1fQ0dST1VQX1RBUkdFVF9USFJFU0gpOwogCQlpZiAodW5saWtlbHkoX19tZW1jZ19ldmVudF9jaGVjayhtZW0sCi0JCQlNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQpKSl7CisJCQkgICAgIE1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCkpKSB7CiAJCQltZW1fY2dyb3VwX3VwZGF0ZV90cmVlKG1lbSwgcGFnZSk7CiAJCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW0sCi0JCQkJTUVNX0NHUk9VUF9UQVJHRVRfU09GVExJTUlUKTsKKwkJCQkJCSAgIE1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCk7CiAJCX0KKyNpZiBNQVhfTlVNTk9ERVMgPiAxCisJCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbSwKKwkJCU1FTV9DR1JPVVBfVEFSR0VUX05VTUFJTkZPKSkpIHsKKwkJCWF0b21pY19pbmMoJm1lbS0+bnVtYWluZm9fZXZlbnRzKTsKKwkJCV9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKG1lbSwKKwkJCQlNRU1fQ0dST1VQX1RBUkdFVF9OVU1BSU5GTyk7CisJCX0KKyNlbmRpZgogCX0KIH0KIApAQCAtNzM1LDcgKzc0MSw3IEBACiAJCQkJc3RydWN0IG1lbV9jZ3JvdXAsIGNzcyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCitzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CiAKQEAgLTExMjgsNyArMTEzNCw2IEBACiAJcmV0dXJuIE1FTV9DR1JPVVBfWlNUQVQobXosIGxydSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfTlVNQQogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ub2RlX25yX2ZpbGVfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJCQlpbnQgbmlkKQogewpAQCAtMTE0MCw2ICsxMTQ1LDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ub2RlX25yX2Fub25fbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKKwkJCQkJCQlpbnQgbmlkKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJcmV0ID0gbWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW1jZywgbmlkLCBMUlVfSU5BQ1RJVkVfQU5PTikgKworCQltZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbWNnLCBuaWQsIExSVV9BQ1RJVkVfQU5PTik7CisJcmV0dXJuIHJldDsKK30KKworI2lmIE1BWF9OVU1OT0RFUyA+IDEKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbnJfZmlsZV9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXU2NCB0b3RhbCA9IDA7CkBAIC0xMTUxLDE3ICsxMTY3LDYgQEAKIAlyZXR1cm4gdG90YWw7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbm9kZV9ucl9hbm9uX2xydV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCi0JCQkJCQkJaW50IG5pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQotCXJldCA9IG1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtY2csIG5pZCwgTFJVX0lOQUNUSVZFX0FOT04pICsKLQkJbWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW1jZywgbmlkLCBMUlVfQUNUSVZFX0FOT04pOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ucl9hbm9uX2xydV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJdTY0IHRvdGFsID0gMDsKQEAgLTE1NTgsNiArMTU2MywyOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUKKyAqIEBtZW06IHRoZSB0YXJnZXQgbWVtY2cKKyAqIEBuaWQ6IHRoZSBub2RlIElEIHRvIGJlIGNoZWNrZWQuCisgKiBAbm9zd2FwIDogc3BlY2lmeSB0cnVlIGhlcmUgaWYgdGhlIHVzZXIgd2FudHMgZmxsZSBvbmx5IGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWVtY2cgY29udGFpbnMgYW55CisgKiByZWNsYWltYWJsZSBwYWdlcyBvbiBhIG5vZGUuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHJlY2xhaW1hYmxlCisgKiBwYWdlcyBpbiB0aGUgbm9kZS4KKyAqLworc3RhdGljIGJvb2wgdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJaW50IG5pZCwgYm9vbCBub3N3YXApCit7CisJaWYgKG1lbV9jZ3JvdXBfbm9kZV9ucl9maWxlX2xydV9wYWdlcyhtZW0sIG5pZCkpCisJCXJldHVybiB0cnVlOworCWlmIChub3N3YXAgfHwgIXRvdGFsX3N3YXBfcGFnZXMpCisJCXJldHVybiBmYWxzZTsKKwlpZiAobWVtX2Nncm91cF9ub2RlX25yX2Fub25fbHJ1X3BhZ2VzKG1lbSwgbmlkKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworCit9CiAjaWYgTUFYX05VTU5PREVTID4gMQogCiAvKgpAQCAtMTU2OSwyNiArMTU5NiwyNiBAQAogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXlfdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCiB7CiAJaW50IG5pZDsKLQotCWlmICh0aW1lX2FmdGVyKG1lbS0+bmV4dF9zY2FuX25vZGVfdXBkYXRlLCBqaWZmaWVzKSkKKwkvKgorCSAqIG51bWFpbmZvX2V2ZW50cyA+IDAgbWVhbnMgdGhlcmUgd2FzIGF0IGxlYXN0IE5VTUFJTkZPX0VWRU5UU19UQVJHRVQKKwkgKiBwYWdlaW4vcGFnZW91dCBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZS4KKwkgKi8KKwlpZiAoIWF0b21pY19yZWFkKCZtZW0tPm51bWFpbmZvX2V2ZW50cykpCisJCXJldHVybjsKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJm1lbS0+bnVtYWluZm9fdXBkYXRpbmcpID4gMSkKIAkJcmV0dXJuOwogCi0JbWVtLT5uZXh0X3NjYW5fbm9kZV91cGRhdGUgPSBqaWZmaWVzICsgMTAqSFo7CiAJLyogbWFrZSBhIG5vZGVtYXNrIHdoZXJlIHRoaXMgbWVtY2cgdXNlcyBtZW1vcnkgZnJvbSAqLwogCW1lbS0+c2Nhbl9ub2RlcyA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOwogCiAJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pIHsKIAotCQlpZiAobWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW0sIG5pZCwgTFJVX0lOQUNUSVZFX0ZJTEUpIHx8Ci0JCSAgICBtZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbSwgbmlkLCBMUlVfQUNUSVZFX0ZJTEUpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHRvdGFsX3N3YXBfcGFnZXMgJiYKLQkJICAgIChtZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbSwgbmlkLCBMUlVfSU5BQ1RJVkVfQU5PTikgfHwKLQkJICAgICBtZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbSwgbmlkLCBMUlVfQUNUSVZFX0FOT04pKSkKLQkJCWNvbnRpbnVlOwotCQlub2RlX2NsZWFyKG5pZCwgbWVtLT5zY2FuX25vZGVzKTsKKwkJaWYgKCF0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShtZW0sIG5pZCwgZmFsc2UpKQorCQkJbm9kZV9jbGVhcihuaWQsIG1lbS0+c2Nhbl9ub2Rlcyk7CiAJfQorCisJYXRvbWljX3NldCgmbWVtLT5udW1haW5mb19ldmVudHMsIDApOworCWF0b21pY19zZXQoJm1lbS0+bnVtYWluZm9fdXBkYXRpbmcsIDApOwogfQogCiAvKgpAQCAtMTYyNiwxMSArMTY1Myw1MSBAQAogCXJldHVybiBub2RlOwogfQogCisvKgorICogQ2hlY2sgYWxsIG5vZGVzIHdoZXRoZXIgaXQgY29udGFpbnMgcmVjbGFpbWFibGUgcGFnZXMgb3Igbm90LgorICogRm9yIHF1aWNrIHNjYW4sIHdlIG1ha2UgdXNlIG9mIHNjYW5fbm9kZXMuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBza2lwCisgKiB1bnVzZWQgbm9kZXMuIEJ1dCBzY2FuX25vZGVzIGlzIGxhemlseSB1cGRhdGVkIGFuZCBtYXkgbm90IGNvdGFpbgorICogZW5vdWdoIG5ldyBpbmZvcm1hdGlvbi4gV2UgbmVlZCB0byBkbyBkb3VibGUgY2hlY2suCisgKi8KK2Jvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIG5vc3dhcCkKK3sKKwlpbnQgbmlkOworCisJLyoKKwkgKiBxdWljayBjaGVjay4uLm1ha2luZyB1c2Ugb2Ygc2Nhbl9ub2RlLgorCSAqIFdlIGNhbiBza2lwIHVudXNlZCBub2Rlcy4KKwkgKi8KKwlpZiAoIW5vZGVzX2VtcHR5KG1lbS0+c2Nhbl9ub2RlcykpIHsKKwkJZm9yIChuaWQgPSBmaXJzdF9ub2RlKG1lbS0+c2Nhbl9ub2Rlcyk7CisJCSAgICAgbmlkIDwgTUFYX05VTU5PREVTOworCQkgICAgIG5pZCA9IG5leHRfbm9kZShuaWQsIG1lbS0+c2Nhbl9ub2RlcykpIHsKKworCQkJaWYgKHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbSwgbmlkLCBub3N3YXApKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJfQorCS8qCisJICogQ2hlY2sgcmVzdCBvZiBub2Rlcy4KKwkgKi8KKwlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9ISUdIX01FTU9SWSkgeworCQlpZiAobm9kZV9pc3NldChuaWQsIG1lbS0+c2Nhbl9ub2RlcykpCisJCQljb250aW51ZTsKKwkJaWYgKHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbSwgbmlkLCBub3N3YXApKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogI2Vsc2UKIGludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQogewogCXJldHVybiAwOwogfQorCitib29sIG1lbV9jZ3JvdXBfcmVjbGFpbWFibGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgYm9vbCBub3N3YXApCit7CisJcmV0dXJuIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbSwgMCwgbm9zd2FwKTsKK30KICNlbmRpZgogCiAvKgpAQCAtMTY2MywxNSArMTczMCwyMSBAQAogCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbS0+cmVzKSA+PiBQQUdFX1NISUZUOwogCiAJLyogSWYgbWVtc3dfaXNfbWluaW11bT09MSwgc3dhcC1vdXQgaXMgb2Ytbm8tdXNlLiAqLwotCWlmIChyb290X21lbS0+bWVtc3dfaXNfbWluaW11bSkKKwlpZiAoIWNoZWNrX3NvZnQgJiYgcm9vdF9tZW0tPm1lbXN3X2lzX21pbmltdW0pCiAJCW5vc3dhcCA9IHRydWU7CiAKIAl3aGlsZSAoMSkgewogCQl2aWN0aW0gPSBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW0ocm9vdF9tZW0pOwogCQlpZiAodmljdGltID09IHJvb3RfbWVtKSB7CiAJCQlsb29wKys7Ci0JCQlpZiAobG9vcCA+PSAxKQotCQkJCWRyYWluX2FsbF9zdG9ja19hc3luYygpOworCQkJLyoKKwkJCSAqIFdlIGFyZSBub3QgZHJhaW5pbmcgcGVyIGNwdSBjYWNoZWQgY2hhcmdlcyBkdXJpbmcKKwkJCSAqIHNvZnQgbGltaXQgcmVjbGFpbSAgYmVjYXVzZSBnbG9iYWwgcmVjbGFpbSBkb2Vzbid0CisJCQkgKiBjYXJlIGFib3V0IGNoYXJnZXMuIEl0IHRyaWVzIHRvIGZyZWUgc29tZSBtZW1vcnkgYW5kCisJCQkgKiBjaGFyZ2VzIHdpbGwgbm90IGdpdmUgYW55LgorCQkJICovCisJCQlpZiAoIWNoZWNrX3NvZnQgJiYgbG9vcCA+PSAxKQorCQkJCWRyYWluX2FsbF9zdG9ja19hc3luYyhyb290X21lbSk7CiAJCQlpZiAobG9vcCA+PSAyKSB7CiAJCQkJLyoKIAkJCQkgKiBJZiB3ZSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gcmVjbGFpbQpAQCAtMTY5NSw3ICsxNzY4LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJaWYgKCFtZW1fY2dyb3VwX2xvY2FsX3VzYWdlKHZpY3RpbSkpIHsKKwkJaWYgKCFtZW1fY2dyb3VwX3JlY2xhaW1hYmxlKHZpY3RpbSwgbm9zd2FwKSkgewogCQkJLyogdGhpcyBjZ3JvdXAncyBsb2NhbCB1c2FnZSA9PSAwICovCiAJCQljc3NfcHV0KCZ2aWN0aW0tPmNzcyk7CiAJCQljb250aW51ZTsKQEAgLTE5MzQsOSArMjAwNywxMSBAQAogCXN0cnVjdCBtZW1fY2dyb3VwICpjYWNoZWQ7IC8qIHRoaXMgbmV2ZXIgYmUgcm9vdCBjZ3JvdXAgKi8KIAl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNkZWZpbmUgRkxVU0hJTkdfQ0FDSEVEX0NIQVJHRQkoMCkKIH07CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG1lbWNnX3N0b2NrX3BjcCwgbWVtY2dfc3RvY2spOwotc3RhdGljIGF0b21pY190IG1lbWNnX2RyYWluX2NvdW50Oworc3RhdGljIERFRklORV9NVVRFWChwZXJjcHVfY2hhcmdlX211dGV4KTsKIAogLyoKICAqIFRyeSB0byBjb25zdW1lIHN0b2NrZWQgY2hhcmdlIG9uIHRoaXMgY3B1LiBJZiBzdWNjZXNzLCBvbmUgcGFnZSBpcyBjb25zdW1lZApAQCAtMTk4NCw2ICsyMDU5LDcgQEAKIHsKIAlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jayA9ICZfX2dldF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKIAlkcmFpbl9zdG9jayhzdG9jayk7CisJY2xlYXJfYml0KEZMVVNISU5HX0NBQ0hFRF9DSEFSR0UsICZzdG9jay0+ZmxhZ3MpOwogfQogCiAvKgpAQCAtMjAwOCwyNiArMjA4NCw0NSBAQAogICogZXhwZWN0cyBzb21lIGNoYXJnZXMgd2lsbCBiZSBiYWNrIHRvIHJlc19jb3VudGVyIGxhdGVyIGJ1dCBjYW5ub3Qgd2FpdCBmb3IKICAqIGl0LgogICovCi1zdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmModm9pZCkKK3N0YXRpYyB2b2lkIGRyYWluX2FsbF9zdG9ja19hc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0pCiB7Ci0JaW50IGNwdTsKLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBzY2hlZHVsaW5nICJkcmFpbiIgaW4gYXN5bmNocm9ub3VzIHdheS4KLQkgKiBUaGUgcmVzdWx0IG9mICJkcmFpbiIgaXMgbm90IGRpcmVjdGx5IGhhbmRsZWQgYnkgY2FsbGVycy4gVGhlbiwKLQkgKiBpZiBzb21lb25lIGlzIGNhbGxpbmcgZHJhaW4sIHdlIGRvbid0IGhhdmUgdG8gY2FsbCBkcmFpbiBtb3JlLgotCSAqIEFueXdheSwgV09SS19TVFJVQ1RfUEVORElORyBjaGVjayBpbiBxdWV1ZV93b3JrX29uKCkgd2lsbCBjYXRjaCBpZgotCSAqIHRoZXJlIGlzIGEgcmFjZS4gV2UganVzdCBkbyBsb29zZSBjaGVjayBoZXJlLgorCWludCBjcHUsIGN1cmNwdTsKKwkvKgorCSAqIElmIHNvbWVvbmUgY2FsbHMgZHJhaW5pbmcsIGF2b2lkIGFkZGluZyBtb3JlIGt3b3JrZXIgcnVucy4KIAkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJm1lbWNnX2RyYWluX2NvdW50KSkKKwlpZiAoIW11dGV4X3RyeWxvY2soJnBlcmNwdV9jaGFyZ2VfbXV0ZXgpKQogCQlyZXR1cm47CiAJLyogTm90aWZ5IG90aGVyIGNwdXMgdGhhdCBzeXN0ZW0td2lkZSAiZHJhaW4iIGlzIHJ1bm5pbmcgKi8KLQlhdG9taWNfaW5jKCZtZW1jZ19kcmFpbl9jb3VudCk7CiAJZ2V0X29ubGluZV9jcHVzKCk7CisJLyoKKwkgKiBHZXQgYSBoaW50IGZvciBhdm9pZGluZyBkcmFpbmluZyBjaGFyZ2VzIG9uIHRoZSBjdXJyZW50IGNwdSwKKwkgKiB3aGljaCBtdXN0IGJlIGV4aGF1c3RlZCBieSBvdXIgY2hhcmdpbmcuICBJdCBpcyBub3QgcmVxdWlyZWQgdGhhdAorCSAqIHRoaXMgYmUgYSBwcmVjaXNlIGNoZWNrLCBzbyB3ZSB1c2UgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSBpbnN0ZWFkIG9mCisJICogZ2V0Y3B1KCkvcHV0Y3B1KCkuCisJICovCisJY3VyY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jayA9ICZwZXJfY3B1KG1lbWNnX3N0b2NrLCBjcHUpOwotCQlzY2hlZHVsZV93b3JrX29uKGNwdSwgJnN0b2NrLT53b3JrKTsKKwkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKworCQlpZiAoY3B1ID09IGN1cmNwdSkKKwkJCWNvbnRpbnVlOworCisJCW1lbSA9IHN0b2NrLT5jYWNoZWQ7CisJCWlmICghbWVtKQorCQkJY29udGludWU7CisJCWlmIChtZW0gIT0gcm9vdF9tZW0pIHsKKwkJCWlmICghcm9vdF9tZW0tPnVzZV9oaWVyYXJjaHkpCisJCQkJY29udGludWU7CisJCQkvKiBjaGVjayB3aGV0aGVyICJtZW0iIGlzIHVuZGVyIHRyZWUgb2YgInJvb3RfbWVtIiAqLworCQkJaWYgKCFjc3NfaXNfYW5jZXN0b3IoJm1lbS0+Y3NzLCAmcm9vdF9tZW0tPmNzcykpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEZMVVNISU5HX0NBQ0hFRF9DSEFSR0UsICZzdG9jay0+ZmxhZ3MpKQorCQkJc2NoZWR1bGVfd29ya19vbihjcHUsICZzdG9jay0+d29yayk7CiAJfQogIAlwdXRfb25saW5lX2NwdXMoKTsKLQlhdG9taWNfZGVjKCZtZW1jZ19kcmFpbl9jb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZwZXJjcHVfY2hhcmdlX211dGV4KTsKIAkvKiBXZSBkb24ndCB3YWl0IGZvciBmbHVzaF93b3JrICovCiB9CiAKQEAgLTIwMzUsOSArMjEzMCw5IEBACiBzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfc3luYyh2b2lkKQogewogCS8qIGNhbGxlZCB3aGVuIGZvcmNlX2VtcHR5IGlzIGNhbGxlZCAqLwotCWF0b21pY19pbmMoJm1lbWNnX2RyYWluX2NvdW50KTsKKwltdXRleF9sb2NrKCZwZXJjcHVfY2hhcmdlX211dGV4KTsKIAlzY2hlZHVsZV9vbl9lYWNoX2NwdShkcmFpbl9sb2NhbF9zdG9jayk7Ci0JYXRvbWljX2RlYygmbWVtY2dfZHJhaW5fY291bnQpOworCW11dGV4X3VubG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCk7CiB9CiAKIC8qCkBAIC00NjQwLDYgKzQ3MzUsNyBAQAogCXsKIAkJLm5hbWUgPSAibnVtYV9zdGF0IiwKIAkJLm9wZW4gPSBtZW1fY29udHJvbF9udW1hX3N0YXRfb3BlbiwKKwkJLm1vZGUgPSBTX0lSVUdPLAogCX0sCiAjZW5kaWYKIH07CkBAIC01NDE0LDE4ICs1NTEwLDE2IEBACiAJCQkJc3RydWN0IGNncm91cCAqb2xkX2NvbnQsCiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0ocCk7CiAKLQlpZiAoIW1jLnRvKQotCQkvKiBubyBuZWVkIHRvIG1vdmUgY2hhcmdlICovCi0JCXJldHVybjsKLQotCW1tID0gZ2V0X3Rhc2tfbW0ocCk7CiAJaWYgKG1tKSB7Ci0JCW1lbV9jZ3JvdXBfbW92ZV9jaGFyZ2UobW0pOworCQlpZiAobWMudG8pCisJCQltZW1fY2dyb3VwX21vdmVfY2hhcmdlKG1tKTsKKwkJcHV0X3N3YXBfdG9rZW4obW0pOwogCQltbXB1dChtbSk7CiAJfQotCW1lbV9jZ3JvdXBfY2xlYXJfbWMoKTsKKwlpZiAobWMudG8pCisJCW1lbV9jZ3JvdXBfY2xlYXJfbWMoKTsKIH0KICNlbHNlCS8qICFDT05GSUdfTU1VICovCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCmRpZmYgLS1naXQgYS9tbS9tZW1vcnktZmFpbHVyZS5jIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwppbmRleCA1YzhmN2UwLi43NDBjNGY1IDEwMDY0NAotLS0gYS9tbS9tZW1vcnktZmFpbHVyZS5jCisrKyBiL21tL21lbW9yeS1mYWlsdXJlLmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CisjaW5jbHVkZSA8bGludXgvbW1faW5saW5lLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogaW50IHN5c2N0bF9tZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsIF9fcmVhZF9tb3N0bHkgPSAwOwpAQCAtMzkwLDEwICszOTEsMTEgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlzdHJ1Y3QgYW5vbl92bWEgKmF2OwogCi0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlhdiA9IHBhZ2VfbG9ja19hbm9uX3ZtYShwYWdlKTsKIAlpZiAoYXYgPT0gTlVMTCkJLyogTm90IGFjdHVhbGx5IG1hcHBlZCBhbnltb3JlICovCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWZvcl9lYWNoX3Byb2Nlc3MgKHRzaykgewogCQlzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKnZtYWM7CiAKQEAgLTQwNyw5ICs0MDksOCBAQAogCQkJCWFkZF90b19raWxsKHRzaywgcGFnZSwgdm1hLCB0b19raWxsLCB0a2MpOwogCQl9CiAJfQotCXBhZ2VfdW5sb2NrX2Fub25fdm1hKGF2KTsKLW91dDoKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcGFnZV91bmxvY2tfYW5vbl92bWEoYXYpOwogfQogCiAvKgpAQCAtNDIzLDE3ICs0MjQsOCBAQAogCXN0cnVjdCBwcmlvX3RyZWVfaXRlciBpdGVyOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKIAotCS8qCi0JICogQSBub3RlIG9uIHRoZSBsb2NraW5nIG9yZGVyIGJldHdlZW4gdGhlIHR3byBsb2Nrcy4KLQkgKiBXZSBkb24ndCByZWx5IG9uIHRoaXMgcGFydGljdWxhciBvcmRlci4KLQkgKiBJZiB5b3UgaGF2ZSBzb21lIG90aGVyIGNvZGUgdGhhdCBuZWVkcyBhIGRpZmZlcmVudCBvcmRlcgotCSAqIGZlZWwgZnJlZSB0byBzd2l0Y2ggdGhlbSBhcm91bmQuIE9yIGFkZCBhIHJldmVyc2UgbGluawotCSAqIGZyb20gbW1fc3RydWN0IHRvIHRhc2tfc3RydWN0LCB0aGVuIHRoaXMgY291bGQgYmUgYWxsCi0JICogZG9uZSB3aXRob3V0IHRha2luZyB0YXNrbGlzdF9sb2NrIGFuZCBsb29waW5nIG92ZXIgYWxsIHRhc2tzLgotCSAqLwotCi0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAltdXRleF9sb2NrKCZtYXBwaW5nLT5pX21tYXBfbXV0ZXgpOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJZm9yX2VhY2hfcHJvY2Vzcyh0c2spIHsKIAkJcGdvZmZfdCBwZ29mZiA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gUEFHRV9TSElGVCk7CiAKQEAgLTQ1Myw4ICs0NDUsOCBAQAogCQkJCWFkZF90b19raWxsKHRzaywgcGFnZSwgdm1hLCB0b19raWxsLCB0a2MpOwogCQl9CiAJfQotCW11dGV4X3VubG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZtYXBwaW5nLT5pX21tYXBfbXV0ZXgpOwogfQogCiAvKgpAQCAtMTQ2OCw3ICsxNDYwLDggQEAKIAlwdXRfcGFnZShwYWdlKTsKIAlpZiAoIXJldCkgewogCQlMSVNUX0hFQUQocGFnZWxpc3QpOwotCisJCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfSVNPTEFURURfQU5PTiArCisJCQkJCSAgICBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpOwogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmcGFnZWxpc3QpOwogCQlyZXQgPSBtaWdyYXRlX3BhZ2VzKCZwYWdlbGlzdCwgbmV3X3BhZ2UsIE1QT0xfTUZfTU9WRV9BTEwsCiAJCQkJCQkJCTAsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCA2OTUzZDM5Li45YjhhMDFkIDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtMzA1LDYgKzMwNSw3IEBACiAJaWYgKGJhdGNoLT5uciA9PSBiYXRjaC0+bWF4KSB7CiAJCWlmICghdGxiX25leHRfYmF0Y2godGxiKSkKIAkJCXJldHVybiAwOworCQliYXRjaCA9IHRsYi0+YWN0aXZlOwogCX0KIAlWTV9CVUdfT04oYmF0Y2gtPm5yID4gYmF0Y2gtPm1heCk7CiAKQEAgLTExMTIsMTEgKzExMTMsMTMgQEAKIAlpbnQgZm9yY2VfZmx1c2ggPSAwOwogCWludCByc3NbTlJfTU1fQ09VTlRFUlNdOwogCXNwaW5sb2NrX3QgKnB0bDsKKwlwdGVfdCAqc3RhcnRfcHRlOwogCXB0ZV90ICpwdGU7CiAKIGFnYWluOgogCWluaXRfcnNzX3ZlYyhyc3MpOwotCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7CisJc3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKKwlwdGUgPSBzdGFydF9wdGU7CiAJYXJjaF9lbnRlcl9sYXp5X21tdV9tb2RlKCk7CiAJZG8gewogCQlwdGVfdCBwdGVudCA9ICpwdGU7CkBAIC0xMTk2LDcgKzExOTksNyBAQAogCiAJYWRkX21tX3Jzc192ZWMobW0sIHJzcyk7CiAJYXJjaF9sZWF2ZV9sYXp5X21tdV9tb2RlKCk7Ci0JcHRlX3VubWFwX3VubG9jayhwdGUgLSAxLCBwdGwpOworCXB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGwpOwogCiAJLyoKIAkgKiBtbXVfZ2F0aGVyIHJhbiBvdXQgb2Ygcm9vbSB0byBiYXRjaCBwYWdlcywgd2UgYnJlYWsgb3V0IG9mCkBAIC0xMjk2LDcgKzEyOTksNyBAQAogCiAvKioKICAqIHVubWFwX3ZtYXMgLSB1bm1hcCBhIHJhbmdlIG9mIG1lbW9yeSBjb3ZlcmVkIGJ5IGEgbGlzdCBvZiB2bWEncwotICogQHRsYnA6IGFkZHJlc3Mgb2YgdGhlIGNhbGxlcidzIHN0cnVjdCBtbXVfZ2F0aGVyCisgKiBAdGxiOiBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyBzdHJ1Y3QgbW11X2dhdGhlcgogICogQHZtYTogdGhlIHN0YXJ0aW5nIHZtYQogICogQHN0YXJ0X2FkZHI6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBzdGFydCB1bm1hcHBpbmcKICAqIEBlbmRfYWRkcjogdmlydHVhbCBhZGRyZXNzIGF0IHdoaWNoIHRvIGVuZCB1bm1hcHBpbmcKQEAgLTI3OTYsMzAgKzI3OTksNiBAQAogfQogRVhQT1JUX1NZTUJPTCh1bm1hcF9tYXBwaW5nX3JhbmdlKTsKIAotaW50IHZtdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGVuZCkKLXsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0KLQkvKgotCSAqIElmIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaXMgbm90IGdvaW5nIHRvIHByb3ZpZGUKLQkgKiBhIHdheSB0byB0cnVuY2F0ZSBhIHJhbmdlIG9mIGJsb2NrcyAocHVuY2ggYSBob2xlKSAtCi0JICogd2Ugc2hvdWxkIHJldHVybiBmYWlsdXJlIHJpZ2h0IG5vdy4KLQkgKi8KLQlpZiAoIWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKLQkJcmV0dXJuIC1FTk9TWVM7Ci0KLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JZG93bl93cml0ZSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKLQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgKGVuZCAtIG9mZnNldCksIDEpOwotCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgZW5kKTsKLQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgKGVuZCAtIG9mZnNldCksIDEpOwotCWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZShpbm9kZSwgb2Zmc2V0LCBlbmQpOwotCXVwX3dyaXRlKCZpbm9kZS0+aV9hbGxvY19zZW0pOwotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBXZSBlbnRlciB3aXRoIG5vbi1leGNsdXNpdmUgbW1hcF9zZW0gKHRvIGV4Y2x1ZGUgdm1hIGNoYW5nZXMsCiAgKiBidXQgYWxsb3cgY29uY3VycmVudCBmYXVsdHMpLCBhbmQgcHRlIG1hcHBlZCBidXQgbm90IHlldCBsb2NrZWQuCmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwppbmRleCA5ZjY0NjM3Li5jNDY4ODdiIDEwMDY0NAotLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jCisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmMKQEAgLTQ5NCw2ICs0OTQsMTQgQEAKIAkvKiBpbml0IG5vZGUncyB6b25lcyBhcyBlbXB0eSB6b25lcywgd2UgZG9uJ3QgaGF2ZSBhbnkgcHJlc2VudCBwYWdlcy4qLwogCWZyZWVfYXJlYV9pbml0X25vZGUobmlkLCB6b25lc19zaXplLCBzdGFydF9wZm4sIHpob2xlc19zaXplKTsKIAorCS8qCisJICogVGhlIG5vZGUgd2UgYWxsb2NhdGVkIGhhcyBubyB6b25lIGZhbGxiYWNrIGxpc3RzLiBGb3IgYXZvaWRpbmcKKwkgKiB0byBhY2Nlc3Mgbm90LWluaXRpYWxpemVkIHpvbmVsaXN0LCBidWlsZCBoZXJlLgorCSAqLworCW11dGV4X2xvY2soJnpvbmVsaXN0c19tdXRleCk7CisJYnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTsKKwltdXRleF91bmxvY2soJnpvbmVsaXN0c19tdXRleCk7CisKIAlyZXR1cm4gcGdkYXQ7CiB9CiAKQEAgLTUxNSw3ICs1MjMsNyBAQAogCiAJbG9ja19tZW1vcnlfaG90cGx1ZygpOwogCXBnZGF0ID0gaG90YWRkX25ld19wZ2RhdChuaWQsIDApOwotCWlmIChwZ2RhdCkgeworCWlmICghcGdkYXQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IGU0YTVjOTEuLjY2NmU0ZTYgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTI4OCw3ICsyODgsNyBAQAogCSAqLwogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKIAlfX2luY196b25lX3BhZ2Vfc3RhdGUobmV3cGFnZSwgTlJfRklMRV9QQUdFUyk7Ci0JaWYgKFBhZ2VTd2FwQmFja2VkKHBhZ2UpKSB7CisJaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpICYmIFBhZ2VTd2FwQmFja2VkKHBhZ2UpKSB7CiAJCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9TSE1FTSk7CiAJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShuZXdwYWdlLCBOUl9TSE1FTSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGJiZGM5YWYuLmQ0OTczNmYgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTkwNiwxNCArOTA2LDcgQEAKIAlpZiAoYW5vbl92bWEpCiAJCXJldHVybiBhbm9uX3ZtYTsKIHRyeV9wcmV2OgotCS8qCi0JICogSXQgaXMgcG90ZW50aWFsbHkgc2xvdyB0byBoYXZlIHRvIGNhbGwgZmluZF92bWFfcHJldiBoZXJlLgotCSAqIEJ1dCBpdCdzIG9ubHkgb24gdGhlIGZpcnN0IHdyaXRlIGZhdWx0IG9uIHRoZSB2bWEsIG5vdAotCSAqIGV2ZXJ5IHRpbWUsIGFuZCB3ZSBjb3VsZCBkZXZpc2UgYSB3YXkgdG8gYXZvaWQgaXQgbGF0ZXIKLQkgKiAoZS5nLiBzdGFzaCBpbmZvIGluIG5leHQncyBhbm9uX3ZtYV9ub2RlIHdoZW4gYXNzaWduaW5nCi0JICogYW4gYW5vbl92bWEsIG9yIHdoZW4gdHJ5aW5nIHZtYV9tZXJnZSkuICBBbm90aGVyIHRpbWUuCi0JICovCi0JQlVHX09OKGZpbmRfdm1hX3ByZXYodm1hLT52bV9tbSwgdm1hLT52bV9zdGFydCwgJm5lYXIpICE9IHZtYSk7CisJbmVhciA9IHZtYS0+dm1fcHJldjsKIAlpZiAoIW5lYXIpCiAJCWdvdG8gbm9uZTsKIApAQCAtMjA0NCw5ICsyMDM3LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogRmluZCB0aGUgZmlyc3Qgb3ZlcmxhcHBpbmcgVk1BICovCi0Jdm1hID0gZmluZF92bWFfcHJldihtbSwgc3RhcnQsICZwcmV2KTsKKwl2bWEgPSBmaW5kX3ZtYShtbSwgc3RhcnQpOwogCWlmICghdm1hKQogCQlyZXR1cm4gMDsKKwlwcmV2ID0gdm1hLT52bV9wcmV2OwogCS8qIHdlIGhhdmUgIHN0YXJ0IDwgdm1hLT52bV9lbmQgICovCiAKIAkvKiBpZiBpdCBkb2Vzbid0IG92ZXJsYXAsIHdlIGhhdmUgbm90aGluZy4uICovCmRpZmYgLS1naXQgYS9tbS9ub21tdS5jIGIvbW0vbm9tbXUuYwppbmRleCAxZmQwYzUxLi45ZWRjODk3IDEwMDY0NAotLS0gYS9tbS9ub21tdS5jCisrKyBiL21tL25vbW11LmMKQEAgLTE4MTMsMTAgKzE4MTMsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotaW50IHJlbWFwX3Bmbl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBmcm9tLAotCQl1bnNpZ25lZCBsb25nIHRvLCB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHByb3QpCitpbnQgcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHByb3QpCiB7Ci0Jdm1hLT52bV9zdGFydCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlpZiAoYWRkciAhPSAocGZuIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRCB8IFZNX1BGTk1BUDsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocmVtYXBfcGZuX3JhbmdlKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBhNGUxZGIzLi40ZTg5ODVhIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0yMjQ3LDEwICsyMjQ3LDYgQEAKIAogCWlmIChzaG91bGRfZmFpbF9hbGxvY19wYWdlKGdmcF9tYXNrLCBvcmRlcikpCiAJCXJldHVybiBOVUxMOwotI2lmbmRlZiBDT05GSUdfWk9ORV9ETUEKLQlpZiAoV0FSTl9PTl9PTkNFKGdmcF9tYXNrICYgX19HRlBfRE1BKSkKLQkJcmV0dXJuIE5VTEw7Ci0jZW5kaWYKIAogCS8qCiAJICogQ2hlY2sgdGhlIHpvbmVzIHN1aXRhYmxlIGZvciB0aGUgZ2ZwX21hc2sgY29udGFpbiBhdCBsZWFzdCBvbmUKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IDc0Y2NmZjYuLjUzYmZmYzYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtMTYyLDEzICsxNjIsMTMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAodW5zaWduZWQgbG9uZyBwZm4pCitzdGF0aWMgaW50IF9fbWVtaW5pdCBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpiYXNlLCAqcGM7CiAJc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uOwogCXVuc2lnbmVkIGxvbmcgdGFibGVfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIG5yOwotCWludCBuaWQsIGluZGV4OworCWludCBpbmRleDsKIAogCW5yID0gcGZuX3RvX3NlY3Rpb25fbnIocGZuKTsKIAlzZWN0aW9uID0gX19ucl90b19zZWN0aW9uKG5yKTsKQEAgLTE3Niw3ICsxNzYsNiBAQAogCWlmIChzZWN0aW9uLT5wYWdlX2Nncm91cCkKIAkJcmV0dXJuIDA7CiAKLQluaWQgPSBwYWdlX3RvX25pZChwZm5fdG9fcGFnZShwZm4pKTsKIAl0YWJsZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBwYWdlX2Nncm91cCkgKiBQQUdFU19QRVJfU0VDVElPTjsKIAliYXNlID0gYWxsb2NfcGFnZV9jZ3JvdXAodGFibGVfc2l6ZSwgbmlkKTsKIApAQCAtMTk2LDcgKzE5NSwxMSBAQAogCQlwYyA9IGJhc2UgKyBpbmRleDsKIAkJaW5pdF9wYWdlX2Nncm91cChwYywgbnIpOwogCX0KLQorCS8qCisJICogVGhlIHBhc3NlZCAicGZuIiBtYXkgbm90IGJlIGFsaWduZWQgdG8gU0VDVElPTi4gIEZvciB0aGUgY2FsY3VsYXRpb24KKwkgKiB3ZSBuZWVkIHRvIGFwcGx5IGEgbWFzay4KKwkgKi8KKwlwZm4gJj0gUEFHRV9TRUNUSU9OX01BU0s7CiAJc2VjdGlvbi0+cGFnZV9jZ3JvdXAgPSBiYXNlIC0gcGZuOwogCXRvdGFsX3VzYWdlICs9IHRhYmxlX3NpemU7CiAJcmV0dXJuIDA7CkBAIC0yMjUsMTAgKzIyOCwyMCBAQAogCXN0YXJ0ID0gc3RhcnRfcGZuICYgfihQQUdFU19QRVJfU0VDVElPTiAtIDEpOwogCWVuZCA9IEFMSUdOKHN0YXJ0X3BmbiArIG5yX3BhZ2VzLCBQQUdFU19QRVJfU0VDVElPTik7CiAKKwlpZiAobmlkID09IC0xKSB7CisJCS8qCisJCSAqIEluIHRoaXMgY2FzZSwgIm5pZCIgYWxyZWFkeSBleGlzdHMgYW5kIGNvbnRhaW5zIHZhbGlkIG1lbW9yeS4KKwkJICogInN0YXJ0X3BmbiIgcGFzc2VkIHRvIHVzIGlzIGEgcGZuIHdoaWNoIGlzIGFuIGFyZyBmb3IKKwkJICogb25saW5lX19wYWdlcygpLCBhbmQgc3RhcnRfcGZuIHNob3VsZCBleGlzdC4KKwkJICovCisJCW5pZCA9IHBmbl90b19uaWQoc3RhcnRfcGZuKTsKKwkJVk1fQlVHX09OKCFub2RlX3N0YXRlKG5pZCwgTl9PTkxJTkUpKTsKKwl9CisKIAlmb3IgKHBmbiA9IHN0YXJ0OyAhZmFpbCAmJiBwZm4gPCBlbmQ7IHBmbiArPSBQQUdFU19QRVJfU0VDVElPTikgewogCQlpZiAoIXBmbl9wcmVzZW50KHBmbikpCiAJCQljb250aW51ZTsKLQkJZmFpbCA9IGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cChwZm4pOworCQlmYWlsID0gaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHBmbiwgbmlkKTsKIAl9CiAJaWYgKCFmYWlsKQogCQlyZXR1cm4gMDsKQEAgLTI4NCwyNSArMjk3LDQ3IEBACiB2b2lkIF9faW5pdCBwYWdlX2Nncm91cF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBwZm47Ci0JaW50IGZhaWwgPSAwOworCWludCBuaWQ7CiAKIAlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm47CiAKLQlmb3IgKHBmbiA9IDA7ICFmYWlsICYmIHBmbiA8IG1heF9wZm47IHBmbiArPSBQQUdFU19QRVJfU0VDVElPTikgewotCQlpZiAoIXBmbl9wcmVzZW50KHBmbikpCi0JCQljb250aW51ZTsKLQkJZmFpbCA9IGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cChwZm4pOworCWZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX0hJR0hfTUVNT1JZKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOworCisJCXN0YXJ0X3BmbiA9IG5vZGVfc3RhcnRfcGZuKG5pZCk7CisJCWVuZF9wZm4gPSBub2RlX2VuZF9wZm4obmlkKTsKKwkJLyoKKwkJICogc3RhcnRfcGZuIGFuZCBlbmRfcGZuIG1heSBub3QgYmUgYWxpZ25lZCB0byBTRUNUSU9OIGFuZCB0aGUKKwkJICogcGFnZS0+ZmxhZ3Mgb2Ygb3V0IG9mIG5vZGUgcGFnZXMgYXJlIG5vdCBpbml0aWFsaXplZC4gIFNvIHdlCisJCSAqIHNjYW4gW3N0YXJ0X3BmbiwgdGhlIGJpZ2dlc3Qgc2VjdGlvbidzIHBmbiA8IGVuZF9wZm4pIGhlcmUuCisJCSAqLworCQlmb3IgKHBmbiA9IHN0YXJ0X3BmbjsKKwkJICAgICBwZm4gPCBlbmRfcGZuOworICAgICAgICAgICAgICAgICAgICAgcGZuID0gQUxJR04ocGZuICsgMSwgUEFHRVNfUEVSX1NFQ1RJT04pKSB7CisKKwkJCWlmICghcGZuX3ZhbGlkKHBmbikpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogTm9kZXMncyBwZm5zIGNhbiBiZSBvdmVybGFwcGluZy4KKwkJCSAqIFdlIGtub3cgc29tZSBhcmNoIGNhbiBoYXZlIGEgbm9kZXMgbGF5b3V0IHN1Y2ggYXMKKwkJCSAqIC0tLS0tLS0tLS0tLS1wZm4tLS0tLS0tLS0tLS0tLT4KKwkJCSAqIE4wIHwgTjEgfCBOMiB8IE4wIHwgTjEgfCBOMnwuLi4uCisJCQkgKi8KKwkJCWlmIChwZm5fdG9fbmlkKHBmbikgIT0gbmlkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cChwZm4sIG5pZCkpCisJCQkJZ290byBvb207CisJCX0KIAl9Ci0JaWYgKGZhaWwpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAidHJ5ICdjZ3JvdXBfZGlzYWJsZT1tZW1vcnknIGJvb3Qgb3B0aW9uXG4iKTsKLQkJcGFuaWMoIk91dCBvZiBtZW1vcnkiKTsKLQl9IGVsc2UgewotCQlob3RwbHVnX21lbW9yeV9ub3RpZmllcihwYWdlX2Nncm91cF9jYWxsYmFjaywgMCk7Ci0JfQorCWhvdHBsdWdfbWVtb3J5X25vdGlmaWVyKHBhZ2VfY2dyb3VwX2NhbGxiYWNrLCAwKTsKIAlwcmludGsoS0VSTl9JTkZPICJhbGxvY2F0ZWQgJWxkIGJ5dGVzIG9mIHBhZ2VfY2dyb3VwXG4iLCB0b3RhbF91c2FnZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAicGxlYXNlIHRyeSAnY2dyb3VwX2Rpc2FibGU9bWVtb3J5JyBvcHRpb24gaWYgeW91IGRvbid0IgotCSIgd2FudCBtZW1vcnkgY2dyb3Vwc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAicGxlYXNlIHRyeSAnY2dyb3VwX2Rpc2FibGU9bWVtb3J5JyBvcHRpb24gaWYgeW91ICIKKwkJCSAiZG9uJ3Qgd2FudCBtZW1vcnkgY2dyb3Vwc1xuIik7CisJcmV0dXJuOworb29tOgorCXByaW50ayhLRVJOX0NSSVQgInRyeSAnY2dyb3VwX2Rpc2FibGU9bWVtb3J5JyBib290IG9wdGlvblxuIik7CisJcGFuaWMoIk91dCBvZiBtZW1vcnkiKTsKIH0KIAogdm9pZCBfX21lbWluaXQgcGdkYXRfcGFnZV9jZ3JvdXBfaW5pdChzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KQpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDBlYjQ2M2UuLjIzMjk1ZjYgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTM4LDkgKzM4LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXJjaC1kZXBlbmRlbnQgZmx1c2hfZGNhY2hlX21tYXBfbG9jaywKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGlub2RlX3diX2xpc3RfbG9jayBpbiBfX3N5bmNfc2luZ2xlX2lub2RlKQogICoKLSAqIChjb2RlIGRvZXNuJ3QgcmVseSBvbiB0aGF0IG9yZGVyIHNvIGl0IGNvdWxkIGJlIHN3aXRjaGVkIGFyb3VuZCkKLSAqIC0+dGFza2xpc3RfbG9jawotICogICBhbm9uX3ZtYS0+bXV0ZXggICAgICAobWVtb3J5X2ZhaWx1cmUsIGNvbGxlY3RfcHJvY3NfYW5vbikKKyAqIGFub25fdm1hLT5tdXRleCxtYXBwaW5nLT5pX211dGV4ICAgICAgKG1lbW9yeV9mYWlsdXJlLCBjb2xsZWN0X3Byb2NzX2Fub24pCisgKiAgIC0+dGFza2xpc3RfbG9jawogICogICAgIHB0ZSBtYXAgbG9jawogICovCiAKQEAgLTExMiw5ICsxMTEsOSBAQAogCWttZW1fY2FjaGVfZnJlZShhbm9uX3ZtYV9jYWNoZXAsIGFub25fdm1hKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmFub25fdm1hX2NoYWluX2FsbG9jKHZvaWQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYW5vbl92bWFfY2hhaW5fYWxsb2MoZ2ZwX3QgZ2ZwKQogewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGFub25fdm1hX2NoYWluX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoYW5vbl92bWFfY2hhaW5fY2FjaGVwLCBnZnApOwogfQogCiBzdGF0aWMgdm9pZCBhbm9uX3ZtYV9jaGFpbl9mcmVlKHN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYW5vbl92bWFfY2hhaW4pCkBAIC0xNTksNyArMTU4LDcgQEAKIAkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCQlzdHJ1Y3QgYW5vbl92bWEgKmFsbG9jYXRlZDsKIAotCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYygpOworCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfS0VSTkVMKTsKIAkJaWYgKCFhdmMpCiAJCQlnb3RvIG91dF9lbm9tZW07CiAKQEAgLTIwMCw2ICsxOTksMzIgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAorLyoKKyAqIFRoaXMgaXMgYSB1c2VmdWwgaGVscGVyIGZ1bmN0aW9uIGZvciBsb2NraW5nIHRoZSBhbm9uX3ZtYSByb290IGFzCisgKiB3ZSB0cmF2ZXJzZSB0aGUgdm1hLT5hbm9uX3ZtYV9jaGFpbiwgbG9vcGluZyBvdmVyIGFub25fdm1hJ3MgdGhhdAorICogaGF2ZSB0aGUgc2FtZSB2bWEuCisgKgorICogU3VjaCBhbm9uX3ZtYSdzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHlvdSdkIGV4cGVjdCB0byBzZWUKKyAqIGp1c3QgYSBzaW5nbGUgbXV0ZXhfbG9jayBmb3IgdGhlIHdob2xlIHRyYXZlcnNhbC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYW5vbl92bWEgKmxvY2tfYW5vbl92bWFfcm9vdChzdHJ1Y3QgYW5vbl92bWEgKnJvb3QsIHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCit7CisJc3RydWN0IGFub25fdm1hICpuZXdfcm9vdCA9IGFub25fdm1hLT5yb290OworCWlmIChuZXdfcm9vdCAhPSByb290KSB7CisJCWlmIChXQVJOX09OX09OQ0Uocm9vdCkpCisJCQltdXRleF91bmxvY2soJnJvb3QtPm11dGV4KTsKKwkJcm9vdCA9IG5ld19yb290OworCQltdXRleF9sb2NrKCZyb290LT5tdXRleCk7CisJfQorCXJldHVybiByb290OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX2Fub25fdm1hX3Jvb3Qoc3RydWN0IGFub25fdm1hICpyb290KQoreworCWlmIChyb290KQorCQltdXRleF91bmxvY2soJnJvb3QtPm11dGV4KTsKK30KKwogc3RhdGljIHZvaWQgYW5vbl92bWFfY2hhaW5fbGluayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQlzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmF2YywKIAkJCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQpAQCAtMjA4LDEzICsyMzMsMTEgQEAKIAlhdmMtPmFub25fdm1hID0gYW5vbl92bWE7CiAJbGlzdF9hZGQoJmF2Yy0+c2FtZV92bWEsICZ2bWEtPmFub25fdm1hX2NoYWluKTsKIAotCWFub25fdm1hX2xvY2soYW5vbl92bWEpOwogCS8qCiAJICogSXQncyBjcml0aWNhbCB0byBhZGQgbmV3IHZtYXMgdG8gdGhlIHRhaWwgb2YgdGhlIGFub25fdm1hLAogCSAqIHNlZSBjb21tZW50IGluIGh1Z2VfbWVtb3J5LmM6X19zcGxpdF9odWdlX3BhZ2UoKS4KIAkgKi8KIAlsaXN0X2FkZF90YWlsKCZhdmMtPnNhbWVfYW5vbl92bWEsICZhbm9uX3ZtYS0+aGVhZCk7Ci0JYW5vbl92bWFfdW5sb2NrKGFub25fdm1hKTsKIH0KIAogLyoKQEAgLTIyNCwxMyArMjQ3LDI0IEBACiBpbnQgYW5vbl92bWFfY2xvbmUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjKQogewogCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYXZjLCAqcGF2YzsKKwlzdHJ1Y3QgYW5vbl92bWEgKnJvb3QgPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBhdmMsICZzcmMtPmFub25fdm1hX2NoYWluLCBzYW1lX3ZtYSkgewotCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYygpOwotCQlpZiAoIWF2YykKLQkJCWdvdG8gZW5vbWVtX2ZhaWx1cmU7Ci0JCWFub25fdm1hX2NoYWluX2xpbmsoZHN0LCBhdmMsIHBhdmMtPmFub25fdm1hKTsKKwkJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKKworCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOKTsKKwkJaWYgKHVubGlrZWx5KCFhdmMpKSB7CisJCQl1bmxvY2tfYW5vbl92bWFfcm9vdChyb290KTsKKwkJCXJvb3QgPSBOVUxMOworCQkJYXZjID0gYW5vbl92bWFfY2hhaW5fYWxsb2MoR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWF2YykKKwkJCQlnb3RvIGVub21lbV9mYWlsdXJlOworCQl9CisJCWFub25fdm1hID0gcGF2Yy0+YW5vbl92bWE7CisJCXJvb3QgPSBsb2NrX2Fub25fdm1hX3Jvb3Qocm9vdCwgYW5vbl92bWEpOworCQlhbm9uX3ZtYV9jaGFpbl9saW5rKGRzdCwgYXZjLCBhbm9uX3ZtYSk7CiAJfQorCXVubG9ja19hbm9uX3ZtYV9yb290KHJvb3QpOwogCXJldHVybiAwOwogCiAgZW5vbWVtX2ZhaWx1cmU6CkBAIC0yNjMsNyArMjk3LDcgQEAKIAlhbm9uX3ZtYSA9IGFub25fdm1hX2FsbG9jKCk7CiAJaWYgKCFhbm9uX3ZtYSkKIAkJZ290byBvdXRfZXJyb3I7Ci0JYXZjID0gYW5vbl92bWFfY2hhaW5fYWxsb2MoKTsKKwlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfS0VSTkVMKTsKIAlpZiAoIWF2YykKIAkJZ290byBvdXRfZXJyb3JfZnJlZV9hbm9uX3ZtYTsKIApAQCAtMjgwLDcgKzMxNCw5IEBACiAJZ2V0X2Fub25fdm1hKGFub25fdm1hLT5yb290KTsKIAkvKiBNYXJrIHRoaXMgYW5vbl92bWEgYXMgdGhlIG9uZSB3aGVyZSBvdXIgbmV3IChDT1dlZCkgcGFnZXMgZ28uICovCiAJdm1hLT5hbm9uX3ZtYSA9IGFub25fdm1hOworCWFub25fdm1hX2xvY2soYW5vbl92bWEpOwogCWFub25fdm1hX2NoYWluX2xpbmsodm1hLCBhdmMsIGFub25fdm1hKTsKKwlhbm9uX3ZtYV91bmxvY2soYW5vbl92bWEpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI5MSwzNiArMzI3LDQzIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyB2b2lkIGFub25fdm1hX3VubGluayhzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmFub25fdm1hX2NoYWluKQotewotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBhbm9uX3ZtYV9jaGFpbi0+YW5vbl92bWE7Ci0JaW50IGVtcHR5OwotCi0JLyogSWYgYW5vbl92bWFfZm9yayBmYWlscywgd2UgY2FuIGdldCBhbiBlbXB0eSBhbm9uX3ZtYV9jaGFpbi4gKi8KLQlpZiAoIWFub25fdm1hKQotCQlyZXR1cm47Ci0KLQlhbm9uX3ZtYV9sb2NrKGFub25fdm1hKTsKLQlsaXN0X2RlbCgmYW5vbl92bWFfY2hhaW4tPnNhbWVfYW5vbl92bWEpOwotCi0JLyogV2UgbXVzdCBnYXJiYWdlIGNvbGxlY3QgdGhlIGFub25fdm1hIGlmIGl0J3MgZW1wdHkgKi8KLQllbXB0eSA9IGxpc3RfZW1wdHkoJmFub25fdm1hLT5oZWFkKTsKLQlhbm9uX3ZtYV91bmxvY2soYW5vbl92bWEpOwotCi0JaWYgKGVtcHR5KQotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotfQotCiB2b2lkIHVubGlua19hbm9uX3ZtYXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGFub25fdm1hX2NoYWluICphdmMsICpuZXh0OworCXN0cnVjdCBhbm9uX3ZtYSAqcm9vdCA9IE5VTEw7CiAKIAkvKgogCSAqIFVubGluayBlYWNoIGFub25fdm1hIGNoYWluZWQgdG8gdGhlIFZNQS4gIFRoaXMgbGlzdCBpcyBvcmRlcmVkCiAJICogZnJvbSBuZXdlc3QgdG8gb2xkZXN0LCBlbnN1cmluZyB0aGUgcm9vdCBhbm9uX3ZtYSBnZXRzIGZyZWVkIGxhc3QuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGF2YywgbmV4dCwgJnZtYS0+YW5vbl92bWFfY2hhaW4sIHNhbWVfdm1hKSB7Ci0JCWFub25fdm1hX3VubGluayhhdmMpOworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gYXZjLT5hbm9uX3ZtYTsKKworCQlyb290ID0gbG9ja19hbm9uX3ZtYV9yb290KHJvb3QsIGFub25fdm1hKTsKKwkJbGlzdF9kZWwoJmF2Yy0+c2FtZV9hbm9uX3ZtYSk7CisKKwkJLyoKKwkJICogTGVhdmUgZW1wdHkgYW5vbl92bWFzIG9uIHRoZSBsaXN0IC0gd2UnbGwgbmVlZAorCQkgKiB0byBmcmVlIHRoZW0gb3V0c2lkZSB0aGUgbG9jay4KKwkJICovCisJCWlmIChsaXN0X2VtcHR5KCZhbm9uX3ZtYS0+aGVhZCkpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbCgmYXZjLT5zYW1lX3ZtYSk7CisJCWFub25fdm1hX2NoYWluX2ZyZWUoYXZjKTsKKwl9CisJdW5sb2NrX2Fub25fdm1hX3Jvb3Qocm9vdCk7CisKKwkvKgorCSAqIEl0ZXJhdGUgdGhlIGxpc3Qgb25jZSBtb3JlLCBpdCBub3cgb25seSBjb250YWlucyBlbXB0eSBhbmQgdW5saW5rZWQKKwkgKiBhbm9uX3ZtYXMsIGRlc3Ryb3kgdGhlbS4gQ291bGQgbm90IGRvIGJlZm9yZSBkdWUgdG8gX19wdXRfYW5vbl92bWEoKQorCSAqIG5lZWRpbmcgdG8gYWNxdWlyZSB0aGUgYW5vbl92bWEtPnJvb3QtPm11dGV4LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdmMsIG5leHQsICZ2bWEtPmFub25fdm1hX2NoYWluLCBzYW1lX3ZtYSkgeworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gYXZjLT5hbm9uX3ZtYTsKKworCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOworCiAJCWxpc3RfZGVsKCZhdmMtPnNhbWVfdm1hKTsKIAkJYW5vbl92bWFfY2hhaW5fZnJlZShhdmMpOwogCX0KZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGQyMjFhMWMuLmZjZWRmNTQgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJfSB3aGlsZSAobmV4dCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKK3ZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQogewogCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7CiAJdW5zaWduZWQgbG9uZyBpZHg7CkBAIC01NjIsNiArNTYyLDggQEAKIAlzcGlubG9ja190ICpwdW5jaF9sb2NrOwogCXVuc2lnbmVkIGxvbmcgdXBwZXJfbGltaXQ7CiAKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwogCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJaWR4ID0gKHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlpZiAoaWR4ID49IGluZm8tPm5leHRfaW5kZXgpCkBAIC03MzgsMTYgKzc0MCw4IEBACiAJCSAqIGxvd2VyZWQgbmV4dF9pbmRleC4gIEFsc28sIHRob3VnaCBzaG1lbV9nZXRwYWdlIGNoZWNrcwogCQkgKiBpX3NpemUgYmVmb3JlIGFkZGluZyB0byBjYWNoZSwgbm8gcmVjaGVjayBhZnRlcjogc28gZml4IHRoZQogCQkgKiBuYXJyb3cgd2luZG93IHRoZXJlIHRvby4KLQkJICoKLQkJICogUmVjYWxsaW5nIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlIGFuZCB1bm1hcF9tYXBwaW5nX3JhbmdlCi0JCSAqIGV2ZXJ5IHRpbWUgZm9yIHB1bmNoX2hvbGUgKHdoaWNoIG5ldmVyIGdvdCBhIGNoYW5jZSB0byBjbGVhcgotCQkgKiBTSE1FTV9QQUdFSU4gYXQgdGhlIHN0YXJ0IG9mIHZtdHJ1bmNhdGVfcmFuZ2UpIGlzIGV4cGVuc2l2ZSwKLQkJICogeWV0IGhhcmRseSBldmVyIG5lY2Vzc2FyeTogdHJ5IHRvIG9wdGltaXplIHRoZW0gb3V0IGxhdGVyLgogCQkgKi8KIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7Ci0JCWlmIChwdW5jaF9ob2xlKQotCQkJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwKLQkJCQkJCQllbmQgLSBzdGFydCwgMSk7CiAJfQogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKQEAgLTc2NiwyMiArNzYwLDIzIEBACiAJCXNobWVtX2ZyZWVfcGFnZXMocGFnZXNfdG9fZnJlZS5uZXh0KTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzaG1lbV90cnVuY2F0ZV9yYW5nZSk7CiAKLXN0YXRpYyBpbnQgc2htZW1fbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3N0YXRpYyBpbnQgc2htZW1fc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCWxvZmZfdCBuZXdzaXplID0gYXR0ci0+aWFfc2l6ZTsKIAlpbnQgZXJyb3I7CiAKIAllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCi0JCQkJCSYmIG5ld3NpemUgIT0gaW5vZGUtPmlfc2l6ZSkgeworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkpIHsKKwkJbG9mZl90IG9sZHNpemUgPSBpbm9kZS0+aV9zaXplOworCQlsb2ZmX3QgbmV3c2l6ZSA9IGF0dHItPmlhX3NpemU7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAotCQlpZiAobmV3c2l6ZSA8IGlub2RlLT5pX3NpemUpIHsKKwkJaWYgKG5ld3NpemUgPCBvbGRzaXplKSB7CiAJCQkvKgogCQkJICogSWYgdHJ1bmNhdGluZyBkb3duIHRvIGEgcGFydGlhbCBwYWdlLCB0aGVuCiAJCQkgKiBpZiB0aGF0IHBhZ2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGhvbGQgaXQKQEAgLTgxMCwxMiArODA1LDE5IEBACiAJCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCQkJfQogCQl9Ci0KLQkJLyogWFhYKHRydW5jYXRlKTogdHJ1bmNhdGVfc2V0c2l6ZSBzaG91bGQgYmUgY2FsbGVkIGxhc3QgKi8KLQkJdHJ1bmNhdGVfc2V0c2l6ZShpbm9kZSwgbmV3c2l6ZSk7CisJCWlmIChuZXdzaXplICE9IG9sZHNpemUpIHsKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgbmV3c2l6ZSk7CisJCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCQl9CisJCWlmIChuZXdzaXplIDwgb2xkc2l6ZSkgeworCQkJbG9mZl90IGhvbGViZWdpbiA9IHJvdW5kX3VwKG5ld3NpemUsIFBBR0VfU0laRSk7CisJCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIGhvbGViZWdpbiwgMCwgMSk7CisJCQlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgbmV3c2l6ZSwgKGxvZmZfdCktMSk7CisJCQkvKiB1bm1hcCBhZ2FpbiB0byByZW1vdmUgcmFjaWx5IENPV2VkIHByaXZhdGUgcGFnZXMgKi8KKwkJCXVubWFwX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgaG9sZWJlZ2luLCAwLCAxKTsKKwkJfQogCQlpZiAocGFnZSkKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJc2htZW1fdHJ1bmNhdGVfcmFuZ2UoaW5vZGUsIG5ld3NpemUsIChsb2ZmX3QpLTEpOwogCX0KIAogCXNldGF0dHJfY29weShpbm9kZSwgYXR0cik7CkBAIC04MzIsNyArODM0LDYgQEAKIAlzdHJ1Y3Qgc2htZW1feGF0dHIgKnhhdHRyLCAqbnhhdHRyOwogCiAJaWYgKGlub2RlLT5pX21hcHBpbmctPmFfb3BzID09ICZzaG1lbV9hb3BzKSB7Ci0JCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwogCQlzaG1lbV91bmFjY3Rfc2l6ZShpbmZvLT5mbGFncywgaW5vZGUtPmlfc2l6ZSk7CiAJCWlub2RlLT5pX3NpemUgPSAwOwogCQlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgMCwgKGxvZmZfdCktMSk7CkBAIC0yNzA2LDcgKzI3MDcsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAorCS5zZXRhdHRyCT0gc2htZW1fc2V0YXR0ciwKIAkudHJ1bmNhdGVfcmFuZ2UJPSBzaG1lbV90cnVuY2F0ZV9yYW5nZSwKICNpZmRlZiBDT05GSUdfVE1QRlNfWEFUVFIKIAkuc2V0eGF0dHIJPSBzaG1lbV9zZXR4YXR0ciwKQEAgLTI3MzksNyArMjc0MCw3IEBACiAJLnJlbW92ZXhhdHRyCT0gc2htZW1fcmVtb3ZleGF0dHIsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMCi0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAorCS5zZXRhdHRyCT0gc2htZW1fc2V0YXR0ciwKIAkuY2hlY2tfYWNsCT0gZ2VuZXJpY19jaGVja19hY2wsCiAjZW5kaWYKIH07CkBAIC0yNzUyLDcgKzI3NTMsNyBAQAogCS5yZW1vdmV4YXR0cgk9IHNobWVtX3JlbW92ZXhhdHRyLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RNUEZTX1BPU0lYX0FDTAotCS5zZXRhdHRyCT0gc2htZW1fbm90aWZ5X2NoYW5nZSwKKwkuc2V0YXR0cgk9IHNobWVtX3NldGF0dHIsCiAJLmNoZWNrX2FjbAk9IGdlbmVyaWNfY2hlY2tfYWNsLAogI2VuZGlmCiB9OwpAQCAtMjkwOCw2ICsyOTA5LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQoreworCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2htZW1fdHJ1bmNhdGVfcmFuZ2UpOworCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKIC8qKgogICogbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0IC0gZmluZCBhIHBhZ2Ugb3IgZW50cnkgYXNzaWduZWQgdG8gdGhlIHNobWVtIGZpbGUKQEAgLTMwMjgsMyArMzAzNSwyNiBAQAogCXZtYS0+dm1fZmxhZ3MgfD0gVk1fQ0FOX05PTkxJTkVBUjsKIAlyZXR1cm4gMDsKIH0KKworLyoqCisgKiBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAgLSByZWFkIGludG8gcGFnZSBjYWNoZSwgdXNpbmcgc3BlY2lmaWVkIHBhZ2UgYWxsb2NhdGlvbiBmbGFncy4KKyAqIEBtYXBwaW5nOgl0aGUgcGFnZSdzIGFkZHJlc3Nfc3BhY2UKKyAqIEBpbmRleDoJdGhlIHBhZ2UgaW5kZXgKKyAqIEBnZnA6CXRoZSBwYWdlIGFsbG9jYXRvciBmbGFncyB0byB1c2UgaWYgYWxsb2NhdGluZworICoKKyAqIFRoaXMgYmVoYXZlcyBhcyBhIHRtcGZzICJyZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGluZGV4LCBnZnApIiwKKyAqIHdpdGggYW55IG5ldyBwYWdlIGFsbG9jYXRpb25zIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBhbGxvY2F0aW9uIGZsYWdzLgorICogQnV0IHJlYWRfY2FjaGVfcGFnZV9nZnAoKSB1c2VzIHRoZSAtPnJlYWRwYWdlKCkgbWV0aG9kOiB3aGljaCBkb2VzIG5vdAorICogc3VpdCB0bXBmcywgc2luY2UgaXQgbWF5IGhhdmUgcGFnZXMgaW4gc3dhcGNhY2hlLCBhbmQgbmVlZHMgdG8gZmluZCB0aG9zZQorICogZm9yIGl0c2VsZjsgYWx0aG91Z2ggZHJpdmVycy9ncHUvZHJtIGk5MTUgYW5kIHR0bSByZWx5IHVwb24gdGhpcyBzdXBwb3J0LgorICoKKyAqIFByb3ZpZGUgYSBzdHViIGZvciB0aG9zZSBjYWxsZXJzIHRvIHN0YXJ0IHVzaW5nIG5vdywgdGhlbiBsYXRlcgorICogZmxlc2ggaXQgb3V0IHRvIGNhbGwgc2htZW1fZ2V0cGFnZSgpIHdpdGggYWRkaXRpb25hbCBnZnAgbWFzaywgd2hlbgorICogc2htZW1fZmlsZV9zcGxpY2VfcmVhZCgpIGlzIGFkZGVkIGFuZCBzaG1lbV9yZWFkcGFnZSgpIGlzIHJlbW92ZWQuCisgKi8KK3N0cnVjdCBwYWdlICpzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCSBwZ29mZl90IGluZGV4LCBnZnBfdCBnZnApCit7CisJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaW5kZXgsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnApOwpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGJjZmE0OTguLmQ5NmUyMjMgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTM2MDQsMTMgKzM2MDQsMTQgQEAKICAqIFJlbGVhc2UgYW4gb2JqIGJhY2sgdG8gaXRzIGNhY2hlLiBJZiB0aGUgb2JqIGhhcyBhIGNvbnN0cnVjdGVkIHN0YXRlLCBpdCBtdXN0CiAgKiBiZSBpbiB0aGlzIHN0YXRlIF9iZWZvcmVfIGl0IGlzIHJlbGVhc2VkLiAgQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50cy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB2b2lkICpvYmpwKQorc3RhdGljIGlubGluZSB2b2lkIF9fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB2b2lkICpvYmpwLAorICAgIHZvaWQgKmNhbGxlcikKIHsKIAlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjID0gY3B1X2NhY2hlX2dldChjYWNoZXApOwogCiAJY2hlY2tfaXJxX29mZigpOwogCWttZW1sZWFrX2ZyZWVfcmVjdXJzaXZlKG9ianAsIGNhY2hlcC0+ZmxhZ3MpOwotCW9ianAgPSBjYWNoZV9mcmVlX2RlYnVnY2hlY2soY2FjaGVwLCBvYmpwLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCW9ianAgPSBjYWNoZV9mcmVlX2RlYnVnY2hlY2soY2FjaGVwLCBvYmpwLCBjYWxsZXIpOwogCiAJa21lbWNoZWNrX3NsYWJfZnJlZShjYWNoZXAsIG9ianAsIG9ial9zaXplKGNhY2hlcCkpOwogCkBAIC0zODAxLDcgKzM4MDIsNyBAQAogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKG9ianAsIG9ial9zaXplKGNhY2hlcCkpOwogCWlmICghKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX0RFQlVHX09CSkVDVFMpKQogCQlkZWJ1Z19jaGVja19ub19vYmpfZnJlZWQob2JqcCwgb2JqX3NpemUoY2FjaGVwKSk7Ci0JX19jYWNoZV9mcmVlKGNhY2hlcCwgb2JqcCk7CisJX19jYWNoZV9mcmVlKGNhY2hlcCwgb2JqcCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAl0cmFjZV9rbWVtX2NhY2hlX2ZyZWUoX1JFVF9JUF8sIG9ianApOwpAQCAtMzgzMSw3ICszODMyLDcgQEAKIAljID0gdmlydF90b19jYWNoZShvYmpwKTsKIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChvYmpwLCBvYmpfc2l6ZShjKSk7CiAJZGVidWdfY2hlY2tfbm9fb2JqX2ZyZWVkKG9ianAsIG9ial9zaXplKGMpKTsKLQlfX2NhY2hlX2ZyZWUoYywgKHZvaWQgKilvYmpwKTsKKwlfX2NhY2hlX2ZyZWUoYywgKHZvaWQgKilvYmpwLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woa2ZyZWUpOwpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDdiZTAyMjMuLjM1ZjM1MWYgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTIzMjAsMTYgKzIzMjAsMTIgQEAKIAlCVUlMRF9CVUdfT04oUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0laRSA8CiAJCQlTTFVCX1BBR0VfU0hJRlQgKiBzaXplb2Yoc3RydWN0IGttZW1fY2FjaGVfY3B1KSk7CiAKLSNpZmRlZiBDT05GSUdfQ01QWENIR19MT0NBTAogCS8qCi0JICogTXVzdCBhbGlnbiB0byBkb3VibGUgd29yZCBib3VuZGFyeSBmb3IgdGhlIGRvdWJsZSBjbXB4Y2hnIGluc3RydWN0aW9ucwotCSAqIHRvIHdvcmsuCisJICogTXVzdCBhbGlnbiB0byBkb3VibGUgd29yZCBib3VuZGFyeSBmb3IgdGhlIGRvdWJsZSBjbXB4Y2hnCisJICogaW5zdHJ1Y3Rpb25zIHRvIHdvcms7IHNlZSBfX3BjcHVfZG91YmxlX2NhbGxfcmV0dXJuX2Jvb2woKS4KIAkgKi8KLQlzLT5jcHVfc2xhYiA9IF9fYWxsb2NfcGVyY3B1KHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZV9jcHUpLCAyICogc2l6ZW9mKHZvaWQgKikpOwotI2Vsc2UKLQkvKiBSZWd1bGFyIGFsaWdubWVudCBpcyBzdWZmaWNpZW50ICovCi0Jcy0+Y3B1X3NsYWIgPSBhbGxvY19wZXJjcHUoc3RydWN0IGttZW1fY2FjaGVfY3B1KTsKLSNlbmRpZgorCXMtPmNwdV9zbGFiID0gX19hbGxvY19wZXJjcHUoc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlX2NwdSksCisJCQkJICAgICAyICogc2l6ZW9mKHZvaWQgKikpOwogCiAJaWYgKCFzLT5jcHVfc2xhYikKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCBkNTM3ZDI5Li5mZjhkYzFhIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KZGlmZiAtLWdpdCBhL21tL3RocmFzaC5jIGIvbW0vdGhyYXNoLmMKaW5kZXggMjM3MmQ0ZS4uZmFiZjJkMCAxMDA2NDQKLS0tIGEvbW0vdGhyYXNoLmMKKysrIGIvbW0vdGhyYXNoLmMKQEAgLTIxLDE0ICsyMSw0MCBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Ztc2Nhbi5oPgorCisjZGVmaW5lIFRPS0VOX0FHSU5HX0lOVEVSVkFMCSgweEZGKQogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfdG9rZW5fbG9jayk7CiBzdHJ1Y3QgbW1fc3RydWN0ICpzd2FwX3Rva2VuX21tOworc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2c7CiBzdGF0aWMgdW5zaWduZWQgaW50IGdsb2JhbF9mYXVsdHM7CitzdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfYWdpbmc7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICpzd2FwX3Rva2VuX21lbWNnX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCisJbWVtY2cgPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShtbSk7CisJaWYgKG1lbWNnKQorCQljc3NfcHV0KG1lbV9jZ3JvdXBfY3NzKG1lbWNnKSk7CisKKwlyZXR1cm4gbWVtY2c7Cit9CisjZWxzZQorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICpzd2FwX3Rva2VuX21lbWNnX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKIAogdm9pZCBncmFiX3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJaW50IGN1cnJlbnRfaW50ZXJ2YWw7CisJdW5zaWduZWQgaW50IG9sZF9wcmlvID0gbW0tPnRva2VuX3ByaW9yaXR5OwogCiAJZ2xvYmFsX2ZhdWx0cysrOwogCkBAIC0zOCw0MCArNjQsODEgQEAKIAkJcmV0dXJuOwogCiAJLyogRmlyc3QgY29tZSBmaXJzdCBzZXJ2ZWQgKi8KLQlpZiAoc3dhcF90b2tlbl9tbSA9PSBOVUxMKSB7Ci0JCW1tLT50b2tlbl9wcmlvcml0eSA9IG1tLT50b2tlbl9wcmlvcml0eSArIDI7Ci0JCXN3YXBfdG9rZW5fbW0gPSBtbTsKLQkJZ290byBvdXQ7CisJaWYgKCFzd2FwX3Rva2VuX21tKQorCQlnb3RvIHJlcGxhY2VfdG9rZW47CisKKwlpZiAoKGdsb2JhbF9mYXVsdHMgLSBsYXN0X2FnaW5nKSA+IFRPS0VOX0FHSU5HX0lOVEVSVkFMKSB7CisJCXN3YXBfdG9rZW5fbW0tPnRva2VuX3ByaW9yaXR5IC89IDI7CisJCWxhc3RfYWdpbmcgPSBnbG9iYWxfZmF1bHRzOwogCX0KIAotCWlmIChtbSAhPSBzd2FwX3Rva2VuX21tKSB7Ci0JCWlmIChjdXJyZW50X2ludGVydmFsIDwgbW0tPmxhc3RfaW50ZXJ2YWwpCi0JCQltbS0+dG9rZW5fcHJpb3JpdHkrKzsKLQkJZWxzZSB7Ci0JCQlpZiAobGlrZWx5KG1tLT50b2tlbl9wcmlvcml0eSA+IDApKQotCQkJCW1tLT50b2tlbl9wcmlvcml0eS0tOwotCQl9Ci0JCS8qIENoZWNrIGlmIHdlIGRlc2VydmUgdGhlIHRva2VuICovCi0JCWlmIChtbS0+dG9rZW5fcHJpb3JpdHkgPiBzd2FwX3Rva2VuX21tLT50b2tlbl9wcmlvcml0eSkgewotCQkJbW0tPnRva2VuX3ByaW9yaXR5ICs9IDI7Ci0JCQlzd2FwX3Rva2VuX21tID0gbW07Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBUb2tlbiBob2xkZXIgY2FtZSBpbiBhZ2FpbiEgKi8KKwlpZiAobW0gPT0gc3dhcF90b2tlbl9tbSkgewogCQltbS0+dG9rZW5fcHJpb3JpdHkgKz0gMjsKKwkJZ290byB1cGRhdGVfcHJpb3JpdHk7CiAJfQogCisJaWYgKGN1cnJlbnRfaW50ZXJ2YWwgPCBtbS0+bGFzdF9pbnRlcnZhbCkKKwkJbW0tPnRva2VuX3ByaW9yaXR5Kys7CisJZWxzZSB7CisJCWlmIChsaWtlbHkobW0tPnRva2VuX3ByaW9yaXR5ID4gMCkpCisJCQltbS0+dG9rZW5fcHJpb3JpdHktLTsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBkZXNlcnZlIHRoZSB0b2tlbiAqLworCWlmIChtbS0+dG9rZW5fcHJpb3JpdHkgPiBzd2FwX3Rva2VuX21tLT50b2tlbl9wcmlvcml0eSkKKwkJZ290byByZXBsYWNlX3Rva2VuOworCit1cGRhdGVfcHJpb3JpdHk6CisJdHJhY2VfdXBkYXRlX3N3YXBfdG9rZW5fcHJpb3JpdHkobW0sIG9sZF9wcmlvLCBzd2FwX3Rva2VuX21tKTsKKwogb3V0OgogCW1tLT5mYXVsdHN0YW1wID0gZ2xvYmFsX2ZhdWx0czsKIAltbS0+bGFzdF9pbnRlcnZhbCA9IGN1cnJlbnRfaW50ZXJ2YWw7CiAJc3Bpbl91bmxvY2soJnN3YXBfdG9rZW5fbG9jayk7CisJcmV0dXJuOworCityZXBsYWNlX3Rva2VuOgorCW1tLT50b2tlbl9wcmlvcml0eSArPSAyOworCXRyYWNlX3JlcGxhY2Vfc3dhcF90b2tlbihzd2FwX3Rva2VuX21tLCBtbSk7CisJc3dhcF90b2tlbl9tbSA9IG1tOworCXN3YXBfdG9rZW5fbWVtY2cgPSBzd2FwX3Rva2VuX21lbWNnX2Zyb21fbW0obW0pOworCWxhc3RfYWdpbmcgPSBnbG9iYWxfZmF1bHRzOworCWdvdG8gb3V0OwogfQogCiAvKiBDYWxsZWQgb24gcHJvY2VzcyBleGl0LiAqLwogdm9pZCBfX3B1dF9zd2FwX3Rva2VuKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXNwaW5fbG9jaygmc3dhcF90b2tlbl9sb2NrKTsKLQlpZiAobGlrZWx5KG1tID09IHN3YXBfdG9rZW5fbW0pKQorCWlmIChsaWtlbHkobW0gPT0gc3dhcF90b2tlbl9tbSkpIHsKKwkJdHJhY2VfcHV0X3N3YXBfdG9rZW4oc3dhcF90b2tlbl9tbSk7CiAJCXN3YXBfdG9rZW5fbW0gPSBOVUxMOworCQlzd2FwX3Rva2VuX21lbWNnID0gTlVMTDsKKwl9CiAJc3Bpbl91bmxvY2soJnN3YXBfdG9rZW5fbG9jayk7CiB9CisKK3N0YXRpYyBib29sIG1hdGNoX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICphLCBzdHJ1Y3QgbWVtX2Nncm91cCAqYikKK3sKKwlpZiAoIWEpCisJCXJldHVybiB0cnVlOworCWlmICghYikKKwkJcmV0dXJuIHRydWU7CisJaWYgKGEgPT0gYikKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGRpc2FibGVfc3dhcF90b2tlbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCit7CisJLyogbWVtY2cgcmVjbGFpbSBkb24ndCBkaXNhYmxlIHVucmVsYXRlZCBtbSB0b2tlbi4gKi8KKwlpZiAobWF0Y2hfbWVtY2cobWVtY2csIHN3YXBfdG9rZW5fbWVtY2cpKSB7CisJCXNwaW5fbG9jaygmc3dhcF90b2tlbl9sb2NrKTsKKwkJaWYgKG1hdGNoX21lbWNnKG1lbWNnLCBzd2FwX3Rva2VuX21lbWNnKSkgeworCQkJdHJhY2VfZGlzYWJsZV9zd2FwX3Rva2VuKHN3YXBfdG9rZW5fbW0pOworCQkJc3dhcF90b2tlbl9tbSA9IE5VTEw7CisJCQlzd2FwX3Rva2VuX21lbWNnID0gTlVMTDsKKwkJfQorCQlzcGluX3VubG9jaygmc3dhcF90b2tlbl9sb2NrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCAzYTI5YTYxLi5lMTNmMjJlIDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTMwNCw2ICszMDQsMTEgQEAKICAqIEBsc3RhcnQ6IG9mZnNldCBmcm9tIHdoaWNoIHRvIHRydW5jYXRlCiAgKgogICogQ2FsbGVkIHVuZGVyIChhbmQgc2VyaWFsaXNlZCBieSkgaW5vZGUtPmlfbXV0ZXguCisgKgorICogTm90ZTogV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHRoZXJlIGNhbiBiZSBhIHBhZ2UgaW4gdGhlIHByb2Nlc3Mgb2YKKyAqIGRlbGV0aW9uIChpbnNpZGUgX19kZWxldGVfZnJvbV9wYWdlX2NhY2hlKCkpIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuICBUaHVzCisgKiBtYXBwaW5nLT5ucnBhZ2VzIGNhbiBiZSBub24temVybyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBldmVuIGFmdGVyCisgKiB0cnVuY2F0aW9uIG9mIHRoZSB3aG9sZSBtYXBwaW5nLgogICovCiB2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgbHN0YXJ0KQogewpAQCAtNjAzLDMgKzYwOCwyNyBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh2bXRydW5jYXRlKTsKKworaW50IHZtdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGVuZCkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwkvKgorCSAqIElmIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaXMgbm90IGdvaW5nIHRvIHByb3ZpZGUKKwkgKiBhIHdheSB0byB0cnVuY2F0ZSBhIHJhbmdlIG9mIGJsb2NrcyAocHVuY2ggYSBob2xlKSAtCisJICogd2Ugc2hvdWxkIHJldHVybiBmYWlsdXJlIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoIWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJZG93bl93cml0ZSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgKGVuZCAtIG9mZnNldCksIDEpOworCWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZShpbm9kZSwgb2Zmc2V0LCBlbmQpOworCS8qIHVubWFwIGFnYWluIHRvIHJlbW92ZSByYWNpbHkgQ09XZWQgcHJpdmF0ZSBwYWdlcyAqLworCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCAoZW5kIC0gb2Zmc2V0KSwgMSk7CisJdXBfd3JpdGUoJmlub2RlLT5pX2FsbG9jX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggZmFhMGEwOC4uNWVkMjRiOSAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTExMjQsOCArMTEyNCwyMCBAQAogCQkJCQlucl9sdW1weV9kaXJ0eSsrOwogCQkJCXNjYW4rKzsKIAkJCX0gZWxzZSB7Ci0JCQkJLyogdGhlIHBhZ2UgaXMgZnJlZWQgYWxyZWFkeS4gKi8KLQkJCQlpZiAoIXBhZ2VfY291bnQoY3Vyc29yX3BhZ2UpKQorCQkJCS8qCisJCQkJICogQ2hlY2sgaWYgdGhlIHBhZ2UgaXMgZnJlZWQgYWxyZWFkeS4KKwkJCQkgKgorCQkJCSAqIFdlIGNhbid0IHVzZSBwYWdlX2NvdW50KCkgYXMgdGhhdAorCQkJCSAqIHJlcXVpcmVzIGNvbXBvdW5kX2hlYWQgYW5kIHdlIGRvbid0CisJCQkJICogaGF2ZSBhIHBpbiBvbiB0aGUgcGFnZSBoZXJlLiBJZiBhCisJCQkJICogcGFnZSBpcyB0YWlsLCB3ZSBtYXkgb3IgbWF5IG5vdAorCQkJCSAqIGhhdmUgaXNvbGF0ZWQgdGhlIGhlYWQsIHNvIGFzc3VtZQorCQkJCSAqIGl0J3Mgbm90IGZyZWUsIGl0J2QgYmUgdHJpY2t5IHRvCisJCQkJICogdHJhY2sgdGhlIGhlYWQgc3RhdHVzIHdpdGhvdXQgYQorCQkJCSAqIHBhZ2UgcGluLgorCQkJCSAqLworCQkJCWlmICghUGFnZVRhaWwoY3Vyc29yX3BhZ2UpICYmCisJCQkJICAgICFhdG9taWNfcmVhZCgmY3Vyc29yX3BhZ2UtPl9jb3VudCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTk4MywxNCArMTk5NSwxMyBAQAogICogSWYgYSB6b25lIGlzIGRlZW1lZCB0byBiZSBmdWxsIG9mIHBpbm5lZCBwYWdlcyB0aGVuIGp1c3QgZ2l2ZSBpdCBhIGxpZ2h0CiAgKiBzY2FuIHRoZW4gZ2l2ZSB1cCBvbiBpdC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3pvbmVzKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwKK3N0YXRpYyB2b2lkIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCiAJCQkJCXN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogewogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCXVuc2lnbmVkIGxvbmcgbnJfc29mdF9yZWNsYWltZWQ7CiAJdW5zaWduZWQgbG9uZyBucl9zb2Z0X3NjYW5uZWQ7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FubmVkID0gMDsKIAogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Rfbm9kZW1hc2soem9uZSwgeiwgem9uZWxpc3QsCiAJCQkJCWdmcF96b25lKHNjLT5nZnBfbWFzayksIHNjLT5ub2RlbWFzaykgewpAQCAtMjAwNSwxOSArMjAxNiwyMyBAQAogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlICYmIHByaW9yaXR5ICE9IERFRl9QUklPUklUWSkKIAkJCQljb250aW51ZTsJLyogTGV0IGtzd2FwZCBwb2xsIGl0ICovCisJCQkvKgorCQkJICogVGhpcyBzdGVhbHMgcGFnZXMgZnJvbSBtZW1vcnkgY2dyb3VwcyBvdmVyIHNvZnRsaW1pdAorCQkJICogYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiByZWNsYWltZWQgcGFnZXMgYW5kCisJCQkgKiBzY2FubmVkIHBhZ2VzLiBUaGlzIHdvcmtzIGZvciBnbG9iYWwgbWVtb3J5IHByZXNzdXJlCisJCQkgKiBhbmQgYmFsYW5jaW5nLCBub3QgZm9yIGEgbWVtY2cncyBsaW1pdC4KKwkJCSAqLworCQkJbnJfc29mdF9zY2FubmVkID0gMDsKKwkJCW5yX3NvZnRfcmVjbGFpbWVkID0gbWVtX2Nncm91cF9zb2Z0X2xpbWl0X3JlY2xhaW0oem9uZSwKKwkJCQkJCXNjLT5vcmRlciwgc2MtPmdmcF9tYXNrLAorCQkJCQkJJm5yX3NvZnRfc2Nhbm5lZCk7CisJCQlzYy0+bnJfcmVjbGFpbWVkICs9IG5yX3NvZnRfcmVjbGFpbWVkOworCQkJc2MtPm5yX3NjYW5uZWQgKz0gbnJfc29mdF9zY2FubmVkOworCQkJLyogbmVlZCBzb21lIGNoZWNrIGZvciBhdm9pZCBtb3JlIHNocmlua196b25lKCkgKi8KIAkJfQogCi0JCW5yX3NvZnRfc2Nhbm5lZCA9IDA7Ci0JCW5yX3NvZnRfcmVjbGFpbWVkID0gbWVtX2Nncm91cF9zb2Z0X2xpbWl0X3JlY2xhaW0oem9uZSwKLQkJCQkJCQlzYy0+b3JkZXIsIHNjLT5nZnBfbWFzaywKLQkJCQkJCQkmbnJfc29mdF9zY2FubmVkKTsKLQkJc2MtPm5yX3JlY2xhaW1lZCArPSBucl9zb2Z0X3JlY2xhaW1lZDsKLQkJdG90YWxfc2Nhbm5lZCArPSBucl9zb2Z0X3NjYW5uZWQ7Ci0KIAkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsIHNjKTsKIAl9Ci0KLQlyZXR1cm4gdG90YWxfc2Nhbm5lZDsKIH0KIAogc3RhdGljIGJvb2wgem9uZV9yZWNsYWltYWJsZShzdHJ1Y3Qgem9uZSAqem9uZSkKQEAgLTIwODEsOCArMjA5Niw4IEBACiAJZm9yIChwcmlvcml0eSA9IERFRl9QUklPUklUWTsgcHJpb3JpdHkgPj0gMDsgcHJpb3JpdHktLSkgewogCQlzYy0+bnJfc2Nhbm5lZCA9IDA7CiAJCWlmICghcHJpb3JpdHkpCi0JCQlkaXNhYmxlX3N3YXBfdG9rZW4oKTsKLQkJdG90YWxfc2Nhbm5lZCArPSBzaHJpbmtfem9uZXMocHJpb3JpdHksIHpvbmVsaXN0LCBzYyk7CisJCQlkaXNhYmxlX3N3YXBfdG9rZW4oc2MtPm1lbV9jZ3JvdXApOworCQlzaHJpbmtfem9uZXMocHJpb3JpdHksIHpvbmVsaXN0LCBzYyk7CiAJCS8qCiAJCSAqIERvbid0IHNocmluayBzbGFicyB3aGVuIHJlY2xhaW1pbmcgbWVtb3J5IGZyb20KIAkJICogb3ZlciBsaW1pdCBjZ3JvdXBzCkBAIC0yMzExLDcgKzIzMjYsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qIENoZWNrIHRoZSB3YXRlcm1hcmsgbGV2ZWxzICovCi0JZm9yIChpID0gMDsgaSA8IHBnZGF0LT5ucl96b25lczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBjbGFzc3pvbmVfaWR4OyBpKyspIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAKIAkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKQEAgLTIzMjksNyArMjM0NCw3IEBACiAJCX0KIAogCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsIGhpZ2hfd21hcmtfcGFnZXMoem9uZSksCi0JCQkJCQkJY2xhc3N6b25lX2lkeCwgMCkpCisJCQkJCQkJaSwgMCkpCiAJCQlhbGxfem9uZXNfb2sgPSBmYWxzZTsKIAkJZWxzZQogCQkJYmFsYW5jZWQgKz0gem9uZS0+cHJlc2VudF9wYWdlczsKQEAgLTI0MDcsNyArMjQyMiw3IEBACiAKIAkJLyogVGhlIHN3YXAgdG9rZW4gZ2V0cyBpbiB0aGUgd2F5IG9mIHN3YXBvdXQuLi4gKi8KIAkJaWYgKCFwcmlvcml0eSkKLQkJCWRpc2FibGVfc3dhcF90b2tlbigpOworCQkJZGlzYWJsZV9zd2FwX3Rva2VuKE5VTEwpOwogCiAJCWFsbF96b25lc19vayA9IDE7CiAJCWJhbGFuY2VkID0gMDsKQEAgLTI0MzYsNyArMjQ1MSw2IEBACiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsCiAJCQkJCWhpZ2hfd21hcmtfcGFnZXMoem9uZSksIDAsIDApKSB7CiAJCQkJZW5kX3pvbmUgPSBpOwotCQkJCSpjbGFzc3pvbmVfaWR4ID0gaTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMjQ5NSwxOCArMjUwOSwxOCBAQAogCQkJCUtTV0FQRF9aT05FX0JBTEFOQ0VfR0FQX1JBVElPKTsKIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwKIAkJCQkJaGlnaF93bWFya19wYWdlcyh6b25lKSArIGJhbGFuY2VfZ2FwLAotCQkJCQllbmRfem9uZSwgMCkpCisJCQkJCWVuZF96b25lLCAwKSkgewogCQkJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwotCQkJcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWIgPSAwOwotCQkJbnJfc2xhYiA9IHNocmlua19zbGFiKCZzaHJpbmssIHNjLm5yX3NjYW5uZWQsIGxydV9wYWdlcyk7Ci0JCQlzYy5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7Ci0JCQl0b3RhbF9zY2FubmVkICs9IHNjLm5yX3NjYW5uZWQ7CiAKLQkJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChucl9zbGFiID09IDAgJiYKLQkJCSAgICAhem9uZV9yZWNsYWltYWJsZSh6b25lKSkKLQkJCQl6b25lLT5hbGxfdW5yZWNsYWltYWJsZSA9IDE7CisJCQkJcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWIgPSAwOworCQkJCW5yX3NsYWIgPSBzaHJpbmtfc2xhYigmc2hyaW5rLCBzYy5ucl9zY2FubmVkLCBscnVfcGFnZXMpOworCQkJCXNjLm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKKwkJCQl0b3RhbF9zY2FubmVkICs9IHNjLm5yX3NjYW5uZWQ7CisKKwkJCQlpZiAobnJfc2xhYiA9PSAwICYmICF6b25lX3JlY2xhaW1hYmxlKHpvbmUpKQorCQkJCQl6b25lLT5hbGxfdW5yZWNsYWltYWJsZSA9IDE7CisJCQl9CisKIAkJCS8qCiAJCQkgKiBJZiB3ZSd2ZSBkb25lIGEgZGVjZW50IGFtb3VudCBvZiBzY2FubmluZyBhbmQKIAkJCSAqIHRoZSByZWNsYWltIHJhdGlvIGlzIGxvdywgc3RhcnQgZG9pbmcgd3JpdGVwYWdlCkBAIC0yNTE2LDYgKzI1MzAsMTIgQEAKIAkJCSAgICB0b3RhbF9zY2FubmVkID4gc2MubnJfcmVjbGFpbWVkICsgc2MubnJfcmVjbGFpbWVkIC8gMikKIAkJCQlzYy5tYXlfd3JpdGVwYWdlID0gMTsKIAorCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlKSB7CisJCQkJaWYgKGVuZF96b25lICYmIGVuZF96b25lID09IGkpCisJCQkJCWVuZF96b25lLS07CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwKIAkJCQkJaGlnaF93bWFya19wYWdlcyh6b25lKSwgZW5kX3pvbmUsIDApKSB7CiAJCQkJYWxsX3pvbmVzX29rID0gMDsKQEAgLTI2OTQsOCArMjcxNCw4IEBACiAgKi8KIHN0YXRpYyBpbnQga3N3YXBkKHZvaWQgKnApCiB7Ci0JdW5zaWduZWQgbG9uZyBvcmRlcjsKLQlpbnQgY2xhc3N6b25lX2lkeDsKKwl1bnNpZ25lZCBsb25nIG9yZGVyLCBuZXdfb3JkZXI7CisJaW50IGNsYXNzem9uZV9pZHgsIG5ld19jbGFzc3pvbmVfaWR4OwogCXBnX2RhdGFfdCAqcGdkYXQgPSAocGdfZGF0YV90KilwOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIApAQCAtMjcyNSwxNyArMjc0NSwyMyBAQAogCXRzay0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0MgfCBQRl9TV0FQV1JJVEUgfCBQRl9LU1dBUEQ7CiAJc2V0X2ZyZWV6YWJsZSgpOwogCi0Jb3JkZXIgPSAwOwotCWNsYXNzem9uZV9pZHggPSBNQVhfTlJfWk9ORVMgLSAxOworCW9yZGVyID0gbmV3X29yZGVyID0gMDsKKwljbGFzc3pvbmVfaWR4ID0gbmV3X2NsYXNzem9uZV9pZHggPSBwZ2RhdC0+bnJfem9uZXMgLSAxOwogCWZvciAoIDsgOyApIHsKLQkJdW5zaWduZWQgbG9uZyBuZXdfb3JkZXI7Ci0JCWludCBuZXdfY2xhc3N6b25lX2lkeDsKIAkJaW50IHJldDsKIAotCQluZXdfb3JkZXIgPSBwZ2RhdC0+a3N3YXBkX21heF9vcmRlcjsKLQkJbmV3X2NsYXNzem9uZV9pZHggPSBwZ2RhdC0+Y2xhc3N6b25lX2lkeDsKLQkJcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXIgPSAwOwotCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUyAtIDE7CisJCS8qCisJCSAqIElmIHRoZSBsYXN0IGJhbGFuY2VfcGdkYXQgd2FzIHVuc3VjY2Vzc2Z1bCBpdCdzIHVubGlrZWx5IGEKKwkJICogbmV3IHJlcXVlc3Qgb2YgYSBzaW1pbGFyIG9yIGhhcmRlciB0eXBlIHdpbGwgc3VjY2VlZCBzb29uCisJCSAqIHNvIGNvbnNpZGVyIGdvaW5nIHRvIHNsZWVwIG9uIHRoZSBiYXNpcyB3ZSByZWNsYWltZWQgYXQKKwkJICovCisJCWlmIChjbGFzc3pvbmVfaWR4ID49IG5ld19jbGFzc3pvbmVfaWR4ICYmIG9yZGVyID09IG5ld19vcmRlcikgeworCQkJbmV3X29yZGVyID0gcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXI7CisJCQluZXdfY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5jbGFzc3pvbmVfaWR4OworCQkJcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXIgPSAgMDsKKwkJCXBnZGF0LT5jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKKwkJfQorCiAJCWlmIChvcmRlciA8IG5ld19vcmRlciB8fCBjbGFzc3pvbmVfaWR4ID4gbmV3X2NsYXNzem9uZV9pZHgpIHsKIAkJCS8qCiAJCQkgKiBEb24ndCBzbGVlcCBpZiBzb21lb25lIHdhbnRzIGEgbGFyZ2VyICdvcmRlcicKQEAgLTI3NDgsNyArMjc3NCw3IEBACiAJCQlvcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOwogCQkJY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5jbGFzc3pvbmVfaWR4OwogCQkJcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXIgPSAwOwotCQkJcGdkYXQtPmNsYXNzem9uZV9pZHggPSBNQVhfTlJfWk9ORVMgLSAxOworCQkJcGdkYXQtPmNsYXNzem9uZV9pZHggPSBwZ2RhdC0+bnJfem9uZXMgLSAxOwogCQl9CiAKIAkJcmV0ID0gdHJ5X3RvX2ZyZWV6ZSgpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggYzdhNTgxYS4uOTE3ZWNiOSAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAlncnAtPm5yX3ZsYW5zKys7CiAKIAlpZiAobmdycCkgewotCQlpZiAob3BzLT5uZG9fdmxhbl9yeF9yZWdpc3RlcikKKwkJaWYgKG9wcy0+bmRvX3ZsYW5fcnhfcmVnaXN0ZXIgJiYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkpCiAJCQlvcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKHJlYWxfZGV2LCBuZ3JwKTsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKHJlYWxfZGV2LT52bGdycCwgbmdycCk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCmluZGV4IDQxNDk1ZGMyLi5mY2M2ODQ2IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCkBAIC0yMyw2ICsyMywzMSBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlza2ItPmRldiA9IHZsYW5fZGV2OworCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVEhFUkhPU1QpIHsKKwkJLyogT3VyIGxvd2VyIGxheWVyIHRoaW5rcyB0aGlzIGlzIG5vdCBsb2NhbCwgbGV0J3MgbWFrZSBzdXJlLgorCQkgKiBUaGlzIGFsbG93cyB0aGUgVkxBTiB0byBoYXZlIGEgZGlmZmVyZW50IE1BQyB0aGFuIHRoZQorCQkgKiB1bmRlcmx5aW5nIGRldmljZSwgYW5kIHN0aWxsIHJvdXRlIGNvcnJlY3RseS4gKi8KKwkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcihza2IpLT5oX2Rlc3QsCisJCQkJCXZsYW5fZGV2LT5kZXZfYWRkcikpCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJfQorCisJaWYgKCEodmxhbl9kZXZfaW5mbyh2bGFuX2RldiktPmZsYWdzICYgVkxBTl9GTEFHX1JFT1JERVJfSERSKSkgeworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKKworCQkvKgorCQkgKiB2bGFuX2luc2VydF90YWcgZXhwZWN0IHNrYi0+ZGF0YSBwb2ludGluZyB0byBtYWMgaGVhZGVyLgorCQkgKiBTbyBjaGFuZ2Ugc2tiLT5kYXRhIGJlZm9yZSBjYWxsaW5nIGl0IGFuZCBjaGFuZ2UgYmFjayB0bworCQkgKiBvcmlnaW5hbCBwb3NpdGlvbiBsYXRlcgorCQkgKi8KKwkJc2tiX3B1c2goc2tiLCBvZmZzZXQpOworCQlza2IgPSAqc2ticCA9IHZsYW5faW5zZXJ0X3RhZyhza2IsIHNrYi0+dmxhbl90Y2kpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBmYWxzZTsKKwkJc2tiX3B1bGwoc2tiLCBvZmZzZXQgKyBWTEFOX0hMRU4pOworCQlza2JfcmVzZXRfbWFjX2xlbihza2IpOworCX0KKwogCXNrYi0+cHJpb3JpdHkgPSB2bGFuX2dldF9pbmdyZXNzX3ByaW9yaXR5KHZsYW5fZGV2LCBza2ItPnZsYW5fdGNpKTsKIAlza2ItPnZsYW5fdGNpID0gMDsKIApAQCAtMzEsMjIgKzU2LDggQEAKIAl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9zdGF0cy0+c3luY3ApOwogCXJ4X3N0YXRzLT5yeF9wYWNrZXRzKys7CiAJcnhfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCi0Jc3dpdGNoIChza2ItPnBrdF90eXBlKSB7Ci0JY2FzZSBQQUNLRVRfQlJPQURDQVNUOgotCQlicmVhazsKLQljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX01VTFRJQ0FTVCkKIAkJcnhfc3RhdHMtPnJ4X211bHRpY2FzdCsrOwotCQlicmVhazsKLQljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6Ci0JCS8qIE91ciBsb3dlciBsYXllciB0aGlua3MgdGhpcyBpcyBub3QgbG9jYWwsIGxldCdzIG1ha2Ugc3VyZS4KLQkJICogVGhpcyBhbGxvd3MgdGhlIFZMQU4gdG8gaGF2ZSBhIGRpZmZlcmVudCBNQUMgdGhhbiB0aGUKLQkJICogdW5kZXJseWluZyBkZXZpY2UsIGFuZCBzdGlsbCByb3V0ZSBjb3JyZWN0bHkuICovCi0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9kZXN0LAotCQkJCQl2bGFuX2Rldi0+ZGV2X2FkZHIpKQotCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwotCQlicmVhazsKLQl9CiAJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3N0YXRzLT5zeW5jcCk7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTg5LDE4ICsxMDAsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0wodmxhbl9ncm9fZnJhZ3MpOwogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZsYW5fY2hlY2tfcmVvcmRlcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdmxhbl9yZW9yZGVyX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICh2bGFuX2Rldl9pbmZvKHNrYi0+ZGV2KS0+ZmxhZ3MgJiBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIpIHsKLQkJaWYgKHNrYl9jb3coc2tiLCBza2JfaGVhZHJvb20oc2tiKSkgPCAwKQotCQkJc2tiID0gTlVMTDsKLQkJaWYgKHNrYikgewotCQkJLyogTGlmdGVkIGZyb20gR2xlYidzIFZMQU4gY29kZS4uLiAqLwotCQkJbWVtbW92ZShza2ItPmRhdGEgLSBFVEhfSExFTiwKLQkJCQlza2ItPmRhdGEgLSBWTEFOX0VUSF9ITEVOLCAxMik7Ci0JCQlza2ItPm1hY19oZWFkZXIgKz0gVkxBTl9ITEVOOwotCQl9Ci0JfQorCWlmIChza2JfY293KHNrYiwgc2tiX2hlYWRyb29tKHNrYikpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtbW92ZShza2ItPmRhdGEgLSBFVEhfSExFTiwgc2tiLT5kYXRhIC0gVkxBTl9FVEhfSExFTiwgMiAqIEVUSF9BTEVOKTsKKwlza2ItPm1hY19oZWFkZXIgKz0gVkxBTl9ITEVOOworCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CiAJcmV0dXJuIHNrYjsKIH0KIApAQCAtMTYxLDcgKzE2Nyw3IEBACiAJc2tiX3B1bGxfcmNzdW0oc2tiLCBWTEFOX0hMRU4pOwogCXZsYW5fc2V0X2VuY2FwX3Byb3RvKHNrYiwgdmhkcik7CiAKLQlza2IgPSB2bGFuX2NoZWNrX3Jlb3JkZXJfaGVhZGVyKHNrYik7CisJc2tiID0gdmxhbl9yZW9yZGVyX2hlYWRlcihza2IpOwogCWlmICh1bmxpa2VseSghc2tiKSkKIAkJZ290byBlcnJfZnJlZTsKIApkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCBmMjQ3ZjViLi42ZTgyMTQ4IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzLT5zeW5jcCk7CiAJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAJCXN0YXRzLT50eF9ieXRlcyArPSBsZW47Ci0JCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzLT5zeW5jcCk7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzdGF0cy0+c3luY3ApOwogCX0gZWxzZSB7CiAJCXRoaXNfY3B1X2luYyh2bGFuX2Rldl9pbmZvKGRldiktPnZsYW5fcGNwdV9zdGF0cy0+dHhfZHJvcHBlZCk7CiAJfQpAQCAtNTI4LDcgKzUyOCwxMSBAQAogCQkJCQkgICgxPDxfX0xJTktfU1RBVEVfRE9STUFOVCkpKSB8CiAJCSAgICAgICgxPDxfX0xJTktfU1RBVEVfUFJFU0VOVCk7CiAKLQlkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9BTExfVFhfT0ZGTE9BRFM7CisJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfQUxMX0NTVU0gfCBORVRJRl9GX1NHIHwKKwkJCSAgIE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0FMTF9UU08gfAorCQkJICAgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9TQ1RQX0NTVU0gfAorCQkJICAgTkVUSUZfRl9BTExfRkNPRTsKKwogCWRldi0+ZmVhdHVyZXMgfD0gcmVhbF9kZXYtPnZsYW5fZmVhdHVyZXMgfCBORVRJRl9GX0xMVFg7CiAJZGV2LT5nc29fbWF4X3NpemUgPSByZWFsX2Rldi0+Z3NvX21heF9zaXplOwogCkBAIC01ODYsOSArNTkwLDE0IEBACiBzdGF0aWMgdTMyIHZsYW5fZGV2X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKKwl1MzIgb2xkX2ZlYXR1cmVzID0gZmVhdHVyZXM7CiAKIAlmZWF0dXJlcyAmPSByZWFsX2Rldi0+ZmVhdHVyZXM7CiAJZmVhdHVyZXMgJj0gcmVhbF9kZXYtPnZsYW5fZmVhdHVyZXM7CisKKwlpZiAob2xkX2ZlYXR1cmVzICYgTkVUSUZfRl9TT0ZUX0ZFQVRVUkVTKQorCQlmZWF0dXJlcyB8PSBvbGRfZmVhdHVyZXMgJiBORVRJRl9GX1NPRlRfRkVBVFVSRVM7CisKIAlpZiAoZGV2X2V0aHRvb2xfZ2V0X3J4X2NzdW0ocmVhbF9kZXYpKQogCQlmZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTTsKIAlmZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKaW5kZXggMzE2MzMzMC4uYmNkMTU4ZiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtMzkzLDYgKzM5Myw5IEBACiAKIAloY2lfZGV2X3B1dChoZGV2KTsKIAorCWlmIChjb25uLT5oYW5kbGUgPT0gMCkKKwkJa2ZyZWUoY29ubik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjA4LDExICs2MTEsMTEgQEAKIAkJZ290byBlbmNyeXB0OwogCiBhdXRoOgotCWlmICh0ZXN0X2FuZF9zZXRfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPnBlbmQpKQorCWlmICh0ZXN0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKSkKIAkJcmV0dXJuIDA7CiAKLQloY2lfY29ubl9hdXRoKGNvbm4sIHNlY19sZXZlbCwgYXV0aF90eXBlKTsKLQlyZXR1cm4gMDsKKwlpZiAoIWhjaV9jb25uX2F1dGgoY29ubiwgc2VjX2xldmVsLCBhdXRoX3R5cGUpKQorCQlyZXR1cm4gMDsKIAogZW5jcnlwdDoKIAlpZiAoY29ubi0+bGlua19tb2RlICYgSENJX0xNX0VOQ1JZUFQpCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwppbmRleCBmMTNkZGJmLi43NzkzMGFhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKQEAgLTQ3NywxNCArNDc3LDE2IEBACiAJICogY29tbWFuZCBvdGhlcndpc2UgKi8KIAl1OCBldmVudHNbOF0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmIsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAotCS8qIEV2ZW50cyBmb3IgMS4yIGFuZCBuZXdlciBjb250cm9sbGVycyAqLwotCWlmIChoZGV2LT5sbXBfdmVyID4gMSkgewotCQlldmVudHNbNF0gfD0gMHgwMTsgLyogRmxvdyBTcGVjaWZpY2F0aW9uIENvbXBsZXRlICovCi0JCWV2ZW50c1s0XSB8PSAweDAyOyAvKiBJbnF1aXJ5IFJlc3VsdCB3aXRoIFJTU0kgKi8KLQkJZXZlbnRzWzRdIHw9IDB4MDQ7IC8qIFJlYWQgUmVtb3RlIEV4dGVuZGVkIEZlYXR1cmVzIENvbXBsZXRlICovCi0JCWV2ZW50c1s1XSB8PSAweDA4OyAvKiBTeW5jaHJvbm91cyBDb25uZWN0aW9uIENvbXBsZXRlICovCi0JCWV2ZW50c1s1XSB8PSAweDEwOyAvKiBTeW5jaHJvbm91cyBDb25uZWN0aW9uIENoYW5nZWQgKi8KLQl9CisJLyogQ1NSIDEuMSBkb25nbGVzIGRvZXMgbm90IGFjY2VwdCBhbnkgYml0ZmllbGQgc28gZG9uJ3QgdHJ5IHRvIHNldAorCSAqIGFueSBldmVudCBtYXNrIGZvciBwcmUgMS4yIGRldmljZXMgKi8KKwlpZiAoaGRldi0+bG1wX3ZlciA8PSAxKQorCQlyZXR1cm47CisKKwlldmVudHNbNF0gfD0gMHgwMTsgLyogRmxvdyBTcGVjaWZpY2F0aW9uIENvbXBsZXRlICovCisJZXZlbnRzWzRdIHw9IDB4MDI7IC8qIElucXVpcnkgUmVzdWx0IHdpdGggUlNTSSAqLworCWV2ZW50c1s0XSB8PSAweDA0OyAvKiBSZWFkIFJlbW90ZSBFeHRlbmRlZCBGZWF0dXJlcyBDb21wbGV0ZSAqLworCWV2ZW50c1s1XSB8PSAweDA4OyAvKiBTeW5jaHJvbm91cyBDb25uZWN0aW9uIENvbXBsZXRlICovCisJZXZlbnRzWzVdIHw9IDB4MTA7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ2hhbmdlZCAqLwogCiAJaWYgKGhkZXYtPmZlYXR1cmVzWzNdICYgTE1QX1JTU0lfSU5RKQogCQlldmVudHNbNF0gfD0gMHgwNDsgLyogSW5xdWlyeSBSZXN1bHQgd2l0aCBSU1NJICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwppbmRleCBjNDA1YTk1Li40M2I0YzJkIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTQ2NCw3ICs0NjQsOCBAQAogewogCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSAoc3RydWN0IGhpZHBfc2Vzc2lvbiAqKSBhcmc7CiAKLQlrdGhyZWFkX3N0b3Aoc2Vzc2lvbi0+dGFzayk7CisJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwl3YWtlX3VwX3Byb2Nlc3Moc2Vzc2lvbi0+dGFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGhpZHBfc2V0X3RpbWVyKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCkBAIC01MzUsNyArNTM2LDggQEAKIAkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKIAkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KTsKIAotCQlrdGhyZWFkX3N0b3Aoc2Vzc2lvbi0+dGFzayk7CisJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJCXdha2VfdXBfcHJvY2VzcyhjdXJyZW50KTsKIAl9CiB9CiAKQEAgLTcwNiw5ICs3MDgsOCBAQAogCWFkZF93YWl0X3F1ZXVlKHNrX3NsZWVwKGludHJfc2spLCAmaW50cl93YWl0KTsKIAlzZXNzaW9uLT53YWl0aW5nX2Zvcl9zdGFydHVwID0gMDsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlc3Npb24tPnN0YXJ0dXBfcXVldWUpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXdoaWxlICghYXRvbWljX3JlYWQoJnNlc3Npb24tPnRlcm1pbmF0ZSkpIHsKIAkJaWYgKGN0cmxfc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCB8fAogCQkJCWludHJfc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKIAkJCWJyZWFrOwpAQCAtNzI2LDYgKzcyNyw3IEBACiAJCWhpZHBfcHJvY2Vzc190cmFuc21pdChzZXNzaW9uKTsKIAogCQlzY2hlZHVsZSgpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCX0KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKGludHJfc2spLCAmaW50cl93YWl0KTsKQEAgLTEwNjAsNyArMTA2Miw4IEBACiBlcnJfYWRkX2RldmljZToKIAloaWRfZGVzdHJveV9kZXZpY2Uoc2Vzc2lvbi0+aGlkKTsKIAlzZXNzaW9uLT5oaWQgPSBOVUxMOwotCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCXdha2VfdXBfcHJvY2VzcyhzZXNzaW9uLT50YXNrKTsKIAogdW5saW5rOgogCWhpZHBfZGVsX3RpbWVyKHNlc3Npb24pOwpAQCAtMTExMSw3ICsxMTE0LDggQEAKIAkJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCk7CiAJCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOwogCi0JCQlrdGhyZWFkX3N0b3Aoc2Vzc2lvbi0+dGFzayk7CisJCQlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCQkJd2FrZV91cF9wcm9jZXNzKHNlc3Npb24tPnRhc2spOwogCQl9CiAJfSBlbHNlCiAJCWVyciA9IC1FTk9FTlQ7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oIGIvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaAppbmRleCAxOWU5NTAwLi5hZjFiY2M4IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKQEAgLTE0Miw2ICsxNDIsNyBAQAogCXVpbnQgY3RybF9tdHU7CiAJdWludCBpbnRyX210dTsKIAorCWF0b21pY190IHRlcm1pbmF0ZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAKIAl1bnNpZ25lZCBjaGFyIGtleXNbOF07CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCmluZGV4IGE4NmY5YmEuLjc3MDVlMjYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCkBAIC02MjAsNyArNjIwLDggQEAKIAkJCQkJc3RydWN0IHNvY2sgKnBhcmVudCA9IGJ0X3NrKHNrKS0+cGFyZW50OwogCQkJCQlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYoTDJDQVBfQ1JfUEVORCk7CiAJCQkJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNihMMkNBUF9DU19BVVRIT1JfUEVORCk7Ci0JCQkJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCQkJCQlpZiAocGFyZW50KQorCQkJCQkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CiAKIAkJCQl9IGVsc2UgewogCQkJCQlzay0+c2tfc3RhdGUgPSBCVF9DT05GSUc7CkBAIC05MDYsNyArOTA3LDcgQEAKIAkJaWYgKGMtPnBzbSA9PSBwc20pIHsKIAkJCS8qIEV4YWN0IG1hdGNoLiAqLwogCQkJaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsIHNyYykpIHsKLQkJCQlyZWFkX3VubG9ja19iaCgmY2hhbl9saXN0X2xvY2spOworCQkJCXJlYWRfdW5sb2NrKCZjaGFuX2xpc3RfbG9jayk7CiAJCQkJcmV0dXJuIGM7CiAJCQl9CiAKQEAgLTIzMjMsNyArMjMyNCw3IEBACiAKIAlzayA9IGNoYW4tPnNrOwogCi0JaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9DT05GSUcpIHsKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTkZJRyAmJiBzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVDIpIHsKIAkJc3RydWN0IGwyY2FwX2NtZF9yZWogcmVqOwogCiAJCXJlai5yZWFzb24gPSBjcHVfdG9fbGUxNigweDAwMDIpOwpAQCAtMjMzNCw3ICsyMzM1LDcgQEAKIAogCS8qIFJlamVjdCBpZiBjb25maWcgYnVmZmVyIGlzIHRvbyBzbWFsbC4gKi8KIAlsZW4gPSBjbWRfbGVuIC0gc2l6ZW9mKCpyZXEpOwotCWlmIChjaGFuLT5jb25mX2xlbiArIGxlbiA+IHNpemVvZihjaGFuLT5jb25mX3JlcSkpIHsKKwlpZiAobGVuIDwgMCB8fCBjaGFuLT5jb25mX2xlbiArIGxlbiA+IHNpemVvZihjaGFuLT5jb25mX3JlcSkpIHsKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfQ09ORl9SU1AsCiAJCQkJbDJjYXBfYnVpbGRfY29uZl9yc3AoY2hhbiwgcnNwLAogCQkJCQlMMkNBUF9DT05GX1JFSkVDVCwgZmxhZ3MpLCByc3ApOwpAQCAtNDAwMiwyMSArNDAwMywzMSBAQAogCQkJfQogCQl9IGVsc2UgaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUMikgewogCQkJc3RydWN0IGwyY2FwX2Nvbm5fcnNwIHJzcDsKLQkJCV9fdTE2IHJlc3VsdDsKKwkJCV9fdTE2IHJlcywgc3RhdDsKIAogCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQlzay0+c2tfc3RhdGUgPSBCVF9DT05GSUc7Ci0JCQkJcmVzdWx0ID0gTDJDQVBfQ1JfU1VDQ0VTUzsKKwkJCQlpZiAoYnRfc2soc2spLT5kZWZlcl9zZXR1cCkgeworCQkJCQlzdHJ1Y3Qgc29jayAqcGFyZW50ID0gYnRfc2soc2spLT5wYXJlbnQ7CisJCQkJCXJlcyA9IEwyQ0FQX0NSX1BFTkQ7CisJCQkJCXN0YXQgPSBMMkNBUF9DU19BVVRIT1JfUEVORDsKKwkJCQkJaWYgKHBhcmVudCkKKwkJCQkJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKKwkJCQkJcmVzID0gTDJDQVBfQ1JfU1VDQ0VTUzsKKwkJCQkJc3RhdCA9IEwyQ0FQX0NTX05PX0lORk87CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlzay0+c2tfc3RhdGUgPSBCVF9ESVNDT05OOwogCQkJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWiAvIDEwKTsKLQkJCQlyZXN1bHQgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7CisJCQkJcmVzID0gTDJDQVBfQ1JfU0VDX0JMT0NLOworCQkJCXN0YXQgPSBMMkNBUF9DU19OT19JTkZPOwogCQkJfQogCiAJCQlyc3Auc2NpZCAgID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CiAJCQlyc3AuZGNpZCAgID0gY3B1X3RvX2xlMTYoY2hhbi0+c2NpZCk7Ci0JCQlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKLQkJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNihMMkNBUF9DU19OT19JTkZPKTsKKwkJCXJzcC5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXMpOworCQkJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KHN0YXQpOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY2hhbi0+aWRlbnQsIEwyQ0FQX0NPTk5fUlNQLAogCQkJCQkJCXNpemVvZihyc3ApLCAmcnNwKTsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwppbmRleCAxOGRjOTg4Li44MjQ4MzAzIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwpAQCAtNDEzLDYgKzQxMyw3IEBACiAJCQlicmVhazsKIAkJfQogCisJCW1lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOwogCQljaW5mby5oY2lfaGFuZGxlID0gY2hhbi0+Y29ubi0+aGNvbi0+aGFuZGxlOwogCQltZW1jcHkoY2luZm8uZGV2X2NsYXNzLCBjaGFuLT5jb25uLT5oY29uLT5kZXZfY2xhc3MsIDMpOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKaW5kZXggMzg2Y2ZhZi4uMWIxMDcyNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwpAQCAtNzg4LDYgKzc4OCw3IEBACiAKIAkJbDJjYXBfc2sgPSByZmNvbW1fcGkoc2spLT5kbGMtPnNlc3Npb24tPnNvY2stPnNrOwogCisJCW1lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOwogCQljaW5mby5oY2lfaGFuZGxlID0gY29ubi0+aGNvbi0+aGFuZGxlOwogCQltZW1jcHkoY2luZm8uZGV2X2NsYXNzLCBjb25uLT5oY29uLT5kZXZfY2xhc3MsIDMpOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3Njby5jIGIvbmV0L2JsdWV0b290aC9zY28uYwppbmRleCA0MmZkZmZkLi5jYjRmYjc4IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3Njby5jCisrKyBiL25ldC9ibHVldG9vdGgvc2NvLmMKQEAgLTM2OSw2ICszNjksMTUgQEAKIAogCWNhc2UgQlRfQ09OTkVDVEVEOgogCWNhc2UgQlRfQ09ORklHOgorCQlpZiAoc2NvX3BpKHNrKS0+Y29ubikgeworCQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKKwkJCXNjb19zb2NrX3NldF90aW1lcihzaywgU0NPX0RJU0NPTk5fVElNRU9VVCk7CisJCQloY2lfY29ubl9wdXQoc2NvX3BpKHNrKS0+Y29ubi0+aGNvbik7CisJCQlzY29fcGkoc2spLT5jb25uLT5oY29uID0gTlVMTDsKKwkJfSBlbHNlCisJCQlzY29fY2hhbl9kZWwoc2ssIEVDT05OUkVTRVQpOworCQlicmVhazsKKwogCWNhc2UgQlRfQ09OTkVDVDoKIAljYXNlIEJUX0RJU0NPTk46CiAJCXNjb19jaGFuX2RlbChzaywgRUNPTk5SRVNFVCk7CkBAIC04MTksNyArODI4LDkgQEAKIAkJY29ubi0+c2sgPSBOVUxMOwogCQlzY29fcGkoc2spLT5jb25uID0gTlVMTDsKIAkJc2NvX2Nvbm5fdW5sb2NrKGNvbm4pOwotCQloY2lfY29ubl9wdXQoY29ubi0+aGNvbik7CisKKwkJaWYgKGNvbm4tPmhjb24pCisJCQloY2lfY29ubl9wdXQoY29ubi0+aGNvbik7CiAJfQogCiAJc2stPnNrX3N0YXRlID0gQlRfQ0xPU0VEOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggYTZiMmY4Ni4uMzJiOGY5ZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC00OSw3ICs0OSw5IEBACiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKQorCQlicl9mbG9vZF9kZWxpdmVyKGJyLCBza2IpOworCWVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CiAJCWlmICh1bmxpa2VseShuZXRwb2xsX3R4X3J1bm5pbmcoZGV2KSkpIHsKIAkJCWJyX2Zsb29kX2RlbGl2ZXIoYnIsIHNrYik7CiAJCQlnb3RvIG91dDsKQEAgLTI0Myw2ICsyNDUsNyBAQAogCQlnb3RvIG91dDsKIAogCW5wLT5kZXYgPSBwLT5kZXY7CisJc3RybGNweShucC0+ZGV2X25hbWUsIHAtPmRldi0+bmFtZSwgSUZOQU1TSVopOwogCiAJZXJyID0gX19uZXRwb2xsX3NldHVwKG5wKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggZjNhYzFlOC4uZjA2ZWUzOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtNjAsNyArNjAsNyBAQAogCWJyID0gcC0+YnI7CiAJYnJfZmRiX3VwZGF0ZShiciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CiAKLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgJiYKKwlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmCiAJICAgIGJyX211bHRpY2FzdF9yY3YoYnIsIHAsIHNrYikpCiAJCWdvdG8gZHJvcDsKIApAQCAtNzcsNyArNzcsOSBAQAogCiAJZHN0ID0gTlVMTDsKIAotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwkJc2tiMiA9IHNrYjsKKwllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewogCQltZHN0ID0gYnJfbWRiX2dldChiciwgc2tiKTsKIAkJaWYgKG1kc3QgfHwgQlJfSU5QVVRfU0tCX0NCX01ST1VURVJTX09OTFkoc2tiKSkgewogCQkJaWYgKChtZHN0ICYmIG1kc3QtPm1nbGlzdCkgfHwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCmluZGV4IDJmMTRlYWYuLjJkODVjYTcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYwpAQCAtMTM3OSw4ICsxMzc5LDExIEBACiAJaWYgKHVubGlrZWx5KGlwX2Zhc3RfY3N1bSgodTggKilpcGgsIGlwaC0+aWhsKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JR01QKQorCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUdNUCkgeworCQlpZiAoKGlwaC0+ZGFkZHIgJiBJR01QX0xPQ0FMX0dST1VQX01BU0spICE9IElHTVBfTE9DQUxfR1JPVVApCisJCQlCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+bXJvdXRlcnNfb25seSA9IDE7CiAJCXJldHVybiAwOworCX0KIAogCWxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7CiAJaWYgKHNrYi0+bGVuIDwgbGVuIHx8IGxlbiA8IGlwX2hkcmxlbihza2IpKQpAQCAtMTQyNCw3ICsxNDI3LDcgQEAKIAlzd2l0Y2ggKGloLT50eXBlKSB7CiAJY2FzZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQ6CiAJY2FzZSBJR01QVjJfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDoKLQkJQlJfSU5QVVRfU0tCX0NCKHNrYjIpLT5tcm91dGVyc19vbmx5ID0gMTsKKwkJQlJfSU5QVVRfU0tCX0NCKHNrYiktPm1yb3V0ZXJzX29ubHkgPSAxOwogCQllcnIgPSBicl9pcDRfbXVsdGljYXN0X2FkZF9ncm91cChiciwgcG9ydCwgaWgtPmdyb3VwKTsKIAkJYnJlYWs7CiAJY2FzZSBJR01QVjNfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDoKQEAgLTE1NDMsNyArMTU0Niw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQltbGQgPSAoc3RydWN0IG1sZF9tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IyKTsKLQkJQlJfSU5QVVRfU0tCX0NCKHNrYjIpLT5tcm91dGVyc19vbmx5ID0gMTsKKwkJQlJfSU5QVVRfU0tCX0NCKHNrYiktPm1yb3V0ZXJzX29ubHkgPSAxOwogCQllcnIgPSBicl9pcDZfbXVsdGljYXN0X2FkZF9ncm91cChiciwgcG9ydCwgJm1sZC0+bWxkX21jYSk7CiAJCWJyZWFrOwogCSAgICB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCAzZmExMjMxLi41NjE0OWVjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTEwNCwxMCArMTA0LDE2IEBACiB7CiB9CiAKK3N0YXRpYyB1MzIgKmZha2VfY293X21ldHJpY3Moc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1bnNpZ25lZCBsb25nIG9sZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGZha2VfZHN0X29wcyA9IHsKIAkuZmFtaWx5ID0JCUFGX0lORVQsCiAJLnByb3RvY29sID0JCWNwdV90b19iZTE2KEVUSF9QX0lQKSwKIAkudXBkYXRlX3BtdHUgPQkJZmFrZV91cGRhdGVfcG10dSwKKwkuY293X21ldHJpY3MgPQkJZmFrZV9jb3dfbWV0cmljcywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZm11eGwuYyBiL25ldC9jYWlmL2NmbXV4bC5jCmluZGV4IDNhNjZiOGMuLmMyMzk3OWUgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NmbXV4bC5jCisrKyBiL25ldC9jYWlmL2NmbXV4bC5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAogCQlpZiAoY2ZzcnZsX3BoeWlkX21hdGNoKGxheWVyLCBwaHlpZCkgJiYgbGF5ZXItPmN0cmxjbWQpIHsKIAotCQkJaWYgKChjdHJsID09IF9DQUlGX0NUUkxDTURfUEhZSUZfRkxPV19PRkZfSU5EIHx8CisJCQlpZiAoKGN0cmwgPT0gX0NBSUZfQ1RSTENNRF9QSFlJRl9ET1dOX0lORCB8fAogCQkJCWN0cmwgPT0gQ0FJRl9DVFJMQ01EX1JFTU9URV9TSFVURE9XTl9JTkQpICYmCiAJCQkJCWxheWVyLT5pZCAhPSAwKSB7CiAKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NobmxfbmV0LmMgYi9uZXQvY2FpZi9jaG5sX25ldC5jCmluZGV4IDY0OWViYWMuLmFkYmI0MjQgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NobmxfbmV0LmMKKysrIGIvbmV0L2NhaWYvY2hubF9uZXQuYwpAQCAtMTM5LDE3ICsxMzksMTQgQEAKIAlzdHJ1Y3QgY2hubF9uZXQgKmRldiA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9ub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgKl90bXA7Ci0JLyogTWF5IGJlIGNhbGxlZCB3aXRoIG9yIHdpdGhvdXQgUlROTCBsb2NrIGhlbGQgKi8KLQlpbnQgaXNsb2NrZWQgPSBydG5sX2lzX2xvY2tlZCgpOwotCWlmICghaXNsb2NrZWQpCi0JCXJ0bmxfbG9jaygpOworCisJcnRubF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3Rfbm9kZSwgX3RtcCwgJmNobmxfbmV0X2xpc3QpIHsKIAkJZGV2ID0gbGlzdF9lbnRyeShsaXN0X25vZGUsIHN0cnVjdCBjaG5sX25ldCwgbGlzdF9maWVsZCk7CiAJCWlmIChkZXYtPnN0YXRlID09IENBSUZfU0hVVERPV04pCiAJCQlkZXZfY2xvc2UoZGV2LT5uZXRkZXYpOwogCX0KLQlpZiAoIWlzbG9ja2VkKQotCQlydG5sX3VubG9jaygpOworCXJ0bmxfdW5sb2NrKCk7CiB9CiBzdGF0aWMgREVDTEFSRV9XT1JLKGNsb3NlX3dvcmtlciwgY2xvc2Vfd29yayk7CiAKZGlmZiAtLWdpdCBhL25ldC9jZXBoL29zZF9jbGllbnQuYyBiL25ldC9jZXBoL29zZF9jbGllbnQuYwppbmRleCA2ZWEyYjg5Li43MzMwYzI3IDEwMDY0NAotLS0gYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMKKysrIGIvbmV0L2NlcGgvb3NkX2NsaWVudC5jCkBAIC00NzcsOCArNDc3LDkgQEAKIAljYWxjX2xheW91dChvc2RjLCB2aW5vLCBsYXlvdXQsIG9mZiwgcGxlbiwgcmVxLCBvcHMpOwogCXJlcS0+cl9maWxlX2xheW91dCA9ICpsYXlvdXQ7ICAvKiBrZWVwIGEgY29weSAqLwogCi0JLyogaW4gY2FzZSBpdCBkaWZmZXJzIGZyb20gbmF0dXJhbCBhbGlnbm1lbnQgdGhhdCBjYWxjX2xheW91dAotCSAgIGZpbGxlZCBpbiBmb3IgdXMgKi8KKwkvKiBpbiBjYXNlIGl0IGRpZmZlcnMgZnJvbSBuYXR1cmFsIChmaWxlKSBhbGlnbm1lbnQgdGhhdAorCSAgIGNhbGNfbGF5b3V0IGZpbGxlZCBpbiBmb3IgdXMgKi8KKwlyZXEtPnJfbnVtX3BhZ2VzID0gY2FsY19wYWdlc19mb3IocGFnZV9hbGlnbiwgKnBsZW4pOwogCXJlcS0+cl9wYWdlX2FsaWdubWVudCA9IHBhZ2VfYWxpZ247CiAKIAljZXBoX29zZGNfYnVpbGRfcmVxdWVzdChyZXEsIG9mZiwgcGxlbiwgb3BzLApAQCAtMTE0NCw2ICsxMTQ1LDEzIEBACiAJCQkgICAgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKGRlbGF5KSk7CiB9CiAKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAocmVxLT5yX3NhZmVfY2FsbGJhY2spCisJCXJlcS0+cl9zYWZlX2NhbGxiYWNrKHJlcSwgTlVMTCk7CisJY29tcGxldGVfYWxsKCZyZXEtPnJfc2FmZV9jb21wbGV0aW9uKTsgIC8qIGZzeW5jIHdhaXRlciAqLworfQorCiAvKgogICogaGFuZGxlIG9zZCBvcCByZXBseS4gIGVpdGhlciBjYWxsIHRoZSBjYWxsYmFjayBpZiBpdCBpcyBzcGVjaWZpZWQsCiAgKiBvciBkbyB0aGUgY29tcGxldGlvbiB0byB3YWtlIHVwIHRoZSB3YWl0aW5nIHRocmVhZC4KQEAgLTEyMjYsMTEgKzEyMzQsOCBAQAogCWVsc2UKIAkJY29tcGxldGVfYWxsKCZyZXEtPnJfY29tcGxldGlvbik7CiAKLQlpZiAoZmxhZ3MgJiBDRVBIX09TRF9GTEFHX09ORElTSykgewotCQlpZiAocmVxLT5yX3NhZmVfY2FsbGJhY2spCi0JCQlyZXEtPnJfc2FmZV9jYWxsYmFjayhyZXEsIG1zZyk7Ci0JCWNvbXBsZXRlX2FsbCgmcmVxLT5yX3NhZmVfY29tcGxldGlvbik7ICAvKiBmc3luYyB3YWl0ZXIgKi8KLQl9CisJaWYgKGZsYWdzICYgQ0VQSF9PU0RfRkxBR19PTkRJU0spCisJCWNvbXBsZXRlX3JlcXVlc3QocmVxKTsKIAogZG9uZToKIAlkb3V0KCJyZXE9JXAgcmVxLT5yX2xpbmdlcj0lZFxuIiwgcmVxLCByZXEtPnJfbGluZ2VyKTsKQEAgLTE3MzIsNiArMTczNyw3IEBACiAJCV9fY2FuY2VsX3JlcXVlc3QocmVxKTsKIAkJX191bnJlZ2lzdGVyX3JlcXVlc3Qob3NkYywgcmVxKTsKIAkJbXV0ZXhfdW5sb2NrKCZvc2RjLT5yZXF1ZXN0X211dGV4KTsKKwkJY29tcGxldGVfcmVxdWVzdChyZXEpOwogCQlkb3V0KCJ3YWl0X3JlcXVlc3QgdGlkICVsbHUgY2FuY2VsZWQvdGltZWQgb3V0XG4iLCByZXEtPnJfdGlkKTsKIAkJcmV0dXJuIHJjOwogCX0KQEAgLTIwMjIsOCArMjAyOCw5IEBACiAJCWludCB3YW50ID0gY2FsY19wYWdlc19mb3IocmVxLT5yX3BhZ2VfYWxpZ25tZW50LCBkYXRhX2xlbik7CiAKIAkJaWYgKHVubGlrZWx5KHJlcS0+cl9udW1fcGFnZXMgPCB3YW50KSkgewotCQkJcHJfd2FybmluZygidGlkICVsbGQgcmVwbHkgJWQgPiBleHBlY3RlZCAlZCBwYWdlc1xuIiwKLQkJCQkgICB0aWQsIHdhbnQsIG0tPm5yX3BhZ2VzKTsKKwkJCXByX3dhcm5pbmcoInRpZCAlbGxkIHJlcGx5IGhhcyAlZCBieXRlcyAlZCBwYWdlcywgd2UiCisJCQkJICAgIiBoYWQgb25seSAlZCBwYWdlcyByZWFkeVxuIiwgdGlkLCBkYXRhX2xlbiwKKwkJCQkgICB3YW50LCByZXEtPnJfbnVtX3BhZ2VzKTsKIAkJCSpza2lwID0gMTsKIAkJCWNlcGhfbXNnX3B1dChtKTsKIAkJCW0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCBjN2UzMDVkLi45YzU4YzFlIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtMjA5Niw2ICsyMDk2LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGRldi0+bmV0ZGV2X29wczsKIAlpbnQgcmMgPSBORVRERVZfVFhfT0s7CisJdW5zaWduZWQgaW50IHNrYl9sZW47CiAKIAlpZiAobGlrZWx5KCFza2ItPm5leHQpKSB7CiAJCXUzMiBmZWF0dXJlczsKQEAgLTIxNDYsOCArMjE0Nyw5IEBACiAJCQl9CiAJCX0KIAorCQlza2JfbGVuID0gc2tiLT5sZW47CiAJCXJjID0gb3BzLT5uZG9fc3RhcnRfeG1pdChza2IsIGRldik7Ci0JCXRyYWNlX25ldF9kZXZfeG1pdChza2IsIHJjKTsKKwkJdHJhY2VfbmV0X2Rldl94bWl0KHNrYiwgcmMsIGRldiwgc2tiX2xlbik7CiAJCWlmIChyYyA9PSBORVRERVZfVFhfT0spCiAJCQl0eHFfdHJhbnNfdXBkYXRlKHR4cSk7CiAJCXJldHVybiByYzsKQEAgLTIxNjcsOCArMjE2OSw5IEBACiAJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfWE1JVF9EU1RfUkVMRUFTRSkKIAkJCXNrYl9kc3RfZHJvcChuc2tiKTsKIAorCQlza2JfbGVuID0gbnNrYi0+bGVuOwogCQlyYyA9IG9wcy0+bmRvX3N0YXJ0X3htaXQobnNrYiwgZGV2KTsKLQkJdHJhY2VfbmV0X2Rldl94bWl0KG5za2IsIHJjKTsKKwkJdHJhY2VfbmV0X2Rldl94bWl0KG5za2IsIHJjLCBkZXYsIHNrYl9sZW4pOwogCQlpZiAodW5saWtlbHkocmMgIT0gTkVUREVWX1RYX09LKSkgewogCQkJaWYgKHJjICYgfk5FVERFVl9UWF9NQVNLKQogCQkJCWdvdG8gb3V0X2tmcmVlX2dzb19za2I7CkBAIC0zMTExLDcgKzMxMTQsNyBAQAogCiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKLQlza2ItPm1hY19sZW4gPSBza2ItPm5ldHdvcmtfaGVhZGVyIC0gc2tiLT5tYWNfaGVhZGVyOworCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CiAKIAlwdF9wcmV2ID0gTlVMTDsKIApAQCAtNjE3NSw2ICs2MTc4LDExIEBACiAJCW9sZHNkLT5vdXRwdXRfcXVldWUgPSBOVUxMOwogCQlvbGRzZC0+b3V0cHV0X3F1ZXVlX3RhaWxwID0gJm9sZHNkLT5vdXRwdXRfcXVldWU7CiAJfQorCS8qIEFwcGVuZCBOQVBJIHBvbGwgbGlzdCBmcm9tIG9mZmxpbmUgQ1BVLiAqLworCWlmICghbGlzdF9lbXB0eSgmb2xkc2QtPnBvbGxfbGlzdCkpIHsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmb2xkc2QtPnBvbGxfbGlzdCwgJnNkLT5wb2xsX2xpc3QpOworCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihORVRfUlhfU09GVElSUSk7CisJfQogCiAJcmFpc2Vfc29mdGlycV9pcnFvZmYoTkVUX1RYX1NPRlRJUlEpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKQEAgLTYyNjEsMjkgKzYyNjksMjMgQEAKIC8qKgogICoJbmV0ZGV2X2RyaXZlcm5hbWUgLSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIGRldmljZQogICoJQGRldjogbmV0d29yayBkZXZpY2UKLSAqCUBidWZmZXI6IGJ1ZmZlciBmb3IgcmVzdWx0aW5nIG5hbWUKLSAqCUBsZW46IHNpemUgb2YgYnVmZmVyCiAgKgogICoJRGV0ZXJtaW5lIG5ldHdvcmsgZHJpdmVyIGZvciBkZXZpY2UuCiAgKi8KLWNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK2NvbnN0IGNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcjsKIAljb25zdCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7Ci0KLQlpZiAobGVuIDw9IDAgfHwgIWJ1ZmZlcikKLQkJcmV0dXJuIGJ1ZmZlcjsKLQlidWZmZXJbMF0gPSAwOworCWNvbnN0IGNoYXIgKmVtcHR5ID0gIiI7CiAKIAlwYXJlbnQgPSBkZXYtPmRldi5wYXJlbnQ7Ci0KIAlpZiAoIXBhcmVudCkKLQkJcmV0dXJuIGJ1ZmZlcjsKKwkJcmV0dXJuIGVtcHR5OwogCiAJZHJpdmVyID0gcGFyZW50LT5kcml2ZXI7CiAJaWYgKGRyaXZlciAmJiBkcml2ZXItPm5hbWUpCi0JCXN0cmxjcHkoYnVmZmVyLCBkcml2ZXItPm5hbWUsIGxlbik7Ci0JcmV0dXJuIGJ1ZmZlcjsKKwkJcmV0dXJuIGRyaXZlci0+bmFtZTsKKwlyZXR1cm4gZW1wdHk7CiB9CiAKIHN0YXRpYyBpbnQgX19uZXRkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHN0LmMgYi9uZXQvY29yZS9kc3QuYwppbmRleCA5Y2NjYTAzLi42MTM1ZjM2IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kc3QuYworKysgYi9uZXQvY29yZS9kc3QuYwpAQCAtMTkwLDcgKzE5MCw4IEBACiAJZHN0LT5sYXN0dXNlID0gamlmZmllczsKIAlkc3QtPmZsYWdzID0gZmxhZ3M7CiAJZHN0LT5uZXh0ID0gTlVMTDsKLQlkc3RfZW50cmllc19hZGQob3BzLCAxKTsKKwlpZiAoIShmbGFncyAmIERTVF9OT0NPVU5UKSkKKwkJZHN0X2VudHJpZXNfYWRkKG9wcywgMSk7CiAJcmV0dXJuIGRzdDsKIH0KIEVYUE9SVF9TWU1CT0woZHN0X2FsbG9jKTsKQEAgLTI0Myw3ICsyNDQsOCBAQAogCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKIAl9CiAKLQlkc3RfZW50cmllc19hZGQoZHN0LT5vcHMsIC0xKTsKKwlpZiAoIShkc3QtPmZsYWdzICYgRFNUX05PQ09VTlQpKQorCQlkc3RfZW50cmllc19hZGQoZHN0LT5vcHMsIC0xKTsKIAogCWlmIChkc3QtPm9wcy0+ZGVzdHJveSkKIAkJZHN0LT5vcHMtPmRlc3Ryb3koZHN0KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggMTFiOThiYy4uMzNkMmExZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTExNzksOSArMTE3OSwxNCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBjb25zdCB2b2lkICpuZXRfY3VycmVudF9ucyh2b2lkKQorc3RhdGljIHZvaWQgKm5ldF9ncmFiX2N1cnJlbnRfbnModm9pZCkKIHsKLQlyZXR1cm4gY3VycmVudC0+bnNwcm94eS0+bmV0X25zOworCXN0cnVjdCBuZXQgKm5zID0gY3VycmVudC0+bnNwcm94eS0+bmV0X25zOworI2lmZGVmIENPTkZJR19ORVRfTlMKKwlpZiAobnMpCisJCWF0b21pY19pbmMoJm5zLT5wYXNzaXZlKTsKKyNlbmRpZgorCXJldHVybiBuczsKIH0KIAogc3RhdGljIGNvbnN0IHZvaWQgKm5ldF9pbml0aWFsX25zKHZvaWQpCkBAIC0xMTk2LDIyICsxMjAxLDEzIEBACiAKIHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyBuZXRfbnNfdHlwZV9vcGVyYXRpb25zID0gewogCS50eXBlID0gS09CSl9OU19UWVBFX05FVCwKLQkuY3VycmVudF9ucyA9IG5ldF9jdXJyZW50X25zLAorCS5ncmFiX2N1cnJlbnRfbnMgPSBuZXRfZ3JhYl9jdXJyZW50X25zLAogCS5uZXRsaW5rX25zID0gbmV0X25ldGxpbmtfbnMsCiAJLmluaXRpYWxfbnMgPSBuZXRfaW5pdGlhbF9ucywKKwkuZHJvcF9ucyA9IG5ldF9kcm9wX25zLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5ldF9uc190eXBlX29wZXJhdGlvbnMpOwogCi1zdGF0aWMgdm9pZCBuZXRfa29ial9uc19leGl0KHN0cnVjdCBuZXQgKm5ldCkKLXsKLQlrb2JqX25zX2V4aXQoS09CSl9OU19UWVBFX05FVCwgbmV0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBrb2JqX25ldF9vcHMgPSB7Ci0JLmV4aXQgPSBuZXRfa29ial9uc19leGl0LAotfTsKLQotCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKIHN0YXRpYyBpbnQgbmV0ZGV2X3VldmVudChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCiB7CkBAIC0xMzM5LDYgKzEzMzUsNSBAQAogaW50IG5ldGRldl9rb2JqZWN0X2luaXQodm9pZCkKIHsKIAlrb2JqX25zX3R5cGVfcmVnaXN0ZXIoJm5ldF9uc190eXBlX29wZXJhdGlvbnMpOwotCXJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmtvYmpfbmV0X29wcyk7CiAJcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZuZXRfY2xhc3MpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jIGIvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCmluZGV4IDZjNmI4NmQuLmVhNDg5ZGIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYworKysgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogCUxJU1RfSEVBRChuZXRfZXhpdF9saXN0KTsKIAogCWF0b21pY19zZXQoJm5ldC0+Y291bnQsIDEpOworCWF0b21pY19zZXQoJm5ldC0+cGFzc2l2ZSwgMSk7CiAKICNpZmRlZiBORVROU19SRUZDTlRfREVCVUcKIAlhdG9taWNfc2V0KCZuZXQtPnVzZV9jb3VudCwgMCk7CkBAIC0yMTAsNiArMjExLDEzIEBACiAJa21lbV9jYWNoZV9mcmVlKG5ldF9jYWNoZXAsIG5ldCk7CiB9CiAKK3ZvaWQgbmV0X2Ryb3BfbnModm9pZCAqcCkKK3sKKwlzdHJ1Y3QgbmV0ICpucyA9IHA7CisJaWYgKG5zICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJm5zLT5wYXNzaXZlKSkKKwkJbmV0X2ZyZWUobnMpOworfQorCiBzdHJ1Y3QgbmV0ICpjb3B5X25ldF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgbmV0ICpvbGRfbmV0KQogewogCXN0cnVjdCBuZXQgKm5ldDsKQEAgLTIzMCw3ICsyMzgsNyBAQAogCX0KIAltdXRleF91bmxvY2soJm5ldF9tdXRleCk7CiAJaWYgKHJ2IDwgMCkgewotCQluZXRfZnJlZShuZXQpOworCQluZXRfZHJvcF9ucyhuZXQpOwogCQlyZXR1cm4gRVJSX1BUUihydik7CiAJfQogCXJldHVybiBuZXQ7CkBAIC0yODYsNyArMjk0LDcgQEAKIAkvKiBGaW5hbGx5IGl0IGlzIHNhZmUgdG8gZnJlZSBteSBuZXR3b3JrIG5hbWVzcGFjZSBzdHJ1Y3R1cmUgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmV0LCB0bXAsICZuZXRfZXhpdF9saXN0LCBleGl0X2xpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmbmV0LT5leGl0X2xpc3QpOwotCQluZXRfZnJlZShuZXQpOworCQluZXRfZHJvcF9ucyhuZXQpOwogCX0KIH0KIHN0YXRpYyBERUNMQVJFX1dPUksobmV0X2NsZWFudXBfd29yaywgY2xlYW51cF9uZXQpOwpAQCAtMzEwLDE5ICszMTgsMTcgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAKLQluZXQgPSBFUlJfUFRSKC1FSU5WQUwpOwogCWZpbGUgPSBwcm9jX25zX2ZnZXQoZmQpOwotCWlmICghZmlsZSkKLQkJZ290byBvdXQ7CisJaWYgKElTX0VSUihmaWxlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGZpbGUpOwogCiAJZWkgPSBQUk9DX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwotCWlmIChlaS0+bnNfb3BzICE9ICZuZXRuc19vcGVyYXRpb25zKQotCQlnb3RvIG91dDsKKwlpZiAoZWktPm5zX29wcyA9PSAmbmV0bnNfb3BlcmF0aW9ucykKKwkJbmV0ID0gZ2V0X25ldChlaS0+bnMpOworCWVsc2UKKwkJbmV0ID0gRVJSX1BUUigtRUlOVkFMKTsKIAotCW5ldCA9IGdldF9uZXQoZWktPm5zKTsKLW91dDoKLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKKwlmcHV0KGZpbGUpOwogCXJldHVybiBuZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCAyZDdkNmQ0Li4xOGQ5Y2JkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC03OTIsNiArNzkyLDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCWlmIChuZGV2LT5tYXN0ZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgaXMgYSBzbGF2ZSBkZXZpY2UsIGFib3J0aW5nLlxuIiwKKwkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gcHV0OworCX0KKwogCWlmICghbmV0aWZfcnVubmluZyhuZGV2KSkgewogCQl1bnNpZ25lZCBsb25nIGF0bW9zdCwgYXRsZWFzdDsKIApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMgYi9uZXQvaWVlZTgwMjE1NC9ubC1waHkuYwppbmRleCBlZDBlYWIzLi4wMjU0OGIyIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC9ubC1waHkuYworKysgYi9uZXQvaWVlZTgwMjE1NC9ubC1waHkuYwpAQCAtNDQsNyArNDQsNyBAQAogCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKCFidWYpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJaGRyID0gZ2VubG1zZ19wdXQobXNnLCAwLCBzZXEsICZubDgwMjE1NF9mYW1pbHksIGZsYWdzLAogCQlJRUVFODAyMTU0X0xJU1RfUEhZKTsKQEAgLTY1LDYgKzY1LDcgQEAKIAkJCQlwYWdlcyAqIHNpemVvZih1aW50MzJfdCksIGJ1Zik7CiAKIAltdXRleF91bmxvY2soJnBoeS0+cGliX2xvY2spOworCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogbmxhX3B1dF9mYWlsdXJlOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IGNjMTQ2MzEuLmVmMTUyOGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTQ2NSw2ICs0NjUsMTEgQEAKIAlpZiAoYWRkcl9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkKIAkJZ290byBvdXQ7CiAKKwlpZiAoYWRkci0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCWVyciA9IC1FQUZOT1NVUFBPUlQ7CisJCWdvdG8gb3V0OworCX0KKwogCWNoa19hZGRyX3JldCA9IGluZXRfYWRkcl90eXBlKHNvY2tfbmV0KHNrKSwgYWRkci0+c2luX2FkZHIuc19hZGRyKTsKIAogCS8qIE5vdCBzcGVjaWZpZWQgYnkgYW55IHN0YW5kYXJkIHBlci1zZSwgaG93ZXZlciBpdCBicmVha3MgdG9vCkBAIC02NzMsNiArNjc4LDcgQEAKIAogCWxvY2tfc29jayhzazIpOwogCisJc29ja19ycHNfcmVjb3JkX2Zsb3coc2syKTsKIAlXQVJOX09OKCEoKDEgPDwgc2syLT5za19zdGF0ZSkgJgogCQkgIChUQ1BGX0VTVEFCTElTSEVEIHwgVENQRl9DTE9TRV9XQUlUIHwgVENQRl9DTE9TRSkpKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCA2ZmZlOTRjLi4zMjY3ZDM4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2RpYWcuYworKysgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwpAQCAtNDM3LDcgKzQzNyw3IEBACiAJCQlyZXR1cm4gMDsKIAkJaWYgKGNjID09IGxlbikKIAkJCXJldHVybiAxOwotCQlpZiAob3AtPnllcyA8IDQpCisJCWlmIChvcC0+eWVzIDwgNCB8fCBvcC0+eWVzICYgMykKIAkJCXJldHVybiAwOwogCQlsZW4gLT0gb3AtPnllczsKIAkJYmMgICs9IG9wLT55ZXM7CkBAIC00NDcsMTEgKzQ0NywxMSBAQAogCiBzdGF0aWMgaW50IGluZXRfZGlhZ19iY19hdWRpdChjb25zdCB2b2lkICpieXRlY29kZSwgaW50IGJ5dGVjb2RlX2xlbikKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpiYyA9IGJ5dGVjb2RlOworCWNvbnN0IHZvaWQgKmJjID0gYnl0ZWNvZGU7CiAJaW50ICBsZW4gPSBieXRlY29kZV9sZW47CiAKIAl3aGlsZSAobGVuID4gMCkgewotCQlzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCA9IChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICopYmM7CisJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfYmNfb3AgKm9wID0gYmM7CiAKIC8vcHJpbnRrKCJCQzogJWQgJWQgJWQgeyVkfSAvICVkXG4iLCBvcC0+Y29kZSwgb3AtPnllcywgb3AtPm5vLCBvcFsxXS5ubywgbGVuKTsKIAkJc3dpdGNoIChvcC0+Y29kZSkgewpAQCAtNDYyLDIyICs0NjIsMjAgQEAKIAkJY2FzZSBJTkVUX0RJQUdfQkNfU19MRToKIAkJY2FzZSBJTkVUX0RJQUdfQkNfRF9HRToKIAkJY2FzZSBJTkVUX0RJQUdfQkNfRF9MRToKLQkJCWlmIChvcC0+eWVzIDwgNCB8fCBvcC0+eWVzID4gbGVuICsgNCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJY2FzZSBJTkVUX0RJQUdfQkNfSk1QOgotCQkJaWYgKG9wLT5ubyA8IDQgfHwgb3AtPm5vID4gbGVuICsgNCkKKwkJCWlmIChvcC0+bm8gPCA0IHx8IG9wLT5ubyA+IGxlbiArIDQgfHwgb3AtPm5vICYgMykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWlmIChvcC0+bm8gPCBsZW4gJiYKIAkJCSAgICAhdmFsaWRfY2MoYnl0ZWNvZGUsIGJ5dGVjb2RlX2xlbiwgbGVuIC0gb3AtPm5vKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQljYXNlIElORVRfRElBR19CQ19OT1A6Ci0JCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyA+IGxlbiArIDQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CisJCWlmIChvcC0+eWVzIDwgNCB8fCBvcC0+eWVzID4gbGVuICsgNCB8fCBvcC0+eWVzICYgMykKKwkJCXJldHVybiAtRUlOVkFMOwogCQliYyAgKz0gb3AtPnllczsKIAkJbGVuIC09IG9wLT55ZXM7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCmluZGV4IGMzMTE4ZTEuLmVjOTMzMzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX29wdGlvbnMuYworKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KQEAgLTM1MCw3ICszNTEsNyBAQAogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCQlpZiAob3B0cHRyWzJdIDw9IG9wdGxlbikgewotCQkJCV9fYmUzMiAqdGltZXB0ciA9IE5VTEw7CisJCQkJdW5zaWduZWQgY2hhciAqdGltZXB0ciA9IE5VTEw7CiAJCQkJaWYgKG9wdHB0clsyXSszID4gb3B0cHRyWzFdKSB7CiAJCQkJCXBwX3B0ciA9IG9wdHB0ciArIDI7CiAJCQkJCWdvdG8gZXJyb3I7CkBAIC0zNTksNyArMzYwLDcgQEAKIAkJCQkgICAgICBjYXNlIElQT1BUX1RTX1RTT05MWToKIAkJCQkJb3B0LT50cyA9IG9wdHB0ciAtIGlwaDsKIAkJCQkJaWYgKHNrYikKLQkJCQkJCXRpbWVwdHIgPSAoX19iZTMyKikmb3B0cHRyW29wdHB0clsyXS0xXTsKKwkJCQkJCXRpbWVwdHIgPSAmb3B0cHRyW29wdHB0clsyXS0xXTsKIAkJCQkJb3B0LT50c19uZWVkdGltZSA9IDE7CiAJCQkJCW9wdHB0clsyXSArPSA0OwogCQkJCQlicmVhazsKQEAgLTM3MSw3ICszNzIsNyBAQAogCQkJCQlvcHQtPnRzID0gb3B0cHRyIC0gaXBoOwogCQkJCQlpZiAocnQpICB7CiAJCQkJCQltZW1jcHkoJm9wdHB0cltvcHRwdHJbMl0tMV0sICZydC0+cnRfc3BlY19kc3QsIDQpOwotCQkJCQkJdGltZXB0ciA9IChfX2JlMzIqKSZvcHRwdHJbb3B0cHRyWzJdKzNdOworCQkJCQkJdGltZXB0ciA9ICZvcHRwdHJbb3B0cHRyWzJdKzNdOwogCQkJCQl9CiAJCQkJCW9wdC0+dHNfbmVlZGFkZHIgPSAxOwogCQkJCQlvcHQtPnRzX25lZWR0aW1lID0gMTsKQEAgLTM4OSw3ICszOTAsNyBAQAogCQkJCQkJaWYgKGluZXRfYWRkcl90eXBlKG5ldCwgYWRkcikgPT0gUlROX1VOSUNBU1QpCiAJCQkJCQkJYnJlYWs7CiAJCQkJCQlpZiAoc2tiKQotCQkJCQkJCXRpbWVwdHIgPSAoX19iZTMyKikmb3B0cHRyW29wdHB0clsyXSszXTsKKwkJCQkJCQl0aW1lcHRyID0gJm9wdHB0cltvcHRwdHJbMl0rM107CiAJCQkJCX0KIAkJCQkJb3B0LT50c19uZWVkdGltZSA9IDE7CiAJCQkJCW9wdHB0clsyXSArPSA4OwpAQCAtNDAzLDEwICs0MDQsMTAgQEAKIAkJCQl9CiAJCQkJaWYgKHRpbWVwdHIpIHsKIAkJCQkJc3RydWN0IHRpbWVzcGVjIHR2OwotCQkJCQlfX2JlMzIgIG1pZHRpbWU7CisJCQkJCXUzMiAgbWlkdGltZTsKIAkJCQkJZ2V0bnN0aW1lb2ZkYXkoJnR2KTsKLQkJCQkJbWlkdGltZSA9IGh0b25sKCh0di50dl9zZWMgJSA4NjQwMCkgKiBNU0VDX1BFUl9TRUMgKyB0di50dl9uc2VjIC8gTlNFQ19QRVJfTVNFQyk7Ci0JCQkJCW1lbWNweSh0aW1lcHRyLCAmbWlkdGltZSwgc2l6ZW9mKF9fYmUzMikpOworCQkJCQltaWR0aW1lID0gKHR2LnR2X3NlYyAlIDg2NDAwKSAqIE1TRUNfUEVSX1NFQyArIHR2LnR2X25zZWMgLyBOU0VDX1BFUl9NU0VDOworCQkJCQlwdXRfdW5hbGlnbmVkX2JlMzIobWlkdGltZSwgdGltZXB0cik7CiAJCQkJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CiAJCQkJfQogCQkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggOThhZjM2OS4uODRmMjZlOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTc5OSw5ICs3OTksOSBAQAogCWludCBjc3VtbW9kZSA9IENIRUNLU1VNX05PTkU7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWNvcmstPmRzdDsKIAotCWV4dGhkcmxlbiA9IHRyYW5zaGRybGVuID8gcnQtPmRzdC5oZWFkZXJfbGVuIDogMDsKLQlsZW5ndGggKz0gZXh0aGRybGVuOwotCXRyYW5zaGRybGVuICs9IGV4dGhkcmxlbjsKKwlza2IgPSBza2JfcGVla190YWlsKHF1ZXVlKTsKKworCWV4dGhkcmxlbiA9ICFza2IgPyBydC0+ZHN0LmhlYWRlcl9sZW4gOiAwOwogCW10dSA9IGNvcmstPmZyYWdzaXplOwogCiAJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpOwpAQCAtODI1LDEyICs4MjUsMTAgQEAKIAkgICAgIWV4dGhkcmxlbikKIAkJY3N1bW1vZGUgPSBDSEVDS1NVTV9QQVJUSUFMOwogCi0Jc2tiID0gc2tiX3BlZWtfdGFpbChxdWV1ZSk7Ci0KIAljb3JrLT5sZW5ndGggKz0gbGVuZ3RoOwogCWlmICgoKGxlbmd0aCA+IG10dSkgfHwgKHNrYiAmJiBza2JfaXNfZ3NvKHNrYikpKSAmJgogCSAgICAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVURQKSAmJgotCSAgICAocnQtPmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pKSB7CisJICAgIChydC0+ZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykgJiYgIXJ0LT5kc3QuaGVhZGVyX2xlbikgewogCQllcnIgPSBpcF91Zm9fYXBwZW5kX2RhdGEoc2ssIHF1ZXVlLCBnZXRmcmFnLCBmcm9tLCBsZW5ndGgsCiAJCQkJCSBoaF9sZW4sIGZyYWdoZWFkZXJsZW4sIHRyYW5zaGRybGVuLAogCQkJCQkgbXR1LCBmbGFncyk7CkBAIC04ODMsMTcgKzg4MSwxNiBAQAogCQkJZWxzZQogCQkJCWFsbG9jbGVuID0gZnJhZ2xlbjsKIAorCQkJYWxsb2NsZW4gKz0gZXh0aGRybGVuOworCiAJCQkvKiBUaGUgbGFzdCBmcmFnbWVudCBnZXRzIGFkZGl0aW9uYWwgc3BhY2UgYXQgdGFpbC4KIAkJCSAqIE5vdGUsIHdpdGggTVNHX01PUkUgd2Ugb3ZlcmFsbG9jYXRlIG9uIGZyYWdtZW50cywKIAkJCSAqIGJlY2F1c2Ugd2UgaGF2ZSBubyBpZGVhIHdoYXQgZnJhZ21lbnQgd2lsbCBiZQogCQkJICogdGhlIGxhc3QuCiAJCQkgKi8KLQkJCWlmIChkYXRhbGVuID09IGxlbmd0aCArIGZyYWdnYXApIHsKKwkJCWlmIChkYXRhbGVuID09IGxlbmd0aCArIGZyYWdnYXApCiAJCQkJYWxsb2NsZW4gKz0gcnQtPmRzdC50cmFpbGVyX2xlbjsKLQkJCQkvKiBtYWtlIHN1cmUgbXR1IGlzIG5vdCByZWFjaGVkICovCi0JCQkJaWYgKGRhdGFsZW4gPiBtdHUgLSBmcmFnaGVhZGVybGVuIC0gcnQtPmRzdC50cmFpbGVyX2xlbikKLQkJCQkJZGF0YWxlbiAtPSBBTElHTihydC0+ZHN0LnRyYWlsZXJfbGVuLCA4KTsKLQkJCX0KKwogCQkJaWYgKHRyYW5zaGRybGVuKSB7CiAJCQkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKIAkJCQkJCWFsbG9jbGVuICsgaGhfbGVuICsgMTUsCkBAIC05MjYsMTEgKzkyMywxMSBAQAogCQkJLyoKIAkJCSAqCUZpbmQgd2hlcmUgdG8gc3RhcnQgcHV0dGluZyBieXRlcy4KIAkJCSAqLwotCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBmcmFnbGVuKTsKKwkJCWRhdGEgPSBza2JfcHV0KHNrYiwgZnJhZ2xlbiArIGV4dGhkcmxlbik7CiAJCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgZXh0aGRybGVuKTsKIAkJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IChza2ItPm5ldHdvcmtfaGVhZGVyICsKIAkJCQkJCSBmcmFnaGVhZGVybGVuKTsKLQkJCWRhdGEgKz0gZnJhZ2hlYWRlcmxlbjsKKwkJCWRhdGEgKz0gZnJhZ2hlYWRlcmxlbiArIGV4dGhkcmxlbjsKIAogCQkJaWYgKGZyYWdnYXApIHsKIAkJCQlza2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKApAQCAtMTA2NCw3ICsxMDYxLDcgQEAKIAkgKi8KIAkqcnRwID0gTlVMTDsKIAljb3JrLT5mcmFnc2l6ZSA9IGluZXQtPnBtdHVkaXNjID09IElQX1BNVFVESVNDX1BST0JFID8KLQkJCSBydC0+ZHN0LmRldi0+bXR1IDogZHN0X210dShydC0+ZHN0LnBhdGgpOworCQkJIHJ0LT5kc3QuZGV2LT5tdHUgOiBkc3RfbXR1KCZydC0+ZHN0KTsKIAljb3JrLT5kc3QgPSAmcnQtPmRzdDsKIAljb3JrLT5sZW5ndGggPSAwOwogCWNvcmstPnR4X2ZsYWdzID0gaXBjLT50eF9mbGFnczsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKaW5kZXggNDYxNGJhYi4uMmU5N2UzZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKQEAgLTE3LDUxICsxNywzNSBAQAogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJc3RydWN0IGZsb3dpNCBmbDQgPSB7fTsKLQl1bnNpZ25lZCBsb25nIG9yZWZkc3Q7CisJX19iZTMyIHNhZGRyID0gaXBoLT5zYWRkcjsKKwlfX3U4IGZsYWdzID0gMDsKIAl1bnNpZ25lZCBpbnQgaGhfbGVuOwotCXVuc2lnbmVkIGludCB0eXBlOwogCi0JdHlwZSA9IGluZXRfYWRkcl90eXBlKG5ldCwgaXBoLT5zYWRkcik7Ci0JaWYgKHNrYi0+c2sgJiYgaW5ldF9zayhza2ItPnNrKS0+dHJhbnNwYXJlbnQpCi0JCXR5cGUgPSBSVE5fTE9DQUw7Ci0JaWYgKGFkZHJfdHlwZSA9PSBSVE5fVU5TUEVDKQotCQlhZGRyX3R5cGUgPSB0eXBlOworCWlmICghc2tiLT5zayAmJiBhZGRyX3R5cGUgIT0gUlROX0xPQ0FMKSB7CisJCWlmIChhZGRyX3R5cGUgPT0gUlROX1VOU1BFQykKKwkJCWFkZHJfdHlwZSA9IGluZXRfYWRkcl90eXBlKG5ldCwgc2FkZHIpOworCQlpZiAoYWRkcl90eXBlID09IFJUTl9MT0NBTCB8fCBhZGRyX3R5cGUgPT0gUlROX1VOSUNBU1QpCisJCQlmbGFncyB8PSBGTE9XSV9GTEFHX0FOWVNSQzsKKwkJZWxzZQorCQkJc2FkZHIgPSAwOworCX0KIAogCS8qIHNvbWUgbm9uLXN0YW5kYXJkIGhhY2tzIGxpa2UgaXB0X1JFSkVDVC5jOnNlbmRfcmVzZXQoKSBjYW4gY2F1c2UKIAkgKiBwYWNrZXRzIHdpdGggZm9yZWlnbiBzYWRkciB0byBhcHBlYXIgb24gdGhlIE5GX0lORVRfTE9DQUxfT1VUIGhvb2suCiAJICovCi0JaWYgKGFkZHJfdHlwZSA9PSBSVE5fTE9DQUwpIHsKLQkJZmw0LmRhZGRyID0gaXBoLT5kYWRkcjsKLQkJaWYgKHR5cGUgPT0gUlROX0xPQ0FMKQotCQkJZmw0LnNhZGRyID0gaXBoLT5zYWRkcjsKLQkJZmw0LmZsb3dpNF90b3MgPSBSVF9UT1MoaXBoLT50b3MpOwotCQlmbDQuZmxvd2k0X29pZiA9IHNrYi0+c2sgPyBza2ItPnNrLT5za19ib3VuZF9kZXZfaWYgOiAwOwotCQlmbDQuZmxvd2k0X21hcmsgPSBza2ItPm1hcms7Ci0JCWZsNC5mbG93aTRfZmxhZ3MgPSBza2ItPnNrID8gaW5ldF9za19mbG93aV9mbGFncyhza2ItPnNrKSA6IDA7Ci0JCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZmbDQpOwotCQlpZiAoSVNfRVJSKHJ0KSkKLQkJCXJldHVybiAtMTsKKwlmbDQuZGFkZHIgPSBpcGgtPmRhZGRyOworCWZsNC5zYWRkciA9IHNhZGRyOworCWZsNC5mbG93aTRfdG9zID0gUlRfVE9TKGlwaC0+dG9zKTsKKwlmbDQuZmxvd2k0X29pZiA9IHNrYi0+c2sgPyBza2ItPnNrLT5za19ib3VuZF9kZXZfaWYgOiAwOworCWZsNC5mbG93aTRfbWFyayA9IHNrYi0+bWFyazsKKwlmbDQuZmxvd2k0X2ZsYWdzID0gc2tiLT5zayA/IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2tiLT5zaykgOiBmbGFnczsKKwlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0KTsKKwlpZiAoSVNfRVJSKHJ0KSkKKwkJcmV0dXJuIC0xOwogCi0JCS8qIERyb3Agb2xkIHJvdXRlLiAqLwotCQlza2JfZHN0X2Ryb3Aoc2tiKTsKLQkJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7Ci0JfSBlbHNlIHsKLQkJLyogbm9uLWxvY2FsIHNyYywgZmluZCB2YWxpZCBpaWYgdG8gc2F0aXNmeQotCQkgKiBycC1maWx0ZXIgd2hlbiBjYWxsaW5nIGlwX3JvdXRlX2lucHV0LiAqLwotCQlmbDQuZGFkZHIgPSBpcGgtPnNhZGRyOwotCQlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0KTsKLQkJaWYgKElTX0VSUihydCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJb3JlZmRzdCA9IHNrYi0+X3NrYl9yZWZkc3Q7Ci0JCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsCi0JCQkJICAgUlRfVE9TKGlwaC0+dG9zKSwgcnQtPmRzdC5kZXYpICE9IDApIHsKLQkJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7Ci0JCXJlZmRzdF9kcm9wKG9yZWZkc3QpOwotCX0KKwkvKiBEcm9wIG9sZCByb3V0ZS4gKi8KKwlza2JfZHN0X2Ryb3Aoc2tiKTsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAogCWlmIChza2JfZHN0KHNrYiktPmVycm9yKQogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9xdWV1ZS5jCmluZGV4IGQyYzEzMTEuLjVjOWI5ZDkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9xdWV1ZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9xdWV1ZS5jCkBAIC0yMDMsNyArMjAzLDggQEAKIAllbHNlCiAJCXBtc2ctPm91dGRldl9uYW1lWzBdID0gJ1wwJzsKIAotCWlmIChlbnRyeS0+aW5kZXYgJiYgZW50cnktPnNrYi0+ZGV2KSB7CisJaWYgKGVudHJ5LT5pbmRldiAmJiBlbnRyeS0+c2tiLT5kZXYgJiYKKwkgICAgZW50cnktPnNrYi0+bWFjX2hlYWRlciAhPSBlbnRyeS0+c2tiLT5uZXR3b3JrX2hlYWRlcikgewogCQlwbXNnLT5od190eXBlID0gZW50cnktPnNrYi0+ZGV2LT50eXBlOwogCQlwbXNnLT5od19hZGRybGVuID0gZGV2X3BhcnNlX2hlYWRlcihlbnRyeS0+c2tiLAogCQkJCQkJICAgIHBtc2ctPmh3X2FkZHIpOwpAQCAtNDAyLDcgKzQwMyw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIF9faXBxX3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgc3RhdHVzLCB0eXBlLCBwaWQsIGZsYWdzLCBubG1zZ2xlbiwgc2tibGVuOworCWludCBzdGF0dXMsIHR5cGUsIHBpZCwgZmxhZ3M7CisJdW5zaWduZWQgaW50IG5sbXNnbGVuLCBza2JsZW47CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAKIAlza2JsZW4gPSBza2ItPmxlbjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwppbmRleCA3NjQ3NDM4Li4yNGU1NTZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCkBAIC01NjYsNyArNTY2LDcgQEAKIAljb25zdCBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICp0OwogCiAJaWYgKCFpcF9jaGVja2VudHJ5KCZlLT5pcCkpIHsKLQkJZHVwcmludGYoImlwIGNoZWNrIGZhaWxlZCAlcCAlcy5cbiIsIGUsIHBhci0+bWF0Y2gtPm5hbWUpOworCQlkdXByaW50ZigiaXAgY2hlY2sgZmFpbGVkICVwICVzLlxuIiwgZSwgbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggZDYwOWFjMy4uNWM5ZTk3YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkgKiBlcnJvciBtZXNzYWdlcyAoUkVMQVRFRCkgYW5kIGluZm9ybWF0aW9uIHJlcXVlc3RzIChzZWUgYmVsb3cpICovCiAJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVAgJiYKIAkgICAgKGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8Ci0JICAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKSkKKwkgICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSkKIAkJcmV0dXJuIFhUX0NPTlRJTlVFOwogCiAJLyogaXBfY29ubnRyYWNrX2ljbXAgZ3VhcmFudGVlcyB1cyB0aGF0IHdlIG9ubHkgaGF2ZSBJQ01QX0VDSE8sCkBAIC0zMjEsMTIgKzMyMSwxMiBAQAogCQkJY3QtPm1hcmsgPSBoYXNoOwogCQkJYnJlYWs7CiAJCWNhc2UgSVBfQ1RfUkVMQVRFRDoKLQkJY2FzZSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZOgorCQljYXNlIElQX0NUX1JFTEFURURfUkVQTFk6CiAJCQkvKiBGSVhNRTogd2UgZG9uJ3QgaGFuZGxlIGV4cGVjdGF0aW9ucyBhdCB0aGUKIAkJCSAqIG1vbWVudC4gIHRoZXkgY2FuIGFycml2ZSBvbiBhIGRpZmZlcmVudCBub2RlIHRoYW4KIAkJCSAqIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiAoZS5nLiBGVFAgcGFzc2l2ZSBtb2RlKSAqLwogCQljYXNlIElQX0NUX0VTVEFCTElTSEVEOgotCQljYXNlIElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZOgorCQljYXNlIElQX0NUX0VTVEFCTElTSEVEX1JFUExZOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKaW5kZXggZDJlZDlkYy4uOTkzMTE1MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAluYXQgPSBuZmN0X25hdChjdCk7CiAKIAlORl9DVF9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKLQkJCSAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKSk7CisJCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURURfUkVQTFkpKTsKIAogCS8qIFNvdXJjZSBhZGRyZXNzIGlzIDAuMC4wLjAgLSBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXQgdGhhdCBpcwogCSAqIHByb2JhYmx5IG5vdCBzdXBwb3NlZCB0byBiZSBtYXNxdWVyYWRlZC4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCmluZGV4IDFmZjc5ZTUuLjUxZjEzZjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwpAQCAtNDAsNyArNDAsNiBAQAogCXN0cnVjdCBpcGhkciAqbmlwaDsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICpvdGg7CiAJc3RydWN0IHRjcGhkciBfb3RjcGgsICp0Y3BoOwotCXVuc2lnbmVkIGludCBhZGRyX3R5cGU7CiAKIAkvKiBJUCBoZWFkZXIgY2hlY2tzOiBmcmFnbWVudC4gKi8KIAlpZiAoaXBfaGRyKG9sZHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkKQEAgLTU1LDYgKzU0LDkgQEAKIAlpZiAob3RoLT5yc3QpCiAJCXJldHVybjsKIAorCWlmIChza2JfcnRhYmxlKG9sZHNrYiktPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKQorCQlyZXR1cm47CisKIAkvKiBDaGVjayBjaGVja3N1bSAqLwogCWlmIChuZl9pcF9jaGVja3N1bShvbGRza2IsIGhvb2ssIGlwX2hkcmxlbihvbGRza2IpLCBJUFBST1RPX1RDUCkpCiAJCXJldHVybjsKQEAgLTEwMSwxOSArMTAzLDExIEBACiAJbnNrYi0+Y3N1bV9zdGFydCA9ICh1bnNpZ25lZCBjaGFyICopdGNwaCAtIG5za2ItPmhlYWQ7CiAJbnNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAKLQlhZGRyX3R5cGUgPSBSVE5fVU5TUEVDOwotCWlmIChob29rICE9IE5GX0lORVRfRk9SV0FSRAotI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCi0JICAgIHx8IChuc2tiLT5uZl9icmlkZ2UgJiYgbnNrYi0+bmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKQotI2VuZGlmCi0JICAgKQotCQlhZGRyX3R5cGUgPSBSVE5fTE9DQUw7Ci0KIAkvKiBpcF9yb3V0ZV9tZV9oYXJkZXIgZXhwZWN0cyBza2ItPmRzdCB0byBiZSBzZXQgKi8KIAlza2JfZHN0X3NldF9ub3JlZihuc2tiLCBza2JfZHN0KG9sZHNrYikpOwogCiAJbnNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7Ci0JaWYgKGlwX3JvdXRlX21lX2hhcmRlcihuc2tiLCBhZGRyX3R5cGUpKQorCWlmIChpcF9yb3V0ZV9tZV9oYXJkZXIobnNrYiwgUlROX1VOU1BFQykpCiAJCWdvdG8gZnJlZV9uc2tiOwogCiAJbmlwaC0+dHRsCT0gaXA0X2RzdF9ob3BsaW1pdChza2JfZHN0KG5za2IpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCmluZGV4IGFmNmU5YzcuLjJiNTdlNTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwpAQCAtMjUsNyArMjUsOCBAQAogc3RhdGljIGlubGluZSBib29sIG1hdGNoX2lwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqZWluZm8pCiB7Ci0JcmV0dXJuIChpcF9oZHIoc2tiKS0+dG9zICYgSVBUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0OworCXJldHVybiAoKGlwX2hkcihza2IpLT50b3MgJiBJUFRfRUNOX0lQX01BU0spID09IGVpbmZvLT5pcF9lY3QpIF4KKwkgICAgICAgISEoZWluZm8tPmludmVydCAmIElQVF9FQ05fT1BfTUFUQ0hfSVApOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgbWF0Y2hfdGNwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCkBAIC03Niw4ICs3Nyw2IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfTUFUQ0hfRUNFfElQVF9FQ05fT1BfTUFUQ0hfQ1dSKSkgewotCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fVENQKQotCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoIW1hdGNoX3RjcChza2IsIGluZm8sICZwYXItPmhvdGRyb3ApKQogCQkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTk3LDcgKzk2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfTUFUQ0hfRUNFfElQVF9FQ05fT1BfTUFUQ0hfQ1dSKSAmJgotCSAgICBpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1ApIHsKKwkgICAgKGlwLT5wcm90byAhPSBJUFBST1RPX1RDUCB8fCBpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewogCQlwcl9pbmZvKCJjYW5ub3QgbWF0Y2ggVENQIGJpdHMgaW4gcnVsZSBmb3Igbm9uLXRjcCBwYWNrZXRzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKaW5kZXggNWEwM2MwMi4uZGU5ZGEyMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogCS8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgaGVscGVyOiBhcyB0aGUgcGFja2V0IGdvZXMgb3V0LiAqLwogCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0JaWYgKCFjdCB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKQorCWlmICghY3QgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURURfUkVQTFkpCiAJCWdvdG8gb3V0OwogCiAJaGVscCA9IG5mY3RfaGVscChjdCk7CkBAIC0xMjEsNyArMTIxLDkgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAodGVzdF9iaXQoSVBTX1NFUV9BREpVU1RfQklULCAmY3QtPnN0YXR1cykpIHsKKwkvKiBhZGp1c3Qgc2VxcyBmb3IgbG9vcGJhY2sgdHJhZmZpYyBvbmx5IGluIG91dGdvaW5nIGRpcmVjdGlvbiAqLworCWlmICh0ZXN0X2JpdChJUFNfU0VRX0FESlVTVF9CSVQsICZjdC0+c3RhdHVzKSAmJgorCSAgICAhbmZfaXNfbG9vcGJhY2tfcGFja2V0KHNrYikpIHsKIAkJdHlwZW9mKG5mX25hdF9zZXFfYWRqdXN0X2hvb2spIHNlcV9hZGp1c3Q7CiAKIAkJc2VxX2FkanVzdCA9IHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfc2VxX2FkanVzdF9ob29rKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKaW5kZXggNzQwNGJkZS4uYWI1YjI3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCS8qIFVwZGF0ZSBza2IgdG8gcmVmZXIgdG8gdGhpcyBjb25uZWN0aW9uICovCiAJc2tiLT5uZmN0ID0gJm5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCktPmN0X2dlbmVyYWw7CiAJc2tiLT5uZmN0aW5mbyA9ICpjdGluZm87Ci0JcmV0dXJuIC1ORl9BQ0NFUFQ7CisJcmV0dXJuIE5GX0FDQ0VQVDsKIH0KIAogLyogU21hbGwgYW5kIG1vZGlmaWVkIHZlcnNpb24gb2YgaWNtcF9yY3YgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKaW5kZXggOWM3MWIyNy4uMzM0NmRlNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiAJLyogTXVzdCBiZSBSRUxBVEVEICovCiAJTkZfQ1RfQVNTRVJUKHNrYi0+bmZjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCB8fAotCQkgICAgIHNrYi0+bmZjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWSk7CisJCSAgICAgc2tiLT5uZmN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKTsKIAogCS8qIFJlZGlyZWN0cyBvbiBub24tbnVsbCBuYXRzIG11c3QgYmUgZHJvcHBlZCwgZWxzZSB0aGV5J2xsCiAJICAgc3RhcnQgdGFsa2luZyB0byBlYWNoIG90aGVyIHdpdGhvdXQgb3VyIHRyYW5zbGF0aW9uLCBhbmQgYmUKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCmluZGV4IDk5Y2ZhMjguLmViYzVmODggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQlpZiAoIShydC0+cnRfZmxhZ3MgJiBSVENGX0xPQ0FMKSAmJgotCQkgICAgc2tiLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WNF9DU1VNKSB7CisJCSAgICAoIXNrYi0+ZGV2IHx8IHNrYi0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVjRfQ1NVTSkpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAkJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl9oZWFkcm9vbShza2IpICsKIAkJCQkJICBza2JfbmV0d29ya19vZmZzZXQoc2tiKSArCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IDIxYzMwNDIuLjczM2M5YWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC01Myw3ICs1Myw3IEBACiAKIAkvKiBDb25uZWN0aW9uIG11c3QgYmUgdmFsaWQgYW5kIG5ldy4gKi8KIAlORl9DVF9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKLQkJCSAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKSk7CisJCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURURfUkVQTFkpKTsKIAlORl9DVF9BU1NFUlQocGFyLT5vdXQgIT0gTlVMTCk7CiAKIAlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIElQX05BVF9NQU5JUF9TUkMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYwppbmRleCA3MzE3YmRmLi40ODNiNzZkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAKIAlzd2l0Y2ggKGN0aW5mbykgewogCWNhc2UgSVBfQ1RfUkVMQVRFRDoKLQljYXNlIElQX0NUX1JFTEFURUQrSVBfQ1RfSVNfUkVQTFk6CisJY2FzZSBJUF9DVF9SRUxBVEVEX1JFUExZOgogCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkgewogCQkJaWYgKCFuZl9uYXRfaWNtcF9yZXBseV90cmFuc2xhdGlvbihjdCwgY3RpbmZvLAogCQkJCQkJCSAgIGhvb2tudW0sIHNrYikpCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlkZWZhdWx0OgogCQkvKiBFU1RBQkxJU0hFRCAqLwogCQlORl9DVF9BU1NFUlQoY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVEIHx8Ci0JCQkgICAgIGN0aW5mbyA9PSAoSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpKTsKKwkJCSAgICAgY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKTsKIAl9CiAKIAlyZXR1cm4gbmZfbmF0X3BhY2tldChjdCwgY3RpbmZvLCBob29rbnVtLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcGluZy5jIGIvbmV0L2lwdjQvcGluZy5jCmluZGV4IDlhYWE2NzEuLjM5YjQwM2YgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3BpbmcuYworKysgYi9uZXQvaXB2NC9waW5nLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGluZy5oPgotI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggNTJiMGI5NS4uYWExM2VmMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0xMzE2LDYgKzEzMTYsMjMgQEAKIAk7CiB9CiAKK3N0YXRpYyBib29sIHBlZXJfcG10dV9leHBpcmVkKHN0cnVjdCBpbmV0X3BlZXIgKnBlZXIpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnID0gQUNDRVNTX09OQ0UocGVlci0+cG10dV9leHBpcmVzKTsKKworCXJldHVybiBvcmlnICYmCisJICAgICAgIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgb3JpZykgJiYKKwkgICAgICAgY21weGNoZygmcGVlci0+cG10dV9leHBpcmVzLCBvcmlnLCAwKSA9PSBvcmlnOworfQorCitzdGF0aWMgYm9vbCBwZWVyX3BtdHVfY2xlYW5lZChzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyKQoreworCXVuc2lnbmVkIGxvbmcgb3JpZyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CisKKwlyZXR1cm4gb3JpZyAmJgorCSAgICAgICBjbXB4Y2hnKCZwZWVyLT5wbXR1X2V4cGlyZXMsIG9yaWcsIDApID09IG9yaWc7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWRzdDsKQEAgLTEzMzEsMTQgKzEzNDgsOCBAQAogCQkJCQkJcnRfZ2VuaWQoZGV2X25ldChkc3QtPmRldikpKTsKIAkJCXJ0X2RlbChoYXNoLCBydCk7CiAJCQlyZXQgPSBOVUxMOwotCQl9IGVsc2UgaWYgKHJ0LT5wZWVyICYmCi0JCQkgICBydC0+cGVlci0+cG10dV9leHBpcmVzICYmCi0JCQkgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJ0LT5wZWVyLT5wbXR1X2V4cGlyZXMpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIG9yaWcgPSBydC0+cGVlci0+cG10dV9leHBpcmVzOwotCi0JCQlpZiAoY21weGNoZygmcnQtPnBlZXItPnBtdHVfZXhwaXJlcywgb3JpZywgMCkgPT0gb3JpZykKLQkJCQlkc3RfbWV0cmljX3NldChkc3QsIFJUQVhfTVRVLAotCQkJCQkgICAgICAgcnQtPnBlZXItPnBtdHVfb3JpZyk7CisJCX0gZWxzZSBpZiAocnQtPnBlZXIgJiYgcGVlcl9wbXR1X2V4cGlyZWQocnQtPnBlZXIpKSB7CisJCQlkc3RfbWV0cmljX3NldChkc3QsIFJUQVhfTVRVLCBydC0+cGVlci0+cG10dV9vcmlnKTsKIAkJfQogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTUzMSw4ICsxNTQyLDEwIEBACiAKIHN0YXRpYyB2b2lkIGNoZWNrX3BlZXJfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBpbmV0X3BlZXIgKnBlZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBleHBpcmVzID0gcGVlci0+cG10dV9leHBpcmVzOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CiAKKwlpZiAoIWV4cGlyZXMpCisJCXJldHVybjsKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJlcykpIHsKIAkJdTMyIG9yaWdfZHN0X210dSA9IGRzdF9tdHUoZHN0KTsKIAkJaWYgKHBlZXItPnBtdHVfbGVhcm5lZCA8IG9yaWdfZHN0X210dSkgewpAQCAtMTU1NSwxMCArMTU2OCwxMSBAQAogCQlydF9iaW5kX3BlZXIocnQsIHJ0LT5ydF9kc3QsIDEpOwogCXBlZXIgPSBydC0+cGVlcjsKIAlpZiAocGVlcikgeworCQl1bnNpZ25lZCBsb25nIHBtdHVfZXhwaXJlcyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CisKIAkJaWYgKG10dSA8IGlwX3J0X21pbl9wbXR1KQogCQkJbXR1ID0gaXBfcnRfbWluX3BtdHU7Ci0JCWlmICghcGVlci0+cG10dV9leHBpcmVzIHx8IG10dSA8IHBlZXItPnBtdHVfbGVhcm5lZCkgewotCQkJdW5zaWduZWQgbG9uZyBwbXR1X2V4cGlyZXM7CisJCWlmICghcG10dV9leHBpcmVzIHx8IG10dSA8IHBlZXItPnBtdHVfbGVhcm5lZCkgewogCiAJCQlwbXR1X2V4cGlyZXMgPSBqaWZmaWVzICsgaXBfcnRfbXR1X2V4cGlyZXM7CiAJCQlpZiAoIXBtdHVfZXhwaXJlcykKQEAgLTE2MTIsMTMgKzE2MjYsMTQgQEAKIAkJCXJ0X2JpbmRfcGVlcihydCwgcnQtPnJ0X2RzdCwgMCk7CiAKIAkJcGVlciA9IHJ0LT5wZWVyOwotCQlpZiAocGVlciAmJiBwZWVyLT5wbXR1X2V4cGlyZXMpCisJCWlmIChwZWVyKSB7CiAJCQljaGVja19wZWVyX3BtdHUoZHN0LCBwZWVyKTsKIAotCQlpZiAocGVlciAmJiBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICYmCi0JCSAgICBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IHJ0LT5ydF9nYXRld2F5KSB7Ci0JCQlpZiAoY2hlY2tfcGVlcl9yZWRpcihkc3QsIHBlZXIpKQotCQkJCXJldHVybiBOVUxMOworCQkJaWYgKHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQgJiYKKwkJCSAgICBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IHJ0LT5ydF9nYXRld2F5KSB7CisJCQkJaWYgKGNoZWNrX3BlZXJfcmVkaXIoZHN0LCBwZWVyKSkKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQl9CiAJCX0KIAogCQlydC0+cnRfcGVlcl9nZW5pZCA9IHJ0X3BlZXJfZ2VuaWQoKTsKQEAgLTE2NDksMTQgKzE2NjQsOCBAQAogCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0hPU1RfVU5SRUFDSCwgMCk7CiAKIAlydCA9IHNrYl9ydGFibGUoc2tiKTsKLQlpZiAocnQgJiYKLQkgICAgcnQtPnBlZXIgJiYKLQkgICAgcnQtPnBlZXItPnBtdHVfZXhwaXJlcykgewotCQl1bnNpZ25lZCBsb25nIG9yaWcgPSBydC0+cGVlci0+cG10dV9leHBpcmVzOwotCi0JCWlmIChjbXB4Y2hnKCZydC0+cGVlci0+cG10dV9leHBpcmVzLCBvcmlnLCAwKSA9PSBvcmlnKQotCQkJZHN0X21ldHJpY19zZXQoJnJ0LT5kc3QsIFJUQVhfTVRVLCBydC0+cGVlci0+cG10dV9vcmlnKTsKLQl9CisJaWYgKHJ0ICYmIHJ0LT5wZWVyICYmIHBlZXJfcG10dV9jbGVhbmVkKHJ0LT5wZWVyKSkKKwkJZHN0X21ldHJpY19zZXQoJnJ0LT5kc3QsIFJUQVhfTVRVLCBydC0+cGVlci0+cG10dV9vcmlnKTsKIH0KIAogc3RhdGljIGludCBpcF9ydF9idWcoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE3NzAsOCArMTc3OSw3IEBACiAJCQkgICAgICAgc2l6ZW9mKHUzMikgKiBSVEFYX01BWCk7CiAJCWRzdF9pbml0X21ldHJpY3MoJnJ0LT5kc3QsIHBlZXItPm1ldHJpY3MsIGZhbHNlKTsKIAotCQlpZiAocGVlci0+cG10dV9leHBpcmVzKQotCQkJY2hlY2tfcGVlcl9wbXR1KCZydC0+ZHN0LCBwZWVyKTsKKwkJY2hlY2tfcGVlcl9wbXR1KCZydC0+ZHN0LCBwZWVyKTsKIAkJaWYgKHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQgJiYKIAkJICAgIHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQgIT0gcnQtPnJ0X2dhdGV3YXkpIHsKIAkJCXJ0LT5ydF9nYXRld2F5ID0gcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNDsKQEAgLTE4OTQsOSArMTkwMiw3IEBACiAKIAloYXNoID0gcnRfaGFzaChkYWRkciwgc2FkZHIsIGRldi0+aWZpbmRleCwgcnRfZ2VuaWQoZGV2X25ldChkZXYpKSk7CiAJcnRoID0gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCBza2IsIGRldi0+aWZpbmRleCk7Ci0JZXJyID0gMDsKLQlpZiAoSVNfRVJSKHJ0aCkpCi0JCWVyciA9IFBUUl9FUlIocnRoKTsKKwlyZXR1cm4gSVNfRVJSKHJ0aCkgPyBQVFJfRVJSKHJ0aCkgOiAwOwogCiBlX25vYnVmczoKIAlyZXR1cm4gLUVOT0JVRlM7CkBAIC0yNzc1LDcgKzI3ODEsOCBAQAogCXN0cnVjdCBydGFibGUgKnJ0ID0gc2tiX3J0YWJsZShza2IpOwogCXN0cnVjdCBydG1zZyAqcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQlsb25nIGV4cGlyZXM7CisJbG9uZyBleHBpcmVzID0gMDsKKwljb25zdCBzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyID0gcnQtPnBlZXI7CiAJdTMyIGlkID0gMCwgdHMgPSAwLCB0c2FnZSA9IDAsIGVycm9yOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnIpLCBmbGFncyk7CkBAIC0yODIzLDE1ICsyODMwLDE2IEBACiAJCU5MQV9QVVRfQkUzMihza2IsIFJUQV9NQVJLLCBydC0+cnRfbWFyayk7CiAKIAllcnJvciA9IHJ0LT5kc3QuZXJyb3I7Ci0JZXhwaXJlcyA9IChydC0+cGVlciAmJiBydC0+cGVlci0+cG10dV9leHBpcmVzKSA/Ci0JCXJ0LT5wZWVyLT5wbXR1X2V4cGlyZXMgLSBqaWZmaWVzIDogMDsKLQlpZiAocnQtPnBlZXIpIHsKKwlpZiAocGVlcikgewogCQlpbmV0X3BlZXJfcmVmY2hlY2socnQtPnBlZXIpOwotCQlpZCA9IGF0b21pY19yZWFkKCZydC0+cGVlci0+aXBfaWRfY291bnQpICYgMHhmZmZmOwotCQlpZiAocnQtPnBlZXItPnRjcF90c19zdGFtcCkgewotCQkJdHMgPSBydC0+cGVlci0+dGNwX3RzOwotCQkJdHNhZ2UgPSBnZXRfc2Vjb25kcygpIC0gcnQtPnBlZXItPnRjcF90c19zdGFtcDsKKwkJaWQgPSBhdG9taWNfcmVhZCgmcGVlci0+aXBfaWRfY291bnQpICYgMHhmZmZmOworCQlpZiAocGVlci0+dGNwX3RzX3N0YW1wKSB7CisJCQl0cyA9IHBlZXItPnRjcF90czsKKwkJCXRzYWdlID0gZ2V0X3NlY29uZHMoKSAtIHBlZXItPnRjcF90c19zdGFtcDsKIAkJfQorCQlleHBpcmVzID0gQUNDRVNTX09OQ0UocGVlci0+cG10dV9leHBpcmVzKTsKKwkJaWYgKGV4cGlyZXMpCisJCQlleHBpcmVzIC09IGppZmZpZXM7CiAJfQogCiAJaWYgKHJ0X2lzX2lucHV0X3JvdXRlKHJ0KSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAwNTRhNTlkLi40NmZlYmNhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMzIyMCw3ICszMjIwLDcgQEAKIHZvaWQgX19pbml0IHRjcF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcywgbGltaXQ7CisJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAlpbnQgaSwgbWF4X3NoYXJlLCBjbnQ7CiAJdW5zaWduZWQgbG9uZyBqaWZmeSA9IGppZmZpZXM7CiAKQEAgLTMyNzcsMTMgKzMyNzcsNyBAQAogCXN5c2N0bF90Y3BfbWF4X29ycGhhbnMgPSBjbnQgLyAyOwogCXN5c2N0bF9tYXhfc3luX2JhY2tsb2cgPSBtYXgoMTI4LCBjbnQgLyAyNTYpOwogCi0JLyogU2V0IHRoZSBwcmVzc3VyZSB0aHJlc2hvbGQgdG8gYmUgYSBmcmFjdGlvbiBvZiBnbG9iYWwgbWVtb3J5IHRoYXQKLQkgKiBpcyB1cCB0byAxLzIgYXQgMjU2IE1CLCBkZWNyZWFzaW5nIHRvd2FyZCB6ZXJvIHdpdGggdGhlIGFtb3VudCBvZgotCSAqIG1lbW9yeSwgd2l0aCBhIGZsb29yIG9mIDEyOCBwYWdlcy4KLQkgKi8KLQlucl9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzIC0gdG90YWxoaWdoX3BhZ2VzOwotCWxpbWl0ID0gbWluKG5yX3BhZ2VzLCAxVUw8PCgyOC1QQUdFX1NISUZUKSkgPj4gKDIwLVBBR0VfU0hJRlQpOwotCWxpbWl0ID0gKGxpbWl0ICogKG5yX3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKSkpID4+IChQQUdFX1NISUZULTExKTsKKwlsaW1pdCA9IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgLyA4OwogCWxpbWl0ID0gbWF4KGxpbWl0LCAxMjhVTCk7CiAJc3lzY3RsX3RjcF9tZW1bMF0gPSBsaW1pdCAvIDQgKiAzOwogCXN5c2N0bF90Y3BfbWVtWzFdID0gbGltaXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCBhN2Q2NjcxLi43MDhkYzIwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTE1ODksNiArMTU4OSw3IEBACiAJCQlnb3RvIGRpc2NhcmQ7CiAKIAkJaWYgKG5zayAhPSBzaykgeworCQkJc29ja19ycHNfc2F2ZV9yeGhhc2gobnNrLCBza2ItPnJ4aGFzaCk7CiAJCQlpZiAodGNwX2NoaWxkX3Byb2Nlc3Moc2ssIG5zaywgc2tiKSkgewogCQkJCXJzayA9IG5zazsKIAkJCQlnb3RvIHJlc2V0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBhYmNhODcwLi4xOThmNzViIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtMTI0OSw2ICsxMjQ5LDkgQEAKIAogCWlmIChub2Jsb2NrKQogCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIHN0YXJ0aW5nIG92ZXIgZm9yIGEgbmV3IHBhY2tldCAqLworCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfVFJVTkM7CiAJZ290byB0cnlfYWdhaW47CiB9CiAKQEAgLTIyMDYsMTYgKzIyMDksMTAgQEAKIAogdm9pZCBfX2luaXQgdWRwX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBsaW1pdDsKKwl1bnNpZ25lZCBsb25nIGxpbWl0OwogCiAJdWRwX3RhYmxlX2luaXQoJnVkcF90YWJsZSwgIlVEUCIpOwotCS8qIFNldCB0aGUgcHJlc3N1cmUgdGhyZXNob2xkIHVwIGJ5IHRoZSBzYW1lIHN0cmF0ZWd5IG9mIFRDUC4gSXQgaXMgYQotCSAqIGZyYWN0aW9uIG9mIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyB1cCB0byAxLzIgYXQgMjU2IE1CLCBkZWNyZWFzaW5nCi0JICogdG93YXJkIHplcm8gd2l0aCB0aGUgYW1vdW50IG9mIG1lbW9yeSwgd2l0aCBhIGZsb29yIG9mIDEyOCBwYWdlcy4KLQkgKi8KLQlucl9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzIC0gdG90YWxoaWdoX3BhZ2VzOwotCWxpbWl0ID0gbWluKG5yX3BhZ2VzLCAxVUw8PCgyOC1QQUdFX1NISUZUKSkgPj4gKDIwLVBBR0VfU0hJRlQpOwotCWxpbWl0ID0gKGxpbWl0ICogKG5yX3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKSkpID4+IChQQUdFX1NISUZULTExKTsKKwlsaW1pdCA9IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgLyA4OwogCWxpbWl0ID0gbWF4KGxpbWl0LCAxMjhVTCk7CiAJc3lzY3RsX3VkcF9tZW1bMF0gPSBsaW1pdCAvIDQgKiAzOwogCXN5c2N0bF91ZHBfbWVtWzFdID0gbGltaXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYyBiL25ldC9pcHY0L3hmcm00X291dHB1dC5jCmluZGV4IDJkNTE4NDAuLjMyN2E2MTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jCisrKyBiL25ldC9pcHY0L3hmcm00X291dHB1dC5jCkBAIC0zMiw3ICszMiwxMiBAQAogCWRzdCA9IHNrYl9kc3Qoc2tiKTsKIAltdHUgPSBkc3RfbXR1KGRzdCk7CiAJaWYgKHNrYi0+bGVuID4gbXR1KSB7Ci0JCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKKwkJaWYgKHNrYi0+c2spCisJCQlpcF9sb2NhbF9lcnJvcihza2ItPnNrLCBFTVNHU0laRSwgaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCSAgICAgICBpbmV0X3NrKHNrYi0+c2spLT5pbmV0X2Rwb3J0LCBtdHUpOworCQllbHNlCisJCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwKKwkJCQkgIElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwogCQlyZXQgPSAtRU1TR1NJWkU7CiAJfQogb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggYjc5MTlmOS4uM2I1NjY5YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC0yNzIsNiArMjcyLDEwIEBACiAKIAlpZiAoYWRkcl9sZW4gPCBTSU42X0xFTl9SRkMyMTMzKQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhZGRyLT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKIAlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmYWRkci0+c2luNl9hZGRyKTsKIAlpZiAoKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NVUxUSUNBU1QpICYmIHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCmluZGV4IDQxM2FiMDcuLjI0OTM5NDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKQEAgLTIwNCw3ICsyMDQsOCBAQAogCWVsc2UKIAkJcG1zZy0+b3V0ZGV2X25hbWVbMF0gPSAnXDAnOwogCi0JaWYgKGVudHJ5LT5pbmRldiAmJiBlbnRyeS0+c2tiLT5kZXYpIHsKKwlpZiAoZW50cnktPmluZGV2ICYmIGVudHJ5LT5za2ItPmRldiAmJgorCSAgICBlbnRyeS0+c2tiLT5tYWNfaGVhZGVyICE9IGVudHJ5LT5za2ItPm5ldHdvcmtfaGVhZGVyKSB7CiAJCXBtc2ctPmh3X3R5cGUgPSBlbnRyeS0+c2tiLT5kZXYtPnR5cGU7CiAJCXBtc2ctPmh3X2FkZHJsZW4gPSBkZXZfcGFyc2VfaGVhZGVyKGVudHJ5LT5za2IsIHBtc2ctPmh3X2FkZHIpOwogCX0KQEAgLTQwMyw3ICs0MDQsOCBAQAogc3RhdGljIGlubGluZSB2b2lkCiBfX2lwcV9yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFncywgbmxtc2dsZW4sIHNrYmxlbjsKKwlpbnQgc3RhdHVzLCB0eXBlLCBwaWQsIGZsYWdzOworCXVuc2lnbmVkIGludCBubG1zZ2xlbiwgc2tibGVuOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCiAJc2tibGVuID0gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCBjOGFmNThiLi40MTExMDUwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJLyogVGhpcyBpcyB3aGVyZSB3ZSBjYWxsIHRoZSBoZWxwZXI6IGFzIHRoZSBwYWNrZXQgZ29lcyBvdXQuICovCiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoIWN0IHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJaWYgKCFjdCB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRF9SRVBMWSkKIAkJZ290byBvdXQ7CiAKIAloZWxwID0gbmZjdF9oZWxwKGN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCmluZGV4IDFkZjNjOGIuLjdjMDVlN2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJLyogVXBkYXRlIHNrYiB0byByZWZlciB0byB0aGlzIGNvbm5lY3Rpb24gKi8KIAlza2ItPm5mY3QgPSAmbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKS0+Y3RfZ2VuZXJhbDsKIAlza2ItPm5mY3RpbmZvID0gKmN0aW5mbzsKLQlyZXR1cm4gLU5GX0FDQ0VQVDsKKwlyZXR1cm4gTkZfQUNDRVBUOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCBkZTJiMWRlLi4wZWYxZjA4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTIyOCw5ICsyMjgsMTAgQEAKIAogLyogYWxsb2NhdGUgZHN0IHdpdGggaXA2X2RzdF9vcHMgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJ0Nl9pbmZvICppcDZfZHN0X2FsbG9jKHN0cnVjdCBkc3Rfb3BzICpvcHMsCi0JCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gZHN0X2FsbG9jKG9wcywgZGV2LCAwLCAwLCAwKTsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gZHN0X2FsbG9jKG9wcywgZGV2LCAwLCAwLCBmbGFncyk7CiAKIAltZW1zZXQoJnJ0LT5ydDZpX3RhYmxlLCAwLCBzaXplb2YoKnJ0KSAtIHNpemVvZihzdHJ1Y3QgZHN0X2VudHJ5KSk7CiAKQEAgLTEwNDIsNyArMTA0Myw3IEBACiAJaWYgKHVubGlrZWx5KGlkZXYgPT0gTlVMTCkpCiAJCXJldHVybiBOVUxMOwogCi0JcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsIGRldik7CisJcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsIGRldiwgMCk7CiAJaWYgKHVubGlrZWx5KHJ0ID09IE5VTEwpKSB7CiAJCWluNl9kZXZfcHV0KGlkZXYpOwogCQlnb3RvIG91dDsKQEAgLTEwNjIsMTQgKzEwNjMsNiBAQAogCWRzdF9tZXRyaWNfc2V0KCZydC0+ZHN0LCBSVEFYX0hPUExJTUlULCAyNTUpOwogCXJ0LT5kc3Qub3V0cHV0ICA9IGlwNl9vdXRwdXQ7CiAKLSNpZiAwCS8qIHRoZXJlJ3Mgbm8gY2hhbmNlIHRvIHVzZSB0aGVzZSBmb3IgbmRpc2MgKi8KLQlydC0+ZHN0LmZsYWdzICAgPSBpcHY2X2FkZHJfdHlwZShhZGRyKSAmIElQVjZfQUREUl9VTklDQVNUCi0JCQkJPyBEU1RfSE9TVAotCQkJCTogMDsKLQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOwotCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwotI2VuZGlmCi0KIAlzcGluX2xvY2tfYmgoJmljbXA2X2RzdF9sb2NrKTsKIAlydC0+ZHN0Lm5leHQgPSBpY21wNl9kc3RfZ2NfbGlzdDsKIAlpY21wNl9kc3RfZ2NfbGlzdCA9ICZydC0+ZHN0OwpAQCAtMTIxNCw3ICsxMjA3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsIE5VTEwpOworCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBOVUxMLCBEU1RfTk9DT1VOVCk7CiAKIAlpZiAocnQgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtMTI0NCw3ICsxMjM3LDcgQEAKIAlpcHY2X2FkZHJfcHJlZml4KCZydC0+cnQ2aV9kc3QuYWRkciwgJmNmZy0+ZmNfZHN0LCBjZmctPmZjX2RzdF9sZW4pOwogCXJ0LT5ydDZpX2RzdC5wbGVuID0gY2ZnLT5mY19kc3RfbGVuOwogCWlmIChydC0+cnQ2aV9kc3QucGxlbiA9PSAxMjgpCi0JICAgICAgIHJ0LT5kc3QuZmxhZ3MgPSBEU1RfSE9TVDsKKwkgICAgICAgcnQtPmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJaXB2Nl9hZGRyX3ByZWZpeCgmcnQtPnJ0Nmlfc3JjLmFkZHIsICZjZmctPmZjX3NyYywgY2ZnLT5mY19zcmNfbGVuKTsKQEAgLTE3MzQsNyArMTcyNyw3IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChvcnQtPnJ0NmlfZGV2KTsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLAotCQkJCQkgICAgb3J0LT5kc3QuZGV2KTsKKwkJCQkJICAgIG9ydC0+ZHN0LmRldiwgMCk7CiAKIAlpZiAocnQpIHsKIAkJcnQtPmRzdC5pbnB1dCA9IG9ydC0+ZHN0LmlucHV0OwpAQCAtMjAxMyw3ICsyMDA2LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlkZXYtPmRldik7CiAJc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9kc3RfYWxsb2MoJm5ldC0+aXB2Ni5pcDZfZHN0X29wcywKLQkJCQkJICAgIG5ldC0+bG9vcGJhY2tfZGV2KTsKKwkJCQkJICAgIG5ldC0+bG9vcGJhY2tfZGV2LCAwKTsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAogCWlmIChydCA9PSBOVUxMKSB7CkBAIC0yMDI1LDcgKzIwMTgsNyBAQAogCiAJaW42X2Rldl9ob2xkKGlkZXYpOwogCi0JcnQtPmRzdC5mbGFncyA9IERTVF9IT1NUOworCXJ0LT5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CiAJcnQtPmRzdC5pbnB1dCA9IGlwNl9pbnB1dDsKIAlydC0+ZHN0Lm91dHB1dCA9IGlwNl9vdXRwdXQ7CiAJcnQtPnJ0NmlfaWRldiA9IGlkZXY7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCBkMWZkMjg3Li44NzU1MWNhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTE2NDQsNiArMTY0NCw3IEBACiAJCSAqIHRoZSBuZXcgc29ja2V0Li4KIAkJICovCiAJCWlmKG5zayAhPSBzaykgeworCQkJc29ja19ycHNfc2F2ZV9yeGhhc2gobnNrLCBza2ItPnJ4aGFzaCk7CiAJCQlpZiAodGNwX2NoaWxkX3Byb2Nlc3Moc2ssIG5zaywgc2tiKSkKIAkJCQlnb3RvIHJlc2V0OwogCQkJaWYgKG9wdF9za2IpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHAuYyBiL25ldC9pcHY2L3VkcC5jCmluZGV4IDQxZjhjOWMuLjMyODk4NWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcC5jCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC00NTMsOCArNDUzLDExIEBACiAJfQogCXVubG9ja19zb2NrX2Zhc3Qoc2ssIHNsb3cpOwogCi0JaWYgKGZsYWdzICYgTVNHX0RPTlRXQUlUKQorCWlmIChub2Jsb2NrKQogCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIHN0YXJ0aW5nIG92ZXIgZm9yIGEgbmV3IHBhY2tldCAqLworCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfVFJVTkM7CiAJZ290byB0cnlfYWdhaW47CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyaWFwLmMgYi9uZXQvaXJkYS9pcmlhcC5jCmluZGV4IDM2NDc3NTMuLmY4NzZlZWQgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyaWFwLmMKKysrIGIvbmV0L2lyZGEvaXJpYXAuYwpAQCAtODcsNiArODcsOCBAQAogCQkJIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOwogfQogCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGlyaWFzX29iamVjdHNfa2V5OworCiAvKgogICogRnVuY3Rpb24gaXJpYXBfaW5pdCAodm9pZCkKICAqCkBAIC0xMTQsNiArMTE2LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrLCAmaXJpYXNfb2JqZWN0c19rZXksCisJCQkJICAgImlyaWFzX29iamVjdHMiKTsKKwogCS8qCiAJICogIFJlZ2lzdGVyIHNvbWUgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgSXJMTVAKIAkgKi8KZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfZGVidWdmcy5jIGIvbmV0L2wydHAvbDJ0cF9kZWJ1Z2ZzLmMKaW5kZXggYjhkYmFlOC4uNzYxMzAxMyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9kZWJ1Z2ZzLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9kZWJ1Z2ZzLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCSAqLwogCXBkLT5uZXQgPSBnZXRfbmV0X25zX2J5X3BpZChjdXJyZW50LT5waWQpOwogCWlmIChJU19FUlIocGQtPm5ldCkpIHsKLQkJcmMgPSAtUFRSX0VSUihwZC0+bmV0KTsKKwkJcmMgPSBQVFJfRVJSKHBkLT5uZXQpOwogCQlnb3RvIGVycl9mcmVlX3BkOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lic3MuYyBiL25ldC9tYWM4MDIxMS9pYnNzLmMKaW5kZXggNDIxZWFhNi4uNTZjMjRjYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lic3MuYworKysgYi9uZXQvbWFjODAyMTEvaWJzcy5jCkBAIC05NjUsNiArOTY1LDEwIEBACiAKIAltdXRleF9sb2NrKCZzZGF0YS0+dS5pYnNzLm10eCk7CiAKKwlzZGF0YS0+dS5pYnNzLnN0YXRlID0gSUVFRTgwMjExX0lCU1NfTUxNRV9TRUFSQ0g7CisJbWVtc2V0KHNkYXRhLT51Lmlic3MuYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwlzZGF0YS0+dS5pYnNzLnNzaWRfbGVuID0gMDsKKwogCWFjdGl2ZV9pYnNzID0gaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzZGF0YSk7CiAKIAlpZiAoIWFjdGl2ZV9pYnNzICYmICFpc196ZXJvX2V0aGVyX2FkZHIoaWZpYnNzLT5ic3NpZCkpIHsKQEAgLTk5OSw4ICsxMDAzLDYgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIAogCXNrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPnNrYl9xdWV1ZSk7Ci0JbWVtc2V0KHNkYXRhLT51Lmlic3MuYnNzaWQsIDAsIEVUSF9BTEVOKTsKLQlzZGF0YS0+dS5pYnNzLnNzaWRfbGVuID0gMDsKIAogCWRlbF90aW1lcl9zeW5jKCZzZGF0YS0+dS5pYnNzLnRpbWVyKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmggYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAppbmRleCAyMDI1YWY1Li4wOTBiMGVjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAorKysgYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaApAQCAtNzc1LDkgKzc3NSw2IEBACiAKIAlpbnQgdHhfaGVhZHJvb207IC8qIHJlcXVpcmVkIGhlYWRyb29tIGZvciBoYXJkd2FyZS9yYWRpb3RhcCAqLwogCi0JLyogY291bnQgZm9yIGtleXMgbmVlZGluZyB0YWlscm9vbSBzcGFjZSBhbGxvY2F0aW9uICovCi0JaW50IGNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250OwotCiAJLyogVGFza2xldCBhbmQgc2tiIHF1ZXVlIHRvIHByb2Nlc3MgY2FsbHMgZnJvbSBJUlEgbW9kZS4gQWxsIGZyYW1lcwogCSAqIGFkZGVkIHRvIHNrYl9xdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCwgYnV0IGZyYW1lcyBpbgogCSAqIHNrYl9xdWV1ZV91bnJlbGlhYmxlIG1heSBiZSBkcm9wcGVkIGlmIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlc2UKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggNDlkNGY4Ni4uZGVlMzBhZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTExNDUsNiArMTE0NSwxMCBAQAogCQkJCSsgSUVFRTgwMjExX0VOQ1JZUFRfSEVBRFJPT007CiAJbmRldi0+bmVlZGVkX3RhaWxyb29tID0gSUVFRTgwMjExX0VOQ1JZUFRfVEFJTFJPT007CiAKKwlyZXQgPSBkZXZfYWxsb2NfbmFtZShuZGV2LCBuZGV2LT5uYW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCiAJaWVlZTgwMjExX2Fzc2lnbl9wZXJtX2FkZHIobG9jYWwsIG5kZXYsIHR5cGUpOwogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgbmRldi0+cGVybV9hZGRyLCBFVEhfQUxFTik7CiAJU0VUX05FVERFVl9ERVYobmRldiwgd2lwaHlfZGV2KGxvY2FsLT5ody53aXBoeSkpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2tleS5jIGIvbmV0L21hYzgwMjExL2tleS5jCmluZGV4IDMxYWZkNzEyLi5mODI1ZTJmIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEva2V5LmMKKysrIGIvbmV0L21hYzgwMjExL2tleS5jCkBAIC0xMDEsMTEgKzEwMSw2IEBACiAKIAlpZiAoIXJldCkgewogCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFOwotCi0JCWlmICghKChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykgfHwKLQkJICAgICAgKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikpKQotCQkJa2V5LT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQtLTsKLQogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2MSwxMCArMTU2LDYgQEAKIAkJCSAga2V5LT5jb25mLmtleWlkeCwgc3RhID8gc3RhLT5hZGRyIDogYmNhc3RfYWRkciwgcmV0KTsKIAogCWtleS0+ZmxhZ3MgJj0gfktFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFOwotCi0JaWYgKCEoKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDKSB8fAotCSAgICAgIChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKSkKLQkJa2V5LT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQrKzsKIH0KIAogdm9pZCBpZWVlODAyMTFfa2V5X3JlbW92ZWQoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5X2NvbmYpCkBAIC00MDMsMTAgKzM5NCw4IEBACiAJCWllZWU4MDIxMV9hZXNfa2V5X2ZyZWUoa2V5LT51LmNjbXAudGZtKTsKIAlpZiAoa2V5LT5jb25mLmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykKIAkJaWVlZTgwMjExX2Flc19jbWFjX2tleV9mcmVlKGtleS0+dS5hZXNfY21hYy50Zm0pOwotCWlmIChrZXktPmxvY2FsKSB7CisJaWYgKGtleS0+bG9jYWwpCiAJCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9yZW1vdmUoa2V5KTsKLQkJa2V5LT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQtLTsKLQl9CiAKIAlrZnJlZShrZXkpOwogfQpAQCAtNDY4LDggKzQ1Nyw2IEBACiAKIAlpZWVlODAyMTFfZGVidWdmc19rZXlfYWRkKGtleSk7CiAKLQlrZXktPmxvY2FsLT5jcnlwdG9fdHhfdGFpbHJvb21fbmVlZGVkX2NudCsrOwotCiAJcmV0ID0gaWVlZTgwMjExX2tleV9lbmFibGVfaHdfYWNjZWwoa2V5KTsKIAogCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKQEAgLTUxMSwxMiArNDk4LDggQEAKIAogCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CiAKLQlzZGF0YS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoa2V5LCAmc2RhdGEtPmtleV9saXN0LCBsaXN0KSB7Ci0JCXNkYXRhLT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQrKzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleSwgJnNkYXRhLT5rZXlfbGlzdCwgbGlzdCkKIAkJaWVlZTgwMjExX2tleV9lbmFibGVfaHdfYWNjZWwoa2V5KTsKLQl9CiAKIAltdXRleF91bmxvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWxtZS5jIGIvbmV0L21hYzgwMjExL21sbWUuYwppbmRleCA0ZjZiMjY3Li5kNTk1MjY1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWxtZS5jCisrKyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKQEAgLTEwODksNiArMTA4OSw3IEBACiAJCWxvY2FsLT5ody5jb25mLmZsYWdzICY9IH5JRUVFODAyMTFfQ09ORl9QUzsKIAkJY29uZmlnX2NoYW5nZWQgfD0gSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTOwogCX0KKwlsb2NhbC0+cHNfc2RhdGEgPSBOVUxMOwogCiAJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgY29uZmlnX2NoYW5nZWQpOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc2Nhbi5jIGIvbmV0L21hYzgwMjExL3NjYW4uYwppbmRleCAyN2FmNjcyLi42NjlkMmUzIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc2Nhbi5jCisrKyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9xb3NfcGFyYW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPG5ldC9zY2hfZ2VuZXJpYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KQEAgLTg3OCw3ICs4NzcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBpKyspIHsKIAkJbG9jYWwtPnNjaGVkX3NjYW5faWVzLmllW2ldID0ga3phbGxvYygyICsKIAkJCQkJCSAgICAgIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKwotCQkJCQkJICAgICAgbG9jYWwtPnNjYW5faWVzX2xlbiwKKwkJCQkJCSAgICAgIGxvY2FsLT5zY2FuX2llc19sZW4gKworCQkJCQkJICAgICAgcmVxLT5pZV9sZW4sCiAJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFsb2NhbC0+c2NoZWRfc2Nhbl9pZXMuaWVbaV0pIHsKIAkJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDY0ZTBmNzUuLjMxMDRjODQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0xNDgwLDcgKzE0ODAsMTIgQEAKIHsKIAlpbnQgdGFpbF9uZWVkID0gMDsKIAotCWlmIChtYXlfZW5jcnlwdCAmJiBsb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQpIHsKKwkvKgorCSAqIFRoaXMgY291bGQgYmUgb3B0aW1pc2VkLCBkZXZpY2VzIHRoYXQgZG8gZnVsbCBoYXJkd2FyZQorCSAqIGNyeXB0byAoaW5jbHVkaW5nIFRLSVAgTU1JQykgbmVlZCBubyB0YWlscm9vbS4uLiBCdXQgd2UKKwkgKiBoYXZlIG5vIGRyaXZlcnMgZm9yIHN1Y2ggZGV2aWNlcyBjdXJyZW50bHkuCisJICovCisJaWYgKG1heV9lbmNyeXB0KSB7CiAJCXRhaWxfbmVlZCA9IElFRUU4MDIxMV9FTkNSWVBUX1RBSUxST09NOwogCQl0YWlsX25lZWQgLT0gc2tiX3RhaWxyb29tKHNrYik7CiAJCXRhaWxfbmVlZCA9IG1heF90KGludCwgdGFpbF9uZWVkLCAwKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93cGEuYyBiL25ldC9tYWM4MDIxMS93cGEuYwppbmRleCA5ZGMzYjVmLi44ZjZhMzAyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd3BhLmMKKysrIGIvbmV0L21hYzgwMjExL3dwYS5jCkBAIC04Niw2ICs4NiwxMSBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSByeC0+c2tiOwogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMgPSBJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCWludCBxdWV1ZSA9IHJ4LT5xdWV1ZTsKKworCS8qIG90aGVyd2lzZSwgVEtJUCBpcyB2dWxuZXJhYmxlIHRvIFRJRCAwIHZzLiBub24tUW9TIHJlcGxheXMgKi8KKwlpZiAocngtPnF1ZXVlID09IE5VTV9SWF9EQVRBX1FVRVVFUyAtIDEpCisJCXF1ZXVlID0gMDsKIAogCS8qCiAJICogaXQgbWFrZXMgbm8gc2Vuc2UgdG8gY2hlY2sgZm9yIE1JQyBlcnJvcnMgb24gYW55dGhpbmcgb3RoZXIKQEAgLTE0OCwxMyArMTUzLDE5IEBACiAKIHVwZGF0ZV9pdjoKIAkvKiB1cGRhdGUgSVYgaW4ga2V5IGluZm9ybWF0aW9uIHRvIGJlIGFibGUgdG8gZGV0ZWN0IHJlcGxheXMgKi8KLQlyeC0+a2V5LT51LnRraXAucnhbcngtPnF1ZXVlXS5pdjMyID0gcngtPnRraXBfaXYzMjsKLQlyeC0+a2V5LT51LnRraXAucnhbcngtPnF1ZXVlXS5pdjE2ID0gcngtPnRraXBfaXYxNjsKKwlyeC0+a2V5LT51LnRraXAucnhbcXVldWVdLml2MzIgPSByeC0+dGtpcF9pdjMyOworCXJ4LT5rZXktPnUudGtpcC5yeFtxdWV1ZV0uaXYxNiA9IHJ4LT50a2lwX2l2MTY7CiAKIAlyZXR1cm4gUlhfQ09OVElOVUU7CiAKIG1pY19mYWlsOgotCW1hYzgwMjExX2V2X21pY2hhZWxfbWljX2ZhaWx1cmUocngtPnNkYXRhLCByeC0+a2V5LT5jb25mLmtleWlkeCwKKwkvKgorCSAqIEluIHNvbWUgY2FzZXMgdGhlIGtleSBjYW4gYmUgdW5zZXQgLSBlLmcuIGEgbXVsdGljYXN0IHBhY2tldCwgaW4KKwkgKiBhIGRyaXZlciB0aGF0IHN1cHBvcnRzIEhXIGVuY3J5cHRpb24uIFNlbmQgdXAgdGhlIGtleSBpZHggb25seSBpZgorCSAqIHRoZSBrZXkgaXMgc2V0LgorCSAqLworCW1hYzgwMjExX2V2X21pY2hhZWxfbWljX2ZhaWx1cmUocngtPnNkYXRhLAorCQkJCQlyeC0+a2V5ID8gcngtPmtleS0+Y29uZi5rZXlpZHggOiAtMSwKIAkJCQkJKHZvaWQgKikgc2tiLT5kYXRhLCBOVUxMLCBHRlBfQVRPTUlDKTsKIAlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKIH0KQEAgLTIzNSw2ICsyNDYsMTEgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5ID0gcngtPmtleTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcngtPnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CisJaW50IHF1ZXVlID0gcngtPnF1ZXVlOworCisJLyogb3RoZXJ3aXNlLCBUS0lQIGlzIHZ1bG5lcmFibGUgdG8gVElEIDAgdnMuIG5vbi1Rb1MgcmVwbGF5cyAqLworCWlmIChyeC0+cXVldWUgPT0gTlVNX1JYX0RBVEFfUVVFVUVTIC0gMSkKKwkJcXVldWUgPSAwOwogCiAJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwogCkBAIC0yNTUsNyArMjcxLDcgQEAKIAlyZXMgPSBpZWVlODAyMTFfdGtpcF9kZWNyeXB0X2RhdGEocngtPmxvY2FsLT53ZXBfcnhfdGZtLAogCQkJCQkgIGtleSwgc2tiLT5kYXRhICsgaGRybGVuLAogCQkJCQkgIHNrYi0+bGVuIC0gaGRybGVuLCByeC0+c3RhLT5zdGEuYWRkciwKLQkJCQkJICBoZHItPmFkZHIxLCBod2FjY2VsLCByeC0+cXVldWUsCisJCQkJCSAgaGRyLT5hZGRyMSwgaHdhY2NlbCwgcXVldWUsCiAJCQkJCSAgJnJ4LT50a2lwX2l2MzIsCiAJCQkJCSAgJnJ4LT50a2lwX2l2MTYpOwogCWlmIChyZXMgIT0gVEtJUF9ERUNSWVBUX09LKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jCmluZGV4IDgwNDFiZWYuLjQyYWE2NGIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKQEAgLTc2Nyw3ICs3NjcsNyBAQAogCWlmICghYXR0cltJUFNFVF9BVFRSX1NFVE5BTUVdKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBpcF9zZXRfbWF4OyBpKyspIHsKIAkJCWlmIChpcF9zZXRfbGlzdFtpXSAhPSBOVUxMICYmIGlwX3NldF9saXN0W2ldLT5yZWYpIHsKLQkJCQlyZXQgPSBJUFNFVF9FUlJfQlVTWTsKKwkJCQlyZXQgPSAtSVBTRVRfRVJSX0JVU1k7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0bmV0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydG5ldC5jCmluZGV4IDQ3NDNlNTQuLjU2NWE3YzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0bmV0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRuZXQuYwpAQCAtMTQ2LDggKzE0Niw5IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKLQlzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ0X2VsZW0gZGF0YSA9Ci0JCXsgLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJc3RydWN0IGhhc2hfaXBwb3J0bmV0NF9lbGVtIGRhdGEgPSB7CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zOTQsOCArMzk1LDkgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwotCXN0cnVjdCBoYXNoX2lwcG9ydG5ldDZfZWxlbSBkYXRhID0KLQkJeyAuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwlzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ2X2VsZW0gZGF0YSA9IHsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldC5jCmluZGV4IGM0ZGIyMDIuLjJhZWVhYmMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXQuYwpAQCAtMTMxLDcgKzEzMSw5IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKLQlzdHJ1Y3QgaGFzaF9uZXQ0X2VsZW0gZGF0YSA9IHsgLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJc3RydWN0IGhhc2hfbmV0NF9lbGVtIGRhdGEgPSB7CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yOTYsNyArMjk4LDkgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwotCXN0cnVjdCBoYXNoX25ldDZfZWxlbSBkYXRhID0geyAuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwlzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gZGF0YSA9IHsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0cG9ydC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRwb3J0LmMKaW5kZXggZDJhNDAzNi4uZTUwZDliYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRwb3J0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRwb3J0LmMKQEAgLTE0NCw3ICsxNDQsOCBAQAogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJc3RydWN0IGhhc2hfbmV0cG9ydDRfZWxlbSBkYXRhID0gewotCQkuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1Nyw3ICszNTgsOCBAQAogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJc3RydWN0IGhhc2hfbmV0cG9ydDZfZWxlbSBkYXRhID0gewotCQkuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCmluZGV4IGJmMjhhYzIuLjc4MmRiMjcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYwpAQCAtNzc2LDggKzc3NiwxNiBAQAogCQlpZiAoY3AtPmNvbnRyb2wpCiAJCQlpcF92c19jb250cm9sX2RlbChjcCk7CiAKLQkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9ORkNUKQorCQlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05GQ1QpIHsKIAkJCWlwX3ZzX2Nvbm5fZHJvcF9jb25udHJhY2soY3ApOworCQkJLyogRG8gbm90IGFjY2VzcyBjb25udHJhY2tzIGR1cmluZyBzdWJzeXMgY2xlYW51cAorCQkJICogYmVjYXVzZSBuZl9jb25udHJhY2tfZmluZF9nZXQgY2FuIG5vdCBiZSB1c2VkIGFmdGVyCisJCQkgKiBjb25udHJhY2sgY2xlYW51cCBmb3IgdGhlIG5ldC4KKwkJCSAqLworCQkJc21wX3JtYigpOworCQkJaWYgKGlwdnMtPmVuYWJsZSkKKwkJCQlpcF92c19jb25uX2Ryb3BfY29ubnRyYWNrKGNwKTsKKwkJfQogCiAJCWlwX3ZzX3BlX3B1dChjcC0+cGUpOwogCQlrZnJlZShjcC0+cGVfZGF0YSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwppbmRleCBiZmE4MDhmLi4yNGMyOGQyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKQEAgLTE3NzIsNyArMTc3Miw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9JTiwKLQkJLnByaW9yaXR5CT0gOTksCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDIC0gMiwKIAl9LAogCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcsIGZvcndhcmQgcGFja2V0IHRocm91Z2ggVlMvRFIsIFZTL1RVTiwKIAkgKiBvciBWUy9OQVQoY2hhbmdlIGRlc3RpbmF0aW9uKSwgc28gdGhhdCBmaWx0ZXJpbmcgcnVsZXMgY2FuIGJlCkBAIC0xNzgyLDcgKzE3ODIsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDEwMSwKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9TUkMgLSAxLAogCX0sCiAJLyogQmVmb3JlIGlwX3ZzX2luLCBjaGFuZ2Ugc291cmNlIG9ubHkgZm9yIFZTL05BVCAqLwogCXsKQEAgLTE3OTAsNyArMTc5MCw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IC05OSwKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9EU1QgKyAxLAogCX0sCiAJLyogQWZ0ZXIgbWFuZ2xlLCBzY2hlZHVsZSBhbmQgZm9yd2FyZCBsb2NhbCByZXF1ZXN0cyAqLwogCXsKQEAgLTE3OTgsNyArMTc5OCw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IC05OCwKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9EU1QgKyAyLAogCX0sCiAJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZyAoYnV0IGJlZm9yZSBpcF92c19vdXRfaWNtcCksIGNhdGNoIGljbXAKIAkgKiBkZXN0aW5lZCBmb3IgMC4wLjAuMC8wLCB3aGljaCBpcyBmb3IgaW5jb21pbmcgSVBWUyBjb25uZWN0aW9ucyAqLwpAQCAtMTgyNCw3ICsxODI0LDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVDYsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9JTiwKLQkJLnByaW9yaXR5CT0gOTksCisJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfTkFUX1NSQyAtIDIsCiAJfSwKIAkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBmb3J3YXJkIHBhY2tldCB0aHJvdWdoIFZTL0RSLCBWUy9UVU4sCiAJICogb3IgVlMvTkFUKGNoYW5nZSBkZXN0aW5hdGlvbiksIHNvIHRoYXQgZmlsdGVyaW5nIHJ1bGVzIGNhbiBiZQpAQCAtMTgzNCw3ICsxODM0LDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVDYsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9JTiwKLQkJLnByaW9yaXR5CT0gMTAxLAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX05BVF9TUkMgLSAxLAogCX0sCiAJLyogQmVmb3JlIGlwX3ZzX2luLCBjaGFuZ2Ugc291cmNlIG9ubHkgZm9yIFZTL05BVCAqLwogCXsKQEAgLTE4NDIsNyArMTg0Miw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IC05OSwKKwkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9OQVRfRFNUICsgMSwKIAl9LAogCS8qIEFmdGVyIG1hbmdsZSwgc2NoZWR1bGUgYW5kIGZvcndhcmQgbG9jYWwgcmVxdWVzdHMgKi8KIAl7CkBAIC0xODUwLDcgKzE4NTAsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVUNiwKIAkJLmhvb2tudW0JPSBORl9JTkVUX0xPQ0FMX09VVCwKLQkJLnByaW9yaXR5CT0gLTk4LAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX05BVF9EU1QgKyAyLAogCX0sCiAJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZyAoYnV0IGJlZm9yZSBpcF92c19vdXRfaWNtcCksIGNhdGNoIGljbXAKIAkgKiBkZXN0aW5lZCBmb3IgMC4wLjAuMC8wLCB3aGljaCBpcyBmb3IgaW5jb21pbmcgSVBWUyBjb25uZWN0aW9ucyAqLwpAQCAtMTk0NSw2ICsxOTQ1LDcgQEAKIHsKIAlFbnRlckZ1bmN0aW9uKDIpOwogCW5ldF9pcHZzKG5ldCktPmVuYWJsZSA9IDA7CS8qIERpc2FibGUgcGFja2V0IHJlY2VwdGlvbiAqLworCXNtcF93bWIoKTsKIAlfX2lwX3ZzX3N5bmNfY2xlYW51cChuZXQpOwogCUxlYXZlRnVuY3Rpb24oMik7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggMmUxYzExZi4uZjdhZjhiOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtODUwLDcgKzg1MCw3IEBACiAKIAkvKiBJdCBleGlzdHM7IHdlIGhhdmUgKG5vbi1leGNsdXNpdmUpIHJlZmVyZW5jZS4gKi8KIAlpZiAoTkZfQ1RfRElSRUNUSU9OKGgpID09IElQX0NUX0RJUl9SRVBMWSkgewotCQkqY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWTsKKwkJKmN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZOwogCQkvKiBQbGVhc2Ugc2V0IHJlcGx5IGJpdCBpZiB0aGlzIHBhY2tldCBPSyAqLwogCQkqc2V0X3JlcGx5ID0gMTsKIAl9IGVsc2UgewpAQCAtOTIyLDYgKzkyMiw5IEBACiAJCQlyZXQgPSAtcmV0OwogCQkJZ290byBvdXQ7CiAJCX0KKwkJLyogSUNNUFt2Nl0gcHJvdG9jb2wgdHJhY2tlcnMgbWF5IGFzc2lnbiBvbmUgY29ubnRyYWNrLiAqLworCQlpZiAoc2tiLT5uZmN0KQorCQkJZ290byBvdXQ7CiAJfQogCiAJY3QgPSByZXNvbHZlX25vcm1hbF9jdChuZXQsIHRtcGwsIHNrYiwgZGF0YW9mZiwgcGYsIHByb3RvbnVtLApAQCAtMTE0Myw3ICsxMTQ2LDcgQEAKIAkvKiBUaGlzIElDTVAgaXMgaW4gcmV2ZXJzZSBkaXJlY3Rpb24gdG8gdGhlIHBhY2tldCB3aGljaCBjYXVzZWQgaXQgKi8KIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCWlmIChDVElORk8yRElSKGN0aW5mbykgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQotCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFk7CisJCWN0aW5mbyA9IElQX0NUX1JFTEFURURfUkVQTFk7CiAJZWxzZQogCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IGUxN2NiN2MuLjZmNTgwMWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAogCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwogCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKLQkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKKwkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKSB7CiAJCXByX2RlYnVnKCJmdHA6IENvbm50cmFja2luZm8gPSAldVxuIiwgY3RpbmZvKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jCmluZGV4IDE4YjJjZTUuLmYwM2MyZDQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jCkBAIC01NzEsMTAgKzU3MSw5IEBACiAJaW50IHJldDsKIAogCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKLQkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9CisKIAlwcl9kZWJ1ZygibmZfY3RfaDI0NTogc2tibGVuID0gJXVcbiIsIHNrYi0+bGVuKTsKIAogCXNwaW5fbG9ja19iaCgmbmZfaDMyM19sb2NrKTsKQEAgLTExMjUsMTAgKzExMjQsOSBAQAogCWludCByZXQ7CiAKIAkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7CisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQorCiAJcHJfZGVidWcoIm5mX2N0X3E5MzE6IHNrYmxlbiA9ICV1XG4iLCBza2ItPmxlbik7CiAKIAlzcGluX2xvY2tfYmgoJm5mX2gzMjNfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5jCmluZGV4IGIzOTRhYTMuLjRmOTM5MGIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5jCkBAIC0xMjUsOCArMTI1LDcgQEAKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKLQkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAkvKiBOb3QgYSBmdWxsIHRjcCBoZWFkZXI/ICovCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKaW5kZXggMDg4OTQ0OC4uMmZkNDU2NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYwpAQCAtNTE5LDggKzUxOSw3IEBACiAJdV9pbnQxNl90IG1zZzsKIAogCS8qIGRvbid0IGRvIGFueSB0cmFja2luZyBiZWZvcmUgdGNwIGhhbmRzaGFrZSBjb21wbGV0ZSAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKLQkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAluZXh0aGRyX29mZiA9IHByb3RvZmY7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmMKaW5kZXggZDllMjc3My4uODUwMTgyMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NhbmUuYwpAQCAtNzgsNyArNzgsNyBAQAogCWN0X3NhbmVfaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X3NhbmVfaW5mbzsKIAkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KIAlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWSkKKwkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJLyogTm90IGEgZnVsbCB0Y3AgaGVhZGVyPyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYwppbmRleCBjYjVhMjg1Li45M2ZhZjZhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYwpAQCAtMTQyMyw3ICsxNDIzLDcgQEAKIAl0eXBlb2YobmZfbmF0X3NpcF9zZXFfYWRqdXN0X2hvb2spIG5mX25hdF9zaXBfc2VxX2FkanVzdDsKIAogCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKLQkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIE5vIERhdGEgPyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCBlMGVlMDEwLi4yZTdjY2JiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtNDU2LDcgKzQ1Niw4IEBACiAJaWYgKHNrYi0+bWFyaykKIAkJTkxBX1BVVF9CRTMyKGluc3QtPnNrYiwgTkZVTEFfTUFSSywgaHRvbmwoc2tiLT5tYXJrKSk7CiAKLQlpZiAoaW5kZXYgJiYgc2tiLT5kZXYpIHsKKwlpZiAoaW5kZXYgJiYgc2tiLT5kZXYgJiYKKwkgICAgc2tiLT5tYWNfaGVhZGVyICE9IHNrYi0+bmV0d29ya19oZWFkZXIpIHsKIAkJc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X2h3IHBodzsKIAkJaW50IGxlbiA9IGRldl9wYXJzZV9oZWFkZXIoc2tiLCBwaHcuaHdfYWRkcik7CiAJCWlmIChsZW4gPiAwKSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYwppbmRleCBiODMxMjNmLi5mZGQyZmFmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKQEAgLTMzNSw3ICszMzUsOCBAQAogCWlmIChlbnRza2ItPm1hcmspCiAJCU5MQV9QVVRfQkUzMihza2IsIE5GUUFfTUFSSywgaHRvbmwoZW50c2tiLT5tYXJrKSk7CiAKLQlpZiAoaW5kZXYgJiYgZW50c2tiLT5kZXYpIHsKKwlpZiAoaW5kZXYgJiYgZW50c2tiLT5kZXYgJiYKKwkgICAgZW50c2tiLT5tYWNfaGVhZGVyICE9IGVudHNrYi0+bmV0d29ya19oZWFkZXIpIHsKIAkJc3RydWN0IG5mcW5sX21zZ19wYWNrZXRfaHcgcGh3OwogCQlpbnQgbGVuID0gZGV2X3BhcnNlX2hlYWRlcihlbnRza2IsIHBody5od19hZGRyKTsKIAkJaWYgKGxlbikgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKaW5kZXggOWNjNDYzNS4uZmUzOWY3ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCkBAIC0xNDMsOSArMTQzLDkgQEAKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCWlmIChjdCAmJiAhbmZfY3RfaXNfdW50cmFja2VkKGN0KSAmJgogCSAgICAoKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JQ01QICYmCi0JICAgICAgY3RpbmZvID09IElQX0NUX0lTX1JFUExZICsgSVBfQ1RfRVNUQUJMSVNIRUQpIHx8CisJICAgICAgY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKSB8fAogCSAgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QICYmCi0JICAgICAgY3RpbmZvID09IElQX0NUX0lTX1JFUExZICsgSVBfQ1RfUkVMQVRFRCkpICYmCisJICAgICAgY3RpbmZvID09IElQX0NUX1JFTEFURURfUkVQTFkpKSAmJgogCSAgICAoY3QtPnN0YXR1cyAmIElQU19TUkNfTkFUX0RPTkUpKSB7CiAKIAkJZGFkZHIgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwOwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggOTI1ZjcxNS4uYzBjM2NkYSAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC03OTgsNyArNzk4LDEzIEBACiAJCQlnZXRuc3RpbWVvZmRheSgmdHMpOwogCQloLmgyLT50cF9zZWMgPSB0cy50dl9zZWM7CiAJCWguaDItPnRwX25zZWMgPSB0cy50dl9uc2VjOwotCQloLmgyLT50cF92bGFuX3RjaSA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCQloLmgyLT50cF92bGFuX3RjaSA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQkJc3RhdHVzIHw9IFRQX1NUQVRVU19WTEFOX1ZBTElEOworCQl9IGVsc2UgeworCQkJaC5oMi0+dHBfdmxhbl90Y2kgPSAwOworCQl9CisJCWguaDItPnRwX3BhZGRpbmcgPSAwOwogCQloZHJsZW4gPSBzaXplb2YoKmguaDIpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTcyNSw4ICsxNzMxLDEzIEBACiAJCWF1eC50cF9zbmFwbGVuID0gc2tiLT5sZW47CiAJCWF1eC50cF9tYWMgPSAwOwogCQlhdXgudHBfbmV0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7Ci0JCWF1eC50cF92bGFuX3RjaSA9IHZsYW5fdHhfdGFnX2dldChza2IpOwotCisJCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKKwkJCWF1eC50cF92bGFuX3RjaSA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQkJYXV4LnRwX3N0YXR1cyB8PSBUUF9TVEFUVVNfVkxBTl9WQUxJRDsKKwkJfSBlbHNlIHsKKwkJCWF1eC50cF92bGFuX3RjaSA9IDA7CisJCX0KKwkJYXV4LnRwX3BhZGRpbmcgPSAwOwogCQlwdXRfY21zZyhtc2csIFNPTF9QQUNLRVQsIFBBQ0tFVF9BVVhEQVRBLCBzaXplb2YoYXV4KSwgJmF1eCk7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IGIxNzIxZDcuLmI0YzY4MDkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC0yNTEsOSArMjUxLDggQEAKIAkJCX0KIAogCQkJaWYgKHNvbWVfcXVldWVfdGltZWRvdXQpIHsKLQkJCQljaGFyIGRyaXZlcm5hbWVbNjRdOwogCQkJCVdBUk5fT05DRSgxLCBLRVJOX0lORk8gIk5FVERFViBXQVRDSERPRzogJXMgKCVzKTogdHJhbnNtaXQgcXVldWUgJXUgdGltZWQgb3V0XG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsIG5ldGRldl9kcml2ZXJuYW1lKGRldiwgZHJpdmVybmFtZSwgNjQpLCBpKTsKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBuZXRkZXZfZHJpdmVybmFtZShkZXYpLCBpKTsKIAkJCQlkZXYtPm5ldGRldl9vcHMtPm5kb190eF90aW1lb3V0KGRldik7CiAJCQl9CiAJCQlpZiAoIW1vZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lciwKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggNTI1Zjk3Yy4uNGE2Mjg4OCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTQ0NCwxNSArNDQ0LDcgQEAKIAogCWFzb2MtPnBlZXIudHJhbnNwb3J0X2NvdW50ID0gMDsKIAotCS8qIEZyZWUgYW55IGNhY2hlZCBBU0NPTkZfQUNLIGNodW5rLiAqLwotCXNjdHBfYXNzb2NfZnJlZV9hc2NvbmZfYWNrcyhhc29jKTsKLQotCS8qIEZyZWUgdGhlIEFTQ09ORiBxdWV1ZS4gKi8KLQlzY3RwX2Fzc29jX2ZyZWVfYXNjb25mX3F1ZXVlKGFzb2MpOwotCi0JLyogRnJlZSBhbnkgY2FjaGVkIEFTQ09ORiBjaHVuay4gKi8KLQlpZiAoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpCi0JCXNjdHBfY2h1bmtfZnJlZShhc29jLT5hZGRpcF9sYXN0X2FzY29uZik7CisJc2N0cF9hc2NvbmZfcXVldWVfdGVhcmRvd24oYXNvYyk7CiAKIAkvKiBBVVRIIC0gRnJlZSB0aGUgZW5kcG9pbnQgc2hhcmVkIGtleXMgKi8KIAlzY3RwX2F1dGhfZGVzdHJveV9rZXlzKCZhc29jLT5lbmRwb2ludF9zaGFyZWRfa2V5cyk7CkBAIC0xNjQ2LDMgKzE2MzgsMTYgQEAKIAogCXJldHVybiBOVUxMOwogfQorCit2b2lkIHNjdHBfYXNjb25mX3F1ZXVlX3RlYXJkb3duKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCS8qIEZyZWUgYW55IGNhY2hlZCBBU0NPTkZfQUNLIGNodW5rLiAqLworCXNjdHBfYXNzb2NfZnJlZV9hc2NvbmZfYWNrcyhhc29jKTsKKworCS8qIEZyZWUgdGhlIEFTQ09ORiBxdWV1ZS4gKi8KKwlzY3RwX2Fzc29jX2ZyZWVfYXNjb25mX3F1ZXVlKGFzb2MpOworCisJLyogRnJlZSBhbnkgY2FjaGVkIEFTQ09ORiBjaHVuay4gKi8KKwlpZiAoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpCisJCXNjdHBfY2h1bmtfZnJlZShhc29jLT5hZGRpcF9sYXN0X2FzY29uZik7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRwdXQuYyBiL25ldC9zY3RwL291dHB1dC5jCmluZGV4IGI0ZjNjZjAuLjA4YjNjZWEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHB1dC5jCisrKyBiL25ldC9zY3RwL291dHB1dC5jCkBAIC01MDAsMjMgKzUwMCwyMCBAQAogCSAqIE5vdGU6IEFkbGVyLTMyIGlzIG5vIGxvbmdlciBhcHBsaWNhYmxlLCBhcyBoYXMgYmVlbiByZXBsYWNlZAogCSAqIGJ5IENSQzMyLUMgYXMgZGVzY3JpYmVkIGluIDxkcmFmdC1pZXRmLXRzdndnLXNjdHBjc3VtLTAyLnR4dD4uCiAJICovCi0JaWYgKCFzY3RwX2NoZWNrc3VtX2Rpc2FibGUgJiYKLQkgICAgIShkc3QtPmRldi0+ZmVhdHVyZXMgJiAoTkVUSUZfRl9OT19DU1VNIHwgTkVUSUZfRl9TQ1RQX0NTVU0pKSkgewotCQlfX3UzMiBjcmMzMiA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgY2tzdW1fYnVmX2xlbik7CisJaWYgKCFzY3RwX2NoZWNrc3VtX2Rpc2FibGUpIHsKKwkJaWYgKCEoZHN0LT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TQ1RQX0NTVU0pKSB7CisJCQlfX3UzMiBjcmMzMiA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgY2tzdW1fYnVmX2xlbik7CiAKLQkJLyogMykgUHV0IHRoZSByZXN1bHRhbnQgdmFsdWUgaW50byB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlCi0JCSAqICAgIGNvbW1vbiBoZWFkZXIsIGFuZCBsZWF2ZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1bmNoYW5nZWQuCi0JCSAqLwotCQlzaC0+Y2hlY2tzdW0gPSBzY3RwX2VuZF9ja3N1bShjcmMzMik7Ci0JfSBlbHNlIHsKLQkJaWYgKGRzdC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0NUUF9DU1VNKSB7CisJCQkvKiAzKSBQdXQgdGhlIHJlc3VsdGFudCB2YWx1ZSBpbnRvIHRoZSBjaGVja3N1bSBmaWVsZCBpbiB0aGUKKwkJCSAqICAgIGNvbW1vbiBoZWFkZXIsIGFuZCBsZWF2ZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1bmNoYW5nZWQuCisJCQkgKi8KKwkJCXNoLT5jaGVja3N1bSA9IHNjdHBfZW5kX2Nrc3VtKGNyYzMyKTsKKwkJfSBlbHNlIHsKIAkJCS8qIG5vIG5lZWQgdG8gc2VlZCBwc2V1ZG8gY2hlY2tzdW0gZm9yIFNDVFAgKi8KIAkJCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJCQluc2tiLT5jc3VtX3N0YXJ0ID0gKHNrYl90cmFuc3BvcnRfaGVhZGVyKG5za2IpIC0KIAkJCSAgICAgICAgICAgICAgICAgICAgbnNrYi0+aGVhZCk7CiAJCQluc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY3RwaGRyLCBjaGVja3N1bSk7Ci0JCX0gZWxzZSB7Ci0JCQluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cXVldWUuYyBiL25ldC9zY3RwL291dHF1ZXVlLmMKaW5kZXggMWM4OGM4OS4uZDAzNjgyMSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cXVldWUuYworKysgYi9uZXQvc2N0cC9vdXRxdWV1ZS5jCkBAIC0xNTgyLDYgKzE1ODIsOCBAQAogI2VuZGlmIC8qIFNDVFBfREVCVUcgKi8KIAlpZiAodHJhbnNwb3J0KSB7CiAJCWlmIChieXRlc19hY2tlZCkgeworCQkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSB0cmFuc3BvcnQtPmFzb2M7CisKIAkJCS8qIFdlIG1heSBoYXZlIGNvdW50ZWQgREFUQSB0aGF0IHdhcyBtaWdyYXRlZAogCQkJICogdG8gdGhpcyB0cmFuc3BvcnQgZHVlIHRvIERFTC1JUCBvcGVyYXRpb24uCiAJCQkgKiBTdWJ0cmFjdCB0aG9zZSBieXRlcywgc2luY2UgdGhlIHdlcmUgbmV2ZXIKQEAgLTE2MDAsNiArMTYwMiwxNyBAQAogCQkJdHJhbnNwb3J0LT5lcnJvcl9jb3VudCA9IDA7CiAJCQl0cmFuc3BvcnQtPmFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPSAwOwogCisJCQkvKgorCQkJICogV2hpbGUgaW4gU0hVVERPV04gUEVORElORywgd2UgbWF5IGhhdmUgc3RhcnRlZAorCQkJICogdGhlIFQ1IHNodXRkb3duIGd1YXJkIHRpbWVyIGFmdGVyIHJlYWNoaW5nIHRoZQorCQkJICogcmV0cmFuc21pc3Npb24gbGltaXQuIFN0b3AgdGhhdCB0aW1lciBhcyBzb29uCisJCQkgKiBhcyB0aGUgcmVjZWl2ZXIgYWNrbm93bGVkZ2VkIGFueSBkYXRhLgorCQkJICovCisJCQlpZiAoYXNvYy0+c3RhdGUgPT0gU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICYmCisJCQkgICAgZGVsX3RpbWVyKCZhc29jLT50aW1lcnMKKwkJCQlbU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEXSkpCisJCQkJCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworCiAJCQkvKiBNYXJrIHRoZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyBhcwogCQkJICogYWN0aXZlIGlmIGl0IGlzIG5vdCBzbyBtYXJrZWQuCiAJCQkgKi8KQEAgLTE2MjksMTAgKzE2NDIsMTUgQEAKIAkJCSAqIEEgc2VuZGVyIGlzIGRvaW5nIHplcm8gd2luZG93IHByb2Jpbmcgd2hlbiB0aGUKIAkJCSAqIHJlY2VpdmVyJ3MgYWR2ZXJ0aXNlZCB3aW5kb3cgaXMgemVybywgYW5kIHRoZXJlIGlzCiAJCQkgKiBvbmx5IG9uZSBkYXRhIGNodW5rIGluIGZsaWdodCB0byB0aGUgcmVjZWl2ZXIuCisJCQkgKgorCQkJICogQWxsb3cgdGhlIGFzc29jaWF0aW9uIHRvIHRpbWVvdXQgd2hpbGUgaW4gU0hVVERPV04KKwkJCSAqIFBFTkRJTkcgb3IgU0hVVERPV04gUkVDRUlWRUQgaW4gY2FzZSB0aGUgcmVjZWl2ZXIKKwkJCSAqIHN0YXlzIGluIHplcm8gd2luZG93IG1vZGUgZm9yZXZlci4KIAkJCSAqLwogCQkJaWYgKCFxLT5hc29jLT5wZWVyLnJ3bmQgJiYKIAkJCSAgICAhbGlzdF9lbXB0eSgmdGxpc3QpICYmCi0JCQkgICAgKHNhY2tfY3RzbisyID09IHEtPmFzb2MtPm5leHRfdHNuKSkgeworCQkJICAgIChzYWNrX2N0c24rMiA9PSBxLT5hc29jLT5uZXh0X3RzbikgJiYKKwkJCSAgICBxLT5hc29jLT5zdGF0ZSA8IFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORykgewogCQkJCVNDVFBfREVCVUdfUFJJTlRLKCIlczogU0FDSyByZWNlaXZlZCBmb3IgemVybyAiCiAJCQkJCQkgICJ3aW5kb3cgcHJvYmU6ICV1XG4iLAogCQkJCQkJICBfX2Z1bmNfXywgc2Fja19jdHNuKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb3RvY29sLmMgYi9uZXQvc2N0cC9wcm90b2NvbC5jCmluZGV4IDY3MzgwYTIuLjIwNzE3NWIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb3RvY29sLmMKKysrIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwpAQCAtMTA1OCw3ICsxMDU4LDYgQEAKIAlpbnQgc3RhdHVzID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBsb25nIGdvYWw7CiAJdW5zaWduZWQgbG9uZyBsaW1pdDsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwogCWludCBtYXhfc2hhcmU7CiAJaW50IG9yZGVyOwogCkBAIC0xMTQ4LDE1ICsxMTQ3LDcgQEAKIAkvKiBJbml0aWFsaXplIGhhbmRsZSB1c2VkIGZvciBhc3NvY2lhdGlvbiBpZHMuICovCiAJaWRyX2luaXQoJnNjdHBfYXNzb2NzX2lkKTsKIAotCS8qIFNldCB0aGUgcHJlc3N1cmUgdGhyZXNob2xkIHRvIGJlIGEgZnJhY3Rpb24gb2YgZ2xvYmFsIG1lbW9yeSB0aGF0Ci0JICogaXMgdXAgdG8gMS8yIGF0IDI1NiBNQiwgZGVjcmVhc2luZyB0b3dhcmQgemVybyB3aXRoIHRoZSBhbW91bnQgb2YKLQkgKiBtZW1vcnksIHdpdGggYSBmbG9vciBvZiAxMjggcGFnZXMuCi0JICogTm90ZSB0aGlzIGluaXRpYWxpemVzIHRoZSBkYXRhIGluIHNjdHB2Nl9wcm90IHRvbwotCSAqIFVuYWJhc2hlZGx5IHN0b2xlbiBmcm9tIHRjcF9pbml0Ci0JICovCi0JbnJfcGFnZXMgPSB0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlczsKLQlsaW1pdCA9IG1pbihucl9wYWdlcywgMVVMPDwoMjgtUEFHRV9TSElGVCkpID4+ICgyMC1QQUdFX1NISUZUKTsKLQlsaW1pdCA9IChsaW1pdCAqIChucl9wYWdlcyA+PiAoMjAtUEFHRV9TSElGVCkpKSA+PiAoUEFHRV9TSElGVC0xMSk7CisJbGltaXQgPSBucl9mcmVlX2J1ZmZlcl9wYWdlcygpIC8gODsKIAlsaW1pdCA9IG1heChsaW1pdCwgMTI4VUwpOwogCXN5c2N0bF9zY3RwX21lbVswXSA9IGxpbWl0IC8gNCAqIDM7CiAJc3lzY3RsX3NjdHBfbWVtWzFdID0gbGltaXQ7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKaW5kZXggZDYxMmNhMS4uNmUwZjg4MiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCisrKyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwpAQCAtNjcwLDEwICs2NzAsMTkgQEAKIAkvKiA4LjMgVXBvbiB0aGUgcmVjZWlwdCBvZiB0aGUgSEVBUlRCRUFUIEFDSywgdGhlIHNlbmRlciBvZiB0aGUKIAkgKiBIRUFSVEJFQVQgc2hvdWxkIGNsZWFyIHRoZSBlcnJvciBjb3VudGVyIG9mIHRoZSBkZXN0aW5hdGlvbgogCSAqIHRyYW5zcG9ydCBhZGRyZXNzIHRvIHdoaWNoIHRoZSBIRUFSVEJFQVQgd2FzIHNlbnQuCi0JICogVGhlIGFzc29jaWF0aW9uJ3Mgb3ZlcmFsbCBlcnJvciBjb3VudCBpcyBhbHNvIGNsZWFyZWQuCiAJICovCiAJdC0+ZXJyb3JfY291bnQgPSAwOwotCXQtPmFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPSAwOworCisJLyoKKwkgKiBBbHRob3VnaCBSRkM0OTYwIHNwZWNpZmllcyB0aGF0IHRoZSBvdmVyYWxsIGVycm9yIGNvdW50IG11c3QKKwkgKiBiZSBjbGVhcmVkIHdoZW4gYSBIRUFSVEJFQVQgQUNLIGlzIHJlY2VpdmVkLCB3ZSBtYWtlIGFuCisJICogZXhjZXB0aW9uIHdoaWxlIGluIFNIVVRET1dOIFBFTkRJTkcuIElmIHRoZSBwZWVyIGtlZXBzIGl0cworCSAqIHdpbmRvdyBzaHV0IGZvcmV2ZXIsIHdlIG1heSBuZXZlciBiZSBhYmxlIHRvIHRyYW5zbWl0IG91cgorCSAqIG91dHN0YW5kaW5nIGRhdGEgYW5kIHJlbHkgb24gdGhlIHJldHJhbnNtaXNzaW9uIGxpbWl0IGJlIHJlYWNoZWQKKwkgKiB0byBzaHV0ZG93biB0aGUgYXNzb2NpYXRpb24uCisJICovCisJaWYgKHQtPmFzb2MtPnN0YXRlICE9IFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORykKKwkJdC0+YXNvYy0+b3ZlcmFsbF9lcnJvcl9jb3VudCA9IDA7CiAKIAkvKiBDbGVhciB0aGUgaGJfc2VudCBmbGFnIHRvIHNpZ25hbCB0aGF0IHdlIGhhZCBhIGdvb2QKIAkgKiBhY2tub3dsZWRnZW1lbnQuCkBAIC0xNDM3LDYgKzE0NDYsMTMgQEAKIAkJCXNjdHBfY21kX3NldHVwX3QyKGNvbW1hbmRzLCBhc29jLCBjbWQtPm9iai5wdHIpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBTQ1RQX0NNRF9USU1FUl9TVEFSVF9PTkNFOgorCQkJdGltZXIgPSAmYXNvYy0+dGltZXJzW2NtZC0+b2JqLnRvXTsKKworCQkJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpKQorCQkJCWJyZWFrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKIAkJY2FzZSBTQ1RQX0NNRF9USU1FUl9TVEFSVDoKIAkJCXRpbWVyID0gJmFzb2MtPnRpbWVyc1tjbWQtPm9iai50b107CiAJCQl0aW1lb3V0ID0gYXNvYy0+dGltZW91dHNbY21kLT5vYmoudG9dOwpAQCAtMTY3MCw2ICsxNjg2LDkgQEAKIAkJY2FzZSBTQ1RQX0NNRF9TRU5EX05FWFRfQVNDT05GOgogCQkJc2N0cF9jbWRfc2VuZF9hc2NvbmYoYXNvYyk7CiAJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0NNRF9QVVJHRV9BU0NPTkZfUVVFVUU6CisJCQlzY3RwX2FzY29uZl9xdWV1ZV90ZWFyZG93bihhc29jKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfd2FybigiSW1wb3NzaWJsZSBjb21tYW5kOiAldSwgJXBcbiIsCiAJCQkJY21kLT52ZXJiLCBjbWQtPm9iai5wdHIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCA3ZjRhNGY4Li4yNDYxMTcxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtMTcxOCwxMSArMTcxOCwyMSBAQAogCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOwogCX0KIAotCS8qIEZvciBub3csIGZhaWwgYW55IHVuc2VudC91bmFja2VkIGRhdGEuICBDb25zaWRlciB0aGUgb3B0aW9uYWwKLQkgKiBjaG9pY2Ugb2YgcmVzZW5kaW5nIG9mIHRoaXMgZGF0YS4KKwkvKiBGb3Igbm93LCBzdG9wIHBlbmRpbmcgVDMtcnR4IGFuZCBTQUNLIHRpbWVycywgZmFpbCBhbnkgdW5zZW50L3VuYWNrZWQKKwkgKiBkYXRhLiBDb25zaWRlciB0aGUgb3B0aW9uYWwgY2hvaWNlIG9mIHJlc2VuZGluZyBvZiB0aGlzIGRhdGEuCiAJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9UM19SVFhfVElNRVJTX1NUT1AsIFNDVFBfTlVMTCgpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9TQUNLKSk7CiAJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9QVVJHRV9PVVRRVUVVRSwgU0NUUF9OVUxMKCkpOwogCisJLyogU3RvcCBwZW5kaW5nIFQ0LXJ0byB0aW1lciwgdGVhcmRvd24gQVNDT05GIHF1ZXVlLCBBU0NPTkYtQUNLIHF1ZXVlCisJICogYW5kIEFTQ09ORi1BQ0sgY2FjaGUuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDRfUlRPKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9QVVJHRV9BU0NPTkZfUVVFVUUsIFNDVFBfTlVMTCgpKTsKKwogCXJlcGwgPSBzY3RwX21ha2VfY29va2llX2FjayhuZXdfYXNvYywgY2h1bmspOwogCWlmICghcmVwbCkKIAkJZ290byBub21lbTsKQEAgLTUxNDQsNyArNTE1NCw3IEBACiAJICogVGhlIHNlbmRlciBvZiB0aGUgU0hVVERPV04gTUFZIGFsc28gc3RhcnQgYW4gb3ZlcmFsbCBndWFyZCB0aW1lcgogCSAqICdUNS1zaHV0ZG93bi1ndWFyZCcgdG8gYm91bmQgdGhlIG92ZXJhbGwgdGltZSBmb3Igc2h1dGRvd24gc2VxdWVuY2UuCiAJICovCi0Jc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVEFSVCwKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCiAJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOwogCiAJaWYgKGFzb2MtPmF1dG9jbG9zZSkKQEAgLTUyODksMTQgKzUyOTksMjggQEAKIAlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9UM19SVFhfRVhQSVJFRFMpOwogCiAJaWYgKGFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPj0gYXNvYy0+bWF4X3JldHJhbnMpIHsKLQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAotCQkJCVNDVFBfRVJST1IoRVRJTUVET1VUKSk7Ci0JCS8qIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCi0JCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAotCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7Ci0JCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKLQkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKLQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKKwkJaWYgKGFzb2MtPnN0YXRlID09IFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORykgeworCQkJLyoKKwkJCSAqIFdlIGFyZSBoZXJlIGxpa2VseSBiZWNhdXNlIHRoZSByZWNlaXZlciBoYWQgaXRzIHJ3bmQKKwkJCSAqIGNsb3NlZCBmb3IgYSB3aGlsZSBhbmQgd2UgaGF2ZSBub3QgYmVlbiBhYmxlIHRvCisJCQkgKiB0cmFuc21pdCB0aGUgbG9jYWxseSBxdWV1ZWQgZGF0YSB3aXRoaW4gdGhlIG1heGltdW0KKwkJCSAqIHJldHJhbnNtaXNzaW9uIGF0dGVtcHRzIGxpbWl0LiAgU3RhcnQgdGhlIFQ1CisJCQkgKiBzaHV0ZG93biBndWFyZCB0aW1lciB0byBnaXZlIHRoZSByZWNlaXZlciBvbmUgbGFzdAorCQkJICogY2hhbmNlIGFuZCBzb21lIGFkZGl0aW9uYWwgdGltZSB0byByZWNvdmVyIGJlZm9yZQorCQkJICogYWJvcnRpbmcuCisJCQkgKi8KKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlRfT05DRSwKKwkJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOworCQl9IGVsc2UgeworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAorCQkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOworCQkJLyogQ01EX0FTU09DX0ZBSUxFRCBjYWxscyBDTURfREVMRVRFX1RDQi4gKi8KKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAorCQkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCQkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKwkJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CisJCX0KIAl9CiAKIAkvKiBFMSkgRm9yIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB3aGljaCB0aGUgdGltZXIKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYyBiL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYwppbmRleCAwMzM4ZGM2Li43YzIxMWE3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCkBAIC04MjcsNyArODI3LDcgQEAKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKIAlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCiAJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90NV90aW1lcl9leHBpcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDY3NjY5MTMuLmQzY2NmNzkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC0xMzg0LDYgKzEzODQsNyBAQAogCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOworCXVuc2lnbmVkIGludCBkYXRhX3dhc191bnJlYWQ7CiAKIAlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9jbG9zZShzazogMHglcCwgdGltZW91dDolbGQpXG4iLCBzaywgdGltZW91dCk7CiAKQEAgLTEzOTMsNiArMTM5NCwxMCBAQAogCiAJZXAgPSBzY3RwX3NrKHNrKS0+ZXA7CiAKKwkvKiBDbGVhbiB1cCBhbnkgc2ticyBzaXR0aW5nIG9uIHRoZSByZWNlaXZlIHF1ZXVlLiAgKi8KKwlkYXRhX3dhc191bnJlYWQgPSBzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCWRhdGFfd2FzX3VucmVhZCArPSBzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cygmc2N0cF9zayhzayktPnBkX2xvYmJ5KTsKKwogCS8qIFdhbGsgYWxsIGFzc29jaWF0aW9ucyBvbiBhbiBlbmRwb2ludC4gICovCiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmVwLT5hc29jcykgewogCQlhc29jID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uLCBhc29jcyk7CkBAIC0xNDEwLDcgKzE0MTUsOSBAQAogCQkJfQogCQl9CiAKLQkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpICYmICFzay0+c2tfbGluZ2VydGltZSkgeworCQlpZiAoZGF0YV93YXNfdW5yZWFkIHx8ICFza2JfcXVldWVfZW1wdHkoJmFzb2MtPnVscHEubG9iYnkpIHx8CisJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZhc29jLT51bHBxLnJlYXNtKSB8fAorCQkgICAgKHNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpICYmICFzay0+c2tfbGluZ2VydGltZSkpIHsKIAkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKIAogCQkJY2h1bmsgPSBzY3RwX21ha2VfYWJvcnRfdXNlcihhc29jLCBOVUxMLCAwKTsKQEAgLTE0MjAsMTAgKzE0MjcsNiBAQAogCQkJc2N0cF9wcmltaXRpdmVfU0hVVERPV04oYXNvYywgTlVMTCk7CiAJfQogCi0JLyogQ2xlYW4gdXAgYW55IHNrYnMgc2l0dGluZyBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gICovCi0Jc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQlzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cygmc2N0cF9zayhzayktPnBkX2xvYmJ5KTsKLQogCS8qIE9uIGEgVENQLXN0eWxlIHNvY2tldCwgYmxvY2sgZm9yIGF0IG1vc3QgbGluZ2VyX3RpbWUgaWYgc2V0LiAqLwogCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIHRpbWVvdXQpCiAJCXNjdHBfd2FpdF9mb3JfY2xvc2Uoc2ssIHRpbWVvdXQpOwpAQCAtMjA3MywxMCArMjA3NiwzMyBAQAogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfZXZlbnRzKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKIAkJCQkgIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCiAJaWYgKG9wdGxlbiA+IHNpemVvZihzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY29weV9mcm9tX3VzZXIoJnNjdHBfc2soc2spLT5zdWJzY3JpYmUsIG9wdHZhbCwgb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIEF0IHRoZSB0aW1lIHdoZW4gYSB1c2VyIGFwcCBzdWJzY3JpYmVzIHRvIFNDVFBfU0VOREVSX0RSWV9FVkVOVCwKKwkgKiBpZiB0aGVyZSBpcyBubyBkYXRhIHRvIGJlIHNlbnQgb3IgcmV0cmFuc21pdCwgdGhlIHN0YWNrIHdpbGwKKwkgKiBpbW1lZGlhdGVseSBzZW5kIHVwIHRoaXMgbm90aWZpY2F0aW9uLgorCSAqLworCWlmIChzY3RwX3VscGV2ZW50X3R5cGVfZW5hYmxlZChTQ1RQX1NFTkRFUl9EUllfRVZFTlQsCisJCQkJICAgICAgICZzY3RwX3NrKHNrKS0+c3Vic2NyaWJlKSkgeworCQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgMCk7CisKKwkJaWYgKGFzb2MgJiYgc2N0cF9vdXRxX2lzX2VtcHR5KCZhc29jLT5vdXRxdWV1ZSkpIHsKKwkJCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX3NlbmRlcl9kcnlfZXZlbnQoYXNvYywKKwkJCQkJR0ZQX0FUT01JQyk7CisJCQlpZiAoIWV2ZW50KQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlzY3RwX3VscHFfdGFpbF9ldmVudCgmYXNvYy0+dWxwcSwgZXZlbnQpOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IGU3MGU1ZmMuLjhhODQwMTcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMTA4MSw5ICsxMDgxLDE5IEBACiB9CiAKIC8qIFB1cmdlIHRoZSBza2IgbGlzdHMgaG9sZGluZyB1bHBldmVudHMuICovCi12b2lkIHNjdHBfcXVldWVfcHVyZ2VfdWxwZXZlbnRzKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCit1bnNpZ25lZCBpbnQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUobGlzdCkpICE9IE5VTEwpCi0JCXNjdHBfdWxwZXZlbnRfZnJlZShzY3RwX3NrYjJldmVudChza2IpKTsKKwl1bnNpZ25lZCBpbnQgZGF0YV91bnJlYWQgPSAwOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZShsaXN0KSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCisJCWlmICghc2N0cF91bHBldmVudF9pc19ub3RpZmljYXRpb24oZXZlbnQpKQorCQkJZGF0YV91bnJlYWQgKz0gc2tiLT5sZW47CisKKwkJc2N0cF91bHBldmVudF9mcmVlKGV2ZW50KTsKKwl9CisKKwlyZXR1cm4gZGF0YV91bnJlYWQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggMzM5YmE2NC4uNWRhZjZjYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpAQCAtNTc3LDEzICs1NzcsMTMgQEAKIAl9CiAJaW5vZGUgPSAmZ3NzX21zZy0+aW5vZGUtPnZmc19pbm9kZTsKIAlmb3IgKDs7KSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmZ3NzX21zZy0+d2FpdHF1ZXVlLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJcHJlcGFyZV90b193YWl0KCZnc3NfbXNnLT53YWl0cXVldWUsICZ3YWl0LCBUQVNLX0tJTExBQkxFKTsKIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJaWYgKGdzc19tc2ctPmN0eCAhPSBOVUxMIHx8IGdzc19tc2ctPm1zZy5lcnJubyA8IDApIHsKIAkJCWJyZWFrOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJaWYgKHNpZ25hbGxlZCgpKSB7CisJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJZXJyID0gLUVSRVNUQVJUU1lTOwogCQkJZ290byBvdXRfaW50cjsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwppbmRleCAwYTlhMmVjLi5jM2I3NTMzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaD4KIAogI2lmZGVmIFJQQ19ERUJVRwogIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19BVVRICkBAIC03NTAsNyArNzUxLDcgQEAKIAkuZ21fb3BzCQk9ICZnc3Nfa2VyYmVyb3Nfb3BzLAogCS5nbV9wZl9udW0JPSBBUlJBWV9TSVpFKGdzc19rZXJiZXJvc19wZnMpLAogCS5nbV9wZnMJCT0gZ3NzX2tlcmJlcm9zX3BmcywKLQkuZ21fdXBjYWxsX2VuY3R5cGVzID0gIjE4LDE3LDE2LDIzLDMsMSwyIiwKKwkuZ21fdXBjYWxsX2VuY3R5cGVzID0gS1JCNV9TVVBQT1JURURfRU5DVFlQRVMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2tlcmJlcm9zX21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCBiODRkNzM5Li44YzkxNDE1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtMTA2MSw3ICsxMDYxLDcgQEAKIAogCWRwcmludGsoIlJQQzogJTV1IHJwY19idWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIHRhc2stPnRrX3BpZCk7CiAKLQlpZiAoUlBDX0lTX0FTWU5DKHRhc2spIHx8ICFzaWduYWxsZWQoKSkgeworCWlmIChSUENfSVNfQVNZTkModGFzaykgfHwgIWZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfYWxsb2NhdGU7CiAJCXJwY19kZWxheSh0YXNrLCBIWj4+NCk7CiAJCXJldHVybjsKQEAgLTExNzUsNiArMTE3NSw5IEBACiAJCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKIAkJCWJyZWFrOwogCQl9CisJCWlmICh0YXNrLT50a19yZWJpbmRfcmV0cnkgPT0gMCkKKwkJCWJyZWFrOworCQl0YXNrLT50a19yZWJpbmRfcmV0cnktLTsKIAkJcnBjX2RlbGF5KHRhc2ssIDMqSFopOwogCQlnb3RvIHJldHJ5X3RpbWVvdXQ7CiAJY2FzZSAtRVRJTUVET1VUOgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKaW5kZXggOWE4MGE5Mi4uZTQ1ZDJmYiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYworKysgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAl1MzIgYmluZF92ZXJzaW9uOwogCXN0cnVjdCBycGNfeHBydCAqeHBydDsKIAlzdHJ1Y3QgcnBjX2NsbnQJKnJwY2JfY2xudDsKLQlzdGF0aWMgc3RydWN0IHJwY2JpbmRfYXJncyAqbWFwOworCXN0cnVjdCBycGNiaW5kX2FyZ3MgKm1hcDsKIAlzdHJ1Y3QgcnBjX3Rhc2sJKmNoaWxkOwogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CiAJc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3NjaGVkLmMgYi9uZXQvc3VucnBjL3NjaGVkLmMKaW5kZXggNmI0M2VlNy4uNDgxNGUyNCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zY2hlZC5jCisrKyBiL25ldC9zdW5ycGMvc2NoZWQuYwpAQCAtNjE2LDMwICs2MTYsMjUgQEAKIAlCVUdfT04oUlBDX0lTX1FVRVVFRCh0YXNrKSk7CiAKIAlmb3IgKDs7KSB7CisJCXZvaWQgKCpkb19hY3Rpb24pKHN0cnVjdCBycGNfdGFzayAqKTsKIAogCQkvKgotCQkgKiBFeGVjdXRlIGFueSBwZW5kaW5nIGNhbGxiYWNrLgorCQkgKiBFeGVjdXRlIGFueSBwZW5kaW5nIGNhbGxiYWNrIGZpcnN0LgogCQkgKi8KLQkJaWYgKHRhc2stPnRrX2NhbGxiYWNrKSB7Ci0JCQl2b2lkICgqc2F2ZV9jYWxsYmFjaykoc3RydWN0IHJwY190YXNrICopOwotCi0JCQkvKgotCQkJICogV2Ugc2V0IHRrX2NhbGxiYWNrIHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcgaXQsCi0JCQkgKiBpbiBjYXNlIGl0IHNldHMgdGhlIHRrX2NhbGxiYWNrIGZpZWxkIGl0c2VsZjoKLQkJCSAqLwotCQkJc2F2ZV9jYWxsYmFjayA9IHRhc2stPnRrX2NhbGxiYWNrOwotCQkJdGFzay0+dGtfY2FsbGJhY2sgPSBOVUxMOwotCQkJc2F2ZV9jYWxsYmFjayh0YXNrKTsKLQkJfSBlbHNlIHsKKwkJZG9fYWN0aW9uID0gdGFzay0+dGtfY2FsbGJhY2s7CisJCXRhc2stPnRrX2NhbGxiYWNrID0gTlVMTDsKKwkJaWYgKGRvX2FjdGlvbiA9PSBOVUxMKSB7CiAJCQkvKgogCQkJICogUGVyZm9ybSB0aGUgbmV4dCBGU00gc3RlcC4KLQkJCSAqIHRrX2FjdGlvbiBtYXkgYmUgTlVMTCB3aGVuIHRoZSB0YXNrIGhhcyBiZWVuIGtpbGxlZAotCQkJICogYnkgc29tZW9uZSBlbHNlLgorCQkJICogdGtfYWN0aW9uIG1heSBiZSBOVUxMIGlmIHRoZSB0YXNrIGhhcyBiZWVuIGtpbGxlZC4KKwkJCSAqIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCBycGNfa2lsbGFsbF90YXNrcyBtYXkKKwkJCSAqIGRvIHRoaXMgYXQgYW55IHRpbWUsIHNvIGJld2FyZSB3aGVuIGRlcmVmZXJlbmNpbmcuCiAJCQkgKi8KLQkJCWlmICh0YXNrLT50a19hY3Rpb24gPT0gTlVMTCkKKwkJCWRvX2FjdGlvbiA9IHRhc2stPnRrX2FjdGlvbjsKKwkJCWlmIChkb19hY3Rpb24gPT0gTlVMTCkKIAkJCQlicmVhazsKLQkJCXRhc2stPnRrX2FjdGlvbih0YXNrKTsKIAkJfQorCQlkb19hY3Rpb24odGFzayk7CiAKIAkJLyoKIAkJICogTG9ja2xlc3MgY2hlY2sgZm9yIHdoZXRoZXIgdGFzayBpcyBzbGVlcGluZyBvciBub3QuCkBAIC03OTIsNiArNzg3LDcgQEAKIAkvKiBJbml0aWFsaXplIHJldHJ5IGNvdW50ZXJzICovCiAJdGFzay0+dGtfZ2FyYl9yZXRyeSA9IDI7CiAJdGFzay0+dGtfY3JlZF9yZXRyeSA9IDI7CisJdGFzay0+dGtfcmViaW5kX3JldHJ5ID0gMjsKIAogCXRhc2stPnRrX3ByaW9yaXR5ID0gdGFza19zZXR1cF9kYXRhLT5wcmlvcml0eSAtIFJQQ19QUklPUklUWV9MT1c7CiAJdGFzay0+dGtfb3duZXIgPSBjdXJyZW50LT50Z2lkOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuYyBiL25ldC93aXJlbGVzcy9jb3JlLmMKaW5kZXggYzIyZWYzNC4uODgwZGJlMiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuYworKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC0zNjYsNiArMzY2LDcgQEAKIAogCW11dGV4X2luaXQoJnJkZXYtPm10eCk7CiAJbXV0ZXhfaW5pdCgmcmRldi0+ZGV2bGlzdF9tdHgpOworCW11dGV4X2luaXQoJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAlJTklUX0xJU1RfSEVBRCgmcmRldi0+bmV0ZGV2X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZyZGV2LT5ic3NfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmJzc19saXN0KTsKQEAgLTcwMSw2ICs3MDIsNyBAQAogCXJma2lsbF9kZXN0cm95KHJkZXYtPnJma2lsbCk7CiAJbXV0ZXhfZGVzdHJveSgmcmRldi0+bXR4KTsKIAltdXRleF9kZXN0cm95KCZyZGV2LT5kZXZsaXN0X210eCk7CisJbXV0ZXhfZGVzdHJveSgmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzY2FuLCB0bXAsICZyZGV2LT5ic3NfbGlzdCwgbGlzdCkKIAkJY2ZnODAyMTFfcHV0X2Jzcygmc2Nhbi0+cHViKTsKIAljZmc4MDIxMV9yZGV2X2ZyZWVfd293bGFuKHJkZXYpOwpAQCAtNzM3LDEyICs3MzksMTYgQEAKIAkJX19fY2ZnODAyMTFfc2Nhbl9kb25lKHJkZXYsIHRydWUpOwogCX0KIAorCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCisJbXV0ZXhfbG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOworCiAJaWYgKFdBUk5fT04ocmRldi0+c2NoZWRfc2Nhbl9yZXEgJiYKIAkJICAgIHJkZXYtPnNjaGVkX3NjYW5fcmVxLT5kZXYgPT0gd2Rldi0+bmV0ZGV2KSkgewogCQlfX2NmZzgwMjExX3N0b3Bfc2NoZWRfc2NhbihyZGV2LCBmYWxzZSk7CiAJfQogCi0JY2ZnODAyMTFfdW5sb2NrX3JkZXYocmRldik7CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAKIAltdXRleF9sb2NrKCZyZGV2LT5kZXZsaXN0X210eCk7CiAJcmRldi0+b3BlbmNvdW50LS07CkBAIC04MzAsOSArODM2LDkgQEAKIAkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJCWNmZzgwMjExX2xvY2tfcmRldihyZGV2KTsKKwkJCW11dGV4X2xvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAkJCV9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHJkZXYsIGZhbHNlKTsKLQkJCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAKIAkJCXdkZXZfbG9jayh3ZGV2KTsKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuaCBiL25ldC93aXJlbGVzcy9jb3JlLmgKaW5kZXggM2RjZTFmMS4uYTU3MGZmOSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuaAorKysgYi9uZXQvd2lyZWxlc3MvY29yZS5oCkBAIC02NSw2ICs2NSw4IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fZG9uZV93azsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2NoZWRfc2Nhbl9yZXN1bHRzX3drOwogCisJc3RydWN0IG11dGV4IHNjaGVkX3NjYW5fbXR4OworCiAjaWZkZWYgQ09ORklHX05MODAyMTFfVEVTVE1PREUKIAlzdHJ1Y3QgZ2VubF9pbmZvICp0ZXN0bW9kZV9pbmZvOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCBlYzgzZjQxLi5jZWEzMzgxIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTM0MDYsMTIgKzM0MDYsMTIgQEAKIAlpID0gMDsKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NDQU5fU1NJRFNdKSB7CiAJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NDQU5fU1NJRFNdLCB0bXApIHsKLQkJCWlmIChyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKKwkJCWlmIChubGFfbGVuKGF0dHIpID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KLQkJCW1lbWNweShyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLCBubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSk7CiAJCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7CisJCQltZW1jcHkocmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwgbmxhX2RhdGEoYXR0ciksIG5sYV9sZW4oYXR0cikpOwogCQkJaSsrOwogCQl9CiAJfQpAQCAtMzQ2MSw5ICszNDYxLDYgQEAKIAlpZiAoIWlzX3ZhbGlkX2llX2F0dHIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0lFXSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHJkZXYtPnNjaGVkX3NjYW5fcmVxKQotCQlyZXR1cm4gLUVJTlBST0dSRVNTOwotCiAJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9JTlRFUlZBTF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNTAyLDEyICszNDk5LDIxIEBACiAJaWYgKGllX2xlbiA+IHdpcGh5LT5tYXhfc2Nhbl9pZV9sZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOworCisJaWYgKHJkZXYtPnNjaGVkX3NjYW5fcmVxKSB7CisJCWVyciA9IC1FSU5QUk9HUkVTUzsKKwkJZ290byBvdXQ7CisJfQorCiAJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KQogCQkJKyBzaXplb2YoKnJlcXVlc3QtPnNzaWRzKSAqIG5fc3NpZHMKIAkJCSsgc2l6ZW9mKCpyZXF1ZXN0LT5jaGFubmVscykgKiBuX2NoYW5uZWxzCiAJCQkrIGllX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXF1ZXN0KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXJlcXVlc3QpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCiAJaWYgKG5fc3NpZHMpCiAJCXJlcXVlc3QtPnNzaWRzID0gKHZvaWQgKikmcmVxdWVzdC0+Y2hhbm5lbHNbbl9jaGFubmVsc107CkBAIC0zNTcyLDE0ICszNTc4LDEzIEBACiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSkgewogCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSwKIAkJCQkgICAgdG1wKSB7Ci0JCQlpZiAocmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4gPgotCQkJICAgIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKKwkJCWlmIChubGFfbGVuKGF0dHIpID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KKwkJCXJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuID0gbmxhX2xlbihhdHRyKTsKIAkJCW1lbWNweShyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLCBubGFfZGF0YShhdHRyKSwKIAkJCSAgICAgICBubGFfbGVuKGF0dHIpKTsKLQkJCXJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuID0gbmxhX2xlbihhdHRyKTsKIAkJCWkrKzsKIAkJfQogCX0KQEAgLTM2MDYsNiArMzYxMSw3IEBACiBvdXRfZnJlZToKIAlrZnJlZShyZXF1ZXN0KTsKIG91dDoKKwltdXRleF91bmxvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNjEzLDEyICszNjE5LDE3IEBACiAJCQkJICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlpbnQgZXJyOwogCiAJaWYgKCEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1NDSEVEX1NDQU4pIHx8CiAJICAgICFyZGV2LT5vcHMtPnNjaGVkX3NjYW5fc3RvcCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0dXJuIF9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHJkZXYsIGZhbHNlKTsKKwltdXRleF9sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CisJZXJyID0gX19jZmc4MDIxMV9zdG9wX3NjaGVkX3NjYW4ocmRldiwgZmFsc2UpOworCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBubDgwMjExX3NlbmRfYnNzKHN0cnVjdCBza19idWZmICptc2csIHUzMiBwaWQsIHUzMiBzZXEsIGludCBmbGFncywKQEAgLTY0NjQsNyArNjQ3NSw4IEBACiAJaWYgKGFkZHIpCiAJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYWRkcik7CiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfS0VZX1RZUEUsIGtleV90eXBlKTsKLQlOTEFfUFVUX1U4KG1zZywgTkw4MDIxMV9BVFRSX0tFWV9JRFgsIGtleV9pZCk7CisJaWYgKGtleV9pZCAhPSAtMSkKKwkJTkxBX1BVVF9VOChtc2csIE5MODAyMTFfQVRUUl9LRVlfSURYLCBrZXlfaWQpOwogCWlmICh0c2MpCiAJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfS0VZX1NFUSwgNiwgdHNjKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NjYW4uYyBiL25ldC93aXJlbGVzcy9zY2FuLmMKaW5kZXggNzNhNDQxZC4uYWUwYzIyNSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NjYW4uYworKysgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCkBAIC0xMDAsMTQgKzEwMCwxNCBAQAogCXJkZXYgPSBjb250YWluZXJfb2Yod2ssIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSwKIAkJCSAgICBzY2hlZF9zY2FuX3Jlc3VsdHNfd2spOwogCi0JY2ZnODAyMTFfbG9ja19yZGV2KHJkZXYpOworCW11dGV4X2xvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAogCS8qIHdlIGRvbid0IGhhdmUgc2NoZWRfc2Nhbl9yZXEgYW55bW9yZSBpZiB0aGUgc2NhbiBpcyBzdG9wcGluZyAqLwogCWlmIChyZGV2LT5zY2hlZF9zY2FuX3JlcSkKIAkJbmw4MDIxMV9zZW5kX3NjaGVkX3NjYW5fcmVzdWx0cyhyZGV2LAogCQkJCQkJcmRldi0+c2NoZWRfc2Nhbl9yZXEtPmRldik7CiAKLQljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKwltdXRleF91bmxvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIH0KIAogdm9pZCBjZmc4MDIxMV9zY2hlZF9zY2FuX3Jlc3VsdHMoc3RydWN0IHdpcGh5ICp3aXBoeSkKQEAgLTEyMyw5ICsxMjMsOSBAQAogewogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CiAKLQljZmc4MDIxMV9sb2NrX3JkZXYocmRldik7CisJbXV0ZXhfbG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCV9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHJkZXYsIHRydWUpOwotCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQpOwogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKLQlBU1NFUlRfUkRFVl9MT0NLKHJkZXYpOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAogCWlmICghcmRldi0+c2NoZWRfc2Nhbl9yZXEpCiAJCXJldHVybiAwOwpAQCAtMjY3LDEzICsyNjcsMzUgQEAKIAlyZXR1cm4gbWVtY21wKHNzaWRpZSArIDIsIHNzaWQsIHNzaWRfbGVuKSA9PSAwOwogfQogCitzdGF0aWMgYm9vbCBpc19tZXNoX2JzcyhzdHJ1Y3QgY2ZnODAyMTFfYnNzICphKQoreworCWNvbnN0IHU4ICppZTsKKworCWlmICghV0xBTl9DQVBBQklMSVRZX0lTX1NUQV9CU1MoYS0+Y2FwYWJpbGl0eSkpCisJCXJldHVybiBmYWxzZTsKKworCWllID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9NRVNIX0lELAorCQkJICAgICAgYS0+aW5mb3JtYXRpb25fZWxlbWVudHMsCisJCQkgICAgICBhLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMpOworCWlmICghaWUpCisJCXJldHVybiBmYWxzZTsKKworCWllID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9NRVNIX0NPTkZJRywKKwkJCSAgICAgIGEtPmluZm9ybWF0aW9uX2VsZW1lbnRzLAorCQkJICAgICAgYS0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKKwlpZiAoIWllKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIGJvb2wgaXNfbWVzaChzdHJ1Y3QgY2ZnODAyMTFfYnNzICphLAogCQkgICAgY29uc3QgdTggKm1lc2hpZCwgc2l6ZV90IG1lc2hpZGxlbiwKIAkJICAgIGNvbnN0IHU4ICptZXNoY2ZnKQogewogCWNvbnN0IHU4ICppZTsKIAotCWlmICghV0xBTl9DQVBBQklMSVRZX0lTX01CU1MoYS0+Y2FwYWJpbGl0eSkpCisJaWYgKCFXTEFOX0NBUEFCSUxJVFlfSVNfU1RBX0JTUyhhLT5jYXBhYmlsaXR5KSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWUgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX01FU0hfSUQsCkBAIC0zMTEsNyArMzMzLDcgQEAKIAlpZiAoYS0+Y2hhbm5lbCAhPSBiLT5jaGFubmVsKQogCQlyZXR1cm4gYi0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXEgLSBhLT5jaGFubmVsLT5jZW50ZXJfZnJlcTsKIAotCWlmIChXTEFOX0NBUEFCSUxJVFlfSVNfTUJTUyhhLT5jYXBhYmlsaXR5IHwgYi0+Y2FwYWJpbGl0eSkpIHsKKwlpZiAoaXNfbWVzaF9ic3MoYSkgJiYgaXNfbWVzaF9ic3MoYikpIHsKIAkJciA9IGNtcF9pZXMoV0xBTl9FSURfTUVTSF9JRCwKIAkJCSAgICBhLT5pbmZvcm1hdGlvbl9lbGVtZW50cywKIAkJCSAgICBhLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMsCkBAIC00NTcsNyArNDc5LDYgQEAKIAkJICAgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKnJlcykKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpmb3VuZCA9IE5VTEw7Ci0JY29uc3QgdTggKm1lc2hpZCwgKm1lc2hjZmc7CiAKIAkvKgogCSAqIFRoZSByZWZlcmVuY2UgdG8gInJlcyIgaXMgZG9uYXRlZCB0byB0aGlzIGZ1bmN0aW9uLgpAQCAtNDcwLDIyICs0OTEsNiBAQAogCiAJcmVzLT50cyA9IGppZmZpZXM7CiAKLQlpZiAoV0xBTl9DQVBBQklMSVRZX0lTX01CU1MocmVzLT5wdWIuY2FwYWJpbGl0eSkpIHsKLQkJLyogbXVzdCBiZSBtZXNoLCB2ZXJpZnkgKi8KLQkJbWVzaGlkID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9NRVNIX0lELAotCQkJCQkgIHJlcy0+cHViLmluZm9ybWF0aW9uX2VsZW1lbnRzLAotCQkJCQkgIHJlcy0+cHViLmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7Ci0JCW1lc2hjZmcgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX01FU0hfQ09ORklHLAotCQkJCQkgICByZXMtPnB1Yi5pbmZvcm1hdGlvbl9lbGVtZW50cywKLQkJCQkJICAgcmVzLT5wdWIubGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKLQkJaWYgKCFtZXNoaWQgfHwgIW1lc2hjZmcgfHwKLQkJICAgIG1lc2hjZmdbMV0gIT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpKSB7Ci0JCQkvKiBib2d1cyBtZXNoICovCi0JCQlrcmVmX3B1dCgmcmVzLT5yZWYsIGJzc19yZWxlYXNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCiAJc3Bpbl9sb2NrX2JoKCZkZXYtPmJzc19sb2NrKTsKIAogCWZvdW5kID0gcmJfZmluZF9ic3MoZGV2LCByZXMpOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggOWJlYzJlOC4uNWNlNzRhMyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyk7CiBzdGF0aWMgdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKLXN0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICp4ZHN0LCBpbnQgZmFtaWx5KTsKK3N0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICp4ZHN0KTsKIAogCiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICpfX3hmcm1fcG9saWN5X3VubGluayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwKQEAgLTIyNDEsNyArMjI0MSw3IEBACiAKIHN0YXRpYyBpbnQgc3RhbGVfYnVuZGxlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQlyZXR1cm4gIXhmcm1fYnVuZGxlX29rKChzdHJ1Y3QgeGZybV9kc3QgKilkc3QsIEFGX1VOU1BFQyk7CisJcmV0dXJuICF4ZnJtX2J1bmRsZV9vaygoc3RydWN0IHhmcm1fZHN0ICopZHN0KTsKIH0KIAogdm9pZCB4ZnJtX2RzdF9pZmRvd24oc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjMxMyw3ICsyMzEzLDcgQEAKICAqIHN0aWxsIHZhbGlkLgogICovCiAKLXN0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICpmaXJzdCwgaW50IGZhbWlseSkKK3N0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICpmaXJzdCkKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSAmZmlyc3QtPnUuZHN0OwogCXN0cnVjdCB4ZnJtX2RzdCAqbGFzdDsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMgYi9uZXQveGZybS94ZnJtX3JlcGxheS5jCmluZGV4IDQ3ZjFiODYuLmIxMWVhNjkgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKKysrIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJCQliaXRuciA9IGJpdG5yICYgMHgxRjsKIAkJCXJlcGxheV9lc24tPmJtcFtucl0gfD0gKDFVIDw8IGJpdG5yKTsKIAkJfSBlbHNlIHsKLQkJCW5yID0gcmVwbGF5X2Vzbi0+cmVwbGF5X3dpbmRvdyA+PiA1OworCQkJbnIgPSAocmVwbGF5X2Vzbi0+cmVwbGF5X3dpbmRvdyAtIDEpID4+IDU7CiAJCQlmb3IgKGkgPSAwOyBpIDw9IG5yOyBpKyspCiAJCQkJcmVwbGF5X2Vzbi0+Ym1wW2ldID0gMDsKIApAQCAtNDcxLDcgKzQ3MSw3IEBACiAJCQliaXRuciA9IGJpdG5yICYgMHgxRjsKIAkJCXJlcGxheV9lc24tPmJtcFtucl0gfD0gKDFVIDw8IGJpdG5yKTsKIAkJfSBlbHNlIHsKLQkJCW5yID0gcmVwbGF5X2Vzbi0+cmVwbGF5X3dpbmRvdyA+PiA1OworCQkJbnIgPSAocmVwbGF5X2Vzbi0+cmVwbGF5X3dpbmRvdyAtIDEpID4+IDU7CiAJCQlmb3IgKGkgPSAwOyBpIDw9IG5yOyBpKyspCiAJCQkJcmVwbGF5X2Vzbi0+Ym1wW2ldID0gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCmluZGV4IGQ3MGY4NWUuLjk0MTRiOWMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTEzNDUsNiArMTM0NSw4IEBACiAJCQl4ZnJtX3N0YXRlX2NoZWNrX2V4cGlyZSh4MSk7CiAKIAkJZXJyID0gMDsKKwkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CisJCV9feGZybV9zdGF0ZV9wdXQoeCk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZ4MS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuYXNtLWdlbmVyaWMgYi9zY3JpcHRzL01ha2VmaWxlLmFzbS1nZW5lcmljCmluZGV4IDQ5MDEyMmMuLjQwY2FmM2MgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYXNtLWdlbmVyaWMKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5hc20tZ2VuZXJpYwpAQCAtMTcsNiArMTcsNyBAQAogY21kX3dyYXAgPSBlY2hvICJcI2luY2x1ZGUgPGFzbS1nZW5lcmljLyQqLmg+IiA+JEAKIAogYWxsOiAkKHBhdHN1YnN0ICUsICQob2JqKS8lLCAkKGdlbmVyaWMteSkpCisJQDoKIAogJChvYmopLyUuaDoKIAkkKGNhbGwgY21kLHdyYXApCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggODY1N2Y5OS4uYjBhYTJjNiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMTk0Myw2ICsxOTQzLDExIEBACiAJCQlXQVJOKCJMSU5VWF9WRVJTSU9OX0NPREUgc2hvdWxkIGJlIGF2b2lkZWQsIGNvZGUgc2hvdWxkIGJlIGZvciB0aGUgdmVyc2lvbiB0byB3aGljaCBpdCBpcyBtZXJnZWRcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKKyMgY2hlY2sgZm9yIHVzZXMgb2YgcHJpbnRrX3JhdGVsaW1pdAorCQlpZiAoJGxpbmUgPX4gL1xicHJpbnRrX3JhdGVsaW1pdFxzKlwoLykgeworCQkJV0FSTigiUHJlZmVyIHByaW50a19yYXRlbGltaXRlZCBvciBwcl88bGV2ZWw+X3JhdGVsaW1pdGVkIHRvIHByaW50a19yYXRlbGltaXRcbiIgLiAkaGVyZWN1cnIpOworCQl9CisKICMgcHJpbnRrIHNob3VsZCB1c2UgS0VSTl8qIGxldmVscy4gIE5vdGUgdGhhdCBmb2xsb3cgb24gcHJpbnRrJ3Mgb24gdGhlCiAjIHNhbWUgbGluZSBkbyBub3QgbmVlZCBhIGxldmVsLCBzbyB3ZSB1c2UgdGhlIGN1cnJlbnQgYmxvY2sgY29udGV4dAogIyB0byB0cnkgYW5kIGZpbmQgYW5kIHZhbGlkYXRlIHRoZSBjdXJyZW50IHByaW50ay4gIEluIHN1bW1hcnkgdGhlIGN1cnJlbnQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZGVwbW9kLnNoIGIvc2NyaXB0cy9kZXBtb2Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI3MjM1NgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZGVwbW9kLnNoCkBAIC0wLDAgKzEsNTAgQEAKKyMhL2Jpbi9zaAorIworIyBBIGRlcG1vZCB3cmFwcGVyIHVzZWQgYnkgdGhlIHRvcGxldmVsIE1ha2VmaWxlCisKK2lmIHRlc3QgJCMgLW5lIDI7IHRoZW4KKwllY2hvICJVc2FnZTogJDAgL3NiaW4vZGVwbW9kIDxrZXJuZWxyZWxlYXNlPiIgPiYyCisJZXhpdCAxCitmaQorREVQTU9EPSQxCitLRVJORUxSRUxFQVNFPSQyCisKK2lmICEgIiRERVBNT0QiIC1WIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSBtb2R1bGUtaW5pdC10b29sczsgdGhlbgorCWVjaG8gIldhcm5pbmc6IHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIG1vZHVsZS1pbml0LXRvb2xzIiA+JjIKKwllY2hvICJTZWUgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9kb2NzL3Bvc3QtaGFsbG93ZWVuLTIuNi50eHQiID4mMgorCXNsZWVwIDEKK2ZpCisKK2lmICEgdGVzdCAtciBTeXN0ZW0ubWFwIC1hIC14ICIkREVQTU9EIjsgdGhlbgorCWV4aXQgMAorZmkKKyMgb2xkZXIgdmVyc2lvbnMgb2YgZGVwbW9kIHJlcXVpcmUgdGhlIHZlcnNpb24gc3RyaW5nIHRvIHN0YXJ0IHdpdGggdGhyZWUKKyMgbnVtYmVycywgc28gd2UgY2hlYXQgd2l0aCBhIHN5bWxpbmsgaGVyZQorZGVwbW9kX2hhY2tfbmVlZGVkPXRydWUKK3RtcF9kaXI9JChta3RlbXAgLWQgJHtUTVBESVI6LS90bXB9L2RlcG1vZC5YWFhYWFgpCitta2RpciAtcCAiJHRtcF9kaXIvbGliL21vZHVsZXMvJEtFUk5FTFJFTEVBU0UiCitpZiAiJERFUE1PRCIgLWIgIiR0bXBfZGlyIiAkS0VSTkVMUkVMRUFTRSAyPi9kZXYvbnVsbDsgdGhlbgorCWlmIHRlc3QgLWUgIiR0bXBfZGlyL2xpYi9tb2R1bGVzLyRLRVJORUxSRUxFQVNFL21vZHVsZXMuZGVwIiAtbyBcCisJCS1lICIkdG1wX2Rpci9saWIvbW9kdWxlcy8kS0VSTkVMUkVMRUFTRS9tb2R1bGVzLmRlcC5iaW4iOyB0aGVuCisJCWRlcG1vZF9oYWNrX25lZWRlZD1mYWxzZQorCWZpCitmaQorcm0gLXJmICIkdG1wX2RpciIKK2lmICRkZXBtb2RfaGFja19uZWVkZWQ7IHRoZW4KKwlzeW1saW5rPSIkSU5TVEFMTF9NT0RfUEFUSC9saWIvbW9kdWxlcy85OS45OC4kS0VSTkVMUkVMRUFTRSIKKwlsbiAtcyAiJEtFUk5FTFJFTEVBU0UiICIkc3ltbGluayIKKwlLRVJORUxSRUxFQVNFPTk5Ljk4LiRLRVJORUxSRUxFQVNFCitmaQorCitzZXQgLS0gLWFlIC1GIFN5c3RlbS5tYXAKK2lmIHRlc3QgLW4gIiRJTlNUQUxMX01PRF9QQVRIIjsgdGhlbgorCXNldCAtLSAiJEAiIC1iICIkSU5TVEFMTF9NT0RfUEFUSCIKK2ZpCisiJERFUE1PRCIgIiRAIiAiJEtFUk5FTFJFTEVBU0UiCityZXQ9JD8KKworaWYgJGRlcG1vZF9oYWNrX25lZWRlZDsgdGhlbgorCXJtIC1mICIkc3ltbGluayIKK2ZpCisKK2V4aXQgJHJldApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmMgYi9zZWN1cml0eS9hcHBhcm1vci9sc20uYwppbmRleCBhZTNhNjk4Li4zZDJmZDE0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci9sc20uYworKysgYi9zZWN1cml0eS9hcHBhcm1vci9sc20uYwpAQCAtNTkzLDcgKzU5Myw4IEBACiAJCQlzYS5hYWQub3AgPSBPUF9TRVRQUk9DQVRUUjsKIAkJCXNhLmFhZC5pbmZvID0gbmFtZTsKIAkJCXNhLmFhZC5lcnJvciA9IC1FSU5WQUw7Ci0JCQlyZXR1cm4gYWFfYXVkaXQoQVVESVRfQVBQQVJNT1JfREVOSUVELCBOVUxMLCBHRlBfS0VSTkVMLAorCQkJcmV0dXJuIGFhX2F1ZGl0KEFVRElUX0FQUEFSTU9SX0RFTklFRCwKKwkJCQkJX19hYV9jdXJyZW50X3Byb2ZpbGUoKSwgR0ZQX0tFUk5FTCwKIAkJCQkJJnNhLCBOVUxMKTsKIAkJfQogCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJleGVjIikgPT0gMCkgewpAQCAtNjExLDcgKzYxMiw3IEBACiBzdGF0aWMgaW50IGFwcGFybW9yX3Rhc2tfc2V0cmxpbWl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJdW5zaWduZWQgaW50IHJlc291cmNlLCBzdHJ1Y3QgcmxpbWl0ICpuZXdfcmxpbSkKIHsKLQlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IGFhX2N1cnJlbnRfcHJvZmlsZSgpOworCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlID0gX19hYV9jdXJyZW50X3Byb2ZpbGUoKTsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKCF1bmNvbmZpbmVkKHByb2ZpbGUpKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jIGIvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCmluZGV4IGNkMWY3NzkuLjFiZTY4MjYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYworKysgYi9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKQEAgLTQ3NCwxNyArNDc0LDExIEBACiAJLnN1YnN5c19pZCA9IGRldmljZXNfc3Vic3lzX2lkLAogfTsKIAotaW50IGRldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoraW50IF9fZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CiAJc3RydWN0IGRldl9jZ3JvdXAgKmRldl9jZ3JvdXA7CiAJc3RydWN0IGRldl93aGl0ZWxpc3RfaXRlbSAqd2g7CiAKLQlkZXZfdCBkZXZpY2UgPSBpbm9kZS0+aV9yZGV2OwotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gMDsKLQlpZiAoIVNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCi0JCXJldHVybiAwOwotCiAJcmN1X3JlYWRfbG9jaygpOwogCiAJZGV2X2Nncm91cCA9IHRhc2tfZGV2Y2dyb3VwKGN1cnJlbnQpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCmluZGV4IGQzMTg2MmUuLjgyNDY1MzIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYworKysgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKQEAgLTcxLDkgKzcxLDggQEAKICAqIFRoaXMgaXMgY2FsbGVkIGluIGNvbnRleHQgb2YgZnJlc2hseSBmb3JrZWQga3RocmVhZCBiZWZvcmUga2VybmVsX2V4ZWN2ZSgpLAogICogc28gd2UgY2FuIHNpbXBseSBpbnN0YWxsIHRoZSBkZXNpcmVkIHNlc3Npb25fa2V5cmluZyBhdCB0aGlzIHBvaW50LgogICovCi1zdGF0aWMgaW50IHVtaF9rZXlzX2luaXQoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdW1oX2tleXNfaW5pdChzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKIHsKLQlzdHJ1Y3QgY3JlZCAqY3JlZCA9IChzdHJ1Y3QgY3JlZCopY3VycmVudF9jcmVkKCk7CiAJc3RydWN0IGtleSAqa2V5cmluZyA9IGluZm8tPmRhdGE7CiAKIAlyZXR1cm4gaW5zdGFsbF9zZXNzaW9uX2tleXJpbmdfdG9fY3JlZChjcmVkLCBrZXlyaW5nKTsKQEAgLTQ3MCw3ICs0NjksNyBAQAogCX0gZWxzZSBpZiAocmV0ID09IC1FSU5QUk9HUkVTUykgewogCQlyZXQgPSAwOwogCX0gZWxzZSB7Ci0JCWtleSA9IEVSUl9QVFIocmV0KTsKKwkJZ290byBjb3VsZG50X2FsbG9jX2tleTsKIAl9CiAKIAlrZXlfcHV0KGRlc3Rfa2V5cmluZyk7CkBAIC00ODAsNiArNDc5LDcgQEAKIGNvbnN0cnVjdGlvbl9mYWlsZWQ6CiAJa2V5X25lZ2F0ZV9hbmRfbGluayhrZXksIGtleV9uZWdhdGl2ZV90aW1lb3V0LCBOVUxMLCBOVUxMKTsKIAlrZXlfcHV0KGtleSk7Citjb3VsZG50X2FsbG9jX2tleToKIAlrZXlfcHV0KGRlc3Rfa2V5cmluZyk7CiAJa2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCBhMGQzODQ1Li4yMDIxOWVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xNDc2LDcgKzE0NzYsNiBAQAogCQkJICB1bnNpZ25lZCBmbGFncykKIHsKIAlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjOwotCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhZDsKIAl1MzIgc2lkOwogCiAJdmFsaWRhdGVfY3JlZHMoY3JlZCk7CkBAIC0xNDg3LDE1ICsxNDg2LDIxIEBACiAJc2lkID0gY3JlZF9zaWQoY3JlZCk7CiAJaXNlYyA9IGlub2RlLT5pX3NlY3VyaXR5OwogCi0JaWYgKCFhZHApIHsKLQkJYWRwID0gJmFkOwotCQlDT01NT05fQVVESVRfREFUQV9JTklUKCZhZCwgSU5PREUpOwotCQlhZC51Lmlub2RlID0gaW5vZGU7Ci0JfQotCiAJcmV0dXJuIGF2Y19oYXNfcGVybV9mbGFncyhzaWQsIGlzZWMtPnNpZCwgaXNlYy0+c2NsYXNzLCBwZXJtcywgYWRwLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgaW5vZGVfaGFzX3Blcm1fbm9hZHAoY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQl1MzIgcGVybXMsCisJCQkJdW5zaWduZWQgZmxhZ3MpCit7CisJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIGFkOworCisJQ09NTU9OX0FVRElUX0RBVEFfSU5JVCgmYWQsIElOT0RFKTsKKwlhZC51Lmlub2RlID0gaW5vZGU7CisJcmV0dXJuIGlub2RlX2hhc19wZXJtKGNyZWQsIGlub2RlLCBwZXJtcywgJmFkLCBmbGFncyk7Cit9CisKIC8qIFNhbWUgYXMgaW5vZGVfaGFzX3Blcm0sIGJ1dCBwYXNzIGV4cGxpY2l0IGF1ZGl0IGRhdGEgY29udGFpbmluZwogICAgdGhlIGRlbnRyeSB0byBoZWxwIHRoZSBhdWRpdGluZyBjb2RlIHRvIG1vcmUgZWFzaWx5IGdlbmVyYXRlIHRoZQogICAgcGF0aG5hbWUgaWYgbmVlZGVkLiAqLwpAQCAtMjEyMiw4ICsyMTI3LDggQEAKIAkJCQkJCXN0cnVjdCB0dHlfZmlsZV9wcml2YXRlLCBsaXN0KTsKIAkJCWZpbGUgPSBmaWxlX3ByaXYtPmZpbGU7CiAJCQlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JCQlpZiAoaW5vZGVfaGFzX3Blcm0oY3JlZCwgaW5vZGUsCi0JCQkJCSAgIEZJTEVfX1JFQUQgfCBGSUxFX19XUklURSwgTlVMTCwgMCkpIHsKKwkJCWlmIChpbm9kZV9oYXNfcGVybV9ub2FkcChjcmVkLCBpbm9kZSwKKwkJCQkJICAgRklMRV9fUkVBRCB8IEZJTEVfX1dSSVRFLCAwKSkgewogCQkJCWRyb3BfdHR5ID0gMTsKIAkJCX0KIAkJfQpAQCAtMzIyOCw3ICszMjMzLDcgQEAKIAkgKiBuZXcgaW5vZGUgbGFiZWwgb3IgbmV3IHBvbGljeS4KIAkgKiBUaGlzIGNoZWNrIGlzIG5vdCByZWR1bmRhbnQgLSBkbyBub3QgcmVtb3ZlLgogCSAqLwotCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBpbm9kZSwgb3Blbl9maWxlX3RvX2F2KGZpbGUpLCBOVUxMLCAwKTsKKwlyZXR1cm4gaW5vZGVfaGFzX3Blcm1fbm9hZHAoY3JlZCwgaW5vZGUsIG9wZW5fZmlsZV90b19hdihmaWxlKSwgMCk7CiB9CiAKIC8qIHRhc2sgc2VjdXJpdHkgb3BlcmF0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggNzdkNDQxMy4uMzU0NTkzNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKIC8qIHNlbGludXhmcyBwc2V1ZG8gZmlsZXN5c3RlbSBmb3IgZXhwb3J0aW5nIHRoZSBzZWN1cml0eSBwb2xpY3kgQVBJLgogICAgQmFzZWQgb24gdGhlIHByb2MgY29kZSBhbmQgdGhlIGZzL25mc2QvbmZzY3RsLmMgY29kZS4gKi8KQEAgLTc1MSw2ICs3NTIsMTQgQEAKIAlyZXR1cm4gbGVuZ3RoOwogfQogCitzdGF0aWMgaW5saW5lIGludCBoZXhjb2RlX3RvX2ludChpbnQgY29kZSkgeworCWlmIChjb2RlID09ICdcMCcgfHwgIWlzeGRpZ2l0KGNvZGUpKQorCQlyZXR1cm4gLTE7CisJaWYgKGlzZGlnaXQoY29kZSkpCisJCXJldHVybiBjb2RlIC0gJzAnOworCXJldHVybiB0b2xvd2VyKGNvZGUpIC0gJ2EnICsgMTA7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jcmVhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJY2hhciAqc2NvbiA9IE5VTEwsICp0Y29uID0gTlVMTDsKQEAgLTc4NSw4ICs3OTQsMzQgQEAKIAluYXJncyA9IHNzY2FuZihidWYsICIlcyAlcyAlaHUgJXMiLCBzY29uLCB0Y29uLCAmdGNsYXNzLCBuYW1lYnVmKTsKIAlpZiAobmFyZ3MgPCAzIHx8IG5hcmdzID4gNCkKIAkJZ290byBvdXQ7Ci0JaWYgKG5hcmdzID09IDQpCisJaWYgKG5hcmdzID09IDQpIHsKKwkJLyoKKwkJICogSWYgYW5kIHdoZW4gdGhlIG5hbWUgb2YgbmV3IG9iamVjdCB0byBiZSBxdWVyaWVkIGNvbnRhaW5zCisJCSAqIGVpdGhlciB3aGl0ZXNwYWNlIG9yIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLCB0aGV5IHNoYWxsIGJlCisJCSAqIGVuY29kZWQgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2UtZW5jb2RpbmcgcnVsZS4KKwkJICogSWYgbm90IGVuY29kZWQsIHRoZSBzc2NhbmYgbG9naWMgcGlja3MgdXAgb25seSBsZWZ0LWhhbGYKKwkJICogb2YgdGhlIHN1cHBsaWVkIG5hbWU7IHNwbGl0dGVkIGJ5IGEgd2hpdGVzcGFjZSB1bmV4cGVjdGVkbHkuCisJCSAqLworCQljaGFyICAgKnIsICp3OworCQlpbnQgICAgIGMxLCBjMjsKKworCQlyID0gdyA9IG5hbWVidWY7CisJCWRvIHsKKwkJCWMxID0gKnIrKzsKKwkJCWlmIChjMSA9PSAnKycpCisJCQkJYzEgPSAnICc7CisJCQllbHNlIGlmIChjMSA9PSAnJScpIHsKKwkJCQlpZiAoKGMxID0gaGV4Y29kZV90b19pbnQoKnIrKykpIDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQkJaWYgKChjMiA9IGhleGNvZGVfdG9faW50KCpyKyspKSA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJCWMxID0gKGMxIDw8IDQpIHwgYzI7CisJCQl9CisJCQkqdysrID0gYzE7CisJCX0gd2hpbGUgKGMxICE9ICdcMCcpOworCiAJCW9iam5hbWUgPSBuYW1lYnVmOworCX0KIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKIAlpZiAobGVuZ3RoKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCmluZGV4IDEwMmU5ZWMuLmQyNDZhY2EgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKQEAgLTMyMjIsNiArMzIyMiw5IEBACiAJX19sZTMyIGJ1ZlsxXTsKIAlpbnQgcmM7CiAKKwlpZiAocC0+cG9saWN5dmVycyA8IFBPTElDWURCX1ZFUlNJT05fRklMRU5BTUVfVFJBTlMpCisJCXJldHVybiAwOworCiAJbmVsID0gMDsKIAlyYyA9IGhhc2h0YWJfbWFwKHAtPmZpbGVuYW1lX3RyYW5zLCBoYXNodGFiX2NudCwgJm5lbCk7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMgYi9zZWN1cml0eS90b21veW8vbW91bnQuYwppbmRleCAxNjJhODY0Li45ZmMyZTE1IDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vbW91bnQuYworKysgYi9zZWN1cml0eS90b21veW8vbW91bnQuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJfQogCWlmIChuZWVkX2RldikgewogCQkvKiBHZXQgbW91bnQgcG9pbnQgb3IgZGV2aWNlIGZpbGUuICovCi0JCWlmIChrZXJuX3BhdGgoZGV2X25hbWUsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgeworCQlpZiAoIWRldl9uYW1lIHx8IGtlcm5fcGF0aChkZXZfbmFtZSwgTE9PS1VQX0ZPTExPVywgJnBhdGgpKSB7CiAJCQllcnJvciA9IC1FTk9FTlQ7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvYXRtZWwvYWJkYWMuYyBiL3NvdW5kL2F0bWVsL2FiZGFjLmMKaW5kZXggNmUyNDA5MS4uYmZlZTYwYyAxMDA2NDQKLS0tIGEvc291bmQvYXRtZWwvYWJkYWMuYworKysgYi9zb3VuZC9hdG1lbC9hYmRhYy5jCkBAIC01OTksNCArNTk5LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEF0bWVsIEF1ZGlvIEJpdHN0cmVhbSBEQUMgKEFCREFDKSIpOwotTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGFucy1jaHJpc3RpYW4uZWd0dmVkdEBhdG1lbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxlZ3R2ZWR0QHNhbWZ1bmRldC5ubz4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2F0bWVsL2FjOTdjLmMgYi9zb3VuZC9hdG1lbC9hYzk3Yy5jCmluZGV4IGIzMTA3MDIuLmFjMzUyMjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2F0bWVsL2FjOTdjLmMKKysrIGIvc291bmQvYXRtZWwvYWM5N2MuYwpAQCAtMTE5OSw0ICsxMTk5LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEF0bWVsIEFDOTcgY29udHJvbGxlciIpOwotTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGFucy1jaHJpc3RpYW4uZWd0dmVkdEBhdG1lbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxlZ3R2ZWR0QHNhbWZ1bmRldC5ubz4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvbWlzYy5jIGIvc291bmQvY29yZS9taXNjLmMKaW5kZXggMmM0MTgyNS4uZWI5ZmUyZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9taXNjLmMKKysrIGIvc291bmQvY29yZS9taXNjLmMKQEAgLTU4LDI2ICs1OCw2IEBACiAJZWxzZQogCQlyZXR1cm4gcGF0aDsKIH0KLQotLyogcHJpbnQgZmlsZSBhbmQgbGluZSB3aXRoIGEgY2VydGFpbiBwcmludGsgcHJlZml4ICovCi1zdGF0aWMgaW50IHByaW50X3NuZF9wZngodW5zaWduZWQgaW50IGxldmVsLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgbGluZSwKLQkJCSBjb25zdCBjaGFyICpmb3JtYXQpCi17Ci0JY29uc3QgY2hhciAqZmlsZSA9IHNhbml0eV9maWxlX25hbWUocGF0aCk7Ci0JY2hhciB0bXBbXSA9ICI8MD4iOwotCWNvbnN0IGNoYXIgKnBmeCA9IGxldmVsID8gS0VSTl9ERUJVRyA6IEtFUk5fREVGQVVMVDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChmb3JtYXRbMF0gPT0gJzwnICYmIGZvcm1hdFsyXSA9PSAnPicpIHsKLQkJdG1wWzFdID0gZm9ybWF0WzFdOwotCQlwZnggPSB0bXA7Ci0JCXJldCA9IDE7Ci0JfQotCXByaW50aygiJXNBTFNBICVzOiVkOiAiLCBwZngsIGZpbGUsIGxpbmUpOwotCXJldHVybiByZXQ7Ci19Ci0jZWxzZQotI2RlZmluZSBwcmludF9zbmRfcGZ4KGxldmVsLCBwYXRoLCBsaW5lLCBmb3JtYXQpCTAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX0RFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEspCkBAIC04NSwxNSArNjUsMjkgQEAKIAkJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7Ci0JCisjaWZkZWYgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCWNoYXIgdmVyYm9zZV9mbXRbXSA9IEtFUk5fREVGQVVMVCAiQUxTQSAlczolZCAlcFYiOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCQogCWlmIChkZWJ1ZyA8IGxldmVsKQogCQlyZXR1cm47CiAjZW5kaWYKKwogCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JaWYgKHByaW50X3NuZF9wZngobGV2ZWwsIHBhdGgsIGxpbmUsIGZvcm1hdCkpCi0JCWZvcm1hdCArPSAzOyAvKiBza2lwIHRoZSBwcmludGsgbGV2ZWwtcHJlZml4ICovCisjaWZkZWYgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USworCXZhZi5mbXQgPSBmb3JtYXQ7CisJdmFmLnZhID0gJmFyZ3M7CisJaWYgKGZvcm1hdFswXSA9PSAnPCcgJiYgZm9ybWF0WzJdID09ICc+JykgeworCQltZW1jcHkodmVyYm9zZV9mbXQsIGZvcm1hdCwgMyk7CisJCXZhZi5mbXQgPSBmb3JtYXQgKyAzOworCX0gZWxzZSBpZiAobGV2ZWwpCisJCW1lbWNweSh2ZXJib3NlX2ZtdCwgS0VSTl9ERUJVRywgMyk7CisJcHJpbnRrKHZlcmJvc2VfZm10LCBzYW5pdHlfZmlsZV9uYW1lKHBhdGgpLCBsaW5lLCAmdmFmKTsKKyNlbHNlCiAJdnByaW50ayhmb3JtYXQsIGFyZ3MpOworI2VuZGlmCiAJdmFfZW5kKGFyZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19zbmRfcHJpbnRrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jIGIvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKaW5kZXggODZlZTE2Yy4uNDQwMDMwOCAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKKysrIGIvc291bmQvZmlyZXdpcmUvaXNpZ2h0LmMKQEAgLTIwOSw2ICsyMDksNyBAQAogCQlpc2lnaHQtPnBhY2tldF9pbmRleCA9IC0xOwogCQlyZXR1cm47CiAJfQorCWZ3X2lzb19jb250ZXh0X3F1ZXVlX2ZsdXNoKGlzaWdodC0+Y29udGV4dCk7CiAKIAlpZiAoKytpbmRleCA+PSBRVUVVRV9MRU5HVEgpCiAJCWluZGV4ID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCmluZGV4IDJjYTZmNGYuLmUzNTY5YmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImhwaW9jdGwuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYwppbmRleCBmYjMxMWQ4Li41YzZlYTExIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5jCkBAIC02MCw3ICs2MCw3IEBACiAJICAgIEhQSV9WRVJfTUlOT1IoSFBJX1ZFUikgKiAxMDAgKyBIUElfVkVSX1JFTEVBU0UoSFBJX1ZFUikpKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAibGludXgvcGNpLmgiCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc2hvcnQgaHBpX2RzcF9jb2RlX29wZW4odTMyIGFkYXB0ZXIsIHN0cnVjdCBkc3BfY29kZSAqcHNfZHNwX2NvZGUsCiAJdTMyICpwb3NfZXJyb3JfY29kZSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwppbmRleCBmMTZiYzhhLi5lMDgzMTIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJCSYoKHN0cnVjdCBjczU1MzVhdWRpb19kbWFfZGVzYyAqKSBkbWEtPmRlc2NfYnVmLmFyZWEpW2ldOwogCQlkZXNjLT5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CiAJCWRlc2MtPnNpemUgPSBjcHVfdG9fbGUzMihwZXJpb2RfYnl0ZXMpOwotCQlkZXNjLT5jdGxyZXNlcnZlZCA9IGNwdV90b19sZTMyKFBSRF9FT1ApOworCQlkZXNjLT5jdGxyZXNlcnZlZCA9IGNwdV90b19sZTE2KFBSRF9FT1ApOwogCQlkZXNjX2FkZHIgKz0gc2l6ZW9mKHN0cnVjdCBjczU1MzVhdWRpb19kbWFfZGVzYyk7CiAJCWFkZHIgKz0gcGVyaW9kX2J5dGVzOwogCX0KQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWxhc3RkZXNjID0gJigoc3RydWN0IGNzNTUzNWF1ZGlvX2RtYV9kZXNjICopIGRtYS0+ZGVzY19idWYuYXJlYSlbcGVyaW9kc107CiAJbGFzdGRlc2MtPmFkZHIgPSBjcHVfdG9fbGUzMigodTMyKSBkbWEtPmRlc2NfYnVmLmFkZHIpOwogCWxhc3RkZXNjLT5zaXplID0gMDsKLQlsYXN0ZGVzYy0+Y3RscmVzZXJ2ZWQgPSBjcHVfdG9fbGUzMihQUkRfSk1QKTsKKwlsYXN0ZGVzYy0+Y3RscmVzZXJ2ZWQgPSBjcHVfdG9fbGUxNihQUkRfSk1QKTsKIAlqbXBwcmRfYWRkciA9IGNwdV90b19sZTMyKGxhc3RkZXNjLT5hZGRyICsKIAkJCQkgIChzaXplb2Yoc3RydWN0IGNzNTUzNWF1ZGlvX2RtYV9kZXNjKSpwZXJpb2RzKSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggNWU2MTlhOC4uMTVmMDE2MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTE0NDAsNiArMTQ0MCwxNCBAQAogCSAuY2EwMTAyX2NoaXAgPSAxLAogCSAuc3BrNzEgPSAxLAogCSAuZW11X21vZGVsID0gRU1VX01PREVMX0VNVTA0MDR9LCAvKiBFTVUgMDQwNCAqLworCS8qIEVNVTA0MDQgUENJZSAqLworCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA4LCAuc3Vic3lzdGVtID0gMHg0MDA1MTEwMiwKKwkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiRS1tdSAwNDA0IFBDSWUgW01BRU04OTg0XSIsCisJIC5pZCA9ICJFTVUwNDA0IiwKKwkgLmVtdTEwazJfY2hpcCA9IDEsCisJIC5jYTAxMDhfY2hpcCA9IDEsCisJIC5zcGs3MSA9IDEsCisJIC5lbXVfbW9kZWwgPSBFTVVfTU9ERUxfRU1VMDQwNH0sIC8qIEVNVSAwNDA0IFBDSWUgdmVyXzAzICovCiAJLyogTm90ZSB0aGF0IGFsbCBFLW11IGNhcmRzIHJlcXVpcmUga2VybmVsIDIuNiBvciBuZXdlci4gKi8KIAl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwOCwKIAkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiU0IgQXVkaWd5IDIgVmFsdWUgW1Vua25vd25dIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggZWFjZDQ5MC4uYTdlYzcwMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTEyMzQsOSArMTIzNCwxMiBAQAogCXNwcmludGYoY2hpcC0+dGVhLmJ1c19pbmZvLCAiUENJOiVzIiwgcGNpX25hbWUocGNpKSk7CiAJaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA+IDAgJiYKIAkgICAgKHRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIDwgNCkgewotCQlpZiAoc25kX3RlYTU3NXhfaW5pdCgmY2hpcC0+dGVhKSkKKwkJaWYgKHNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSkpIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKLQl9IGVsc2UgaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA9PSAwKQorCQkJc25kX2ZtODAxX2ZyZWUoY2hpcCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSBpZiAoKHRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spID09IDApIHsKIAkJLyogYXV0b2RldGVjdCB0dW5lciBjb25uZWN0aW9uICovCiAJCWZvciAodGVhNTc1eF90dW5lciA9IDE7IHRlYTU3NXhfdHVuZXIgPD0gMzsgdGVhNTc1eF90dW5lcisrKSB7CiAJCQljaGlwLT50ZWE1NzV4X3R1bmVyID0gdGVhNTc1eF90dW5lcjsKQEAgLTEyNDYsNiArMTI0OSwxMiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9CisJCWlmICh0ZWE1NzV4X3R1bmVyID09IDQpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKKwkJCXNuZF9mbTgwMV9mcmVlKGNoaXApOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CiAJc3RybGNweShjaGlwLT50ZWEuY2FyZCwgc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKHRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIC0gMV0ubmFtZSwgc2l6ZW9mKGNoaXAtPnRlYS5jYXJkKSk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCmluZGV4IGYxZGUxYmEuLjU1ZjA2NDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKQEAgLTUwLDcgKzUwLDEyIEBACiBpbnQgc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBuaWQpOwogdm9pZCBzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiAjZWxzZQotI2RlZmluZSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZSguLi4pCQkwCi0jZGVmaW5lIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKC4uLikKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbmlkKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworfQogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKaW5kZXggYjA1ZjdiZS4uZTNlODUzMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSTogb3V0IG9mIHJhbmdlIE1OTCAlZFxuIiwgbW5sKTsKIAkJZ290byBvdXRfZmFpbDsKIAl9IGVsc2UKLQkJc3RybGNweShlLT5tb25pdG9yX25hbWUsIGJ1ZiArIEVMRF9GSVhFRF9CWVRFUywgbW5sKTsKKwkJc3RybGNweShlLT5tb25pdG9yX25hbWUsIGJ1ZiArIEVMRF9GSVhFRF9CWVRFUywgbW5sICsgMSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZS0+c2FkX2NvdW50OyBpKyspIHsKIAkJaWYgKEVMRF9GSVhFRF9CWVRFUyArIG1ubCArIDMgKiAoaSArIDEpID4gc2l6ZSkgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggNjk2YWMyNS4uZDY5NGU5ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC01MDYsOSArNTA2LDExIEBACiAJCQkJaGRhX25pZF90IGhwKQogewogCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGZyb250LCAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKKwlpZiAoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgZnJvbnQpICYgQUNfUElOQ0FQX0VBUEQpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGZyb250LCAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKIAkJCSAgICAhc3BlYy0+aW52X2VhcGQgPyAweDAwIDogMHgwMik7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgaHAsIDAsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLAorCWlmIChzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKGNvZGVjLCBocCkgJiBBQ19QSU5DQVBfRUFQRCkKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgaHAsIDAsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLAogCQkJICAgICFzcGVjLT5pbnZfZWFwZCA/IDB4MDAgOiAweDAyKTsKIH0KIApAQCAtNTI0LDYgKzUyNiwxMCBAQAogCWNhc2UgMHgxMWQ0MTg0YToKIAljYXNlIDB4MTFkNDE5NGE6CiAJY2FzZSAweDExZDQxOTRiOgorCWNhc2UgMHgxMWQ0MTk4ODoKKwljYXNlIDB4MTFkNDE5OGI6CisJY2FzZSAweDExZDQ5ODlhOgorCWNhc2UgMHgxMWQ0OTg5YjoKIAkJYWQxOTh4X3Bvd2VyX2VhcGRfd3JpdGUoY29kZWMsIDB4MTIsIDB4MTEpOwogCQlicmVhazsKIAljYXNlIDB4MTFkNDE5ODE6CkBAIC01MzMsMTIgKzUzOSw2IEBACiAJY2FzZSAweDExZDQxOTg2OgogCQlhZDE5OHhfcG93ZXJfZWFwZF93cml0ZShjb2RlYywgMHgxYiwgMHgxYSk7CiAJCWJyZWFrOwotCWNhc2UgMHgxMWQ0MTk4ODoKLQljYXNlIDB4MTFkNDE5OGI6Ci0JY2FzZSAweDExZDQ5ODlhOgotCWNhc2UgMHgxMWQ0OTg5YjoKLQkJYWQxOTh4X3Bvd2VyX2VhcGRfd3JpdGUoY29kZWMsIDB4MjksIDB4MjIpOwotCQlicmVhazsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwppbmRleCAzZTZiOWE4Li43YmJjNWYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC0zMDc0LDYgKzMwNzQsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNjZfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NGMsICJBY2VyIEFzcGlyZSAzODMwVEciLCBDWFQ1MDY2X0FVVE8pLAogCVNORF9QQ0lfUVVJUktfTUFTSygweDEwMjUsIDB4ZmYwMCwgMHgwNDAwLCAiQWNlciIsIENYVDUwNjZfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJkOCwgIkRlbGwgVm9zdHJvIiwgQ1hUNTA2Nl9ERUxMX1ZPU1RSTyksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJmNSwgIkRlbGwgVm9zdHJvIDMyMCIsIENYVDUwNjZfSURFQVBBRCksCkBAIC0zMTAyLDYgKzMxMDMsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM4YWYsICJMZW5vdm8gRzU2MCIsIENYVDUwNjZfQVNVUyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzkzOCwgIkxlbm92byBHNTY1IiwgQ1hUNTA2Nl9BVVRPKSwKIAlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3YWEsICJMZW5vdm8iLCBDWFQ1MDY2X0lERUFQQUQpLCAvKiBGYWxsYmFjayBmb3IgTGVub3ZvcyB3aXRob3V0IGRvY2sgbWljICovCisJU05EX1BDSV9RVUlSSygweDFiMGEsIDB4MjA5MiwgIkN5YmVycG93ZXJQQyBHYW1lciBYcGxvcmVyIE41NzAwMSIsIENYVDUwNjZfQVVUTyksCiAJe30KIH07CiAKQEAgLTQzODgsNiArNDM5MCw4IEBACiAJICAucGF0Y2ggPSBwYXRjaF9jeHQ1MDY2IH0sCiAJeyAuaWQgPSAweDE0ZjE1MDY5LCAubmFtZSA9ICJDWDIwNTg1IiwKIAkgIC5wYXRjaCA9IHBhdGNoX2N4dDUwNjYgfSwKKwl7IC5pZCA9IDB4MTRmMTUwNmMsIC5uYW1lID0gIkNYMjA1ODgiLAorCSAgLnBhdGNoID0gcGF0Y2hfY3h0NTA2NiB9LAogCXsgLmlkID0gMHgxNGYxNTA2ZSwgLm5hbWUgPSAiQ1gyMDU5MCIsCiAJICAucGF0Y2ggPSBwYXRjaF9jeHQ1MDY2IH0sCiAJeyAuaWQgPSAweDE0ZjE1MDk3LCAubmFtZSA9ICJDWDIwNjMxIiwKQEAgLTQ0MTYsNiArNDQyMCw3IEBACiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNjciKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2OCIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDY5Iik7CitNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNmMiKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2ZSIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDk3Iik7CiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwOTgiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggN2E0ZTEwMC4uYjQ4ZmI0MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTExNDEsNiArMTE0MSwxMyBAQAogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBvbjsKIAorCS8qIENvbnRyb2wgSFAgcGlucy9hbXBzIGRlcGVuZGluZyBvbiBtYXN0ZXJfbXV0ZSBzdGF0ZTsKKwkgKiBpbiBnZW5lcmFsLCBIUCBwaW5zL2FtcHMgY29udHJvbCBzaG91bGQgYmUgZW5hYmxlZCBpbiBhbGwgY2FzZXMsCisJICogYnV0IGN1cnJlbnRseSBzZXQgb25seSBmb3IgbWFzdGVyX211dGUsIGp1c3QgdG8gYmUgc2FmZQorCSAqLworCWRvX2F1dG9tdXRlKGNvZGVjLCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcuaHBfcGlucyksCisJCSAgICBzcGVjLT5hdXRvY2ZnLmhwX3BpbnMsIHNwZWMtPm1hc3Rlcl9tdXRlLCB0cnVlKTsKKwogCWlmICghc3BlYy0+YXV0b211dGUpCiAJCW9uID0gMDsKIAllbHNlCkBAIC0yNzA4LDE3ICsyNzE1LDMwIEBACiAKIHN0YXRpYyBpbnQgYWxjX2NhcF9nZXRwdXRfY2FsbGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCwKLQkJCQkgZ2V0cHV0X2NhbGxfdCBmdW5jKQorCQkJCSBnZXRwdXRfY2FsbF90IGZ1bmMsIGJvb2wgY2hlY2tfYWRjX3N3aXRjaCkKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgYWRjX2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwotCWludCBlcnI7CisJaW50IGksIGVyciA9IDA7CiAKIAltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7Ci0Ja2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzW2FkY19pZHhdLAotCQkJCQkJICAgICAgMywgMCwgSERBX0lOUFVUKTsKLQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CisJaWYgKGNoZWNrX2FkY19zd2l0Y2ggJiYgc3BlYy0+ZHVhbF9hZGNfc3dpdGNoKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fYWRjX25pZHM7IGkrKykgeworCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPQorCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwoc3BlYy0+YWRjX25pZHNbaV0sCisJCQkJCQkgICAgMywgMCwgSERBX0lOUFVUKTsKKwkJCWVyciA9IGZ1bmMoa2NvbnRyb2wsIHVjb250cm9sKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQlpID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0KKwkJCUhEQV9DT01QT1NFX0FNUF9WQUwoc3BlYy0+YWRjX25pZHNbaV0sCisJCQkJCSAgICAzLCAwLCBIREFfSU5QVVQpOworCQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CisJfQorIGVycm9yOgogCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yNzI3LDE0ICsyNzQ3LDE0IEBACiAJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9nZXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldCwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IGFsY19jYXBfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXJldHVybiBhbGNfY2FwX2dldHB1dF9jYWxsZXIoa2NvbnRyb2wsIHVjb250cm9sLAotCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dCk7CisJCQkJICAgICBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfcHV0LCB0cnVlKTsKIH0KIAogLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwpAQCAtMjc0NCwxNCArMjc2NCwxNCBAQAogCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldCwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IGFsY19jYXBfc3dfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9wdXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX3B1dCwgdHJ1ZSk7CiB9CiAKICNkZWZpbmUgX0RFRklORV9DQVBNSVgobnVtKSBcCkBAIC00ODc2LDcgKzQ4OTYsNiBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweGUzMDksICJVTEkiLCBBTEM4ODBfM1NUX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4ZTMxMCwgIlVMSSIsIEFMQzg4MF8zU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMDM5LCAweDEyMzQsIE5VTEwsIEFMQzg4MF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTA5LCAiSFAiLCBBTEM4ODBfNVNUKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGIzLCAiQVNVUyBXMVYiLCBBTEM4ODBfQVNVU19XMVYpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYzIsICJBU1VTIFc2QSIsIEFMQzg4MF9BU1VTX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBjMywgIkFTVVMgV3h4IiwgQUxDODgwX0FTVVNfRElHKSwKQEAgLTYyMDEsMTEgKzYyMjAsNiBAQAogLyogdXBkYXRlIEhQLCBsaW5lIGFuZCBtb25vIG91dCBwaW5zIGFjY29yZGluZyB0byB0aGUgbWFzdGVyIHN3aXRjaCAqLwogc3RhdGljIHZvaWQgYWxjMjYwX2hwX21hc3Rlcl91cGRhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQkvKiBjaGFuZ2UgSFAgcGlucyAqLwotCWRvX2F1dG9tdXRlKGNvZGVjLCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcuaHBfcGlucyksCi0JCSAgICBzcGVjLT5hdXRvY2ZnLmhwX3BpbnMsIHNwZWMtPm1hc3Rlcl9tdXRlLCB0cnVlKTsKIAl1cGRhdGVfc3BlYWtlcnMoY29kZWMpOwogfQogCkBAIC0xMTkyNCw3ICsxMTkzOCw3IEBACiAgKiAgMHgxYiA9IHBvcnQgcmVwbGljYXRvciBoZWFkcGhvbmUgb3V0CiAgKi8KIAotI2RlZmluZSBBTENfSFBfRVZFTlQJMHgzNworI2RlZmluZSBBTENfSFBfRVZFTlQJQUxDODgwX0hQX0VWRU5UCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2Z1aml0c3VfdW5zb2xfdmVyYnNbXSA9IHsKIAl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCkBAIC0xMjU5OCw2ICsxMjYxMiw3IEBACiAgKi8KIGVudW0gewogCVBJTkZJWF9GU0NfSDI3MCwKKwlQSU5GSVhfSFBfWjIwMCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzI2Ml9maXh1cHNbXSA9IHsKQEAgLTEyNjEwLDkgKzEyNjI1LDE3IEBACiAJCQl7IH0KIAkJfQogCX0sCisJW1BJTkZJWF9IUF9aMjAwXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTYsIDB4OTkxMzAxMjAgfSwgLyogaW50ZXJuYWwgc3BlYWtlciAqLworCQkJeyB9CisJCX0KKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2Ml9maXh1cF90YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNzBiLCAiSFAgWjIwMCIsIFBJTkZJWF9IUF9aMjAwKSwKIAlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMTQ3LCAiRlNDIENlbHNpdXMgSDI3MCIsIFBJTkZJWF9GU0NfSDI3MCksCiAJe30KIH07CkBAIC0xMjcyOSw2ICsxMjc1Miw4IEBACiAJCQkgICBBTEMyNjJfSFBfQlBDKSwKIAlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTUwMCwgIkhQIHogc2VyaWVzIiwKIAkJCSAgIEFMQzI2Ml9IUF9CUEMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDE3MGIsICJIUCBaMjAwIiwKKwkJCSAgIEFMQzI2Ml9BVVRPKSwKIAlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTcwMCwgIkhQIHh3IHNlcmllcyIsCiAJCQkgICBBTEMyNjJfSFBfQlBDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAwLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKQEAgLTEzMzE0LDkgKzEzMzM5LDggQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBmOwogCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwogCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKIAlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwogCXNwZWMtPmludF9taWMucGluID0gMHgxMjsKQEAgLTEzODYwLDYgKzEzODg0LDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTViLCAiQWNlciBBc3BpcmUgT25lIiwKIAkJCQkJCUFMQzI2OF9BQ0VSX0FTUElSRV9PTkUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyNTMsICJEZWxsIE9FTSIsIEFMQzI2OF9ERUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmIwLCAiRGVsbCBJbnNwaXJvbiA5MTAiLCBBTEMyNjhfQVVUTyksCiAJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAyOCwgMHhmZmYwLCAweDAyYjAsCiAJCQkiRGVsbCBJbnNwaXJvbiBNaW5pOS9Wb3N0cm8gQTkwIiwgQUxDMjY4X0RFTEwpLAogCS8qIGFsbW9zdCBjb21wYXRpYmxlIHdpdGggdG9zaGliYSBidXQgd2l0aCBvcHRpb25hbCBkaWdpdGFsIG91dHM7CkBAIC0xMzg3MCw3ICsxMzg5NSw2IEBACiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwNSwgIkFTVVMgVzdKIiwgQUxDMjY4XzNTVCksCiAJU05EX1BDSV9RVUlSSygweDExNzAsIDB4MDA0MCwgIlpFUFRPIiwgQUxDMjY4X1pFUFRPKSwKIAlTTkRfUENJX1FVSVJLKDB4MTRjMCwgMHgwMDI1LCAiQ09NUEFMIElGTDkwL0pGTC05MiIsIEFMQzI2OF9UT1NISUJBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwNzYzLCAiRGl2ZXJzZSAoQ1BSMjAwMCkiLCBBTEMyNjhfQUNFUiksCiAJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDc3MSwgIlF1YW50YSBJTDEiLCBBTEMyNjdfUVVBTlRBX0lMMSksCiAJe30KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYwppbmRleCA2MDVjOTllLi5mNDNiYjBlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTc0NSwxMiArNzQ1LDIzIEBACiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIGludCBwaW5zZWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXVuc2lnbmVkIGludCBwYXJtMCwgcGFybTE7CiAJLyogR2V0IEluZGVwZW5kZW50IE1vZGUgaW5kZXggb2YgaGVhZHBob25lIHBpbiB3aWRnZXQgKi8KIAlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlID0gc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZV9pbmRleCA9PSBwaW5zZWwKIAkJPyAxIDogMDsKLQlpZiAoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MThTKQorCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTcxOFMpIHsKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAogCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgcGluc2VsID8gMiA6IDApOworCQkvKiBTZXQgY29ycmVjdCBtdXRlIHN3aXRjaCBmb3IgTVczICovCisJCXBhcm0wID0gc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSA/CisJCQkgICAgICAgQU1QX0lOX1VOTVVURSgwKSA6IEFNUF9JTl9NVVRFKDApOworCQlwYXJtMSA9IHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUgPworCQkJICAgICAgIEFNUF9JTl9NVVRFKDEpIDogQU1QX0lOX1VOTVVURSgxKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxYiwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgcGFybTApOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFiLCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBwYXJtMSk7CisJfQogCWVsc2UKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAogCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgcGluc2VsKTsKQEAgLTgzMiwxMCArODQzLDEzIEBACiAJa25ldy0+c3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZDsKIAlrbmV3LT5wcml2YXRlX3ZhbHVlID0gbmlkOwogCi0Ja25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfaHBfbWl4ZXJbMV0pOwotCWlmIChrbmV3ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWtuZXctPnN1YmRldmljZSA9IHNpZGVfbXV0ZV9jaGFubmVsKHNwZWMpOworCW5pZCA9IHNpZGVfbXV0ZV9jaGFubmVsKHNwZWMpOworCWlmIChuaWQpIHsKKwkJa25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfaHBfbWl4ZXJbMV0pOworCQlpZiAoa25ldyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWtuZXctPnN1YmRldmljZSA9IG5pZDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyODAsOSArNDI5NCw2IEBACiAJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKIAl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAogCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDUpfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgRnJvbnQgSFAgdG8gTVc5ICovCi0JezB4MjgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAogCS8qIFBXOSBQVzEwIE91dHB1dCBlbmFibGUgKi8KIAl7MHgyZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBBQ19QSU5DVExfT1VUX0VOfSwKIAl7MHgyZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBBQ19QSU5DVExfT1VUX0VOfSwKQEAgLTQyOTEsMTAgKzQzMDIsMTAgQEAKIAkvKiBFbmFibGUgQm9vc3QgVm9sdW1lIGJhY2tkb29yICovCiAJezB4MSwgMHhmODgsIDB4OH0sCiAJLyogTVcwLzEvMi8zLzQ6IHVuLW11dGUgaW5kZXggMCAoQU9XeCksIG11dGUgaW5kZXggMSAoTVc5KSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCiAJezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LApAQCAtNDMwNCw4ICs0MzE1LDYgQEAKIAkvKiBzZXQgTVVYMSA9IDIgKEFPVzQpLCBNVVgyID0gMSAoQU9XMykgKi8KIAl7MHgzNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Mn0sCiAJezB4MzUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAotCS8qIFVubXV0ZSBNVzQncyBpbmRleCAwICovCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsgfQogfTsKIApAQCAtNDQ1Myw2ICs0NDYyLDE5IEBACiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfRlJPTlQpIHsKKwkJCS8qIGFkZCBjb250cm9sIHRvIG1peGVyIGluZGV4IDAgKi8KKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCA1LAorCQkJCQkJCQkgIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgNSwKKwkJCQkJCQkJICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CiAJCQkvKiBGcm9udCAqLwogCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKIAkJCWVyciA9IHZpYV9hZGRfY29udHJvbCgKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwppbmRleCAzNGIyNDI4Li4yNjkyZTVhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5jCkBAIC00NDUsNyArNDQ1LDcgQEAKIAlsb2xhX3NldHVwX2FsbF9hbmFsb2dfZ2FpbnMoY2hpcCwgUExBWSwgZmFsc2UpOyAvKiBvdXRwdXQsIHVwZGF0ZSAqLwogfQogCi1zdGF0aWMgaW50IGxvbGFfcGFyc2VfdHJlZShzdHJ1Y3QgbG9sYSAqY2hpcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxvbGFfcGFyc2VfdHJlZShzdHJ1Y3QgbG9sYSAqY2hpcCkKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCWludCBuaWQsIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IDk0OTY5MWEuLmM4ZTQwMmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtNTIxLDYgKzUyMSw3IEBACiAjZGVmaW5lIEhEU1BNX0RNQV9BUkVBX0tJTE9CWVRFUyAoSERTUE1fRE1BX0FSRUFfQllURVMvMTAyNCkKIAogLyogcmV2aXNpb25zID49IDIzMCBpbmRpY2F0ZSBBRVMzMiBjYXJkICovCisjZGVmaW5lIEhEU1BNX01BRElfT0xEX1JFVgkyMDcKICNkZWZpbmUgSERTUE1fTUFESV9SRVYJCTIxMAogI2RlZmluZSBIRFNQTV9SQVlEQVRfUkVWCTIxMQogI2RlZmluZSBIRFNQTV9BSU9fUkVWCQkyMTIKQEAgLTg5NSwxMSArODk2LDExIEBACiAJdW5zaWduZWQgY2hhciBtYXhfY2hhbm5lbHNfaW47CiAJdW5zaWduZWQgY2hhciBtYXhfY2hhbm5lbHNfb3V0OwogCi0JY2hhciAqY2hhbm5lbF9tYXBfaW47Ci0JY2hhciAqY2hhbm5lbF9tYXBfb3V0OworCXNpZ25lZCBjaGFyICpjaGFubmVsX21hcF9pbjsKKwlzaWduZWQgY2hhciAqY2hhbm5lbF9tYXBfb3V0OwogCi0JY2hhciAqY2hhbm5lbF9tYXBfaW5fc3MsICpjaGFubmVsX21hcF9pbl9kcywgKmNoYW5uZWxfbWFwX2luX3FzOwotCWNoYXIgKmNoYW5uZWxfbWFwX291dF9zcywgKmNoYW5uZWxfbWFwX291dF9kcywgKmNoYW5uZWxfbWFwX291dF9xczsKKwlzaWduZWQgY2hhciAqY2hhbm5lbF9tYXBfaW5fc3MsICpjaGFubmVsX21hcF9pbl9kcywgKmNoYW5uZWxfbWFwX2luX3FzOworCXNpZ25lZCBjaGFyICpjaGFubmVsX21hcF9vdXRfc3MsICpjaGFubmVsX21hcF9vdXRfZHMsICpjaGFubmVsX21hcF9vdXRfcXM7CiAKIAljaGFyICoqcG9ydF9uYW1lc19pbjsKIAljaGFyICoqcG9ydF9uYW1lc19vdXQ7CkBAIC0xMTQzLDcgKzExNDQsNyBAQAogCiAJCS8qIGlmIHdvcmRjbG9jayBoYXMgc3luY2VkIGZyZXEgYW5kIHdvcmRjbG9jayBpcyB2YWxpZCAqLwogCQlpZiAoKHN0YXR1czIgJiBIRFNQTV93Y0xvY2spICE9IDAgJiYKLQkJCQkoc3RhdHVzICYgSERTUE1fU2VsU3luY1JlZjApID09IDApIHsKKwkJCQkoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWYwKSA9PSAwKSB7CiAKIAkJCXJhdGVfYml0cyA9IHN0YXR1czIgJiBIRFNQTV93Y0ZyZXFNYXNrOwogCkBAIC0xNjM5LDEyICsxNjQwLDE0IEBACiAJCX0KIAl9CiAJaG1pZGktPnBlbmRpbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhtaWRpLT5sb2NrLCBmbGFncyk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG1pZGktPmhkc3BtLT5sb2NrLCBmbGFncyk7CiAJaG1pZGktPmhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IGhtaWRpLT5pZTsKIAloZHNwbV93cml0ZShobWlkaS0+aGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwKIAkJICAgIGhtaWRpLT5oZHNwbS0+Y29udHJvbF9yZWdpc3Rlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG1pZGktPmhkc3BtLT5sb2NrLCBmbGFncyk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaG1pZGktPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gc25kX2hkc3BtX21pZGlfb3V0cHV0X3dyaXRlIChobWlkaSk7CiB9CiAKQEAgLTYzNzcsNiArNjM4MCw3IEBACiAKIAlzd2l0Y2ggKGhkc3BtLT5maXJtd2FyZV9yZXYpIHsKIAljYXNlIEhEU1BNX01BRElfUkVWOgorCWNhc2UgSERTUE1fTUFESV9PTERfUkVWOgogCQloZHNwbS0+aW9fdHlwZSA9IE1BREk7CiAJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIE1BREkiOwogCQloZHNwbS0+bWlkaVBvcnRzID0gMzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKaW5kZXggZjhjNjYzZC4uZDY4ZWE1MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKQEAgLTI2MiwxNCArMjYyLDE0IEBACiB9CiAKIC8qIExpbmUgZGlzY2lwbGluZSAucmVjZWl2ZV9idWYoKSAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2MjUzX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCB2MjUzX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0dHktPmRpc2NfZGF0YTsKIAlzdHJ1Y3QgY3gyMDQ0Ml9wcml2ICpjeDIwNDQyOwogCiAJaWYgKCFjb2RlYykKLQkJcmV0dXJuIGNvdW50OworCQlyZXR1cm47CiAKIAljeDIwNDQyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKQEAgLTI4MSw4ICsyODEsNiBAQAogCQljb2RlYy0+aHdfd3JpdGUgPSAoaHdfd3JpdGVfdCl0dHktPm9wcy0+d3JpdGU7CiAJCWNvZGVjLT5jYXJkLT5wb3BfdGltZSA9IDE7CiAJfQotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKiBMaW5lIGRpc2NpcGxpbmUgLndyaXRlX3dha2V1cCgpICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwppbmRleCAzYzJlZTFiLi42YWYyM2QwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc3BpL2F0NzNjMjEzLmMgYi9zb3VuZC9zcGkvYXQ3M2MyMTMuYwppbmRleCAzMzdhMDAyLi40ZGQwNTFiIDEwMDY0NAotLS0gYS9zb3VuZC9zcGkvYXQ3M2MyMTMuYworKysgYi9zb3VuZC9zcGkvYXQ3M2MyMTMuYwpAQCAtMTEyNCw2ICsxMTI0LDYgQEAKIH0KIG1vZHVsZV9leGl0KGF0NzNjMjEzX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoY2VndHZlZHRAYXRtZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNvdW5kIGRyaXZlciBmb3IgQVQ3M0MyMTMgd2l0aCBBdG1lbCBTU0MiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jIGIvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKaW5kZXggZDQ3YmVmZi4uMWUzYWUzMyAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKQEAgLTIyNyw2ICsyMjcsNyBAQAogCXJldCA9IHVzYjZmaXJlX2Z3X2loZXhfaW5pdChmdywgcmVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlrZnJlZShyZWMpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHZhbGlkYXRpbmcgZXp1c2IgIgogCQkJCSJmaXJtd2FyZSAlcy5cbiIsIGZ3bmFtZSk7CiAJCXJldHVybiByZXQ7CkBAIC0yNjksNyArMjcwLDYgQEAKIAlkYXRhID0gMHgwMDsgLyogcmVzdW1lIGV6dXNiIGNwdSAqLwogCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3dyaXRlKGRldmljZSwgMHhhMCwgMHhlNjAwLCAmZGF0YSwgMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiICIKIAkJCQkiZmlybXdhcmUgJXM6IGVuZCBtZXNzYWdlLlxuIiwgZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9wY20uYyBiL3NvdW5kL3VzYi82ZmlyZS9wY20uYwppbmRleCBiMTM3YjI1Li5kMTQ0Y2RiIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvcGNtLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL3BjbS5jCkBAIC0zOTUsMTIgKzM5NSwxMiBAQAogCWFsc2FfcnQtPmh3ID0gcGNtX2h3OwogCiAJaWYgKGFsc2Ffc3ViLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlpZiAocnQtPnJhdGUgPj0gMCkKKwkJaWYgKHJ0LT5yYXRlIDwgQVJSQVlfU0laRShyYXRlcykpCiAJCQlhbHNhX3J0LT5ody5yYXRlcyA9IHJhdGVzX2Fsc2FpZFtydC0+cmF0ZV07CiAJCWFsc2FfcnQtPmh3LmNoYW5uZWxzX21heCA9IE9VVF9OX0NIQU5ORUxTOwogCQlzdWIgPSAmcnQtPnBsYXliYWNrOwogCX0gZWxzZSBpZiAoYWxzYV9zdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKLQkJaWYgKHJ0LT5yYXRlID49IDApCisJCWlmIChydC0+cmF0ZSA8IEFSUkFZX1NJWkUocmF0ZXMpKQogCQkJYWxzYV9ydC0+aHcucmF0ZXMgPSByYXRlc19hbHNhaWRbcnQtPnJhdGVdOwogCQlhbHNhX3J0LT5ody5jaGFubmVsc19tYXggPSBJTl9OX0NIQU5ORUxTOwogCQlzdWIgPSAmcnQtPmNhcHR1cmU7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvcXVpcmtzLmMgYi9zb3VuZC91c2IvcXVpcmtzLmMKaW5kZXggMmU5NjljYi4uMDkwZTE5MyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9xdWlya3MuYwpAQCAtNDAzLDcgKzQwMyw3IEBACiBzdGF0aWMgaW50IHNuZF91c2JfY202MjA2X2Jvb3RfcXVpcmsoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKIHsKIAlpbnQgZXJyLCByZWc7Ci0JaW50IHZhbFtdID0gezB4MjAwYywgMHgzMDAwLCAweGY4MDAsIDB4MTQzZiwgMHgwMDAwLCAweDMwMDB9OworCWludCB2YWxbXSA9IHsweDIwMDQsIDB4MzAwMCwgMHhmODAwLCAweDE0M2YsIDB4MDAwMCwgMHgzMDAwfTsKIAogCWZvciAocmVnID0gMDsgcmVnIDwgQVJSQVlfU0laRSh2YWwpOyByZWcrKykgewogCQllcnIgPSBzbmRfdXNiX2NtMTA2X3dyaXRlX2ludF9yZWcoZGV2LCByZWcsIHZhbFtyZWddKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUgYi90b29scy9wZXJmL01ha2VmaWxlCmluZGV4IDAzMmJhNjMuLjk0MDI1N2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQpAQCAtNjMzLDcgKzYzMyw3IEBACiAKIFNIRUxMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQogCi1MSUJTID0gLVdsLC0td2hvbGUtYXJjaGl2ZSAkKFBFUkZMSUJTKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlICQoRVhUTElCUykKK0xJQlMgPSAtV2wsLS13aG9sZS1hcmNoaXZlICQoUEVSRkxJQlMpIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgLVdsLC0tc3RhcnQtZ3JvdXAgJChFWFRMSUJTKSAtV2wsLS1lbmQtZ3JvdXAKIAogQUxMX0NGTEFHUyArPSAkKEJBU0lDX0NGTEFHUykKIEFMTF9DRkxBR1MgKz0gJChBUkNIX0NGTEFHUykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCmluZGV4IGI2NzE4NjIuLjJkYTkxNjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYwpAQCAtNDc0LDcgKzQ3NCw3IEBACiAJdW5zaWduZWQgaW50IG5yX2V2ZW50c1tuc3lzY2FsbHNdLAogCQkgICAgIGV4cGVjdGVkX25yX2V2ZW50c1tuc3lzY2FsbHNdLCBpLCBqOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbHNbbnN5c2NhbGxzXSwgKmV2c2VsOwotCWludCBzYW1wbGVfc2l6ZSA9IHBlcmZfc2FtcGxlX3NpemUoYXR0ci5zYW1wbGVfdHlwZSk7CisJaW50IHNhbXBsZV9zaXplID0gX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZShhdHRyLnNhbXBsZV90eXBlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuc3lzY2FsbHM7ICsraSkgewogCQljaGFyIG5hbWVbNjRdOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4gYi90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgppbmRleCAyNmQ0ZDNmLi5hZDczMzAwIDEwMDc1NQotLS0gYS90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgorKysgYi90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgpAQCAtMjMsMTIgKzIzLDcgQEAKIHRoZW4KIAlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvLS8uL2cnKTsKIGVsc2UKLQlldmFsICQoZ3JlcCAnXlZFUlNJT05bWzpzcGFjZTpdXSo9JyAuLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCi0JZXZhbCAkKGdyZXAgJ15QQVRDSExFVkVMW1s6c3BhY2U6XV0qPScgLi4vLi4vTWFrZWZpbGV8dHIgLWQgJyAnKQotCWV2YWwgJChncmVwICdeU1VCTEVWRUxbWzpzcGFjZTpdXSo9JyAuLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCi0JZXZhbCAkKGdyZXAgJ15FWFRSQVZFUlNJT05bWzpzcGFjZTpdXSo9JyAuLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCi0KLQlWTj0iJHtWRVJTSU9OfS4ke1BBVENITEVWRUx9LiR7U1VCTEVWRUx9JHtFWFRSQVZFUlNJT059IgorCVZOPSQoTUFLRUZMQUdTPSBtYWtlIC1zQyAuLi8uLiBrZXJuZWx2ZXJzaW9uKQogZmkKIAogVk49JChleHByICIkVk4iIDogdionXCguKlwpJykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKaW5kZXggMGZlOWFkZi4uM2MxYjhhNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKQEAgLTM1LDIyICszNSw2IEBACiAJcmV0dXJuIHBlcmZfZXZlbnRfX25hbWVzW2lkXTsKIH0KIAotaW50IHBlcmZfc2FtcGxlX3NpemUodTY0IHNhbXBsZV90eXBlKQotewotCXU2NCBtYXNrID0gc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9NQVNLOwotCWludCBzaXplID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChtYXNrICYgKDFVTEwgPDwgaSkpCi0JCQlzaXplKys7Ci0JfQotCi0Jc2l6ZSAqPSBzaXplb2YodTY0KTsKLQotCXJldHVybiBzaXplOwotfQotCiBzdGF0aWMgc3RydWN0IHBlcmZfc2FtcGxlIHN5bnRoX3NhbXBsZSA9IHsKIAkucGlkCSAgID0gLTEsCiAJLnRpZAkgICA9IC0xLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmggYi90b29scy9wZXJmL3V0aWwvZXZlbnQuaAppbmRleCBjMDgzMzI4Li4xZDdmNjY0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZlbnQuaApAQCAtODIsOCArODIsNiBAQAogCXN0cnVjdCBpcF9jYWxsY2hhaW4gKmNhbGxjaGFpbjsKIH07CiAKLWludCBwZXJmX3NhbXBsZV9zaXplKHU2NCBzYW1wbGVfdHlwZSk7Ci0KICNkZWZpbmUgQlVJTERfSURfU0laRSAyMAogCiBzdHJ1Y3QgYnVpbGRfaWRfZXZlbnQgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCmluZGV4IDUwYWEzNDguLmIwMjFlYTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJldmxpc3QuaCIKICNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIApAQCAtMjU3LDE5ICsyNTYsMTUgQEAKIAlyZXR1cm4gZXZsaXN0LT5tbWFwICE9IE5VTEwgPyAwIDogLUVOT01FTTsKIH0KIAotc3RhdGljIGludCBfX3BlcmZfZXZsaXN0X19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCitzdGF0aWMgaW50IF9fcGVyZl9ldmxpc3RfX21tYXAoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCiAJCQkgICAgICAgaW50IGlkeCwgaW50IHByb3QsIGludCBtYXNrLCBpbnQgZmQpCiB7CiAJZXZsaXN0LT5tbWFwW2lkeF0ucHJldiA9IDA7CiAJZXZsaXN0LT5tbWFwW2lkeF0ubWFzayA9IG1hc2s7CiAJZXZsaXN0LT5tbWFwW2lkeF0uYmFzZSA9IG1tYXAoTlVMTCwgZXZsaXN0LT5tbWFwX2xlbiwgcHJvdCwKIAkJCQkgICAgICBNQVBfU0hBUkVELCBmZCwgMCk7Ci0JaWYgKGV2bGlzdC0+bW1hcFtpZHhdLmJhc2UgPT0gTUFQX0ZBSUxFRCkgewotCQlpZiAoZXZsaXN0LT5jcHVzLT5tYXBbaWR4XSA9PSAtMSAmJiBldnNlbC0+YXR0ci5pbmhlcml0KQotCQkJdWlfX3dhcm5pbmcoIkluaGVyaXQgaXMgbm90IGFsbG93ZWQgb24gcGVyLXRhc2sgIgotCQkJCSAgICAiZXZlbnRzIHVzaW5nIG1tYXAuXG4iKTsKKwlpZiAoZXZsaXN0LT5tbWFwW2lkeF0uYmFzZSA9PSBNQVBfRkFJTEVEKQogCQlyZXR1cm4gLTE7Ci0JfQogCiAJcGVyZl9ldmxpc3RfX2FkZF9wb2xsZmQoZXZsaXN0LCBmZCk7CiAJcmV0dXJuIDA7CkBAIC0yODksNyArMjg0LDcgQEAKIAogCQkJCWlmIChvdXRwdXQgPT0gLTEpIHsKIAkJCQkJb3V0cHV0ID0gZmQ7Ci0JCQkJCWlmIChfX3BlcmZfZXZsaXN0X19tbWFwKGV2bGlzdCwgZXZzZWwsIGNwdSwKKwkJCQkJaWYgKF9fcGVyZl9ldmxpc3RfX21tYXAoZXZsaXN0LCBjcHUsCiAJCQkJCQkJCXByb3QsIG1hc2ssIG91dHB1dCkgPCAwKQogCQkJCQkJZ290byBvdXRfdW5tYXA7CiAJCQkJfSBlbHNlIHsKQEAgLTMyOSw3ICszMjQsNyBAQAogCiAJCQlpZiAob3V0cHV0ID09IC0xKSB7CiAJCQkJb3V0cHV0ID0gZmQ7Ci0JCQkJaWYgKF9fcGVyZl9ldmxpc3RfX21tYXAoZXZsaXN0LCBldnNlbCwgdGhyZWFkLAorCQkJCWlmIChfX3BlcmZfZXZsaXN0X19tbWFwKGV2bGlzdCwgdGhyZWFkLAogCQkJCQkJCXByb3QsIG1hc2ssIG91dHB1dCkgPCAwKQogCQkJCQlnb3RvIG91dF91bm1hcDsKIAkJCX0gZWxzZSB7CkBAIC00NjAsMzMgKzQ1NSw0NiBAQAogCXJldHVybiAwOwogfQogCi11NjQgcGVyZl9ldmxpc3RfX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQorYm9vbCBwZXJmX2V2bGlzdF9fdmFsaWRfc2FtcGxlX3R5cGUoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKLQl1NjQgdHlwZSA9IDA7CisJc3RydWN0IHBlcmZfZXZzZWwgKnBvcywgKmZpcnN0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKLQkJaWYgKCF0eXBlKQotCQkJdHlwZSA9IHBvcy0+YXR0ci5zYW1wbGVfdHlwZTsKLQkJZWxzZSBpZiAodHlwZSAhPSBwb3MtPmF0dHIuc2FtcGxlX3R5cGUpCi0JCQlkaWUoIm5vbiBtYXRjaGluZyBzYW1wbGVfdHlwZSIpOworCXBvcyA9IGZpcnN0ID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShwb3MsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKKwkJaWYgKGZpcnN0LT5hdHRyLnNhbXBsZV90eXBlICE9IHBvcy0+YXR0ci5zYW1wbGVfdHlwZSkKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gdHlwZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwordTY0IHBlcmZfZXZsaXN0X19zYW1wbGVfdHlwZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZmlyc3Q7CisKKwlmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKwlyZXR1cm4gZmlyc3QtPmF0dHIuc2FtcGxlX3R5cGU7Cit9CisKK2Jvb2wgcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV9pZF9hbGwoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKnBvcywgKmZpcnN0OworCisJcG9zID0gZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHBvcywgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgeworCQlpZiAoZmlyc3QtPmF0dHIuc2FtcGxlX2lkX2FsbCAhPSBwb3MtPmF0dHIuc2FtcGxlX2lkX2FsbCkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBwZXJmX2V2bGlzdF9fc2FtcGxlX2lkX2FsbChjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKIHsKLQlib29sIHZhbHVlID0gZmFsc2UsIGZpcnN0ID0gdHJ1ZTsKLQlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zOworCXN0cnVjdCBwZXJmX2V2c2VsICpmaXJzdDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7Ci0JCWlmIChmaXJzdCkgewotCQkJdmFsdWUgPSBwb3MtPmF0dHIuc2FtcGxlX2lkX2FsbDsKLQkJCWZpcnN0ID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAodmFsdWUgIT0gcG9zLT5hdHRyLnNhbXBsZV9pZF9hbGwpCi0JCQlkaWUoIm5vbiBtYXRjaGluZyBzYW1wbGVfaWRfYWxsIik7Ci0JfQotCi0JcmV0dXJuIHZhbHVlOworCWZpcnN0ID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCXJldHVybiBmaXJzdC0+YXR0ci5zYW1wbGVfaWRfYWxsOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCmluZGV4IDBhMWVmMWYuLmIyYjg2MjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKQEAgLTY2LDcgKzY2LDkgQEAKIHZvaWQgcGVyZl9ldmxpc3RfX2RlbGV0ZV9tYXBzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKIGludCBwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwogCi11NjQgcGVyZl9ldmxpc3RfX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKLWJvb2wgcGVyZl9ldmxpc3RfX3NhbXBsZV9pZF9hbGwoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwordTY0IHBlcmZfZXZsaXN0X19zYW1wbGVfdHlwZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7Citib29sIHBlcmZfZXZsaXN0X19zYW1wbGVfaWRfYWxsKGNvbnN0IGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKIAorYm9vbCBwZXJmX2V2bGlzdF9fdmFsaWRfc2FtcGxlX3R5cGUoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOworYm9vbCBwZXJmX2V2bGlzdF9fdmFsaWRfc2FtcGxlX2lkX2FsbChjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiAjZW5kaWYgLyogX19QRVJGX0VWTElTVF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCmluZGV4IGNjYTI5ZWQuLjAyMzllYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCkBAIC0xNSw2ICsxNSwyMiBAQAogCiAjZGVmaW5lIEZEKGUsIHgsIHkpICgqKGludCAqKXh5YXJyYXlfX2VudHJ5KGUtPmZkLCB4LCB5KSkKIAoraW50IF9fcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUodTY0IHNhbXBsZV90eXBlKQoreworCXU2NCBtYXNrID0gc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9NQVNLOworCWludCBzaXplID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWlmIChtYXNrICYgKDFVTEwgPDwgaSkpCisJCQlzaXplKys7CisJfQorCisJc2l6ZSAqPSBzaXplb2YodTY0KTsKKworCXJldHVybiBzaXplOworfQorCiB2b2lkIHBlcmZfZXZzZWxfX2luaXQoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAogCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgaWR4KQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmggYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaAppbmRleCBmNzliYjJjLi43ZTkzNjZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaApAQCAtMTQ5LDQgKzE0OSwxMSBAQAogCXJldHVybiBfX3BlcmZfZXZzZWxfX3JlYWQoZXZzZWwsIG5jcHVzLCBudGhyZWFkcywgdHJ1ZSk7CiB9CiAKK2ludCBfX3BlcmZfZXZzZWxfX3NhbXBsZV9zaXplKHU2NCBzYW1wbGVfdHlwZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHBlcmZfZXZzZWxfX3NhbXBsZV9zaXplKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKK3sKKwlyZXR1cm4gX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZShldnNlbC0+YXR0ci5zYW1wbGVfdHlwZSk7Cit9CisKICNlbmRpZiAvKiBfX1BFUkZfRVZTRUxfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jCmluZGV4IDY5NDM2YjMuLmE5YWMwNTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYworKysgYi90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMKQEAgLTY3NCw3ICs2NzQsNyBAQAogCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gJnBldmxpc3QtPmV2bGlzdDsKIAl1bmlvbiBwZXJmX2V2ZW50ICpldmVudDsKIAlpbnQgc2FtcGxlX2lkX2FsbCA9IDEsIGNwdTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNhbXBsZV9pZF9hbGwiLCBOVUxMLCBOVUxMfTsKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNwdSIsICJzYW1wbGVfaWRfYWxsIiwgTlVMTCwgTlVMTH07CiAJaW50IGVycjsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIml8aSIsIGt3bGlzdCwKQEAgLTY5MiwxNiArNjkyLDE0IEBACiAKIAkJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CiAJCWVyciA9IHBlcmZfZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudCwgZmlyc3QtPmF0dHIuc2FtcGxlX3R5cGUsCi0JCQkJCSAgICAgICBwZXJmX3NhbXBsZV9zaXplKGZpcnN0LT5hdHRyLnNhbXBsZV90eXBlKSwKKwkJCQkJICAgICAgIHBlcmZfZXZzZWxfX3NhbXBsZV9zaXplKGZpcnN0KSwKIAkJCQkJICAgICAgIHNhbXBsZV9pZF9hbGwsICZwZXZlbnQtPnNhbXBsZSk7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiQ2FuJ3QgcGFyc2Ugc2FtcGxlLCBlcnIgPSAlZFxuIiwgZXJyKTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KKwkJaWYgKGVycikKKwkJCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfT1NFcnJvciwKKwkJCQkJICAgICJwZXJmOiBjYW4ndCBwYXJzZSBzYW1wbGUsIGVycj0lZCIsIGVycik7CiAJCXJldHVybiBweWV2ZW50OwogCX0KLWVuZDoKKwogCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAlyZXR1cm4gUHlfTm9uZTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCmluZGV4IDY0NTAwZmMuLmY1YThmYmQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwpAQCAtNTgsNiArNTgsMTYgQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCisJaWYgKCFwZXJmX2V2bGlzdF9fdmFsaWRfc2FtcGxlX3R5cGUoc2VsZi0+ZXZsaXN0KSkgeworCQlwcl9lcnIoIm5vbiBtYXRjaGluZyBzYW1wbGVfdHlwZSIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlpZiAoIXBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfaWRfYWxsKHNlbGYtPmV2bGlzdCkpIHsKKwkJcHJfZXJyKCJub24gbWF0Y2hpbmcgc2FtcGxlX2lkX2FsbCIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKIAlzZWxmLT5zaXplID0gaW5wdXRfc3RhdC5zdF9zaXplOwogCXJldHVybiAwOwogCkBAIC05Nyw3ICsxMDcsNyBAQAogdm9pZCBwZXJmX3Nlc3Npb25fX3VwZGF0ZV9zYW1wbGVfdHlwZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQogewogCXNlbGYtPnNhbXBsZV90eXBlID0gcGVyZl9ldmxpc3RfX3NhbXBsZV90eXBlKHNlbGYtPmV2bGlzdCk7Ci0Jc2VsZi0+c2FtcGxlX3NpemUgPSBwZXJmX3NhbXBsZV9zaXplKHNlbGYtPnNhbXBsZV90eXBlKTsKKwlzZWxmLT5zYW1wbGVfc2l6ZSA9IF9fcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUoc2VsZi0+c2FtcGxlX3R5cGUpOwogCXNlbGYtPnNhbXBsZV9pZF9hbGwgPSBwZXJmX2V2bGlzdF9fc2FtcGxlX2lkX2FsbChzZWxmLT5ldmxpc3QpOwogCXBlcmZfc2Vzc2lvbl9faWRfaGVhZGVyX3NpemUoc2VsZik7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGFyc2UuYyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCmluZGV4IDFlODg0ODUuLjBhN2VkNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCkBAIC0yMTg3LDYgKzIxODcsNyBAQAogCXsgIlRBU0tMRVRfU09GVElSUSIsIDYgfSwKIAl7ICJTQ0hFRF9TT0ZUSVJRIiwgNyB9LAogCXsgIkhSVElNRVJfU09GVElSUSIsIDggfSwKKwl7ICJSQ1VfU09GVElSUSIsIDkgfSwKIAogCXsgIkhSVElNRVJfTk9SRVNUQVJUIiwgMCB9LAogCXsgIkhSVElNRVJfUkVTVEFSVCIsIDEgfSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwgYi90b29scy90ZXN0aW5nL2t0ZXN0L2t0ZXN0LnBsCmluZGV4IDFmZDI5YjIuLmNlZjI4ZTYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwKKysrIGIvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbApAQCAtNzg4LDcgKzc4OCw3IEBACiAKIHN1YiByZWJvb3RfdG8gewogICAgIGlmICgkcmVib290X3R5cGUgZXEgImdydWIiKSB7Ci0JcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaDsgcmVib290KSciOworCXJ1bl9zc2ggIicoZWNobyBcInNhdmVkZWZhdWx0IC0tZGVmYXVsdD0kZ3J1Yl9udW1iZXIgLS1vbmNlXCIgfCBncnViIC0tYmF0Y2ggJiYgcmVib290KSciOwogCXJldHVybjsKICAgICB9CiAKQEAgLTE0ODAsNyArMTQ4MCw3IEBACiAJb3IgZG9kaWUgIkZhaWxlZCB0byByZWFkICRjb25maWciOwogCiAgICAgd2hpbGUgKDxJTj4pIHsKLQlpZiAoL14oLio/KENPTkZJR1xTKikoPS4qfCBpcyBub3Qgc2V0KSkvKSB7CisJaWYgKC9eKChDT05GSUdcUyopPS4qKS8pIHsKIAkgICAgJGNvbmZpZ19pZ25vcmV7JDJ9ID0gJDE7CiAJfQogICAgIH0KQEAgLTE2MzgsNyArMTYzOCw3IEBACiAJaWYgKCEkZm91bmQpIHsKIAkgICAgIyB0cnkgdGhlIG90aGVyIGhhbGYKIAkgICAgZG9wcmludCAiVG9wIGhhbGYgcHJvZHVjZWQgbm8gc2V0IGNvbmZpZ3MsIHRyeWluZyBib3R0b20gaGFsZlxuIjsKLQkgICAgQHRvcGhhbGYgPSBAc3RhcnRfbGlzdFskaGFsZiAuLiAkI3N0YXJ0X2xpc3RdOworCSAgICBAdG9waGFsZiA9IEBzdGFydF9saXN0WyRoYWxmICsgMSAuLiAkI3N0YXJ0X2xpc3RdOwogCSAgICBjcmVhdGVfY29uZmlnIEB0b3BoYWxmOwogCSAgICByZWFkX2N1cnJlbnRfY29uZmlnIFwlY3VycmVudF9jb25maWc7CiAJICAgIGZvcmVhY2ggbXkgJGNvbmZpZyAoQHRvcGhhbGYpIHsKQEAgLTE2OTAsNyArMTY5MCw3IEBACiAJIyByZW1vdmUgaGFsZiB0aGUgY29uZmlncyB3ZSBhcmUgbG9va2luZyBhdCBhbmQgc2VlIGlmCiAJIyB0aGV5IGFyZSBnb29kLgogCSRoYWxmID0gaW50KCQjc3RhcnRfbGlzdCAvIDIpOwotICAgIH0gd2hpbGUgKCRoYWxmID4gMCk7CisgICAgfSB3aGlsZSAoJCNzdGFydF9saXN0ID4gMCk7CiAKICAgICAjIHdlIGZvdW5kIGEgc2luZ2xlIGNvbmZpZywgdHJ5IGl0IGFnYWluIHVubGVzcyB3ZSBhcmUgcnVubmluZyBtYW51YWxseQogCmRpZmYgLS1naXQgYS90b29scy92aXJ0aW8vdmlydGlvX3Rlc3QuYyBiL3Rvb2xzL3ZpcnRpby92aXJ0aW9fdGVzdC5jCmluZGV4IGRmMGM2ZDIuLjc0ZDMzMzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ZpcnRpby92aXJ0aW9fdGVzdC5jCisrKyBiL3Rvb2xzL3ZpcnRpby92aXJ0aW9fdGVzdC5jCkBAIC0xOTgsNiArMTk4LDE0IEBACiAJCS52YWwgPSAnaCcsCiAJfSwKIAl7CisJCS5uYW1lID0gImV2ZW50LWlkeCIsCisJCS52YWwgPSAnRScsCisJfSwKKwl7CisJCS5uYW1lID0gIm5vLWV2ZW50LWlkeCIsCisJCS52YWwgPSAnZScsCisJfSwKKwl7CiAJCS5uYW1lID0gImluZGlyZWN0IiwKIAkJLnZhbCA9ICdJJywKIAl9LApAQCAtMjExLDEzICsyMTksMTcgQEAKIAogc3RhdGljIHZvaWQgaGVscCgpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJVc2FnZTogdmlydGlvX3Rlc3QgWy0taGVscF0gWy0tbm8taW5kaXJlY3RdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB2aXJ0aW9fdGVzdCBbLS1oZWxwXSIKKwkJIiBbLS1uby1pbmRpcmVjdF0iCisJCSIgWy0tbm8tZXZlbnQtaWR4XSIKKwkJIlxuIik7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlzdHJ1Y3QgdmRldl9pbmZvIGRldjsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZmVhdHVyZXMgPSAxVUxMIDw8IFZJUlRJT19SSU5HX0ZfSU5ESVJFQ1RfREVTQzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZmVhdHVyZXMgPSAoMVVMTCA8PCBWSVJUSU9fUklOR19GX0lORElSRUNUX0RFU0MpIHwKKwkJKDFVTEwgPDwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpOwogCWludCBvOwogCiAJZm9yICg7OykgewpAQCAtMjI4LDYgKzI0MCw5IEBACiAJCWNhc2UgJz8nOgogCQkJaGVscCgpOwogCQkJZXhpdCgyKTsKKwkJY2FzZSAnZSc6CisJCQlmZWF0dXJlcyAmPSB+KDFVTEwgPDwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpOworCQkJYnJlYWs7CiAJCWNhc2UgJ2gnOgogCQkJaGVscCgpOwogCQkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggMjJjZGI5Ni4uOTZlYmMwNiAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC00NjcsMTIgKzQ2Nyw4IEBACiAJCWlmICgha3ZtLT5idXNlc1tpXSkKIAkJCWdvdG8gb3V0X2VycjsKIAl9CisKIAlzcGluX2xvY2tfaW5pdCgma3ZtLT5tbXVfbG9jayk7Ci0KLQlyID0ga3ZtX2luaXRfbW11X25vdGlmaWVyKGt2bSk7Ci0JaWYgKHIpCi0JCWdvdG8gb3V0X2VycjsKLQogCWt2bS0+bW0gPSBjdXJyZW50LT5tbTsKIAlhdG9taWNfaW5jKCZrdm0tPm1tLT5tbV9jb3VudCk7CiAJa3ZtX2V2ZW50ZmRfaW5pdChrdm0pOwpAQCAtNDgwLDYgKzQ3NiwxMSBAQAogCW11dGV4X2luaXQoJmt2bS0+aXJxX2xvY2spOwogCW11dGV4X2luaXQoJmt2bS0+c2xvdHNfbG9jayk7CiAJYXRvbWljX3NldCgma3ZtLT51c2Vyc19jb3VudCwgMSk7CisKKwlyID0ga3ZtX2luaXRfbW11X25vdGlmaWVyKGt2bSk7CisJaWYgKHIpCisJCWdvdG8gb3V0X2VycjsKKwogCXJhd19zcGluX2xvY2soJmt2bV9sb2NrKTsKIAlsaXN0X2FkZCgma3ZtLT52bV9saXN0LCAmdm1fbGlzdCk7CiAJcmF3X3NwaW5fdW5sb2NrKCZrdm1fbG9jayk7CkBAIC02NTEsNyArNjUyLDkgQEAKIAkvKiBXZSBjYW4gcmVhZCB0aGUgZ3Vlc3QgbWVtb3J5IHdpdGggX194eHhfdXNlcigpIGxhdGVyIG9uLiAqLwogCWlmICh1c2VyX2FsbG9jICYmCiAJICAgICgobWVtLT51c2Vyc3BhY2VfYWRkciAmIChQQUdFX1NJWkUgLSAxKSkgfHwKLQkgICAgICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBtZW0tPnVzZXJzcGFjZV9hZGRyLCBtZW0tPm1lbW9yeV9zaXplKSkpCisJICAgICAhYWNjZXNzX29rKFZFUklGWV9XUklURSwKKwkJCSh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKW1lbS0+dXNlcnNwYWNlX2FkZHIsCisJCQltZW0tPm1lbW9yeV9zaXplKSkpCiAJCWdvdG8gb3V0OwogCWlmIChtZW0tPnNsb3QgPj0gS1ZNX01FTU9SWV9TTE9UUyArIEtWTV9QUklWQVRFX01FTV9TTE9UUykKIAkJZ290byBvdXQ7Cg==