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+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJRm9yIFZJRElPQ19TX0ZSRVFVRU5DWSB0aGUgdHlwZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBkZXZpY2Ugbm9kZSdzIHR5cGUuCisJSWYgbm90LCByZXR1cm4gLUVJTlZBTC4KK1doZW46CTMuMgorV2h5OglJdCBtYWtlcyBubyBzZW5zZSB0byBzd2l0Y2ggdGhlIHR1bmVyIHRvIHJhZGlvIG1vZGUgYnkgY2FsbGluZworCVZJRElPQ19TX0ZSRVFVRU5DWSBvbiBhIHZpZGVvIG5vZGUsIG9yIHRvIHN3aXRjaCB0aGUgdHVuZXIgdG8gdHYgbW9kZSBieQorCWNhbGxpbmcgVklESU9DX1NfRlJFUVVFTkNZIG9uIGEgcmFkaW8gbm9kZS4gVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCBvZiBhCisJbW92ZSB0byBtb3JlIGNvbnNpc3RlbnQgaGFuZGxpbmcgb2YgdHYgYW5kIHJhZGlvIHR1bmVycy4KK1dobzoJSGFucyBWZXJrdWlsIDxoYW5zLnZlcmt1aWxAY2lzY28uY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CU9wZW5pbmcgYSByYWRpbyBkZXZpY2Ugbm9kZSB3aWxsIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0aGUKKwl0dW5lciBtb2RlIGZyb20gdHYgdG8gcmFkaW8uCitXaGVuOgkzLjMKK1doeToJSnVzdCBvcGVuaW5nIGEgVjRMIGRldmljZSBzaG91bGQgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGhhcmR3YXJlCisJbGlrZSB0aGF0LiBJdCdzIHZlcnkgdW5leHBlY3RlZCBhbmQgYWdhaW5zdCB0aGUgVjRMIHNwZWMuIEluc3RlYWQsIHlvdQorCXN3aXRjaCB0byByYWRpbyBtb2RlIGJ5IGNhbGxpbmcgVklESU9DX1NfRlJFUVVFTkNZLiBUaGlzIGlzIHRoZSBzZWNvbmQKKwlhbmQgbGFzdCBzdGVwIG9mIHRoZSBtb3ZlIHRvIGNvbnNpc3RlbnQgaGFuZGxpbmcgb2YgdHYgYW5kIHJhZGlvIHR1bmVycy4KK1dobzoJSGFucyBWZXJrdWlsIDxoYW5zLnZlcmt1aWxAY2lzY28uY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NhY2hpbmcvbmV0ZnMtYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0CmluZGV4IGExNjdhYjguLjdjYzZiZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0CkBAIC02NzMsNiArNjczLDIyIEBACiBpbiB3aGljaCBjYXNlIHRoZSBwYWdlIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgdGhpcyB0aW1lLgogCiAKK0JVTEsgSU5PREUgUEFHRSBVTkNBQ0hFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGNvbnZlbmllbmNlIHJvdXRpbmUgaXMgcHJvdmlkZWQgdG8gcGVyZm9ybSBhbiB1bmNhY2hlIG9uIGFsbCB0aGUgcGFnZXMKK2F0dGFjaGVkIHRvIGFuIGlub2RlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHBhZ2VzIG9uIHRoZSBpbm9kZSBjb3JyZXNwb25kIG9uIGEKKzE6MSBiYXNpcyB3aXRoIHRoZSBwYWdlcyBpbiB0aGUgY2FjaGUuCisKKwl2b2lkIGZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoc3RydWN0IGZzY2FjaGVfY29va2llICpjb29raWUsCisJCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSk7CisKK1RoaXMgdGFrZXMgdGhlIG5ldGZzIGNvb2tpZSB0aGF0IHRoZSBwYWdlcyB3ZXJlIGNhY2hlZCB3aXRoIGFuZCB0aGUgaW5vZGUgdGhhdAordGhlIHBhZ2VzIGFyZSBhdHRhY2hlZCB0by4gIFRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBwYWdlcyB0byBmaW5pc2ggYmVpbmcKK3dyaXR0ZW4gdG8gdGhlIGNhY2hlIGFuZCBmb3IgdGhlIGNhY2hlIHRvIGZpbmlzaCB3aXRoIHRoZSBwYWdlIGdlbmVyYWxseS4gIE5vCitlcnJvciBpcyByZXR1cm5lZC4KKworCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogSU5ERVggQU5EIERBVEEgRklMRSBVUERBVEUKID09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQKaW5kZXggZDVjMGNlZi4uODczYTJhYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmlsZnMyLnR4dApAQCAtNDAsNyArNDAsNiBAQAogCS0gUE9TSVggQUNMcwogCS0gcXVvdGFzCiAJLSBmc2NrCi0JLSByZXNpemUKIAktIGRlZnJhZ21lbnRhdGlvbgogCiBNb3VudCBvcHRpb25zCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCBmNDgxNzgwLi5kYjNiMWFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTg0Myw2ICs4NDMsNyBAQAogIFRBU0tMRVQ6ICAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAyOTAKICAgIFNDSEVEOiAgICAgIDI3MDM1ICAgICAgMjY5ODMgICAgICAyNjk3MSAgICAgIDI2NzQ2CiAgSFJUSU1FUjogICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgMAorICAgICBSQ1U6ICAgICAgIDE2NzggICAgICAgMTc2OSAgICAgICAyMTc4ICAgICAgIDIyNTAKIAogCiAxLjMgSURFIGRldmljZXMgaW4gL3Byb2MvaWRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ViaWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWJpZnMudHh0CmluZGV4IDhlNGZhYjYuLmEwYTYxZDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWJpZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWJpZnMudHh0CkBAIC0xMTEsMzQgKzExMSw2IEBACiB0byBVQkkgYW5kIG1vdW50IHZvbHVtZSAicm9vdGZzIjoKIHViaS5tdGQ9MCByb290PXViaTA6cm9vdGZzIHJvb3Rmc3R5cGU9dWJpZnMKIAotCi1Nb2R1bGUgUGFyYW1ldGVycyBmb3IgRGVidWdnaW5nCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdoZW4gVUJJRlMgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZCwgdGhlcmUgYXJlIDIgbW9kdWxlCi1wYXJhbWV0ZXJzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byBjb250cm9sIGFzcGVjdHMgb2YgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCi1kZWJ1Z19jaGtzCVNlbGVjdHMgZXh0cmEgY2hlY2tzIHRoYXQgVUJJRlMgY2FuIGRvIHdoaWxlIHJ1bm5pbmc6Ci0KLQkJQ2hlY2sJCQkJCUZsYWcgdmFsdWUKLQotCQlHZW5lcmFsIGNoZWNrcwkJCQkxCi0JCUNoZWNrIFRyZWUgTm9kZSBDYWNoZSAoVE5DKQkJMgotCQlDaGVjayBpbmRleGluZyB0cmVlIHNpemUJCTQKLQkJQ2hlY2sgb3JwaGFuIGFyZWEJCQk4Ci0JCUNoZWNrIG9sZCBpbmRleGluZyB0cmVlCQkJMTYKLQkJQ2hlY2sgTEVCIHByb3BlcnRpZXMgKGxwcm9wcykJCTMyCi0JCUNoZWNrIGxlYWYgbm9kZXMgYW5kIGlub2RlcwkJNjQKLQotZGVidWdfdHN0cwlTZWxlY3RzIGEgbW9kZSBvZiB0ZXN0aW5nLCBhcyBmb2xsb3dzOgotCi0JCVRlc3QgbW9kZQkJCQlGbGFnIHZhbHVlCi0KLQkJRmFpbHVyZSBtb2RlIGZvciByZWNvdmVyeSB0ZXN0aW5nCTQKLQotRm9yIGV4YW1wbGUsIHNldCBkZWJ1Z19jaGtzIHRvIDMgdG8gZW5hYmxlIGdlbmVyYWwgYW5kIFROQyBjaGVja3MuCi0KLQogUmVmZXJlbmNlcwogPT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZwppbmRleCA4NGQyNjIzLi5kZTkxYzBkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKQEAgLTIyLDYgKzIyLDEwIEBACiAgICAgUHJlZml4OiAnZjcxODY5JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCiAgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSB0aGUgRmludGVrIHdlYnNpdGUKKyAgKiBGaW50ZWsgRjcxODY5QQorICAgIFByZWZpeDogJ2Y3MTg2OWEnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKKyAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWMKICAgKiBGaW50ZWsgRjcxODgyRkcgYW5kIEY3MTg4M0ZHCiAgICAgUHJlZml4OiAnZjcxODgyZmcnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vazEwdGVtcCBiL0RvY3VtZW50YXRpb24vaHdtb24vazEwdGVtcAppbmRleCAwMzkzYzg5Li5hMTBmNzM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2sxMHRlbXAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9rMTB0ZW1wCkBAIC05LDggKzksOCBAQAogICBTb2NrZXQgUzFHMzogQXRobG9uIElJLCBTZW1wcm9uLCBUdXJpb24gSUkKICogQU1EIEZhbWlseSAxMWggcHJvY2Vzc29yczoKICAgU29ja2V0IFMxRzI6IEF0aGxvbiAoWDIpLCBTZW1wcm9uIChYMiksIFR1cmlvbiBYMiAoVWx0cmEpCi0qIEFNRCBGYW1pbHkgMTJoIHByb2Nlc3NvcnM6ICJMbGFubyIKLSogQU1EIEZhbWlseSAxNGggcHJvY2Vzc29yczogIkJyYXpvcyIgKEMvRS9HLVNlcmllcykKKyogQU1EIEZhbWlseSAxMmggcHJvY2Vzc29yczogIkxsYW5vIiAoRTIvQTQvQTYvQTgtU2VyaWVzKQorKiBBTUQgRmFtaWx5IDE0aCBwcm9jZXNzb3JzOiAiQnJhem9zIiAoQy9FL0cvWi1TZXJpZXMpCiAqIEFNRCBGYW1pbHkgMTVoIHByb2Nlc3NvcnM6ICJCdWxsZG96ZXIiCiAKICAgUHJlZml4OiAnazEwdGVtcCcKQEAgLTIwLDEyICsyMCwxNiBAQAogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzMxMTE2LnBkZgogICBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIGZvciBBTUQgRmFtaWx5IDExaCBQcm9jZXNzb3JzOgogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQxMjU2LnBkZgorICBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIGZvciBBTUQgRmFtaWx5IDEyaCBQcm9jZXNzb3JzOgorICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQxMTMxLnBkZgogICBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIGZvciBBTUQgRmFtaWx5IDE0aCBNb2RlbHMgMDBoLTBGaCBQcm9jZXNzb3JzOgogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQzMTcwLnBkZgogICBSZXZpc2lvbiBHdWlkZSBmb3IgQU1EIEZhbWlseSAxMGggUHJvY2Vzc29yczoKICAgICBodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy80MTMyMi5wZGYKICAgUmV2aXNpb24gR3VpZGUgZm9yIEFNRCBGYW1pbHkgMTFoIFByb2Nlc3NvcnM6CiAgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDE3ODgucGRmCisgIFJldmlzaW9uIEd1aWRlIGZvciBBTUQgRmFtaWx5IDEyaCBQcm9jZXNzb3JzOgorICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQ0NzM5LnBkZgogICBSZXZpc2lvbiBHdWlkZSBmb3IgQU1EIEZhbWlseSAxNGggTW9kZWxzIDAwaC0wRmggUHJvY2Vzc29yczoKICAgICBodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy80NzUzNC5wZGYKICAgQU1EIEZhbWlseSAxMWggUHJvY2Vzc29yIFBvd2VyIGFuZCBUaGVybWFsIERhdGEgU2hlZXQgZm9yIE5vdGVib29rczoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggNTQzOGEyZC4uYWE0N2JlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTk5OSw3ICs5OTksMTAgQEAKIAkJCVdpdGggdGhpcyBvcHRpb24gb24gZXZlcnkgdW5tYXBfc2luZ2xlIG9wZXJhdGlvbiB3aWxsCiAJCQlyZXN1bHQgaW4gYSBoYXJkd2FyZSBJT1RMQiBmbHVzaCBvcGVyYXRpb24gYXMgb3Bwb3NlZAogCQkJdG8gYmF0Y2hpbmcgdGhlbSBmb3IgcGVyZm9ybWFuY2UuCi0KKwkJc3Bfb2ZmIFtEZWZhdWx0IE9mZl0KKwkJCUJ5IGRlZmF1bHQsIHN1cGVyIHBhZ2Ugd2lsbCBiZSBzdXBwb3J0ZWQgaWYgSW50ZWwgSU9NTVUKKwkJCWhhcyB0aGUgY2FwYWJpbGl0eS4gV2l0aCB0aGlzIG9wdGlvbiwgc3VwZXIgcGFnZSB3aWxsCisJCQlub3QgYmUgc3VwcG9ydGVkLgogCWludHJlbWFwPQlbWDg2LTY0LCBJbnRlbC1JT01NVV0KIAkJCUZvcm1hdDogeyBvbiAoZGVmYXVsdCkgfCBvZmYgfCBub3NpZCB9CiAJCQlvbgllbmFibGUgSW50ZXJydXB0IFJlbWFwcGluZyAoZGVmYXVsdCkKQEAgLTIwMTIsNiArMjAxNSw4IEBACiAJCQkJdGhlIGRlZmF1bHQuCiAJCQkJb2ZmOiBUdXJuIEVDUkMgb2ZmCiAJCQkJb246IFR1cm4gRUNSQyBvbi4KKwkJcmVhbGxvYwkJcmVhbGxvY2F0ZSBQQ0kgcmVzb3VyY2VzIGlmIGFsbG9jYXRpb25zIGRvbmUgYnkgQklPUworCQkJCWFyZSBlcnJvbmVvdXMuCiAKIAlwY2llX2FzcG09CVtQQ0lFXSBGb3JjaWJseSBlbmFibGUgb3IgZGlzYWJsZSBQQ0llIEFjdGl2ZSBTdGF0ZSBQb3dlcgogCQkJTWFuYWdlbWVudC4KQEAgLTI1OTUsNiArMjYwMCw4IEBACiAJCQkJCXVubG9jayBlamVjdGFibGUgbWVkaWEpOwogCQkJCW0gPSBNQVhfU0VDVE9SU182NCAoZG9uJ3QgdHJhbnNmZXIgbW9yZQogCQkJCQl0aGFuIDY0IHNlY3RvcnMgPSAzMiBLQiBhdCBhIHRpbWUpOworCQkJCW4gPSBJTklUSUFMX1JFQUQxMCAoZm9yY2UgYSByZXRyeSBvZiB0aGUKKwkJCQkJaW5pdGlhbCBSRUFEKDEwKSBjb21tYW5kKTsKIAkJCQlvID0gQ0FQQUNJVFlfT0sgKGFjY2VwdCB0aGUgY2FwYWNpdHkKIAkJCQkJcmVwb3J0ZWQgYnkgdGhlIGRldmljZSk7CiAJCQkJciA9IElHTk9SRV9SRVNJRFVFICh0aGUgZGV2aWNlIHJlcG9ydHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va21lbWxlYWsudHh0IGIvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKaW5kZXggMDkwZTZlZS4uNTEwNjNlNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKQEAgLTExLDcgKzExLDkgQEAKIHJlcG9ydGVkIHZpYSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQogVmFsZ3JpbmQgdG9vbCAobWVtY2hlY2sgLS1sZWFrLWNoZWNrKSB0byBkZXRlY3QgdGhlIG1lbW9yeSBsZWFrcyBpbgogdXNlci1zcGFjZSBhcHBsaWNhdGlvbnMuCi1LbWVtbGVhayBpcyBzdXBwb3J0ZWQgb24geDg2LCBhcm0sIHBvd2VycGMsIHNwYXJjLCBzaCwgbWljcm9ibGF6ZSBhbmQgdGlsZS4KKworUGxlYXNlIGNoZWNrIERFQlVHX0tNRU1MRUFLIGRlcGVuZGVuY2llcyBpbiBsaWIvS2NvbmZpZy5kZWJ1ZyBmb3Igc3VwcG9ydGVkCithcmNoaXRlY3R1cmVzLgogCiBVc2FnZQogLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dCBiL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAppbmRleCAxNTY1ZWVmZC4uNjE4MTU0OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dApAQCAtNTM0LDYgKzUzNCw4IEBACiAweDI0MDQJCVN5c3RlbSBpcyB3YWtpbmcgdXAgZnJvbSBoaWJlcm5hdGlvbiB0byB1bmRvY2sKIDB4MjQwNQkJU3lzdGVtIGlzIHdha2luZyB1cCBmcm9tIGhpYmVybmF0aW9uIHRvIGVqZWN0IGJheQogMHg1MDEwCQlCcmlnaHRuZXNzIGxldmVsIGNoYW5nZWQvY29udHJvbCBldmVudAorMHg2MDAwCQlLRVlCT0FSRDogTnVtbG9jayBrZXkgcHJlc3NlZAorMHg2MDA1CQlLRVlCT0FSRDogRm4ga2V5IHByZXNzZWQgKFRPIEJFIFZFUklGSUVEKQogCiBFdmVudHMgdGhhdCBhcmUgcHJvcGFnYXRlZCBieSB0aGUgZHJpdmVyIHRvIHVzZXJzcGFjZToKIApAQCAtNTQ1LDYgKzU0Nyw4IEBACiAweDMwMDYJCUJheSBob3RwbHVnIHJlcXVlc3QgKGhpbnQgdG8gcG93ZXIgdXAgU0FUQSBsaW5rIHdoZW4KIAkJdGhlIG9wdGljYWwgZHJpdmUgdHJheSBpcyBlamVjdGVkKQogMHg0MDAzCQlVbmRvY2tlZCAoc2VlIDB4MngwNCksIGNhbiBzbGVlcCBhZ2FpbgorMHg0MDEwCQlEb2NrZWQgaW50byBob3RwbHVnIHBvcnQgcmVwbGljYXRvciAobm9uLUFDUEkgZG9jaykKKzB4NDAxMQkJVW5kb2NrZWQgZnJvbSBob3RwbHVnIHBvcnQgcmVwbGljYXRvciAobm9uLUFDUEkgZG9jaykKIDB4NTAwQgkJVGFibGV0IHBlbiBpbnNlcnRlZCBpbnRvIGl0cyBzdG9yYWdlIGJheQogMHg1MDBDCQlUYWJsZXQgcGVuIHJlbW92ZWQgZnJvbSBpdHMgc3RvcmFnZSBiYXkKIDB4NjAxMQkJQUxBUk06IGJhdHRlcnkgaXMgdG9vIGhvdApAQCAtNTUyLDYgKzU1Niw3IEBACiAweDYwMjEJCUFMQVJNOiBhIHNlbnNvciBpcyB0b28gaG90CiAweDYwMjIJCUFMQVJNOiBhIHNlbnNvciBpcyBleHRyZW1lbHkgaG90CiAweDYwMzAJCVN5c3RlbSB0aGVybWFsIHRhYmxlIGNoYW5nZWQKKzB4NjA0MAkJTnZpZGlhIE9wdGltdXMvQUMgYWRhcHRlciByZWxhdGVkIChUTyBCRSBWRVJJRklFRCkKIAogQmF0dGVyeSBuZWFybHkgZW1wdHkgYWxhcm1zIGFyZSBhIGxhc3QgcmVzb3J0IGF0dGVtcHQgdG8gZ2V0IHRoZQogb3BlcmF0aW5nIHN5c3RlbSB0byBoaWJlcm5hdGUgb3Igc2h1dGRvd24gY2xlYW5seSAoMHgyMzEzKSwgb3Igc2h1dGRvd24KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWQudHh0IGIvRG9jdW1lbnRhdGlvbi9tZC50eHQKaW5kZXggMjM2NmIxYy4uZjBlZWU4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZC50eHQKQEAgLTU1NSw3ICs1NTUsNyBAQAogICAgc3luY19taW4KICAgIHN5bmNfbWF4CiAgICAgIFRoZSB0d28gdmFsdWVzLCBnaXZlbiBhcyBudW1iZXJzIG9mIHNlY3RvcnMsIGluZGljYXRlIGEgcmFuZ2UKLSAgICAgd2l0aGluZyB0aGUgYXJyYXkgd2hlcmUgJ2NoZWNrJy8ncmVwYWlyJyB3aWxsIG9wZXJhdGUuIE11c3QgYmUKKyAgICAgd2l0aGluIHRoZSBhcnJheSB3aGVyZSAnY2hlY2snLydyZXBhaXInIHdpbGwgb3BlcmF0ZS4gTXVzdCBiZQogICAgICBhIG11bHRpcGxlIG9mIGNodW5rX3NpemUuIFdoZW4gaXQgcmVhY2hlcyAic3luY19tYXgiIGl0IHdpbGwKICAgICAgcGF1c2UsIHJhdGhlciB0aGFuIGNvbXBsZXRlLgogICAgICBZb3UgY2FuIHVzZSAnc2VsZWN0JyBvciAncG9sbCcgb24gInN5bmNfY29tcGxldGVkIiB0byB3YWl0IGZvcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAppbmRleCBkM2Q2NTNhLi5iZmU5MjQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtMzQ2LDcgKzM0Niw3IEBACiAJd2hlbiBSVE8gcmV0cmFuc21pc3Npb25zIHJlbWFpbiB1bmFja25vd2xlZGdlZC4KIAlTZWUgdGNwX3JldHJpZXMyIGZvciBtb3JlIGRldGFpbHMuCiAKLQlUaGUgZGVmYXVsdCB2YWx1ZSBpcyA3LgorCVRoZSBkZWZhdWx0IHZhbHVlIGlzIDguCiAJSWYgeW91ciBtYWNoaW5lIGlzIGEgbG9hZGVkIFdFQiBzZXJ2ZXIsCiAJeW91IHNob3VsZCB0aGluayBhYm91dCBsb3dlcmluZyB0aGlzIHZhbHVlLCBzdWNoIHNvY2tldHMKIAltYXkgY29uc3VtZSBzaWduaWZpY2FudCByZXNvdXJjZXMuIENmLiB0Y3BfbWF4X29ycGhhbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dAppbmRleCA4ODg4MDgzLi42NDU2NWFhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQKQEAgLTUyMCw1OSArNTIwLDIwIEBACiBkZXZpY2UuICBUaGlzIGZpZWxkIGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdHlwZSBzdHJ1Y3QgZGV2X3Bvd2VyX2RvbWFpbiwKIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9wbS5oLCBwcm92aWRpbmcgYSBzZXQgb2YgcG93ZXIgbWFuYWdlbWVudCBjYWxsYmFja3MKIGFuYWxvZ291cyB0byB0aGUgc3Vic3lzdGVtLWxldmVsIGFuZCBkZXZpY2UgZHJpdmVyIGNhbGxiYWNrcyB0aGF0IGFyZSBleGVjdXRlZAotZm9yIHRoZSBnaXZlbiBkZXZpY2UgZHVyaW5nIGFsbCBwb3dlciB0cmFuc2l0aW9ucywgaW4gYWRkaXRpb24gdG8gdGhlIHJlc3BlY3RpdmUKLXN1YnN5c3RlbS1sZXZlbCBjYWxsYmFja3MuICBTcGVjaWZpY2FsbHksIHRoZSBwb3dlciBkb21haW4gInN1c3BlbmQiIGNhbGxiYWNrcwotKGkuZS4gLT5ydW50aW1lX3N1c3BlbmQoKSwgLT5zdXNwZW5kKCksIC0+ZnJlZXplKCksIC0+cG93ZXJvZmYoKSwgZXRjLikgYXJlCi1leGVjdXRlZCBhZnRlciB0aGUgYW5hbG9nb3VzIHN1YnN5c3RlbS1sZXZlbCBjYWxsYmFja3MsIHdoaWxlIHRoZSBwb3dlciBkb21haW4KLSJyZXN1bWUiIGNhbGxiYWNrcyAoaS5lLiAtPnJ1bnRpbWVfcmVzdW1lKCksIC0+cmVzdW1lKCksIC0+dGhhdygpLCAtPnJlc3RvcmUsCi1ldGMuKSBhcmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBhbmFsb2dvdXMgc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcy4gIEVycm9yIGNvZGVzCi1yZXR1cm5lZCBieSB0aGUgInN1c3BlbmQiIGFuZCAicmVzdW1lIiBwb3dlciBkb21haW4gY2FsbGJhY2tzIGFyZSBpZ25vcmVkLgorZm9yIHRoZSBnaXZlbiBkZXZpY2UgZHVyaW5nIGFsbCBwb3dlciB0cmFuc2l0aW9ucywgaW5zdGVhZCBvZiB0aGUgcmVzcGVjdGl2ZQorc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcy4gIFNwZWNpZmljYWxseSwgaWYgYSBkZXZpY2UncyBwbV9kb21haW4gcG9pbnRlciBpcworbm90IE5VTEwsIHRoZSAtPnN1c3BlbmQoKSBjYWxsYmFjayBmcm9tIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBpdCB3aWxsIGJlCitleGVjdXRlZCBpbnN0ZWFkIG9mIGl0cyBzdWJzeXN0ZW0ncyAoZS5nLiBidXMgdHlwZSdzKSAtPnN1c3BlbmQoKSBjYWxsYmFjayBhbmQKK2FubG9nb3VzbHkgZm9yIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcy4gIEluIG90aGVyIHdvcmRzLCBwb3dlciBtYW5hZ2VtZW50Citkb21haW4gY2FsbGJhY2tzLCBpZiBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gZGV2aWNlLCBhbHdheXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIKK3RoZSBjYWxsYmFja3MgcHJvdmlkZWQgYnkgdGhlIGRldmljZSdzIHN1YnN5c3RlbSAoZS5nLiBidXMgdHlwZSkuCiAKLVBvd2VyIGRvbWFpbiAtPnJ1bnRpbWVfaWRsZSgpIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgc3Vic3lzdGVtLWxldmVsCi0tPnJ1bnRpbWVfaWRsZSgpIGNhbGxiYWNrIGFuZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IGl0IGlzIG5vdCBpZ25vcmVkLiAgTmFtZWx5LAotaWYgaXQgcmV0dXJucyBlcnJvciBjb2RlLCB0aGUgc3Vic3lzdGVtLWxldmVsIC0+cnVudGltZV9pZGxlKCkgY2FsbGJhY2sgd2lsbCBub3QKLWJlIGNhbGxlZCBhbmQgdGhlIGhlbHBlciBmdW5jdGlvbiBycG1faWRsZSgpIGV4ZWN1dGluZyBpdCB3aWxsIHJldHVybiBlcnJvcgotY29kZS4gIFRoaXMgbWVjaGFuaXNtIGlzIGludGVuZGVkIHRvIGhlbHAgcGxhdGZvcm1zIHdoZXJlIHNhdmluZyBkZXZpY2Ugc3RhdGUKLWlzIGEgdGltZSBjb25zdW1pbmcgb3BlcmF0aW9uIGFuZCBzaG91bGQgb25seSBiZSBjYXJyaWVkIG91dCBpZiBhbGwgZGV2aWNlcwotaW4gdGhlIHBvd2VyIGRvbWFpbiBhcmUgaWRsZSwgYmVmb3JlIHR1cm5pbmcgb2ZmIHRoZSBzaGFyZWQgcG93ZXIgcmVzb3VyY2UocykuCi1OYW1lbHksIHRoZSBwb3dlciBkb21haW4gLT5ydW50aW1lX2lkbGUoKSBjYWxsYmFjayBtYXkgcmV0dXJuIGVycm9yIGNvZGUgdW50aWwKLXRoZSBwbV9ydW50aW1lX2lkbGUoKSBoZWxwZXIgKG9yIGl0cyBhc3ljaHJvbm91cyB2ZXJzaW9uKSBoYXMgYmVlbiBjYWxsZWQgZm9yCi1hbGwgZGV2aWNlcyBpbiB0aGUgcG93ZXIgZG9tYWluIChpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSByZXR1cm5lZCBlcnJvciBjb2RlCi1iZSAtRUJVU1kgaW4gdGhvc2UgY2FzZXMpLCBwcmV2ZW50aW5nIHRoZSBzdWJzeXN0ZW0tbGV2ZWwgLT5ydW50aW1lX2lkbGUoKQotY2FsbGJhY2sgZnJvbSBiZWluZyBydW4gcHJlbWF0dXJlbHkuCi0KLVRoZSBzdXBwb3J0IGZvciBkZXZpY2UgcG93ZXIgZG9tYWlucyBpcyBvbmx5IHJlbGV2YW50IHRvIHBsYXRmb3JtcyBuZWVkaW5nIHRvCi11c2UgdGhlIHNhbWUgc3Vic3lzdGVtLWxldmVsIChlLmcuIHBsYXRmb3JtIGJ1cyB0eXBlKSBhbmQgZGV2aWNlIGRyaXZlciBwb3dlcgotbWFuYWdlbWVudCBjYWxsYmFja3MgaW4gbWFueSBkaWZmZXJlbnQgcG93ZXIgZG9tYWluIGNvbmZpZ3VyYXRpb25zIGFuZCB3YW50aW5nCi10byBhdm9pZCBpbmNvcnBvcmF0aW5nIHRoZSBzdXBwb3J0IGZvciBwb3dlciBkb21haW5zIGludG8gdGhlIHN1YnN5c3RlbS1sZXZlbAotY2FsbGJhY2tzLiAgVGhlIG90aGVyIHBsYXRmb3JtcyBuZWVkIG5vdCBpbXBsZW1lbnQgaXQgb3IgdGFrZSBpdCBpbnRvIGFjY291bnQKLWluIGFueSB3YXkuCi0KLQotU3lzdGVtIERldmljZXMKLS0tLS0tLS0tLS0tLS0tCi1TeXN0ZW0gZGV2aWNlcyAoc3lzZGV2cykgZm9sbG93IGEgc2xpZ2h0bHkgZGlmZmVyZW50IEFQSSwgd2hpY2ggY2FuIGJlIGZvdW5kIGluCi0KLQlpbmNsdWRlL2xpbnV4L3N5c2Rldi5oCi0JZHJpdmVycy9iYXNlL3N5cy5jCi0KLVN5c3RlbSBkZXZpY2VzIHdpbGwgYmUgc3VzcGVuZGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCwgYW5kIGFmdGVyIGFsbCBvdGhlcgotZGV2aWNlcyBoYXZlIGJlZW4gc3VzcGVuZGVkLiAgT24gcmVzdW1lLCB0aGV5IHdpbGwgYmUgcmVzdW1lZCBiZWZvcmUgYW55IG90aGVyCi1kZXZpY2VzLCBhbmQgYWxzbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBUaGVzZSB0aGluZ3Mgb2NjdXIgaW4gc3BlY2lhbAotInN5c2Rldl9kcml2ZXIiIHBoYXNlcywgd2hpY2ggYWZmZWN0IG9ubHkgc3lzdGVtIGRldmljZXMuCi0KLVRodXMsIGFmdGVyIHRoZSBzdXNwZW5kX25vaXJxIChvciBmcmVlemVfbm9pcnEgb3IgcG93ZXJvZmZfbm9pcnEpIHBoYXNlLCB3aGVuCi10aGUgbm9uLWJvb3QgQ1BVcyBhcmUgYWxsIG9mZmxpbmUgYW5kIElSUXMgYXJlIGRpc2FibGVkIG9uIHRoZSByZW1haW5pbmcgb25saW5lCi1DUFUsIHRoZW4gYSBzeXNkZXZfZHJpdmVyLnN1c3BlbmQgcGhhc2UgaXMgY2FycmllZCBvdXQsIGFuZCB0aGUgc3lzdGVtIGVudGVycyBhCi1zbGVlcCBzdGF0ZSAob3IgYSBzeXN0ZW0gaW1hZ2UgaXMgY3JlYXRlZCkuICBEdXJpbmcgcmVzdW1lIChvciBhZnRlciB0aGUgaW1hZ2UKLWhhcyBiZWVuIGNyZWF0ZWQgb3IgbG9hZGVkKSBhIHN5c2Rldl9kcml2ZXIucmVzdW1lIHBoYXNlIGlzIGNhcnJpZWQgb3V0LCBJUlFzCi1hcmUgZW5hYmxlZCBvbiB0aGUgb25seSBvbmxpbmUgQ1BVLCB0aGUgbm9uLWJvb3QgQ1BVcyBhcmUgZW5hYmxlZCwgYW5kIHRoZQotcmVzdW1lX25vaXJxIChvciB0aGF3X25vaXJxIG9yIHJlc3RvcmVfbm9pcnEpIHBoYXNlIGJlZ2lucy4KLQotQ29kZSB0byBhY3R1YWxseSBlbnRlciBhbmQgZXhpdCB0aGUgc3lzdGVtLXdpZGUgbG93IHBvd2VyIHN0YXRlIHNvbWV0aW1lcwotaW52b2x2ZXMgaGFyZHdhcmUgZGV0YWlscyB0aGF0IGFyZSBvbmx5IGtub3duIHRvIHRoZSBib290IGZpcm13YXJlLCBhbmQKLW1heSBsZWF2ZSBhIENQVSBydW5uaW5nIHNvZnR3YXJlIChmcm9tIFNSQU0gb3IgZmxhc2ggbWVtb3J5KSB0aGF0IG1vbml0b3JzCi10aGUgc3lzdGVtIGFuZCBtYW5hZ2VzIGl0cyB3YWtldXAgc2VxdWVuY2UuCitUaGUgc3VwcG9ydCBmb3IgZGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgZG9tYWlucyBpcyBvbmx5IHJlbGV2YW50IHRvIHBsYXRmb3JtcworbmVlZGluZyB0byB1c2UgdGhlIHNhbWUgZGV2aWNlIGRyaXZlciBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrcyBpbiBtYW55CitkaWZmZXJlbnQgcG93ZXIgZG9tYWluIGNvbmZpZ3VyYXRpb25zIGFuZCB3YW50aW5nIHRvIGF2b2lkIGluY29ycG9yYXRpbmcgdGhlCitzdXBwb3J0IGZvciBwb3dlciBkb21haW5zIGludG8gc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcywgZm9yIGV4YW1wbGUgYnkKK21vZGlmeWluZyB0aGUgcGxhdGZvcm0gYnVzIHR5cGUuICBPdGhlciBwbGF0Zm9ybXMgbmVlZCBub3QgaW1wbGVtZW50IGl0IG9yIHRha2UKK2l0IGludG8gYWNjb3VudCBpbiBhbnkgd2F5LgogCiAKIERldmljZSBMb3cgUG93ZXIgKHN1c3BlbmQpIFN0YXRlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKaW5kZXggNjU0MDk3Yi4uYjI0ODc1YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CkBAIC01MDEsMTMgKzUwMSwyOSBAQAogc2hvdWxkIGJlIHVzZWQuICBPZiBjb3Vyc2UsIGZvciB0aGlzIHB1cnBvc2UgdGhlIGRldmljZSdzIHJ1bi10aW1lIFBNIGhhcyB0byBiZQogZW5hYmxlZCBlYXJsaWVyIGJ5IGNhbGxpbmcgcG1fcnVudGltZV9lbmFibGUoKS4KIAotSWYgdGhlIGRldmljZSBidXMgdHlwZSdzIG9yIGRyaXZlcidzIC0+cHJvYmUoKSBvciAtPnJlbW92ZSgpIGNhbGxiYWNrIHJ1bnMKK0lmIHRoZSBkZXZpY2UgYnVzIHR5cGUncyBvciBkcml2ZXIncyAtPnByb2JlKCkgY2FsbGJhY2sgcnVucwogcG1fcnVudGltZV9zdXNwZW5kKCkgb3IgcG1fcnVudGltZV9pZGxlKCkgb3IgdGhlaXIgYXN5bmNocm9ub3VzIGNvdW50ZXJwYXJ0cywKIHRoZXkgd2lsbCBmYWlsIHJldHVybmluZyAtRUFHQUlOLCBiZWNhdXNlIHRoZSBkZXZpY2UncyB1c2FnZSBjb3VudGVyIGlzCi1pbmNyZW1lbnRlZCBieSB0aGUgY29yZSBiZWZvcmUgZXhlY3V0aW5nIC0+cHJvYmUoKSBhbmQgLT5yZW1vdmUoKS4gIFN0aWxsLCBpdAotbWF5IGJlIGRlc2lyYWJsZSB0byBzdXNwZW5kIHRoZSBkZXZpY2UgYXMgc29vbiBhcyAtPnByb2JlKCkgb3IgLT5yZW1vdmUoKSBoYXMKLWZpbmlzaGVkLCBzbyB0aGUgUE0gY29yZSB1c2VzIHBtX3J1bnRpbWVfaWRsZV9zeW5jKCkgdG8gaW52b2tlIHRoZQotc3Vic3lzdGVtLWxldmVsIGlkbGUgY2FsbGJhY2sgZm9yIHRoZSBkZXZpY2UgYXQgdGhhdCB0aW1lLgoraW5jcmVtZW50ZWQgYnkgdGhlIGRyaXZlciBjb3JlIGJlZm9yZSBleGVjdXRpbmcgLT5wcm9iZSgpLiAgU3RpbGwsIGl0IG1heSBiZQorZGVzaXJhYmxlIHRvIHN1c3BlbmQgdGhlIGRldmljZSBhcyBzb29uIGFzIC0+cHJvYmUoKSBoYXMgZmluaXNoZWQsIHNvIHRoZSBkcml2ZXIKK2NvcmUgdXNlcyBwbV9ydW50aW1lX3B1dF9zeW5jKCkgdG8gaW52b2tlIHRoZSBzdWJzeXN0ZW0tbGV2ZWwgaWRsZSBjYWxsYmFjayBmb3IKK3RoZSBkZXZpY2UgYXQgdGhhdCB0aW1lLgorCitNb3Jlb3ZlciwgdGhlIGRyaXZlciBjb3JlIHByZXZlbnRzIHJ1bnRpbWUgUE0gY2FsbGJhY2tzIGZyb20gcmFjaW5nIHdpdGggdGhlIGJ1cworbm90aWZpZXIgY2FsbGJhY2sgaW4gX19kZXZpY2VfcmVsZWFzZV9kcml2ZXIoKSwgd2hpY2ggaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZQorbm90aWZpZXIgaXMgdXNlZCBieSBzb21lIHN1YnN5c3RlbXMgdG8gY2Fycnkgb3V0IG9wZXJhdGlvbnMgYWZmZWN0aW5nIHRoZQorcnVudGltZSBQTSBmdW5jdGlvbmFsaXR5LiAgSXQgZG9lcyBzbyBieSBjYWxsaW5nIHBtX3J1bnRpbWVfZ2V0X3N5bmMoKSBiZWZvcmUKK2RyaXZlcl9zeXNmc19yZW1vdmUoKSBhbmQgdGhlIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUiBub3RpZmljYXRpb25zLiAgVGhpcworcmVzdW1lcyB0aGUgZGV2aWNlIGlmIGl0J3MgaW4gdGhlIHN1c3BlbmRlZCBzdGF0ZSBhbmQgcHJldmVudHMgaXQgZnJvbQorYmVpbmcgc3VzcGVuZGVkIGFnYWluIHdoaWxlIHRob3NlIHJvdXRpbmVzIGFyZSBiZWluZyBleGVjdXRlZC4KKworVG8gYWxsb3cgYnVzIHR5cGVzIGFuZCBkcml2ZXJzIHRvIHB1dCBkZXZpY2VzIGludG8gdGhlIHN1c3BlbmRlZCBzdGF0ZSBieQorY2FsbGluZyBwbV9ydW50aW1lX3N1c3BlbmQoKSBmcm9tIHRoZWlyIC0+cmVtb3ZlKCkgcm91dGluZXMsIHRoZSBkcml2ZXIgY29yZQorZXhlY3V0ZXMgcG1fcnVudGltZV9wdXRfc3luYygpIGFmdGVyIHJ1bm5pbmcgdGhlIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUgorbm90aWZpY2F0aW9ucyBpbiBfX2RldmljZV9yZWxlYXNlX2RyaXZlcigpLiAgVGhpcyByZXF1aXJlcyBidXMgdHlwZXMgYW5kCitkcml2ZXJzIHRvIG1ha2UgdGhlaXIgLT5yZW1vdmUoKSBjYWxsYmFja3MgYXZvaWQgcmFjZXMgd2l0aCBydW50aW1lIFBNIGRpcmVjdGx5LAorYnV0IGFsc28gaXQgYWxsb3dzIG9mIG1vcmUgZmxleGliaWxpdHkgaW4gdGhlIGhhbmRsaW5nIG9mIGRldmljZXMgZHVyaW5nIHRoZQorcmVtb3ZhbCBvZiB0aGVpciBkcml2ZXJzLgogCiBUaGUgdXNlciBzcGFjZSBjYW4gZWZmZWN0aXZlbHkgZGlzYWxsb3cgdGhlIGRyaXZlciBvZiB0aGUgZGV2aWNlIHRvIHBvd2VyIG1hbmFnZQogaXQgYXQgcnVuIHRpbWUgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGl0cyAvc3lzL2RldmljZXMvLi4uL3Bvd2VyL2NvbnRyb2wKQEAgLTU2NiwxMSArNTgyLDYgQEAKIAlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwogCi1UaGUgUE0gY29yZSBhbHdheXMgaW5jcmVtZW50cyB0aGUgcnVuLXRpbWUgdXNhZ2UgY291bnRlciBiZWZvcmUgY2FsbGluZyB0aGUKLS0+cHJlcGFyZSgpIGNhbGxiYWNrIGFuZCBkZWNyZW1lbnRzIGl0IGFmdGVyIGNhbGxpbmcgdGhlIC0+Y29tcGxldGUoKSBjYWxsYmFjay4KLUhlbmNlIGRpc2FibGluZyBydW4tdGltZSBQTSB0ZW1wb3JhcmlseSBsaWtlIHRoaXMgd2lsbCBub3QgY2F1c2UgYW55IHJ1bi10aW1lCi1zdXNwZW5kIGNhbGxiYWNrcyB0byBiZSBsb3N0LgotCiA3LiBHZW5lcmljIHN1YnN5c3RlbSBjYWxsYmFja3MKIAogU3Vic3lzdGVtcyBtYXkgd2lzaCB0byBjb25zZXJ2ZSBjb2RlIHNwYWNlIGJ5IHVzaW5nIHRoZSBzZXQgb2YgZ2VuZXJpYyBwb3dlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wcmludGstZm9ybWF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL3ByaW50ay1mb3JtYXRzLnR4dAppbmRleCAxYjVhNWRkLi41ZGYxNzZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ByaW50ay1mb3JtYXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ByaW50ay1mb3JtYXRzLnR4dApAQCAtOSw3ICs5LDEyMSBAQAogCQlzaXplX3QJCQklenUgb3IgJXp4CiAJCXNzaXplX3QJCQklemQgb3IgJXp4CiAKLVJhdyBwb2ludGVyIHZhbHVlIFNIT1VMRCBiZSBwcmludGVkIHdpdGggJXAuCitSYXcgcG9pbnRlciB2YWx1ZSBTSE9VTEQgYmUgcHJpbnRlZCB3aXRoICVwLiBUaGUga2VybmVsIHN1cHBvcnRzCit0aGUgZm9sbG93aW5nIGV4dGVuZGVkIGZvcm1hdCBzcGVjaWZpZXJzIGZvciBwb2ludGVyIHR5cGVzOgorCitTeW1ib2xzL0Z1bmN0aW9uIFBvaW50ZXJzOgorCisJJXBGCXZlcnNhdGlsZV9pbml0KzB4MC8weDExMAorCSVwZgl2ZXJzYXRpbGVfaW5pdAorCSVwUwl2ZXJzYXRpbGVfaW5pdCsweDAvMHgxMTAKKwklcHMJdmVyc2F0aWxlX2luaXQKKwklcEIJcHJldl9mbl9vZl92ZXJzYXRpbGVfaW5pdCsweDg4LzB4ODgKKworCUZvciBwcmludGluZyBzeW1ib2xzIGFuZCBmdW5jdGlvbiBwb2ludGVycy4gVGhlICdTJyBhbmQgJ3MnIHNwZWNpZmllcnMKKwlyZXN1bHQgaW4gdGhlIHN5bWJvbCBuYW1lIHdpdGggKCdTJykgb3Igd2l0aG91dCAoJ3MnKSBvZmZzZXRzLiBXaGVyZQorCXRoaXMgaXMgdXNlZCBvbiBhIGtlcm5lbCB3aXRob3V0IEtBTExTWU1TIC0gdGhlIHN5bWJvbCBhZGRyZXNzIGlzCisJcHJpbnRlZCBpbnN0ZWFkLgorCisJVGhlICdCJyBzcGVjaWZpZXIgcmVzdWx0cyBpbiB0aGUgc3ltYm9sIG5hbWUgd2l0aCBvZmZzZXRzIGFuZCBzaG91bGQgYmUKKwl1c2VkIHdoZW4gcHJpbnRpbmcgc3RhY2sgYmFja3RyYWNlcy4gVGhlIHNwZWNpZmllciB0YWtlcyBpbnRvCisJY29uc2lkZXJhdGlvbiB0aGUgZWZmZWN0IG9mIGNvbXBpbGVyIG9wdGltaXNhdGlvbnMgd2hpY2ggbWF5IG9jY3VyCisJd2hlbiB0YWlsLWNhbGwncyBhcmUgdXNlZCBhbmQgbWFya2VkIHdpdGggdGhlIG5vcmV0dXJuIEdDQyBhdHRyaWJ1dGUuCisKKwlPbiBpYTY0LCBwcGM2NCBhbmQgcGFyaXNjNjQgYXJjaGl0ZWN0dXJlcyBmdW5jdGlvbiBwb2ludGVycyBhcmUKKwlhY3R1YWxseSBmdW5jdGlvbiBkZXNjcmlwdG9ycyB3aGljaCBtdXN0IGZpcnN0IGJlIHJlc29sdmVkLiBUaGUgJ0YnIGFuZAorCSdmJyBzcGVjaWZpZXJzIHBlcmZvcm0gdGhpcyByZXNvbHV0aW9uIGFuZCB0aGVuIHByb3ZpZGUgdGhlIHNhbWUKKwlmdW5jdGlvbmFsaXR5IGFzIHRoZSAnUycgYW5kICdzJyBzcGVjaWZpZXJzLgorCitLZXJuZWwgUG9pbnRlcnM6CisKKwklcEsJMHgwMTIzNDU2NyBvciAweDAxMjM0NTY3ODlhYmNkZWYKKworCUZvciBwcmludGluZyBrZXJuZWwgcG9pbnRlcnMgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHVucHJpdmlsZWdlZAorCXVzZXJzLiBUaGUgYmVoYXZpb3VyIG9mICVwSyBkZXBlbmRzIG9uIHRoZSBrcHRyX3Jlc3RyaWN0IHN5c2N0bCAtIHNlZQorCURvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKworU3RydWN0IFJlc291cmNlczoKKworCSVwcglbbWVtIDB4NjAwMDAwMDAtMHg2ZmZmZmZmZiBmbGFncyAweDIyMDBdIG9yCisJCVttZW0gMHgwMDAwMDAwMDYwMDAwMDAwLTB4MDAwMDAwMDA2ZmZmZmZmZiBmbGFncyAweDIyMDBdCisJJXBSCVttZW0gMHg2MDAwMDAwMC0weDZmZmZmZmZmIHByZWZdIG9yCisJCVttZW0gMHgwMDAwMDAwMDYwMDAwMDAwLTB4MDAwMDAwMDA2ZmZmZmZmZiBwcmVmXQorCisJRm9yIHByaW50aW5nIHN0cnVjdCByZXNvdXJjZXMuIFRoZSAnUicgYW5kICdyJyBzcGVjaWZpZXJzIHJlc3VsdCBpbiBhCisJcHJpbnRlZCByZXNvdXJjZSB3aXRoICgnUicpIG9yIHdpdGhvdXQgKCdyJykgYSBkZWNvZGVkIGZsYWdzIG1lbWJlci4KKworTUFDL0ZEREkgYWRkcmVzc2VzOgorCisJJXBNCTAwOjAxOjAyOjAzOjA0OjA1CisJJXBNRgkwMC0wMS0wMi0wMy0wNC0wNQorCSVwbQkwMDAxMDIwMzA0MDUKKworCUZvciBwcmludGluZyA2LWJ5dGUgTUFDL0ZEREkgYWRkcmVzc2VzIGluIGhleCBub3RhdGlvbi4gVGhlICdNJyBhbmQgJ20nCisJc3BlY2lmaWVycyByZXN1bHQgaW4gYSBwcmludGVkIGFkZHJlc3Mgd2l0aCAoJ00nKSBvciB3aXRob3V0ICgnbScpIGJ5dGUKKwlzZXBhcmF0b3JzLiBUaGUgZGVmYXVsdCBieXRlIHNlcGFyYXRvciBpcyB0aGUgY29sb24gKCc6JykuCisKKwlXaGVyZSBGRERJIGFkZHJlc3NlcyBhcmUgY29uY2VybmVkIHRoZSAnRicgc3BlY2lmaWVyIGNhbiBiZSB1c2VkIGFmdGVyCisJdGhlICdNJyBzcGVjaWZpZXIgdG8gdXNlIGRhc2ggKCctJykgc2VwYXJhdG9ycyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0CisJc2VwYXJhdG9yLgorCitJUHY0IGFkZHJlc3NlczoKKworCSVwSTQJMS4yLjMuNAorCSVwaTQJMDAxLjAwMi4wMDMuMDA0CisJJXBbSWldW2huYmxdCisKKwlGb3IgcHJpbnRpbmcgSVB2NCBkb3Qtc2VwYXJhdGVkIGRlY2ltYWwgYWRkcmVzc2VzLiBUaGUgJ0k0JyBhbmQgJ2k0JworCXNwZWNpZmllcnMgcmVzdWx0IGluIGEgcHJpbnRlZCBhZGRyZXNzIHdpdGggKCdpNCcpIG9yIHdpdGhvdXQgKCdJNCcpCisJbGVhZGluZyB6ZXJvcy4KKworCVRoZSBhZGRpdGlvbmFsICdoJywgJ24nLCAnYicsIGFuZCAnbCcgc3BlY2lmaWVycyBhcmUgdXNlZCB0byBzcGVjaWZ5CisJaG9zdCwgbmV0d29yaywgYmlnIG9yIGxpdHRsZSBlbmRpYW4gb3JkZXIgYWRkcmVzc2VzIHJlc3BlY3RpdmVseS4gV2hlcmUKKwlubyBzcGVjaWZpZXIgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgbmV0d29yay9iaWcgZW5kaWFuIG9yZGVyIGlzIHVzZWQuCisKK0lQdjYgYWRkcmVzc2VzOgorCisJJXBJNgkwMDAxOjAwMDI6MDAwMzowMDA0OjAwMDU6MDAwNjowMDA3OjAwMDgKKwklcGk2CTAwMDEwMDAyMDAwMzAwMDQwMDA1MDAwNjAwMDcwMDA4CisJJXBJNmMJMToyOjM6NDo1OjY6Nzo4CisKKwlGb3IgcHJpbnRpbmcgSVB2NiBuZXR3b3JrLW9yZGVyIDE2LWJpdCBoZXggYWRkcmVzc2VzLiBUaGUgJ0k2JyBhbmQgJ2k2JworCXNwZWNpZmllcnMgcmVzdWx0IGluIGEgcHJpbnRlZCBhZGRyZXNzIHdpdGggKCdJNicpIG9yIHdpdGhvdXQgKCdpNicpCisJY29sb24tc2VwYXJhdG9ycy4gTGVhZGluZyB6ZXJvcyBhcmUgYWx3YXlzIHVzZWQuCisKKwlUaGUgYWRkaXRpb25hbCAnYycgc3BlY2lmaWVyIGNhbiBiZSB1c2VkIHdpdGggdGhlICdJJyBzcGVjaWZpZXIgdG8KKwlwcmludCBhIGNvbXByZXNzZWQgSVB2NiBhZGRyZXNzIGFzIGRlc2NyaWJlZCBieQorCWh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU5NTIKKworVVVJRC9HVUlEIGFkZHJlc3NlczoKKworCSVwVWIJMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmCisJJXBVQgkwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wQTBCMEMwRDBFMEYKKwklcFVsCTAzMDIwMTAwLTA1MDQtMDcwNi0wODA5LTBhMGIwYzBlMGUwZgorCSVwVUwJMDMwMjAxMDAtMDUwNC0wNzA2LTA4MDktMEEwQjBDMEUwRTBGCisKKwlGb3IgcHJpbnRpbmcgMTYtYnl0ZSBVVUlEL0dVSURzIGFkZHJlc3Nlcy4gVGhlIGFkZGl0aW9uYWwgJ2wnLCAnTCcsCisJJ2InIGFuZCAnQicgc3BlY2lmaWVycyBhcmUgdXNlZCB0byBzcGVjaWZ5IGEgbGl0dGxlIGVuZGlhbiBvcmRlciBpbgorCWxvd2VyICgnbCcpIG9yIHVwcGVyIGNhc2UgKCdMJykgaGV4IGNoYXJhY3RlcnMgLSBhbmQgYmlnIGVuZGlhbiBvcmRlcgorCWluIGxvd2VyICgnYicpIG9yIHVwcGVyIGNhc2UgKCdCJykgaGV4IGNoYXJhY3RlcnMuCisKKwlXaGVyZSBubyBhZGRpdGlvbmFsIHNwZWNpZmllcnMgYXJlIHVzZWQgdGhlIGRlZmF1bHQgbGl0dGxlIGVuZGlhbgorCW9yZGVyIHdpdGggbG93ZXIgY2FzZSBoZXggY2hhcmFjdGVycyB3aWxsIGJlIHByaW50ZWQuCisKK3N0cnVjdCB2YV9mb3JtYXQ6CisKKwklcFYKKworCUZvciBwcmludGluZyBzdHJ1Y3QgdmFfZm9ybWF0IHN0cnVjdHVyZXMuIFRoZXNlIGNvbnRhaW4gYSBmb3JtYXQgc3RyaW5nCisJYW5kIHZhX2xpc3QgYXMgZm9sbG93czoKKworCXN0cnVjdCB2YV9mb3JtYXQgeworCQljb25zdCBjaGFyICpmbXQ7CisJCXZhX2xpc3QgKnZhOworCX07CisKKwlEbyBub3QgdXNlIHRoaXMgZmVhdHVyZSB3aXRob3V0IHNvbWUgbWVjaGFuaXNtIHRvIHZlcmlmeSB0aGUKKwljb3JyZWN0bmVzcyBvZiB0aGUgZm9ybWF0IHN0cmluZyBhbmQgdmFfbGlzdCBhcmd1bWVudHMuCiAKIHU2NCBTSE9VTEQgYmUgcHJpbnRlZCB3aXRoICVsbHUvJWxseCwgKHVuc2lnbmVkIGxvbmcgbG9uZyk6CiAKQEAgLTMyLDQgKzE0Niw1IEBACiBUaGFuayB5b3UgZm9yIHlvdXIgY29vcGVyYXRpb24gYW5kIGF0dGVudGlvbi4KIAogCi1CeSBSYW5keSBEdW5sYXAgPHJkdW5sYXBAeGVub3RpbWUubmV0PgorQnkgUmFuZHkgRHVubGFwIDxyZHVubGFwQHhlbm90aW1lLm5ldD4gYW5kCitBbmRyZXcgTXVycmF5IDxhbXVycmF5QG1wYy1kYXRhLmNvLnVrPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dAppbmRleCA5OTk2MTk5Li45MWVjZmYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dApAQCAtMjIzLDkgKzIyMywxMCBAQAogZ3JvdXAgY3JlYXRlZCB1c2luZyB0aGUgcHNldWRvIGZpbGVzeXN0ZW0uICBTZWUgZXhhbXBsZSBzdGVwcyBiZWxvdyB0byBjcmVhdGUKIHRhc2sgZ3JvdXBzIGFuZCBtb2RpZnkgdGhlaXIgQ1BVIHNoYXJlIHVzaW5nIHRoZSAiY2dyb3VwcyIgcHNldWRvIGZpbGVzeXN0ZW0uCiAKLQkjIG1rZGlyIC9kZXYvY3B1Y3RsCi0JIyBtb3VudCAtdCBjZ3JvdXAgLW9jcHUgbm9uZSAvZGV2L2NwdWN0bAotCSMgY2QgL2Rldi9jcHVjdGwKKwkjIG1vdW50IC10IHRtcGZzIGNncm91cF9yb290IC9zeXMvZnMvY2dyb3VwCisJIyBta2RpciAvc3lzL2ZzL2Nncm91cC9jcHUKKwkjIG1vdW50IC10IGNncm91cCAtb2NwdSBub25lIC9zeXMvZnMvY2dyb3VwL2NwdQorCSMgY2QgL3N5cy9mcy9jZ3JvdXAvY3B1CiAKIAkjIG1rZGlyIG11bHRpbWVkaWEJIyBjcmVhdGUgIm11bHRpbWVkaWEiIGdyb3VwIG9mIHRhc2tzCiAJIyBta2RpciBicm93c2VyCQkjIGNyZWF0ZSAiYnJvd3NlciIgZ3JvdXAgb2YgdGFza3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dAppbmRleCA2MDViMGQ0Li43MWI1NGQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0CkBAIC0xMjksOSArMTI5LDggQEAKIEVuYWJsaW5nIENPTkZJR19SVF9HUk9VUF9TQ0hFRCBsZXRzIHlvdSBleHBsaWNpdGx5IGFsbG9jYXRlIHJlYWwKIENQVSBiYW5kd2lkdGggdG8gdGFzayBncm91cHMuCiAKLVRoaXMgdXNlcyB0aGUgL2Nncm91cCB2aXJ0dWFsIGZpbGUgc3lzdGVtIGFuZAotIi9jZ3JvdXAvPGNncm91cD4vY3B1LnJ0X3J1bnRpbWVfdXMiIHRvIGNvbnRyb2wgdGhlIENQVSB0aW1lIHJlc2VydmVkIGZvciBlYWNoCi1jb250cm9sIGdyb3VwLgorVGhpcyB1c2VzIHRoZSBjZ3JvdXAgdmlydHVhbCBmaWxlIHN5c3RlbSBhbmQgIjxjZ3JvdXA+L2NwdS5ydF9ydW50aW1lX3VzIgordG8gY29udHJvbCB0aGUgQ1BVIHRpbWUgcmVzZXJ2ZWQgZm9yIGVhY2ggY29udHJvbCBncm91cC4KIAogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gd29ya2luZyB3aXRoIGNvbnRyb2wgZ3JvdXBzLCB5b3Ugc2hvdWxkIHJlYWQKIERvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dCBhcyB3ZWxsLgpAQCAtMTUwLDcgKzE0OSw3IEBACiA9PT09PT09PT09PT09PT0KIAogVGhlcmUgaXMgd29yayBpbiBwcm9ncmVzcyB0byBtYWtlIHRoZSBzY2hlZHVsaW5nIHBlcmlvZCBmb3IgZWFjaCBncm91cAotKCIvY2dyb3VwLzxjZ3JvdXA+L2NwdS5ydF9wZXJpb2RfdXMiKSBjb25maWd1cmFibGUgYXMgd2VsbC4KKygiPGNncm91cD4vY3B1LnJ0X3BlcmlvZF91cyIpIGNvbmZpZ3VyYWJsZSBhcyB3ZWxsLgogCiBUaGUgY29uc3RyYWludCBvbiB0aGUgcGVyaW9kIGlzIHRoYXQgYSBzdWJncm91cCBtdXN0IGhhdmUgYSBzbWFsbGVyIG9yCiBlcXVhbCBwZXJpb2QgdG8gaXRzIHBhcmVudC4gQnV0IHJlYWxpc3RpY2FsbHkgaXRzIG5vdCB2ZXJ5IHVzZWZ1bCBfeWV0XwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IDJlM2M2NGIuLjlkYmU4ODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEzLDE4ICsxMyw4IEBACiBUaGUgYWJvdmUgaXMgYWx3YXlzIHNhZmUuIEl0IHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIF9sb2NhbGx5XywgYnV0IHRoZQogc3BpbmxvY2sgaXRzZWxmIHdpbGwgZ3VhcmFudGVlIHRoZSBnbG9iYWwgbG9jaywgc28gaXQgd2lsbCBndWFyYW50ZWUgdGhhdAogdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkLW9mLWNvbnRyb2wgd2l0aGluIHRoZSByZWdpb24ocykgcHJvdGVjdGVkIGJ5IHRoYXQKLWxvY2suIFRoaXMgd29ya3Mgd2VsbCBldmVuIHVuZGVyIFVQLiBUaGUgYWJvdmUgc2VxdWVuY2UgdW5kZXIgVVAKLWVzc2VudGlhbGx5IGlzIGp1c3QgdGhlIHNhbWUgYXMgZG9pbmcKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7Ci0JIC4uLiBjcml0aWNhbCBzZWN0aW9uIC4uLgotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi1zbyB0aGUgY29kZSBkb2VzIF9ub3RfIG5lZWQgdG8gd29ycnkgYWJvdXQgVVAgdnMgU01QIGlzc3VlczogdGhlIHNwaW5sb2Nrcwotd29yayBjb3JyZWN0bHkgdW5kZXIgYm90aCAoYW5kIHNwaW5sb2NrcyBhcmUgYWN0dWFsbHkgbW9yZSBlZmZpY2llbnQgb24KLWFyY2hpdGVjdHVyZXMgdGhhdCBhbGxvdyBkb2luZyB0aGUgInNhdmVfZmxhZ3MgKyBjbGkiIGluIG9uZSBvcGVyYXRpb24pLgorbG9jay4gVGhpcyB3b3JrcyB3ZWxsIGV2ZW4gdW5kZXIgVVAgYWxzbywgc28gdGhlIGNvZGUgZG9lcyBfbm90XyBuZWVkIHRvCit3b3JyeSBhYm91dCBVUCB2cyBTTVAgaXNzdWVzOiB0aGUgc3BpbmxvY2tzIHdvcmsgY29ycmVjdGx5IHVuZGVyIGJvdGguCiAKICAgIE5PVEUhIEltcGxpY2F0aW9ucyBvZiBzcGluX2xvY2tzIGZvciBtZW1vcnkgYXJlIGZ1cnRoZXIgZGVzY3JpYmVkIGluOgogCkBAIC0zNiwyNyArMjYsNyBAQAogc3BpbmxvY2sgZm9yIG1vc3QgdGhpbmdzIC0gdXNpbmcgbW9yZSB0aGFuIG9uZSBzcGlubG9jayBjYW4gbWFrZSB0aGluZ3MgYQogbG90IG1vcmUgY29tcGxleCBhbmQgZXZlbiBzbG93ZXIgYW5kIGlzIHVzdWFsbHkgd29ydGggaXQgb25seSBmb3IKIHNlcXVlbmNlcyB0aGF0IHlvdSBfa25vd18gbmVlZCB0byBiZSBzcGxpdCB1cDogYXZvaWQgaXQgYXQgYWxsIGNvc3QgaWYgeW91Ci1hcmVuJ3Qgc3VyZSkuIEhPV0VWRVIsIGl0IF9kb2VzXyBtZWFuIHRoYXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIHRoYXQgZG9lcwotCi0JY2xpKCk7Ci0JLi4gY3JpdGljYWwgc2VjdGlvbiAuLgotCXN0aSgpOwotCi1hbmQgYW5vdGhlciBzZXF1ZW5jZSB0aGF0IGRvZXMKLQotCXNwaW5fbG9ja19pcnFzYXZlKGZsYWdzKTsKLQkuLiBjcml0aWNhbCBzZWN0aW9uIC4uCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmbGFncyk7Ci0KLXRoZW4gdGhleSBhcmUgTk9UIG11dHVhbGx5IGV4Y2x1c2l2ZSwgYW5kIHRoZSBjcml0aWNhbCByZWdpb25zIGNhbiBoYXBwZW4KLWF0IHRoZSBzYW1lIHRpbWUgb24gdHdvIGRpZmZlcmVudCBDUFUncy4gVGhhdCdzIGZpbmUgcGVyIHNlLCBidXQgdGhlCi1jcml0aWNhbCByZWdpb25zIGhhZCBiZXR0ZXIgYmUgY3JpdGljYWwgZm9yIGRpZmZlcmVudCB0aGluZ3MgKGllIHRoZXkKLWNhbid0IHN0b21wIG9uIGVhY2ggb3RoZXIpLgotCi1UaGUgYWJvdmUgaXMgYSBwcm9ibGVtIG1haW5seSBpZiB5b3UgZW5kIHVwIG1peGluZyBjb2RlIC0gZm9yIGV4YW1wbGUgdGhlCi1yb3V0aW5lcyBpbiBsbF9yd19ibG9jaygpIHRlbmQgdG8gdXNlIGNsaS9zdGkgdG8gcHJvdGVjdCB0aGUgYXRvbWljaXR5IG9mCi10aGVpciBhY3Rpb25zLCBhbmQgaWYgYSBkcml2ZXIgdXNlcyBzcGlubG9ja3MgaW5zdGVhZCB0aGVuIHlvdSBzaG91bGQKLXRoaW5rIGFib3V0IGlzc3VlcyBsaWtlIHRoZSBhYm92ZS4KK2FyZW4ndCBzdXJlKS4KIAogVGhpcyBpcyByZWFsbHkgdGhlIG9ubHkgcmVhbGx5IGhhcmQgcGFydCBhYm91dCBzcGlubG9ja3M6IG9uY2UgeW91IHN0YXJ0CiB1c2luZyBzcGlubG9ja3MgdGhleSB0ZW5kIHRvIGV4cGFuZCB0byBhcmVhcyB5b3UgbWlnaHQgbm90IGhhdmUgbm90aWNlZApAQCAtMTIwLDExICs5MCwxMCBAQAogCiBUaGUgc2luZ2xlIHNwaW4tbG9jayBwcmltaXRpdmVzIGFib3ZlIGFyZSBieSBubyBtZWFucyB0aGUgb25seSBvbmVzLiBUaGV5CiBhcmUgdGhlIG1vc3Qgc2FmZSBvbmVzLCBhbmQgdGhlIG9uZXMgdGhhdCB3b3JrIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzLAotYnV0IHBhcnRseSBfYmVjYXVzZV8gdGhleSBhcmUgc2FmZSB0aGV5IGFyZSBhbHNvIGZhaXJseSBzbG93LiBUaGV5IGFyZQotbXVjaCBmYXN0ZXIgdGhhbiBhIGdlbmVyaWMgZ2xvYmFsIGNsaS9zdGkgcGFpciwgYnV0IHNsb3dlciB0aGFuIHRoZXknZAotbmVlZCB0byBiZSwgYmVjYXVzZSB0aGV5IGRvIGhhdmUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzICh3aGljaCBpcyBqdXN0IGEKLXNpbmdsZSBpbnN0cnVjdGlvbiBvbiBhIHg4NiwgYnV0IGl0J3MgYW4gZXhwZW5zaXZlIG9uZSAtIGFuZCBvbiBvdGhlcgotYXJjaGl0ZWN0dXJlcyBpdCBjYW4gYmUgd29yc2UpLgorYnV0IHBhcnRseSBfYmVjYXVzZV8gdGhleSBhcmUgc2FmZSB0aGV5IGFyZSBhbHNvIGZhaXJseSBzbG93LiBUaGV5IGFyZSBzbG93ZXIKK3RoYW4gdGhleSdkIG5lZWQgdG8gYmUsIGJlY2F1c2UgdGhleSBkbyBoYXZlIHRvIGRpc2FibGUgaW50ZXJydXB0cworKHdoaWNoIGlzIGp1c3QgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gb24gYSB4ODYsIGJ1dCBpdCdzIGFuIGV4cGVuc2l2ZSBvbmUgLQorYW5kIG9uIG90aGVyIGFyY2hpdGVjdHVyZXMgaXQgY2FuIGJlIHdvcnNlKS4KIAogSWYgeW91IGhhdmUgYSBjYXNlIHdoZXJlIHlvdSBoYXZlIHRvIHByb3RlY3QgYSBkYXRhIHN0cnVjdHVyZSBhY3Jvc3MKIHNldmVyYWwgQ1BVJ3MgYW5kIHlvdSB3YW50IHRvIHVzZSBzcGlubG9ja3MgeW91IGNhbiBwb3RlbnRpYWxseSB1c2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2Vycm9yLWNvZGVzLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL2Vycm9yLWNvZGVzLnR4dAppbmRleCBkODM3MDNlLi5iM2Y2MDZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9lcnJvci1jb2Rlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvZXJyb3ItY29kZXMudHh0CkBAIC03Niw2ICs3NiwxMyBAQAogcmVwb3J0ZWQuICBUaGF0J3MgYmVjYXVzZSB0cmFuc2ZlcnMgb2Z0ZW4gaW52b2x2ZSBzZXZlcmFsIHBhY2tldHMsIHNvIHRoYXQKIG9uZSBvciBtb3JlIHBhY2tldHMgY291bGQgZmluaXNoIGJlZm9yZSBhbiBlcnJvciBzdG9wcyBmdXJ0aGVyIGVuZHBvaW50IEkvTy4KIAorRm9yIGlzb2Nocm9ub3VzIFVSQnMsIHRoZSB1cmIgc3RhdHVzIHZhbHVlIGlzIG5vbi16ZXJvIG9ubHkgaWYgdGhlIFVSQiBpcwordW5saW5rZWQsIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCwgdGhlIGhvc3QgY29udHJvbGxlciBpcyBkaXNhYmxlZCwgb3IgdGhlIHRvdGFsCit0cmFuc2ZlcnJlZCBsZW5ndGggaXMgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGFuZCB0aGUgVVJCX1NIT1JUX05PVF9PSworZmxhZyBpcyBzZXQuICBDb21wbGV0aW9uIGhhbmRsZXJzIGZvciBpc29jaHJvbm91cyBVUkJzIHNob3VsZCBvbmx5IHNlZQordXJiLT5zdGF0dXMgc2V0IHRvIHplcm8sIC1FTk9FTlQsIC1FQ09OTlJFU0VULCAtRVNIVVRET1dOLCBvciAtRVJFTU9URUlPLgorSW5kaXZpZHVhbCBmcmFtZSBkZXNjcmlwdG9yIHN0YXR1cyBmaWVsZHMgbWF5IHJlcG9ydCBtb3JlIHN0YXR1cyBjb2Rlcy4KKwogCiAwCQkJVHJhbnNmZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQogCkBAIC0xMzIsNyArMTM5LDcgQEAKIAkJCWRldmljZSByZW1vdmFsIGV2ZW50cyBpbW1lZGlhdGVseS4KIAogLUVYREVWCQkJSVNPIHRyYW5zZmVyIG9ubHkgcGFydGlhbGx5IGNvbXBsZXRlZAotCQkJbG9vayBhdCBpbmRpdmlkdWFsIGZyYW1lIHN0YXR1cyBmb3IgZGV0YWlscworCQkJKG9ubHkgc2V0IGluIGlzb19mcmFtZV9kZXNjW25dLnN0YXR1cywgbm90IHVyYi0+c3RhdHVzKQogCiAtRUlOVkFMCQkJSVNPIG1hZG5lc3MsIGlmIHRoaXMgaGFwcGVuczogTG9nIG9mZiBhbmQgZ28gaG9tZQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9NYWtlZmlsZQppbmRleCBiZWJhYzZiLi4wYWMzNDIwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAjIFRoaXMgY3JlYXRlcyB0aGUgZGVtb25zdHJhdGlvbiB1dGlsaXR5ICJsZ3Vlc3QiIHdoaWNoIHJ1bnMgYSBMaW51eCBndWVzdC4KLSMgTWlzc2luZyBoZWFkZXJzPyAgQWRkICItSS4uLy4uL2luY2x1ZGUgLUkuLi8uLi9hcmNoL3g4Ni9pbmNsdWRlIgorIyBNaXNzaW5nIGhlYWRlcnM/ICBBZGQgIi1JLi4vLi4vLi4vaW5jbHVkZSAtSS4uLy4uLy4uL2FyY2gveDg2L2luY2x1ZGUiCiBDRkxBR1M6PS1tMzIgLVdhbGwgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyAtTzMgLVVfRk9SVElGWV9TT1VSQ0UKIAogYWxsOiBsZ3Vlc3QKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvbGd1ZXN0LmMgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC5jCmluZGV4IGQ5ZGE3ZTEuLmNkOWQ2YWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvbGd1ZXN0LmMKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QuYwpAQCAtNDksNyArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19ybmcuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fcmluZy5oPgogI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xndWVzdF9sYXVuY2hlci5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvbGludXgvbGd1ZXN0X2xhdW5jaGVyLmgiCiAvKkw6MTEwCiAgKiBXZSBjYW4gaWdub3JlIHRoZSA0MiBpbmNsdWRlIGZpbGVzIHdlIG5lZWQgZm9yIHRoaXMgcHJvZ3JhbSwgYnV0IEkgZG8gd2FudAogICogdG8gZHJhdyBhdHRlbnRpb24gdG8gdGhlIHVzZSBvZiBrZXJuZWwtc3R5bGUgdHlwZXMuCkBAIC0xMzUsOSArMTM1LDYgQEAKIAkvKiBJcyBpdCBvcGVyYXRpb25hbCAqLwogCWJvb2wgcnVubmluZzsKIAotCS8qIERvZXMgR3Vlc3Qgd2FudCBhbiBpbnRycnVwdCBvbiBlbXB0eT8gKi8KLQlib29sIGlycV9vbl9lbXB0eTsKLQogCS8qIERldmljZS1zcGVjaWZpYyBkYXRhLiAqLwogCXZvaWQgKnByaXY7CiB9OwpAQCAtNjM3LDEwICs2MzQsNyBAQAogCiAJLyogSWYgdGhleSBkb24ndCB3YW50IGFuIGludGVycnVwdCwgZG9uJ3Qgc2VuZCBvbmUuLi4gKi8KIAlpZiAodnEtPnZyaW5nLmF2YWlsLT5mbGFncyAmIFZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUKSB7Ci0JCS8qIC4uLiB1bmxlc3MgdGhleSd2ZSBhc2tlZCB1cyB0byBmb3JjZSBvbmUgb24gZW1wdHkuICovCi0JCWlmICghdnEtPmRldi0+aXJxX29uX2VtcHR5Ci0JCSAgICB8fCBsZ19sYXN0X2F2YWlsKHZxKSAhPSB2cS0+dnJpbmcuYXZhaWwtPmlkeCkKLQkJCXJldHVybjsKKwkJcmV0dXJuOwogCX0KIAogCS8qIFNlbmQgdGhlIEd1ZXN0IGFuIGludGVycnVwdCB0ZWxsIHRoZW0gd2UgdXNlZCBzb21ldGhpbmcgdXAuICovCkBAIC0xMDU3LDE1ICsxMDUxLDYgQEAKIAljbG9zZSh2cS0+ZXZlbnRmZCk7CiB9CiAKLXN0YXRpYyBib29sIGFjY2VwdGVkX2ZlYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYml0KQotewotCWNvbnN0IHU4ICpmZWF0dXJlcyA9IGdldF9mZWF0dXJlX2JpdHMoZGV2KSArIGRldi0+ZmVhdHVyZV9sZW47Ci0KLQlpZiAoZGV2LT5mZWF0dXJlX2xlbiA8IGJpdCAvIENIQVJfQklUKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGZlYXR1cmVzW2JpdCAvIENIQVJfQklUXSAmICgxIDw8IChiaXQgJSBDSEFSX0JJVCkpOwotfQotCiBzdGF0aWMgdm9pZCBzdGFydF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtMTA3OSw4ICsxMDY0LDYgQEAKIAkJdmVyYm9zZSgiICUwMngiLCBnZXRfZmVhdHVyZV9iaXRzKGRldikKIAkJCVtkZXYtPmZlYXR1cmVfbGVuK2ldKTsKIAotCWRldi0+aXJxX29uX2VtcHR5ID0gYWNjZXB0ZWRfZmVhdHVyZShkZXYsIFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSk7Ci0KIAlmb3IgKHZxID0gZGV2LT52cTsgdnE7IHZxID0gdnEtPm5leHQpIHsKIAkJaWYgKHZxLT5zZXJ2aWNlKQogCQkJY3JlYXRlX3RocmVhZCh2cSk7CkBAIC0xNTY0LDcgKzE1NDcsNiBAQAogCS8qIFNldCB1cCB0aGUgdHVuIGRldmljZS4gKi8KIAljb25maWd1cmVfZGV2aWNlKGlwZmQsIHRhcGlmLCBpcCk7CiAKLQlhZGRfZmVhdHVyZShkZXYsIFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSk7CiAJLyogRXhwZWN0IEd1ZXN0IHRvIGhhbmRsZSBldmVyeXRoaW5nIGV4Y2VwdCBVRk8gKi8KIAlhZGRfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9DU1VNKTsKIAlhZGRfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9HVUVTVF9DU1VNKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vaHdwb2lzb24udHh0IGIvRG9jdW1lbnRhdGlvbi92bS9od3BvaXNvbi50eHQKaW5kZXggMTJmOWJhMi4uNTUwMDY4NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9od3BvaXNvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9od3BvaXNvbi50eHQKQEAgLTEyOSwxMiArMTI5LDEyIEBACiBvZiB0aGUgbWVtY2cuCiAKIEV4YW1wbGU6Ci0gICAgICAgIG1rZGlyIC9jZ3JvdXAvaHdwb2lzb24KKyAgICAgICAgbWtkaXIgL3N5cy9mcy9jZ3JvdXAvbWVtL2h3cG9pc29uCiAKICAgICAgICAgdXNlbWVtIC1tIDEwMCAtcyAxMDAwICYKLSAgICAgICAgZWNobyBgam9icyAtcGAgPiAvY2dyb3VwL2h3cG9pc29uL3Rhc2tzCisgICAgICAgIGVjaG8gYGpvYnMgLXBgID4gL3N5cy9mcy9jZ3JvdXAvbWVtL2h3cG9pc29uL3Rhc2tzCiAKLSAgICAgICAgbWVtY2dfaW5vPSQobHMgLWlkIC9jZ3JvdXAvaHdwb2lzb24gfCBjdXQgLWYxIC1kJyAnKQorICAgICAgICBtZW1jZ19pbm89JChscyAtaWQgL3N5cy9mcy9jZ3JvdXAvbWVtL2h3cG9pc29uIHwgY3V0IC1mMSAtZCcgJykKICAgICAgICAgZWNobyAkbWVtY2dfaW5vID4gL2RlYnVnL2h3cG9pc29uL2NvcnJ1cHQtZmlsdGVyLW1lbWNnCiAKICAgICAgICAgcGFnZS10eXBlcyAtcCBgcGlkb2YgaW5pdGAgICAtLWh3cG9pc29uICAjIHNoYWxsIGRvIG5vdGhpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKaW5kZXggOWI3MjIxYS4uN2MzYTg4MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKQEAgLTY3NCw3ICs2NzQsNyBAQAogCiBGaWVsZCBuYW1lOglpbml0X3NpemUKIFR5cGU6CQlyZWFkCi1PZmZzZXQvc2l6ZToJMHgyNWMvNAorT2Zmc2V0L3NpemU6CTB4MjYwLzQKIAogICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGxpbmVhciBjb250aWd1b3VzIG1lbW9yeSBzdGFydGluZwogICBhdCB0aGUga2VybmVsIHJ1bnRpbWUgc3RhcnQgYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgbmVlZHMgYmVmb3JlIGl0CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDI5ODAxZjcuLjcyYjk3OWQgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xLDQgKzEsNSBAQAogCisKIAlMaXN0IG9mIG1haW50YWluZXJzIGFuZCBob3cgdG8gc3VibWl0IGtlcm5lbCBjaGFuZ2VzCiAKIFBsZWFzZSB0cnkgdG8gZm9sbG93IHRoZSBndWlkZWxpbmVzIGJlbG93LiAgVGhpcyB3aWxsIG1ha2UgdGhpbmdzCkBAIC01OTQsNiArNTk1LDE2IEBACiBGOglhcmNoL2FybS9saWIvZmxvcHB5ZG1hLlMKIEY6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2Zsb3BweS5oCiAKK0FSTSBQTVUgUFJPRklMSU5HIEFORCBERUJVR0dJTkcKK006CVdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgorUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQqCitGOglhcmNoL2FybS9vcHJvZmlsZS9jb21tb24uYworRjoJYXJjaC9hcm0va2VybmVsL3BtdS5jCitGOglhcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaAorRjoJYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYworRjoJYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisKIEFSTSBQT1JUCiBNOglSdXNzZWxsIEtpbmcgPGxpbnV4QGFybS5saW51eC5vcmcudWs+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQpAQCAtMTM0NSwxNiArMTM1NiwxOCBAQAogRjoJaW5jbHVkZS9saW51eC9jZmFnMTI4NjRiLmgKIAogQVZSMzIgQVJDSElURUNUVVJFCi1NOglIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoYW5zLWNocmlzdGlhbi5lZ3R2ZWR0QGF0bWVsLmNvbT4KK006CUhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AZ21haWwuY29tPgorTToJSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+CiBXOglodHRwOi8vd3d3LmF0bWVsLmNvbS9wcm9kdWN0cy9BVlIzMi8KIFc6CWh0dHA6Ly9hdnIzMmxpbnV4Lm9yZy8KIFc6CWh0dHA6Ly9hdnJmcmVha3MubmV0LwotUzoJU3VwcG9ydGVkCitTOglNYWludGFpbmVkCiBGOglhcmNoL2F2cjMyLwogCiBBVlIzMi9BVDMyQVAgTUFDSElORSBTVVBQT1JUCi1NOglIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoYW5zLWNocmlzdGlhbi5lZ3R2ZWR0QGF0bWVsLmNvbT4KLVM6CVN1cHBvcnRlZAorTToJSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBnbWFpbC5jb20+CitNOglIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxlZ3R2ZWR0QHNhbWZ1bmRldC5ubz4KK1M6CU1haW50YWluZWQKIEY6CWFyY2gvYXZyMzIvbWFjaC1hdDMyYXAvCiAKIEFYLjI1IE5FVFdPUksgTEFZRVIKQEAgLTEzOTAsNyArMTQwMyw2IEBACiBCQVRNQU4gQURWQU5DRUQKIE06CU1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+CiBNOglTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KLU06CVN2ZW4gRWNrZWxtYW5uIDxzdmVuQG5hcmZhdGlvbi5vcmc+CiBMOgliLmEudC5tLmEubkBsaXN0cy5vcGVuLW1lc2gub3JnCiBXOglodHRwOi8vd3d3Lm9wZW4tbWVzaC5vcmcvCiBTOglNYWludGFpbmVkCkBAIC0xNDIzLDcgKzE0MzUsNiBAQAogRjoJYXJjaC9ibGFja2Zpbi8KIAogQkxBQ0tGSU4gRU1BQyBEUklWRVIKLU06CU1pY2hhZWwgSGVubmVyaWNoIDxtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tPgogTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCiBXOglodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcKIFM6CVN1cHBvcnRlZApAQCAtMTYzOSw3ICsxNjUwLDcgQEAKIE06CU9saXZlciBIYXJ0a29wcCA8c29ja2V0Y2FuQGhhcnRrb3BwLm5ldD4KIE06CU9saXZlciBIYXJ0a29wcCA8b2xpdmVyLmhhcnRrb3BwQHZvbGtzd2FnZW4uZGU+CiBNOglVcnMgVGh1ZXJtYW5uIDx1cnMudGh1ZXJtYW5uQHZvbGtzd2FnZW4uZGU+Ci1MOglzb2NrZXRjYW4tY29yZUBsaXN0cy5iZXJsaW9zLmRlCitMOglzb2NrZXRjYW4tY29yZUBsaXN0cy5iZXJsaW9zLmRlIChzdWJzY3JpYmVycy1vbmx5KQogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL3NvY2tldGNhbi8KIFM6CU1haW50YWluZWQKQEAgLTE2NTEsNyArMTY2Miw3IEBACiAKIENBTiBORVRXT1JLIERSSVZFUlMKIE06CVdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPgotTDoJc29ja2V0Y2FuLWNvcmVAbGlzdHMuYmVybGlvcy5kZQorTDoJc29ja2V0Y2FuLWNvcmVAbGlzdHMuYmVybGlvcy5kZSAoc3Vic2NyaWJlcnMtb25seSkKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9zb2NrZXRjYW4vCiBTOglNYWludGFpbmVkCkBAIC0xNzM5LDcgKzE3NTAsNyBAQAogRjoJZHJpdmVycy9uZXQvZW5pYy8KIAogQ0lSUlVTIExPR0lDIEVQOTNYWCBFVEhFUk5FVCBEUklWRVIKLU06CUxlbm5lcnQgQnV5dGVuaGVrIDxrZXJuZWxAd2FudHN0b2ZseS5vcmc+CitNOglIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCkBAIC0xODg5LDcgKzE5MDAsNiBAQAogVzoJaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9jcHVmcmVxLwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9kYXZlai9jcHVmcmVxLmdpdAogUzoJTWFpbnRhaW5lZAotRjoJYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxLwogRjoJZHJpdmVycy9jcHVmcmVxLwogRjoJaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKIApAQCAtMjE5OCw3ICsyMjA4LDcgQEAKIERPQ1VNRU5UQVRJT04KIE06CVJhbmR5IER1bmxhcCA8cmR1bmxhcEB4ZW5vdGltZS5uZXQ+CiBMOglsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnCi1UOglxdWlsdCBvc3Mub3JhY2xlLmNvbS9+cmR1bmxhcC9rZXJuZWwtZG9jLXBhdGNoZXMvY3VycmVudC8KK1Q6CXF1aWx0IGh0dHA6Ly91c2Vyd2ViLmtlcm5lbC5vcmcvfnJkdW5sYXAva2VybmVsLWRvYy1wYXRjaGVzL2N1cnJlbnQvCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uLwogCkBAIC0yMjkyLDggKzIzMDIsNyBAQAogCiBFQlRBQkxFUwogTToJQmFydCBEZSBTY2h1eW1lciA8YmFydC5kZS5zY2h1eW1lckBwYW5kb3JhLmJlPgotTDoJZWJ0YWJsZXMtdXNlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLUw6CWVidGFibGVzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJbmV0ZmlsdGVyLWRldmVsQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL2VidGFibGVzLnNvdXJjZWZvcmdlLm5ldC8KIFM6CU1haW50YWluZWQKIEY6CWluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfKi5oCkBAIC0zODIwLDYgKzM4MjksMTIgQEAKIEY6CWRyaXZlcnMvbGVkcy8KIEY6CWluY2x1ZGUvbGludXgvbGVkcy5oCiAKK0xFR0FDWSBFRVBST00gRFJJVkVSCitNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2VlcHJvbQorRjoJZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYworCiBMRUdPIFVTQiBUb3dlciBkcml2ZXIKIE06CUp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBMOglsZWdvdXNiLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApAQCAtNDE0NSw3ICs0MTYwLDcgQEAKIEY6CW1tLwogCiBNRU1PUlkgUkVTT1VSQ0UgQ09OVFJPTExFUgotTToJQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorTToJQmFsYmlyIFNpbmdoIDxic2luZ2hhcm9yYUBnbWFpbC5jb20+CiBNOglEYWlzdWtlIE5pc2hpbXVyYSA8bmlzaGltdXJhQG14cC5uZXMubmVjLmNvLmpwPgogTToJS0FNRVpBV0EgSGlyb3l1a2kgPGthbWV6YXdhLmhpcm95dUBqcC5mdWppdHN1LmNvbT4KIEw6CWxpbnV4LW1tQGt2YWNrLm9yZwpAQCAtNDI1Miw4ICs0MjY3LDcgQEAKIEY6CWluY2x1ZGUvbGludXgvbW1jLwogCiBNVUxUSU1FRElBIENBUkQgKE1NQykgRVRDLiBPVkVSIFNQSQotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci1TOglPZGQgRml4ZXMKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKIEY6CWluY2x1ZGUvbGludXgvc3BpL21tY19zcGkuaAogCkBAIC00NjAzLDcgKzQ2MTcsNiBAQAogCiBPTUFQIFVTQiBTVVBQT1JUCiBNOglGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4KLU06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogTDoJbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYmFsYmkvdXNiLmdpdApAQCAtNDg5Miw3ICs0OTA1LDcgQEAKIEY6CWFyY2gvKi9pbmNsdWRlL2FzbS9wZXJjcHUuaAogCiBQRVItVEFTSyBERUxBWSBBQ0NPVU5USU5HCi1NOglCYWxiaXIgU2luZ2ggPGJhbGJpckBsaW51eC52bmV0LmlibS5jb20+CitNOglCYWxiaXIgU2luZ2ggPGJzaW5naGFyb3JhQGdtYWlsLmNvbT4KIFM6CU1haW50YWluZWQKIEY6CWluY2x1ZGUvbGludXgvZGVsYXlhY2N0LmgKIEY6CWtlcm5lbC9kZWxheWFjY3QuYwpAQCAtNDk0Nyw2ICs0OTYwLDcgQEAKIEY6CWRyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItdW5pY29yZTMyaW8uaAogRjoJZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wdXYzLmMKIEY6CWRyaXZlcnMvdmlkZW8vZmItcHV2My5jCitGOglkcml2ZXJzL3J0Yy9ydGMtcHV2My5jCiAKIFBNQyBTSUVSUkEgTWF4UkFJRCBEUklWRVIKIE06CUFuaWwgUmF2aW5kcmFuYXRoIDxhbmlsX3JhdmluZHJhbmF0aEBwbWMtc2llcnJhLmNvbT4KQEAgLTQ5NzksNyArNDk5Myw3IEBACiAKIFBOUCBTVVBQT1JUCiBNOglBZGFtIEJlbGF5IDxhYmVsYXlAbWl0LmVkdT4KLU06CUJqb3JuIEhlbGdhYXMgPGJqb3JuLmhlbGdhYXNAaHAuY29tPgorTToJQmpvcm4gSGVsZ2FhcyA8YmhlbGdhYXNAZ29vZ2xlLmNvbT4KIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvcG5wLwogCkBAIC01MTc4LDYgKzUxOTIsNyBAQAogRjoJZHJpdmVycy9uZXQvcWxjbmljLwogCiBRTE9HSUMgUUxHRSAxMEdiIEVUSEVSTkVUIERSSVZFUgorTToJSml0ZW5kcmEgS2Fsc2FyaWEgPGppdGVuZHJhLmthbHNhcmlhQHFsb2dpYy5jb20+CiBNOglSb24gTWVyY2VyIDxyb24ubWVyY2VyQHFsb2dpYy5jb20+CiBNOglsaW51eC1kcml2ZXJAcWxvZ2ljLmNvbQogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpAQCAtNTk4NCw3ICs1OTk5LDYgQEAKIEY6CWRyaXZlcnMvc3RhZ2luZy90dHkvc3BlY2lhbGl4KgogCiBTUEkgU1VCU1lTVEVNCi1NOglEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIE06CUdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KIEw6CXNwaS1kZXZlbC1nZW5lcmFsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogUToJaHR0cDovL3BhdGNod29yay5rZXJuZWwub3JnL3Byb2plY3Qvc3BpLWRldmVsLWdlbmVyYWwvbGlzdC8KQEAgLTYxMDAsNyArNjExNCw3IEBACiBGOglEb2N1bWVudGF0aW9uL3RhcmdldC8KIAogVEFTS1NUQVRTIFNUQVRJU1RJQ1MgSU5URVJGQUNFCi1NOglCYWxiaXIgU2luZ2ggPGJhbGJpckBsaW51eC52bmV0LmlibS5jb20+CitNOglCYWxiaXIgU2luZ2ggPGJzaW5naGFyb3JhQGdtYWlsLmNvbT4KIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMqCiBGOglpbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cyoKQEAgLTYzMDgsNyArNjMyMiw3IEBACiAKIFVCSSBGSUxFIFNZU1RFTSAoVUJJRlMpCiBNOglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZDFAZ21haWwuY29tPgotTToJQWRyaWFuIEh1bnRlciA8YWRyaWFuLmh1bnRlckBub2tpYS5jb20+CitNOglBZHJpYW4gSHVudGVyIDxhZHJpYW4uaHVudGVyQGludGVsLmNvbT4KIEw6CWxpbnV4LW10ZEBsaXN0cy5pbmZyYWRlYWQub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0LmluZnJhZGVhZC5vcmcvdWJpZnMtMi42LmdpdAogVzoJaHR0cDovL3d3dy5saW51eC1tdGQuaW5mcmFkZWFkLm9yZy9kb2MvdWJpZnMuaHRtbApAQCAtNjQzMiw5ICs2NDQ2LDkgQEAKIEY6CWRyaXZlcnMvdXNiL21pc2MvcmlvNTAwKgogCiBVU0IgRUhDSSBEUklWRVIKLU06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorTToJQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLVM6CU9kZCBGaXhlcworUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi91c2IvZWhjaS50eHQKIEY6CWRyaXZlcnMvdXNiL2hvc3QvZWhjaSoKIApAQCAtNjQ0OCw5ICs2NDYyLDEwIEBACiBGOglkcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxLwogCiBVU0IgR0FER0VUL1BFUklQSEVSQUwgU1VCU1lTVEVNCi1NOglEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK006CUZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5saW51eC11c2Iub3JnL2dhZGdldAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9iYWxiaS91c2IuZ2l0CiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3VzYi9nYWRnZXQvCiBGOglpbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQqCkBAIC02NDYwLDkgKzY0NzUsMTUgQEAKIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamlrb3MvaGlkLmdpdAogUzoJTWFpbnRhaW5lZAotRjoJRG9jdW1lbnRhdGlvbi91c2IvaGlkZGV2LnR4dAorRjoJRG9jdW1lbnRhdGlvbi9oaWQvaGlkZGV2LnR4dAogRjoJZHJpdmVycy9oaWQvdXNiaGlkLwogCitVU0IvSVAgRFJJVkVSUworTToJTWF0dCBNb29uZXkgPG1mbUBtdXRlZGRpc2suY29tPgorTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL3VzYmlwLworCiBVU0IgSVNQMTE2WCBEUklWRVIKIE06CU9sYXYgS29uZ2FzIDxva0BhcnRlY2Rlc2lnbi5lZT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTY0OTIsOSArNjUxMyw5IEBACiBGOglzb3VuZC91c2IvbWlkaS4qCiAKIFVTQiBPSENJIERSSVZFUgotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitNOglBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotUzoJT2RkIEZpeGVzCitTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3VzYi9vaGNpLnR4dAogRjoJZHJpdmVycy91c2IvaG9zdC9vaGNpKgogCkBAIC02NzIwLDYgKzY3NDEsMTUgQEAKIEY6CURvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZhdC50eHQKIEY6CWZzL2ZhdC8KIAorVklERU9CVUYyIEZSQU1FV09SSworTToJUGF3ZWwgT3NjaWFrIDxwYXdlbEBvc2NpYWsuY29tPgorTToJTWFyZWsgU3p5cHJvd3NraSA8bS5zenlwcm93c2tpQHNhbXN1bmcuY29tPgorTToJS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItKgorRjoJaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItKgorCiBWSVJUSU8gQ09OU09MRSBEUklWRVIKIE06CUFtaXQgU2hhaCA8YW1pdC5zaGFoQHJlZGhhdC5jb20+CiBMOgl2aXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpAQCAtNjk5Nyw2ICs3MDI3LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3BsYXRmb3JtL3g4NgogCitYODYgTUNFIElORlJBU1RSVUNUVVJFCitNOglUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5jb20+CitNOglCb3Jpc2xhdiBQZXRrb3YgPGJwQGFtZDY0Lm9yZz4KK0w6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglhcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay8qCisKIFhFTiBIWVBFUlZJU09SIElOVEVSRkFDRQogTToJSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15LmZpdHpoYXJkaW5nZUBjaXRyaXguY29tPgogTToJS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBhZmI4ZTBkLi42YTViZGFkIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSAzCiBQQVRDSExFVkVMID0gMAogU1VCTEVWRUwgPSAwCi1FWFRSQVZFUlNJT04gPSAtcmMxCitFWFRSQVZFUlNJT04gPQogTkFNRSA9IFNuZWFreSBXZWFzZWwKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTM3OCw3ICszNzgsNyBAQAogCiAjIFJlYWQgS0VSTkVMUkVMRUFTRSBmcm9tIGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlIChpZiBpdCBleGlzdHMpCiBLRVJORUxSRUxFQVNFID0gJChzaGVsbCBjYXQgaW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2UgMj4gL2Rldi9udWxsKQotS0VSTkVMVkVSU0lPTiA9ICQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKQorS0VSTkVMVkVSU0lPTiA9ICQoVkVSU0lPTikkKGlmICQoUEFUQ0hMRVZFTCksLiQoUEFUQ0hMRVZFTCkkKGlmICQoU1VCTEVWRUwpLC4kKFNVQkxFVkVMKSkpJChFWFRSQVZFUlNJT04pCiAKIGV4cG9ydCBWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgS0VSTkVMUkVMRUFTRSBLRVJORUxWRVJTSU9OCiBleHBvcnQgQVJDSCBTUkNBUkNIIENPTkZJR19TSEVMTCBIT1NUQ0MgSE9TVENGTEFHUyBDUk9TU19DT01QSUxFIEFTIExEIENDCkBAIC0xMDA1LDcgKzEwMDUsNyBAQAogCiBkZWZpbmUgZmlsZWNoa192ZXJzaW9uLmgKIAkoZWNobyBcI2RlZmluZSBMSU5VWF9WRVJTSU9OX0NPREUgJChzaGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWV4cHIgJChWRVJTSU9OKSBcKiA2NTUzNiArICQoUEFUQ0hMRVZFTCkgXCogMjU2ICsgJChTVUJMRVZFTCkpOyAgICAgXAorCWV4cHIgJChWRVJTSU9OKSBcKiA2NTUzNiArIDAkKFBBVENITEVWRUwpIFwqIDI1NiArIDAkKFNVQkxFVkVMKSk7ICAgIFwKIAllY2hvICcjZGVmaW5lIEtFUk5FTF9WRVJTSU9OKGEsYixjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKSc7KQogZW5kZWYKIApAQCAtMTExMCwxMSArMTExMCw2IEBACiAKIFBIT05ZICs9IF9tb2RpbnN0XwogX21vZGluc3RfOgotCUBpZiBbIC16ICJgJChERVBNT0QpIC1WIDI+L2Rldi9udWxsIHwgZ3JlcCBtb2R1bGUtaW5pdC10b29sc2AiIF07IHRoZW4gXAotCQllY2hvICJXYXJuaW5nOiB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBtb2R1bGUtaW5pdC10b29scyI7IFwKLQkJZWNobyAiU2VlIGh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvZG9jcy9wb3N0LWhhbGxvd2Vlbi0yLjYudHh0IjtcCi0JCXNsZWVwIDE7IFwKLQlmaQogCUBybSAtcmYgJChNT0RMSUIpL2tlcm5lbAogCUBybSAtZiAkKE1PRExJQikvc291cmNlCiAJQG1rZGlyIC1wICQoTU9ETElCKS9rZXJuZWwKQEAgLTE1MzEsMTIgKzE1MjYsOCBAQAogCiAjIFJ1biBkZXBtb2Qgb25seSBpZiB3ZSBoYXZlIFN5c3RlbS5tYXAgYW5kIGRlcG1vZCBpcyBleGVjdXRhYmxlCiBxdWlldF9jbWRfZGVwbW9kID0gREVQTU9EICAkKEtFUk5FTFJFTEVBU0UpCi0gICAgICBjbWRfZGVwbW9kID0gXAotCWlmIFsgLXIgU3lzdGVtLm1hcCAtYSAteCAkKERFUE1PRCkgXTsgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJJChERVBNT0QpIC1hZSAtRiBTeXN0ZW0ubWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJJChpZiAkKHN0cmlwICQoSU5TVEFMTF9NT0RfUEFUSCkpLCAtYiAkKElOU1RBTExfTU9EX1BBVEgpICkgICAgIFwKLQkJJChLRVJORUxSRUxFQVNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmaQorICAgICAgY21kX2RlcG1vZCA9ICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZGVwbW9kLnNoICQoREVQTU9EKSBcCisgICAgICAgICAgICAgICAgICAgJChLRVJORUxSRUxFQVNFKQogCiAjIENyZWF0ZSB0ZW1wb3JhcnkgZGlyIGZvciBtb2R1bGUgc3VwcG9ydCBmaWxlcwogIyBjbGVhbiBpdCB1cCBvbmx5IHdoZW4gYnVpbGRpbmcgYWxsIG1vZHVsZXMKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCA4NTEwMDE3Li4wZDVhN2RkIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDYgKzEsNiBAQAotCUxpbnV4IGtlcm5lbCByZWxlYXNlIDIuNi54eCA8aHR0cDovL2tlcm5lbC5vcmcvPgorCUxpbnV4IGtlcm5lbCByZWxlYXNlIDMueCA8aHR0cDovL2tlcm5lbC5vcmcvPgogCi1UaGVzZSBhcmUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIExpbnV4IHZlcnNpb24gMi42LiAgUmVhZCB0aGVtIGNhcmVmdWxseSwKK1RoZXNlIGFyZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgTGludXggdmVyc2lvbiAzLiAgUmVhZCB0aGVtIGNhcmVmdWxseSwKIGFzIHRoZXkgdGVsbCB5b3Ugd2hhdCB0aGlzIGlzIGFsbCBhYm91dCwgZXhwbGFpbiBob3cgdG8gaW5zdGFsbCB0aGUKIGtlcm5lbCwgYW5kIHdoYXQgdG8gZG8gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuIAogCkBAIC02MiwxMCArNjIsMTAgQEAKICAgIGRpcmVjdG9yeSB3aGVyZSB5b3UgaGF2ZSBwZXJtaXNzaW9ucyAoZWcuIHlvdXIgaG9tZSBkaXJlY3RvcnkpIGFuZAogICAgdW5wYWNrIGl0OgogCi0JCWd6aXAgLWNkIGxpbnV4LTIuNi5YWC50YXIuZ3ogfCB0YXIgeHZmIC0KKwkJZ3ppcCAtY2QgbGludXgtMy5YLnRhci5neiB8IHRhciB4dmYgLQogCiAgICBvcgotCQliemlwMiAtZGMgbGludXgtMi42LlhYLnRhci5iejIgfCB0YXIgeHZmIC0KKwkJYnppcDIgLWRjIGxpbnV4LTMuWC50YXIuYnoyIHwgdGFyIHh2ZiAtCiAKIAogICAgUmVwbGFjZSAiWFgiIHdpdGggdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsYXRlc3Qga2VybmVsLgpAQCAtNzUsMTUgKzc1LDE1IEBACiAgICBmaWxlcy4gIFRoZXkgc2hvdWxkIG1hdGNoIHRoZSBsaWJyYXJ5LCBhbmQgbm90IGdldCBtZXNzZWQgdXAgYnkKICAgIHdoYXRldmVyIHRoZSBrZXJuZWwtZHUtam91ciBoYXBwZW5zIHRvIGJlLgogCi0gLSBZb3UgY2FuIGFsc28gdXBncmFkZSBiZXR3ZWVuIDIuNi54eCByZWxlYXNlcyBieSBwYXRjaGluZy4gIFBhdGNoZXMgYXJlCisgLSBZb3UgY2FuIGFsc28gdXBncmFkZSBiZXR3ZWVuIDMueCByZWxlYXNlcyBieSBwYXRjaGluZy4gIFBhdGNoZXMgYXJlCiAgICBkaXN0cmlidXRlZCBpbiB0aGUgdHJhZGl0aW9uYWwgZ3ppcCBhbmQgdGhlIG5ld2VyIGJ6aXAyIGZvcm1hdC4gIFRvCiAgICBpbnN0YWxsIGJ5IHBhdGNoaW5nLCBnZXQgYWxsIHRoZSBuZXdlciBwYXRjaCBmaWxlcywgZW50ZXIgdGhlCi0gICB0b3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlIChsaW51eC0yLjYueHgpIGFuZCBleGVjdXRlOgorICAgdG9wIGxldmVsIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZSAobGludXgtMy54KSBhbmQgZXhlY3V0ZToKIAotCQlnemlwIC1jZCAuLi9wYXRjaC0yLjYueHguZ3ogfCBwYXRjaCAtcDEKKwkJZ3ppcCAtY2QgLi4vcGF0Y2gtMy54Lmd6IHwgcGF0Y2ggLXAxCiAKICAgIG9yCi0JCWJ6aXAyIC1kYyAuLi9wYXRjaC0yLjYueHguYnoyIHwgcGF0Y2ggLXAxCisJCWJ6aXAyIC1kYyAuLi9wYXRjaC0zLnguYnoyIHwgcGF0Y2ggLXAxCiAKICAgIChyZXBlYXQgeHggZm9yIGFsbCB2ZXJzaW9ucyBiaWdnZXIgdGhhbiB0aGUgdmVyc2lvbiBvZiB5b3VyIGN1cnJlbnQKICAgIHNvdXJjZSB0cmVlLCBfaW5fb3JkZXJfKSBhbmQgeW91IHNob3VsZCBiZSBvay4gIFlvdSBtYXkgd2FudCB0byByZW1vdmUKQEAgLTkxLDkgKzkxLDkgQEAKICAgIGZhaWxlZCBwYXRjaGVzICh4eHgjIG9yIHh4eC5yZWopLiBJZiB0aGVyZSBhcmUsIGVpdGhlciB5b3Ugb3IgbWUgaGFzCiAgICBtYWRlIGEgbWlzdGFrZS4KIAotICAgVW5saWtlIHBhdGNoZXMgZm9yIHRoZSAyLjYueCBrZXJuZWxzLCBwYXRjaGVzIGZvciB0aGUgMi42LngueSBrZXJuZWxzCisgICBVbmxpa2UgcGF0Y2hlcyBmb3IgdGhlIDMueCBrZXJuZWxzLCBwYXRjaGVzIGZvciB0aGUgMy54Lnkga2VybmVscwogICAgKGFsc28ga25vd24gYXMgdGhlIC1zdGFibGUga2VybmVscykgYXJlIG5vdCBpbmNyZW1lbnRhbCBidXQgaW5zdGVhZCBhcHBseQotICAgZGlyZWN0bHkgdG8gdGhlIGJhc2UgMi42Lngga2VybmVsLiAgUGxlYXNlIHJlYWQKKyAgIGRpcmVjdGx5IHRvIHRoZSBiYXNlIDMueCBrZXJuZWwuICBQbGVhc2UgcmVhZAogICAgRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAogICAgQWx0ZXJuYXRpdmVseSwgdGhlIHNjcmlwdCBwYXRjaC1rZXJuZWwgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGUgdGhpcwpAQCAtMTA3LDE0ICsxMDcsMTQgQEAKICAgIGFuIGFsdGVybmF0aXZlIGRpcmVjdG9yeSBjYW4gYmUgc3BlY2lmaWVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCiAKICAtIElmIHlvdSBhcmUgdXBncmFkaW5nIGJldHdlZW4gcmVsZWFzZXMgdXNpbmcgdGhlIHN0YWJsZSBzZXJpZXMgcGF0Y2hlcwotICAgKGZvciBleGFtcGxlLCBwYXRjaC0yLjYueHgueSksIG5vdGUgdGhhdCB0aGVzZSAiZG90LXJlbGVhc2VzIiBhcmUKLSAgIG5vdCBpbmNyZW1lbnRhbCBhbmQgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSAyLjYueHggYmFzZSB0cmVlLiBGb3IKLSAgIGV4YW1wbGUsIGlmIHlvdXIgYmFzZSBrZXJuZWwgaXMgMi42LjEyIGFuZCB5b3Ugd2FudCB0byBhcHBseSB0aGUKLSAgIDIuNi4xMi4zIHBhdGNoLCB5b3UgZG8gbm90IGFuZCBpbmRlZWQgbXVzdCBub3QgZmlyc3QgYXBwbHkgdGhlCi0gICAyLjYuMTIuMSBhbmQgMi42LjEyLjIgcGF0Y2hlcy4gU2ltaWxhcmx5LCBpZiB5b3UgYXJlIHJ1bm5pbmcga2VybmVsCi0gICB2ZXJzaW9uIDIuNi4xMi4yIGFuZCB3YW50IHRvIGp1bXAgdG8gMi42LjEyLjMsIHlvdSBtdXN0IGZpcnN0Ci0gICByZXZlcnNlIHRoZSAyLjYuMTIuMiBwYXRjaCAodGhhdCBpcywgcGF0Y2ggLVIpIF9iZWZvcmVfIGFwcGx5aW5nCi0gICB0aGUgMi42LjEyLjMgcGF0Y2guCisgICAoZm9yIGV4YW1wbGUsIHBhdGNoLTMueC55KSwgbm90ZSB0aGF0IHRoZXNlICJkb3QtcmVsZWFzZXMiIGFyZQorICAgbm90IGluY3JlbWVudGFsIGFuZCBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIDMueCBiYXNlIHRyZWUuIEZvcgorICAgZXhhbXBsZSwgaWYgeW91ciBiYXNlIGtlcm5lbCBpcyAzLjAgYW5kIHlvdSB3YW50IHRvIGFwcGx5IHRoZQorICAgMy4wLjMgcGF0Y2gsIHlvdSBkbyBub3QgYW5kIGluZGVlZCBtdXN0IG5vdCBmaXJzdCBhcHBseSB0aGUKKyAgIDMuMC4xIGFuZCAzLjAuMiBwYXRjaGVzLiBTaW1pbGFybHksIGlmIHlvdSBhcmUgcnVubmluZyBrZXJuZWwKKyAgIHZlcnNpb24gMy4wLjIgYW5kIHdhbnQgdG8ganVtcCB0byAzLjAuMywgeW91IG11c3QgZmlyc3QKKyAgIHJldmVyc2UgdGhlIDMuMC4yIHBhdGNoICh0aGF0IGlzLCBwYXRjaCAtUikgX2JlZm9yZV8gYXBwbHlpbmcKKyAgIHRoZSAzLjAuMyBwYXRjaC4KICAgIFlvdSBjYW4gcmVhZCBtb3JlIG9uIHRoaXMgaW4gRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dAogCiAgLSBNYWtlIHN1cmUgeW91IGhhdmUgbm8gc3RhbGUgLm8gZmlsZXMgYW5kIGRlcGVuZGVuY2llcyBseWluZyBhcm91bmQ6CkBAIC0xMjYsNyArMTI2LDcgQEAKIAogU09GVFdBUkUgUkVRVUlSRU1FTlRTCiAKLSAgIENvbXBpbGluZyBhbmQgcnVubmluZyB0aGUgMi42Lnh4IGtlcm5lbHMgcmVxdWlyZXMgdXAtdG8tZGF0ZQorICAgQ29tcGlsaW5nIGFuZCBydW5uaW5nIHRoZSAzLngga2VybmVscyByZXF1aXJlcyB1cC10by1kYXRlCiAgICB2ZXJzaW9ucyBvZiB2YXJpb3VzIHNvZnR3YXJlIHBhY2thZ2VzLiAgQ29uc3VsdAogICAgRG9jdW1lbnRhdGlvbi9DaGFuZ2VzIGZvciB0aGUgbWluaW11bSB2ZXJzaW9uIG51bWJlcnMgcmVxdWlyZWQKICAgIGFuZCBob3cgdG8gZ2V0IHVwZGF0ZXMgZm9yIHRoZXNlIHBhY2thZ2VzLiAgQmV3YXJlIHRoYXQgdXNpbmcKQEAgLTE0MiwxMSArMTQyLDExIEBACiAgICBVc2luZyB0aGUgb3B0aW9uICJtYWtlIE89b3V0cHV0L2RpciIgYWxsb3cgeW91IHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlCiAgICBwbGFjZSBmb3IgdGhlIG91dHB1dCBmaWxlcyAoaW5jbHVkaW5nIC5jb25maWcpLgogICAgRXhhbXBsZToKLSAgICAga2VybmVsIHNvdXJjZSBjb2RlOgkvdXNyL3NyYy9saW51eC0yLjYuTgorICAgICBrZXJuZWwgc291cmNlIGNvZGU6CS91c3Ivc3JjL2xpbnV4LTMuTgogICAgICBidWlsZCBkaXJlY3Rvcnk6CQkvaG9tZS9uYW1lL2J1aWxkL2tlcm5lbAogCiAgICBUbyBjb25maWd1cmUgYW5kIGJ1aWxkIHRoZSBrZXJuZWwgdXNlOgotICAgY2QgL3Vzci9zcmMvbGludXgtMi42Lk4KKyAgIGNkIC91c3Ivc3JjL2xpbnV4LTMuTgogICAgbWFrZSBPPS9ob21lL25hbWUvYnVpbGQva2VybmVsIG1lbnVjb25maWcKICAgIG1ha2UgTz0vaG9tZS9uYW1lL2J1aWxkL2tlcm5lbAogICAgc3VkbyBtYWtlIE89L2hvbWUvbmFtZS9idWlsZC9rZXJuZWwgbW9kdWxlc19pbnN0YWxsIGluc3RhbGwKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW16b25lLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IDhhZjU2Y2UuLjQ0NWRjNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW16b25lLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9tbXpvbmUuaApAQCAtNTYsNyArNTYsNiBAQAogICogR2l2ZW4gYSBrZXJuZWwgYWRkcmVzcywgZmluZCB0aGUgaG9tZSBub2RlIG9mIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KICAqLwogI2RlZmluZSBrdmFkZHJfdG9fbmlkKGthZGRyKQlwYV90b19uaWQoX19wYShrYWRkcikpCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKIAogLyoKICAqIEdpdmVuIGEga2FkZHIsIExPQ0FMX0JBU0VfQUREUiBmaW5kcyB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCmluZGV4IDM3NmYyMjEuLjMyNmYwYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKQEAgLTQwOSw3ICs0MDksNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWxlbiA9IG5hbWVsZW47Ci0JaWYgKG5hbWVsZW4gPiAzMikKKwlpZiAobGVuID4gMzIpCiAJCWxlbiA9IDMyOwogCiAJZG93bl9yZWFkKCZ1dHNfc2VtKTsKQEAgLTU5NCw3ICs1OTQsNyBAQAogCWRvd25fcmVhZCgmdXRzX3NlbSk7CiAJcmVzID0gc3lzaW5mb190YWJsZVtvZmZzZXRdOwogCWxlbiA9IHN0cmxlbihyZXMpKzE7Ci0JaWYgKGxlbiA+IGNvdW50KQorCWlmICgodW5zaWduZWQgbG9uZylsZW4gPiAodW5zaWduZWQgbG9uZyljb3VudCkKIAkJbGVuID0gY291bnQ7CiAJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJlcywgbGVuKSkKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTY0OSw3ICs2NDksNyBAQAogCQlyZXR1cm4gMTsKIAogCWNhc2UgR1NJX0dFVF9IV1JQQjoKLQkJaWYgKG5ieXRlcyA8IHNpemVvZigqaHdycGIpKQorCQlpZiAobmJ5dGVzID4gc2l6ZW9mKCpod3JwYikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGh3cnBiLCBuYnl0ZXMpICE9IDApCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTEwMDgsNiArMTAwOCw3IEBACiB7CiAJc3RydWN0IHJ1c2FnZSByOwogCWxvbmcgcmV0LCBlcnI7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IDA7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKIAogCWlmICghdXIpCkBAIC0xMDE2LDEzICsxMDE3LDE1IEBACiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJCQogCXNldF9mcyAoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfd2FpdDQocGlkLCB1c3RhdHVzLCBvcHRpb25zLCAoc3RydWN0IHJ1c2FnZSBfX3VzZXIgKikgJnIpOworCXJldCA9IHN5c193YWl0NChwaWQsICh1bnNpZ25lZCBpbnQgX191c2VyICopICZzdGF0dXMsIG9wdGlvbnMsCisJCQkoc3RydWN0IHJ1c2FnZSBfX3VzZXIgKikgJnIpOwogCXNldF9mcyAob2xkX2ZzKTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXIsIHNpemVvZigqdXIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAllcnIgPSAwOworCWVyciB8PSBwdXRfdXNlcihzdGF0dXMsIHVzdGF0dXMpOwogCWVyciB8PSBfX3B1dF91c2VyKHIucnVfdXRpbWUudHZfc2VjLCAmdXItPnJ1X3V0aW1lLnR2X3NlYyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoci5ydV91dGltZS50dl91c2VjLCAmdXItPnJ1X3V0aW1lLnR2X3VzZWMpOwogCWVyciB8PSBfX3B1dF91c2VyKHIucnVfc3RpbWUudHZfc2VjLCAmdXItPnJ1X3N0aW1lLnR2X3NlYyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwppbmRleCBmOWRhNDE5Li45NDBiMjAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTU5Nyw2ICs1OTcsOCBAQAogCQlzdWIJcGMsIGxyLCByMCwgbHNyICMzMglAIHByb3Blcmx5IGZsdXNoIHBpcGVsaW5lCiAjZW5kaWYKIAorI2RlZmluZSBQUk9DX0VOVFJZX1NJWkUgKDQqNSkKKwogLyoKICAqIEhlcmUgZm9sbG93IHRoZSByZWxvY2F0YWJsZSBjYWNoZSBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlCiAgKiB2YXJpb3VzIHByb2Nlc3NvcnMuICBUaGlzIGlzIGEgZ2VuZXJpYyBob29rIGZvciBsb2NhdGluZyBhbgpAQCAtNjI0LDcgKzYyNiw3IEBACiAgQVJNKAkJYWRkZXEJcGMsIHIxMiwgcjMJCSkgQCBjYWxsIGNhY2hlIGZ1bmN0aW9uCiAgVEhVTUIoCQlhZGRlcQlyMTIsIHIzCQkJKQogIFRIVU1CKAkJbW92ZXEJcGMsIHIxMgkJCSkgQCBjYWxsIGNhY2hlIGZ1bmN0aW9uCi0JCWFkZAlyMTIsIHIxMiwgIzQqNQorCQlhZGQJcjEyLCByMTIsICNQUk9DX0VOVFJZX1NJWkUKIAkJYgkxYgogCiAvKgpAQCAtNjkxLDkgKzY5Myw5IEBACiAKIAkJLndvcmQJMHg0MTA2OTI2MAkJQCBBUk05MjZFSi1TICh2NVRFSikKIAkJLndvcmQJMHhmZjBmZmZmMAotCQliCV9fYXJtOTI2ZWpzX21tdV9jYWNoZV9vbgotCQliCV9fYXJtdjRfbW11X2NhY2hlX29mZgotCQliCV9fYXJtdjV0ZWpfbW11X2NhY2hlX2ZsdXNoCisJCVcoYikJX19hcm05MjZlanNfbW11X2NhY2hlX29uCisJCVcoYikJX19hcm12NF9tbXVfY2FjaGVfb2ZmCisJCVcoYikJX19hcm12NXRlal9tbXVfY2FjaGVfZmx1c2gKIAogCQkud29yZAkweDAwMDA3MDAwCQlAIEFSTTcgSURzCiAJCS53b3JkCTB4MDAwMGYwMDAKQEAgLTc5NCw2ICs3OTYsMTYgQEAKIAogCQkuc2l6ZQlwcm9jX3R5cGVzLCAuIC0gcHJvY190eXBlcwogCisJCS8qCisJCSAqIElmIHlvdSBnZXQgYSAibm9uLWNvbnN0YW50IGV4cHJlc3Npb24gaW4gIi5pZiIgc3RhdGVtZW50IgorCQkgKiBlcnJvciBmcm9tIHRoZSBhc3NlbWJsZXIgb24gdGhpcyBsaW5lLCBjaGVjayB0aGF0IHlvdSBoYXZlCisJCSAqIG5vdCBhY2NpZGVudGFsbHkgd3JpdHRlbiBhICJiIiBpbnN0cnVjdGlvbiB3aGVyZSB5b3Ugc2hvdWxkCisJCSAqIGhhdmUgd3JpdHRlbiBXKGIpLgorCQkgKi8KKwkJLmlmICguIC0gcHJvY190eXBlcykgJSBQUk9DX0VOVFJZX1NJWkUgIT0gMAorCQkuZXJyb3IgIlRoZSBzaXplIG9mIG9uZSBvciBtb3JlIHByb2NfdHlwZXMgZW50cmllcyBpcyB3cm9uZy4iCisJCS5lbmRpZgorCiAvKgogICogVHVybiBvZmYgdGhlIENhY2hlIGFuZCBNTVUuICBBUk12MyBkb2VzIG5vdCBzdXBwb3J0CiAgKiByZWFkaW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLCBidXQgQVJNdjQgZG9lcy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYyBiL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYwppbmRleCBlNTY4MTYzLi44NDFkZjdkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCWlmIChidWYgPT0gMCkgewogCQkJZGV2X2VycihkZXYsICIlczogdW5hYmxlIHRvIG1hcCB1bnNhZmUgYnVmZmVyICVwIVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgcHRyKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIH4wOwogCQl9CiAKIAkJZGV2X2RiZyhkZXYsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZGF2aW5jaV9hbGxfZGVmY29uZmlnCmluZGV4IDg4OTkyMmEuLjY3YjVhYmI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZwpAQCAtMTU3LDcgKzE1Nyw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSUz15CiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPW0KIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfWEZTX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL25ldHhfZGVmY29uZmlnCmluZGV4IDMxNmFmNTQuLjljMGFkNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZwpAQCAtNjAsNyArNjAsNyBAQAogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQogQ09ORklHX0xPR089eQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfSkZGUzJfRlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy92aXBlcl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZwppbmRleCA4YjBjNzE3Li4xZDAxZGRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZwpAQCAtMTQyLDcgKzE0Miw3IEBACiBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCiBDT05GSUdfVVNCX0dfU0VSSUFMPW0KIENPTkZJR19VU0JfR19QUklOVEVSPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9EUzEzMDc9bQogQ09ORklHX1JUQ19EUlZfU0ExMTAwPW0KIENPTkZJR19FWFQyX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3hjZXBfZGVmY29uZmlnCmluZGV4IDViNTUwNDEuLjcyMTgzMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy94Y2VwX2RlZmNvbmZpZwpAQCAtNzMsNyArNzMsNyBAQAogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX1NBMTEwMD1tCiBDT05GSUdfRE1BREVWSUNFUz15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3pldXNfZGVmY29uZmlnCmluZGV4IDk2MGY2NTUuLjU5NTc3YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy96ZXVzX2RlZmNvbmZpZwpAQCAtMTU4LDcgKzE1OCw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSX0JBQ0tMSUdIVD1tCiBDT05GSUdfTEVEU19UUklHR0VSX0dQSU89bQogQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9JU0wxMjA4PW0KIENPTkZJR19SVENfRFJWX1BYQT1tCiBDT05GSUdfRVhUMl9GUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCmluZGV4IGJjMmQyZDcuLjY1YzNmMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCkBAIC0xMyw2ICsxMyw5IEBACiAgKiAgRG8gbm90IGluY2x1ZGUgYW55IEMgZGVjbGFyYXRpb25zIGluIHRoaXMgZmlsZSAtIGl0IGlzIGluY2x1ZGVkIGJ5CiAgKiAgYXNzZW1ibGVyIHNvdXJjZS4KICAqLworI2lmbmRlZiBfX0FTTV9BU1NFTUJMRVJfSF9fCisjZGVmaW5lIF9fQVNNX0FTU0VNQkxFUl9IX18KKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNlcnJvciAiT25seSBpbmNsdWRlIHRoaXMgZnJvbSBhc3NlbWJseSBjb2RlIgogI2VuZGlmCkBAIC0yOTAsMyArMjkzLDQgQEAKIAkubWFjcm8JbGRydXNyLCByZWcsIHB0ciwgaW5jLCBjb25kPWFsLCByZXB0PTEsIGFib3J0PTkwMDFmCiAJdXNyYWNjCWxkciwgXHJlZywgXHB0ciwgXGluYywgXGNvbmQsIFxyZXB0LCBcYWJvcnQKIAkuZW5kbQorI2VuZGlmIC8qIF9fQVNNX0FTU0VNQkxFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TCmluZGV4IGVjMGJiZjcuLjJkYTg1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxpbmcuICBQcmVzZXJ2ZXMgcjcsIHI4LCByOQogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jIGIvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYwppbmRleCBhNzAxZTQyLi4wY2RkN2I0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKQEAgLTc2LDYgKzc2LDkgQEAKIAl1bnNpZ25lZCBsb25nIGR0X3Jvb3Q7CiAJY29uc3QgY2hhciAqbW9kZWw7CiAKKwlpZiAoIWR0X3BoeXMpCisJCXJldHVybiBOVUxMOworCiAJZGV2dHJlZSA9IHBoeXNfdG9fdmlydChkdF9waHlzKTsKIAogCS8qIGNoZWNrIGRldmljZSB0cmVlIHZhbGlkaXR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCBlOGQ4ODU2Li45MGM2MmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTQzNSw2ICs0MzUsMTAgQEAKIAl1c3JfZW50cnkKIAlrdXNlcl9jbXB4Y2hnX2NoZWNrCiAKKyNpZmRlZiBDT05GSUdfSVJRU09GRl9UUkFDRVIKKwlibAl0cmFjZV9oYXJkaXJxc19vZmYKKyNlbmRpZgorCiAJZ2V0X3RocmVhZF9pbmZvIHRzawogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJbGRyCXI4LCBbdHNrLCAjVElfUFJFRU1QVF0JCUAgZ2V0IHByZWVtcHQgY291bnQKQEAgLTQ1Myw3ICs0NTcsNyBAQAogI2VuZGlmCiAKIAltb3YJd2h5LCAjMAotCWIJcmV0X3RvX3VzZXIKKwliCXJldF90b191c2VyX2Zyb21faXJxCiAgVU5XSU5EKC5mbmVuZAkJKQogRU5EUFJPQyhfX2lycV91c3IpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwppbmRleCAxZTdiMDRhLi5iMmEyN2I2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCkBAIC02NCw2ICs2NCw3IEBACiBFTlRSWShyZXRfdG9fdXNlcikKIHJldF9zbG93X3N5c2NhbGw6CiAJZGlzYWJsZV9pcnEJCQkJQCBkaXNhYmxlIGludGVycnVwdHMKK0VOVFJZKHJldF90b191c2VyX2Zyb21faXJxKQogCWxkcglyMSwgW3RzaywgI1RJX0ZMQUdTXQogCXRzdAlyMSwgI19USUZfV09SS19NQVNLCiAJYm5lCXdvcmtfcGVuZGluZwpAQCAtNzUsNiArNzYsNyBAQAogCWFyY2hfcmV0X3RvX3VzZXIgcjEsIGxyCiAKIAlyZXN0b3JlX3VzZXJfcmVncyBmYXN0ID0gMCwgb2Zmc2V0ID0gMAorRU5EUFJPQyhyZXRfdG9fdXNlcl9mcm9tX2lycSkKIEVORFBST0MocmV0X3RvX3VzZXIpCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZmVlN2MzNi4uMDE2ZDZhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTkzLDggKzE5MywxNyBAQAogCQkJCW9mZnNldCAtPSAweDAyMDAwMDAwOwogCQkJb2Zmc2V0ICs9IHN5bS0+c3RfdmFsdWUgLSBsb2M7CiAKLQkJCS8qIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFsbG93ZWQgKG5vIGludGVyd29ya2luZykgKi8KLQkJCWlmICghKG9mZnNldCAmIDEpIHx8CisJCQkvKgorCQkJICogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFyZQorCQkJICogYWxsb3dlZCAobm8gaW50ZXJ3b3JraW5nKS4KKwkJCSAqCisJCQkgKiBGb3Igbm9uLWZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBkZXN0aW5hdGlvbgorCQkJICogaGFzIG5vIHNwZWNpZmljIEFSTS9UaHVtYiBkaXNwb3NpdGlvbiwgc28KKwkJCSAqIHRoZSBicmFuY2ggaXMgcmVzb2x2ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24KKwkJCSAqIHRoYXQgaW50ZXJ3b3JraW5nIGlzIG5vdCByZXF1aXJlZC4KKwkJCSAqLworCQkJaWYgKChFTEYzMl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMgJiYKKwkJCQkhKG9mZnNldCAmIDEpKSB8fAogCQkJICAgIG9mZnNldCA8PSAoczMyKTB4ZmYwMDAwMDAgfHwKIAkJCSAgICBvZmZzZXQgPj0gKHMzMikweDAxMDAwMDAwKSB7CiAJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogcmVsb2NhdGlvbiAldSBvdXQgb2YgcmFuZ2UgKCUjbHggLT4gJSN4KVxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IGQ1M2MwYWIuLjJiNWIxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtNTgzLDcgKzU4Myw3IEBACiBzdGF0aWMgdm9pZCBhcm1wbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKIHsKIAkvKiBFbmFibGUgYWxsIG9mIHRoZSBwZXJmIGV2ZW50cyBvbiBoYXJkd2FyZS4gKi8KLQlpbnQgaWR4OworCWludCBpZHgsIGVuYWJsZWQgPSAwOwogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKIAlpZiAoIWFybXBtdSkKQEAgLTU5Niw5ICs1OTYsMTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWFybXBtdS0+ZW5hYmxlKCZldmVudC0+aHcsIGlkeCk7CisJCWVuYWJsZWQgPSAxOwogCX0KIAotCWFybXBtdS0+c3RhcnQoKTsKKwlpZiAoZW5hYmxlZCkKKwkJYXJtcG11LT5zdGFydCgpOwogfQogCiBzdGF0aWMgdm9pZCBhcm1wbXVfZGlzYWJsZShzdHJ1Y3QgcG11ICpwbXUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IGVkMTFmYjAuLmFjYmI0NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC03Myw2ICs3Myw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYyk7CitleHRlcm4gdm9pZCBzYW5pdHlfY2hlY2tfbWVtaW5mbyh2b2lkKTsKIGV4dGVybiB2b2lkIHJlYm9vdF9zZXR1cChjaGFyICpzdHIpOwogCiB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOwpAQCAtOTAwLDYgKzkwMSw3IEBACiAKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCisJc2FuaXR5X2NoZWNrX21lbWluZm8oKTsKIAlhcm1fbWVtYmxvY2tfaW5pdCgmbWVtaW5mbywgbWRlc2MpOwogCiAJcGFnaW5nX2luaXQobWRlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IDM0NGU1MmIuLmU3ZjkyYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTMxOCw5ICszMTgsMTMgQEAKIAlzbXBfc3RvcmVfY3B1X2luZm8oY3B1KTsKIAogCS8qCi0JICogT0ssIG5vdyBpdCdzIHNhZmUgdG8gbGV0IHRoZSBib290IENQVSBjb250aW51ZQorCSAqIE9LLCBub3cgaXQncyBzYWZlIHRvIGxldCB0aGUgYm9vdCBDUFUgY29udGludWUuICBXYWl0IGZvcgorCSAqIHRoZSBDUFUgbWlncmF0aW9uIGNvZGUgdG8gbm90aWNlIHRoYXQgdGhlIENQVSBpcyBvbmxpbmUKKwkgKiBiZWZvcmUgd2UgY29udGludWUuCiAJICovCiAJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKKwl3aGlsZSAoIWNwdV9hY3RpdmUoY3B1KSkKKwkJY3B1X3JlbGF4KCk7CiAKIAkvKgogCSAqIE9LLCBpdCdzIG9mZiB0byB0aGUgaWRsZSB0aHJlYWQgZm9yIHVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwppbmRleCA2MDYzNmY0Li4yYzI3N2Q0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCQl0d2RfdGltZXJfcmF0ZSA9ICgweEZGRkZGRkZGVSAtIGNvdW50KSAqIChIWiAvIDUpOwogCiAJCXByaW50aygiJWx1LiUwMmx1TUh6LlxuIiwgdHdkX3RpbWVyX3JhdGUgLyAxMDAwMDAwLAotCQkJKHR3ZF90aW1lcl9yYXRlIC8gMTAwMDAwMCkgJSAxMDApOworCQkJKHR3ZF90aW1lcl9yYXRlIC8gMTAwMDApICUgMTAwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggZDUyZWVjMi4uNjgwN2NiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCWZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAKLQlmb3IgKGkgPSAtNDsgaSA8IDE7IGkrKykgeworCWZvciAoaSA9IC00OyBpIDwgMSArICEhdGh1bWI7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgdmFsLCBiYWQ7CiAKIAkJaWYgKHRodW1iKQpAQCAtNTYzLDcgKzU2Myw3IEBACiAJCWlmICghcG1kX3ByZXNlbnQoKnBtZCkpCiAJCQlnb3RvIGJhZF9hY2Nlc3M7CiAJCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7Ci0JCWlmICghcHRlX3ByZXNlbnQoKnB0ZSkgfHwgIXB0ZV9kaXJ0eSgqcHRlKSkgeworCQlpZiAoIXB0ZV9wcmVzZW50KCpwdGUpIHx8ICFwdGVfd3JpdGUoKnB0ZSkgfHwgIXB0ZV9kaXJ0eSgqcHRlKSkgewogCQkJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJCQlnb3RvIGJhZF9hY2Nlc3M7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKaW5kZXggMTdmYWU0YS4uZjEwMTNkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKQEAgLTIyMywxNSArMjIzLDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcGVyaXBoX2Nsb2Nrc19sb29rdXBzW10gPSB7Ci0JQ0xLREVWX0NPTl9ERVZfSUQoImhjbGsiLCAiYXRtZWxfdXNiYV91ZGMuMCIsICZ1dG1pX2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAiYXRtZWxfdXNiYV91ZGMuMCIsICZ1ZHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjIiwgJnV0bWlfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1ZHBoc19jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0OTFfbWNpLjAiLCAmbW1jMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0OTFfbWNpLjEiLCAmbW1jMV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4wIiwgJnNwaTBfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgic3BpX2NsayIsICJhdG1lbF9zcGkuMSIsICZzcGkxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQwX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0Y2JfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHVzYXJ0X2Nsb2Nrc19sb29rdXBzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYwppbmRleCBjZDg1MGVkLi5kYmEwZDhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKQEAgLTEyMjAsNyArMTIyMCw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggYjIyOGNlOS4uODNhMWEzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0xOTksOSArMTk5LDkgQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjM19jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjEiLCAmdGM0X2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzVfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jCmluZGV4IGEwYmE0NzUuLjcyMjc3NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKQEAgLTExMzUsNyArMTEzNSw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFybTkyMDBfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXJtOTIwMF9zZXRfY29uc29sZV9jbG9jayhhdDkxX3VhcnRzW3BvcnRucl0tPmlkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCmluZGV4IDFmZGViOTAuLjM5ZjgxZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYwpAQCAtMTE3Myw3ICsxMTczLDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTkyNjBfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXNhbTkyNjBfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYwppbmRleCAzZWI0NTM4Li41MDA0YmYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKQEAgLTEwMTMsNyArMTAxMyw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFzYW05MjYxX3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFzYW05MjYxX3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKaW5kZXggZmZlMDgxYi4uYTA1MGY0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCkBAIC0xMzk1LDcgKzEzOTUsNyBAQAogewogCWlmIChwb3J0bnIgPCBBVE1FTF9NQVhfVUFSVCkgewogCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1twb3J0bnJdOwotCQlhdDkxc2FtOTI2M19zZXRfY29uc29sZV9jbG9jayhwb3J0bnIpOworCQlhdDkxc2FtOTI2M19zZXRfY29uc29sZV9jbG9jayhhdDkxX3VhcnRzW3BvcnRucl0tPmlkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKaW5kZXggMmJiNmZmOS4uMTFlMjE0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKQEAgLTIxNywxMSArMjE3LDExIEBACiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcGVyaXBoX2Nsb2Nrc19sb29rdXBzW10gPSB7CiAJLyogT25lIGFkZGl0aW9uYWwgZmFrZSBjbG9jayBmb3Igb2hjaSAqLwogCUNMS0RFVl9DT05fSUQoIm9oY2lfY2xrIiwgJnVocGhzX2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoImVoY2lfY2xrIiwgImF0bWVsLWVoY2kuMCIsICZ1aHBoc19jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdXRtaV9jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdWRwaHNfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdDkxX21jaS4wIiwgJm1tYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdDkxX21jaS4xIiwgJm1tYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiZWhjaV9jbGsiLCAiYXRtZWwtZWhjaSIsICZ1aHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjIiwgJnV0bWlfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1ZHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0bWVsX21jaS4wIiwgJm1tYzBfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdG1lbF9tY2kuMSIsICZtbWMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInNwaV9jbGsiLCAiYXRtZWxfc3BpLjAiLCAmc3BpMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4xIiwgJnNwaTFfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjYjBfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCmluZGV4IDA1Njc0ODYuLjYwMGJmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwpAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAxYTQwZjE2Li4yOWRmZjE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTE5MSw4ICsxOTEsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHBlcmlwaF9jbG9ja3NfbG9va3Vwc1tdID0gewotCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdXRtaV9jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdWRwaHNfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1dG1pX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAiYXRtZWxfdXNiYV91ZGMiLCAmdWRwaHNfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjAiLCAmdGMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0YzJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwppbmRleCBjMjk2MDQ1Zi4uYWFjYjE5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTlybF9zZXRfY29uc29sZV9jbG9jayhwb3J0bnIpOworCQlhdDkxc2FtOXJsX3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKaW5kZXggMTkwNGZkZi4uY2RiNjVkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX0VCSUNTQSk7CiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9NQVRSSVhfRUJJQ1NBLCBjc2EgfCBBVDkxX01BVFJJWF9FQklfVkRESU9NU0VMXzNfM1YpOwogCi0JY2FwOWFka19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gIWJvYXJkX2hhdmVfbmFuZF84Yml0KCk7CisJY2FwOWFka19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KCk7CiAJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLwogCWlmIChjYXA5YWRrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWNhcDlhZGtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCmluZGV4IGQ2MDBkYzEuLjVjMjQwNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCiB7Ci0JZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9ICFib2FyZF9oYXZlX25hbmRfOGJpdCgpOworCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYwppbmRleCBmODk3Zjg0Li5iNjBjMjJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCkBAIC0yMjAsNyArMjIwLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQogewotCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSAhYm9hcmRfaGF2ZV9uYW5kXzhiaXQoKTsKKwlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KCk7CiAJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLwogCWlmIChla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQogCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKaW5kZXggNjA1YjI2Zi4uOWJiZGM5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKIHsKLQlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gIWJvYXJkX2hhdmVfbmFuZF84Yml0KCk7CisJZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9IGJvYXJkX2hhdmVfbmFuZF8xNmJpdCgpOwogCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KIAlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCmluZGV4IDc2MjRjZjAuLjEzMjVhNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCiB7Ci0JZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9ICFib2FyZF9oYXZlX25hbmRfOGJpdCgpOworCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYwppbmRleCAwNjNjOTVkLi4zM2VhYTEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQogewotCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSAhYm9hcmRfaGF2ZV9uYW5kXzhiaXQoKTsKKwlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KCk7CiAJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLwogCWlmIChla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQogCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3N5c3RlbV9yZXYuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oCmluZGV4IGI4NTVlZTcuLjhmNDg2NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oCkBAIC0xMywxMyArMTMsMTMgQEAKICAqIHRoZSAxNi0zMSBiaXQgYXJlIHJlc2VydmVkIGZvciBhdDkxIGdlbmVyaWMgaW5mb3JtYXRpb24KICAqCiAgKiBiaXQgMzE6Ci0gKgkwID0+IG5hbmQgMTYgYml0Ci0gKgkxID0+IG5hbmQgOCBiaXQKKyAqCTAgPT4gbmFuZCA4IGJpdAorICoJMSA9PiBuYW5kIDE2IGJpdAogICovCi0jZGVmaW5lIEJPQVJEX0hBVkVfTkFORF84QklUCSgxIDw8IDMxKQotc3RhdGljIGludCBpbmxpbmUgYm9hcmRfaGF2ZV9uYW5kXzhiaXQodm9pZCkKKyNkZWZpbmUgQk9BUkRfSEFWRV9OQU5EXzE2QklUCSgxIDw8IDMxKQorc3RhdGljIGlubGluZSBpbnQgYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KHZvaWQpCiB7Ci0JcmV0dXJuIHN5c3RlbV9yZXYgJiBCT0FSRF9IQVZFX05BTkRfOEJJVDsKKwlyZXR1cm4gc3lzdGVtX3JldiAmIEJPQVJEX0hBVkVfTkFORF8xNkJJVDsKIH0KIAogI2VuZGlmIC8qIF9fQVJDSF9TWVNURU1fUkVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCmluZGV4IGM2N2Y2ODQuLjA5YTg3ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCSAqLwogCWlmIChoYXZlX2ltYWdlcigpKSB7CiAJCWxhYmVsID0gIkhEIGltYWdlciI7Ci0JCW11eCB8PSAxOworCQltdXggfD0gMjsKIAogCQkvKiBleHRlcm5hbGx5IG11eCBNTUMxL0VORVQvQUlDMzMgdG8gaW1hZ2VyICovCiAJCW11eCB8PSBCSVQoNikgfCBCSVQoNSkgfCBCSVQoMyk7CkBAIC01NDAsNyArNTQwLDcgQEAKIAkJcmVzZXRzICY9IH5CSVQoMSk7CiAKIAkJaWYgKGhhdmVfdHZwNzAwMigpKSB7Ci0JCQltdXggfD0gMjsKKwkJCW11eCB8PSAxOwogCQkJcmVzZXRzICY9IH5CSVQoMik7CiAJCQlsYWJlbCA9ICJ0dnA3MDAyIEhEIjsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCmluZGV4IDRlNjY4ODEuLmZjNGU5OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJLnJlc291cmNlCT0gZGE4NTBfbWNhc3BfcmVzb3VyY2VzLAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYXZpbmNpX3BjbV9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYXZpbmNpX3BjbV9kZXZpY2UgPSB7CiAJLm5hbWUJPSAiZGF2aW5jaS1wY20tYXVkaW8iLAogCS5pZAk9IC0xLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCmluZGV4IDhmNGY3MzYuLjgwNmEyZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9wY21fZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9wY21fZGV2aWNlID0gewogCS5uYW1lCQk9ICJkYXZpbmNpLXBjbS1hdWRpbyIsCiAJLmlkCQk9IC0xLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jCmluZGV4IGEwYjgzODguLmNhZmJlMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYwpAQCAtMjUyLDggKzI1MiwxMiBAQAogc3RhdGljIHZvaWQKIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBpcnEycmVncyhpcnEpOworCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnOwogCXUzMiBtYXNrID0gMHhmZmZmOworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZDsKKworCWQgPSAoc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICopaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlnID0gKHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICopZC0+cmVnczsKIAogCS8qIHdlIG9ubHkgY2FyZSBhYm91dCBvbmUgYmFuayAqLwogCWlmIChpcnEgJiAxKQpAQCAtMjcyLDExICsyNzYsMTQgQEAKIAkJaWYgKCFzdGF0dXMpCiAJCQlicmVhazsKIAkJX19yYXdfd3JpdGVsKHN0YXR1cywgJmctPmludHN0YXQpOwotCQlpZiAoaXJxICYgMSkKLQkJCXN0YXR1cyA+Pj0gMTY7CiAKIAkJLyogbm93IGRlbXV4IHRoZW0gdG8gdGhlIHJpZ2h0IGxvd2xldmVsIGhhbmRsZXIgKi8KLQkJbiA9IChpbnQpaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKwkJbiA9IGQtPmlycV9iYXNlOworCQlpZiAoaXJxICYgMSkgeworCQkJbiArPSAxNjsKKwkJCXN0YXR1cyA+Pj0gMTY7CisJCX0KKwogCQl3aGlsZSAoc3RhdHVzKSB7CiAJCQlyZXMgPSBmZnMoc3RhdHVzKTsKIAkJCW4gKz0gcmVzOwpAQCAtNDIyLDggKzQyOSwxMyBAQAogCiAJCS8qIHNldCB1cCBhbGwgaXJxcyBpbiB0aGlzIGJhbmsgKi8KIAkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoYmFua19pcnEsIGdwaW9faXJxX2hhbmRsZXIpOwotCQlpcnFfc2V0X2NoaXBfZGF0YShiYW5rX2lycSwgKF9fZm9yY2Ugdm9pZCAqKWcpOwotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShiYW5rX2lycSwgKHZvaWQgKilpcnEpOworCisJCS8qCisJCSAqIEVhY2ggY2hpcCBoYW5kbGVzIDMyIGdwaW9zLCBhbmQgZWFjaCBpcnEgYmFuayBjb25zaXN0cyBvZiAxNgorCQkgKiBncGlvIGlycXMuIFBhc3MgdGhlIGlycSBiYW5rJ3MgY29ycmVzcG9uZGluZyBjb250cm9sbGVyIHRvCisJCSAqIHRoZSBjaGFpbmVkIGlycSBoYW5kbGVyLgorCQkgKi8KKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEoYmFua19pcnEsICZjaGlwc1tncGlvIC8gMzJdKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgZ3BpbyA8IG5ncGlvOyBpKyssIGlycSsrLCBncGlvKyspIHsKIAkJCWlycV9zZXRfY2hpcChpcnEsICZncGlvX2lycWNoaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lycS5jCmluZGV4IGJmZTY4ZWMuLjk1MmRjMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaXJxLmMKQEAgLTUyLDggKzUyLDE0IEBACiAJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OwogCiAJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJBSU5UQyIsIDEsIGlycV9zdGFydCwgYmFzZSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwlpZiAoIWdjKSB7CisJCXByX2VycigiJXM6IGlycV9hbGxvY19nZW5lcmljX2NoaXAgZm9yIElSUSAldSBmYWlsZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgaXJxX3N0YXJ0KTsKKwkJcmV0dXJuOworCX0KKwogCWN0ID0gZ2MtPmNoaXBfdHlwZXM7Ci0JY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2s7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCA4MjA3OTU0Li42NjU5YTBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC0yNTEsOSArMjUxLDkgQEAKIAl1bnNpZ25lZCBpbnQgbWNyOwogCiAJbWNyID0gMDsKLQlpZiAoIShtY3RybCAmIFRJT0NNX1JUUykpCisJaWYgKG1jdHJsICYgVElPQ01fUlRTKQogCQltY3IgfD0gMjsKLQlpZiAoIShtY3RybCAmIFRJT0NNX0RUUikpCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQogCQltY3IgfD0gMTsKIAogCV9fcmF3X3dyaXRlbChtY3IsIGJhc2UgKyBFUDkzWFhfVUFSVF9NQ1JfT0ZGU0VUKTsKQEAgLTQwMiwxMSArNDAyLDE1IEBACiAJfQogfTsKIAorc3RhdGljIHU2NCBlcDkzeHhfZXRoX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXA5M3h4X2V0aF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImVwOTN4eC1ldGgiLAogCS5pZAkJPSAtMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X2V0aF9kYXRhLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmZXA5M3h4X2V0aF9kYXRhLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkuZG1hX21hc2sJCT0gJmVwOTN4eF9ldGhfZG1hX21hc2ssCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXA5M3h4X2V0aF9yZXNvdXJjZSksCiAJLnJlc291cmNlCT0gZXA5M3h4X2V0aF9yZXNvdXJjZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKaW5kZXggYjkyYzFlNS4uMTQzNWZjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKQEAgLTkxLDYgKzkxLDExIEBACiAJaGVscAogCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIHRoZSBjYW1lcmEgaW50ZXJmYWNlcy4KIAorY29uZmlnIEVYWU5PUzRfU0VUVVBfVVNCX1BIWQorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgVVNCIFBIWSBjb250cm9sbGVyCisKICMgbWFjaGluZSBzdXBwb3J0CiAKIG1lbnUgIkVYWU5PUzQgTWFjaGluZXMiCkBAIC0xNzYsNiArMTgxLDcgQEAKIAlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCiAJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNQogCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfVVNCX1BIWQogCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KIAloZWxwCiAJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgTW9iaWxlIE5VUkkgQm9hcmQuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUKaW5kZXggYTliYjk0Zi4uNjBmZTVlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUKQEAgLTU2LDQgKzU2LDQgQEAKIG9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1NESENJKQkrPSBzZXR1cC1zZGhjaS5vCiBvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPKQkrPSBzZXR1cC1zZGhjaS1ncGlvLm8KIAotb2JqLSQoQ09ORklHX1VTQl9TVVBQT1JUKQkJKz0gdXNiLXBoeS5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9VU0JfUEhZKQkrPSBzZXR1cC11c2ItcGh5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYwppbmRleCAwODgxM2E2Li5iZmQ2MjE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvZmltYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9paWMtY29yZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgogCkBAIC05OCw3ICs5OSw3IEBACiAJCS5sZW5ndGgJCT0gU1pfNEssCiAJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX1VTQl9IU1BIWSwKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTM0NfVkFfVVNCX0hTUEhZLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9IU1BIWSksCiAJCS5sZW5ndGgJCT0gU1pfNEssCiAJCS50eXBlCQk9IE1UX0RFVklDRSwKQEAgLTEzMiw2ICsxMzMsMTEgQEAKIAlzM2NfZmltY19zZXRuYW1lKDEsICJleHlub3M0LWZpbWMiKTsKIAlzM2NfZmltY19zZXRuYW1lKDIsICJleHlub3M0LWZpbWMiKTsKIAlzM2NfZmltY19zZXRuYW1lKDMsICJleHlub3M0LWZpbWMiKTsKKworCS8qIFRoZSBJMkMgYnVzIGNvbnRyb2xsZXJzIGFyZSBkaXJlY3RseSBjb21wYXRpYmxlIHdpdGggczNjMjQ0MCAqLworCXMzY19pMmMwX3NldG5hbWUoInMzYzI0NDAtaTJjIik7CisJczNjX2kyYzFfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKKwlzM2NfaTJjMl9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOwogfQogCiB2b2lkIF9faW5pdCBleHlub3M0X2luaXRfY2xvY2tzKGludCB4dGFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1hdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1hdWRpby5jCmluZGV4IDFlZWQ1ZjkuLjk4MzA2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYXVkaW8uYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWF1ZGlvLmMKQEAgLTMzMCw3ICszMzAsNyBAQAogCiBzdGF0aWMgaW50IGV4eW5vczRfc3BkaWZfY2ZnX2dwaW8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoRVhZTk9TNF9HUEMxKDApLCAyLCBTM0NfR1BJT19TRk4oMykpOworCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShFWFlOT1M0X0dQQzEoMCksIDIsIFMzQ19HUElPX1NGTig0KSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9oZWFkc21wLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaGVhZHNtcC5TCmluZGV4IDZjNmNmYzUuLjNjZGViMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9oZWFkc21wLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2hlYWRzbXAuUwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLQlfX0lOSVQKKwlfX0NQVUlOSVQKIAogLyoKICAqIGV4eW5vczQgc3BlY2lmaWMgZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLiAgVGhpcyBwcm92aWRlcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy11c2ItcGh5LmgKaW5kZXggNzAzMTE4ZC4uYzMzN2NmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWZuZGVmIF9fUExBVF9TNVBfUkVHU19VU0JfUEhZX0gKICNkZWZpbmUgX19QTEFUX1M1UF9SRUdTX1VTQl9QSFlfSAogCi0jZGVmaW5lIEVYWU5PUzRfSFNPVEdfUEhZUkVHKHgpCQkoKHgpICsgUzVQX1ZBX1VTQl9IU1BIWSkKKyNkZWZpbmUgRVhZTk9TNF9IU09UR19QSFlSRUcoeCkJCSgoeCkgKyBTM0NfVkFfVVNCX0hTUEhZKQogCiAjZGVmaW5lIEVYWU5PUzRfUEhZUFdSCQkJRVhZTk9TNF9IU09UR19QSFlSRUcoMHgwMCkKICNkZWZpbmUgUEhZMV9IU0lDX05PUk1BTF9NQVNLCQkoMHhmIDw8IDkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5pdC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYwppbmRleCBjZjkxZjUwLi5hOGE4M2UzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5pdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMKQEAgLTM1LDYgKzM1LDcgQEAKIAkJCXRjZmctPmNsb2NrcyA9IGV4eW5vczRfc2VyaWFsX2Nsb2NrczsKIAkJCXRjZmctPmNsb2Nrc19zaXplID0gQVJSQVlfU0laRShleHlub3M0X3NlcmlhbF9jbG9ja3MpOwogCQl9CisJCXRjZmctPmZsYWdzIHw9IE5PX05FRURfQ0hFQ0tfQ0xLU1JDOwogCX0KIAogCXMzYzI0eHhfaW5pdF91YXJ0ZGV2cygiczVwdjIxMC11YXJ0IiwgczVwX3VhcnRfcmVzb3VyY2VzLCBjZmcsIG5vKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrdjMxMC5jCmluZGV4IDE1MjY3NjQuLmVkZDgxNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYwpAQCAtNzgsOSArNzgsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMwX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMCgyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCiAJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAogI2lmZGVmIENPTkZJR19FWFlOT1M0X1NESENJX0NIMF84QklUCiAJLm1heF93aWR0aAkJPSA4LApAQCAtOTYsOSArOTQsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMigyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCiAJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAogI2lmZGVmIENPTkZJR19FWFlOT1M0X1NESENJX0NIMl84QklUCiAJLm1heF93aWR0aAkJPSA4LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3VzYi1waHkuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC11c2ItcGh5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC91c2ItcGh5LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC11c2ItcGh5LmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvdGltZS5jCmluZGV4IDg2YjlmYTAuLmViYjhmMzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3RpbWUuYwpAQCAtMjA2LDYgKzIwNiw3IEBACiAJcmV0dXJuIChjeWNsZV90KSB+X19yYXdfcmVhZGwoUzNDX1RJTUVSUkVHKDB4NDApKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHZvaWQgZXh5bm9zNF9wd200X3Jlc3VtZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewogCXVuc2lnbmVkIGxvbmcgcGNsazsKQEAgLTIxOCw2ICsyMTksNyBAQAogCWV4eW5vczRfcHdtX2luaXQoNCwgfjApOwogCWV4eW5vczRfcHdtX3N0YXJ0KDQsIDEpOwogfQorI2VuZGlmCiAKIHN0cnVjdCBjbG9ja3NvdXJjZSBwd21fY2xvY2tzb3VyY2UgPSB7CiAJLm5hbWUJCT0gInB3bV90aW1lcjQiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKaW5kZXggNWYxZjk4Ni4uMTIxYWQxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jCkBAIC0xMDMsNiArMTAzLDcgQEAKIAljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoY2UsIG1lbV9mY2xrXzIxMjg1LCA1KTsKIAljZS0+bWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweGZmZmZmZiwgY2UpOwogCWNlLT5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4MDAwMDA0LCBjZSk7CisJY2UtPmNwdW1hc2sgPSBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDMwYjk3MWQuLjFiZTJlZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZGVidWctODI1MC5TPgogCiAjZWxzZQorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAkvKiBGb3IgRUJTQTI4NSBkZWJ1Z2dpbmcgKi8KIAkJLmVxdQlkYzIxMjg1X2hpZ2gsIEFSTUNTUl9CQVNFICYgMHhmZjAwMDAwMAogCQkuZXF1CWRjMjEyODVfbG93LCAgQVJNQ1NSX0JBU0UgJiAweDAwZmZmZmZmCkBAIC0zNiw4ICszNyw4IEBACiAJCS5lbHNlCiAJCW1vdglccnAsICMwCiAJCS5lbmRpZgotCQlvcnIJXHJ2LCBccnAsICMweDQyMDAwMDAwCi0JCW9ycglccnAsIFxycCwgI2RjMjEyODVfaGlnaAorCQlvcnIJXHJ2LCBccnAsICNkYzIxMjg1X2hpZ2gKKwkJb3JyCVxycCwgXHJwLCAjMHg0MjAwMDAwMAogCQkuZW5kbQogCiAJCS5tYWNybwlzZW5kdWFydCxyZCxyeApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9LY29uZmlnCmluZGV4IDliNjk4MmVmLi5hYmYzNTZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9LY29uZmlnCkBAIC02LDEyICs2LDE0IEBACiAJYm9vbCAiZ21zMzBjNzIwMSIKIAlkZXBlbmRzIG9uIEFSQ0hfSDcyMFgKIAlzZWxlY3QgQ1BVX0g3MjAxCisJc2VsZWN0IFpPTkVfRE1BCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIeW5peCBHTVMzMEM3MjAxIFJlZmVyZW5jZSBCb2FyZAogCiBjb25maWcgQVJDSF9INzIwMgogCWJvb2wgImhtczMwYzcyMDIiCiAJc2VsZWN0IENQVV9INzIwMgorCXNlbGVjdCBaT05FX0RNQQogCWRlcGVuZHMgb24gQVJDSF9INzIwWAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSHluaXggSE1TMzBDNzIwMiBSZWZlcmVuY2UgQm9hcmQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKaW5kZXggNzRlZDgxYS4uMDc3NzI1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTQxOSwxNCArNDE5LDIwIEBACiAvKgogICogY2xvY2tzb3VyY2UKICAqLworCitzdGF0aWMgY3ljbGVfdCBpeHA0eHhfY2xvY2tzb3VyY2VfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmMpCit7CisJcmV0dXJuICpJWFA0WFhfT1NUUzsKK30KKwogdW5zaWduZWQgbG9uZyBpeHA0eHhfdGltZXJfZnJlcSA9IElYUDRYWF9USU1FUl9GUkVROwogRVhQT1JUX1NZTUJPTChpeHA0eHhfdGltZXJfZnJlcSk7CiBzdGF0aWMgdm9pZCBfX2luaXQgaXhwNHh4X2Nsb2Nrc291cmNlX2luaXQodm9pZCkKIHsKIAlpbml0X3NjaGVkX2Nsb2NrKCZjZCwgaXhwNHh4X3VwZGF0ZV9zY2hlZF9jbG9jaywgMzIsIGl4cDR4eF90aW1lcl9mcmVxKTsKIAotCWNsb2Nrc291cmNlX21taW9faW5pdCgmSVhQNFhYX09TVFMsICJPU1RTIiwgaXhwNHh4X3RpbWVyX2ZyZXEsIDIwMCwgMzIsCi0JCQljbG9ja3NvdXJjZV9tbWlvX3JlYWRsX3VwKTsKKwljbG9ja3NvdXJjZV9tbWlvX2luaXQoTlVMTCwgIk9TVFMiLCBpeHA0eHhfdGltZXJfZnJlcSwgMjAwLCAzMiwKKwkJCWl4cDR4eF9jbG9ja3NvdXJjZV9yZWFkKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMKaW5kZXggNzJiNGU3Ni4uYWI5Zjk5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMKQEAgLTc5LDcgKzc5LDcgQEAKIHN0YXRpYyBBUEJDX0NMSyhzc3A1LCBQWEExNjhfU1NQNSwgNCwgMCk7CiBzdGF0aWMgQVBCQ19DTEsoa2V5cGFkLCBQWEExNjhfS1BDLCAwLCAzMjAwMCk7CiAKLXN0YXRpYyBBUE1VX0NMSyhuYW5kLCBOQU5ELCAweDAxZGIsIDIwODAwMDAwMCk7CitzdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgxOWIsIDE1NjAwMDAwMCk7CiBzdGF0aWMgQVBNVV9DTEsobGNkLCBMQ0QsIDB4N2YsIDMxMjAwMDAwMCk7CiAKIC8qIGRldmljZSBhbmQgY2xvY2sgYmluZGluZ3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMKaW5kZXggOGY5MmNjZC4uMTQ2NDYwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogc3RhdGljIEFQQkNfQ0xLKHB3bTMsIFBYQTkxMF9QV00zLCAxLCAxMzAwMDAwMCk7CiBzdGF0aWMgQVBCQ19DTEsocHdtNCwgUFhBOTEwX1BXTTQsIDEsIDEzMDAwMDAwKTsKIAotc3RhdGljIEFQTVVfQ0xLKG5hbmQsIE5BTkQsIDB4MDFkYiwgMjA4MDAwMDAwKTsKK3N0YXRpYyBBUE1VX0NMSyhuYW5kLCBOQU5ELCAweDE5YiwgMTU2MDAwMDAwKTsKIHN0YXRpYyBBUE1VX0NMSyh1Mm8sIFVTQiwgMHgxYiwgNDgwMDAwMDAwKTsKIAogLyogZGV2aWNlIGFuZCBjbG9jayBiaW5kaW5ncyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKaW5kZXggMzhiOTVlOS4uNjM2MjFmMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisKICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKQEAgLTU1LDEwICs1NywxMiBAQAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUVNEOFg1MCkKICNkZWZpbmUgREdUX0haICgxOTIwMDAwMCAvIDQpIC8qIDE5LjIgTUh6IC8gNCBieSBkZWZhdWx0ICovCiAjZGVmaW5lIE1TTV9ER1RfU0hJRlQgKDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNOFg2MCkgfHwgXAotCQkJCSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNODk2MCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gzMCkKICNkZWZpbmUgREdUX0haICgyNDU3NjAwMCAvIDQpIC8qIDI0LjU3NiBNSHogKExQWE8pIC8gNCBieSBkZWZhdWx0ICovCiAjZGVmaW5lIE1TTV9ER1RfU0hJRlQgKDApCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTThYNjApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNODk2MCkKKyNkZWZpbmUgREdUX0haICgyNzAwMDAwMCAvIDQpIC8qIDI3IE1IeiAoUFhPKSAvIDQgYnkgZGVmYXVsdCAqLworI2RlZmluZSBNU01fREdUX1NISUZUICgwKQogI2Vsc2UKICNkZWZpbmUgREdUX0haIDE5MjAwMDAwIC8qIDE5LjIgTUh6IG9yIDYwMCBLSHogYWZ0ZXIgc2hpZnQgKi8KICNkZWZpbmUgTVNNX0RHVF9TSElGVCAoNSkKQEAgLTEwMCw3ICsxMDQsMTEgQEAKIHsKIAlzdHJ1Y3QgbXNtX2Nsb2NrICpjbGsgPSBjb250YWluZXJfb2YoY3MsIHN0cnVjdCBtc21fY2xvY2ssIGNsb2Nrc291cmNlKTsKIAotCXJldHVybiByZWFkbChjbGstPmdsb2JhbF9jb3VudGVyKTsKKwkvKgorCSAqIFNoaWZ0IHRpbWVyIGNvdW50IGRvd24gYnkgYSBjb25zdGFudCBkdWUgdG8gdW5yZWxpYWJsZSBsb3dlciBiaXRzCisJICogb24gc29tZSB0YXJnZXRzLgorCSAqLworCXJldHVybiByZWFkbChjbGstPmdsb2JhbF9jb3VudGVyKSA+PiBjbGstPnNoaWZ0OwogfQogCiBzdGF0aWMgc3RydWN0IG1zbV9jbG9jayAqY2xvY2tldmVudF90b19jbG9jayhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9vY290cC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvb2NvdHAuYwppbmRleCA2NTE1N2EzLi41NGFkZDYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9vY290cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL29jb3RwLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBmb3IgY3B1X3JlbGF4KCkgKi8KKwogI2luY2x1ZGUgPG1hY2gvbXhzLmg+CiAKICNkZWZpbmUgT0NPVFBfV09SRF9PRkZTRVQJCTB4MjAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCmluZGV4IGFmOTgxMTcuLjViMTE0ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQpAQCAtNCwxNCArNCwxNCBAQAogCiAjIENvbW1vbiBzdXBwb3J0CiBvYmoteSA6PSBpby5vIGlkLm8gc3JhbS5vIHRpbWUubyBpcnEubyBtdXgubyBmbGFzaC5vIHNlcmlhbC5vIGRldmljZXMubyBkbWEubwotb2JqLXkgKz0gY2xvY2subyBjbG9ja19kYXRhLm8gb3BwX2RhdGEubyByZXNldC5vCitvYmoteSArPSBjbG9jay5vIGNsb2NrX2RhdGEubyBvcHBfZGF0YS5vIHJlc2V0Lm8gcG1fYnVzLm8KIAogb2JqLSQoQ09ORklHX09NQVBfTUNCU1ApICs9IG1jYnNwLm8KIAogb2JqLSQoQ09ORklHX09NQVBfMzJLX1RJTUVSKQkrPSB0aW1lcjMyay5vCiAKICMgUG93ZXIgTWFuYWdlbWVudAotb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vIHNsZWVwLm8gcG1fYnVzLm8KK29iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCiAKICMgRFNQCiBvYmotJChDT05GSUdfT01BUF9NQk9YX0ZXSykJKz0gbWFpbGJveF9tYWNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCmluZGV4IGRlODhjOTIuLmY0OWNlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJLmRlbGF5CQk9IDksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfa3BfZGV2aWNlIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfa3BfZGV2aWNlID0gewogCS5uYW1lCQk9ICJvbWFwLWtleXBhZCIsCiAJLmlkCQk9IC0xLAogCS5kZXYJCT0gewpAQCAtMjI1LDEyICsyMjUsMTIgQEAKIAkucmVzb3VyY2UJPSBhbXNfZGVsdGFfa3BfcmVzb3VyY2VzLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2xjZF9kZXZpY2UgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sY2RfZGV2aWNlID0gewogCS5uYW1lCT0gImxjZF9hbXNfZGVsdGEiLAogCS5pZAk9IC0xLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2xlZF9kZXZpY2UgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sZWRfZGV2aWNlID0gewogCS5uYW1lCT0gImFtcy1kZWx0YS1sZWQiLAogCS5pZAk9IC0xCiB9OwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJLnBvd2VyCQk9IGFtc19kZWx0YV9jYW1lcmFfcG93ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfY2FtZXJhX2RldmljZSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2NhbWVyYV9kZXZpY2UgPSB7CiAJLm5hbWUgICA9ICJzb2MtY2FtZXJhLXBkcnYiLAogCS5pZCAgICAgPSAwLAogCS5kZXYgICAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kbWEuYwppbmRleCBkODU1OTM0Li5mNWE1MjIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZG1hLmMKQEAgLTI4NCwxNCArMjg0LDE1IEBACiAJZG1hX2Jhc2UgPSBpb3JlbWFwKHJlc1swXS5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzWzBdKSk7CiAJaWYgKCFkbWFfYmFzZSkgewogCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gaW9yZW1hcFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgcmVzLCBBUlJBWV9TSVpFKHJlcykpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBhZGQgcmVzb3VyY2VzIGZvciAlcyVkXG4iLAogCQkJX19mdW5jX18sIHBkZXYtPm5hbWUsIHBkZXYtPmlkKTsKLQkJZ290byBleGl0X2RldmljZV9kZWw7CisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9zeXN0ZW1fZG1hX3BsYXRfaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMjk5LDcgKzMwMCw3IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgJ3AnIGZvciAlc1xuIiwKIAkJCV9fZnVuY19fLCBwZGV2LT5uYW1lKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0X2RldmljZV9wdXQ7CisJCWdvdG8gZXhpdF9kZXZpY2VfZGVsOwogCX0KIAogCWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9kbWFfZGV2X2F0dHIpLCBHRlBfS0VSTkVMKTsKQEAgLTM4MCwxMCArMzgxLDEwIEBACiAJa2ZyZWUoZCk7CiBleGl0X3JlbGVhc2VfcDoKIAlrZnJlZShwKTsKLWV4aXRfZGV2aWNlX3B1dDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwogZXhpdF9kZXZpY2VfZGVsOgogCXBsYXRmb3JtX2RldmljZV9kZWwocGRldik7CitleGl0X2RldmljZV9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNXh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNXh4LmMKaW5kZXggMDRjNGIwNC4uMzY0MTM3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTV4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE1eHguYwpAQCAtNDEsNyArNDEsNyBAQAogCS5iYW5rX3N0cmlkZQkJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTV4eF9tcHVfZ3BpbyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNXh4X21wdV9ncGlvID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDAsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtNzAsNyArNzAsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDE2LAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTV4eF9ncGlvID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE1eHhfZ3BpbyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAxLAogCS5kZXYgICAgICAgICAgICA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE2eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE2eHguYwppbmRleCA1ZGQwZDRjLi4yOTNhMjQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTZ4eC5jCkBAIC00NCw3ICs0NCw3IEBACiAJLmJhbmtfc3RyaWRlCQk9IDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X21wdV9ncGlvID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfbXB1X2dwaW8gPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMCwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC03Myw3ICs3Myw3IEBACiAJLmJhbmtfd2lkdGgJCT0gMTYsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW8xID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzEgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMSwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAkuYmFua193aWR0aAkJPSAxNiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvMiA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAyLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDE2LAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvMyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW8zID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDMsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtMTYwLDcgKzE2MCw3IEBACiAJLmJhbmtfd2lkdGgJCT0gMTYsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW80ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzQgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gNCwKIAkuZGV2ICAgICAgICAgICAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW83eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3Bpbzd4eC5jCmluZGV4IDEyMDRjOGIuLmM2YWQyNDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvZ3Bpbzd4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3Bpbzd4eC5jCkBAIC00Niw3ICs0Niw3IEBACiAJLmJhbmtfc3RyaWRlCQk9IDIsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfbXB1X2dwaW8gPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X21wdV9ncGlvID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDAsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtNzUsNyArNzUsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW8xID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMSA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAxLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW8yID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMiA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAyLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW8zID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAzLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW80ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNCA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSA0LAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW81ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNSA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSA1LAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCS5iYW5rX3dpZHRoCQk9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW82ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNiA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSA2LAogCS5kZXYgICAgICAgICAgICA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvcG1fYnVzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3BtX2J1cy5jCmluZGV4IGZlMzFkOTMuLjMzNGZiODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvcG1fYnVzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbV9idXMuYwpAQCAtNTYsOSArNTYsMTMgQEAKIAkJVVNFX1BMQVRGT1JNX1BNX1NMRUVQX09QUwogCX0sCiB9OworI2RlZmluZSBPTUFQMV9QV1JfRE9NQUlOICgmZGVmYXVsdF9wb3dlcl9kb21haW4pCisjZWxzZQorI2RlZmluZSBPTUFQMV9QV1JfRE9NQUlOIE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwogCiBzdGF0aWMgc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayBwbGF0Zm9ybV9idXNfbm90aWZpZXIgPSB7Ci0JLnB3cl9kb21haW4gPSAmZGVmYXVsdF9wb3dlcl9kb21haW4sCisJLnB3cl9kb21haW4gPSBPTUFQMV9QV1JfRE9NQUlOLAogCS5jb25faWRzID0geyAiaWNrIiwgImZjayIsIE5VTEwsIH0sCiB9OwogCkBAIC03Miw0ICs3Niw0IEBACiAJcmV0dXJuIDA7CiB9CiBjb3JlX2luaXRjYWxsKG9tYXAxX3BtX3J1bnRpbWVfaW5pdCk7Ci0jZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwppbmRleCBkNTQ5NjliLi41ZGU2ZWFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwpAQCAtMjYsMTMgKzI2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKaW5kZXggYWUyOTYzYS4uNWRhYzk3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKQEAgLTYyMiwxOSArNjIyLDE5IEBACiAJCQkgT01BUF9NVVhfTU9ERTApLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMV9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMV9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9IDAsCiAJLnBhZHMJCT0gc2VyaWFsMV9wYWRzLAogCS5wYWRzX2NudAk9IEFSUkFZX1NJWkUoc2VyaWFsMV9wYWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDJfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDJfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZAkJPSAxLAogCS5wYWRzCQk9IHNlcmlhbDJfcGFkcywKIAkucGFkc19jbnQJPSBBUlJBWV9TSVpFKHNlcmlhbDJfcGFkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwzX2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwzX2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gMiwKIAkucGFkcwkJPSBzZXJpYWwzX3BhZHMsCiAJLnBhZHNfY250CT0gQVJSQVlfU0laRShzZXJpYWwzX3BhZHMpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYwppbmRleCA3M2ZhOTBiLi42M2RlMmQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJeyBFVEhfS1M4ODUxX0lSUSwJR1BJT0ZfSU4sCQkiZXRoX2lycSIJfSwKIH07CiAKLXN0YXRpYyBpbnQgb21hcF9ldGhlcm5ldF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2V0aGVybmV0X2luaXQodm9pZCkKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC0zMjIsNiArMzIyLDcgQEAKIAkJLmdwaW9fd3AJPSAtRUlOVkFMLAogCQkubm9ucmVtb3ZhYmxlICAgPSB0cnVlLAogCQkub2NyX21hc2sJPSBNTUNfVkREXzI5XzMwLAorCQkubm9fb2ZmX2luaXQJPSB0cnVlLAogCX0sCiAJewogCQkubW1jCQk9IDEsCkBAIC02ODEsMTkgKzY4MiwxOSBAQAogCQkJIE9NQVBfUElOX09VVFBVVCB8IE9NQVBfTVVYX01PREUwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDJfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDJfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZAkJPSAxLAogCS5wYWRzCQk9IHNlcmlhbDJfcGFkcywKIAkucGFkc19jbnQJPSBBUlJBWV9TSVpFKHNlcmlhbDJfcGFkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwzX2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwzX2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gMiwKIAkucGFkcwkJPSBzZXJpYWwzX3BhZHMsCiAJLnBhZHNfY250CT0gQVJSQVlfU0laRShzZXJpYWwzX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsNF9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsNF9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9IDMsCiAJLnBhZHMJCT0gc2VyaWFsNF9wYWRzLAogCS5wYWRzX2NudAk9IEFSUkFZX1NJWkUoc2VyaWFsNF9wYWRzKSwKQEAgLTcyOSw3ICs3MzAsNyBAQAogCiAJaWYgKG9tYXBfcmV2KCkgPT0gT01BUDQ0MzBfUkVWX0VTMV8wKQogCQlwYWNrYWdlID0gT01BUF9QQUNLQUdFX0NCTDsKLQlvbWFwNF9tdXhfaW5pdChib2FyZF9tdXgsIHBhY2thZ2UpOworCW9tYXA0X211eF9pbml0KGJvYXJkX211eCwgTlVMTCwgcGFja2FnZSk7CiAKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHNkcDQ0MzBfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHNkcDQ0MzBfY29uZmlnKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKaW5kZXggZjNiZWI4ZS4uYjEyNGJkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKQEAgLTI3LDEzICsyNywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9sZWQuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCmluZGV4IGM2MzExNWIuLjc3NDU2ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwpAQCAtNjMsOCArNjMsNiBAQAogI2RlZmluZSBTQl9UMzVfU01TQzkxMVhfQ1MJNAogI2RlZmluZSBTQl9UMzVfU01TQzkxMVhfR1BJTwk2NQogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiAjaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbXNjOTExeC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jCmluZGV4IDA4ZjA4ZTguLmMzYTlmZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNTE3LmMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCiAjaWYgZGVmaW5lZChDT05GSUdfTEVEU19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0dQSU9fTU9EVUxFKQogc3RhdGljIHN0cnVjdCBncGlvX2xlZCBjbV90MzUxN19sZWRzW10gPSB7CkBAIC0xNzcsNyArMTc4LDcgQEAKIAkucmVzZXRfZ3Bpb19wb3J0WzJdICA9IC1FSU5WQUwsCiB9OwogCi1zdGF0aWMgaW50IGNtX3QzNTE3X2luaXRfdXNiaCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY21fdDM1MTdfaW5pdF91c2JoKHZvaWQpCiB7CiAJaW50IGVycjsKIApAQCAtMjAzLDggKzIwNCw2IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMl9NT0RVTEUpCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY21fdDM1MTdfbmFuZF9wYXJ0aXRpb25zW10gPSB7CiAJewogCQkubmFtZSAgICAgICAgICAgPSAieGxvYWRlciIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCmluZGV4IGNmNTIwZDcuLjM0OTU2ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCkBAIC02MSw4ICs2MSw2IEBACiAjaW5jbHVkZSAidGltZXItZ3AuaCIKICNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiAjZGVmaW5lIE9NQVBfRE05MDAwX0dQSU9fSVJRCTI1CiAjZGVmaW5lIE9NQVAzX0RFVktJVF9UU19HUElPCTI3CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwppbmRleCBiZTcxNDI2Li43ZjIxZDI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCkBAIC01NCw4ICs1NCw2IEBACiAjaW5jbHVkZSAicG0uaCIKICNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiAvKgogICogT01BUDMgQmVhZ2xlIHJldmlzaW9uCiAgKiBSdW4gdGltZSBkZXRlY3Rpb24gb2YgQmVhZ2xlIHJldmlzaW9uIGlzIGRvbmUgYnkgcmVhZGluZyBHUElPLgpAQCAtMTA2LDYgKzEwNCw5IEBACiAJYmVhZ2xlX3JldiA9IGdwaW9fZ2V0X3ZhbHVlKDE3MSkgfCAoZ3Bpb19nZXRfdmFsdWUoMTcyKSA8PCAxKQogCQkJfCAoZ3Bpb19nZXRfdmFsdWUoMTczKSA8PCAyKTsKIAorCWdwaW9fZnJlZV9hcnJheShvbWFwM19iZWFnbGVfcmV2X2dwaW9zLAorCQkJQVJSQVlfU0laRShvbWFwM19iZWFnbGVfcmV2X2dwaW9zKSk7CisKIAlzd2l0Y2ggKGJlYWdsZV9yZXYpIHsKIAljYXNlIDc6CiAJCXByaW50ayhLRVJOX0lORk8gIk9NQVAzIEJlYWdsZSBSZXY6IEF4L0J4XG4iKTsKQEAgLTU3OSw2ICs1ODAsOSBAQAogCW9tYXBfbmFuZF9mbGFzaF9pbml0KE5BTkRfQlVTV0lEVEhfMTYsIG9tYXAzYmVhZ2xlX25hbmRfcGFydGl0aW9ucywKIAkJCSAgICAgQVJSQVlfU0laRShvbWFwM2JlYWdsZV9uYW5kX3BhcnRpdGlvbnMpKTsKIAorCS8qIEVuc3VyZSBtc2VjdXJlIGlzIG11eCdkIHRvIGJlIGFibGUgdG8gc2V0IHRoZSBSVEMuICovCisJb21hcF9tdXhfaW5pdF9zaWduYWwoInN5c19kcm1fbXNlY3VyZSIsIE9NQVBfUElOX09GRl9PVVRQVVRfSElHSCk7CisKIAkvKiBFbnN1cmUgU0RSQyBwaW5zIGFyZSBtdXgnZCBmb3Igc2VsZi1yZWZyZXNoICovCiAJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkcmNfY2tlMCIsIE9NQVBfUElOX09VVFBVVCk7CiAJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkcmNfY2tlMSIsIE9NQVBfUElOX09VVFBVVCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYwppbmRleCAxZDEwNzM2Li4yM2Y3MWQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KQEAgLTQxLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KQEAgLTU3LDggKzU3LDYgQEAKICNkZWZpbmUgUEFORE9SQV9XSUZJX05SRVNFVF9HUElPCTIzCiAjZGVmaW5lIE9NQVAzX1BBTkRPUkFfVFNfR1BJTwkJOTQKIAotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCQlTWl8xMjhLCi0KIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBvbWFwM3BhbmRvcmFfbmFuZF9wYXJ0aXRpb25zW10gPSB7CiAJewogCQkubmFtZSAgICAgICAgICAgPSAieGxvYWRlciIsCkBAIC04Niw3ICs4NCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgcGFuZG9yYV9uYW5kX2RhdGEgPSB7CiAJLmNzCQk9IDAsCi0JLmRldnNpemUJPSAxLAkvKiAnMCcgZm9yIDgtYml0LCAnMScgZm9yIDE2LWJpdCBkZXZpY2UgKi8KKwkuZGV2c2l6ZQk9IE5BTkRfQlVTV0lEVEhfMTYsCisJLnhmZXJfdHlwZQk9IE5BTkRfT01BUF9QUkVGRVRDSF9ETUEsCiAJLnBhcnRzCQk9IG9tYXAzcGFuZG9yYV9uYW5kX3BhcnRpdGlvbnMsCiAJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfbmFuZF9wYXJ0aXRpb25zKSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMKaW5kZXggODI4NzJkNy4uNWY2NDlmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYwpAQCAtNTYsOCArNTYsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLSNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQlTWl8xMjhLCi0KICNkZWZpbmUgT01BUDNfQUNfR1BJTwkJMTM2CiAjZGVmaW5lIE9NQVAzX1RTX0dQSU8JCTE2MgogI2RlZmluZSBUQl9CTF9QV01fVElNRVIJCTkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKaW5kZXggOTA0ODVmYy4uMGNmZTIwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKQEAgLTUyNiwxOSArNTI2LDE5IEBACiAJCQkgT01BUF9QSU5fT1VUUFVUIHwgT01BUF9NVVhfTU9ERTApLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkICAgICAgICAgICAgID0gMSwKIAkucGFkcyAgICAgICAgICAgPSBzZXJpYWwyX3BhZHMsCiAJLnBhZHNfY250ICAgICAgID0gQVJSQVlfU0laRShzZXJpYWwyX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkICAgICAgICAgICAgID0gMiwKIAkucGFkcyAgICAgICAgICAgPSBzZXJpYWwzX3BhZHMsCiAJLnBhZHNfY250ICAgICAgID0gQVJSQVlfU0laRShzZXJpYWwzX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsNF9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsNF9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkICAgICAgICAgICAgID0gMywKIAkucGFkcyAgICAgICAgICAgPSBzZXJpYWw0X3BhZHMsCiAJLnBhZHNfY250ICAgICAgID0gQVJSQVlfU0laRShzZXJpYWw0X3BhZHMpLApAQCAtNjg3LDcgKzY4Nyw3IEBACiAKIAlpZiAob21hcF9yZXYoKSA9PSBPTUFQNDQzMF9SRVZfRVMxXzApCiAJCXBhY2thZ2UgPSBPTUFQX1BBQ0tBR0VfQ0JMOwotCW9tYXA0X211eF9pbml0KGJvYXJkX211eCwgcGFja2FnZSk7CisJb21hcDRfbXV4X2luaXQoYm9hcmRfbXV4LCBOVUxMLCBwYWNrYWdlKTsKIAogCWlmICh3bDEyeHhfc2V0X3BsYXRmb3JtX2RhdGEoJm9tYXBfcGFuZGFfd2xhbl9kYXRhKSkKIAkJcHJfZXJyKCJlcnJvciBzZXR0aW5nIHdsMTJ4eCBkYXRhXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYwppbmRleCAxNTU1OTE4Li4xNzVlMWFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KQEAgLTQ1LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgpAQCAtNjUsOCArNjUsNiBAQAogI2RlZmluZSBPVkVST19HUElPX1VTQkhfQ1BFTgkxNjgKICNkZWZpbmUgT1ZFUk9fR1BJT19VU0JIX05SRVNFVAkxODMKIAotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgU1pfMTI4SwotCiAjZGVmaW5lIE9WRVJPX1NNU0M5MTFYX0NTICAgICAgNQogI2RlZmluZSBPVkVST19TTVNDOTExWF9HUElPICAgIDE3NgogI2RlZmluZSBPVkVST19TTVNDOTExWDJfQ1MgICAgIDQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKaW5kZXggZjYyNDdlNy4uODhiZDZmNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKQEAgLTQ4OCw2ICs0ODgsNyBAQAogCQkubmFtZQkJCT0gIlYyOF9BIiwKIAkJLm1pbl91VgkJCT0gMjgwMDAwMCwKIAkJLm1heF91VgkJCT0gMzAwMDAwMCwKKwkJLmFsd2F5c19vbgkJPSB0cnVlLCAvKiBkdWUgVklPIGxlYWsgdG8gQUlDMzQgVkREcyAqLwogCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKIAkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKIAkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLApAQCAtNTU3LDcgKzU1OCw3IEBACiAJLnN1YmRldl9ib2FyZF9pbmZvID0gJnJ4NTFfc2k0NzEzX2JvYXJkX2luZm8sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByeDUxX3NpNDcxM19kZXYgX19pbml0ZGF0YV9vcl9tb2R1bGUgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByeDUxX3NpNDcxM19kZXYgPSB7CiAJLm5hbWUJPSAicmFkaW8tc2k0NzEzIiwKIAkuaWQJPSAtMSwKIAkuZGV2CT0gewpAQCAtNTgyLDcgKzU4Myw3IEBACiB7CiAJLyogRklYTUUgdGhpcyBncGlvIHNldHVwIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBmb3Igbm93ICovCiAJZ3Bpb19yZXF1ZXN0X29uZShncGlvICsgNiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiYmFja2xpZ2h0X3B3bSIpOwotCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbyArIDcsIEdQSU9GX09VVF9JTklUX0hJR0gsICJzcGVha2VyX2VuIik7CisJZ3Bpb19yZXF1ZXN0X29uZShncGlvICsgNywgR1BJT0ZfT1VUX0lOSVRfTE9XLCAic3BlYWtlcl9lbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLWRpc3BsYXkuYwppbmRleCBjN2M2YmViLi5kNDY4M2JhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1kaXNwbGF5LmMKQEAgLTI2LDcgKzI2LDcgQEAKIAl7IExDRF9QQU5FTF9RVkdBX0dQSU8sCUdQSU9GX09VVF9JTklUX0hJR0gsICJsY2QgcXZnYSIJIH0sCiB9OwogCi1zdGF0aWMgdm9pZCB6b29tX2xjZF9wYW5lbF9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgem9vbV9sY2RfcGFuZWxfaW5pdCh2b2lkKQogewogCXpvb21fbGNkX2dwaW9zWzBdLmdwaW8gPSAob21hcF9yZXYoKSA+IE9NQVAzNDMwX1JFVl9FUzNfMCkgPwogCQkJTENEX1BBTkVMX1JFU0VUX0dQSU9fUFJPRCA6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmMKaW5kZXggZTk0OTAzYi4uOTRjY2Y0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuYwpAQCAtODUsMTggKzg1LDE4IEBACiAJc3RydWN0IHNwaV9ib2FyZF9pbmZvICpzcGlfYmkgPSAmYWRzNzg0Nl9zcGlfYm9hcmRfaW5mbzsKIAlpbnQgZXJyOwogCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KGdwaW9fcGVuZG93biwgIlRTIFBlbkRvd24iKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiQ291bGQgbm90IG9idGFpbiBncGlvIGZvciBUUyBQZW5Eb3duOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuOworCWlmIChib2FyZF9wZGF0YSAmJiBib2FyZF9wZGF0YS0+Z2V0X3BlbmRvd25fc3RhdGUpIHsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0X29uZShncGlvX3BlbmRvd24sIEdQSU9GX0lOLCAiVFNQZW5Eb3duIik7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiQ291bGRuJ3Qgb2J0YWluIGdwaW8gZm9yIFRTUGVuRG93bjogJWRcbiIsIGVycik7CisJCQlyZXR1cm47CisJCX0KKwkJZ3Bpb19leHBvcnQoZ3Bpb19wZW5kb3duLCAwKTsKKworCQlpZiAoZ3Bpb19kZWJvdW5jZSkKKwkJCWdwaW9fc2V0X2RlYm91bmNlKGdwaW9fcGVuZG93biwgZ3Bpb19kZWJvdW5jZSk7CiAJfQogCi0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpb19wZW5kb3duKTsKLQlncGlvX2V4cG9ydChncGlvX3BlbmRvd24sIDApOwotCi0JaWYgKGdwaW9fZGVib3VuY2UpCi0JCWdwaW9fc2V0X2RlYm91bmNlKGdwaW9fcGVuZG93biwgZ3Bpb19kZWJvdW5jZSk7Ci0KIAlhZHM3ODQ2X2NvbmZpZy5ncGlvX3BlbmRvd24gPSBncGlvX3BlbmRvd247CiAKIAlzcGlfYmktPmJ1c19udW0JPSBidXNfbnVtOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5oCmluZGV4IGViODBiM2IuLjY3OTcxOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fT01BUF9DT01NT05fQk9BUkRfREVWSUNFU19fCiAjZGVmaW5lIF9fT01BUF9DT01NT05fQk9BUkRfREVWSUNFU19fCiAKKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFCVNaXzEyOEsKKwogc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YTsKIHN0cnVjdCBtdGRfcGFydGl0aW9uOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IDdiODU1ODUuLjViOGNhNjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCkBAIC05Nyw3ICs5Nyw3IEBACiAKIAlXQVJOKElTX0VSUihvZCksICJjb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLCBvaF9uYW1lKTsKIAotCXJldHVybiBQVFJfRVJSKG9kKTsKKwlyZXR1cm4gSVNfRVJSKG9kKSA/IFBUUl9FUlIob2QpIDogMDsKIH0KIHBvc3Rjb3JlX2luaXRjYWxsKG9tYXA0X2wzX2luaXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKaW5kZXggYjJmMzBiZS4uNjY4NjhjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYwpAQCAtMTQ1LDYgKzE0NSw3IEBACiAJCQkJIGludCBwb3dlcl9vbiwgaW50IHZkZCkKIHsKIAl1MzIgcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCWlmIChwb3dlcl9vbikgewogCQlyZWcgPSBvbWFwNF9jdHJsX3BhZF9yZWFkbChjb250cm9sX3BiaWFzX29mZnNldCk7CkBAIC0xNTcsOSArMTU4LDE1IEBACiAJCQlPTUFQNF9NTUMxX1BXUkROWl9NQVNLIHwKIAkJCU9NQVA0X1VTQkMxX0lDVVNCX1BXUkROWl9NQVNLKTsKIAkJb21hcDRfY3RybF9wYWRfd3JpdGVsKHJlZywgY29udHJvbF9wYmlhc19vZmZzZXQpOwotCQkvKiA0IG1pY3Jvc2VjIGRlbGF5IGZvciBjb21wYXJhdG9yIHRvIGdlbmVyYXRlIGFuIGVycm9yKi8KLQkJdWRlbGF5KDQpOwotCQlyZWcgPSBvbWFwNF9jdHJsX3BhZF9yZWFkbChjb250cm9sX3BiaWFzX29mZnNldCk7CisKKwkJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUpOworCQlkbyB7CisJCQlyZWcgPSBvbWFwNF9jdHJsX3BhZF9yZWFkbChjb250cm9sX3BiaWFzX29mZnNldCk7CisJCQlpZiAoIShyZWcgJiBPTUFQNF9NTUMxX1BCSUFTTElURV9WTU9ERV9FUlJPUl9NQVNLKSkKKwkJCQlicmVhazsKKwkJCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKKwogCQlpZiAocmVnICYgT01BUDRfTU1DMV9QQklBU0xJVEVfVk1PREVfRVJST1JfTUFTSykgewogCQkJcHJfZXJyKCJQYmlhcyBWb2x0YWdlIGlzIG5vdCBzYW1lIGFzIExET1xuIik7CiAJCQkvKiBDYXV0aW9uIDogT24gVk1PREVfRVJST1IgUG93ZXIgRG93biBNTUMgSU8gKi8KQEAgLTMzMSw2ICszMzgsOSBAQAogCWlmIChjLT5ub19vZmYpCiAJCW1tYy0+c2xvdHNbMF0ubm9fb2ZmID0gMTsKIAorCWlmIChjLT5ub19vZmZfaW5pdCkKKwkJbW1jLT5zbG90c1swXS5ub19yZWd1bGF0b3Jfb2ZmX2luaXQgPSBjLT5ub19vZmZfaW5pdDsKKwogCWlmIChjLT52Y2NfYXV4X2Rpc2FibGVfaXNfc2xlZXApCiAJCW1tYy0+c2xvdHNbMF0udmNjX2F1eF9kaXNhYmxlX2lzX3NsZWVwID0gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5oCmluZGV4IGYxMTkzNDguLmY3NTdlNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAlib29sCW5vbnJlbW92YWJsZTsJLyogTm9ucmVtb3ZhYmxlIGUuZy4gZU1NQyAqLwogCWJvb2wJcG93ZXJfc2F2aW5nOwkvKiBUcnkgdG8gc2xlZXAgb3IgcG93ZXIgb2ZmIHdoZW4gcG9zc2libGUgKi8KIAlib29sCW5vX29mZjsJCS8qIHBvd2VyX3NhdmluZyBhbmQgcG93ZXIgaXMgbm90IHRvIGdvIG9mZiAqLworCWJvb2wJbm9fb2ZmX2luaXQ7CS8qIG5vIHBvd2VyIG9mZiB3aGVuIG5vdCBpbiBNTUMgc2xlZXAgc3RhdGUgKi8KIAlib29sCXZjY19hdXhfZGlzYWJsZV9pc19zbGVlcDsgLyogUmVndWxhdG9yIG9mZiByZW1hcHBlZCB0byBzbGVlcCAqLwogCWludAlncGlvX2NkOwkvKiBvciAtRUlOVkFMICovCiAJaW50CWdwaW9fd3A7CS8qIG9yIC1FSU5WQUwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCmluZGV4IGE0YWIxZTMuLmM3ZmIyMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYwpAQCAtODMsNiArODMsOSBAQAogdm9pZCBvbWFwX211eF93cml0ZV9hcnJheShzdHJ1Y3Qgb21hcF9tdXhfcGFydGl0aW9uICpwYXJ0aXRpb24sCiAJCQkJIHN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfbXV4KQogeworCWlmICghYm9hcmRfbXV4KQorCQlyZXR1cm47CisKIAl3aGlsZSAoYm9hcmRfbXV4LT5yZWdfb2Zmc2V0ICE9IE9NQVBfTVVYX1RFUk1JTkFUT1IpIHsKIAkJb21hcF9tdXhfd3JpdGUocGFydGl0aW9uLCBib2FyZF9tdXgtPnZhbHVlLAogCQkJICAgICAgIGJvYXJkX211eC0+cmVnX29mZnNldCk7CkBAIC05MDYsNyArOTA5LDcgQEAKIHUxNiBvbWFwX211eF9nZXRfZ3BpbyhpbnQgZ3BpbykKIHsKIAlzdHJ1Y3Qgb21hcF9tdXhfcGFydGl0aW9uICpwYXJ0aXRpb247Ci0Jc3RydWN0IG9tYXBfbXV4ICptOworCXN0cnVjdCBvbWFwX211eCAqbSA9IE5VTEw7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhcnRpdGlvbiwgJm11eF9wYXJ0aXRpb25zLCBub2RlKSB7CiAJCW0gPSBvbWFwX211eF9nZXRfYnlfZ3BpbyhwYXJ0aXRpb24sIGdwaW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmgKaW5kZXggMTM3ZjMyMS4uMjEzMjMwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5oCkBAIC0zMjMsMTAgKzMyMywxMiBAQAogCiAvKioKICAqIG9tYXA0X211eF9pbml0KCkgLSBpbml0aWFsaXplIG11eCBzeXN0ZW0gd2l0aCBib2FyZCBzcGVjaWZpYyBzZXQKLSAqIEBib2FyZF9tdXg6CQlCb2FyZCBzcGVjaWZpYyBtdXggdGFibGUKKyAqIEBib2FyZF9zdWJzZXQ6CUJvYXJkIHNwZWNpZmljIG11eCB0YWJsZQorICogQGJvYXJkX3drdXBfc3Vic2V0OglCb2FyZCBzcGVjaWZpYyBtdXggdGFibGUgZm9yIHdha2V1cCBpbnN0YW5jZQogICogQGZsYWdzOgkJT01BUCBwYWNrYWdlIHR5cGUgdXNlZCBmb3IgdGhlIGJvYXJkCiAgKi8KLWludCBvbWFwNF9tdXhfaW5pdChzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX211eCwgaW50IGZsYWdzKTsKK2ludCBvbWFwNF9tdXhfaW5pdChzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX3N1YnNldCwKKwlzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX3drdXBfc3Vic2V0LCBpbnQgZmxhZ3MpOwogCiAvKioKICAqIG9tYXBfbXV4X2luaXQgLSBwcml2YXRlIG11eCBpbml0IGZ1bmN0aW9uLCBkbyBub3QgY2FsbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXg0NHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eDQ0eHguYwppbmRleCA5YTY2NDQ1Li5mNWE3NGRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eDQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eDQ0eHguYwpAQCAtMTMwOSw3ICsxMzA5LDggQEAKICNkZWZpbmUgb21hcDRfd2t1cF9jYmxfY2JzX2JhbGwgIE5VTEwKICNlbmRpZgogCi1pbnQgX19pbml0IG9tYXA0X211eF9pbml0KHN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfc3Vic2V0LCBpbnQgZmxhZ3MpCitpbnQgX19pbml0IG9tYXA0X211eF9pbml0KHN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfc3Vic2V0LAorCXN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfd2t1cF9zdWJzZXQsIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgb21hcF9iYWxsICpwYWNrYWdlX2JhbGxzX2NvcmU7CiAJc3RydWN0IG9tYXBfYmFsbCAqcGFja2FnZV9iYWxsc193a3VwID0gb21hcDRfd2t1cF9jYmxfY2JzX2JhbGw7CkBAIC0xMzQ3LDcgKzEzNDgsNyBAQAogCQkJICAgIE9NQVBfTVVYX0dQSU9fSU5fTU9ERTMsCiAJCQkgICAgT01BUDRfQ1RSTF9NT0RVTEVfUEFEX1dLVVBfTVVYX1BCQVNFLAogCQkJICAgIE9NQVA0X0NUUkxfTU9EVUxFX1BBRF9XS1VQX01VWF9TSVpFLAotCQkJICAgIG9tYXA0X3drdXBfbXV4bW9kZXMsIE5VTEwsIGJvYXJkX3N1YnNldCwKKwkJCSAgICBvbWFwNF93a3VwX211eG1vZGVzLCBOVUxMLCBib2FyZF93a3VwX3N1YnNldCwKIAkJCSAgICBwYWNrYWdlX2JhbGxzX3drdXApOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKaW5kZXggZTAzNDI5NC4uMjkzZmE2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKQEAgLTE2MjgsNyArMTYyOCw3IEBACiAJCQl2b2lkICpkYXRhKQogewogCXN0cnVjdCBvbWFwX2h3bW9kICp0ZW1wX29oOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoIWZuKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF80NHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF80NHh4X2RhdGEuYwppbmRleCBhYmM1NDhhLi5lMWM2OWZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzQ0eHhfZGF0YS5jCkBAIC01MTA5LDcgKzUxMDksNyBAQAogCSZvbWFwNDR4eF9pdmFfc2VxMV9od21vZCwKIAogCS8qIGtiZCBjbGFzcyAqLwotLyoJJm9tYXA0NHh4X2tiZF9od21vZCwgKi8KKwkmb21hcDQ0eHhfa2JkX2h3bW9kLAogCiAJLyogbWFpbGJveCBjbGFzcyAqLwogCSZvbWFwNDR4eF9tYWlsYm94X2h3bW9kLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3BoeV9pbnRlcm5hbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3BoeV9pbnRlcm5hbC5jCmluZGV4IGY0NzgxM2UuLjU4Nzc1ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9waHlfaW50ZXJuYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfcGh5X2ludGVybmFsLmMKQEAgLTU2LDggKzU2LDEwIEBACiAJLyogUG93ZXIgZG93biB0aGUgcGh5ICovCiAJX19yYXdfd3JpdGVsKFBIWV9QRCwgY3RybF9iYXNlICsgQ09OVFJPTF9ERVZfQ09ORik7CiAKLQlpZiAoIWRldikKKwlpZiAoIWRldikgeworCQlpb3VubWFwKGN0cmxfYmFzZSk7CiAJCXJldHVybiAwOworCX0KIAogCXBoeWNsayA9IGNsa19nZXQoZGV2LCAib2NwMnNjcF91c2JfcGh5X2ljayIpOwogCWlmIChJU19FUlIocGh5Y2xrKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jCmluZGV4IGE1YTgzYjMuLmUwMWRhNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0tZGVidWcuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLWRlYnVnLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCiBzdGF0aWMgaW50IHBtX2RiZ19pbml0X2RvbmU7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBtX2RiZ19pbml0KHZvaWQpOworc3RhdGljIGludCBwbV9kYmdfaW5pdCh2b2lkKTsKIAogZW51bSB7CiAJREVCVUdfRklMRV9DT1VOVEVSUyA9IDAsCkBAIC01OTUsNyArNTk1LDcgQEAKIAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUocG1fZGJnX29wdGlvbl9mb3BzLCBvcHRpb25fZ2V0LCBvcHRpb25fc2V0LCAiJWxsdVxuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBtX2RiZ19pbml0KHZvaWQpCitzdGF0aWMgaW50IHBtX2RiZ19pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAJc3RydWN0IGRlbnRyeSAqZDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwppbmRleCA4N2FlMzEyLi5iMjc1NDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCkBAIC0zNDcsOSArMzQ3LDkgQEAKIAkJaWYgKChncGlvX2Rlc2NbaV0uY29uZmlnICYgTUZQX0xQTV9LRUVQX09VVFBVVCkgJiYKIAkJICAgIChHUERSKGkpICYgR1BJT19iaXQoaSkpKSB7CiAJCQlpZiAoR1BMUihpKSAmIEdQSU9fYml0KGkpKQotCQkJCVBHU1IoaSkgfD0gR1BJT19iaXQoaSk7CisJCQkJUEdTUihncGlvX3RvX2JhbmsoaSkpIHw9IEdQSU9fYml0KGkpOwogCQkJZWxzZQotCQkJCVBHU1IoaSkgJj0gfkdQSU9fYml0KGkpOworCQkJCVBHU1IoZ3Bpb190b19iYW5rKGkpKSAmPSB+R1BJT19iaXQoaSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCmluZGV4IGQxMzBmNzcuLjJmMzdkNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYwpAQCAtNTczLDEwICs1NzMsMTAgQEAKIAkueHJlcwkJPSA0ODAsCiAJLnlyZXMJCT0gMjcyLAogCS5icHAJCT0gMTYsCi0JLmhzeW5jX2xlbgk9IDQsCisJLmhzeW5jX2xlbgk9IDQxLAogCS5sZWZ0X21hcmdpbgk9IDIsCiAJLnJpZ2h0X21hcmdpbgk9IDEsCi0JLnZzeW5jX2xlbgk9IDEsCisJLnZzeW5jX2xlbgk9IDEwLAogCS51cHBlcl9tYXJnaW4JPSAzLAogCS5sb3dlcl9tYXJnaW4JPSAxLAogCS5zeW5jCQk9IDAsCkBAIC01OTYsMjkgKzU5NiwzMSBAQAogewogCWludCByZXQ7CiAKLQlweGFfc2V0X2ZiX2luZm8oTlVMTCwgJnJhdW1mZWxkX3NoYXJwX2xjZF9pbmZvKTsKLQotCS8qIEVhcmxpZXIgZGV2aWNlcyBoYWQgdGhlIGJhY2tsaWdodCByZWd1bGF0b3IgY29udHJvbGxlZAotCSAqIHZpYSBQV00sIGxhdGVyIHZlcnNpb25zIHVzZSBhbm90aGVyIGNvbnRyb2xsZXIgZm9yIHRoYXQgKi8KLQlpZiAoKHN5c3RlbV9yZXYgJiAweGZmKSA8IDIpIHsKLQkJbWZwX2NmZ190IHJhdW1mZWxkX3B3bV9waW5fY29uZmlnID0gR1BJTzE3X1BXTTBfT1VUOwotCQlweGEzeHhfbWZwX2NvbmZpZygmcmF1bWZlbGRfcHdtX3Bpbl9jb25maWcsIDEpOwotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJhdW1mZWxkX3B3bV9iYWNrbGlnaHRfZGV2aWNlKTsKLQl9IGVsc2UKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyYXVtZmVsZF9sdDM1OTNfZGV2aWNlKTsKLQogCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1RGVF9WQV9FTiwgImRpc3BsYXkgVkEgZW5hYmxlIik7CiAJaWYgKHJldCA8IDApCiAJCXByX3dhcm5pbmcoIlVuYWJsZSB0byByZXF1ZXN0IEdQSU9fVEZUX1ZBX0VOXG4iKTsKIAllbHNlCiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1RGVF9WQV9FTiwgMSk7CiAKKwltc2xlZXAoMTAwKTsKKwogCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX0RJU1BMQVlfRU5BQkxFLCAiZGlzcGxheSBlbmFibGUiKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJfd2FybmluZygiVW5hYmxlIHRvIHJlcXVlc3QgR1BJT19ESVNQTEFZX0VOQUJMRVxuIik7CiAJZWxzZQogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19ESVNQTEFZX0VOQUJMRSwgMSk7CiAKKwkvKiBIYXJkd2FyZSByZXZpc2lvbiAyIGhhcyB0aGUgYmFja2xpZ2h0IHJlZ3VsYXRvciBjb250cm9sbGVkCisJICogYnkgYW4gTFQzNTkzLCBlYXJsaWVyIGFuZCBsYXRlciBkZXZpY2VzIHVzZSBQV00gZm9yIHRoYXQuICovCisJaWYgKChzeXN0ZW1fcmV2ICYgMHhmZikgPT0gMikgeworCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJhdW1mZWxkX2x0MzU5M19kZXZpY2UpOworCX0gZWxzZSB7CisJCW1mcF9jZmdfdCByYXVtZmVsZF9wd21fcGluX2NvbmZpZyA9IEdQSU8xN19QV00wX09VVDsKKwkJcHhhM3h4X21mcF9jb25maWcoJnJhdW1mZWxkX3B3bV9waW5fY29uZmlnLCAxKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyYXVtZmVsZF9wd21fYmFja2xpZ2h0X2RldmljZSk7CisJfQorCisJcHhhX3NldF9mYl9pbmZvKE5VTEwsICZyYXVtZmVsZF9zaGFycF9sY2RfaW5mbyk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZweGEzeHhfZGV2aWNlX2djdSk7CiB9CiAKQEAgLTY1NywxMCArNjU5LDEwIEBACiAKICNkZWZpbmUgU1BJX0FLNDEwNAlcCiB7CQkJXAotCS5tb2RhbGlhcwk9ICJhazQxMDQiLAlcCi0JLm1heF9zcGVlZF9oegk9IDEwMDAwLAlcCi0JLmJ1c19udW0JPSAwLAkJXAotCS5jaGlwX3NlbGVjdAk9IDAsCQlcCisJLm1vZGFsaWFzCT0gImFrNDEwNC1jb2RlYyIsCVwKKwkubWF4X3NwZWVkX2h6CT0gMTAwMDAsCQlcCisJLmJ1c19udW0JPSAwLAkJCVwKKwkuY2hpcF9zZWxlY3QJPSAwLAkJCVwKIAkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgR1BJT19TUERJRl9DUywJXAogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0el9wbS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYwppbmRleCA3ZmU3NDA2Li4wOTQyNzlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0el9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6X3BtLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXBtLWVtdWxhdGlvbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCmluZGV4IDBkNDY4ZTkuLjgxNjk1MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDYgQEAKIG9iai0JCQkJOj0KIAogb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEwKQkrPSBzM2MyNDEwLm8KLW9iai0kKENPTkZJR19DUFVfUzNDMjQxMCkJKz0gaXJxLm8KIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMF9ETUEpCSs9IGRtYS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTBfRE1BKQkrPSBkbWEubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfUE0pCSs9IHBtLm8gc2xlZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0MTI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L3BtLmg+Ci0KLXN0cnVjdCBzeXNjb3JlX29wcyBzM2MyNHh4X2lycV9zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZAk9IHMzYzI0eHhfaXJxX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzM2MyNHh4X2lycV9yZXN1bWUsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMKaW5kZXggZGQzMTIwZC4uZmMyZGMwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jCkBAIC01NTIsNyArNTUyLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcHRpb25hbFs4XTsKIH07CiAKLXN0YXRpYyB2b2lkIG1pbmkyNDQwX3BhcnNlX2ZlYXR1cmVzKAorc3RhdGljIHZvaWQgX19pbml0IG1pbmkyNDQwX3BhcnNlX2ZlYXR1cmVzKAogCQlzdHJ1Y3QgbWluaTI0NDBfZmVhdHVyZXNfdCAqIGZlYXR1cmVzLAogCQljb25zdCBjaGFyICogZmVhdHVyZXNfc3RyICkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXNwaS5jCmluZGV4IDgyZGIwNzIuLjVlNmI0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1zcGkuYwpAQCAtODgsNiArODgsNyBAQAogCS5jZmdfZ3BpbyA9IHMzYzY0eHhfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAorCS50eF9zdF9kb25lID0gMjEsCiB9OwogCiBzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTEzMiw2ICsxMzMsNyBAQAogCS5jZmdfZ3BpbyA9IHMzYzY0eHhfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAorCS50eF9zdF9kb25lID0gMjEsCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3NwaTEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMKaW5kZXggYjE5NzE3MS4uMjA0YmZhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJcmV0dXJuIGNoYW47CiB9CiAKLWludCBzM2MyNDEwX2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIGludCB4ZmVydW5pdCkKK2ludCBzM2MyNDEwX2RtYV9jb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwgaW50IHhmZXJ1bml0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtMjk3LDcgKzI5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzM2MyNDEwX2RtYV9jdHJsKHVuc2lnbmVkIGludCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKK2ludCBzM2MyNDEwX2RtYV9jdHJsKGVudW0gZG1hX2NoIGNoYW5uZWwsIGVudW0gczNjMjQxMF9jaGFuX29wIG9wKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtMzMxLDcgKzMzMSw3IEBACiAgKgogICovCiAKLWludCBzM2MyNDEwX2RtYV9lbnF1ZXVlKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICppZCwKK2ludCBzM2MyNDEwX2RtYV9lbnF1ZXVlKGVudW0gZG1hX2NoIGNoYW5uZWwsIHZvaWQgKmlkLAogCQkJZG1hX2FkZHJfdCBkYXRhLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CkBAIC00MTUsNyArNDE1LDcgQEAKIEVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfZW5xdWV1ZSk7CiAKIAotaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCSAgZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZGV2YWRkcikKIHsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9kZXZjb25maWcpOwogCiAKLWludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbih1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbihlbnVtIGRtYV9jaCBjaGFubmVsLAogCQkJICAgIGRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogICogZ2V0IGNvbnRyb2wgb2YgYW4gZG1hIGNoYW5uZWwKICovCiAKLWludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KHVuc2lnbmVkIGludCBjaGFubmVsLAoraW50IHMzYzI0MTBfZG1hX3JlcXVlc3QoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCXN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCwKIAkJCXZvaWQgKmRldikKIHsKQEAgLTUzMyw3ICs1MzMsNyBAQAogICogYWxsb3dlZCB0byBnbyB0aHJvdWdoLgogKi8KIAotaW50IHMzYzI0MTBfZG1hX2ZyZWUodW5zaWduZWQgaW50IGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKK2ludCBzM2MyNDEwX2RtYV9mcmVlKGVudW0gZG1hX2NoIGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jCmluZGV4IGU3OGVlMTguLmFjODI1ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1zcGkuYwpAQCAtMTEyLDEyICsxMTIsMTQgQEAKIAkuY2ZnX2dwaW8JPSBzNXA2NDQwX3NwaV9jZmdfZ3BpbywKIAkuZmlmb19sdmxfbWFzawk9IDB4MWZmLAogCS5yeF9sdmxfb2Zmc2V0CT0gMTUsCisJLnR4X3N0X2RvbmUJPSAyNSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzNXA2NDUwX3NwaTBfcGRhdGEgPSB7CiAJLmNmZ19ncGlvCT0gczVwNjQ1MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDFmZiwKIAkucnhfbHZsX29mZnNldAk9IDE1LAorCS50eF9zdF9kb25lCT0gMjUsCiB9OwogCiBzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTE2MCwxMiArMTYyLDE0IEBACiAJLmNmZ19ncGlvCT0gczVwNjQ0MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0CT0gMTUsCisJLnR4X3N0X2RvbmUJPSAyNSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzNXA2NDUwX3NwaTFfcGRhdGEgPSB7CiAJLmNmZ19ncGlvCT0gczVwNjQ1MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0CT0gMTUsCisJLnR4X3N0X2RvbmUJPSAyNSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjR4MF9kZXZpY2Vfc3BpMSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LXNwaS5jCmluZGV4IDU3YjE5NzkuLmU1ZDZjNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Rldi1zcGkuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL3NwaS1jbG9ja3MuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogI2luY2x1ZGUgPHBsYXQvczNjNjR4eC1zcGkuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CkBAIC05MCw2ICs5MSw3IEBACiAJLmZpZm9fbHZsX21hc2sgPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0ID0gMTMsCiAJLmhpZ2hfc3BlZWQgPSAxLAorCS50eF9zdF9kb25lID0gMjEsCiB9OwogCiBzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTEzNCw2ICsxMzYsNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkxID0gewpAQCAtMTc2LDYgKzE3OSw3IEBACiAJLmZpZm9fbHZsX21hc2sgPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0ID0gMTMsCiAJLmhpZ2hfc3BlZWQgPSAxLAorCS50eF9zdF9kb25lID0gMjEsCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3NwaTIgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1ZnJlcS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdWZyZXEuYwppbmRleCAyMjA0NmUyLi4xNTNhZjhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1ZnJlcS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jcHVmcmVxLmMKQEAgLTEwMSwxMiArMTAxLDE0IEBACiAJdW5zaWduZWQgbG9uZyB0bXAsIHRtcDE7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBOVUxMOwogCi0JaWYgKGNoID09IERNQzApCisJaWYgKGNoID09IERNQzApIHsKIAkJcmVnID0gKFM1UF9WQV9ETUMwICsgMHgzMCk7Ci0JZWxzZSBpZiAoY2ggPT0gRE1DMSkKKwl9IGVsc2UgaWYgKGNoID09IERNQzEpIHsKIAkJcmVnID0gKFM1UF9WQV9ETUMxICsgMHgzMCk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgRE1DIHBvcnRcbiIpOworCQlyZXR1cm47CisJfQogCiAJLyogRmluZCBjdXJyZW50IERSQU0gZnJlcXVlbmN5ICovCiAJdG1wID0gczVwdjIxMF9kcmFtX2NvbmZbY2hdLmZyZXE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Rldi1zcGkuYwppbmRleCBlMzI0OWE0Li5lYWY5YTdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kZXYtc3BpLmMKQEAgLTg1LDYgKzg1LDcgQEAKIAkuZmlmb19sdmxfbWFzayA9IDB4MWZmLAogCS5yeF9sdmxfb2Zmc2V0ID0gMTUsCiAJLmhpZ2hfc3BlZWQgPSAxLAorCS50eF9zdF9kb25lID0gMjUsCiB9OwogCiBzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTEyOSw2ICsxMzAsNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDE1LAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDI1LAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9zcGkxID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMKaW5kZXggYzk1MjU4Yy4uY2U1YzI1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jCkBAIC0zODEsMTEgKzM4MSw5IEBACiAJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUMTE0LCBzdGF0ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzaF9zZGhpMV9wbGF0ZGF0YSA9IHsKLQkuZG1hX3NsYXZlX3R4CT0gU0hETUFfU0xBVkVfU0RISTFfVFgsCi0JLmRtYV9zbGF2ZV9yeAk9IFNIRE1BX1NMQVZFX1NESEkxX1JYLAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNoX3NkaGkxX2luZm8gPSB7CiAJLnRtaW9fZmxhZ3MJPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSwKLQkudG1pb19jYXBzCT0gTU1DX0NBUF9OT05SRU1PVkFCTEUsCisJLnRtaW9fY2Fwcwk9IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwgTU1DX0NBUF9TRElPX0lSUSwKIAkudG1pb19vY3JfbWFzawk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAogCS5zZXRfcHdyCT0gYWc1ZXZtX3NkaGkxX3NldF9wd3IsCiB9OwpAQCAtNDE1LDcgKzQxMyw3IEBACiAJLm5hbWUJCT0gInNoX21vYmlsZV9zZGhpIiwKIAkuaWQJCT0gMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmc2hfc2RoaTFfcGxhdGRhdGEsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNoX3NkaGkxX2luZm8sCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2RoaTFfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzZGhpMV9yZXNvdXJjZXMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwppbmRleCAwOGFjYjZlLi44MDNiYzZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKQEAgLTI0OSw2ICsyNDksMjkgQEAKIHsKIAlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKEdQSU9fUE9SVDQxKTsKIH0KKy8qIE1FUkFNICovCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9tZXJhbV9pbmZvIG1lcmFtX2luZm8gPSB7CisJLmFkZHJfbW9kZSAgICAgID0gU0hfTU9CSUxFX01FUkFNX01PREUxLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtZXJhbV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lICAgPSAiTUVSQU0iLAorCQkuc3RhcnQgID0gMHhlODAwMDAwMCwKKwkJLmVuZCAgICA9IDB4ZTgxZmZmZmYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWVyYW1fZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9tb2JpbGVfbWVyYW0iLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShtZXJhbV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IG1lcmFtX3Jlc291cmNlcywKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJm1lcmFtX2luZm8sCisJfSwKK307CiAKIC8qIFNIX01NQ0lGICovCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNoX21tY2lmX3Jlc291cmNlc1tdID0gewpAQCAtNDQ3LDEzICs0NzAsMjkgQEAKICNlbmRpZgogCX0sCiB9Oworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnIGxjZF9tZXJhbV9jZmcgPSB7CisJLmljYlswXSA9IHsKKwkJLm1hcmtlcl9pY2IgICAgID0gMjgsCisJCS5jYWNoZV9pY2IgICAgICA9IDI0LAorCQkubWVyYW1fb2Zmc2V0ICAgPSAweDAsCisJCS5tZXJhbV9zaXplICAgICA9IDB4NDAsCisJfSwKKwkuaWNiWzFdID0geworCQkubWFya2VyX2ljYiAgICAgPSAyOSwKKwkJLmNhY2hlX2ljYiAgICAgID0gMjUsCisJCS5tZXJhbV9vZmZzZXQgICA9IDB4NDAsCisJCS5tZXJhbV9zaXplICAgICA9IDB4NDAsCisJfSwKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfaW5mbyBsY2RjX2luZm8gPSB7CisJLm1lcmFtX2RldiA9ICZtZXJhbV9pbmZvLAogCS5jaFswXSA9IHsKIAkJLmNoYW4gPSBMQ0RDX0NIQU5fTUFJTkxDRCwKIAkJLmJwcCA9IDE2LAogCQkubGNkX2NmZyA9IGFwNGV2Yl9sY2RjX21vZGVzLAogCQkubnVtX2NmZyA9IEFSUkFZX1NJWkUoYXA0ZXZiX2xjZGNfbW9kZXMpLAorCQkubWVyYW1fY2ZnID0gJmxjZF9tZXJhbV9jZmcsCiAJfQogfTsKIApAQCAtNzI0LDE1ICs3NjMsMzEgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZzaV9hazQ2NDNfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzaF9mc2kyX2FfYWs0NjQzIiwKIH07CitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9tZXJhbV9jZmcgaGRtaV9tZXJhbV9jZmcgPSB7CisJLmljYlswXSA9IHsKKwkJLm1hcmtlcl9pY2IgICAgID0gMzAsCisJCS5jYWNoZV9pY2IgICAgICA9IDI2LAorCQkubWVyYW1fb2Zmc2V0ICAgPSAweDgwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDEwMCwKKwl9LAorCS5pY2JbMV0gPSB7CisJCS5tYXJrZXJfaWNiICAgICA9IDMxLAorCQkuY2FjaGVfaWNiICAgICAgPSAyNywKKwkJLm1lcmFtX29mZnNldCAgID0gMHgxODAsCisJCS5tZXJhbV9zaXplICAgICA9IDB4MTAwLAorCX0sCit9OwogCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9sY2RjX2luZm8gc2hfbW9iaWxlX2xjZGMxX2luZm8gPSB7CiAJLmNsb2NrX3NvdXJjZSA9IExDRENfQ0xLX0VYVEVSTkFMLAorCS5tZXJhbV9kZXYgPSAmbWVyYW1faW5mbywKIAkuY2hbMF0gPSB7CiAJCS5jaGFuID0gTENEQ19DSEFOX01BSU5MQ0QsCiAJCS5icHAgPSAxNiwKIAkJLmludGVyZmFjZV90eXBlID0gUkdCMjQsCiAJCS5jbG9ja19kaXZpZGVyID0gMSwKIAkJLmZsYWdzID0gTENEQ19GTEFHU19EV1BPTCwKKwkJLm1lcmFtX2NmZyA9ICZoZG1pX21lcmFtX2NmZywKIAl9CiB9OwogCkBAIC04NTgsNyArOTEzLDcgQEAKIAlJMkNfQk9BUkRfSU5GTygiaW14MDc0IiwgMHgxYSksCiB9OwogCi1zdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGlteDA3NF9saW5rID0geworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgaW14MDc0X2xpbmsgPSB7CiAJLmJ1c19pZAkJPSAwLAogCS5ib2FyZF9pbmZvCT0gJmlteDA3NF9pbmZvLAogCS5pMmNfYWRhcHRlcl9pZAk9IDAsCkBAIC05NjEsNiArMTAxNiw3IEBACiAJJmNzaTJfZGV2aWNlLAogCSZjZXVfZGV2aWNlLAogCSZhcDRldmJfY2FtZXJhLAorCSZtZXJhbV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaGRtaV9pbml0X3BtX2Nsb2NrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKaW5kZXggNDQ4ZGRiZS4uMzgwMmYyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2hfaW50Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3RjYTY0MTZfa2V5cGFkLmg+CkBAIC0xMjUsNyArMTI2LDcgQEAKICAqIC0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tCiAgKiBJUlEwICB8IElDUjFBLklSUTBTQT0wMDEwICB8IFNESEkyIGNhcmQgZGV0ZWN0ICB8IExvdwogICogSVJRNiAgfCBJQ1IxQS5JUlE2U0E9MDAxMSAgfCBFdGhlcihMQU45MjIwKSAgICAgfCBIaWdoCi0gKiBJUlE3ICB8IElDUjFBLklSUTdTQT0wMDEwICB8IExDRCBUdWNoIFBhbmVsICAgICB8IExvdworICogSVJRNyAgfCBJQ1IxQS5JUlE3U0E9MDAxMCAgfCBMQ0QgVG91Y2ggUGFuZWwgICAgfCBMb3cKICAqIElSUTggIHwgSUNSMkEuSVJROFNBPTAwMTAgIHwgTU1DL1NEIGNhcmQgZGV0ZWN0IHwgTG93CiAgKiBJUlE5ICB8IElDUjJBLklSUTlTQT0wMDEwICB8IEtFWShUQ0E2NDA4KSAgICAgICB8IExvdwogICogSVJRMjEgfCBJQ1I0QS5JUlEyMVNBPTAwMTEgfCBTZW5zb3IoQURYTDM0NSkgICAgfCBIaWdoCkBAIC0xNjQsMTAgKzE2NSwxMCBAQAogICogVVNCMSBjYW4gYmVjb21lIEhvc3QgYnkgcjhhNjY1OTcsIGFuZCBiZWNvbWUgRnVuY3Rpb24gYnkgcmVuZXNhc191c2Jocy4KICAqIEJ1dCBkb24ndCBzZWxlY3QgYm90aCBkcml2ZXJzIGluIHNhbWUgdGltZS4KICAqIFRoZXNlIHVzZXMgc2FtZSBJUlEgbnVtYmVyIGZvciByZXF1ZXN0X2lycSgpLCBhbmQgYXJlbid0IHN1cHBvcnRpbmcKLSAqIElSUUZfU0hBUkQgLyBJT1JFU09VUkNFX0lSUV9TSEFSRUFCTEUuCisgKiBJUlFGX1NIQVJFRCAvIElPUkVTT1VSQ0VfSVJRX1NIQVJFQUJMRS4KICAqCiAgKiBBY3R1YWxseSB0aGVzZSBhcmUgb2xkL25ldyB2ZXJzaW9uIG9mIFVTQiBkcml2ZXIuCi0gKiBUaGlzIG1lYW4gaXRzIHJlZ2lzdGVyIHdpbGwgYmUgYnJva2VuIGlmIGl0IHN1cHBvcnRzIFNIQVJEIElSUSwKKyAqIFRoaXMgbWVhbiBpdHMgcmVnaXN0ZXIgd2lsbCBiZSBicm9rZW4gaWYgaXQgc3VwcG9ydHMgc2hhcmVkIElSUSwKICAqLwogCiAvKgpAQCAtMzE0LDYgKzMxNSwzMCBAQAogCX0sCiB9OwogCisvKiBNRVJBTSAqLworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1faW5mbyBtYWNrZXJlbF9tZXJhbV9pbmZvID0geworCS5hZGRyX21vZGUJPSBTSF9NT0JJTEVfTUVSQU1fTU9ERTEsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1lcmFtX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiTUVSQU0iLAorCQkuc3RhcnQJPSAweGU4MDAwMDAwLAorCQkuZW5kCT0gMHhlODFmZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1lcmFtX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbW9iaWxlX21lcmFtIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobWVyYW1fcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtZXJhbV9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJm1hY2tlcmVsX21lcmFtX2luZm8sCisJfSwKK307CisKIC8qIExDREMgKi8KIHN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1hY2tlcmVsX2xjZGNfbW9kZXNbXSA9IHsKIAl7CkBAIC0zNDIsNyArMzY3LDIzIEBACiAJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU9fUE9SVDMxKTsKIH0KIAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnIGxjZF9tZXJhbV9jZmcgPSB7CisJLmljYlswXSA9IHsKKwkJLm1hcmtlcl9pY2IgICAgID0gMjgsCisJCS5jYWNoZV9pY2IgICAgICA9IDI0LAorCQkubWVyYW1fb2Zmc2V0ICAgPSAweDAsCisJCS5tZXJhbV9zaXplICAgICA9IDB4NDAsCisJfSwKKwkuaWNiWzFdID0geworCQkubWFya2VyX2ljYiAgICAgPSAyOSwKKwkJLmNhY2hlX2ljYiAgICAgID0gMjUsCisJCS5tZXJhbV9vZmZzZXQgICA9IDB4NDAsCisJCS5tZXJhbV9zaXplICAgICA9IDB4NDAsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfaW5mbyBsY2RjX2luZm8gPSB7CisJLm1lcmFtX2RldiA9ICZtYWNrZXJlbF9tZXJhbV9pbmZvLAogCS5jbG9ja19zb3VyY2UgPSBMQ0RDX0NMS19CVVMsCiAJLmNoWzBdID0gewogCQkuY2hhbiA9IExDRENfQ0hBTl9NQUlOTENELApAQCAtMzYyLDYgKzQwMyw3IEBACiAJCQkubmFtZSA9ICJzaF9tb2JpbGVfbGNkY19ibCIsCiAJCQkubWF4X2JyaWdodG5lc3MgPSAxLAogCQl9LAorCQkubWVyYW1fY2ZnID0gJmxjZF9tZXJhbV9jZmcsCiAJfQogfTsKIApAQCAtMzg4LDggKzQzMCwyMyBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9tZXJhbV9jZmcgaGRtaV9tZXJhbV9jZmcgPSB7CisJLmljYlswXSA9IHsKKwkJLm1hcmtlcl9pY2IgICAgID0gMzAsCisJCS5jYWNoZV9pY2IgICAgICA9IDI2LAorCQkubWVyYW1fb2Zmc2V0ICAgPSAweDgwLAorCQkubWVyYW1fc2l6ZSAgICAgPSAweDEwMCwKKwl9LAorCS5pY2JbMV0gPSB7CisJCS5tYXJrZXJfaWNiICAgICA9IDMxLAorCQkuY2FjaGVfaWNiICAgICAgPSAyNywKKwkJLm1lcmFtX29mZnNldCAgID0gMHgxODAsCisJCS5tZXJhbV9zaXplICAgICA9IDB4MTAwLAorCX0sCit9OwogLyogSERNSSAqLwogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19pbmZvIGhkbWlfbGNkY19pbmZvID0geworCS5tZXJhbV9kZXYgPSAmbWFja2VyZWxfbWVyYW1faW5mbywKIAkuY2xvY2tfc291cmNlID0gTENEQ19DTEtfRVhURVJOQUwsCiAJLmNoWzBdID0gewogCQkuY2hhbiA9IExDRENfQ0hBTl9NQUlOTENELApAQCAtMzk3LDYgKzQ1NCw3IEBACiAJCS5pbnRlcmZhY2VfdHlwZSA9IFJHQjI0LAogCQkuY2xvY2tfZGl2aWRlciA9IDEsCiAJCS5mbGFncyA9IExDRENfRkxBR1NfRFdQT0wsCisJCS5tZXJhbV9jZmcgPSAmaGRtaV9tZXJhbV9jZmcsCiAJfQogfTsKIApAQCAtNTA0LDcgKzU2MiwxMjEgQEAKIAkJY2xrX3B1dChoZG1pX2ljayk7CiB9CiAKLS8qIFVTQjEgKEhvc3QpICovCisvKiBVU0JIUzAgaXMgY29ubmVjdGVkIHRvIENOMjIgd2hpY2ggdGFrZXMgYSBVU0IgTWluaS1CIHBsdWcKKyAqCisgKiBUaGUgc2g3MzcyIFNvQyBoYXMgSVJRNyBzZXQgYXNpZGUgZm9yIFVTQkhTMCBob3RwbHVnLAorICogYnV0IG9uIHRoaXMgcGFydGljdWxhciBib2FyZCBJUlE3IGlzIGFscmVhZHkgdXNlZCBieQorICogdGhlIHRvdWNoIHNjcmVlbi4gVGhpcyBsZWF2ZXMgdXMgd2l0aCBzb2Z0d2FyZSBwb2xsaW5nLgorICovCisjZGVmaW5lIFVTQkhTMF9QT0xMX0lOVEVSVkFMIChIWiAqIDUpCisKK3N0cnVjdCB1c2Joc19wcml2YXRlIHsKKwl1bnNpZ25lZCBpbnQgdXNicGh5YWRkcjsKKwl1bnNpZ25lZCBpbnQgdXNiY3JjYWRkcjsKKwlzdHJ1Y3QgcmVuZXNhc191c2Joc19wbGF0Zm9ybV9pbmZvIGluZm87CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cit9OworCisjZGVmaW5lIHVzYmhzX2dldF9wcml2KHBkZXYpCQkJCVwKKwljb250YWluZXJfb2YocmVuZXNhc191c2Joc19nZXRfaW5mbyhwZGV2KSwJXAorCQkgICAgIHN0cnVjdCB1c2Joc19wcml2YXRlLCBpbmZvKQorCisjZGVmaW5lIHVzYmhzX2lzX2Nvbm5lY3RlZChwcml2KQkJCVwKKwkoISgoMSA8PCA3KSAmIF9fcmF3X3JlYWR3KHByaXYtPnVzYmNyY2FkZHIpKSkKKworc3RhdGljIGludCB1c2Joc19nZXRfdmJ1cyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiB1c2Joc19pc19jb25uZWN0ZWQodXNiaHNfZ2V0X3ByaXYocGRldikpOworfQorCitzdGF0aWMgdm9pZCB1c2Joc19waHlfcmVzZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSAqcHJpdiA9IHVzYmhzX2dldF9wcml2KHBkZXYpOworCisJLyogaW5pdCBwaHkgKi8KKwlfX3Jhd193cml0ZXcoMHg4YTBhLCBwcml2LT51c2JjcmNhZGRyKTsKK30KKworc3RhdGljIGludCB1c2JoczBfZ2V0X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIFVTQkhTX0dBREdFVDsKK30KKworc3RhdGljIHZvaWQgdXNiaHMwX3dvcmtfZnVuY3Rpb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2Joc19wcml2YXRlLAorCQkJCQkJICB3b3JrLndvcmspOworCisJcmVuZXNhc191c2Joc19jYWxsX25vdGlmeV9ob3RwbHVnKHByaXYtPnBkZXYpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+d29yaywgVVNCSFMwX1BPTExfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IHVzYmhzMF9oYXJkd2FyZV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKKworCXByaXYtPnBkZXYgPSBwZGV2OworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53b3JrLCB1c2JoczBfd29ya19mdW5jdGlvbik7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT53b3JrLCBVU0JIUzBfUE9MTF9JTlRFUlZBTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzMF9oYXJkd2FyZV9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+d29yayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSB1c2JoczBfcHJpdmF0ZSA9IHsKKwkudXNiY3JjYWRkcgk9IDB4ZTYwNTgxMGMsCQkvKiBVU0JDUjIgKi8KKwkuaW5mbyA9IHsKKwkJLnBsYXRmb3JtX2NhbGxiYWNrID0geworCQkJLmhhcmR3YXJlX2luaXQJPSB1c2JoczBfaGFyZHdhcmVfaW5pdCwKKwkJCS5oYXJkd2FyZV9leGl0CT0gdXNiaHMwX2hhcmR3YXJlX2V4aXQsCisJCQkucGh5X3Jlc2V0CT0gdXNiaHNfcGh5X3Jlc2V0LAorCQkJLmdldF9pZAkJPSB1c2JoczBfZ2V0X2lkLAorCQkJLmdldF92YnVzCT0gdXNiaHNfZ2V0X3ZidXMsCisJCX0sCisJCS5kcml2ZXJfcGFyYW0gPSB7CisJCQkuYnVzd2FpdF9id2FpdAk9IDQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiaHMwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVVNCSFMwIiwKKwkJLnN0YXJ0CT0gMHhlNjg5MDAwMCwKKwkJLmVuZAk9IDB4ZTY4OTAwZTYgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gZXZ0MmlycSgweDFjYTApIC8qIFVTQjBfVVNCMEkwICovLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdXNiaHMwX2RldmljZSA9IHsKKwkubmFtZQk9ICJyZW5lc2FzX3VzYmhzIiwKKwkuaWQJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2JoczBfcHJpdmF0ZS5pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVzYmhzMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYmhzMF9yZXNvdXJjZXMsCit9OworCisvKiBVU0JIUzEgaXMgY29ubmVjdGVkIHRvIENOMzEgd2hpY2ggdGFrZXMgYSBVU0IgTWluaS1BQiBwbHVnCisgKgorICogVXNlIEozMCB0byBzZWxlY3QgYmV0d2VlbiBIb3N0IGFuZCBGdW5jdGlvbi4gVGhpcyBzZXR0aW5nCisgKiBjYW4gaG93ZXZlciBub3QgYmUgZGV0ZWN0ZWQgYnkgc29mdHdhcmUuIEhvdHBsdWcgb2YgVVNCSFMxCisgKiBpcyBwcm92aWRlZCB2aWEgSVJROC4KKyAqLworI2RlZmluZSBJUlE4IGV2dDJpcnEoMHgwMzAwKQorCisvKiBVU0JIUzEgVVNCIEhvc3Qgc3VwcG9ydCB2aWEgcjhhNjY1OTdfaGNkICovCiBzdGF0aWMgdm9pZCB1c2IxX2hvc3RfcG9ydF9wb3dlcihpbnQgcG9ydCwgaW50IHBvd2VyKQogewogCWlmICghcG93ZXIpIC8qIG9ubHkgcG93ZXItb24gaXMgc3VwcG9ydGVkIGZvciBub3cgKi8KQEAgLTUyMSw5ICs2OTMsOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYjFfaG9zdF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gIlVTQkhTIiwKLQkJLnN0YXJ0CT0gMHhFNjhCMDAwMCwKLQkJLmVuZAk9IDB4RTY4QjAwRTYgLSAxLAorCQkubmFtZQk9ICJVU0JIUzEiLAorCQkuc3RhcnQJPSAweGU2OGIwMDAwLAorCQkuZW5kCT0gMHhlNjhiMDBlNiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtNTQ0LDM3ICs3MTYsMTQgQEAKIAkucmVzb3VyY2UJPSB1c2IxX2hvc3RfcmVzb3VyY2VzLAogfTsKIAotLyogVVNCMSAoRnVuY3Rpb24pICovCisvKiBVU0JIUzEgVVNCIEZ1bmN0aW9uIHN1cHBvcnQgdmlhIHJlbmVzYXNfdXNiaHMgKi8KKwogI2RlZmluZSBVU0JfUEhZX01PREUJCSgxIDw8IDQpCiAjZGVmaW5lIFVTQl9QSFlfSU5UX0VOCQkoKDEgPDwgMykgfCAoMSA8PCAyKSkKICNkZWZpbmUgVVNCX1BIWV9PTgkJKDEgPDwgMSkKICNkZWZpbmUgVVNCX1BIWV9PRkYJCSgxIDw8IDApCiAjZGVmaW5lIFVTQl9QSFlfSU5UX0NMUgkJKFVTQl9QSFlfT04gfCBVU0JfUEhZX09GRikKIAotc3RydWN0IHVzYmhzX3ByaXZhdGUgewotCXVuc2lnbmVkIGludCBpcnE7Ci0JdW5zaWduZWQgaW50IHVzYnBoeWFkZHI7Ci0JdW5zaWduZWQgaW50IHVzYmNyY2FkZHI7Ci0Jc3RydWN0IHJlbmVzYXNfdXNiaHNfcGxhdGZvcm1faW5mbyBpbmZvOwotfTsKLQotI2RlZmluZSB1c2Joc19nZXRfcHJpdihwZGV2KQkJCQlcCi0JY29udGFpbmVyX29mKHJlbmVzYXNfdXNiaHNfZ2V0X2luZm8ocGRldiksCVwKLQkJICAgICBzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSwgaW5mbykKLQotI2RlZmluZSB1c2Joc19pc19jb25uZWN0ZWQocHJpdikJCQlcCi0JKCEoKDEgPDwgNykgJiBfX3Jhd19yZWFkdyhwcml2LT51c2JjcmNhZGRyKSkpCi0KLXN0YXRpYyBpbnQgdXNiaHMxX2dldF9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBVU0JIU19HQURHRVQ7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiaHMxX2dldF92YnVzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHVzYmhzX2lzX2Nvbm5lY3RlZCh1c2Joc19nZXRfcHJpdihwZGV2KSk7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCB1c2JoczFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRhdGE7CkBAIC01OTYsMTIgKzc0NSwxMCBAQAogCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gdXNiaHNfZ2V0X3ByaXYocGRldik7CiAJaW50IHJldDsKIAotCWlycV9zZXRfaXJxX3R5cGUocHJpdi0+aXJxLCBJUlFfVFlQRV9MRVZFTF9ISUdIKTsKLQogCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KIAlfX3Jhd193cml0ZXcoVVNCX1BIWV9NT0RFIHwgVVNCX1BIWV9JTlRfQ0xSLCBwcml2LT51c2JwaHlhZGRyKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHByaXYtPmlycSwgdXNiaHMxX2ludGVycnVwdCwgMCwKKwlyZXQgPSByZXF1ZXN0X2lycShJUlE4LCB1c2JoczFfaW50ZXJydXB0LCBJUlFGX1RSSUdHRVJfSElHSCwKIAkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIHBkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZXJyXG4iKTsKQEAgLTYyMSwxNSArNzY4LDEyIEBACiAJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwogCV9fcmF3X3dyaXRldyhVU0JfUEhZX01PREUgfCBVU0JfUEhZX0lOVF9DTFIsIHByaXYtPnVzYnBoeWFkZHIpOwogCi0JZnJlZV9pcnEocHJpdi0+aXJxLCBwZGV2KTsKKwlmcmVlX2lycShJUlE4LCBwZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgdXNiaHMxX3BoeV9yZXNldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCB1c2JoczFfZ2V0X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKLQotCS8qIGluaXQgcGh5ICovCi0JX19yYXdfd3JpdGV3KDB4OGEwYSwgcHJpdi0+dXNiY3JjYWRkcik7CisJcmV0dXJuIFVTQkhTX0dBREdFVDsKIH0KIAogc3RhdGljIHUzMiB1c2JoczFfcGlwZV9jZmdbXSA9IHsKQEAgLTY1MiwxNiArNzk2LDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYmhzX3ByaXZhdGUgdXNiaHMxX3ByaXZhdGUgPSB7Ci0JLmlycQkJPSBldnQyaXJxKDB4MDMwMCksCS8qIElSUTggKi8KLQkudXNicGh5YWRkcgk9IDB4RTYwNTgxRTIsCQkvKiBVU0JQSFkxSU5UQVAgKi8KLQkudXNiY3JjYWRkcgk9IDB4RTYwNTgxMzAsCQkvKiBVU0JDUjQgKi8KKwkudXNicGh5YWRkcgk9IDB4ZTYwNTgxZTIsCQkvKiBVU0JQSFkxSU5UQVAgKi8KKwkudXNiY3JjYWRkcgk9IDB4ZTYwNTgxMzAsCQkvKiBVU0JDUjQgKi8KIAkuaW5mbyA9IHsKIAkJLnBsYXRmb3JtX2NhbGxiYWNrID0gewogCQkJLmhhcmR3YXJlX2luaXQJPSB1c2JoczFfaGFyZHdhcmVfaW5pdCwKIAkJCS5oYXJkd2FyZV9leGl0CT0gdXNiaHMxX2hhcmR3YXJlX2V4aXQsCi0JCQkucGh5X3Jlc2V0CT0gdXNiaHMxX3BoeV9yZXNldCwKIAkJCS5nZXRfaWQJCT0gdXNiaHMxX2dldF9pZCwKLQkJCS5nZXRfdmJ1cwk9IHVzYmhzMV9nZXRfdmJ1cywKKwkJCS5waHlfcmVzZXQJPSB1c2Joc19waHlfcmVzZXQsCisJCQkuZ2V0X3ZidXMJPSB1c2Joc19nZXRfdmJ1cywKIAkJfSwKIAkJLmRyaXZlcl9wYXJhbSA9IHsKIAkJCS5idXN3YWl0X2J3YWl0CT0gNCwKQEAgLTY3Myw5ICs4MTYsOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmhzMV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gIlVTQkhTIiwKLQkJLnN0YXJ0CT0gMHhFNjhCMDAwMCwKLQkJLmVuZAk9IDB4RTY4QjAwRTYgLSAxLAorCQkubmFtZQk9ICJVU0JIUzEiLAorCQkuc3RhcnQJPSAweGU2OGIwMDAwLAorCQkuZW5kCT0gMHhlNjhiMDBlNiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtNjk0LDcgKzgzNyw2IEBACiAJLnJlc291cmNlCT0gdXNiaHMxX3Jlc291cmNlcywKIH07CiAKLQogLyogTEVEICovCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIG1hY2tlcmVsX2xlZHNbXSA9IHsKIAl7CkBAIC04NTYsNiArOTk4LDE3IEBACiB9CiAKIC8qIFNESEkwICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFja2VyZWxfc2RoaTBfZ3Bpb19jZChpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXJnOworCXN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvICppbmZvID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB0bWlvX21tY19kYXRhICpwZGF0YSA9IGluZm8tPnBkYXRhOworCisJdG1pb19tbWNfY2Rfd2FrZXVwKHBkYXRhKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkwX2luZm8gPSB7CiAJLmRtYV9zbGF2ZV90eAk9IFNIRE1BX1NMQVZFX1NESEkwX1RYLAogCS5kbWFfc2xhdmVfcngJPSBTSERNQV9TTEFWRV9TREhJMF9SWCwKQEAgLTExMzYsNiArMTI4OSw3IEBACiAJJmxjZGNfZGV2aWNlLAogCSZ1c2IxX2hvc3RfZGV2aWNlLAogCSZ1c2JoczFfZGV2aWNlLAorCSZ1c2JoczBfZGV2aWNlLAogCSZsZWRzX2RldmljZSwKIAkmZnNpX2RldmljZSwKIAkmZnNpX2FrNDY0M19kZXZpY2UsCkBAIC0xMTUwLDYgKzEzMDQsNyBAQAogCSZtYWNrZXJlbF9jYW1lcmEsCiAJJmhkbWlfbGNkY19kZXZpY2UsCiAJJmhkbWlfZGV2aWNlLAorCSZtZXJhbV9kZXZpY2UsCiB9OwogCiAvKiBLZXlwYWQgSW5pdGlhbGl6YXRpb24gKi8KQEAgLTEyMzEsNiArMTM4Niw3IEBACiAKICNkZWZpbmUgR1BJT19QT1JUOUNSCTB4RTYwNTEwMDkKICNkZWZpbmUgR1BJT19QT1JUMTBDUgkweEU2MDUxMDBBCisjZGVmaW5lIEdQSU9fUE9SVDE2N0NSCTB4RTYwNTIwQTcKICNkZWZpbmUgR1BJT19QT1JUMTY4Q1IJMHhFNjA1MjBBOAogI2RlZmluZSBTUkNSNAkJMHhlNjE1ODBiYwogI2RlZmluZSBVU0NDUjEJCTB4RTYwNTgxNDQKQEAgLTEyMzgsNiArMTM5NCw3IEBACiB7CiAJdTMyIHNyY3I0OwogCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgcmV0OwogCiAJc2g3MzcyX3Bpbm11eF9pbml0KCk7CiAKQEAgLTEyODMsMTcgKzE0NDAsMTcgQEAKIAlncGlvX3JlcXVlc3QoR1BJT19QT1JUMTUxLCBOVUxMKTsgLyogTENERE9OICovCiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUE9SVDE1MSwgMSk7CiAKLQkvKiBVU0IgZW5hYmxlICovCi0JZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVkJVUzBfMSwgICAgTlVMTCk7Ci0JZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSURJTl8xXzE4LCAgTlVMTCk7Ci0JZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fUFdFTl8xXzExNSwgTlVMTCk7Ci0JZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fT1ZDTl8xXzExNCwgTlVMTCk7Ci0JZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRVhUTFBfMSwgICAgTlVMTCk7Ci0JZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fT1ZDTjJfMSwgICAgTlVMTCk7Ci0JZ3Bpb19wdWxsX2Rvd24oR1BJT19QT1JUMTY4Q1IpOworCS8qIFVTQkhTMCAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZCVVMwXzAsIE5VTEwpOworCWdwaW9fcHVsbF9kb3duKEdQSU9fUE9SVDE2OENSKTsgLyogVkJVUzBfMCBwdWxsIGRvd24gKi8KIAotCS8qIHNldHVwIFVTQiBwaHkgKi8KLQlfX3Jhd193cml0ZXcoMHg4YTBhLCAweEU2MDU4MTMwKTsJLyogVVNCQ1I0ICovCisJLyogVVNCSFMxICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVkJVUzBfMSwgTlVMTCk7CisJZ3Bpb19wdWxsX2Rvd24oR1BJT19QT1JUMTY3Q1IpOyAvKiBWQlVTMF8xIHB1bGwgZG93biAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0lESU5fMV8xMTMsIE5VTEwpOworCisJLyogVVNCIHBoeSB0d2VhayB0byBtYWtlIHRoZSByOGE2NjU5N19oY2QgaG9zdCBkcml2ZXIgd29yayAqLworCV9fcmF3X3dyaXRldygweDhhMGEsIDB4ZTYwNTgxMzApOyAgICAgICAvKiBVU0JDUjQgKi8KIAogCS8qIGVuYWJsZSBGU0kyIHBvcnQgQSAoYWs0NjQzKSAqLwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUFJQlQsCU5VTEwpOwpAQCAtMTM0Myw2ICsxNTAwLDEzIEBACiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQwXzEsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMF8wLCBOVUxMKTsKIAorCXJldCA9IHJlcXVlc3RfaXJxKGV2dDJpcnEoMHgzMzQwKSwgbWFja2VyZWxfc2RoaTBfZ3Bpb19jZCwKKwkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcsICJzZGhpMCBjZCIsICZzZGhpMF9kZXZpY2UuZGV2KTsKKwlpZiAoIXJldCkKKwkJc2RoaTBfaW5mby50bWlvX2ZsYWdzIHw9IFRNSU9fTU1DX0hBU19DT0xEX0NEOworCWVsc2UKKwkJcHJfZXJyKCJDYW5ub3QgZ2V0IElSUSAjJWQ6ICVkXG4iLCBldnQyaXJxKDB4MzM0MCksIHJldCk7CisKICNpZiAhZGVmaW5lZChDT05GSUdfTU1DX1NIX01NQ0lGKSAmJiAhZGVmaW5lZChDT05GSUdfTU1DX1NIX01NQ0lGX01PRFVMRSkKIAkvKiBlbmFibGUgU0RISTEgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJQ01EMSwgTlVMTCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYwppbmRleCBkMTdlYjY2Li5jMDgwMGQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKQEAgLTUwOSw2ICs1MDksNyBAQAogICAgICAgIE1TVFAxMTgsIE1TVFAxMTcsIE1TVFAxMTYsIE1TVFAxMTMsCiAgICAgICAgTVNUUDEwNiwgTVNUUDEwMSwgTVNUUDEwMCwKICAgICAgICBNU1RQMjIzLAorICAgICAgIE1TVFAyMTgsIE1TVFAyMTcsIE1TVFAyMTYsCiAgICAgICAgTVNUUDIwNywgTVNUUDIwNiwgTVNUUDIwNCwgTVNUUDIwMywgTVNUUDIwMiwgTVNUUDIwMSwgTVNUUDIwMCwKICAgICAgICBNU1RQMzI5LCBNU1RQMzI4LCBNU1RQMzIzLCBNU1RQMzIyLCBNU1RQMzE0LCBNU1RQMzEzLCBNU1RQMzEyLAogICAgICAgIE1TVFA0MjMsIE1TVFA0MTUsIE1TVFA0MTMsIE1TVFA0MTEsIE1TVFA0MTAsIE1TVFA0MDYsIE1TVFA0MDMsCkBAIC01MzQsNiArNTM1LDkgQEAKIAlbTVNUUDEwMV0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9NMV0sIFNNU1RQQ1IxLCAxLCAwKSwgLyogVlBVICovCiAJW01TVFAxMDBdID0gTVNUUCgmZGl2NF9jbGtzW0RJVjRfQl0sIFNNU1RQQ1IxLCAwLCAwKSwgLyogTENEQzAgKi8KIAlbTVNUUDIyM10gPSBNU1RQKCZkaXY2X2Nsa3NbRElWNl9TUFVdLCBTTVNUUENSMiwgMjMsIDApLCAvKiBTUFUyICovCisJW01TVFAyMThdID0gTVNUUCgmZGl2NF9jbGtzW0RJVjRfSFBdLCBTTVNUUENSMiwgMTgsIDApLCAvKiBETUFDMSAqLworCVtNU1RQMjE3XSA9IE1TVFAoJmRpdjRfY2xrc1tESVY0X0hQXSwgU01TVFBDUjIsIDE3LCAwKSwgLyogRE1BQzIgKi8KKwlbTVNUUDIxNl0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9IUF0sIFNNU1RQQ1IyLCAxNiwgMCksIC8qIERNQUMzICovCiAJW01TVFAyMDddID0gTVNUUCgmZGl2Nl9jbGtzW0RJVjZfU1VCXSwgU01TVFBDUjIsIDcsIDApLCAvKiBTQ0lGQTUgKi8KIAlbTVNUUDIwNl0gPSBNU1RQKCZkaXY2X2Nsa3NbRElWNl9TVUJdLCBTTVNUUENSMiwgNiwgMCksIC8qIFNDSUZCICovCiAJW01TVFAyMDRdID0gTVNUUCgmZGl2Nl9jbGtzW0RJVjZfU1VCXSwgU01TVFBDUjIsIDQsIDApLCAvKiBTQ0lGQTAgKi8KQEAgLTYyNiw2ICs2MzAsOSBAQAogCUNMS0RFVl9ERVZfSUQoInNoX21vYmlsZV9sY2RjX2ZiLjAiLCAmbXN0cF9jbGtzW01TVFAxMDBdKSwgLyogTENEQzAgKi8KIAlDTEtERVZfREVWX0lEKCJ1aW9fcGRydl9nZW5pcnEuNiIsICZtc3RwX2Nsa3NbTVNUUDIyM10pLCAvKiBTUFUyRFNQMCAqLwogCUNMS0RFVl9ERVZfSUQoInVpb19wZHJ2X2dlbmlycS43IiwgJm1zdHBfY2xrc1tNU1RQMjIzXSksIC8qIFNQVTJEU1AxICovCisJQ0xLREVWX0RFVl9JRCgic2gtZG1hLWVuZ2luZS4wIiwgJm1zdHBfY2xrc1tNU1RQMjE4XSksIC8qIERNQUMxICovCisJQ0xLREVWX0RFVl9JRCgic2gtZG1hLWVuZ2luZS4xIiwgJm1zdHBfY2xrc1tNU1RQMjE3XSksIC8qIERNQUMyICovCisJQ0xLREVWX0RFVl9JRCgic2gtZG1hLWVuZ2luZS4yIiwgJm1zdHBfY2xrc1tNU1RQMjE2XSksIC8qIERNQUMzICovCiAJQ0xLREVWX0RFVl9JRCgic2gtc2NpLjUiLCAmbXN0cF9jbGtzW01TVFAyMDddKSwgLyogU0NJRkE1ICovCiAJQ0xLREVWX0RFVl9JRCgic2gtc2NpLjYiLCAmbXN0cF9jbGtzW01TVFAyMDZdKSwgLyogU0NJRkIgKi8KIAlDTEtERVZfREVWX0lEKCJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDIwNF0pLCAvKiBTQ0lGQTAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYwppbmRleCA1ZDBlMTUwLi5hOTExYTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jCkBAIC0yNTAsNiArMjUwLDExIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaW50IHNoNzNhMF9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKK3sKKwlyZXR1cm4gMDsgLyogYWx3YXlzIGFsbG93IHdha2V1cCAqLworfQorCiB2b2lkIF9faW5pdCBzaDczYTBfaW5pdF9pcnEodm9pZCkKIHsKIAl2b2lkIF9faW9tZW0gKmdpY19kaXN0X2Jhc2UgPSBfX2lvKDB4ZjAwMDEwMDApOwpAQCAtMjU3LDYgKzI2Miw3IEBACiAJdm9pZCBfX2lvbWVtICppbnRldnRzYSA9IGlvcmVtYXBfbm9jYWNoZSgweGZmZDIwMTAwLCBQQUdFX1NJWkUpOwogCiAJZ2ljX2luaXQoMCwgMjksIGdpY19kaXN0X2Jhc2UsIGdpY19jcHVfYmFzZSk7CisJZ2ljX2FyY2hfZXh0bi5pcnFfc2V0X3dha2UgPSBzaDczYTBfc2V0X3dha2U7CiAKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNzX2Rlc2MpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM2Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYwppbmRleCAyYzEwMTkwLi5lNTQ2MDE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM2Ny5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzY3LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzAwKSwgZXZ0MmlycSgweGMwMCksCiAJCQkgICAgZXZ0MmlycSgweGMwMCksIGV2dDJpcnEoMHhjMDApIH0sCiB9OwpAQCAtNTcsNyArNTcsNyBAQAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKLQkudHlwZQkJPSBQT1JUX1NDSUYsCisJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhjMjApLCBldnQyaXJxKDB4YzIwKSwKIAkJCSAgICBldnQyaXJxKDB4YzIwKSwgZXZ0MmlycSgweGMyMCkgfSwKIH07CkBAIC03Niw3ICs3Niw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGM0MCksIGV2dDJpcnEoMHhjNDApLAogCQkJICAgIGV2dDJpcnEoMHhjNDApLCBldnQyaXJxKDB4YzQwKSB9LAogfTsKQEAgLTk1LDcgKzk1LDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzYwKSwgZXZ0MmlycSgweGM2MCksCiAJCQkgICAgZXZ0MmlycSgweGM2MCksIGV2dDJpcnEoMHhjNjApIH0sCiB9OwpAQCAtMTE0LDcgKzExNCw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGQyMCksIGV2dDJpcnEoMHhkMjApLAogCQkJICAgIGV2dDJpcnEoMHhkMjApLCBldnQyaXJxKDB4ZDIwKSB9LAogfTsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKLQkudHlwZQkJPSBQT1JUX1NDSUYsCisJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhkNDApLCBldnQyaXJxKDB4ZDQwKSwKIAkJCSAgICBldnQyaXJxKDB4ZDQwKSwgZXZ0MmlycSgweGQ0MCkgfSwKIH07CkBAIC0xNTIsNyArMTUyLDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkIsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4ZDYwKSwgZXZ0MmlycSgweGQ2MCksCiAJCQkgICAgZXZ0MmlycSgweGQ2MCksIGV2dDJpcnEoMHhkNjApIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBvd2VyLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYwppbmRleCBjODQ0NDJjLi41YWQ4YjJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYwpAQCAtMjQsNiArMjQsOCBAQAogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKKyNpbmNsdWRlICJib2FyZC1oYXJtb255LmgiCisKICNkZWZpbmUgUE1DX0NUUkwJCTB4MAogI2RlZmluZSBQTUNfQ1RSTF9JTlRSX0xPVwkoMSA8PCAxNykKIApAQCAtOTgsNyArMTAwLDcgQEAKIAkuaXJxX2Jhc2UJPSBURUdSQV9OUl9JUlFTLAogCS5udW1fc3ViZGV2cwk9IEFSUkFZX1NJWkUodHBzX2RldnMpLAogCS5zdWJkZXZzCT0gdHBzX2RldnMsCi0JLmdwaW9fYmFzZQk9IFRFR1JBX05SX0dQSU9TLAorCS5ncGlvX2Jhc2UJPSBIQVJNT05ZX0dQSU9fVFBTNjU4NlgoMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaGFybW9ueV9yZWd1bGF0b3JzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oCmluZGV4IDFlNTdiMDcuLmQ4NTE0MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIF9NQUNIX1RFR1JBX0JPQVJEX0hBUk1PTllfSAogI2RlZmluZSBfTUFDSF9URUdSQV9CT0FSRF9IQVJNT05ZX0gKIAotI2RlZmluZSBIQVJNT05ZX0dQSU9fV004OTAzKF94XykJKFRFR1JBX05SX0dQSU9TICsgKF94XykpCisjZGVmaW5lIEhBUk1PTllfR1BJT19UUFM2NTg2WChfeF8pCShURUdSQV9OUl9HUElPUyArIChfeF8pKQorI2RlZmluZSBIQVJNT05ZX0dQSU9fV004OTAzKF94XykJKEhBUk1PTllfR1BJT19UUFM2NTg2WCg0KSArIChfeF8pKQogCiAjZGVmaW5lIFRFR1JBX0dQSU9fU0QyX0NECQlURUdSQV9HUElPX1BJNQogI2RlZmluZSBURUdSQV9HUElPX1NEMl9XUAkJVEVHUkFfR1BJT19QSDEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL2Nsb2NrLmgKaW5kZXggYzM0ZjNlYS4uNGY1MGNhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2Nsb2NrLmgKQEAgLTMxLDcgKzMxLDcgQEAKIAlib29sIHJlc2V0OwogCV9fdTE2IGNsa192YWw7CiAJX19zOCB1c2Vjb3VudDsKLQlfX3UzMiByZXNfcmVnOworCXZvaWQgX19pb21lbSAqIHJlc19yZWc7CiAJX191MTYgcmVzX21hc2s7CiAKIAlib29sIGh3X2N0cmxkOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC91MzAwLXJlZ3MuaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvdTMwMC1yZWdzLmgKaW5kZXggOGI4NWRmNC4uMDM1ZmRjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC91MzAwLXJlZ3MuaAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3UzMDAtcmVncy5oCkBAIC0xOCw2ICsxOCwxMiBAQAogICogdGhlIGRlZmluZXMgYXJlIHVzZWQgZm9yIHNldHRpbmcgdXAgdGhlIEkvTyBtZW1vcnkgbWFwcGluZy4KICAqLwogCisjaWZkZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBJT01FTShhKSAoYSkKKyNlbHNlCisjZGVmaW5lIElPTUVNKGEpICh2b2lkIF9faW9tZW0gKikgYQorI2VuZGlmCisKIC8qIE5BTkQgRmxhc2ggQ1MwICovCiAjZGVmaW5lIFUzMDBfTkFORF9DUzBfUEhZU19CQVNFCQkweDgwMDAwMDAwCiAKQEAgLTQ4LDEzICs1NCw2IEBACiAjZW5kaWYKIAogLyoKLSAqIEFsbCB0aGUgZm9sbG93aW5nIHBlcmlwaGVyYWxzIGFyZSBzcGVjaWZpZWQgYXQgdGhlaXIgUEhZU0lDQUwgYWRkcmVzcywKLSAqIHNvIGlmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGVtIChpbiB0aGUga2VybmVsKSwgeW91IE1VU1QgdXNlIHRoZSBtYWNyb3MKLSAqIGRlZmluZWQgaW4gPGFzbS9pby5oPiB0byBtYXAgdG8gdGhlIElPX0FERFJFU1NfQUhCKCkgSU9fQUREUkVTU19GQVNUKCkKLSAqIGV0Yy4KLSAqLwotCi0vKgogICogQUhCIHBlcmlwaGVyYWxzCiAgKi8KIApAQCAtNjMsMTEgKzYyLDExIEBACiAKIC8qIFZlY3RvcmVkIEludGVycnVwdCBDb250cm9sbGVyIDAsIHNlcnZpY2luZyAzMiBpbnRlcnJ1cHRzICovCiAjZGVmaW5lIFUzMDBfSU5UQ09OMF9CQVNFCQkoVTMwMF9BSEJfUEVSX1BIWVNfQkFTRSsweDEwMDApCi0jZGVmaW5lIFUzMDBfSU5UQ09OMF9WQkFTRQkJKFUzMDBfQUhCX1BFUl9WSVJUX0JBU0UrMHgxMDAwKQorI2RlZmluZSBVMzAwX0lOVENPTjBfVkJBU0UJCUlPTUVNKFUzMDBfQUhCX1BFUl9WSVJUX0JBU0UrMHgxMDAwKQogCiAvKiBWZWN0b3JlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAxLCBzZXJ2aWNpbmcgMzIgaW50ZXJydXB0cyAqLwogI2RlZmluZSBVMzAwX0lOVENPTjFfQkFTRQkJKFUzMDBfQUhCX1BFUl9QSFlTX0JBU0UrMHgyMDAwKQotI2RlZmluZSBVMzAwX0lOVENPTjFfVkJBU0UJCShVMzAwX0FIQl9QRVJfVklSVF9CQVNFKzB4MjAwMCkKKyNkZWZpbmUgVTMwMF9JTlRDT04xX1ZCQVNFCQlJT01FTShVMzAwX0FIQl9QRVJfVklSVF9CQVNFKzB4MjAwMCkKIAogLyogTWVtb3J5IFN0aWNrIFBybyAoTVNQUk8pIGNvbnRyb2xsZXIgKi8KICNkZWZpbmUgVTMwMF9NU1BST19CQVNFCQkJKFUzMDBfQUhCX1BFUl9QSFlTX0JBU0UrMHgzMDAwKQpAQCAtMTE1LDcgKzExNCw3IEBACiAKIC8qIFNZU0NPTiAqLwogI2RlZmluZSBVMzAwX1NZU0NPTl9CQVNFCQkoVTMwMF9TTE9XX1BFUl9QSFlTX0JBU0UrMHgxMDAwKQotI2RlZmluZSBVMzAwX1NZU0NPTl9WQkFTRQkJKFUzMDBfU0xPV19QRVJfVklSVF9CQVNFKzB4MTAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fVkJBU0UJCUlPTUVNKFUzMDBfU0xPV19QRVJfVklSVF9CQVNFKzB4MTAwMCkKIAogLyogV2F0Y2hkb2cgKi8KICNkZWZpbmUgVTMwMF9XRE9HX0JBU0UJCQkoVTMwMF9TTE9XX1BFUl9QSFlTX0JBU0UrMHgyMDAwKQpAQCAtMTI1LDcgKzEyNCw3IEBACiAKIC8qIEFQUCBzaWRlIHNwZWNpYWwgdGltZXIgKi8KICNkZWZpbmUgVTMwMF9USU1FUl9BUFBfQkFTRQkJKFUzMDBfU0xPV19QRVJfUEhZU19CQVNFKzB4NDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfVkJBU0UJCShVMzAwX1NMT1dfUEVSX1ZJUlRfQkFTRSsweDQwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1ZCQVNFCQlJT01FTShVMzAwX1NMT1dfUEVSX1ZJUlRfQkFTRSsweDQwMDApCiAKIC8qIEtleXBhZCAqLwogI2RlZmluZSBVMzAwX0tFWVBBRF9CQVNFCQkoVTMwMF9TTE9XX1BFUl9QSFlTX0JBU0UrMHg1MDAwKQpAQCAtMTgxLDUgKzE4MCw0IEBACiAgKiBWaXJ0dWFsIGFjY2Vzc29yIG1hY3JvcyBmb3Igc3RhdGljIGRldmljZXMKICAqLwogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYwppbmRleCA4OTFjZjQ0Li4xOGQ3ZmEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYwpAQCAtNDExLDggKzQxMSw3IEBACiAJLyogVXNlIGdlbmVyYWwgcHVycG9zZSB0aW1lciAyIGFzIGNsb2NrIHNvdXJjZSAqLwogCWlmIChjbG9ja3NvdXJjZV9tbWlvX2luaXQoVTMwMF9USU1FUl9BUFBfVkJBU0UgKyBVMzAwX1RJTUVSX0FQUF9HUFQyQ0MsCiAJCQkiR1BUMiIsIHJhdGUsIDMwMCwgMzIsIGNsb2Nrc291cmNlX21taW9fcmVhZGxfdXApKQotCQlwcmludGsoS0VSTl9FUlIgInRpbWVyOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjbG9jayAiCi0JCSAgICAgICAic291cmNlICVzXG4iLCBjbG9ja3NvdXJjZV91MzAwXzFtaHoubmFtZSk7CisJCXByX2VycigidGltZXI6IGZhaWxlZCB0byBpbml0aWFsaXplIFUzMDAgY2xvY2sgc291cmNlXG4iKTsKIAogCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdCgmY2xvY2tldmVudF91MzAwXzFtaHosCiAJCQkJICAgIHJhdGUsIEFQUFRJTUVSX01JTl9SQU5HRSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1waW5zLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1waW5zLmMKaW5kZXggZmQ0Y2YxYy4uNzBjZGJkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYwpAQCAtMTEwLDEwICsxMTAsMTggQEAKIAlHUElPMTY4X0tQX08wLAogCiAJLyogVUFSVCAqLwotCUdQSU8wX1UwX0NUU24JfCBQSU5fSU5QVVRfUFVMTFVQLAotCUdQSU8xX1UwX1JUU24JfCBQSU5fT1VUUFVUX0hJR0gsCi0JR1BJTzJfVTBfUlhECXwgUElOX0lOUFVUX1BVTExVUCwKLQlHUElPM19VMF9UWEQJfCBQSU5fT1VUUFVUX0hJR0gsCisJLyogdWFydC0wIHBpbnMgZ3BpbyBjb25maWd1cmF0aW9uIHNob3VsZCBiZQorCSAqIGtlcHQgaW50YWN0IHRvIHByZXZlbnQgZ2xpdGNoIGluIHR4IGxpbmUKKwkgKiB3aGVuIHR0eSBkZXYgaXMgb3BlbmVkLiBMYXRlciB0aGVzZSBwaW5zCisJICogYXJlIGNvbmZpZ3VyZWQgdG8gdWFydCBtb3A1MDBfcGluc191YXJ0MAorCSAqCisJICogSXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHVhcnQgY29uZmlndXJhdGlvbgorCSAqIG9uY2UgdGhlIGlzc3VlIGlzIHNvbHZlZC4KKwkgKi8KKwlHUElPMF9HUElPCXwgUElOX0lOUFVUX1BVTExVUCwKKwlHUElPMV9HUElPCXwgUElOX09VVFBVVF9ISUdILAorCUdQSU8yX0dQSU8JfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8zX0dQSU8JfCBQSU5fT1VUUFVUX0hJR0gsCiAKIAlHUElPMjlfVTJfUlhECXwgUElOX0lOUFVUX1BVTExVUCwKIAlHUElPMzBfVTJfVFhECXwgUElOX09VVFBVVF9ISUdILApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKaW5kZXggYmIyNmY0MC4uMmEwOGMwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCkBAIC0yNywxOCArMjcsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9sZWRzLWxwNTUyMS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCiAjaW5jbHVkZSA8cGxhdC9pMmMuaD4KICNpbmNsdWRlIDxwbGF0L3N0ZV9kbWE0MC5oPgorI2luY2x1ZGUgPHBsYXQvcGluY2ZnLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCisjaW5jbHVkZSAicGlucy1kYjg1MDAuaCIKICNpbmNsdWRlICJzdGUtZG1hNDAtZGI4NTAwLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy1kYjg1MDAuaCIKICNpbmNsdWRlICJib2FyZC1tb3A1MDAuaCIKQEAgLTM5MywxMiArMzk2LDYzIEBACiB9OwogI2VuZGlmCiAKKworc3RhdGljIHBpbl9jZmdfdCBtb3A1MDBfcGluc191YXJ0MFtdID0geworCUdQSU8wX1UwX0NUU24gICB8IFBJTl9JTlBVVF9QVUxMVVAsCisJR1BJTzFfVTBfUlRTbiAgIHwgUElOX09VVFBVVF9ISUdILAorCUdQSU8yX1UwX1JYRCAgICB8IFBJTl9JTlBVVF9QVUxMVVAsCisJR1BJTzNfVTBfVFhEICAgIHwgUElOX09VVFBVVF9ISUdILAorfTsKKworI2RlZmluZSBQUkNDX0tfU09GVFJTVF9TRVQgICAgICAweDE4CisjZGVmaW5lIFBSQ0NfS19TT0ZUUlNUX0NMRUFSICAgIDB4MUMKK3N0YXRpYyB2b2lkIHV4NTAwX3VhcnQwX3Jlc2V0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpwcmNjX3JzdF9zZXQsICpwcmNjX3JzdF9jbHI7CisKKwlwcmNjX3JzdF9zZXQgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhVODUwMF9DTEtSU1QxX0JBU0UgKworCQkJUFJDQ19LX1NPRlRSU1RfU0VUKTsKKwlwcmNjX3JzdF9jbHIgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhVODUwMF9DTEtSU1QxX0JBU0UgKworCQkJUFJDQ19LX1NPRlRSU1RfQ0xFQVIpOworCisJLyogQWN0aXZhdGUgc29mdCByZXNldCBQUkNDX0tfU09GVFJTVF9DTEVBUiAqLworCXdyaXRlbCgocmVhZGwocHJjY19yc3RfY2xyKSB8IDB4MSksIHByY2NfcnN0X2Nscik7CisJdWRlbGF5KDEpOworCisJLyogUmVsZWFzZSBzb2Z0IHJlc2V0IFBSQ0NfS19TT0ZUUlNUX1NFVCAqLworCXdyaXRlbCgocmVhZGwocHJjY19yc3Rfc2V0KSB8IDB4MSksIHByY2NfcnN0X3NldCk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZCB1eDUwMF91YXJ0MF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IG5ta19jb25maWdfcGlucyhtb3A1MDBfcGluc191YXJ0MCwKKwkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfdWFydDApKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJwbDAxMTogdWFydCBwaW5zX2VuYWJsZSBmYWlsZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB1eDUwMF91YXJ0MF9leGl0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IG5ta19jb25maWdfcGluc19zbGVlcChtb3A1MDBfcGluc191YXJ0MCwKKwkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfdWFydDApKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJwbDAxMTogdWFydCBwaW5zX2Rpc2FibGUgZmFpbGVkXG4iKTsKK30KKwogc3RhdGljIHN0cnVjdCBhbWJhX3BsMDExX2RhdGEgdWFydDBfcGxhdCA9IHsKICNpZmRlZiBDT05GSUdfU1RFX0RNQTQwCiAJLmRtYV9maWx0ZXIgPSBzdGVkbWE0MF9maWx0ZXIsCiAJLmRtYV9yeF9wYXJhbSA9ICZ1YXJ0MF9kbWFfY2ZnX3J4LAogCS5kbWFfdHhfcGFyYW0gPSAmdWFydDBfZG1hX2NmZ190eCwKICNlbmRpZgorCS5pbml0ID0gdXg1MDBfdWFydDBfaW5pdCwKKwkuZXhpdCA9IHV4NTAwX3VhcnQwX2V4aXQsCisJLnJlc2V0ID0gdXg1MDBfdWFydDBfcmVzZXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFtYmFfcGwwMTFfZGF0YSB1YXJ0MV9wbGF0ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwppbmRleCBjM2M0MTc2Li40NTk4YjA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwpAQCAtMTU5LDYgKzE1OSw5IEBACiAJCS8qIE5vIGN1c3RvbSBkYXRhIHlldCAqLwogCX07CiAKKwlpZiAoY3B1X2lzX3U4NTAwdjIoKSkKKwkJcGRhdGEuc3VwcG9ydHNfc2xlZXBtb2RlID0gdHJ1ZTsKKwogCWRieDUwMF9hZGRfZ3Bpb3MoQVJSQVlfQU5EX1NJWkUoZGI4NTAwX2dwaW9fYmFzZSksCiAJCQkgSVJRX0RCODUwMF9HUElPMCwgJnBkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jCmluZGV4IDI4NWVkY2QuLjllNmI5M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYwpAQCAtNDYsMTIgKzQ2LDYgQEAKIAl9LAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IHYybV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0JY3RfZGVzYy0+aW5pdF9lYXJseSgpOwotCXZlcnNhdGlsZV9zY2hlZF9jbG9ja19pbml0KE1NSU9fUDJWKFYyTV9TWVNfMjRNSFopLCAyNDAwMDAwMCk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCB2Mm1fdGltZXJfaW5pdCh2b2lkKQogewogCXUzMiBzY2N0cmw7CkBAIC0zNjUsNiArMzU5LDEzIEBACiAJfSwKIH07CiAKK3N0YXRpYyB2b2lkIF9faW5pdCB2Mm1faW5pdF9lYXJseSh2b2lkKQoreworCWN0X2Rlc2MtPmluaXRfZWFybHkoKTsKKwljbGtkZXZfYWRkX3RhYmxlKHYybV9sb29rdXBzLCBBUlJBWV9TSVpFKHYybV9sb29rdXBzKSk7CisJdmVyc2F0aWxlX3NjaGVkX2Nsb2NrX2luaXQoTU1JT19QMlYoVjJNX1NZU18yNE1IWiksIDI0MDAwMDAwKTsKK30KKwogc3RhdGljIHZvaWQgdjJtX3Bvd2VyX29mZih2b2lkKQogewogCWlmICh2Mm1fY2ZnX3dyaXRlKFNZU19DRkdfU0hVVERPV04gfCBTWVNfQ0ZHX1NJVEVfTUIsIDApKQpAQCAtNDE4LDggKzQxOSw2IEBACiB7CiAJaW50IGk7CiAKLQljbGtkZXZfYWRkX3RhYmxlKHYybV9sb29rdXBzLCBBUlJBWV9TSVpFKHYybV9sb29rdXBzKSk7Ci0KIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnYybV9wY2llX2kyY19kZXZpY2UpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdjJtX2RkY19pMmNfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnYybV9mbGFzaF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pcnEuYwppbmRleCAyNDUxNDBjLi42NDJkZTA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pcnEuYwpAQCAtMzksOSArMzksMTAgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmljX3JlZ2Jhc2U7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpzaWNfcmVnYmFzZTsKIAotc3RhdGljIHZvaWQgdnQ4NTAwX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB2dDg1MDBfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGljX3JlZ2Jhc2U7CisJdW5zaWduZWQgaXJxID0gZC0+aXJxOwogCXU4IGVkZ2U7CiAKIAlpZiAoaXJxID49IDY0KSB7CkBAIC02NCw5ICs2NSwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgdnQ4NTAwX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHZ0ODUwMF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBpY19yZWdiYXNlOworCXVuc2lnbmVkIGlycSA9IGQtPmlycTsKIAl1OCBkY3RyOwogCiAJaWYgKGlycSA+PSA2NCkgewpAQCAtNzgsMTAgKzgwLDExIEBACiAJd3JpdGViKGRjdHIsIGJhc2UgKyBWVDg1MDBfSUNfRENUUiArIGlycSk7CiB9CiAKLXN0YXRpYyBpbnQgdnQ4NTAwX2lycV9zZXRfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQorc3RhdGljIGludCB2dDg1MDBfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBpY19yZWdiYXNlOwotCXVuc2lnbmVkIGludCBvcmlnX2lycSA9IGlycTsKKwl1bnNpZ25lZCBpcnEgPSBkLT5pcnE7CisJdW5zaWduZWQgb3JpZ19pcnEgPSBpcnE7CiAJdTggZGN0cjsKIAogCWlmIChpcnEgPj0gNjQpIHsKQEAgLTExNCwxMSArMTE3LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdnQ4NTAwX2lycV9jaGlwID0gewotCS5uYW1lICAgICAgPSAidnQ4NTAwIiwKLQkuYWNrICAgICAgID0gdnQ4NTAwX2lycV9tYXNrLAotCS5tYXNrICAgICAgPSB2dDg1MDBfaXJxX21hc2ssCi0JLnVubWFzayAgICA9IHZ0ODUwMF9pcnFfdW5tYXNrLAotCS5zZXRfdHlwZSAgPSB2dDg1MDBfaXJxX3NldF90eXBlLAorCS5uYW1lID0gInZ0ODUwMCIsCisJLmlycV9hY2sgPSB2dDg1MDBfaXJxX21hc2ssCisJLmlycV9tYXNrID0gdnQ4NTAwX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrID0gdnQ4NTAwX2lycV91bm1hc2ssCisJLmlycV9zZXRfdHlwZSA9IHZ0ODUwMF9pcnFfc2V0X3R5cGUsCiB9OwogCiB2b2lkIF9faW5pdCB2dDg1MDBfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYwppbmRleCBlZjU5MDk5Li40NGMwODY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCkBAIC0xMjAsMTcgKzEyMCwyMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwyeDBfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBfX2wyeDBfZmx1c2hfYWxsKHZvaWQpCit7CisJZGVidWdfd3JpdGVsKDB4MDMpOworCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGwyeDBfYmFzZSArIEwyWDBfQ0xFQU5fSU5WX1dBWSk7CisJY2FjaGVfd2FpdF93YXkobDJ4MF9iYXNlICsgTDJYMF9DTEVBTl9JTlZfV0FZLCBsMngwX3dheV9tYXNrKTsKKwljYWNoZV9zeW5jKCk7CisJZGVidWdfd3JpdGVsKDB4MDApOworfQorCiBzdGF0aWMgdm9pZCBsMngwX2ZsdXNoX2FsbCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBjbGVhbiBhbGwgd2F5cyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZsMngwX2xvY2ssIGZsYWdzKTsKLQlkZWJ1Z193cml0ZWwoMHgwMyk7Ci0Jd3JpdGVsX3JlbGF4ZWQobDJ4MF93YXlfbWFzaywgbDJ4MF9iYXNlICsgTDJYMF9DTEVBTl9JTlZfV0FZKTsKLQljYWNoZV93YWl0X3dheShsMngwX2Jhc2UgKyBMMlgwX0NMRUFOX0lOVl9XQVksIGwyeDBfd2F5X21hc2spOwotCWNhY2hlX3N5bmMoKTsKLQlkZWJ1Z193cml0ZWwoMHgwMCk7CisJX19sMngwX2ZsdXNoX2FsbCgpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwyeDBfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNjYsNyArMjcxLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmwyeDBfbG9jaywgZmxhZ3MpOwotCXdyaXRlbCgwLCBsMngwX2Jhc2UgKyBMMlgwX0NUUkwpOworCV9fbDJ4MF9mbHVzaF9hbGwoKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBsMngwX2Jhc2UgKyBMMlgwX0NUUkwpOworCWRzYigpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwyeDBfbG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb250ZXh0LmMgYi9hcmNoL2FybS9tbS9jb250ZXh0LmMKaW5kZXggOGJmYWU5Ni4uYjBlZTliYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29udGV4dC5jCisrKyBiL2FyY2gvYXJtL21tL2NvbnRleHQuYwpAQCAtMjQsNyArMjQsOSBAQAogCiAvKgogICogV2UgZm9yaygpZWQgYSBwcm9jZXNzLCBhbmQgd2UgbmVlZCBhIG5ldyBjb250ZXh0IGZvciB0aGUgY2hpbGQKLSAqIHRvIHJ1biBpbi4KKyAqIHRvIHJ1biBpbi4gIFdlIHJlc2VydmUgdmVyc2lvbiAwIGZvciBpbml0aWFsIHRhc2tzIHNvIHdlIHdpbGwKKyAqIGFsd2F5cyBhbGxvY2F0ZSBhbiBBU0lELiBUaGUgQVNJRCAwIGlzIHJlc2VydmVkIGZvciB0aGUgVFRCUgorICogcmVnaXN0ZXIgY2hhbmdpbmcgc2VxdWVuY2UuCiAgKi8KIHZvaWQgX19pbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKQEAgLTM0LDExICszNiw4IEBACiAKIHN0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZCkKIHsKLQl1MzIgdHRiOwotCS8qIENvcHkgVFRCUjEgaW50byBUVEJSMCAqLwotCWFzbSB2b2xhdGlsZSgibXJjCXAxNSwgMCwgJTAsIGMyLCBjMCwgMVxuIgotCQkgICAgICJtY3IJcDE1LCAwLCAlMCwgYzIsIGMwLCAwIgotCQkgICAgIDogIj1yIiAodHRiKSk7CisJLyogc2V0IHRoZSByZXNlcnZlZCBBU0lEIGJlZm9yZSBmbHVzaGluZyB0aGUgVExCICovCisJYXNtKCJtY3IJcDE1LCAwLCAlMCwgYzEzLCBjMCwgMVxuIiA6IDogInIiICgwKSk7CiAJaXNiKCk7CiAJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCWlmIChpY2FjaGVfaXNfdml2dF9hc2lkX3RhZ2dlZCgpKSB7CkBAIC05NCw3ICs5Myw3IEBACiAJCXJldHVybjsKIAogCXNtcF9ybWIoKTsKLQlhc2lkID0gY3B1X2xhc3RfYXNpZCArIGNwdTsKKwlhc2lkID0gY3B1X2xhc3RfYXNpZCArIGNwdSArIDE7CiAKIAlmbHVzaF9jb250ZXh0KCk7CiAJc2V0X21tX2NvbnRleHQobW0sIGFzaWQpOwpAQCAtMTQ0LDEzICsxNDMsMTMgQEAKIAkgKiB0byBzdGFydCBhIG5ldyB2ZXJzaW9uIGFuZCBmbHVzaCB0aGUgVExCLgogCSAqLwogCWlmICh1bmxpa2VseSgoYXNpZCAmIH5BU0lEX01BU0spID09IDApKSB7Ci0JCWFzaWQgPSBjcHVfbGFzdF9hc2lkICsgc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlhc2lkID0gY3B1X2xhc3RfYXNpZCArIHNtcF9wcm9jZXNzb3JfaWQoKSArIDE7CiAJCWZsdXNoX2NvbnRleHQoKTsKICNpZmRlZiBDT05GSUdfU01QCiAJCXNtcF93bWIoKTsKIAkJc21wX2NhbGxfZnVuY3Rpb24ocmVzZXRfY29udGV4dCwgTlVMTCwgMSk7CiAjZW5kaWYKLQkJY3B1X2xhc3RfYXNpZCArPSBOUl9DUFVTIC0gMTsKKwkJY3B1X2xhc3RfYXNpZCArPSBOUl9DUFVTOwogCX0KIAogCXNldF9tbV9jb250ZXh0KG1tLCBhc2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCAyYzJjY2U5Li5jMTk1NzFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0zMzEsNiArMzMxLDEyIEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAocGh5c19pbml0cmRfc2l6ZSAmJgorCSAgICAhbWVtYmxvY2tfaXNfcmVnaW9uX21lbW9yeShwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSkpIHsKKwkJcHJfZXJyKCJJTklUUkQ6IDB4JTA4bHgrMHglMDhseCBpcyBub3QgYSBtZW1vcnkgcmVnaW9uIC0gZGlzYWJsaW5nIGluaXRyZFxuIiwKKwkJICAgICAgIHBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKTsKKwkJcGh5c19pbml0cmRfc3RhcnQgPSBwaHlzX2luaXRyZF9zaXplID0gMDsKKwl9CisJaWYgKHBoeXNfaW5pdHJkX3NpemUgJiYKIAkgICAgbWVtYmxvY2tfaXNfcmVnaW9uX3Jlc2VydmVkKHBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKSkgewogCQlwcl9lcnIoIklOSVRSRDogMHglMDhseCsweCUwOGx4IG92ZXJsYXBzIGluLXVzZSBtZW1vcnkgcmVnaW9uIC0gZGlzYWJsaW5nIGluaXRyZFxuIiwKIAkJICAgICAgIHBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKTsKQEAgLTYzNSw3ICs2NDEsOCBAQAogCQkJIiAgICBtb2R1bGVzIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBNQilcbiIKIAkJCSIgICAgICAuaW5pdCA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBrQilcbiIKIAkJCSIgICAgICAudGV4dCA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBrQilcbiIKLQkJCSIgICAgICAuZGF0YSA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBrQilcbiIsCisJCQkiICAgICAgLmRhdGEgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iCisJCQkiICAgICAgIC5ic3MgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iLAogCiAJCQlNTEsoVUwoQ09ORklHX1ZFQ1RPUlNfQkFTRSksIFVMKENPTkZJR19WRUNUT1JTX0JBU0UpICsKIAkJCQkoUEFHRV9TSVpFKSksCkBAIC02NTcsNyArNjY0LDggQEAKIAogCQkJTUxLX1JPVU5EVVAoX19pbml0X2JlZ2luLCBfX2luaXRfZW5kKSwKIAkJCU1MS19ST1VORFVQKF90ZXh0LCBfZXRleHQpLAotCQkJTUxLX1JPVU5EVVAoX3NkYXRhLCBfZWRhdGEpKTsKKwkJCU1MS19ST1VORFVQKF9zZGF0YSwgX2VkYXRhKSwKKwkJCU1MS19ST1VORFVQKF9fYnNzX3N0YXJ0LCBfX2Jzc19zdG9wKSk7CiAKICN1bmRlZiBNTEsKICN1bmRlZiBNTE0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tdS5jIGIvYXJjaC9hcm0vbW0vbW11LmMKaW5kZXggOWQ5ZTczNi4uNTk0ZDY3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW11LmMKKysrIGIvYXJjaC9hcm0vbW0vbW11LmMKQEAgLTc1OSw3ICs3NTksNyBAQAogCiBzdGF0aWMgcGh5c19hZGRyX3QgbG93bWVtX2xpbWl0IF9faW5pdGRhdGEgPSAwOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FuaXR5X2NoZWNrX21lbWluZm8odm9pZCkKK3ZvaWQgX19pbml0IHNhbml0eV9jaGVja19tZW1pbmZvKHZvaWQpCiB7CiAJaW50IGksIGosIGhpZ2htZW0gPSAwOwogCkBAIC0xMDMyLDggKzEwMzIsOSBAQAogewogCXZvaWQgKnplcm9fcGFnZTsKIAorCW1lbWJsb2NrX3NldF9jdXJyZW50X2xpbWl0KGxvd21lbV9saW1pdCk7CisKIAlidWlsZF9tZW1fdHlwZV90YWJsZSgpOwotCXNhbml0eV9jaGVja19tZW1pbmZvKCk7CiAJcHJlcGFyZV9wYWdlX3RhYmxlKCk7CiAJbWFwX2xvd21lbSgpOwogCWRldmljZW1hcHNfaW5pdChtZGVzYyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9ub21tdS5jIGIvYXJjaC9hcm0vbW0vbm9tbXUuYwppbmRleCA2ODdkMDIzLi45NDFhOThjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9ub21tdS5jCisrKyBiL2FyY2gvYXJtL21tL25vbW11LmMKQEAgLTI3LDYgKzI3LDEwIEBACiAJbWVtYmxvY2tfcmVzZXJ2ZShDT05GSUdfVkVDVE9SU19CQVNFLCBQQUdFX1NJWkUpOwogfQogCit2b2lkIF9faW5pdCBzYW5pdHlfY2hlY2tfbWVtaW5mbyh2b2lkKQoreworfQorCiAvKgogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcywgaW5pdGlhbGlzZXMgdGhlIHpvbmUgbWVtb3J5CiAgKiBtYXBzLCBhbmQgc2V0cyB1cCB0aGUgemVybyBwYWdlLCBiYWQgcGFnZSBhbmQgYmFkIHBhZ2UgdGFibGVzLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCmluZGV4IGU0YzE2NWMuLjUzN2ZmY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQkubG9uZwkwCiAJCS5sb25nCTAKIAkJLmxvbmcJdjRfY2FjaGVfZm5zCi0JCS5zaXplCV9fYXJtN3RkbWlfcHJvY19pbmZvLCAuIC0gX19hcm03ZG1pX3Byb2NfaW5mbworCQkuc2l6ZQlfX2FybTd0ZG1pX3Byb2NfaW5mbywgLiAtIF9fYXJtN3RkbWlfcHJvY19pbmZvCiAKIAkJLnR5cGUJX190cmlzY2VuZGE3X3Byb2NfaW5mbywgI29iamVjdAogX190cmlzY2VuZGE3X3Byb2NfaW5mbzoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUwppbmRleCA3YjdlYmQ0Li41NDZiNTRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJLmxvbmcJMAogCQkubG9uZwkwCiAJCS5sb25nCXY0X2NhY2hlX2ZucwotCQkuc2l6ZQlfX2FybTl0ZG1pX3Byb2NfaW5mbywgLiAtIF9fYXJtOWRtaV9wcm9jX2luZm8KKwkJLnNpemUJX19hcm05dGRtaV9wcm9jX2luZm8sIC4gLSBfX2FybTl0ZG1pX3Byb2NfaW5mbwogCiAJCS50eXBlCV9fcDIwMDFfcHJvY19pbmZvLCAjb2JqZWN0CiBfX3AyMDAxX3Byb2NfaW5mbzoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCBiM2I1NjZlLi4wODljMGI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0xMDgsMTYgKzEwOCwxOCBAQAogI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzQzMDk3MwogCW1jcglwMTUsIDAsIHIyLCBjNywgYzUsIDYJCUAgZmx1c2ggQlRBQy9CVEIKICNlbmRpZgotCW1yYwlwMTUsIDAsIHIyLCBjMiwgYzAsIDEJCUAgbG9hZCBUVEIgMQotCW1jcglwMTUsIDAsIHIyLCBjMiwgYzAsIDAJCUAgaW50byBUVEIgMAorI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzc1NDMyMgorCWRzYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjIsIGMxMywgYzAsIDEJCUAgc2V0IHJlc2VydmVkIGNvbnRleHQgSUQKKwlpc2IKKzE6CW1jcglwMTUsIDAsIHIwLCBjMiwgYzAsIDAJCUAgc2V0IFRUQiAwCiAJaXNiCiAjaWZkZWYgQ09ORklHX0FSTV9FUlJBVEFfNzU0MzIyCiAJZHNiCiAjZW5kaWYKIAltY3IJcDE1LCAwLCByMSwgYzEzLCBjMCwgMQkJQCBzZXQgY29udGV4dCBJRAogCWlzYgotCW1jcglwMTUsIDAsIHIwLCBjMiwgYzAsIDAJCUAgc2V0IFRUQiAwCi0JaXNiCiAjZW5kaWYKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGNwdV92N19zd2l0Y2hfbW0pCkBAIC0yMDgsMTkgKzIxMCwyMSBAQAogCiAvKiBTdXNwZW5kL3Jlc3VtZSBzdXBwb3J0OiBkZXJpdmVkIGZyb20gYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMgKi8KIC5nbG9ibAljcHVfdjdfc3VzcGVuZF9zaXplCi0uZXF1CWNwdV92N19zdXNwZW5kX3NpemUsIDQgKiA4CisuZXF1CWNwdV92N19zdXNwZW5kX3NpemUsIDQgKiA5CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBFTlRSWShjcHVfdjdfZG9fc3VzcGVuZCkKIAlzdG1mZAlzcCEsIHtyNCAtIHIxMSwgbHJ9CiAJbXJjCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBGQ1NFL1BJRAogCW1yYwlwMTUsIDAsIHI1LCBjMTMsIGMwLCAxCUAgQ29udGV4dCBJRAorCW1yYwlwMTUsIDAsIHI2LCBjMTMsIGMwLCAzCUAgVXNlciByL28gdGhyZWFkIElECisJc3RtaWEJcjAhLCB7cjQgLSByNn0KIAltcmMJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECiAJbXJjCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRUQiAwCiAJbXJjCXAxNSwgMCwgcjgsIGMyLCBjMCwgMQlAIFRUQiAxCiAJbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMAlAIENvbnRyb2wgcmVnaXN0ZXIKIAltcmMJcDE1LCAwLCByMTAsIGMxLCBjMCwgMQlAIEF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyCiAJbXJjCXAxNSwgMCwgcjExLCBjMSwgYzAsIDIJQCBDby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKLQlzdG1pYQlyMCwge3I0IC0gcjExfQorCXN0bWlhCXIwLCB7cjYgLSByMTF9CiAJbGRtZmQJc3AhLCB7cjQgLSByMTEsIHBjfQogRU5EUFJPQyhjcHVfdjdfZG9fc3VzcGVuZCkKIApAQCAtMjI4LDkgKzIzMiwxMSBAQAogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCUAgaW52YWxpZGF0ZSBUTEJzCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAlAIGludmFsaWRhdGUgSSBjYWNoZQotCWxkbWlhCXIwLCB7cjQgLSByMTF9CisJbGRtaWEJcjAhLCB7cjQgLSByNn0KIAltY3IJcDE1LCAwLCByNCwgYzEzLCBjMCwgMAlAIEZDU0UvUElECiAJbWNyCXAxNSwgMCwgcjUsIGMxMywgYzAsIDEJQCBDb250ZXh0IElECisJbWNyCXAxNSwgMCwgcjYsIGMxMywgYzAsIDMJQCBVc2VyIHIvbyB0aHJlYWQgSUQKKwlsZG1pYQlyMCwge3I2IC0gcjExfQogCW1jcglwMTUsIDAsIHI2LCBjMywgYzAsIDAJQCBEb21haW4gSUQKIAltY3IJcDE1LCAwLCByNywgYzIsIGMwLCAwCUAgVFRCIDAKIAltY3IJcDE1LCAwLCByOCwgYzIsIGMwLCAxCUAgVFRCIDEKQEAgLTQxNiw5ICs0MjIsOSBAQAogCS53b3JkCWNwdV92N19kY2FjaGVfY2xlYW5fYXJlYQogCS53b3JkCWNwdV92N19zd2l0Y2hfbW0KIAkud29yZAljcHVfdjdfc2V0X3B0ZV9leHQKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKKwkud29yZAljcHVfdjdfc3VzcGVuZF9zaXplCisJLndvcmQJY3B1X3Y3X2RvX3N1c3BlbmQKKwkud29yZAljcHVfdjdfZG9fcmVzdW1lCiAJLnNpemUJdjdfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIHY3X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMgYi9hcmNoL2FybS9wbGF0LWlvcC9jcDYuYwppbmRleCA5NjEyYTg3Li5iYWI3M2UyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWlvcC9jcDYuYworKysgYi9hcmNoL2FybS9wbGF0LWlvcC9jcDYuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogc3RhdGljIGludCBjcDZfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1kbWEuYwppbmRleCAzNTM4Yjg1ZS4uYjEzMGY2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDUxCi1zdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGFkZHJfaW14NTFfdG8xID0geworc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBhZGRyX2lteDUxID0gewogCS5hcF8yX2FwX2FkZHIgPSA2NDIsCiAJLnVhcnRfMl9tY3VfYWRkciA9IDgxNywKIAkubWN1XzJfYXBwX2FkZHIgPSA3NDcsCkBAIC0xOTYsNyArMTk2LDkgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NPQ19JTVg1MSkKIAlpZiAoY3B1X2lzX214NTEoKSkgewotCQlpbXg1MV9pbXhfc2RtYV9kYXRhLnBkYXRhLnNjcmlwdF9hZGRycyA9ICZhZGRyX2lteDUxX3RvMTsKKwkJaW50IHRvX3ZlcnNpb24gPSBteDUxX3JldmlzaW9uKCkgPj4gNDsKKwkJaW14NTFfaW14X3NkbWFfZGF0YS5wZGF0YS50b192ZXJzaW9uID0gdG9fdmVyc2lvbjsKKwkJaW14NTFfaW14X3NkbWFfZGF0YS5wZGF0YS5zY3JpcHRfYWRkcnMgPSAmYWRkcl9pbXg1MTsKIAkJcmV0ID0gaW14X2FkZF9pbXhfc2RtYSgmaW14NTFfaW14X3NkbWFfZGF0YSk7CiAJfSBlbHNlCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggZWExOWE1Yi4uZDVkN2U2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKQEAgLTkwLDYgKzkwLDcgQEAKIAlpbnQgbnVtX2dwaW87CiAJdTMyICgqZ2V0X3NlY29uZGFyeV9zdGF0dXMpKHVuc2lnbmVkIGludCBiYW5rKTsKIAl2b2lkICgqc2V0X2lvZm9yY2UpKGJvb2wgZW5hYmxlKTsKKwlib29sIHN1cHBvcnRzX3NsZWVwbW9kZTsKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9QTEFUX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9mbGFzaC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9mbGFzaC5oCmluZGV4IDMwODMxOTUuLjBkODg0OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZmxhc2guaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2ZsYXNoLmgKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KIAorc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIGV4dGVybiB2b2lkIG9tYXAxX3NldF92cHAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGVuYWJsZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oCmluZGV4IDMyYTJmNmMuLmU5OTJiOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvdm1tLmgKQEAgLTI5LDkgKzI5LDYgQEAKICAqIGxvd2VyIDE2IGJpdCBpcyB1c2VkIGZvciBoL3cgYW5kIHVwcGVyIDE2IGJpdCBpcyBmb3Igcy93LgogICovCiAjZGVmaW5lIElPVk1GX1NXX1NISUZUCQkxNgotI2RlZmluZSBJT1ZNRl9IV19TSVpFCQkoMSA8PCBJT1ZNRl9TV19TSElGVCkKLSNkZWZpbmUgSU9WTUZfSFdfTUFTSwkJKElPVk1GX0hXX1NJWkUgLSAxKQotI2RlZmluZSBJT1ZNRl9TV19NQVNLCQkofklPVk1GX0hXX01BU0spVUwKIAogLyoKICAqIGlvdm1hOiBoL3cgZmxhZ3MgZGVyaXZlZCBmcm9tIGNhbSBhbmQgcmFtIGF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmgKaW5kZXggZjM4ZmVmOS4uYzdiODc0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21tYy5oCkBAIC0xMDEsNiArMTAxLDkgQEAKIAkJLyogSWYgdXNpbmcgcG93ZXJfc2F2aW5nIGFuZCB0aGUgTU1DIHBvd2VyIGlzIG5vdCB0byBnbyBvZmYgKi8KIAkJdW5zaWduZWQgbm9fb2ZmOjE7CiAKKwkJLyogZU1NQyBkb2VzIG5vdCBoYW5kbGUgcG93ZXIgb2ZmIHdoZW4gbm90IGluIHNsZWVwIHN0YXRlICovCisJCXVuc2lnbmVkIG5vX3JlZ3VsYXRvcl9vZmZfaW5pdDoxOworCiAJCS8qIFJlZ3VsYXRvciBvZmYgcmVtYXBwZWQgdG8gc2xlZXAgKi8KIAkJdW5zaWduZWQgdmNjX2F1eF9kaXNhYmxlX2lzX3NsZWVwOjE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMKaW5kZXggNTFlZjQzZS4uODNhMzdjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMKQEAgLTY0OCw3ICs2NDgsNiBAQAogCQkJcmV0dXJuIFBUUl9FUlIodmEpOwogCX0KIAotCWZsYWdzICY9IElPVk1GX0hXX01BU0s7CiAJZmxhZ3MgfD0gSU9WTUZfRElTQ09OVDsKIAlmbGFncyB8PSBJT1ZNRl9NTUlPOwogCkBAIC03MDYsNyArNzA1LDYgQEAKIAlpZiAoIXZhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZsYWdzICY9IElPVk1GX0hXX01BU0s7CiAJZmxhZ3MgfD0gSU9WTUZfRElTQ09OVDsKIAlmbGFncyB8PSBJT1ZNRl9BTExPQzsKIApAQCAtNzk1LDcgKzc5Myw2IEBACiAJaWYgKCF2YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmbGFncyAmPSBJT1ZNRl9IV19NQVNLOwogCWZsYWdzIHw9IElPVk1GX0xJTkVBUjsKIAlmbGFncyB8PSBJT1ZNRl9NTUlPOwogCkBAIC04NTMsNyArODUwLDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJcGEgPSB2aXJ0X3RvX3BoeXModmEpOwogCi0JZmxhZ3MgJj0gSU9WTUZfSFdfTUFTSzsKIAlmbGFncyB8PSBJT1ZNRl9MSU5FQVI7CiAJZmxhZ3MgfD0gSU9WTUZfQUxMT0M7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMKaW5kZXggYTM3YjhlYi4uNDlmYzBkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMKQEAgLTg0LDYgKzg0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KICNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KQEAgLTUzOSwyMCArNTQwLDM0IEBACiBzdGF0aWMgaW50IF9vZF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIG9tYXBfZGV2aWNlX2lkbGUocGRldik7CisJcmV0ID0gcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoZGV2KTsKKworCWlmICghcmV0KQorCQlvbWFwX2RldmljZV9pZGxlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfb2RfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcG1fZ2VuZXJpY19ydW50aW1lX2lkbGUoZGV2KTsKIH0KIAogc3RhdGljIGludCBfb2RfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBvbWFwX2RldmljZV9lbmFibGUocGRldik7CisJb21hcF9kZXZpY2VfZW5hYmxlKHBkZXYpOworCisJcmV0dXJuIHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUoZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIG9tYXBfZGV2aWNlX3Bvd2VyX2RvbWFpbiA9IHsKIAkub3BzID0gewogCQkucnVudGltZV9zdXNwZW5kID0gX29kX3J1bnRpbWVfc3VzcGVuZCwKKwkJLnJ1bnRpbWVfaWRsZSA9IF9vZF9ydW50aW1lX2lkbGUsCiAJCS5ydW50aW1lX3Jlc3VtZSA9IF9vZF9ydW50aW1lX3Jlc3VtZSwKIAkJVVNFX1BMQVRGT1JNX1BNX1NMRUVQX09QUwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCmluZGV4IGEzZjUwYjMuLjZhZjNkMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCWVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMSgpKQogCQkJb21hcF9zcmFtX3NpemUgPSBTWl8yNTZLOwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGRldGVjdCBTUkFNIHNpemVcbiIpOworCQkJcHJfZXJyKCJDb3VsZCBub3QgZGV0ZWN0IFNSQU0gc2l6ZVxuIik7CiAJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4NDAwMDsKIAkJfQogCX0KQEAgLTIyMSwxMCArMjIxLDEwIEBACiAJb21hcF9zcmFtX2lvX2Rlc2NbMF0ubGVuZ3RoID0gUk9VTkRfRE9XTihvbWFwX3NyYW1fc2l6ZSwgUEFHRV9TSVpFKTsKIAlpb3RhYmxlX2luaXQob21hcF9zcmFtX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcF9zcmFtX2lvX2Rlc2MpKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlNSQU06IE1hcHBlZCBwYSAweCUwOGx4IHRvIHZhIDB4JTA4bHggc2l6ZTogMHglbHhcbiIsCi0JX19wZm5fdG9fcGh5cyhvbWFwX3NyYW1faW9fZGVzY1swXS5wZm4pLAotCW9tYXBfc3JhbV9pb19kZXNjWzBdLnZpcnR1YWwsCi0JICAgICAgIG9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCk7CisJcHJfaW5mbygiU1JBTTogTWFwcGVkIHBhIDB4JTA4bGx4IHRvIHZhIDB4JTA4bHggc2l6ZTogMHglbHhcbiIsCisJCShsb25nIGxvbmcpIF9fcGZuX3RvX3BoeXMob21hcF9zcmFtX2lvX2Rlc2NbMF0ucGZuKSwKKwkJb21hcF9zcmFtX2lvX2Rlc2NbMF0udmlydHVhbCwKKwkJb21hcF9zcmFtX2lvX2Rlc2NbMF0ubGVuZ3RoKTsKIAogCS8qCiAJICogTm9ybWFsbHkgZGV2aWNlbWFwc19pbml0KCkgd291bGQgZmx1c2ggY2FjaGVzIGFuZCB0bGIgYWZ0ZXIKQEAgLTI1Miw3ICsyNTIsNyBAQAogdm9pZCAqb21hcF9zcmFtX3B1c2hfYWRkcmVzcyh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaWYgKHNpemUgPiAob21hcF9zcmFtX2NlaWwgLSAob21hcF9zcmFtX2Jhc2UgKyBTUkFNX0JPT1RMT0FERVJfU1opKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk5vdCBlbm91Z2ggc3BhY2UgaW4gU1JBTVxuIik7CisJCXByX2VycigiTm90IGVub3VnaCBzcGFjZSBpbiBTUkFNXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9yaW9uL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jCmluZGV4IDViNGZmZmEuLjQxYWI5N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jCkBAIC00MzIsNyArNDMyLDcgQEAKIAljdC0+cmVncy5tYXNrID0gb2NoaXAtPm1hc2tfb2Zmc2V0ICsgR1BJT19FREdFX01BU0tfT0ZGOwogCWN0LT5yZWdzLmFjayA9IEdQSU9fRURHRV9DQVVTRV9PRkY7CiAJY3QtPnR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKLQljdC0+Y2hpcC5pcnFfYWNrID0gaXJxX2djX2FjazsKKwljdC0+Y2hpcC5pcnFfYWNrID0gaXJxX2djX2Fja19jbHJfYml0OwogCWN0LT5jaGlwLmlycV9tYXNrID0gaXJxX2djX21hc2tfY2xyX2JpdDsKIAljdC0+Y2hpcC5pcnFfdW5tYXNrID0gaXJxX2djX21hc2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfc2V0X3R5cGUgPSBncGlvX2lycV9zZXRfdHlwZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYwppbmRleCA0OGViYjk0Li5hMTFkYzM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jCkBAIC01MCw3ICs1MCw3IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihjLCBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCwgY2hpcCktPnJlZ2Jhc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHB4YV9ncGlvX2NoaXAgKmdwaW9fdG9fY2hpcCh1bnNpZ25lZCBncGlvKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqZ3Bpb190b19weGFjaGlwKHVuc2lnbmVkIGdwaW8pCiB7CiAJcmV0dXJuICZweGFfZ3Bpb19jaGlwc1tncGlvX3RvX2JhbmsoZ3BpbyldOwogfQpAQCAtMTYxLDcgKzE2MSw3IEBACiAJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwogCXVuc2lnbmVkIGxvbmcgZ3BkciwgbWFzayA9IEdQSU9fYml0KGdwaW8pOwogCi0JYyA9IGdwaW9fdG9fY2hpcChncGlvKTsKKwljID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwogCiAJaWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKIAkJLyogRG9uJ3QgbWVzcyB3aXRoIGVuYWJsZWQgR1BJT3MgdXNpbmcgcHJlY29uZmlndXJlZCBlZGdlcyBvcgpAQCAtMjMwLDcgKzIzMCw3IEBACiBzdGF0aWMgdm9pZCBweGFfYWNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQogewogCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fY2hpcChncGlvKTsKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKIAogCV9fcmF3X3dyaXRlbChHUElPX2JpdChncGlvKSwgYy0+cmVnYmFzZSArIEdFRFJfT0ZGU0VUKTsKIH0KQEAgLTIzOCw3ICsyMzgsNyBAQAogc3RhdGljIHZvaWQgcHhhX21hc2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19jaGlwKGdwaW8pOworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwogCXVpbnQzMl90IGdyZXIsIGdmZXI7CiAKIAljLT5pcnFfbWFzayAmPSB+R1BJT19iaXQoZ3Bpbyk7CkBAIC0yNTIsNyArMjUyLDcgQEAKIHN0YXRpYyB2b2lkIHB4YV91bm1hc2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19jaGlwKGdwaW8pOworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwogCiAJYy0+aXJxX21hc2sgfD0gR1BJT19iaXQoZ3Bpbyk7CiAJdXBkYXRlX2VkZ2VfZGV0ZWN0KGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCmluZGV4IGMxMGQxMGMuLjUzOWJkMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKQEAgLTcxMiw3ICs3MTIsNyBAQAogICogZ2V0IGNvbnRyb2wgb2YgYW4gZG1hIGNoYW5uZWwKICovCiAKLWludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KHVuc2lnbmVkIGludCBjaGFubmVsLAoraW50IHMzYzI0MTBfZG1hX3JlcXVlc3QoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCXN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCwKIAkJCXZvaWQgKmRldikKIHsKQEAgLTc4Myw3ICs3ODMsNyBAQAogICogYWxsb3dlZCB0byBnbyB0aHJvdWdoLgogKi8KIAotaW50IHMzYzI0MTBfZG1hX2ZyZWUodW5zaWduZWQgaW50IGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKK2ludCBzM2MyNDEwX2RtYV9mcmVlKGVudW0gZG1hX2NoIGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTk3NCw3ICs5NzQsNyBAQAogfQogCiBpbnQKLXMzYzI0MTBfZG1hX2N0cmwodW5zaWduZWQgaW50IGNoYW5uZWwsIGVudW0gczNjMjQxMF9jaGFuX29wIG9wKQorczNjMjQxMF9kbWFfY3RybChlbnVtIGRtYV9jaCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTEwMjEsMjMgKzEwMjEsMTkgQEAKICAqIHhmZXJzaXplOiAgICAgc2l6ZSBvZiB1bml0IGluIGJ5dGVzICgxLDIsNCkKICovCiAKLWludCBzM2MyNDEwX2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCitpbnQgczNjMjQxMF9kbWFfY29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCSAgICAgICBpbnQgeGZlcnVuaXQpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCXVuc2lnbmVkIGludCBkY29uOwogCi0JcHJfZGVidWcoIiVzOiBjaGFuPSVkLCB4ZmVyX3VuaXQ9JWQsIGRjb249JTA4eFxuIiwKLQkJIF9fZnVuY19fLCBjaGFubmVsLCB4ZmVydW5pdCwgZGNvbik7CisJcHJfZGVidWcoIiVzOiBjaGFuPSVkLCB4ZmVyX3VuaXQ9JWRcbiIsIF9fZnVuY19fLCBjaGFubmVsLCB4ZmVydW5pdCk7CiAKIAlpZiAoY2hhbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByX2RlYnVnKCIlczogSW5pdGlhbCBkY29uIGlzICUwOHhcbiIsIF9fZnVuY19fLCBkY29uKTsKLQogCWRjb24gPSBjaGFuLT5kY29uICYgZG1hX3NlbC5kY29uX21hc2s7Ci0KLQlwcl9kZWJ1ZygiJXM6IE5ldyBkY29uIGlzICUwOHhcbiIsIF9fZnVuY19fLCBkY29uKTsKKwlwcl9kZWJ1ZygiJXM6IGRjb24gaXMgJTA4eFxuIiwgX19mdW5jX18sIGRjb24pOwogCiAJc3dpdGNoIChjaGFuLT5yZXFfY2gpIHsKIAljYXNlIERNQUNIX0kyU19JTjoKQEAgLTExMDQsNyArMTEwMCw3IEBACiAgKiBkZXZhZGRyOiAgIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZQogKi8KIAotaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCSAgZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZGV2YWRkcikKIHsKQEAgLTExNzcsNyArMTE3Myw3IEBACiAgKiByZXR1cm5zIHRoZSBjdXJyZW50IHRyYW5zZmVyIHBvaW50cyBmb3IgdGhlIGRtYSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24odW5zaWduZWQgaW50IGNoYW5uZWwsIGRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQoraW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKGVudW0gZG1hX2NoIGNoYW5uZWwsIGRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtMTE5OSw3ICsxMTk1LDcgQEAKIAogI2lmZGVmIENPTkZJR19QTQogCi1zdGF0aWMgdm9pZCBzM2MyNDEwX2RtYV9zdXNwZW5kX2NoYW4oczNjMjQxMF9kbWFfY2hhbiAqY3ApCitzdGF0aWMgdm9pZCBzM2MyNDEwX2RtYV9zdXNwZW5kX2NoYW4oc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNwKQogewogCXByaW50ayhLRVJOX0RFQlVHICJzdXNwZW5kaW5nIGRtYSBjaGFubmVsICVkXG4iLCBjcC0+bnVtYmVyKTsKIApAQCAtMTIzNSw3ICsxMjMxLDcgQEAKIAkvKiByZXN0b3JlIGNoYW5uZWwncyBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCiAKIAlpZiAoIWNwLT5pbl91c2UpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlwcmludGsoS0VSTl9JTkZPICJkbWElZDogcmVzdG9yaW5nIGNvbmZpZ3VyYXRpb25cbiIsIGNwLT5udW1iZXIpOwogCkBAIC0xMjQ2LDggKzEyNDIsNiBAQAogCiAJaWYgKGNwLT5tYXAgIT0gTlVMTCkKIAkJZG1hX3NlbC5zZWxlY3QoY3AsIGNwLT5tYXApOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHMzYzI0MTBfZG1hX3Jlc3VtZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jCmluZGV4IDlhZWU3ZTEuLmZjOGM1ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgpAQCAtNjY4LDMgKzY2OSw4IEBACiAKIAlpcnFkYmYoInMzYzI0MTA6IHJlZ2lzdGVyZWQgaW50ZXJydXB0IGhhbmRsZXJzXG4iKTsKIH0KKworc3RydWN0IHN5c2NvcmVfb3BzIHMzYzI0eHhfaXJxX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kCT0gczNjMjR4eF9pcnFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0eHhfaXJxX3Jlc3VtZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYwppbmRleCA2ZGI5MjYyLi4yMDMzNmM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1vbmVuYW5kLmMKQEAgLTE1LDggKzE1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvb25lbmFuZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KQEAgLTQ1LDEzICs0MywzIEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9vbmVuYW5kX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gczVwX29uZW5hbmRfcmVzb3VyY2VzLAogfTsKLQotdm9pZCBzNXBfb25lbmFuZF9zZXRfcGxhdGRhdGEoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0Jc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGQ7Ci0KLQlwZCA9IGttZW1kdXAocGRhdGEsIHNpemVvZihzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JczVwX2RldmljZV9vbmVuYW5kLmRldi5wbGF0Zm9ybV9kYXRhID0gcGQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaAppbmRleCBhNmMzZDMyLi5kOTczZDM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9tYXAtczVwLmgKQEAgLTM5LDcgKzM5LDcgQEAKICNkZWZpbmUgUzVQX1ZBX1RXRAkJUzVQX1ZBX0NPUkVQRVJJKDB4NjAwKQogI2RlZmluZSBTNVBfVkFfR0lDX0RJU1QJCVM1UF9WQV9DT1JFUEVSSSgweDEwMDApCiAKLSNkZWZpbmUgUzVQX1ZBX1VTQl9IU1BIWQlTM0NfQUREUigweDAyOTAwMDAwKQorI2RlZmluZSBTM0NfVkFfVVNCX0hTUEhZCVMzQ19BRERSKDB4MDI5MDAwMDApCiAKICNkZWZpbmUgVkFfVklDKHgpCQkoUzNDX1ZBX0lSUSArICgoeCkgKiAweDEwMDAwKSkKICNkZWZpbmUgVkFfVklDMAkJCVZBX1ZJQygwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMKaW5kZXggMTM1YWJkYS4uMzI3YWI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9pcnEtZ3Bpb2ludC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlpZiAoIWdjKQogCQlyZXR1cm4gLUVOT01FTTsKIAljdCA9IGdjLT5jaGlwX3R5cGVzOwotCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrOworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OwogCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OwogCWN0LT5jaGlwLmlycV9zZXRfdHlwZSA9IHM1cF9ncGlvaW50X3NldF90eXBlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvczVwLXRpbWUuYyBiL2FyY2gvYXJtL3BsYXQtczVwL3M1cC10aW1lLmMKaW5kZXggODk5YThjYy4uNjEyOTM0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvczVwLXRpbWUuYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9zNXAtdGltZS5jCkBAIC0zNzAsMTEgKzM3MCwxMSBAQAogCiAJY2xvY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZSh0aW5fc291cmNlKTsKIAotCWluaXRfc2NoZWRfY2xvY2soJmNkLCBzNXBfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgY2xvY2tfcmF0ZSk7Ci0KIAlzNXBfdGltZV9zZXR1cCh0aW1lcl9zb3VyY2Uuc291cmNlX2lkLCBUQ05UX01BWCk7CiAJczVwX3RpbWVfc3RhcnQodGltZXJfc291cmNlLnNvdXJjZV9pZCwgUEVSSU9ESUMpOwogCisJaW5pdF9zY2hlZF9jbG9jaygmY2QsIHM1cF91cGRhdGVfc2NoZWRfY2xvY2ssIDMyLCBjbG9ja19yYXRlKTsKKwogCWlmIChjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmdGltZV9jbG9ja3NvdXJjZSwgY2xvY2tfcmF0ZSkpCiAJCXBhbmljKCIlczogY2FuJ3QgcmVnaXN0ZXIgY2xvY2tzb3VyY2VcbiIsIHRpbWVfY2xvY2tzb3VyY2UubmFtZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtb25lbmFuZC5jCmluZGV4IDQ1ZWM3MzIuLmY1NGFlNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtb25lbmFuZC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtb25lbmFuZC5jCkBAIC0xMyw4ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CkBAIC00MywxMyArNDEsMyBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2Nfb25lbmFuZF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IHMzY19vbmVuYW5kX3Jlc291cmNlcywKIH07Ci0KLXZvaWQgczNjX29uZW5hbmRfc2V0X3BsYXRkYXRhKHN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQotewotCXN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEgKnBkOwotCi0JcGQgPSBrbWVtZHVwKHBkYXRhLCBzaXplb2Yoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCXMzY19kZXZpY2Vfb25lbmFuZC5kZXYucGxhdGZvcm1fZGF0YSA9IHBkOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS5jCmluZGV4IGNiNDU5ZGQuLjYxNDNhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZG1hLmMKQEAgLTQxLDcgKzQxLDcgQEAKICAqIGlycT8KICovCiAKLWludCBzM2MyNDEwX2RtYV9zZXRfb3Bmbih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgczNjMjQxMF9kbWFfb3Bmbl90IHJ0bikKK2ludCBzM2MyNDEwX2RtYV9zZXRfb3BmbihlbnVtIGRtYV9jaCBjaGFubmVsLCBzM2MyNDEwX2RtYV9vcGZuX3QgcnRuKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtNTYsNyArNTYsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9zZXRfb3Bmbik7CiAKLWludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4odW5zaWduZWQgaW50IGNoYW5uZWwsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pCitpbnQgczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKGVudW0gZG1hX2NoIGNoYW5uZWwsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCkBAIC03MSw3ICs3MSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbik7CiAKLWludCBzM2MyNDEwX2RtYV9zZXRmbGFncyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IGZsYWdzKQoraW50IHMzYzI0MTBfZG1hX3NldGZsYWdzKGVudW0gZG1hX2NoIGNoYW5uZWwsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmgKaW5kZXggYjYxYjhlZS4uZTNiMzFjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmgKQEAgLTEyLDYgKzEyLDEwIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLworCisjaWZuZGVmIF9fUExBVF9ERVZTX0gKKyNkZWZpbmUgX19QTEFUX0RFVlNfSCBfX0ZJTEVfXworCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKIHN0cnVjdCBzM2MyNHh4X3VhcnRfcmVzb3VyY2VzIHsKQEAgLTc1LDEwICs3OSw4IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BpMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQwX2RldmljZV9zcGkwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0MF9kZXZpY2Vfc3BpMTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NTBfZGV2aWNlX3NwaTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDUwX2RldmljZV9zcGkxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjR4MF9kZXZpY2Vfc3BpMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3NwaTE7CiAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb247CiAKQEAgLTE2MSwzICsxNjMsNSBAQAogICovCiBleHRlcm4gdm9pZCAqczNjX3NldF9wbGF0ZGF0YSh2b2lkICpwZCwgc2l6ZV90IHBkc2l6ZSwKIAkJCSAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisjZW5kaWYgLyogX19QTEFUX0RFVlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmgKaW5kZXggMmU4ZjhjNi4uOGMyNzNiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS5oCkBAIC00Miw2ICs0Miw3IEBACiB9OwogCiBzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbjsKK2VudW0gZG1hX2NoOwogCiAvKiBzM2MyNDEwX2RtYV9jYmZuX3QKICAqCkBAIC02Miw3ICs2Myw3IEBACiAgKiByZXF1ZXN0IGEgZG1hIGNoYW5uZWwgZXhjbHVzaXZsZXkKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfcmVxdWVzdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfcmVxdWVzdChlbnVtIGRtYV9jaCBjaGFubmVsLAogCQkJICAgICAgIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKiwgdm9pZCAqZGV2KTsKIAogCkBAIC03MSwxNCArNzIsMTQgQEAKICAqIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGRtYSBjaGFubmVsCiAqLwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX2N0cmwodW5zaWduZWQgaW50IGNoYW5uZWwsIGVudW0gczNjMjQxMF9jaGFuX29wIG9wKTsKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfY3RybChlbnVtIGRtYV9jaCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCk7CiAKIC8qIHMzYzI0MTBfZG1hX3NldGZsYWdzCiAgKgogICogc2V0IHRoZSBjaGFubmVsJ3MgZmxhZ3MgdG8gYSBnaXZlbiBzdGF0ZQogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRmbGFncyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3MoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOwogCiAvKiBzM2MyNDEwX2RtYV9mcmVlCkBAIC04Niw3ICs4Nyw3IEBACiAgKiBmcmVlIHRoZSBkbWEgY2hhbm5lbCAod2lsbCBhbHNvIGFib3J0IGFueSBvdXRzdGFuZGluZyBvcGVyYXRpb25zKQogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9mcmVlKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICopOworZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9mcmVlKGVudW0gZG1hX2NoIGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKik7CiAKIC8qIHMzYzI0MTBfZG1hX2VucXVldWUKICAqCkBAIC05NSw3ICs5Niw3IEBACiAgKiBkcmFpbmVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzIGdpdmVuIHRvIHRoZSBETUEgc3lzdGVtLgogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9lbnF1ZXVlKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICppZCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfZW5xdWV1ZShlbnVtIGRtYV9jaCBjaGFubmVsLCB2b2lkICppZCwKIAkJCSAgICAgICBkbWFfYWRkcl90IGRhdGEsIGludCBzaXplKTsKIAogLyogczNjMjQxMF9kbWFfY29uZmlnCkBAIC0xMDMsMTQgKzEwNCwxNCBAQAogICogY29uZmlndXJlIHRoZSBkbWEgY2hhbm5lbAogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIGludCB4ZmVydW5pdCk7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2NvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLCBpbnQgeGZlcnVuaXQpOwogCiAvKiBzM2MyNDEwX2RtYV9kZXZjb25maWcKICAqCiAgKiBjb25maWd1cmUgdGhlIGRldmljZSB3ZSdyZSB0YWxraW5nIHRvCiAqLwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfZGV2Y29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCWVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlLCB1bnNpZ25lZCBsb25nIGRldmFkZHIpOwogCiAvKiBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbgpAQCAtMTE4LDEwICsxMTksMTAgQEAKICAqIGdldCB0aGUgcG9zaXRpb24gdGhhdCB0aGUgZG1hIHRyYW5zZmVyIGlzIGN1cnJlbnRseSBhdAogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbih1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24oZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCQkgICBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRlc3QpOwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldF9vcGZuKHVuc2lnbmVkIGludCwgczNjMjQxMF9kbWFfb3Bmbl90IHJ0bik7Ci1leHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbih1bnNpZ25lZCBpbnQsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pOworZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfb3BmbihlbnVtIGRtYV9jaCwgczNjMjQxMF9kbWFfb3Bmbl90IHJ0bik7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihlbnVtIGRtYV9jaCwgczNjMjQxMF9kbWFfY2Jmbl90IHJ0bik7CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oCmluZGV4IGMxNTFjNWYuLjExNmVkZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKQEAgLTIyNCw2ICsyMjQsOCBAQAogI2RlZmluZSBTNVBWMjEwX1VGU1RBVF9SWE1BU0sJKDI1NTw8MCkKICNkZWZpbmUgUzVQVjIxMF9VRlNUQVRfUlhTSElGVAkoMCkKIAorI2RlZmluZSBOT19ORUVEX0NIRUNLX0NMS1NSQwkxCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0eHgtc3BpLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0eHgtc3BpLmgKaW5kZXggMGZmZTM0YS4uNGMxNmZhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NHh4LXNwaS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjR4eC1zcGkuaApAQCAtMzksNiArMzksNyBAQAogICogQGZpZm9fbHZsX21hc2s6IEFsbCB0eCBmaWZvX2x2bCBmaWVsZHMgc3RhcnQgYXQgb2Zmc2V0LTYKICAqIEByeF9sdmxfb2Zmc2V0OiBEZXBlbmRzIG9uIHR4IGZpZm9fbHZsIGZpZWxkIGFuZCBidXMgbnVtYmVyCiAgKiBAaGlnaF9zcGVlZDogSWYgdGhlIGNvbnRyb2xsZXIgc3VwcG9ydHMgSElHSF9TUEVFRF9FTiBiaXQKKyAqIEB0eF9zdF9kb25lOiBEZXBlbmRzIG9uIHR4IGZpZm9fbHZsIGZpZWxkCiAgKi8KIHN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvIHsKIAlpbnQgc3JjX2Nsa19ucjsKQEAgLTUzLDYgKzU0LDcgQEAKIAlpbnQgZmlmb19sdmxfbWFzazsKIAlpbnQgcnhfbHZsX29mZnNldDsKIAlpbnQgaGlnaF9zcGVlZDsKKwlpbnQgdHhfc3RfZG9uZTsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXVhcnQuYwppbmRleCAzMjU4MmMwLi42NTc0MDVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXVhcnQuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXVhcnQuYwpAQCAtNTQsOCArNTQsMTUgQEAKIAogCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgiczNjLXVhcnQiLCAxLCB1aXJxLT5iYXNlX2lycSwgcmVnX2Jhc2UsCiAJCQkJICAgIGhhbmRsZV9sZXZlbF9pcnEpOworCisJaWYgKCFnYykgeworCQlwcl9lcnIoIiVzOiBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwIGZvciBJUlEgJXUgZmFpbGVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHVpcnEtPmJhc2VfaXJxKTsKKwkJcmV0dXJuOworCX0KKwogCWN0ID0gZ2MtPmNoaXBfdHlwZXM7Ci0JY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2s7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPnJlZ3MuYWNrID0gUzNDNjRYWF9VSU5UUDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pcnEtdmljLXRpbWVyLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXZpYy10aW1lci5jCmluZGV4IGE2MDc1NDYuLmY3MTRkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pcnEtdmljLXRpbWVyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS12aWMtdGltZXIuYwpAQCAtNTQsNiArNTQsMTMgQEAKIAogCXMzY190Z2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJzM2MtdGltZXIiLCAxLCB0aW1lcl9pcnEsCiAJCQkJCSBTM0M2NFhYX1RJTlRfQ1NUQVQsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJaWYgKCFzM2NfdGdjKSB7CisJCXByX2VycigiJXM6IGlycV9hbGxvY19nZW5lcmljX2NoaXAgZm9yIElSUSAlZCBmYWlsZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgdGltZXJfaXJxKTsKKwkJcmV0dXJuOworCX0KKwogCWN0ID0gczNjX3RnYy0+Y2hpcF90eXBlczsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZwppbmRleCA2ZjljYTU2Li5hMDZiZmNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZwppbmRleCA3ZWVjZTBhLi5kOGYxZmU4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDFfZGVmY29uZmlnCmluZGV4IDM4N2ViOWQuLmQ0YzViMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDFfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9tcm10X2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9tcm10X2RlZmNvbmZpZwppbmRleCAxOWY2Y2VlLi43N2NhNGY5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfbXJtdF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX21ybXRfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldApAQCAtMTA5LDcgKzExMCw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSUz15CiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9TMzUzOTBBPW0KIENPTkZJR19SVENfRFJWX0FUMzJBUDcwMFg9bQogQ09ORklHX0RNQURFVklDRVM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZwppbmRleCBmMGZlMjM3Li42ZTBkY2E0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcKaW5kZXggZTRhN2MxZC4uN2YyYTM0NCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAwX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMV9kZWZjb25maWcKaW5kZXggNmYzN2Y3MC4uMDg1ZWViYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAxX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCmluZGV4IDRmYjAxZjUuLmQxYTg4N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKaW5kZXggOWZhYWY5Yi4uOTU2ZjI4MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA0X2RlZmNvbmZpZwppbmRleCAzZDJhNWQ4Li40MGM2OWYzIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA0X2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA0X2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCmluZGV4IDFlZDhmMjIuLjUxMWViOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9mYXZyLTMyX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9mYXZyLTMyX2RlZmNvbmZpZwppbmRleCBhZWFkYzk1Li4xOTk3M2IwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvZmF2ci0zMl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2ZhdnItMzJfZGVmY29uZmlnCkBAIC02LDYgKzYsNyBAQAogQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnCmluZGV4IDE2OTJiZWUuLjZmNDU2ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKQEAgLTcsNiArNyw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvbWVyaXNjX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9tZXJpc2NfZGVmY29uZmlnCmluZGV4IDhiNjcwYTYuLjNiZWZhYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9tZXJpc2NfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9tZXJpc2NfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9taW1jMjAwX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9taW1jMjAwX2RlZmNvbmZpZwppbmRleCA1YTUxZjJlLi4xYmVlNTFmIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvbWltYzIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL21pbWMyMDBfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNDlhODhmNS4uMTA4NTAyYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xMzEsNyArMTMxLDYgQEAKICAqLwogI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BjLCBuZXdfc3ApCSBcCiAJZG8gewkJCQkJIFwKLQkJc2V0X2ZzKFVTRVJfRFMpOwkJIFwKIAkJbWVtc2V0KHJlZ3MsIDAsIHNpemVvZigqcmVncykpOwkgXAogCQlyZWdzLT5zciA9IE1PREVfVVNFUjsJCSBcCiAJCXJlZ3MtPnBjID0gbmV3X3BjICYgfjE7CQkgXApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYwppbmRleCBhYTY3N2UyLi43ZmJmMGRjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYwpAQCAtMTA0Myw4ICsxMDQzLDkgQEAKIAkJZGF0YS0+cmVncyA9ICh2b2lkIF9faW9tZW0gKilwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKIAl9CiAKKwlwZGV2LT5pZCA9IGxpbmU7CiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlwZGF0YS0+bnVtID0gcG9ydG5yOworCXBkYXRhLT5udW0gPSBsaW5lOwogCWF0MzJfdXNhcnRzW2xpbmVdID0gcGRldjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9jcHUuaAppbmRleCA5Yzk2YTEzLi44MTgxMjkzIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9jcHUuaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9jcHUuaApAQCAtMzEsOCArMzEsMjAgQEAKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYzKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXJsKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QigpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QygpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTAoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzIwKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NSgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDVlcygpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTAoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ2KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4NSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTUoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzM1KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXgzNSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjUoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDI1KCkJKDApCiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0NQVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jCmluZGV4IDNlMzY0NjEuLmM5YWMyZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jCkBAIC0xNjcsMTQgKzE2NywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGludGNfcmVzdW1lKHZvaWQpCitzdGF0aWMgdm9pZCBpbnRjX3Jlc3VtZSh2b2lkKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCiAJCWludGNfd3JpdGVsKCZpbnRjMCwgSU5UUFIwICsgNCAqIGksIGludGMwLnNhdmVkX2lwcltpXSk7Ci0KLQlyZXR1cm4gMDsKIH0KICNlbHNlCiAjZGVmaW5lIGludGNfc3VzcGVuZAlOVUxMCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZwppbmRleCAzMWQ5NTQyLi45ZjFkMDg0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKQEAgLTExMiw3ICsxMTIsNyBAQAogQ09ORklHX1VTQl9HX1BSSU5URVI9bQogQ09ORklHX01NQz1tCiBDT05GSUdfU0RIX0JGSU49bQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX0JGSU49bQogQ09ORklHX0VYVDJfRlM9bQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9zdHJuY3B5LlMgYi9hcmNoL2JsYWNrZmluL2xpYi9zdHJuY3B5LlMKaW5kZXggZjM5MzFkNS4uMmMwN2RkZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvc3RybmNweS5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL3N0cm5jcHkuUwpAQCAtMjUsNyArMjUsNyBAQAogCiBFTlRSWShfc3RybmNweSkKIAlDQyA9IFIyID09IDA7Ci0JaWYgQ0MgSlVNUCA0ZjsKKwlpZiBDQyBKVU1QIDZmOwogCiAJUDIgPSBSMiA7ICAgICAgIC8qIHNpemUgKi8KIAlQMCA9IFIwIDsgICAgICAgLyogZHN0Ki8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCAxY2YwZjQ5Li43YzkyOGRhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0zMjAsMTEgKzMyMCwxMiBAQAogI2RlZmluZSBfX05SX2Nsb2NrX2FkanRpbWUJCTEzMjgKICNkZWZpbmUgX19OUl9zeW5jZnMJCQkxMzI5CiAjZGVmaW5lIF9fTlJfc2V0bnMJCQkxMzMwCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCQkxMzMxCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIAotI2RlZmluZSBOUl9zeXNjYWxscwkJCTMwNyAvKiBsZW5ndGggb2Ygc3lzY2FsbCB0YWJsZSAqLworI2RlZmluZSBOUl9zeXNjYWxscwkJCTMwOCAvKiBsZW5ndGggb2Ygc3lzY2FsbCB0YWJsZSAqLwogCiAvKgogICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0b3Agc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoIGZyb20gY29tcGxhaW5pbmcgYWJvdXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCA5Y2E4MDE5Li45N2RkMmFiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNzc2LDYgKzE3NzYsNyBAQAogCWRhdGE4IHN5c19jbG9ja19hZGp0aW1lCiAJZGF0YTggc3lzX3N5bmNmcwogCWRhdGE4IHN5c19zZXRucwkJCQkvLyAxMzMwCisJZGF0YTggc3lzX3NlbmRtbXNnCiAKIAkub3JnIHN5c19jYWxsX3RhYmxlICsgOCpOUl9zeXNjYWxscwkvLyBndWFyZCBhZ2FpbnN0IGZhaWx1cmVzIHRvIGluY3JlYXNlIE5SX3N5c2NhbGxzCiAjZW5kaWYgLyogX19JQTY0X0FTTV9QQVJBVklSVFVBTElaRURfTkFUSVZFICovCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vbW16b25lLmggYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggOWYzYjVhYy4uMTE1Y2VkMyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9tbXpvbmUuaApAQCAtMTQsMTIgKzE0LDYgQEAKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKIAogI2RlZmluZSBub2RlX2xvY2FsbnIocGZuLCBuaWQpCSgocGZuKSAtIE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXBnX2RhdGFfdCAqX19wZ2RhdCA9IE5PREVfREFUQShuaWQpOwkJCQlcCi0JX19wZ2RhdC0+bm9kZV9zdGFydF9wZm4gKyBfX3BnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXMgLSAxOwlcCi19KQogCiAjZGVmaW5lIHBtZF9wYWdlKHBtZCkJCShwZm5fdG9fcGFnZShwbWRfdmFsKHBtZCkgPj4gUEFHRV9TSElGVCkpCiAvKgpAQCAtNDQsNyArMzgsNyBAQAogCWludCBub2RlOwogCiAJZm9yIChub2RlID0gMCA7IG5vZGUgPCBNQVhfTlVNTk9ERVMgOyBub2RlKyspCi0JCWlmIChwZm4gPj0gbm9kZV9zdGFydF9wZm4obm9kZSkgJiYgcGZuIDw9IG5vZGVfZW5kX3Bmbihub2RlKSkKKwkJaWYgKHBmbiA+PSBub2RlX3N0YXJ0X3Bmbihub2RlKSAmJiBwZm4gPCBub2RlX2VuZF9wZm4obm9kZSkpCiAJCQlicmVhazsKIAogCXJldHVybiBub2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcubm9tbXUgYi9hcmNoL202OGsvS2NvbmZpZy5ub21tdQppbmRleCBmYzk4ZjliLi5iMDA0ZGMxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZy5ub21tdQorKysgYi9hcmNoL202OGsvS2NvbmZpZy5ub21tdQpAQCAtMTQsNiArMTQsMzMgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBNNjgwMDAKKwlib29sCisJaGVscAorCSAgVGhlIEZyZWVzY2FsZSAod2FzIE1vdG9yb2xhKSA2ODAwMCBDUFUgaXMgdGhlIGZpcnN0IGdlbmVyYXRpb24gb2YKKwkgIHRoZSB3ZWxsIGtub3duIE02OEsgZmFtaWx5IG9mIHByb2Nlc3NvcnMuIFRoZSBDUFUgY29yZSBhcyB3ZWxsIGFzCisJICBiZWluZyBhdmFpbGFibGUgYXMgYSBzdGFuZCBhbG9uZSBDUFUgd2FzIGFsc28gdXNlZCBpbiBtYW55CisJICBTeXN0ZW0tT24tQ2hpcCBkZXZpY2VzIChlZyA2ODMyOCwgNjgzMDIsIGV0YykuIEl0IGRvZXMgbm90IGNvbnRhaW4KKwkgIGEgcGFnaW5nIE1NVS4KKworY29uZmlnIE1DUFUzMgorCWJvb2wKKwloZWxwCisJICBUaGUgRnJlZXNjYWxlICh3YXMgdGhlbiBNb3Rvcm9sYSkgQ1BVMzIgaXMgYSBDUFUgY29yZSB0aGF0IGlzCisJICBiYXNlZCBvbiB0aGUgNjgwMjAgcHJvY2Vzc29yLiBGb3IgdGhlIG1vc3QgcGFydCBpdCBpcyB1c2VkIGluCisJICBTeXN0ZW0tT24tQ2hpcCBwYXJ0cywgYW5kIGRvZXMgbm90IGNvbnRhaW4gYSBwYWdpbmcgTU1VLgorCitjb25maWcgQ09MREZJUkUKKwlib29sCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCWhlbHAKKwkgIFRoZSBGcmVlc2NhbGUgQ29sZEZpcmUgZmFtaWx5IG9mIHByb2Nlc3NvcnMgaXMgYSBtb2Rlcm4gZGVyaXZpdGl2ZQorCSAgb2YgdGhlIDY4MDAwIHByb2Nlc3NvciBmYW1pbHkuIFRoZXkgYXJlIG1haW5seSB0YXJnZXRlZCBhdCBlbWJlZGRlZAorCSAgYXBwbGljYXRpb25zLCBhbmQgYXJlIGFsbCBTeXN0ZW0tT24tQ2hpcCAoU09DKSBkZXZpY2VzLCBhcyBvcHBvc2VkCisJICB0byBzdGFuZCBhbG9uZSBDUFVzLiBUaGV5IGltcGxlbWVudCBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgNjgwMDAKKwkgIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzZXQuCisKIGNvbmZpZyBDT0xERklSRV9TV19BNwogCWJvb2wKIAlkZWZhdWx0IG4KQEAgLTM2LDI2ICs2MywzMSBAQAogCiBjb25maWcgTTY4MzI4CiAJYm9vbCAiTUM2ODMyOCIKKwlzZWxlY3QgTTY4MDAwCiAJaGVscAogCSAgTW90b3JvbGEgNjgzMjggcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNjhFWjMyOAogCWJvb2wgIk1DNjhFWjMyOCIKKwlzZWxlY3QgTTY4MDAwCiAJaGVscAogCSAgTW90b3JvbGEgNjhFWDMyOCBwcm9jZXNzb3Igc3VwcG9ydC4KIAogY29uZmlnIE02OFZaMzI4CiAJYm9vbCAiTUM2OFZaMzI4IgorCXNlbGVjdCBNNjgwMDAKIAloZWxwCiAJICBNb3Rvcm9sYSA2OFZaMzI4IHByb2Nlc3NvciBzdXBwb3J0LgogCiBjb25maWcgTTY4MzYwCiAJYm9vbCAiTUM2ODM2MCIKKwlzZWxlY3QgTUNQVTMyCiAJaGVscAogCSAgTW90b3JvbGEgNjgzNjAgcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNTIwNgogCWJvb2wgIk1DRjUyMDYiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTYzLDYgKzk1LDcgQEAKIAogY29uZmlnIE01MjA2ZQogCWJvb2wgIk1DRjUyMDZlIgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC03MCw2ICsxMDMsNyBAQAogCiBjb25maWcgTTUyMHgKIAlib29sICJNQ0Y1MjB4IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAloZWxwCkBAIC03Nyw2ICsxMTEsNyBAQAogCiBjb25maWcgTTUyM3gKIAlib29sICJNQ0Y1MjN4IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKQEAgLTg1LDYgKzEyMCw3IEBACiAKIGNvbmZpZyBNNTI0OQogCWJvb2wgIk1DRjUyNDkiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTkyLDYgKzEyOCw3IEBACiAKIGNvbmZpZyBNNTI3MQogCWJvb2wgIk1DRjUyNzEiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKIAloZWxwCkBAIC05OSw2ICsxMzYsNyBAQAogCiBjb25maWcgTTUyNzIKIAlib29sICJNQ0Y1MjcyIgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC0xMDYsNiArMTQ0LDcgQEAKIAogY29uZmlnIE01Mjc1CiAJYm9vbCAiTUNGNTI3NSIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9TUExJVAogCXNlbGVjdCBIQVZFX0lQU0JBUgogCWhlbHAKQEAgLTExMyw2ICsxNTIsNyBAQAogCiBjb25maWcgTTUyOHgKIAlib29sICJNQ0Y1Mjh4IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKQEAgLTEyMSw2ICsxNjEsNyBAQAogCiBjb25maWcgTTUzMDcKIAlib29sICJNQ0Y1MzA3IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX0NBQ0hFX0NCCiAJc2VsZWN0IEhBVkVfTUJBUgpAQCAtMTI5LDEyICsxNzAsMTQgQEAKIAogY29uZmlnIE01MzJ4CiAJYm9vbCAiTUNGNTMyeCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCWhlbHAKIAkgIEZyZWVzY2FsZSAoTW90b3JvbGEpIENvbGRGaXJlIDUzMnggcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNTQwNwogCWJvb2wgIk1DRjU0MDciCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCkBAIC0xNDMsNiArMTg2LDcgQEAKIAogY29uZmlnIE01NDd4CiAJYm9vbCAiTUNGNTQ3eCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC0xNTAsNiArMTk0LDcgQEAKIAogY29uZmlnIE01NDh4CiAJYm9vbCAiTUNGNTQ4eCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC0xNjgsMTMgKzIxMyw2IEBACiAJZGVwZW5kcyBvbiAoTTU0OHggfHwgTTU0N3gpCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBDT0xERklSRQotCWJvb2wKLQlkZXBlbmRzIG9uIChNNTIwNiB8fCBNNTIwNmUgfHwgTTUyMHggfHwgTTUyM3ggfHwgTTUyNDkgfHwgTTUyN3ggfHwgTTUyNzIgfHwgTTUyOHggfHwgTTUzMDcgfHwgTTUzMnggfHwgTTU0MDcgfHwgTTU0eHgpCi0Jc2VsZWN0IEdFTkVSSUNfR1BJTwotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgotCWRlZmF1bHQgeQotCiBjb25maWcgQ0xPQ0tfU0VUCiAJYm9vbCAiRW5hYmxlIHNldHRpbmcgdGhlIENQVSBjbG9jayBmcmVxdWVuY3kiCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IDMzZjgyNzYuLjFiN2ExNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCkBAIC0xNCw4ICsxNCw3IEBACiBFWFBPUlRfU1lNQk9MKF9fbHNocmRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKIAotI2lmICFkZWZpbmVkKF9fbWM2ODAyMF9fKSAmJiAhZGVmaW5lZChfX21jNjgwMzBfXykgJiYgXAotICAgICFkZWZpbmVkKF9fbWM2ODA0MF9fKSAmJiAhZGVmaW5lZChfX21jNjgwNjBfXykgJiYgIWRlZmluZWQoX19tY3B1MzJfXykKKyNpZiBkZWZpbmVkKENPTkZJR19NNjgwMDApIHx8IGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQogLyoKICAqIFNpbXBsZXIgNjhrIGFuZCBDb2xkRmlyZSBwYXJ0cyBhbHNvIG5lZWQgYSBmZXcgb3RoZXIgZ2NjIGZ1bmN0aW9ucy4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkc19uby5TIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkc19uby5TCmluZGV4IGY0ZDcxNWNkLi43ZGM0MDg3IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX25vLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkc19uby5TCkBAIC04NCw1MiArODQsNTIgQEAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogTm9ybWFsIHN5bWJvbHMgKi8KIAkJLiA9IEFMSUdOKDQpOwogCQlfX3N0YXJ0X19fa3N5bXRhYiA9IC47Ci0JCSooX19rc3ltdGFiKQorCQkqKFNPUlQoX19fa3N5bXRhYisqKSkKIAkJX19zdG9wX19fa3N5bXRhYiA9IC47CiAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl9ncGwgPSAuOwotCQkqKF9fa3N5bXRhYl9ncGwpCisJCSooU09SVChfX19rc3ltdGFiX2dwbCsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl91bnVzZWQgPSAuOwotCQkqKF9fa3N5bXRhYl91bnVzZWQpCisJCSooU09SVChfX19rc3ltdGFiX3VudXNlZCsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl91bnVzZWQgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCiAJCV9fc3RhcnRfX19rc3ltdGFiX3VudXNlZF9ncGwgPSAuOwotCQkqKF9fa3N5bXRhYl91bnVzZWRfZ3BsKQorCQkqKFNPUlQoX19fa3N5bXRhYl91bnVzZWRfZ3BsKyopKQogCQlfX3N0b3BfX19rc3ltdGFiX3VudXNlZF9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1mdXR1cmUgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsKLQkJKihfX2tzeW10YWJfZ3BsX2Z1dHVyZSkKKwkJKihTT1JUKF9fX2tzeW10YWJfZ3BsX2Z1dHVyZSsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsKIAogCQkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBOb3JtYWwgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYiA9IC47Ci0JCSooX19rY3JjdGFiKQorCQkqKFNPUlQoX19fa2NyY3RhYisqKSkKIAkJX19zdG9wX19fa2NyY3RhYiA9IC47CiAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl9ncGwgPSAuOwotCQkqKF9fa2NyY3RhYl9ncGwpCisJCSooU09SVChfX19rY3JjdGFiX2dwbCsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl91bnVzZWQgPSAuOwotCQkqKF9fa2NyY3RhYl91bnVzZWQpCisJCSooU09SVChfX19rY3JjdGFiX3VudXNlZCsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl91bnVzZWQgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCiAJCV9fc3RhcnRfX19rY3JjdGFiX3VudXNlZF9ncGwgPSAuOwotCQkqKF9fa2NyY3RhYl91bnVzZWRfZ3BsKQorCQkqKFNPUlQoX19fa2NyY3RhYl91bnVzZWRfZ3BsKyopKQogCQlfX3N0b3BfX19rY3JjdGFiX3VudXNlZF9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1mdXR1cmUgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl9ncGxfZnV0dXJlID0gLjsKLQkJKihfX2tjcmN0YWJfZ3BsX2Z1dHVyZSkKKwkJKihTT1JUKF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl9ncGxfZnV0dXJlID0gLjsKIAogCQkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBzdHJpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21lbWNweS5jIGIvYXJjaC9tNjhrL2xpYi9tZW1jcHkuYwppbmRleCA2MjE4MmM4Li4wNjQ4ODkzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21lbWNweS5jCisrKyBiL2FyY2gvbTY4ay9saWIvbWVtY3B5LmMKQEAgLTM0LDggKzM0LDEwIEBACiAJaWYgKHRlbXApIHsKIAkJbG9uZyAqbHRvID0gdG87CiAJCWNvbnN0IGxvbmcgKmxmcm9tID0gZnJvbTsKLSNpZiBkZWZpbmVkKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKF9fbWM2ODAzMF9fKSB8fCBcCi0gICAgZGVmaW5lZChfX21jNjgwNDBfXykgfHwgZGVmaW5lZChfX21jNjgwNjBfXykgfHwgZGVmaW5lZChfX21jcHUzMl9fKQorI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisJCWZvciAoOyB0ZW1wOyB0ZW1wLS0pCisJCQkqbHRvKysgPSAqbGZyb20rKzsKKyNlbHNlCiAJCWFzbSB2b2xhdGlsZSAoCiAJCQkiCW1vdmVsICUyLCUzXG4iCiAJCQkiCWFuZHcgICM3LCUzXG4iCkBAIC01Niw5ICs1OCw2IEBACiAJCQkiCWpwbCAgIDRiIgogCQkJOiAiPWEiIChsZnJvbSksICI9YSIgKGx0byksICI9ZCIgKHRlbXApLCAiPSZkIiAodGVtcDEpCiAJCQk6ICIwIiAobGZyb20pLCAiMSIgKGx0byksICIyIiAodGVtcCkpOwotI2Vsc2UKLQkJZm9yICg7IHRlbXA7IHRlbXAtLSkKLQkJCSpsdG8rKyA9ICpsZnJvbSsrOwogI2VuZGlmCiAJCXRvID0gbHRvOwogCQlmcm9tID0gbGZyb207CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21lbXNldC5jIGIvYXJjaC9tNjhrL2xpYi9tZW1zZXQuYwppbmRleCBmNjQ5ZTZhLi44YTc2MzlmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21lbXNldC5jCisrKyBiL2FyY2gvbTY4ay9saWIvbWVtc2V0LmMKQEAgLTMyLDggKzMyLDEwIEBACiAJdGVtcCA9IGNvdW50ID4+IDI7CiAJaWYgKHRlbXApIHsKIAkJbG9uZyAqbHMgPSBzOwotI2lmIGRlZmluZWQoX19tYzY4MDIwX18pIHx8IGRlZmluZWQoX19tYzY4MDMwX18pIHx8IFwKLSAgICBkZWZpbmVkKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVkKF9fbWM2ODA2MF9fKSB8fCBkZWZpbmVkKF9fbWNwdTMyX18pCisjaWYgZGVmaW5lZChDT05GSUdfTTY4MDAwKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKwkJZm9yICg7IHRlbXA7IHRlbXAtLSkKKwkJCSpscysrID0gYzsKKyNlbHNlCiAJCXNpemVfdCB0ZW1wMTsKIAkJYXNtIHZvbGF0aWxlICgKIAkJCSIJbW92ZWwgJTEsJTJcbiIKQEAgLTU1LDkgKzU3LDYgQEAKIAkJCSIJanBsICAgMWIiCiAJCQk6ICI9YSIgKGxzKSwgIj1kIiAodGVtcCksICI9JmQiICh0ZW1wMSkKIAkJCTogImQiIChjKSwgIjAiIChscyksICIxIiAodGVtcCkpOwotI2Vsc2UKLQkJZm9yICg7IHRlbXA7IHRlbXAtLSkKLQkJCSpscysrID0gYzsKICNlbmRpZgogCQlzID0gbHM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYyBiL2FyY2gvbTY4ay9saWIvbXVsZGkzLmMKaW5kZXggMDc5YmFmY2EuLjc5ZTkyOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvbXVsZGkzLmMKKysrIGIvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYwpAQCAtMTksMTcgKzE5LDcgQEAKIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KIAotI2lmIGRlZmluZWQoX19tYzY4MDIwX18pIHx8IGRlZmluZWQoX19tYzY4MDMwX18pIHx8IFwKLSAgICBkZWZpbmVkKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVkKF9fbWM2ODA2MF9fKSB8fCBkZWZpbmVkKF9fbWNwdTMyX18pCi0KLSNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAotICBfX2FzbV9fICgibXVsdSUubCAlMywlMTolMCIJCQkJCQlcCi0gICAgICAgICAgIDogIj1kIiAoKFVTSXR5cGUpKHcwKSksCQkJCQlcCi0gICAgICAgICAgICAgIj1kIiAoKFVTSXR5cGUpKHcxKSkJCQkJCVwKLSAgICAgICAgICAgOiAiJTAiICgoVVNJdHlwZSkodSkpLAkJCQkJXAotICAgICAgICAgICAgICJkbWkiICgoVVNJdHlwZSkodikpKQotCi0jZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCiAKICNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCiAjZGVmaW5lIF9fQklUUzQgKFNJX1RZUEVfU0laRSAvIDQpCkBAIC02MSw2ICs1MSwxNSBAQAogICAgICh3MCkgPSBfX2xsX2xvd3BhcnQgKF9feDEpICogX19sbF9CICsgX19sbF9sb3dwYXJ0IChfX3gwKTsJCVwKICAgfSB3aGlsZSAoMCkKIAorI2Vsc2UKKworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx1JS5sICUzLCUxOiUwIgkJCQkJCVwKKyAgICAgICAgICAgOiAiPWQiICgoVVNJdHlwZSkodzApKSwJCQkJCVwKKyAgICAgICAgICAgICAiPWQiICgoVVNJdHlwZSkodzEpKQkJCQkJXAorICAgICAgICAgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksCQkJCQlcCisgICAgICAgICAgICAgImRtaSIgKChVU0l0eXBlKSh2KSkpCisKICNlbmRpZgogCiAjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKaW5kZXggMzc4NjJiMi4uODA3Yzk3ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcKQEAgLTY3OCw3ICs2NzgsNyBAQAogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CiBDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CiBDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049eQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUw9eQogQ09ORklHX1JUQ19EUlZfVEVTVD1tCiBDT05GSUdfUlRDX0RSVl9EUzEzMDc9bQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCmluZGV4IGMwMTg2OTYuLjVjNzRlYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KQEAgLTIxNSwxNCArMjE1LDEzIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGk4MjU5QV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGk4MjU5QV9yZXN1bWUodm9pZCkKIHsKIAlpZiAoaTgyNTlBX2F1dG9fZW9pID49IDApCiAJCWluaXRfODI1OUEoaTgyNTlBX2F1dG9fZW9pKTsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpODI1OUFfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGk4MjU5QV9zaHV0ZG93bih2b2lkKQogewogCS8qIFB1dCB0aGUgaTgyNTlBIGludG8gYSBxdWllc2NlbnQgc3RhdGUgdGhhdAogCSAqIHRoZSBrZXJuZWwgaW5pdGlhbGl6YXRpb24gY29kZSBjYW4gZ2V0IGl0CkBAIC0yMzIsMjYgKzIzMSwxNyBAQAogCQlvdXRiKDB4ZmYsIFBJQ19NQVNURVJfSU1SKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMSAqLwogCQlvdXRiKDB4ZmYsIFBJQ19TTEFWRV9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCiAJfQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpODI1OV9zeXNkZXZfY2xhc3MgPSB7Ci0JLm5hbWUgPSAiaTgyNTkiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBpODI1OV9zeXNjb3JlX29wcyA9IHsKIAkucmVzdW1lID0gaTgyNTlBX3Jlc3VtZSwKIAkuc2h1dGRvd24gPSBpODI1OUFfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2k4MjU5QSA9IHsKLQkuaWQJPSAwLAotCS5jbHMJPSAmaTgyNTlfc3lzZGV2X2NsYXNzLAotfTsKLQogc3RhdGljIGludCBfX2luaXQgaTgyNTlBX2luaXRfc3lzZnModm9pZCkKIHsKLQlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmk4MjU5X3N5c2Rldl9jbGFzcyk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9pODI1OUEpOwotCXJldHVybiBlcnJvcjsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmaTgyNTlfc3lzY29yZV9vcHMpOworCXJldHVybiAwOwogfQogCiBkZXZpY2VfaW5pdGNhbGwoaTgyNTlBX2luaXRfc3lzZnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggM2Q2ZTYwZC4uNzgwNTYwYiAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNSw2ICsxNSw3IEBACiAgKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCiAgKi8KICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdHJhcHMuYwppbmRleCBmMDNjYjI3Li5iZDNlNWU3IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC90cmFwcy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgpAQCAtMTU2LDcgKzE1Niw3IEBACiAKIAljYXNlIEVYQ0VQX1RSQVA6CiAJY2FzZSBFWENFUF9VTklNUElOUzoKLQkJaWYgKGdldF91c2VyKG9wY29kZSwgKHVpbnQ4X3QgX191c2VyICopcmVncy0+cGMpICE9IDApCisJCWlmIChwcm9iZV9rZXJuZWxfcmVhZCgmb3Bjb2RlLCAodTggKilyZWdzLT5wYywgMSkgPCAwKQogCQkJYnJlYWs7CiAJCWlmIChvcGNvZGUgPT0gMHhmZikgewogCQkJaWYgKG5vdGlmeV9kaWUoRElFX0JSRUFLUE9JTlQsIHN0ciwgcmVncywgY29kZSwgMCwgMCkpCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21uMTAzMDAva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNmY3MDJhNi4uMTNjNDgxNCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNDQsNiArNDQsNyBAQAogICBST19EQVRBKFBBR0VfU0laRSkKIAogICAvKiB3cml0ZWFibGUgKi8KKyAgX3NkYXRhID0gLjsgICAgIC8qIFN0YXJ0IG9mIHJ3IGRhdGEgc2VjdGlvbiAqLwogICBSV19EQVRBX1NFQ1RJT04oMzIsIFBBR0VfU0laRSwgVEhSRUFEX1NJWkUpCiAgIF9lZGF0YSA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9jYWNoZS1kYmctZmx1c2gtYnktcmVnLlMgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtZGJnLWZsdXNoLWJ5LXJlZy5TCmluZGV4IDY2NTkxOWYuLmE3NzVlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9tbS9jYWNoZS1kYmctZmx1c2gtYnktcmVnLlMKKysrIGIvYXJjaC9tbjEwMzAwL21tL2NhY2hlLWRiZy1mbHVzaC1ieS1yZWcuUwpAQCAtMTIwLDE0ICsxMjAsMTQgQEAKIAkjIGNvbmRpdGlvbmFsbHkgcHVyZ2UgdGhpcyBsaW5lIGluIGFsbCB3YXlzCiAJbW92CWQxLChMMV9DQUNIRV9XQVlESVNQKjAsYTApCiAKLWRlYnVnZ2VyX2xvY2FsX2NhY2hlX2ZsdXNoaW52X25vX2RjYWNoZToKK2RlYnVnZ2VyX2xvY2FsX2NhY2hlX2ZsdXNoaW52X29uZV9ub19kY2FjaGU6CiAJIwogCSMgbm93IHRyeSB0byBmbHVzaCB0aGUgaWNhY2hlCiAJIwogCW1vdglDSENUUixhMAogCW1vdmh1CShhMCksZDAKIAlidHN0CUNIQ1RSX0lDRU4sZDAKLQliZXEJbW4xMDMwMF9sb2NhbF9pY2FjaGVfaW52X3JhbmdlX3JlZ19lbmQKKwliZXEJZGVidWdnZXJfbG9jYWxfY2FjaGVfZmx1c2hpbnZfb25lX2VuZAogCiAJTE9DQUxfQ0xJX1NBVkUoZDEpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggOTYwOGQyYy4uZTY3ZWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW16b25lLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTE0LDEzICsxNCw2IEBACiAKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkgICAgICAgICAgKCZub2RlX2RhdGFbbmlkXS5wZ19kYXRhKQogCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlwZ19kYXRhX3QgKl9fcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsJCQkJXAotCV9fcGdkYXQtPm5vZGVfc3RhcnRfcGZuICsgX19wZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOwkJXAotfSkKLQogLyogV2UgaGF2ZSB0aGVzZSBwb3NzaWJsZSBtZW1vcnkgbWFwIGxheW91dHM6CiAgKiBBc3RybzogMC0zLjc1LCA2Ny43NS02OCwgNC02NAogICogengxOiAwLTEsIDI1Ny0yNjAsIDQtMjU2CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZQppbmRleCAzZDgwYzNlLi4xMmRhNzdlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUKQEAgLTEsNSArMSw0IEBACiBhZGRub3RlCi1kdGMKIGVtcHR5LmMKIGhhY2stY29mZgogaW5mYmxvY2suYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy8uZ2l0aWdub3JlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MzZjk0Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZHRjLWxleGVyLmxleC5jCi1kdGMtcGFyc2VyLnRhYi5jCi1kdGMtcGFyc2VyLnRhYi5oCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMKaW5kZXggNGY2ODVhNy4uOThkOTQyNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwpAQCAtMjA5LDggKzIwOSwxMCBAQAogCQkJd204Nzc2OmNvZGVjQDFhIHsKIAkJCQljb21wYXRpYmxlID0gIndsZix3bTg3NzYiOwogCQkJCXJlZyA9IDwweDFhPjsKLQkJCQkvKiBNQ0xLIHNvdXJjZSBpcyBhIHN0YW5kLWFsb25lIG9zY2lsbGF0b3IgKi8KLQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MTIyODgwMDA+OworCQkJCS8qCisJCQkJICogY2xvY2stZnJlcXVlbmN5IHdpbGwgYmUgc2V0IGJ5IFUtQm9vdCBpZgorCQkJCSAqIHRoZSBjbG9jayBpcyBlbmFibGVkLgorCQkJCSAqLwogCQkJfTsKIAkJfTsKIApAQCAtMjgwLDcgKzI4Miw4IEBACiAJCQljb2RlYy1oYW5kbGUgPSA8JndtODc3Nj47CiAJCQlmc2wscGxheWJhY2stZG1hID0gPCZkbWEwMD47CiAJCQlmc2wsY2FwdHVyZS1kbWEgPSA8JmRtYTAxPjsKLQkJCWZzbCxmaWZvLWRlcHRoID0gPDE2PjsKKwkJCWZzbCxmaWZvLWRlcHRoID0gPDE1PjsKKwkJCWZzbCxzc2ktYXN5bmNocm9ub3VzOwogCQl9OwogCiAJCWRtYUBjMzAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZwppbmRleCA3ZjdlNGE4Li4yMmU3MTk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnCkBAIC04NSw3ICs4NSw3IEBACiBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRl9CRT15CiAjIENPTkZJR19VU0JfT0hDSV9IQ0RfUENJIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfU1RPUkFHRT1tCi1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfUENGODU2Mz1tCiBDT05GSUdfRVhUMl9GUz1tCiBDT05GSUdfRVhUM19GUz1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwppbmRleCA2NDcyMzIyLi4xODVjMjkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKQEAgLTE0MSw3ICsxNDEsNyBAQAogIyBDT05GSUdfVVNCX0VIQ0lfSENEX1BQQ19PRiBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPW0KIENPTkZJR19VU0JfU1RPUkFHRT1tCi1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfUFMzPW0KIENPTkZJR19FWFQyX0ZTPW0KIENPTkZJR19FWFQzX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKaW5kZXggYzlmMjEyYi4uODBiYzVkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKQEAgLTE0OCw3ICsxNDgsNiBAQAogQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0k9bQogQ09ORklHX1NDU0lfQ1hHQjRfSVNDU0k9bQogQ09ORklHX1NDU0lfQk5YMl9JU0NTST1tCi1DT05GSUdfU0NTSV9CTlgyX0lTQ1NJPW0KIENPTkZJR19CRTJJU0NTST1tCiBDT05GSUdfU0NTSV9JQk1WU0NTST15CiBDT05GSUdfU0NTSV9JQk1WRkM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IGZkM2ZkNTguLjdiNTg5MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTM4LDEzICszOCw2IEBACiAjZGVmaW5lIG1lbW9yeV9ob3RwbHVnX21heCgpIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkKICNlbmRpZgogCi0vKgotICogRm9sbG93aW5nIGFyZSBtYWNyb3MgdGhhdCBlYWNoIG51bWEgaW1wbG1lbnRhdGlvbiBtdXN0IGRlZmluZS4KLSAqLwotCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX2VuZF9wZm4pCi0KICNlbHNlCiAjZGVmaW5lIG1lbW9yeV9ob3RwbHVnX21heCgpIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Jpby5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Jpby5oCmluZGV4IGQ5MDJhYmQuLmIxZDJkZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmlvLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNkZWZpbmUgQVNNX1BQQ19SSU9fSAogCiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9yaW9faW5pdCh2b2lkKTsKLSNpZmRlZiBDT05GSUdfUkFQSURJTworI2lmZGVmIENPTkZJR19GU0xfUklPCiBleHRlcm4gaW50IGZzbF9yaW9fbWNoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBmc2xfcmlvX21jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHtyZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDM0ZDI3MjIuLjlmYjkzMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTE5NzksNyArMTk3OSw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHg4MDI0MDAwMCwKIAkJLmNwdV9uYW1lCQk9ICJlNTUwMCIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTU1MDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8IFBQQ19GRUFUVVJFX0hBU19GUFUsCiAJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFX0ZTTF9FIHwgTU1VX0ZUUl9CSUdfUEhZUyB8CiAJCQlNTVVfRlRSX1VTRV9UTEJJTFgsCiAJCS5pY2FjaGVfYnNpemUJCT0gNjQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IGYyYzkwNmIuLjhjMzExMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC04MiwxMSArODIsMjkgQEAKIH0KIGVhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOwogCisvKgorICogb3ZlcmxhcHNfaW5pdHJkIC0gY2hlY2sgZm9yIG92ZXJsYXAgd2l0aCBwYWdlIGFsaWduZWQgZXh0ZW5zaW9uIG9mCisgKiBpbml0cmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG92ZXJsYXBzX2luaXRyZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKCFpbml0cmRfc3RhcnQpCisJCXJldHVybiAwOworCisJcmV0dXJuCShzdGFydCArIHNpemUpID4gX0FMSUdOX0RPV04oaW5pdHJkX3N0YXJ0LCBQQUdFX1NJWkUpICYmCisJCQlzdGFydCA8PSBfQUxJR05fVVAoaW5pdHJkX2VuZCwgUEFHRV9TSVpFKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKwogLyoqCiAgKiBtb3ZlX2RldmljZV90cmVlIC0gbW92ZSB0cmVlIHRvIGFuIHVudXNlZCBhcmVhLCBpZiBuZWVkZWQuCiAgKgogICogVGhlIGRldmljZSB0cmVlIG1heSBiZSBhbGxvY2F0ZWQgYmV5b25kIG91ciBtZW1vcnkgbGltaXQsIG9yIGluc2lkZSB0aGUKLSAqIGNyYXNoIGtlcm5lbCByZWdpb24gZm9yIGtkdW1wLiBJZiBzbywgbW92ZSBpdCBvdXQgb2YgdGhlIHdheS4KKyAqIGNyYXNoIGtlcm5lbCByZWdpb24gZm9yIGtkdW1wLCBvciB3aXRoaW4gdGhlIHBhZ2UgYWxpZ25lZCByYW5nZSBvZiBpbml0cmQuCisgKiBJZiBzbywgbW92ZSBpdCBvdXQgb2YgdGhlIHdheS4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IG1vdmVfZGV2aWNlX3RyZWUodm9pZCkKIHsKQEAgLTk5LDcgKzExNyw4IEBACiAJc2l6ZSA9IGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPnRvdGFsc2l6ZSk7CiAKIAlpZiAoKG1lbW9yeV9saW1pdCAmJiAoc3RhcnQgKyBzaXplKSA+IFBIWVNJQ0FMX1NUQVJUICsgbWVtb3J5X2xpbWl0KSB8fAotCQkJb3ZlcmxhcHNfY3Jhc2hrZXJuZWwoc3RhcnQsIHNpemUpKSB7CisJCQlvdmVybGFwc19jcmFzaGtlcm5lbChzdGFydCwgc2l6ZSkgfHwKKwkJCW92ZXJsYXBzX2luaXRyZChzdGFydCwgc2l6ZSkpIHsKIAkJcCA9IF9fdmEobWVtYmxvY2tfYWxsb2Moc2l6ZSwgUEFHRV9TSVpFKSk7CiAJCW1lbWNweShwLCBpbml0aWFsX2Jvb3RfcGFyYW1zLCBzaXplKTsKIAkJaW5pdGlhbF9ib290X3BhcmFtcyA9IChzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKilwOwpAQCAtNTU1LDcgKzU3NCw5IEBACiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAJLyogdGhlbiByZXNlcnZlIHRoZSBpbml0cmQsIGlmIGFueSAqLwogCWlmIChpbml0cmRfc3RhcnQgJiYgKGluaXRyZF9lbmQgPiBpbml0cmRfc3RhcnQpKQotCQltZW1ibG9ja19yZXNlcnZlKF9fcGEoaW5pdHJkX3N0YXJ0KSwgaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydCk7CisJCW1lbWJsb2NrX3Jlc2VydmUoX0FMSUdOX0RPV04oX19wYShpbml0cmRfc3RhcnQpLCBQQUdFX1NJWkUpLAorCQkJX0FMSUdOX1VQKGluaXRyZF9lbmQsIFBBR0VfU0laRSkgLQorCQkJX0FMSUdOX0RPV04oaW5pdHJkX3N0YXJ0LCBQQUdFX1NJWkUpKTsKICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KIAogI2lmZGVmIENPTkZJR19QUEMzMgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLXJ0Yy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLXJ0Yy5jCmluZGV4IDc3NTc4YzAuLmM1N2MxOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMtcnRjLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CkBAIC0yOSw5ICszMCwxMCBAQAogCQl9CiAJfSB3aGlsZSAod2FpdF90aW1lICYmIChnZXRfdGIoKSA8IG1heF93YWl0X3RiKSk7CiAKLQlpZiAoZXJyb3IgIT0gMCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3I6IHJlYWRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLAotCQkJZXJyb3IpOworCWlmIChlcnJvciAhPSAwKSB7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcKKwkJCQkgICAiZXJyb3I6IHJlYWRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLAorCQkJCSAgIGVycm9yKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01NSwxOSArNTcsMjEgQEAKIAogCQl3YWl0X3RpbWUgPSBydGFzX2J1c3lfZGVsYXlfdGltZShlcnJvcik7CiAJCWlmICh3YWl0X3RpbWUpIHsKLQkJCWlmIChpbl9pbnRlcnJ1cHQoKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWlmIChpbl9pbnRlcnJ1cHQoKSkgewogCQkJCW1lbXNldChydGNfdG0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlcnJvcjogcmVhZGluZyBjbG9jayIKLQkJCQkgICAgICAgIiB3b3VsZCBkZWxheSBpbnRlcnJ1cHRcbiIpOworCQkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcKKwkJCQkJCSAgICJlcnJvcjogcmVhZGluZyBjbG9jayAiCisJCQkJCQkgICAid291bGQgZGVsYXkgaW50ZXJydXB0XG4iKTsKIAkJCQlyZXR1cm47CS8qIGRlbGF5IG5vdCBhbGxvd2VkICovCiAJCQl9CiAJCQltc2xlZXAod2FpdF90aW1lKTsKIAkJfQogCX0gd2hpbGUgKHdhaXRfdGltZSAmJiAoZ2V0X3RiKCkgPCBtYXhfd2FpdF90YikpOwogCi0gICAgICAgIGlmIChlcnJvciAhPSAwICYmIHByaW50a19yYXRlbGltaXQoKSkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImVycm9yOiByZWFkaW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycm9yKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HCisJCQkJICAgImVycm9yOiByZWFkaW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKKwkJCQkgICBlcnJvcik7CiAJCXJldHVybjsKICAgICAgICAgfQogCkBAIC05OSw5ICsxMDMsMTAgQEAKIAkJfQogCX0gd2hpbGUgKHdhaXRfdGltZSAmJiAoZ2V0X3RiKCkgPCBtYXhfd2FpdF90YikpOwogCi0gICAgICAgIGlmIChlcnJvciAhPSAwICYmIHByaW50a19yYXRlbGltaXQoKSkKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJlcnJvcjogc2V0dGluZyB0aGUgY2xvY2sgZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnJvcik7CisJaWYgKGVycm9yICE9IDApCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcKKwkJCQkgICAiZXJyb3I6IHNldHRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLAorCQkJCSAgIGVycm9yKTsKIAogICAgICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IGI5NmEzYTAuLjc4Yjc2ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KQEAgLTg5MiwxMSArODkzLDEyIEBACiAJcHJpbnRrKCJiYWRmcmFtZSBpbiBoYW5kbGVfcnRfc2lnbmFsLCByZWdzPSVwIGZyYW1lPSVwIG5ld3NwPSVseFxuIiwKIAkgICAgICAgcmVncywgZnJhbWUsIG5ld3NwKTsKICNlbmRpZgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gaGFuZGxlX3J0X3NpZ25hbDMyOiAiCi0JCQkiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJYWRkciwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKKwlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fSU5GTworCQkJCSAgICIlc1slZF06IGJhZCBmcmFtZSBpbiBoYW5kbGVfcnRfc2lnbmFsMzI6ICIKKwkJCQkgICAiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAorCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkgICBhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtMTA1OCwxMSArMTA2MCwxMiBAQAogCXJldHVybiAwOwogCiAgYmFkOgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3J0X3NpZ3JldHVybjogIgotCQkJIiVwIG5pcCAlMDhseCBsciAlMDhseFxuIiwKLQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKLQkJCXJ0X3NmLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCisJCQkJICAgIiVzWyVkXTogYmFkIGZyYW1lIGluIHN5c19ydF9zaWdyZXR1cm46ICIKKwkJCQkgICAiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAorCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkgICBydF9zZiwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKIAogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKQEAgLTExNDksMTIgKzExNTIsMTIgQEAKIAkgKiBXZSBraWxsIHRoZSB0YXNrIHdpdGggYSBTSUdTRUdWIGluIHRoaXMgc2l0dWF0aW9uLgogCSAqLwogCWlmIChkb19zZXRjb250ZXh0KGN0eCwgcmVncywgMSkpIHsKLQkJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gIgotCQkJCSJzeXNfZGVidWdfc2V0Y29udGV4dDogJXAgbmlwICUwOGx4ICIKLQkJCQkibHIgJTA4bHhcbiIsCi0JCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJCWN0eCwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKKwkJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiAiCisJCQkJCSAgICJzeXNfZGVidWdfc2V0Y29udGV4dDogJXAgbmlwICUwOGx4ICIKKwkJCQkJICAgImxyICUwOGx4XG4iLAorCQkJCQkgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkJCSAgIGN0eCwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKIAogCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJCWdvdG8gb3V0OwpAQCAtMTIzNiwxMSArMTIzOSwxMiBAQAogCXByaW50aygiYmFkZnJhbWUgaW4gaGFuZGxlX3NpZ25hbCwgcmVncz0lcCBmcmFtZT0lcCBuZXdzcD0lbHhcbiIsCiAJICAgICAgIHJlZ3MsIGZyYW1lLCBuZXdzcCk7CiAjZW5kaWYKLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzWyVkXTogYmFkIGZyYW1lIGluIGhhbmRsZV9zaWduYWwzMjogIgotCQkJIiVwIG5pcCAlMDhseCBsciAlMDhseFxuIiwKLQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKLQkJCWZyYW1lLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCisJCQkJICAgIiVzWyVkXTogYmFkIGZyYW1lIGluIGhhbmRsZV9zaWduYWwzMjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIGZyYW1lLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtMTI4OCwxMSArMTI5MiwxMiBAQAogCXJldHVybiAwOwogCiBiYWRmcmFtZToKLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzWyVkXTogYmFkIGZyYW1lIGluIHN5c19zaWdyZXR1cm46ICIKLQkJCSIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCi0JCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCi0JCQlhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCisJCQkJICAgIiVzWyVkXTogYmFkIGZyYW1lIGluIHN5c19zaWdyZXR1cm46ICIKKwkJCQkgICAiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAorCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkgICBhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggZGE5ODlmZi4uZTkxYzczNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgpAQCAtMzgwLDEwICszODEsMTAgQEAKIAlwcmludGsoImJhZGZyYW1lIGluIHN5c19ydF9zaWdyZXR1cm4sIHJlZ3M9JXAgdWM9JXAgJnVjLT51Y19tY29udGV4dD0lcFxuIiwKIAkgICAgICAgcmVncywgdWMsICZ1Yy0+dWNfbWNvbnRleHQpOwogI2VuZGlmCi0JaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsocmVncy0+bXNyICYgTVNSXzY0QklUID8gZm10NjQgOiBmbXQzMiwKLQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgInJ0X3NpZ3JldHVybiIsCi0JCQkobG9uZyl1YywgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKKwlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAicnRfc2lncmV0dXJuIiwKKwkJCQkgICAobG9uZyl1YywgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKIAogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKQEAgLTQ2OCwxMCArNDY5LDEwIEBACiAJcHJpbnRrKCJiYWRmcmFtZSBpbiBzZXR1cF9ydF9mcmFtZSwgcmVncz0lcCBmcmFtZT0lcCBuZXdzcD0lbHhcbiIsCiAJICAgICAgIHJlZ3MsIGZyYW1lLCBuZXdzcCk7CiAjZW5kaWYKLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAic2V0dXBfcnRfZnJhbWUiLAotCQkJKGxvbmcpZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAorCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgInNldHVwX3J0X2ZyYW1lIiwKKwkJCQkgICAobG9uZylmcmFtZSwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKIAogCWZvcmNlX3NpZ3NlZ3Yoc2lnbnIsIGN1cnJlbnQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDBmZjRhYjkuLjFhMDE0MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlIDxhc20vZW11bGF0ZWRfb3BzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTE5NywxMiArMTk4LDExIEBACiAJCWlmIChkaWUoIkV4Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZSIsIHJlZ3MsIHNpZ25yKSkKIAkJCXJldHVybjsKIAl9IGVsc2UgaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYKLQkJICAgIHVuaGFuZGxlZF9zaWduYWwoY3VycmVudCwgc2lnbnIpICYmCi0JCSAgICBwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAotCQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc2lnbnIsCi0JCQkJYWRkciwgcmVncy0+bmlwLCByZWdzLT5saW5rLCBjb2RlKTsKLQkJfQorCQkgICB1bmhhbmRsZWRfc2lnbmFsKGN1cnJlbnQsIHNpZ25yKSkgeworCQlwcmludGtfcmF0ZWxpbWl0ZWQocmVncy0+bXNyICYgTVNSXzY0QklUID8gZm10NjQgOiBmbXQzMiwKKwkJCQkgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNpZ25yLAorCQkJCSAgIGFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluaywgY29kZSk7CisJfQogCiAJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogCWluZm8uc2lfc2lnbm8gPSBzaWducjsKQEAgLTQyNSw3ICs0MjUsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmVhc29uID0gbWNzcjsKIAlpbnQgcmVjb3ZlcmFibGUgPSAxOwogCi0JaWYgKHJlYXNvbiAmIE1DU1JfQlVTX1JCRVJSKSB7CisJaWYgKHJlYXNvbiAmIE1DU1JfTEQpIHsKIAkJcmVjb3ZlcmFibGUgPSBmc2xfcmlvX21jaGVja19leGNlcHRpb24ocmVncyk7CiAJCWlmIChyZWNvdmVyYWJsZSA9PSAxKQogCQkJZ290byBzaWxlbnRfb3V0OwpAQCAtMTM0Miw5ICsxMzQyLDggQEAKIAl9IGVsc2UgewogCQkvKiBkaWRuJ3QgcmVjb2duaXplIHRoZSBpbnN0cnVjdGlvbiAqLwogCQkvKiBYWFggcXVpY2sgaGFjayBmb3Igbm93OiBzZXQgdGhlIG5vbi1KYXZhIGJpdCBpbiB0aGUgVlNDUiAqLwotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJVbnJlY29nbml6ZWQgYWx0aXZlYyBpbnN0cnVjdGlvbiAiCi0JCQkgICAgICAgImluICVzIGF0ICVseFxuIiwgY3VycmVudC0+Y29tbSwgcmVncy0+bmlwKTsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJVbnJlY29nbml6ZWQgYWx0aXZlYyBpbnN0cnVjdGlvbiAiCisJCQkJICAgImluICVzIGF0ICVseFxuIiwgY3VycmVudC0+Y29tbSwgcmVncy0+bmlwKTsKIAkJY3VycmVudC0+dGhyZWFkLnZzY3IudVszXSB8PSAweDEwMDAwOwogCX0KIH0KQEAgLTE1NDgsOSArMTU0Nyw4IEBACiAKIHZvaWQgcHBjX3dhcm5fZW11bGF0ZWRfcHJpbnQoY29uc3QgY2hhciAqdHlwZSkKIHsKLQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcl93YXJuaW5nKCIlcyB1c2VkIGVtdWxhdGVkICVzIGluc3RydWN0aW9uXG4iLCBjdXJyZW50LT5jb21tLAotCQkJICAgdHlwZSk7CisJcHJfd2Fybl9yYXRlbGltaXRlZCgiJXMgdXNlZCBlbXVsYXRlZCAlcyBpbnN0cnVjdGlvblxuIiwgY3VycmVudC0+Y29tbSwKKwkJCSAgICB0eXBlKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcHBjX3dhcm5fZW11bGF0ZWRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCA1NGY0ZmI5Li5hZDM1ZjY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTM0NiwxMSArMzQ3LDEwIEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChpc19leGVjICYmIChlcnJvcl9jb2RlICYgRFNJU1JfUFJPVEZBVUxUKQotCSAgICAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0NSSVQgImtlcm5lbCB0cmllZCB0byBleGVjdXRlIE5YLXByb3RlY3RlZCIKLQkJICAgICAgICIgcGFnZSAoJWx4KSAtIGV4cGxvaXQgYXR0ZW1wdD8gKHVpZDogJWQpXG4iLAotCQkgICAgICAgYWRkcmVzcywgY3VycmVudF91aWQoKSk7CisJaWYgKGlzX2V4ZWMgJiYgKGVycm9yX2NvZGUgJiBEU0lTUl9QUk9URkFVTFQpKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9DUklUICJrZXJuZWwgdHJpZWQgdG8gZXhlY3V0ZSBOWC1wcm90ZWN0ZWQiCisJCQkJICAgIiBwYWdlICglbHgpIC0gZXhwbG9pdCBhdHRlbXB0PyAodWlkOiAlZClcbiIsCisJCQkJICAgYWRkcmVzcywgY3VycmVudF91aWQoKSk7CiAKIAlyZXR1cm4gU0lHU0VHVjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKaW5kZXggZDY1YjU5MS4uNWRlMGYyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCkBAIC0yMjMsMjEgKzIyMyw2IEBACiAjdW5kZWYgRlJFRVNFQwogfQogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi12b2lkIGZyZWVfaW5pdHJkX21lbSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlpZiAoc3RhcnQgPCBlbmQpCi0JCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7Ci0JZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7Ci0JCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKLQkJZnJlZV9wYWdlKHN0YXJ0KTsKLQkJdG90YWxyYW1fcGFnZXMrKzsKLQl9Ci19Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHXzh4eCAvKiBObyA4eHggc3BlY2lmaWMgLmMgZmlsZSB0byBwdXQgdGhhdCBpbiAuLi4gKi8KIHZvaWQgc2V0dXBfaW5pdGlhbF9tZW1vcnlfbGltaXQocGh5c19hZGRyX3QgZmlyc3RfbWVtYmxvY2tfYmFzZSwKIAkJCQlwaHlzX2FkZHJfdCBmaXJzdF9tZW1ibG9ja19zaXplKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKaW5kZXggNjM3NGIyMS4uZjZkYmI0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCkBAIC05OSwyMCArOTksNiBAQAogCQkoKHVuc2lnbmVkIGxvbmcpX19pbml0X2VuZCAtICh1bnNpZ25lZCBsb25nKV9faW5pdF9iZWdpbikgPj4gMTApOwogfQogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi12b2lkIGZyZWVfaW5pdHJkX21lbSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlpZiAoc3RhcnQgPCBlbmQpCi0JCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7Ci0JZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7Ci0JCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKLQkJZnJlZV9wYWdlKHN0YXJ0KTsKLQkJdG90YWxyYW1fcGFnZXMrKzsKLQl9Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgcGdkX2N0b3Iodm9pZCAqYWRkcikKIHsKIAltZW1zZXQoYWRkciwgMCwgUEdEX1RBQkxFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDU3ZTU0NWIuLjI5ZDRkZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTM4Miw2ICszODIsMjUgQEAKIAltZW1faW5pdF9kb25lID0gMTsKIH0KIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBfX2luaXQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWlmIChzdGFydCA+PSBlbmQpCisJCXJldHVybjsKKworCXN0YXJ0ID0gX0FMSUdOX0RPV04oc3RhcnQsIFBBR0VfU0laRSk7CisJZW5kID0gX0FMSUdOX1VQKGVuZCwgUEFHRV9TSVpFKTsKKwlwcl9pbmZvKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOworCisJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7CisJCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKKwkJZnJlZV9wYWdlKHN0YXJ0KTsKKwkJdG90YWxyYW1fcGFnZXMrKzsKKwl9Cit9CisjZW5kaWYKKwogLyoKICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBwYWdlIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSBrZXJuZWwuCiAgKiBJdCBqdXN0IG1hcmtzIHRoZSBwYWdlIGFzIG5vdCBpLWNhY2hlIGNsZWFuLiAgV2UgZG8gdGhlIGktY2FjaGUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCmluZGV4IDkwODliMDQuLjc2NjdkYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwpAQCAtNzE1LDcgKzcxNSw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcG1hY3BpY19zeXNjb3JlKHZvaWQpCiB7Ci0JcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnBtYWNwaWNfc3lzY29yZV9vcHMpOworCWlmIChwbWFjX2lycV9od1swXSkKKwkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnBtYWNwaWNfc3lzY29yZV9vcHMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1tZW1vcnkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCmluZGV4IDMzODY3ZWMuLjlkNmE4ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKwogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BTZXJpZXNfcmVjb25maWcuaD4KQEAgLTIwLDI0ICsyMiwyNSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X21lbWJsb2NrX3NpemUodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXVuc2lnbmVkIGludCBtZW1ibG9ja19zaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgbWVtYmxvY2tfc2l6ZSA9IE1JTl9NRU1PUllfQkxPQ0tfU0laRTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAogCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sZHluYW1pYy1yZWNvbmZpZ3VyYXRpb24tbWVtb3J5Iik7CiAJaWYgKG5wKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnNpemU7CisJCWNvbnN0IF9fYmU2NCAqc2l6ZTsKIAogCQlzaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGxtYi1zaXplIiwgTlVMTCk7Ci0JCW1lbWJsb2NrX3NpemUgPSBzaXplID8gKnNpemUgOiAwOwotCisJCWlmIChzaXplKQorCQkJbWVtYmxvY2tfc2l6ZSA9IGJlNjRfdG9fY3B1cChzaXplKTsKIAkJb2Zfbm9kZV9wdXQobnApOwotCX0gZWxzZSB7CisJfSBlbHNlICBpZiAobWFjaGluZV9pcyhwc2VyaWVzKSkgeworCQkvKiBUaGlzIGZhbGxiYWNrIHJlYWxseSBvbmx5IGFwcGxpZXMgdG8gcHNlcmllcyAqLwogCQl1bnNpZ25lZCBpbnQgbWVtemVyb19zaXplID0gMDsKLQkJY29uc3QgdW5zaWduZWQgaW50ICpyZWdzOwogCiAJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9tZW1vcnlAMCIpOwogCQlpZiAobnApIHsKLQkJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJCW1lbXplcm9fc2l6ZSA9IHJlZ3MgPyByZWdzWzNdIDogMDsKKwkJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKQorCQkJCW1lbXplcm9fc2l6ZSA9IHJlc291cmNlX3NpemUoJnIpOwogCQkJb2Zfbm9kZV9wdXQobnApOwogCQl9CiAKQEAgLTUwLDE2ICs1MywyMSBAQAogCQkJc3ByaW50ZihidWYsICIvbWVtb3J5QCV4IiwgbWVtemVyb19zaXplKTsKIAkJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoYnVmKTsKIAkJCWlmIChucCkgewotCQkJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJCQltZW1ibG9ja19zaXplID0gcmVncyA/IHJlZ3NbM10gOiAwOworCQkJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKQorCQkJCQltZW1ibG9ja19zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcik7CiAJCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJfQogCQl9CiAJfQotCiAJcmV0dXJuIG1lbWJsb2NrX3NpemU7CiB9CiAKKy8qIFdBUk5JTkc6IFRoaXMgaXMgZ29pbmcgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyaWMgZGVmaW5pdGlvbiB3aGVuZXZlcgorICogcHNlcmllcyBpcyBidWlsdC1pbiByZWdhcmRsZXNzIG9mIHdoYXQgcGxhdGZvcm0gaXMgYWN0aXZlIGF0IGJvb3QKKyAqIHRpbWUuIFRoaXMgaXMgZmluZSBmb3Igbm93IGFzIHRoaXMgaXMgdGhlIG9ubHkgIm9wdGlvbiIgYW5kIGl0CisgKiBzaG91bGQgd29yayBldmVyeXdoZXJlLiBJZiBub3QsIHdlJ2xsIGhhdmUgdG8gdHVybiB0aGlzIGludG8gYQorICogcHBjX21kLiBjYWxsYmFjaworICovCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKHZvaWQpCiB7CiAJcmV0dXJuIGdldF9tZW1ibG9ja19zaXplKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jCmluZGV4IDA2MDhiMTYuLmQ5MTc1NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jCkBAIC0xOTYsOSArMTk2LDYgQEAKIAlvdXRfYmUzMigmbGJjLT5sdGVjY3IsIExURUNDUl9DTEVBUik7CiAJb3V0X2JlMzIoJmxiYy0+bHRlZHIsIExURURSX0VOQUJMRSk7CiAKLQkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgYW55IGRldGVjdGVkIGV2ZW50cyAqLwotCW91dF9iZTMyKCZsYmMtPmx0ZWlyLCBMVEVJUl9FTkFCTEUpOwotCiAJLyogU2V0IHRoZSBtb25pdG9yIHRpbWVvdXQgdmFsdWUgdG8gdGhlIG1heGltdW0gZm9yIGVycmF0dW0gQTAwMSAqLwogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAiZnNsLGVsYmMiKSkKIAkJY2xyc2V0Yml0c19iZTMyKCZsYmMtPmxiY3IsIExCQ1JfQk1ULCBMQkNSX0JNVFBTKTsKQEAgLTMyMiw2ICszMTksOSBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgYW55IGRldGVjdGVkIGV2ZW50cyAqLworCW91dF9iZTMyKCZmc2xfbGJjX2N0cmxfZGV2LT5yZWdzLT5sdGVpciwgTFRFSVJfRU5BQkxFKTsKKwogCXJldHVybiAwOwogCiBlcnI6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCmluZGV4IDViMjA2YTIuLmIzZmQwODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCkBAIC0yODMsMjMgKzI4MywyNCBAQAogI2lmZGVmIENPTkZJR19FNTAwCiBpbnQgZnNsX3Jpb19tY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmVudHJ5ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHJlYXNvbiA9IG1mc3ByKFNQUk5fTUNTUik7CisJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyByZWFzb247CiAKLQlpZiAocmVhc29uICYgTUNTUl9CVVNfUkJFUlIpIHsKLQkJcmVhc29uID0gaW5fYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19MVExFRENTUikpOwotCQlpZiAocmVhc29uICYgKFJJT19MVExFRENTUl9JRVIgfCBSSU9fTFRMRURDU1JfUFJUKSkgewotCQkJLyogQ2hlY2sgaWYgd2UgYXJlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGlzIGZhdWx0ICovCi0JCQllbnRyeSA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPm5pcCk7Ci0JCQlpZiAoZW50cnkpIHsKLQkJCQlwcl9kZWJ1ZygiUklPOiAlcyAtIE1DIEV4Y2VwdGlvbiBoYW5kbGVkXG4iLAotCQkJCQkgX19mdW5jX18pOwotCQkJCW91dF9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKSwKLQkJCQkJIDApOwotCQkJCXJlZ3MtPm1zciB8PSBNU1JfUkk7Ci0JCQkJcmVncy0+bmlwID0gZW50cnktPmZpeHVwOwotCQkJCXJldHVybiAxOwotCQkJfQorCWlmICghcmlvX3JlZ3Nfd2luKQorCQlyZXR1cm4gMDsKKworCXJlYXNvbiA9IGluX2JlMzIoKHUzMiAqKShyaW9fcmVnc193aW4gKyBSSU9fTFRMRURDU1IpKTsKKwlpZiAocmVhc29uICYgKFJJT19MVExFRENTUl9JRVIgfCBSSU9fTFRMRURDU1JfUFJUKSkgeworCQkvKiBDaGVjayBpZiB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMgZmF1bHQgKi8KKwkJZW50cnkgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5uaXApOworCQlpZiAoZW50cnkpIHsKKwkJCXByX2RlYnVnKCJSSU86ICVzIC0gTUMgRXhjZXB0aW9uIGhhbmRsZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCW91dF9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKSwKKwkJCQkgMCk7CisJCQlyZWdzLT5tc3IgfD0gTVNSX1JJOworCQkJcmVncy0+bmlwID0gZW50cnktPmZpeHVwOworCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggM2E4ZGU1Yi4uNThkN2E1MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CkBAIC0xNjQ4LDkgKzE2NDksOCBAQAogCQlyZXR1cm4gTk9fSVJROwogCX0KIAlpZiAodW5saWtlbHkobXBpYy0+cHJvdGVjdGVkICYmIHRlc3RfYml0KHNyYywgbXBpYy0+cHJvdGVjdGVkKSkpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHb3QgcHJvdGVjdGVkIHNvdXJjZSAlZCAhXG4iLAotCQkJICAgICAgIG1waWMtPm5hbWUsIChpbnQpc3JjKTsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORyAiJXM6IEdvdCBwcm90ZWN0ZWQgc291cmNlICVkICFcbiIsCisJCQkJICAgbXBpYy0+bmFtZSwgKGludClzcmMpOwogCQltcGljX2VvaShtcGljKTsKIAkJcmV0dXJuIE5PX0lSUTsKIAl9CkBAIC0xNjg4LDkgKzE2ODgsOCBAQAogCQlyZXR1cm4gTk9fSVJROwogCX0KIAlpZiAodW5saWtlbHkobXBpYy0+cHJvdGVjdGVkICYmIHRlc3RfYml0KHNyYywgbXBpYy0+cHJvdGVjdGVkKSkpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHb3QgcHJvdGVjdGVkIHNvdXJjZSAlZCAhXG4iLAotCQkJICAgICAgIG1waWMtPm5hbWUsIChpbnQpc3JjKTsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORyAiJXM6IEdvdCBwcm90ZWN0ZWQgc291cmNlICVkICFcbiIsCisJCQkJICAgbXBpYy0+bmFtZSwgKGludClzcmMpOwogCQlyZXR1cm4gTk9fSVJROwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCA5ZmFiMmFhLi5jMDNmZWY3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtODksNiArODksNyBAQAogCXNlbGVjdCBIQVZFX0dFVF9VU0VSX1BBR0VTX0ZBU1QKIAlzZWxlY3QgSEFWRV9BUkNIX01VVEVYX0NQVV9SRUxBWAogCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTCBpZiAhTUFSQ0hfRzUKKwlzZWxlY3QgSEFWRV9SQ1VfVEFCTEVfRlJFRSBpZiBTTVAKIAlzZWxlY3QgQVJDSF9JTkxJTkVfU1BJTl9UUllMT0NLCiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1NQSU5fVFJZTE9DS19CSAogCXNlbGVjdCBBUkNIX0lOTElORV9TUElOX0xPQ0sKQEAgLTU3OCw2ICs1NzksNyBAQAogCWRlZl9ib29sIHkKIAlwcm9tcHQgInMzOTAgZ3Vlc3Qgc3VwcG9ydCBmb3IgS1ZNIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gNjRCSVQgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFZJUlRVQUxJWkFUSU9OCiAJc2VsZWN0IFZJUlRJTwogCXNlbGVjdCBWSVJUSU9fUklORwogCXNlbGVjdCBWSVJUSU9fQ09OU09MRQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKaW5kZXggZjYzMTRhZi4uMzhlNzFlYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC0xNywxNSArMTcsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCi0jZGVmaW5lIGNoZWNrX3BndF9jYWNoZSgpCWRvIHt9IHdoaWxlICgwKQotCiB1bnNpZ25lZCBsb25nICpjcnN0X3RhYmxlX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CiB2b2lkIGNyc3RfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7Ci12b2lkIGNyc3RfdGFibGVfZnJlZV9yY3Uoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nICopOwogCiB1bnNpZ25lZCBsb25nICpwYWdlX3RhYmxlX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CiB2b2lkIHBhZ2VfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7Ci12b2lkIHBhZ2VfdGFibGVfZnJlZV9yY3Uoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nICopOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCit2b2lkIHBhZ2VfdGFibGVfZnJlZV9yY3Uoc3RydWN0IG1tdV9nYXRoZXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKK3ZvaWQgX190bGJfcmVtb3ZlX3RhYmxlKHZvaWQgKl90YWJsZSk7CisjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3RhYmxlKHVuc2lnbmVkIGxvbmcgKnMsIHVuc2lnbmVkIGxvbmcgdmFsLCBzaXplX3QgbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGU0ZWZhY2YuLjgwMWZiZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMjkzLDE5ICsyOTMsNiBAQAogICogc3dhcCBwdGUgaXMgMTAxMSBhbmQgMDAwMSwgMDAxMSwgMDEwMSwgMDExMSBhcmUgaW52YWxpZC4KICAqLwogCi0vKiBQYWdlIHN0YXR1cyB0YWJsZSBiaXRzIGZvciB2aXJ0dWFsaXphdGlvbiAqLwotI2RlZmluZSBSQ1BfQUNDX0JJVFMJMHhmMDAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgUkNQX0ZQX0JJVAkweDA4MDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfUENMX0JJVAkweDAwODAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfSFJfQklUCTB4MDA0MDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFJDUF9IQ19CSVQJMHgwMDIwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgUkNQX0dSX0JJVAkweDAwMDQwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfR0NfQklUCTB4MDAwMjAwMDAwMDAwMDAwMFVMCi0KLS8qIFVzZXIgZGlydHkgLyByZWZlcmVuY2VkIGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KLSNkZWZpbmUgS1ZNX1VSX0JJVAkweDAwMDA4MDAwMDAwMDAwMDBVTAotI2RlZmluZSBLVk1fVUNfQklUCTB4MDAwMDQwMDAwMDAwMDAwMFVMCi0KICNpZm5kZWYgX19zMzkweF9fCiAKIC8qIEJpdHMgaW4gdGhlIHNlZ21lbnQgdGFibGUgYWRkcmVzcy1zcGFjZS1jb250cm9sLWVsZW1lbnQgKi8KQEAgLTMyNSw2ICszMTIsMTkgQEAKICNkZWZpbmUgX1NFR01FTlRfRU5UUlkJCShfU0VHTUVOVF9FTlRSWV9QVEwpCiAjZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0VNUFRZCShfU0VHTUVOVF9FTlRSWV9JTlYpCiAKKy8qIFBhZ2Ugc3RhdHVzIHRhYmxlIGJpdHMgZm9yIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIFJDUF9BQ0NfQklUUwkweGYwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0ZQX0JJVAkweDA4MDAwMDAwVUwKKyNkZWZpbmUgUkNQX1BDTF9CSVQJMHgwMDgwMDAwMFVMCisjZGVmaW5lIFJDUF9IUl9CSVQJMHgwMDQwMDAwMFVMCisjZGVmaW5lIFJDUF9IQ19CSVQJMHgwMDIwMDAwMFVMCisjZGVmaW5lIFJDUF9HUl9CSVQJMHgwMDA0MDAwMFVMCisjZGVmaW5lIFJDUF9HQ19CSVQJMHgwMDAyMDAwMFVMCisKKy8qIFVzZXIgZGlydHkgLyByZWZlcmVuY2VkIGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KKyNkZWZpbmUgS1ZNX1VSX0JJVAkweDAwMDA4MDAwVUwKKyNkZWZpbmUgS1ZNX1VDX0JJVAkweDAwMDA0MDAwVUwKKwogI2Vsc2UgLyogX19zMzkweF9fICovCiAKIC8qIEJpdHMgaW4gdGhlIHNlZ21lbnQvcmVnaW9uIHRhYmxlIGFkZHJlc3Mtc3BhY2UtY29udHJvbC1lbGVtZW50ICovCkBAIC0zNjcsNiArMzY3LDE5IEBACiAjZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0xBUkdFCTB4NDAwCS8qIFNURS1mb3JtYXQgY29udHJvbCwgbGFyZ2UgcGFnZSAgICovCiAjZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0NPCTB4MTAwCS8qIGNoYW5nZS1yZWNvcmRpbmcgb3ZlcnJpZGUgICAqLwogCisvKiBQYWdlIHN0YXR1cyB0YWJsZSBiaXRzIGZvciB2aXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBSQ1BfQUNDX0JJVFMJMHhmMDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0ZQX0JJVAkweDA4MDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfUENMX0JJVAkweDAwODAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfSFJfQklUCTB4MDA0MDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFJDUF9IQ19CSVQJMHgwMDIwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0dSX0JJVAkweDAwMDQwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfR0NfQklUCTB4MDAwMjAwMDAwMDAwMDAwMFVMCisKKy8qIFVzZXIgZGlydHkgLyByZWZlcmVuY2VkIGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KKyNkZWZpbmUgS1ZNX1VSX0JJVAkweDAwMDA4MDAwMDAwMDAwMDBVTAorI2RlZmluZSBLVk1fVUNfQklUCTB4MDAwMDQwMDAwMDAwMDAwMFVMCisKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCmluZGV4IDM1MGU3ZWUuLjE1Yzk3NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaApAQCAtMTM5LDExMCArMTM5LDQ3IEBACiAJc3RydWN0IHNsaWJlIHNsaWJlW1FESU9fTUFYX0JVRkZFUlNfUEVSX1FdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDIwNDgpKSk7CiAKLS8qKgotICogc3RydWN0IHNiYWxfZmxhZ3MgLSBzdG9yYWdlIGJsb2NrIGFkZHJlc3MgbGlzdCBmbGFncwotICogQGxhc3Q6IGxhc3QgZW50cnkKLSAqIEBjb250OiBjb250aWd1b3VzIHN0b3JhZ2UKLSAqIEBmcmFnOiBmcmFnbWVudGF0aW9uCi0gKi8KLXN0cnVjdCBzYmFsX2ZsYWdzIHsKLQl1OAk6IDE7Ci0JdTggbGFzdCA6IDE7Ci0JdTggY29udCA6IDE7Ci0JdTgJOiAxOwotCXU4IGZyYWcgOiAyOwotCXU4CTogMjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2RlZmluZSBTQkFMX0VGTEFHU19MQVNUX0VOVFJZCQkweDQwCisjZGVmaW5lIFNCQUxfRUZMQUdTX0NPTlRJR1VPVVMJCTB4MjAKKyNkZWZpbmUgU0JBTF9FRkxBR1NfRklSU1RfRlJBRwkJMHgwNAorI2RlZmluZSBTQkFMX0VGTEFHU19NSURETEVfRlJBRwkJMHgwOAorI2RlZmluZSBTQkFMX0VGTEFHU19MQVNUX0ZSQUcJCTB4MGMKKyNkZWZpbmUgU0JBTF9FRkxBR1NfTUFTSwkJMHg2ZgogCi0jZGVmaW5lIFNCQUxfRkxBR1NfRklSU1RfRlJBRwkJMHgwNDAwMDAwMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1NfTUlERExFX0ZSQUcJCTB4MDgwMDAwMDBVTAotI2RlZmluZSBTQkFMX0ZMQUdTX0xBU1RfRlJBRwkJMHgwYzAwMDAwMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1NfTEFTVF9FTlRSWQkJMHg0MDAwMDAwMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1NfQ09OVElHVU9VUwkJMHgyMDAwMDAwMFVMCi0KLSNkZWZpbmUgU0JBTF9GTEFHUzBfREFUQV9DT05USU5VQVRJT04JMHgyMFVMCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9QQ0lfUkVRCQkweDQwCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9EQVRBX0NPTlRJTlVBVElPTgkweDIwCiAKIC8qIEF3ZXNvbWUgT3BlbkZDUCBleHRlbnNpb25zICovCi0jZGVmaW5lIFNCQUxfRkxBR1MwX1RZUEVfU1RBVFVTCQkweDAwVUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfVFlQRV9XUklURQkJMHgwOFVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX1RZUEVfUkVBRAkJMHgxMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX1RZUEVfV1JJVEVfUkVBRAkweDE4VUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfTU9SRV9TQkFMUwkJMHgwNFVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX0NPTU1BTkQJCTB4MDJVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9MQVNUX1NCQUwJCTB4MDBVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9PTkxZX1NCQUwJCVNCQUxfRkxBR1MwX0NPTU1BTkQKLSNkZWZpbmUgU0JBTF9GTEFHUzBfTUlERExFX1NCQUwJCVNCQUxfRkxBR1MwX01PUkVfU0JBTFMKLSNkZWZpbmUgU0JBTF9GTEFHUzBfRklSU1RfU0JBTCBTQkFMX0ZMQUdTMF9NT1JFX1NCQUxTIHwgU0JBTF9GTEFHUzBfQ09NTUFORAotI2RlZmluZSBTQkFMX0ZMQUdTMF9QQ0kJCQkweDQwCi0KLS8qKgotICogc3RydWN0IHNiYWxfc2JhbGZfMCAtIHNiYWwgZmxhZ3MgZm9yIHNiYWxlIDAKLSAqIEBwY2k6IFBDSSBpbmRpY2F0b3IKLSAqIEBjb250OiBkYXRhIGNvbnRpbnVhdGlvbgotICogQHNidHlwZTogc3RvcmFnZS1ibG9jayB0eXBlIChGQ1ApCi0gKi8KLXN0cnVjdCBzYmFsX3NiYWxmXzAgewotCXU4CSAgOiAxOwotCXU4IHBjaQkgIDogMTsKLQl1OCBjb250ICAgOiAxOwotCXU4IHNidHlwZSA6IDI7Ci0JdTgJICA6IDM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc2JhbF9zYmFsZl8xIC0gc2JhbCBmbGFncyBmb3Igc2JhbGUgMQotICogQGtleTogc3RvcmFnZSBrZXkKLSAqLwotc3RydWN0IHNiYWxfc2JhbGZfMSB7Ci0JdTggICAgIDogNDsKLQl1OCBrZXkgOiA0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qKgotICogc3RydWN0IHNiYWxfc2JhbGZfMTQgLSBzYmFsIGZsYWdzIGZvciBzYmFsZSAxNAotICogQGVycmlkeDogZXJyb3IgaW5kZXgKLSAqLwotc3RydWN0IHNiYWxfc2JhbGZfMTQgewotCXU4CSAgOiA0OwotCXU4IGVycmlkeCA6IDQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc2JhbF9zYmFsZl8xNSAtIHNiYWwgZmxhZ3MgZm9yIHNiYWxlIDE1Ci0gKiBAcmVhc29uOiByZWFzb24gZm9yIGVycm9yIHN0YXRlCi0gKi8KLXN0cnVjdCBzYmFsX3NiYWxmXzE1IHsKLQl1OCByZWFzb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoqCi0gKiB1bmlvbiBzYmFsX3NiYWxmIC0gc3RvcmFnZSBibG9jayBhZGRyZXNzIGxpc3QgZmxhZ3MKLSAqIEBpMDogc2JhbGYwCi0gKiBAaTE6IHNiYWxmMQotICogQGkxNDogc2JhbGYxNAotICogQGkxNTogc2JsYWYxNQotICogQHZhbHVlOiByYXcgdmFsdWUKLSAqLwotdW5pb24gc2JhbF9zYmFsZiB7Ci0Jc3RydWN0IHNiYWxfc2JhbGZfMCAgaTA7Ci0Jc3RydWN0IHNiYWxfc2JhbGZfMSAgaTE7Ci0Jc3RydWN0IHNiYWxfc2JhbGZfMTQgaTE0OwotCXN0cnVjdCBzYmFsX3NiYWxmXzE1IGkxNTsKLQl1OCB2YWx1ZTsKLX07CisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9UWVBFX1NUQVRVUwkweDAwCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFCQkweDA4CisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQJCTB4MTAKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEVfUkVBRAkweDE4CisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9NT1JFX1NCQUxTCQkweDA0CisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9DT01NQU5ECQkweDAyCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9MQVNUX1NCQUwJCTB4MDAKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX09OTFlfU0JBTAkJU0JBTF9TRkxBR1MwX0NPTU1BTkQKKyNkZWZpbmUgU0JBTF9TRkxBR1MwX01JRERMRV9TQkFMCVNCQUxfU0ZMQUdTMF9NT1JFX1NCQUxTCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9GSVJTVF9TQkFMIChTQkFMX1NGTEFHUzBfTU9SRV9TQkFMUyB8IFNCQUxfU0ZMQUdTMF9DT01NQU5EKQogCiAvKioKICAqIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50IC0gU0JBTCBlbnRyeQotICogQGZsYWdzOiBmbGFncworICogQGVmbGFnczogU0JBTCBlbnRyeSBmbGFncworICogQHNjb3VudDogU0JBTCBjb3VudAorICogQHNmbGFnczogd2hvbGUgU0JBTCBmbGFncwogICogQGxlbmd0aDogbGVuZ3RoCiAgKiBAYWRkcjogYWRkcmVzcwogKi8KIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50IHsKLQl1MzIgZmxhZ3M7CisJdTggZWZsYWdzOworCS8qIHByaXZhdGU6ICovCisJdTggcmVzMTsKKwkvKiBwdWJsaWM6ICovCisJdTggc2NvdW50OworCXU4IHNmbGFnczsKIAl1MzIgbGVuZ3RoOwogI2lmZGVmIENPTkZJR18zMkJJVAogCS8qIHByaXZhdGU6ICovCi0Jdm9pZCAqcmVzZXJ2ZWQ7CisJdm9pZCAqcmVzMjsKIAkvKiBwdWJsaWM6ICovCiAjZW5kaWYKIAl2b2lkICphZGRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYi5oCmluZGV4IDc3ZWVlNTQuLmM2ODdhMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGIuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiLmgKQEAgLTI2LDY3ICsyNiw2MCBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKIHN0cnVjdCBtbXVfZ2F0aGVyIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorCXN0cnVjdCBtbXVfdGFibGVfYmF0Y2ggKmJhdGNoOworI2VuZGlmCiAJdW5zaWduZWQgaW50IGZ1bGxtbTsKLQl1bnNpZ25lZCBpbnQgbnJfcHRlczsKLQl1bnNpZ25lZCBpbnQgbnJfcHhkczsKLQl1bnNpZ25lZCBpbnQgbWF4OwotCXZvaWQgKiphcnJheTsKLQl2b2lkICpsb2NhbFs4XTsKKwl1bnNpZ25lZCBpbnQgbmVlZF9mbHVzaDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9hbGxvY19wYWdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOLCAwKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorc3RydWN0IG1tdV90YWJsZV9iYXRjaCB7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJdW5zaWduZWQgaW50CQlucjsKKwl2b2lkCQkJKnRhYmxlc1swXTsKK307CiAKLQlpZiAoYWRkcikgewotCQl0bGItPmFycmF5ID0gKHZvaWQgKikgYWRkcjsKLQkJdGxiLT5tYXggPSBQQUdFX1NJWkUgLyBzaXplb2Yodm9pZCAqKTsKLQl9Ci19CisjZGVmaW5lIE1BWF9UQUJMRV9CQVRDSAkJXAorCSgoUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBtbXVfdGFibGVfYmF0Y2gpKSAvIHNpemVvZih2b2lkICopKQorCitleHRlcm4gdm9pZCB0bGJfdGFibGVfZmx1c2goc3RydWN0IG1tdV9nYXRoZXIgKnRsYik7CitleHRlcm4gdm9pZCB0bGJfcmVtb3ZlX3RhYmxlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHZvaWQgKnRhYmxlKTsKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2dhdGhlcl9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwKIAkJCQkgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgdW5zaWduZWQgaW50IGZ1bGxfbW1fZmx1c2gpCiB7CiAJdGxiLT5tbSA9IG1tOwotCXRsYi0+bWF4ID0gQVJSQVlfU0laRSh0bGItPmxvY2FsKTsKLQl0bGItPmFycmF5ID0gdGxiLT5sb2NhbDsKIAl0bGItPmZ1bGxtbSA9IGZ1bGxfbW1fZmx1c2g7CisJdGxiLT5uZWVkX2ZsdXNoID0gMDsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorCXRsYi0+YmF0Y2ggPSBOVUxMOworI2VuZGlmCiAJaWYgKHRsYi0+ZnVsbG1tKQogCQlfX3RsYl9mbHVzaF9tbShtbSk7Ci0JZWxzZQotCQlfX3RsYl9hbGxvY19wYWdlKHRsYik7Ci0JdGxiLT5ucl9wdGVzID0gMDsKLQl0bGItPm5yX3B4ZHMgPSB0bGItPm1heDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRsYl9mbHVzaF9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYikKIHsKLQlpZiAoIXRsYi0+ZnVsbG1tICYmICh0bGItPm5yX3B0ZXMgPiAwIHx8IHRsYi0+bnJfcHhkcyA8IHRsYi0+bWF4KSkKLQkJX190bGJfZmx1c2hfbW0odGxiLT5tbSk7Ci0Jd2hpbGUgKHRsYi0+bnJfcHRlcyA+IDApCi0JCXBhZ2VfdGFibGVfZnJlZV9yY3UodGxiLT5tbSwgdGxiLT5hcnJheVstLXRsYi0+bnJfcHRlc10pOwotCXdoaWxlICh0bGItPm5yX3B4ZHMgPCB0bGItPm1heCkKLQkJY3JzdF90YWJsZV9mcmVlX3JjdSh0bGItPm1tLCB0bGItPmFycmF5W3RsYi0+bnJfcHhkcysrXSk7CisJaWYgKCF0bGItPm5lZWRfZmx1c2gpCisJCXJldHVybjsKKwl0bGItPm5lZWRfZmx1c2ggPSAwOworCV9fdGxiX2ZsdXNoX21tKHRsYi0+bW0pOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCisJdGxiX3RhYmxlX2ZsdXNoKHRsYik7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRsYl9maW5pc2hfbW11KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsCiAJCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAl0bGJfZmx1c2hfbW11KHRsYik7Ci0KLQlyY3VfdGFibGVfZnJlZWxpc3RfZmluaXNoKCk7Ci0KLQkvKiBrZWVwIHRoZSBwYWdlIHRhYmxlIGNhY2hlIHdpdGhpbiBib3VuZHMgKi8KLQljaGVja19wZ3RfY2FjaGUoKTsKLQotCWlmICh0bGItPmFycmF5ICE9IHRsYi0+bG9jYWwpCi0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHRsYi0+YXJyYXksIDApOwogfQogCiAvKgpAQCAtMTEyLDEyICsxMDUsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcGd0YWJsZV90IHB0ZSwKIAkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JaWYgKCF0bGItPmZ1bGxtbSkgewotCQl0bGItPmFycmF5W3RsYi0+bnJfcHRlcysrXSA9IHB0ZTsKLQkJaWYgKHRsYi0+bnJfcHRlcyA+PSB0bGItPm5yX3B4ZHMpCi0JCQl0bGJfZmx1c2hfbW11KHRsYik7Ci0JfSBlbHNlCi0JCXBhZ2VfdGFibGVfZnJlZSh0bGItPm1tLCAodW5zaWduZWQgbG9uZyAqKSBwdGUpOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCisJaWYgKCF0bGItPmZ1bGxtbSkKKwkJcmV0dXJuIHBhZ2VfdGFibGVfZnJlZV9yY3UodGxiLCAodW5zaWduZWQgbG9uZyAqKSBwdGUpOworI2VuZGlmCisJcGFnZV90YWJsZV9mcmVlKHRsYi0+bW0sICh1bnNpZ25lZCBsb25nICopIHB0ZSk7CiB9CiAKIC8qCkBAIC0xMzMsMTIgKzEyNSwxMSBAQAogI2lmZGVmIF9fczM5MHhfXwogCWlmICh0bGItPm1tLT5jb250ZXh0LmFzY2VfbGltaXQgPD0gKDFVTCA8PCAzMSkpCiAJCXJldHVybjsKLQlpZiAoIXRsYi0+ZnVsbG1tKSB7Ci0JCXRsYi0+YXJyYXlbLS10bGItPm5yX3B4ZHNdID0gcG1kOwotCQlpZiAodGxiLT5ucl9wdGVzID49IHRsYi0+bnJfcHhkcykKLQkJCXRsYl9mbHVzaF9tbXUodGxiKTsKLQl9IGVsc2UKLQkJY3JzdF90YWJsZV9mcmVlKHRsYi0+bW0sICh1bnNpZ25lZCBsb25nICopIHBtZCk7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKKwlpZiAoIXRsYi0+ZnVsbG1tKQorCQlyZXR1cm4gdGxiX3JlbW92ZV90YWJsZSh0bGIsIHBtZCk7CisjZW5kaWYKKwljcnN0X3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcG1kKTsKICNlbmRpZgogfQogCkBAIC0xNTUsMTIgKzE0NiwxMSBAQAogI2lmZGVmIF9fczM5MHhfXwogCWlmICh0bGItPm1tLT5jb250ZXh0LmFzY2VfbGltaXQgPD0gKDFVTCA8PCA0MikpCiAJCXJldHVybjsKLQlpZiAoIXRsYi0+ZnVsbG1tKSB7Ci0JCXRsYi0+YXJyYXlbLS10bGItPm5yX3B4ZHNdID0gcHVkOwotCQlpZiAodGxiLT5ucl9wdGVzID49IHRsYi0+bnJfcHhkcykKLQkJCXRsYl9mbHVzaF9tbXUodGxiKTsKLQl9IGVsc2UKLQkJY3JzdF90YWJsZV9mcmVlKHRsYi0+bW0sICh1bnNpZ25lZCBsb25nICopIHB1ZCk7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKKwlpZiAoIXRsYi0+ZnVsbG1tKQorCQlyZXR1cm4gdGxiX3JlbW92ZV90YWJsZSh0bGIsIHB1ZCk7CisjZW5kaWYKKwljcnN0X3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcHVkKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCA1MjQyMGQyLi4xZDU1Yzk1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAJbWVtc2V0KCZwYXJtcy5vcnZhbHMsIDAsIHNpemVvZihwYXJtcy5vcnZhbHMpKTsKIAltZW1zZXQoJnBhcm1zLmFuZHZhbHMsIDB4ZmYsIHNpemVvZihwYXJtcy5hbmR2YWxzKSk7Ci0JcGFybXMub3J2YWxzW2NyXSA9IDEgPDwgYml0OworCXBhcm1zLm9ydmFsc1tjcl0gPSAxVUwgPDwgYml0OwogCW9uX2VhY2hfY3B1KHNtcF9jdGxfYml0X2NhbGxiYWNrLCAmcGFybXMsIDEpOwogfQogRVhQT1JUX1NZTUJPTChzbXBfY3RsX3NldF9iaXQpOwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKIAltZW1zZXQoJnBhcm1zLm9ydmFscywgMCwgc2l6ZW9mKHBhcm1zLm9ydmFscykpOwogCW1lbXNldCgmcGFybXMuYW5kdmFscywgMHhmZiwgc2l6ZW9mKHBhcm1zLmFuZHZhbHMpKTsKLQlwYXJtcy5hbmR2YWxzW2NyXSA9IH4oMUwgPDwgYml0KTsKKwlwYXJtcy5hbmR2YWxzW2NyXSA9IH4oMVVMIDw8IGJpdCk7CiAJb25fZWFjaF9jcHUoc21wX2N0bF9iaXRfY2FsbGJhY2ssICZwYXJtcywgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKHNtcF9jdGxfY2xlYXJfYml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCAzMGNhODVjLi42NzM0NWFlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC03MzEsNiArNzMxLDcgQEAKIAl9CiAJbWVtY3B5KGZhY2lsaXRpZXMsIFMzOTBfbG93Y29yZS5zdGZsZV9mYWNfbGlzdCwgMTYpOwogCWZhY2lsaXRpZXNbMF0gJj0gMHhmZjAwZmZmM2Y0N2MwMDAwVUxMOworCWZhY2lsaXRpZXNbMV0gJj0gMHgyMDFjMDAwMDAwMDAwMDAwVUxMOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3NpZTY0YS5TIGIvYXJjaC9zMzkwL2t2bS9zaWU2NGEuUwppbmRleCBhYjBlMDQxLi41ZmFhMWIxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3NpZTY0YS5TCisrKyBiL2FyY2gvczM5MC9rdm0vc2llNjRhLlMKQEAgLTkzLDQgKzkzLDYgQEAKIAogCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCiAJLnF1YWQJc2llX2luc3Qsc2llX2VycgorCS5xdWFkCXNpZV9leGl0LHNpZV9lcnIKKwkucXVhZAlzaWVfcmVlbnRlcixzaWVfZXJyCiAJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwppbmRleCBiMDk3NjNmLi4zN2EyM2MyMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BndGFibGUuYworKysgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCkBAIC0yNCw5NCArMjQsMTIgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAotc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCB7Ci0Jc3RydWN0IHJjdV9oZWFkIHJjdTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQl1bnNpZ25lZCBpbnQgcGd0X2luZGV4OwotCXVuc2lnbmVkIGludCBjcnN0X2luZGV4OwotCXVuc2lnbmVkIGxvbmcgKnRhYmxlWzBdOwotfTsKLQotI2RlZmluZSBSQ1VfRlJFRUxJU1RfU0laRSBcCi0JKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCkpIFwKLQkgIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqLCByY3VfdGFibGVfZnJlZWxpc3QpOwotCi1zdGF0aWMgdm9pZCBfX3BhZ2VfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqdGFibGUpOwotCi1zdGF0aWMgc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqcmN1X3RhYmxlX2ZyZWVsaXN0X2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICoqYmF0Y2hwID0gJl9fZ2V0X2NwdV92YXIocmN1X3RhYmxlX2ZyZWVsaXN0KTsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaCA9ICpiYXRjaHA7Ci0KLQlpZiAoYmF0Y2gpCi0JCXJldHVybiBiYXRjaDsKLQliYXRjaCA9IChzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKLQlpZiAoYmF0Y2gpIHsKLQkJYmF0Y2gtPm1tID0gbW07Ci0JCWJhdGNoLT5wZ3RfaW5kZXggPSAwOwotCQliYXRjaC0+Y3JzdF9pbmRleCA9IFJDVV9GUkVFTElTVF9TSVpFOwotCQkqYmF0Y2hwID0gYmF0Y2g7Ci0JfQotCXJldHVybiBiYXRjaDsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3RhYmxlX2ZyZWVsaXN0X2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaCA9Ci0JCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0LCByY3UpOwotCi0Jd2hpbGUgKGJhdGNoLT5wZ3RfaW5kZXggPiAwKQotCQlfX3BhZ2VfdGFibGVfZnJlZShiYXRjaC0+bW0sIGJhdGNoLT50YWJsZVstLWJhdGNoLT5wZ3RfaW5kZXhdKTsKLQl3aGlsZSAoYmF0Y2gtPmNyc3RfaW5kZXggPCBSQ1VfRlJFRUxJU1RfU0laRSkKLQkJY3JzdF90YWJsZV9mcmVlKGJhdGNoLT5tbSwgYmF0Y2gtPnRhYmxlW2JhdGNoLT5jcnN0X2luZGV4KytdKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJhdGNoKTsKLX0KLQotdm9pZCByY3VfdGFibGVfZnJlZWxpc3RfZmluaXNoKHZvaWQpCi17Ci0Jc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqKmJhdGNocCA9ICZnZXRfY3B1X3ZhcihyY3VfdGFibGVfZnJlZWxpc3QpOwotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKmJhdGNoID0gKmJhdGNocDsKLQotCWlmICghYmF0Y2gpCi0JCWdvdG8gb3V0OwotCWNhbGxfcmN1KCZiYXRjaC0+cmN1LCByY3VfdGFibGVfZnJlZWxpc3RfY2FsbGJhY2spOwotCSpiYXRjaHAgPSBOVUxMOwotb3V0OgotCXB1dF9jcHVfdmFyKHJjdV90YWJsZV9mcmVlbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNtcF9zeW5jKHZvaWQgKmFyZykKLXsKLX0KLQogI2lmbmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgQUxMT0NfT1JERVIJMQotI2RlZmluZSBUQUJMRVNfUEVSX1BBR0UJNAotI2RlZmluZSBGUkFHX01BU0sJMTVVTAotI2RlZmluZSBTRUNPTkRfSEFMVkVTCTEwVUwKLQotdm9pZCBjbGVhcl90YWJsZV9wZ3N0ZXModW5zaWduZWQgbG9uZyAqdGFibGUpCi17Ci0JY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRS80KTsKLQltZW1zZXQodGFibGUgKyAyNTYsIDAsIFBBR0VfU0laRS80KTsKLQljbGVhcl90YWJsZSh0YWJsZSArIDUxMiwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFLzQpOwotCW1lbXNldCh0YWJsZSArIDc2OCwgMCwgUEFHRV9TSVpFLzQpOwotfQotCisjZGVmaW5lIEZSQUdfTUFTSwkweDBmCiAjZWxzZQogI2RlZmluZSBBTExPQ19PUkRFUgkyCi0jZGVmaW5lIFRBQkxFU19QRVJfUEFHRQkyCi0jZGVmaW5lIEZSQUdfTUFTSwkzVUwKLSNkZWZpbmUgU0VDT05EX0hBTFZFUwkyVUwKLQotdm9pZCBjbGVhcl90YWJsZV9wZ3N0ZXModW5zaWduZWQgbG9uZyAqdGFibGUpCi17Ci0JY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRS8yKTsKLQltZW1zZXQodGFibGUgKyAyNTYsIDAsIFBBR0VfU0laRS8yKTsKLX0KLQorI2RlZmluZSBGUkFHX01BU0sJMHgwMwogI2VuZGlmCiAKIHVuc2lnbmVkIGxvbmcgVk1BTExPQ19TVEFSVCA9IFZNQUxMT0NfRU5EIC0gVk1BTExPQ19TSVpFOwpAQCAtMTQwLDI5ICs1OCw2IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGFibGUsIEFMTE9DX09SREVSKTsKIH0KIAotdm9pZCBjcnN0X3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaDsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA8IDIgJiYKLQkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgewotCQljcnN0X3RhYmxlX2ZyZWUobW0sIHRhYmxlKTsKLQkJZ290byBvdXQ7Ci0JfQotCWJhdGNoID0gcmN1X3RhYmxlX2ZyZWVsaXN0X2dldChtbSk7Ci0JaWYgKCFiYXRjaCkgewotCQlzbXBfY2FsbF9mdW5jdGlvbihzbXBfc3luYywgTlVMTCwgMSk7Ci0JCWNyc3RfdGFibGVfZnJlZShtbSwgdGFibGUpOwotCQlnb3RvIG91dDsKLQl9Ci0JYmF0Y2gtPnRhYmxlWy0tYmF0Y2gtPmNyc3RfaW5kZXhdID0gdGFibGU7Ci0JaWYgKGJhdGNoLT5wZ3RfaW5kZXggPj0gYmF0Y2gtPmNyc3RfaW5kZXgpCi0JCXJjdV90YWJsZV9mcmVlbGlzdF9maW5pc2goKTsKLW91dDoKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCiAjaWZkZWYgQ09ORklHXzY0QklUCiBpbnQgY3JzdF90YWJsZV91cGdyYWRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGxpbWl0KQogewpAQCAtMjM4LDEyNCArMTMzLDE3NSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0b21pY194b3JfYml0cyhhdG9taWNfdCAqdiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3OworCisJZG8geworCQlvbGQgPSBhdG9taWNfcmVhZCh2KTsKKwkJbmV3ID0gb2xkIF4gYml0czsKKwl9IHdoaWxlIChhdG9taWNfY21weGNoZyh2LCBvbGQsIG5ldykgIT0gb2xkKTsKKwlyZXR1cm4gbmV3OworfQorCiAvKgogICogcGFnZSB0YWJsZSBlbnRyeSBhbGxvY2F0aW9uL2ZyZWUgcm91dGluZXMuCiAgKi8KKyNpZmRlZiBDT05GSUdfUEdTVEUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqcGFnZV90YWJsZV9hbGxvY19wZ3N0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nICp0YWJsZTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgMyk7CisJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7CisJY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRS8yKTsKKwljbGVhcl90YWJsZSh0YWJsZSArIFBUUlNfUEVSX1BURSwgMCwgUEFHRV9TSVpFLzIpOworCXJldHVybiB0YWJsZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBhZ2VfdGFibGVfZnJlZV9wZ3N0ZSh1bnNpZ25lZCBsb25nICp0YWJsZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXBhZ2UgPSBwZm5fdG9fcGFnZShfX3BhKHRhYmxlKSA+PiBQQUdFX1NISUZUKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKKwlfX2ZyZWVfcGFnZShwYWdlKTsKK30KKyNlbmRpZgorCiB1bnNpZ25lZCBsb25nICpwYWdlX3RhYmxlX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgKnRhYmxlOwotCXVuc2lnbmVkIGxvbmcgYml0czsKKwl1bnNpZ25lZCBpbnQgbWFzaywgYml0OwogCi0JYml0cyA9IChtbS0+Y29udGV4dC5oYXNfcGdzdGUpID8gM1VMIDogMVVMOworI2lmZGVmIENPTkZJR19QR1NURQorCWlmIChtbV9oYXNfcGdzdGUobW0pKQorCQlyZXR1cm4gcGFnZV90YWJsZV9hbGxvY19wZ3N0ZShtbSk7CisjZW5kaWYKKwkvKiBBbGxvY2F0ZSBmcmFnbWVudHMgb2YgYSA0SyBwYWdlIGFzIDFLLzJLIHBhZ2UgdGFibGUgKi8KIAlzcGluX2xvY2tfYmgoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7Ci0JcGFnZSA9IE5VTEw7CisJbWFzayA9IEZSQUdfTUFTSzsKIAlpZiAoIWxpc3RfZW1wdHkoJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCkpIHsKIAkJcGFnZSA9IGxpc3RfZmlyc3RfZW50cnkoJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCwKIAkJCQkJc3RydWN0IHBhZ2UsIGxydSk7Ci0JCWlmICgocGFnZS0+ZmxhZ3MgJiBGUkFHX01BU0spID09ICgoMVVMIDw8IFRBQkxFU19QRVJfUEFHRSkgLSAxKSkKLQkJCXBhZ2UgPSBOVUxMOworCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKKwkJbWFzayA9IGF0b21pY19yZWFkKCZwYWdlLT5fbWFwY291bnQpOworCQltYXNrID0gbWFzayB8IChtYXNrID4+IDQpOwogCX0KLQlpZiAoIXBhZ2UpIHsKKwlpZiAoKG1hc2sgJiBGUkFHX01BU0spID09IEZSQUdfTUFTSykgewogCQlzcGluX3VubG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKIAkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwogCQlpZiAoIXBhZ2UpCiAJCQlyZXR1cm4gTlVMTDsKIAkJcGd0YWJsZV9wYWdlX2N0b3IocGFnZSk7Ci0JCXBhZ2UtPmZsYWdzICY9IH5GUkFHX01BU0s7CisJCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgMSk7CiAJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgcGFnZV90b19waHlzKHBhZ2UpOwotCQlpZiAobW0tPmNvbnRleHQuaGFzX3Bnc3RlKQotCQkJY2xlYXJfdGFibGVfcGdzdGVzKHRhYmxlKTsKLQkJZWxzZQotCQkJY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRSk7CisJCWNsZWFyX3RhYmxlKHRhYmxlLCBfUEFHRV9UWVBFX0VNUFRZLCBQQUdFX1NJWkUpOwogCQlzcGluX2xvY2tfYmgoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7CiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpOworCX0gZWxzZSB7CisJCWZvciAoYml0ID0gMTsgbWFzayAmIGJpdDsgYml0IDw8PSAxKQorCQkJdGFibGUgKz0gUFRSU19QRVJfUFRFOworCQltYXNrID0gYXRvbWljX3hvcl9iaXRzKCZwYWdlLT5fbWFwY291bnQsIGJpdCk7CisJCWlmICgobWFzayAmIEZSQUdfTUFTSykgPT0gRlJBR19NQVNLKQorCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CiAJfQotCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgcGFnZV90b19waHlzKHBhZ2UpOwotCXdoaWxlIChwYWdlLT5mbGFncyAmIGJpdHMpIHsKLQkJdGFibGUgKz0gMjU2OwotCQliaXRzIDw8PSAxOwotCX0KLQlwYWdlLT5mbGFncyB8PSBiaXRzOwotCWlmICgocGFnZS0+ZmxhZ3MgJiBGUkFHX01BU0spID09ICgoMVVMIDw8IFRBQkxFU19QRVJfUEFHRSkgLSAxKSkKLQkJbGlzdF9tb3ZlX3RhaWwoJnBhZ2UtPmxydSwgJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7CiAJcmV0dXJuIHRhYmxlOwogfQogCi1zdGF0aWMgdm9pZCBfX3BhZ2VfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqdGFibGUpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBiaXRzOwotCi0JYml0cyA9ICgodW5zaWduZWQgbG9uZykgdGFibGUpICYgMTU7Ci0JdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSgoKHVuc2lnbmVkIGxvbmcpIHRhYmxlKSBeIGJpdHMpOwotCXBhZ2UgPSBwZm5fdG9fcGFnZShfX3BhKHRhYmxlKSA+PiBQQUdFX1NISUZUKTsKLQlwYWdlLT5mbGFncyBePSBiaXRzOwotCWlmICghKHBhZ2UtPmZsYWdzICYgRlJBR19NQVNLKSkgewotCQlwZ3RhYmxlX3BhZ2VfZHRvcihwYWdlKTsKLQkJX19mcmVlX3BhZ2UocGFnZSk7Ci0JfQotfQotCiB2b2lkIHBhZ2VfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqdGFibGUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBiaXRzOworCXVuc2lnbmVkIGludCBiaXQsIG1hc2s7CiAKLQliaXRzID0gKG1tLT5jb250ZXh0Lmhhc19wZ3N0ZSkgPyAzVUwgOiAxVUw7Ci0JYml0cyA8PD0gKF9fcGEodGFibGUpICYgKFBBR0VfU0laRSAtIDEpKSAvIDI1NiAvIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyNpZmRlZiBDT05GSUdfUEdTVEUKKwlpZiAobW1faGFzX3Bnc3RlKG1tKSkKKwkJcmV0dXJuIHBhZ2VfdGFibGVfZnJlZV9wZ3N0ZSh0YWJsZSk7CisjZW5kaWYKKwkvKiBGcmVlIDFLLzJLIHBhZ2UgdGFibGUgZnJhZ21lbnQgb2YgYSA0SyBwYWdlICovCiAJcGFnZSA9IHBmbl90b19wYWdlKF9fcGEodGFibGUpID4+IFBBR0VfU0hJRlQpOworCWJpdCA9IDEgPDwgKChfX3BhKHRhYmxlKSAmIH5QQUdFX01BU0spLyhQVFJTX1BFUl9QVEUqc2l6ZW9mKHB0ZV90KSkpOwogCXNwaW5fbG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKLQlwYWdlLT5mbGFncyBePSBiaXRzOwotCWlmIChwYWdlLT5mbGFncyAmIEZSQUdfTUFTSykgewotCQkvKiBQYWdlIG5vdyBoYXMgc29tZSBmcmVlIHBndGFibGUgZnJhZ21lbnRzLiAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJnBhZ2UtPmxydSkpCi0JCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCk7Ci0JCXBhZ2UgPSBOVUxMOwotCX0gZWxzZQotCQkvKiBBbGwgZnJhZ21lbnRzIG9mIHRoZSA0SyBwYWdlIGhhdmUgYmVlbiBmcmVlZC4gKi8KKwlpZiAoKGF0b21pY19yZWFkKCZwYWdlLT5fbWFwY291bnQpICYgRlJBR19NQVNLKSAhPSBGUkFHX01BU0spCiAJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCW1hc2sgPSBhdG9taWNfeG9yX2JpdHMoJnBhZ2UtPl9tYXBjb3VudCwgYml0KTsKKwlpZiAobWFzayAmIEZSQUdfTUFTSykKKwkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7Ci0JaWYgKHBhZ2UpIHsKKwlpZiAobWFzayA9PSAwKSB7CiAJCXBndGFibGVfcGFnZV9kdG9yKHBhZ2UpOworCQlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKIAkJX19mcmVlX3BhZ2UocGFnZSk7CiAJfQogfQogCi12b2lkIHBhZ2VfdGFibGVfZnJlZV9yY3Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQotewotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKmJhdGNoOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgYml0czsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQogCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpIDwgMiAmJgotCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sobW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKSB7Ci0JCXBhZ2VfdGFibGVfZnJlZShtbSwgdGFibGUpOwotCQlnb3RvIG91dDsKK3N0YXRpYyB2b2lkIF9fcGFnZV90YWJsZV9mcmVlX3JjdSh2b2lkICp0YWJsZSwgdW5zaWduZWQgYml0KQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisjaWZkZWYgQ09ORklHX1BHU1RFCisJaWYgKGJpdCA9PSBGUkFHX01BU0spCisJCXJldHVybiBwYWdlX3RhYmxlX2ZyZWVfcGdzdGUodGFibGUpOworI2VuZGlmCisJLyogRnJlZSAxSy8ySyBwYWdlIHRhYmxlIGZyYWdtZW50IG9mIGEgNEsgcGFnZSAqLworCXBhZ2UgPSBwZm5fdG9fcGFnZShfX3BhKHRhYmxlKSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoYXRvbWljX3hvcl9iaXRzKCZwYWdlLT5fbWFwY291bnQsIGJpdCkgPT0gMCkgeworCQlwZ3RhYmxlX3BhZ2VfZHRvcihwYWdlKTsKKwkJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAtMSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOwogCX0KLQliYXRjaCA9IHJjdV90YWJsZV9mcmVlbGlzdF9nZXQobW0pOwotCWlmICghYmF0Y2gpIHsKLQkJc21wX2NhbGxfZnVuY3Rpb24oc21wX3N5bmMsIE5VTEwsIDEpOwotCQlwYWdlX3RhYmxlX2ZyZWUobW0sIHRhYmxlKTsKLQkJZ290byBvdXQ7Cit9CisKK3ZvaWQgcGFnZV90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBpbnQgYml0LCBtYXNrOworCisJbW0gPSB0bGItPm1tOworI2lmZGVmIENPTkZJR19QR1NURQorCWlmIChtbV9oYXNfcGdzdGUobW0pKSB7CisJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgKF9fcGEodGFibGUpIHwgRlJBR19NQVNLKTsKKwkJdGxiX3JlbW92ZV90YWJsZSh0bGIsIHRhYmxlKTsKKwkJcmV0dXJuOwogCX0KLQliaXRzID0gKG1tLT5jb250ZXh0Lmhhc19wZ3N0ZSkgPyAzVUwgOiAxVUw7Ci0JYml0cyA8PD0gKF9fcGEodGFibGUpICYgKFBBR0VfU0laRSAtIDEpKSAvIDI1NiAvIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyNlbmRpZgorCWJpdCA9IDEgPDwgKChfX3BhKHRhYmxlKSAmIH5QQUdFX01BU0spIC8gKFBUUlNfUEVSX1BURSpzaXplb2YocHRlX3QpKSk7CiAJcGFnZSA9IHBmbl90b19wYWdlKF9fcGEodGFibGUpID4+IFBBR0VfU0hJRlQpOwogCXNwaW5fbG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKLQkvKiBEZWxheWVkIGZyZWVpbmcgd2l0aCByY3UgcHJldmVudHMgcmV1c2Ugb2YgcGd0YWJsZSBmcmFnbWVudHMgKi8KLQlsaXN0X2RlbF9pbml0KCZwYWdlLT5scnUpOworCWlmICgoYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgJiBGUkFHX01BU0spICE9IEZSQUdfTUFTSykKKwkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJbWFzayA9IGF0b21pY194b3JfYml0cygmcGFnZS0+X21hcGNvdW50LCBiaXQgfCAoYml0IDw8IDQpKTsKKwlpZiAobWFzayAmIEZSQUdfTUFTSykKKwkJbGlzdF9hZGRfdGFpbCgmcGFnZS0+bHJ1LCAmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKLQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopKCgodW5zaWduZWQgbG9uZykgdGFibGUpIHwgYml0cyk7Ci0JYmF0Y2gtPnRhYmxlW2JhdGNoLT5wZ3RfaW5kZXgrK10gPSB0YWJsZTsKLQlpZiAoYmF0Y2gtPnBndF9pbmRleCA+PSBiYXRjaC0+Y3JzdF9pbmRleCkKLQkJcmN1X3RhYmxlX2ZyZWVsaXN0X2ZpbmlzaCgpOwotb3V0OgotCXByZWVtcHRfZW5hYmxlKCk7CisJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSAoX19wYSh0YWJsZSkgfCAoYml0IDw8IDQpKTsKKwl0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgdGFibGUpOwogfQogCit2b2lkIF9fdGxiX3JlbW92ZV90YWJsZSh2b2lkICpfdGFibGUpCit7CisJdm9pZCAqdGFibGUgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykgX3RhYmxlICYgUEFHRV9NQVNLKTsKKwl1bnNpZ25lZCB0eXBlID0gKHVuc2lnbmVkIGxvbmcpIF90YWJsZSAmIH5QQUdFX01BU0s7CisKKwlpZiAodHlwZSkKKwkJX19wYWdlX3RhYmxlX2ZyZWVfcmN1KHRhYmxlLCB0eXBlKTsKKwllbHNlCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHRhYmxlLCBBTExPQ19PUkRFUik7Cit9CisKKyNlbmRpZgorCiAvKgogICogc3dpdGNoIG9uIHBnc3RlcyBmb3IgaXRzIHVzZXJzcGFjZSBwcm9jZXNzIChmb3Iga3ZtKQogICovCkBAIC0zNjksNyArMzE1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBEbyB3ZSBoYXZlIHBnc3Rlcz8gaWYgeWVzLCB3ZSBhcmUgZG9uZSAqLwotCWlmICh0c2stPm1tLT5jb250ZXh0Lmhhc19wZ3N0ZSkKKwlpZiAobW1faGFzX3Bnc3RlKHRzay0+bW0pKQogCQlyZXR1cm4gMDsKIAogCS8qIGxldHMgY2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gcmVwbGFjZSB0aGUgbW0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvaW5pdC5jCmluZGV4IDU5OTVlOWIuLjBlMzU4YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMKKysrIGIvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSAiaHdzYW1wbGVyLmgiCiAKLSNkZWZpbmUgREVGQVVMVF9JTlRFUlZBTAk0MDk2CisjZGVmaW5lIERFRkFVTFRfSU5URVJWQUwJNDEyNzUxOAogCiAjZGVmaW5lIERFRkFVTFRfU0RCVF9CTE9DS1MJMQogI2RlZmluZSBERUZBVUxUX1NEQl9CTE9DS1MJNTExCkBAIC0xNTEsNiArMTUxLDEyIEBACiAJaWYgKG9wcm9maWxlX21heF9pbnRlcnZhbCA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIFRoZSBpbml0aWFsIHZhbHVlIHNob3VsZCBiZSBzYW5lICovCisJaWYgKG9wcm9maWxlX2h3X2ludGVydmFsIDwgb3Byb2ZpbGVfbWluX2ludGVydmFsKQorCQlvcHJvZmlsZV9od19pbnRlcnZhbCA9IG9wcm9maWxlX21pbl9pbnRlcnZhbDsKKwlpZiAob3Byb2ZpbGVfaHdfaW50ZXJ2YWwgPiBvcHJvZmlsZV9tYXhfaW50ZXJ2YWwpCisJCW9wcm9maWxlX2h3X2ludGVydmFsID0gb3Byb2ZpbGVfbWF4X2ludGVydmFsOworCiAJaWYgKG9wcm9maWxlX3RpbWVyX2luaXQob3BzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA3NDQ5NWE1Li5iYmRlYjQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xNjEsNyArMTYxLDcgQEAKIAogY29uZmlnIE5PX0lPUE9SVAogCWRlZl9ib29sICFQQ0kKLQlkZXBlbmRzIG9uICFTSF9DQVlNQU4gJiYgIVNIX1NINDIwMl9NSUNST0RFVgorCWRlcGVuZHMgb24gIVNIX0NBWU1BTiAmJiAhU0hfU0g0MjAyX01JQ1JPREVWICYmICFTSF9TSE1JTgogCiBjb25maWcgSU9fVFJBUFBFRAogCWJvb2wKQEAgLTM0OCw2ICszNDgsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCisJc2VsZWN0IFVTQl9PSENJX1NIIGlmIFVTQl9PSENJX0hDRAogCWhlbHAKIAkgIFNlbGVjdCBTSDc3MjAgaWYgeW91IGhhdmUgYSBTSDMtRFNQIFNINzcyMCBDUFUuCiAKQEAgLTM1Nyw2ICszNTgsNyBAQAogCXNlbGVjdCBDUFVfSEFTX0RTUAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCiAJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCisJc2VsZWN0IFVTQl9PSENJX1NIIGlmIFVTQl9PSENJX0hDRAogCWhlbHAKIAkgIFNlbGVjdCBTSDc3MjEgaWYgeW91IGhhdmUgYSBTSDMtRFNQIFNINzcyMSBDUFUuCiAKQEAgLTQ0MCw2ICs0NDIsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g3NzYzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINEEKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzc2MyBpZiB5b3UgaGF2ZSBhIFNINEEgU0g3NzYzKFI1Uzc3NjMxKSBDUFUuCiAKQEAgLTQ2Nyw3ICs0NzAsOSBAQAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCBpZiBTTVAKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCisJc2VsZWN0IFVTQl9FSENJX1NIIGlmIFVTQl9FSENJX0hDRAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0hYMwogCWJvb2wgIlN1cHBvcnQgU0gtWDMgcHJvY2Vzc29yIgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCmluZGV4IDYxOGJkNTYuLjk2OTQyMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKQEAgLTM1OSwzNyArMzU5LDMxIEBACiAJLnByaXYJCT0gJmNhbWVyYV9pbmZvLAogfTsKIAotc3RhdGljIHZvaWQgZHVtbXlfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci19CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2FtZXJhX2RldmljZTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2FtZXJhX2RldmljZSA9IHsKLQkubmFtZQkJPSAic29jX2NhbWVyYV9wbGF0Zm9ybSIsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmNhbWVyYV9pbmZvLAotCQkucmVsZWFzZQk9IGR1bW15X3JlbGVhc2UsCi0JfSwKLX07CitzdGF0aWMgdm9pZCBhcDMyNXJ4YV9jYW1lcmFfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc29jX2NhbWVyYV9wbGF0Zm9ybV9yZWxlYXNlKCZjYW1lcmFfZGV2aWNlKTsKK30KIAogc3RhdGljIGludCBhcDMyNXJ4YV9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGljbCAhPSAmY2FtZXJhX2xpbmsgfHwgY2FtZXJhX3Byb2JlKCkgPD0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaW50IHJldCA9IHNvY19jYW1lcmFfcGxhdGZvcm1fYWRkKGljbCwgZGV2LCAmY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rLAorCQkJCQkgIGFwMzI1cnhhX2NhbWVyYV9yZWxlYXNlLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCWNhbWVyYV9pbmZvLmRldiA9IGRldjsKKwlyZXQgPSBjYW1lcmFfcHJvYmUoKTsKKwlpZiAocmV0IDwgMCkKKwkJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNsLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOwogCi0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY2FtZXJhX2RldmljZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYXAzMjVyeGFfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wpCiB7Ci0JaWYgKGljbCAhPSAmY2FtZXJhX2xpbmspCi0JCXJldHVybjsKLQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZjYW1lcmFfZGV2aWNlKTsKLQltZW1zZXQoJmNhbWVyYV9kZXZpY2UuZGV2LmtvYmosIDAsCi0JICAgICAgIHNpemVvZihjYW1lcmFfZGV2aWNlLmRldi5rb2JqKSk7CisJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNsLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOwogfQogI2VuZGlmIC8qIENPTkZJR19JMkMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCmluZGV4IGJiMTNkMGUuLjUxM2NiMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3I4YTY2NTk3Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3JlbmVzYXNfdXNiaHMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHNjMjAwNy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KQEAgLTIzMiw2ICsyMzMsNTIgQEAKIAkucmVzb3VyY2UJPSB1c2IxX2NvbW1vbl9yZXNvdXJjZXMsCiB9OwogCisvKgorICogVVNCSFMKKyAqLworc3RhdGljIGludCB1c2Joc19nZXRfaWQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJT19QVEIzKTsKK30KKworc3RhdGljIHN0cnVjdCByZW5lc2FzX3VzYmhzX3BsYXRmb3JtX2luZm8gdXNiaHNfaW5mbyA9IHsKKwkucGxhdGZvcm1fY2FsbGJhY2sgPSB7CisJCS5nZXRfaWQJCT0gdXNiaHNfZ2V0X2lkLAorCX0sCisJLmRyaXZlcl9wYXJhbSA9IHsKKwkJLmJ1c3dhaXRfYndhaXQJCT0gNCwKKwkJLmRldGVjdGlvbl9kZWxheQk9IDUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiaHNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGE0ZDkwMDAwLAorCQkuZW5kCT0gMHhhNGQ5MDEyNCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA2NiwKKwkJLmVuZAk9IDY2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdXNiaHNfZGV2aWNlID0geworCS5uYW1lCT0gInJlbmVzYXNfdXNiaHMiLAorCS5pZAk9IDEsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9IE5VTEwsICAgICAgICAgLyogIG5vdCB1c2UgZG1hICovCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2Joc19pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVzYmhzX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gdXNiaHNfcmVzb3VyY2VzLAorCS5hcmNoZGF0YSA9IHsKKwkJLmh3YmxrX2lkID0gSFdCTEtfVVNCMSwKKwl9LAorfTsKKwogLyogTENEQyAqLwogY29uc3Qgc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgZWNvdmVjX2xjZF9tb2Rlc1tdID0gewogCXsKQEAgLTg4NSw2ICs5MzIsOSBAQAogCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNoX21tY2lmX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gc2hfbW1jaWZfcmVzb3VyY2VzLAorCS5hcmNoZGF0YSA9IHsKKwkJLmh3YmxrX2lkID0gSFdCTEtfTU1DLAorCX0sCiB9OwogI2VuZGlmCiAKQEAgLTg5NCw2ICs5NDQsNyBAQAogCSZzaF9ldGhfZGV2aWNlLAogCSZ1c2IwX2hvc3RfZGV2aWNlLAogCSZ1c2IxX2NvbW1vbl9kZXZpY2UsCisJJnVzYmhzX2RldmljZSwKIAkmbGNkY19kZXZpY2UsCiAJJmNldTBfZGV2aWNlLAogCSZjZXUxX2RldmljZSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNzgwZTA4My4uMjNiYzg0OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTI3LDggKzI3LDYgQEAKIAkJCSQoQ09ORklHX0JPT1RfTElOS19PRkZTRVQpXScpCiBlbmRpZgogCi1MSUJHQ0MJOj0gJChzaGVsbCAkKENDKSAkKEtCVUlMRF9DRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQotCiBpZmVxICgkKENPTkZJR19NQ09VTlQpLHkpCiBPUklHX0NGTEFHUyA6PSAkKEtCVUlMRF9DRkxBR1MpCiBLQlVJTERfQ0ZMQUdTID0gJChzdWJzdCAtcGcsICwgJChPUklHX0NGTEFHUykpCkBAIC0zNyw3ICszNSwyNSBAQAogTERGTEFHU192bWxpbnV4IDo9IC0tb2Zvcm1hdCAkKGxkLWJmZCkgLVR0ZXh0ICQoSU1BR0VfT0ZGU0VUKSAtZSBzdGFydHVwIFwKIAkJICAgLVQgJChvYmopLy4uLy4uL2tlcm5lbC92bWxpbnV4LmxkcwogCi0kKG9iaikvdm1saW51eDogJChPQkpFQ1RTKSAkKG9iaikvcGlnZ3kubyAkKExJQkdDQykgRk9SQ0UKKyMKKyMgUHVsbCBpbiB0aGUgbmVjZXNzYXJ5IGxpYmdjYyBiaXRzIGZyb20gdGhlIGluLWtlcm5lbCBpbXBsZW1lbnRhdGlvbi4KKyMKK2xpYjFmdW5jcy0kKENPTkZJR19TVVBFUkgzMikJOj0gYXNoaWZ0cnQuUyBhc2hsZGkzLmMgYXNocnNpMy5TIGFzaGxzaTMuUyBcCisJCQkJICAgbHNocnNpMy5TCitsaWIxZnVuY3Mtb2JqCQkJOj0gXAorCSQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoYWRkcHJlZml4ICQob2JqKS8sICQobGliMWZ1bmNzLXkpKSkpCisKK2xpYjFmdW5jcy1kaXIJCTo9ICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL2xpYgoraWZlcSAoJChCSVRTKSw2NCkKKwlsaWIxZnVuY3MtZGlyIAk6PSAkKGFkZHN1ZmZpeCAkKEJJVFMpLCAkKGxpYjFmdW5jcy1kaXIpKQorZW5kaWYKKworS0JVSUxEX0NGTEFHUyArPSAtSSQobGliMWZ1bmNzLWRpcikKKworJChhZGRwcmVmaXggJChvYmopLywkKGxpYjFmdW5jcy15KSk6ICQob2JqKS8lOiAkKGxpYjFmdW5jcy1kaXIpLyUgRk9SQ0UKKwkkKGNhbGwgY21kLHNoaXBwZWQpCisKKyQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vICQobGliMWZ1bmNzLW9iaikgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKIAlAOgogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzU3bGNyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDc3NTdsY3JfZGVmY29uZmlnCmluZGV4IDMzZGRiMTMuLmNmZGU5OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zaDc3NTdsY3JfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaDc3NTdsY3JfZGVmY29uZmlnCkBAIC05LDcgKzksNiBAQAogQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNU19BTEw9eQogQ09ORklHX1NMQUI9eQpAQCAtMzksOCArMzgsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX00yNVA4MD15CkBAIC01NiwxOCArNTMsMTkgQEAKICMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PVVNFX1BTMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX1NIX1NDST15CiBDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0zCiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfU0g9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotQ09ORklHX01GRF9TSF9NT0JJTEVfU0RIST15CiBDT05GSUdfVVNCPXkKIENPTkZJR19VU0JfRUhDSV9IQ0Q9eQorQ09ORklHX1VTQl9FSENJX1NIPXkKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1VTQl9PSENJX1NIPXkKIENPTkZJR19VU0JfU1RPUkFHRT15CiBDT05GSUdfTU1DPXkKIENPTkZJR19NTUNfU0RIST15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZwppbmRleCAwZjU1ODkxLi5lMmNiZDkyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKQEAgLTIyNyw3ICsyMjcsNyBAQAogQ09ORklHX1VTQl9TRVJJQUxfR0VORVJJQz15CiBDT05GSUdfVVNCX1NFUklBTF9BUkszMTE2PW0KIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMz1tCi1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfU0g9bQogQ09ORklHX0VYVDJfRlM9eQogQ09ORklHX0VYVDNfRlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9jbXB4Y2hnLWdyYi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9jbXB4Y2hnLWdyYi5oCmluZGV4IDQ2NzZiZjUuLmY4NDhkZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vY21weGNoZy1ncmIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctZ3JiLmgKQEAgLTE1LDggKzE1LDkgQEAKIAkJIiAgIG1vdi5sICAgJTIsICAgQCUxICAgICBcblx0IiAvKiBzdG9yZSBuZXcgdmFsdWUgKi8KIAkJIjE6IG1vdiAgICAgcjEsICAgcjE1ICAgICBcblx0IiAvKiBMT0dPVVQgKi8KIAkJOiAiPSZyIiAocmV0dmFsKSwKLQkJICAiK3IiICAobSkKLQkJOiAiciIgICAodmFsKQorCQkgICIrciIgIChtKSwKKwkJICAiK3IiICAodmFsKQkJLyogaW5oaWJpdCByMTUgb3ZlcmxvYWRpbmcgKi8KKwkJOgogCQk6ICJtZW1vcnkiLCAicjAiLCAicjEiKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC0zNiw4ICszNyw5IEBACiAJCSIgICBtb3YuYiAgICUyLCAgIEAlMSAgICAgXG5cdCIgLyogc3RvcmUgbmV3IHZhbHVlICovCiAJCSIxOiBtb3YgICAgIHIxLCAgIHIxNSAgICAgXG5cdCIgLyogTE9HT1VUICovCiAJCTogIj0mciIgKHJldHZhbCksCi0JCSAgIityIiAgKG0pCi0JCTogInIiICAgKHZhbCkKKwkJICAiK3IiICAobSksCisJCSAgIityIiAgKHZhbCkJCS8qIGluaGliaXQgcjE1IG92ZXJsb2FkaW5nICovCisJCToKIAkJOiAibWVtb3J5IiAsICJyMCIsICJyMSIpOwogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTU0LDEzICs1NiwxNCBAQAogCQkiICAgbm9wICAgICAgICAgICAgICAgICAgIFxuXHQiCiAJCSIgICBtb3YgICAgcjE1LCAgIHIxICAgICAgXG5cdCIgLyogcjEgPSBzYXZlZCBzcCAqLwogCQkiICAgbW92ICAgICMtOCwgICByMTUgICAgIFxuXHQiIC8qIExPR0lOICovCi0JCSIgICBtb3YubCAgQCUxLCAgICUwICAgICAgXG5cdCIgLyogbG9hZCAgb2xkIHZhbHVlICovCi0JCSIgICBjbXAvZXEgICUwLCAgICUyICAgICAgXG5cdCIKKwkJIiAgIG1vdi5sICBAJTMsICAgJTAgICAgICBcblx0IiAvKiBsb2FkICBvbGQgdmFsdWUgKi8KKwkJIiAgIGNtcC9lcSAgJTAsICAgJTEgICAgICBcblx0IgogCQkiICAgYmYgICAgICAgICAgICAxZiAgICAgIFxuXHQiIC8qIGlmIG5vdCBlcXVhbCAqLwotCQkiICAgbW92LmwgICAlMywgICBAJTEgICAgIFxuXHQiIC8qIHN0b3JlIG5ldyB2YWx1ZSAqLworCQkiICAgbW92LmwgICAlMiwgICBAJTMgICAgIFxuXHQiIC8qIHN0b3JlIG5ldyB2YWx1ZSAqLwogCQkiMTogbW92ICAgICByMSwgICByMTUgICAgIFxuXHQiIC8qIExPR09VVCAqLwotCQk6ICI9JnIiIChyZXR2YWwpCi0JCTogICJyIiAgKG0pLCAiciIgIChvbGQpLCAiciIgIChuZXcpCisJCTogIj0mciIgKHJldHZhbCksCisJCSAgIityIiAgKG9sZCksICIrciIgIChuZXcpIC8qIG9sZCBvciBuZXcgY2FuIGJlIHIxNSAqLworCQk6ICAiciIgIChtKQogCQk6ICJtZW1vcnkiICwgInIwIiwgInIxIiwgInQiKTsKIAogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9tbXpvbmUuaAppbmRleCA4ODg3YmFmLi4xNWE4NDk2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTksMTAgKzksNiBAQAogZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CiAjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCiAKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuICsgXAotCQkJCSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzKQotCiBzdGF0aWMgaW5saW5lIGludCBwZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKQogewogCWludCBuaWQ7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGRiODU5MTYuLjkyMTBlOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUtMmxldmVsLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl82NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfNjQuaAppbmRleCAyYTU0MWRkLi5lMjVjNGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl82NC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzY0LmgKQEAgLTE1MCw3ICsxNTAsNiBAQAogI2RlZmluZSBTUl9VU0VSIChTUl9NTVUgfCBTUl9GRCkKIAogI2RlZmluZSBzdGFydF90aHJlYWQoX3JlZ3MsIG5ld19wYywgbmV3X3NwKQkJCVwKLQlzZXRfZnMoVVNFUl9EUyk7CQkJCQlcCiAJX3JlZ3MtPnNyID0gU1JfVVNFUjsJLyogVXNlciBtb2RlLiAqLwkJXAogCV9yZWdzLT5wYyA9IG5ld19wYyAtIDQ7CS8qIENvbXBlbnNhdGUgc3lzY2FsbCBleGl0ICovCVwKIAlfcmVncy0+cGMgfD0gMTsJCS8qIFNldCBTSG1lZGlhICEgKi8JCVwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDQwNzI1YjQuLjg4YmQ2YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtNDEsNyArNDEsOSBAQAogCiAjZGVmaW5lIHVzZXJfbW9kZShyZWdzKQkJCSgoKHJlZ3MpLT5zciAmIDB4NDAwMDAwMDApPT0wKQogI2RlZmluZSBrZXJuZWxfc3RhY2tfcG9pbnRlcihfcmVncykJKCh1bnNpZ25lZCBsb25nKShfcmVncyktPnJlZ3NbMTVdKQotI2RlZmluZSBHRVRfVVNQKHJlZ3MpICgocmVncyktPnJlZ3NbMTVdKQorCisjZGVmaW5lIEdFVF9GUChyZWdzKQkoKHJlZ3MpLT5yZWdzWzE0XSkKKyNkZWZpbmUgR0VUX1VTUChyZWdzKQkoKHJlZ3MpLT5yZWdzWzE1XSkKIAogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwogCkBAIC0xMzEsNyArMTMzLDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisJdW5zaWduZWQgbG9uZyBwYyA9IHJlZ3MtPnBjOwogCiAJaWYgKHZpcnRfYWRkcl91bmNhY2hlZChwYykpCiAJCXJldHVybiBDQUNfQUREUihwYyk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3RsYi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS90bGIuaAppbmRleCA2YzMwOGQ4Li5lYzg4YmZjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3RsYi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdGxiLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogCiAjaWZkZWYgQ09ORklHX01NVQorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyMi5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyMi5oCmluZGV4IDdhNWI4YTMuLmJkMDYyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzIyLmgKQEAgLTIzNiw2ICsyMzYsNyBAQAogfTsKIAogZW51bSB7CisJU0hETUFfU0xBVkVfSU5WQUxJRCwKIAlTSERNQV9TTEFWRV9TQ0lGMF9UWCwKIAlTSERNQV9TTEFWRV9TQ0lGMF9SWCwKIAlTSERNQV9TTEFWRV9TQ0lGMV9UWCwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjQuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjQuaAppbmRleCA3ZWI0MzU5Li5jYmM0N2U2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzI0LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyNC5oCkBAIC0yODUsNiArMjg1LDcgQEAKIH07CiAKIGVudW0geworCVNIRE1BX1NMQVZFX0lOVkFMSUQsCiAJU0hETUFfU0xBVkVfU0NJRjBfVFgsCiAJU0hETUFfU0xBVkVfU0NJRjBfUlgsCiAJU0hETUFfU0xBVkVfU0NJRjFfVFgsCkBAIC0yOTcsNiArMjk4LDE0IEBACiAJU0hETUFfU0xBVkVfU0NJRjRfUlgsCiAJU0hETUFfU0xBVkVfU0NJRjVfVFgsCiAJU0hETUFfU0xBVkVfU0NJRjVfUlgsCisJU0hETUFfU0xBVkVfVVNCMEQwX1RYLAorCVNIRE1BX1NMQVZFX1VTQjBEMF9SWCwKKwlTSERNQV9TTEFWRV9VU0IwRDFfVFgsCisJU0hETUFfU0xBVkVfVVNCMEQxX1JYLAorCVNIRE1BX1NMQVZFX1VTQjFEMF9UWCwKKwlTSERNQV9TTEFWRV9VU0IxRDBfUlgsCisJU0hETUFfU0xBVkVfVVNCMUQxX1RYLAorCVNIRE1BX1NMQVZFX1VTQjFEMV9SWCwKIAlTSERNQV9TTEFWRV9TREhJMF9UWCwKIAlTSERNQV9TTEFWRV9TREhJMF9SWCwKIAlTSERNQV9TTEFWRV9TREhJMV9UWCwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3NTcuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3NTcuaAppbmRleCAwNWI4MTk2Li40MWY5ZjhiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzU3LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzc1Ny5oCkBAIC0yNTIsNiArMjUyLDcgQEAKIH07CiAKIGVudW0geworCVNIRE1BX1NMQVZFX0lOVkFMSUQsCiAJU0hETUFfU0xBVkVfU0RISV9UWCwKIAlTSERNQV9TTEFWRV9TREhJX1JYLAogCVNIRE1BX1NMQVZFX01NQ0lGX1RYLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYwppbmRleCAwMzMzZmU5Li4xMzRhMzk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYwpAQCAtOTMsNiArOTMsNDYgQEAKIAkJLmNoY3IJCT0gRE1fSU5DIHwgU01fRklYIHwgMHg4MDAgfCBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDM2LAogCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMEQwX1RYLAorCQkuYWRkcgkJPSAweEE0RDgwMTAwLAorCQkuY2hjcgkJPSBETV9GSVggfCBTTV9JTkMgfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweDczLAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMEQwX1JYLAorCQkuYWRkcgkJPSAweEE0RDgwMTAwLAorCQkuY2hjcgkJPSBETV9JTkMgfCBTTV9GSVggfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweDczLAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMEQxX1RYLAorCQkuYWRkcgkJPSAweEE0RDgwMTIwLAorCQkuY2hjcgkJPSBETV9GSVggfCBTTV9JTkMgfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweDc3LAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMEQxX1JYLAorCQkuYWRkcgkJPSAweEE0RDgwMTIwLAorCQkuY2hjcgkJPSBETV9JTkMgfCBTTV9GSVggfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweDc3LAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMUQwX1RYLAorCQkuYWRkcgkJPSAweEE0RDkwMTAwLAorCQkuY2hjcgkJPSBETV9GSVggfCBTTV9JTkMgfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweGFiLAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMUQwX1JYLAorCQkuYWRkcgkJPSAweEE0RDkwMTAwLAorCQkuY2hjcgkJPSBETV9JTkMgfCBTTV9GSVggfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweGFiLAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMUQxX1RYLAorCQkuYWRkcgkJPSAweEE0RDkwMTIwLAorCQkuY2hjcgkJPSBETV9GSVggfCBTTV9JTkMgfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweGFmLAorCX0sIHsKKwkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfVVNCMUQxX1JYLAorCQkuYWRkcgkJPSAweEE0RDkwMTIwLAorCQkuY2hjcgkJPSBETV9JTkMgfCBTTV9GSVggfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzMyQklUKSwKKwkJLm1pZF9yaWQJPSAweGFmLAorCX0sIHsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfU0RISTBfVFgsCiAJCS5hZGRyCQk9IDB4MDRjZTAwMzAsCiAJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMTZCSVQpLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzU3LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NTcuYwppbmRleCA0MjNkYWJmLi5lOTE1ZGVhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NTcuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NTcuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9TQ0lGMl9SWCwKIAkJLmFkZHIJCT0gMHgxZjRiMDAxNCwKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MjIsCiAJfSwKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfU0NJRjNfUlgsCiAJCS5hZGRyCQk9IDB4MWY0YzAwMTQsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDJhLAogCX0sCkBAIC0yMTEsNyArMjExLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1NDSUY0X1JYLAogCQkuYWRkcgkJPSAweDFmNGQwMDE0LAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHg0MiwKIAl9LApAQCAtMjI4LDcgKzIyOCw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDMF9SWCwKIAkJLmFkZHIJCT0gMHgxZTUwMDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MjIsCiAJfSwKQEAgLTI0Miw3ICsyNDIsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzFfUlgsCiAJCS5hZGRyCQk9IDB4MWU1MTAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDJhLAogCX0sCkBAIC0yNTYsNyArMjU2LDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUMyX1JYLAogCQkuYWRkcgkJPSAweDFlNTIwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHhhMiwKIAl9LApAQCAtMjY1LDEyICsyNjUsMTIgQEAKIAkJLmFkZHIJCT0gMHgxZTUzMDAxMiwKIAkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAotCQkubWlkX3JpZAk9IDB4YWIsCisJCS5taWRfcmlkCT0gMHhhOSwKIAl9LAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzNfUlgsCiAJCS5hZGRyCQk9IDB4MWU1MzAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweGFmLAogCX0sCkBAIC0yNzksMTQgKzI3OSwxNCBAQAogCQkuYWRkcgkJPSAweDFlNTQwMDEyLAogCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCi0JCS5taWRfcmlkCT0gMHhjMSwKKwkJLm1pZF9yaWQJPSAweGM1LAogCX0sCiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDNF9SWCwKIAkJLmFkZHIJCT0gMHgxZTU0MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAotCQkubWlkX3JpZAk9IDB4YzIsCisJCS5taWRfcmlkCT0gMHhjNiwKIAl9LAogfTsKIApAQCAtMzAxLDcgKzMwMSw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDNV9SWCwKIAkJLmFkZHIJCT0gMHgxZTU1MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MjIsCiAJfSwKQEAgLTMxNSw3ICszMTUsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzZfUlgsCiAJCS5hZGRyCQk9IDB4MWU1NjAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDJhLAogCX0sCkBAIC0zMjksNyArMzI5LDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM3X1JYLAogCQkuYWRkcgkJPSAweDFlNTcwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHg0MiwKIAl9LApAQCAtMzQzLDcgKzM0Myw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDOF9SWCwKIAkJLmFkZHIJCT0gMHgxZTU4MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4NDYsCiAJfSwKQEAgLTM1Nyw3ICszNTcsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzlfUlgsCiAJCS5hZGRyCQk9IDB4MWU1OTAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDUyLAogCX0sCkBAIC02NTksNiArNjU5LDU0IEBACiAJLnJlc291cmNlCT0gc3BpMF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYl9laGNpX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhmZTRmMTAwMCwKKwkJLmVuZAk9IDB4ZmU0ZjEwZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA1NywKKwkJLmVuZAk9IDU3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdXNiX2VoY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9laGNpIiwKKwkuaWQJCT0gLTEsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrID0gJnVzYl9laGNpX2RldmljZS5kZXYuY29oZXJlbnRfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiX2VoY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB1c2JfZWhjaV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYl9vaGNpX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhmZTRmMTgwMCwKKwkJLmVuZAk9IDB4ZmU0ZjE4ZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA1NywKKwkJLmVuZAk9IDU3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdXNiX29oY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9vaGNpIiwKKwkuaWQJCT0gLTEsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrID0gJnVzYl9vaGNpX2RldmljZS5kZXYuY29oZXJlbnRfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiX29oY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB1c2Jfb2hjaV9yZXNvdXJjZXMsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzU3X2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzY2lmMl9kZXZpY2UsCiAJJnNjaWYzX2RldmljZSwKQEAgLTY3MCw2ICs3MTgsOCBAQAogCSZkbWEyX2RldmljZSwKIAkmZG1hM19kZXZpY2UsCiAJJnNwaTBfZGV2aWNlLAorCSZ1c2JfZWhjaV9kZXZpY2UsCisJJnVzYl9vaGNpX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNoNzc1N19kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC0xMDM5LDEzICsxMDg5LDEzIEBACiAKIC8qIFN1cHBvcnQgZm9yIGV4dGVybmFsIGludGVycnVwdCBwaW5zIGluIElSUSBtb2RlICovCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCB2ZWN0b3JzX2lycTAxMjNbXSBfX2luaXRkYXRhID0gewotCUlOVENfVkVDVChJUlEwLCAweDI0MCksIElOVENfVkVDVChJUlExLCAweDI4MCksCi0JSU5UQ19WRUNUKElSUTIsIDB4MmMwKSwgSU5UQ19WRUNUKElSUTMsIDB4MzAwKSwKKwlJTlRDX1ZFQ1QoSVJRMCwgMHgyMDApLCBJTlRDX1ZFQ1QoSVJRMSwgMHgyNDApLAorCUlOVENfVkVDVChJUlEyLCAweDI4MCksIElOVENfVkVDVChJUlEzLCAweDJjMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCB2ZWN0b3JzX2lycTQ1NjdbXSBfX2luaXRkYXRhID0gewotCUlOVENfVkVDVChJUlE0LCAweDM0MCksIElOVENfVkVDVChJUlE1LCAweDM4MCksCi0JSU5UQ19WRUNUKElSUTYsIDB4M2MwKSwgSU5UQ19WRUNUKElSUTcsIDB4MjAwKSwKKwlJTlRDX1ZFQ1QoSVJRNCwgMHgzMDApLCBJTlRDX1ZFQ1QoSVJRNSwgMHgzNDApLAorCUlOVENfVkVDVChJUlE2LCAweDM4MCksIElOVENfVkVDVChJUlE3LCAweDNjMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfc2Vuc2VfcmVnIHNlbnNlX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CkBAIC0xMDc5LDE0ICsxMTI5LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCB2ZWN0b3JzX2lybDQ1NjdbXSBfX2luaXRkYXRhID0gewotCUlOVENfVkVDVChJUkw0X0xMTEwsIDB4YjAwKSwgSU5UQ19WRUNUKElSTDRfTExMSCwgMHhiMjApLAotCUlOVENfVkVDVChJUkw0X0xMSEwsIDB4YjQwKSwgSU5UQ19WRUNUKElSTDRfTExISCwgMHhiNjApLAotCUlOVENfVkVDVChJUkw0X0xITEwsIDB4YjgwKSwgSU5UQ19WRUNUKElSTDRfTEhMSCwgMHhiYTApLAotCUlOVENfVkVDVChJUkw0X0xISEwsIDB4YmMwKSwgSU5UQ19WRUNUKElSTDRfTEhISCwgMHhiZTApLAotCUlOVENfVkVDVChJUkw0X0hMTEwsIDB4YzAwKSwgSU5UQ19WRUNUKElSTDRfSExMSCwgMHhjMjApLAotCUlOVENfVkVDVChJUkw0X0hMSEwsIDB4YzQwKSwgSU5UQ19WRUNUKElSTDRfSExISCwgMHhjNjApLAotCUlOVENfVkVDVChJUkw0X0hITEwsIDB4YzgwKSwgSU5UQ19WRUNUKElSTDRfSEhMSCwgMHhjYTApLAotCUlOVENfVkVDVChJUkw0X0hISEwsIDB4Y2MwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9MTExMLCAweDIwMCksIElOVENfVkVDVChJUkw0X0xMTEgsIDB4MjIwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9MTEhMLCAweDI0MCksIElOVENfVkVDVChJUkw0X0xMSEgsIDB4MjYwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9MSExMLCAweDI4MCksIElOVENfVkVDVChJUkw0X0xITEgsIDB4MmEwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9MSEhMLCAweDJjMCksIElOVENfVkVDVChJUkw0X0xISEgsIDB4MmUwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9ITExMLCAweDMwMCksIElOVENfVkVDVChJUkw0X0hMTEgsIDB4MzIwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9ITEhMLCAweDM0MCksIElOVENfVkVDVChJUkw0X0hMSEgsIDB4MzYwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9ISExMLCAweDM4MCksIElOVENfVkVDVChJUkw0X0hITEgsIDB4M2EwKSwKKwlJTlRDX1ZFQ1QoSVJMNF9ISEhMLCAweDNjMCksCiB9OwogCiBzdGF0aWMgREVDTEFSRV9JTlRDX0RFU0MoaW50Y19kZXNjX2lybDAxMjMsICJzaDc3NTctaXJsMDEyMyIsIHZlY3RvcnNfaXJsMDEyMywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lycS5jIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKaW5kZXggOTE5NzExMC4uYTNlZTkxOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTI2OCw5ICsyNjksOCBAQAogCQkJdW5zaWduZWQgaW50IG5ld2NwdSA9IGNwdW1hc2tfYW55X2FuZChkYXRhLT5hZmZpbml0eSwKIAkJCQkJCQkgICAgICBjcHVfb25saW5lX21hc2spOwogCQkJaWYgKG5ld2NwdSA+PSBucl9jcHVfaWRzKSB7Ci0JCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVJRJXUgbm8gbG9uZ2VyIGFmZmluZSB0byBDUFUldVxuIiwKLQkJCQkJICAgICAgIGlycSwgY3B1KTsKKwkJCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCJJUlEldSBubyBsb25nZXIgYWZmaW5lIHRvIENQVSV1XG4iLAorCQkJCQkJICAgIGlycSwgY3B1KTsKIAogCQkJCWNwdW1hc2tfc2V0YWxsKGRhdGEtPmFmZmluaXR5KTsKIAkJCQluZXdjcHUgPSBjcHVtYXNrX2FueV9hbmQoZGF0YS0+YWZmaW5pdHksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggNzYyYTEzOS4uYWFmNmQ1OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaHdfYnJlYWtwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0xMDEsOCArMTAyLDYgQEAKIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG5ld19wYywKIAkJICB1bnNpZ25lZCBsb25nIG5ld19zcCkKIHsKLQlzZXRfZnMoVVNFUl9EUyk7Ci0KIAlyZWdzLT5wciA9IDA7CiAJcmVncy0+c3IgPSBTUl9GRDsKIAlyZWdzLT5wYyA9IG5ld19wYzsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vYWxpZ25tZW50LmMgYi9hcmNoL3NoL21tL2FsaWdubWVudC5jCmluZGV4IGIyNTk1YjguLjYyMGZhN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vYWxpZ25tZW50LmMKKysrIGIvYXJjaC9zaC9tbS9hbGlnbm1lbnQuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxhc20vYWxpZ25tZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCkBAIC05NSwxMyArOTYsMTMgQEAKIHZvaWQgdW5hbGlnbmVkX2ZpeHVwc19ub3RpZnkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGluc25fc2l6ZV90IGluc24sCiAJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWlmICh1c2VyX21vZGUocmVncykgJiYgKHNlX3VzZXJtb2RlICYgVU1fV0FSTikgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcl9ub3RpY2UoIkZpeGluZyB1cCB1bmFsaWduZWQgdXNlcnNwYWNlIGFjY2VzcyAiCisJaWYgKHVzZXJfbW9kZShyZWdzKSAmJiAoc2VfdXNlcm1vZGUgJiBVTV9XQVJOKSkKKwkJcHJfbm90aWNlX3JhdGVsaW1pdGVkKCJGaXhpbmcgdXAgdW5hbGlnbmVkIHVzZXJzcGFjZSBhY2Nlc3MgIgogCQkJICAiaW4gXCIlc1wiIHBpZD0lZCBwYz0weCVwIGlucz0weCUwNGh4XG4iLAogCQkJICB0c2stPmNvbW0sIHRhc2tfcGlkX25yKHRzayksCiAJCQkgICh2b2lkICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSwgaW5zbik7Ci0JZWxzZSBpZiAoc2Vfa2Vybm1vZGVfd2FybiAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByX25vdGljZSgiRml4aW5nIHVwIHVuYWxpZ25lZCBrZXJuZWwgYWNjZXNzICIKKwllbHNlIGlmIChzZV9rZXJubW9kZV93YXJuKQorCQlwcl9ub3RpY2VfcmF0ZWxpbWl0ZWQoIkZpeGluZyB1cCB1bmFsaWduZWQga2VybmVsIGFjY2VzcyAiCiAJCQkgICJpbiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCiAJCQkgIHRzay0+Y29tbSwgdGFza19waWRfbnIodHNrKSwKIAkJCSAgKHZvaWQgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLCBpbnNuKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jIGIvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKaW5kZXggNTI0MTE0Ni4uMTE1NzI1MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKQEAgLTI2LDkgKzI2LDkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSA9ICh1bnNpZ25lZCBpbnQpZmlsZS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2FjaGVfaW5mbyAqY2FjaGU7Ci0JdW5zaWduZWQgaW50IHdheXNpemUsIHdheSwgY2FjaGVfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGNjciwgYmFzZTsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBhZGRyc3RhcnQgPSAwOworCXVuc2lnbmVkIGludCB3YXlzaXplLCB3YXk7CisJdW5zaWduZWQgbG9uZyBjY3I7CisJdW5zaWduZWQgbG9uZyBhZGRyc3RhcnQgPSAwOwogCiAJLyoKIAkgKiBHbyB1bmNhY2hlZCBpbW1lZGlhdGVseSBzbyB3ZSBkb24ndCBza2V3IHRoZSByZXN1bHRzIGFueQpAQCAtNDUsMjggKzQ1LDEzIEBACiAJfQogCiAJaWYgKGNhY2hlX3R5cGUgPT0gQ0FDSEVfVFlQRV9EQ0FDSEUpIHsKLQkJYmFzZSA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CisJCWFkZHJzdGFydCA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CiAJCWNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCX0gZWxzZSB7Ci0JCWJhc2UgPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZOworCQlhZGRyc3RhcnQgPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZOwogCQljYWNoZSA9ICZjdXJyZW50X2NwdV9kYXRhLmljYWNoZTsKIAl9CiAKLQkvKgotCSAqIER1ZSB0byB0aGUgYW1vdW50IG9mIGRhdGEgd3JpdHRlbiBvdXQgKGRlcGVuZGluZyBvbiB0aGUgY2FjaGUgc2l6ZSksCi0JICogd2UgbWF5IGJlIGl0ZXJhdGVkIG92ZXIgbXVsdGlwbGUgdGltZXMuIEluIHRoaXMgY2FzZSwga2VlcCB0cmFjayBvZgotCSAqIHRoZSBlbnRyeSBwb3NpdGlvbiBpbiBhZGRyc3RhcnQsIGFuZCByZXdpbmQgaXQgd2hlbiB3ZSd2ZSBoaXQgdGhlCi0JICogZW5kIG9mIHRoZSBjYWNoZS4KLQkgKgotCSAqIExpa2V3aXNlLCB0aGUgc2FtZSBjb2RlIGlzIHVzZWQgZm9yIG11bHRpcGxlIGNhY2hlcywgc28gY2FyZSBtdXN0Ci0JICogYmUgdGFrZW4gZm9yIGJvdW5jaW5nIGFkZHJzdGFydCBiYWNrIGFuZCBmb3J0aCBzbyB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjYWNoZSBpcyBoaXQuCi0JICovCi0JY2FjaGVfc2l6ZSA9IGNhY2hlLT53YXlzICogY2FjaGUtPnNldHMgKiBjYWNoZS0+bGluZXN6OwotCWlmICgoKGFkZHJzdGFydCAmIDB4ZmYwMDAwMDApICE9IGJhc2UpIHx8Ci0JICAgICAoYWRkcnN0YXJ0ICYgMHgwMGZmZmZmZikgPiBjYWNoZV9zaXplKQotCQlhZGRyc3RhcnQgPSBiYXNlOwotCiAJd2F5c2l6ZSA9IGNhY2hlLT5zZXRzOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY29uc2lzdGVudC5jIGIvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKaW5kZXggNDA3MzNhOS4uZjI1MWI1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKKysrIGIvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKQEAgLTgyLDcgKzgyLDcgQEAKIAl2b2lkICphZGRyOwogCiAJYWRkciA9IF9faW5fMjliaXRfbW9kZSgpID8KLQkgICAgICAgKHZvaWQgKilQMVNFR0FERFIoKHVuc2lnbmVkIGxvbmcpdmFkZHIpIDogdmFkZHI7CisJICAgICAgICh2b2lkICopQ0FDX0FERFIoKHVuc2lnbmVkIGxvbmcpdmFkZHIpIDogdmFkZHI7CiAKIAlzd2l0Y2ggKGRpcmVjdGlvbikgewogCWNhc2UgRE1BX0ZST01fREVWSUNFOgkJLyogaW52YWxpZGF0ZSBvbmx5ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggYWYzMmUxNy4uMjUzOTg2YiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjYsNyArMjYsNiBAQAogCXNlbGVjdCBIQVZFX0RNQV9BUElfREVCVUcKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCi0Jc2VsZWN0IEdFTkVSSUNfSEFSRElSUVNfTk9fREVQUkVDQVRFRAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlmIFNNUAogCkBAIC01MjgsNiArNTI3LDIzIEBACiBjb25maWcgUENJX1NZU0NBTEwKIAlkZWZfYm9vbCBQQ0kKIAorY29uZmlnIFBDSUNfUENJCisJYm9vbAorCWRlcGVuZHMgb24gUENJICYmIFNQQVJDMzIgJiYgIVNQQVJDX0xFT04KKwlkZWZhdWx0IHkKKworY29uZmlnIExFT05fUENJCisJYm9vbAorCWRlcGVuZHMgb24gUENJICYmIFNQQVJDX0xFT04KKwlkZWZhdWx0IHkKKworY29uZmlnIEdSUENJMgorCWJvb2wgIkdSUENJMiBIb3N0IEJyaWRnZSBTdXBwb3J0IgorCWRlcGVuZHMgb24gTEVPTl9QQ0kKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIEdSUENJMiBIb3N0IEJyaWRnZSBEcml2ZXIuCisKIHNvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjbWNpYS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzMyLmgKaW5kZXggNDgyYzc5ZS4uNzQ0MDkxNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV8zMi5oCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJcmV0dXJuIHN1bl9mZGMtPmRhdGFfODIwNzI7CiAJY2FzZSA3OiAvKiBGRF9ESVIgKi8KIAkJcmV0dXJuIHN1bl9yZWFkX2RpcigpOwotCX07CisJfQogCXBhbmljKCJzdW5fODIwNzJfZmRfaW5iOiBIb3cgZGlkIEkgZ2V0IGhlcmU/Iik7CiB9CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCWNhc2UgNDogLyogRkRfU1RBVFVTICovCiAJCXN1bl9mZGMtPnN0YXR1c184MjA3MiA9IHZhbHVlOwogCQlicmVhazsKLQl9OworCX0KIAlyZXR1cm47CiB9CiAKQEAgLTE4Niw3ICsxODYsNyBAQAogCQlyZXR1cm4gc3VuX2ZkYy0+ZGF0YV84MjA3NzsKIAljYXNlIDc6IC8qIEZEX0RJUiAqLwogCQlyZXR1cm4gc3VuX3JlYWRfZGlyKCk7Ci0JfTsKKwl9CiAJcGFuaWMoInN1bl84MjA3N19mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KIApAQCAtMjEyLDcgKzIxMiw3IEBACiAJY2FzZSAzOiAvKiBGRF9URFIgKi8KIAkJc3VuX2ZkYy0+dGFwZWN0bF84MjA3NyA9IHZhbHVlOwogCQlicmVhazsKLQl9OworCX0KIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV82NC5oCmluZGV4IDY1OTdjZTguLmJjZWYxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfNjQuaApAQCAtMTExLDcgKzExMSw3IEBACiAJY2FzZSA3OiAvKiBGRF9ESVIgKi8KIAkJLyogWFhYOiBJcyBEQ0wgb24gMHg4MCBpbiBzdW40bT8gKi8KIAkJcmV0dXJuIHNidXNfcmVhZGIoJnN1bl9mZGMtPmRpcl84MjA3Nyk7Ci0JfTsKKwl9CiAJcGFuaWMoInN1bl84MjA3Ml9mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KIApAQCAtMTM1LDcgKzEzNSw3IEBACiAJY2FzZSA0OiAvKiBGRF9TVEFUVVMgKi8KIAkJc2J1c193cml0ZWIodmFsdWUsICZzdW5fZmRjLT5zdGF0dXNfODIwNzcpOwogCQlicmVhazsKLQl9OworCX0KIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfMzIuaAppbmRleCBkNGQwNzExLi4xNDg0ODkwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc18zMi5oCkBAIC0xOCw3ICsxOCw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX2lycV9zYXZlKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNiwxNyArMjYsMTcgQEAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCiB7CiAJYXJjaF9sb2NhbF9pcnFfc2F2ZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgYm9vbCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gKGZsYWdzICYgUFNSX1BJTCkgIT0gMDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCiB7CiAJcmV0dXJuIGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyhhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzY0LmgKaW5kZXggYWFiOTY5Yy4uMjNjZDI3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc182NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaApAQCAtMTQsNyArMTQsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNiw3ICsyNiw3IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkid3JwcgklMCwgJSVwaWwiCkBAIC0zNiw3ICszNiw3IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIndycHIJJTAsICUlcGlsIgpAQCAtNDYsNyArNDYsNyBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkid3JwcgkwLCAlJXBpbCIKQEAgLTU2LDE3ICs1NiwxNyBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIGludCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gKGZsYWdzID4gMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIGludCBhcmNoX2lycXNfZGlzYWJsZWQodm9pZCkKIHsKIAlyZXR1cm4gYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGFyY2hfbG9jYWxfc2F2ZV9mbGFncygpKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB0bXA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbGVvbi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmgKaW5kZXggNmJkYWYxZS4uYTRlNDU3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmgKQEAgLTMxOCw2ICszMTgsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBsZW9uX2J1aWxkX2RldmljZV9pcnEodW5zaWduZWQgaW50IHJlYWxfaXJxLAogCQkJCQkgICBpcnFfZmxvd19oYW5kbGVyX3QgZmxvd19oYW5kbGVyLAogCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZG9fYWNrKTsKK2V4dGVybiB2b2lkIGxlb25fdXBkYXRlX3ZpcnFfaGFuZGxpbmcodW5zaWduZWQgaW50IHZpcnEsCisJCQkgICAgICBpcnFfZmxvd19oYW5kbGVyX3QgZmxvd19oYW5kbGVyLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGRvX2Fjayk7CiBleHRlcm4gdm9pZCBsZW9uX2NsZWFyX2Nsb2NrX2lycSh2b2lkKTsKIGV4dGVybiB2b2lkIGxlb25fbG9hZF9wcm9maWxlX2lycShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbGltaXQpOwogZXh0ZXJuIHZvaWQgbGVvbl9pbml0X3RpbWVycyhpcnFfaGFuZGxlcl90IGNvdW50ZXJfZm4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjRiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb25fcGNpLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGFzbS9sZW9uX3BjaS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEFlcm9mbGV4IEdhaXNsZXIgQUIsIERhbmllbCBIZWxsc3Ryb20KKyAqLworCisjaWZuZGVmIF9BU01fTEVPTl9QQ0lfSF8KKyNkZWZpbmUgX0FTTV9MRU9OX1BDSV9IXworCisvKiBQQ0kgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworc3RydWN0IGxlb25fcGNpX2luZm8geworCXN0cnVjdCBwY2lfb3BzICpvcHM7CisJc3RydWN0IHJlc291cmNlCWlvX3NwYWNlOworCXN0cnVjdCByZXNvdXJjZQltZW1fc3BhY2U7CisJaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKK307CisKK2V4dGVybiB2b2lkIGxlb25fcGNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCisJCQkJc3RydWN0IGxlb25fcGNpX2luZm8gKmluZm8pOworCisjZW5kaWYgLyogX0FTTV9MRU9OX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXpvbmUuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggZThjNjQ4Ny4uOTlkOWI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21tem9uZS5oCkBAIC04LDggKzgsNiBAQAogZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CiAKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfZW5kX3BmbikKIAogZXh0ZXJuIGludCBudW1hX2NwdV9sb29rdXBfdGFibGVbXTsKIGV4dGVybiBjcHVtYXNrX3QgbnVtYV9jcHVtYXNrX2xvb2t1cF90YWJsZVtdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzMyLmgKaW5kZXggMzMyYWM5YS4uODYyZTNjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV8zMi5oCkBAIC00Nyw3ICs0NywzMSBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaWZuZGVmIENPTkZJR19MRU9OX1BDSQogLyogZ2VuZXJpYyBwY2kgc3R1ZmYgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wY2kuaD4KKyNlbHNlCisvKgorICogT24gTEVPTiBQQ0kgTWVtb3J5IHNwYWNlIGlzIG1hcHBlZCAxOjEgd2l0aCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLgorICoKKyAqIEkvTyBzcGFjZSBpcyBsb2NhdGVkIGF0IGxvdyA2NEtieXRlcyBpbiBQQ0kgSS9PIHNwYWNlLiBUaGUgSS9PIGFkZHJlc3NlcworICogYXJlIGNvbnZlcnRlZCBpbnRvIENQVSBhZGRyZXNzZXMgdG8gdmlydHVhbCBhZGRyZXNzZXMgdGhhdCBhcmUgbWFwcGVkIHdpdGgKKyAqIE1NVSB0byB0aGUgUENJIEhvc3QgUENJIEkvTyBzcGFjZSB3aW5kb3cgd2hpY2ggYXJlIHRyYW5zbGF0ZWQgdG8gdGhlIGxvdworICogNjRLYnl0ZXMgYnkgdGhlIEhvc3QgY29udHJvbGxlci4KKyAqLworCitleHRlcm4gdm9pZAorcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CisKK2V4dGVybiB2b2lkCitwY2liaW9zX2J1c190b19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKKworc3RhdGljIGlubGluZSBpbnQgcGNpX2dldF9sZWdhY3lfaWRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gUENJX0lSUV9OT05FOworfQorI2VuZGlmCiAKICNlbmRpZiAvKiBfX1NQQVJDX1BDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaWMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpYy5oCmluZGV4IDdlYjVkNzguLjY2NzZjYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpYy5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpYy5oCkBAIC0yOSw3ICsyOSw3IEBACiAJaW50CQkJcGNpY19pbWRpbTsKIH07CiAKLSNpZmRlZiBDT05GSUdfUENJCisjaWZkZWYgQ09ORklHX1BDSUNfUENJCiBleHRlcm4gaW50IHBjaWNfcHJlc2VudCh2b2lkKTsKIGV4dGVybiBpbnQgcGNpY19wcm9iZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBjaV90aW1lX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCBjN2FkM2ZlLi5iOTI4YjMxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTIwNSw2ICsyMDUsNyBAQAogfSB3aGlsZSAoMCkKICNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICghKChyZWdzKS0+dHN0YXRlICYgVFNUQVRFX1BSSVYpKQogI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnRwYykKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcl9zZXQocmVncywgdmFsKSAoKHJlZ3MpLT50cGMgPSAodmFsKSkKICNkZWZpbmUgdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0ZQXSkKICNkZWZpbmUgcmVnc19yZXR1cm5fdmFsdWUocmVncykgKChyZWdzKS0+dV9yZWdzW1VSRUdfSTBdKQogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCmluZGV4IDQ3YTdlODYuLmFiYTE2MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaApAQCAtMjIwLDcgKzIyMCw3IEBACiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSA0OgogCQlyZXR1cm4geGNoZ191MzIocHRyLCB4KTsKLQl9OworCX0KIAlfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKIAlyZXR1cm4geDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oCmluZGV4IDNjOTZkM2IuLjEwYmNhYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fNjQuaApAQCAtMjM0LDcgKzIzNCw3IEBACiAJCXJldHVybiB4Y2hnMzIocHRyLCB4KTsKIAljYXNlIDg6CiAJCXJldHVybiB4Y2hnNjQocHRyLCB4KTsKLQl9OworCX0KIAlfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKIAlyZXR1cm4geDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggOWNmZjI3MC4uYjkwYjRhMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTczLDcgKzczLDkgQEAKIAogb2JqLXkgICAgICAgICAgICAgICAgICAgICArPSBkbWEubwogCi1vYmotJChDT05GSUdfU1BBUkMzMl9QQ0kpICs9IHBjaWMubworb2JqLSQoQ09ORklHX1BDSUNfUENJKSAgICArPSBwY2ljLm8KK29iai0kKENPTkZJR19MRU9OX1BDSSkgICAgKz0gbGVvbl9wY2kubworb2JqLSQoQ09ORklHX0dSUENJMikgICAgICArPSBsZW9uX3BjaV9ncnBjaTIubwogCiBvYmotJChDT05GSUdfU01QKSAgICAgICAgICs9IHRyYW1wb2xpbmVfJChCSVRTKS5vIHNtcF8kKEJJVFMpLm8KIG9iai0kKENPTkZJR19TUEFSQzMyX1NNUCkgKz0gc3VuNG1fc21wLm8gc3VuNGRfc21wLm8gbGVvbl9zbXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXBjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYwppbmRleCAxZTM0ZjI5Li5jYWVmOWRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQl9OworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKaW5kZXggODUwNWUwYS4uYWNmNTE1MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcGFuaWMoIkNhbid0IHNldCBBVVhJTyByZWdpc3RlciBvbiB0aGlzIG1hY2hpbmUuIik7Ci0JfTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXV4aW9fbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChzZXRfYXV4aW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvY2htYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2htYy5jCmluZGV4IDY2OGM3YmUuLjVmNDUwMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2NobWMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMKQEAgLTY2NCw3ICs2NjQsNyBAQAogCWNhc2UgMHgwOgogCQlicC0+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+ICQoQVNNX0dFTkVSQVRFRF9ESVIpL2FzbS8kYTsgKQotZW5kaWYKLQogYm9vdAkJCTo9IGFyY2gvdW5pY29yZTMyL2Jvb3QKIAotIyBEZWZhdWx0IHRhcmdldCB3aGVuIGV4ZWN1dGluZyBwbGFpbiBtYWtlCisjIERlZmF1bHQgZGVmY29uZmlnIGFuZCB0YXJnZXQgd2hlbiBleGVjdXRpbmcgcGxhaW4gbWFrZQorS0JVSUxEX0RFRkNPTkZJRwk6PSAkKEFSQ0gpX2RlZmNvbmZpZwogS0JVSUxEX0lNQUdFCQk6PSB6SW1hZ2UKIAogYWxsOgkkKEtCVUlMRF9JTUFHRSkKQEAgLTgzLDggKzUxLDYgQEAKIHpJbWFnZSBJbWFnZSB1SW1hZ2U6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAotTVJQUk9QRVJfRElSUwkJKz0gJChBU01fR0VORVJBVEVEX0RJUikKLQogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC91bmljb3JlMzIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDk1MzczNDIuLmIwOTU0YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3VuaWNvcmUzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTU5LDcgKzU5LDcgQEAKICMgV2Ugbm93IGhhdmUgYSBQSUMgZGVjb21wcmVzc29yIGltcGxlbWVudGF0aW9uLiAgRGVjb21wcmVzc29ycyBydW5uaW5nCiAjIGZyb20gUkFNIHNob3VsZCBub3QgZGVmaW5lIFpURVhUQUREUi4gIERlY29tcHJlc3NvcnMgcnVubmluZyBkaXJlY3RseQogIyBmcm9tIFJPTSBvciBGbGFzaCBtdXN0IGRlZmluZSBaVEVYVEFERFIgKHByZWZlcmFibHkgdmlhIHRoZSBjb25maWcpCi1aVEVYVEFERFIJOj0gMAorWlRFWFRBRERSCTo9IDB4MDMwMDAwMDAKIFpCU1NBRERSCTo9IEFMSUdOKDQpCiAKIFNFREZMQUdTX2xkcwk9IHMvVEVYVF9TVEFSVC8kKFpURVhUQUREUikvO3MvQlNTX1NUQVJULyQoWkJTU0FERFIpLwpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvY29uZmlncy9kZWJ1Z19kZWZjb25maWcgYi9hcmNoL3VuaWNvcmUzMi9jb25maWdzL3VuaWNvcmUzMl9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC91bmljb3JlMzIvY29uZmlncy9kZWJ1Z19kZWZjb25maWcKcmVuYW1lIHRvIGFyY2gvdW5pY29yZTMyL2NvbmZpZ3MvdW5pY29yZTMyX2RlZmNvbmZpZwppbmRleCBiNWZiZGU5Li5jOWRkMzE5IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9jb25maWdzL2RlYnVnX2RlZmNvbmZpZworKysgYi9hcmNoL3VuaWNvcmUzMi9jb25maWdzL3VuaWNvcmUzMl9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjIyMgR2VuZXJhbCBzZXR1cAogQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DQUxWRVJTSU9OPSItZGVidWciCitDT05GSUdfTE9DQUxWRVJTSU9OPSItdW5pY29yZTMyIgogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CkBAIC02NCw3ICs2NCw2IEBACiBDT05GSUdfSTJDX0VFUFJPTV9BVDI0PW4KIENPTkZJR19MQ0RfQkFDS0xJR0hUPW4KIAotQ09ORklHX1BVVjNfUlRDPXkKIENPTkZJR19QVVYzX1VNQUw9eQogQ09ORklHX1BVVjNfTVVTQj1uCiBDT05GSUdfUFVWM19BQzk3PW4KQEAgLTE2Nyw4ICsxNjYsOSBAQAogQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQogCiAjCVJlYWwgVGltZSBDbG9jawotQ09ORklHX1JUQ19MSUI9bQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX1BVVjM9eQogCiAjIyMgRmlsZSBzeXN0ZW1zCiBDT05GSUdfRVhUMl9GUz1tCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYjIwMGZkYS4uY2ExMTNkNiAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwyICsxLDYxIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCitnZW5lcmljLXkgKz0gYXRvbWljLmgKK2dlbmVyaWMteSArPSBhdXh2ZWMuaAorZ2VuZXJpYy15ICs9IGJpdHNwZXJsb25nLmgKK2dlbmVyaWMteSArPSBidWcuaAorZ2VuZXJpYy15ICs9IGJ1Z3MuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAorZ2VuZXJpYy15ICs9IGRldmljZS5oCitnZW5lcmljLXkgKz0gZGl2NjQuaAorZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKK2dlbmVyaWMteSArPSBlcnJuby5oCitnZW5lcmljLXkgKz0gZmIuaAorZ2VuZXJpYy15ICs9IGZjbnRsLmgKK2dlbmVyaWMteSArPSBmdHJhY2UuaAorZ2VuZXJpYy15ICs9IGZ1dGV4LmgKK2dlbmVyaWMteSArPSBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBod19pcnEuaAorZ2VuZXJpYy15ICs9IGlvY3RsLmgKK2dlbmVyaWMteSArPSBpb2N0bHMuaAorZ2VuZXJpYy15ICs9IGlwY2J1Zi5oCitnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAorZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCitnZW5lcmljLXkgKz0ga21hcF90eXBlcy5oCitnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IG1tYW4uaAorZ2VuZXJpYy15ICs9IG1vZHVsZS5oCitnZW5lcmljLXkgKz0gbXNnYnVmLmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGFycG9ydC5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwb2xsLmgKK2dlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAorZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKK2dlbmVyaWMteSArPSBzZWN0aW9ucy5oCitnZW5lcmljLXkgKz0gc2VnbWVudC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzZXJpYWwuaAorZ2VuZXJpYy15ICs9IHNldHVwLmgKK2dlbmVyaWMteSArPSBzaG1idWYuaAorZ2VuZXJpYy15ICs9IHNobXBhcmFtLmgKK2dlbmVyaWMteSArPSBzaWdpbmZvLmgKK2dlbmVyaWMteSArPSBzaWduYWwuaAorZ2VuZXJpYy15ICs9IHNpemVzLmgKK2dlbmVyaWMteSArPSBzb2NrZXQuaAorZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAorZ2VuZXJpYy15ICs9IHN0YXQuaAorZ2VuZXJpYy15ICs9IHN0YXRmcy5oCitnZW5lcmljLXkgKz0gc3dhYi5oCitnZW5lcmljLXkgKz0gc3lzY2FsbHMuaAorZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKK2dlbmVyaWMteSArPSB0ZXJtaW9zLmgKK2dlbmVyaWMteSArPSB0b3BvbG9neS5oCitnZW5lcmljLXkgKz0gdHlwZXMuaAorZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKK2dlbmVyaWMteSArPSB1bmFsaWduZWQuaAorZ2VuZXJpYy15ICs9IHVzZXIuaAorZ2VuZXJpYy15ICs9IHZnYS5oCitnZW5lcmljLXkgKz0geG9yLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlYzIzYTJmLi5hZWIwZjE4IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw2IEBACiBvYmotJChDT05GSUdfQVJDSF9QVVYzKQkJKz0gY2xvY2subyBpcnEubyB0aW1lLm8KIAogb2JqLSQoQ09ORklHX1BVVjNfR1BJTykJCSs9IGdwaW8ubwotb2JqLSQoQ09ORklHX1BVVjNfUlRDKQkJKz0gcnRjLm8KIG9iai0kKENPTkZJR19QVVYzX1BXTSkJCSs9IHB3bS5vCiBvYmotJChDT05GSUdfUFVWM19QTSkJCSs9IHBtLm8gc2xlZXAubwogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBoaWJlcm5hdGUubyBoaWJlcm5hdGVfYXNtLm8KZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggOWJmN2Y3YS4uNzdlNDA3ZSAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMwLDcgKzMwLDcgQEAKIAlIRUFEX1RFWFRfU0VDVElPTgogCUlOSVRfVEVYVF9TRUNUSU9OKFBBR0VfU0laRSkKIAlJTklUX0RBVEFfU0VDVElPTigxNikKLQlQRVJDUFUoTDFfQ0FDSEVfQllURVMsIFBBR0VfU0laRSkKKwlQRVJDUFVfU0VDVElPTihMMV9DQUNIRV9CWVRFUykKIAlfX2luaXRfZW5kID0gLjsKIAogCV9zdGV4dCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCBkYTM0OTcyLi4zNzM1N2E1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTExNzAsNyArMTE3MCw3IEBACiBjb25maWcgQU1EX05VTUEKIAlkZWZfYm9vbCB5CiAJcHJvbXB0ICJPbGQgc3R5bGUgQU1EIE9wdGVyb24gTlVNQSBkZXRlY3Rpb24iCi0JZGVwZW5kcyBvbiBOVU1BICYmIFBDSQorCWRlcGVuZHMgb24gWDg2XzY0ICYmIE5VTUEgJiYgUENJCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIEFNRCBOVU1BIG5vZGUgdG9wb2xvZ3kgZGV0ZWN0aW9uLiAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmCiAJICB5b3UgaGF2ZSBhIG11bHRpIHByb2Nlc3NvciBBTUQgc3lzdGVtLiBUaGlzIHVzZXMgYW4gb2xkIG1ldGhvZCB0bwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBiX3RpbWVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGJfdGltZXIuaAppbmRleCAyZmVmYTUwLi5hZjYwZDhhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGJfdGltZXIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGJfdGltZXIuaApAQCAtNjIsNyArNjIsNyBAQAogI2Vsc2UgLyogQ09ORklHX0FQQl9USU1FUiAqLwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXBidF9xdWlja19jYWxpYnJhdGUodm9pZCkge3JldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXBidF90aW1lX2luaXQodm9pZCkge3JldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYXBidF90aW1lX2luaXQodm9pZCkgeyB9CiAKICNlbmRpZgogI2VuZGlmIC8qIEFTTV9YODZfQVBCVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tZW1ibG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWVtYmxvY2suaAppbmRleCAxOWFlMTRiLi4wY2QzODAwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tZW1ibG9jay5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKQEAgLTQsNyArNCw2IEBACiAjZGVmaW5lIEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwogCiB1NjQgbWVtYmxvY2tfeDg2X2ZpbmRfaW5fcmFuZ2Vfc2l6ZSh1NjQgc3RhcnQsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbik7Ci12b2lkIG1lbWJsb2NrX3g4Nl90b19ib290bWVtKHU2NCBzdGFydCwgdTY0IGVuZCk7CiAKIHZvaWQgbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kLCBjaGFyICpuYW1lKTsKIHZvaWQgbWVtYmxvY2tfeDg2X2ZyZWVfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kKTsKQEAgLTE5LDUgKzE4LDYgQEAKIHU2NCBtZW1ibG9ja194ODZfZmluZF9pbl9yYW5nZV9ub2RlKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCwgdTY0IHNpemUsIHU2NCBhbGlnbik7CiB1NjQgbWVtYmxvY2tfeDg2X2ZyZWVfbWVtb3J5X2luX3JhbmdlKHU2NCBhZGRyLCB1NjQgbGltaXQpOwogdTY0IG1lbWJsb2NrX3g4Nl9tZW1vcnlfaW5fcmFuZ2UodTY0IGFkZHIsIHU2NCBsaW1pdCk7Citib29sIG1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKHU2NCAqYWRkcnAsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaAppbmRleCA1ZTgzYTQxLi5mZmEwMzdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaApAQCAtNDgsMTcgKzQ4LDYgQEAKICNlbmRpZgogfQogCi0vKgotICogRm9sbG93aW5nIGFyZSBtYWNyb3MgdGhhdCBlYWNoIG51bWEgaW1wbG1lbnRhdGlvbiBtdXN0IGRlZmluZS4KLSAqLwotCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlwZ19kYXRhX3QgKl9fcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsJCQkJXAotCV9fcGdkYXQtPm5vZGVfc3RhcnRfcGZuICsgX19wZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOwkJXAotfSkKLQogc3RhdGljIGlubGluZSBpbnQgcGZuX3ZhbGlkKGludCBwZm4pCiB7CiAJaW50IG5pZCA9IHBmbl90b19uaWQocGZuKTsKQEAgLTY4LDYgKzU3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBlYXJseV9wZm5fdmFsaWQocGZuKQlwZm5fdmFsaWQoKHBmbikpCisKICNlbmRpZiAvKiBDT05GSUdfRElTQ09OVElHTUVNICovCiAKICNpZmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfNjQuaAppbmRleCBiM2Y4OGQ3Li4xMjlkOWFhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfNjQuaApAQCAtMTMsOCArMTMsNSBAQAogCiAjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCiAKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKSAgICAgICAoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuICsJXAotCQkJCSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzKQogI2VuZGlmCiAjZW5kaWYgLyogX0FTTV9YODZfTU1aT05FXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaAppbmRleCAzMWQ4NGFjLi5hNTE4YzBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCkBAIC0yMiw2ICsyMiw4IEBACiAJdTY0IHByb2R1Y3Q7CiAjaWZkZWYgX19pMzg2X18KIAl1MzIgdG1wMSwgdG1wMjsKKyNlbHNlCisJdWxvbmcgdG1wOwogI2VuZGlmCiAKIAlpZiAoc2hpZnQgPCAwKQpAQCAtNDIsOCArNDQsMTEgQEAKIAkJOiAiYSIgKCh1MzIpZGVsdGEpLCAiMSIgKCh1MzIpKGRlbHRhID4+IDMyKSksICIyIiAobXVsX2ZyYWMpICk7CiAjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAJX19hc21fXyAoCi0JCSJtdWwgJSVyZHggOyBzaHJkICQzMiwlJXJkeCwlJXJheCIKLQkJOiAiPWEiIChwcm9kdWN0KSA6ICIwIiAoZGVsdGEpLCAiZCIgKCh1NjQpbXVsX2ZyYWMpICk7CisJCSJtdWwgJVttdWxfZnJhY10gOyBzaHJkICQzMiwgJVtoaV0sICVbbG9dIgorCQk6IFtsb10iPWEiKHByb2R1Y3QpLAorCQkgIFtoaV0iPWQiKHRtcCkKKwkJOiAiMCIoZGVsdGEpLAorCQkgIFttdWxfZnJhY10icm0iKCh1NjQpbXVsX2ZyYWMpKTsKICNlbHNlCiAjZXJyb3IgaW1wbGVtZW50IG1lIQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZjVhYmUzYS4uOTBiMDZkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtOCw2ICs4LDcgQEAKIAogaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogIyBEbyBub3QgcHJvZmlsZSBkZWJ1ZyBhbmQgbG93bGV2ZWwgdXRpbGl0aWVzCitDRkxBR1NfUkVNT1ZFX3RzYy5vID0gLXBnCiBDRkxBR1NfUkVNT1ZFX3J0Yy5vID0gLXBnCiBDRkxBR1NfUkVNT1ZFX3BhcmF2aXJ0LXNwaW5sb2Nrcy5vID0gLXBnCiBDRkxBR1NfUkVNT1ZFX3B2Y2xvY2subyA9IC1wZwpAQCAtMjgsNiArMjksNyBAQAogR0NPVl9QUk9GSUxFX3ZzeXNjYWxsXzY0Lm8JOj0gbgogR0NPVl9QUk9GSUxFX2hwZXQubwkJOj0gbgogR0NPVl9QUk9GSUxFX3RzYy5vCQk6PSBuCitHQ09WX1BST0ZJTEVfdnJlYWRfdHNjXzY0Lm8JOj0gbgogR0NPVl9QUk9GSUxFX3BhcmF2aXJ0Lm8JCTo9IG4KIAogIyB2cmVhZF90c2NfNjQgaXMgaG90IGFuZCBzaG91bGQgYmUgZnVsbHkgb3B0aW1pemVkOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLlMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUwppbmRleCBlYWQyMWI2Li5iNGZkODM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUwpAQCAtMjgsNiArMjgsOCBAQAogcG1vZGVfY3I0OgkubG9uZwkwCS8qIFNhdmVkICVjcjQgKi8KIHBtb2RlX2VmZXI6CS5xdWFkCTAJLyogU2F2ZWQgRUZFUiAqLwogcG1vZGVfZ2R0OgkucXVhZAkwCitwbW9kZV9taXNjX2VuOgkucXVhZAkwCS8qIFNhdmVkIE1JU0NfRU5BQkxFIE1TUiAqLworcG1vZGVfYmVoYXZpb3I6CS5sb25nCTAJLyogV2FrZXVwIGJlaGF2aW9yIGZsYWdzICovCiByZWFsbW9kZV9mbGFnczoJLmxvbmcJMAogcmVhbF9tYWdpYzoJLmxvbmcJMAogdHJhbXBvbGluZV9zZWdtZW50Ogkud29yZCAwCkBAIC05MSw2ICs5MywxOCBAQAogCS8qIENhbGwgdGhlIEMgY29kZSAqLwogCWNhbGxsCW1haW4KIAorCS8qIFJlc3RvcmUgTUlTQ19FTkFCTEUgYmVmb3JlIGVudGVyaW5nIHByb3RlY3RlZCBtb2RlLCBpbiBjYXNlCisJICAgQklPUyBkZWNpZGVkIHRvIGNsZWFyIFhEX0RJU0FCTEUgZHVyaW5nIFMzLiAqLworCW1vdmwJcG1vZGVfYmVoYXZpb3IsICVlYXgKKwlidGwJJFdBS0VVUF9CRUhBVklPUl9SRVNUT1JFX01JU0NfRU5BQkxFLCAlZWF4CisJam5jCTFmCisKKwltb3ZsCXBtb2RlX21pc2NfZW4sICVlYXgKKwltb3ZsCXBtb2RlX21pc2NfZW4gKyA0LCAlZWR4CisJbW92bAkkTVNSX0lBMzJfTUlTQ19FTkFCTEUsICVlY3gKKwl3cm1zcgorMToKKwogCS8qIERvIGFueSBvdGhlciBzdHVmZi4uLiAqLwogCiAjaWZuZGVmIENPTkZJR182NEJJVApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLmggYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaAppbmRleCBlMTgyOGMwLi45N2EyOWUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaApAQCAtMjEsNiArMjEsOSBAQAogCXUzMiBwbW9kZV9lZmVyX2xvdzsJLyogUHJvdGVjdGVkIG1vZGUgRUZFUiAqLwogCXUzMiBwbW9kZV9lZmVyX2hpZ2g7CiAJdTY0IHBtb2RlX2dkdDsKKwl1MzIgcG1vZGVfbWlzY19lbl9sb3c7CS8qIFByb3RlY3RlZCBtb2RlIE1JU0NfRU5BQkxFICovCisJdTMyIHBtb2RlX21pc2NfZW5faGlnaDsKKwl1MzIgcG1vZGVfYmVoYXZpb3I7CS8qIFdha2V1cCByb3V0aW5lIGJlaGF2aW9yIGZsYWdzICovCiAJdTMyIHJlYWxtb2RlX2ZsYWdzOwogCXUzMiByZWFsX21hZ2ljOwogCXUxNiB0cmFtcG9saW5lX3NlZ21lbnQ7CS8qIHNlZ21lbnQgd2l0aCB0cmFtcG9saW5lIGNvZGUsIDY0LWJpdCBvbmx5ICovCkBAIC0zOSw0ICs0Miw3IEBACiAjZGVmaW5lIFdBS0VVUF9IRUFERVJfU0lHTkFUVVJFIDB4NTFlZTExMTEKICNkZWZpbmUgV0FLRVVQX0VORF9TSUdOQVRVUkUJMHg2NWEyMmM4MgogCisvKiBXYWtldXAgYmVoYXZpb3IgYml0cyAqLworI2RlZmluZSBXQUtFVVBfQkVIQVZJT1JfUkVTVE9SRV9NSVNDX0VOQUJMRSAgICAgMAorCiAjZW5kaWYgLyogQVJDSF9YODZfS0VSTkVMX0FDUElfUk1fV0FLRVVQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCmluZGV4IDE4YTg1N2IuLjEwM2I2YWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtNzcsNiArNzcsMTIgQEAKIAogCWhlYWRlci0+cG1vZGVfY3IwID0gcmVhZF9jcjAoKTsKIAloZWFkZXItPnBtb2RlX2NyNCA9IHJlYWRfY3I0X3NhZmUoKTsKKwloZWFkZXItPnBtb2RlX2JlaGF2aW9yID0gMDsKKwlpZiAoIXJkbXNyX3NhZmUoTVNSX0lBMzJfTUlTQ19FTkFCTEUsCisJCQkmaGVhZGVyLT5wbW9kZV9taXNjX2VuX2xvdywKKwkJCSZoZWFkZXItPnBtb2RlX21pc2NfZW5faGlnaCkpCisJCWhlYWRlci0+cG1vZGVfYmVoYXZpb3IgfD0KKwkJCSgxIDw8IFdBS0VVUF9CRUhBVklPUl9SRVNUT1JFX01JU0NfRU5BQkxFKTsKIAloZWFkZXItPnJlYWxtb2RlX2ZsYWdzID0gYWNwaV9yZWFsbW9kZV9mbGFnczsKIAloZWFkZXItPnJlYWxfbWFnaWMgPSAweDEyMzQ1Njc4OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKaW5kZXggY2Q4Y2JlYi4uN2MzYTk1ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9nYXJ0Lmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXVfcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vYW1kX2lvbW11X3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2FtZF9pb21tdS5oPgpAQCAtMTU0LDYgKzE1NSwxMCBAQAogCXBkZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdChQQ0lfQlVTKGFsaWFzKSwgYWxpYXMgJiAweGZmKTsKIAlpZiAocGRldikKIAkJZGV2X2RhdGEtPmFsaWFzID0gJnBkZXYtPmRldjsKKwllbHNlIHsKKwkJa2ZyZWUoZGV2X2RhdGEpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KIAogCWF0b21pY19zZXQoJmRldl9kYXRhLT5iaW5kLCAwKTsKIApAQCAtMTYzLDYgKzE2OCwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpb21tdV9pZ25vcmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgZGV2aWQsIGFsaWFzOworCisJZGV2aWQgPSBnZXRfZGV2aWNlX2lkKGRldik7CisJYWxpYXMgPSBhbWRfaW9tbXVfYWxpYXNfdGFibGVbZGV2aWRdOworCisJbWVtc2V0KCZhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXSwgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfdGFibGVfZW50cnkpKTsKKwltZW1zZXQoJmFtZF9pb21tdV9kZXZfdGFibGVbYWxpYXNdLCAwLCBzaXplb2Yoc3RydWN0IGRldl90YWJsZV9lbnRyeSkpOworCisJYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdID0gTlVMTDsKKwlhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVthbGlhc10gPSBOVUxMOworfQorCiBzdGF0aWMgdm9pZCBpb21tdV91bmluaXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlrZnJlZShkZXYtPmFyY2hkYXRhLmlvbW11KTsKQEAgLTE5Miw3ICsyMTEsOSBAQAogCQkJY29udGludWU7CiAKIAkJcmV0ID0gaW9tbXVfaW5pdF9kZXZpY2UoJnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPT0gLUVOT1RTVVBQKQorCQkJaW9tbXVfaWdub3JlX2RldmljZSgmcGRldi0+ZGV2KTsKKwkJZWxzZSBpZiAocmV0KQogCQkJZ290byBvdXRfZnJlZTsKIAl9CiAKQEAgLTIzODMsNiArMjQwNCwyMyBAQAogCS5kbWFfc3VwcG9ydGVkID0gYW1kX2lvbW11X2RtYV9zdXBwb3J0ZWQsCiB9OwogCitzdGF0aWMgdW5zaWduZWQgZGV2aWNlX2RtYV9vcHNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCB1bmhhbmRsZWQgPSAwOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWlmICghY2hlY2tfZGV2aWNlKCZwZGV2LT5kZXYpKSB7CisJCQl1bmhhbmRsZWQgKz0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGRldi0+ZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmYW1kX2lvbW11X2RtYV9vcHM7CisJfQorCisJcmV0dXJuIHVuaGFuZGxlZDsKK30KKwogLyoKICAqIFRoZSBmdW5jdGlvbiB3aGljaCBjbHVlcyB0aGUgQU1EIElPTU1VIGRyaXZlciBpbnRvIGRtYV9vcHMuCiAgKi8KQEAgLTIzOTUsNyArMjQzMyw3IEBACiBpbnQgX19pbml0IGFtZF9pb21tdV9pbml0X2RtYV9vcHModm9pZCkKIHsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlpbnQgcmV0OworCWludCByZXQsIHVuaGFuZGxlZDsKIAogCS8qCiAJICogZmlyc3QgYWxsb2NhdGUgYSBkZWZhdWx0IHByb3RlY3Rpb24gZG9tYWluIGZvciBldmVyeSBJT01NVSB3ZQpAQCAtMjQyMSw3ICsyNDU5LDExIEBACiAJc3dpb3RsYiA9IDA7CiAKIAkvKiBNYWtlIHRoZSBkcml2ZXIgZmluYWxseSB2aXNpYmxlIHRvIHRoZSBkcml2ZXJzICovCi0JZG1hX29wcyA9ICZhbWRfaW9tbXVfZG1hX29wczsKKwl1bmhhbmRsZWQgPSBkZXZpY2VfZG1hX29wc19pbml0KCk7CisJaWYgKHVuaGFuZGxlZCAmJiBtYXhfcGZuID4gTUFYX0RNQTMyX1BGTikgeworCQkvKiBUaGVyZSBhcmUgdW5oYW5kbGVkIGRldmljZXMgLSBpbml0aWFsaXplIHN3aW90bGIgZm9yIHRoZW0gKi8KKwkJc3dpb3RsYiA9IDE7CisJfQogCiAJYW1kX2lvbW11X3N0YXRzX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYwppbmRleCA5MTc5YzIxLi5iZmM4NDUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYwpAQCAtNzMxLDggKzczMSw4IEBACiB7CiAJdTggKnAgPSAodTggKiloOwogCXU4ICplbmQgPSBwLCBmbGFncyA9IDA7Ci0JdTE2IGRldl9pLCBkZXZpZCA9IDAsIGRldmlkX3N0YXJ0ID0gMCwgZGV2aWRfdG8gPSAwOwotCXUzMiBleHRfZmxhZ3MgPSAwOworCXUxNiBkZXZpZCA9IDAsIGRldmlkX3N0YXJ0ID0gMCwgZGV2aWRfdG8gPSAwOworCXUzMiBkZXZfaSwgZXh0X2ZsYWdzID0gMDsKIAlib29sIGFsaWFzID0gZmFsc2U7CiAJc3RydWN0IGl2aGRfZW50cnkgKmU7CiAKQEAgLTg4Nyw3ICs4ODcsNyBAQAogLyogSW5pdGlhbGl6ZXMgdGhlIGRldmljZS0+aW9tbXUgbWFwcGluZyBmb3IgdGhlIGRyaXZlciAqLwogc3RhdGljIGludCBfX2luaXQgaW5pdF9pb21tdV9kZXZpY2VzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewotCXUxNiBpOworCXUzMiBpOwogCiAJZm9yIChpID0gaW9tbXUtPmZpcnN0X2RldmljZTsgaSA8PSBpb21tdS0+bGFzdF9kZXZpY2U7ICsraSkKIAkJc2V0X2lvbW11X2Zvcl9kZXZpY2UoaW9tbXUsIGkpOwpAQCAtMTE3Nyw3ICsxMTc3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgaW5pdF9kZXZpY2VfdGFibGUodm9pZCkKIHsKLQl1MTYgZGV2aWQ7CisJdTMyIGRldmlkOwogCiAJZm9yIChkZXZpZCA9IDA7IGRldmlkIDw9IGFtZF9pb21tdV9sYXN0X2JkZjsgKytkZXZpZCkgewogCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX1ZBTElEKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCBiOTYxYWY4Li5iOTMzOGI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC0zOTAsNyArMzkwLDggQEAKIAogLyoKICAqIElmIG1hc2s9MSwgdGhlIExWVCBlbnRyeSBkb2VzIG5vdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIHdoaWxlIG1hc2s9MAotICogZW5hYmxlcyB0aGUgdmVjdG9yLiBTZWUgYWxzbyB0aGUgQktER3MuCisgKiBlbmFibGVzIHRoZSB2ZWN0b3IuIFNlZSBhbHNvIHRoZSBCS0RHcy4gTXVzdCBiZSBjYWxsZWQgd2l0aAorICogcHJlZW1wdGlvbiBkaXNhYmxlZC4KICAqLwogCiBpbnQgc2V0dXBfQVBJQ19laWx2dCh1OCBvZmZzZXQsIHU4IHZlY3RvciwgdTggbXNnX3R5cGUsIHU4IG1hc2spCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwppbmRleCBiNTExYTAxLi5hZGM2NmMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKQEAgLTYzMiwxNCArNjMyLDE0IEBACiAKIC8qIERpcmVjdCBMZWdhY3kgVkdBIEkvTyB0cmFmZmljIHRvIGRlc2lnbmF0ZWQgSU9IICovCiBpbnQgdXZfc2V0X3ZnYV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgYm9vbCBkZWNvZGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjb21tYW5kX2JpdHMsIGJvb2wgY2hhbmdlX2JyaWRnZSkKKwkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgdTMyIGZsYWdzKQogewogCWludCBkb21haW4sIGJ1cywgcmM7CiAKLQlQUl9ERVZFTCgiZGV2Zm4gJXggZGVjb2RlICVkIGNtZCAleCBjaGdfYnJkZyAlZFxuIiwKLQkJCXBkZXYtPmRldmZuLCBkZWNvZGUsIGNvbW1hbmRfYml0cywgY2hhbmdlX2JyaWRnZSk7CisJUFJfREVWRUwoImRldmZuICV4IGRlY29kZSAlZCBjbWQgJXggZmxhZ3MgJWRcbiIsCisJCQlwZGV2LT5kZXZmbiwgZGVjb2RlLCBjb21tYW5kX2JpdHMsIGZsYWdzKTsKIAotCWlmICghY2hhbmdlX2JyaWRnZSkKKwlpZiAoIShmbGFncyAmIFBDSV9WR0FfU1RBVEVfQ0hBTkdFX0JSSURHRSkpCiAJCXJldHVybiAwOwogCiAJaWYgKChjb21tYW5kX2JpdHMgJiBQQ0lfQ09NTUFORF9JTykgPT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCmluZGV4IDY5MGJjODQuLjlhZWI3OGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KIAogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL2lycV9jb250cm9sbGVyLmg+CkBAIC05OCw2ICs5OSwxNiBAQAogCXJldHVybiBfX2FsbG9jX2Jvb3RtZW0oc2l6ZSwgYWxpZ24sIF9fcGEoTUFYX0RNQV9BRERSRVNTKSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKK3ZvaWQgX19pbml0IGVhcmx5X2luaXRfZHRfc2V0dXBfaW5pdHJkX2FyY2godW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoc3RhcnQpOworCWluaXRyZF9lbmQgPSAodW5zaWduZWQgbG9uZylfX3ZhKGVuZCk7CisJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKK30KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBhZGRfZHRiKHU2NCBkYXRhKQogewogCWluaXRpYWxfZHRiID0gZGF0YSArIG9mZnNldG9mKHN0cnVjdCBzZXR1cF9kYXRhLCBkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDQyNmE1YjYuLmUxYmE4Y2IyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMzNyw3ICszMzcsNyBAQAogICogUG93ZXJtYW5hZ2VtZW50IGlkbGUgZnVuY3Rpb24sIGlmIGFueS4uCiAgKi8KIHZvaWQgKCpwbV9pZGxlKSh2b2lkKTsKLSNpZiBkZWZpbmVkKENPTkZJR19BUE1fTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19BUE1fQ1BVX0lETEUpCisjaWZkZWYgQ09ORklHX0FQTV9NT0RVTEUKIEVYUE9SVF9TWU1CT0wocG1faWRsZSk7CiAjZW5kaWYKIApAQCAtMzk5LDcgKzM5OSw3IEBACiAJCWNwdV9yZWxheCgpOwogCX0KIH0KLSNpZiBkZWZpbmVkKENPTkZJR19BUE1fTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19BUE1fQ1BVX0lETEUpCisjaWZkZWYgQ09ORklHX0FQTV9NT0RVTEUKIEVYUE9SVF9TWU1CT0woZGVmYXVsdF9pZGxlKTsKICNlbmRpZgogCkBAIC02NDIsNyArNjQyLDcgQEAKIAkJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfUE9MTDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibXdhaXQiKSkgewogCQlib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gSURMRV9GT1JDRV9NV0FJVDsKLQkJV0FSTl9PTkNFKDEsICJcaWRsZT1td2FpdFwiIHdpbGwgYmUgcmVtb3ZlZCBpbiAyMDEyXCJcbiIpOworCQlXQVJOX09OQ0UoMSwgIlwiaWRsZT1td2FpdFwiIHdpbGwgYmUgcmVtb3ZlZCBpbiAyMDEyXG4iKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiaGFsdCIpKSB7CiAJCS8qCiAJCSAqIFdoZW4gdGhlIGJvb3Qgb3B0aW9uIG9mIGlkbGU9aGFsdCBpcyBhZGRlZCwgaGFsdCBpcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggOGQxMjg3OC4uYTNkMGRjNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC0yNDUsNyArMjQ1LDYgQEAKIHsKIAlzZXRfdXNlcl9ncyhyZWdzLCAwKTsKIAlyZWdzLT5mcwkJPSAwOwotCXNldF9mcyhVU0VSX0RTKTsKIAlyZWdzLT5kcwkJPSBfX1VTRVJfRFM7CiAJcmVncy0+ZXMJCT0gX19VU0VSX0RTOwogCXJlZ3MtPnNzCQk9IF9fVVNFUl9EUzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IDZjOWRkOTIuLmNhNmY3YWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtMzM4LDcgKzMzOCw2IEBACiAJcmVncy0+Y3MJCT0gX2NzOwogCXJlZ3MtPnNzCQk9IF9zczsKIAlyZWdzLT5mbGFncwkJPSBYODZfRUZMQUdTX0lGOwotCXNldF9mcyhVU0VSX0RTKTsKIAkvKgogCSAqIEZyZWUgdGhlIG9sZCBGUCBhbmQgb3RoZXIgZXh0ZW5kZWQgc3RhdGUKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCAwYzAxNmY3Li45MjQyNDM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC0yOTQsNiArMjk0LDE0IEBACiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJWZXJzYUxvZ2ljIE1lbmxvdyBib2FyZCIpLAogCQl9LAogCX0sCisJeyAvKiBIYW5kbGUgcmVib290IGlzc3VlIG9uIEFjZXIgQXNwaXJlIG9uZSAqLworCQkuY2FsbGJhY2sgPSBzZXRfYmlvc19yZWJvb3QsCisJCS5pZGVudCA9ICJBY2VyIEFzcGlyZSBPbmUgQTExMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBT0ExMTAiKSwKKwkJfSwKKwl9LAogCXsgfQogfTsKIApAQCAtNDExLDYgKzQxOSwzMCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjOSwxIiksCiAJCX0sCiAJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiB0aGUgTGF0aXR1ZGUgRTYzMjAuICovCisJCS5jYWxsYmFjayA9IHNldF9wY2lfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBFNjMyMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEU2MzIwIiksCisJCX0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiB0aGUgTGF0aXR1ZGUgRTU0MjAuICovCisJCS5jYWxsYmFjayA9IHNldF9wY2lfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBFNTQyMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEU1NDIwIiksCisJCX0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiB0aGUgTGF0aXR1ZGUgRTY0MjAuICovCisJCS5jYWxsYmFjayA9IHNldF9wY2lfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBFNjQyMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEU2NDIwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGVlZmQ5NjcuLjlmZDMxMzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMjg1LDYgKzI4NSwxOSBAQAogCXBlcl9jcHUoY3B1X3N0YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gQ1BVX09OTElORTsKIAl4ODZfcGxhdGZvcm0ubm1pX2luaXQoKTsKIAorCS8qCisJICogV2FpdCB1bnRpbCB0aGUgY3B1IHdoaWNoIGJyb3VnaHQgdGhpcyBvbmUgdXAgbWFya2VkIGl0CisJICogb25saW5lIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzLiBJZiB3ZSBkb24ndCBkbyB0aGF0IHRoZW4KKwkgKiB3ZSBjYW4gZW5kIHVwIHdha2luZyB1cCB0aGUgc29mdGlycSB0aHJlYWQgYmVmb3JlIHRoaXMgY3B1CisJICogcmVhY2hlZCB0aGUgYWN0aXZlIHN0YXRlLCB3aGljaCBtYWtlcyB0aGUgc2NoZWR1bGVyIHVuaGFwcHkKKwkgKiBhbmQgc2NoZWR1bGUgdGhlIHNvZnRpcnEgdGhyZWFkIG9uIHRoZSB3cm9uZyBjcHUuIFRoaXMgaXMKKwkgKiBvbmx5IG9ic2VydmFibGUgd2l0aCBmb3JjZWQgdGhyZWFkZWQgaW50ZXJydXB0cywgYnV0IGluCisJICogdGhlb3J5IGl0IGNvdWxkIGFsc28gaGFwcGVuIHcvbyB0aGVtLiBJdCdzIGp1c3Qgd2F5IGhhcmRlcgorCSAqIHRvIGFjaGlldmUuCisJICovCisJd2hpbGUgKCFjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2FjdGl2ZV9tYXNrKSkKKwkJY3B1X3JlbGF4KCk7CisKIAkvKiBlbmFibGUgbG9jYWwgaW50ZXJydXB0cyAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApAQCAtMTMzMiw3ICsxMzQ1LDcgQEAKIAl2b2lkICptd2FpdF9wdHI7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gX190aGlzX2NwdV9wdHIoJmNwdV9pbmZvKTsKIAotCWlmICghdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX01XQUlUKSAmJiBtd2FpdF91c2FibGUoYykpCisJaWYgKCEodGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX01XQUlUKSAmJiBtd2FpdF91c2FibGUoYykpKQogCQlyZXR1cm47CiAJaWYgKCF0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFNIKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYyBiL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKaW5kZXggZDZlMjQ3Ny4uYWRjOTg2NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jCkBAIC00NywzOCArNDcsNDAgQEAKICNkZWZpbmUgRHN0REkgICAgICAgKDU8PDEpCS8qIERlc3RpbmF0aW9uIGlzIGluIEVTOihFKURJICovCiAjZGVmaW5lIERzdE1lbTY0ICAgICg2PDwxKQkvKiA2NGJpdCBtZW1vcnkgb3BlcmFuZCAqLwogI2RlZmluZSBEc3RJbW1VQnl0ZSAoNzw8MSkJLyogOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSNkZWZpbmUgRHN0TWFzayAgICAgKDc8PDEpCisjZGVmaW5lIERzdERYICAgICAgICg4PDwxKQkvKiBEZXN0aW5hdGlvbiBpcyBpbiBEWCByZWdpc3RlciAqLworI2RlZmluZSBEc3RNYXNrICAgICAoMHhmPDwxKQogLyogU291cmNlIG9wZXJhbmQgdHlwZS4gKi8KLSNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDQpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNSZWcgICAgICAoMTw8NCkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjTWVtICAgICAgKDI8PDQpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNZW0xNiAgICAoMzw8NCkJLyogTWVtb3J5IG9wZXJhbmQgKDE2LWJpdCkuICovCi0jZGVmaW5lIFNyY01lbTMyICAgICg0PDw0KQkvKiBNZW1vcnkgb3BlcmFuZCAoMzItYml0KS4gKi8KLSNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDQpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NCkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjT25lICAgICAgKDc8PDQpCS8qIEltcGxpZWQgJzEnICovCi0jZGVmaW5lIFNyY0ltbVVCeXRlICg4PDw0KSAgICAgIC8qIDgtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNJbW1VICAgICAoOTw8NCkgICAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQgKi8KLSNkZWZpbmUgU3JjU0kgICAgICAgKDB4YTw8NCkJLyogU291cmNlIGlzIGluIHRoZSBEUzpSU0kgKi8KLSNkZWZpbmUgU3JjSW1tRkFkZHIgKDB4Yjw8NCkJLyogU291cmNlIGlzIGltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLwotI2RlZmluZSBTcmNNZW1GQWRkciAoMHhjPDw0KQkvKiBTb3VyY2UgaXMgZmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCi0jZGVmaW5lIFNyY0FjYyAgICAgICgweGQ8PDQpCS8qIFNvdXJjZSBBY2N1bXVsYXRvciAqLwotI2RlZmluZSBTcmNJbW1VMTYgICAoMHhlPDw0KSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQsIDE2IGJpdHMgKi8KLSNkZWZpbmUgU3JjTWFzayAgICAgKDB4Zjw8NCkKKyNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDUpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNSZWcgICAgICAoMTw8NSkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjTWVtICAgICAgKDI8PDUpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNNZW0xNiAgICAoMzw8NSkJLyogTWVtb3J5IG9wZXJhbmQgKDE2LWJpdCkuICovCisjZGVmaW5lIFNyY01lbTMyICAgICg0PDw1KQkvKiBNZW1vcnkgb3BlcmFuZCAoMzItYml0KS4gKi8KKyNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDUpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NSkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjT25lICAgICAgKDc8PDUpCS8qIEltcGxpZWQgJzEnICovCisjZGVmaW5lIFNyY0ltbVVCeXRlICg4PDw1KSAgICAgIC8qIDgtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbW1VICAgICAoOTw8NSkgICAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQgKi8KKyNkZWZpbmUgU3JjU0kgICAgICAgKDB4YTw8NSkJLyogU291cmNlIGlzIGluIHRoZSBEUzpSU0kgKi8KKyNkZWZpbmUgU3JjSW1tRkFkZHIgKDB4Yjw8NSkJLyogU291cmNlIGlzIGltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLworI2RlZmluZSBTcmNNZW1GQWRkciAoMHhjPDw1KQkvKiBTb3VyY2UgaXMgZmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCisjZGVmaW5lIFNyY0FjYyAgICAgICgweGQ8PDUpCS8qIFNvdXJjZSBBY2N1bXVsYXRvciAqLworI2RlZmluZSBTcmNJbW1VMTYgICAoMHhlPDw1KSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQsIDE2IGJpdHMgKi8KKyNkZWZpbmUgU3JjRFggICAgICAgKDB4Zjw8NSkJLyogU291cmNlIGlzIGluIERYIHJlZ2lzdGVyICovCisjZGVmaW5lIFNyY01hc2sgICAgICgweGY8PDUpCiAvKiBHZW5lcmljIE1vZFJNIGRlY29kZS4gKi8KLSNkZWZpbmUgTW9kUk0gICAgICAgKDE8PDgpCisjZGVmaW5lIE1vZFJNICAgICAgICgxPDw5KQogLyogRGVzdGluYXRpb24gaXMgb25seSB3cml0dGVuOyBuZXZlciByZWFkLiAqLwotI2RlZmluZSBNb3YgICAgICAgICAoMTw8OSkKLSNkZWZpbmUgQml0T3AgICAgICAgKDE8PDEwKQotI2RlZmluZSBNZW1BYnMgICAgICAoMTw8MTEpICAgICAgLyogTWVtb3J5IG9wZXJhbmQgaXMgYWJzb2x1dGUgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIFN0cmluZyAgICAgICgxPDwxMikgICAgIC8qIFN0cmluZyBpbnN0cnVjdGlvbiAocmVwIGNhcGFibGUpICovCi0jZGVmaW5lIFN0YWNrICAgICAgICgxPDwxMykgICAgIC8qIFN0YWNrIGluc3RydWN0aW9uIChwdXNoL3BvcCkgKi8KLSNkZWZpbmUgR3JvdXBNYXNrICAgKDc8PDE0KSAgICAgLyogT3Bjb2RlIHVzZXMgb25lIG9mIHRoZSBncm91cCBtZWNoYW5pc21zICovCi0jZGVmaW5lIEdyb3VwICAgICAgICgxPDwxNCkgICAgIC8qIEJpdHMgMzo1IG9mIG1vZHJtIGJ5dGUgZXh0ZW5kIG9wY29kZSAqLwotI2RlZmluZSBHcm91cER1YWwgICAoMjw8MTQpICAgICAvKiBBbHRlcm5hdGUgZGVjb2Rpbmcgb2YgbW9kID09IDMgKi8KLSNkZWZpbmUgUHJlZml4ICAgICAgKDM8PDE0KSAgICAgLyogSW5zdHJ1Y3Rpb24gdmFyaWVzIHdpdGggNjYvZjIvZjMgcHJlZml4ICovCi0jZGVmaW5lIFJNRXh0ICAgICAgICg0PDwxNCkgICAgIC8qIE9wY29kZSBleHRlbnNpb24gaW4gTW9kUk0gci9tIGlmIG1vZCA9PSAzICovCi0jZGVmaW5lIFNzZSAgICAgICAgICgxPDwxNykgICAgIC8qIFNTRSBWZWN0b3IgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTW92ICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBCaXRPcCAgICAgICAoMTw8MTEpCisjZGVmaW5lIE1lbUFicyAgICAgICgxPDwxMikgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEzKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KKyNkZWZpbmUgU3RhY2sgICAgICAgKDE8PDE0KSAgICAgLyogU3RhY2sgaW5zdHJ1Y3Rpb24gKHB1c2gvcG9wKSAqLworI2RlZmluZSBHcm91cE1hc2sgICAoNzw8MTUpICAgICAvKiBPcGNvZGUgdXNlcyBvbmUgb2YgdGhlIGdyb3VwIG1lY2hhbmlzbXMgKi8KKyNkZWZpbmUgR3JvdXAgICAgICAgKDE8PDE1KSAgICAgLyogQml0cyAzOjUgb2YgbW9kcm0gYnl0ZSBleHRlbmQgb3Bjb2RlICovCisjZGVmaW5lIEdyb3VwRHVhbCAgICgyPDwxNSkgICAgIC8qIEFsdGVybmF0ZSBkZWNvZGluZyBvZiBtb2QgPT0gMyAqLworI2RlZmluZSBQcmVmaXggICAgICAoMzw8MTUpICAgICAvKiBJbnN0cnVjdGlvbiB2YXJpZXMgd2l0aCA2Ni9mMi9mMyBwcmVmaXggKi8KKyNkZWZpbmUgUk1FeHQgICAgICAgKDQ8PDE1KSAgICAgLyogT3Bjb2RlIGV4dGVuc2lvbiBpbiBNb2RSTSByL20gaWYgbW9kID09IDMgKi8KKyNkZWZpbmUgU3NlICAgICAgICAgKDE8PDE4KSAgICAgLyogU1NFIFZlY3RvciBpbnN0cnVjdGlvbiAqLwogLyogTWlzYyBmbGFncyAqLwogI2RlZmluZSBQcm90ICAgICAgICAoMTw8MjEpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjVUQgaWYgbm90IGluIHByb3QtbW9kZSAqLwogI2RlZmluZSBWZW5kb3JTcGVjaWZpYyAoMTw8MjIpIC8qIFZlbmRvciBzcGVjaWZpYyBpbnN0cnVjdGlvbiAqLwpAQCAtMzE1NCw4ICszMTU2LDggQEAKIAlJKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgU3JjMkltbSwgZW1faW11bF8zb3ApLAogCUkoU3JjSW1tQnl0ZSB8IE1vdiB8IFN0YWNrLCBlbV9wdXNoKSwKIAlJKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgU3JjMkltbUJ5dGUsIGVtX2ltdWxfM29wKSwKLQlEMmJ2SVAoRHN0REkgfCBNb3YgfCBTdHJpbmcsIGlucywgY2hlY2tfcGVybV9pbiksIC8qIGluc2IsIGluc3cvaW5zZCAqLwotCUQyYnZJUChTcmNTSSB8IEltcGxpY2l0T3BzIHwgU3RyaW5nLCBvdXRzLCBjaGVja19wZXJtX291dCksIC8qIG91dHNiLCBvdXRzdy9vdXRzZCAqLworCUQyYnZJUChEc3RESSB8IFNyY0RYIHwgTW92IHwgU3RyaW5nLCBpbnMsIGNoZWNrX3Blcm1faW4pLCAvKiBpbnNiLCBpbnN3L2luc2QgKi8KKwlEMmJ2SVAoU3JjU0kgfCBEc3REWCB8IFN0cmluZywgb3V0cywgY2hlY2tfcGVybV9vdXQpLCAvKiBvdXRzYiwgb3V0c3cvb3V0c2QgKi8KIAkvKiAweDcwIC0gMHg3RiAqLwogCVgxNihEKFNyY0ltbUJ5dGUpKSwKIAkvKiAweDgwIC0gMHg4NyAqLwpAQCAtMzIxMiw4ICszMjE0LDggQEAKIAkvKiAweEU4IC0gMHhFRiAqLwogCUQoU3JjSW1tIHwgU3RhY2spLCBEKFNyY0ltbSB8IEltcGxpY2l0T3BzKSwKIAlEKFNyY0ltbUZBZGRyIHwgTm82NCksIEQoU3JjSW1tQnl0ZSB8IEltcGxpY2l0T3BzKSwKLQlEMmJ2SVAoU3JjTm9uZSB8IERzdEFjYywgICAgIGluLCAgY2hlY2tfcGVybV9pbiksCi0JRDJidklQKFNyY0FjYyB8IEltcGxpY2l0T3BzLCBvdXQsIGNoZWNrX3Blcm1fb3V0KSwKKwlEMmJ2SVAoU3JjRFggfCBEc3RBY2MsIGluLCAgY2hlY2tfcGVybV9pbiksCisJRDJidklQKFNyY0FjYyB8IERzdERYLCBvdXQsIGNoZWNrX3Blcm1fb3V0KSwKIAkvKiAweEYwIC0gMHhGNyAqLwogCU4sIERJKEltcGxpY2l0T3BzLCBpY2VicCksIE4sIE4sCiAJREkoSW1wbGljaXRPcHMgfCBQcml2LCBobHQpLCBEKEltcGxpY2l0T3BzKSwKQEAgLTMzNzAsNyArMzM3Miw3IEBACiAJaW50IGRlZl9vcF9ieXRlcywgZGVmX2FkX2J5dGVzLCBnb2Zmc2V0LCBzaW1kX3ByZWZpeDsKIAlib29sIG9wX3ByZWZpeCA9IGZhbHNlOwogCXN0cnVjdCBvcGNvZGUgb3Bjb2RlOwotCXN0cnVjdCBvcGVyYW5kIG1lbW9wID0geyAudHlwZSA9IE9QX05PTkUgfTsKKwlzdHJ1Y3Qgb3BlcmFuZCBtZW1vcCA9IHsgLnR5cGUgPSBPUF9OT05FIH0sICptZW1vcHAgPSBOVUxMOwogCiAJYy0+ZWlwID0gY3R4dC0+ZWlwOwogCWMtPmZldGNoLnN0YXJ0ID0gYy0+ZWlwOwpAQCAtMzU0NSw5ICszNTQ3LDYgQEAKIAlpZiAobWVtb3AudHlwZSA9PSBPUF9NRU0gJiYgYy0+YWRfYnl0ZXMgIT0gOCkKIAkJbWVtb3AuYWRkci5tZW0uZWEgPSAodTMyKW1lbW9wLmFkZHIubWVtLmVhOwogCi0JaWYgKG1lbW9wLnR5cGUgPT0gT1BfTUVNICYmIGMtPnJpcF9yZWxhdGl2ZSkKLQkJbWVtb3AuYWRkci5tZW0uZWEgKz0gYy0+ZWlwOwotCiAJLyoKIAkgKiBEZWNvZGUgYW5kIGZldGNoIHRoZSBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQogCSAqIG9yIGltbWVkaWF0ZS4KQEAgLTM1NjksNiArMzU2OCw3IEBACiAJCQkJCQkJICAgYy0+b3BfYnl0ZXM7CiAJc3JjbWVtX2NvbW1vbjoKIAkJYy0+c3JjID0gbWVtb3A7CisJCW1lbW9wcCA9ICZjLT5zcmM7CiAJCWJyZWFrOwogCWNhc2UgU3JjSW1tVTE2OgogCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmMtPnNyYywgMiwgZmFsc2UpOwpAQCAtMzYxMyw2ICszNjEzLDEyIEBACiAJCW1lbW9wLmJ5dGVzID0gYy0+b3BfYnl0ZXMgKyAyOwogCQlnb3RvIHNyY21lbV9jb21tb247CiAJCWJyZWFrOworCWNhc2UgU3JjRFg6CisJCWMtPnNyYy50eXBlID0gT1BfUkVHOworCQljLT5zcmMuYnl0ZXMgPSAyOworCQljLT5zcmMuYWRkci5yZWcgPSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwkJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZCgmYy0+c3JjKTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCkBAIC0zNjU5LDYgKzM2NjUsNyBAQAogCWNhc2UgRHN0TWVtOgogCWNhc2UgRHN0TWVtNjQ6CiAJCWMtPmRzdCA9IG1lbW9wOworCQltZW1vcHAgPSAmYy0+ZHN0OwogCQlpZiAoKGMtPmQgJiBEc3RNYXNrKSA9PSBEc3RNZW02NCkKIAkJCWMtPmRzdC5ieXRlcyA9IDg7CiAJCWVsc2UKQEAgLTM2ODIsMTQgKzM2ODksMjMgQEAKIAkJYy0+ZHN0LmFkZHIubWVtLnNlZyA9IFZDUFVfU1JFR19FUzsKIAkJYy0+ZHN0LnZhbCA9IDA7CiAJCWJyZWFrOworCWNhc2UgRHN0RFg6CisJCWMtPmRzdC50eXBlID0gT1BfUkVHOworCQljLT5kc3QuYnl0ZXMgPSAyOworCQljLT5kc3QuYWRkci5yZWcgPSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwkJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZCgmYy0+ZHN0KTsKKwkJYnJlYWs7CiAJY2FzZSBJbXBsaWNpdE9wczoKIAkJLyogU3BlY2lhbCBpbnN0cnVjdGlvbnMgZG8gdGhlaXIgb3duIG9wZXJhbmQgZGVjb2RpbmcuICovCiAJZGVmYXVsdDoKIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KLQkJcmV0dXJuIDA7CisJCWJyZWFrOwogCX0KIAogZG9uZToKKwlpZiAobWVtb3BwICYmIG1lbW9wcC0+dHlwZSA9PSBPUF9NRU0gJiYgYy0+cmlwX3JlbGF0aXZlKQorCQltZW1vcHAtPmFkZHIubWVtLmVhICs9IGMtPmVpcDsKKwogCXJldHVybiAocmMgPT0gWDg2RU1VTF9VTkhBTkRMRUFCTEUpID8gRU1VTEFUSU9OX0ZBSUxFRCA6IEVNVUxBVElPTl9PSzsKIH0KIApAQCAtNDAyNyw3ICs0MDQzLDYgQEAKIAkJYnJlYWs7CiAJY2FzZSAweGVjOiAvKiBpbiBhbCxkeCAqLwogCWNhc2UgMHhlZDogLyogaW4gKGUvcilheCxkeCAqLwotCQljLT5zcmMudmFsID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKIAlkb19pb19pbjoKIAkJaWYgKCFwaW9faW5fZW11bGF0ZWQoY3R4dCwgb3BzLCBjLT5kc3QuYnl0ZXMsIGMtPnNyYy52YWwsCiAJCQkJICAgICAmYy0+ZHN0LnZhbCkpCkBAIC00MDM1LDcgKzQwNTAsNiBAQAogCQlicmVhazsKIAljYXNlIDB4ZWU6IC8qIG91dCBkeCxhbCAqLwogCWNhc2UgMHhlZjogLyogb3V0IGR4LChlL3IpYXggKi8KLQkJYy0+ZHN0LnZhbCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CiAJZG9faW9fb3V0OgogCQlvcHMtPnBpb19vdXRfZW11bGF0ZWQoY3R4dCwgYy0+c3JjLmJ5dGVzLCBjLT5kc3QudmFsLAogCQkJCSAgICAgICZjLT5zcmMudmFsLCAxKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9tbXUuYyBiL2FyY2gveDg2L2t2bS9tbXUuYwppbmRleCBiZDE0YmI0Li5hZWUzODYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbW11LmMKKysrIGIvYXJjaC94ODYva3ZtL21tdS5jCkBAIC01NjUsNyArNTY1LDcgQEAKIAogc3RhdGljIGJvb2wgbWFwcGluZ19sZXZlbF9kaXJ0eV9iaXRtYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBsYXJnZV9nZm4pCiB7Ci0JcmV0dXJuIGdmbl90b19tZW1zbG90X2RpcnR5X2JpdG1hcCh2Y3B1LCBsYXJnZV9nZm4sIHRydWUpOworCXJldHVybiAhZ2ZuX3RvX21lbXNsb3RfZGlydHlfYml0bWFwKHZjcHUsIGxhcmdlX2dmbiwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgbWFwcGluZ19sZXZlbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGxhcmdlX2dmbikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggNmM0ZGMwMTAuLjlkMDNhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCisrKyBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCQkgICAgZ3ZhX3QgYWRkciwgdTMyIGFjY2VzcykKIHsKIAlwdF9lbGVtZW50X3QgcHRlOwotCXB0X2VsZW1lbnRfdCBfX3VzZXIgKnB0ZXBfdXNlcjsKKwlwdF9lbGVtZW50X3QgX191c2VyICp1bmluaXRpYWxpemVkX3ZhcihwdGVwX3VzZXIpOwogCWdmbl90IHRhYmxlX2dmbjsKIAl1bnNpZ25lZCBpbmRleCwgcHRfYWNjZXNzLCB1bmluaXRpYWxpemVkX3ZhcihwdGVfYWNjZXNzKTsKIAlncGFfdCBwdGVfZ3BhOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3ZteC5jIGIvYXJjaC94ODYva3ZtL3ZteC5jCmluZGV4IDRjM2ZhMGYuLmQ0OGVjNjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS92bXguYworKysgYi9hcmNoL3g4Ni9rdm0vdm14LmMKQEAgLTIwNDcsNyArMjA0Nyw4IEBACiAJCQkJCXVuc2lnbmVkIGxvbmcgY3IwLAogCQkJCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jdm14X2RlY2FjaGVfY3IzKHZjcHUpOworCWlmICghdGVzdF9iaXQoVkNQVV9FWFJFR19DUjMsICh1bG9uZyAqKSZ2Y3B1LT5hcmNoLnJlZ3NfYXZhaWwpKQorCQl2bXhfZGVjYWNoZV9jcjModmNwdSk7CiAJaWYgKCEoY3IwICYgWDg2X0NSMF9QRykpIHsKIAkJLyogRnJvbSBwYWdpbmcvc3RhcnRpbmcgdG8gbm9ucGFnaW5nICovCiAJCXZtY3Nfd3JpdGUzMihDUFVfQkFTRURfVk1fRVhFQ19DT05UUk9MLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggZTE5MWMwOS4uZGI4MzJmZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC05OTMsNiArOTkzLDcgQEAKIHN0YXRpYyB2b2lkIGxndWVzdF90aW1lX2luaXQodm9pZCkKIHsKIAkvKiBTZXQgdXAgdGhlIHRpbWVyIGludGVycnVwdCAoMCkgdG8gZ28gdG8gb3VyIHNpbXBsZSB0aW1lciByb3V0aW5lICovCisJbGd1ZXN0X3NldHVwX2lycSgwKTsKIAlpcnFfc2V0X2hhbmRsZXIoMCwgbGd1ZXN0X3RpbWVfaXJxKTsKIAogCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZsZ3Vlc3RfY2xvY2ssIE5TRUNfUEVSX1NFQyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggZDg2NWM0YWUuLmJiYWFhMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CkBAIC04OTUsOCArODk2LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19YODZfVVYKLSNkZWZpbmUgTUlOX01FTU9SWV9CTE9DS19TSVpFICAgKDEgPDwgU0VDVElPTl9TSVpFX0JJVFMpCi0KIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2Jsb2NrX3NpemVfYnl0ZXModm9pZCkKIHsKIAlpZiAoaXNfdXZfc3lzdGVtKCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21lbWJsb2NrLmMgYi9hcmNoL3g4Ni9tbS9tZW1ibG9jay5jCmluZGV4IGFhMTE2OTMuLjk5MmRhNWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL21lbWJsb2NrLmMKKysrIGIvYXJjaC94ODYvbW0vbWVtYmxvY2suYwpAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYW5nZS5oPgogCiAvKiBDaGVjayBmb3IgYWxyZWFkeSByZXNlcnZlZCBhcmVhcyAqLwotc3RhdGljIGJvb2wgX19pbml0IGNoZWNrX3dpdGhfbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh1NjQgKmFkZHJwLCB1NjQgKnNpemVwLCB1NjQgYWxpZ24pCitib29sIF9faW5pdCBtZW1ibG9ja194ODZfY2hlY2tfcmVzZXJ2ZWRfc2l6ZSh1NjQgKmFkZHJwLCB1NjQgKnNpemVwLCB1NjQgYWxpZ24pCiB7CiAJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKIAl1NjQgYWRkciA9ICphZGRycCwgbGFzdDsKQEAgLTU5LDcgKzU5LDcgQEAKIAkJaWYgKGFkZHIgPj0gZWlfbGFzdCkKIAkJCWNvbnRpbnVlOwogCQkqc2l6ZXAgPSBlaV9sYXN0IC0gYWRkcjsKLQkJd2hpbGUgKGNoZWNrX3dpdGhfbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSgmYWRkciwgc2l6ZXAsIGFsaWduKSkKKwkJd2hpbGUgKG1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKCZhZGRyLCBzaXplcCwgYWxpZ24pKQogCQkJOwogCiAJCWlmICgqc2l6ZXApCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggY2Y5NzUwMC4uNjg4OTRmZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtMTEyLDggKzExMiwxMCBAQAogc3RhdGljIGludCBubWlfc3RhcnQodm9pZCkKIHsKIAlnZXRfb25saW5lX2NwdXMoKTsKLQlvbl9lYWNoX2NwdShubWlfY3B1X3N0YXJ0LCBOVUxMLCAxKTsKIAljdHJfcnVubmluZyA9IDE7CisJLyogbWFrZSBjdHJfcnVubmluZyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKKwlvbl9lYWNoX2NwdShubWlfY3B1X3N0YXJ0LCBOVUxMLCAxKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUwNCwxNSArNTA2LDE4IEBACiAKIAlubWlfZW5hYmxlZCA9IDA7CiAJY3RyX3J1bm5pbmcgPSAwOwotCWJhcnJpZXIoKTsKKwkvKiBtYWtlIHZhcmlhYmxlcyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKIAllcnIgPSByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnByb2ZpbGVfZXhjZXB0aW9uc19uYik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbmIpOwotCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDEpOwogCW5taV9lbmFibGVkID0gMTsKKwkvKiBtYWtlIG5taV9lbmFibGVkIHZpc2libGUgdG8gdGhlIG5taSBoYW5kbGVyOiAqLworCXNtcF9tYigpOworCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDEpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJcmV0dXJuIDA7CkBAIC01MzEsNyArNTM2LDggQEAKIAlubWlfZW5hYmxlZCA9IDA7CiAJY3RyX3J1bm5pbmcgPSAwOwogCXB1dF9vbmxpbmVfY3B1cygpOwotCWJhcnJpZXIoKTsKKwkvKiBtYWtlIHZhcmlhYmxlcyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKIAl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcHJvZmlsZV9leGNlcHRpb25zX25iKTsKIAltc3JzID0gJmdldF9jcHVfdmFyKGNwdV9tc3JzKTsKIAltb2RlbC0+c2h1dGRvd24obXNycyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCmluZGV4IDlmZDhhNTYuLjljYmI3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCkBAIC02MDksMTYgKzYwOSwyMSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVGhpcyBydW5zIG9ubHkgb24gdGhlIGN1cnJlbnQgY3B1LiBXZSB0cnkgdG8gZmluZCBhbiBMVlQgb2Zmc2V0IGFuZAorICogc2V0dXAgdGhlIGxvY2FsIEFQSUMuIEZvciB0aGlzIHdlIG11c3QgZGlzYWJsZSBwcmVlbXB0aW9uLiBPbgorICogc3VjY2VzcyB3ZSBpbml0aWFsaXplIGFsbCBub2RlcyB3aXRoIHRoaXMgb2Zmc2V0LiBUaGlzIHVwZGF0ZXMgdGhlbgorICogdGhlIG9mZnNldCBpbiB0aGUgSUJTX0NUTCBwZXItbm9kZSBtc3IuIFRoZSBwZXItY29yZSBBUElDIHNldHVwIG9mCisgKiB0aGUgSUJTIGludGVycnVwdCB2ZWN0b3IgaXMgY2FsbGVkIGZyb20gb3BfYW1kX3NldHVwX2N0cnMoKS9vcF8tCisgKiBhbWRfY3B1X3NodXRkb3duKCkgdXNpbmcgdGhlIG5ldyBvZmZzZXQuCisgKi8KIHN0YXRpYyBpbnQgZm9yY2VfaWJzX2VpbHZ0X3NldHVwKHZvaWQpCiB7CiAJaW50IG9mZnNldDsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBmaW5kIHRoZSBuZXh0IGZyZWUgYXZhaWxhYmxlIEVJTFZUIGVudHJ5LCBza2lwIG9mZnNldCAwLAotCSAqIHBpbiBzZWFyY2ggdG8gdGhpcyBjcHUKLQkgKi8KIAlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKiBmaW5kIHRoZSBuZXh0IGZyZWUgYXZhaWxhYmxlIEVJTFZUIGVudHJ5LCBza2lwIG9mZnNldCAwICovCiAJZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQgPCBBUElDX0VJTFZUX05SX01BWDsgb2Zmc2V0KyspIHsKIAkJaWYgKGdldF9laWx2dChvZmZzZXQpKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYWNwaS5jIGIvYXJjaC94ODYvcGNpL2FjcGkuYwppbmRleCAwOTcyMzE1Li42OGMzYzEzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYWNwaS5jCisrKyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgY29hbGVzY2Vfd2luZG93cyhzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbywgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBjb2FsZXNjZV93aW5kb3dzKHN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIHR5cGUpCiB7CiAJaW50IGksIGo7CiAJc3RydWN0IHJlc291cmNlICpyZXMxLCAqcmVzMjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS94ZW4uYyBiL2FyY2gveDg2L3BjaS94ZW4uYwppbmRleCA4MjE0NzI0Li5mNTY3OTY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kveGVuLmMKKysrIGIvYXJjaC94ODYvcGNpL3hlbi5jCkBAIC0zMjcsNyArMzI3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19YRU5fRE9NMAotc3RhdGljIGludCB4ZW5fcmVnaXN0ZXJfcGlycSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZykKK3N0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX3BpcnEodTMyIGdzaSwgaW50IGdzaV9vdmVycmlkZSwgaW50IHRyaWdnZXJpbmcpCiB7CiAJaW50IHJjLCBwaXJxLCBpcnEgPSAtMTsKIAlzdHJ1Y3QgcGh5c2Rldl9tYXBfcGlycSBtYXBfaXJxOwpAQCAtMzQ0LDE2ICszNDQsMTggQEAKIAkJc2hhcmVhYmxlID0gMTsKIAkJbmFtZSA9ICJpb2FwaWMtbGV2ZWwiOwogCX0KLQogCXBpcnEgPSB4ZW5fYWxsb2NhdGVfcGlycV9nc2koZ3NpKTsKIAlpZiAocGlycSA8IDApCiAJCWdvdG8gb3V0OwogCi0JaXJxID0geGVuX2JpbmRfcGlycV9nc2lfdG9faXJxKGdzaSwgcGlycSwgc2hhcmVhYmxlLCBuYW1lKTsKKwlpZiAoZ3NpX292ZXJyaWRlID49IDApCisJCWlycSA9IHhlbl9iaW5kX3BpcnFfZ3NpX3RvX2lycShnc2lfb3ZlcnJpZGUsIHBpcnEsIHNoYXJlYWJsZSwgbmFtZSk7CisJZWxzZQorCQlpcnEgPSB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEoZ3NpLCBwaXJxLCBzaGFyZWFibGUsIG5hbWUpOwogCWlmIChpcnEgPCAwKQogCQlnb3RvIG91dDsKIAotCXByaW50ayhLRVJOX0RFQlVHICJ4ZW46IC0tPiBwaXJxPSVkIC0+IGlycT0lZFxuIiwgcGlycSwgaXJxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAieGVuOiAtLT4gcGlycT0lZCAtPiBpcnE9JWQgKGdzaT0lZClcbiIsIHBpcnEsIGlycSwgZ3NpKTsKIAogCW1hcF9pcnEuZG9taWQgPSBET01JRF9TRUxGOwogCW1hcF9pcnEudHlwZSA9IE1BUF9QSVJRX1RZUEVfR1NJOwpAQCAtMzcwLDcgKzM3Miw3IEBACiAJcmV0dXJuIGlycTsKIH0KIAotc3RhdGljIGludCB4ZW5fcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCitzdGF0aWMgaW50IHhlbl9yZWdpc3Rlcl9nc2kodTMyIGdzaSwgaW50IGdzaV9vdmVycmlkZSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKIHsKIAlpbnQgcmMsIGlycTsKIAlzdHJ1Y3QgcGh5c2Rldl9zZXR1cF9nc2kgc2V0dXBfZ3NpOwpAQCAtMzgxLDcgKzM4Myw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgInhlbjogcmVnaXN0ZXJpbmcgZ3NpICV1IHRyaWdnZXJpbmcgJWQgcG9sYXJpdHkgJWRcbiIsCiAJCQlnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKIAotCWlycSA9IHhlbl9yZWdpc3Rlcl9waXJxKGdzaSwgdHJpZ2dlcmluZyk7CisJaXJxID0geGVuX3JlZ2lzdGVyX3BpcnEoZ3NpLCBnc2lfb3ZlcnJpZGUsIHRyaWdnZXJpbmcpOwogCiAJc2V0dXBfZ3NpLmdzaSA9IGdzaTsKIAlzZXR1cF9nc2kudHJpZ2dlcmluZyA9ICh0cmlnZ2VyaW5nID09IEFDUElfRURHRV9TRU5TSVRJVkUgPyAwIDogMSk7CkBAIC00MDMsNiArNDA1LDggQEAKIAlpbnQgcmM7CiAJaW50IHRyaWdnZXIsIHBvbGFyaXR5OwogCWludCBnc2kgPSBhY3BpX3NjaV9vdmVycmlkZV9nc2k7CisJaW50IGlycSA9IC0xOworCWludCBnc2lfb3ZlcnJpZGUgPSAtMTsKIAogCWlmICghZ3NpKQogCQlyZXR1cm47CkBAIC00MTksNyArNDIzLDI1IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAieGVuOiBzY2kgb3ZlcnJpZGU6IGdsb2JhbF9pcnE9JWQgdHJpZ2dlcj0lZCAiCiAJCQkicG9sYXJpdHk9JWRcbiIsIGdzaSwgdHJpZ2dlciwgcG9sYXJpdHkpOwogCi0JZ3NpID0geGVuX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXIsIHBvbGFyaXR5KTsKKwkvKiBCZWZvcmUgd2UgYmluZCB0aGUgR1NJIHRvIGEgTGludXggSVJRLCBjaGVjayB3aGV0aGVyCisJICogd2UgbmVlZCB0byBvdmVycmlkZSBpdCB3aXRoIGJ1c19pcnEgKElSUSkgdmFsdWUuIFVzdWFsbHkgZm9yCisJICogSVJRcyBiZWxvdyBJUlFfTEVHQUNZX0lSUSB0aGlzIGhvbGRzIElSUSA9PSBHU0ksIGFzIHNvOgorCSAqICBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAgYnVzX2lycSA5IGdsb2JhbF9pcnEgOSBsb3cgbGV2ZWwpCisJICogYnV0IHRoZXJlIGFyZSBvZGRiYWxscyB3aGVyZSB0aGUgSVJRICE9IEdTSToKKwkgKiAgQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgOSBnbG9iYWxfaXJxIDIwIGxvdyBsZXZlbCkKKwkgKiB3aGljaCBlbmRzIHVwIGJlaW5nOiBnc2lfdG9faXJxWzldID09IDIwCisJICogKHdoaWNoIGlzIHdoYXQgYWNwaV9nc2lfdG9faXJxIGVuZHMgdXAgY2FsbGluZyB3aGVuIHN0YXJ0aW5nIHRoZQorCSAqIHRoZSBBQ1BJIGludGVycHJldGVyIGFuZCBrZWVscyBvdmVyIHNpbmNlIElSUSA5IGhhcyBub3QgYmVlbgorCSAqIHNldHVwIGFzIHdlIGhhZCBzZXR1cCBJUlEgMjAgZm9yIGl0KS4KKwkgKi8KKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBHU0kgIT0gSVJRICovCisJaWYgKGFjcGlfZ3NpX3RvX2lycShnc2ksICZpcnEpID09IDApIHsKKwkJaWYgKGlycSA+PSAwICYmIGlycSAhPSBnc2kpCisJCQkvKiBCdWdnZXIsIHdlIE1VU1QgaGF2ZSB0aGF0IElSUS4gKi8KKwkJCWdzaV9vdmVycmlkZSA9IGlycTsKKwl9CisKKwlnc2kgPSB4ZW5fcmVnaXN0ZXJfZ3NpKGdzaSwgZ3NpX292ZXJyaWRlLCB0cmlnZ2VyLCBwb2xhcml0eSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAieGVuOiBhY3BpIHNjaSAlZFxuIiwgZ3NpKTsKIAogCXJldHVybjsKQEAgLTQyOCw3ICs0NTAsNyBAQAogc3RhdGljIGludCBhY3BpX3JlZ2lzdGVyX2dzaV94ZW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLAogCQkJCSBpbnQgdHJpZ2dlciwgaW50IHBvbGFyaXR5KQogewotCXJldHVybiB4ZW5fcmVnaXN0ZXJfZ3NpKGdzaSwgdHJpZ2dlciwgcG9sYXJpdHkpOworCXJldHVybiB4ZW5fcmVnaXN0ZXJfZ3NpKGdzaSwgLTEgLyogbm8gR1NJIG92ZXJyaWRlICovLCB0cmlnZ2VyLCBwb2xhcml0eSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBjaV94ZW5faW5pdGlhbF9kb21haW4odm9pZCkKQEAgLTQ2Nyw3ICs0ODksNyBAQAogCQlpZiAoYWNwaV9nZXRfb3ZlcnJpZGVfaXJxKGlycSwgJnRyaWdnZXIsICZwb2xhcml0eSkgPT0gLTEpCiAJCQljb250aW51ZTsKIAotCQl4ZW5fcmVnaXN0ZXJfcGlycShpcnEsCisJCXhlbl9yZWdpc3Rlcl9waXJxKGlycSwgLTEgLyogbm8gR1NJIG92ZXJyaWRlICovLAogCQkJdHJpZ2dlciA/IEFDUElfTEVWRUxfU0VOU0lUSVZFIDogQUNQSV9FREdFX1NFTlNJVElWRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCmluZGV4IDBkM2E0ZmEuLjg5OWUzOTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKQEAgLTMxMCwxNCArMzEwLDMxIEBACiAKIAlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgewogCQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQgPSBwOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQgPSBtZC0+cGh5c19hZGRyOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQ7CisJCXU2NCBzdGFydCA9IG1kLT5waHlzX2FkZHI7CisJCXU2NCBzaXplID0gbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVDsKIAogCQlpZiAobWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfQ09ERSAmJgogCQkgICAgbWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkKIAkJCWNvbnRpbnVlOwotCi0JCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHN0YXJ0LCBzdGFydCArIHNpemUsICJFRkkgQm9vdCIpOworCQkvKiBPbmx5IHJlc2VydmUgd2hlcmUgcG9zc2libGU6CisJCSAqIC0gTm90IHdpdGhpbiBhbnkgYWxyZWFkeSBhbGxvY2F0ZWQgYXJlYXMKKwkJICogLSBOb3Qgb3ZlciBhbnkgbWVtb3J5IGFyZWEgKHJlYWxseSBuZWVkZWQsIGlmIGFib3ZlPykKKwkJICogLSBOb3Qgd2l0aGluIGFueSBwYXJ0IG9mIHRoZSBrZXJuZWwKKwkJICogLSBOb3QgdGhlIGJpb3MgcmVzZXJ2ZWQgYXJlYQorCQkqLworCQlpZiAoKHN0YXJ0K3NpemUgPj0gdmlydF90b19waHlzKF90ZXh0KQorCQkJCSYmIHN0YXJ0IDw9IHZpcnRfdG9fcGh5cyhfZW5kKSkgfHwKKwkJCSFlODIwX2FsbF9tYXBwZWQoc3RhcnQsIHN0YXJ0K3NpemUsIEU4MjBfUkFNKSB8fAorCQkJbWVtYmxvY2tfeDg2X2NoZWNrX3Jlc2VydmVkX3NpemUoJnN0YXJ0LCAmc2l6ZSwKKwkJCQkJCQkxPDxFRklfUEFHRV9TSElGVCkpIHsKKwkJCS8qIENvdWxkIG5vdCByZXNlcnZlLCBza2lwIGl0ICovCisJCQltZC0+bnVtX3BhZ2VzID0gMDsKKwkJCW1lbWJsb2NrX2RiZyhQRlggIkNvdWxkIG5vdCByZXNlcnZlIGJvb3QgcmFuZ2UgIgorCQkJCQkiWzB4JTAxMGxseC0weCUwMTBsbHhdXG4iLAorCQkJCQkJc3RhcnQsIHN0YXJ0K3NpemUtMSk7CisJCX0gZWxzZQorCQkJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uoc3RhcnQsIHN0YXJ0K3NpemUsCisJCQkJCQkJIkVGSSBCb290Iik7CiAJfQogfQogCkBAIC0zMzQsNiArMzUxLDEwIEBACiAJCSAgICBtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19EQVRBKQogCQkJY29udGludWU7CiAKKwkJLyogQ291bGQgbm90IHJlc2VydmUgYm9vdCBhcmVhICovCisJCWlmICghc2l6ZSkKKwkJCWNvbnRpbnVlOworCiAJCWZyZWVfYm9vdG1lbV9sYXRlKHN0YXJ0LCBzaXplKTsKIAl9CiB9CkBAIC00ODMsOSArNTA0LDYgQEAKIAl4ODZfcGxhdGZvcm0uc2V0X3dhbGxjbG9jayA9IGVmaV9zZXRfcnRjX21tc3M7CiAjZW5kaWYKIAotCS8qIFNldHVwIGZvciBFRkkgcnVudGltZSBzZXJ2aWNlICovCi0JcmVib290X3R5cGUgPSBCT09UX0VGSTsKLQogI2lmIEVGSV9ERUJVRwogCXByaW50X2VmaV9tZW1tYXAoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IGRkN2I4OGYuLjU1MjUxNjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTEwMzMsNiArMTAzMywxMyBAQAogCXhlbl9yZWJvb3QoU0hVVERPV05fcG93ZXJvZmYpOwogfQogCitzdGF0aWMgdm9pZCB4ZW5fbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlpZiAocG1fcG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYoKTsKKwl4ZW5fcmVib290KFNIVVRET1dOX3Bvd2Vyb2ZmKTsKK30KKwogc3RhdGljIHZvaWQgeGVuX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXhlbl9yZWJvb3QoU0hVVERPV05fY3Jhc2gpOwpAQCAtMTA1OCw3ICsxMDY1LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaGluZV9vcHMgeGVuX21hY2hpbmVfb3BzIF9faW5pdGNvbnN0ID0gewogCS5yZXN0YXJ0ID0geGVuX3Jlc3RhcnQsCiAJLmhhbHQgPSB4ZW5fbWFjaGluZV9oYWx0LAotCS5wb3dlcl9vZmYgPSB4ZW5fbWFjaGluZV9oYWx0LAorCS5wb3dlcl9vZmYgPSB4ZW5fbWFjaGluZV9wb3dlcl9vZmYsCiAJLnNodXRkb3duID0geGVuX21hY2hpbmVfaGFsdCwKIAkuY3Jhc2hfc2h1dGRvd24gPSB4ZW5fY3Jhc2hfc2h1dGRvd24sCiAJLmVtZXJnZW5jeV9yZXN0YXJ0ID0geGVuX2VtZXJnZW5jeV9yZXN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5jIGIvYXJjaC94ODYveGVuL21tdS5jCmluZGV4IGRjNzA4ZGMuLjBjY2NjYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuYworKysgYi9hcmNoL3g4Ni94ZW4vbW11LmMKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL3BhdC5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CkBAIC0xMjMxLDcgKzEyMzIsMTEgQEAKIHsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgbW11ZXh0X29wIG9wOworI2lmZGVmIENPTkZJR19TTVAKKwkJREVDTEFSRV9CSVRNQVAobWFzaywgbnVtX3Byb2Nlc3NvcnMpOworI2Vsc2UKIAkJREVDTEFSRV9CSVRNQVAobWFzaywgTlJfQ1BVUyk7CisjZW5kaWYKIAl9ICphcmdzOwogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwogCkBAIC0xNTk5LDYgKzE2MDQsMTEgQEAKIAkJZm9yIChwdGVpZHggPSAwOyBwdGVpZHggPCBQVFJTX1BFUl9QVEU7IHB0ZWlkeCsrLCBwZm4rKykgewogCQkJcHRlX3QgcHRlOwogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCQkJaWYgKHBmbiA+IG1heF9wZm5fbWFwcGVkKQorCQkJCW1heF9wZm5fbWFwcGVkID0gcGZuOworI2VuZGlmCisKIAkJCWlmICghcHRlX25vbmUocHRlX3BhZ2VbcHRlaWR4XSkpCiAJCQkJY29udGludWU7CiAKQEAgLTE3NjYsNyArMTc3Niw5IEBACiAJaW5pdGlhbF9rZXJuZWxfcG1kID0KIAkJZXh0ZW5kX2JyayhzaXplb2YocG1kX3QpICogUFRSU19QRVJfUE1ELCBQQUdFX1NJWkUpOwogCi0JbWF4X3Bmbl9tYXBwZWQgPSBQRk5fRE9XTihfX3BhKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCkpOworCW1heF9wZm5fbWFwcGVkID0gUEZOX0RPV04oX19wYSh4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZSkgKworCQkJCSAgeGVuX3N0YXJ0X2luZm8tPm5yX3B0X2ZyYW1lcyAqIFBBR0VfU0laRSArCisJCQkJICA1MTIqMTAyNCk7CiAKIAlrZXJuZWxfcG1kID0gbTJ2KHBnZFtLRVJORUxfUEdEX0JPVU5EQVJZXS5wZ2QpOwogCW1lbWNweShpbml0aWFsX2tlcm5lbF9wbWQsIGtlcm5lbF9wbWQsIHNpemVvZihwbWRfdCkgKiBQVFJTX1BFUl9QTUQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL211bHRpY2FsbHMuYyBiL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMKaW5kZXggOGJmZjdlNy4uMWIyYjczZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL211bHRpY2FsbHMuYworKysgYi9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5jCkBAIC0xODksMTAgKzE4OSwxMCBAQAogCXVuc2lnbmVkIGFyZ2lkeCA9IHJvdW5kdXAoYi0+YXJnaWR4LCBzaXplb2YodTY0KSk7CiAKIAlCVUdfT04ocHJlZW1wdGlibGUoKSk7Ci0JQlVHX09OKGItPmFyZ2lkeCA+IE1DX0FSR1MpOworCUJVR19PTihiLT5hcmdpZHggPj0gTUNfQVJHUyk7CiAKIAlpZiAoYi0+bWNpZHggPT0gTUNfQkFUQ0ggfHwKLQkgICAgKGFyZ2lkeCArIGFyZ3MpID4gTUNfQVJHUykgeworCSAgICAoYXJnaWR4ICsgYXJncykgPj0gTUNfQVJHUykgewogCQltY19zdGF0c19mbHVzaChiLT5tY2lkeCA9PSBNQ19CQVRDSCA/IEZMX1NMT1RTIDogRkxfQVJHUyk7CiAJCXhlbl9tY19mbHVzaCgpOwogCQlhcmdpZHggPSByb3VuZHVwKGItPmFyZ2lkeCwgc2l6ZW9mKHU2NCkpOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJcmV0LmFyZ3MgPSAmYi0+YXJnc1thcmdpZHhdOwogCWItPmFyZ2lkeCA9IGFyZ2lkeCArIGFyZ3M7CiAKLQlCVUdfT04oYi0+YXJnaWR4ID4gTUNfQVJHUyk7CisJQlVHX09OKGItPmFyZ2lkeCA+PSBNQ19BUkdTKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIHJldCA9IHsgTlVMTCwgTlVMTCB9OwogCiAJQlVHX09OKHByZWVtcHRpYmxlKCkpOwotCUJVR19PTihiLT5hcmdpZHggPiBNQ19BUkdTKTsKKwlCVUdfT04oYi0+YXJnaWR4ID49IE1DX0FSR1MpOwogCiAJaWYgKGItPm1jaWR4ID09IDApCiAJCXJldHVybiByZXQ7CkBAIC0yMjQsMTQgKzIyNCwxNCBAQAogCWlmIChiLT5lbnRyaWVzW2ItPm1jaWR4IC0gMV0ub3AgIT0gb3ApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKGItPmFyZ2lkeCArIHNpemUpID4gTUNfQVJHUykKKwlpZiAoKGItPmFyZ2lkeCArIHNpemUpID49IE1DX0FSR1MpCiAJCXJldHVybiByZXQ7CiAKIAlyZXQubWMgPSAmYi0+ZW50cmllc1tiLT5tY2lkeCAtIDFdOwogCXJldC5hcmdzID0gJmItPmFyZ3NbYi0+YXJnaWR4XTsKIAliLT5hcmdpZHggKz0gc2l6ZTsKIAotCUJVR19PTihiLT5hcmdpZHggPiBNQ19BUkdTKTsKKwlCVUdfT04oYi0+YXJnaWR4ID49IE1DX0FSR1MpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zZXR1cC5jIGIvYXJjaC94ODYveGVuL3NldHVwLmMKaW5kZXggYmUxYTQ2NC4uNjBhZWViNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NldHVwLmMKKysrIGIvYXJjaC94ODYveGVuL3NldHVwLmMKQEAgLTIyNywxMSArMjI3LDcgQEAKIAogCW1lbWNweShtYXBfcmF3LCBtYXAsIHNpemVvZihtYXApKTsKIAllODIwLm5yX21hcCA9IDA7Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgogCXhlbl9leHRyYV9tZW1fc3RhcnQgPSBtZW1fZW5kOwotI2Vsc2UKLQl4ZW5fZXh0cmFfbWVtX3N0YXJ0ID0gbWF4KCgxVUxMIDw8IDMyKSwgbWVtX2VuZCk7Ci0jZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX2VudHJpZXM7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIGxvbmcgZW5kOwogCkBAIC0yNjYsNiArMjYyLDEyIEBACiAJCWlmIChtYXBbaV0uc2l6ZSA+IDApCiAJCQllODIwX2FkZF9yZWdpb24obWFwW2ldLmFkZHIsIG1hcFtpXS5zaXplLCBtYXBbaV0udHlwZSk7CiAJfQorCS8qIEFsaWduIHRoZSBiYWxsb29uIGFyZWEgc28gdGhhdCBtYXhfbG93X3BmbiBkb2VzIG5vdCBnZXQgc2V0CisJICogdG8gYmUgYXQgdGhlIF9lbmRfIG9mIHRoZSBQQ0kgZ2FwIGF0IHRoZSBmYXIgZW5kIChmZWUwMTAwMCkuCisJICogTm90ZSB0aGF0IHhlbl9leHRyYV9tZW1fc3RhcnQgZ2V0cyBzZXQgaW4gdGhlIGxvb3AgYWJvdmUgdG8gYmUKKwkgKiBwYXN0IHRoZSBsYXN0IEU4MjAgcmVnaW9uLiAqLworCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSAmJiAoeGVuX2V4dHJhX21lbV9zdGFydCA8ICgxVUxMPDwzMikpKQorCQl4ZW5fZXh0cmFfbWVtX3N0YXJ0ID0gKDFVTEw8PDMyKTsKIAogCS8qCiAJICogSW4gZG9tVSwgdGhlIElTQSByZWdpb24gaXMgbm9ybWFsLCB1c2FibGUgbWVtb3J5LCBidXQgd2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zbXAuYyBiL2FyY2gveDg2L3hlbi9zbXAuYwppbmRleCA0MTAzOGMwLi5iNDUzM2E4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc21wLmMKKysrIGIvYXJjaC94ODYveGVuL3NtcC5jCkBAIC0yMDUsMTEgKzIwNSwxOCBAQAogc3RhdGljIHZvaWQgX19pbml0IHhlbl9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKIAl1bnNpZ25lZCBjcHU7CisJdW5zaWduZWQgaW50IGk7CiAKIAl4ZW5faW5pdF9sb2NrX2NwdSgwKTsKIAogCXNtcF9zdG9yZV9jcHVfaW5mbygwKTsKIAljcHVfZGF0YSgwKS54ODZfbWF4X2NvcmVzID0gMTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGkpLCBHRlBfS0VSTkVMKTsKKwkJemFsbG9jX2NwdW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9jb3JlX21hcCwgaSksIEdGUF9LRVJORUwpOworCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X2xsY19zaGFyZWRfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CisJfQogCXNldF9jcHVfc2libGluZ19tYXAoMCk7CiAKIAlpZiAoeGVuX3NtcF9pbnRyX2luaXQoMCkpCmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jLmMgYi9ibG9jay9ibGstaW9jLmMKaW5kZXggYzg5ODA0OS4uMzQyZWFlOSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWlvYy5jCisrKyBiL2Jsb2NrL2Jsay1pb2MuYwpAQCAtMjEsNyArMjEsNyBAQAogCWlmICghaGxpc3RfZW1wdHkoJmlvYy0+Y2ljX2xpc3QpKSB7CiAJCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogCi0JCWNpYyA9IGxpc3RfZW50cnkoaW9jLT5jaWNfbGlzdC5maXJzdCwgc3RydWN0IGNmcV9pb19jb250ZXh0LAorCQljaWMgPSBobGlzdF9lbnRyeShpb2MtPmNpY19saXN0LmZpcnN0LCBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQsCiAJCQkJCQkJCWNpY19saXN0KTsKIAkJY2ljLT5kdG9yKGlvYyk7CiAJfQpAQCAtNTcsNyArNTcsNyBAQAogCWlmICghaGxpc3RfZW1wdHkoJmlvYy0+Y2ljX2xpc3QpKSB7CiAJCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogCi0JCWNpYyA9IGxpc3RfZW50cnkoaW9jLT5jaWNfbGlzdC5maXJzdCwgc3RydWN0IGNmcV9pb19jb250ZXh0LAorCQljaWMgPSBobGlzdF9lbnRyeShpb2MtPmNpY19saXN0LmZpcnN0LCBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQsCiAJCQkJCQkJCWNpY19saXN0KTsKIAkJY2ljLT5leGl0KGlvYyk7CiAJfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRocm90dGxlLmMgYi9ibG9jay9ibGstdGhyb3R0bGUuYwppbmRleCBhNjJiZThkLi4zNjg5ZjgzIDEwMDY0NAotLS0gYS9ibG9jay9ibGstdGhyb3R0bGUuYworKysgYi9ibG9jay9ibGstdGhyb3R0bGUuYwpAQCAtOTI3LDcgKzkyNyw3IEBACiAKIAliaW9fbGlzdF9pbml0KCZiaW9fbGlzdF9vbl9zdGFjayk7CiAKLQl0aHJvdGxfbG9nKHRkLCAiZGlzcGF0Y2ggbnJfcXVldWVkPSVsdSByZWFkPSV1IHdyaXRlPSV1IiwKKwl0aHJvdGxfbG9nKHRkLCAiZGlzcGF0Y2ggbnJfcXVldWVkPSVkIHJlYWQ9JXUgd3JpdGU9JXUiLAogCQkJdG90YWxfbnJfcXVldWVkKHRkKSwgdGQtPm5yX3F1ZXVlZFtSRUFEXSwKIAkJCXRkLT5ucl9xdWV1ZWRbV1JJVEVdKTsKIApAQCAtMTIwNCw3ICsxMjA0LDcgQEAKIAl9CiAKIHF1ZXVlX2JpbzoKLQl0aHJvdGxfbG9nX3RnKHRkLCB0ZywgIlslY10gYmlvLiBiZGlzcD0ldSBzej0ldSBicHM9JWxsdSIKKwl0aHJvdGxfbG9nX3RnKHRkLCB0ZywgIlslY10gYmlvLiBiZGlzcD0lbGx1IHN6PSV1IGJwcz0lbGx1IgogCQkJIiBpb2Rpc3A9JXUgaW9wcz0ldSBxdWV1ZWQ9JWQvJWQiLAogCQkJcncgPT0gUkVBRCA/ICdSJyA6ICdXJywKIAkJCXRnLT5ieXRlc19kaXNwW3J3XSwgYmlvLT5iaV9zaXplLCB0Zy0+YnBzW3J3XSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDdjNTJkNjguLmFlMjE5MTkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJaW50IG5yX2NmcXE7CiAKIAkvKgotCSAqIFBlciBncm91cCBidXN5IHF1ZXVzIGF2ZXJhZ2UuIFVzZWZ1bCBmb3Igd29ya2xvYWQgc2xpY2UgY2FsYy4gV2UKKwkgKiBQZXIgZ3JvdXAgYnVzeSBxdWV1ZXMgYXZlcmFnZS4gVXNlZnVsIGZvciB3b3JrbG9hZCBzbGljZSBjYWxjLiBXZQogCSAqIGNyZWF0ZSB0aGUgYXJyYXkgZm9yIGVhY2ggcHJpbyBjbGFzcyBidXQgYXQgcnVuIHRpbWUgaXQgaXMgdXNlZAogCSAqIG9ubHkgZm9yIFJUIGFuZCBCRSBjbGFzcyBhbmQgc2xvdCBmb3IgSURMRSBjbGFzcyByZW1haW5zIHVudXNlZC4KIAkgKiBUaGlzIGlzIHByaW1hcmlseSBkb25lIHRvIGF2b2lkIGNvbmZ1c2lvbiBhbmQgYSBnY2Mgd2FybmluZy4KQEAgLTM2OSwxNiArMzY5LDE2IEBACiAjZGVmaW5lIGNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCBmbXQsIGFyZ3MuLi4pCVwKIAlibGtfYWRkX3RyYWNlX21zZygoY2ZxZCktPnF1ZXVlLCAiY2ZxJWQlYyAlcyAiIGZtdCwgKGNmcXEpLT5waWQsIFwKIAkJCWNmcV9jZnFxX3N5bmMoKGNmcXEpKSA/ICdTJyA6ICdBJywgXAotCQkJYmxrZ19wYXRoKCYoY2ZxcSktPmNmcWctPmJsa2cpLCAjI2FyZ3MpOworCQkJYmxrZ19wYXRoKCYoY2ZxcSktPmNmcWctPmJsa2cpLCAjI2FyZ3MpCiAKICNkZWZpbmUgY2ZxX2xvZ19jZnFnKGNmcWQsIGNmcWcsIGZtdCwgYXJncy4uLikJCQkJXAogCWJsa19hZGRfdHJhY2VfbXNnKChjZnFkKS0+cXVldWUsICIlcyAiIGZtdCwJCQlcCi0JCQkJYmxrZ19wYXRoKCYoY2ZxZyktPmJsa2cpLCAjI2FyZ3MpOyAgICAgIFwKKwkJCQlibGtnX3BhdGgoJihjZnFnKS0+YmxrZyksICMjYXJncykgICAgICAgXAogCiAjZWxzZQogI2RlZmluZSBjZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgZm10LCBhcmdzLi4uKQlcCiAJYmxrX2FkZF90cmFjZV9tc2coKGNmcWQpLT5xdWV1ZSwgImNmcSVkICIgZm10LCAoY2ZxcSktPnBpZCwgIyNhcmdzKQotI2RlZmluZSBjZnFfbG9nX2NmcWcoY2ZxZCwgY2ZxZywgZm10LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApOworI2RlZmluZSBjZnFfbG9nX2NmcWcoY2ZxZCwgY2ZxZywgZm10LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKICNkZWZpbmUgY2ZxX2xvZyhjZnFkLCBmbXQsIGFyZ3MuLi4pCVwKIAlibGtfYWRkX3RyYWNlX21zZygoY2ZxZCktPnF1ZXVlLCAiY2ZxICIgZm10LCAjI2FyZ3MpCkBAIC05ODgsOSArOTg4LDEwIEBACiAKIAljZnFfbG9nX2NmcWcoY2ZxZCwgY2ZxZywgInNlcnZlZDogdnQ9JWxsdSBtaW5fdnQ9JWxsdSIsIGNmcWctPnZkaXNrdGltZSwKIAkJCQkJc3QtPm1pbl92ZGlza3RpbWUpOwotCWNmcV9sb2dfY2ZxcShjZnFxLT5jZnFkLCBjZnFxLCAic2xfdXNlZD0ldSBkaXNwPSV1IGNoYXJnZT0ldSBpb3BzPSV1IgotCQkJIiBzZWN0PSV1IiwgdXNlZF9zbCwgY2ZxcS0+c2xpY2VfZGlzcGF0Y2gsIGNoYXJnZSwKLQkJCWlvcHNfbW9kZShjZnFkKSwgY2ZxcS0+bnJfc2VjdG9ycyk7CisJY2ZxX2xvZ19jZnFxKGNmcXEtPmNmcWQsIGNmcXEsCisJCSAgICAgInNsX3VzZWQ9JXUgZGlzcD0ldSBjaGFyZ2U9JXUgaW9wcz0ldSBzZWN0PSVsdSIsCisJCSAgICAgdXNlZF9zbCwgY2ZxcS0+c2xpY2VfZGlzcGF0Y2gsIGNoYXJnZSwKKwkJICAgICBpb3BzX21vZGUoY2ZxZCksIGNmcXEtPm5yX3NlY3RvcnMpOwogCWNmcV9ibGtpb2NnX3VwZGF0ZV90aW1lc2xpY2VfdXNlZCgmY2ZxZy0+YmxrZywgdXNlZF9zbCwKIAkJCQkJICB1bmFjY291bnRlZF9zbCk7CiAJY2ZxX2Jsa2lvY2dfc2V0X3N0YXJ0X2VtcHR5X3RpbWUoJmNmcWctPmJsa2cpOwpAQCAtMjAyMyw4ICsyMDI0LDggQEAKIAkgKi8KIAlpZiAoc2FtcGxlX3ZhbGlkKGNpYy0+dHRpbWVfc2FtcGxlcykgJiYKIAkgICAgKGNmcXEtPnNsaWNlX2VuZCAtIGppZmZpZXMgPCBjaWMtPnR0aW1lX21lYW4pKSB7Ci0JCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiTm90IGlkbGluZy4gdGhpbmtfdGltZTolZCIsCi0JCQkJY2ljLT50dGltZV9tZWFuKTsKKwkJY2ZxX2xvZ19jZnFxKGNmcWQsIGNmcXEsICJOb3QgaWRsaW5nLiB0aGlua190aW1lOiVsdSIsCisJCQkgICAgIGNpYy0+dHRpbWVfbWVhbik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI3NzIsOCArMjc3MywxNCBAQAogCXNtcF93bWIoKTsKIAljaWMtPmtleSA9IGNmcWRfZGVhZF9rZXkoY2ZxZCk7CiAKLQlpZiAoaW9jLT5pb2NfZGF0YSA9PSBjaWMpCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChyY3VfZGVyZWZlcmVuY2UoaW9jLT5pb2NfZGF0YSkgPT0gY2ljKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlzcGluX2xvY2soJmlvYy0+bG9jayk7CiAJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2MtPmlvY19kYXRhLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2soJmlvYy0+bG9jayk7CisJfSBlbHNlCisJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKGNpYy0+Y2ZxcVtCTEtfUldfQVNZTkNdKSB7CiAJCWNmcV9leGl0X2NmcXEoY2ZxZCwgY2ljLT5jZnFxW0JMS19SV19BU1lOQ10pOwpAQCAtMzA4MCw3ICszMDg3LDggQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmxvY2ssIGZsYWdzKTsKIAotCUJVR19PTihpb2MtPmlvY19kYXRhID09IGNpYyk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZV9jaGVjayhpb2MtPmlvY19kYXRhLAorCQlsb2NrZGVwX2lzX2hlbGQoJmlvYy0+bG9jaykpID09IGNpYyk7CiAKIAlyYWRpeF90cmVlX2RlbGV0ZSgmaW9jLT5yYWRpeF9yb290LCBjZnFkLT5jaWNfaW5kZXgpOwogCWhsaXN0X2RlbF9yY3UoJmNpYy0+Y2ljX2xpc3QpOwpAQCAtMzc4Niw5ICszNzk0LDYgQEAKIAlyZXR1cm4gMDsKIAogcXVldWVfZmFpbDoKLQlpZiAoY2ljKQotCQlwdXRfaW9fY29udGV4dChjaWMtPmlvYyk7Ci0KIAljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJY2ZxX2xvZyhjZnFkLCAic2V0X3JlcXVlc3QgZmFpbCIpOwpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggOTU4MjJhZS4uMzYwODI4OSAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xMzcxLDYgKzEzNzEsNyBAQAogCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsJCS8qIHRoZSBhc3NvY2lhdGVkIGRpc2sgKi8KIAlzcGlubG9ja190CQlsb2NrOwogCisJc3RydWN0IG11dGV4CQlibG9ja19tdXRleDsJLyogcHJvdGVjdHMgYmxvY2tpbmcgKi8KIAlpbnQJCQlibG9jazsJCS8qIGV2ZW50IGJsb2NraW5nIGRlcHRoICovCiAJdW5zaWduZWQgaW50CQlwZW5kaW5nOwkvKiBldmVudHMgYWxyZWFkeSBzZW50IG91dCAqLwogCXVuc2lnbmVkIGludAkJY2xlYXJpbmc7CS8qIGV2ZW50cyBiZWluZyBjbGVhcmVkICovCkBAIC0xNDE0LDIyICsxNDE1LDQ0IEBACiAJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoaW50dl9tc2Vjcyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGlza19ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGJvb2wgc3luYykKKy8qKgorICogZGlza19ibG9ja19ldmVudHMgLSBibG9jayBhbmQgZmx1c2ggZGlzayBldmVudCBjaGVja2luZworICogQGRpc2s6IGRpc2sgdG8gYmxvY2sgZXZlbnRzIGZvcgorICoKKyAqIE9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24sIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBldmVudCBjaGVja2luZworICogaXNuJ3QgaW4gcHJvZ3Jlc3MgYW5kIHdvbid0IGhhcHBlbiB1bnRpbCB1bmJsb2NrZWQgYnkKKyAqIGRpc2tfdW5ibG9ja19ldmVudHMoKS4gIEV2ZW50cyBibG9ja2luZyBpcyBjb3VudGVkIGFuZCB0aGUgYWN0dWFsCisgKiB1bmJsb2NraW5nIGhhcHBlbnMgYWZ0ZXIgdGhlIG1hdGNoaW5nIG51bWJlciBvZiB1bmJsb2NrcyBhcmUgZG9uZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGJsb2NrIGV2ZW50IGNoZWNraW5nIGZyb20KKyAqIGRpc2tfY2xlYXJfZXZlbnRzKCkuCisgKgorICogQ09OVEVYVDoKKyAqIE1pZ2h0IHNsZWVwLgorICovCit2b2lkIGRpc2tfYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewogCXN0cnVjdCBkaXNrX2V2ZW50cyAqZXYgPSBkaXNrLT5ldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgY2FuY2VsOwogCisJaWYgKCFldikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBPdXRlciBtdXRleCBlbnN1cmVzIHRoYXQgdGhlIGZpcnN0IGJsb2NrZXIgY29tcGxldGVzIGNhbmNlbGluZworCSAqIHRoZSBldmVudCB3b3JrIGJlZm9yZSBmdXJ0aGVyIGJsb2NrZXJzIGFyZSBhbGxvd2VkIHRvIGZpbmlzaC4KKwkgKi8KKwltdXRleF9sb2NrKCZldi0+YmxvY2tfbXV0ZXgpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV2LT5sb2NrLCBmbGFncyk7CiAJY2FuY2VsID0gIWV2LT5ibG9jaysrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2LT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoY2FuY2VsKSB7Ci0JCWlmIChzeW5jKQotCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaXNrLT5ldi0+ZHdvcmspOwotCQllbHNlCi0JCQljYW5jZWxfZGVsYXllZF93b3JrKCZkaXNrLT5ldi0+ZHdvcmspOwotCX0KKwlpZiAoY2FuY2VsKQorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpc2stPmV2LT5kd29yayk7CisKKwltdXRleF91bmxvY2soJmV2LT5ibG9ja19tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGlza191bmJsb2NrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgYm9vbCBjaGVja19ub3cpCkBAIC0xNDYxLDI3ICsxNDg0LDYgQEAKIH0KIAogLyoqCi0gKiBkaXNrX2Jsb2NrX2V2ZW50cyAtIGJsb2NrIGFuZCBmbHVzaCBkaXNrIGV2ZW50IGNoZWNraW5nCi0gKiBAZGlzazogZGlzayB0byBibG9jayBldmVudHMgZm9yCi0gKgotICogT24gcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IGV2ZW50IGNoZWNraW5nCi0gKiBpc24ndCBpbiBwcm9ncmVzcyBhbmQgd29uJ3QgaGFwcGVuIHVudGlsIHVuYmxvY2tlZCBieQotICogZGlza191bmJsb2NrX2V2ZW50cygpLiAgRXZlbnRzIGJsb2NraW5nIGlzIGNvdW50ZWQgYW5kIHRoZSBhY3R1YWwKLSAqIHVuYmxvY2tpbmcgaGFwcGVucyBhZnRlciB0aGUgbWF0Y2hpbmcgbnVtYmVyIG9mIHVuYmxvY2tzIGFyZSBkb25lLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgYmxvY2sgZXZlbnQgY2hlY2tpbmcgZnJvbQotICogZGlza19jbGVhcl9ldmVudHMoKS4KLSAqCi0gKiBDT05URVhUOgotICogTWlnaHQgc2xlZXAuCi0gKi8KLXZvaWQgZGlza19ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCi17Ci0JaWYgKGRpc2stPmV2KQotCQlfX2Rpc2tfYmxvY2tfZXZlbnRzKGRpc2ssIHRydWUpOwotfQotCi0vKioKICAqIGRpc2tfdW5ibG9ja19ldmVudHMgLSB1bmJsb2NrIGRpc2sgZXZlbnQgY2hlY2tpbmcKICAqIEBkaXNrOiBkaXNrIHRvIHVuYmxvY2sgZXZlbnRzIGZvcgogICoKQEAgLTE1MDgsMTAgKzE1MTAsMTggQEAKICAqLwogdm9pZCBkaXNrX2NoZWNrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKLQlpZiAoZGlzay0+ZXYpIHsKLQkJX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCBmYWxzZSk7Ci0JCV9fZGlza191bmJsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKwlzdHJ1Y3QgZGlza19ldmVudHMgKmV2ID0gZGlzay0+ZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZXYpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZldi0+bG9jaywgZmxhZ3MpOworCWlmICghZXYtPmJsb2NrKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmV2LT5kd29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fbnJ0X3dxLCAmZXYtPmR3b3JrLCAwKTsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXYtPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRpc2tfY2hlY2tfZXZlbnRzKTsKIApAQCAtMTU0Niw3ICsxNTU2LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmV2LT5sb2NrKTsKIAogCS8qIHVuY29uZHRpb25hbGx5IHNjaGVkdWxlIGV2ZW50IGNoZWNrIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2ggKi8KLQlfX2Rpc2tfYmxvY2tfZXZlbnRzKGRpc2ssIHRydWUpOworCWRpc2tfYmxvY2tfZXZlbnRzKGRpc2spOwogCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fbnJ0X3dxLCAmZXYtPmR3b3JrLCAwKTsKIAlmbHVzaF9kZWxheWVkX3dvcmsoJmV2LT5kd29yayk7CiAJX19kaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2ssIGZhbHNlKTsKQEAgLTE2NjQsNyArMTY3NCw3IEBACiAJaWYgKGludHYgPCAwICYmIGludHYgIT0gLTEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKwlkaXNrX2Jsb2NrX2V2ZW50cyhkaXNrKTsKIAlkaXNrLT5ldi0+cG9sbF9tc2VjcyA9IGludHY7CiAJX19kaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2ssIHRydWUpOwogCkBAIC0xNzUwLDYgKzE3NjAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZldi0+bm9kZSk7CiAJZXYtPmRpc2sgPSBkaXNrOwogCXNwaW5fbG9ja19pbml0KCZldi0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZXYtPmJsb2NrX211dGV4KTsKIAlldi0+YmxvY2sgPSAxOwogCWV2LT5wb2xsX21zZWNzID0gLTE7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmV2LT5kd29yaywgZGlza19ldmVudHNfd29ya2ZuKTsKQEAgLTE3NzAsNyArMTc4MSw3IEBACiAJaWYgKCFkaXNrLT5ldikKIAkJcmV0dXJuOwogCi0JX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKwlkaXNrX2Jsb2NrX2V2ZW50cyhkaXNrKTsKIAogCW11dGV4X2xvY2soJmRpc2tfZXZlbnRzX211dGV4KTsKIAlsaXN0X2RlbF9pbml0KCZkaXNrLT5ldi0+bm9kZSk7CmRpZmYgLS1naXQgYS9jcnlwdG8vZGVmbGF0ZS5jIGIvY3J5cHRvL2RlZmxhdGUuYwppbmRleCBiNWNjYWUyLi5iMDE2NWVjIDEwMDY0NAotLS0gYS9jcnlwdG8vZGVmbGF0ZS5jCisrKyBiL2NyeXB0by9kZWZsYXRlLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBERUZMQVRFX0RFRl9MRVZFTAkJWl9ERUZBVUxUX0NPTVBSRVNTSU9OCiAjZGVmaW5lIERFRkxBVEVfREVGX1dJTkJJVFMJCTExCkBAIC03Myw3ICs3Miw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHpfc3RyZWFtX3MgKnN0cmVhbSA9ICZjdHgtPmRlY29tcF9zdHJlYW07CiAKLQlzdHJlYW0tPndvcmtzcGFjZSA9IGt6YWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwgR0ZQX0tFUk5FTCk7CisJc3RyZWFtLT53b3Jrc3BhY2UgPSB2emFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOwogCWlmICghc3RyZWFtLT53b3Jrc3BhY2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC04Niw3ICs4NSw3IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIG91dF9mcmVlOgotCWtmcmVlKHN0cmVhbS0+d29ya3NwYWNlKTsKKwl2ZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTk5LDcgKzk4LDcgQEAKIHN0YXRpYyB2b2lkIGRlZmxhdGVfZGVjb21wX2V4aXQoc3RydWN0IGRlZmxhdGVfY3R4ICpjdHgpCiB7CiAJemxpYl9pbmZsYXRlRW5kKCZjdHgtPmRlY29tcF9zdHJlYW0pOwotCWtmcmVlKGN0eC0+ZGVjb21wX3N0cmVhbS53b3Jrc3BhY2UpOworCXZmcmVlKGN0eC0+ZGVjb21wX3N0cmVhbS53b3Jrc3BhY2UpOwogfQogCiBzdGF0aWMgaW50IGRlZmxhdGVfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3psaWIuYyBiL2NyeXB0by96bGliLmMKaW5kZXggZDExZDc2MS4uMDZiNjJlNSAxMDA2NDQKLS0tIGEvY3J5cHRvL3psaWIuYworKysgYi9jcnlwdG8vemxpYi5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvY29tcHJlc3MuaD4KIApAQCAtNjAsNyArNTksNyBAQAogCiAJaWYgKHN0cmVhbS0+d29ya3NwYWNlKSB7CiAJCXpsaWJfaW5mbGF0ZUVuZChzdHJlYW0pOwotCQlrZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CisJCXZmcmVlKHN0cmVhbS0+d29ya3NwYWNlKTsKIAkJc3RyZWFtLT53b3Jrc3BhY2UgPSBOVUxMOwogCX0KIH0KQEAgLTIyOCwxMyArMjI3LDEzIEBACiAJCQkJID8gbmxhX2dldF91MzIodGJbWkxJQl9ERUNPTVBfV0lORE9XQklUU10pCiAJCQkJIDogREVGX1dCSVRTOwogCi0Jc3RyZWFtLT53b3Jrc3BhY2UgPSBremFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksIEdGUF9LRVJORUwpOworCXN0cmVhbS0+d29ya3NwYWNlID0gdnphbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTsKIAlpZiAoIXN0cmVhbS0+d29ya3NwYWNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IHpsaWJfaW5mbGF0ZUluaXQyKHN0cmVhbSwgY3R4LT5kZWNvbXBfd2luZG93Qml0cyk7CiAJaWYgKHJldCAhPSBaX09LKSB7Ci0JCWtmcmVlKHN0cmVhbS0+d29ya3NwYWNlKTsKKwkJdmZyZWUoc3RyZWFtLT53b3Jrc3BhY2UpOwogCQlzdHJlYW0tPndvcmtzcGFjZSA9IE5VTEw7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYwppbmRleCBhYmRhMzc4Li4xODFiYzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCkBAIC0xMzksMTMgKzEzOSwyMyBAQAogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdoZXNfZGV2OwogCXN0cnVjdCBnaGVzX2FyciAqZ2hlc19hcnIgPSBkYXRhOwotCWludCByYzsKKwlpbnQgcmMsIGk7CiAKIAlpZiAoaGVzdF9oZHItPnR5cGUgIT0gQUNQSV9IRVNUX1RZUEVfR0VORVJJQ19FUlJPUikKIAkJcmV0dXJuIDA7CiAKIAlpZiAoISgoc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICopaGVzdF9oZHIpLT5lbmFibGVkKQogCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZ2hlc19hcnItPmNvdW50OyBpKyspIHsKKwkJc3RydWN0IGFjcGlfaGVzdF9oZWFkZXIgKmhkcjsKKwkJZ2hlc19kZXYgPSBnaGVzX2Fyci0+Z2hlc19kZXZzW2ldOworCQloZHIgPSAqKHN0cnVjdCBhY3BpX2hlc3RfaGVhZGVyICoqKWdoZXNfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkJaWYgKGhkci0+c291cmNlX2lkID09IGhlc3RfaGRyLT5zb3VyY2VfaWQpIHsKKwkJCXByX3dhcm5pbmcoRldfV0FSTiBIRVNUX1BGWCAiRHVwbGljYXRlZCBoYXJkd2FyZSBlcnJvciBzb3VyY2UgSUQ6ICVkLlxuIiwKKwkJCQkgICBoZHItPnNvdXJjZV9pZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KIAlnaGVzX2RldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiR0hFUyIsIGhlc3RfaGRyLT5zb3VyY2VfaWQpOwogCWlmICghZ2hlc19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IDUyY2E5NjQuLjM3MmY5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTEzMzMsMjMgKzEzMzMsNiBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3Jlc291cmNlc19hcmVfZW5mb3JjZWQpOwogCiAvKgotICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc3BpbmxvY2suCi0gKi8KLWFjcGlfc3RhdHVzCi1hY3BpX29zX2NyZWF0ZV9sb2NrKGFjcGlfc3BpbmxvY2sgKm91dF9oYW5kbGUpCi17Ci0Jc3BpbmxvY2tfdCAqbG9jazsKLQotCWxvY2sgPSBBQ1BJX0FMTE9DQVRFKHNpemVvZihzcGlubG9ja190KSk7Ci0JaWYgKCFsb2NrKQotCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwotCXNwaW5fbG9ja19pbml0KGxvY2spOwotCSpvdXRfaGFuZGxlID0gbG9jazsKLQotCXJldHVybiBBRV9PSzsKLX0KLQotLyoKICAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgYSBzcGlubG9jay4KICAqLwogdm9pZCBhY3BpX29zX2RlbGV0ZV9sb2NrKGFjcGlfc3BpbmxvY2sgaGFuZGxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYWhjaS5jIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCmluZGV4IGQzOGM0MGYuLjQxMjIzYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCX0KIAogCWlmIChtYXNrX3BvcnRfbWFwKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgIm1hc2tpbmcgcG9ydF9tYXAgMHgleCAtPiAweCV4XG4iLAorCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgZGV2LCAibWFza2luZyBwb3J0X21hcCAweCV4IC0+IDB4JXhcbiIsCiAJCQkgICBwb3J0X21hcCwKIAkJCSAgIHBvcnRfbWFwICYgbWFza19wb3J0X21hcCk7CiAJCXBvcnRfbWFwICY9IG1hc2tfcG9ydF9tYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwppbmRleCA3MzZiZWU1Li4wMDBkMDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKQEAgLTQxNDMsOSArNDE0Myw5IEBACiAJICogRGV2aWNlcyB3aGljaCBjaG9rZSBvbiBTRVRYRkVSLiAgQXBwbGllcyBvbmx5IGlmIGJvdGggdGhlCiAJICogZGV2aWNlIGFuZCBjb250cm9sbGVyIGFyZSBTQVRBLgogCSAqLwotCXsgIlBJT05FRVIgRFZELVJXICBEVlJURDA4IiwJIjEuMDAiLAlBVEFfSE9SS0FHRV9OT1NFVFhGRVIgfSwKLQl7ICJQSU9ORUVSIERWRC1SVyAgRFZSLTIxMkQiLAkiMS4yOCIsIEFUQV9IT1JLQUdFX05PU0VUWEZFUiB9LAotCXsgIlBJT05FRVIgRFZELVJXICBEVlItMjE2RCIsCSIxLjA4IiwgQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCisJeyAiUElPTkVFUiBEVkQtUlcgIERWUlREMDgiLAlOVUxMLAlBVEFfSE9SS0FHRV9OT1NFVFhGRVIgfSwKKwl7ICJQSU9ORUVSIERWRC1SVyAgRFZSLTIxMkQiLAlOVUxMLAlBVEFfSE9SS0FHRV9OT1NFVFhGRVIgfSwKKwl7ICJQSU9ORUVSIERWRC1SVyAgRFZSLTIxNkQiLAlOVUxMLAlBVEFfSE9SS0FHRV9OT1NFVFhGRVIgfSwKIAogCS8qIEVuZCBNYXJrZXIgKi8KIAl7IH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKaW5kZXggZGZiNmU5ZC4uN2YwOTlkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKQEAgLTI4MDIsMTAgKzI4MDIsMTEgQEAKIAl9CiAKIAkvKgotCSAqIFNvbWUgY29udHJvbGxlcnMgY2FuJ3QgYmUgZnJvemVuIHZlcnkgd2VsbCBhbmQgbWF5IHNldAotCSAqIHNwdXJ1aW91cyBlcnJvciBjb25kaXRpb25zIGR1cmluZyByZXNldC4gIENsZWFyIGFjY3VtdWxhdGVkCi0JICogZXJyb3IgaW5mb3JtYXRpb24uICBBcyByZXNldCBpcyB0aGUgZmluYWwgcmVjb3ZlcnkgYWN0aW9uLAotCSAqIG5vdGhpbmcgaXMgbG9zdCBieSBkb2luZyB0aGlzLgorCSAqIFNvbWUgY29udHJvbGxlcnMgY2FuJ3QgYmUgZnJvemVuIHZlcnkgd2VsbCBhbmQgbWF5IHNldCBzcHVyaW91cworCSAqIGVycm9yIGNvbmRpdGlvbnMgZHVyaW5nIHJlc2V0LiAgQ2xlYXIgYWNjdW11bGF0ZWQgZXJyb3IKKwkgKiBpbmZvcm1hdGlvbiBhbmQgcmUtdGhhdyB0aGUgcG9ydCBpZiBmcm96ZW4uICBBcyByZXNldCBpcyB0aGUKKwkgKiBmaW5hbCByZWNvdmVyeSBhY3Rpb24gYW5kIHdlIGNyb3NzIGNoZWNrIGxpbmsgb25saW5lbmVzcyBhZ2FpbnN0CisJICogZGV2aWNlIGNsYXNzaWZpY2F0aW9uIGxhdGVyLCBubyBob3RwbHVnIGV2ZW50IGlzIGxvc3QgYnkgdGhpcy4KIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShsaW5rLT5hcC0+bG9jaywgZmxhZ3MpOwogCW1lbXNldCgmbGluay0+ZWhfaW5mbywgMCwgc2l6ZW9mKGxpbmstPmVoX2luZm8pKTsKQEAgLTI4MTQsNiArMjgxNSw5IEBACiAJYXAtPnBmbGFncyAmPSB+QVRBX1BGTEFHX0VIX1BFTkRJTkc7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsaW5rLT5hcC0+bG9jaywgZmxhZ3MpOwogCisJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKQorCQlhdGFfZWhfdGhhd19wb3J0KGFwKTsKKwogCS8qCiAJICogTWFrZSBzdXJlIG9ubGluZW5lc3MgYW5kIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBjb3JyZXNwb25kLgogCSAqIEhvdHBsdWcgY291bGQgaGF2ZSBoYXBwZW5lZCBkdXJpbmcgcmVzZXQgYW5kIHNvbWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IGQ1MWY5NzkuLjkyN2Y5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMzc5Nyw2ICszNzk3LDEyIEBACiAgKi8KIGludCBhdGFfc2FzX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKKwkvKgorCSAqIHRoZSBwb3J0IGlzIG1hcmtlZCBhcyBmcm96ZW4gYXQgYWxsb2NhdGlvbiB0aW1lLCBidXQgaWYgd2UgZG9uJ3QKKwkgKiBoYXZlIG5ldyBlaCwgd2Ugd29uJ3QgdGhhdyBpdAorCSAqLworCWlmICghYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcikKKwkJYXAtPnBmbGFncyAmPSB+QVRBX1BGTEFHX0ZST1pFTjsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zYXNfcG9ydF9zdGFydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCmluZGV4IDc1YTZhMGMuLjVkN2Y1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCkBAIC0xNjEsNiArMTYxLDkgQEAKIAl7IFBDSV9ERVZJQ0UoMHgxMUFCLCAweDYxMjEpLCB9LAogCXsgUENJX0RFVklDRSgweDExQUIsIDB4NjEyMyksIH0sCiAJeyBQQ0lfREVWSUNFKDB4MTFBQiwgMHg2MTQ1KSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxQjRCLCAweDkxQTApLCB9LAorCXsgUENJX0RFVklDRSgweDFCNEIsIDB4OTFBNCksIH0sCisKIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMgYi9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCmluZGV4IDFjNGIzYWEuLmRjODhhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAvKgogICogRnVuY3Rpb246IGdldF9idXJzdF9sZW5ndGhfZW5jb2RlCiAgKiBhcmd1bWVudHM6IGRhdGFsZW5ndGg6IGxlbmd0aCBpbiBieXRlcyBvZiBkYXRhCi0gKiByZXR1cm5zIHZhbHVlIHRvIGJlIHByb2dyYW1tZWQgaW4gcmVnaXN0ZXIgY29ycnJlc3BvbmRpbmcgdG8gZGF0YSBsZW5ndGgKKyAqIHJldHVybnMgdmFsdWUgdG8gYmUgcHJvZ3JhbW1lZCBpbiByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRvIGRhdGEgbGVuZ3RoCiAgKiBUaGlzIHZhbHVlIGlzIGVmZmVjdGl2ZWx5IHRoZSBsb2coYmFzZSAyKSBvZiB0aGUgbGVuZ3RoCiAgKi8KIHN0YXRpYyAgaW50IGdldF9idXJzdF9sZW5ndGhfZW5jb2RlKGludCBkYXRhbGVuZ3RoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL21lbW9yeS5jIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCmluZGV4IDlmOWIyMzUuLjQ1ZDdjOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYworKysgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKQEAgLTMwLDcgKzMwLDYgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgobWVtX3N5c2ZzX211dGV4KTsKIAogI2RlZmluZSBNRU1PUllfQ0xBU1NfTkFNRQkibWVtb3J5IgotI2RlZmluZSBNSU5fTUVNT1JZX0JMT0NLX1NJWkUJKDEgPDwgU0VDVElPTl9TSVpFX0JJVFMpCiAKIHN0YXRpYyBpbnQgc2VjdGlvbnNfcGVyX2Jsb2NrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDFjMjkxYWYuLjYwNDA3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0zNjcsNyArMzY3LDcgQEAKICAqCiAgKiBSZXR1cm5zICZzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvaW50ZXIgb24gc3VjY2Vzcywgb3IgRVJSX1BUUigpIG9uIGVycm9yLgogICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXRfb3JfbW9kdWxlIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgKIAkJc3RydWN0IGRldmljZSAqcGFyZW50LAogCQljb25zdCBjaGFyICpuYW1lLCBpbnQgaWQsCiAJCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbnVtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCmluZGV4IGMwZGQwOWQuLmFkMzY3YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMKQEAgLTI5MSw3ICsyOTEsNyBAQAogewogCXN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgKmNsa25iOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7Ci0JY2hhciAqY29uX2lkOworCWNoYXIgKipjb25faWQ7CiAJaW50IGVycm9yOwogCiAJZGV2X2RiZyhkZXYsICIlcygpICVsZFxuIiwgX19mdW5jX18sIGFjdGlvbik7CkBAIC0zMDksOCArMzA5LDggQEAKIAogCQlkZXYtPnB3cl9kb21haW4gPSBjbGtuYi0+cHdyX2RvbWFpbjsKIAkJaWYgKGNsa25iLT5jb25faWRzWzBdKSB7Ci0JCQlmb3IgKGNvbl9pZCA9IGNsa25iLT5jb25faWRzWzBdOyAqY29uX2lkOyBjb25faWQrKykKLQkJCQlwbV9ydW50aW1lX2Nsa19hZGQoZGV2LCBjb25faWQpOworCQkJZm9yIChjb25faWQgPSBjbGtuYi0+Y29uX2lkczsgKmNvbl9pZDsgY29uX2lkKyspCisJCQkJcG1fcnVudGltZV9jbGtfYWRkKGRldiwgKmNvbl9pZCk7CiAJCX0gZWxzZSB7CiAJCQlwbV9ydW50aW1lX2Nsa19hZGQoZGV2LCBOVUxMKTsKIAkJfQpAQCAtMzgwLDI1ICszODAsMjUgQEAKIHsKIAlzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrICpjbGtuYjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOwotCWNoYXIgKmNvbl9pZDsKKwljaGFyICoqY29uX2lkOwogCiAJZGV2X2RiZyhkZXYsICIlcygpICVsZFxuIiwgX19mdW5jX18sIGFjdGlvbik7CiAKIAljbGtuYiA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jaywgbmIpOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKKwljYXNlIEJVU19OT1RJRllfQklORF9EUklWRVI6CiAJCWlmIChjbGtuYi0+Y29uX2lkc1swXSkgewotCQkJZm9yIChjb25faWQgPSBjbGtuYi0+Y29uX2lkc1swXTsgKmNvbl9pZDsgY29uX2lkKyspCi0JCQkJZW5hYmxlX2Nsb2NrKGRldiwgY29uX2lkKTsKKwkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHM7ICpjb25faWQ7IGNvbl9pZCsrKQorCQkJCWVuYWJsZV9jbG9jayhkZXYsICpjb25faWQpOwogCQl9IGVsc2UgewogCQkJZW5hYmxlX2Nsb2NrKGRldiwgTlVMTCk7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBCVVNfTk9USUZZX0RFTF9ERVZJQ0U6CisJY2FzZSBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSOgogCQlpZiAoY2xrbmItPmNvbl9pZHNbMF0pIHsKLQkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHNbMF07ICpjb25faWQ7IGNvbl9pZCsrKQotCQkJCWRpc2FibGVfY2xvY2soZGV2LCBjb25faWQpOworCQkJZm9yIChjb25faWQgPSBjbGtuYi0+Y29uX2lkczsgKmNvbl9pZDsgY29uX2lkKyspCisJCQkJZGlzYWJsZV9jbG9jayhkZXYsICpjb25faWQpOwogCQl9IGVsc2UgewogCQkJZGlzYWJsZV9jbG9jayhkZXYsIE5VTEwpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCBhYTYzMjAyMC4uMDZmMDliZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC01Nyw3ICs1Nyw4IEBACiAgKi8KIHZvaWQgZGV2aWNlX3BtX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldi0+cG93ZXIuaW5fc3VzcGVuZCA9IGZhbHNlOworCWRldi0+cG93ZXIuaXNfcHJlcGFyZWQgPSBmYWxzZTsKKwlkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCA9IGZhbHNlOwogCWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJZGV2LT5wb3dlci53YWtldXAgPSBOVUxMOwpAQCAtOTEsNyArOTIsNyBAQAogCXByX2RlYnVnKCJQTTogQWRkaW5nIGluZm8gZm9yICVzOiVzXG4iLAogCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXYpKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCWlmIChkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2LT5wYXJlbnQtPnBvd2VyLmlzX3ByZXBhcmVkKQogCQlkZXZfd2FybihkZXYsICJwYXJlbnQgJXMgc2hvdWxkIG5vdCBiZSBzbGVlcGluZ1xuIiwKIAkJCWRldl9uYW1lKGRldi0+cGFyZW50KSk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9saXN0KTsKQEAgLTUxMSw3ICs1MTIsMTQgQEAKIAlkcG1fd2FpdChkZXYtPnBhcmVudCwgYXN5bmMpOwogCWRldmljZV9sb2NrKGRldik7CiAKLQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkvKgorCSAqIFRoaXMgaXMgYSBmaWIuICBCdXQgd2UnbGwgYWxsb3cgbmV3IGNoaWxkcmVuIHRvIGJlIGFkZGVkIGJlbG93CisJICogYSByZXN1bWVkIGRldmljZSwgZXZlbiBpZiB0aGUgZGV2aWNlIGhhc24ndCBiZWVuIGNvbXBsZXRlZCB5ZXQuCisJICovCisJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOworCisJaWYgKCFkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCkKKwkJZ290byBVbmxvY2s7CiAKIAlpZiAoZGV2LT5wd3JfZG9tYWluKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInBvd2VyIGRvbWFpbiAiKTsKQEAgLTU0OCw2ICs1NTYsOSBAQAogCX0KIAogIEVuZDoKKwlkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCA9IGZhbHNlOworCisgVW5sb2NrOgogCWRldmljZV91bmxvY2soZGV2KTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAKQEAgLTY3MCw3ICs2ODEsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOwogCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCkBAIC04MzUsMTEgKzg0NiwxMSBAQAogCWRldmljZV9sb2NrKGRldik7CiAKIAlpZiAoYXN5bmNfZXJyb3IpCi0JCWdvdG8gRW5kOworCQlnb3RvIFVubG9jazsKIAogCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7CiAJCWFzeW5jX2Vycm9yID0gLUVCVVNZOwotCQlnb3RvIEVuZDsKKwkJZ290byBVbmxvY2s7CiAJfQogCiAJaWYgKGRldi0+cHdyX2RvbWFpbikgewpAQCAtODc3LDYgKzg4OCw5IEBACiAJfQogCiAgRW5kOgorCWRldi0+cG93ZXIuaXNfc3VzcGVuZGVkID0gIWVycm9yOworCisgVW5sb2NrOgogCWRldmljZV91bmxvY2soZGV2KTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAKQEAgLTEwNDIsNyArMTA1Niw3IEBACiAJCQlwdXRfZGV2aWNlKGRldik7CiAJCQlicmVhazsKIAkJfQotCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSB0cnVlOworCQlkZXYtPnBvd2VyLmlzX3ByZXBhcmVkID0gdHJ1ZTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKIAkJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3ByZXBhcmVkX2xpc3QpOwogCQlwdXRfZGV2aWNlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvc3lzY29yZS5jIGIvZHJpdmVycy9iYXNlL3N5c2NvcmUuYwppbmRleCBjMTI2ZGIzLi5lOGQxMWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvc3lzY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9zeXNjb3JlLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiBzdGF0aWMgTElTVF9IRUFEKHN5c2NvcmVfb3BzX2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChzeXNjb3JlX29wc19sb2NrKTsKQEAgLTQ4LDYgKzQ5LDEzIEBACiAJc3RydWN0IHN5c2NvcmVfb3BzICpvcHM7CiAJaW50IHJldCA9IDA7CiAKKwlwcl9kZWJ1ZygiQ2hlY2tpbmcgd2FrZXVwIGludGVycnVwdHNcbiIpOworCisJLyogUmV0dXJuIGVycm9yIGNvZGUgaWYgdGhlcmUgYXJlIGFueSB3YWtldXAgaW50ZXJydXB0cyBwZW5kaW5nLiAqLworCXJldCA9IGNoZWNrX3dha2V1cF9pcnFzKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCVdBUk5fT05DRSghaXJxc19kaXNhYmxlZCgpLAogCQkiSW50ZXJydXB0cyBlbmFibGVkIGJlZm9yZSBzeXN0ZW0gY29yZSBzdXNwZW5kLlxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYWN0bG9nLmMKaW5kZXggMDllZjlhOC4uY2YwZTYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYWN0bG9nLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYWN0bG9nLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAltZF9pby5lcnJvciA9IDA7CiAKIAlpZiAoKHJ3ICYgV1JJVEUpICYmICF0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCi0JCXJ3IHw9IFJFUV9GVUE7CisJCXJ3IHw9IFJFUV9GVUEgfCBSRVFfRkxVU0g7CiAJcncgfD0gUkVRX1NZTkM7CiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9iaXRtYXAuYwppbmRleCBmNDQwYTAyLi43Yjk3NjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9iaXRtYXAuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9iaXRtYXAuYwpAQCAtMTEyLDkgKzExMiw2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpibV90YXNrOwogfTsKIAotc3RhdGljIGludCBfX2JtX2NoYW5nZV9iaXRzX3RvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGUsIGludCB2YWwsIGNvbnN0IGVudW0ga21fdHlwZSBrbSk7Ci0KICNkZWZpbmUgYm1fcHJpbnRfbG9ja19pbmZvKG0pIF9fYm1fcHJpbnRfbG9ja19pbmZvKG0sIF9fZnVuY19fKQogc3RhdGljIHZvaWQgX19ibV9wcmludF9sb2NrX2luZm8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3QgY2hhciAqZnVuYykKIHsKQEAgLTk5NCw2ICs5OTEsOSBAQAogCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKIAl9IGVsc2UgewogCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOworCQkvKiB0aGlzIHNob3VsZCBub3QgY291bnQgYXMgdXNlciBhY3Rpdml0eSBhbmQgY2F1c2UgdGhlCisJCSAqIHJlc3luYyB0byB0aHJvdHRsZSAtLSBzZWUgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKCkuICovCisJCWF0b21pY19hZGQobGVuID4+IDksICZtZGV2LT5yc19zZWN0X2V2KTsKIAl9CiB9CiAKQEAgLTEyNTYsNyArMTI1Niw3IEBACiAgKiBleHBlY3RlZCB0byBiZSBjYWxsZWQgZm9yIG9ubHkgYSBmZXcgYml0cyAoZSAtIHMgYWJvdXQgQklUU19QRVJfTE9ORykuCiAgKiBNdXN0IGhvbGQgYml0bWFwIGxvY2sgYWxyZWFkeS4gKi8KIHN0YXRpYyBpbnQgX19ibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCi0JdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsLCBjb25zdCBlbnVtIGttX3R5cGUga20pCisJdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsKQogewogCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHIgPSBOVUxMOwpAQCAtMTI3NCwxNCArMTI3NCwxNCBAQAogCQl1bnNpZ25lZCBpbnQgcGFnZV9uciA9IGJtX2JpdF90b19wYWdlX2lkeChiLCBiaXRucik7CiAJCWlmIChwYWdlX25yICE9IGxhc3RfcGFnZV9ucikgewogCQkJaWYgKHBfYWRkcikKLQkJCQlfX2JtX3VubWFwKHBfYWRkciwga20pOworCQkJCV9fYm1fdW5tYXAocF9hZGRyLCBLTV9JUlExKTsKIAkJCWlmIChjIDwgMCkKIAkJCQlibV9zZXRfcGFnZV9sYXp5X3dyaXRlb3V0KGItPmJtX3BhZ2VzW2xhc3RfcGFnZV9ucl0pOwogCQkJZWxzZSBpZiAoYyA+IDApCiAJCQkJYm1fc2V0X3BhZ2VfbmVlZF93cml0ZW91dChiLT5ibV9wYWdlc1tsYXN0X3BhZ2VfbnJdKTsKIAkJCWNoYW5nZWRfdG90YWwgKz0gYzsKIAkJCWMgPSAwOwotCQkJcF9hZGRyID0gX19ibV9tYXBfcGlkeChiLCBwYWdlX25yLCBrbSk7CisJCQlwX2FkZHIgPSBfX2JtX21hcF9waWR4KGIsIHBhZ2VfbnIsIEtNX0lSUTEpOwogCQkJbGFzdF9wYWdlX25yID0gcGFnZV9ucjsKIAkJfQogCQlpZiAodmFsKQpAQCAtMTI5MCw3ICsxMjkwLDcgQEAKIAkJCWMgLT0gKDAgIT0gX190ZXN0X2FuZF9jbGVhcl9iaXRfbGUoYml0bnIgJiBCSVRTX1BFUl9QQUdFX01BU0ssIHBfYWRkcikpOwogCX0KIAlpZiAocF9hZGRyKQotCQlfX2JtX3VubWFwKHBfYWRkciwga20pOworCQlfX2JtX3VubWFwKHBfYWRkciwgS01fSVJRMSk7CiAJaWYgKGMgPCAwKQogCQlibV9zZXRfcGFnZV9sYXp5X3dyaXRlb3V0KGItPmJtX3BhZ2VzW2xhc3RfcGFnZV9ucl0pOwogCWVsc2UgaWYgKGMgPiAwKQpAQCAtMTMxOCw3ICsxMzE4LDcgQEAKIAlpZiAoKHZhbCA/IEJNX0RPTlRfU0VUIDogQk1fRE9OVF9DTEVBUikgJiBiLT5ibV9mbGFncykKIAkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOwogCi0JYyA9IF9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgdmFsLCBLTV9JUlExKTsKKwljID0gX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBzLCBlLCB2YWwpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCXJldHVybiBjOwpAQCAtMTM0MywxNiArMTM0MywxNyBAQAogewogCWludCBpOwogCWludCBiaXRzOwotCXVuc2lnbmVkIGxvbmcgKnBhZGRyID0ga21hcF9hdG9taWMoYi0+Ym1fcGFnZXNbcGFnZV9ucl0sIEtNX1VTRVIwKTsKKwl1bnNpZ25lZCBsb25nICpwYWRkciA9IGttYXBfYXRvbWljKGItPmJtX3BhZ2VzW3BhZ2VfbnJdLCBLTV9JUlExKTsKIAlmb3IgKGkgPSBmaXJzdF93b3JkOyBpIDwgbGFzdF93b3JkOyBpKyspIHsKIAkJYml0cyA9IGh3ZWlnaHRfbG9uZyhwYWRkcltpXSk7CiAJCXBhZGRyW2ldID0gfjBVTDsKIAkJYi0+Ym1fc2V0ICs9IEJJVFNfUEVSX0xPTkcgLSBiaXRzOwogCX0KLQlrdW5tYXBfYXRvbWljKHBhZGRyLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhwYWRkciwgS01fSVJRMSk7CiB9CiAKLS8qIFNhbWUgdGhpbmcgYXMgZHJiZF9ibV9zZXRfYml0cywgYnV0IHdpdGhvdXQgdGFraW5nIHRoZSBzcGluX2xvY2tfaXJxc2F2ZS4KKy8qIFNhbWUgdGhpbmcgYXMgZHJiZF9ibV9zZXRfYml0cywKKyAqIGJ1dCBtb3JlIGVmZmljaWVudCBmb3IgYSBsYXJnZSBiaXQgcmFuZ2UuCiAgKiBZb3UgbXVzdCBmaXJzdCBkcmJkX2JtX2xvY2soKS4KICAqIENhbiBiZSBjYWxsZWQgdG8gc2V0IHRoZSB3aG9sZSBiaXRtYXAgaW4gb25lIGdvLgogICogU2V0cyBiaXRzIGZyb20gcyB0byBlIF9pbmNsdXNpdmVfLiAqLwpAQCAtMTM2Niw2ICsxMzY3LDcgQEAKIAkgKiBEbyBub3QgdXNlIG1lbXNldCwgYmVjYXVzZSB3ZSBtdXN0IGFjY291bnQgZm9yIGNoYW5nZXMsCiAJICogc28gd2UgbmVlZCB0byBsb29wIG92ZXIgdGhlIHdvcmRzIHdpdGggaHdlaWdodCgpIGFueXdheXMuCiAJICovCisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgc2wgPSBBTElHTihzLEJJVFNfUEVSX0xPTkcpOwogCXVuc2lnbmVkIGxvbmcgZWwgPSAoZSsxKSAmIH4oKHVuc2lnbmVkIGxvbmcpQklUU19QRVJfTE9ORy0xKTsKIAlpbnQgZmlyc3RfcGFnZTsKQEAgLTEzNzYsMTUgKzEzNzgsMTkgQEAKIAogCWlmIChlIC0gcyA8PSAzKkJJVFNfUEVSX0xPTkcpIHsKIAkJLyogZG9uJ3QgYm90aGVyOyBlbCBhbmQgc2wgbWF5IGV2ZW4gYmUgd3JvbmcuICovCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSwgS01fVVNFUjApOworCQlzcGluX2xvY2tfaXJxKCZiLT5ibV9sb2NrKTsKKwkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBzLCBlLCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGRpZmZlcmVuY2UgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgd2UgY2FuIHRydXN0IHNsIGFuZCBlbCAqLwogCisJc3Bpbl9sb2NrX2lycSgmYi0+Ym1fbG9jayk7CisKIAkvKiBiaXRzIGZpbGxpbmcgdGhlIGN1cnJlbnQgbG9uZyAqLwogCWlmIChzbCkKLQkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBzLCBzbC0xLCAxLCBLTV9VU0VSMCk7CisJCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgc2wtMSwgMSk7CiAKIAlmaXJzdF9wYWdlID0gc2wgPj4gKDMgKyBQQUdFX1NISUZUKTsKIAlsYXN0X3BhZ2UgPSBlbCA+PiAoMyArIFBBR0VfU0hJRlQpOwpAQCAtMTM5Nyw4ICsxNDAzLDEwIEBACiAJLyogZmlyc3QgYW5kIGZ1bGwgcGFnZXMsIHVubGVzcyBmaXJzdCBwYWdlID09IGxhc3QgcGFnZSAqLwogCWZvciAocGFnZV9uciA9IGZpcnN0X3BhZ2U7IHBhZ2VfbnIgPCBsYXN0X3BhZ2U7IHBhZ2VfbnIrKykgewogCQlibV9zZXRfZnVsbF93b3Jkc193aXRoaW5fb25lX3BhZ2UobWRldi0+Yml0bWFwLCBwYWdlX25yLCBmaXJzdF93b3JkLCBsYXN0X3dvcmQpOworCQlzcGluX3VubG9ja19pcnEoJmItPmJtX2xvY2spOwogCQljb25kX3Jlc2NoZWQoKTsKIAkJZmlyc3Rfd29yZCA9IDA7CisJCXNwaW5fbG9ja19pcnEoJmItPmJtX2xvY2spOwogCX0KIAogCS8qIGxhc3QgcGFnZSAocmVzcGVjdGl2ZWx5IG9ubHkgcGFnZSwgZm9yIGZpcnN0IHBhZ2UgPT0gbGFzdCBwYWdlKSAqLwpAQCAtMTQxMSw3ICsxNDE5LDggQEAKIAkgKiBpdCB3b3VsZCB0cmlnZ2VyIGFuIGFzc2VydCBpbiBfX2JtX2NoYW5nZV9iaXRzX3RvKCkKIAkgKi8KIAlpZiAoZWwgPD0gZSkKLQkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBlbCwgZSwgMSwgS01fVVNFUjApOworCQlfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIGVsLCBlLCAxKTsKKwlzcGluX3VubG9ja19pcnEoJmItPmJtX2xvY2spOwogfQogCiAvKiByZXR1cm5zIGJpdCBzdGF0ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKaW5kZXggMjVkMzJjNS4uNDNiZWFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCkBAIC00NjAyLDYgKzQ2MDIsMTEgQEAKIAkJCWRldl9lcnIoREVWLCAibWV0YSBjb25uZWN0aW9uIHNodXQgZG93biBieSBwZWVyLlxuIik7CiAJCQlnb3RvIHJlY29ubmVjdDsKIAkJfSBlbHNlIGlmIChydiA9PSAtRUFHQUlOKSB7CisJCQkvKiBJZiB0aGUgZGF0YSBzb2NrZXQgcmVjZWl2ZWQgc29tZXRoaW5nIG1lYW53aGlsZSwKKwkJCSAqIHRoYXQgaXMgZ29vZCBlbm91Z2g6IHBlZXIgaXMgc3RpbGwgYWxpdmUuICovCisJCQlpZiAodGltZV9hZnRlcihtZGV2LT5sYXN0X3JlY2VpdmVkLAorCQkJCWppZmZpZXMgLSBtZGV2LT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvKSkKKwkJCQljb250aW51ZTsKIAkJCWlmIChwaW5nX3RpbWVvdXRfYWN0aXZlKSB7CiAJCQkJZGV2X2VycihERVYsICJQaW5nQWNrIGRpZCBub3QgYXJyaXZlIGluIHRpbWUuXG4iKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKQEAgLTQ2MzcsNiArNDY0Miw3IEBACiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAkJaWYgKHJlY2VpdmVkID09IGV4cGVjdCkgeworCQkJbWRldi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAJCQlEX0FTU0VSVChjbWQgIT0gTlVMTCk7CiAJCQlpZiAoIWNtZC0+cHJvY2VzcyhtZGV2LCBoKSkKIAkJCQlnb3RvIHJlY29ubmVjdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKaW5kZXggNGQ3NmIwNi4uNGQzZTZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMKQEAgLTUzNiwxMiArNTM2LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyogc3RhcnRpbmcgd2l0aCBkcmJkIDguMy44LCB3ZSBjYW4gaGFuZGxlIG11bHRpLWJpbyBFRXMsCi0JICogaWYgaXQgc2hvdWxkIGJlIG5lY2Vzc2FyeSAqLwotCW1heF9iaW9fc2l6ZSA9Ci0JCW1kZXYtPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk0ID8gcXVldWVfbWF4X2h3X3NlY3RvcnMobWRldi0+cnFfcXVldWUpIDw8IDkgOgotCQltZGV2LT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NSA/CURSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCA6IERSQkRfTUFYX0JJT19TSVpFOwotCisJbWF4X2Jpb19zaXplID0gcXVldWVfbWF4X2h3X3NlY3RvcnMobWRldi0+cnFfcXVldWUpIDw8IDk7CiAJbnVtYmVyID0gZHJiZF9yc19udW1iZXJfcmVxdWVzdHMobWRldik7CiAJaWYgKG51bWJlciA9PSAwKQogCQlnb3RvIHJlcXVldWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCBlNmZjNzE2Li5mNTMzZjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTE5Miw3ICsxOTIsOCBAQAogCQkJaWYgKGxvLT54bWl0X3RpbWVvdXQpCiAJCQkJZGVsX3RpbWVyX3N5bmMoJnRpKTsKIAkJfSBlbHNlCi0JCQlyZXN1bHQgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBzaXplLCAwKTsKKwkJCXJlc3VsdCA9IGtlcm5lbF9yZWN2bXNnKHNvY2ssICZtc2csICZpb3YsIDEsIHNpemUsCisJCQkJCQltc2cubXNnX2ZsYWdzKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXNpZ2luZm9fdCBpbmZvOwpAQCAtNzUzLDkgKzc1NCwyNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhcnRfc2hpZnQgPSAwOwotCWlmIChtYXhfcGFydCA+IDApCisJaWYgKG1heF9wYXJ0ID4gMCkgewogCQlwYXJ0X3NoaWZ0ID0gZmxzKG1heF9wYXJ0KTsKIAorCQkvKgorCQkgKiBBZGp1c3QgbWF4X3BhcnQgYWNjb3JkaW5nIHRvIHBhcnRfc2hpZnQgYXMgaXQgaXMgZXhwb3J0ZWQKKwkJICogdG8gdXNlciBzcGFjZSBzbyB0aGF0IHVzZXIgY2FuIGtub3cgdGhlIG1heCBudW1iZXIgb2YKKwkJICogcGFydGl0aW9uIGtlcm5lbCBzaG91bGQgYmUgYWJsZSB0byBtYW5hZ2UuCisJCSAqCisJCSAqIE5vdGUgdGhhdCAtMSBpcyByZXF1aXJlZCBiZWNhdXNlIHBhcnRpdGlvbiAwIGlzIHJlc2VydmVkCisJCSAqIGZvciB0aGUgd2hvbGUgZGlzay4KKwkJICovCisJCW1heF9wYXJ0ID0gKDFVTCA8PCBwYXJ0X3NoaWZ0KSAtIDE7CisJfQorCisJaWYgKCgxVUwgPDwgcGFydF9zaGlmdCkgPiBESVNLX01BWF9QQVJUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmJkc19tYXggPiAxVUwgPDwgKE1JTk9SQklUUyAtIHBhcnRfc2hpZnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWZvciAoaSA9IDA7IGkgPCBuYmRzX21heDsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYWxsb2NfZGlzaygxIDw8IHBhcnRfc2hpZnQpOwogCQlpZiAoIWRpc2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCmluZGV4IGEwYWFiZDkuLjQ2YjgxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCkBAIC0zMjEsNyArMzIxLDYgQEAKIAkJc3RyY3B5KGRpc2stPmRpc2tfbmFtZSwgY2QtPm5hbWUpOwkvKiB1bW0uLi4gKi8KIAkJZGlzay0+Zm9wcyA9ICZwY2RfYmRvcHM7CiAJCWRpc2stPmZsYWdzID0gR0VOSERfRkxfQkxPQ0tfRVZFTlRTX09OX0VYQ0xfV1JJVEU7Ci0JCWRpc2stPmV2ZW50cyA9IERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwppbmRleCA2ZWNmODljLi4wNzljMDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwpAQCAtNiwxMCArNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19ibGsuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ19oZWxwZXJzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KIAogI2RlZmluZSBQQVJUX0JJVFMgNAogCiBzdGF0aWMgaW50IG1ham9yLCBpbmRleDsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp2aXJ0YmxrX3dxOwogCiBzdHJ1Y3QgdmlydGlvX2JsawogewpAQCAtMjYsNiArMjksOSBAQAogCiAJbWVtcG9vbF90ICpwb29sOwogCisJLyogUHJvY2VzcyBjb250ZXh0IGZvciBjb25maWcgc3BhY2UgdXBkYXRlcyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBjb25maWdfd29yazsKKwogCS8qIFdoYXQgaG9zdCB0ZWxscyB1cywgcGx1cyAyIGZvciBoZWFkZXIgJiB0YWlsZXIuICovCiAJdW5zaWduZWQgaW50IHNnX2VsZW1zOwogCkBAIC0xNDEsNyArMTQ3LDcgQEAKIAludW0gPSBibGtfcnFfbWFwX3NnKHEsIHZici0+cmVxLCB2YmxrLT5zZyArIG91dCk7CiAKIAlpZiAodmJyLT5yZXEtPmNtZF90eXBlID09IFJFUV9UWVBFX0JMT0NLX1BDKSB7Ci0JCXNnX3NldF9idWYoJnZibGstPnNnW251bSArIG91dCArIGluKytdLCB2YnItPnJlcS0+c2Vuc2UsIDk2KTsKKwkJc2dfc2V0X2J1ZigmdmJsay0+c2dbbnVtICsgb3V0ICsgaW4rK10sIHZici0+cmVxLT5zZW5zZSwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKIAkJc2dfc2V0X2J1ZigmdmJsay0+c2dbbnVtICsgb3V0ICsgaW4rK10sICZ2YnItPmluX2hkciwKIAkJCSAgIHNpemVvZih2YnItPmluX2hkcikpOwogCX0KQEAgLTI5MSw2ICsyOTcsNDYgQEAKIH0KIERFVklDRV9BVFRSKHNlcmlhbCwgU19JUlVHTywgdmlydGJsa19zZXJpYWxfc2hvdywgTlVMTCk7CiAKK3N0YXRpYyB2b2lkIHZpcnRibGtfY29uZmlnX2NoYW5nZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZpcnRpb19ibGsgKnZibGsgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZpcnRpb19ibGssIGNvbmZpZ193b3JrKTsKKwlzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiA9IHZibGstPnZkZXY7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSB2YmxrLT5kaXNrLT5xdWV1ZTsKKwljaGFyIGNhcF9zdHJfMlsxMF0sIGNhcF9zdHJfMTBbMTBdOworCXU2NCBjYXBhY2l0eSwgc2l6ZTsKKworCS8qIEhvc3QgbXVzdCBhbHdheXMgc3BlY2lmeSB0aGUgY2FwYWNpdHkuICovCisJdmRldi0+Y29uZmlnLT5nZXQodmRldiwgb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19ibGtfY29uZmlnLCBjYXBhY2l0eSksCisJCQkgICZjYXBhY2l0eSwgc2l6ZW9mKGNhcGFjaXR5KSk7CisKKwkvKiBJZiBjYXBhY2l0eSBpcyB0b28gYmlnLCB0cnVuY2F0ZSB3aXRoIHdhcm5pbmcuICovCisJaWYgKChzZWN0b3JfdCljYXBhY2l0eSAhPSBjYXBhY2l0eSkgeworCQlkZXZfd2FybigmdmRldi0+ZGV2LCAiQ2FwYWNpdHkgJWxsdSB0b28gbGFyZ2U6IHRydW5jYXRpbmdcbiIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyljYXBhY2l0eSk7CisJCWNhcGFjaXR5ID0gKHNlY3Rvcl90KS0xOworCX0KKworCXNpemUgPSBjYXBhY2l0eSAqIHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShxKTsKKwlzdHJpbmdfZ2V0X3NpemUoc2l6ZSwgU1RSSU5HX1VOSVRTXzIsIGNhcF9zdHJfMiwgc2l6ZW9mKGNhcF9zdHJfMikpOworCXN0cmluZ19nZXRfc2l6ZShzaXplLCBTVFJJTkdfVU5JVFNfMTAsIGNhcF9zdHJfMTAsIHNpemVvZihjYXBfc3RyXzEwKSk7CisKKwlkZXZfbm90aWNlKCZ2ZGV2LT5kZXYsCisJCSAgIm5ldyBzaXplOiAlbGx1ICVkLWJ5dGUgbG9naWNhbCBibG9ja3MgKCVzLyVzKVxuIiwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5LAorCQkgIHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShxKSwKKwkJICBjYXBfc3RyXzEwLCBjYXBfc3RyXzIpOworCisJc2V0X2NhcGFjaXR5KHZibGstPmRpc2ssIGNhcGFjaXR5KTsKK30KKworc3RhdGljIHZvaWQgdmlydGJsa19jb25maWdfY2hhbmdlZChzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsayA9IHZkZXYtPnByaXY7CisKKwlxdWV1ZV93b3JrKHZpcnRibGtfd3EsICZ2YmxrLT5jb25maWdfd29yayk7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHZpcnRibGtfcHJvYmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCiB7CiAJc3RydWN0IHZpcnRpb19ibGsgKnZibGs7CkBAIC0zMjcsNiArMzczLDcgQEAKIAl2YmxrLT52ZGV2ID0gdmRldjsKIAl2YmxrLT5zZ19lbGVtcyA9IHNnX2VsZW1zOwogCXNnX2luaXRfdGFibGUodmJsay0+c2csIHZibGstPnNnX2VsZW1zKTsKKwlJTklUX1dPUksoJnZibGstPmNvbmZpZ193b3JrLCB2aXJ0YmxrX2NvbmZpZ19jaGFuZ2VkX3dvcmspOwogCiAJLyogV2UgZXhwZWN0IG9uZSB2aXJ0cXVldWUsIGZvciBvdXRwdXQuICovCiAJdmJsay0+dnEgPSB2aXJ0aW9fZmluZF9zaW5nbGVfdnEodmRldiwgYmxrX2RvbmUsICJyZXF1ZXN0cyIpOwpAQCAtNDc3LDYgKzUyNCw4IEBACiB7CiAJc3RydWN0IHZpcnRpb19ibGsgKnZibGsgPSB2ZGV2LT5wcml2OwogCisJZmx1c2hfd29yaygmdmJsay0+Y29uZmlnX3dvcmspOworCiAJLyogTm90aGluZyBzaG91bGQgYmUgcGVuZGluZy4gKi8KIAlCVUdfT04oIWxpc3RfZW1wdHkoJnZibGstPnJlcXMpKTsKIApAQCAtNTA4LDI3ICs1NTcsNDcgQEAKICAqIFVzZSBfX3JlZmRhdGEgdG8gYXZvaWQgdGhpcyB3YXJuaW5nLgogICovCiBzdGF0aWMgc3RydWN0IHZpcnRpb19kcml2ZXIgX19yZWZkYXRhIHZpcnRpb19ibGsgPSB7Ci0JLmZlYXR1cmVfdGFibGUgPSBmZWF0dXJlcywKLQkuZmVhdHVyZV90YWJsZV9zaXplID0gQVJSQVlfU0laRShmZWF0dXJlcyksCi0JLmRyaXZlci5uYW1lID0JS0JVSUxEX01PRE5BTUUsCi0JLmRyaXZlci5vd25lciA9CVRISVNfTU9EVUxFLAotCS5pZF90YWJsZSA9CWlkX3RhYmxlLAotCS5wcm9iZSA9CXZpcnRibGtfcHJvYmUsCi0JLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHZpcnRibGtfcmVtb3ZlKSwKKwkuZmVhdHVyZV90YWJsZQkJPSBmZWF0dXJlcywKKwkuZmVhdHVyZV90YWJsZV9zaXplCT0gQVJSQVlfU0laRShmZWF0dXJlcyksCisJLmRyaXZlci5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAorCS5kcml2ZXIub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkX3RhYmxlCQk9IGlkX3RhYmxlLAorCS5wcm9iZQkJCT0gdmlydGJsa19wcm9iZSwKKwkucmVtb3ZlCQkJPSBfX2RldmV4aXRfcCh2aXJ0YmxrX3JlbW92ZSksCisJLmNvbmZpZ19jaGFuZ2VkCQk9IHZpcnRibGtfY29uZmlnX2NoYW5nZWQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7CisJaW50IGVycm9yOworCisJdmlydGJsa193cSA9IGFsbG9jX3dvcmtxdWV1ZSgidmlydGlvLWJsayIsIDAsIDApOworCWlmICghdmlydGJsa193cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAltYWpvciA9IHJlZ2lzdGVyX2Jsa2RldigwLCAidmlydGJsayIpOwotCWlmIChtYWpvciA8IDApCi0JCXJldHVybiBtYWpvcjsKLQlyZXR1cm4gcmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX2Jsayk7CisJaWYgKG1ham9yIDwgMCkgeworCQllcnJvciA9IG1ham9yOworCQlnb3RvIG91dF9kZXN0cm95X3dvcmtxdWV1ZTsKKwl9CisKKwllcnJvciA9IHJlZ2lzdGVyX3ZpcnRpb19kcml2ZXIoJnZpcnRpb19ibGspOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9ibGtkZXY7CisJcmV0dXJuIDA7CisKK291dF91bnJlZ2lzdGVyX2Jsa2RldjoKKwl1bnJlZ2lzdGVyX2Jsa2RldihtYWpvciwgInZpcnRibGsiKTsKK291dF9kZXN0cm95X3dvcmtxdWV1ZToKKwlkZXN0cm95X3dvcmtxdWV1ZSh2aXJ0YmxrX3dxKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9ibGtkZXYobWFqb3IsICJ2aXJ0YmxrIik7CiAJdW5yZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fYmxrKTsKKwlkZXN0cm95X3dvcmtxdWV1ZSh2aXJ0YmxrX3dxKTsKIH0KIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCmluZGV4IGM3MzkxMGMuLjVjZjI5OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCisrKyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCkBAIC04MDksMTEgKzgwOSwxMyBAQAogIGZhaWxlZF9pbml0OgogCWtmcmVlKGJsa2JrLT5wZW5kaW5nX3JlcXMpOwogCWtmcmVlKGJsa2JrLT5wZW5kaW5nX2dyYW50X2hhbmRsZXMpOwotCWZvciAoaSA9IDA7IGkgPCBtbWFwX3BhZ2VzOyBpKyspIHsKLQkJaWYgKGJsa2JrLT5wZW5kaW5nX3BhZ2VzW2ldKQotCQkJX19mcmVlX3BhZ2UoYmxrYmstPnBlbmRpbmdfcGFnZXNbaV0pOworCWlmIChibGtiay0+cGVuZGluZ19wYWdlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgbW1hcF9wYWdlczsgaSsrKSB7CisJCQlpZiAoYmxrYmstPnBlbmRpbmdfcGFnZXNbaV0pCisJCQkJX19mcmVlX3BhZ2UoYmxrYmstPnBlbmRpbmdfcGFnZXNbaV0pOworCQl9CisJCWtmcmVlKGJsa2JrLT5wZW5kaW5nX3BhZ2VzKTsKIAl9Ci0Ja2ZyZWUoYmxrYmstPnBlbmRpbmdfcGFnZXMpOwogCWtmcmVlKGJsa2JrKTsKIAlibGtiayA9IE5VTEw7CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMKaW5kZXggMzQ1NzA4Mi4uNmNjMGRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC0zNTcsMTQgKzM1NywxMyBAQAogCX0KIAogCXZiZC0+YmRldiA9IGJkZXY7Ci0JdmJkLT5zaXplID0gdmJkX3N6KHZiZCk7Ci0KIAlpZiAodmJkLT5iZGV2LT5iZF9kaXNrID09IE5VTEwpIHsKIAkJRFBSSU5USygieGVuX3ZiZF9jcmVhdGU6IGRldmljZSAlMDh4IGRvZXNuJ3QgZXhpc3QuXG4iLAogCQkJdmJkLT5wZGV2aWNlKTsKIAkJeGVuX3ZiZF9mcmVlKHZiZCk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KKwl2YmQtPnNpemUgPSB2YmRfc3oodmJkKTsKIAogCWlmICh2YmQtPmJkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfQ0QgfHwgY2Ryb20pCiAJCXZiZC0+dHlwZSB8PSBWRElTS19DRFJPTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZGVidWdmcy5jCmluZGV4IGZkNjMwNWIuLjhlY2Y0YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2RlYnVnZnMuYwpAQCAtNjQsNiArNjQsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlc3VsdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXByaXYtPmJ0bXJ2bF9kZXYuaHNjZmdjbWQgPSByZXN1bHQ7CiAKQEAgLTEwOCw2ICsxMTAsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlc3VsdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXByaXYtPmJ0bXJ2bF9kZXYucHNtb2RlID0gcmVzdWx0OwogCkBAIC0xNDcsNiArMTUxLDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LnBzY21kID0gcmVzdWx0OwogCkBAIC0xOTEsNiArMTk3LDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmdwaW9fZ2FwID0gcmVzdWx0OwogCkBAIC0yMzAsNiArMjM4LDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmhzY21kID0gcmVzdWx0OwogCWlmIChwcml2LT5idG1ydmxfZGV2LmhzY21kKSB7CkBAIC0yNzIsNiArMjgyLDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmhzbW9kZSA9IHJlc3VsdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwppbmRleCBiM2YwMTk5Li40OGFkMmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwpAQCAtMzU1LDI5ICszNTUsMjQgQEAKICAqICAgICAgICAgICAgIGZsYWdzICAgICAgICBwb2ludGVyIHRvIGZsYWdzIGZvciBkYXRhCiAgKiAgICAgICAgICAgICBjb3VudCAgICAgICAgY291bnQgb2YgcmVjZWl2ZWQgZGF0YSBpbiBieXRlcwogICogICAgIAotICogUmV0dXJuIFZhbHVlOiAgICBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQKKyAqIFJldHVybiBWYWx1ZTogICAgTm9uZQogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGhjaV91YXJ0X3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHU4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQorc3RhdGljIHZvaWQgaGNpX3VhcnRfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdTggKmRhdGEsIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGhjaV91YXJ0ICpodSA9ICh2b2lkICopdHR5LT5kaXNjX2RhdGE7Ci0JaW50IHJlY2VpdmVkOwogCiAJaWYgKCFodSB8fCB0dHkgIT0gaHUtPnR0eSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAogCWlmICghdGVzdF9iaXQoSENJX1VBUlRfUFJPVE9fU0VULCAmaHUtPmZsYWdzKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybjsKIAogCXNwaW5fbG9jaygmaHUtPnJ4X2xvY2spOwotCXJlY2VpdmVkID0gaHUtPnByb3RvLT5yZWN2KGh1LCAodm9pZCAqKSBkYXRhLCBjb3VudCk7Ci0JaWYgKHJlY2VpdmVkID4gMCkKLQkJaHUtPmhkZXYtPnN0YXQuYnl0ZV9yeCArPSByZWNlaXZlZDsKKwlodS0+cHJvdG8tPnJlY3YoaHUsICh2b2lkICopIGRhdGEsIGNvdW50KTsKKwlodS0+aGRldi0+c3RhdC5ieXRlX3J4ICs9IGNvdW50OwogCXNwaW5fdW5sb2NrKCZodS0+cnhfbG9jayk7CiAKIAl0dHlfdW50aHJvdHRsZSh0dHkpOwotCi0JcmV0dXJuIHJlY2VpdmVkOwogfQogCiBzdGF0aWMgaW50IGhjaV91YXJ0X3JlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX3VhcnQgKmh1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS92aW9jZC5jIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCmluZGV4IGFlMTVhNGQuLjc4NzhkYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKQEAgLTYyNyw3ICs2MjcsNiBAQAogCWdlbmRpc2stPmZvcHMgPSAmdmlvY2RfZm9wczsKIAlnZW5kaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0NEIHwgR0VOSERfRkxfUkVNT1ZBQkxFIHwKIAkJCSBHRU5IRF9GTF9CTE9DS19FVkVOVFNfT05fRVhDTF9XUklURTsKLQlnZW5kaXNrLT5ldmVudHMgPSBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKIAlzZXRfY2FwYWNpdHkoZ2VuZGlzaywgMCk7CiAJZ2VuZGlzay0+cHJpdmF0ZV9kYXRhID0gZDsKIAlkLT52aW9jZF9kaXNrID0gZ2VuZGlzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmggYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oCmluZGV4IDk5OTgwM2MuLjVkYTY3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmgKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaApAQCAtOTAsOSArOTAsMTAgQEAKICNkZWZpbmUgRzR4X0dNQ0hfU0laRV9NQVNLCSgweGYgPDwgOCkKICNkZWZpbmUgRzR4X0dNQ0hfU0laRV8xTQkoMHgxIDw8IDgpCiAjZGVmaW5lIEc0eF9HTUNIX1NJWkVfMk0JKDB4MyA8PCA4KQotI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzFNCSgweDkgPDwgOCkKLSNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8xXzVNCSgweGEgPDwgOCkKLSNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8yTQkoMHhjIDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfRU4JKDB4OCA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzFNCShHNHhfR01DSF9TSVpFXzFNIHwgRzR4X0dNQ0hfU0laRV9WVF9FTikKKyNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8xXzVNCSgoMHgyIDw8IDgpIHwgRzR4X0dNQ0hfU0laRV9WVF9FTikKKyNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8yTQkoRzR4X0dNQ0hfU0laRV8yTSB8IEc0eF9HTUNIX1NJWkVfVlRfRU4pCiAKICNkZWZpbmUgR0ZYX0ZMU0hfQ05UTAkJMHgyMTcwIC8qIDkxNSsgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggMDUxNDc0Yy4uMzRkNmExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC0xNjMsMTEgKzE2MywzMiBAQAogCSAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdHJlYXRpbmcgbm9uLXBlcmlvZGljIGxpa2UgcGVyaW9kaWMuCiAJICovCiAJaWYgKChkZXZwLT5oZF9mbGFncyAmIChIUEVUX0lFIHwgSFBFVF9QRVJJT0RJQykpID09IEhQRVRfSUUpIHsKLQkJdW5zaWduZWQgbG9uZyBtLCB0OworCQl1bnNpZ25lZCBsb25nIG0sIHQsIG1jLCBiYXNlLCBrOworCQlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0ID0gZGV2cC0+aGRfaHBldDsKKwkJc3RydWN0IGhwZXRzICpocGV0cCA9IGRldnAtPmhkX2hwZXRzOwogCiAJCXQgPSBkZXZwLT5oZF9pcmVxZnJlcTsKIAkJbSA9IHJlYWRfY291bnRlcigmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7Ci0JCXdyaXRlX2NvdW50ZXIodCArIG0sICZkZXZwLT5oZF90aW1lci0+aHBldF9jb21wYXJlKTsKKwkJbWMgPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCQkvKiBUaGUgdGltZSBmb3IgdGhlIG5leHQgaW50ZXJydXB0IHdvdWxkIGxvZ2ljYWxseSBiZSB0ICsgbSwKKwkJICogaG93ZXZlciwgaWYgd2UgYXJlIHZlcnkgdW5sdWNreSBhbmQgdGhlIGludGVycnVwdCBpcyBkZWxheWVkCisJCSAqIGZvciBsb25nZXIgdGhhbiB0IHRoZW4gd2Ugd2lsbCBjb21wbGV0ZWx5IG1pc3MgdGhlIG5leHQKKwkJICogaW50ZXJydXB0IGlmIHdlIHNldCB0ICsgbSBhbmQgYW4gYXBwbGljYXRpb24gd2lsbCBoYW5nLgorCQkgKiBUaGVyZWZvcmUgd2UgbmVlZCB0byBtYWtlIGEgbW9yZSBjb21wbGV4IGNvbXB1dGF0aW9uIGFzc3VtaW5nCisJCSAqIHRoYXQgdGhlcmUgZXhpc3RzIGEgayBmb3Igd2hpY2ggdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorCQkgKiBrICogdCArIGJhc2UgPCBtYyArIGRlbHRhCisJCSAqIChrICsgMSkgKiB0ICsgYmFzZSA+IG1jICsgZGVsdGEKKwkJICogd2hlcmUgdCBpcyB0aGUgaW50ZXJ2YWwgaW4gaHBldCB0aWNrcyBmb3IgdGhlIGdpdmVuIGZyZXEsCisJCSAqIGJhc2UgaXMgdGhlIHRoZW9yZXRpY2FsIHN0YXJ0IHZhbHVlIDAgPCBiYXNlIDwgdCwKKwkJICogbWMgaXMgdGhlIG1haW4gY291bnRlciB2YWx1ZSBhdCB0aGUgdGltZSBvZiB0aGUgaW50ZXJydXB0LAorCQkgKiBkZWx0YSBpcyB0aGUgdGltZSBpdCB0YWtlcyB0byB3cml0ZSB0aGUgYSB2YWx1ZSB0byB0aGUKKwkJICogY29tcGFyYXRvci4KKwkJICogayBtYXkgdGhlbiBiZSBjb21wdXRlZCBhcyAobWMgLSBiYXNlICsgZGVsdGEpIC8gdCAuCisJCSAqLworCQliYXNlID0gbWMgJSB0OworCQlrID0gKG1jIC0gYmFzZSArIGhwZXRwLT5ocF9kZWx0YSkgLyB0OworCQl3cml0ZV9jb3VudGVyKHQgKiAoayArIDEpICsgYmFzZSwKKwkJCSAgICAgICZkZXZwLT5oZF90aW1lci0+aHBldF9jb21wYXJlKTsKIAl9CiAKIAlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1NIQVJFRF9JUlEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCmluZGV4IDgzODU2OGEuLmZiNjhiMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCkBAIC0xNjc3LDE3ICsxNjc3LDEyIEBACiAJcG9ydGRldi0+Y29uZmlnLm1heF9ucl9wb3J0cyA9IDE7CiAJaWYgKHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fQ09OU09MRV9GX01VTFRJUE9SVCkpIHsKIAkJbXVsdGlwb3J0ID0gdHJ1ZTsKLQkJdmRldi0+ZmVhdHVyZXNbMF0gfD0gMSA8PCBWSVJUSU9fQ09OU09MRV9GX01VTFRJUE9SVDsKLQogCQl2ZGV2LT5jb25maWctPmdldCh2ZGV2LCBvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29uZmlnLAogCQkJCQkJIG1heF9ucl9wb3J0cyksCiAJCQkJICAmcG9ydGRldi0+Y29uZmlnLm1heF9ucl9wb3J0cywKIAkJCQkgIHNpemVvZihwb3J0ZGV2LT5jb25maWcubWF4X25yX3BvcnRzKSk7CiAJfQogCi0JLyogTGV0IHRoZSBIb3N0IGtub3cgd2Ugc3VwcG9ydCBtdWx0aXBsZSBwb3J0cy4qLwotCXZkZXYtPmNvbmZpZy0+ZmluYWxpemVfZmVhdHVyZXModmRldik7Ci0KIAllcnIgPSBpbml0X3Zxcyhwb3J0ZGV2KTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZ2ZGV2LT5kZXYsICJFcnJvciAlZCBpbml0aWFsaXppbmcgdnFzXG4iLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMKaW5kZXggMDM2ZTU4Ni4uZGM3YzAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KQEAgLTE1MywxMiArMTUyLDEwIEBACiB7CiAJaW50IHJldDsKIAotCS8qIHdha2UgdXAgZGV2aWNlIGFuZCBlbmFibGUgY2xvY2sgKi8KLQlwbV9ydW50aW1lX2dldF9zeW5jKCZwLT5wZGV2LT5kZXYpOworCS8qIGVuYWJsZSBjbG9jayAqLwogCXJldCA9IGNsa19lbmFibGUocC0+Y2xrKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnAtPnBkZXYtPmRldiwgImNhbm5vdCBlbmFibGUgY2xvY2tcbiIpOwotCQlwbV9ydW50aW1lX3B1dF9zeW5jKCZwLT5wZGV2LT5kZXYpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTkwLDkgKzE4Nyw4IEBACiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGluIENNVCBibG9jayAqLwogCXNoX2NtdF93cml0ZShwLCBDTUNTUiwgMCk7CiAKLQkvKiBzdG9wIGNsb2NrIGFuZCBtYXJrIGRldmljZSBhcyBpZGxlICovCisJLyogc3RvcCBjbG9jayAqLwogCWNsa19kaXNhYmxlKHAtPmNsayk7Ci0JcG1fcnVudGltZV9wdXRfc3luYygmcC0+cGRldi0+ZGV2KTsKIH0KIAogLyogcHJpdmF0ZSBmbGFncyAqLwpAQCAtNjY0LDcgKzY2MCw2IEBACiAKIAlpZiAocCkgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAia2VwdCBhcyBlYXJseXRpbWVyXG4iKTsKLQkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNjc5LDkgKzY3NCw2IEBACiAJCWtmcmVlKHApOwogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAl9Ci0KLQlpZiAoIWlzX2Vhcmx5X3BsYXRmb3JtX2RldmljZShwZGV2KSkKLQkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfdG11LmMKaW5kZXggMTcyOTYyOC4uODA4MTM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgpAQCAtMTEwLDEyICsxMDksMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JLyogd2FrZSB1cCBkZXZpY2UgYW5kIGVuYWJsZSBjbG9jayAqLwotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnAtPnBkZXYtPmRldik7CisJLyogZW5hYmxlIGNsb2NrICovCiAJcmV0ID0gY2xrX2VuYWJsZShwLT5jbGspOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcC0+cGRldi0+ZGV2LCAiY2Fubm90IGVuYWJsZSBjbG9ja1xuIik7Ci0JCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnAtPnBkZXYtPmRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNDQsOSArMTQxLDggQEAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgaW4gVE1VIGJsb2NrICovCiAJc2hfdG11X3dyaXRlKHAsIFRDUiwgMHgwMDAwKTsKIAotCS8qIHN0b3AgY2xvY2sgYW5kIG1hcmsgZGV2aWNlIGFzIGlkbGUgKi8KKwkvKiBzdG9wIGNsb2NrICovCiAJY2xrX2Rpc2FibGUocC0+Y2xrKTsKLQlwbV9ydW50aW1lX3B1dF9zeW5jKCZwLT5wZGV2LT5kZXYpOwogfQogCiBzdGF0aWMgdm9pZCBzaF90bXVfc2V0X25leHQoc3RydWN0IHNoX3RtdV9wcml2ICpwLCB1bnNpZ25lZCBsb25nIGRlbHRhLApAQCAtNDE1LDcgKzQxMSw2IEBACiAKIAlpZiAocCkgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAia2VwdCBhcyBlYXJseXRpbWVyXG4iKTsKLQkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDMwLDkgKzQyNSw2IEBACiAJCWtmcmVlKHApOwogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAl9Ci0KLQlpZiAoIWlzX2Vhcmx5X3BsYXRmb3JtX2RldmljZShwZGV2KSkKLQkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwppbmRleCAyMTlkODhhLi5kZGU2YTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwpAQCAtMTM5LDYgKzEzOSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJmRldi0+Y2JkZXYtPnF1ZXVlX2xvY2spOwogCiAJaWYgKGNicSAhPSBOVUxMKSB7CisJCWVyciA9IDA7CiAJCWNicS0+Y2FsbGJhY2sobXNnLCBuc3ApOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJY25fcXVldWVfcmVsZWFzZV9jYWxsYmFjayhjYnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDRlMDRlMTIuLjU5NmQ1ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTc1OSw3ICs3NTksNyBAQAogCiAJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9jcHVmcmVxX2RyaXZlcik7CiAKLQlmcmVlX3BlcmNwdShhY3BpX3BlcmZfZGF0YSk7CisJZnJlZV9hY3BpX3BlcmZfZGF0YSgpOwogfQogCiBtb2R1bGVfcGFyYW0oYWNwaV9wc3RhdGVfc3RyaWN0LCB1aW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IGI2MGE0YzIuLmZhZjdjNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMjk4LDExICsyOTgsMTMgQEAKIAlvbGRfaW5kZXggPSBzdGF0LT5sYXN0X2luZGV4OwogCW5ld19pbmRleCA9IGZyZXFfdGFibGVfZ2V0X2luZGV4KHN0YXQsIGZyZXEtPm5ldyk7CiAKLQljcHVmcmVxX3N0YXRzX3VwZGF0ZShmcmVxLT5jcHUpOwotCWlmIChvbGRfaW5kZXggPT0gbmV3X2luZGV4KQorCS8qIFdlIGNhbid0IGRvIHN0YXQtPnRpbWVfaW5fc3RhdGVbLTFdPSAuLiAqLworCWlmIChvbGRfaW5kZXggPT0gLTEgfHwgbmV3X2luZGV4ID09IC0xKQogCQlyZXR1cm4gMDsKIAotCWlmIChvbGRfaW5kZXggPT0gLTEgfHwgbmV3X2luZGV4ID09IC0xKQorCWNwdWZyZXFfc3RhdHNfdXBkYXRlKGZyZXEtPmNwdSk7CisKKwlpZiAob2xkX2luZGV4ID09IG5ld19pbmRleCkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2soJmNwdWZyZXFfc3RhdHNfbG9jayk7CkBAIC0zODcsNiArMzg5LDcgQEAKIAl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1ZnJlcV9zdGF0X2NwdV9ub3RpZmllcik7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJY3B1ZnJlcV9zdGF0c19mcmVlX3RhYmxlKGNwdSk7CisJCWNwdWZyZXFfc3RhdHNfZnJlZV9zeXNmcyhjcHUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYwppbmRleCA4MzQ3OWI2Li5iY2U1NzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTA3OSw2ICsxMDc5LDkgQEAKIAl9CiAKIAlyZXMgPSB0cmFuc2l0aW9uX2ZpZF92aWQoZGF0YSwgZmlkLCB2aWQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKIAlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOwogCiAJZm9yX2VhY2hfY3B1KGksIGRhdGEtPmF2YWlsYWJsZV9jb3JlcykgewpAQCAtMTEwMSw3ICsxMTA0LDggQEAKIAkvKiBnZXQgTVNSIGluZGV4IGZvciBoYXJkd2FyZSBwc3RhdGUgdHJhbnNpdGlvbiAqLwogCXBzdGF0ZSA9IGluZGV4ICYgSFdfUFNUQVRFX01BU0s7CiAJaWYgKHBzdGF0ZSA+IGRhdGEtPm1heF9od19wc3RhdGUpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwogCWZyZXFzLm9sZCA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoZGF0YS0+cG93ZXJub3dfdGFibGUsCiAJCQlkYXRhLT5jdXJycHN0YXRlKTsKIAlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fcHN0YXRlKGRhdGEtPnBvd2Vybm93X3RhYmxlLCBwc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1hbGcuYwppbmRleCBkMGU2NWQ2Li42NzZkOTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1hbGcuYworKysgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1hbGcuYwpAQCAtMjM4LDkgKzIzOCw5IEBACiAKIAkvKiBidWlsZCBzaGFyZWQgZGVzY3JpcHRvciBmb3IgdGhpcyBzZXNzaW9uICovCiAJc2hfZGVzYyA9IGttYWxsb2MoQ0FBTV9DTURfU1ogKiBERVNDX0FFQURfU0hBUkVEX1RFWFRfTEVOICsKLQkJCSAga2V5c19maXRfaW5saW5lID8KLQkJCSAgY3R4LT5zcGxpdF9rZXlfcGFkX2xlbiArIGN0eC0+ZW5ja2V5bGVuIDoKLQkJCSAgQ0FBTV9QVFJfU1ogKiAyLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CisJCQkgIChrZXlzX2ZpdF9pbmxpbmUgPworCQkJICAgY3R4LT5zcGxpdF9rZXlfcGFkX2xlbiArIGN0eC0+ZW5ja2V5bGVuIDoKKwkJCSAgIENBQU1fUFRSX1NaICogMiksIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNoX2Rlc2MpIHsKIAkJZGV2X2VycihqcmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBzaGFyZWQgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc2hkbWEuYyBiL2RyaXZlcnMvZG1hL3NoZG1hLmMKaW5kZXggNjM2ZTQwOS4uMDI4MzMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2hkbWEuYworKysgYi9kcml2ZXJzL2RtYS9zaGRtYS5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAogCQlkbWFlX3NldF9kbWFycyhzaF9jaGFuLCBjZmctPm1pZF9yaWQpOwogCQlkbWFlX3NldF9jaGNyKHNoX2NoYW4sIGNmZy0+Y2hjcik7Ci0JfSBlbHNlIGlmICgoc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKSAmIDB4ZjAwKSAhPSAweDQwMCkgeworCX0gZWxzZSB7CiAJCWRtYWVfaW5pdChzaF9jaGFuKTsKIAl9CiAKQEAgLTExNDQsNiArMTE0NCw4IEBACiAJLyogcGxhdGZvcm0gZGF0YSAqLwogCXNoZGV2LT5wZGF0YSA9IHBkYXRhOwogCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2hkZXYpOworCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKIApAQCAtMTIxOSw2ICsxMjIxLDExIEBACiAJfSBlbHNlIHsKIAkJZG8gewogCQkJZm9yIChpID0gY2hhbmlycV9yZXMtPnN0YXJ0OyBpIDw9IGNoYW5pcnFfcmVzLT5lbmQ7IGkrKykgeworCQkJCWlmIChpcnFfY250ID49IFNIX0RNQUNfTUFYX0NIQU5ORUxTKSB7CisJCQkJCWlycV9jYXAgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisKIAkJCQlpZiAoKGVycmlycV9yZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKSA9PQogCQkJCSAgICBJT1JFU09VUkNFX0lSUV9TSEFSRUFCTEUpCiAJCQkJCWNoYW5fZmxhZ1tpcnFfY250XSA9IElSUUZfU0hBUkVEOwpAQCAtMTIyOCwxNSArMTIzNSwxMSBAQAogCQkJCQkiRm91bmQgSVJRICVkIGZvciBjaGFubmVsICVkXG4iLAogCQkJCQlpLCBpcnFfY250KTsKIAkJCQljaGFuX2lycVtpcnFfY250KytdID0gaTsKLQotCQkJCWlmIChpcnFfY250ID49IFNIX0RNQUNfTUFYX0NIQU5ORUxTKQotCQkJCQlicmVhazsKIAkJCX0KIAotCQkJaWYgKGlycV9jbnQgPj0gU0hfRE1BQ19NQVhfQ0hBTk5FTFMpIHsKLQkJCQlpcnFfY2FwID0gMTsKKwkJCWlmIChpcnFfY250ID49IFNIX0RNQUNfTUFYX0NIQU5ORUxTKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQljaGFuaXJxX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LAogCQkJCQkJSU9SRVNPVVJDRV9JUlEsICsraXJxcmVzKTsKIAkJfSB3aGlsZSAoaXJxX2NudCA8IHBkYXRhLT5jaGFubmVsX251bSAmJiBjaGFuaXJxX3Jlcyk7CkBAIC0xMjU2LDcgKzEyNTksNiBAQAogCiAJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzaGRldik7CiAJZG1hX2FzeW5jX2RldmljZV9yZWdpc3Rlcigmc2hkZXYtPmNvbW1vbik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTI3OCw2ICsxMjgwLDggQEAKIAogCWlmIChkbWFycykKIAkJaW91bm1hcChzaGRldi0+ZG1hcnMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiBlbWFwZG1hcnM6CiAJaW91bm1hcChzaGRldi0+Y2hhbl9yZWcpOwogCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtMTMxNiw2ICsxMzIwLDggQEAKIAkJaW91bm1hcChzaGRldi0+ZG1hcnMpOwogCWlvdW5tYXAoc2hkZXYtPmNoYW5fcmVnKTsKIAorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCiAJc3luY2hyb25pemVfcmN1KCk7CiAJa2ZyZWUoc2hkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCmluZGV4IDQzOGU2YzguLmViYjg5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCkBAIC0yNjQsNiArMjY0LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BR0VSRV9GVzY0MwkweDU5MDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9GVwkweDIzODAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9UU0IxMkxWMjIJMHg4MDA5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUElOTkFDTEVfU1lTVEVNUwkweDExYmQKIAogI2RlZmluZSBRVUlSS19DWUNMRV9USU1FUgkJMQogI2RlZmluZSBRVUlSS19SRVNFVF9QQUNLRVQJCTIKQEAgLTMxOTAsNiArMzE5MSwxMSBAQAogCWludCBpLCBlcnI7CiAJc2l6ZV90IHNpemU7CiAKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9QSU5OQUNMRV9TWVNURU1TKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiUGlubmFjbGUgTW92aWVCb2FyZCBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKwogCW9oY2kgPSBremFsbG9jKHNpemVvZigqb2hjaSksIEdGUF9LRVJORUwpOwogCWlmIChvaGNpID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9LY29uZmlnCmluZGV4IDg3MDk2YjYuLjJmMjFiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL0tjb25maWcKKysrIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvS2NvbmZpZwpAQCAtMTMsNiArMTMsNyBAQAogY29uZmlnIEdPT0dMRV9TTUkKIAl0cmlzdGF0ZSAiU01JIGludGVyZmFjZSBmb3IgR29vZ2xlIHBsYXRmb3JtcyIKIAlkZXBlbmRzIG9uIEFDUEkgJiYgRE1JCisJc2VsZWN0IEVGSQogCXNlbGVjdCBFRklfVkFSUwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFNNSSBjYWxsYmFja3MgZm9yIEdvb2dsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYyBiL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKaW5kZXggZjAzMmU0NC4uYmZlNzIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCkBAIC0xMDgsNyArMTA4LDkgQEAKICAqLwogdW5zaWduZWQgbG9uZyBfX2luaXQgZmluZF9pYmZ0X3JlZ2lvbih1bnNpZ25lZCBsb25nICpzaXplcCkKIHsKKyNpZmRlZiBDT05GSUdfQUNQSQogCWludCBpOworI2VuZGlmCiAJaWJmdF9hZGRyID0gTlVMTDsKIAogI2lmZGVmIENPTkZJR19BQ1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCmluZGV4IDRhN2Y2MzEuLjI5NjcwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCkBAIC04NywzMiArODcsMjAgQEAKIAkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IEdQSU8gZnVuY3Rpb25hbGl0eSBvZiBJVDg3NjFFIHN1cGVyIEkvTyBjaGlwLgogCiBjb25maWcgR1BJT19FWFlOT1M0Ci0JYm9vbCAiU2Ftc3VuZyBFeHlub3M0IEdQSU8gbGlicmFyeSBzdXBwb3J0IgotCWRlZmF1bHQgeSBpZiBDUFVfRVhZTk9TNDIxMAotCWRlcGVuZHMgb24gQVJNCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgU2Ftc3VuZyBFeHlub3M0IHNlcmllcyBTb0NzIEdQSU8gbGlicmFyeQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIENQVV9FWFlOT1M0MjEwCiAKIGNvbmZpZyBHUElPX1BMQVRfU0FNU1VORwotCWJvb2wgIlNhbXN1bmcgU29DcyBHUElPIGxpYnJhcnkgc3VwcG9ydCIKLQlkZWZhdWx0IHkgaWYgU0FNU1VOR19HUElPTElCXzRCSVQKLQlkZXBlbmRzIG9uIEFSTQotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IFNhbXN1bmcgU29DcyBHUElPIGxpYnJhcnkKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBTQU1TVU5HX0dQSU9MSUJfNEJJVAogCiBjb25maWcgR1BJT19TNVBDMTAwCi0JYm9vbCAiU2Ftc3VuZyBTNVBDMTAwIEdQSU8gbGlicmFyeSBzdXBwb3J0IgotCWRlZmF1bHQgeSBpZiBDUFVfUzVQQzEwMAotCWRlcGVuZHMgb24gQVJNCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgU2Ftc3VuZyBTNVBDMTAwIFNvQ3MgR1BJTyBsaWJyYXJ5CisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQ1BVX1M1UEMxMDAKIAogY29uZmlnIEdQSU9fUzVQVjIxMAotCWJvb2wgIlNhbXN1bmcgUzVQVjIxMC9TNVBDMTEwIEdQSU8gbGlicmFyeSBzdXBwb3J0IgotCWRlZmF1bHQgeSBpZiBDUFVfUzVQVjIxMAotCWRlcGVuZHMgb24gQVJNCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgU2Ftc3VuZyBTNVBWMjEwL1M1UEMxMTAgU29DcyBHUElPIGxpYnJhcnkKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBDUFVfUzVQVjIxMAogCiBjb25maWcgR1BJT19QTDA2MQogCWJvb2wgIlByaW1lQ2VsbCBQTDA2MSBHUElPIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1leHlub3M0LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1leHlub3M0LmMKaW5kZXggZDU0Y2E2YS4uOTAyOTgzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tZXh5bm9zNC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYwpAQCAtMjEsMTYgKzIxLDM3IEBACiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmctaGVscGVycy5oPgogCitpbnQgczNjX2dwaW9fc2V0cHVsbF9leHlub3M0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCXVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQoreworCWlmIChwdWxsID09IFMzQ19HUElPX1BVTExfVVApCisJCXB1bGwgPSAzOworCisJcmV0dXJuIHMzY19ncGlvX3NldHB1bGxfdXBkb3duKGNoaXAsIG9mZiwgcHVsbCk7Cit9CisKK3MzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsX2V4eW5vczQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQl1bnNpZ25lZCBpbnQgb2ZmKQoreworCXMzY19ncGlvX3B1bGxfdCBwdWxsOworCisJcHVsbCA9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duKGNoaXAsIG9mZik7CisJaWYgKHB1bGwgPT0gMykKKwkJcHVsbCA9IFMzQ19HUElPX1BVTExfVVA7CisKKwlyZXR1cm4gcHVsbDsKK30KKwogc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmcgPSB7CiAJLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAorCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfZXh5bm9zNCwKKwkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX2V4eW5vczQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZ19ub2ludCA9IHsKIAkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCisJLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF9leHlub3M0LAorCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfZXh5bm9zNCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMKaW5kZXggNDk2MWVmOS4uMmMyMTJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW5vbWFkaWsuYwpAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5IFNUTWljcm9lbGVjdHJvbmljcwogICogQ29weXJpZ2h0IChDKSAyMDA5IEFsZXNzYW5kcm8gUnViaW5pIDxydWJpbmlAdW5pcHYuaXQ+CiAgKiAgIFJld3JpdHRlbiBiYXNlZCBvbiB3b3JrIGJ5IFByYWZ1bGxhIFdBREFTS0FSIDxwcmFmdWxsYS53YWRhc2thckBzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNDksNiArNTAsNyBAQAogCXUzMiAoKmdldF9zZWNvbmRhcnlfc3RhdHVzKSh1bnNpZ25lZCBpbnQgYmFuayk7CiAJdm9pZCAoKnNldF9pb2ZvcmNlKShib29sIGVuYWJsZSk7CiAJc3BpbmxvY2tfdCBsb2NrOworCWJvb2wgc2xlZXBtb2RlOwogCS8qIEtlZXAgdHJhY2sgb2YgY29uZmlndXJlZCBlZGdlcyAqLwogCXUzMiBlZGdlX3Jpc2luZzsKIAl1MzIgZWRnZV9mYWxsaW5nOwpAQCAtMzkzLDE0ICszOTUsMjUgQEAKICAqIEBncGlvOiBwaW4gbnVtYmVyCiAgKiBAbW9kZTogTk1LX0dQSU9fU0xQTV9JTlBVVCBvciBOTUtfR1BJT19TTFBNX05PQ0hBTkdFLAogICoKLSAqIFNldHMgdGhlIHNsZWVwIG1vZGUgb2YgYSBwaW4uICBJZiBAbW9kZSBpcyBOTUtfR1BJT19TTFBNX0lOUFVULCB0aGUgcGluIGlzCi0gKiBjaGFuZ2VkIHRvIGFuIGlucHV0ICh3aXRoIHB1bGx1cC9kb3duIGVuYWJsZWQpIGluIHNsZWVwIGFuZCBkZWVwIHNsZWVwLiAgSWYKLSAqIEBtb2RlIGlzIE5NS19HUElPX1NMUE1fTk9DSEFOR0UsIHRoZSBwaW4gcmVtYWlucyBpbiB0aGUgc3RhdGUgaXQgd2FzCi0gKiBjb25maWd1cmVkIGV2ZW4gd2hlbiBpbiBzbGVlcCBhbmQgZGVlcCBzbGVlcC4KKyAqIFRoaXMgcmVnaXN0ZXIgaXMgYWN0dWFsbHkgaW4gdGhlIHBpbm11eCBsYXllciwgbm90IHRoZSBHUElPIGJsb2NrIGl0c2VsZi4KKyAqIFRoZSBHUElPMUJfU0xQTSByZWdpc3RlciBkZWZpbmVzIHRoZSBHUElPIG1vZGUgd2hlbiBTTEVFUC9ERUVQLVNMRUVQCisgKiBtb2RlIGlzIGVudGVyZWQgKGkuZS4gd2hlbiBzaWduYWwgSU9GT1JDRSBpcyBISUdIIGJ5IHRoZSBwbGF0Zm9ybSBjb2RlKS4KKyAqIEVhY2ggR1BJTyBjYW4gYmUgY29uZmlndXJlZCB0byBiZSBmb3JjZWQgaW50byBHUElPIG1vZGUgd2hlbiBJT0ZPUkNFIGlzCisgKiBISUdILCBvdmVycmlkaW5nIHRoZSBub3JtYWwgc2V0dGluZyBkZWZpbmVkIGJ5IEdQSU9fQUZTRUx4IHJlZ2lzdGVycy4KKyAqIFdoZW4gSU9GT1JDRSByZXR1cm5zIExPVyAoYnkgc29mdHdhcmUsIGFmdGVyIFNMRUVQL0RFRVAtU0xFRVAgZXhpdCksCisgKiB0aGUgR1BJT3MgcmV0dXJuIHRvIHRoZSBub3JtYWwgc2V0dGluZyBkZWZpbmVkIGJ5IEdQSU9fQUZTRUx4IHJlZ2lzdGVycy4KICAqCi0gKiBPbiBEQjg1MDB2MiBvbndhcmRzLCB0aGlzIHNldHRpbmcgbG9zZXMgdGhlIHByZXZpb3VzIG1lYW5pbmcgYW5kIGluc3RlYWQKLSAqIGluZGljYXRlcyBpZiB3YWtldXAgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgb24gdGhlIHBpbi4gIE5vdGUgdGhhdAotICogZW5hYmxlX2lycV93YWtlKCkgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSB3YWtldXAgZGV0ZWN0aW9uLgorICogSWYgQG1vZGUgaXMgTk1LX0dQSU9fU0xQTV9JTlBVVCwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyBpcyBzd2l0Y2hlZCB0byBHUElPCisgKiBtb2RlIHdoZW4gc2lnbmFsIElPRk9SQ0UgaXMgSElHSCAoaS5lLiB3aGVuIFNMRUVQL0RFRVAtU0xFRVAgbW9kZSBpcworICogZW50ZXJlZCkgcmVnYXJkbGVzcyBvZiB0aGUgYWx0ZnVuY3Rpb24gc2VsZWN0ZWQuIEFsc28gd2FrZS11cCBkZXRlY3Rpb24gaXMKKyAqIEVOQUJMRUQuCisgKgorICogSWYgQG1vZGUgaXMgTk1LX0dQSU9fU0xQTV9OT0NIQU5HRSwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZW1haW5zCisgKiBjb250cm9sbGVkIGJ5IE5NS19HUElPX0RBVEMsIE5NS19HUElPX0RBVFMsIE5NS19HUElPX0RJUiwgTk1LX0dQSU9fUERJUworICogKGZvciBhbHRmdW5jdGlvbiBHUElPKSBvciByZXNwZWN0aXZlIG9uLWNoaXAgcGVyaXBoZXJhbHMgKGZvciBvdGhlcgorICogYWx0ZnVuY3MpIHdoZW4gSU9GT1JDRSBpcyBISUdILiBBbHNvIHdha2UtdXAgZGV0ZWN0aW9uIERJU0FCTEVELgorICoKKyAqIE5vdGUgdGhhdCBlbmFibGVfaXJxX3dha2UoKSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHdha2V1cCBkZXRlY3Rpb24uCiAgKi8KIGludCBubWtfZ3Bpb19zZXRfc2xwbShpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19zbHBtIG1vZGUpCiB7CkBAIC01NTEsNiArNTY0LDEyIEBACiBzdGF0aWMgdm9pZCBfX25ta19ncGlvX3NldF93YWtlKHN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCwKIAkJCQlpbnQgZ3BpbywgYm9vbCBvbikKIHsKKwlpZiAobm1rX2NoaXAtPnNsZWVwbW9kZSkgeworCQlfX25ta19ncGlvX3NldF9zbHBtKG5ta19jaGlwLCBncGlvIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSwKKwkJCQkgICAgb24gPyBOTUtfR1BJT19TTFBNX1dBS0VVUF9FTkFCTEUKKwkJCQkgICAgOiBOTUtfR1BJT19TTFBNX1dBS0VVUF9ESVNBQkxFKTsKKwl9CisKIAlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIFdBS0UsIG9uKTsKIH0KIApAQCAtOTAxLDcgKzkyMCw3IEBACiAJCXdyaXRlbChjaGlwLT5md2ltc2MgJiBjaGlwLT5yZWFsX3dha2UsCiAJCSAgICAgICBjaGlwLT5hZGRyICsgTk1LX0dQSU9fRldJTVNDKTsKIAotCQlpZiAoY3B1X2lzX3U4NTAwdjIoKSkgeworCQlpZiAoY2hpcC0+c2xlZXBtb2RlKSB7CiAJCQljaGlwLT5zbHBtID0gcmVhZGwoY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCiAJCQkvKiAwIC0+IHdha2V1cCBlbmFibGUgKi8KQEAgLTkyMyw3ICs5NDIsNyBAQAogCQl3cml0ZWwoY2hpcC0+cndpbXNjLCBjaGlwLT5hZGRyICsgTk1LX0dQSU9fUldJTVNDKTsKIAkJd3JpdGVsKGNoaXAtPmZ3aW1zYywgY2hpcC0+YWRkciArIE5NS19HUElPX0ZXSU1TQyk7CiAKLQkJaWYgKGNwdV9pc191ODUwMHYyKCkpCisJCWlmIChjaGlwLT5zbGVlcG1vZGUpCiAJCQl3cml0ZWwoY2hpcC0+c2xwbSwgY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCX0KIH0KQEAgLTEwMTAsNiArMTAyOSw3IEBACiAJbm1rX2NoaXAtPnNlY29uZGFyeV9wYXJlbnRfaXJxID0gc2Vjb25kYXJ5X2lycTsKIAlubWtfY2hpcC0+Z2V0X3NlY29uZGFyeV9zdGF0dXMgPSBwZGF0YS0+Z2V0X3NlY29uZGFyeV9zdGF0dXM7CiAJbm1rX2NoaXAtPnNldF9pb2ZvcmNlID0gcGRhdGEtPnNldF9pb2ZvcmNlOworCW5ta19jaGlwLT5zbGVlcG1vZGUgPSBwZGF0YS0+c3VwcG9ydHNfc2xlZXBtb2RlOwogCXNwaW5fbG9ja19pbml0KCZubWtfY2hpcC0+bG9jayk7CiAKIAljaGlwID0gJm5ta19jaGlwLT5jaGlwOwpAQCAtMTA2NSw1ICsxMDg1LDMgQEAKIE1PRFVMRV9BVVRIT1IoIlByYWZ1bGxhIFdBREFTS0FSIGFuZCBBbGVzc2FuZHJvIFJ1YmluaSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJOb21hZGlrIEdQSU8gRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jCmluZGV4IDZjNTExOTEuLjM1YmViZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW9tYXAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1vbWFwLmMKQEAgLTQzMiw3ICs0MzIsNiBAQAogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGJhbmstPmJhc2U7CiAJdTMyIGdwaW9fYml0ID0gMSA8PCBncGlvOwotCXUzMiB2YWw7CiAKIAlpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKIAkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19MRVZFTERFVEVDVDAsIGdwaW9fYml0LApAQCAtNDU1LDE1ICs0NTQsOCBAQAogCX0KIAlpZiAobGlrZWx5KCEoYmFuay0+bm9uX3dha2V1cF9ncGlvcyAmIGdwaW9fYml0KSkpIHsKIAkJaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCQlpZiAodHJpZ2dlciAhPSAwKQotCQkJCV9fcmF3X3dyaXRlbCgxIDw8IGdwaW8sIGJhbmstPmJhc2UrCi0JCQkJCQlPTUFQNF9HUElPX0lSUVdBS0VOMCk7Ci0JCQllbHNlIHsKLQkJCQl2YWwgPSBfX3Jhd19yZWFkbChiYW5rLT5iYXNlICsKLQkJCQkJCQlPTUFQNF9HUElPX0lSUVdBS0VOMCk7Ci0JCQkJX19yYXdfd3JpdGVsKHZhbCAmICh+KDEgPDwgZ3BpbykpLCBiYW5rLT5iYXNlICsKLQkJCQkJCQkgT01BUDRfR1BJT19JUlFXQUtFTjApOwotCQkJfQorCQkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19JUlFXQUtFTjAsIGdwaW9fYml0LAorCQkJCXRyaWdnZXIgIT0gMCk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogR1BJTyB3YWtldXAgcmVxdWVzdCBjYW4gb25seSBiZSBnZW5lcmF0ZWQgb24gZWRnZQpAQCAtNDc3LDggKzQ2OSw5IEBACiAJCQkJCSsgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQSk7CiAJCX0KIAl9Ci0JLyogVGhpcyBwYXJ0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGFsd2F5cyBmb3IgT01BUDM0eHggKi8KLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgKGJhbmstPm5vbl93YWtldXBfZ3Bpb3MgJiBncGlvX2JpdCkpIHsKKwkvKiBUaGlzIHBhcnQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgYWx3YXlzIGZvciBPTUFQezM0eHgsIDQ0eHh9ICovCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpIHx8CisJCQkoYmFuay0+bm9uX3dha2V1cF9ncGlvcyAmIGdwaW9fYml0KSkgewogCQkvKgogCQkgKiBMb2cgdGhlIGVkZ2UgZ3BpbyBhbmQgbWFudWFsbHkgdHJpZ2dlciB0aGUgSVJRCiAJCSAqIGFmdGVyIHJlc3VtZSBpZiB0aGUgaW5wdXQgbGV2ZWwgY2hhbmdlcwpAQCAtMTEzNCw4ICsxMTI3LDExIEBACiB7CiAJdW5zaWduZWQgaW50IGdwaW8gPSBkLT5pcnEgLSBJSF9HUElPX0JBU0U7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogCV9yZXNldF9ncGlvKGJhbmssIGdwaW8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZ3Bpb19hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKQEAgLTExNTAsOSArMTE0NiwxMiBAQAogewogCXVuc2lnbmVkIGludCBncGlvID0gZC0+aXJxIC0gSUhfR1BJT19CQVNFOwogCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwogCV9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBJUlFfVFlQRV9OT05FKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdwaW9fdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCkBAIC0xMTYxLDcgKzExNjAsOSBAQAogCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAl1bnNpZ25lZCBpbnQgaXJxX21hc2sgPSAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pOwogCXUzMiB0cmlnZ2VyID0gaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogCWlmICh0cmlnZ2VyKQogCQlfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgdHJpZ2dlcik7CiAKQEAgLTExNzMsNiArMTE3NCw3IEBACiAJfQogCiAJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKQEAgLTE1MjQsNyArMTUyNiw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9ncGlvX2NoaXBfaW5pdChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rKQorc3RhdGljIHZvaWQgX19kZXZpbml0IG9tYXBfZ3Bpb19jaGlwX2luaXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaykKIHsKIAlpbnQgajsKIAlzdGF0aWMgaW50IGdwaW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vbGFuZ3dlbGxfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2xhbmd3ZWxsX2dwaW8uYwppbmRleCBiZDY1NzFlLi42NDRiYTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vbGFuZ3dlbGxfZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3Bpby9sYW5nd2VsbF9ncGlvLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQlnZWRyID0gZ3Bpb19yZWcoJmxudy0+Y2hpcCwgYmFzZSwgR0VEUik7CiAJCXBlbmRpbmcgPSByZWFkbChnZWRyKTsKIAkJd2hpbGUgKHBlbmRpbmcpIHsKLQkJCWdwaW8gPSBfX2ZmcyhwZW5kaW5nKSAtIDE7CisJCQlncGlvID0gX19mZnMocGVuZGluZyk7CiAJCQltYXNrID0gQklUKGdwaW8pOwogCQkJcGVuZGluZyAmPSB+bWFzazsKIAkJCS8qIENsZWFyIGJlZm9yZSBoYW5kbGluZyBzbyB3ZSBjYW4ndCBsb3NlIGFuIGVkZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby90cHM2NTkxMC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vdHBzNjU5MTAtZ3Bpby5jCmluZGV4IDhkMWRkZmQuLjE1MDk3Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby90cHM2NTkxMC1ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL3RwczY1OTEwLWdwaW8uYwpAQCAtODEsOCArODEsMTAgQEAKIAlzd2l0Y2godHBzNjU5MTBfY2hpcF9pZCh0cHM2NTkxMCkpIHsKIAljYXNlIFRQUzY1OTEwOgogCQl0cHM2NTkxMC0+Z3Bpby5uZ3Bpbwk9IDY7CisJCWJyZWFrOwogCWNhc2UgVFBTNjU5MTE6CiAJCXRwczY1OTEwLT5ncGlvLm5ncGlvCT0gOTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3dtODMxeC1ncGlvLmMKaW5kZXggMzA5NjQ0Yy4uMmJjZmIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3dtODMxeC1ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL3dtODMxeC1ncGlvLmMKQEAgLTE4MCw2ICsxODAsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgV004MzFYX0dQSU9fUFVMTF9VUDoKIAkJCXB1bGwgPSAicHVsbHVwIjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHVsbCA9ICJJTlZBTElEIFBVTEwiOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCmluZGV4IDNlMjU3YTUuLjYxZTFlZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCkBAIC00NiwxMCArNDYsMTEgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCS8qCiAJCSAqIEJlY2F1c2UgdGhlIGtlcm5lbC11c2Vyc3BhY2UgQUJJIGlzIGZpeGVkIGF0IGEgMzItYml0IG9mZnNldAotCQkgKiB3aGlsZSBQQ0kgcmVzb3VyY2VzIG1heSBsaXZlIGFib3ZlIHRoYXQsIHdlIGlnbm9yZSB0aGUgbWFwCi0JCSAqIG9mZnNldCBmb3IgbWFwcyBvZiB0eXBlIF9EUk1fRlJBTUVCVUZGRVIgb3IgX0RSTV9SRUdJU1RFUlMuCi0JCSAqIEl0IGlzIGFzc3VtZWQgdGhhdCBlYWNoIGRyaXZlciB3aWxsIGhhdmUgb25seSBvbmUgcmVzb3VyY2Ugb2YKLQkJICogZWFjaCB0eXBlLgorCQkgKiB3aGlsZSBQQ0kgcmVzb3VyY2VzIG1heSBsaXZlIGFib3ZlIHRoYXQsIHdlIG9ubHkgY29tcGFyZSB0aGUKKwkJICogbG93ZXIgMzIgYml0cyBvZiB0aGUgbWFwIG9mZnNldCBmb3IgbWFwcyBvZiB0eXBlCisJCSAqIF9EUk1fRlJBTUVCVUZGRVIgb3IgX0RSTV9SRUdJU1RFUlMuCisJCSAqIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiBhIGRyaXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgcmVzb3VyY2UKKwkJICogb2YgZWFjaCB0eXBlLCB0aGUgbG93ZXIgMzIgYml0cyBhcmUgZGlmZmVyZW50LgogCQkgKi8KIAkJaWYgKCFlbnRyeS0+bWFwIHx8CiAJCSAgICBtYXAtPnR5cGUgIT0gZW50cnktPm1hcC0+dHlwZSB8fApAQCAtNTksOSArNjAsMTIgQEAKIAkJY2FzZSBfRFJNX1NITToKIAkJCWlmIChtYXAtPmZsYWdzICE9IF9EUk1fQ09OVEFJTlNfTE9DSykKIAkJCQlicmVhazsKKwkJCXJldHVybiBlbnRyeTsKIAkJY2FzZSBfRFJNX1JFR0lTVEVSUzoKIAkJY2FzZSBfRFJNX0ZSQU1FX0JVRkZFUjoKLQkJCXJldHVybiBlbnRyeTsKKwkJCWlmICgoZW50cnktPm1hcC0+b2Zmc2V0ICYgMHhmZmZmZmZmZikgPT0KKwkJCSAgICAobWFwLT5vZmZzZXQgJiAweGZmZmZmZmZmKSkKKwkJCQlyZXR1cm4gZW50cnk7CiAJCWRlZmF1bHQ6IC8qIE1ha2UgZ2NjIGhhcHB5ICovCiAJCQk7CiAJCX0KQEAgLTE4Myw5ICsxODcsNiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KICNlbmRpZgotI2lmZGVmIF9fYWxwaGFfXwotCQltYXAtPm9mZnNldCArPSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7Ci0jZW5kaWYKIAkJLyogU29tZSBkcml2ZXJzIHByZWluaXRpYWxpemUgc29tZSBtYXBzLCB3aXRob3V0IHRoZSBYIFNlcnZlcgogCQkgKiBuZWVkaW5nIHRvIGJlIGF3YXJlIG9mIGl0LiAgVGhlcmVmb3JlLCB3ZSBqdXN0IHJldHVybiBzdWNjZXNzCiAJCSAqIHdoZW4gdGhlIHNlcnZlciB0cmllcyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgbWFwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwppbmRleCA4NzI3NDdjLi44MmRiMTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpAQCAtODg2LDkgKzg4Niw2IEBACiAJdG90YWxfb2JqZWN0cyArPSBkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3I7CiAJdG90YWxfb2JqZWN0cyArPSBkZXYtPm1vZGVfY29uZmlnLm51bV9lbmNvZGVyOwogCi0JaWYgKHRvdGFsX29iamVjdHMgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlncm91cC0+aWRfbGlzdCA9IGt6YWxsb2ModG90YWxfb2JqZWN0cyAqIHNpemVvZih1aW50MzJfdCksIEdGUF9LRVJORUwpOwogCWlmICghZ3JvdXAtPmlkX2xpc3QpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTExMyw3ICsxMTEwLDcgQEAKIAlpZiAoY2FyZF9yZXMtPmNvdW50X2ZicyA+PSBmYl9jb3VudCkgewogCQljb3BpZWQgPSAwOwogCQlmYl9pZCA9ICh1aW50MzJfdCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljYXJkX3Jlcy0+ZmJfaWRfcHRyOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZiLCAmZmlsZV9wcml2LT5mYnMsIGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmYiwgJmZpbGVfcHJpdi0+ZmJzLCBmaWxwX2hlYWQpIHsKIAkJCWlmIChwdXRfdXNlcihmYi0+YmFzZS5pZCwgZmJfaWQgKyBjb3BpZWQpKSB7CiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKaW5kZXggMGE5MzU3Yy4uMDkyOTIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKQEAgLTE4NCw5ICsxODQsOSBAQAogCiBiYWQ6CiAJaWYgKHJhd19lZGlkKSB7Ci0JCURSTV9FUlJPUigiUmF3IEVESUQ6XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJSYXcgRURJRDpcbiIpOwogCQlwcmludF9oZXhfZHVtcF9ieXRlcyhLRVJOX0VSUiwgRFVNUF9QUkVGSVhfTk9ORSwgcmF3X2VkaWQsIEVESURfTEVOR1RIKTsKLQkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjU4LDYgKzI1OCwxNyBAQAogCXJldHVybiByZXQgPT0gMiA/IDAgOiAtMTsKIH0KIAorc3RhdGljIGJvb2wgZHJtX2VkaWRfaXNfemVybyh1OCAqaW5fZWRpZCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaTsKKwl1MzIgKnJhd19lZGlkID0gKHUzMiAqKWluX2VkaWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC8gNDsgaSsrKQorCQlpZiAoKihyYXdfZWRpZCArIGkpICE9IDApCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB1OCAqCiBkcm1fZG9fZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewpAQCAtMjczLDYgKzI4NCwxMCBAQAogCQkJZ290byBvdXQ7CiAJCWlmIChkcm1fZWRpZF9ibG9ja192YWxpZChibG9jaykpCiAJCQlicmVhazsKKwkJaWYgKGkgPT0gMCAmJiBkcm1fZWRpZF9pc196ZXJvKGJsb2NrLCBFRElEX0xFTkdUSCkpIHsKKwkJCWNvbm5lY3Rvci0+bnVsbF9lZGlkX2NvdW50ZXIrKzsKKwkJCWdvdG8gY2FycDsKKwkJfQogCX0KIAlpZiAoaSA9PSA0KQogCQlnb3RvIGNhcnA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYwppbmRleCA3NGU0ZmY1Li40MDEyZmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAvKiogQGZpbGUgZHJtX2dlbS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKaW5kZXggZDYxZDE4NS4uNGEwNThjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYwpAQCAtMjgsNiArMjgsNyBAQAogICogSU4gVEhFIFNPRlRXQVJFLgogICovCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtX2NvcmUuaCIKQEAgLTI1MywxMCArMjU0LDEwIEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbTMyLmhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKWhhbmRsZTsKLQlpZiAobTMyLmhhbmRsZSAhPSAodW5zaWduZWQgbG9uZyloYW5kbGUgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9FUlIgImNvbXBhdF9kcm1fYWRkbWFwIHRydW5jYXRlZCBoYW5kbGUiCi0JCSAgICAgICAiICVwIGZvciB0eXBlICVkIG9mZnNldCAleFxuIiwKLQkJICAgICAgIGhhbmRsZSwgbTMyLnR5cGUsIG0zMi5vZmZzZXQpOworCWlmIChtMzIuaGFuZGxlICE9ICh1bnNpZ25lZCBsb25nKWhhbmRsZSkKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJjb21wYXRfZHJtX2FkZG1hcCB0cnVuY2F0ZWQgaGFuZGxlIgorCQkJCSAgICIgJXAgZm9yIHR5cGUgJWQgb2Zmc2V0ICV4XG4iLAorCQkJCSAgIGhhbmRsZSwgbTMyLnR5cGUsIG0zMi5vZmZzZXQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbTMyLCBzaXplb2YobTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKaW5kZXggZTFhZWU0Zi4uYjZhMTljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIH0KIAogCi1pbnQgZHJtX3BjaV9pcnFfYnlfYnVzaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9pcnFfYnVzaWQgKnApCitzdGF0aWMgaW50IGRybV9wY2lfaXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKQogewogCWlmICgocC0+YnVzbnVtID4+IDgpICE9IGRybV9nZXRfcGNpX2RvbWFpbihkZXYpIHx8CiAJICAgIChwLT5idXNudW0gJiAweGZmKSAhPSBkZXYtPnBkZXYtPmJ1cy0+bnVtYmVyIHx8CkBAIC0yOTIsNiArMjkyLDcgQEAKIAkuZ2V0X25hbWUgPSBkcm1fcGNpX2dldF9uYW1lLAogCS5zZXRfYnVzaWQgPSBkcm1fcGNpX3NldF9idXNpZCwKIAkuc2V0X3VuaXF1ZSA9IGRybV9wY2lfc2V0X3VuaXF1ZSwKKwkuaXJxX2J5X2J1c2lkID0gZHJtX3BjaV9pcnFfYnlfYnVzaWQsCiAJLmFncF9pbml0ID0gZHJtX3BjaV9hZ3BfaW5pdCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwppbmRleCAyYzNmY2JkLi41ZGI5NmQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV92bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwpAQCAtNTI2LDcgKzUyNiw3IEBACiBzdGF0aWMgcmVzb3VyY2Vfc2l6ZV90IGRybV9jb3JlX2dldF9yZWdfb2ZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAjaWZkZWYgX19hbHBoYV9fCi0JcmV0dXJuIGRldi0+aG9zZS0+ZGVuc2VfbWVtX2Jhc2UgLSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CisJcmV0dXJuIGRldi0+aG9zZS0+ZGVuc2VfbWVtX2Jhc2U7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCmluZGV4IDUxYzIyNTcuLjBhODkzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCkBAIC03NzYsNyArNzc2LDcgQEAKIAlzZXFfcHJpbnRmKG0sICIgIElOU1RQTTogMHglMDh4XG4iLCBlcnJvci0+aW5zdHBtKTsKIAlzZXFfcHJpbnRmKG0sICIgIHNlcW5vOiAweCUwOHhcbiIsIGVycm9yLT5zZXFubyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPm51bV9mZW5jZV9yZWdzOyBpKyspCiAJCXNlcV9wcmludGYobSwgIiAgZmVuY2VbJWRdID0gJTA4bGx4XG4iLCBpLCBlcnJvci0+ZmVuY2VbaV0pOwogCiAJaWYgKGVycm9yLT5hY3RpdmVfYm8pCkBAIC0xMjA3LDEzICsxMjA3LDE3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNlcV9wcmludGYobSwgInBvd2VyIGNvbnRleHQgIik7Ci0JZGVzY3JpYmVfb2JqKG0sIGRldl9wcml2LT5wd3JjdHgpOwotCXNlcV9wcmludGYobSwgIlxuIik7CisJaWYgKGRldl9wcml2LT5wd3JjdHgpIHsKKwkJc2VxX3ByaW50ZihtLCAicG93ZXIgY29udGV4dCAiKTsKKwkJZGVzY3JpYmVfb2JqKG0sIGRldl9wcml2LT5wd3JjdHgpOworCQlzZXFfcHJpbnRmKG0sICJcbiIpOworCX0KIAotCXNlcV9wcmludGYobSwgInJlbmRlciBjb250ZXh0ICIpOwotCWRlc2NyaWJlX29iaihtLCBkZXZfcHJpdi0+cmVuZGVyY3R4KTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOworCWlmIChkZXZfcHJpdi0+cmVuZGVyY3R4KSB7CisJCXNlcV9wcmludGYobSwgInJlbmRlciBjb250ZXh0ICIpOworCQlkZXNjcmliZV9vYmoobSwgZGV2X3ByaXYtPnJlbmRlcmN0eCk7CisJCXNlcV9wcmludGYobSwgIlxuIik7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKaW5kZXggMDIzOWU5OS4uMjk2ZmJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCkBAIC0xMjY2LDMwICsxMjY2LDYgQEAKIAogCWludGVsX21vZGVzZXRfZ2VtX2luaXQoZGV2KTsKIAotCWlmIChJU19JVllCUklER0UoZGV2KSkgewotCQkvKiBTaGFyZSBwcmUgJiB1bmluc3RhbGwgaGFuZGxlcnMgd2l0aCBJTEsvU05CICovCi0JCWRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciA9IGl2eWJyaWRnZV9pcnFfaGFuZGxlcjsKLQkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gaXJvbmxha2VfaXJxX3ByZWluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBpdnlicmlkZ2VfaXJxX3Bvc3RpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbCA9IGlyb25sYWtlX2lycV91bmluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaXZ5YnJpZGdlX2VuYWJsZV92Ymxhbms7Ci0JCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayA9IGl2eWJyaWRnZV9kaXNhYmxlX3ZibGFuazsKLQl9IGVsc2UgaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewotCQlkZXYtPmRyaXZlci0+aXJxX2hhbmRsZXIgPSBpcm9ubGFrZV9pcnFfaGFuZGxlcjsKLQkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gaXJvbmxha2VfaXJxX3ByZWluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBpcm9ubGFrZV9pcnFfcG9zdGluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsID0gaXJvbmxha2VfaXJxX3VuaW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsgPSBpcm9ubGFrZV9lbmFibGVfdmJsYW5rOwotCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpcm9ubGFrZV9kaXNhYmxlX3ZibGFuazsKLQl9IGVsc2UgewotCQlkZXYtPmRyaXZlci0+aXJxX3ByZWluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmlycV9wb3N0aW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX2hhbmRsZXIgPSBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcjsKLQkJZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsgPSBpOTE1X2VuYWJsZV92Ymxhbms7Ci0JCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayA9IGk5MTVfZGlzYWJsZV92Ymxhbms7Ci0JfQotCiAJcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldik7CiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX2dlbTsKQEAgLTE5NjcsNyArMTk0Myw3IEBACiAJaWYgKCFkZXZfcHJpdi0+bW0uZ3R0KSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYWxpemUgR1RUXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaW9tYXBmcmVlOworCQlnb3RvIG91dF9ybW1hcDsKIAl9CiAKIAlhZ3Bfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHQtPmd0dF9tYXBwYWJsZV9lbnRyaWVzIDw8IFBBR0VfU0hJRlQ7CkBAIC0yMDExLDE4ICsxOTg3LDEzIEBACiAJaWYgKGRldl9wcml2LT53cSA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBvdXIgd29ya3F1ZXVlLlxuIik7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2lvbWFwZnJlZTsKKwkJZ290byBvdXRfbXRycmZyZWU7CiAJfQogCiAJLyogZW5hYmxlIEdFTSBieSBkZWZhdWx0ICovCiAJZGV2X3ByaXYtPmhhc19nZW0gPSAxOwogCi0JZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlciA9IGk5MTVfZ2V0X3ZibGFua19jb3VudGVyOwotCWRldi0+bWF4X3ZibGFua19jb3VudCA9IDB4ZmZmZmZmOyAvKiBvbmx5IDI0IGJpdHMgb2YgZnJhbWUgY291bnQgKi8KLQlpZiAoSVNfRzRYKGRldikgfHwgSVNfR0VONShkZXYpIHx8IElTX0dFTjYoZGV2KSB8fCBJU19JVllCUklER0UoZGV2KSkgewotCQlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweGZmZmZmZmZmOyAvKiBmdWxsIDMyIGJpdCBjb3VudGVyICovCi0JCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIgPSBnbTQ1X2dldF92YmxhbmtfY291bnRlcjsKLQl9CisJaW50ZWxfaXJxX2luaXQoZGV2KTsKIAogCS8qIFRyeSB0byBtYWtlIHN1cmUgTUNIQkFSIGlzIGVuYWJsZWQgYmVmb3JlIHBva2luZyBhdCBpdCAqLwogCWludGVsX3NldHVwX21jaGJhcihkZXYpOwpAQCAtMjEwMywxMyArMjA3NCwyMSBAQAogCXJldHVybiAwOwogCiBvdXRfZ2VtX3VubG9hZDoKKwlpZiAoZGV2X3ByaXYtPm1tLmluYWN0aXZlX3Nocmlua2VyLnNocmluaykKKwkJdW5yZWdpc3Rlcl9zaHJpbmtlcigmZGV2X3ByaXYtPm1tLmluYWN0aXZlX3Nocmlua2VyKTsKKwogCWlmIChkZXYtPnBkZXYtPm1zaV9lbmFibGVkKQogCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKIAogCWludGVsX3RlYXJkb3duX2dtYnVzKGRldik7CiAJaW50ZWxfdGVhcmRvd25fbWNoYmFyKGRldik7CiAJZGVzdHJveV93b3JrcXVldWUoZGV2X3ByaXYtPndxKTsKLW91dF9pb21hcGZyZWU6CitvdXRfbXRycmZyZWU6CisJaWYgKGRldl9wcml2LT5tbS5ndHRfbXRyciA+PSAwKSB7CisJCW10cnJfZGVsKGRldl9wcml2LT5tbS5ndHRfbXRyciwgZGV2LT5hZ3AtPmJhc2UsCisJCQkgZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfc2l6ZSAqIDEwMjQgKiAxMDI0KTsKKwkJZGV2X3ByaXYtPm1tLmd0dF9tdHJyID0gLTE7CisJfQogCWlvX21hcHBpbmdfZnJlZShkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcpOwogb3V0X3JtbWFwOgogCXBjaV9pb3VubWFwKGRldi0+cGRldiwgZGV2X3ByaXYtPnJlZ3MpOwpAQCAtMjE4Miw5ICsyMTYxLDggQEAKIAkJLyogRmx1c2ggYW55IG91dHN0YW5kaW5nIHVucGluX3dvcmsuICovCiAJCWZsdXNoX3dvcmtxdWV1ZShkZXZfcHJpdi0+d3EpOwogCi0JCWk5MTVfZ2VtX2ZyZWVfYWxsX3BoeXNfb2JqZWN0KGRldik7Ci0KIAkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChkZXYpOwogCQlpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCWlmIChJOTE1X0hBU19GQkMoZGV2KSAmJiBpOTE1X3Bvd2Vyc2F2ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCmluZGV4IDBkZWZkNDIuLmViOTFlMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtNTIsNyArNTIsNyBAQAogdW5zaWduZWQgaW50IGk5MTVfc2VtYXBob3JlcyA9IDA7CiBtb2R1bGVfcGFyYW1fbmFtZWQoc2VtYXBob3JlcywgaTkxNV9zZW1hcGhvcmVzLCBpbnQsIDA2MDApOwogCi11bnNpZ25lZCBpbnQgaTkxNV9lbmFibGVfcmM2ID0gMTsKK3Vuc2lnbmVkIGludCBpOTE1X2VuYWJsZV9yYzYgPSAwOwogbW9kdWxlX3BhcmFtX25hbWVkKGk5MTVfZW5hYmxlX3JjNiwgaTkxNV9lbmFibGVfcmM2LCBpbnQsIDA2MDApOwogCiB1bnNpZ25lZCBpbnQgaTkxNV9lbmFibGVfZmJjID0gMDsKQEAgLTU3Nyw4ICs1NzcsMTIgQEAKIAlpZiAoZ2V0X3NlY29uZHMoKSAtIGRldl9wcml2LT5sYXN0X2dwdV9yZXNldCA8IDUpIHsKIAkJRFJNX0VSUk9SKCJHUFUgaGFuZ2luZyB0b28gZmFzdCwgZGVjbGFyaW5nIHdlZGdlZCFcbiIpOwogCX0gZWxzZSBzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CisJY2FzZSA3OgogCWNhc2UgNjoKIAkJcmV0ID0gZ2VuNl9kb19yZXNldChkZXYsIGZsYWdzKTsKKwkJLyogSWYgcmVzZXQgd2l0aCBhIHVzZXIgZm9yY2V3YWtlLCB0cnkgdG8gcmVzdG9yZSAqLworCQlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5mb3JjZXdha2VfY291bnQpKQorCQkJX19nZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKIAkJYnJlYWs7CiAJY2FzZSA1OgogCQlyZXQgPSBpcm9ubGFrZV9kb19yZXNldChkZXYsIGZsYWdzKTsKQEAgLTc2MiwxNCArNzY2LDYgQEAKIAkucmVzdW1lID0gaTkxNV9yZXN1bWUsCiAKIAkuZGV2aWNlX2lzX2FncCA9IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3AsCi0JLmVuYWJsZV92YmxhbmsgPSBpOTE1X2VuYWJsZV92YmxhbmssCi0JLmRpc2FibGVfdmJsYW5rID0gaTkxNV9kaXNhYmxlX3ZibGFuaywKLQkuZ2V0X3ZibGFua190aW1lc3RhbXAgPSBpOTE1X2dldF92YmxhbmtfdGltZXN0YW1wLAotCS5nZXRfc2Nhbm91dF9wb3NpdGlvbiA9IGk5MTVfZ2V0X2NydGNfc2Nhbm91dHBvcywKLQkuaXJxX3ByZWluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKLQkuaXJxX3Bvc3RpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAotCS5pcnFfdW5pbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKLQkuaXJxX2hhbmRsZXIgPSBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlciwKIAkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAogCS5tYXN0ZXJfY3JlYXRlID0gaTkxNV9tYXN0ZXJfY3JlYXRlLAogCS5tYXN0ZXJfZGVzdHJveSA9IGk5MTVfbWFzdGVyX2Rlc3Ryb3ksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCBlZTY2MDM1Li5jZTc5MTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTIxMSw2ICsyMTEsOSBAQAogCXZvaWQgKCpmZGlfbGlua190cmFpbikoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIAl2b2lkICgqaW5pdF9jbG9ja19nYXRpbmcpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCXZvaWQgKCppbml0X3BjaF9jbG9ja19nYXRpbmcpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCWludCAoKnF1ZXVlX2ZsaXApKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogCS8qIGNsb2NrIHVwZGF0ZXMgZm9yIG1vZGUgc2V0ICovCiAJLyogY3Vyc29yIHVwZGF0ZXMgKi8KIAkvKiByZW5kZXIgY2xvY2sgaW5jcmVhc2UvZGVjcmVhc2UgKi8KQEAgLTI1OSw2ICsyNjIsNyBAQAogfTsKIAogI2RlZmluZSBRVUlSS19QSVBFQV9GT1JDRSAoMTw8MCkKKyNkZWZpbmUgUVVJUktfTFZEU19TU0NfRElTQUJMRSAoMTw8MSkKIAogc3RydWN0IGludGVsX2ZiZGV2OwogCkBAIC03MTYsNiArNzIwLDcgQEAKIAlzdHJ1Y3QgaW50ZWxfZmJkZXYgKmZiZGV2OwogCiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpmb3JjZV9hdWRpb19wcm9wZXJ0eTsKIAogCWF0b21pY190IGZvcmNld2FrZV9jb3VudDsKIH0gZHJtX2k5MTVfcHJpdmF0ZV90OwpAQCAtOTA5LDEzICs5MTQsNiBAQAogCX0gbW07CiB9OwogCi1lbnVtIGludGVsX2NoaXBfZmFtaWx5IHsKLQlDSElQX0k4WFggPSAweDAxLAotCUNISVBfSTlYWCA9IDB4MDIsCi0JQ0hJUF9JOTE1ID0gMHgwNCwKLQlDSElQX0k5NjUgPSAweDA4LAotfTsKLQogI2RlZmluZSBJTlRFTF9JTkZPKGRldikJKCgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikgKGRldiktPmRldl9wcml2YXRlKS0+aW5mbykKIAogI2RlZmluZSBJU19JODMwKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDM1NzcpCkBAIC0xMDAwLDggKzk5OCw2IEBACiAKIGV4dGVybiBpbnQgaTkxNV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50IGk5MTVfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9zYXZlX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBpOTE1X3Jlc3RvcmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaTkxNV9tYXN0ZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpOwogZXh0ZXJuIHZvaWQgaTkxNV9tYXN0ZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIApAQCAtMTAzNiwzMyArMTAzMiwxMiBAQAogZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCi1leHRlcm4gaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLWV4dGVybiBpbnQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0KLWV4dGVybiBpcnFyZXR1cm5fdCBpcm9ubGFrZV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgaXJvbmxha2VfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGlyb25sYWtlX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0KLWV4dGVybiBpcnFyZXR1cm5fdCBpdnlicmlkZ2VfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGl2eWJyaWRnZV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgaXZ5YnJpZGdlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGl2eWJyaWRnZV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfaXJxX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBpbnQgaTkxNV92YmxhbmtfcGlwZV9zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwotZXh0ZXJuIGludCBpOTE1X2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHZvaWQgaTkxNV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gaW50IGlyb25sYWtlX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHZvaWQgaXJvbmxha2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIGludCBpdnlicmlkZ2VfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gdm9pZCBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHUzMiBpOTE1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gdTMyIGdtNDVfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiBpbnQgaTkxNV92Ymxhbmtfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIApAQCAtMTA3MywxMyArMTA0OCw2IEBACiBpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKIAogdm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pbnQgaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKLQkJCSAgICAgIGludCAqbWF4X2Vycm9yLAotCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAotCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpOwotCi1pbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAotCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcyk7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIGV4dGVybiB2b2lkIGk5MTVfZGVzdHJveV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTEyMjcsNyArMTE5NSw5IEBACiB2b2lkIGk5MTVfZ2VtX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlKTsKIAogdWludDMyX3QKLWk5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworaTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgdWludDMyX3Qgc2l6ZSwKKwkJCQkgICAgaW50IHRpbGluZ19tb2RlKTsKIAogLyogaTkxNV9nZW1fZ3R0LmMgKi8KIHZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCAwYjJlMTY3Li5hMDg3ZTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC0zNTQsMTMgKzM1NSwxMiBAQAogCQkgKiBwYWdlX29mZnNldCA9IG9mZnNldCB3aXRoaW4gcGFnZQogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiAoUEFHRV9TSVpFLTEpOworCQlwYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHBhZ2Vfb2Zmc2V0ICsgcmVtYWluKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQ7CiAKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOwogCkBAIC00NTMsOSArNDUzLDkgQEAKIAkJICogZGF0YV9wYWdlX29mZnNldCA9IG9mZnNldCB3aXRoIGRhdGFfcGFnZV9pbmRleCBwYWdlLgogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJc2htZW1fcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiB+UEFHRV9NQVNLOworCQlzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CiAJCWRhdGFfcGFnZV9pbmRleCA9IGRhdGFfcHRyIC8gUEFHRV9TSVpFIC0gZmlyc3RfZGF0YV9wYWdlOwotCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gZGF0YV9wdHIgJiB+UEFHRV9NQVNLOworCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YV9wdHIpOwogCiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHNobWVtX3BhZ2Vfb2Zmc2V0ICsgcGFnZV9sZW5ndGgpID4gUEFHRV9TSVpFKQpAQCAtNDYzLDEwICs0NjMsMTEgQEAKIAkJaWYgKChkYXRhX3BhZ2Vfb2Zmc2V0ICsgcGFnZV9sZW5ndGgpID4gUEFHRV9TSVpFKQogCQkJcGFnZV9sZW5ndGggPSBQQUdFX1NJWkUgLSBkYXRhX3BhZ2Vfb2Zmc2V0OwogCi0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZULAotCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7Ci0JCWlmIChJU19FUlIocGFnZSkpCi0JCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJaWYgKGRvX2JpdDE3X3N3aXp6bGluZykgewogCQkJc2xvd19zaG1lbV9iaXQxN19jb3B5KHBhZ2UsCkBAIC02MzgsOCArNjM5LDggQEAKIAkJICogcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aGluIHBhZ2UKIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXBhZ2VfYmFzZSA9IChvZmZzZXQgJiB+KFBBR0VfU0laRS0xKSk7Ci0JCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBBR0VfU0laRS0xKTsKKwkJcGFnZV9iYXNlID0gb2Zmc2V0ICYgUEFHRV9NQVNLOworCQlwYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHBhZ2Vfb2Zmc2V0ICsgcmVtYWluKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQ7CkBAIC02NTAsNyArNjUxLDYgQEAKIAkJICovCiAJCWlmIChmYXN0X3VzZXJfd3JpdGUoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nLCBwYWdlX2Jhc2UsCiAJCQkJICAgIHBhZ2Vfb2Zmc2V0LCB1c2VyX2RhdGEsIHBhZ2VfbGVuZ3RoKSkKLQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcmVtYWluIC09IHBhZ2VfbGVuZ3RoOwpAQCAtNzMwLDkgKzczMCw5IEBACiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwogCQlndHRfcGFnZV9iYXNlID0gb2Zmc2V0ICYgUEFHRV9NQVNLOwotCQlndHRfcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiB+UEFHRV9NQVNLOworCQlndHRfcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwogCQlkYXRhX3BhZ2VfaW5kZXggPSBkYXRhX3B0ciAvIFBBR0VfU0laRSAtIGZpcnN0X2RhdGFfcGFnZTsKLQkJZGF0YV9wYWdlX29mZnNldCA9IGRhdGFfcHRyICYgflBBR0VfTUFTSzsKKwkJZGF0YV9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGFfcHRyKTsKIAogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChndHRfcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCkBAIC03OTEsMTMgKzc5MSwxMiBAQAogCQkgKiBwYWdlX29mZnNldCA9IG9mZnNldCB3aXRoaW4gcGFnZQogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiAoUEFHRV9TSVpFLTEpOworCQlwYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHBhZ2Vfb2Zmc2V0ICsgcmVtYWluKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQ7CiAKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOwogCkBAIC04OTYsOSArODk1LDkgQEAKIAkJICogZGF0YV9wYWdlX29mZnNldCA9IG9mZnNldCB3aXRoIGRhdGFfcGFnZV9pbmRleCBwYWdlLgogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJc2htZW1fcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiB+UEFHRV9NQVNLOworCQlzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CiAJCWRhdGFfcGFnZV9pbmRleCA9IGRhdGFfcHRyIC8gUEFHRV9TSVpFIC0gZmlyc3RfZGF0YV9wYWdlOwotCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gZGF0YV9wdHIgJiB+UEFHRV9NQVNLOworCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YV9wdHIpOwogCiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHNobWVtX3BhZ2Vfb2Zmc2V0ICsgcGFnZV9sZW5ndGgpID4gUEFHRV9TSVpFKQpAQCAtOTA2LDggKzkwNSw3IEBACiAJCWlmICgoZGF0YV9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gZGF0YV9wYWdlX29mZnNldDsKIAotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlwYWdlID0gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwogCQkJZ290byBvdXQ7CkBAIC0xMjE4LDExICsxMjE2LDExIEBACiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChvYmosIDAsIHRydWUpOwogCQlpZiAocmV0KQogCQkJZ290byB1bmxvY2s7Ci0JfQogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgd3JpdGUpOwotCWlmIChyZXQpCi0JCWdvdG8gdW5sb2NrOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB3cml0ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIHVubG9jazsKKwl9CiAKIAlpZiAob2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKG9iaik7CkBAIC0xMzc2LDI1ICsxMzc0LDI0IEBACiB9CiAKIHN0YXRpYyB1aW50MzJfdAotaTkxNV9nZW1fZ2V0X2d0dF9zaXplKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9nZXRfZ3R0X3NpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2l6ZSwgaW50IHRpbGluZ19tb2RlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgZ3R0X3NpemU7CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCB8fAotCSAgICBvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCi0JCXJldHVybiBvYmotPmJhc2Uuc2l6ZTsKKwkgICAgdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJcmV0dXJuIHNpemU7CiAKIAkvKiBQcmV2aW91cyBjaGlwcyBuZWVkIGEgcG93ZXItb2YtdHdvIGZlbmNlIHJlZ2lvbiB3aGVuIHRpbGluZyAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAzKQotCQlzaXplID0gMTAyNCoxMDI0OworCQlndHRfc2l6ZSA9IDEwMjQqMTAyNDsKIAllbHNlCi0JCXNpemUgPSA1MTIqMTAyNDsKKwkJZ3R0X3NpemUgPSA1MTIqMTAyNDsKIAotCXdoaWxlIChzaXplIDwgb2JqLT5iYXNlLnNpemUpCi0JCXNpemUgPDw9IDE7CisJd2hpbGUgKGd0dF9zaXplIDwgc2l6ZSkKKwkJZ3R0X3NpemUgPDw9IDE7CiAKLQlyZXR1cm4gc2l6ZTsKKwlyZXR1cm4gZ3R0X3NpemU7CiB9CiAKIC8qKgpAQCAtMTQwNSw1OCArMTQwMiw1MiBAQAogICogcG90ZW50aWFsIGZlbmNlIHJlZ2lzdGVyIG1hcHBpbmcuCiAgKi8KIHN0YXRpYyB1aW50MzJfdAotaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICB1aW50MzJfdCBzaXplLAorCQkJICAgaW50IHRpbGluZ19tb2RlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCiAJLyoKIAkgKiBNaW5pbXVtIGFsaWdubWVudCBpcyA0ayAoR1RUIHBhZ2Ugc2l6ZSksIGJ1dCBtaWdodCBiZSBncmVhdGVyCiAJICogaWYgYSBmZW5jZSByZWdpc3RlciBpcyBuZWVkZWQgZm9yIHRoZSBvYmplY3QuCiAJICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQgfHwKLQkgICAgb2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQorCSAgICB0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQogCQlyZXR1cm4gNDA5NjsKIAogCS8qCiAJICogUHJldmlvdXMgY2hpcHMgbmVlZCB0byBiZSBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdAogCSAqIGZlbmNlIHJlZ2lzdGVyIHRoYXQgY2FuIGNvbnRhaW4gdGhlIG9iamVjdC4KIAkgKi8KLQlyZXR1cm4gaTkxNV9nZW1fZ2V0X2d0dF9zaXplKG9iaik7CisJcmV0dXJuIGk5MTVfZ2VtX2dldF9ndHRfc2l6ZShkZXYsIHNpemUsIHRpbGluZ19tb2RlKTsKIH0KIAogLyoqCiAgKiBpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudCAtIHJldHVybiByZXF1aXJlZCBHVFQgYWxpZ25tZW50IGZvciBhbgogICoJCQkJCSB1bmZlbmNlZCBvYmplY3QKLSAqIEBvYmo6IG9iamVjdCB0byBjaGVjaworICogQGRldjogdGhlIGRldmljZQorICogQHNpemU6IHNpemUgb2YgdGhlIG9iamVjdAorICogQHRpbGluZ19tb2RlOiB0aWxpbmcgbW9kZSBvZiB0aGUgb2JqZWN0CiAgKgogICogUmV0dXJuIHRoZSByZXF1aXJlZCBHVFQgYWxpZ25tZW50IGZvciBhbiBvYmplY3QsIG9ubHkgdGFraW5nIGludG8gYWNjb3VudAogICogdW5mZW5jZWQgdGlsZWQgc3VyZmFjZSByZXF1aXJlbWVudHMuCiAgKi8KIHVpbnQzMl90Ci1pOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgdWludDMyX3Qgc2l6ZSwKKwkJCQkgICAgaW50IHRpbGluZ19tb2RlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCWludCB0aWxlX2hlaWdodDsKLQogCS8qCiAJICogTWluaW11bSBhbGlnbm1lbnQgaXMgNGsgKEdUVCBwYWdlIHNpemUpIGZvciBzYW5lIGh3LgogCSAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0IHx8IElTX0czMyhkZXYpIHx8Ci0JICAgIG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkgICAgdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJcmV0dXJuIDQwOTY7CiAKLQkvKgotCSAqIE9sZGVyIGNoaXBzIG5lZWQgdW5mZW5jZWQgdGlsZWQgYnVmZmVycyB0byBiZSBhbGlnbmVkIHRvIHRoZSBsZWZ0Ci0JICogZWRnZSBvZiBhbiBldmVuIHRpbGUgcm93ICh3aGVyZSB0aWxlIHJvd3MgYXJlIGNvdW50ZWQgYXMgaWYgdGhlIGJvIGlzCi0JICogcGxhY2VkIGluIGEgZmVuY2VkIGd0dCByZWdpb24pLgorCS8qIFByZXZpb3VzIGhhcmR3YXJlIGhvd2V2ZXIgbmVlZHMgdG8gYmUgYWxpZ25lZCB0byBhIHBvd2VyLW9mLXR3bworCSAqIHRpbGUgaGVpZ2h0LiBUaGUgc2ltcGxlc3QgbWV0aG9kIGZvciBkZXRlcm1pbmluZyB0aGlzIGlzIHRvIHJldXNlCisJICogdGhlIHBvd2VyLW9mLXRpbGUgb2JqZWN0IHNpemUuCiAJICovCi0JaWYgKElTX0dFTjIoZGV2KSB8fAotCSAgICAob2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZICYmIEhBU18xMjhfQllURV9ZX1RJTElORyhkZXYpKSkKLQkJdGlsZV9oZWlnaHQgPSAzMjsKLQllbHNlCi0JCXRpbGVfaGVpZ2h0ID0gODsKLQotCXJldHVybiB0aWxlX2hlaWdodCAqIG9iai0+c3RyaWRlICogMjsKKwlyZXR1cm4gaTkxNV9nZW1fZ2V0X2d0dF9zaXplKGRldiwgc2l6ZSwgdGlsaW5nX21vZGUpOwogfQogCiBpbnQKQEAgLTE1NTYsMTIgKzE1NDcsMTAgQEAKIAogCWlub2RlID0gb2JqLT5iYXNlLmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJZ2ZwbWFzayB8PSBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpOworCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgewotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBpLAotCQkJCQkgICBHRlBfSElHSFVTRVIgfAotCQkJCQkgICBfX0dGUF9DT0xEIHwKLQkJCQkJICAgX19HRlBfUkVDTEFJTUFCTEUgfAotCQkJCQkgICBnZnBtYXNrKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlX2dmcChtYXBwaW5nLCBpLCBnZnBtYXNrKTsKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCWdvdG8gZXJyX3BhZ2VzOwogCkBAIC0xNjk5LDEzICsxNjg4LDEwIEBACiAJLyogT3VyIGdvYWwgaGVyZSBpcyB0byByZXR1cm4gYXMgbXVjaCBvZiB0aGUgbWVtb3J5IGFzCiAJICogaXMgcG9zc2libGUgYmFjayB0byB0aGUgc3lzdGVtIGFzIHdlIGFyZSBjYWxsZWQgZnJvbSBPT00uCiAJICogVG8gZG8gdGhpcyB3ZSBtdXN0IGluc3RydWN0IHRoZSBzaG1mcyB0byBkcm9wIGFsbCBvZiBpdHMKLQkgKiBiYWNraW5nIHBhZ2VzLCAqbm93Ki4gSGVyZSB3ZSBtaXJyb3IgdGhlIGFjdGlvbnMgdGFrZW4KLQkgKiB3aGVuIGJ5IHNobWVtX2RlbGV0ZV9pbm9kZSgpIHRvIHJlbGVhc2UgdGhlIGJhY2tpbmcgc3RvcmUuCisJICogYmFja2luZyBwYWdlcywgKm5vdyouCiAJICovCiAJaW5vZGUgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKLQlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQotCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGVfcmFuZ2UoaW5vZGUsIDAsIChsb2ZmX3QpLTEpOworCXNobWVtX3RydW5jYXRlX3JhbmdlKGlub2RlLCAwLCAobG9mZl90KS0xKTsKIAogCW9iai0+bWFkdiA9IF9fSTkxNV9NQURWX1BVUkdFRDsKIH0KQEAgLTIwNzgsOCArMjA2NCw4IEBACiAJCWlmICghaWVyKSB7CiAJCQlEUk1fRVJST1IoInNvbWV0aGluZyAobGlrZWx5IHZiZXRvb2wpIGRpc2FibGVkICIKIAkJCQkgICJpbnRlcnJ1cHRzLCByZS1lbmFibGluZ1xuIik7Ci0JCQlpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChyaW5nLT5kZXYpOwotCQkJaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHJpbmctPmRldik7CisJCQlyaW5nLT5kZXYtPmRyaXZlci0+aXJxX3ByZWluc3RhbGwocmluZy0+ZGV2KTsKKwkJCXJpbmctPmRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwocmluZy0+ZGV2KTsKIAkJfQogCiAJCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3Rfd2FpdF9iZWdpbihyaW5nLCBzZXFubyk7CkBAIC0yNzUwLDkgKzI3MzYsMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmVuY2Vfc2l6ZSA9IGk5MTVfZ2VtX2dldF9ndHRfc2l6ZShvYmopOwotCWZlbmNlX2FsaWdubWVudCA9IGk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KG9iaik7Ci0JdW5mZW5jZWRfYWxpZ25tZW50ID0gaTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQob2JqKTsKKwlmZW5jZV9zaXplID0gaTkxNV9nZW1fZ2V0X2d0dF9zaXplKGRldiwKKwkJCQkJICAgb2JqLT5iYXNlLnNpemUsCisJCQkJCSAgIG9iai0+dGlsaW5nX21vZGUpOworCWZlbmNlX2FsaWdubWVudCA9IGk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KGRldiwKKwkJCQkJCSAgICAgb2JqLT5iYXNlLnNpemUsCisJCQkJCQkgICAgIG9iai0+dGlsaW5nX21vZGUpOworCXVuZmVuY2VkX2FsaWdubWVudCA9CisJCWk5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KGRldiwKKwkJCQkJCSAgICBvYmotPmJhc2Uuc2l6ZSwKKwkJCQkJCSAgICBvYmotPnRpbGluZ19tb2RlKTsKIAogCWlmIChhbGlnbm1lbnQgPT0gMCkKIAkJYWxpZ25tZW50ID0gbWFwX2FuZF9mZW5jZWFibGUgPyBmZW5jZV9hbGlnbm1lbnQgOgpAQCAtMjkyNCw4ICsyOTE3LDYgQEAKIAkgKi8KIAl3bWIoKTsKIAotCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOwotCiAJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+YmFzZS53cml0ZV9kb21haW47CiAJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7CiAKQEAgLTM1NjUsNiArMzU1Niw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwogCiAJb2JqID0ga3phbGxvYyhzaXplb2YoKm9iaiksIEdGUF9LRVJORUwpOwogCWlmIChvYmogPT0gTlVMTCkKQEAgLTM1NzUsNiArMzU2Nyw5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCW1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwogCWk5MTVfZ2VtX2luZm9fYWRkX29iaihkZXZfcHJpdiwgc2l6ZSk7CiAKIAlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKQEAgLTM5NTAsOCArMzk0NSw3IEBACiAKIAlwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaSwKLQkJCQkJCQlHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgaSk7CiAJCWlmICghSVNfRVJSKHBhZ2UpKSB7CiAJCQljaGFyICpkc3QgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAkJCW1lbWNweShkc3QsIHZhZGRyICsgaSpQQUdFX1NJWkUsIFBBR0VfU0laRSk7CkBAIC00MDEyLDggKzQwMDYsNyBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAkJY2hhciAqZHN0LCAqc3JjOwogCi0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIGkpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQogCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwppbmRleCAyMGE0Y2M1Li40OTM0Y2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCkBAIC0xODcsMTAgKzE4Nyw2IEBACiAJaWYgKChmbHVzaF9kb21haW5zIHwgaW52YWxpZGF0ZV9kb21haW5zKSAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpCiAJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7CiAKLQkvKiBibG93IGF3YXkgbWFwcGluZ3MgaWYgbWFwcGVkIHRocm91Z2ggR1RUICovCi0JaWYgKChmbHVzaF9kb21haW5zIHwgaW52YWxpZGF0ZV9kb21haW5zKSAmIEk5MTVfR0VNX0RPTUFJTl9HVFQpCi0JCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOwotCiAJaWYgKG9iai0+YmFzZS5wZW5kaW5nX3dyaXRlX2RvbWFpbikKIAkJY2QtPmZsaXBzIHw9IGF0b21pY19yZWFkKCZvYmotPnBlbmRpbmdfZmxpcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKaW5kZXggODJkNzBmZC4uOTljNGZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKQEAgLTM0OCw3ICszNDgsOSBAQAogCQkvKiBSZWJpbmQgaWYgd2UgbmVlZCBhIGNoYW5nZSBvZiBhbGlnbm1lbnQgKi8KIAkJaWYgKCFvYmotPm1hcF9hbmRfZmVuY2VhYmxlKSB7CiAJCQl1MzIgdW5mZW5jZWRfYWxpZ25tZW50ID0KLQkJCQlpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChvYmopOworCQkJCWk5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KGRldiwKKwkJCQkJCQkJICAgIG9iai0+YmFzZS5zaXplLAorCQkJCQkJCQkgICAgYXJncy0+dGlsaW5nX21vZGUpOwogCQkJaWYgKG9iai0+Z3R0X29mZnNldCAmICh1bmZlbmNlZF9hbGlnbm1lbnQgLSAxKSkKIAkJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCmluZGV4IGI3OTYxOWEuLjNiMDNmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAvKiBDYWxsZWQgZnJvbSBkcm0gZ2VuZXJpYyBjb2RlLCBwYXNzZWQgYSAnY3J0YycsIHdoaWNoCiAgKiB3ZSB1c2UgYXMgYSBwaXBlIGluZGV4CiAgKi8KLXUzMiBpOTE1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyB1MzIgaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGhpZ2hfZnJhbWU7CkBAIC0xODQsNyArMTg0LDcgQEAKIAlyZXR1cm4gKGhpZ2gxIDw8IDgpIHwgbG93OwogfQogCi11MzIgZ200NV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCitzdGF0aWMgdTMyIGdtNDVfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+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+c3RydWN0X211dGV4KTsKKwogCS8qIENhY2hlIG1vZGUgc3RhdGUgKi8KIAlJOTE1X1dSSVRFIChDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CiAKQEAgLTg4Niw2ICs4OTYsOCBAQAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAJCUk5MTVfV1JJVEUoU1dGMzAgKyAoaSA8PCAyKSwgZGV2X3ByaXYtPnNhdmVTV0YyW2ldKTsKIAorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCiAJaW50ZWxfaTJjX3Jlc2V0KGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKaW5kZXggZTkzZjkzYy4uMDk3OWQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKQEAgLTI4OCw2ICsyODgsOCBAQAogCQkgKiBUaGlzIG1heSBiZSBhIERWSS1JIGNvbm5lY3RvciB3aXRoIGEgc2hhcmVkIEREQwogCQkgKiBsaW5rIGJldHdlZW4gYW5hbG9nIGFuZCBkaWdpdGFsIG91dHB1dHMsIHNvIHdlCiAJCSAqIGhhdmUgdG8gY2hlY2sgdGhlIEVESUQgaW5wdXQgc3BlYyBvZiB0aGUgYXR0YWNoZWQgZGV2aWNlLgorCQkgKgorCQkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgd2hhdCBzaG91bGQgd2UgZG8gaWYgaXQgaXMgYSBicm9rZW4gRURJRD8KIAkJICovCiAJCWlmIChlZGlkICE9IE5VTEwpIHsKIAkJCWlzX2RpZ2l0YWwgPSBlZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUw7CkBAIC0yOTgsNiArMzAwLDggQEAKIAkJaWYgKCFpc19kaWdpdGFsKSB7CiAJCQlEUk1fREVCVUdfS01TKCJDUlQgZGV0ZWN0ZWQgdmlhIEREQzoweDUwIFtFRElEXVxuIik7CiAJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCURSTV9ERUJVR19LTVMoIkNSVCBub3QgZGV0ZWN0ZWQgdmlhIEREQzoweDUwIFtFRElEIHJlcG9ydHMgYSBkaWdpdGFsIHBhbmVsXVxuIik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBmNTUzZGRmZC4uMGYxYzc5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMzk4Myw1NCArMzk4Myw2IEBACiAjZGVmaW5lIElMS19MUDBfUExBTkVfTEFURU5DWQkJNzAwCiAjZGVmaW5lIElMS19MUDBfQ1VSU09SX0xBVEVOQ1kJCTEzMDAKIAotc3RhdGljIGJvb2wgaXJvbmxha2VfY29tcHV0ZV93bTAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgaW50IHBpcGUsCi0JCQkJIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpkaXNwbGF5LAotCQkJCSBpbnQgZGlzcGxheV9sYXRlbmN5X25zLAotCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yLAotCQkJCSBpbnQgY3Vyc29yX2xhdGVuY3lfbnMsCi0JCQkJIGludCAqcGxhbmVfd20sCi0JCQkJIGludCAqY3Vyc29yX3dtKQotewotCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKLQlpbnQgaHRvdGFsLCBoZGlzcGxheSwgY2xvY2ssIHBpeGVsX3NpemU7Ci0JaW50IGxpbmVfdGltZV91cywgbGluZV9jb3VudDsKLQlpbnQgZW50cmllcywgdGxiX21pc3M7Ci0KLQljcnRjID0gaW50ZWxfZ2V0X2NydGNfZm9yX3BpcGUoZGV2LCBwaXBlKTsKLQlpZiAoY3J0Yy0+ZmIgPT0gTlVMTCB8fCAhY3J0Yy0+ZW5hYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaHRvdGFsID0gY3J0Yy0+bW9kZS5odG90YWw7Ci0JaGRpc3BsYXkgPSBjcnRjLT5tb2RlLmhkaXNwbGF5OwotCWNsb2NrID0gY3J0Yy0+bW9kZS5jbG9jazsKLQlwaXhlbF9zaXplID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKLQotCS8qIFVzZSB0aGUgc21hbGwgYnVmZmVyIG1ldGhvZCB0byBjYWxjdWxhdGUgcGxhbmUgd2F0ZXJtYXJrICovCi0JZW50cmllcyA9ICgoY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiBkaXNwbGF5X2xhdGVuY3lfbnMpIC8gMTAwMDsKLQl0bGJfbWlzcyA9IGRpc3BsYXktPmZpZm9fc2l6ZSpkaXNwbGF5LT5jYWNoZWxpbmVfc2l6ZSAtIGhkaXNwbGF5ICogODsKLQlpZiAodGxiX21pc3MgPiAwKQotCQllbnRyaWVzICs9IHRsYl9taXNzOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgZGlzcGxheS0+Y2FjaGVsaW5lX3NpemUpOwotCSpwbGFuZV93bSA9IGVudHJpZXMgKyBkaXNwbGF5LT5ndWFyZF9zaXplOwotCWlmICgqcGxhbmVfd20gPiAoaW50KWRpc3BsYXktPm1heF93bSkKLQkJKnBsYW5lX3dtID0gZGlzcGxheS0+bWF4X3dtOwotCi0JLyogVXNlIHRoZSBsYXJnZSBidWZmZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBjdXJzb3Igd2F0ZXJtYXJrICovCi0JbGluZV90aW1lX3VzID0gKChodG90YWwgKiAxMDAwKSAvIGNsb2NrKTsKLQlsaW5lX2NvdW50ID0gKGN1cnNvcl9sYXRlbmN5X25zIC8gbGluZV90aW1lX3VzICsgMTAwMCkgLyAxMDAwOwotCWVudHJpZXMgPSBsaW5lX2NvdW50ICogNjQgKiBwaXhlbF9zaXplOwotCXRsYl9taXNzID0gY3Vyc29yLT5maWZvX3NpemUqY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSAtIGhkaXNwbGF5ICogODsKLQlpZiAodGxiX21pc3MgPiAwKQotCQllbnRyaWVzICs9IHRsYl9taXNzOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSk7Ci0JKmN1cnNvcl93bSA9IGVudHJpZXMgKyBjdXJzb3ItPmd1YXJkX3NpemU7Ci0JaWYgKCpjdXJzb3Jfd20gPiAoaW50KWN1cnNvci0+bWF4X3dtKQotCQkqY3Vyc29yX3dtID0gKGludCljdXJzb3ItPm1heF93bTsKLQotCXJldHVybiB0cnVlOwotfQotCiAvKgogICogQ2hlY2sgdGhlIHdtIHJlc3VsdC4KICAqCkBAIC00MTM5LDEyICs0MDkxLDEyIEBACiAJdW5zaWduZWQgaW50IGVuYWJsZWQ7CiAKIAllbmFibGVkID0gMDsKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLAotCQkJCSAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAotCQkJCSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1ksCi0JCQkJICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKLQkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKLQkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCAwLAorCQkJICAgICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCisJCQkgICAgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAorCQkJICAgICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKKwkJCSAgICBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZLAorCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKIAkJSTkxNV9XUklURShXTTBfUElQRUFfSUxLLAogCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CiAJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBBIC0iCkBAIC00MTUzLDEyICs0MTA1LDEyIEBACiAJCWVuYWJsZWQgfD0gMTsKIAl9CiAKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAxLAotCQkJCSAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAotCQkJCSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1ksCi0JCQkJICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKLQkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKLQkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCAxLAorCQkJICAgICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCisJCQkgICAgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAorCQkJICAgICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKKwkJCSAgICBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZLAorCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKIAkJSTkxNV9XUklURShXTTBfUElQRUJfSUxLLAogCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CiAJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBCIC0iCkBAIC00MjIzLDEwICs0MTc1LDEwIEBACiAJdW5zaWduZWQgaW50IGVuYWJsZWQ7CiAKIAllbmFibGVkID0gMDsKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLAotCQkJCSAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAotCQkJCSAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCi0JCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgMCwKKwkJCSAgICAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAorCQkJICAgICZzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CiAJCUk5MTVfV1JJVEUoV00wX1BJUEVBX0lMSywKIAkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOwogCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQSAtIgpAQCAtNDIzNSwxMCArNDE4NywxMCBAQAogCQllbmFibGVkIHw9IDE7CiAJfQogCi0JaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMSwKLQkJCQkgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKLQkJCQkgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAotCQkJCSAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CisJaWYgKGc0eF9jb21wdXRlX3dtMChkZXYsIDEsCisJCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCisJCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewogCQlJOTE1X1dSSVRFKFdNMF9QSVBFQl9JTEssCiAJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKIAkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKQEAgLTQzNTMsNyArNDMwNSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wYW5lbF91c2Vfc3NjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKLQlyZXR1cm4gZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYyAmJiBpOTE1X3BhbmVsX3VzZV9zc2M7CisJcmV0dXJuIGRldl9wcml2LT5sdmRzX3VzZV9zc2MgJiYgaTkxNV9wYW5lbF91c2Vfc3NjCisJCSYmICEoZGV2X3ByaXYtPnF1aXJrcyAmIFFVSVJLX0xWRFNfU1NDX0RJU0FCTEUpOwogfQogCiBzdGF0aWMgaW50IGk5eHhfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC00NzM1LDYgKzQ2ODgsNyBAQAogCiAJSTkxNV9XUklURShEU1BDTlRSKHBsYW5lKSwgZHNwY250cik7CiAJUE9TVElOR19SRUFEKERTUENOVFIocGxhbmUpKTsKKwlpbnRlbF9lbmFibGVfcGxhbmUoZGV2X3ByaXYsIHBsYW5lLCBwaXBlKTsKIAogCXJldCA9IGludGVsX3BpcGVfc2V0X2Jhc2UoY3J0YywgeCwgeSwgb2xkX2ZiKTsKIApAQCAtNTI2NSw4ICs1MjE5LDYgQEAKIAogCUk5MTVfV1JJVEUoRFNQQ05UUihwbGFuZSksIGRzcGNudHIpOwogCVBPU1RJTkdfUkVBRChEU1BDTlRSKHBsYW5lKSk7Ci0JaWYgKCFIQVNfUENIX1NQTElUKGRldikpCi0JCWludGVsX2VuYWJsZV9wbGFuZShkZXZfcHJpdiwgcGxhbmUsIHBpcGUpOwogCiAJcmV0ID0gaW50ZWxfcGlwZV9zZXRfYmFzZShjcnRjLCB4LCB5LCBvbGRfZmIpOwogCkBAIC02MzEwLDYgKzYyNjIsMTk3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgaW50ZWxfZ2VuMl9xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdTMyIGZsaXBfbWFzazsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIExQX1JJTkcoZGV2X3ByaXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIE9mZnNldCBpbnRvIHRoZSBuZXcgYnVmZmVyIGZvciBjYXNlcyBvZiBzaGFyZWQgZmJzIGJldHdlZW4gQ1JUQ3MgKi8KKwlvZmZzZXQgPSBjcnRjLT55ICogZmItPnBpdGNoICsgY3J0Yy0+eCAqIGZiLT5iaXRzX3Blcl9waXhlbC84OworCisJcmV0ID0gQkVHSU5fTFBfUklORyg2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIENhbid0IHF1ZXVlIG11bHRpcGxlIGZsaXBzLCBzbyB3YWl0IGZvciB0aGUgcHJldmlvdXMKKwkgKiBvbmUgdG8gZmluaXNoIGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQuCisJICovCisJaWYgKGludGVsX2NydGMtPnBsYW5lKQorCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVA7CisJZWxzZQorCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVA7CisJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBmbGlwX21hc2spOworCU9VVF9SSU5HKE1JX05PT1ApOworCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CisJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKKwlPVVRfUklORyhmYi0+cGl0Y2gpOworCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCArIG9mZnNldCk7CisJT1VUX1JJTkcoTUlfTk9PUCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbF9nZW4zX3F1ZXVlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1MzIgZmxpcF9tYXNrOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgTFBfUklORyhkZXZfcHJpdikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogT2Zmc2V0IGludG8gdGhlIG5ldyBidWZmZXIgZm9yIGNhc2VzIG9mIHNoYXJlZCBmYnMgYmV0d2VlbiBDUlRDcyAqLworCW9mZnNldCA9IGNydGMtPnkgKiBmYi0+cGl0Y2ggKyBjcnRjLT54ICogZmItPmJpdHNfcGVyX3BpeGVsLzg7CisKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGludGVsX2NydGMtPnBsYW5lKQorCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVA7CisJZWxzZQorCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVA7CisJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBmbGlwX21hc2spOworCU9VVF9SSU5HKE1JX05PT1ApOworCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUF9JOTE1IHwKKwkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOworCU9VVF9SSU5HKGZiLT5waXRjaCk7CisJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKKwlPVVRfUklORyhNSV9OT09QKTsKKworCUFEVkFOQ0VfTFBfUklORygpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ2VuNF9xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJdWludDMyX3QgcGYsIHBpcGVzcmM7CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBMUF9SSU5HKGRldl9wcml2KSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogaTk2NSsgdXNlcyB0aGUgbGluZWFyIG9yIHRpbGVkIG9mZnNldHMgZnJvbSB0aGUKKwkgKiBEaXNwbGF5IFJlZ2lzdGVycyAod2hpY2ggZG8gbm90IGNoYW5nZSBhY3Jvc3MgYSBwYWdlLWZsaXApCisJICogc28gd2UgbmVlZCBvbmx5IHJlcHJvZ3JhbSB0aGUgYmFzZSBhZGRyZXNzLgorCSAqLworCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CisJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKKwlPVVRfUklORyhmYi0+cGl0Y2gpOworCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCB8IG9iai0+dGlsaW5nX21vZGUpOworCisJLyogWFhYIEVuYWJsaW5nIHRoZSBwYW5lbC1maXR0ZXIgYWNyb3NzIHBhZ2UtZmxpcCBpcyBzbyBmYXIKKwkgKiB1bnRlc3RlZCBvbiBub24tbmF0aXZlIG1vZGVzLCBzbyBpZ25vcmUgaXQgZm9yIG5vdy4KKwkgKiBwZiA9IEk5MTVfUkVBRChwaXBlID09IDAgPyBQRkFfQ1RMXzEgOiBQRkJfQ1RMXzEpICYgUEZfRU5BQkxFOworCSAqLworCXBmID0gMDsKKwlwaXBlc3JjID0gSTkxNV9SRUFEKFBJUEVTUkMoaW50ZWxfY3J0Yy0+cGlwZSkpICYgMHgwZmZmMGZmZjsKKwlPVVRfUklORyhwZiB8IHBpcGVzcmMpOworCUFEVkFOQ0VfTFBfUklORygpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ2VuNl9xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJdWludDMyX3QgcGYsIHBpcGVzcmM7CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBMUF9SSU5HKGRldl9wcml2KSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKKwkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOworCU9VVF9SSU5HKGZiLT5waXRjaCB8IG9iai0+dGlsaW5nX21vZGUpOworCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCk7CisKKwlwZiA9IEk5MTVfUkVBRChQRl9DVEwoaW50ZWxfY3J0Yy0+cGlwZSkpICYgUEZfRU5BQkxFOworCXBpcGVzcmMgPSBJOTE1X1JFQUQoUElQRVNSQyhpbnRlbF9jcnRjLT5waXBlKSkgJiAweDBmZmYwZmZmOworCU9VVF9SSU5HKHBmIHwgcGlwZXNyYyk7CisJQURWQU5DRV9MUF9SSU5HKCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE9uIGdlbjcgd2UgY3VycmVudGx5IHVzZSB0aGUgYmxpdCByaW5nIGJlY2F1c2UgKGluIGVhcmx5IHNpbGljb24gYXQgbGVhc3QpCisgKiB0aGUgcmVuZGVyIHJpbmcgZG9lc24ndCBnaXZlIHVzIGludGVycnB0cyBmb3IgcGFnZSBmbGlwIGNvbXBsZXRpb24sIHdoaWNoCisgKiBtZWFucyBjbGllbnRzIHdpbGwgaGFuZyBhZnRlciB0aGUgZmlyc3QgZmxpcCBpcyBxdWV1ZWQuICBGb3J0dW5hdGVseSB0aGUKKyAqIGJsaXQgcmluZyBnZW5lcmF0ZXMgaW50ZXJydXB0cyBwcm9wZXJseSwgc28gdXNlIGl0IGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfZ2VuN19xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yaW5nW0JDU107CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCByaW5nKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRElTUExBWV9GTElQX0k5MTUgfCAoaW50ZWxfY3J0Yy0+cGxhbmUgPDwgMTkpKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgKGZiLT5waXRjaCB8IG9iai0+dGlsaW5nX21vZGUpKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgKG9iai0+Z3R0X29mZnNldCkpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAoTUlfTk9PUCkpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX2RlZmF1bHRfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXJldHVybiAtRU5PREVWOworfQorCiBzdGF0aWMgaW50IGludGVsX2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKIAkJCQlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCkKQEAgLTYzMjAsOSArNjQ2Myw3IEBACiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJc3RydWN0IGludGVsX3VucGluX3dvcmsgKndvcms7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgb2Zmc2V0OwotCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQl1MzIgcGYsIHBpcGVzcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJd29yayA9IGt6YWxsb2Moc2l6ZW9mICp3b3JrLCBHRlBfS0VSTkVMKTsKQEAgLTYzNTEsOSArNjQ5Miw2IEBACiAJb2JqID0gaW50ZWxfZmItPm9iajsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgTFBfUklORyhkZXZfcHJpdikpOwotCWlmIChyZXQpCi0JCWdvdG8gY2xlYW51cF93b3JrOwogCiAJLyogUmVmZXJlbmNlIHRoZSBvYmplY3RzIGZvciB0aGUgc2NoZWR1bGVkIHdvcmsuICovCiAJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKCZ3b3JrLT5vbGRfZmJfb2JqLT5iYXNlKTsKQEAgLTYzNjUsOTEgKzY1MDMsMTggQEAKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfb2JqczsKIAotCWlmIChJU19HRU4zKGRldikgfHwgSVNfR0VOMihkZXYpKSB7Ci0JCXUzMiBmbGlwX21hc2s7Ci0KLQkJLyogQ2FuJ3QgcXVldWUgbXVsdGlwbGUgZmxpcHMsIHNvIHdhaXQgZm9yIHRoZSBwcmV2aW91cwotCQkgKiBvbmUgdG8gZmluaXNoIGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQuCi0JCSAqLwotCQlyZXQgPSBCRUdJTl9MUF9SSU5HKDIpOwotCQlpZiAocmV0KQotCQkJZ290byBjbGVhbnVwX29ianM7Ci0KLQkJaWYgKGludGVsX2NydGMtPnBsYW5lKQotCQkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQl9GTElQOwotCQllbHNlCi0JCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVA7Ci0JCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgZmxpcF9tYXNrKTsKLQkJT1VUX1JJTkcoTUlfTk9PUCk7Ci0JCUFEVkFOQ0VfTFBfUklORygpOwotCX0KLQogCXdvcmstPnBlbmRpbmdfZmxpcF9vYmogPSBvYmo7CiAKIAl3b3JrLT5lbmFibGVfc3RhbGxfY2hlY2sgPSB0cnVlOwogCi0JLyogT2Zmc2V0IGludG8gdGhlIG5ldyBidWZmZXIgZm9yIGNhc2VzIG9mIHNoYXJlZCBmYnMgYmV0d2VlbiBDUlRDcyAqLwotCW9mZnNldCA9IGNydGMtPnkgKiBmYi0+cGl0Y2ggKyBjcnRjLT54ICogZmItPmJpdHNfcGVyX3BpeGVsLzg7Ci0KLQlyZXQgPSBCRUdJTl9MUF9SSU5HKDQpOwotCWlmIChyZXQpCi0JCWdvdG8gY2xlYW51cF9vYmpzOwotCiAJLyogQmxvY2sgY2xpZW50cyBmcm9tIHJlbmRlcmluZyB0byB0aGUgbmV3IGJhY2sgYnVmZmVyIHVudGlsCiAJICogdGhlIGZsaXAgb2NjdXJzIGFuZCB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciB2aXNpYmxlLgogCSAqLwogCWF0b21pY19hZGQoMSA8PCBpbnRlbF9jcnRjLT5wbGFuZSwgJndvcmstPm9sZF9mYl9vYmotPnBlbmRpbmdfZmxpcCk7CiAKLQlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7Ci0JY2FzZSAyOgotCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAotCQkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwotCQlPVVRfUklORyhmYi0+cGl0Y2gpOwotCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOwotCQlPVVRfUklORyhNSV9OT09QKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDM6Ci0JCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUF9JOTE1IHwKLQkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKLQkJT1VUX1JJTkcoZmItPnBpdGNoKTsKLQkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKLQkJT1VUX1JJTkcoTUlfTk9PUCk7Ci0JCWJyZWFrOwotCi0JY2FzZSA0OgotCWNhc2UgNToKLQkJLyogaTk2NSsgdXNlcyB0aGUgbGluZWFyIG9yIHRpbGVkIG9mZnNldHMgZnJvbSB0aGUKLQkJICogRGlzcGxheSBSZWdpc3RlcnMgKHdoaWNoIGRvIG5vdCBjaGFuZ2UgYWNyb3NzIGEgcGFnZS1mbGlwKQotCQkgKiBzbyB3ZSBuZWVkIG9ubHkgcmVwcm9ncmFtIHRoZSBiYXNlIGFkZHJlc3MuCi0JCSAqLwotCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAotCQkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwotCQlPVVRfUklORyhmYi0+cGl0Y2gpOwotCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgfCBvYmotPnRpbGluZ19tb2RlKTsKLQotCQkvKiBYWFggRW5hYmxpbmcgdGhlIHBhbmVsLWZpdHRlciBhY3Jvc3MgcGFnZS1mbGlwIGlzIHNvIGZhcgotCQkgKiB1bnRlc3RlZCBvbiBub24tbmF0aXZlIG1vZGVzLCBzbyBpZ25vcmUgaXQgZm9yIG5vdy4KLQkJICogcGYgPSBJOTE1X1JFQUQocGlwZSA9PSAwID8gUEZBX0NUTF8xIDogUEZCX0NUTF8xKSAmIFBGX0VOQUJMRTsKLQkJICovCi0JCXBmID0gMDsKLQkJcGlwZXNyYyA9IEk5MTVfUkVBRChQSVBFU1JDKHBpcGUpKSAmIDB4MGZmZjBmZmY7Ci0JCU9VVF9SSU5HKHBmIHwgcGlwZXNyYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSA2OgotCWNhc2UgNzoKLQkJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKLQkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKLQkJT1VUX1JJTkcoZmItPnBpdGNoIHwgb2JqLT50aWxpbmdfbW9kZSk7Ci0JCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCk7Ci0KLQkJcGYgPSBJOTE1X1JFQUQoUEZfQ1RMKHBpcGUpKSAmIFBGX0VOQUJMRTsKLQkJcGlwZXNyYyA9IEk5MTVfUkVBRChQSVBFU1JDKHBpcGUpKSAmIDB4MGZmZjBmZmY7Ci0JCU9VVF9SSU5HKHBmIHwgcGlwZXNyYyk7Ci0JCWJyZWFrOwotCX0KLQlBRFZBTkNFX0xQX1JJTkcoKTsKKwlyZXQgPSBkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwKGRldiwgY3J0YywgZmIsIG9iaik7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwX3BlbmRpbmc7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtNjQ1NywxMCArNjUyMiwxMSBAQAogCiAJcmV0dXJuIDA7CiAKK2NsZWFudXBfcGVuZGluZzoKKwlhdG9taWNfc3ViKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUsICZ3b3JrLT5vbGRfZmJfb2JqLT5wZW5kaW5nX2ZsaXApOwogY2xlYW51cF9vYmpzOgogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZ3b3JrLT5vbGRfZmJfb2JqLT5iYXNlKTsKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKLWNsZWFudXBfd29yazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKQEAgLTc2NzUsNiArNzc0MSw3IEBACiAJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOwogCQl9IGVsc2UKIAkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IHBpbmV2aWV3X3VwZGF0ZV93bTsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnZW4zX2luaXRfY2xvY2tfZ2F0aW5nOwogCX0gZWxzZSBpZiAoSVNfRzRYKGRldikpIHsKIAkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gZzR4X3VwZGF0ZV93bTsKIAkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnNHhfaW5pdF9jbG9ja19nYXRpbmc7CkBAIC03NzA0LDYgKzc3NzEsMzEgQEAKIAkJZWxzZQogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9IGk4MzBfZ2V0X2ZpZm9fc2l6ZTsKIAl9CisKKwkvKiBEZWZhdWx0IGp1c3QgcmV0dXJucyAtRU5PREVWIHRvIGluZGljYXRlIHVuc3VwcG9ydGVkICovCisJZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcCA9IGludGVsX2RlZmF1bHRfcXVldWVfZmxpcDsKKworCXN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKKwljYXNlIDI6CisJCWRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAgPSBpbnRlbF9nZW4yX3F1ZXVlX2ZsaXA7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZ2VuM19xdWV1ZV9mbGlwOworCQlicmVhazsKKworCWNhc2UgNDoKKwljYXNlIDU6CisJCWRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAgPSBpbnRlbF9nZW40X3F1ZXVlX2ZsaXA7CisJCWJyZWFrOworCisJY2FzZSA2OgorCQlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZ2VuNl9xdWV1ZV9mbGlwOworCQlicmVhazsKKwljYXNlIDc6CisJCWRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAgPSBpbnRlbF9nZW43X3F1ZXVlX2ZsaXA7CisJCWJyZWFrOworCX0KIH0KIAogLyoKQEAgLTc3MTksNiArNzgxMSwxNSBAQAogCURSTV9ERUJVR19EUklWRVIoImFwcGx5aW5nIHBpcGUgYSBmb3JjZSBxdWlya1xuIik7CiB9CiAKKy8qCisgKiBTb21lIG1hY2hpbmVzIChMZW5vdm8gVTE2MCkgZG8gbm90IHdvcmsgd2l0aCBTU0Mgb24gTFZEUyBmb3Igc29tZSByZWFzb24KKyAqLworc3RhdGljIHZvaWQgcXVpcmtfc3NjX2ZvcmNlX2Rpc2FibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRldl9wcml2LT5xdWlya3MgfD0gUVVJUktfTFZEU19TU0NfRElTQUJMRTsKK30KKwogc3RydWN0IGludGVsX3F1aXJrIHsKIAlpbnQgZGV2aWNlOwogCWludCBzdWJzeXN0ZW1fdmVuZG9yOwpAQCAtNzc0Nyw2ICs3ODQ4LDkgQEAKIAkvKiA4NTUgJiBiZWZvcmUgbmVlZCB0byBsZWF2ZSBwaXBlIEEgJiBkcGxsIEEgdXAgKi8KIAl7IDB4MzU4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcXVpcmtfcGlwZWFfZm9yY2UgfSwKIAl7IDB4MjU2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcXVpcmtfcGlwZWFfZm9yY2UgfSwKKworCS8qIExlbm92byBVMTYwIGNhbm5vdCB1c2UgU1NDIG9uIExWRFMgKi8KKwl7IDB4MDA0NiwgMHgxN2FhLCAweDM5MjAsIHF1aXJrX3NzY19mb3JjZV9kaXNhYmxlIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBpbnRlbF9pbml0X3F1aXJrcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggYTRkODAzMS4uZTJhY2VkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC01MCw3ICs1MCw2IEBACiAJYm9vbCBoYXNfYXVkaW87CiAJaW50IGZvcmNlX2F1ZGlvOwogCXVpbnQzMl90IGNvbG9yX3JhbmdlOwotCWludCBkcG1zX21vZGU7CiAJdWludDhfdCBsaW5rX2J3OwogCXVpbnQ4X3QgbGFuZV9jb3VudDsKIAl1aW50OF90IGRwY2RbNF07CkBAIC01OSw4ICs1OCw2IEBACiAJYm9vbCBpc19wY2hfZWRwOwogCXVpbnQ4X3QJdHJhaW5fc2V0WzRdOwogCXVpbnQ4X3QgbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV07Ci0KLQlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpmb3JjZV9hdWRpb19wcm9wZXJ0eTsKIH07CiAKIC8qKgpAQCAtMTQwLDggKzEzNyw4IEBACiB7CiAJaW50IG1heF9sYW5lX2NvdW50ID0gNDsKIAotCWlmIChpbnRlbF9kcC0+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+ZmFtaWx5KSkgewogCQlkZXZfd2FybihwLT5kZXYsICIlczolZCB0ZXh0dXJlIGludmFsaWQgZm9ybWF0ICVkXG4iLAogCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKaW5kZXggYjJiOTQ0YmMuLjAyNDVhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKQEAgLTUzNiw3ICs1MzYsNyBAQAogI2RlZmluZSBJSF9SQl9XUFRSX0FERFJfTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2UxNAogI2RlZmluZSBJSF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2UxOAogIyAgICAgICBkZWZpbmUgRU5BQkxFX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCi0jICAgICAgIGRlZmluZSBJSF9NQ19TV0FQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAyKQorIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMSkKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzE2QklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF8zMkJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKQEAgLTEzMDksNiArMTMwOSw5IEBACiAjZGVmaW5lICAgICBWXzAzODAwNF9GTVRfQkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzMwogI2RlZmluZSAgICAgVl8wMzgwMDRfRk1UX0JDNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzQKICNkZWZpbmUgICAgIFZfMDM4MDA0X0ZNVF9CQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM1CisjZGVmaW5lICAgICBWXzAzODAwNF9GTVRfQkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzNgorI2RlZmluZSAgICAgVl8wMzgwMDRfRk1UX0JDNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzcKKyNkZWZpbmUgICAgIFZfMDM4MDA0X0ZNVF8zMl9BU18zMl8zMl8zMl8zMiAgICAgICAgICAgICAweDAwMDAwMDM4CiAjZGVmaW5lIFJfMDM4MDEwX1NRX1RFWF9SRVNPVVJDRV9XT1JENF8wICAgICAgICAgICAgIDB4MDM4MDEwCiAjZGVmaW5lICAgU18wMzgwMTBfRk9STUFUX0NPTVBfWCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDApCiAjZGVmaW5lICAgR18wMzgwMTBfRk9STUFUX0NPTVBfWCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAppbmRleCBiYTY0M2I1Li5lZjBlMGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKQEAgLTE2NSw2ICsxNjUsNyBAQAogCXVpbnQzMl90IGRlZmF1bHRfc2NsazsKIAl1aW50MzJfdCBkZWZhdWx0X2Rpc3BjbGs7CiAJdWludDMyX3QgZHBfZXh0Y2xrOworCXVpbnQzMl90IG1heF9waXhlbF9jbG9jazsKIH07CiAKIC8qCkBAIC0xNzgsNiArMTc5LDcgQEAKIHZvaWQgcmFkZW9uX2NvbWJpb3NfZ2V0X3Bvd2VyX21vZGVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcmFkZW9uX2F0b21iaW9zX2dldF9wb3dlcl9tb2RlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MTYgdm9sdGFnZV9sZXZlbCwgdTggdm9sdGFnZV90eXBlKTsKK2ludCByYWRlb25fYXRvbV9nZXRfbWF4X3ZkZGMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUxNiAqdm9sdGFnZSk7CiB2b2lkIHJzNjkwX3BtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCBydjZ4eF9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHJ2NzcwX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYwppbmRleCBkOTQ4MjY1Li5iMjQ0OTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCkBAIC05MDYsOSArOTA2LDkgQEAKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJmV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIsCiAJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKIAkuY3NfcGFyc2UgPSAmZXZlcmdyZWVuX2NzX3BhcnNlLAotCS5jb3B5X2JsaXQgPSBOVUxMLAotCS5jb3B5X2RtYSA9IE5VTEwsCi0JLmNvcHkgPSBOVUxMLAorCS5jb3B5X2JsaXQgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weV9kbWEgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAogCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLApAQCAtOTM4LDYgKzkzOCwxMyBAQAogaW50IHJhZGVvbl9hc2ljX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJcmFkZW9uX3JlZ2lzdGVyX2FjY2Vzc29yX2luaXQocmRldik7CisKKwkvKiBzZXQgdGhlIG51bWJlciBvZiBjcnRjcyAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKKwkJcmRldi0+bnVtX2NydGMgPSAxOworCWVsc2UKKwkJcmRldi0+bnVtX2NydGMgPSAyOworCiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfUjEwMDoKIAljYXNlIENISVBfUlYxMDA6CkBAIC0xMDE3LDE4ICsxMDI0LDMyIEBACiAJY2FzZSBDSElQX0pVTklQRVI6CiAJY2FzZSBDSElQX0NZUFJFU1M6CiAJY2FzZSBDSElQX0hFTUxPQ0s6CisJCS8qIHNldCBudW0gY3J0Y3MgKi8KKwkJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKQorCQkJcmRldi0+bnVtX2NydGMgPSA0OworCQllbHNlCisJCQlyZGV2LT5udW1fY3J0YyA9IDY7CiAJCXJkZXYtPmFzaWMgPSAmZXZlcmdyZWVuX2FzaWM7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9QQUxNOgorCWNhc2UgQ0hJUF9TVU1POgorCWNhc2UgQ0hJUF9TVU1PMjoKIAkJcmRldi0+YXNpYyA9ICZzdW1vX2FzaWM7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9CQVJUUzoKIAljYXNlIENISVBfVFVSS1M6CiAJY2FzZSBDSElQX0NBSUNPUzoKKwkJLyogc2V0IG51bSBjcnRjcyAqLworCQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKQorCQkJcmRldi0+bnVtX2NydGMgPSA0OworCQllbHNlCisJCQlyZGV2LT5udW1fY3J0YyA9IDY7CiAJCXJkZXYtPmFzaWMgPSAmYnRjX2FzaWM7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9DQVlNQU46CiAJCXJkZXYtPmFzaWMgPSAmY2F5bWFuX2FzaWM7CisJCS8qIHNldCBudW0gY3J0Y3MgKi8KKwkJcmRldi0+bnVtX2NydGMgPSA2OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBGSVhNRTogbm90IHN1cHBvcnRlZCB5ZXQgKi8KQEAgLTEwNDAsMTggKzEwNjEsNiBAQAogCQlyZGV2LT5hc2ljLT5zZXRfbWVtb3J5X2Nsb2NrID0gTlVMTDsKIAl9CiAKLQkvKiBzZXQgdGhlIG51bWJlciBvZiBjcnRjcyAqLwotCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKLQkJcmRldi0+bnVtX2NydGMgPSAxOwotCWVsc2UgewotCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKLQkJCXJkZXYtPm51bV9jcnRjID0gMjsKLQkJZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQotCQkJcmRldi0+bnVtX2NydGMgPSA2OwotCQllbHNlCi0JCQlyZGV2LT5udW1fY3J0YyA9IDI7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCmluZGV4IDkwZGZiMmIuLmJmMmI2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwpAQCAtMTI0Niw2ICsxMjQ2LDEwIEBACiAJCX0KIAkJKmRjcGxsID0gKnAxcGxsOwogCisJCXJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9IGxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNNYXhQaXhlbENsb2NrKTsKKwkJaWYgKHJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9PSAwKQorCQkJcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID0gNDAwMDA7CisKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0yMzE2LDYgKzIzMjAsMTQgQEAKIAkJCWxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPnI2MDAudXNWRERDKTsKIAl9CiAKKwkvKiBwYXRjaCB1cCB2ZGRjIGlmIG5lY2Vzc2FyeSAqLworCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPT0gMHhmZjAxKSB7CisJCXUxNiB2ZGRjOworCisJCWlmIChyYWRlb25fYXRvbV9nZXRfbWF4X3ZkZGMocmRldiwgJnZkZGMpID09IDApCisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPSB2ZGRjOworCX0KKwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApIHsKIAkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCiAJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID09IDApCkBAIC0yNjAzLDYgKzI2MTUsMTAgQEAKIAlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKIAkJcmV0dXJuOwogCisJLyogMHhmZjAxIGlzIGEgZmxhZyByYXRoZXIgdGhlbiBhbiBhY3R1YWwgdm9sdGFnZSAqLworCWlmICh2b2x0YWdlX2xldmVsID09IDB4ZmYwMSkKKwkJcmV0dXJuOworCiAJc3dpdGNoIChjcmV2KSB7CiAJY2FzZSAxOgogCQlhcmdzLnYxLnVjVm9sdGFnZVR5cGUgPSB2b2x0YWdlX3R5cGU7CkBAIC0yNjIyLDcgKzI2MzgsMzUgQEAKIAlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKIH0KIAoraW50IHJhZGVvbl9hdG9tX2dldF9tYXhfdmRkYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICAgdTE2ICp2b2x0YWdlKQoreworCXVuaW9uIHNldF92b2x0YWdlIGFyZ3M7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgU2V0Vm9sdGFnZSk7CisJdTggZnJldiwgY3JldjsKIAorCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY3JldikgeworCWNhc2UgMToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAyOgorCQlhcmdzLnYyLnVjVm9sdGFnZVR5cGUgPSBTRVRfVk9MVEFHRV9HRVRfTUFYX1ZPTFRBR0U7CisJCWFyZ3MudjIudWNWb2x0YWdlTW9kZSA9IDA7CisJCWFyZ3MudjIudXNWb2x0YWdlTGV2ZWwgPSAwOworCisJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCisJCSp2b2x0YWdlID0gbGUxNl90b19jcHUoYXJncy52Mi51c1ZvbHRhZ2VMZXZlbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQogCiB2b2lkIHJhZGVvbl9hdG9tX2luaXRpYWxpemVfYmlvc19zY3JhdGNoX3JlZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYwppbmRleCAxYWJhODVjLi4yMjlhMjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIHN0YXRpYyBib29sIHJhZGVvbl9hdHJtX2dldF9iaW9zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWludCByZXQ7Ci0JaW50IHNpemUgPSA2NCAqIDEwMjQ7CisJaW50IHNpemUgPSAyNTYgKiAxMDI0OwogCWludCBpOwogCiAJaWYgKCFyYWRlb25fYXRybV9zdXBwb3J0ZWQocmRldi0+cGRldikpCkBAIC0zMzEsNyArMzMxLDcgQEAKIAogCXNlcHJvbV9jbnRsMSA9IFJSRUczMihSQURFT05fU0VQUk9NX0NOVEwxKTsKIAl2aXBoX2NvbnRyb2wgPSBSUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCk7Ci0JYnVzX2NudGwgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKTsKKwlidXNfY250bCA9IFJSRUczMihSVjM3MF9CVVNfQ05UTCk7CiAJZDF2Z2FfY29udHJvbCA9IFJSRUczMihBVklWT19EMVZHQV9DT05UUk9MKTsKIAlkMnZnYV9jb250cm9sID0gUlJFRzMyKEFWSVZPX0QyVkdBX0NPTlRST0wpOwogCXZnYV9yZW5kZXJfY29udHJvbCA9IFJSRUczMihBVklWT19WR0FfUkVOREVSX0NPTlRST0wpOwpAQCAtMzUwLDcgKzM1MCw3IEBACiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsICh2aXBoX2NvbnRyb2wgJiB+UkFERU9OX1ZJUEhfRU4pKTsKIAogCS8qIGVuYWJsZSB0aGUgcm9tICovCi0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJBREVPTl9CVVNfQklPU19ESVNfUk9NKSk7CisJV1JFRzMyKFJWMzcwX0JVU19DTlRMLCAoYnVzX2NudGwgJiB+UlYzNzBfQlVTX0JJT1NfRElTX1JPTSkpOwogCiAJLyogRGlzYWJsZSBWR0EgbW9kZSAqLwogCVdSRUczMihBVklWT19EMVZHQV9DT05UUk9MLApAQCAtMzY3LDcgKzM2Nyw3IEBACiAJLyogcmVzdG9yZSByZWdzICovCiAJV1JFRzMyKFJBREVPTl9TRVBST01fQ05UTDEsIHNlcHJvbV9jbnRsMSk7CiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsIHZpcGhfY29udHJvbCk7Ci0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgYnVzX2NudGwpOworCVdSRUczMihSVjM3MF9CVVNfQ05UTCwgYnVzX2NudGwpOwogCVdSRUczMihBVklWT19EMVZHQV9DT05UUk9MLCBkMXZnYV9jb250cm9sKTsKIAlXUkVHMzIoQVZJVk9fRDJWR0FfQ09OVFJPTCwgZDJ2Z2FfY29udHJvbCk7CiAJV1JFRzMyKEFWSVZPX1ZHQV9SRU5ERVJfQ09OVFJPTCwgdmdhX3JlbmRlcl9jb250cm9sKTsKQEAgLTM5MCw3ICszOTAsMTAgQEAKIAogCXNlcHJvbV9jbnRsMSA9IFJSRUczMihSQURFT05fU0VQUk9NX0NOVEwxKTsKIAl2aXBoX2NvbnRyb2wgPSBSUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCk7Ci0JYnVzX2NudGwgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJYnVzX2NudGwgPSBSUkVHMzIoUlYzNzBfQlVTX0NOVEwpOworCWVsc2UKKwkJYnVzX2NudGwgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKTsKIAljcnRjX2dlbl9jbnRsID0gUlJFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMKTsKIAljcnRjMl9nZW5fY250bCA9IDA7CiAJY3J0Y19leHRfY250bCA9IFJSRUczMihSQURFT05fQ1JUQ19FWFRfQ05UTCk7CkBAIC00MTIsNyArNDE1LDEwIEBACiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsICh2aXBoX2NvbnRyb2wgJiB+UkFERU9OX1ZJUEhfRU4pKTsKIAogCS8qIGVuYWJsZSB0aGUgcm9tICovCi0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJBREVPTl9CVVNfQklPU19ESVNfUk9NKSk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpCisJCVdSRUczMihSVjM3MF9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJWMzcwX0JVU19CSU9TX0RJU19ST00pKTsKKwllbHNlCisJCVdSRUczMihSQURFT05fQlVTX0NOVEwsIChidXNfY250bCAmIH5SQURFT05fQlVTX0JJT1NfRElTX1JPTSkpOwogCiAJLyogVHVybiBvZmYgbWVtIHJlcXVlc3RzIGFuZCBDUlRDIGZvciBib3RoIGNvbnRyb2xsZXJzICovCiAJV1JFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMLApAQCAtNDM5LDcgKzQ0NSwxMCBAQAogCS8qIHJlc3RvcmUgcmVncyAqLwogCVdSRUczMihSQURFT05fU0VQUk9NX0NOVEwxLCBzZXByb21fY250bDEpOwogCVdSRUczMihSQURFT05fVklQSF9DT05UUk9MLCB2aXBoX2NvbnRyb2wpOwotCVdSRUczMihSQURFT05fQlVTX0NOVEwsIGJ1c19jbnRsKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJV1JFRzMyKFJWMzcwX0JVU19DTlRMLCBidXNfY250bCk7CisJZWxzZQorCQlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCBidXNfY250bCk7CiAJV1JFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMLCBjcnRjX2dlbl9jbnRsKTsKIAlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykpIHsKIAkJV1JFRzMyKFJBREVPTl9DUlRDMl9HRU5fQ05UTCwgY3J0YzJfZ2VuX2NudGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY2xvY2tzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYwppbmRleCA1MjQ5YWY4Li4yZDQ4ZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJcDFwbGwtPnJlZmVyZW5jZV9kaXYgPSBSUkVHMzJfUExMKFJBREVPTl9QUExMX1JFRl9ESVYpICYgMHgzZmY7CiAJaWYgKHAxcGxsLT5yZWZlcmVuY2VfZGl2IDwgMikKIAkJcDFwbGwtPnJlZmVyZW5jZV9kaXYgPSAxMjsKLQlwMnBsbC0+cmVmZXJlbmNlX2RpdiA9IHAxcGxsLT5yZWZlcmVuY2VfZGl2OwkKKwlwMnBsbC0+cmVmZXJlbmNlX2RpdiA9IHAxcGxsLT5yZWZlcmVuY2VfZGl2OwogCiAJLyogVGhlc2UgYXJlbid0IGluIHRoZSBkZXZpY2UtdHJlZSAqLwogCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNDIwKSB7CkBAIC0xMzksNiArMTM5LDggQEAKIAkJcDJwbGwtPnBsbF9vdXRfbWluID0gMTI1MDA7CiAJCXAycGxsLT5wbGxfb3V0X21heCA9IDM1MDAwOwogCX0KKwkvKiBub3Qgc3VyZSB3aGF0IHRoZSBtYXggc2hvdWxkIGJlIGluIGFsbCBjYXNlcyAqLworCXJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9IDM1MDAwOwogCiAJc3BsbC0+cmVmZXJlbmNlX2ZyZXEgPSBtcGxsLT5yZWZlcmVuY2VfZnJlcSA9IHAxcGxsLT5yZWZlcmVuY2VfZnJlcTsKIAlzcGxsLT5yZWZlcmVuY2VfZGl2ID0gbXBsbC0+cmVmZXJlbmNlX2RpdiA9CkBAIC0xNTEsNyArMTUzLDcgQEAKIAllbHNlCiAJCXJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsayA9CiAJCQlyYWRlb25fbGVnYWN5X2dldF9lbmdpbmVfY2xvY2socmRldik7Ci0JCQkKKwogCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIkFUWSxNQ0xLIiwgTlVMTCk7CiAJaWYgKHZhbCAmJiAqdmFsKQogCQlyZGV2LT5jbG9jay5kZWZhdWx0X21jbGsgPSAoKnZhbCkgLyAxMDsKQEAgLTE2MCw3ICsxNjIsNyBAQAogCQkJcmFkZW9uX2xlZ2FjeV9nZXRfbWVtb3J5X2Nsb2NrKHJkZXYpOwogCiAJRFJNX0lORk8oIlVzaW5nIGRldmljZS10cmVlIGNsb2NrIGluZm9cbiIpOwotCQorCiAJcmV0dXJuIHRydWU7CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCmluZGV4IDViOTkxZjcuLmU0NTk0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKQEAgLTg2Niw2ICs4NjYsMTEgQEAKIAkJcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrID0gc2NsazsKIAkJcmRldi0+Y2xvY2suZGVmYXVsdF9tY2xrID0gbWNsazsKIAorCQlpZiAoUkJJT1MzMihwbGxfaW5mbyArIDB4MTYpKQorCQkJcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID0gUkJJT1MzMihwbGxfaW5mbyArIDB4MTYpOworCQllbHNlCisJCQlyZGV2LT5jbG9jay5tYXhfcGl4ZWxfY2xvY2sgPSAzNTAwMDsgLyogbWlnaHQgbmVlZCBzb21ldGhpbmcgYXNpYyBzcGVjaWZpYyAqLworCiAJCXJldHVybiB0cnVlOwogCX0KIAlyZXR1cm4gZmFsc2U7CkBAIC0xNTQ4LDEwICsxNTUzLDEyIEBACiAJCQkgICAocmRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDRhNDgpKSB7CiAJCQkvKiBNYWMgWDgwMCAqLwogCQkJcmRldi0+bW9kZV9pbmZvLmNvbm5lY3Rvcl90YWJsZSA9IENUX01BQ19YODAwOwotCQl9IGVsc2UgaWYgKChyZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg0MTUwKSAmJgorCQl9IGVsc2UgaWYgKChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywyIikgfHwKKwkJCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywzIikpICYmCisJCQkgICAocmRldi0+cGRldi0+ZGV2aWNlID09IDB4NDE1MCkgJiYKIAkJCSAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAwMikgJiYKIAkJCSAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4NDE1MCkpIHsKLQkJCS8qIE1hYyBHNSA5NjAwICovCisJCQkvKiBNYWMgRzUgdG93ZXIgOTYwMCAqLwogCQkJcmRldi0+bW9kZV9pbmZvLmNvbm5lY3Rvcl90YWJsZSA9IENUX01BQ19HNV85NjAwOwogCQl9IGVsc2UKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCBlZTFkY2NiLi45NzkyZDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC00NCwxMiArNDQsMjAgQEAKIHJhZGVvbl9sZWdhY3lfYmFja2xpZ2h0X2luaXQoc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciwKIAkJCSAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmRybV9jb25uZWN0b3IpOwogCitib29sIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2Uoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CisKIHZvaWQgcmFkZW9uX2Nvbm5lY3Rvcl9ob3RwbHVnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAorCS8qIGJhaWwgaWYgdGhlIGNvbm5lY3RvciBkb2VzIG5vdCBoYXZlIGhwZCBwaW4sIGUuZy4sCisJICogVkdBLCBUViwgZXRjLgorCSAqLworCWlmIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkID09IFJBREVPTl9IUERfTk9ORSkKKwkJcmV0dXJuOworCiAJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAKIAkvKiBwb3dlcmluZyB1cC9kb3duIHRoZSBlRFAgcGFuZWwgZ2VuZXJhdGVzIGhwZCBldmVudHMgd2hpY2gKQEAgLTYyNiw4ICs2MzQsMTQgQEAKIHN0YXRpYyBpbnQgcmFkZW9uX3ZnYV9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCiAJLyogWFhYIGNoZWNrIG1vZGUgYmFuZHdpZHRoICovCi0JLyogWFhYIHZlcmlmeSBhZ2FpbnN0IG1heCBEQUMgb3V0cHV0IGZyZXF1ZW5jeSAqLworCisJaWYgKChtb2RlLT5jbG9jayAvIDEwKSA+IHJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jaykKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKwogCXJldHVybiBNT0RFX09LOwogfQogCkBAIC04MzAsNiArODQ0LDEzIEBACiAJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQkJRFJNX0VSUk9SKCIlczogcHJvYmVkIGEgbW9uaXRvciBidXQgbm98aW52YWxpZCBFRElEXG4iLAogCQkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJLyogcnM2OTAgc2VlbXMgdG8gaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25uZWN0b3JzIG5vdCBleGlzdGluZyBhbmQgYWx3YXlzCisJCQkgKiByZXR1cm4gYSBibG9jayBvZiAwJ3MuIElmIHdlIHNlZSB0aGlzIGp1c3Qgc3RvcCBwb2xsaW5nIG9uIHRoaXMgb3V0cHV0ICovCisJCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNzQwKSAmJiByYWRlb25fY29ubmVjdG9yLT5iYXNlLm51bGxfZWRpZF9jb3VudGVyKSB7CisJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJCQkJRFJNX0VSUk9SKCIlczogZGV0ZWN0ZWQgUlM2OTAgZmxvYXRpbmcgYnVzIGJ1Zywgc3RvcHBpbmcgZGRjIGRldGVjdFxuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzID0gTlVMTDsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPnVzZV9kaWdpdGFsID0gISEocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZC0+aW5wdXQgJiBEUk1fRURJRF9JTlBVVF9ESUdJVEFMKTsKIApAQCAtMTAxNSw2ICsxMDM2LDExIEBACiAJCX0gZWxzZQogCQkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKIAl9CisKKwkvKiBjaGVjayBhZ2FpbnN0IHRoZSBtYXggcGl4ZWwgY2xvY2sgKi8KKwlpZiAoKG1vZGUtPmNsb2NrIC8gMTApID4gcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCiAJcmV0dXJuIE1PREVfT0s7CiB9CiAKQEAgLTEwNTIsMTAgKzEwNzgsMTEgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCWludCByZXQ7CiAKLQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB7Ci0JCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlpZiAoKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgfHwKKwkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpKSB7CiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwogCiAJCWlmICghcmFkZW9uX2RpZ19jb25uZWN0b3ItPmVkcF9vbikKQEAgLTEwNjcsNyArMTA5NCw2IEBACiAJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRik7CiAKIAkJaWYgKHJldCA+IDApIHsKLQkJCWVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCQkJaWYgKGVuY29kZXIpIHsKIAkJCQlyYWRlb25fZml4dXBfbHZkc19uYXRpdmVfbW9kZShlbmNvZGVyLCBjb25uZWN0b3IpOwogCQkJCS8qIGFkZCBzY2FsZWQgbW9kZXMgKi8KQEAgLTEwOTEsOCArMTExNywxNCBAQAogCQkJLyogYWRkIHNjYWxlZCBtb2RlcyAqLwogCQkJcmFkZW9uX2FkZF9jb21tb25fbW9kZXMoZW5jb2RlciwgY29ubmVjdG9yKTsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CisJCS8qIG5lZWQgdG8gc2V0dXAgZGRjIG9uIHRoZSBicmlkZ2UgKi8KKwkJaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2UoY29ubmVjdG9yKSkgeworCQkJaWYgKGVuY29kZXIpCisJCQkJcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKGVuY29kZXIpOworCQl9CiAJCXJldCA9IHJhZGVvbl9kZGNfZ2V0X21vZGVzKHJhZGVvbl9jb25uZWN0b3IpOworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTc2LDE0ICsxMjA4LDE1IEBACiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyByZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCiAJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKIAkJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CiAJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOwogCX0KIAotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHsKLQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gcmFkZW9uX2Jlc3Rfc2luZ2xlX2VuY29kZXIoY29ubmVjdG9yKTsKKwlpZiAoKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgfHwKKwkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpKSB7CiAJCWlmIChlbmNvZGVyKSB7CiAJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CiAJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmF0aXZlX21vZGUgPSAmcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlOwpAQCAtMTIwMyw2ICsxMjM2LDExIEBACiAJCQlhdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKGNvbm5lY3RvciwKIAkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKTsKIAl9IGVsc2UgeworCQkvKiBuZWVkIHRvIHNldHVwIGRkYyBvbiB0aGUgYnJpZGdlICovCisJCWlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKGNvbm5lY3RvcikpIHsKKwkJCWlmIChlbmNvZGVyKQorCQkJCXJhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhlbmNvZGVyKTsKKwkJfQogCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZHBfc2lua190eXBlID0gcmFkZW9uX2RwX2dldHNpbmt0eXBlKHJhZGVvbl9jb25uZWN0b3IpOwogCQlpZiAocmFkZW9uX2hwZF9zZW5zZShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSkgewogCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CkBAIC0xMjE3LDYgKzEyNTUsMTYgQEAKIAkJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQl9CiAJCX0KKworCQlpZiAoKHJldCA9PSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCkgJiYKKwkJICAgIHJhZGVvbl9jb25uZWN0b3ItPmRhY19sb2FkX2RldGVjdCkgeworCQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gcmFkZW9uX2Jlc3Rfc2luZ2xlX2VuY29kZXIoY29ubmVjdG9yKTsKKwkJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3M7CisJCQlpZiAoZW5jb2RlcikgeworCQkJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJCQlyZXQgPSBlbmNvZGVyX2Z1bmNzLT5kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yKTsKKwkJCX0KKwkJfQogCX0KIAogCXJhZGVvbl9jb25uZWN0b3JfdXBkYXRlX3NjcmF0Y2hfcmVncyhjb25uZWN0b3IsIHJldCk7CkBAIC0xMjMxLDcgKzEyNzksOCBAQAogCiAJLyogWFhYIGNoZWNrIG1vZGUgYmFuZHdpZHRoICovCiAKLQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB7CisJaWYgKChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHx8CisJICAgIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKSkgewogCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCiAJCWlmICgobW9kZS0+aGRpc3BsYXkgPCAzMjApIHx8IChtb2RlLT52ZGlzcGxheSA8IDI0MCkpCkBAIC0xMjQxLDcgKzEyOTAsNyBAQAogCQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwogCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZV9tb2RlID0gJnJhZGVvbl9lbmNvZGVyLT5uYXRpdmVfbW9kZTsKIAotCQkvKiBBVklWTyBoYXJkd2FyZSBzdXBwb3J0cyBkb3duc2NhbGluZyBtb2RlcyBsYXJnZXIgdGhhbiB0aGUgcGFuZWwKKwkJCS8qIEFWSVZPIGhhcmR3YXJlIHN1cHBvcnRzIGRvd25zY2FsaW5nIG1vZGVzIGxhcmdlciB0aGFuIHRoZSBwYW5lbAogCQkJICogdG8gdGhlIHBhbmVsIHNpemUsIGJ1dCBJJ20gbm90IHN1cmUgdGhpcyBpcyBkZXNpcmFibGUuCiAJCQkgKi8KIAkJCWlmICgobW9kZS0+aGRpc3BsYXkgPiBuYXRpdmVfbW9kZS0+aGRpc3BsYXkpIHx8CkBAIC0xMzkwLDYgKzE0MzksMTAgQEAKIAkJZGVmYXVsdDoKIAkJCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSB0cnVlOwogCQkJY29ubmVjdG9yLT5kb3VibGVzY2FuX2FsbG93ZWQgPSB0cnVlOworCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAorCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAorCQkJCQkJICAgICAgMSk7CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDoKQEAgLTE0MTEsNiArMTQ2NCwxMiBAQAogCQkJCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gdHJ1ZTsKIAkJCWVsc2UKIAkJCQljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IGZhbHNlOworCQkJaWYgKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKSB7CisJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKKwkJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKKwkJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCisJCQkJCQkJICAgICAgMSk7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfZURQOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKaW5kZXggOGMxOTE2OS4uZmFlMDBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCkBAIC0yMjgsNiArMjI4LDcgQEAKIAlwYXJzZXIuZmlscCA9IGZpbHA7CiAJcGFyc2VyLnJkZXYgPSByZGV2OwogCXBhcnNlci5kZXYgPSByZGV2LT5kZXY7CisJcGFyc2VyLmZhbWlseSA9IHJkZXYtPmZhbWlseTsKIAlyID0gcmFkZW9uX2NzX3BhcnNlcl9pbml0KCZwYXJzZXIsIGRhdGEpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYWxpemUgcGFyc2VyICFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwppbmRleCA1YjYxMzY0Li43Y2ZhYTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwpAQCAtODIsNiArODIsOCBAQAogCSJDWVBSRVNTIiwKIAkiSEVNTE9DSyIsCiAJIlBBTE0iLAorCSJTVU1PIiwKKwkiU1VNTzIiLAogCSJCQVJUUyIsCiAJIlRVUktTIiwKIAkiQ0FJQ09TIiwKQEAgLTIxMyw2ICsyMTUsOCBAQAogCQlyZXR1cm4gcjsKIAl9CiAKKwkvKiBjbGVhciB3YiBtZW1vcnkgKi8KKwltZW1zZXQoKGNoYXIgKilyZGV2LT53Yi53YiwgMCwgUkFERU9OX0dQVV9QQUdFX1NJWkUpOwogCS8qIGRpc2FibGUgZXZlbnRfd3JpdGUgZmVuY2VzICovCiAJcmRldi0+d2IudXNlX2V2ZW50ID0gZmFsc2U7CiAJLyogZGlzYWJsZWQgdmlhIG1vZHVsZSBwYXJhbSAqLwpAQCAtNzUyLDYgKzc1Niw3IEBACiAJZG1hX2JpdHMgPSByZGV2LT5uZWVkX2RtYTMyID8gMzIgOiA0MDsKIAlyID0gcGNpX3NldF9kbWFfbWFzayhyZGV2LT5wZGV2LCBETUFfQklUX01BU0soZG1hX2JpdHMpKTsKIAlpZiAocikgeworCQlyZGV2LT5uZWVkX2RtYTMyID0gdHJ1ZTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmFkZW9uOiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKaW5kZXggYWUyNDdlZWMuLjI5MmY3M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKQEAgLTI2NCw2ICsyNjQsOCBAQAogCQlyYWRlb25fYm9fdW5yZXNlcnZlKHdvcmstPm9sZF9yYm8pOwogCX0gZWxzZQogCQlEUk1fRVJST1IoImZhaWxlZCB0byByZXNlcnZlIGJ1ZmZlciBhZnRlciBmbGlwXG4iKTsKKworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZ3b3JrLT5vbGRfcmJvLT5nZW1fYmFzZSk7CiAJa2ZyZWUod29yayk7CiB9CiAKQEAgLTM3MSw2ICszNzMsOCBAQAogCW5ld19yYWRlb25fZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoZmIpOwogCS8qIHNjaGVkdWxlIHVucGluIG9mIHRoZSBvbGQgYnVmZmVyICovCiAJb2JqID0gb2xkX3JhZGVvbl9mYi0+b2JqOworCS8qIHRha2UgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBvYmplY3QgKi8KKwlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uob2JqKTsKIAlyYm8gPSBnZW1fdG9fcmFkZW9uX2JvKG9iaik7CiAJd29yay0+b2xkX3JibyA9IHJibzsKIAlJTklUX1dPUksoJndvcmstPndvcmssIHJhZGVvbl91bnBpbl93b3JrX2Z1bmMpOwpAQCAtMzc4LDEyICszODIsOSBAQAogCS8qIFdlIGJvcnJvdyB0aGUgZXZlbnQgc3BpbiBsb2NrIGZvciBwcm90ZWN0aW5nIHVucGluX3dvcmsgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJaWYgKHJhZGVvbl9jcnRjLT51bnBpbl93b3JrKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCQlrZnJlZSh3b3JrKTsKLQkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7Ci0KIAkJRFJNX0RFQlVHX0RSSVZFUigiZmxpcCBxdWV1ZTogY3J0YyBhbHJlYWR5IGJ1c3lcbiIpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyID0gLUVCVVNZOworCQlnb3RvIHVubG9ja19mcmVlOwogCX0KIAlyYWRlb25fY3J0Yy0+dW5waW5fd29yayA9IHdvcms7CiAJcmFkZW9uX2NydGMtPmRlZmVycmVkX2ZsaXBfY29tcGxldGlvbiA9IDA7CkBAIC00OTcsNiArNDk4LDggQEAKIHBmbGlwX2NsZWFudXA6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCXJhZGVvbl9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKK3VubG9ja19mcmVlOgorCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKG9sZF9yYWRlb25fZmItPm9iaik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAJa2ZyZWUod29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCmluZGV4IDFkMzMwNjAuLjczZGZiZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIGludCByYWRlb25fdGVzdGluZyA9IDA7CiBpbnQgcmFkZW9uX2Nvbm5lY3Rvcl90YWJsZSA9IDA7CiBpbnQgcmFkZW9uX3R2ID0gMTsKLWludCByYWRlb25fYXVkaW8gPSAxOworaW50IHJhZGVvbl9hdWRpbyA9IDA7CiBpbnQgcmFkZW9uX2Rpc3BfcHJpb3JpdHkgPSAwOwogaW50IHJhZGVvbl9od19pMmMgPSAwOwogaW50IHJhZGVvbl9wY2llX2dlbjIgPSAwOwpAQCAtMTUxLDcgKzE1MSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHR2LCAiVFYgZW5hYmxlICgwID0gZGlzYWJsZSkiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZCh0diwgcmFkZW9uX3R2LCBpbnQsIDA0NDQpOwogCi1NT0RVTEVfUEFSTV9ERVNDKGF1ZGlvLCAiQXVkaW8gZW5hYmxlICgwID0gZGlzYWJsZSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXVkaW8sICJBdWRpbyBlbmFibGUgKDEgPSBlbmFibGUpIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQoYXVkaW8sIHJhZGVvbl9hdWRpbywgaW50LCAwNDQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyhkaXNwX3ByaW9yaXR5LCAiRGlzcGxheSBQcmlvcml0eSAoMCA9IGF1dG8sIDEgPSBub3JtYWwsIDIgPSBoaWdoKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKaW5kZXggMWI1NTc1NS4uYjI5MzQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCkBAIC0zNjcsNyArMzY3LDggQEAKIAl9CiAKIAlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpICYmCi0JICAgIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkpIHsKKwkgICAgKChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgfHwKKwkgICAgIHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkpIHsKIAkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwogCQlyYWRlb25fZHBfc2V0X2xpbmtfY29uZmlnKGNvbm5lY3RvciwgbW9kZSk7CiAJfQpAQCAtNjYwLDIxICs2NjEsMTYgQEAKIAlpZiAocmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKGVuY29kZXIpKQogCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7CiAKKwkvKiBEVk8gaXMgYWx3YXlzIERWTyAqLworCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EVk8pCisJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVk87CisKIAljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQlpZiAoIWNvbm5lY3RvcikgewotCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6Ci0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgotCQlkZWZhdWx0OgotCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0NSVDsKLQkJfQotCX0KKwkvKiBpZiB3ZSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBkZXZpY2UgeWV0LCBqdXN0IHVzZSBvbmUgb2YKKwkgKiB0aGUgY29ubmVjdG9ycyB0aWVkIHRvIHRoZSBlbmNvZGVyLgorCSAqLworCWlmICghY29ubmVjdG9yKQorCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOwogCXJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAKIAlzd2l0Y2ggKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpIHsKQEAgLTk1NCwxMCArOTUwLDE1IEBACiAJaW50IGRwX2xhbmVfY291bnQgPSAwOwogCWludCBjb25uZWN0b3Jfb2JqZWN0X2lkID0gMDsKIAlpbnQgaWdwX2xhbmVfaW5mbyA9IDA7CisJaW50IGRpZ19lbmNvZGVyID0gZGlnLT5kaWdfZW5jb2RlcjsKIAotCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkKKwlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQpIHsKIAkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChlbmNvZGVyKTsKLQllbHNlCisJCS8qIGp1c3QgbmVlZGVkIHRvIGF2b2lkIGJhaWxpbmcgaW4gdGhlIGVuY29kZXIgY2hlY2suICB0aGUgZW5jb2RlcgorCQkgKiBpc24ndCB1c2VkIGZvciBpbml0CisJCSAqLworCQlkaWdfZW5jb2RlciA9IDA7CisJfSBlbHNlCiAJCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwogCiAJaWYgKGNvbm5lY3RvcikgewpAQCAtOTczLDcgKzk3NCw3IEBACiAJfQogCiAJLyogbm8gZGlnIGVuY29kZXIgYXNzaWduZWQgKi8KLQlpZiAoZGlnLT5kaWdfZW5jb2RlciA9PSAtMSkKKwlpZiAoZGlnX2VuY29kZXIgPT0gLTEpCiAJCXJldHVybjsKIAogCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKQpAQCAtMTAyMyw3ICsxMDI0LDcgQEAKIAogCQlpZiAoZGlnLT5saW5rYikKIAkJCWFyZ3MudjMuYWNDb25maWcudWNMaW5rU2VsID0gMTsKLQkJaWYgKGRpZy0+ZGlnX2VuY29kZXIgJiAxKQorCQlpZiAoZGlnX2VuY29kZXIgJiAxKQogCQkJYXJncy52My5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSAxOwogCiAJCS8qIFNlbGVjdCB0aGUgUExMIGZvciB0aGUgUEhZCkBAIC0xMDczLDcgKzEwNzQsNyBAQAogCQkJCWFyZ3MudjMuYWNDb25maWcuZkR1YWxMaW5rQ29ubmVjdG9yID0gMTsKIAkJfQogCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgewotCQlhcmdzLnYyLmFjQ29uZmlnLnVjRW5jb2RlclNlbCA9IGRpZy0+ZGlnX2VuY29kZXI7CisJCWFyZ3MudjIuYWNDb25maWcudWNFbmNvZGVyU2VsID0gZGlnX2VuY29kZXI7CiAJCWlmIChkaWctPmxpbmtiKQogCQkJYXJncy52Mi5hY0NvbmZpZy51Y0xpbmtTZWwgPSAxOwogCkBAIC0xMDg5LDkgKzEwOTAsMTAgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGlzX2RwKQorCQlpZiAoaXNfZHApIHsKIAkJCWFyZ3MudjIuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7Ci0JCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgeworCQkJYXJncy52Mi5hY0NvbmZpZy5mRFBDb25uZWN0b3IgPSAxOworCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgewogCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKIAkJCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOwogCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKQEAgLTExMDAsNyArMTEwMiw3IEBACiAJfSBlbHNlIHsKIAkJYXJncy52MS51Y0NvbmZpZyA9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0NMS1NSQ19QUExMOwogCi0JCWlmIChkaWctPmRpZ19lbmNvZGVyKQorCQlpZiAoZGlnX2VuY29kZXIpCiAJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0RJRzJfRU5DT0RFUjsKIAkJZWxzZQogCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19ESUcxX0VOQ09ERVI7CkBAIC0xNDMwLDcgKzE0MzIsMTEgQEAKIAlpZiAoaXNfZGlnKSB7CiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIERSTV9NT0RFX0RQTVNfT046Ci0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFX09VVFBVVCwgMCwgMCk7CisJCQkvKiBzb21lIGVhcmx5IGRjZTMuMiBib2FyZHMgaGF2ZSBhIGJ1ZyBpbiB0aGVpciB0cmFuc21pdHRlciBjb250cm9sIHRhYmxlICovCisJCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNzEwKSB8fCAocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MzApKQorCQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEUsIDAsIDApOworCQkJZWxzZQorCQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEVfT1VUUFVULCAwLCAwKTsKIAkJCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7CiAJCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwogCkBAIC0xNTIxLDI2ICsxNTI3LDI5IEBACiAJfQogCiAJaWYgKGV4dF9lbmNvZGVyKSB7Ci0JCWludCBhY3Rpb247Ci0KIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKIAkJZGVmYXVsdDoKLQkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKQotCQkJCWFjdGlvbiA9IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQUJMRV9PVVRQVVQ7Ci0JCQllbHNlCi0JCQkJYWN0aW9uID0gQVRPTV9FTkFCTEU7CisJCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgeworCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQUJMRV9PVVRQVVQpOworCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkdfT0ZGKTsKKwkJCX0gZWxzZQorCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRU5BQkxFKTsKIAkJCWJyZWFrOwogCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CiAJCWNhc2UgRFJNX01PREVfRFBNU19PRkY6Ci0JCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKLQkJCQlhY3Rpb24gPSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ESVNBQkxFX09VVFBVVDsKLQkJCWVsc2UKLQkJCQlhY3Rpb24gPSBBVE9NX0RJU0FCTEU7CisJCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgeworCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkcpOworCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RJU0FCTEVfT1VUUFVUKTsKKwkJCX0gZWxzZQorCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRElTQUJMRSk7CiAJCQlicmVhazsKIAkJfQotCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBhY3Rpb24pOwogCX0KIAogCXJhZGVvbl9hdG9tYmlvc19lbmNvZGVyX2RwbXNfc2NyYXRjaF9yZWdzKGVuY29kZXIsIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pID8gdHJ1ZSA6IGZhbHNlKTsKQEAgLTE5OTksNiArMjAwOCw2NSBAQAogCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIH0KIAorc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK3JhZGVvbl9hdG9tX2RpZ19kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisJdTMyIGJpb3NfMF9zY3JhdGNoOworCisJaWYgKCFBU0lDX0lTX0RDRTQocmRldikpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisKKwlpZiAoIWV4dF9lbmNvZGVyKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworCisJaWYgKChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpID09IDApCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisKKwkvKiBsb2FkIGRldGVjdCBvbiB0aGUgZHAgYnJpZGdlICovCisJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfREFDTE9BRF9ERVRFQ1RJT04pOworCisJYmlvc18wX3NjcmF0Y2ggPSBSUkVHMzIoUjYwMF9CSU9TXzBfU0NSQVRDSCk7CisKKwlEUk1fREVCVUdfS01TKCJCaW9zIDAgc2NyYXRjaCAleCAlMDh4XG4iLCBiaW9zXzBfc2NyYXRjaCwgcmFkZW9uX2VuY29kZXItPmRldmljZXMpOworCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMV9NQVNLKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDJfTUFTSykKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX0NWX01BU0t8QVRPTV9TMF9DVl9NQVNLX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9DT01QT1NJVEUgfCBBVE9NX1MwX1RWMV9DT01QT1NJVEVfQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIENUViAqLworCQllbHNlIGlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9TVklERU8gfCBBVE9NX1MwX1RWMV9TVklERU9fQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIFNUViAqLworCX0KKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3ZvaWQKK3JhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCisJaWYgKGV4dF9lbmNvZGVyKQorCQkvKiBkZGNfc2V0dXAgb24gdGhlIGRwIGJyaWRnZSAqLworCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRERDX1NFVFVQKTsKKworfQorCiBzdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKQEAgLTIxNjIsNyArMjIzMCw3IEBACiAJLm1vZGVfc2V0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9tb2RlX3NldCwKIAkuY29tbWl0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9jb21taXQsCiAJLmRpc2FibGUgPSByYWRlb25fYXRvbV9lbmNvZGVyX2Rpc2FibGUsCi0JLyogbm8gZGV0ZWN0IGZvciBUTURTL0xWRFMgeWV0ICovCisJLmRldGVjdCA9IHJhZGVvbl9hdG9tX2RpZ19kZXRlY3QsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyByYWRlb25fYXRvbV9kYWNfaGVscGVyX2Z1bmNzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaAppbmRleCA2ZjFkOWU1Li5lYzJmMWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaApAQCAtODEsNiArODEsOCBAQAogCUNISVBfQ1lQUkVTUywKIAlDSElQX0hFTUxPQ0ssCiAJQ0hJUF9QQUxNLAorCUNISVBfU1VNTywKKwlDSElQX1NVTU8yLAogCUNISVBfQkFSVFMsCiAJQ0hJUF9UVVJLUywKIAlDSElQX0NBSUNPUywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCmluZGV4IDFmODIyOTQuLjAyMWQyYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYwpAQCAtNDAsNiArNDAsMzUgQEAKICNpbmNsdWRlICJyYWRlb24uaCIKICNpbmNsdWRlICJyYWRlb25fdHJhY2UuaCIKIAorc3RhdGljIHZvaWQgcmFkZW9uX2ZlbmNlX3dyaXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgc2VxKQoreworCWlmIChyZGV2LT53Yi5lbmFibGVkKSB7CisJCXUzMiBzY3JhdGNoX2luZGV4OworCQlpZiAocmRldi0+d2IudXNlX2V2ZW50KQorCQkJc2NyYXRjaF9pbmRleCA9IFI2MDBfV0JfRVZFTlRfT0ZGU0VUICsgcmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnIC0gcmRldi0+c2NyYXRjaC5yZWdfYmFzZTsKKwkJZWxzZQorCQkJc2NyYXRjaF9pbmRleCA9IFJBREVPTl9XQl9TQ1JBVENIX09GRlNFVCArIHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2U7CisJCXJkZXYtPndiLndiW3NjcmF0Y2hfaW5kZXgvNF0gPSBjcHVfdG9fbGUzMihzZXEpOzsKKwl9IGVsc2UKKwkJV1JFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZywgc2VxKTsKK30KKworc3RhdGljIHUzMiByYWRlb25fZmVuY2VfcmVhZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgc2VxOworCisJaWYgKHJkZXYtPndiLmVuYWJsZWQpIHsKKwkJdTMyIHNjcmF0Y2hfaW5kZXg7CisJCWlmIChyZGV2LT53Yi51c2VfZXZlbnQpCisJCQlzY3JhdGNoX2luZGV4ID0gUjYwMF9XQl9FVkVOVF9PRkZTRVQgKyByZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlOworCQllbHNlCisJCQlzY3JhdGNoX2luZGV4ID0gUkFERU9OX1dCX1NDUkFUQ0hfT0ZGU0VUICsgcmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnIC0gcmRldi0+c2NyYXRjaC5yZWdfYmFzZTsKKwkJc2VxID0gbGUzMl90b19jcHUocmRldi0+d2Iud2Jbc2NyYXRjaF9pbmRleC80XSk7CisJfSBlbHNlCisJCXNlcSA9IFJSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcpOworCXJldHVybiBzZXE7Cit9CisKIGludCByYWRlb25fZmVuY2VfZW1pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CkBAIC01MCwxMiArNzksMTIgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWZlbmNlLT5zZXEgPSBhdG9taWNfYWRkX3JldHVybigxLCAmcmRldi0+ZmVuY2VfZHJ2LnNlcSk7Ci0JaWYgKCFyZGV2LT5jcC5yZWFkeSkgeworCWlmICghcmRldi0+Y3AucmVhZHkpCiAJCS8qIEZJWE1FOiBjcCBpcyBub3QgcnVubmluZyBhc3N1bWUgZXZlcnl0aGluZ3MgaXMgZG9uZSByaWdodAogCQkgKiBhd2F5CiAJCSAqLwotCQlXUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnLCBmZW5jZS0+c2VxKTsKLQl9IGVsc2UKKwkJcmFkZW9uX2ZlbmNlX3dyaXRlKHJkZXYsIGZlbmNlLT5zZXEpOworCWVsc2UKIAkJcmFkZW9uX2ZlbmNlX3JpbmdfZW1pdChyZGV2LCBmZW5jZSk7CiAKIAl0cmFjZV9yYWRlb25fZmVuY2VfZW1pdChyZGV2LT5kZGV2LCBmZW5jZS0+c2VxKTsKQEAgLTczLDE1ICsxMDIsNyBAQAogCWJvb2wgd2FrZSA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgY2ppZmZpZXM7CiAKLQlpZiAocmRldi0+d2IuZW5hYmxlZCkgewotCQl1MzIgc2NyYXRjaF9pbmRleDsKLQkJaWYgKHJkZXYtPndiLnVzZV9ldmVudCkKLQkJCXNjcmF0Y2hfaW5kZXggPSBSNjAwX1dCX0VWRU5UX09GRlNFVCArIHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2U7Ci0JCWVsc2UKLQkJCXNjcmF0Y2hfaW5kZXggPSBSQURFT05fV0JfU0NSQVRDSF9PRkZTRVQgKyByZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlOwotCQlzZXEgPSBsZTMyX3RvX2NwdShyZGV2LT53Yi53YltzY3JhdGNoX2luZGV4LzRdKTsKLQl9IGVsc2UKLQkJc2VxID0gUlJFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyk7CisJc2VxID0gcmFkZW9uX2ZlbmNlX3JlYWQocmRldik7CiAJaWYgKHNlcSAhPSByZGV2LT5mZW5jZV9kcnYubGFzdF9zZXEpIHsKIAkJcmRldi0+ZmVuY2VfZHJ2Lmxhc3Rfc2VxID0gc2VxOwogCQlyZGV2LT5mZW5jZV9kcnYubGFzdF9qaWZmaWVzID0gamlmZmllczsKQEAgLTI1MSw3ICsyNzIsNyBAQAogCQkJciA9IHJhZGVvbl9ncHVfcmVzZXQocmRldik7CiAJCQlpZiAocikKIAkJCQlyZXR1cm4gcjsKLQkJCVdSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcsIGZlbmNlLT5zZXEpOworCQkJcmFkZW9uX2ZlbmNlX3dyaXRlKHJkZXYsIGZlbmNlLT5zZXEpOwogCQkJcmRldi0+Z3B1X2xvY2t1cCA9IGZhbHNlOwogCQl9CiAJCXRpbWVvdXQgPSBSQURFT05fRkVOQ0VfSklGRklFU19USU1FT1VUOwpAQCAtMzUxLDcgKzM3Miw3IEBACiAJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5mZW5jZV9kcnYubG9jaywgaXJxX2ZsYWdzKTsKIAkJcmV0dXJuIHI7CiAJfQotCVdSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcsIDApOworCXJhZGVvbl9mZW5jZV93cml0ZShyZGV2LCAwKTsKIAlhdG9taWNfc2V0KCZyZGV2LT5mZW5jZV9kcnYuc2VxLCAwKTsKIAlJTklUX0xJU1RfSEVBRCgmcmRldi0+ZmVuY2VfZHJ2LmNyZWF0ZWQpOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5mZW5jZV9kcnYuZW1pdGVkKTsKQEAgLTM5MSw3ICs0MTIsNyBAQAogCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlOwogCiAJc2VxX3ByaW50ZihtLCAiTGFzdCBzaWduYWxlZCBmZW5jZSAweCUwOFhcbiIsCi0JCSAgIFJSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcpKTsKKwkJICAgcmFkZW9uX2ZlbmNlX3JlYWQocmRldikpOwogCWlmICghbGlzdF9lbXB0eSgmcmRldi0+ZmVuY2VfZHJ2LmVtaXRlZCkpIHsKIAkJICAgZmVuY2UgPSBsaXN0X2VudHJ5KHJkZXYtPmZlbmNlX2Rydi5lbWl0ZWQucHJldiwKIAkJCQkgICAgICBzdHJ1Y3QgcmFkZW9uX2ZlbmNlLCBsaXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAppbmRleCA5NzdhMzQxLi42ZGY0ZTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCkBAIC00ODMsNiArNDgzLDggQEAKIGV4dGVybiB2b2lkIGF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJCSAgIGludCBhY3Rpb24sIHVpbnQ4X3QgbGFuZV9udW0sCiAJCQkJCSAgIHVpbnQ4X3QgbGFuZV9zZXQpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitleHRlcm4gc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIGludCByYWRlb25fZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlLAogCQkJCXU4IHdyaXRlX2J5dGUsIHU4ICpyZWFkX2J5dGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwppbmRleCA4NmVkYTFlLi5hYWExOWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKQEAgLTQ4Nyw2ICs0ODcsNyBAQAogCWNhc2UgVEhFUk1BTF9UWVBFX1JWNlhYOgogCWNhc2UgVEhFUk1BTF9UWVBFX1JWNzcwOgogCWNhc2UgVEhFUk1BTF9UWVBFX0VWRVJHUkVFTjoKKwljYXNlIFRIRVJNQUxfVFlQRV9OSToKIAljYXNlIFRIRVJNQUxfVFlQRV9TVU1POgogCQlyZGV2LT5wbS5pbnRfaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKHJkZXYtPmRldik7CiAJCWlmIChJU19FUlIocmRldi0+cG0uaW50X2h3bW9uX2RldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKaW5kZXggZWM5M2E3NS4uYmM0NGEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKQEAgLTMwMCw2ICszMDAsOCBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0JVU19SRUFEX0JVUlNUICAgICAgICAgKDEgPDwgMzApCiAjZGVmaW5lIFJBREVPTl9CVVNfQ05UTDEgICAgICAgICAgICAgICAgICAgIDB4MDAzNAogIyAgICAgICBkZWZpbmUgUkFERU9OX0JVU19XQUlUX09OX0xPQ0tfRU4gICAgKDEgPDwgNCkKKyNkZWZpbmUgUlYzNzBfQlVTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgMHgwMDRjCisjICAgICAgIGRlZmluZSBSVjM3MF9CVVNfQklPU19ESVNfUk9NICAgICAgICAoMSA8PCAyKQogLyogcnYzNzAvcnYzODAsIHJ2NDEwLCByNDIzL3I0MzAvcjQ4MCwgcjV4eCAqLwogI2RlZmluZSBSQURFT05fTVNJX1JFQVJNX0VOCQkgICAgMHgwMTYwCiAjCWRlZmluZSBSVjM3MF9NU0lfUkVBUk1fRU4JICAgICAoMSA8PCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNjAwIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNjAwCmluZGV4IDkyZjE5MDAuLmVhNDk3NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjYwMAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I2MDAKQEAgLTc1OCw2ICs3NTgsNSBAQAogMHgwMDAwOTcxNCBWQ19FTkhBTkNFCiAweDAwMDA5ODMwIERCX0RFQlVHCiAweDAwMDA5ODM4IERCX1dBVEVSTUFSS1MKLTB4MDAwMjhEMjggREJfU1JFU1VMVFNfQ09NUEFSRV9TVEFURTAKIDB4MDAwMjhENDQgREJfQUxQSEFfVE9fTUFTSwogMHgwMDAwOTcwMCBWQ19DTlRMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKaW5kZXggNmUzYjExZS4uMWY1ODUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAJcmV0dXJuIHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fYWxsb2MocmRldik7CiB9CiAKLWludCByczYwMF9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyBpbnQgcnM2MDBfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKIAlpbnQgciwgaTsKQEAgLTQ0MCw4ICs0NDAsOCBAQAogCQlyZXR1cm4gcjsKIAlyYWRlb25fZ2FydF9yZXN0b3JlKHJkZXYpOwogCS8qIEVuYWJsZSBidXMgbWFzdGVyICovCi0JdG1wID0gUlJFRzMyKFJfMDAwMDRDX0JVU19DTlRMKSAmIENfMDAwMDRDX0JVU19NQVNURVJfRElTOwotCVdSRUczMihSXzAwMDA0Q19CVVNfQ05UTCwgdG1wKTsKKwl0bXAgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKSAmIH5SUzYwMF9CVVNfTUFTVEVSX0RJUzsKKwlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCB0bXApOwogCS8qIEZJWE1FOiBzZXR1cCBkZWZhdWx0IHBhZ2UgKi8KIAlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsCiAJCSAgKFNfMDAwMTAwX0VGRkVDVElWRV9MMl9DQUNIRV9TSVpFKDYpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCBlZjhhNWJhYi4uNGRlNTE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwpAQCAtMTA1LDYgKzEwNSw5IEBACiAJc3RydWN0IHJhZGVvbl92b2x0YWdlICp2b2x0YWdlID0gJnBzLT5jbG9ja19pbmZvW3JlcV9jbV9pZHhdLnZvbHRhZ2U7CiAKIAlpZiAoKHZvbHRhZ2UtPnR5cGUgPT0gVk9MVEFHRV9TVykgJiYgdm9sdGFnZS0+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+bWlub3IsIG1lZGlhX2Rldm5vZGVfbnVtcyk7CisJc2V0X2JpdChtaW5vciwgbWVkaWFfZGV2bm9kZV9udW1zKTsKIAltdXRleF91bmxvY2soJm1lZGlhX2Rldm5vZGVfbG9jayk7CiAKIAltZGV2LT5taW5vciA9IG1pbm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCmluZGV4IGU0Yzk3ZmQuLjUyNzk4YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiBjb25maWcgUkFESU9fTUlST1BDTTIwCiAJdHJpc3RhdGUgIm1pcm9TT1VORCBQQ00yMCByYWRpbyIKLQlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwyICYmIFNORAorCWRlcGVuZHMgb24gSVNBICYmIElTQV9ETUFfQVBJICYmIFZJREVPX1Y0TDIgJiYgU05ECiAJc2VsZWN0IFNORF9JU0EKIAlzZWxlY3QgU05EX01JUk8KIAktLS1oZWxwLS0tCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogY29uZmlnIFJBRElPX1NGMTZGTVIyCiAJdHJpc3RhdGUgIlNGMTZGTVIyIFJhZGlvIgotCWRlcGVuZHMgb24gSVNBICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwyICYmIFNORAogCS0tLWhlbHAtLS0KIAkgIENob29zZSBZIGhlcmUgaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIEZNIHJhZGlvIGNhcmRzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzLWkyYy5jCmluZGV4IGRlY2EyZTAuLmM5ZjRhOGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYwpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKIAkJY2hhciBwc19uYW1lW01BWF9SRFNfUFNfTkFNRSArIDFdOwogCiAJCWxlbiA9IGNvbnRyb2wtPnNpemUgLSAxOwotCQlpZiAobGVuID4gTUFYX1JEU19QU19OQU1FKSB7CisJCWlmIChsZW4gPCAwIHx8IGxlbiA+IE1BWF9SRFNfUFNfTkFNRSkgewogCQkJcnZhbCA9IC1FUkFOR0U7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAJCWNoYXIgcmFkaW9fdGV4dFtNQVhfUkRTX1JBRElPX1RFWFQgKyAxXTsKIAogCQlsZW4gPSBjb250cm9sLT5zaXplIC0gMTsKLQkJaWYgKGxlbiA+IE1BWF9SRFNfUkFESU9fVEVYVCkgeworCQlpZiAobGVuIDwgMCB8fCBsZW4gPiBNQVhfUkRTX1JBRElPX1RFWFQpIHsKIAkJCXJ2YWwgPSAtRVJBTkdFOwogCQkJZ290byBleGl0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2ZpbnRlay1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCmluZGV4IDhmYTUzOWQuLjdmNzA3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCkBAIC01OTcsMTIgKzU5NywxNyBAQAogc3RhdGljIGludCBmaW50ZWtfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBmaW50ZWtfZGV2ICpmaW50ZWsgPSBwbnBfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZpdF9kYmcoIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZmaW50ZWstPmZpbnRla19sb2NrLCBmbGFncyk7CisKIAkvKiBkaXNhYmxlIGFsbCBDSVIgaW50ZXJydXB0cyAqLwogCWZpbnRla19jaXJfcmVnX3dyaXRlKGZpbnRlaywgQ0lSX1NUQVRVU19JUlFfTUFTSywgQ0lSX1NUQVRVUyk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW50ZWstPmZpbnRla19sb2NrLCBmbGFncyk7CisKIAlmaW50ZWtfY29uZmlnX21vZGVfZW5hYmxlKGZpbnRlayk7CiAKIAkvKiBkaXNhYmxlIGNpciBsb2dpY2FsIGRldiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwppbmRleCAzZjNjNzA3Li42YmMzNWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2ltb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwpAQCAtMzA3LDYgKzMwNywxNCBAQAogCS8qIDB4ZmZkYyBpTU9OIE1DRSBWRkQgKi8KIAl7IDB4MDAwMTAwMDBmZmZmZmZlZWxsLCBLRVlfVk9MVU1FVVAgfSwKIAl7IDB4MDEwMDAwMDBmZmZmZmZlZWxsLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMDAwMDAwMWZmZmZmZmVlbGwsIEtFWV9NVVRFIH0sCisJeyAweDAwMDAwMDBmZmZmZmZmZWVsbCwgS0VZX01FRElBIH0sCisJeyAweDAwMDAwMDEyZmZmZmZmZWVsbCwgS0VZX1VQIH0sCisJeyAweDAwMDAwMDEzZmZmZmZmZWVsbCwgS0VZX0RPV04gfSwKKwl7IDB4MDAwMDAwMTRmZmZmZmZlZWxsLCBLRVlfTEVGVCB9LAorCXsgMHgwMDAwMDAxNWZmZmZmZmVlbGwsIEtFWV9SSUdIVCB9LAorCXsgMHgwMDAwMDAxNmZmZmZmZmVlbGwsIEtFWV9FTlRFUiB9LAorCXsgMHgwMDAwMDAxN2ZmZmZmZmVlbGwsIEtFWV9FU0MgfSwKIAkvKiBpTU9OIEtub2IgdmFsdWVzICovCiAJeyAweDAwMDEwMGZmZmZmZmZmZWVsbCwgS0VZX1ZPTFVNRVVQIH0sCiAJeyAweDAxMDAwMGZmZmZmZmZmZWVsbCwgS0VZX1ZPTFVNRURPV04gfSwKQEAgLTE1ODIsMTYgKzE1OTAsMTYgQEAKIAkvKiBPbmx5IHBhbmVsIHR5cGUgZXZlbnRzIGxlZnQgdG8gcHJvY2VzcyBub3cgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWN0eC0+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+cXVldWUsIDApOwogCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiB1dmNfaW5pdF92aWRlbyhzdHJlYW0sIEdGUF9LRVJORUwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCmluZGV4IDE5ZDVhZTIuLjA2ZjE0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2LmMKQEAgLTE2Nyw2ICsxNjcsMTIgQEAKIAogCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQorCWlmICh2ZGV2LT52NGwyX2RldiAmJiB2ZGV2LT52NGwyX2Rldi0+bWRldiAmJgorCSAgICB2ZGV2LT52ZmxfdHlwZSAhPSBWRkxfVFlQRV9TVUJERVYpCisJCW1lZGlhX2RldmljZV91bnJlZ2lzdGVyX2VudGl0eSgmdmRldi0+ZW50aXR5KTsKKyNlbmRpZgorCiAJLyogUmVsZWFzZSB2aWRlb19kZXZpY2UgYW5kIHBlcmZvcm0gb3RoZXIKIAkgICBjbGVhbnVwcyBhcyBuZWVkZWQuICovCiAJdmRldi0+cmVsZWFzZSh2ZGV2KTsKQEAgLTM4OSw5ICszOTUsNiBAQAogc3RhdGljIGludCB2NGwyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKLSNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQotCXN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eSA9IE5VTEw7Ci0jZW5kaWYKIAlpbnQgcmV0ID0gMDsKIAogCS8qIENoZWNrIGlmIHRoZSB2aWRlbyBkZXZpY2UgaXMgYXZhaWxhYmxlICovCkBAIC00MDUsMTcgKzQwOCw2IEBACiAJLyogYW5kIGluY3JlYXNlIHRoZSBkZXZpY2UgcmVmY291bnQgKi8KIAl2aWRlb19nZXQodmRldik7CiAJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKLSNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQotCWlmICh2ZGV2LT52NGwyX2RldiAmJiB2ZGV2LT52NGwyX2Rldi0+bWRldiAmJgotCSAgICB2ZGV2LT52ZmxfdHlwZSAhPSBWRkxfVFlQRV9TVUJERVYpIHsKLQkJZW50aXR5ID0gbWVkaWFfZW50aXR5X2dldCgmdmRldi0+ZW50aXR5KTsKLQkJaWYgKCFlbnRpdHkpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCXZpZGVvX3B1dCh2ZGV2KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0jZW5kaWYKIAlpZiAodmRldi0+Zm9wcy0+b3BlbikgewogCQlpZiAodmRldi0+bG9jayAmJiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUodmRldi0+bG9jaykpIHsKIAkJCXJldCA9IC1FUkVTVEFSVFNZUzsKQEAgLTQzMSwxNCArNDIzLDggQEAKIAogZXJyOgogCS8qIGRlY3JlYXNlIHRoZSByZWZjb3VudCBpbiBjYXNlIG9mIGFuIGVycm9yICovCi0JaWYgKHJldCkgewotI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCi0JCWlmICh2ZGV2LT52NGwyX2RldiAmJiB2ZGV2LT52NGwyX2Rldi0+bWRldiAmJgotCQkgICAgdmRldi0+dmZsX3R5cGUgIT0gVkZMX1RZUEVfU1VCREVWKQotCQkJbWVkaWFfZW50aXR5X3B1dChlbnRpdHkpOwotI2VuZGlmCisJaWYgKHJldCkKIAkJdmlkZW9fcHV0KHZkZXYpOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NTUsMTEgKzQ0MSw2IEBACiAJCWlmICh2ZGV2LT5sb2NrKQogCQkJbXV0ZXhfdW5sb2NrKHZkZXYtPmxvY2spOwogCX0KLSNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQotCWlmICh2ZGV2LT52NGwyX2RldiAmJiB2ZGV2LT52NGwyX2Rldi0+bWRldiAmJgotCSAgICB2ZGV2LT52ZmxfdHlwZSAhPSBWRkxfVFlQRV9TVUJERVYpCi0JCW1lZGlhX2VudGl0eV9wdXQoJnZkZXYtPmVudGl0eSk7Ci0jZW5kaWYKIAkvKiBkZWNyZWFzZSB0aGUgcmVmY291bnQgdW5jb25kaXRpb25hbGx5IHNpbmNlIHRoZSByZWxlYXNlKCkKIAkgICByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gKi8KIAl2aWRlb19wdXQodmRldik7CkBAIC03NTQsMTIgKzczNSw2IEBACiAJaWYgKCF2ZGV2IHx8ICF2aWRlb19pc19yZWdpc3RlcmVkKHZkZXYpKQogCQlyZXR1cm47CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQotCWlmICh2ZGV2LT52NGwyX2RldiAmJiB2ZGV2LT52NGwyX2Rldi0+bWRldiAmJgotCSAgICB2ZGV2LT52ZmxfdHlwZSAhPSBWRkxfVFlQRV9TVUJERVYpCi0JCW1lZGlhX2RldmljZV91bnJlZ2lzdGVyX2VudGl0eSgmdmRldi0+ZW50aXR5KTsKLSNlbmRpZgotCiAJbXV0ZXhfbG9jaygmdmlkZW9kZXZfbG9jayk7CiAJLyogVGhpcyBtdXN0IGJlIGluIGEgY3JpdGljYWwgc2VjdGlvbiB0byBwcmV2ZW50IGEgcmFjZSB3aXRoIHY0bDJfb3Blbi4KIAkgKiBPbmNlIHRoaXMgYml0IGhhcyBiZWVuIGNsZWFyZWQgdmlkZW9fZ2V0IG1heSBuZXZlciBiZSBjYWxsZWQgYWdhaW4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCmluZGV4IDUwNmVkY2MyLi42OWU4YzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwpAQCAtMTgyMiw2ICsxODIyLDggQEAKIAkJaWYgKCFvcHMtPnZpZGlvY19nX3R1bmVyKQogCQkJYnJlYWs7CiAKKwkJcC0+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+dXNiaG9zdF9mc19mY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfaHNfZmNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2ljayk7CiAKIAkvKiBUaGUgZ3Bpb19mcmVlIG1pZ2ggc2xlZXA7IHNvIHVubG9jayB0aGUgc3BpbmxvY2sgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbWFwLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMKaW5kZXggM2QyZGM1Ni4uMjgzYWM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHBzNjU5MTEtY29tcGFyYXRvci5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiBzdGF0aWMgX19kZXZpbml0IGludCB0cHM2NTkxMV9jb21wYXJhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgdHBzNjU5MTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHRwczY1OTEwLT5kZXYpOworCXN0cnVjdCB0cHM2NTkxMF9ib2FyZCAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHRwczY1OTEwLT5kZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSBjb21wX3RocmVzaG9sZF9zZXQodHBzNjU5MTAsIENPTVAxLCAgcGRhdGEtPnZtYmNoX3RocmVzaG9sZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXBkczk5MHguYyBiL2RyaXZlcnMvbWlzYy9hcGRzOTkweC5jCmluZGV4IDIwMDMxMWYuLmUyYTUyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9hcGRzOTkweC5jCisrKyBiL2RyaXZlcnMvbWlzYy9hcGRzOTkweC5jCkBAIC02MDksNiArNjA5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNX1JVTlRJTUUpCiBzdGF0aWMgaW50IGFwZHM5OTB4X2NoaXBfb24oc3RydWN0IGFwZHM5OTB4X2NoaXAgKmNoaXApCiB7CiAJaW50IGVycgkgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShjaGlwLT5yZWdzKSwKQEAgLTYyNCw2ICs2MjUsNyBAQAogCWFwZHM5OTB4X21vZGVfb24oY2hpcCk7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBhcGRzOTkweF9jaGlwX29mZihzdHJ1Y3QgYXBkczk5MHhfY2hpcCAqY2hpcCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9jYjcxMC9zZ2J1ZjIuYyBiL2RyaXZlcnMvbWlzYy9jYjcxMC9zZ2J1ZjIuYwppbmRleCBkMDE5NzQ2Li4yYTQwZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY2I3MTAvc2didWYyLmMKKysrIGIvZHJpdmVycy9taXNjL2NiNzEwL3NnYnVmMi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBuZWVkc191bmFsaWduZWRfY29weShjb25zdCB2b2lkICpwdHIpCiB7Ci0jaWZkZWYgSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUworI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCiAJcmV0dXJuIGZhbHNlOwogI2Vsc2UKIAlyZXR1cm4gKChwdHIgLSBOVUxMKSAmIDMpICE9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMgYi9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMKaW5kZXggZTAxZTA4Yy4uYmM2ODViZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9jczU1MzUtbWZncHQuYworKysgYi9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCQl0aW1lcl9uciA9IHQgPCBtYXggPyAoaW50KSB0IDogLTE7CiAJfSBlbHNlIHsKIAkJLyogY2hlY2sgaWYgdGhlIHJlcXVlc3RlZCB0aW1lcidzIGF2YWlsYWJsZSAqLwotCQlpZiAodGVzdF9iaXQodGltZXJfbnIsIG1mZ3B0LT5hdmFpbCkpCisJCWlmICghdGVzdF9iaXQodGltZXJfbnIsIG1mZ3B0LT5hdmFpbCkpCiAJCQl0aW1lcl9uciA9IC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2lvYzQuYyBiL2RyaXZlcnMvbWlzYy9pb2M0LmMKaW5kZXggNjY4ZDQxZS4uZGYwM2RkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2lvYzQuYworKysgYi9kcml2ZXJzL21pc2MvaW9jNC5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAlyZXR1cm4gSU9DNF9WQVJJQU5UX1BDSV9SVDsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0CitzdGF0aWMgdm9pZAogaW9jNF9sb2FkX21vZHVsZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXJlcXVlc3RfbW9kdWxlKCJzZ2lpb2M0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mva2dkYnRzLmMgYi9kcml2ZXJzL21pc2Mva2dkYnRzLmMKaW5kZXggYjBjNTYzMS4uOGNlYmVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2tnZGJ0cy5jCisrKyBiL2RyaXZlcnMvbWlzYy9rZ2RidHMuYwpAQCAtMzA0LDcgKzMwNCwxMCBAQAogCQlyZXR1cm4gMTsKIAl9CiAJLyogUmVhZGp1c3QgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgaWYgbmVlZGVkICovCi0JaW5zdHJ1Y3Rpb25fcG9pbnRlcl9zZXQoJmtnZGJ0c19yZWdzLCBpcCArIG9mZnNldCk7CisJaXAgKz0gb2Zmc2V0OworI2lmZGVmIEdEQl9BREpVU1RTX0JSRUFLX09GRlNFVAorCWluc3RydWN0aW9uX3BvaW50ZXJfc2V0KCZrZ2RidHNfcmVncywgaXApOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKaW5kZXggODFkN2ZhNC4uMTUwY2Q3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xrZHRtLmMKKysrIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKQEAgLTEyMCw2ICsxMjAsNyBAQAogc3RhdGljIGVudW0gY25hbWUgY3BvaW50ID0gQ05fSU5WQUxJRDsKIHN0YXRpYyBlbnVtIGN0eXBlIGNwdHlwZSA9IENUX05PTkU7CiBzdGF0aWMgaW50IGNvdW50ID0gREVGQVVMVF9DT1VOVDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY291bnRfbG9jayk7CiAKIG1vZHVsZV9wYXJhbShyZWN1cl9jb3VudCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVjdXJfY291bnQsICIgUmVjdXJzaW9uIGxldmVsIGZvciB0aGUgc3RhY2sgb3ZlcmZsb3cgdGVzdCwgIlwKQEAgLTIzMCwxMSArMjMxLDE0IEBACiBzdGF0aWMgaW50IGxrZHRtX3BhcnNlX2NvbW1hbmRsaW5lKHZvaWQpCiB7CiAJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjcG9pbnRfY291bnQgPCAxIHx8IHJlY3VyX2NvdW50IDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRfbG9jaywgZmxhZ3MpOwogCWNvdW50ID0gY3BvaW50X2NvdW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIAogCS8qIE5vIHNwZWNpYWwgcGFyYW1ldGVycyAqLwogCWlmICghY3BvaW50X3R5cGUgJiYgIWNwb2ludF9uYW1lKQpAQCAtMzQ5LDYgKzM1Myw5IEBACiAKIHN0YXRpYyB2b2lkIGxrZHRtX2hhbmRsZXIodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIAljb3VudC0tOwogCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBDcmFzaCBwb2ludCAlcyBvZiB0eXBlICVzIGhpdCwgdHJpZ2dlciBpbiAlZCByb3VuZHNcbiIsCiAJCQljcF9uYW1lX3RvX3N0cihjcG9pbnQpLCBjcF90eXBlX3RvX3N0cihjcHR5cGUpLCBjb3VudCk7CkBAIC0zNTcsNiArMzY0LDcgQEAKIAkJbGtkdG1fZG9fYWN0aW9uKGNwdHlwZSk7CiAJCWNvdW50ID0gY3BvaW50X2NvdW50OwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudF9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgbGtkdG1fcmVnaXN0ZXJfY3BvaW50KGVudW0gY25hbWUgd2hpY2gpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcHRpLmMgYi9kcml2ZXJzL21pc2MvcHRpLmMKaW5kZXggYmI2ZjkyNS4uMzc0ZGZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3B0aS5jCisrKyBiL2RyaXZlcnMvbWlzYy9wdGkuYwpAQCAtMzE3LDcgKzMxNyw4IEBACiAgKgkJCQlhIG1hc3RlciwgY2hhbm5lbCBJRCBhZGRyZXNzCiAgKgkJCQl1c2VkIHRvIHdyaXRlIHRvIFBUSSBIVy4KICAqCi0gKiBAbWM6IG1hc3RlciwgY2hhbm5lbCBhcGV0dXJlIElEIGFkZHJlc3MgdG8gYmUgcmVsZWFzZWQuCisgKiBAbWM6IG1hc3RlciwgY2hhbm5lbCBhcGV0dXJlIElEIGFkZHJlc3MgdG8gYmUgcmVsZWFzZWQuICBUaGlzCisgKiAgICAgIHdpbGwgZGUtYWxsb2NhdGUgdGhlIHN0cnVjdHVyZSB2aWEga2ZyZWUoKS4KICAqLwogdm9pZCBwdGlfcmVsZWFzZV9tYXN0ZXJjaGFubmVsKHN0cnVjdCBwdGlfbWFzdGVyY2hhbm5lbCAqbWMpCiB7CkBAIC00NzUsOCArNDc2LDEwIEBACiAJCWVsc2UKIAkJCXB0aV90dHlfZGF0YS0+bWMgPSBwdGlfcmVxdWVzdF9tYXN0ZXJjaGFubmVsKDIpOwogCi0JCWlmIChwdGlfdHR5X2RhdGEtPm1jID09IE5VTEwpCisJCWlmIChwdGlfdHR5X2RhdGEtPm1jID09IE5VTEwpIHsKKwkJCWtmcmVlKHB0aV90dHlfZGF0YSk7CiAJCQlyZXR1cm4gLUVOWElPOworCQl9CiAJCXR0eS0+ZHJpdmVyX2RhdGEgPSBwdGlfdHR5X2RhdGE7CiAJfQogCkBAIC00OTUsNyArNDk4LDcgQEAKIAlpZiAocHRpX3R0eV9kYXRhID09IE5VTEwpCiAJCXJldHVybjsKIAlwdGlfcmVsZWFzZV9tYXN0ZXJjaGFubmVsKHB0aV90dHlfZGF0YS0+bWMpOwotCWtmcmVlKHR0eS0+ZHJpdmVyX2RhdGEpOworCWtmcmVlKHB0aV90dHlfZGF0YSk7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CiB9CiAKQEAgLTU4MSw3ICs1ODQsNyBAQAogc3RhdGljIGludCBwdGlfY2hhcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXB0aV9yZWxlYXNlX21hc3RlcmNoYW5uZWwoZmlscC0+cHJpdmF0ZV9kYXRhKTsKLQlrZnJlZShmaWxwLT5wcml2YXRlX2RhdGEpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwppbmRleCBlZTUxMDlhLi40MmYwNjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCkBAIC00OTUsMTQgKzQ5NSwxNCBAQAogCQl9CiAJfQogCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwogCWlmIChhdG9taWNfZGVjX3JldHVybigmcXVldWVkX21zZy0+dXNlX2NvdW50KSA9PSAwKSB7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJa2ZyZWUocXVldWVkX21zZyk7CiAJfQogCi0JZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zcGVhcjEzeHhfcGNpZV9nYWRnZXQuYyBiL2RyaXZlcnMvbWlzYy9zcGVhcjEzeHhfcGNpZV9nYWRnZXQuYwppbmRleCA3YWRlZDkwLi5jZmJkZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc3BlYXIxM3h4X3BjaWVfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy9taXNjL3NwZWFyMTN4eF9wY2llX2dhZGdldC5jCkBAIC04NDUsNyArODQ1LDcgQEAKIGVycl9pb3VubWFwX2FwcDoKIAlpb3VubWFwKGNvbmZpZy0+dmFfYXBwX2Jhc2UpOwogZXJyX2t6YWxsb2M6Ci0Ja2ZyZWUoY29uZmlnKTsKKwlrZnJlZSh0YXJnZXQpOwogZXJyX3JlbF9yZXM6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlczEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlczEpKTsKIGVycl9yZWxfcmVzMDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCmluZGV4IDFhMDVmZTAuLjU0YzkxZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYwpAQCAtNjA1LDcgKzYwNSw3IEBACiAJcHJfZGVidWcoIiVzOiAlZCAiLCBfX2Z1bmNfXywgcHJvdG8tPmNobmxfaWQpOwogCiAJc3Rfa2ltX3JlZigmc3RfZ2RhdGEsIDApOwotCWlmIChwcm90by0+Y2hubF9pZCA+PSBTVF9NQVhfQ0hBTk5FTFMpIHsKKwlpZiAoIXN0X2dkYXRhIHx8IHByb3RvLT5jaG5sX2lkID49IFNUX01BWF9DSEFOTkVMUykgewogCQlwcl9lcnIoIiBjaG5sX2lkICVkIG5vdCBzdXBwb3J0ZWQiLCBwcm90by0+Y2hubF9pZCk7CiAJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCX0KQEAgLTc0Nyw4ICs3NDcsOCBAQAogCXByX2RlYnVnKCIlczogZG9uZSAiLCBfX2Z1bmNfXyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgY2hhciAqdHR5X2ZsYWdzLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBzdF90dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgY2hhciAqdHR5X2ZsYWdzLCBpbnQgY291bnQpCiB7CiAjaWZkZWYgVkVSQk9TRQogCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICI+aW4+IiwgRFVNUF9QUkVGSVhfTk9ORSwKQEAgLTc2MSw4ICs3NjEsNiBAQAogCSAqLwogCXN0X3JlY3YodHR5LT5kaXNjX2RhdGEsIGRhdGEsIGNvdW50KTsKIAlwcl9kZWJ1ZygiZG9uZSAlcyIsIF9fZnVuY19fKTsKLQotCXJldHVybiBjb3VudDsKIH0KIAogLyogd2FrZS11cCBmdW5jdGlvbiBjYWxsZWQgaW4gZnJvbSB0aGUgVFRZIGxheWVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMKaW5kZXggNWRhOTNlZS4uMzhmZDJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYwpAQCAtMjQ1LDkgKzI0NSw5IEBACiAJCXByX2VycigiaW52YWxpZCBhY3Rpb24gYWZ0ZXIgY2hhbmdlIHJlbW90ZSBiYXVkIGNvbW1hbmQiKTsKIAl9IGVsc2UgewogCQkqcHRyID0gKnB0ciArIHNpemVvZihzdHJ1Y3QgYnRzX2FjdGlvbikgKwotCQkJKChzdHJ1Y3QgYnRzX2FjdGlvbiAqKW54dF9hY3Rpb24pLT5zaXplOworCQkJKChzdHJ1Y3QgYnRzX2FjdGlvbiAqKWN1cl9hY3Rpb24pLT5zaXplOwogCQkqbGVuID0gKmxlbiAtIChzaXplb2Yoc3RydWN0IGJ0c19hY3Rpb24pICsKLQkJCQkoKHN0cnVjdCBidHNfYWN0aW9uICopbnh0X2FjdGlvbiktPnNpemUpOworCQkJCSgoc3RydWN0IGJ0c19hY3Rpb24gKiljdXJfYWN0aW9uKS0+c2l6ZSk7CiAJCS8qIHdhcm4gdXNlciBvbiBub3QgY29tbWVudGluZyB0aGVzZSBpbiBmaXJtd2FyZSAqLwogCQlwcl93YXJuKCJza2lwcGluZyB0aGUgd2FpdCBldmVudCBvZiBjaGFuZ2UgcmVtb3RlIGJhdWQiKTsKIAl9CkBAIC02MDQsNiArNjA0LDEwIEBACiAJc3RydWN0IGtpbV9kYXRhX3MJKmtpbV9nZGF0YTsKIAkvKiBnZXQga2ltX2dkYXRhIHJlZmVyZW5jZSBmcm9tIHBsYXRmb3JtIGRldmljZSAqLwogCXBkZXYgPSBzdF9nZXRfcGxhdF9kZXZpY2UoaWQpOworCWlmICghcGRldikgeworCQkqY29yZV9kYXRhID0gTlVMTDsKKwkJcmV0dXJuOworCX0KIAlraW1fZ2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAJKmNvcmVfZGF0YSA9IGtpbV9nZGF0YS0+Y29yZV9kYXRhOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCmluZGV4IDcxZGE1NjQuLmY4NWU0MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKQEAgLTEwMjQsNyArMTAyNCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJm1kLT5wYXJ0KTsKIAltZC0+dXNhZ2UgPSAxOwogCi0JcmV0ID0gbW1jX2luaXRfcXVldWUoJm1kLT5xdWV1ZSwgY2FyZCwgJm1kLT5sb2NrKTsKKwlyZXQgPSBtbWNfaW5pdF9xdWV1ZSgmbWQtPnF1ZXVlLCBjYXJkLCAmbWQtPmxvY2ssIHN1Ym5hbWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3B1dGRpc2s7CiAKQEAgLTEyOTcsNiArMTI5Nyw5IEBACiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtbWNfZ2V0X2RydmRhdGEoY2FyZCk7CiAKIAltbWNfYmxrX3JlbW92ZV9wYXJ0cyhjYXJkLCBtZCk7CisJbW1jX2NsYWltX2hvc3QoY2FyZC0+aG9zdCk7CisJbW1jX2Jsa19wYXJ0X3N3aXRjaChjYXJkLCBtZCk7CisJbW1jX3JlbGVhc2VfaG9zdChjYXJkLT5ob3N0KTsKIAltbWNfYmxrX3JlbW92ZV9yZXEobWQpOwogCW1tY19zZXRfZHJ2ZGF0YShjYXJkLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCBjMDczMjJjLi42NDEzYWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC0xMDYsMTAgKzEwNiwxMiBAQAogICogQG1xOiBtbWMgcXVldWUKICAqIEBjYXJkOiBtbWMgY2FyZCB0byBhdHRhY2ggdGhpcyBxdWV1ZQogICogQGxvY2s6IHF1ZXVlIGxvY2sKKyAqIEBzdWJuYW1lOiBwYXJ0aXRpb24gc3VibmFtZQogICoKICAqIEluaXRpYWxpc2UgYSBNTUMgY2FyZCByZXF1ZXN0IHF1ZXVlLgogICovCi1pbnQgbW1jX2luaXRfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3BpbmxvY2tfdCAqbG9jaykKK2ludCBtbWNfaW5pdF9xdWV1ZShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IG1tY19jYXJkICpjYXJkLAorCQkgICBzcGlubG9ja190ICpsb2NrLCBjb25zdCBjaGFyICpzdWJuYW1lKQogewogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CiAJdTY0IGxpbWl0ID0gQkxLX0JPVU5DRV9ISUdIOwpAQCAtMTMzLDEyICsxMzUsNyBAQAogCQltcS0+cXVldWUtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzID0gVUlOVF9NQVg7CiAJCWlmIChjYXJkLT5lcmFzZWRfYnl0ZSA9PSAwKQogCQkJbXEtPnF1ZXVlLT5saW1pdHMuZGlzY2FyZF96ZXJvZXNfZGF0YSA9IDE7Ci0JCWlmICghbW1jX2Nhbl90cmltKGNhcmQpICYmIGlzX3Bvd2VyX29mXzIoY2FyZC0+ZXJhc2Vfc2l6ZSkpIHsKLQkJCW1xLT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkgPQotCQkJCQkJCWNhcmQtPmVyYXNlX3NpemUgPDwgOTsKLQkJCW1xLT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50ID0KLQkJCQkJCQljYXJkLT5lcmFzZV9zaXplIDw8IDk7Ci0JCX0KKwkJbXEtPnF1ZXVlLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA9IGNhcmQtPnByZWZfZXJhc2UgPDwgOTsKIAkJaWYgKG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCiAJCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX1NFQ0RJU0NBUkQsCiAJCQkJCQltcS0+cXVldWUpOwpAQCAtMjA5LDggKzIwNiw4IEBACiAKIAlzZW1hX2luaXQoJm1xLT50aHJlYWRfc2VtLCAxKTsKIAotCW1xLT50aHJlYWQgPSBrdGhyZWFkX3J1bihtbWNfcXVldWVfdGhyZWFkLCBtcSwgIm1tY3FkLyVkIiwKLQkJaG9zdC0+aW5kZXgpOworCW1xLT50aHJlYWQgPSBrdGhyZWFkX3J1bihtbWNfcXVldWVfdGhyZWFkLCBtcSwgIm1tY3FkLyVkJXMiLAorCQlob3N0LT5pbmRleCwgc3VibmFtZSA/IHN1Ym5hbWUgOiAiIik7CiAKIAlpZiAoSVNfRVJSKG1xLT50aHJlYWQpKSB7CiAJCXJldCA9IFBUUl9FUlIobXEtPnRocmVhZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmggYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmgKaW5kZXggNjRlNjZlMC4uNjIyM2VmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaApAQCAtMTksNyArMTksOCBAQAogCXVuc2lnbmVkIGludAkJYm91bmNlX3NnX2xlbjsKIH07CiAKLWV4dGVybiBpbnQgbW1jX2luaXRfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqLCBzdHJ1Y3QgbW1jX2NhcmQgKiwgc3BpbmxvY2tfdCAqKTsKK2V4dGVybiBpbnQgbW1jX2luaXRfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqLCBzdHJ1Y3QgbW1jX2NhcmQgKiwgc3BpbmxvY2tfdCAqLAorCQkJICBjb25zdCBjaGFyICopOwogZXh0ZXJuIHZvaWQgbW1jX2NsZWFudXBfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqKTsKIGV4dGVybiB2b2lkIG1tY19xdWV1ZV9zdXNwZW5kKHN0cnVjdCBtbWNfcXVldWUgKik7CiBleHRlcm4gdm9pZCBtbWNfcXVldWVfcmVzdW1lKHN0cnVjdCBtbWNfcXVldWUgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCmluZGV4IDY4MDkxZGQuLjc4NDNlZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCkBAIC0xMjQ1LDcgKzEyNDUsNyBAQAogCQkgKi8KIAkJdGltZW91dF9jbGtzIDw8PSAxOwogCQl0aW1lb3V0X3VzICs9ICh0aW1lb3V0X2Nsa3MgKiAxMDAwKSAvCi0JCQkgICAgICAoY2FyZC0+aG9zdC0+aW9zLmNsb2NrIC8gMTAwMCk7CisJCQkgICAgICAobW1jX2hvc3RfY2xrX3JhdGUoY2FyZC0+aG9zdCkgLyAxMDAwKTsKIAogCQllcmFzZV90aW1lb3V0ID0gdGltZW91dF91cyAvIDEwMDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCmluZGV4IDJhN2U0M2IuLmFhN2QxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwpAQCAtMjQ3LDEyICsyNDcsMTIgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBWZXJzaW9uIGlzIGNvZGVkIGluIHRoZSBDU0RfU1RSVUNUVVJFIGJ5dGUgaW4gdGhlIEVYVF9DU0QgcmVnaXN0ZXIgKi8KKwljYXJkLT5leHRfY3NkLnJhd19leHRfY3NkX3N0cnVjdHVyZSA9IGV4dF9jc2RbRVhUX0NTRF9TVFJVQ1RVUkVdOwogCWlmIChjYXJkLT5jc2Quc3RydWN0dXJlID09IDMpIHsKLQkJaW50IGV4dF9jc2Rfc3RydWN0ID0gZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV07Ci0JCWlmIChleHRfY3NkX3N0cnVjdCA+IDIpIHsKKwkJaWYgKGNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlID4gMikgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pc2VkIEVYVF9DU0Qgc3RydWN0dXJlICIKIAkJCQkidmVyc2lvbiAlZFxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAotCQkJCQlleHRfY3NkX3N0cnVjdCk7CisJCQkJCWNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMjY2LDYgKzI2NiwxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwljYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzBdID0gZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAwXTsKKwljYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzFdID0gZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAxXTsKKwljYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzJdID0gZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAyXTsKKwljYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzNdID0gZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAzXTsKIAlpZiAoY2FyZC0+ZXh0X2NzZC5yZXYgPj0gMikgewogCQljYXJkLT5leHRfY3NkLnNlY3RvcnMgPQogCQkJZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAwXSA8PCAwIHwKQEAgLTI3Nyw3ICsyODEsNyBAQAogCQlpZiAoY2FyZC0+ZXh0X2NzZC5zZWN0b3JzID4gKDJ1ICogMTAyNCAqIDEwMjQgKiAxMDI0KSAvIDUxMikKIAkJCW1tY19jYXJkX3NldF9ibG9ja2FkZHIoY2FyZCk7CiAJfQotCisJY2FyZC0+ZXh0X2NzZC5yYXdfY2FyZF90eXBlID0gZXh0X2NzZFtFWFRfQ1NEX0NBUkRfVFlQRV07CiAJc3dpdGNoIChleHRfY3NkW0VYVF9DU0RfQ0FSRF9UWVBFXSAmIEVYVF9DU0RfQ0FSRF9UWVBFX01BU0spIHsKIAljYXNlIEVYVF9DU0RfQ0FSRF9UWVBFX0REUl81MiB8IEVYVF9DU0RfQ0FSRF9UWVBFXzUyIHwKIAkgICAgIEVYVF9DU0RfQ0FSRF9UWVBFXzI2OgpAQCAtMzA3LDYgKzMxMSwxMSBAQAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAl9CiAKKwljYXJkLT5leHRfY3NkLnJhd19zX2FfdGltZW91dCA9IGV4dF9jc2RbRVhUX0NTRF9TX0FfVElNRU9VVF07CisJY2FyZC0+ZXh0X2NzZC5yYXdfZXJhc2VfdGltZW91dF9tdWx0ID0KKwkJZXh0X2NzZFtFWFRfQ1NEX0VSQVNFX1RJTUVPVVRfTVVMVF07CisJY2FyZC0+ZXh0X2NzZC5yYXdfaGNfZXJhc2VfZ3JwX3NpemUgPQorCQlleHRfY3NkW0VYVF9DU0RfSENfRVJBU0VfR1JQX1NJWkVdOwogCWlmIChjYXJkLT5leHRfY3NkLnJldiA+PSAzKSB7CiAJCXU4IHNhX3NoaWZ0ID0gZXh0X2NzZFtFWFRfQ1NEX1NfQV9USU1FT1VUXTsKIAkJY2FyZC0+ZXh0X2NzZC5wYXJ0X2NvbmZpZyA9IGV4dF9jc2RbRVhUX0NTRF9QQVJUX0NPTkZJR107CkBAIC0zMzQsNiArMzQzLDE2IEBACiAJCWNhcmQtPmV4dF9jc2QuYm9vdF9zaXplID0gZXh0X2NzZFtFWFRfQ1NEX0JPT1RfTVVMVF0gPDwgMTc7CiAJfQogCisJY2FyZC0+ZXh0X2NzZC5yYXdfaGNfZXJhc2VfZ2FwX3NpemUgPQorCQlleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX0FUVFJJQlVURV07CisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjX3RyaW1fbXVsdCA9CisJCWV4dF9jc2RbRVhUX0NTRF9TRUNfVFJJTV9NVUxUXTsKKwljYXJkLT5leHRfY3NkLnJhd19zZWNfZXJhc2VfbXVsdCA9CisJCWV4dF9jc2RbRVhUX0NTRF9TRUNfRVJBU0VfTVVMVF07CisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjX2ZlYXR1cmVfc3VwcG9ydCA9CisJCWV4dF9jc2RbRVhUX0NTRF9TRUNfRkVBVFVSRV9TVVBQT1JUXTsKKwljYXJkLT5leHRfY3NkLnJhd190cmltX211bHQgPQorCQlleHRfY3NkW0VYVF9DU0RfVFJJTV9NVUxUXTsKIAlpZiAoY2FyZC0+ZXh0X2NzZC5yZXYgPj0gNCkgewogCQkvKgogCQkgKiBFbmhhbmNlZCBhcmVhIGZlYXR1cmUgc3VwcG9ydCAtLSBjaGVjayB3aGV0aGVyIHRoZSBlTU1DCkBAIC0zNDEsNyArMzYwLDcgQEAKIAkJICogYXJlYSBvZmZzZXQgYW5kIHNpemUgdG8gdXNlciBieSBhZGRpbmcgc3lzZnMgaW50ZXJmYWNlLgogCQkgKi8KIAkJaWYgKChleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX1NVUFBPUlRdICYgMHgyKSAmJgotCQkJCShleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX0FUVFJJQlVURV0gJiAweDEpKSB7CisJCSAgICAoZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9BVFRSSUJVVEVdICYgMHgxKSkgewogCQkJdTggaGNfZXJhc2VfZ3JwX3N6ID0KIAkJCQlleHRfY3NkW0VYVF9DU0RfSENfRVJBU0VfR1JQX1NJWkVdOwogCQkJdTggaGNfd3BfZ3JwX3N6ID0KQEAgLTQwMSwxNyArNDIwLDE3IEBACiB9CiAKIAotc3RhdGljIGludCBtbWNfY29tcGFyZV9leHRfY3NkcyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHU4ICpleHRfY3NkLAotCQkJdW5zaWduZWQgYnVzX3dpZHRoKQorc3RhdGljIGludCBtbWNfY29tcGFyZV9leHRfY3NkcyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGJ1c193aWR0aCkKIHsKIAl1OCAqYndfZXh0X2NzZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gbW1jX2dldF9leHRfY3NkKGNhcmQsICZid19leHRfY3NkKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKQorCQlyZXR1cm4gMDsKIAotCWlmICgoZXh0X2NzZCA9PSBOVUxMIHx8IGJ3X2V4dF9jc2QgPT0gTlVMTCkpIHsKKwllcnIgPSBtbWNfZ2V0X2V4dF9jc2QoY2FyZCwgJmJ3X2V4dF9jc2QpOworCisJaWYgKGVyciB8fCBid19leHRfY3NkID09IE5VTEwpIHsKIAkJaWYgKGJ1c193aWR0aCAhPSBNTUNfQlVTX1dJRFRIXzEpCiAJCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTQyMSwzNSArNDQwLDQwIEBACiAJCWdvdG8gb3V0OwogCiAJLyogb25seSBjb21wYXJlIHJlYWQgb25seSBmaWVsZHMgKi8KLQllcnIgPSAoIShleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX1NVUFBPUlRdID09CisJZXJyID0gKCEoY2FyZC0+ZXh0X2NzZC5yYXdfcGFydGl0aW9uX3N1cHBvcnQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfRVJBU0VEX01FTV9DT05UXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfZXJhc2VkX21lbV9jb3VudCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX0VSQVNFRF9NRU1fQ09OVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfUkVWXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yZXYgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9SRVZdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfU1RSVUNUVVJFXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9DQVJEX1RZUEVdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19jYXJkX3R5cGUgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9DQVJEX1RZUEVdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1NfQV9USU1FT1VUXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc19hX3RpbWVvdXQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TX0FfVElNRU9VVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfSENfV1BfR1JQX1NJWkVdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19oY19lcmFzZV9nYXBfc2l6ZSA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX0hDX1dQX0dSUF9TSVpFXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9FUkFTRV9USU1FT1VUX01VTFRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19lcmFzZV90aW1lb3V0X211bHQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9FUkFTRV9USU1FT1VUX01VTFRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX0hDX0VSQVNFX0dSUF9TSVpFXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfaGNfZXJhc2VfZ3JwX3NpemUgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9IQ19FUkFTRV9HUlBfU0laRV0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfU0VDX1RSSU1fTVVMVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY190cmltX211bHQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfVFJJTV9NVUxUXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9TRUNfRVJBU0VfTVVMVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY19lcmFzZV9tdWx0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX0VSQVNFX01VTFRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1NFQ19GRUFUVVJFX1NVUFBPUlRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19zZWNfZmVhdHVyZV9zdXBwb3J0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX0ZFQVRVUkVfU1VQUE9SVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfVFJJTV9NVUxUXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfdHJpbV9tdWx0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfVFJJTV9NVUxUXSkgJiYKLQkJbWVtY21wKCZleHRfY3NkW0VYVF9DU0RfU0VDX0NOVF0sCi0JCSAgICAgICAmYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlRdLAotCQkgICAgICAgNCkgIT0gMCk7CisJCShjYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzBdID09CisJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDBdKSAmJgorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1sxXSA9PQorCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAxXSkgJiYKKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbMl0gPT0KKwkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMl0pICYmCisJCShjYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzNdID09CisJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDNdKSk7CiAJaWYgKGVycikKIAkJZXJyID0gLUVJTlZBTDsKIApAQCAtNzcwLDcgKzc5NCw2IEBACiAJCQkJICovCiAJCQkJaWYgKCEoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfQlVTX1dJRFRIX1RFU1QpKQogCQkJCQllcnIgPSBtbWNfY29tcGFyZV9leHRfY3NkcyhjYXJkLAotCQkJCQkJZXh0X2NzZCwKIAkJCQkJCWJ1c193aWR0aCk7CiAJCQkJZWxzZQogCQkJCQllcnIgPSBtbWNfYnVzX3Rlc3QoY2FyZCwgYnVzX3dpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKaW5kZXggNGQwYzE1Yi4uMjYyZmZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKQEAgLTY5MSwxNSArNjkxLDU0IEBACiBzdGF0aWMgaW50IG1tY19zZGlvX3Bvd2VyX3Jlc3RvcmUoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCWludCByZXQ7CisJdTMyIG9jcjsKIAogCUJVR19PTighaG9zdCk7CiAJQlVHX09OKCFob3N0LT5jYXJkKTsKIAogCW1tY19jbGFpbV9ob3N0KGhvc3QpOworCisJLyoKKwkgKiBSZXNldCB0aGUgY2FyZCBieSBwZXJmb3JtaW5nIHRoZSBzYW1lIHN0ZXBzIHRoYXQgYXJlIHRha2VuIGJ5CisJICogbW1jX3Jlc2Nhbl90cnlfZnJlcSgpIGFuZCBtbWNfYXR0YWNoX3NkaW8oKSBkdXJpbmcgYSAibm9ybWFsIiBwcm9iZS4KKwkgKgorCSAqIHNkaW9fcmVzZXQoKSBpcyB0ZWNobmljYWxseSBub3QgbmVlZGVkLiBIYXZpbmcganVzdCBwb3dlcmVkIHVwIHRoZQorCSAqIGhhcmR3YXJlLCBpdCBzaG91bGQgYWxyZWFkeSBiZSBpbiByZXNldCBzdGF0ZS4gSG93ZXZlciwgc29tZQorCSAqIHBsYXRmb3JtcyAoc3VjaCBhcyBTRDg2ODYgb24gT0xQQykgZG8gbm90IGluc3RhbnRseSBjdXQgcG93ZXIsCisJICogbWVhbmluZyB0aGF0IGEgcmVzZXQgaXMgcmVxdWlyZWQgd2hlbiByZXN0b3JpbmcgcG93ZXIgc29vbiBhZnRlcgorCSAqIHBvd2VyaW5nIG9mZi4gSXQgaXMgaGFybWxlc3MgaW4gb3RoZXIgY2FzZXMuCisJICoKKwkgKiBUaGUgQ01ENSByZXNldCAobW1jX3NlbmRfaW9fb3BfY29uZCgpKSwgYWNjb3JkaW5nIHRvIHRoZSBTRElPIHNwZWMsCisJICogaXMgbm90IG5lY2Vzc2FyeSBmb3Igbm9uLXJlbW92YWJsZSBjYXJkcy4gSG93ZXZlciwgaXQgaXMgcmVxdWlyZWQKKwkgKiBmb3IgT0xQQyBTRDg2ODYgKHdoaWNoIGV4cGVjdHMgYSBbQ01ENSw1LDMsN10gaW5pdCBzZXF1ZW5jZSksIGFuZAorCSAqIGhhcm1sZXNzIGluIG90aGVyIHNpdHVhdGlvbnMuCisJICoKKwkgKiBXaXRoIHRoZXNlIHN0ZXBzIHRha2VuLCBtbWNfc2VsZWN0X3ZvbHRhZ2UoKSBpcyBhbHNvIHJlcXVpcmVkIHRvCisJICogcmVzdG9yZSB0aGUgY29ycmVjdCB2b2x0YWdlIHNldHRpbmcgb2YgdGhlIGNhcmQuCisJICovCisJc2Rpb19yZXNldChob3N0KTsKKwltbWNfZ29faWRsZShob3N0KTsKKwltbWNfc2VuZF9pZl9jb25kKGhvc3QsIGhvc3QtPm9jcl9hdmFpbCk7CisKKwlyZXQgPSBtbWNfc2VuZF9pb19vcF9jb25kKGhvc3QsIDAsICZvY3IpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGhvc3QtPm9jcl9hdmFpbF9zZGlvKQorCQlob3N0LT5vY3JfYXZhaWwgPSBob3N0LT5vY3JfYXZhaWxfc2RpbzsKKworCWhvc3QtPm9jciA9IG1tY19zZWxlY3Rfdm9sdGFnZShob3N0LCBvY3IgJiB+MHg3Rik7CisJaWYgKCFob3N0LT5vY3IpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJcmV0ID0gbW1jX3NkaW9faW5pdF9jYXJkKGhvc3QsIGhvc3QtPm9jciwgaG9zdC0+Y2FyZCwKIAkJCQltbWNfY2FyZF9rZWVwX3Bvd2VyKGhvc3QpKTsKIAlpZiAoIXJldCAmJiBob3N0LT5zZGlvX2lycXMpCiAJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdCk7CisKK291dDoKIAltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYwppbmRleCBkMjliOWMzLi5kMjU2NWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCkBAIC0xODksNyArMTg5LDcgQEAKIAogCS8qIFRoZW4gdW5kbyB0aGUgcnVudGltZSBQTSBzZXR0aW5ncyBpbiBzZGlvX2J1c19wcm9iZSgpICovCiAJaWYgKGZ1bmMtPmNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX1BPV0VSX09GRl9DQVJEKQotCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKaW5kZXggNWRhNWJlYTAuLmZlMTQwNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jCkBAIC01ODIsNiArNTgyLDggQEAKIAkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKIAkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0lfREFUQVRJTUVPVVQpIHsKIAkJCWRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0lfU1RBUlRCSVRFUlIpIHsKKwkJCWRhdGEtPmVycm9yID0gLUVDT01NOwogCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1DSV9UWFVOREVSUlVOKSB7CiAJCQlkYXRhLT5lcnJvciA9IC1FSU87CiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNJX1JYT1ZFUlJVTikgewpAQCAtMTE0NCw5ICsxMTQ2LDE3IEBACiAJCWVsc2UgaWYgKHJldCAhPSAtRU5PU1lTKQogCQkJZ290byBlcnJfZ3Bpb19jZDsKIAorCQkvKgorCQkgKiBBIGdwaW8gcGluIHRoYXQgd2lsbCBkZXRlY3QgY2FyZHMgd2hlbiBpbnNlcnRlZCBhbmQgcmVtb3ZlZAorCQkgKiB3aWxsIG1vc3QgbGlrZWx5IHdhbnQgdG8gdHJpZ2dlciBvbiB0aGUgZWRnZXMgaWYgaXQgaXMKKwkJICogMCB3aGVuIGVqZWN0ZWQgYW5kIDEgd2hlbiBpbnNlcnRlZCAob3IgbXV0YXRpcyBtdXRhbmRpcworCQkgKiBmb3IgdGhlIGludmVydGVkIGNhc2UpIHNvIHdlIHJlcXVlc3QgdHJpZ2dlcnMgb24gYm90aAorCQkgKiBlZGdlcy4KKwkJICovCiAJCXJldCA9IHJlcXVlc3RfYW55X2NvbnRleHRfaXJxKGdwaW9fdG9faXJxKHBsYXQtPmdwaW9fY2QpLAotCQkJCQkgICAgICBtbWNpX2NkX2lycSwgMCwKLQkJCQkJICAgICAgRFJJVkVSX05BTUUgIiAoY2QpIiwgaG9zdCk7CisJCQkJbW1jaV9jZF9pcnEsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCURSSVZFUl9OQU1FICIgKGNkKSIsIGhvc3QpOwogCQlpZiAocmV0ID49IDApCiAJCQlob3N0LT5ncGlvX2NkX2lycSA9IGdwaW9fdG9faXJxKHBsYXQtPmdwaW9fY2QpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKaW5kZXggYmIzMmUyMS4uMjE2NGU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKQEAgLTg2LDYgKzg2LDcgQEAKICNkZWZpbmUgTUNJX0NNRFJFU1BFTkQJCSgxIDw8IDYpCiAjZGVmaW5lIE1DSV9DTURTRU5UCQkoMSA8PCA3KQogI2RlZmluZSBNQ0lfREFUQUVORAkJKDEgPDwgOCkKKyNkZWZpbmUgTUNJX1NUQVJUQklURVJSCQkoMSA8PCA5KQogI2RlZmluZSBNQ0lfREFUQUJMT0NLRU5ECSgxIDw8IDEwKQogI2RlZmluZSBNQ0lfQ01EQUNUSVZFCQkoMSA8PCAxMSkKICNkZWZpbmUgTUNJX1RYQUNUSVZFCQkoMSA8PCAxMikKQEAgLTExMiw2ICsxMTMsNyBAQAogI2RlZmluZSBNQ0lfQ01EUkVTUEVORENMUgkoMSA8PCA2KQogI2RlZmluZSBNQ0lfQ01EU0VOVENMUgkJKDEgPDwgNykKICNkZWZpbmUgTUNJX0RBVEFFTkRDTFIJCSgxIDw8IDgpCisjZGVmaW5lIE1DSV9TVEFSVEJJVEVSUkNMUgkoMSA8PCA5KQogI2RlZmluZSBNQ0lfREFUQUJMT0NLRU5EQ0xSCSgxIDw8IDEwKQogLyogRXh0ZW5kZWQgc3RhdHVzIGJpdHMgZm9yIHRoZSBTVCBNaWNybyB2YXJpYW50cyAqLwogI2RlZmluZSBNQ0lfU1RfU0RJT0lUQwkJKDEgPDwgMjIpCkBAIC0xMjcsNiArMTI5LDcgQEAKICNkZWZpbmUgTUNJX0NNRFJFU1BFTkRNQVNLCSgxIDw8IDYpCiAjZGVmaW5lIE1DSV9DTURTRU5UTUFTSwkJKDEgPDwgNykKICNkZWZpbmUgTUNJX0RBVEFFTkRNQVNLCQkoMSA8PCA4KQorI2RlZmluZSBNQ0lfU1RBUlRCSVRFUlJNQVNLCSgxIDw8IDkpCiAjZGVmaW5lIE1DSV9EQVRBQkxPQ0tFTkRNQVNLCSgxIDw8IDEwKQogI2RlZmluZSBNQ0lfQ01EQUNUSVZFTUFTSwkoMSA8PCAxMSkKICNkZWZpbmUgTUNJX1RYQUNUSVZFTUFTSwkoMSA8PCAxMikKQEAgLTE1MCw3ICsxNTMsNyBAQAogI2RlZmluZSBNQ0lfSVJRRU5BQkxFCVwKIAkoTUNJX0NNRENSQ0ZBSUxNQVNLfE1DSV9EQVRBQ1JDRkFJTE1BU0t8TUNJX0NNRFRJTUVPVVRNQVNLfAlcCiAJTUNJX0RBVEFUSU1FT1VUTUFTS3xNQ0lfVFhVTkRFUlJVTk1BU0t8TUNJX1JYT1ZFUlJVTk1BU0t8CVwKLQlNQ0lfQ01EUkVTUEVORE1BU0t8TUNJX0NNRFNFTlRNQVNLKQorCU1DSV9DTURSRVNQRU5ETUFTS3xNQ0lfQ01EU0VOVE1BU0t8TUNJX1NUQVJUQklURVJSTUFTSykKIAogLyogVGhlc2UgaW50ZXJydXB0cyBhcmUgZGlyZWN0ZWQgdG8gSVJRMSB3aGVuIHR3byBJUlEgbGluZXMgYXJlIGF2YWlsYWJsZSAqLwogI2RlZmluZSBNQ0lfSVJRMU1BU0sgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMgYi9kcml2ZXJzL21tYy9ob3N0L29mX21tY19zcGkuYwppbmRleCBlMmFlY2I3Li5hYjY2ZjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29mX21tY19zcGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29mX21tY19zcGkuYwpAQCAtMjUsNiArMjUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAKKy8qIEZvciBhcmNocyB0aGF0IGRvbid0IHN1cHBvcnQgTk9fSVJRIChzdWNoIGFzIG1pcHMpLCBwcm92aWRlIGEgZHVtbXkgdmFsdWUgKi8KKyNpZm5kZWYgTk9fSVJRCisjZGVmaW5lIE5PX0lSUSAwCisjZW5kaWYKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKaW5kZXggMjU5ZWNlMC4uZGVkZjNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKQEAgLTQyOSwxMiArNDI5LDE0IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KLQkJbW1jX3Nsb3QoaG9zdCkub2NyX21hc2sgPSBtbWNfcmVndWxhdG9yX2dldF9vY3JtYXNrKHJlZyk7CiAKIAkJLyogQWxsb3cgYW4gYXV4IHJlZ3VsYXRvciAqLwogCQlyZWcgPSByZWd1bGF0b3JfZ2V0KGhvc3QtPmRldiwgInZtbWNfYXV4Iik7CiAJCWhvc3QtPnZjY19hdXggPSBJU19FUlIocmVnKSA/IE5VTEwgOiByZWc7CiAKKwkJLyogRm9yIGVNTUMgZG8gbm90IHBvd2VyIG9mZiB3aGVuIG5vdCBpbiBzbGVlcCBzdGF0ZSAqLworCQlpZiAobW1jX3Nsb3QoaG9zdCkubm9fcmVndWxhdG9yX29mZl9pbml0KQorCQkJcmV0dXJuIDA7CiAJCS8qCiAJCSogVUdMWSBIQUNLOiAgd29ya2Fyb3VuZCByZWd1bGF0b3IgZnJhbWV3b3JrIGJ1Z3MuCiAJCSogV2hlbiB0aGUgYm9vdGxvYWRlciBsZWF2ZXMgYSBzdXBwbHkgYWN0aXZlLCBpdCdzCkBAIC05NTksNyArOTYxLDggQEAKIAlzcGluX3VubG9jaygmaG9zdC0+aXJxX2xvY2spOwogCiAJaWYgKGhvc3QtPnVzZV9kbWEgJiYgZG1hX2NoICE9IC0xKSB7Ci0JCWRtYV91bm1hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGhvc3QtPmRhdGEtPnNnLCBob3N0LT5kbWFfbGVuLAorCQlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBob3N0LT5kYXRhLT5zZywKKwkJCWhvc3QtPmRhdGEtPnNnX2xlbiwKIAkJCW9tYXBfaHNtbWNfZ2V0X2RtYV9kaXIoaG9zdCwgaG9zdC0+ZGF0YSkpOwogCQlvbWFwX2ZyZWVfZG1hKGRtYV9jaCk7CiAJfQpAQCAtMTM0Myw3ICsxMzQ2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRtYV91bm1hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLCBob3N0LT5kbWFfbGVuLAorCWRtYV91bm1hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCiAJCW9tYXBfaHNtbWNfZ2V0X2RtYV9kaXIoaG9zdCwgZGF0YSkpOwogCiAJcmVxX2luX3Byb2dyZXNzID0gaG9zdC0+cmVxX2luX3Byb2dyZXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCmluZGV4IGIzNjU0MjkuLmNlNTAwZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJbW1jX2RhdGEtPm9jcl9tYXNrID0gcC0+dG1pb19vY3JfbWFzazsKIAkJbW1jX2RhdGEtPmNhcGFiaWxpdGllcyB8PSBwLT50bWlvX2NhcHM7CiAKLQkJaWYgKHAtPmRtYV9zbGF2ZV90eCA+PSAwICYmIHAtPmRtYV9zbGF2ZV9yeCA+PSAwKSB7CisJCWlmIChwLT5kbWFfc2xhdmVfdHggPiAwICYmIHAtPmRtYV9zbGF2ZV9yeCA+IDApIHsKIAkJCXByaXYtPnBhcmFtX3R4LnNsYXZlX2lkID0gcC0+ZG1hX3NsYXZlX3R4OwogCQkJcHJpdi0+cGFyYW1fcnguc2xhdmVfaWQgPSBwLT5kbWFfc2xhdmVfcng7CiAJCQlwcml2LT5kbWFfcHJpdi5jaGFuX3ByaXZfdHggPSAmcHJpdi0+cGFyYW1fdHg7CkBAIC0xNjUsMTMgKzE2NSwxNCBAQAogCiAJcC0+cGRhdGEgPSBOVUxMOwogCisJdG1pb19tbWNfaG9zdF9yZW1vdmUoaG9zdCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CiAJCWlmIChpcnEgPj0gMCkKIAkJCWZyZWVfaXJxKGlycSwgaG9zdCk7CiAJfQogCi0JdG1pb19tbWNfaG9zdF9yZW1vdmUoaG9zdCk7CiAJY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKIAljbGtfcHV0KHByaXYtPmNsayk7CiAJa2ZyZWUocHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYwppbmRleCBhZDYzNDdiLi4wYjA5ZTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKQEAgLTgyNCw4ICs4MjQsOCBAQAogCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBob3N0LT5wZGF0YTsKIAotCXJldHVybiAoKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1dSUFJPVEVDVF9ESVNBQkxFKSB8fAotCQkhKHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9TVEFUVVMpICYgVE1JT19TVEFUX1dSUFJPVEVDVCkpOworCXJldHVybiAhKChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSkgfHwKKwkJIChzZF9jdHJsX3JlYWQzMihob3N0LCBDVExfU1RBVFVTKSAmIFRNSU9fU1RBVF9XUlBST1RFQ1QpKTsKIH0KIAogc3RhdGljIGludCB0bWlvX21tY19nZXRfY2Qoc3RydWN0IG1tY19ob3N0ICptbWMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jIGIvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYwppbmRleCBjYmIwMzMwLi5kNDQ1NWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKQEAgLTIwOTYsNyArMjA5Niw3IEBACiBzdGF0aWMgaW50IHZ1YjMwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewkJCQkvKiBOT1QgaXJxICovCi0Jc3RydWN0IHZ1YjMwMF9tbWNfaG9zdCAqdnViMzAwID0gTlVMTDsKKwlzdHJ1Y3QgdnViMzAwX21tY19ob3N0ICp2dWIzMDA7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CiAJaW50IGk7CkBAIC0yMTE4LDIzICsyMTE4LDIwIEBACiAJY29tbWFuZF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbW1hbmRfb3V0X3VyYikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZ2dWIzMDAtPnVkZXYtPmRldiwKLQkJCSJub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNvbW1hbmRfb3V0X3VyYlxuIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBjb21tYW5kX291dF91cmJcbiIpOwogCQlnb3RvIGVycm9yMDsKIAl9CiAJY29tbWFuZF9yZXNfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbW1hbmRfcmVzX3VyYikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZ2dWIzMDAtPnVkZXYtPmRldiwKLQkJCSJub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNvbW1hbmRfcmVzX3VyYlxuIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBjb21tYW5kX3Jlc191cmJcbiIpOwogCQlnb3RvIGVycm9yMTsKIAl9CiAJLyogdGhpcyBhbHNvIGFsbG9jYXRlcyBtZW1vcnkgZm9yIG91ciBWVUIzMDAgbW1jIGhvc3QgZGV2aWNlICovCiAJbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCB2dWIzMDBfbW1jX2hvc3QpLCAmdWRldi0+ZGV2KTsKIAlpZiAoIW1tYykgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZ2dWIzMDAtPnVkZXYtPmRldiwKLQkJCSJub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG1tY19ob3N0XG4iKTsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBtbWNfaG9zdFxuIik7CiAJCWdvdG8gZXJyb3I0OwogCX0KIAkvKiBNTUMgY29yZSB0cmFuc2ZlciBzaXplcyB0dW5hYmxlIHBhcmFtZXRlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKaW5kZXggMGJiMjU0Yy4uMzNkOGFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKQEAgLTMzOSw5ICszMzksOSBAQAogCQkgICAgICAgICAgICAgICAgICAgIChGSVJfT1BfVUEgIDw8IEZJUl9PUDFfU0hJRlQpIHwKIAkJICAgICAgICAgICAgICAgICAgICAoRklSX09QX1JCVyA8PCBGSVJfT1AyX1NISUZUKSk7CiAJCW91dF9iZTMyKCZsYmMtPmZjciwgTkFORF9DTURfUkVBRElEIDw8IEZDUl9DTUQwX1NISUZUKTsKLQkJLyogNSBieXRlcyBmb3IgbWFudWYsIGRldmljZSBhbmQgZXh0cyAqLwotCQlvdXRfYmUzMigmbGJjLT5mYmNyLCA1KTsKLQkJZWxiY19mY21fY3RybC0+cmVhZF9ieXRlcyA9IDU7CisJCS8qIG5hbmRfZ2V0X2ZsYXNoX3R5cGUoKSByZWFkcyA4IGJ5dGVzIG9mIGVudGlyZSBJRCBzdHJpbmcgKi8KKwkJb3V0X2JlMzIoJmxiYy0+ZmJjciwgOCk7CisJCWVsYmNfZmNtX2N0cmwtPnJlYWRfYnl0ZXMgPSA4OwogCQllbGJjX2ZjbV9jdHJsLT51c2VfbWRyID0gMTsKIAkJZWxiY19mY21fY3RybC0+bWRyID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDMuYyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKaW5kZXggZDg0ZjZlOC4uNWI3MzI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDMuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC00MTIsNyArNDEyLDcgQEAKIAkJb3V0Yl9wKDB4MDQgPDwgKCgqaXJxcCA9PSA5KSA/IDIgOiAqaXJxcCksIEUzM0dfSURDRlIpOwogCQlvdXRiX3AoMHgwMCwgRTMzR19JRENGUik7CiAJCW1zbGVlcCgxKTsKLQkJZnJlZV9pcnEoKmlycXAsIGVsMl9wcm9iZV9pbnRlcnJ1cHQpOworCQlmcmVlX2lycSgqaXJxcCwgJnNlZW4pOwogCQlpZiAoIXNlZW4pCiAJCQljb250aW51ZTsKIApAQCAtNDIyLDYgKzQyMiw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGVycl9kaXNhYmxlOworCQlicmVhazsKIAl9IHdoaWxlICgqKytpcnFwKTsKIAogCWlmICgqaXJxcCA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwOS5jIGIvZHJpdmVycy9uZXQvM2M1MDkuYwppbmRleCA1ZjI1ODg5Li40NGIyOGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwOS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKQEAgLTE4NSw3ICsxODUsNyBAQAogc3RhdGljIGludCBub3BucDsKICNlbmRpZgogCi1zdGF0aWMgaW50IGVsM19jb21tb25faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVsM19jb21tb25faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIGVsM19jb21tb25fcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHVzaG9ydCBpZF9yZWFkX2VlcHJvbShpbnQgaW5kZXgpOwogc3RhdGljIHVzaG9ydCByZWFkX2VlcHJvbShpbnQgaW9hZGRyLCBpbnQgaW5kZXgpOwpAQCAtMzk1LDcgKzM5NSw3IEBACiBzdGF0aWMgaW50IGlzYV9yZWdpc3RlcmVkOwogCiAjaWZkZWYgQ09ORklHX1BOUAotc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIGVsM19wbnBfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc3RydWN0IHBucF9kZXZpY2VfaWQgZWwzX3BucF9pZHNbXSA9IHsKIAl7IC5pZCA9ICJUQ001MDkwIiB9LCAvKiAzQ29tIEV0aGVybGluayBJSUkgKFRQKSAqLwogCXsgLmlkID0gIlRDTTUwOTEiIH0sIC8qIDNDb20gRXRoZXJsaW5rIElJSSAqLwogCXsgLmlkID0gIlRDTTUwOTQiIH0sIC8qIDNDb20gRXRoZXJsaW5rIElJSSAoY29tYm8pICovCkBAIC00NzgsNyArNDc4LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCiAKICNpZmRlZiBDT05GSUdfRUlTQQotc3RhdGljIGNvbnN0IHN0cnVjdCBlaXNhX2RldmljZV9pZCBlbDNfZWlzYV9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgZWwzX2Vpc2FfaWRzW10gPSB7CiAJCXsgIlRDTTUwOTAiIH0sCiAJCXsgIlRDTTUwOTEiIH0sCiAJCXsgIlRDTTUwOTIiIH0sCkBAIC01MDgsNyArNTA4LDcgQEAKICNpZmRlZiBDT05GSUdfTUNBCiBzdGF0aWMgaW50IGVsM19tY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKIAotc3RhdGljIGNvbnN0IHNob3J0IGVsM19tY2FfYWRhcHRlcl9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzaG9ydCBlbDNfbWNhX2FkYXB0ZXJfaWRzW10gX19pbml0ZGF0YSA9IHsKIAkJMHg2MjdjLAogCQkweDYyN2QsCiAJCTB4NjJkYiwKQEAgLTUxNyw3ICs1MTcsNyBAQAogCQkweDAwMDAKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBlbDNfbWNhX2FkYXB0ZXJfbmFtZXNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBjaGFyICplbDNfbWNhX2FkYXB0ZXJfbmFtZXNbXSBfX2luaXRkYXRhID0gewogCQkiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICgxMGJhc2UyKSIsCiAJCSIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKDEwYmFzZVQpIiwKIAkJIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAodGVzdCBtb2RlKSIsCkBAIC02MDEsNyArNjAxLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NQ0EKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVsM19tY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgZWwzX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogQmFzZWQgb24gRXJpayBOeWdyZW4ncyAobnlncmVuQG1pdC5lZHUpIDNjNTI5IHBhdGNoLAogCSAqIGhlYXZpbHkgbW9kaWZpZWQgYnkgQ2hyaXMgQmVhdXJlZ2FyZApAQCAtNjcxLDcgKzY3MSw3IEBACiAjZW5kaWYgLyogQ09ORklHX01DQSAqLwogCiAjaWZkZWYgQ09ORklHX0VJU0EKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVsM19laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IF9faW5pdCBlbDNfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCXNob3J0IGk7CiAJaW50IGlvYWRkciwgaXJxLCBpZl9wb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKaW5kZXggOTlmNDNkMi4uOGNjMjI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1OXguYworKysgYi9kcml2ZXJzL25ldC8zYzU5eC5jCkBAIC05MDEsMTQgKzkwMSwxNCBAQAogI2VuZGlmIC8qICFDT05GSUdfUE0gKi8KIAogI2lmZGVmIENPTkZJR19FSVNBCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVpc2FfZGV2aWNlX2lkIHZvcnRleF9laXNhX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCB2b3J0ZXhfZWlzYV9pZHNbXSA9IHsKIAl7ICJUQ001OTIwIiwgQ0hfM0M1OTIgfSwKIAl7ICJUQ001OTcwIiwgQ0hfM0M1OTcgfSwKIAl7ICIiIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIHZvcnRleF9laXNhX2lkcyk7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHZvcnRleF9laXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19pbml0IHZvcnRleF9laXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAl2b2lkIF9faW9tZW0gKmlvYWRkcjsKIAlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5dG9vLmMgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKaW5kZXggOTg1MTdhMy4uZTNiYWQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOXRvby5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwpAQCAtOTkyLDYgKzk5Miw3IEBACiAJICogZmVhdHVyZXMKIAkgKi8KIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX0hJR0hETUE7CisJZGV2LT52bGFuX2ZlYXR1cmVzID0gZGV2LT5mZWF0dXJlczsKIAogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCAxOWYwNGEzLi45MzM1OWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTM0MTYsNyArMzQxNiw4IEBACiAKIGNvbmZpZyBORVRDT05TT0xFX0RZTkFNSUMKIAlib29sICJEeW5hbWljIHJlY29uZmlndXJhdGlvbiBvZiBsb2dnaW5nIHRhcmdldHMiCi0JZGVwZW5kcyBvbiBORVRDT05TT0xFICYmIFNZU0ZTICYmIENPTkZJR0ZTX0ZTCisJZGVwZW5kcyBvbiBORVRDT05TT0xFICYmIFNZU0ZTICYmIENPTkZJR0ZTX0ZTICYmIFwKKwkJCSEoTkVUQ09OU09MRT15ICYmIENPTkZJR0ZTX0ZTPW0pCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgYWJpbGl0eSB0byBkeW5hbWljYWxseSByZWNvbmZpZ3VyZSB0YXJnZXQKIAkgIHBhcmFtZXRlcnMgKGludGVyZmFjZSwgSVAgYWRkcmVzc2VzLCBwb3J0IG51bWJlcnMsIE1BQyBhZGRyZXNzZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKaW5kZXggMGM5MjE3Zi4uN2IzZTIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYwpAQCAtNTAsNyArNTAsNyBAQAogI2lmZGVmIF9fYXJtX18KIHN0YXRpYyB2b2lkIHdyaXRlX3JyZWcodV9sb25nIGJhc2UsIHVfaW50IHJlZywgdV9pbnQgdmFsKQogewotCV9fYXNtX18oCisJYXNtIHZvbGF0aWxlKAogCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKIAkic3RyJT9oCSUwLCBbJTIsICMtNF0JQCBORVRfUkRQIgogCToKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVhZF9ycmVnKHVfbG9uZyBiYXNlX2FkZHIsIHVfaW50IHJlZykKIHsKIAl1bnNpZ25lZCBzaG9ydCB2OwotCV9fYXNtX18oCisJYXNtIHZvbGF0aWxlKAogCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKIAkibGRyJT9oCSUwLCBbJTIsICMtNF0JQCBORVRfUkRQIgogCTogIj1yIiAodikKQEAgLTcwLDcgKzcwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2lyZWcodV9sb25nIGJhc2UsIHVfaW50IHJlZywgdV9pbnQgdmFsKQogewotCV9fYXNtX18oCisJYXNtIHZvbGF0aWxlKAogCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKIAkic3RyJT9oCSUwLCBbJTIsICM4XQlAIE5FVF9JRFAiCiAJOgpAQCAtODAsNyArODAsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByZWFkX2lyZWcodV9sb25nIGJhc2VfYWRkciwgdV9pbnQgcmVnKQogewogCXVfc2hvcnQgdjsKLQlfX2FzbV9fKAorCWFzbSB2b2xhdGlsZSgKIAkic3RyJT9oCSUxLCBbJTJdCUAgTkFUX1JBUFxuXHQiCiAJImxkciU/aAklMCwgWyUyLCAjOF0JQCBORVRfSURQXG5cdCIKIAk6ICI9ciIgKHYpCkBAIC05MSw0NyArOTEsNDggQEAKICNkZWZpbmUgYW1fd3JpdGV3b3JkKGRldixvZmYsdmFsKSBfX3Jhd193cml0ZXcodmFsLCBJU0FNRU1fQkFTRSArICgob2ZmKSA8PCAxKSkKICNkZWZpbmUgYW1fcmVhZHdvcmQoZGV2LG9mZikgICAgICBfX3Jhd19yZWFkdyhJU0FNRU1fQkFTRSArICgob2ZmKSA8PCAxKSkKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogYW1fd3JpdGVidWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9pbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJb2Zmc2V0ID0gSVNBTUVNX0JBU0UgKyAob2Zmc2V0IDw8IDEpOwogCWxlbmd0aCA9IChsZW5ndGggKyAxKSAmIH4xOwogCWlmICgoaW50KWJ1ZiAmIDIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0ciU/aAklMiwgWyUwXSwgIzQiCisJCWFzbSB2b2xhdGlsZSgic3RyJT9oCSUyLCBbJTBdLCAjNCIKIAkJIDogIj0mciIgKG9mZnNldCkgOiAiMCIgKG9mZnNldCksICJyIiAoYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSkpOwogCQlidWYgKz0gMjsKIAkJbGVuZ3RoIC09IDI7CiAJfQogCXdoaWxlIChsZW5ndGggPiA4KSB7Ci0JCXVuc2lnbmVkIGludCB0bXAsIHRtcDI7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJImxkbSU/aWEJJTEhLCB7JTIsICUzfVxuXHQiCisJCXJlZ2lzdGVyIHVuc2lnbmVkIGludCB0bXAgYXNtKCJyMiIpLCB0bXAyIGFzbSgicjMiKTsKKwkJYXNtIHZvbGF0aWxlKAorCQkJImxkbSU/aWEJJTAhLCB7JTEsICUyfSIKKwkJCTogIityIiAoYnVmKSwgIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSk7CisJCWxlbmd0aCAtPSA4OworCQlhc20gdm9sYXRpbGUoCisJCQkic3RyJT9oCSUxLCBbJTBdLCAjNFxuXHQiCisJCQkibW92JT8JJTEsICUxLCBsc3IgIzE2XG5cdCIKKwkJCSJzdHIlP2gJJTEsIFslMF0sICM0XG5cdCIKIAkJCSJzdHIlP2gJJTIsIFslMF0sICM0XG5cdCIKIAkJCSJtb3YlPwklMiwgJTIsIGxzciAjMTZcblx0IgotCQkJInN0ciU/aAklMiwgWyUwXSwgIzRcblx0IgotCQkJInN0ciU/aAklMywgWyUwXSwgIzRcblx0IgotCQkJIm1vdiU/CSUzLCAlMywgbHNyICMxNlxuXHQiCi0JCQkic3RyJT9oCSUzLCBbJTBdLCAjNCIKLQkJOiAiPSZyIiAob2Zmc2V0KSwgIj0mciIgKGJ1ZiksICI9ciIgKHRtcCksICI9ciIgKHRtcDIpCi0JCTogIjAiIChvZmZzZXQpLCAiMSIgKGJ1ZikpOwotCQlsZW5ndGggLT0gODsKKwkJCSJzdHIlP2gJJTIsIFslMF0sICM0IgorCQk6ICIrciIgKG9mZnNldCksICI9JnIiICh0bXApLCAiPSZyIiAodG1wMikpOwogCX0KIAl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RyJT9oCSUyLCBbJTBdLCAjNCIKKwkJYXNtIHZvbGF0aWxlKCJzdHIlP2gJJTIsIFslMF0sICM0IgogCQkgOiAiPSZyIiAob2Zmc2V0KSA6ICIwIiAob2Zmc2V0KSwgInIiIChidWZbMF0gfCAoYnVmWzFdIDw8IDgpKSk7CiAJCWJ1ZiArPSAyOwogCQlsZW5ndGggLT0gMjsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGFtX3JlYWRidWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9pbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJb2Zmc2V0ID0gSVNBTUVNX0JBU0UgKyAob2Zmc2V0IDw8IDEpOwogCWxlbmd0aCA9IChsZW5ndGggKyAxKSAmIH4xOwogCWlmICgoaW50KWJ1ZiAmIDIpIHsKIAkJdW5zaWduZWQgaW50IHRtcDsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCWFzbSB2b2xhdGlsZSgKIAkJCSJsZHIlP2gJJTIsIFslMF0sICM0XG5cdCIKIAkJCSJzdHIlP2IJJTIsIFslMV0sICMxXG5cdCIKIAkJCSJtb3YlPwklMiwgJTIsIGxzciAjOFxuXHQiCkBAIC0xNDAsMTIgKzE0MSwxMiBAQAogCQlsZW5ndGggLT0gMjsKIAl9CiAJd2hpbGUgKGxlbmd0aCA+IDgpIHsKLQkJdW5zaWduZWQgaW50IHRtcCwgdG1wMiwgdG1wMzsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCXJlZ2lzdGVyIHVuc2lnbmVkIGludCB0bXAgYXNtKCJyMiIpLCB0bXAyIGFzbSgicjMiKSwgdG1wMzsKKwkJYXNtIHZvbGF0aWxlKAogCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgorCQkJImxkciU/aAklNCwgWyUwXSwgIzRcblx0IgogCQkJImxkciU/aAklMywgWyUwXSwgIzRcblx0IgotCQkJIm9yciU/CSUyLCAlMiwgJTMsIGxzbCAjMTZcblx0IgotCQkJImxkciU/aAklMywgWyUwXSwgIzRcblx0IgorCQkJIm9yciU/CSUyLCAlMiwgJTQsIGxzbCAjMTZcblx0IgogCQkJImxkciU/aAklNCwgWyUwXSwgIzRcblx0IgogCQkJIm9yciU/CSUzLCAlMywgJTQsIGxzbCAjMTZcblx0IgogCQkJInN0bSU/aWEJJTEhLCB7JTIsICUzfSIKQEAgLTE1NSw3ICsxNTYsNyBAQAogCX0KIAl3aGlsZSAobGVuZ3RoID4gMCkgewogCQl1bnNpZ25lZCBpbnQgdG1wOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJYXNtIHZvbGF0aWxlKAogCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgogCQkJInN0ciU/YgklMiwgWyUxXSwgIzFcblx0IgogCQkJIm1vdiU/CSUyLCAlMiwgbHNyICM4XG5cdCIKQEAgLTE5Niw2ICsxOTcsNDIgQEAKIAlyZXR1cm4gZXJyb3Jjb3VudDsKIH0KIAorc3RhdGljIHZvaWQgYW03OWM5NjFfbWNfaGFzaChjaGFyICphZGRyLCB1MTYgKmhhc2gpCit7CisJaWYgKGFkZHJbMF0gJiAweDAxKSB7CisJCWludCBpZHgsIGJpdDsKKwkJdTMyIGNyYzsKKworCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGFkZHIpOworCisJCWlkeCA9IGNyYyA+PiAzMDsKKwkJYml0ID0gKGNyYyA+PiAyNikgJiAxNTsKKworCQloYXNoW2lkeF0gfD0gMSA8PCBiaXQ7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFtNzljOTYxX2dldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqaGFzaCkKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IE1PREVfUE9SVF8xMEJUOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQltb2RlIHw9IE1PREVfUFJPTUlTQzsKKwkJbWVtc2V0KGhhc2gsIDB4ZmYsIDQgKiBzaXplb2YoKmhhc2gpKTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJbWVtc2V0KGhhc2gsIDB4ZmYsIDQgKiBzaXplb2YoKmhhc2gpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCisJCW1lbXNldChoYXNoLCAwLCA0ICogc2l6ZW9mKCpoYXNoKSk7CisKKwkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKKwkJCWFtNzljOTYxX21jX2hhc2goaGEtPmFkZHIsIGhhc2gpOworCX0KKworCXJldHVybiBtb2RlOworfQorCiBzdGF0aWMgdm9pZAogYW03OWM5NjFfaW5pdF9mb3Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMjAzLDYgKzI0MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyICpwOwogCXVfaW50IGhkcl9hZGRyLCBmaXJzdF9mcmVlX2FkZHI7CisJdTE2IG11bHRpX2hhc2hbNF0sIG1vZGUgPSBhbTc5Yzk2MV9nZXRfcnhfbW9kZShkZXYsIG11bHRpX2hhc2gpOwogCWludCBpOwogCiAJLyoKQEAgLTIxOCwxNiArMjU2LDEyIEBACiAJd3JpdGVfaXJlZyAoZGV2LT5iYXNlX2FkZHIsIDIsIDB4MDAwMCk7IC8qIE1PREUgcmVnaXN0ZXIgc2VsZWN0cyBtZWRpYSAqLwogCiAJZm9yIChpID0gTEFEUkw7IGkgPD0gTEFEUkg7IGkrKykKLQkJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIGksIDApOworCQl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgaSwgbXVsdGlfaGFzaFtpIC0gTEFEUkxdKTsKIAogCWZvciAoaSA9IFBBRFJMLCBwID0gZGV2LT5kZXZfYWRkcjsgaSA8PSBQQURSSDsgaSsrLCBwICs9IDIpCiAJCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBpLCBwWzBdIHwgKHBbMV0gPDwgOCkpOwogCi0JaSA9IE1PREVfUE9SVF8xMEJUOwotCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCi0JCWkgfD0gTU9ERV9QUk9NSVNDOwotCi0Jd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIE1PREUsIGkpOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBNT0RFLCBtb2RlKTsKIAl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgUE9MTElOVCwgMCk7CiAJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIFNJWkVSWFIsIC1SWF9CVUZGRVJTKTsKIAl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgU0laRVRYUiwgLVRYX0JVRkZFUlMpOwpAQCAtMzQwLDIxICszNzQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhbTc5Yzk2MV9tY19oYXNoKGNoYXIgKmFkZHIsIHVuc2lnbmVkIHNob3J0ICpoYXNoKQotewotCWlmIChhZGRyWzBdICYgMHgwMSkgewotCQlpbnQgaWR4LCBiaXQ7Ci0JCXUzMiBjcmM7Ci0KLQkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRyKTsKLQotCQlpZHggPSBjcmMgPj4gMzA7Ci0JCWJpdCA9IChjcmMgPj4gMjYpICYgMTU7Ci0KLQkJaGFzaFtpZHhdIHw9IDEgPDwgYml0OwotCX0KLX0KLQogLyoKICAqIFNldCBvciBjbGVhciBwcm9taXNjdW91cy9tdWx0aWNhc3QgbW9kZSBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRlci4KICAqLwpAQCAtMzYyLDI0ICszODEsOSBAQAogewogCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBzaG9ydCBtdWx0aV9oYXNoWzRdLCBtb2RlOworCXUxNiBtdWx0aV9oYXNoWzRdLCBtb2RlID0gYW03OWM5NjFfZ2V0X3J4X21vZGUoZGV2LCBtdWx0aV9oYXNoKTsKIAlpbnQgaSwgc3RvcHBlZDsKIAotCW1vZGUgPSBNT0RFX1BPUlRfMTBCVDsKLQotCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKLQkJbW9kZSB8PSBNT0RFX1BST01JU0M7Ci0JfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7Ci0JCW1lbXNldChtdWx0aV9oYXNoLCAweGZmLCBzaXplb2YobXVsdGlfaGFzaCkpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0KLQkJbWVtc2V0KG11bHRpX2hhc2gsIDB4MDAsIHNpemVvZihtdWx0aV9oYXNoKSk7Ci0KLQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKLQkJCWFtNzljOTYxX21jX2hhc2goaGEtPmFkZHIsIG11bHRpX2hhc2gpOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKIAogCXN0b3BwZWQgPSByZWFkX3JyZWcoZGV2LT5iYXNlX2FkZHIsIENTUjApICYgQ1NSMF9TVE9QOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKaW5kZXggNWE3NzAwMS4uMGI0NmI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCkBAIC0yODMsMTAgKzI4MywxNCBAQAogCiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoICsgMik7CiAJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7CisJCQlzdHJ1Y3QgZXA5M3h4X3JkZXNjICpyeGQgPSAmZXAtPmRlc2NzLT5yZGVzY1tlbnRyeV07CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoTlVMTCwgZXAtPmRlc2NzLT5yZGVzY1tlbnRyeV0uYnVmX2FkZHIsCisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYtPmRldi5wYXJlbnQsIHJ4ZC0+YnVmX2FkZHIsCiAJCQkJCQlsZW5ndGgsIERNQV9GUk9NX0RFVklDRSk7CiAJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGVwLT5yeF9idWZbZW50cnldLCBsZW5ndGgpOworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LT5kZXYucGFyZW50LAorCQkJCQkJICAgcnhkLT5idWZfYWRkciwgbGVuZ3RoLAorCQkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKIAkJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIApAQCAtMzQ4LDYgKzM1Miw3IEBACiBzdGF0aWMgaW50IGVwOTN4eF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVwOTN4eF9wcml2ICplcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGVwOTN4eF90ZGVzYyAqdHhkOwogCWludCBlbnRyeTsKIAogCWlmICh1bmxpa2VseShza2ItPmxlbiA+IE1BWF9QS1RfU0laRSkpIHsKQEAgLTM1OSwxMSArMzY0LDE0IEBACiAJZW50cnkgPSBlcC0+dHhfcG9pbnRlcjsKIAllcC0+dHhfcG9pbnRlciA9IChlcC0+dHhfcG9pbnRlciArIDEpICYgKFRYX1FVRVVFX0VOVFJJRVMgLSAxKTsKIAotCWVwLT5kZXNjcy0+dGRlc2NbZW50cnldLnRkZXNjMSA9Ci0JCVRERVNDMV9FT0YgfCAoZW50cnkgPDwgMTYpIHwgKHNrYi0+bGVuICYgMHhmZmYpOworCXR4ZCA9ICZlcC0+ZGVzY3MtPnRkZXNjW2VudHJ5XTsKKworCXR4ZC0+dGRlc2MxID0gVERFU0MxX0VPRiB8IChlbnRyeSA8PCAxNikgfCAoc2tiLT5sZW4gJiAweGZmZik7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LT5kZXYucGFyZW50LCB0eGQtPmJ1Zl9hZGRyLCBza2ItPmxlbiwKKwkJCQlETUFfVE9fREVWSUNFKTsKIAlza2JfY29weV9hbmRfY3N1bV9kZXYoc2tiLCBlcC0+dHhfYnVmW2VudHJ5XSk7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoTlVMTCwgZXAtPmRlc2NzLT50ZGVzY1tlbnRyeV0uYnVmX2FkZHIsCi0JCQkJc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldi0+ZGV2LnBhcmVudCwgdHhkLT5idWZfYWRkciwgc2tiLT5sZW4sCisJCQkJICAgRE1BX1RPX0RFVklDRSk7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJc3Bpbl9sb2NrX2lycSgmZXAtPnR4X3BlbmRpbmdfbG9jayk7CkBAIC00NTcsODkgKzQ2NSw4MCBAQAogCiBzdGF0aWMgdm9pZCBlcDkzeHhfZnJlZV9idWZmZXJzKHN0cnVjdCBlcDkzeHhfcHJpdiAqZXApCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZXAtPmRldi0+ZGV2LnBhcmVudDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpICs9IDIpIHsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CiAJCWRtYV9hZGRyX3QgZDsKIAogCQlkID0gZXAtPmRlc2NzLT5yZGVzY1tpXS5idWZfYWRkcjsKIAkJaWYgKGQpCi0JCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIGQsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBkLCBQS1RfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAKIAkJaWYgKGVwLT5yeF9idWZbaV0gIT0gTlVMTCkKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllcC0+cnhfYnVmW2ldKTsKKwkJCWtmcmVlKGVwLT5yeF9idWZbaV0pOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBUWF9RVUVVRV9FTlRSSUVTOyBpICs9IDIpIHsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CiAJCWRtYV9hZGRyX3QgZDsKIAogCQlkID0gZXAtPmRlc2NzLT50ZGVzY1tpXS5idWZfYWRkcjsKIAkJaWYgKGQpCi0JCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIGQsIFBBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZCwgUEtUX0JVRl9TSVpFLCBETUFfVE9fREVWSUNFKTsKIAogCQlpZiAoZXAtPnR4X2J1ZltpXSAhPSBOVUxMKQotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVwLT50eF9idWZbaV0pOworCQkJa2ZyZWUoZXAtPnR4X2J1ZltpXSk7CiAJfQogCi0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKHN0cnVjdCBlcDkzeHhfZGVzY3MpLCBlcC0+ZGVzY3MsCisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplb2Yoc3RydWN0IGVwOTN4eF9kZXNjcyksIGVwLT5kZXNjcywKIAkJCQkJCQllcC0+ZGVzY3NfZG1hX2FkZHIpOwogfQogCi0vKgotICogVGhlIGhhcmR3YXJlIGVuZm9yY2VzIGEgc3ViLTJLIG1heGltdW0gcGFja2V0IHNpemUsIHNvIHdlIHB1dAotICogdHdvIGJ1ZmZlcnMgb24gZXZlcnkgaGFyZHdhcmUgcGFnZS4KLSAqLwogc3RhdGljIGludCBlcDkzeHhfYWxsb2NfYnVmZmVycyhzdHJ1Y3QgZXA5M3h4X3ByaXYgKmVwKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGVwLT5kZXYtPmRldi5wYXJlbnQ7CiAJaW50IGk7CiAKLQllcC0+ZGVzY3MgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKHN0cnVjdCBlcDkzeHhfZGVzY3MpLAotCQkJCSZlcC0+ZGVzY3NfZG1hX2FkZHIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwllcC0+ZGVzY3MgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2Yoc3RydWN0IGVwOTN4eF9kZXNjcyksCisJCQkJJmVwLT5kZXNjc19kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVwLT5kZXNjcyA9PSBOVUxMKQogCQlyZXR1cm4gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpICs9IDIpIHsKLQkJdm9pZCAqcGFnZTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CisJCXZvaWQgKmJ1ZjsKIAkJZG1hX2FkZHJfdCBkOwogCi0JCXBhZ2UgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCWlmIChwYWdlID09IE5VTEwpCisJCWJ1ZiA9IGttYWxsb2MoUEtUX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQogCQkJZ290byBlcnI7CiAKLQkJZCA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHBhZ2UsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKE5VTEwsIGQpKSB7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJCWQgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGJ1ZiwgUEtUX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkKSkgeworCQkJa2ZyZWUoYnVmKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAKLQkJZXAtPnJ4X2J1ZltpXSA9IHBhZ2U7CisJCWVwLT5yeF9idWZbaV0gPSBidWY7CiAJCWVwLT5kZXNjcy0+cmRlc2NbaV0uYnVmX2FkZHIgPSBkOwogCQllcC0+ZGVzY3MtPnJkZXNjW2ldLnJkZXNjMSA9IChpIDw8IDE2KSB8IFBLVF9CVUZfU0laRTsKLQotCQllcC0+cnhfYnVmW2kgKyAxXSA9IHBhZ2UgKyBQS1RfQlVGX1NJWkU7Ci0JCWVwLT5kZXNjcy0+cmRlc2NbaSArIDFdLmJ1Zl9hZGRyID0gZCArIFBLVF9CVUZfU0laRTsKLQkJZXAtPmRlc2NzLT5yZGVzY1tpICsgMV0ucmRlc2MxID0gKChpICsgMSkgPDwgMTYpIHwgUEtUX0JVRl9TSVpFOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBUWF9RVUVVRV9FTlRSSUVTOyBpICs9IDIpIHsKLQkJdm9pZCAqcGFnZTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CisJCXZvaWQgKmJ1ZjsKIAkJZG1hX2FkZHJfdCBkOwogCi0JCXBhZ2UgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCWlmIChwYWdlID09IE5VTEwpCisJCWJ1ZiA9IGttYWxsb2MoUEtUX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQogCQkJZ290byBlcnI7CiAKLQkJZCA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHBhZ2UsIFBBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci0JCWlmIChkbWFfbWFwcGluZ19lcnJvcihOVUxMLCBkKSkgewotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQlkID0gZG1hX21hcF9zaW5nbGUoZGV2LCBidWYsIFBLVF9CVUZfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGQpKSB7CisJCQlrZnJlZShidWYpOwogCQkJZ290byBlcnI7CiAJCX0KIAotCQllcC0+dHhfYnVmW2ldID0gcGFnZTsKKwkJZXAtPnR4X2J1ZltpXSA9IGJ1ZjsKIAkJZXAtPmRlc2NzLT50ZGVzY1tpXS5idWZfYWRkciA9IGQ7Ci0KLQkJZXAtPnR4X2J1ZltpICsgMV0gPSBwYWdlICsgUEtUX0JVRl9TSVpFOwotCQllcC0+ZGVzY3MtPnRkZXNjW2kgKyAxXS5idWZfYWRkciA9IGQgKyBQS1RfQlVGX1NJWkU7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC04MjksNiArODI4LDcgQEAKIAl9CiAJZXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWVwLT5kZXYgPSBkZXY7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZlcC0+bmFwaSwgZXA5M3h4X3BvbGwsIDY0KTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZmluX21hYy5jIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuYwppbmRleCA2OGQ0NWJhLi42YzAxOWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKQEAgLTUyLDEzICs1MiwxMyBAQAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiZmluX21hYyIpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfVVNFX0wxKQotIyBkZWZpbmUgYmZpbl9tYWNfYWxsb2MoZG1hX2hhbmRsZSwgc2l6ZSkgIGwxX2RhdGFfc3JhbV96YWxsb2Moc2l6ZSkKLSMgZGVmaW5lIGJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcHRyKSAgICBsMV9kYXRhX3NyYW1fZnJlZShwdHIpCisjIGRlZmluZSBiZmluX21hY19hbGxvYyhkbWFfaGFuZGxlLCBzaXplLCBudW0pICBsMV9kYXRhX3NyYW1femFsbG9jKHNpemUqbnVtKQorIyBkZWZpbmUgYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCBwdHIsIG51bSkgICAgbDFfZGF0YV9zcmFtX2ZyZWUocHRyKQogI2Vsc2UKLSMgZGVmaW5lIGJmaW5fbWFjX2FsbG9jKGRtYV9oYW5kbGUsIHNpemUpIFwKLQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSwgZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCkKLSMgZGVmaW5lIGJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcHRyKSBcCi0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKCpwdHIpLCBwdHIsIGRtYV9oYW5kbGUpCisjIGRlZmluZSBiZmluX21hY19hbGxvYyhkbWFfaGFuZGxlLCBzaXplLCBudW0pIFwKKwlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSpudW0sIGRtYV9oYW5kbGUsIEdGUF9LRVJORUwpCisjIGRlZmluZSBiZmluX21hY19mcmVlKGRtYV9oYW5kbGUsIHB0ciwgbnVtKSBcCisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKCpwdHIpKm51bSwgcHRyLCBkbWFfaGFuZGxlKQogI2VuZGlmCiAKICNkZWZpbmUgUEtUX0JVRl9TWiAxNTgwCkBAIC05NSw3ICs5NSw3IEBACiAJCQkJdCA9IHQtPm5leHQ7CiAJCQl9CiAJCX0KLQkJYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCB0eF9kZXNjKTsKKwkJYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCB0eF9kZXNjLCBDT05GSUdfQkZJTl9UWF9ERVNDX05VTSk7CiAJfQogCiAJaWYgKHJ4X2Rlc2MpIHsKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJCXIgPSByLT5uZXh0OwogCQkJfQogCQl9Ci0JCWJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcnhfZGVzYyk7CisJCWJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcnhfZGVzYywgQ09ORklHX0JGSU5fUlhfREVTQ19OVU0pOwogCX0KIH0KIApAQCAtMTI2LDEzICsxMjYsMTMgQEAKICNlbmRpZgogCiAJdHhfZGVzYyA9IGJmaW5fbWFjX2FsbG9jKCZkbWFfaGFuZGxlLAotCQkJCXNpemVvZihzdHJ1Y3QgbmV0X2RtYV9kZXNjX3R4KSAqCisJCQkJc2l6ZW9mKHN0cnVjdCBuZXRfZG1hX2Rlc2NfdHgpLAogCQkJCUNPTkZJR19CRklOX1RYX0RFU0NfTlVNKTsKIAlpZiAodHhfZGVzYyA9PSBOVUxMKQogCQlnb3RvIGluaXRfZXJyb3I7CiAKIAlyeF9kZXNjID0gYmZpbl9tYWNfYWxsb2MoJmRtYV9oYW5kbGUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBuZXRfZG1hX2Rlc2NfcngpICoKKwkJCQlzaXplb2Yoc3RydWN0IG5ldF9kbWFfZGVzY19yeCksCiAJCQkJQ09ORklHX0JGSU5fUlhfREVTQ19OVU0pOwogCWlmIChyeF9kZXNjID09IE5VTEwpCiAJCWdvdG8gaW5pdF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9ibmFkLmMgYi9kcml2ZXJzL25ldC9ibmEvYm5hZC5jCmluZGV4IDdkMjVhOTcuLjQ0ZTIxOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9ibmFkLmMKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JuYWQuYwpAQCAtMTExMSw3ICsxMTExLDcgQEAKIAkJICAgIHN0cnVjdCBibmFfaW50cl9pbmZvICppbnRyX2luZm8pCiB7CiAJaW50IAkJZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIAlmbGFnczsKKwl1bnNpZ25lZCBsb25nIAlpcnFfZmxhZ3MgPSAwLCBmbGFnczsKIAl1MzIJaXJxOwogCWlycV9oYW5kbGVyX3QgCWlycV9oYW5kbGVyOwogCkBAIC0xMTI1LDE4ICsxMTI1LDE3IEBACiAJaWYgKGJuYWQtPmNmZ19mbGFncyAmIEJOQURfQ0ZfTVNJWCkgewogCQlpcnFfaGFuZGxlciA9IChpcnFfaGFuZGxlcl90KWJuYWRfbXNpeF9tYm94X2hhbmRsZXI7CiAJCWlycSA9IGJuYWQtPm1zaXhfdGFibGVbYm5hZC0+bXNpeF9udW0gLSAxXS52ZWN0b3I7Ci0JCWZsYWdzID0gMDsKIAkJaW50cl9pbmZvLT5pbnRyX3R5cGUgPSBCTkFfSU5UUl9UX01TSVg7CiAJCWludHJfaW5mby0+aWRsWzBdLnZlY3RvciA9IGJuYWQtPm1zaXhfbnVtIC0gMTsKIAl9IGVsc2UgewogCQlpcnFfaGFuZGxlciA9IChpcnFfaGFuZGxlcl90KWJuYWRfaXNyOwogCQlpcnEgPSBibmFkLT5wY2lkZXYtPmlycTsKLQkJZmxhZ3MgPSBJUlFGX1NIQVJFRDsKKwkJaXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7CiAJCWludHJfaW5mby0+aW50cl90eXBlID0gQk5BX0lOVFJfVF9JTlRYOwogCQkvKiBpbnRyX2luZm8tPmlkbC52ZWN0b3IgPSAwID8gKi8KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKLQorCWZsYWdzID0gaXJxX2ZsYWdzOwogCXNwcmludGYoYm5hZC0+bWJveF9pcnFfbmFtZSwgIiVzIiwgQk5BRF9OQU1FKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMKaW5kZXggNGI3MDMxMS4uNzRiZTk4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X21haW4uYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2RlZmluZSBCTlgyWF9NQUlOCiAjaW5jbHVkZSAiYm54MnguaCIKQEAgLTQ1MzcsOCArNDUzOCw3IEBACiAJaWYgKGJwLT5zdHJtICA9PSBOVUxMKQogCQlnb3RvIGd1bnppcF9ub21lbTI7CiAKLQlicC0+c3RybS0+d29ya3NwYWNlID0ga21hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpLAotCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWJwLT5zdHJtLT53b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOwogCWlmIChicC0+c3RybS0+d29ya3NwYWNlID09IE5VTEwpCiAJCWdvdG8gZ3VuemlwX25vbWVtMzsKIApAQCAtNDU2Miw3ICs0NTYyLDcgQEAKIHN0YXRpYyB2b2lkIGJueDJ4X2d1bnppcF9lbmQoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpZiAoYnAtPnN0cm0pIHsKLQkJa2ZyZWUoYnAtPnN0cm0tPndvcmtzcGFjZSk7CisJCXZmcmVlKGJwLT5zdHJtLT53b3Jrc3BhY2UpOwogCQlrZnJlZShicC0+c3RybSk7CiAJCWJwLT5zdHJtID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCAxN2I0ZGQ5Li42M2MyMmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTM4OCw2ICszODgsOCBAQAogCXJldHVybiBuZXh0OwogfQogCisjZGVmaW5lIGJvbmRfcXVldWVfbWFwcGluZyhza2IpICgqKHUxNiAqKSgoc2tiKS0+Y2IpKQorCiAvKioKICAqIGJvbmRfZGV2X3F1ZXVlX3htaXQgLSBQcmVwYXJlIHNrYiBmb3IgeG1pdC4KICAqCkBAIC00MDAsNiArNDAyLDkgQEAKIHsKIAlza2ItPmRldiA9IHNsYXZlX2RldjsKIAlza2ItPnByaW9yaXR5ID0gMTsKKworCXNrYi0+cXVldWVfbWFwcGluZyA9IGJvbmRfcXVldWVfbWFwcGluZyhza2IpOworCiAJaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyhzbGF2ZV9kZXYpKSkKIAkJYm9uZF9uZXRwb2xsX3NlbmRfc2tiKGJvbmRfZ2V0X3NsYXZlX2J5X2Rldihib25kLCBzbGF2ZV9kZXYpLCBza2IpOwogCWVsc2UKQEAgLTEyOTIsNiArMTI5Nyw3IEBACiAJCWdvdG8gb3V0OwogCiAJbnAtPmRldiA9IHNsYXZlLT5kZXY7CisJc3RybGNweShucC0+ZGV2X25hbWUsIHNsYXZlLT5kZXYtPm5hbWUsIElGTkFNU0laKTsKIAllcnIgPSBfX25ldHBvbGxfc2V0dXAobnApOwogCWlmIChlcnIpIHsKIAkJa2ZyZWUobnApOwpAQCAtMTQyMiw5ICsxNDI4LDkgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLSNkZWZpbmUgQk9ORF9WTEFOX0ZFQVRVUkVTCShORVRJRl9GX0FMTF9UWF9PRkZMT0FEUyB8IFwKLQkJCQkgTkVUSUZfRl9TT0ZUX0ZFQVRVUkVTIHwgXAotCQkJCSBORVRJRl9GX0xSTykKKyNkZWZpbmUgQk9ORF9WTEFOX0ZFQVRVUkVTCShORVRJRl9GX0FMTF9DU1VNIHwgTkVUSUZfRl9TRyB8IFwKKwkJCQkgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfQUxMX1RTTyB8IFwKKwkJCQkgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9MUk8pCiAKIHN0YXRpYyB2b2lkIGJvbmRfY29tcHV0ZV9mZWF0dXJlcyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKIHsKQEAgLTQyMDYsNiArNDIxMiw3IEBACiAJcmV0dXJuIHJlczsKIH0KIAorCiBzdGF0aWMgdTE2IGJvbmRfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJLyoKQEAgLTQyMTYsNiArNDIyMywxMSBAQAogCSAqLwogCXUxNiB0eHEgPSBza2JfcnhfcXVldWVfcmVjb3JkZWQoc2tiKSA/IHNrYl9nZXRfcnhfcXVldWUoc2tiKSA6IDA7CiAKKwkvKgorCSAqIFNhdmUgdGhlIG9yaWdpbmFsIHR4cSB0byByZXN0b3JlIGJlZm9yZSBwYXNzaW5nIHRvIHRoZSBkcml2ZXIKKwkgKi8KKwlib25kX3F1ZXVlX21hcHBpbmcoc2tiKSA9IHNrYi0+cXVldWVfbWFwcGluZzsKKwogCWlmICh1bmxpa2VseSh0eHEgPj0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXMpKSB7CiAJCWRvIHsKIAkJCXR4cSAtPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYwppbmRleCA3M2M3ZTAzLi4zZGYwYzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jCkBAIC0xNjcsOCArMTY3LDggQEAKIAogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGRpc2NfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1OCAqZGF0YSwgY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGxkaXNjX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdTggKmRhdGEsCisJCQljaGFyICpmbGFncywgaW50IGNvdW50KQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXN0cnVjdCBzZXJfZGV2aWNlICpzZXI7CkBAIC0yMTUsOCArMjE1LDYgQEAKIAl9IGVsc2UKIAkJKytzZXItPmRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAl1cGRhdGVfdHR5X3N0YXR1cyhzZXIpOwotCi0JcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgaW50IGhhbmRsZV90eChzdHJ1Y3Qgc2VyX2RldmljZSAqc2VyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCAxZDY5OWUzLi43NTRkZjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtMzYsNyArMzYsNyBAQAogY29uZmlnIENBTl9ERVYKIAl0cmlzdGF0ZSAiUGxhdGZvcm0gQ0FOIGRyaXZlcnMgd2l0aCBOZXRsaW5rIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDQU4KLQlkZWZhdWx0IFkKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBFbmFibGVzIHRoZSBjb21tb24gZnJhbWV3b3JrIGZvciBwbGF0Zm9ybSBDQU4gZHJpdmVycyB3aXRoIE5ldGxpbmsKIAkgIHN1cHBvcnQuIFRoaXMgaXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZm9yIENBTiBkcml2ZXJzLgpAQCAtNDUsNyArNDUsNyBAQAogY29uZmlnIENBTl9DQUxDX0JJVFRJTUlORwogCWJvb2wgIkNBTiBiaXQtdGltaW5nIGNhbGN1bGF0aW9uIgogCWRlcGVuZHMgb24gQ0FOX0RFVgotCWRlZmF1bHQgWQorCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIElmIGVuYWJsZWQsIENBTiBiaXQtdGltaW5nIHBhcmFtZXRlcnMgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciB0aGUKIAkgIGJpdC1yYXRlIHNwZWNpZmllZCB2aWEgTmV0bGluayBhcmd1bWVudCAiYml0cmF0ZSIgd2hlbiB0aGUgZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYwppbmRleCBkNDk5MDU2Li4xNzY3ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKQEAgLTkyMyw3ICs5MjMsNyBAQAogCW1lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShtZW0pOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbV9zaXplLCBwZGV2LT5uYW1lKSkgewogCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZmFpbGVkX3JlcTsKKwkJZ290byBmYWlsZWRfZ2V0OwogCX0KIAogCWJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIG1lbV9zaXplKTsKQEAgLTk3Nyw5ICs5NzcsOCBAQAogCWlvdW5tYXAoYmFzZSk7CiAgZmFpbGVkX21hcDoKIAlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtX3NpemUpOwotIGZhaWxlZF9yZXE6Ci0JY2xrX3B1dChjbGspOwogIGZhaWxlZF9nZXQ6CisJY2xrX3B1dChjbGspOwogIGZhaWxlZF9jbG9jazoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3NsY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vc2xjYW4uYwppbmRleCA3NTYyMmQ1Li4xYjQ5ZGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc2xjYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vc2xjYW4uYwpAQCAtNDI1LDE3ICs0MjUsMTYgQEAKICAqIGluIHBhcmFsbGVsCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBzbGNhbl9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorc3RhdGljIHZvaWQgc2xjYW5fcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBzbGNhbiAqc2wgPSAoc3RydWN0IHNsY2FuICopIHR0eS0+ZGlzY19kYXRhOwotCWludCBieXRlcyA9IGNvdW50OwogCiAJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gU0xDQU5fTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoc2wtPmRldikpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAKIAkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCi0Jd2hpbGUgKGJ5dGVzLS0pIHsKKwl3aGlsZSAoY291bnQtLSkgewogCQlpZiAoZnAgJiYgKmZwKyspIHsKIAkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpKQogCQkJCXNsLT5kZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwpAQCAtNDQ0LDggKzQ0Myw2IEBACiAJCX0KIAkJc2xjYW5fdW5lc2Moc2wsICpjcCsrKTsKIAl9Ci0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKaW5kZXggM2Y1NjJiYS4uNzZiZjU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKQEAgLTIwMjYsNyArMjAyNiw3IEBACiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfSBlbHNlCiAJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwotCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBxcyAtICZhZGFwLT5zZ2UucXNbMF0pOworCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBxcyAtICZhZGFwLT5zZ2UucXNbcGktPmZpcnN0X3FzZXRdKTsKIAogCWlmICh1bmxpa2VseShwLT52bGFuX3ZhbGlkKSkgewogCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcGktPnZsYW5fZ3JwOwpAQCAtMjE0NSw3ICsyMTQ1LDcgQEAKIAlpZiAoIWNvbXBsZXRlKQogCQlyZXR1cm47CiAKLQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcXMgLSAmYWRhcC0+c2dlLnFzWzBdKTsKKwlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcXMgLSAmYWRhcC0+c2dlLnFzW3BpLT5maXJzdF9xc2V0XSk7CiAKIAlpZiAodW5saWtlbHkoY3BsLT52bGFuX3ZhbGlkKSkgewogCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcGktPnZsYW5fZ3JwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMgYi9kcml2ZXJzL25ldC9kYXZpbmNpX2VtYWMuYwppbmRleCAyOWE0ZjA2Li5kY2M0YTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kYXZpbmNpX2VtYWMuYworKysgYi9kcml2ZXJzL25ldC9kYXZpbmNpX2VtYWMuYwpAQCAtMTc4MSw4ICsxNzgxLDggQEAKIAluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBlbWFjX3ByaXYpKTsKIAlpZiAoIW5kZXYpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3IgYWxsb2NhdGluZyBuZXRfZGV2aWNlXG4iKTsKLQkJY2xrX3B1dChlbWFjX2Nsayk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9jbGs7CiAJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CkBAIC0xNzk2LDcgKzE3OTYsOCBAQAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKCFwZGF0YSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBwcm9iZV9xdWl0OwogCX0KIAogCS8qIE1BQyBhZGRyIGFuZCBQSFkgbWFzayAsIFJNSUkgZW5hYmxlIGluZm8gZnJvbSBwbGF0Zm9ybV9kYXRhICovCkBAIC0xOTI5LDggKzE5MzAsOSBAQAogCWlvdW5tYXAocHJpdi0+cmVtYXBfYWRkcik7CiAKIHByb2JlX3F1aXQ6Ci0JY2xrX3B1dChlbWFjX2Nsayk7CiAJZnJlZV9uZXRkZXYobmRldik7CitmcmVlX2NsazoKKwljbGtfcHV0KGVtYWNfY2xrKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IDE3NjU0MDUuLjhiMDA4NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtMzMxLDE4ICszMzEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiREU0MjIiLFwKICAgICAgICAgICAgICAgICAgICAgICAgICAiIn0KIAotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGRlcGNhX3NpZ25hdHVyZVtdIF9fZGV2aW5pdGNvbnN0ID0gREVQQ0FfU0lHTkFUVVJFOworc3RhdGljIGNoYXIqIF9faW5pdGRhdGEgZGVwY2Ffc2lnbmF0dXJlW10gPSBERVBDQV9TSUdOQVRVUkU7CiAKIGVudW0gZGVwY2FfdHlwZSB7CiAJREVQQ0EsIGRlMTAwLCBkZTEwMSwgZGUyMDAsIGRlMjAxLCBkZTIwMiwgZGUyMTAsIGRlMjEyLCBkZTQyMiwgdW5rbm93bgogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgZGVwY2Ffc3RyaW5nW10gPSAiZGVwY2EiOworc3RhdGljIGNoYXIgZGVwY2Ffc3RyaW5nW10gPSAiZGVwY2EiOwogCiBzdGF0aWMgaW50IGRlcGNhX2RldmljZV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiAKICNpZmRlZiBDT05GSUdfRUlTQQotc3RhdGljIGNvbnN0IHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZXBjYV9laXNhX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZXBjYV9laXNhX2lkc1tdID0gewogCXsgIkRFQzQyMjAiLCBkZTQyMiB9LAogCXsgIiIgfQogfTsKQEAgLTM2NywxOSArMzY3LDE5IEBACiAjZGVmaW5lIERFMjEwX0lEIDB4NjI4ZAogI2RlZmluZSBERTIxMl9JRCAweDZkZWYKIAotc3RhdGljIGNvbnN0IHNob3J0IGRlcGNhX21jYV9hZGFwdGVyX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHNob3J0IGRlcGNhX21jYV9hZGFwdGVyX2lkc1tdID0gewogCURFMjEwX0lELAogCURFMjEyX0lELAogCTB4MDAwMAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmRlcGNhX21jYV9hZGFwdGVyX25hbWVbXSA9IHsKK3N0YXRpYyBjaGFyICpkZXBjYV9tY2FfYWRhcHRlcl9uYW1lW10gPSB7CiAJIkRFQyBFdGhlcldPUktTIE1DIEFkYXB0ZXIgKERFMjEwKSIsCiAJIkRFQyBFdGhlcldPUktTIE1DIEFkYXB0ZXIgKERFMjEyKSIsCiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IGVudW0gZGVwY2FfdHlwZSBkZXBjYV9tY2FfYWRhcHRlcl90eXBlW10gPSB7CitzdGF0aWMgZW51bSBkZXBjYV90eXBlIGRlcGNhX21jYV9hZGFwdGVyX3R5cGVbXSA9IHsKIAlkZTIxMCwKIAlkZTIxMiwKIAkwCkBAIC01NDEsOSArNTQxLDEwIEBACiBzdGF0aWMgaW50IGxvYWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQgZGVwY2FfZGJnX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyBjb25zdCB1X2NoYXIgZGUxeHhfaXJxW10gX19kZXZpbml0Y29uc3QgPSB7IDIsIDMsIDQsIDUsIDcsIDksIDAgfTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgZGUyeHhfaXJxW10gX19kZXZpbml0Y29uc3QgPSB7IDUsIDksIDEwLCAxMSwgMTUsIDAgfTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgZGU0MjJfaXJxW10gX19kZXZpbml0Y29uc3QgPSB7IDUsIDksIDEwLCAxMSwgMCB9Oworc3RhdGljIHVfY2hhciBkZTF4eF9pcnFbXSBfX2luaXRkYXRhID0geyAyLCAzLCA0LCA1LCA3LCA5LCAwIH07CitzdGF0aWMgdV9jaGFyIGRlMnh4X2lycVtdIF9faW5pdGRhdGEgPSB7IDUsIDksIDEwLCAxMSwgMTUsIDAgfTsKK3N0YXRpYyB1X2NoYXIgZGU0MjJfaXJxW10gX19pbml0ZGF0YSA9IHsgNSwgOSwgMTAsIDExLCAwIH07CitzdGF0aWMgdV9jaGFyICpkZXBjYV9pcnE7CiAKIHN0YXRpYyBpbnQgaXJxOwogc3RhdGljIGludCBpbzsKQEAgLTU3OSw3ICs1ODAsNyBAQAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgZGVwY2FfaHdfaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgZGVwY2FfaHdfaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscDsKIAlpbnQgaSwgaiwgb2Zmc2V0LCBuZXRSQU0sIG1lbV9sZW4sIHN0YXR1cyA9IDA7CkBAIC03NDcsNyArNzQ4LDYgQEAKIAlpZiAoZGV2LT5pcnEgPCAyKSB7CiAJCXVuc2lnbmVkIGNoYXIgaXJxbnVtOwogCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrLCBkZWxheTsKLQkJY29uc3QgdV9jaGFyICpkZXBjYV9pcnE7CiAKIAkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKIApAQCAtNzcwLDcgKzc3MCw2IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJZGVwY2FfaXJxID0gTlVMTDsKIAkJCWJyZWFrOwkvKiBOb3QgcmVhY2hlZCAqLwogCQl9CiAKQEAgLTEzMDMsNyArMTMwMiw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkZXBjYV9jb21tb25faW5pdCAodV9sb25nIGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZwKQorc3RhdGljIGludCBfX2luaXQgZGVwY2FfY29tbW9uX2luaXQgKHVfbG9uZyBpb2FkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2cCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMTMzNCw3ICsxMzMzLDcgQEAKIC8qCiAqKiBNaWNyb2NoYW5uZWwgYnVzIEkvTyBkZXZpY2UgcHJvYmUKICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkZXBjYV9tY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgZGVwY2FfbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHBvc1syXTsKIAl1bnNpZ25lZCBjaGFyIHdoZXJlOwpAQCAtMTQ1OCw3ICsxNDU3LDcgQEAKICoqIElTQSBidXMgSS9PIGRldmljZSBwcm9iZQogKi8KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGRlcGNhX3BsYXRmb3JtX3Byb2JlICh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGRlcGNhX3BsYXRmb3JtX3Byb2JlICh2b2lkKQogewogCWludCBpOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OwpAQCAtMTQ5OCw3ICsxNDk3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBlbnVtIGRlcGNhX3R5cGUgX19kZXZpbml0IGRlcGNhX3NobWVtX3Byb2JlICh1bG9uZyAqbWVtX3N0YXJ0KQorc3RhdGljIGVudW0gZGVwY2FfdHlwZSBfX2luaXQgZGVwY2Ffc2htZW1fcHJvYmUgKHVsb25nICptZW1fc3RhcnQpCiB7CiAJdV9sb25nIG1lbV9iYXNlW10gPSBERVBDQV9SQU1fQkFTRV9BRERSRVNTRVM7CiAJZW51bSBkZXBjYV90eXBlIGFkYXB0ZXIgPSB1bmtub3duOwpAQCAtMTU1OSw3ICsxNTU4LDcgQEAKICovCiAKICNpZmRlZiBDT05GSUdfRUlTQQotc3RhdGljIGludCBfX2RldmluaXQgZGVwY2FfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgZGVwY2FfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWVudW0gZGVwY2FfdHlwZSBhZGFwdGVyID0gdW5rbm93bjsKIAlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CkBAIC0xNjMwLDcgKzE2MjksNyBAQAogKiogYW5kIEJvb3QgKHJlYWRiKSBST00uIFRoaXMgd2lsbCBhbHNvIGdpdmUgdXMgYSBjbHVlIHRvIHRoZSBuZXR3b3JrIFJBTQogKiogYmFzZSBhZGRyZXNzLgogKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IERlcGNhU2lnbmF0dXJlKGNoYXIgKm5hbWUsIHVfbG9uZyBiYXNlX2FkZHIpCitzdGF0aWMgaW50IF9faW5pdCBEZXBjYVNpZ25hdHVyZShjaGFyICpuYW1lLCB1X2xvbmcgYmFzZV9hZGRyKQogewogCXVfaW50IGksIGosIGs7CiAJdm9pZCBfX2lvbWVtICpwdHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbDJrLmMgYi9kcml2ZXJzL25ldC9kbDJrLmMKaW5kZXggYzQ0NTQ1Ny4uMjMxNzlkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGwyay5jCisrKyBiL2RyaXZlcnMvbmV0L2RsMmsuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJaWYgKG5wLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ETElOSykgewkvKiBELUxpbmsgT25seSAqLwogCQkvKiBDaGVjayBDUkMgKi8KIAkJY3JjID0gfmV0aGVyX2NyY19sZSAoMjU2IC0gNCwgc3JvbWRhdGEpOwotCQlpZiAocHNyb20tPmNyYyAhPSBjcmMpIHsKKwkJaWYgKHBzcm9tLT5jcmMgIT0gY3B1X3RvX2xlMzIoY3JjKSkgewogCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IEVFUFJPTSBkYXRhIENSQyBlcnJvci5cbiIsCiAJCQkJCWRldi0+bmFtZSk7CiAJCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCmluZGV4IGZiYWZmMzUuLmVlNTk3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCkBAIC0xMTU3LDkgKzExNTcsNiBAQAogCiAJaXJxZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CiAKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRtOTAwMF9pbnRlcnJ1cHQsIGlycWZsYWdzLCBkZXYtPm5hbWUsIGRldikpCi0JCXJldHVybiAtRUFHQUlOOwotCiAJLyogR1BJTzAgb24gcHJlLWFjdGl2YXRlIFBIWSwgUmVnIDFGIGlzIG5vdCBzZXQgYnkgcmVzZXQgKi8KIAlpb3coZGIsIERNOTAwMF9HUFIsIDApOwkvKiBSRUdfMUYgYml0MCBhY3RpdmF0ZSBwaHl4Y2VyICovCiAJbWRlbGF5KDEpOyAvKiBkZWxheSBuZWVkcyBieSBETTkwMDBCICovCkBAIC0xMTY4LDYgKzExNjUsOSBAQAogCWRtOTAwMF9yZXNldChkYik7CiAJZG05MDAwX2luaXRfZG05MDAwKGRldik7CiAKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRtOTAwMF9pbnRlcnJ1cHQsIGlycWZsYWdzLCBkZXYtPm5hbWUsIGRldikpCisJCXJldHVybiAtRUFHQUlOOworCiAJLyogSW5pdCBkcml2ZXIgdmFyaWFibGUgKi8KIAlkYi0+ZGJ1Z19jbnQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mY2MuYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jCmluZGV4IDdhODRlNDUuLjc1ODNhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJZ290byBvdXRfZXA7CiAKIAlmZXAtPmZjYy5tZW0gPSAodm9pZCBfX2lvbWVtICopY3BtMl9pbW1yOwotCWZwaS0+ZHByYW1fb2Zmc2V0ID0gY3BtX2RwYWxsb2MoMTI4LCA4KTsKKwlmcGktPmRwcmFtX29mZnNldCA9IGNwbV9kcGFsbG9jKDEyOCwgMzIpOwogCWlmIChJU19FUlJfVkFMVUUoZnBpLT5kcHJhbV9vZmZzZXQpKSB7CiAJCXJldCA9IGZwaS0+ZHByYW1fb2Zmc2V0OwogCQlnb3RvIG91dF9mY2NjcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCBmZjYwYjIzLi5kZmE1NWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhCiAgKiBNb2RpZmllcjogU2FuZGVlcCBHb3BhbHBldCA8c2FuZGVlcC5rdW1hckBmcmVlc2NhbGUuY29tPgogICoKLSAqIENvcHlyaWdodCAyMDAyLTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDAyLTIwMDksIDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqIENvcHlyaWdodCAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ3Niw5ICs0NzYsNiBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBpbnQgZnRwX3JxZnByW01BWF9GSUxFUl9JRFggKyAxXTsKLXVuc2lnbmVkIGludCBmdHBfcnFmY3JbTUFYX0ZJTEVSX0lEWCArIDFdOwotCiB2b2lkIGxvY2tfcnhfcXMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKIHsKIAlpbnQgaSA9IDB4MDsKQEAgLTg2OCwyOCArODY1LDI4IEBACiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ0xFIHwgUlFGQ1JfUElEX01BU0sgfCBSUUZDUl9DTVBfRVhBQ1Q7Ci0JZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwotCWZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKKwlwcml2LT5mdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CisJcHJpdi0+ZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ01QX05PTUFUQ0g7Ci0JZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwotCWZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKKwlwcml2LT5mdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CisJcHJpdi0+ZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ01QX0VYQUNUIHwgUlFGQ1JfUElEX1BBUlNFIHwgUlFGQ1JfQ0xFIHwgUlFGQ1JfQU5EOwogCXJxZnByID0gY2xhc3M7Ci0JZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKKwlwcml2LT5mdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ01QX0VYQUNUIHwgUlFGQ1JfUElEX01BU0sgfCBSUUZDUl9BTkQ7CiAJcnFmcHIgPSBjbGFzczsKLQlmdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7Ci0JZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOworCXByaXYtPmZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKKwlwcml2LT5mdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CiAJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBycWZhciwgcnFmY3IsIHJxZnByKTsKIAogCXJldHVybiBycWZhcjsKQEAgLTkwNCw4ICs5MDEsOCBAQAogCiAJLyogRGVmYXVsdCBydWxlICovCiAJcnFmY3IgPSBSUUZDUl9DTVBfTUFUQ0g7Ci0JZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKKwlwcml2LT5mdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhciA9IGNsdXN0ZXJfZW50cnlfcGVyX2NsYXNzKHByaXYsIHJxZmFyLCBSUUZQUl9JUFY2KTsKQEAgLTkyMSw4ICs5MTgsOCBAQAogCS8qIFJlc3QgYXJlIG1hc2tlZCBydWxlcyAqLwogCXJxZmNyID0gUlFGQ1JfQ01QX05PTUFUQ0g7CiAJZm9yIChpID0gMDsgaSA8IHJxZmFyOyBpKyspIHsKLQkJZnRwX3JxZmNyW2ldID0gcnFmY3I7Ci0JCWZ0cF9ycWZwcltpXSA9IHJxZnByOworCQlwcml2LT5mdHBfcnFmY3JbaV0gPSBycWZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW2ldID0gcnFmcHI7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgaSwgcnFmY3IsIHJxZnByKTsKIAl9CiB9CkBAIC0yMjkyLDYgKzIyODksMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogQ2hlY2sgaWYgcnggcGFyc2VyIHNob3VsZCBiZSBhY3RpdmF0ZWQgKi8KK3ZvaWQgZ2Zhcl9jaGVja19yeF9wYXJzZXJfbW9kZShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBnZmFyIF9faW9tZW0gKnJlZ3M7CisJdTMyIHRlbXB2YWw7CisKKwlyZWdzID0gcHJpdi0+Z2ZhcmdycFswXS5yZWdzOworCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+cmN0cmwpOworCS8qIElmIHBhcnNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCwgdGhlbiBkaXNhYmxlIHBhcnNlciAqLworCWlmICh0ZW1wdmFsICYgUkNUUkxfUkVRX1BBUlNFUikKKwkJdGVtcHZhbCB8PSBSQ1RSTF9QUlNERVBfSU5JVDsKKwllbHNlCisJCXRlbXB2YWwgJj0gflJDVFJMX1BSU0RFUF9JTklUOworCWdmYXJfd3JpdGUoJnJlZ3MtPnJjdHJsLCB0ZW1wdmFsKTsKK30KKwogCiAvKiBFbmFibGVzIGFuZCBkaXNhYmxlcyBWTEFOIGluc2VydGlvbi9leHRyYWN0aW9uICovCiBzdGF0aWMgdm9pZCBnZmFyX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTIzMjgsMTIgKzIzNDIsOSBAQAogCQkvKiBEaXNhYmxlIFZMQU4gdGFnIGV4dHJhY3Rpb24gKi8KIAkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+cmN0cmwpOwogCQl0ZW1wdmFsICY9IH5SQ1RSTF9WTEVYOwotCQkvKiBJZiBwYXJzZSBpcyBubyBsb25nZXIgcmVxdWlyZWQsIHRoZW4gZGlzYWJsZSBwYXJzZXIgKi8KLQkJaWYgKHRlbXB2YWwgJiBSQ1RSTF9SRVFfUEFSU0VSKQotCQkJdGVtcHZhbCB8PSBSQ1RSTF9QUlNERVBfSU5JVDsKLQkJZWxzZQotCQkJdGVtcHZhbCAmPSB+UkNUUkxfUFJTREVQX0lOSVQ7CiAJCWdmYXJfd3JpdGUoJnJlZ3MtPnJjdHJsLCB0ZW1wdmFsKTsKKworCQlnZmFyX2NoZWNrX3J4X3BhcnNlcl9tb2RlKHByaXYpOwogCX0KIAogCWdmYXJfY2hhbmdlX210dShkZXYsIGRldi0+bXR1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaCBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAppbmRleCBmYzg2ZjUxLi40NDBlNjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmgKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCkBAIC05LDcgKzksNyBAQAogICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYQogICogTW9kaWZpZXI6IFNhbmRlZXAgR29wYWxwZXQgPHNhbmRlZXAua3VtYXJAZnJlZXNjYWxlLmNvbT4KICAqCi0gKiBDb3B5cmlnaHQgMjAwMi0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA5LCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTI3NCw3ICsyNzQsNyBAQAogI2RlZmluZSBSQ1RSTF9QUk9NCQkweDAwMDAwMDA4CiAjZGVmaW5lIFJDVFJMX0VNRU4JCTB4MDAwMDAwMDIKICNkZWZpbmUgUkNUUkxfUkVRX1BBUlNFUgkoUkNUUkxfVkxFWCB8IFJDVFJMX0lQQ1NFTiB8IFwKLQkJCQkgUkNUUkxfVFVDU0VOKQorCQkJCSBSQ1RSTF9UVUNTRU4gfCBSQ1RSTF9GSUxSRU4pCiAjZGVmaW5lIFJDVFJMX0NIRUNLU1VNTUlORwkoUkNUUkxfSVBDU0VOIHwgUkNUUkxfVFVDU0VOIHwgXAogCQkJCVJDVFJMX1BSU0RFUF9JTklUKQogI2RlZmluZSBSQ1RSTF9FWFRIQVNICQkoUkNUUkxfR0hUWCkKQEAgLTExMDcsMTAgKzExMDcsMTIgQEAKIAkvKiBIVyB0aW1lIHN0YW1waW5nIGVuYWJsZWQgZmxhZyAqLwogCWludCBod3RzX3J4X2VuOwogCWludCBod3RzX3R4X2VuOworCisJLypGaWxlciB0YWJsZSovCisJdW5zaWduZWQgaW50IGZ0cF9ycWZwcltNQVhfRklMRVJfSURYICsgMV07CisJdW5zaWduZWQgaW50IGZ0cF9ycWZjcltNQVhfRklMRVJfSURYICsgMV07CiB9OwogCi1leHRlcm4gdW5zaWduZWQgaW50IGZ0cF9ycWZwcltNQVhfRklMRVJfSURYICsgMV07Ci1leHRlcm4gdW5zaWduZWQgaW50IGZ0cF9ycWZjcltNQVhfRklMRVJfSURYICsgMV07CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdmYXJfaGFzX2VycmF0YShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2LAogCQkJCSAgZW51bSBnZmFyX2VycmF0YSBlcnIpCkBAIC0xMTU0LDYgKzExNTYsNyBAQAogCQl1bnNpZ25lZCBsb25nIHR4X21hc2ssIHVuc2lnbmVkIGxvbmcgcnhfbWFzayk7CiB2b2lkIGdmYXJfaW5pdF9zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBnZmFyX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpOworZXh0ZXJuIHZvaWQgZ2Zhcl9jaGVja19yeF9wYXJzZXJfbW9kZShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBnZmFyX2V0aHRvb2xfb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCmluZGV4IDQ5M2Q3NDMuLjIzOWUzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCkBAIC05LDcgKzksNyBAQAogICogIE1haW50YWluZXI6IEt1bWFyIEdhbGEKICAqICBNb2RpZmllcjogU2FuZGVlcCBHb3BhbHBldCA8c2FuZGVlcC5rdW1hckBmcmVlc2NhbGUuY29tPgogICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA2LCAyMDA4LTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqICBDb3B5cmlnaHQgMjAwMy0yMDA2LCAyMDA4LTIwMDksIDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqCiAgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvCiAgKiAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbgpAQCAtNjA5LDE1ICs2MDksMTUgQEAKIAlpZiAoZXRoZmxvdyAmIFJYSF9MMkRBKSB7CiAJCWZjciA9IFJRRkNSX1BJRF9EQUggfFJRRkNSX0NNUF9OT01BVENIIHwKIAkJCVJRRkNSX0hBU0ggfCBSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAogCQlmY3IgPSBSUUZDUl9QSURfREFMIHwgUlFGQ1JfQU5EIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfAogCQkJCVJRRkNSX0hBU0ggfCBSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02MjYsMTYgKzYyNiwxNiBAQAogCQlmY3IgPSBSUUZDUl9QSURfVklEIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CiAKIAlpZiAoZXRoZmxvdyAmIFJYSF9JUF9TUkMpIHsKIAkJZmNyID0gUlFGQ1JfUElEX1NJQSB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02NDMsOCArNjQzLDggQEAKIAlpZiAoZXRoZmxvdyAmIChSWEhfSVBfRFNUKSkgewogCQlmY3IgPSBSUUZDUl9QSURfRElBIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCVJRRkNSX0FORCB8IFJRRkNSX0hBU0hUQkxfMDsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsIGZjciwgZnByKTsKIAkJcHJpdi0+Y3VyX2ZpbGVyX2lkeCA9IHByaXYtPmN1cl9maWxlcl9pZHggLSAxOwogCX0KQEAgLTY1Miw4ICs2NTIsOCBAQAogCWlmIChldGhmbG93ICYgUlhIX0wzX1BST1RPKSB7CiAJCWZjciA9IFJRRkNSX1BJRF9MNFAgfCBSUUZDUl9DTVBfTk9NQVRDSCB8IFJRRkNSX0hBU0ggfAogCQkJUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAJfQpAQCAtNjYxLDggKzY2MSw4IEBACiAJaWYgKGV0aGZsb3cgJiBSWEhfTDRfQl8wXzEpIHsKIAkJZmNyID0gUlFGQ1JfUElEX1NQVCB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02NzAsOCArNjcwLDggQEAKIAlpZiAoZXRoZmxvdyAmIFJYSF9MNF9CXzJfMykgewogCQlmY3IgPSBSUUZDUl9QSURfRFBUIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCVJRRkNSX0FORCB8IFJRRkNSX0hBU0hUQkxfMDsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsIGZjciwgZnByKTsKIAkJcHJpdi0+Y3VyX2ZpbGVyX2lkeCA9IHByaXYtPmN1cl9maWxlcl9pZHggLSAxOwogCX0KQEAgLTcwNSwxMiArNzA1LDEyIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9GSUxFUl9JRFggKyAxOyBpKyspIHsKLQkJbG9jYWxfcnFmcHJbal0gPSBmdHBfcnFmcHJbaV07Ci0JCWxvY2FsX3JxZmNyW2pdID0gZnRwX3JxZmNyW2ldOworCQlsb2NhbF9ycWZwcltqXSA9IHByaXYtPmZ0cF9ycWZwcltpXTsKKwkJbG9jYWxfcnFmY3Jbal0gPSBwcml2LT5mdHBfcnFmY3JbaV07CiAJCWotLTsKLQkJaWYgKChmdHBfcnFmY3JbaV0gPT0gKFJRRkNSX1BJRF9QQVJTRSB8CisJCWlmICgocHJpdi0+ZnRwX3JxZmNyW2ldID09IChSUUZDUl9QSURfUEFSU0UgfAogCQkJUlFGQ1JfQ0xFIHxSUUZDUl9BTkQpKSAmJgotCQkJKGZ0cF9ycWZwcltpXSA9PSBjbXBfcnFmcHIpKQorCQkJKHByaXYtPmZ0cF9ycWZwcltpXSA9PSBjbXBfcnFmcHIpKQogCQkJYnJlYWs7CiAJfQogCkBAIC03MjQsMjAgKzcyNCwyMiBAQAogCSAqIGlmIGl0IHdhcyBhbHJlYWR5IHByb2dyYW1tZWQsIHdlIG5lZWQgdG8gb3ZlcndyaXRlIHRoZXNlIHJ1bGVzCiAJICovCiAJZm9yIChsID0gaSsxOyBsIDwgTUFYX0ZJTEVSX0lEWDsgbCsrKSB7Ci0JCWlmICgoZnRwX3JxZmNyW2xdICYgUlFGQ1JfQ0xFKSAmJgotCQkJIShmdHBfcnFmY3JbbF0gJiBSUUZDUl9BTkQpKSB7Ci0JCQlmdHBfcnFmY3JbbF0gPSBSUUZDUl9DTEUgfCBSUUZDUl9DTVBfRVhBQ1QgfAorCQlpZiAoKHByaXYtPmZ0cF9ycWZjcltsXSAmIFJRRkNSX0NMRSkgJiYKKwkJCSEocHJpdi0+ZnRwX3JxZmNyW2xdICYgUlFGQ1JfQU5EKSkgeworCQkJcHJpdi0+ZnRwX3JxZmNyW2xdID0gUlFGQ1JfQ0xFIHwgUlFGQ1JfQ01QX0VYQUNUIHwKIAkJCQlSUUZDUl9IQVNIVEJMXzAgfCBSUUZDUl9QSURfTUFTSzsKLQkJCWZ0cF9ycWZwcltsXSA9IEZQUl9GSUxFUl9NQVNLOwotCQkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBsLCBmdHBfcnFmY3JbbF0sIGZ0cF9ycWZwcltsXSk7CisJCQlwcml2LT5mdHBfcnFmcHJbbF0gPSBGUFJfRklMRVJfTUFTSzsKKwkJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgbCwgcHJpdi0+ZnRwX3JxZmNyW2xdLAorCQkJCXByaXYtPmZ0cF9ycWZwcltsXSk7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmICghKGZ0cF9ycWZjcltsXSAmIFJRRkNSX0NMRSkgJiYgKGZ0cF9ycWZjcltsXSAmIFJRRkNSX0FORCkpCisJCWlmICghKHByaXYtPmZ0cF9ycWZjcltsXSAmIFJRRkNSX0NMRSkgJiYKKwkJCShwcml2LT5mdHBfcnFmY3JbbF0gJiBSUUZDUl9BTkQpKQogCQkJY29udGludWU7CiAJCWVsc2UgewotCQkJbG9jYWxfcnFmcHJbal0gPSBmdHBfcnFmcHJbbF07Ci0JCQlsb2NhbF9ycWZjcltqXSA9IGZ0cF9ycWZjcltsXTsKKwkJCWxvY2FsX3JxZnByW2pdID0gcHJpdi0+ZnRwX3JxZnByW2xdOworCQkJbG9jYWxfcnFmY3Jbal0gPSBwcml2LT5mdHBfcnFmY3JbbF07CiAJCQlqLS07CiAJCX0KIAl9CkBAIC03NTAsOCArNzUyLDggQEAKIAogCS8qIFdyaXRlIGJhY2sgdGhlIHBvcHBlZCBvdXQgcnVsZXMgYWdhaW4gKi8KIAlmb3IgKGsgPSBqKzE7IGsgPCBNQVhfRklMRVJfSURYOyBrKyspIHsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gbG9jYWxfcnFmcHJba107Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGxvY2FsX3JxZmNyW2tdOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBsb2NhbF9ycWZwcltrXTsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gbG9jYWxfcnFmY3Jba107CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwKIAkJCQlsb2NhbF9ycWZjcltrXSwgbG9jYWxfcnFmcHJba10pOwogCQlpZiAoIXByaXYtPmN1cl9maWxlcl9pZHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ncmV0aC5jIGIvZHJpdmVycy9uZXQvZ3JldGguYwppbmRleCBmMTgxMzA0Li42NzJmMDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ncmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2dyZXRoLmMKQEAgLTEwMTUsMTEgKzEwMTUsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJR1JFVEhfUkVHU0FWRShyZWdzLT5lc2FfbXNiLCBkZXYtPmRldl9hZGRyWzBdIDw8IDggfCBkZXYtPmRldl9hZGRyWzFdKTsKKwlHUkVUSF9SRUdTQVZFKHJlZ3MtPmVzYV9sc2IsIGRldi0+ZGV2X2FkZHJbMl0gPDwgMjQgfCBkZXYtPmRldl9hZGRyWzNdIDw8IDE2IHwKKwkJICAgICAgZGV2LT5kZXZfYWRkcls0XSA8PCA4IHwgZGV2LT5kZXZfYWRkcls1XSk7CiAKLQlHUkVUSF9SRUdTQVZFKHJlZ3MtPmVzYV9tc2IsIGFkZHItPnNhX2RhdGFbMF0gPDwgOCB8IGFkZHItPnNhX2RhdGFbMV0pOwotCUdSRVRIX1JFR1NBVkUocmVncy0+ZXNhX2xzYiwKLQkJICAgICAgYWRkci0+c2FfZGF0YVsyXSA8PCAyNCB8IGFkZHItPgotCQkgICAgICBzYV9kYXRhWzNdIDw8IDE2IHwgYWRkci0+c2FfZGF0YVs0XSA8PCA4IHwgYWRkci0+c2FfZGF0YVs1XSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCmluZGV4IDk5MjA4OTYuLjBkMjgzNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAgKiBhIGJsb2NrIG9mIDZwYWNrIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCiAgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2l4cGFja19yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorc3RhdGljIHZvaWQgc2l4cGFja19yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBzaXhwYWNrICpzcDsKQEAgLTQ2NCwxMSArNDY0LDExIEBACiAJaW50IGNvdW50MTsKIAogCWlmICghY291bnQpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlzcCA9IHNwX2dldCh0dHkpOwogCWlmICghc3ApCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAKIAltZW1jcHkoYnVmLCBjcCwgY291bnQgPCBzaXplb2YoYnVmKSA/IGNvdW50IDogc2l6ZW9mKGJ1ZikpOwogCkBAIC00ODcsOCArNDg3LDYgQEAKIAogCXNwX3B1dChzcCk7CiAJdHR5X3VudGhyb3R0bGUodHR5KTsKLQotCXJldHVybiBjb3VudDE7CiB9CiAKIC8qCkBAIC02OTQsMTAgKzY5MiwxMCBAQAogewogCXN0cnVjdCBzaXhwYWNrICpzcDsKIAotCXdyaXRlX2xvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwl3cml0ZV9sb2NrX2JoKCZkaXNjX2RhdGFfbG9jayk7CiAJc3AgPSB0dHktPmRpc2NfZGF0YTsKIAl0dHktPmRpc2NfZGF0YSA9IE5VTEw7Ci0Jd3JpdGVfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZkaXNjX2RhdGFfbG9jayk7CiAJaWYgKCFzcCkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYwppbmRleCAwZTRmMjM1Li5iYzAyOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKQEAgLTgxMywxMCArODEzLDEwIEBACiB7CiAJc3RydWN0IG1raXNzICpheDsKIAotCXdyaXRlX2xvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwl3cml0ZV9sb2NrX2JoKCZkaXNjX2RhdGFfbG9jayk7CiAJYXggPSB0dHktPmRpc2NfZGF0YTsKIAl0dHktPmRpc2NfZGF0YSA9IE5VTEw7Ci0Jd3JpdGVfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZkaXNjX2RhdGFfbG9jayk7CiAKIAlpZiAoIWF4KQogCQlyZXR1cm47CkBAIC05MjMsMTQgKzkyMywxMyBAQAogICogYSBibG9jayBvZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAogICogYW5kIHNlbnQgb24gdG8gdGhlIEFYLjI1IGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWtpc3NfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBta2lzc19yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKwljaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBta2lzcyAqYXggPSBta2lzc19nZXQodHR5KTsKLQlpbnQgYnl0ZXMgPSBjb3VudDsKIAogCWlmICghYXgpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm47CiAKIAkvKgogCSAqIEFyZ2ghIG10dSBjaGFuZ2UgdGltZSEgLSBjb3N0cyB1cyB0aGUgcGFja2V0IHBhcnQgcmVjZWl2ZWQKQEAgLTk0MCw3ICs5MzksNyBAQAogCQlheF9jaGFuZ2VkbXR1KGF4KTsKIAogCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KLQl3aGlsZSAoYnl0ZXMtLSkgeworCXdoaWxlIChjb3VudC0tKSB7CiAJCWlmIChmcCAhPSBOVUxMICYmICpmcCsrKSB7CiAJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKSkKIAkJCQlheC0+ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTk1Myw4ICs5NTIsNiBAQAogCiAJbWtpc3NfcHV0KGF4KTsKIAl0dHlfdW50aHJvdHRsZSh0dHkpOwotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggYzUyYTFkZi4uYzNlY2IxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0xODgsMTQgKzE4OCwxNCBAQAogICogIHZhcmlhYmxlcwogICovCiAjaWZkZWYgQ09ORklHX0lTQQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGhwMTAwX2lzYV90YmxbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpocDEwMF9pc2FfdGJsW10gPSB7CiAJIkhXUEYxNTAiLCAvKiBIUCBKMjU3MyByZXYgQSAqLwogCSJIV1AxOTUwIiwgLyogSFAgSjI1NzMgKi8KIH07CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19FSVNBCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGhwMTAwX2Vpc2FfdGJsW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGhwMTAwX2Vpc2FfdGJsW10gPSB7CiAJeyAiSFdQRjE4MCIgfSwgLyogSFAgSjI1NzcgcmV2IEEgKi8KIAl7ICJIV1AxOTIwIiB9LCAvKiBIUCAyNzI0OEIgKi8KIAl7ICJIV1AxOTQwIiB9LCAvKiBIUCBKMjU3NyAqLwpAQCAtMzM2LDcgKzMzNiw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSVNBCi1zdGF0aWMgX19kZXZpbml0IGludCBocDEwMF9pc2FfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCitzdGF0aWMgX19pbml0IGludCBocDEwMF9pc2FfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCiB7CiAJY29uc3QgY2hhciAqc2lnOwogCWludCBpOwpAQCAtMzcyLDcgKzM3Miw3IEBACiAgKiBFSVNBIGFuZCBQQ0kgYXJlIGhhbmRsZWQgYnkgZGV2aWNlIGluZnJhc3RydWN0dXJlLgogICovCiAKLXN0YXRpYyBpbnQgIF9fZGV2aW5pdCBocDEwMF9pc2FfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIpCitzdGF0aWMgaW50ICBfX2luaXQgaHAxMDBfaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyKQogewogCWludCBlcnIgPSAtRU5PREVWOwogCkBAIC0zOTYsNyArMzk2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfSVNBICovCiAKICNpZiAhZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0lTQSkKLXN0cnVjdCBuZXRfZGV2aWNlICogX19kZXZpbml0IGhwMTAwX3Byb2JlKGludCB1bml0KQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgaHAxMDBfcHJvYmUoaW50IHVuaXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSkpOwogCWludCBlcnI7CkBAIC0xNTgwLDEyICsxNTgwLDEyIEBACiAJaHAxMDBfb3V0bChyaW5ncHRyLT5wZGxfcGFkZHIsIFRYX1BEQV9MKTsJLyogTG93IFByaW8uIFF1ZXVlICovCiAKIAlscC0+dHhyY29tbWl0Kys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCiAJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiBkcm9wOgpAQCAtMjg0Myw3ICsyODQzLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19FSVNBCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBocDEwMF9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCitzdGF0aWMgaW50IF9faW5pdCBocDEwMF9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSkpOwogCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlKGdlbmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocGxhbmNlLmMgYi9kcml2ZXJzL25ldC9ocGxhbmNlLmMKaW5kZXggYjYwNjBmNy4uYTkwMGQ1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHBsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiB9CiAKIC8qIEluaXRpYWxpc2UgYSBzaW5nbGUgbGFuY2UgYm9hcmQgYXQgdGhlIGdpdmVuIERJTyBkZXZpY2UgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBocGxhbmNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRpb19kZXYgKmQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaHBsYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkaW9fZGV2ICpkKQogewogICAgICAgICB1bnNpZ25lZCBsb25nIHZhID0gKGQtPnJlc291cmNlLnN0YXJ0ICsgRElPX1ZJUkFERFJCQVNFKTsKICAgICAgICAgc3RydWN0IGhwbGFuY2VfcHJpdmF0ZSAqbHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1sYW5hLmMgYi9kcml2ZXJzL25ldC9pYm1sYW5hLmMKaW5kZXggMTM2ZDc1NC4uYTdkNmNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtbGFuYS5jCisrKyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwpAQCAtODk1LDEyICs4OTUsMTIgQEAKIHN0YXRpYyBpbnQgaWJtbGFuYV9pbzsKIHN0YXRpYyBpbnQgc3RhcnRzbG90OwkJLyogY291bnRzIHRocm91Z2ggc2xvdHMgd2hlbiBwcm9iaW5nIG11bHRpcGxlIGRldmljZXMgKi8KIAotc3RhdGljIGNvbnN0IHNob3J0IGlibWxhbmFfYWRhcHRlcl9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzaG9ydCBpYm1sYW5hX2FkYXB0ZXJfaWRzW10gX19pbml0ZGF0YSA9IHsKIAlJQk1fTEFOQV9JRCwKIAkweDAwMDAKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpYm1sYW5hX2FkYXB0ZXJfbmFtZXNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBjaGFyICppYm1sYW5hX2FkYXB0ZXJfbmFtZXNbXSBfX2RldmluaXRkYXRhID0gewogCSJJQk0gTEFOIEFkYXB0ZXIvQSIsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKaW5kZXggMThmY2NmOS4uMmMyODYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKQEAgLTIzNzMsNiArMjM3Myw5IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfSU9WICovCiAJYWRhcHRlci0+cnNzX3F1ZXVlcyA9IG1pbl90KHUzMiwgSUdCX01BWF9SWF9RVUVVRVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwkvKiBpMzUwIGNhbm5vdCBkbyBSU1MgYW5kIFNSLUlPViBhdCB0aGUgc2FtZSB0aW1lICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9pMzUwICYmIGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQpCisJCWFkYXB0ZXItPnJzc19xdWV1ZXMgPSAxOwogCiAJLyoKIAkgKiBpZiByc3NfcXVldWVzID4gNCBvciB2ZnMgYXJlIGdvaW5nIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHJzc19xdWV1ZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5jCmluZGV4IDAzNTg2MWQuLjMzNTJiMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYwpAQCAtMjE2LDIzICsyMTYsMjMgQEAKICAqIHVzYnNlcmlhbDoJdXJiLWNvbXBsZXRlLWludGVycnVwdCAvIHNvZnRpbnQKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlydHR5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgaXJ0dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KSAKIHsKIAlzdHJ1Y3Qgc2lyX2RldiAqZGV2OwogCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSB0dHktPmRpc2NfZGF0YTsKIAlpbnQJaTsKIAotCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC1FTk9ERVY7KTsKLQlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIC1FSU5WQUw7KTsKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKIAogCWlmICh1bmxpa2VseShjb3VudD09MCkpCQkvKiB5ZXMsIHRoaXMgaGFwcGVucyAqLwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJZGV2ID0gcHJpdi0+ZGV2OwogCWlmICghZGV2KSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgbm90IHJlYWR5IHlldCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewpAQCAtMjQyLDEzICsyNDIsMTEgQEAKICAJCWlmIChmcCAmJiAqZnArKykgeyAKIAkJCUlSREFfREVCVUcoMCwgIkZyYW1pbmcgb3IgcGFyaXR5IGVycm9yIVxuIik7CiAJCQlzaXJkZXZfcmVjZWl2ZShkZXYsIE5VTEwsIDApOwkvKiBub3RpZnkgc2lyX2RldiAodXBkYXRpbmcgc3RhdHMpICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybjsKICAJCX0KIAl9CiAKIAlzaXJkZXZfcmVjZWl2ZShkZXYsIGNwLCBjb3VudCk7Ci0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCmluZGV4IDY5YjU3MDcuLjg4MDBlMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC0yMjIsMTkgKzIyMiwxOSBAQAogc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIAogLyogUHJvYmluZyAqLwotc3RhdGljIGludCBzbXNjX2lyY2NfbG9va19mb3JfY2hpcHModm9pZCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqIHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdTggcmVnLCBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwLCBjaGFyICp0eXBlKTsKLXN0YXRpYyBpbnQgc21zY19zdXBlcmlvX2ZsYXQoY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKLXN0YXRpYyBpbnQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7Ci1zdGF0aWMgaW50IHNtc2Nfc3VwZXJpb19mZGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOwotc3RhdGljIGludCBzbXNjX3N1cGVyaW9fbHBjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcyh2b2lkKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdTggcmVnLCBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mbGF0KGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fcGFnZWQoY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mZGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2xwYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSk7CiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBwcmVjb25maWd1cmVfc21zY19jaGlwKHN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gKmNvbmYpOwotc3RhdGljIGludCBwcmVjb25maWd1cmVfdGhyb3VnaF84MjgwMShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mKTsKLXN0YXRpYyB2b2lkIHByZWNvbmZpZ3VyZV9hbGlfcG9ydChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorc3RhdGljIGludCBfX2luaXQgcHJlY29uZmlndXJlX3Ntc2NfY2hpcChzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mKTsKK3N0YXRpYyBpbnQgX19pbml0IHByZWNvbmZpZ3VyZV90aHJvdWdoXzgyODAxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gKmNvbmYpOworc3RhdGljIHZvaWQgX19pbml0IHByZWNvbmZpZ3VyZV9hbGlfcG9ydChzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCQkgdW5zaWduZWQgc2hvcnQgcG9ydCk7Ci1zdGF0aWMgaW50IHByZWNvbmZpZ3VyZV90aHJvdWdoX2FsaShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uICpjb25mKTsKLXN0YXRpYyBpbnQgc21zY19pcmNjX3ByZWNvbmZpZ3VyZV9zdWJzeXN0ZW1zKHVuc2lnbmVkIHNob3J0IGlyY2NfY2ZnLAorc3RhdGljIGludCBfX2luaXQgcHJlY29uZmlndXJlX3Rocm91Z2hfYWxpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gKmNvbmYpOworc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX3ByZWNvbmZpZ3VyZV9zdWJzeXN0ZW1zKHVuc2lnbmVkIHNob3J0IGlyY2NfY2ZnLAogCQkJCQkJICAgIHVuc2lnbmVkIHNob3J0IGlyY2NfZmlyLAogCQkJCQkJICAgIHVuc2lnbmVkIHNob3J0IGlyY2Nfc2lyLAogCQkJCQkJICAgIHVuc2lnbmVkIGNoYXIgaXJjY19kbWEsCkBAIC0zNjYsNyArMzY2LDcgQEAKIH0KIAogLyogUE5QIGhvdHBsdWcgc3VwcG9ydCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIHNtc2NfaXJjY19wbnBfdGFibGVbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBzbXNjX2lyY2NfcG5wX3RhYmxlW10gPSB7CiAJeyAuaWQgPSAiU01DZjAxMCIsIC5kcml2ZXJfZGF0YSA9IDAgfSwKIAkvKiBhbmQgcHJlc3VtYWJseSBvdGhlcnMgKi8KIAl7IH0KQEAgLTUxNSw3ICs1MTUsNyBAQAogICogICAgVHJ5IHRvIG9wZW4gZHJpdmVyIGluc3RhbmNlCiAgKgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbXNjX2lyY2Nfb3Blbih1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSwgdTggZG1hLCB1OCBpcnEpCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2Nfb3Blbih1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSwgdTggZG1hLCB1OCBpcnEpCiB7CiAJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjI3Myw3ICsyMjczLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbXNjX2FjY2Vzcyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdW5zaWduZWQgY2hhciByZWcpCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2FjY2Vzcyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtMjI4MSw3ICsyMjgxLDcgQEAKIAlyZXR1cm4gaW5iKGNmZ19iYXNlKSAhPSByZWcgPyAtMSA6IDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICogX19kZXZpbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdTggcmVnLCBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwLCBjaGFyICp0eXBlKQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKiBfX2luaXQgc21zY19pcmNjX3Byb2JlKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCB1OCByZWcsIGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXAsIGNoYXIgKnR5cGUpCiB7CiAJdTggZGV2aWQsIHhkZXZpZCwgcmV2OwogCkBAIC0yNDA2LDcgKzI0MDYsNyBAQAogI2lmZGVmIENPTkZJR19QQ0kKICNkZWZpbmUgUENJSURfVkVORE9SX0lOVEVMIDB4ODA4NgogI2RlZmluZSBQQ0lJRF9WRU5ET1JfQUxJIDB4MTBiOQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb25zW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc3RydWN0IHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbiBzdWJzeXN0ZW1fY29uZmlndXJhdGlvbnNbXSBfX2luaXRkYXRhID0gewogCS8qCiAJICogU3Vic3lzdGVtcyBuZWVkaW5nIGVudHJpZXM6CiAJICogMHgxMGI5OjB4MTUzMyAweDEwM2M6MHgwODUwIEhQIG54OTAxMCBmYW1pbHkKQEAgLTI1MzIsNyArMjUzMiw3IEBACiAgKiAoRklSIHBvcnQsIFNJUiBwb3J0LCBGSVIgRE1BLCBGSVIgSVJRKQogICogdGhyb3VnaCB0aGUgY2hpcCBjb25maWd1cmF0aW9uIHBvcnQuCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHByZWNvbmZpZ3VyZV9zbXNjX2NoaXAoc3RydWN0CitzdGF0aWMgaW50IF9faW5pdCBwcmVjb25maWd1cmVfc21zY19jaGlwKHN0cnVjdAogCQkJCQkgc21zY19pcmNjX3N1YnN5c3RlbV9jb25maWd1cmF0aW9uCiAJCQkJCSAqY29uZikKIHsKQEAgLTI2MzMsNyArMjYzMyw3IEBACiAgKiBvciBJbnRlbCA4MjgwMURCL0RCTCAoSUNINC9JQ0g0LUwpIExQQyBJbnRlcmZhY2UgQnJpZGdlLgogICogVGhleSBhbGwgd29yayB0aGUgc2FtZSB3YXkhCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHByZWNvbmZpZ3VyZV90aHJvdWdoXzgyODAxKHN0cnVjdCBwY2lfZGV2ICpkZXYsCitzdGF0aWMgaW50IF9faW5pdCBwcmVjb25maWd1cmVfdGhyb3VnaF84MjgwMShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCQkgICAgIHN0cnVjdAogCQkJCQkgICAgIHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbgogCQkJCQkgICAgICpjb25mKQpAQCAtMjc4Niw3ICsyNzg2LDcgQEAKICAqIFRoaXMgaXMgYmFzZWQgb24gcmV2ZXJzZS1lbmdpbmVlcmluZyBzaW5jZSBBTGkgZG9lcyBub3QKICAqIHByb3ZpZGUgYW55IGRhdGEgc2hlZXQgZm9yIHRoZSAxNTMzIGNoaXAuCiAgKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwcmVjb25maWd1cmVfYWxpX3BvcnQoc3RydWN0IHBjaV9kZXYgKmRldiwKK3N0YXRpYyB2b2lkIF9faW5pdCBwcmVjb25maWd1cmVfYWxpX3BvcnQoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJIHVuc2lnbmVkIHNob3J0IHBvcnQpCiB7CiAJdW5zaWduZWQgY2hhciByZWc7CkBAIC0yODI0LDcgKzI4MjQsNyBAQAogCUlSREFfTUVTU0FHRSgiQWN0aXZhdGVkIEFMaSAxNTMzIElTQSBicmlkZ2UgcG9ydCAweCUwNHguXG4iLCBwb3J0KTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgcHJlY29uZmlndXJlX3Rocm91Z2hfYWxpKHN0cnVjdCBwY2lfZGV2ICpkZXYsCitzdGF0aWMgaW50IF9faW5pdCBwcmVjb25maWd1cmVfdGhyb3VnaF9hbGkoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJICAgc3RydWN0CiAJCQkJCSAgIHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbgogCQkJCQkgICAqY29uZikKQEAgLTI4MzcsNyArMjgzNyw3IEBACiAJcmV0dXJuIHByZWNvbmZpZ3VyZV9zbXNjX2NoaXAoY29uZik7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNtc2NfaXJjY19wcmVjb25maWd1cmVfc3Vic3lzdGVtcyh1bnNpZ25lZCBzaG9ydCBpcmNjX2NmZywKK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19wcmVjb25maWd1cmVfc3Vic3lzdGVtcyh1bnNpZ25lZCBzaG9ydCBpcmNjX2NmZywKIAkJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBpcmNjX2ZpciwKIAkJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBpcmNjX3NpciwKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIGlyY2NfZG1hLApAQCAtMjg0OSw3ICsyODQ5LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7Ci0JCWNvbnN0IHN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gKmNvbmY7CisJCXN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gKmNvbmY7CiAKIAkJLyoKIAkJICogQ2FjaGUgdGhlIHN1YnN5c3RlbSB2ZW5kb3IvZGV2aWNlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQva3M4ODQyLmMgYi9kcml2ZXJzL25ldC9rczg4NDIuYwppbmRleCA0ZDQwNjI2Li5mYzEyYWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9rczg4NDIuYworKysgYi9kcml2ZXJzL25ldC9rczg4NDIuYwpAQCAtNjYxLDcgKzY2MSw3IEBACiAKIAkvKiBjaGVjayB0aGUgc3RhdHVzICovCiAJaWYgKChzdGF0dXMgJiBSWFNSX1ZBTElEKSAmJiAhKHN0YXR1cyAmIFJYU1JfRVJST1IpKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgbGVuKTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0ZGV2LCBsZW4gKyAzKTsKIAogCQlpZiAoc2tiKSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25hdHNlbWkuYyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwppbmRleCBiNzhiZTA4Li42MGY0NmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMKKysrIGIvZHJpdmVycy9uZXQvbmF0c2VtaS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIG1vZHVsZV9wYXJhbShtdHUsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGRzcGNmZ193b3JrYXJvdW5kLCBpbnQsIDEpOworbW9kdWxlX3BhcmFtKGRzcGNmZ193b3JrYXJvdW5kLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG10dSwgIkRQODM4MXggTVRVIChhbGwgYm9hcmRzKSIpOwpAQCAtMjAyOCw4ICsyMDI4LDggQEAKIAkJbnAtPnJ4X3JpbmdbaV0uY21kX3N0YXR1cyA9IDA7CiAJCW5wLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMigweEJBREYwMEQwKTsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLwogCQlpZiAobnAtPnJ4X3NrYnVmZltpXSkgewotCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKLQkJCQlucC0+cnhfZG1hW2ldLCBidWZsZW4sCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfZG1hW2ldLAorCQkJCWJ1ZmxlbiArIE5BVFNFTUlfUEFERElORywKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tidWZmW2ldKTsKIAkJfQpAQCAtMjM2MCw3ICsyMzYwLDggQEAKIAkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCX0gZWxzZSB7CiAJCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnJ4X2RtYVtlbnRyeV0sCi0JCQkJCWJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJCSBidWZsZW4gKyBOQVRTRU1JX1BBRERJTkcsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCQlza2JfcHV0KHNrYiA9IG5wLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKIAkJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTMyMTAuYyBiL2RyaXZlcnMvbmV0L25lMzIxMC5jCmluZGV4IGU4OTg0YjBjLi4yNDNlZDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTMyMTAuYworKysgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwpAQCAtODAsMjAgKzgwLDE3IEBACiAKICNkZWZpbmUgTkUzMjEwX0RFQlVHCTB4MAogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpcnFfbWFwW10gX19kZXZpbml0Y29uc3QgPQotCXsgMTUsIDEyLCAxMSwgMTAsIDksIDcsIDUsIDMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2htZW1fbWFwW10gX19kZXZpbml0Y29uc3QgPQotCXsgMHhmZjAsIDB4ZmUwLCAweGZmZjAsIDB4ZDgsIDB4ZmZlMCwgMHhmZmMwLCAweGQwLCAweDAgfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpZm1hcFtdIF9fZGV2aW5pdGNvbnN0ID0KLQl7ICJVVFAiLCAiPyIsICJCTkMiLCAiQVVJIiB9Owotc3RhdGljIGNvbnN0IGludCBpZm1hcF92YWxbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlycV9tYXBbXSBfX2luaXRkYXRhID0gezE1LCAxMiwgMTEsIDEwLCA5LCA3LCA1LCAzfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2htZW1fbWFwW10gX19pbml0ZGF0YSA9IHsweGZmMCwgMHhmZTAsIDB4ZmZmMCwgMHhkOCwgMHhmZmUwLCAweGZmYzAsIDB4ZDAsIDB4MH07CitzdGF0aWMgY29uc3QgY2hhciAqaWZtYXBbXSBfX2luaXRkYXRhID0geyJVVFAiLCAiPyIsICJCTkMiLCAiQVVJIn07CitzdGF0aWMgaW50IGlmbWFwX3ZhbFtdIF9faW5pdGRhdGEgPSB7CiAJCUlGX1BPUlRfMTBCQVNFVCwKIAkJSUZfUE9SVF9VTktOT1dOLAogCQlJRl9QT1JUXzEwQkFTRTIsCiAJCUlGX1BPUlRfQVVJLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgbmUzMjEwX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19pbml0IG5lMzIxMF9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIsIHBoeXNfbWVtOwogCWludCBpLCByZXR2YWwsIHBvcnRfaW5kZXg7CkBAIC0zMTYsNyArMzEzLDcgQEAKIAltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgbmUzMjEwX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBuZTMyMTBfaWRzW10gPSB7CiAJeyAiRUdMMDEwMSIgfSwKIAl7ICJOVkwxODAxIiB9LAogCXsgIiIgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwppbmRleCBiNjQ0MzgzLi5jMDc4OGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC0xOTY1LDExICsxOTY1LDExIEBACiAKIAluZXR4ZW5fdHNvX2NoZWNrKG5ldGRldiwgdHhfcmluZywgZmlyc3RfZGVzYywgc2tiKTsKIAotCW5ldHhlbl9uaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihhZGFwdGVyLCB0eF9yaW5nKTsKLQogCWFkYXB0ZXItPnN0YXRzLnR4Ynl0ZXMgKz0gc2tiLT5sZW47CiAJYWRhcHRlci0+c3RhdHMueG1pdGNhbGxlZCsrOwogCisJbmV0eGVuX25pY191cGRhdGVfY21kX3Byb2R1Y2VyKGFkYXB0ZXIsIHR4X3JpbmcpOworCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZHJvcF9wYWNrZXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCmluZGV4IDM5MmE2YzQuLmE3MDI0NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCkBAIC01OCw2ICs1OCw3IEBACiAKIGNvbmZpZyBCQ002M1hYX1BIWQogCXRyaXN0YXRlICJEcml2ZXJzIGZvciBCcm9hZGNvbSA2M3h4IFNPQ3MgaW50ZXJuYWwgUEhZIgorCWRlcGVuZHMgb24gQkNNNjNYWAogCS0tLWhlbHAtLS0KIAkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgNjM0OCBhbmQgNjM1OCBQSFlzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jIGIvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYwppbmRleCBiMGM5NTIyLi4yY2Q4ZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9kcDgzNjQwLmMKQEAgLTU0MywxMSArNTQzLDIwIEBACiAKIC8qIHRpbWUgc3RhbXBpbmcgbWV0aG9kcyAqLwogCi1zdGF0aWMgdm9pZCBkZWNvZGVfZXZudChzdHJ1Y3QgZHA4MzY0MF9wcml2YXRlICpkcDgzNjQwLAotCQkJc3RydWN0IHBoeV90eHRzICpwaHlfdHh0cywgdTE2IGVzdHMpCitzdGF0aWMgaW50IGRlY29kZV9ldm50KHN0cnVjdCBkcDgzNjQwX3ByaXZhdGUgKmRwODM2NDAsCisJCSAgICAgICB2b2lkICpkYXRhLCB1MTYgZXN0cykKIHsKKwlzdHJ1Y3QgcGh5X3R4dHMgKnBoeV90eHRzOwogCXN0cnVjdCBwdHBfY2xvY2tfZXZlbnQgZXZlbnQ7CiAJaW50IHdvcmRzID0gKGVzdHMgPj4gRVZOVF9UU19MRU5fU0hJRlQpICYgRVZOVF9UU19MRU5fTUFTSzsKKwl1MTYgZXh0X3N0YXR1cyA9IDA7CisKKwlpZiAoZXN0cyAmIE1VTFRfRVZOVCkgeworCQlleHRfc3RhdHVzID0gKih1MTYgKikgZGF0YTsKKwkJZGF0YSArPSBzaXplb2YoZXh0X3N0YXR1cyk7CisJfQorCisJcGh5X3R4dHMgPSBkYXRhOwogCiAJc3dpdGNoICh3b3JkcykgeyAvKiBmYWxsIHRocm91Z2ggaW4gZXZlcnkgY2FzZSAqLwogCWNhc2UgMzoKQEAgLTU2NSw2ICs1NzQsOSBAQAogCWV2ZW50LnRpbWVzdGFtcCA9IHBoeTJ0eHRzKCZkcDgzNjQwLT5lZGF0YSk7CiAKIAlwdHBfY2xvY2tfZXZlbnQoZHA4MzY0MC0+Y2xvY2stPnB0cF9jbG9jaywgJmV2ZW50KTsKKworCXdvcmRzID0gZXh0X3N0YXR1cyA/IHdvcmRzICsgMiA6IHdvcmRzICsgMTsKKwlyZXR1cm4gd29yZHMgKiBzaXplb2YodTE2KTsKIH0KIAogc3RhdGljIHZvaWQgZGVjb2RlX3J4dHMoc3RydWN0IGRwODM2NDBfcHJpdmF0ZSAqZHA4MzY0MCwKQEAgLTY0Myw5ICs2NTUsNyBAQAogCiAJCX0gZWxzZSBpZiAoUFNGX0VWTlQgPT0gdHlwZSAmJiBsZW4gPj0gc2l6ZW9mKCpwaHlfdHh0cykpIHsKIAotCQkJcGh5X3R4dHMgPSAoc3RydWN0IHBoeV90eHRzICopIHB0cjsKLQkJCWRlY29kZV9ldm50KGRwODM2NDAsIHBoeV90eHRzLCBlc3RzKTsKLQkJCXNpemUgPSBzaXplb2YoKnBoeV90eHRzKTsKKwkJCXNpemUgPSBkZWNvZGVfZXZudChkcDgzNjQwLCBwdHIsIGVzdHMpOwogCiAJCX0gZWxzZSB7CiAJCQlzaXplID0gMDsKQEAgLTEwMzQsOCArMTA0NCw4IEBACiAKIAlpZiAoaXNfc3RhdHVzX2ZyYW1lKHNrYiwgdHlwZSkpIHsKIAkJZGVjb2RlX3N0YXR1c19mcmFtZShkcDgzNjQwLCBza2IpOwotCQkvKiBMZXQgdGhlIHN0YWNrIGRyb3AgdGhpcyBmcmFtZS4gKi8KLQkJcmV0dXJuIGZhbHNlOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJU0tCX1BUUF9UWVBFKHNrYikgPSB0eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwppbmRleCA1Mzg3MmQ3Li5jNTU0YTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiB9CiAKIC8qIE1heSBzbGVlcCwgZG9uJ3QgY2FsbCBmcm9tIGludGVycnVwdCBsZXZlbCBvciB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKK3N0YXRpYyB2b2lkCiBwcHBfYXN5bmN0dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCSAgY2hhciAqY2ZsYWdzLCBpbnQgY291bnQpCiB7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFhcCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwogCXBwcF9hc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CkBAIC0zNTYsOCArMzU2LDYgQEAKIAkJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CiAJYXBfcHV0KGFwKTsKIAl0dHlfdW50aHJvdHRsZSh0dHkpOwotCi0JcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTI1LDcgKzUyMyw3IEBACiAjZGVmaW5lIFBVVF9CWVRFKGFwLCBidWYsIGMsIGlzbGNwKQlkbyB7CQlcCiAJaWYgKChpc2xjcCAmJiBjIDwgMHgyMCkgfHwgKGFwLT54YWNjbVtjID4+IDVdICYgKDEgPDwgKGMgJiAweDFmKSkpKSB7XAogCQkqYnVmKysgPSBQUFBfRVNDQVBFOwkJCVwKLQkJKmJ1ZisrID0gYyBeIDB4MjA7CQkJXAorCQkqYnVmKysgPSBjIF4gUFBQX1RSQU5TOwkJCVwKIAl9IGVsc2UJCQkJCQlcCiAJCSpidWYrKyA9IGM7CQkJCVwKIH0gd2hpbGUgKDApCkBAIC04OTgsNyArODk2LDcgQEAKIAkJCQlzcCA9IHNrYl9wdXQoc2tiLCBuKTsKIAkJCQltZW1jcHkoc3AsIGJ1Ziwgbik7CiAJCQkJaWYgKGFwLT5zdGF0ZSAmIFNDX0VTQ0FQRSkgewotCQkJCQlzcFswXSBePSAweDIwOworCQkJCQlzcFswXSBePSBQUFBfVFJBTlM7CiAJCQkJCWFwLT5zdGF0ZSAmPSB+U0NfRVNDQVBFOwogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMgYi9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jCmluZGV4IDMxZTk0MDcuLjFkYmRmODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAKIAlpZiAoc3RhdGUpIHsKIAkJemxpYl9pbmZsYXRlRW5kKCZzdGF0ZS0+c3RybSk7Ci0JCWtmcmVlKHN0YXRlLT5zdHJtLndvcmtzcGFjZSk7CisJCXZmcmVlKHN0YXRlLT5zdHJtLndvcmtzcGFjZSk7CiAJCWtmcmVlKHN0YXRlKTsKIAl9CiB9CkBAIC0zNDUsOCArMzQ1LDcgQEAKIAogCXN0YXRlLT53X3NpemUgICAgICAgICA9IHdfc2l6ZTsKIAlzdGF0ZS0+c3RybS5uZXh0X291dCAgPSBOVUxMOwotCXN0YXRlLT5zdHJtLndvcmtzcGFjZSA9IGttYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKLQkJCQkJR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCXN0YXRlLT5zdHJtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CiAJaWYgKHN0YXRlLT5zdHJtLndvcmtzcGFjZSA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jIGIvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYwppbmRleCAwODE1NzkwLi4yNTczZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTM4MSw3ICszODEsNyBAQAogfQogCiAvKiBNYXkgc2xlZXAsIGRvbid0IGNhbGwgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwgb3Igd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50CitzdGF0aWMgdm9pZAogcHBwX3N5bmNfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCSAgY2hhciAqY2ZsYWdzLCBpbnQgY291bnQpCiB7CkBAIC0zODksNyArMzg5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFhcCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwogCXBwcF9zeW5jX2lucHV0KGFwLCBidWYsIGNmbGFncywgY291bnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKQEAgLTM5Nyw4ICszOTcsNiBAQAogCQl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKIAlzcF9wdXQoYXApOwogCXR0eV91bnRocm90dGxlKHR0eSk7Ci0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBvZS5jIGIvZHJpdmVycy9uZXQvcHBwb2UuYwppbmRleCA3MTg4NzliLi5iYzlhNGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBvZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKQEAgLTM0OCw4ICszNDgsOSBAQAogCiAJLyogT25seSBsb29rIGF0IHNvY2tldHMgdGhhdCBhcmUgdXNpbmcgdGhpcyBzcGVjaWZpYyBkZXZpY2UuICovCiAJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6CiAJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgotCQkvKiBBIGNoYW5nZSBpbiBtdHUgaXMgYSBiYWQgdGhpbmcsIHJlcXVpcmluZworCQkvKiBBIGNoYW5nZSBpbiBtdHUgb3IgYWRkcmVzcyBpcyBhIGJhZCB0aGluZywgcmVxdWlyaW5nCiAJCSAqIExDUCByZS1uZWdvdGlhdGlvbi4KIAkJICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3B4YTE2OF9ldGguYyBiL2RyaXZlcnMvbmV0L3B4YTE2OF9ldGguYwppbmRleCA4OWY3NTQwLi41ZjU5N2NhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3B4YTE2OF9ldGguYwpAQCAtMTI3Myw3ICsxMjczLDcgQEAKIAl3bWIoKTsKIAl3cmwocGVwLCBTRE1BX0NNRCwgU0RNQV9DTURfVFhESCB8IFNETUFfQ01EX0VSRCk7CiAKLQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJc3RhdHMtPnR4X2J5dGVzICs9IGxlbmd0aDsKIAlzdGF0cy0+dHhfcGFja2V0cysrOwogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCWlmIChwZXAtPnR4X3Jpbmdfc2l6ZSAtIHBlcC0+dHhfZGVzY19jb3VudCA8PSAxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2h3LmMgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2h3LmMKaW5kZXggZTk2NTY2MS4uYTVkOWZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19ody5jCisrKyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaHcuYwpAQCAtMTQwNiw2ICsxNDA2LDcgQEAKIAogCWZvciAobG9vcCA9IDA7IGxvb3AgPCBxdWUtPm5vX29wczsgbG9vcCsrKSB7CiAJCVFMQ05JQ19XUl9EVU1QX1JFRyhxdWUtPnNlbF9hZGRyLCBiYXNlLCBxdWVfaWQpOworCQlhZGRyID0gcXVlLT5yZWFkX2FkZHI7CiAJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewogCQkJUUxDTklDX1JEX0RVTVBfUkVHKGFkZHIsIGJhc2UsICZkYXRhKTsKIAkJCSpidWZmZXIrKyA9IGNwdV90b19sZTMyKGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX21haW4uYwppbmRleCAzYWI3ZDJjLi4wZjZhZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX21haW4uYwpAQCAtMjE1OSw2ICsyMTU5LDcgQEAKIAogCW5mID0gJnBidWYtPmZyYWdfYXJyYXlbMF07CiAJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBuZi0+ZG1hLCBza2JfaGVhZGxlbihza2IpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwYnVmLT5za2IgPSBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKaW5kZXggZDMyODUwNy4uY2EzMDZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKQEAgLTE2LDcgKzE2LDcgQEAKICAqLwogI2RlZmluZSBEUlZfTkFNRSAgCSJxbGdlIgogI2RlZmluZSBEUlZfU1RSSU5HIAkiUUxvZ2ljIDEwIEdpZ2FiaXQgUENJLUUgRXRoZXJuZXQgRHJpdmVyICIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JInYxLjAwLjAwLjI3LjAwLjAwLTAxIgorI2RlZmluZSBEUlZfVkVSU0lPTgkidjEuMDAuMDAuMjkuMDAuMDAtMDEiCiAKICNkZWZpbmUgV1FfQUREUl9BTElHTgkweDMJLyogNCBieXRlIGFsaWdubWVudCAqLwogCkBAIC0xOTk2LDYgKzE5OTYsNyBAQAogCVFMX0xCX0xJTktfVVAgPSAxMCwKIAlRTF9GUkNfQ09SRURVTVAgPSAxMSwKIAlRTF9FRUhfRkFUQUwgPSAxMiwKKwlRTF9BU0lDX1JFQ09WRVJZID0gMTQsIC8qIFdlIGFyZSBpbiBhc2NpYyByZWNvdmVyeS4gKi8KIH07CiAKIC8qIGxpbmtfc3RhdHVzIGJpdCBkZWZpbml0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKaW5kZXggOTMwYWU0NS4uNmI0ZmY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCkBAIC0yMTUyLDYgKzIxNTIsMTAgQEAKIAkgKiB0aHJlYWQKIAkgKi8KIAljbGVhcl9iaXQoUUxfQURBUFRFUl9VUCwgJnFkZXYtPmZsYWdzKTsKKwkvKiBTZXQgYXNpYyByZWNvdmVyeSBiaXQgdG8gaW5kaWNhdGUgcmVzZXQgcHJvY2VzcyB0aGF0IHdlIGFyZQorCSAqIGluIGZhdGFsIGVycm9yIHJlY292ZXJ5IHByb2Nlc3MgcmF0aGVyIHRoYW4gbm9ybWFsIGNsb3NlCisJICovCisJc2V0X2JpdChRTF9BU0lDX1JFQ09WRVJZLCAmcWRldi0+ZmxhZ3MpOwogCXF1ZXVlX2RlbGF5ZWRfd29yayhxZGV2LT53b3JrcXVldWUsICZxZGV2LT5hc2ljX3Jlc2V0X3dvcmssIDApOwogfQogCkBAIC0yMTY2LDIzICsyMTcwLDIwIEBACiAJCXJldHVybjsKIAogCWNhc2UgQ0FNX0xPT0tVUF9FUlJfRVZFTlQ6Ci0JCW5ldGlmX2VycihxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LAotCQkJICAiTXVsdGlwbGUgQ0FNIGhpdHMgbG9va3VwIG9jY3VycmVkLlxuIik7Ci0JCW5ldGlmX2VycihxZGV2LCBkcnYsIHFkZXYtPm5kZXYsCi0JCQkgICJUaGlzIGV2ZW50IHNob3VsZG4ndCBvY2N1ci5cbiIpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJNdWx0aXBsZSBDQU0gaGl0cyBsb29rdXAgb2NjdXJyZWQuXG4iKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiVGhpcyBldmVudCBzaG91bGRuJ3Qgb2NjdXIuXG4iKTsKIAkJcWxfcXVldWVfYXNpY19lcnJvcihxZGV2KTsKIAkJcmV0dXJuOwogCiAJY2FzZSBTT0ZUX0VDQ19FUlJPUl9FVkVOVDoKLQkJbmV0aWZfZXJyKHFkZXYsIHJ4X2VyciwgcWRldi0+bmRldiwKLQkJCSAgIlNvZnQgRUNDIGVycm9yIGRldGVjdGVkLlxuIik7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIlNvZnQgRUNDIGVycm9yIGRldGVjdGVkLlxuIik7CiAJCXFsX3F1ZXVlX2FzaWNfZXJyb3IocWRldik7CiAJCWJyZWFrOwogCiAJY2FzZSBQQ0lfRVJSX0FOT05fQlVGX1JEOgotCQluZXRpZl9lcnIocWRldiwgcnhfZXJyLCBxZGV2LT5uZGV2LAotCQkJICAiUENJIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhbm9ueW1vdXMgYnVmZmVycyBmcm9tIHJ4X3JpbmcgJWQuXG4iLAotCQkJICBpYl9hZV9yc3AtPnFfaWQpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJQQ0kgZXJyb3Igb2NjdXJyZWQgd2hlbiByZWFkaW5nICIKKwkJCQkJImFub255bW91cyBidWZmZXJzIGZyb20gcnhfcmluZyAlZC5cbiIsCisJCQkJCWliX2FlX3JzcC0+cV9pZCk7CiAJCXFsX3F1ZXVlX2FzaWNfZXJyb3IocWRldik7CiAJCWJyZWFrOwogCkBAIC0yNDM3LDExICsyNDM4LDEwIEBACiAJICovCiAJaWYgKHZhciAmIFNUU19GRSkgewogCQlxbF9xdWV1ZV9hc2ljX2Vycm9yKHFkZXYpOwotCQluZXRpZl9lcnIocWRldiwgaW50ciwgcWRldi0+bmRldiwKLQkJCSAgIkdvdCBmYXRhbCBlcnJvciwgU1RTID0gJXguXG4iLCB2YXIpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJHb3QgZmF0YWwgZXJyb3IsIFNUUyA9ICV4LlxuIiwgdmFyKTsKIAkJdmFyID0gcWxfcmVhZDMyKHFkZXYsIEVSUl9TVFMpOwotCQluZXRpZl9lcnIocWRldiwgaW50ciwgcWRldi0+bmRldiwKLQkJCSAgIlJlc2V0dGluZyBjaGlwLiBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgPSAweCV4XG4iLCB2YXIpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJSZXNldHRpbmcgY2hpcC4gIgorCQkJCQkiRXJyb3IgU3RhdHVzIFJlZ2lzdGVyID0gMHgleFxuIiwgdmFyKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtMzgxOCwxMSArMzgxOCwxNyBAQAogCWVuZF9qaWZmaWVzID0gamlmZmllcyArCiAJCW1heCgodW5zaWduZWQgbG9uZykxLCB1c2Vjc190b19qaWZmaWVzKDMwKSk7CiAKLQkvKiBTdG9wIG1hbmFnZW1lbnQgdHJhZmZpYy4gKi8KLQlxbF9tYl9zZXRfbWdtbnRfdHJhZmZpY19jdGwocWRldiwgTUJfU0VUX01QSV9URktfU1RPUCk7CisJLyogQ2hlY2sgaWYgYml0IGlzIHNldCB0aGVuIHNraXAgdGhlIG1haWxib3ggY29tbWFuZCBhbmQKKwkgKiBjbGVhciB0aGUgYml0LCBlbHNlIHdlIGFyZSBpbiBub3JtYWwgcmVzZXQgcHJvY2Vzcy4KKwkgKi8KKwlpZiAoIXRlc3RfYml0KFFMX0FTSUNfUkVDT1ZFUlksICZxZGV2LT5mbGFncykpIHsKKwkJLyogU3RvcCBtYW5hZ2VtZW50IHRyYWZmaWMuICovCisJCXFsX21iX3NldF9tZ21udF90cmFmZmljX2N0bChxZGV2LCBNQl9TRVRfTVBJX1RGS19TVE9QKTsKIAotCS8qIFdhaXQgZm9yIHRoZSBOSUMgYW5kIE1HTU5UIEZJRk9zIHRvIGVtcHR5LiAqLwotCXFsX3dhaXRfZmlmb19lbXB0eShxZGV2KTsKKwkJLyogV2FpdCBmb3IgdGhlIE5JQyBhbmQgTUdNTlQgRklGT3MgdG8gZW1wdHkuICovCisJCXFsX3dhaXRfZmlmb19lbXB0eShxZGV2KTsKKwl9IGVsc2UKKwkJY2xlYXJfYml0KFFMX0FTSUNfUkVDT1ZFUlksICZxZGV2LT5mbGFncyk7CiAKIAlxbF93cml0ZTMyKHFkZXYsIFJTVF9GTywgKFJTVF9GT19GUiA8PCAxNikgfCBSU1RfRk9fRlIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yNjA0MC5jIGIvZHJpdmVycy9uZXQvcjYwNDAuYwppbmRleCAyMDBhMzYzLi4wZmZlYzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yNjA0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKQEAgLTY3Nyw5ICs2NzcsMTEgQEAKIAkJaWYgKHN0YXR1cyAmIFJYX0ZJRk9fRlVMTCkKIAkJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAotCQkvKiBNYXNrIG9mZiBSWCBpbnRlcnJ1cHQgKi8KLQkJbWlzciAmPSB+UlhfSU5UUzsKLQkJbmFwaV9zY2hlZHVsZSgmbHAtPm5hcGkpOworCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmbHAtPm5hcGkpKSkgeworCQkJLyogTWFzayBvZmYgUlggaW50ZXJydXB0ICovCisJCQltaXNyICY9IH5SWF9JTlRTOworCQkJX19uYXBpX3NjaGVkdWxlKCZscC0+bmFwaSk7CisJCX0KIAl9CiAKIAkvKiBUWCBpbnRlcnJ1cHQgcmVxdWVzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKaW5kZXggZWYxY2UyZS4uNTk5MDYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjgxNjkuYworKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC03NDIsNyArNzQyLDcgQEAKIAltc2xlZXAoMik7CiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQl1ZGVsYXkoMTAwKTsKLQkJaWYgKCEoUlRMX1IzMihFUklEUikgJiBFUklBUl9GTEFHKSkKKwkJaWYgKCEoUlRMX1IzMihFUklBUikgJiBFUklBUl9GTEFHKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtMTYyMSw3ICsxNjIxLDcgQEAKIAkgKgogCSAqIChSVExfUjMyKFR4Q29uZmlnKSAmIDB4NzAwMDAwKSA9PSAweDIwMDAwMCA/IDgxMDFFYiA6IDgxMDFFYwogCSAqLwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX21hY19pbmZvIHsKIAkJdTMyIG1hc2s7CiAJCXUzMiB2YWw7CiAJCWludCBtYWNfdmVyc2lvbjsKQEAgLTE2ODksNyArMTY4OSw4IEBACiAKIAkJLyogQ2F0Y2gtYWxsICovCiAJCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwJUlRMX0dJR0FfTUFDX05PTkUgICB9Ci0JfSwgKnAgPSBtYWNfaW5mbzsKKwl9OworCWNvbnN0IHN0cnVjdCBydGxfbWFjX2luZm8gKnAgPSBtYWNfaW5mbzsKIAl1MzIgcmVnOwogCiAJcmVnID0gUlRMX1IzMihUeENvbmZpZyk7CkBAIC0zNjgxLDcgKzM2ODIsNyBAQAogCiBzdGF0aWMgdm9pZCBydGw4MTY5X3NldF9tYWdpY19yZWcodm9pZCBfX2lvbWVtICppb2FkZHIsIHVuc2lnbmVkIG1hY192ZXJzaW9uKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2NmZzJfaW5mbyB7CiAJCXUzMiBtYWNfdmVyc2lvbjsKIAkJdTMyIGNsazsKIAkJdTMyIHZhbDsKQEAgLTM2OTAsNyArMzY5MSw4IEBACiAJCXsgUlRMX0dJR0FfTUFDX1ZFUl8wNSwgUENJX0Nsb2NrXzY2TUh6LCAweDAwMGZmZmZmIH0sCiAJCXsgUlRMX0dJR0FfTUFDX1ZFUl8wNiwgUENJX0Nsb2NrXzMzTUh6LCAweDAwZmZmZjAwIH0sIC8vIDgxMTBTQ2UKIAkJeyBSVExfR0lHQV9NQUNfVkVSXzA2LCBQQ0lfQ2xvY2tfNjZNSHosIDB4MDBmZmZmZmYgfQotCX0sICpwID0gY2ZnMl9pbmZvOworCX07CisJY29uc3Qgc3RydWN0IHJ0bF9jZmcyX2luZm8gKnAgPSBjZmcyX2luZm87CiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIGNsazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcmlvbmV0LmMgYi9kcml2ZXJzL25ldC9yaW9uZXQuYwppbmRleCA3N2M1MDkyLi41ZDM0MzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yaW9uZXQuYworKysgYi9kcml2ZXJzL25ldC9yaW9uZXQuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiAKIHN0YXRpYyB2b2lkIHJpb25ldF9yZW1vdmUoc3RydWN0IHJpb19kZXYgKnJkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcmlvX2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCByaW9uZXRfcGVlciAqcGVlciwgKnRtcDsKIAogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcmlvbmV0X2FjdGl2ZSwgcmRldi0+bmV0LT5ocG9ydC0+c3lzX3NpemUgPwpAQCAtNDMzLDIyICs0MzMsMTIgQEAKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKIH07CiAKLXN0YXRpYyBpbnQgcmlvbmV0X3NldHVwX25ldGRldihzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCkKK3N0YXRpYyBpbnQgcmlvbmV0X3NldHVwX25ldGRldihzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CiAJc3RydWN0IHJpb25ldF9wcml2YXRlICpybmV0OwogCXUxNiBkZXZpY2VfaWQ7CiAKLQkvKiBBbGxvY2F0ZSBvdXIgbmV0X2RldmljZSBzdHJ1Y3R1cmUgKi8KLQluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByaW9uZXRfcHJpdmF0ZSkpOwotCWlmIChuZGV2ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2UuXG4iLAotCQkgICAgICAgRFJWX05BTUUpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQogCXJpb25ldF9hY3RpdmUgPSAoc3RydWN0IHJpb19kZXYgKiopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAogCQkJbXBvcnQtPnN5c19zaXplID8gX19mbHMoc2l6ZW9mKHZvaWQgKikpICsgNCA6IDApOwogCWlmICghcmlvbmV0X2FjdGl2ZSkgewpAQCAtNTA0LDExICs0OTQsMjEgQEAKIAlpbnQgcmMgPSAtRU5PREVWOwogCXUzMiBscGVmLCBsc3JjX29wcywgbGRzdF9vcHM7CiAJc3RydWN0IHJpb25ldF9wZWVyICpwZWVyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gTlVMTDsKIAogCS8qIElmIGxvY2FsIGRldmljZSBpcyBub3QgcmlvbmV0IGNhcGFibGUsIGdpdmUgdXAgcXVpY2tseSAqLwogCWlmICghcmlvbmV0X2NhcGFibGUpCiAJCWdvdG8gb3V0OwogCisJLyogQWxsb2NhdGUgb3VyIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcmlvbmV0X3ByaXZhdGUpKTsKKwlpZiAobmRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgZXRoZXJuZXQgZGV2aWNlLlxuIiwKKwkJICAgICAgIERSVl9OQU1FKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKIAkvKgogCSAqIEZpcnN0IHRpbWUgdGhyb3VnaCwgbWFrZSBzdXJlIGxvY2FsIGRldmljZSBpcyByaW9uZXQKIAkgKiBjYXBhYmxlLCBzZXR1cCBuZXRkZXYsICBhbmQgc2V0IGZsYWdzIHNvIHRoaXMgaXMgc2tpcHBlZApAQCAtNTI5LDcgKzUyOSw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJjID0gcmlvbmV0X3NldHVwX25ldGRldihyZGV2LT5uZXQtPmhwb3J0KTsKKwkJcmMgPSByaW9uZXRfc2V0dXBfbmV0ZGV2KHJkZXYtPm5ldC0+aHBvcnQsIG5kZXYpOwogCQlyaW9uZXRfY2hlY2sgPSAxOwogCX0KIApAQCAtNTQ2LDYgKzU0Niw4IEBACiAJCWxpc3RfYWRkX3RhaWwoJnBlZXItPm5vZGUsICZyaW9uZXRfcGVlcnMpOwogCX0KIAorCXJpb19zZXRfZHJ2ZGF0YShyZGV2LCBuZGV2KTsKKwogICAgICAgb3V0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NoX2V0aC5jIGIvZHJpdmVycy9uZXQvc2hfZXRoLmMKaW5kZXggOGE3MmE5Ny4uMWYzZjdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2hfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvc2hfZXRoLmMKQEAgLTE0MCw2ICsxNDAsOCBAQAogCS50cGF1c2VyCT0gMSwKIAkuaHdfc3dhcAk9IDEsCiAJLm5vX2FkZQkJPSAxLAorCS5ycGFkaXIJCT0gMSwKKwkucnBhZGlyX3ZhbHVlICAgPSAyIDw8IDE2LAogfTsKIAogI2RlZmluZSBTSF9HSUdBX0VUSF9CQVNFCTB4ZmVlMDAwMDAKQEAgLTExODQsOCArMTE4Niw4IEBACiAJCQkJbWRwLT5jZC0+c2V0X3JhdGUobmRldik7CiAJCX0KIAkJaWYgKG1kcC0+bGluayA9PSBQSFlfRE9XTikgewotCQkJc2hfZXRoX3dyaXRlKG5kZXYsIChzaF9ldGhfcmVhZChuZGV2LCBFQ01SKSAmIH5FQ01SX1RYRikKLQkJCQkJfCBFQ01SX0RNLCBFQ01SKTsKKwkJCXNoX2V0aF93cml0ZShuZGV2LAorCQkJCShzaF9ldGhfcmVhZChuZGV2LCBFQ01SKSAmIH5FQ01SX1RYRiksIEVDTVIpOwogCQkJbmV3X3N0YXRlID0gMTsKIAkJCW1kcC0+bGluayA9IHBoeWRldi0+bGluazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCmluZGV4IDU4NDgwOWMuLjJmMTEwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NsaXAuYworKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTE4MiwxMSArMTgyLDExIEBACiAjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAogCWNidWZmID0geGNoZygmc2wtPmNidWZmLCBjYnVmZik7CiAJc2xjb21wID0geGNoZygmc2wtPnNsY29tcCwgc2xjb21wKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKIAlzbC0+eGRhdGEgICAgPSAwOwogCXNsLT54Yml0cyAgICA9IDA7CiAjZW5kaWYKLSNlbmRpZgogCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CiAJZXJyID0gMDsKIApAQCAtNjcwLDE3ICs2NzAsMTYgQEAKICAqIGluIHBhcmFsbGVsCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBzbGlwX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgc2xpcF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKwkJCQkJCQljaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBzbGlwICpzbCA9IHR0eS0+ZGlzY19kYXRhOwotCWludCBieXRlcyA9IGNvdW50OwogCiAJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gU0xJUF9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAogCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KLQl3aGlsZSAoYnl0ZXMtLSkgeworCXdoaWxlIChjb3VudC0tKSB7CiAJCWlmIChmcCAmJiAqZnArKykgewogCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpCiAJCQkJc2wtPmRldi0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC02OTQsOCArNjkzLDYgQEAKICNlbmRpZgogCQkJc2xpcF91bmVzYyhzbCwgKmNwKyspOwogCX0KLQotCXJldHVybiBjb3VudDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLW1jYS5jIGIvZHJpdmVycy9uZXQvc21jLW1jYS5jCmluZGV4IDBmMjlmMjYuLmQwN2MzOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuYworKysgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgeyAxNCwgMTUgfQogfTsKIAotc3RhdGljIGNvbnN0IHNob3J0IHNtY19tY2FfYWRhcHRlcl9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzaG9ydCBzbWNfbWNhX2FkYXB0ZXJfaWRzW10gX19pbml0ZGF0YSA9IHsKIAkweDYxYzgsCiAJMHg2MWM5LAogCTB4NmZjMCwKQEAgLTE2OCw3ICsxNjgsNyBAQAogCTB4MDAwMAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNtY19tY2FfYWRhcHRlcl9uYW1lc1tdIF9fZGV2aW5pdGNvbnN0ID0geworc3RhdGljIGNoYXIgKnNtY19tY2FfYWRhcHRlcl9uYW1lc1tdIF9faW5pdGRhdGEgPSB7CiAJIlNNQyBFdGhlcmNhcmQgUExVUyBFbGl0ZS9BIEJOQy9BVUkgKFdEODAxM0VQL0EpIiwKIAkiU01DIEV0aGVyY2FyZCBQTFVTIEVsaXRlL0EgVVRQL0FVSSAoV0Q4MDEzV1AvQSkiLAogCSJXRCBFdGhlcmNhcmQgUExVUy9BIChXRDgwMDNFL0Egb3IgV0Q4MDAzRVQvQSkiLApAQCAtMTk5LDcgKzE5OSw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHVsdHJhbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmdlbl9kZXYpCitzdGF0aWMgaW50IF9faW5pdCB1bHRyYW1jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpnZW5fZGV2KQogewogCXVuc2lnbmVkIHNob3J0IGlvYWRkcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmMgYi9kcml2ZXJzL25ldC9zbWM5MXguYwppbmRleCBkYzQ4MDVmLi5mNjI4NTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguYworKysgYi9kcml2ZXJzL25ldC9zbWM5MXguYwpAQCAtMjQwMCw4ICsyNDAwLDEwIEBACiAJeyAuY29tcGF0aWJsZSA9ICJzbXNjLGxhbjkxYzk0IiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNtc2MsbGFuOTFjMTExIiwgfSwKIAl7fSwKLX0KK307CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzbWM5MXhfbWF0Y2gpOworI2Vsc2UKKyNkZWZpbmUgc21jOTF4X21hdGNoIE5VTEwKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgc21jX2Rydl9wbV9vcHMgPSB7CkBAIC0yNDE2LDkgKzI0MTgsNyBAQAogCQkubmFtZQk9IENBUkROQU1FLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLnBtCT0gJnNtY19kcnZfcG1fb3BzLAotI2lmZGVmIENPTkZJR19PRgogCQkub2ZfbWF0Y2hfdGFibGUgPSBzbWM5MXhfbWF0Y2gsCi0jZW5kaWYKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCBmNGIwMWM2Li5hMWY5ZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtNTc3NCw3ICs1Nzc0LDcgQEAKIAkJCSBkbWFfdW5tYXBfYWRkcih0eGIsIG1hcHBpbmcpLAogCQkJIHNrYl9oZWFkbGVuKHNrYiksCiAJCQkgUENJX0RNQV9UT0RFVklDRSk7Ci0JZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7CiAJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKIAogCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMKaW5kZXggMTMxM2FhMS4uMmJlZGMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCkBAIC03MjcsNyArNzI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHNob3J0IG1hZGdlbWNfYWRhcHRlcl9pZHNbXSBfX2RldmluaXRjb25zdCA9IHsKK3N0YXRpYyBzaG9ydCBtYWRnZW1jX2FkYXB0ZXJfaWRzW10gX19pbml0ZGF0YSA9IHsKIAkweDAwMmQsCiAJMHgwMDAwCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKaW5kZXggNDUxNDRkNS4uZWZhYTFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCkBAIC0xOTk1LDcgKzE5OTUsNyBAQAogCiBzdGF0aWMgdV9jaGFyIGRlNHg1X2lycVtdID0gRUlTQV9BTExPV0VEX0lSUV9MSVNUOwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkZTR4NV9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCitzdGF0aWMgaW50IF9faW5pdCBkZTR4NV9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCiB7CiAJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OwogCXVfbG9uZyBpb2Jhc2U7CkBAIC0yMDk3LDcgKzIwOTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGRlNHg1X2Vpc2FfaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGRlNHg1X2Vpc2FfaWRzW10gPSB7CiAgICAgICAgIHsgIkRFQzQyNTAiLCAwIH0sCS8qIDAgaXMgdGhlIGJvYXJkIG5hbWUgaW5kZXguLi4gKi8KICAgICAgICAgeyAiIiB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCmluZGV4IDQ2ODUxMjcuLjlhMjFjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKQEAgLTg3OSw3ICs4NzksNiBAQAogCXR4cHRyID0gZGItPnR4X3JlbW92ZV9wdHI7CiAJd2hpbGUoZGItPnR4X3BhY2tldF9jbnQpIHsKIAkJdGRlczAgPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczApOwotCQlwcl9kZWJ1ZygidGRlczA9JXhcbiIsIHRkZXMwKTsKIAkJaWYgKHRkZXMwICYgMHg4MDAwMDAwMCkKIAkJCWJyZWFrOwogCkBAIC04ODksNyArODg4LDYgQEAKIAogCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLwogCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7Ci0JCQlwcl9kZWJ1ZygidGRlczA9JXhcbiIsIHRkZXMwKTsKIAkJCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAodGRlczAgPj4gMykgJiAweGY7CiAJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlMzJfdG9fY3B1KHR4cHRyLT50ZGVzMSkgJiAweDdmZjsKIAkJCWlmICh0ZGVzMCAmIFRERVMwX0VSUl9NQVNLKSB7CkBAIC05ODYsNyArOTg0LDYgQEAKIAkJCS8qIGVycm9yIHN1bW1hcnkgYml0IGNoZWNrICovCiAJCQlpZiAocmRlczAgJiAweDgwMDApIHsKIAkJCQkvKiBUaGlzIGlzIGEgZXJyb3IgcGFja2V0ICovCi0JCQkJcHJfZGVidWcoInJkZXMwOiAleFxuIiwgcmRlczApOwogCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJaWYgKHJkZXMwICYgMSkKIAkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwpAQCAtMTYzOCw3ICsxNjM1LDYgQEAKIAkJZWxzZSAJCQkJLyogRE05MTAyL0RNOTEwMkEgKi8KIAkJCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwKIAkJCQkgICAgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpICYgMHhmMDAwOwotCQlwcl9kZWJ1ZygiUGh5X21vZGUgJXhcbiIsIHBoeV9tb2RlKTsKIAkJc3dpdGNoIChwaHlfbW9kZSkgewogCQljYXNlIDB4MTAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwTUhGOyBicmVhazsKIAkJY2FzZSAweDIwMDA6IGRiLT5vcF9tb2RlID0gRE1GRV8xME1GRDsgYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDc0ZTk0MDUuLjUyMzVmNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC00NjAsNyArNDYwLDIzIEBACiAKIAlyZXR1cm4gKGZlYXR1cmVzICYgdHVuLT5zZXRfZmVhdHVyZXMpIHwgKGZlYXR1cmVzICYgflRVTl9VU0VSX0ZFQVRVUkVTKTsKIH0KLQorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCB0dW5fcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBUdW4gb25seSByZWNlaXZlcyBmcmFtZXMgd2hlbjoKKwkgKiAxKSB0aGUgY2hhciBkZXZpY2UgZW5kcG9pbnQgZ2V0cyBkYXRhIGZyb20gdXNlciBzcGFjZQorCSAqIDIpIHRoZSB0dW4gc29ja2V0IGdldHMgYSBzZW5kbXNnIGNhbGwgZnJvbSB1c2VyIHNwYWNlCisJICogU2luY2UgYm90aCBvZiB0aG9zZSBhcmUgc3luY3Jvbm91cyBvcGVyYXRpb25zLCB3ZSBhcmUgZ3VhcmFudGVlZAorCSAqIG5ldmVyIHRvIGhhdmUgcGVuZGluZyBkYXRhIHdoZW4gd2UgcG9sbCBmb3IgaXQKKwkgKiBzbyB0aGVyZXMgbm90aGluZyB0byBkbyBoZXJlIGJ1dCByZXR1cm4uCisJICogV2UgbmVlZCB0aGlzIHRob3VnaCBzbyBuZXRwb2xsIHJlY29nbml6ZXMgdXMgYXMgYW4gaW50ZXJmYWNlIHRoYXQKKwkgKiBzdXBwb3J0cyBwb2xsaW5nLCB3aGljaCBlbmFibGVzIGJyaWRnZSBkZXZpY2VzIGluIHZpcnQgc2V0dXBzIHRvCisJICogc3RpbGwgdXNlIG5ldGNvbnNvbGUKKwkgKi8KKwlyZXR1cm47Cit9CisjZW5kaWYKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdHVuX25ldGRldl9vcHMgPSB7CiAJLm5kb191bmluaXQJCT0gdHVuX25ldF91bmluaXQsCiAJLm5kb19vcGVuCQk9IHR1bl9uZXRfb3BlbiwKQEAgLTQ2OCw2ICs0ODQsOSBAQAogCS5uZG9fc3RhcnRfeG1pdAkJPSB0dW5fbmV0X3htaXQsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IHR1bl9uZXRfY2hhbmdlX210dSwKIAkubmRvX2ZpeF9mZWF0dXJlcwk9IHR1bl9uZXRfZml4X2ZlYXR1cmVzLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSB0dW5fcG9sbF9jb250cm9sbGVyLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHRhcF9uZXRkZXZfb3BzID0gewpAQCAtNDgwLDYgKzQ5OSw5IEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSB0dW5fbmV0X21jbGlzdCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gdHVuX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgogfTsKIAogLyogSW5pdGlhbGl6ZSBuZXQgZGV2aWNlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL0tjb25maWcgYi9kcml2ZXJzL25ldC91c2IvS2NvbmZpZwppbmRleCA5ZDRmOTExLi44NGQ0NjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC91c2IvS2NvbmZpZwpAQCAtMzg1LDYgKzM4NSwxNiBAQAogCSAgcm91dGVyIHdpdGggVVNCIGV0aGVybmV0IHBvcnQuIFRoaXMgZHJpdmVyIGlzIGZvciByb3V0ZXJzIG9ubHksCiAJICBpdCB3aWxsIG5vdCB3b3JrIHdpdGggQURTTCBtb2RlbXMgKHVzZSBjeGFjcnUgZHJpdmVyIGluc3RlYWQpLgogCitjb25maWcgVVNCX05FVF9LQUxNSUEKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBLYWxtaWEgYmFzZWQgTFRFIFVTQiBtb2RlbSIKKwlkZXBlbmRzIG9uIFVTQl9VU0JORVQKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBTYW1zdW5nIEthbG1pYSBiYXNlZCBVU0IgbW9kZW0KKwkgIGFzIFNhbXN1bmcgR1QtQjM3MzAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGthbG1pYS4KKwogY29uZmlnIFVTQl9IU08KIAl0cmlzdGF0ZSAiT3B0aW9uIFVTQiBIaWdoIFNwZWVkIE1vYmlsZSBEZXZpY2VzIgogCWRlcGVuZHMgb24gVVNCICYmIFJGS0lMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlCmluZGV4IGM3ZWM4YTUuLmMyMDNmYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC91c2IvTWFrZWZpbGUKQEAgLTIzLDYgKzIzLDcgQEAKIG9iai0kKENPTkZJR19VU0JfVVNCTkVUKQkrPSB1c2JuZXQubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfSU5UNTFYMSkJKz0gaW50NTF4MS5vCiBvYmotJChDT05GSUdfVVNCX0NEQ19QSE9ORVQpCSs9IGNkYy1waG9uZXQubworb2JqLSQoQ09ORklHX1VTQl9ORVRfS0FMTUlBKQkrPSBrYWxtaWEubwogb2JqLSQoQ09ORklHX1VTQl9JUEhFVEgpCSs9IGlwaGV0aC5vCiBvYmotJChDT05GSUdfVVNCX1NJRVJSQV9ORVQpCSs9IHNpZXJyYV9uZXQubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfQ1g4MjMxMF9FVEgpCSs9IGN4ODIzMTBfZXRoLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jYXRjLmMgYi9kcml2ZXJzL25ldC91c2IvY2F0Yy5jCmluZGV4IGQ3MjIxYzQuLjgwNTZmOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jYXRjLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NhdGMuYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJaWYgKCFxLT5kaXIgJiYgcS0+YnVmICYmIHEtPmxlbikKIAkJbWVtY3B5KGNhdGMtPmN0cmxfYnVmLCBxLT5idWYsIHEtPmxlbik7CiAKLQlpZiAoKHN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKGNhdGMtPmN0cmxfdXJiLCBHRlBfS0VSTkVMKSkpCisJaWYgKChzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihjYXRjLT5jdHJsX3VyYiwgR0ZQX0FUT01JQykpKQogCQllcnIoInN1Ym1pdChjdHJsX3VyYikgc3RhdHVzICVkIiwgc3RhdHVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKaW5kZXggY2RkM2FlNC4uZjMzY2E2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYworKysgYi9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCkBAIC01NCw3ICs1NCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL3VzYm5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jZGMuaD4KIAotI2RlZmluZQlEUklWRVJfVkVSU0lPTgkJCQkiMjQtTWF5LTIwMTEiCisjZGVmaW5lCURSSVZFUl9WRVJTSU9OCQkJCSIwMS1KdW5lLTIwMTEiCiAKIC8qIENEQyBOQ00gc3ViY2xhc3MgMy4yLjEgKi8KICNkZWZpbmUgVVNCX0NEQ19OQ01fTkRQMTZfTEVOR1RIX01JTgkJMHgxMApAQCAtMTIzNCw2ICsxMjM0LDcgQEAKIAkuZGlzY29ubmVjdCA9IGNkY19uY21fZGlzY29ubmVjdCwKIAkuc3VzcGVuZCA9IHVzYm5ldF9zdXNwZW5kLAogCS5yZXN1bWUgPSB1c2JuZXRfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUgPQl1c2JuZXRfcmVzdW1lLAogCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvaHNvLmMgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKaW5kZXggMzg3Y2E0My4uMzA0ZmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2hzby5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwpAQCAtMjQyMSwxMCArMjQyMSw4IEBACiAKIAlyZW1vdmVfbmV0X2RldmljZShoc29fbmV0LT5wYXJlbnQpOwogCi0JaWYgKGhzb19uZXQtPm5ldCkgeworCWlmIChoc29fbmV0LT5uZXQpCiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGhzb19uZXQtPm5ldCk7Ci0JCWZyZWVfbmV0ZGV2KGhzb19uZXQtPm5ldCk7Ci0JfQogCiAJLyogc3RhcnQgZnJlZWluZyAqLwogCWZvciAoaSA9IDA7IGkgPCBNVVhfQlVMS19SWF9CVUZfQ09VTlQ7IGkrKykgewpAQCAtMjQzNiw2ICsyNDM0LDkgQEAKIAlrZnJlZShoc29fbmV0LT5tdXhfYnVsa190eF9idWYpOwogCWhzb19uZXQtPm11eF9idWxrX3R4X2J1ZiA9IE5VTEw7CiAKKwlpZiAoaHNvX25ldC0+bmV0KQorCQlmcmVlX25ldGRldihoc29fbmV0LT5uZXQpOworCiAJa2ZyZWUoaHNvX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9rYWxtaWEuYyBiL2RyaXZlcnMvbmV0L3VzYi9rYWxtaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI2YzYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdXNiL2thbG1pYS5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogVVNCIG5ldHdvcmsgaW50ZXJmYWNlIGRyaXZlciBmb3IgU2Ftc3VuZyBLYWxtaWEgYmFzZWQgTFRFIFVTQiBtb2RlbSBsaWtlIHRoZQorICogU2Ftc3VuZyBHVC1CMzczMCBhbmQgR1QtQjM3MTAuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE1hcml1cyBCam9lcm5zdGFkIEtvdHNiYWsgPG1hcml1c0Brb3RzYmFrLmNvbT4KKyAqCisgKiBTcG9uc29yZWQgYnkgUXVpY2tsaW5rIFZpZGVvIERpc3RyaWJ1dGlvbiBTZXJ2aWNlcyBMdGQuCisgKgorICogQmFzZWQgb24gdGhlIGNkY19lZW0gbW9kdWxlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NkYy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JuZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworLyoKKyAqIFRoZSBTYW1zdW5nIEthbG1pYSBiYXNlZCBMVEUgVVNCIG1vZGVtcyBoYXZlIGEgQ0RDIEFDTSBwb3J0IGZvciBtb2RlbSBjb250cm9sCisgKiBoYW5kbGVkIGJ5IHRoZSAib3B0aW9uIiBtb2R1bGUgYW5kIGFuIGV0aGVybmV0IGRhdGEgcG9ydCBoYW5kbGVkIGJ5IHRoaXMKKyAqIG1vZHVsZS4KKyAqCisgKiBUaGUgc3RpY2sgbXVzdCBmaXJzdCBiZSBzd2l0Y2hlZCBpbnRvIG1vZGVtIG1vZGUgYnkgdXNiX21vZGVzd2l0Y2gKKyAqIG9yIHNpbWlsYXIgdG9vbC4gVGhlbiB0aGUgbW9kZW0gZ2V0cyBzZW50IHR3byBpbml0aWFsaXphdGlvbiBwYWNrZXRzIGJ5CisgKiB0aGlzIG1vZHVsZSwgd2hpY2ggZ2l2ZXMgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuIFVzZXIgc3BhY2UgY2FuIHRoZW4KKyAqIGNvbm5lY3QgdGhlIG1vZGVtIHVzaW5nIEFUIGNvbW1hbmRzIHRocm91Z2ggdGhlIEFDTSBwb3J0IGFuZCB0aGVuIHVzZQorICogREhDUCBvbiB0aGUgbmV0d29yayBpbnRlcmZhY2UgZXhwb3NlZCBieSB0aGlzIG1vZHVsZS4gTmV0d29yayBwYWNrZXRzIGFyZQorICogc2VudCB0byBhbmQgZnJvbSB0aGUgbW9kZW0gaW4gYSBwcm9wcmlldGFyeSBmb3JtYXQgZGlzY292ZXJlZCBhZnRlciB3YXRjaGluZworICogdGhlIGJlaGF2aW9yIG9mIHRoZSB3aW5kb3dzIGRyaXZlciBmb3IgdGhlIG1vZGVtLgorICoKKyAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZSBvZiB0aGUgbW9kZW0gaXMgYXZhaWxhYmxlIGluIHVzYl9tb2Rlc3dpdGNoCisgKiBmb3J1bSBhbmQgdGhlIHByb2plY3QgcGFnZToKKyAqCisgKiBodHRwOi8vd3d3LmRyYWlzYmVyZ2hvZi5kZS91c2JfbW9kZXN3aXRjaC9iYi92aWV3dG9waWMucGhwP3Q9NDY1CisgKiBodHRwczovL2dpdGh1Yi5jb20vbWtvdHNiYWsvU2Ftc3VuZy1HVC1CMzczMC1saW51eC1kcml2ZXIKKyAqLworCisvKiAjZGVmaW5lCURFQlVHICovCisvKiAjZGVmaW5lCVZFUkJPU0UgKi8KKworI2RlZmluZSBLQUxNSUFfSEVBREVSX0xFTkdUSCA2CisjZGVmaW5lIEtBTE1JQV9BTElHTl9TSVpFIDQKKyNkZWZpbmUgS0FMTUlBX1VTQl9USU1FT1VUIDEwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK2thbG1pYV9zZW5kX2luaXRfcGFja2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggKmluaXRfbXNnLCB1OCBpbml0X21zZ19sZW4sCisJdTggKmJ1ZmZlciwgdTggZXhwZWN0ZWRfbGVuKQoreworCWludCBhY3RfbGVuOworCWludCBzdGF0dXM7CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VuZGluZyBpbml0IHBhY2tldCIpOworCisJc3RhdHVzID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwgMHgwMiksCisJCWluaXRfbXNnLCBpbml0X21zZ19sZW4sICZhY3RfbGVuLCBLQUxNSUFfVVNCX1RJTUVPVVQpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LAorCQkJIkVycm9yIHNlbmRpbmcgaW5pdCBwYWNrZXQuIFN0YXR1cyAlaSwgbGVuZ3RoICVpXG4iLAorCQkJc3RhdHVzLCBhY3RfbGVuKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJZWxzZSBpZiAoYWN0X2xlbiAhPSBpbml0X21zZ19sZW4pIHsKKwkJbmV0ZGV2X2VycihkZXYtPm5ldCwKKwkJCSJEaWQgbm90IHNlbmQgYWxsIG9mIGluaXQgcGFja2V0LiBCeXRlcyBzZW50OiAlaSIsCisJCQlhY3RfbGVuKTsKKwl9CisJZWxzZSB7CisJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTdWNjZXNzZnVsbHkgc2VudCBpbml0IHBhY2tldC4iKTsKKwl9CisKKwlzdGF0dXMgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCAweDgxKSwKKwkJYnVmZmVyLCBleHBlY3RlZF9sZW4sICZhY3RfbGVuLCBLQUxNSUFfVVNCX1RJTUVPVVQpOworCisJaWYgKHN0YXR1cyAhPSAwKQorCQluZXRkZXZfZXJyKGRldi0+bmV0LAorCQkJIkVycm9yIHJlY2VpdmluZyBpbml0IHJlc3VsdC4gU3RhdHVzICVpLCBsZW5ndGggJWlcbiIsCisJCQlzdGF0dXMsIGFjdF9sZW4pOworCWVsc2UgaWYgKGFjdF9sZW4gIT0gZXhwZWN0ZWRfbGVuKQorCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiVW5leHBlY3RlZCBpbml0IHJlc3VsdCBsZW5ndGg6ICVpXG4iLAorCQkJYWN0X2xlbik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CitrYWxtaWFfaW5pdF9hbmRfZ2V0X2V0aGVybmV0X2FkZHIoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCAqZXRoZXJuZXRfYWRkcikKK3sKKwljb25zdCBzdGF0aWMgY2hhciBpbml0X21zZ18xW10gPQorCQl7IDB4NTcsIDB4NTAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAgfTsKKwljb25zdCBzdGF0aWMgY2hhciBpbml0X21zZ18yW10gPQorCQl7IDB4NTcsIDB4NTAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4ZjQsCisJCTB4MDAsIDB4MDAgfTsKKwljb25zdCBzdGF0aWMgaW50IGJ1ZmxlbiA9IDI4OworCWNoYXIgKnVzYl9idWY7CisJaW50IHN0YXR1czsKKworCXVzYl9idWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCWlmICghdXNiX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkodXNiX2J1ZiwgaW5pdF9tc2dfMSwgMTIpOworCXN0YXR1cyA9IGthbG1pYV9zZW5kX2luaXRfcGFja2V0KGRldiwgdXNiX2J1Ziwgc2l6ZW9mKGluaXRfbXNnXzEpCisJCS8gc2l6ZW9mKGluaXRfbXNnXzFbMF0pLCB1c2JfYnVmLCAyNCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJbWVtY3B5KHVzYl9idWYsIGluaXRfbXNnXzIsIDEyKTsKKwlzdGF0dXMgPSBrYWxtaWFfc2VuZF9pbml0X3BhY2tldChkZXYsIHVzYl9idWYsIHNpemVvZihpbml0X21zZ18yKQorCQkvIHNpemVvZihpbml0X21zZ18yWzBdKSwgdXNiX2J1ZiwgMjgpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCW1lbWNweShldGhlcm5ldF9hZGRyLCB1c2JfYnVmICsgMTAsIEVUSF9BTEVOKTsKKworCWtmcmVlKHVzYl9idWYpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2thbG1pYV9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJaW50IHN0YXR1czsKKwl1OCBldGhlcm5ldF9hZGRyW0VUSF9BTEVOXTsKKworCS8qIERvbid0IGJpbmQgdG8gQVQgY29tbWFuZCBpbnRlcmZhY2UgKi8KKwlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPmluID0gdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgMHg4MSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisJZGV2LT5vdXQgPSB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCAweDAyICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwlkZXYtPnN0YXR1cyA9IE5VTEw7CisKKwlkZXYtPm5ldC0+aGFyZF9oZWFkZXJfbGVuICs9IEtBTE1JQV9IRUFERVJfTEVOR1RIOworCWRldi0+aGFyZF9tdHUgPSAxNDAwOworCWRldi0+cnhfdXJiX3NpemUgPSBkZXYtPmhhcmRfbXR1ICogMTA7IC8vIEZvdW5kIGFzIG9wdGltYWwgYWZ0ZXIgdGVzdGluZworCisJc3RhdHVzID0ga2FsbWlhX2luaXRfYW5kX2dldF9ldGhlcm5ldF9hZGRyKGRldiwgZXRoZXJuZXRfYWRkcik7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKGRyaXZlcl9vZihpbnRmKSwgaW50Zik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgZXRoZXJuZXRfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShkZXYtPm5ldC0+cGVybV9hZGRyLCBldGhlcm5ldF9hZGRyLCBFVEhfQUxFTik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgora2FsbWlhX3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOworCXUxNiBjb250ZW50X2xlbjsKKwl1bnNpZ25lZCBjaGFyICpoZWFkZXJfc3RhcnQ7CisJdW5zaWduZWQgY2hhciBldGhlcl90eXBlXzEsIGV0aGVyX3R5cGVfMjsKKwl1OCByZW1haW5kZXIsIHBhZGxlbiA9IDA7CisKKwlpZiAoIXNrYl9jbG9uZWQoc2tiKSkgeworCQlpbnQgaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwkJaW50IHRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CisKKwkJaWYgKCh0YWlscm9vbSA+PSBLQUxNSUFfQUxJR05fU0laRSkgJiYgKGhlYWRyb29tCisJCQk+PSBLQUxNSUFfSEVBREVSX0xFTkdUSCkpCisJCQlnb3RvIGRvbmU7CisKKwkJaWYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+IChLQUxNSUFfSEVBREVSX0xFTkdUSAorCQkJKyBLQUxNSUFfQUxJR05fU0laRSkpIHsKKwkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUoc2tiLT5oZWFkICsgS0FMTUlBX0hFQURFUl9MRU5HVEgsCisJCQkJc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIHNrYi0+bGVuKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLCBLQUxNSUFfSEVBREVSX0xFTkdUSCwKKwkJS0FMTUlBX0FMSUdOX1NJWkUsIGZsYWdzKTsKKwlpZiAoIXNrYjIpCisJCXJldHVybiBOVUxMOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlza2IgPSBza2IyOworCitkb25lOgorCWhlYWRlcl9zdGFydCA9IHNrYl9wdXNoKHNrYiwgS0FMTUlBX0hFQURFUl9MRU5HVEgpOworCWV0aGVyX3R5cGVfMSA9IGhlYWRlcl9zdGFydFtLQUxNSUFfSEVBREVSX0xFTkdUSCArIDEyXTsKKwlldGhlcl90eXBlXzIgPSBoZWFkZXJfc3RhcnRbS0FMTUlBX0hFQURFUl9MRU5HVEggKyAxM107CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VuZGluZyBldGhlclR5cGU6ICUwMnglMDJ4IiwgZXRoZXJfdHlwZV8xLAorCQlldGhlcl90eXBlXzIpOworCisJLyogQWNjb3JkaW5nIHRvIGVtcGlyaWMgZGF0YSBmb3IgZGF0YSBwYWNrYWdlcyAqLworCWhlYWRlcl9zdGFydFswXSA9IDB4NTc7CisJaGVhZGVyX3N0YXJ0WzFdID0gMHg0NDsKKwljb250ZW50X2xlbiA9IHNrYi0+bGVuIC0gS0FMTUlBX0hFQURFUl9MRU5HVEg7CisKKwlwdXRfdW5hbGlnbmVkX2xlMTYoY29udGVudF9sZW4sICZoZWFkZXJfc3RhcnRbMl0pOworCWhlYWRlcl9zdGFydFs0XSA9IGV0aGVyX3R5cGVfMTsKKwloZWFkZXJfc3RhcnRbNV0gPSBldGhlcl90eXBlXzI7CisKKwkvKiBBbGlnbiB0byA0IGJ5dGVzIGJ5IHBhZGRpbmcgd2l0aCB6ZXJvcyAqLworCXJlbWFpbmRlciA9IHNrYi0+bGVuICUgS0FMTUlBX0FMSUdOX1NJWkU7CisJaWYgKHJlbWFpbmRlciA+IDApIHsKKwkJcGFkbGVuID0gS0FMTUlBX0FMSUdOX1NJWkUgLSByZW1haW5kZXI7CisJCW1lbXNldChza2JfcHV0KHNrYiwgcGFkbGVuKSwgMCwgcGFkbGVuKTsKKwl9CisKKwluZXRkZXZfZGJnKAorCQlkZXYtPm5ldCwKKwkJIlNlbmRpbmcgcGFja2FnZSB3aXRoIGxlbmd0aCAlaSBhbmQgcGFkZGluZyAlaS4gSGVhZGVyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC4iLAorCQljb250ZW50X2xlbiwgcGFkbGVuLCBoZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9zdGFydFsxXSwKKwkJaGVhZGVyX3N0YXJ0WzJdLCBoZWFkZXJfc3RhcnRbM10sIGhlYWRlcl9zdGFydFs0XSwKKwkJaGVhZGVyX3N0YXJ0WzVdKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQKK2thbG1pYV9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyoKKwkgKiBPdXIgdGFzayBoZXJlIGlzIHRvIHN0cmlwIG9mZiBmcmFtaW5nLCBsZWF2aW5nIHNrYiB3aXRoIG9uZQorCSAqIGRhdGEgZnJhbWUgZm9yIHRoZSB1c2JuZXQgZnJhbWV3b3JrIGNvZGUgdG8gcHJvY2Vzcy4KKwkgKi8KKwljb25zdCBzdGF0aWMgdTggSEVBREVSX0VORF9PRl9VU0JfUEFDS0VUW10gPQorCQl7IDB4NTcsIDB4NWEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAgfTsKKwljb25zdCBzdGF0aWMgdTggRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMVtdID0KKwkJeyAweDU3LCAweDQzLCAweDFlLCAweDAwLCAweDE1LCAweDAyIH07CisJY29uc3Qgc3RhdGljIHU4IEVYUEVDVEVEX1VOS05PV05fSEVBREVSXzJbXSA9CisJCXsgMHg1NywgMHg1MCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCB9OworCWludCBpID0gMDsKKworCS8qIGluY29tcGxldGUgaGVhZGVyPyAqLworCWlmIChza2ItPmxlbiA8IEtBTE1JQV9IRUFERVJfTEVOR1RIKQorCQlyZXR1cm4gMDsKKworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOworCQl1OCAqaGVhZGVyX3N0YXJ0OworCQl1MTYgdXNiX3BhY2tldF9sZW5ndGgsIGV0aGVyX3BhY2tldF9sZW5ndGg7CisJCWludCBpc19sYXN0OworCisJCWhlYWRlcl9zdGFydCA9IHNrYi0+ZGF0YTsKKworCQlpZiAodW5saWtlbHkoaGVhZGVyX3N0YXJ0WzBdICE9IDB4NTcgfHwgaGVhZGVyX3N0YXJ0WzFdICE9IDB4NDQpKSB7CisJCQlpZiAoIW1lbWNtcChoZWFkZXJfc3RhcnQsIEVYUEVDVEVEX1VOS05PV05fSEVBREVSXzEsCisJCQkJc2l6ZW9mKEVYUEVDVEVEX1VOS05PV05fSEVBREVSXzEpKSB8fCAhbWVtY21wKAorCQkJCWhlYWRlcl9zdGFydCwgRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMiwKKwkJCQlzaXplb2YoRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMikpKSB7CisJCQkJbmV0ZGV2X2RiZygKKwkJCQkJZGV2LT5uZXQsCisJCQkJCSJSZWNlaXZlZCBleHBlY3RlZCB1bmtub3duIGZyYW1lIGhlYWRlcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguIFBhY2thZ2UgbGVuZ3RoOiAlaVxuIiwKKwkJCQkJaGVhZGVyX3N0YXJ0WzBdLCBoZWFkZXJfc3RhcnRbMV0sCisJCQkJCWhlYWRlcl9zdGFydFsyXSwgaGVhZGVyX3N0YXJ0WzNdLAorCQkJCQloZWFkZXJfc3RhcnRbNF0sIGhlYWRlcl9zdGFydFs1XSwKKwkJCQkJc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQluZXRkZXZfZXJyKAorCQkJCQlkZXYtPm5ldCwKKwkJCQkJIlJlY2VpdmVkIHVua25vd24gZnJhbWUgaGVhZGVyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC4gUGFja2FnZSBsZW5ndGg6ICVpXG4iLAorCQkJCQloZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9zdGFydFsxXSwKKwkJCQkJaGVhZGVyX3N0YXJ0WzJdLCBoZWFkZXJfc3RhcnRbM10sCisJCQkJCWhlYWRlcl9zdGFydFs0XSwgaGVhZGVyX3N0YXJ0WzVdLAorCQkJCQlza2ItPmxlbiAtIEtBTE1JQV9IRUFERVJfTEVOR1RIKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQllbHNlCisJCQluZXRkZXZfZGJnKAorCQkJCWRldi0+bmV0LAorCQkJCSJSZWNlaXZlZCBoZWFkZXI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LiBQYWNrYWdlIGxlbmd0aDogJWlcbiIsCisJCQkJaGVhZGVyX3N0YXJ0WzBdLCBoZWFkZXJfc3RhcnRbMV0sIGhlYWRlcl9zdGFydFsyXSwKKwkJCQloZWFkZXJfc3RhcnRbM10sIGhlYWRlcl9zdGFydFs0XSwgaGVhZGVyX3N0YXJ0WzVdLAorCQkJCXNrYi0+bGVuIC0gS0FMTUlBX0hFQURFUl9MRU5HVEgpOworCisJCS8qIHN1YnRyYWN0IHN0YXJ0IGhlYWRlciBhbmQgZW5kIGhlYWRlciAqLworCQl1c2JfcGFja2V0X2xlbmd0aCA9IHNrYi0+bGVuIC0gKDIgKiBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisJCWV0aGVyX3BhY2tldF9sZW5ndGggPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmhlYWRlcl9zdGFydFsyXSk7CisJCXNrYl9wdWxsKHNrYiwgS0FMTUlBX0hFQURFUl9MRU5HVEgpOworCisJCS8qIFNvbWUgc21hbGwgcGFja2V0cyBtaXNzZXMgZW5kIG1hcmtlciAqLworCQlpZiAodXNiX3BhY2tldF9sZW5ndGggPCBldGhlcl9wYWNrZXRfbGVuZ3RoKSB7CisJCQlldGhlcl9wYWNrZXRfbGVuZ3RoID0gdXNiX3BhY2tldF9sZW5ndGgKKwkJCQkrIEtBTE1JQV9IRUFERVJfTEVOR1RIOworCQkJaXNfbGFzdCA9IHRydWU7CisJCX0KKwkJZWxzZSB7CisJCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiQ29ycmVjdCBwYWNrYWdlIGxlbmd0aCAjJWkiLCBpCisJCQkJKyAxKTsKKworCQkJaXNfbGFzdCA9IChtZW1jbXAoc2tiLT5kYXRhICsgZXRoZXJfcGFja2V0X2xlbmd0aCwKKwkJCQlIRUFERVJfRU5EX09GX1VTQl9QQUNLRVQsCisJCQkJc2l6ZW9mKEhFQURFUl9FTkRfT0ZfVVNCX1BBQ0tFVCkpID09IDApOworCQkJaWYgKCFpc19sYXN0KSB7CisJCQkJaGVhZGVyX3N0YXJ0ID0gc2tiLT5kYXRhICsgZXRoZXJfcGFja2V0X2xlbmd0aDsKKwkJCQluZXRkZXZfZGJnKAorCQkJCQlkZXYtPm5ldCwKKwkJCQkJIkVuZCBoZWFkZXI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LiBQYWNrYWdlIGxlbmd0aDogJWlcbiIsCisJCQkJCWhlYWRlcl9zdGFydFswXSwgaGVhZGVyX3N0YXJ0WzFdLAorCQkJCQloZWFkZXJfc3RhcnRbMl0sIGhlYWRlcl9zdGFydFszXSwKKwkJCQkJaGVhZGVyX3N0YXJ0WzRdLCBoZWFkZXJfc3RhcnRbNV0sCisJCQkJCXNrYi0+bGVuIC0gS0FMTUlBX0hFQURFUl9MRU5HVEgpOworCQkJfQorCQl9CisKKwkJaWYgKGlzX2xhc3QpIHsKKwkJCXNrYjIgPSBza2I7CisJCX0KKwkJZWxzZSB7CisJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAodW5saWtlbHkoIXNrYjIpKQorCQkJCXJldHVybiAwOworCQl9CisKKwkJc2tiX3RyaW0oc2tiMiwgZXRoZXJfcGFja2V0X2xlbmd0aCk7CisKKwkJaWYgKGlzX2xhc3QpIHsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UgeworCQkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBza2IyKTsKKwkJCXNrYl9wdWxsKHNrYiwgZXRoZXJfcGFja2V0X2xlbmd0aCk7CisJCX0KKworCQlpKys7CisJfQorCXdoaWxlIChza2ItPmxlbik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBrYWxtaWFfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPSAiU2Ftc3VuZyBLYWxtaWEgTFRFIFVTQiBkb25nbGUiLAorCS5mbGFncyA9IEZMQUdfV1dBTiwKKwkuYmluZCA9IGthbG1pYV9iaW5kLAorCS5yeF9maXh1cCA9IGthbG1pYV9yeF9maXh1cCwKKwkudHhfZml4dXAgPSBrYWxtaWFfdHhfZml4dXAKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwcm9kdWN0c1tdID0geworCS8qIFRoZSB1bnN3aXRjaGVkIFVTQiBJRCwgdG8gZ2V0IHRoZSBtb2R1bGUgYXV0byBsb2FkZWQ6ICovCisJeyBVU0JfREVWSUNFKDB4MDRlOCwgMHg2ODlhKSB9LAorCS8qIFRoZSBzdGljayBzd2l0aGVkIGludG8gbW9kZW0gKGJ5IGUuZy4gdXNiX21vZGVzd2l0Y2gpOiAqLworCXsgVVNCX0RFVklDRSgweDA0ZTgsIDB4Njg4OSksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAma2FsbWlhX2luZm8sIH0sCisJeyAvKiBFTVBUWSA9PSBlbmQgb2YgbGlzdCAqL30gfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoIHVzYiwgcHJvZHVjdHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIga2FsbWlhX2RyaXZlciA9IHsKKwkubmFtZSA9ICJrYWxtaWEiLAorCS5pZF90YWJsZSA9IHByb2R1Y3RzLAorCS5wcm9iZSA9IHVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9IHVzYm5ldF9yZXN1bWUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGthbG1pYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigma2FsbWlhX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCgga2FsbWlhX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQga2FsbWlhX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigma2FsbWlhX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCgga2FsbWlhX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJpdXMgQmpvZXJuc3RhZCBLb3RzYmFrIDxtYXJpdXNAa290c2Jhay5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgS2FsbWlhIFVTQiBuZXR3b3JrIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3phdXJ1cy5jIGIvZHJpdmVycy9uZXQvdXNiL3phdXJ1cy5jCmluZGV4IDI0MTc1NmUuLjFhMjIzNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi96YXVydXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvemF1cnVzLmMKQEAgLTMzMSwxNyArMzMxLDcgQEAKIAlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKIAkuZHJpdmVyX2luZm8gPSBaQVVSVVNfUFhBX0lORk8sCiB9LAotCi0KLS8qIEF0IGxlYXN0IHNvbWUgb2YgdGhlIG5ld2VzdCBQWEEgdW5pdHMgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBsaWVzIGFib3V0Ci0gKiB0aGVpciBzdGFuZGFyZHMgc3VwcG9ydDogIHRoZXkgY2xhaW0gdG8gYmUgY2VsbCBwaG9uZXMgb2ZmZXJpbmcKLSAqIGRpcmVjdCBhY2Nlc3MgdG8gdGhlaXIgcmFkaW9zISAgKE5vLCB0aGV5IGRvbid0IGNvbmZvcm0gdG8gQ0RDIE1ETE0uKQotICovCiB7Ci0JVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX01ETE0sCi0JCQlVU0JfQ0RDX1BST1RPX05PTkUpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYm9ndXNfbWRsbV9pbmZvLAotfSwgewogCS8qIE1vdG9yb2xhIE1PVE9NQUdYIHBob25lcyAqLwogCVVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjJiOCwgMHg2NDI1LCBVU0JfQ0xBU1NfQ09NTSwKIAkJCVVTQl9DRENfU1VCQ0xBU1NfTURMTSwgVVNCX0NEQ19QUk9UT19OT05FKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCAwY2IwYjA2Li5mNjg1MzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC02MDksNyArNjA5LDcgQEAKIAkgKiBiZWZvcmUgaXQgZ2V0cyBvdXQgb2YgaGFuZC4gIE5hdHVyYWxseSwgdGhpcyB3YXN0ZXMgZW50cmllcy4gKi8KIAlpZiAoY2FwYWNpdHkgPCAyK01BWF9TS0JfRlJBR1MpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQlpZiAodW5saWtlbHkoIXZpcnRxdWV1ZV9lbmFibGVfY2IodmktPnN2cSkpKSB7CisJCWlmICh1bmxpa2VseSghdmlydHF1ZXVlX2VuYWJsZV9jYl9kZWxheWVkKHZpLT5zdnEpKSkgewogCQkJLyogTW9yZSBqdXN0IGdvdCB1c2VkLCBmcmVlIHRoZW0gdGhlbiByZWNoZWNrLiAqLwogCQkJY2FwYWNpdHkgKz0gZnJlZV9vbGRfeG1pdF9za2JzKHZpKTsKIAkJCWlmIChjYXBhY2l0eSA+PSAyK01BWF9TS0JfRlJBR1MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwppbmRleCBmYTZlMmFjLi42NzQwMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCkBAIC01NzUsNyArNTc1LDcgQEAKIAlzdHJ1Y3Qgdm14bmV0M19jbWRfcmluZyAqcmluZyA9ICZycS0+cnhfcmluZ1tyaW5nX2lkeF07CiAJdTMyIHZhbDsKIAotCXdoaWxlIChudW1fYWxsb2NhdGVkIDwgbnVtX3RvX2FsbG9jKSB7CisJd2hpbGUgKG51bV9hbGxvY2F0ZWQgPD0gbnVtX3RvX2FsbG9jKSB7CiAJCXN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvICpyYmk7CiAJCXVuaW9uIFZteG5ldDNfR2VuZXJpY0Rlc2MgKmdkOwogCkBAIC02MjEsOSArNjIxLDE1IEBACiAKIAkJQlVHX09OKHJiaS0+ZG1hX2FkZHIgPT0gMCk7CiAJCWdkLT5yeGQuYWRkciA9IGNwdV90b19sZTY0KHJiaS0+ZG1hX2FkZHIpOwotCQlnZC0+ZHdvcmRbMl0gPSBjcHVfdG9fbGUzMigocmluZy0+Z2VuIDw8IFZNWE5FVDNfUlhEX0dFTl9TSElGVCkKKwkJZ2QtPmR3b3JkWzJdID0gY3B1X3RvX2xlMzIoKCFyaW5nLT5nZW4gPDwgVk1YTkVUM19SWERfR0VOX1NISUZUKQogCQkJCQkgICB8IHZhbCB8IHJiaS0+bGVuKTsKIAorCQkvKiBGaWxsIHRoZSBsYXN0IGJ1ZmZlciBidXQgZG9udCBtYXJrIGl0IHJlYWR5LCBvciBlbHNlIHRoZQorCQkgKiBkZXZpY2Ugd2lsbCB0aGluayB0aGF0IHRoZSBxdWV1ZSBpcyBmdWxsICovCisJCWlmIChudW1fYWxsb2NhdGVkID09IG51bV90b19hbGxvYykKKwkJCWJyZWFrOworCisJCWdkLT5kd29yZFsyXSB8PSBjcHVfdG9fbGUzMihyaW5nLT5nZW4gPDwgVk1YTkVUM19SWERfR0VOX1NISUZUKTsKIAkJbnVtX2FsbG9jYXRlZCsrOwogCQl2bXhuZXQzX2NtZF9yaW5nX2Fkdl9uZXh0MmZpbGwocmluZyk7CiAJfQpAQCAtMTE0MCw2ICsxMTQ2LDcgQEAKIAkJVk1YTkVUM19SRUdfUlhQUk9ELCBWTVhORVQzX1JFR19SWFBST0QyCiAJfTsKIAl1MzIgbnVtX3J4ZCA9IDA7CisJYm9vbCBza2lwX3BhZ2VfZnJhZ3MgPSBmYWxzZTsKIAlzdHJ1Y3QgVm14bmV0M19SeENvbXBEZXNjICpyY2Q7CiAJc3RydWN0IHZteG5ldDNfcnhfY3R4ICpjdHggPSAmcnEtPnJ4X2N0eDsKICNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKQEAgLTExNTAsMTEgKzExNTcsMTIgQEAKIAkJCSAgJnJ4Q29tcCk7CiAJd2hpbGUgKHJjZC0+Z2VuID09IHJxLT5jb21wX3JpbmcuZ2VuKSB7CiAJCXN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvICpyYmk7Ci0JCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBza19idWZmICpza2IsICpuZXdfc2tiID0gTlVMTDsKKwkJc3RydWN0IHBhZ2UgKm5ld19wYWdlID0gTlVMTDsKIAkJaW50IG51bV90b19hbGxvYzsKIAkJc3RydWN0IFZteG5ldDNfUnhEZXNjICpyeGQ7CiAJCXUzMiBpZHgsIHJpbmdfaWR4OwotCisJCXN0cnVjdCB2bXhuZXQzX2NtZF9yaW5nCSpyaW5nID0gTlVMTDsKIAkJaWYgKG51bV9yeGQgPj0gcXVvdGEpIHsKIAkJCS8qIHdlIG1heSBzdG9wIGV2ZW4gYmVmb3JlIHdlIHNlZSB0aGUgRU9QIGRlc2Mgb2YKIAkJCSAqIHRoZSBjdXJyZW50IHBrdApAQCAtMTE2NSw2ICsxMTczLDcgQEAKIAkJQlVHX09OKHJjZC0+cnFJRCAhPSBycS0+cWlkICYmIHJjZC0+cnFJRCAhPSBycS0+cWlkMik7CiAJCWlkeCA9IHJjZC0+cnhkSWR4OwogCQlyaW5nX2lkeCA9IHJjZC0+cnFJRCA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMgPyAwIDogMTsKKwkJcmluZyA9IHJxLT5yeF9yaW5nICsgcmluZ19pZHg7CiAJCXZteG5ldDNfZ2V0UnhEZXNjKHJ4ZCwgJnJxLT5yeF9yaW5nW3JpbmdfaWR4XS5iYXNlW2lkeF0ucnhkLAogCQkJCSAgJnJ4Q21kRGVzYyk7CiAJCXJiaSA9IHJxLT5idWZfaW5mb1tyaW5nX2lkeF0gKyBpZHg7CkBAIC0xMTkzLDM3ICsxMjAyLDgwIEBACiAJCQkJZ290byByY2RfZG9uZTsKIAkJCX0KIAorCQkJc2tpcF9wYWdlX2ZyYWdzID0gZmFsc2U7CiAJCQljdHgtPnNrYiA9IHJiaS0+c2tiOwotCQkJcmJpLT5za2IgPSBOVUxMOworCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocmJpLT5sZW4gKyBORVRfSVBfQUxJR04pOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCS8qIFNrYiBhbGxvY2F0aW9uIGZhaWxlZCwgZG8gbm90IGhhbmRvdmVyIHRoaXMKKwkJCQkgKiBza2IgdG8gc3RhY2suIFJldXNlIGl0LiBEcm9wIHRoZSBleGlzdGluZyBwa3QKKwkJCQkgKi8KKwkJCQlycS0+c3RhdHMucnhfYnVmX2FsbG9jX2ZhaWx1cmUrKzsKKwkJCQljdHgtPnNrYiA9IE5VTEw7CisJCQkJcnEtPnN0YXRzLmRyb3BfdG90YWwrKzsKKwkJCQlza2lwX3BhZ2VfZnJhZ3MgPSB0cnVlOworCQkJCWdvdG8gcmNkX2RvbmU7CisJCQl9CiAKIAkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgcmJpLT5kbWFfYWRkciwgcmJpLT5sZW4sCiAJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCQlza2JfcHV0KGN0eC0+c2tiLCByY2QtPmxlbik7CisKKwkJCS8qIEltbWVkaWF0ZSByZWZpbGwgKi8KKwkJCW5ld19za2ItPmRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIE5FVF9JUF9BTElHTik7CisJCQlyYmktPnNrYiA9IG5ld19za2I7CisJCQlyYmktPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwKKwkJCQkJcmJpLT5za2ItPmRhdGEsIHJiaS0+bGVuLAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhkLT5hZGRyID0gY3B1X3RvX2xlNjQocmJpLT5kbWFfYWRkcik7CisJCQlyeGQtPmxlbiA9IHJiaS0+bGVuOworCiAJCX0gZWxzZSB7Ci0JCQlCVUdfT04oY3R4LT5za2IgPT0gTlVMTCk7CisJCQlCVUdfT04oY3R4LT5za2IgPT0gTlVMTCAmJiAhc2tpcF9wYWdlX2ZyYWdzKTsKKwogCQkJLyogbm9uIFNPUCBidWZmZXIgbXVzdCBiZSB0eXBlIDEgaW4gbW9zdCBjYXNlcyAqLwotCQkJaWYgKHJiaS0+YnVmX3R5cGUgPT0gVk1YTkVUM19SWF9CVUZfUEFHRSkgewotCQkJCUJVR19PTihyeGQtPmJ0eXBlICE9IFZNWE5FVDNfUlhEX0JUWVBFX0JPRFkpOworCQkJQlVHX09OKHJiaS0+YnVmX3R5cGUgIT0gVk1YTkVUM19SWF9CVUZfUEFHRSk7CisJCQlCVUdfT04ocnhkLT5idHlwZSAhPSBWTVhORVQzX1JYRF9CVFlQRV9CT0RZKTsKIAotCQkJCWlmIChyY2QtPmxlbikgewotCQkJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgICAgIHJiaS0+ZG1hX2FkZHIsIHJiaS0+bGVuLAotCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkvKiBJZiBhbiBzb3AgYnVmZmVyIHdhcyBkcm9wcGVkLCBza2lwIGFsbAorCQkJICogZm9sbG93aW5nIG5vbi1zb3AgZnJhZ21lbnRzLiBUaGV5IHdpbGwgYmUgcmV1c2VkLgorCQkJICovCisJCQlpZiAoc2tpcF9wYWdlX2ZyYWdzKQorCQkJCWdvdG8gcmNkX2RvbmU7CiAKLQkJCQkJdm14bmV0M19hcHBlbmRfZnJhZyhjdHgtPnNrYiwgcmNkLCByYmkpOwotCQkJCQlyYmktPnBhZ2UgPSBOVUxMOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgb25seSB0aW1lIGEgbm9uLVNPUCBidWZmZXIgaXMgdHlwZSAwIGlzCi0JCQkJICogd2hlbiBpdCdzIEVPUCBhbmQgZXJyb3IgZmxhZyBpcyByYWlzZWQsIHdoaWNoCi0JCQkJICogaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkLgorCQkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KG5ld19wYWdlID09IE5VTEwpKSB7CisJCQkJLyogUmVwbGFjZW1lbnQgcGFnZSBmcmFnIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisJCQkJICogUmV1c2UgdGhpcyBwYWdlLiBEcm9wIHRoZSBwa3QgYW5kIGZyZWUgdGhlCisJCQkJICogc2tiIHdoaWNoIGNvbnRhaW5lZCB0aGlzIHBhZ2UgYXMgYSBmcmFnLiBTa2lwCisJCQkJICogcHJvY2Vzc2luZyBhbGwgdGhlIGZvbGxvd2luZyBub24tc29wIGZyYWdzLgogCQkJCSAqLwotCQkJCUJVR19PTih0cnVlKTsKKwkJCQlycS0+c3RhdHMucnhfYnVmX2FsbG9jX2ZhaWx1cmUrKzsKKwkJCQlkZXZfa2ZyZWVfc2tiKGN0eC0+c2tiKTsKKwkJCQljdHgtPnNrYiA9IE5VTEw7CisJCQkJc2tpcF9wYWdlX2ZyYWdzID0gdHJ1ZTsKKwkJCQlnb3RvIHJjZF9kb25lOwogCQkJfQorCisJCQlpZiAocmNkLT5sZW4pIHsKKwkJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCQkgICAgICAgcmJpLT5kbWFfYWRkciwgcmJpLT5sZW4sCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJdm14bmV0M19hcHBlbmRfZnJhZyhjdHgtPnNrYiwgcmNkLCByYmkpOworCQkJfQorCisJCQkvKiBJbW1lZGlhdGUgcmVmaWxsICovCisJCQlyYmktPnBhZ2UgPSBuZXdfcGFnZTsKKwkJCXJiaS0+ZG1hX2FkZHIgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcmJpLT5wYWdlLAorCQkJCQkJICAgICAwLCBQQUdFX1NJWkUsCisJCQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeGQtPmFkZHIgPSBjcHVfdG9fbGU2NChyYmktPmRtYV9hZGRyKTsKKwkJCXJ4ZC0+bGVuID0gcmJpLT5sZW47CiAJCX0KIAorCiAJCXNrYiA9IGN0eC0+c2tiOwogCQlpZiAocmNkLT5lb3ApIHsKIAkJCXNrYi0+bGVuICs9IHNrYi0+ZGF0YV9sZW47CkBAIC0xMjQ0LDI2ICsxMjk2LDI3IEBACiAJCX0KIAogcmNkX2RvbmU6Ci0JCS8qIGRldmljZSBtYXkgc2tpcCBzb21lIHJ4IGRlc2NzICovCi0JCXJxLT5yeF9yaW5nW3JpbmdfaWR4XS5uZXh0MmNvbXAgPSBpZHg7Ci0JCVZNWE5FVDNfSU5DX1JJTkdfSURYX09OTFkocnEtPnJ4X3JpbmdbcmluZ19pZHhdLm5leHQyY29tcCwKLQkJCQkJICBycS0+cnhfcmluZ1tyaW5nX2lkeF0uc2l6ZSk7CisJCS8qIGRldmljZSBtYXkgaGF2ZSBza2lwcGVkIHNvbWUgcnggZGVzY3MgKi8KKwkJcmluZy0+bmV4dDJjb21wID0gaWR4OworCQludW1fdG9fYWxsb2MgPSB2bXhuZXQzX2NtZF9yaW5nX2Rlc2NfYXZhaWwocmluZyk7CisJCXJpbmcgPSBycS0+cnhfcmluZyArIHJpbmdfaWR4OworCQl3aGlsZSAobnVtX3RvX2FsbG9jKSB7CisJCQl2bXhuZXQzX2dldFJ4RGVzYyhyeGQsICZyaW5nLT5iYXNlW3JpbmctPm5leHQyZmlsbF0ucnhkLAorCQkJCQkgICZyeENtZERlc2MpOworCQkJQlVHX09OKCFyeGQtPmFkZHIpOwogCi0JCS8qIHJlZmlsbCByeCBidWZmZXJzIGZyZXF1ZW50bHkgdG8gYXZvaWQgc3RhcnZpbmcgdGhlIGgvdyAqLwotCQludW1fdG9fYWxsb2MgPSB2bXhuZXQzX2NtZF9yaW5nX2Rlc2NfYXZhaWwocnEtPnJ4X3JpbmcgKwotCQkJCQkJCSAgIHJpbmdfaWR4KTsKLQkJaWYgKHVubGlrZWx5KG51bV90b19hbGxvYyA+IFZNWE5FVDNfUlhfQUxMT0NfVEhSRVNIT0xEKHJxLAotCQkJCQkJCXJpbmdfaWR4LCBhZGFwdGVyKSkpIHsKLQkJCXZteG5ldDNfcnFfYWxsb2NfcnhfYnVmKHJxLCByaW5nX2lkeCwgbnVtX3RvX2FsbG9jLAotCQkJCQkJYWRhcHRlcik7CisJCQkvKiBSZWN2IGRlc2MgaXMgcmVhZHkgdG8gYmUgdXNlZCBieSB0aGUgZGV2aWNlICovCisJCQlyeGQtPmdlbiA9IHJpbmctPmdlbjsKKwkJCXZteG5ldDNfY21kX3JpbmdfYWR2X25leHQyZmlsbChyaW5nKTsKKwkJCW51bV90b19hbGxvYy0tOworCQl9CiAKLQkJCS8qIGlmIG5lZWRlZCwgdXBkYXRlIHRoZSByZWdpc3RlciAqLwotCQkJaWYgKHVubGlrZWx5KHJxLT5zaGFyZWQtPnVwZGF0ZVJ4UHJvZCkpIHsKLQkJCQlWTVhORVQzX1dSSVRFX0JBUjBfUkVHKGFkYXB0ZXIsCi0JCQkJCXJ4cHJvZF9yZWdbcmluZ19pZHhdICsgcnEtPnFpZCAqIDgsCi0JCQkJCXJxLT5yeF9yaW5nW3JpbmdfaWR4XS5uZXh0MmZpbGwpOwotCQkJCXJxLT51bmNvbW1pdHRlZFtyaW5nX2lkeF0gPSAwOwotCQkJfQorCQkvKiBpZiBuZWVkZWQsIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgKi8KKwkJaWYgKHVubGlrZWx5KHJxLT5zaGFyZWQtPnVwZGF0ZVJ4UHJvZCkpIHsKKwkJCVZNWE5FVDNfV1JJVEVfQkFSMF9SRUcoYWRhcHRlciwKKwkJCQlyeHByb2RfcmVnW3JpbmdfaWR4XSArIHJxLT5xaWQgKiA4LAorCQkJCXJpbmctPm5leHQyZmlsbCk7CisJCQlycS0+dW5jb21taXR0ZWRbcmluZ19pZHhdID0gMDsKIAkJfQogCiAJCXZteG5ldDNfY29tcF9yaW5nX2Fkdl9uZXh0MnByb2MoJnJxLT5jb21wX3JpbmcpOwpAQCAtMjg5NCw2ICsyOTQ3LDcgQEAKIAllbHNlCiAjZW5kaWYKIAkJbnVtX3J4X3F1ZXVlcyA9IDE7CisJbnVtX3J4X3F1ZXVlcyA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKG51bV9yeF9xdWV1ZXMpOwogCiAJaWYgKGVuYWJsZV9tcSkKIAkJbnVtX3R4X3F1ZXVlcyA9IG1pbihWTVhORVQzX0RFVklDRV9NQVhfVFhfUVVFVUVTLApAQCAtMjkwMSw2ICsyOTU1LDcgQEAKIAllbHNlCiAJCW51bV90eF9xdWV1ZXMgPSAxOwogCisJbnVtX3R4X3F1ZXVlcyA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKG51bV90eF9xdWV1ZXMpOwogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyKSwKIAkJCQkgICBtYXgobnVtX3R4X3F1ZXVlcywgbnVtX3J4X3F1ZXVlcykpOwogCXByaW50ayhLRVJOX0lORk8gIiMgb2YgVHggcXVldWVzIDogJWQsICMgb2YgUnggcXVldWVzIDogJWRcbiIsCkBAIC0zMDg1LDYgKzMxNDAsNyBAQAogCWVsc2UKICNlbmRpZgogCQludW1fcnhfcXVldWVzID0gMTsKKwludW1fcnhfcXVldWVzID0gcm91bmRkb3duX3Bvd19vZl90d28obnVtX3J4X3F1ZXVlcyk7CiAKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT53b3JrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCmluZGV4IGY1MGQzNmYuLmUwOGQ3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAorKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogI2luY2x1ZGUgInZteG5ldDNfZGVmcy5oIgogCkBAIC02OCwxMCArNjksMTAgQEAKIC8qCiAgKiBWZXJzaW9uIG51bWJlcnMKICAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjEuOS4wLWsiCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMS4xOC4wLWsiCiAKIC8qIGEgMzItYml0IGludCwgZWFjaCBieXRlIGVuY29kZSBhIHZlcmlvbiBudW1iZXIgaW4gVk1YTkVUM19EUklWRVJfVkVSU0lPTiAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX05VTSAgICAgIDB4MDEwMTA5MDAKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9OVU0gICAgICAweDAxMDExMjAwCiAKICNpZiBkZWZpbmVkKENPTkZJR19QQ0lfTVNJKQogCS8qIFJTUyBvbmx5IG1ha2VzIHNlbnNlIGlmIE1TSS1YIGlzIHN1cHBvcnRlZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCmluZGV4IGUwNTBiZDYuLjc3N2QxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwpAQCAtMjIwMyw4ICsyMjAzLDEwIEBACiAKIAlpZiAocG9ydC0+bW9kZSAhPSBGU1RfUkFXKSB7CiAJCWVyciA9IGhkbGNfb3BlbihkZXYpOwotCQlpZiAoZXJyKQorCQlpZiAoZXJyKSB7CisJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAkJCXJldHVybiBlcnI7CisJCX0KIAl9CiAKIAlmc3Rfb3BlbnBvcnQocG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwppbmRleCA0MDM5OGJmLi4yNDI5N2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMKQEAgLTUxNywxOCArNTE3LDE3IEBACiAgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCB4MjVfYXN5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCitzdGF0aWMgdm9pZCB4MjVfYXN5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IHgyNV9hc3kgKnNsID0gdHR5LT5kaXNjX2RhdGE7Ci0JaW50IGJ5dGVzID0gY291bnQ7CiAKIAlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBYMjVfQVNZX01BR0lDIHx8ICFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKQogCQlyZXR1cm47CiAKIAogCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KLQl3aGlsZSAoYnl0ZXMtLSkgeworCXdoaWxlIChjb3VudC0tKSB7CiAJCWlmIChmcCAmJiAqZnArKykgewogCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpCiAJCQkJc2wtPmRldi0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC01MzcsOCArNTM2LDYgQEAKIAkJfQogCQl4MjVfYXN5X3VuZXNjKHNsLCAqY3ArKyk7CiAJfQotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKaW5kZXggMjIwNDc2Mi4uYjZjNWQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCkBAIC03Miw2ICs3MiwxMSBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGFsbF9jaGFubmVscywgbW9kcGFyYW1fYWxsX2NoYW5uZWxzLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsX2NoYW5uZWxzLCAiRXhwb3NlIGFsbCBjaGFubmVscyB0aGUgZGV2aWNlIGNhbiB1c2UuIik7CiAKK3N0YXRpYyBpbnQgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2g7Cittb2R1bGVfcGFyYW1fbmFtZWQoZmFzdGNoYW5zd2l0Y2gsIG1vZHBhcmFtX2Zhc3RjaGFuc3dpdGNoLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZmFzdGNoYW5zd2l0Y2gsICJFbmFibGUgZmFzdCBjaGFubmVsIHN3aXRjaGluZyBmb3IgQVIyNDEzL0FSNTQxMyByYWRpb3MuIik7CisKKwogLyogTW9kdWxlIGluZm8gKi8KIE1PRFVMRV9BVVRIT1IoIkppcmkgU2xhYnkiKTsKIE1PRFVMRV9BVVRIT1IoIk5pY2sgS29zc2lmaWRpcyIpOwpAQCAtMjY4Niw2ICsyNjkxLDcgQEAKIAlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCWludCByZXQsIGFuaV9tb2RlOworCWJvb2wgZmFzdDsKIAogCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsICJyZXNldHRpbmdcbiIpOwogCkBAIC0yNzA1LDcgKzI3MTEsMTAgQEAKIAlhdGg1a19kcmFpbl90eF9idWZmcyhzYyk7CiAJaWYgKGNoYW4pCiAJCXNjLT5jdXJjaGFuID0gY2hhbjsKLQlyZXQgPSBhdGg1a19od19yZXNldChhaCwgc2MtPm9wbW9kZSwgc2MtPmN1cmNoYW4sIGNoYW4gIT0gTlVMTCwKKworCWZhc3QgPSAoKGNoYW4gIT0gTlVMTCkgJiYgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2gpID8gMSA6IDA7CisKKwlyZXQgPSBhdGg1a19od19yZXNldChhaCwgc2MtPm9wbW9kZSwgc2MtPmN1cmNoYW4sIGZhc3QsCiAJCQkJCQkJCXNraXBfcGN1KTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihzYywgImNhbid0IHJlc2V0IGhhcmR3YXJlICglZClcbiIsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYwppbmRleCA2MjE3MmQ1Li5mODIzODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKQEAgLTEwNywxMCArMTA3LDEzIEBACiAJCWNhc2UgQVI1S19QS1RfVFlQRV9CRUFDT046CiAJCWNhc2UgQVI1S19QS1RfVFlQRV9QUk9CRV9SRVNQOgogCQkJZnJhbWVfdHlwZSA9IEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9OT19ERUxBWTsKKwkJCWJyZWFrOwogCQljYXNlIEFSNUtfUEtUX1RZUEVfUElGUzoKIAkJCWZyYW1lX3R5cGUgPSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfUElGUzsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZnJhbWVfdHlwZSA9IHR5cGU7CisJCQlicmVhazsKIAkJfQogCiAJCXR4X2N0bC0+dHhfY29udHJvbF8wIHw9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKaW5kZXggMWZlZjg0Zi4uMzkyNzcxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYwpAQCAtNjkxLDE0ICs2OTEsMTIgQEAKIAkJaWYgKCFjaGluZm9bcGllcl0ucGRfY3VydmVzKQogCQkJY29udGludWU7CiAKLQkJZm9yIChwZGcgPSAwOyBwZGcgPCBlZS0+ZWVfcGRfZ2FpbnNbbW9kZV07IHBkZysrKSB7CisJCWZvciAocGRnID0gMDsgcGRnIDwgQVI1S19FRVBST01fTl9QRF9DVVJWRVM7IHBkZysrKSB7CiAJCQlzdHJ1Y3QgYXRoNWtfcGRnYWluX2luZm8gKnBkID0KIAkJCQkJJmNoaW5mb1twaWVyXS5wZF9jdXJ2ZXNbcGRnXTsKIAotCQkJaWYgKHBkICE9IE5VTEwpIHsKLQkJCQlrZnJlZShwZC0+cGRfc3RlcCk7Ci0JCQkJa2ZyZWUocGQtPnBkX3B3cik7Ci0JCQl9CisJCQlrZnJlZShwZC0+cGRfc3RlcCk7CisJCQlrZnJlZShwZC0+cGRfcHdyKTsKIAkJfQogCiAJCWtmcmVlKGNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCmluZGV4IDI5NmMzMTYuLmYyYzBjMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKQEAgLTI5Nyw3ICsyOTcsOSBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBhdGg1a19wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKIAogCWF0aDVrX2xlZF9vZmYoc2MpOwogCXJldHVybiAwOwpAQCAtMzA2LDcgKzMwOCw4IEBACiBzdGF0aWMgaW50IGF0aDVrX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCiAJLyoKIAkgKiBTdXNwZW5kL1Jlc3VtZSByZXNldHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLCBzbyB3ZSBoYXZlIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCmluZGV4IDM1MTBkZTIuLjEyNmE0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCkBAIC0xMTI0LDggKzExMjQsMTEgQEAKIAkJCS8qIE5vbiBmYXRhbCwgY2FuIGhhcHBlbiBlZy4KIAkJCSAqIG9uIG1vZGUgY2hhbmdlICovCiAJCQlyZXQgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKKwkJCUFUSDVLX0RCRyhhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX1JFU0VULAorCQkJCSJmYXN0IGNoYW4gY2hhbmdlIHN1Y2Nlc3NmdWxcbiIpOwogCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3N5c2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYwppbmRleCA5MjljNjhjLi5hMDczY2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYwpAQCAtMTAsNyArMTAsOCBAQAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQkJXAogCQkJY2hhciAqYnVmKQkJCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsJCQkJXAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBnZXQpOyAJCQlcCiB9CQkJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMTgsNyArMTksOCBAQAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQkJXAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsJCQkJXAogCWludCB2YWw7CQkJCQkJCVwKIAkJCQkJCQkJCVwKIAl2YWwgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKQEAgLTMzLDcgKzM1LDggQEAKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKIAkJCWNoYXIgKmJ1ZikJCQkJCVwKIHsJCQkJCQkJCQlcCi0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CQkJCVwKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZ2V0KTsgCQkJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhdGg1a19hdHRyX3Nob3dfIyNuYW1lLCBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwppbmRleCBkOWZmODQxLi5kOWMwOGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwpAQCAtMjYsNyArMjYsNiBAQAogY29uZmlnIEFUSDlLX1BDSQogCWJvb2wgIkF0aGVyb3MgYXRoOWsgUENJL1BDSWUgYnVzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEg5SyAmJiBQQ0kKLQlkZWZhdWx0IFBDSQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIFBDSSBidXMgc3VwcG9ydCBpbiBhdGg5ay4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jCmluZGV4IDAxNWQ5NzQuLjJkNGMwOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMKQEAgLTgyOSw3ICs4MjksNyBAQAogCWlmIChBUl9TUkVWXzkyNzEoYWgpKSB7CiAJCWlmICghYXI5Mjg1X2h3X2NsX2NhbChhaCwgY2hhbikpCiAJCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIGlmIChBUl9TUkVWXzkyODVfMTJfT1JfTEFURVIoYWgpKSB7CisJfSBlbHNlIGlmIChBUl9TUkVWXzkyODUoYWgpICYmIEFSX1NSRVZfOTI4NV8xMl9PUl9MQVRFUihhaCkpIHsKIAkJaWYgKCFhcjkyODVfaHdfY2xjKGFoLCBjaGFuKSkKIAkJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKaW5kZXggMGNhNzYzNS4uZmY4MTUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCkBAIC00NjQ1LDEwICs0NjQ1LDE2IEBACiAJY2FzZSAxOgogCQlicmVhazsKIAljYXNlIDI6Ci0JCXNjYWxlZFBvd2VyIC09IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOOworCQlpZiAoc2NhbGVkUG93ZXIgPiBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTikKKwkJCXNjYWxlZFBvd2VyIC09IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOOworCQllbHNlCisJCQlzY2FsZWRQb3dlciA9IDA7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTjsKKwkJaWYgKHNjYWxlZFBvd2VyID4gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTikKKwkJCXNjYWxlZFBvd2VyIC09IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU47CisJCWVsc2UKKwkJCXNjYWxlZFBvd2VyID0gMDsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwppbmRleCBlZWUyM2VjLi44OTJjNDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKQEAgLTEzODEsMyArMTM4MSwyNSBAQAogCQkiPT09PSBCQiB1cGRhdGU6IGRvbmUgPT09PVxuXG4iKTsKIH0KIEVYUE9SVF9TWU1CT0woYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2RiZ19pbmZvKTsKKwordm9pZCBhcjkwMDNfaHdfZGlzYWJsZV9waHlfcmVzdGFydChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwl1MzIgdmFsOworCisJLyogV2hpbGUgcmVjZWl2aW5nIHVuc3VwcG9ydGVkIHJhdGUgZnJhbWUgcnggc3RhdGUgbWFjaGluZQorCSAqIGdldHMgaW50byBhIHN0YXRlIDB4YiBhbmQgaWYgcGh5X3Jlc3RhcnQgaGFwcGVucyBpbiB0aGF0CisJICogc3RhdGUsIEJCIHdvdWxkIGdvIGhhbmcuIElmIFJYU00gaXMgaW4gMHhiIHN0YXRlIGFmdGVyCisJICogZmlyc3QgYmIgcGFuaWMsIGVuc3VyZSB0byBkaXNhYmxlIHRoZSBwaHlfcmVzdGFydC4KKwkgKi8KKwlpZiAoISgoTVMoYWgtPmJiX3dhdGNoZG9nX2xhc3Rfc3RhdHVzLAorCQkgIEFSX1BIWV9XQVRDSERPR19SWF9PRkRNX1NNKSA9PSAweGIpIHx8CisJICAgIGFoLT5iYl9oYW5nX3J4X29mZG0pKQorCQlyZXR1cm47CisKKwlhaC0+YmJfaGFuZ19yeF9vZmRtID0gdHJ1ZTsKKwl2YWwgPSBSRUdfUkVBRChhaCwgQVJfUEhZX1JFU1RBUlQpOworCXZhbCAmPSB+QVJfUEhZX1JFU1RBUlRfRU5BOworCisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfUkVTVEFSVCwgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX2h3X2Rpc2FibGVfcGh5X3Jlc3RhcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwppbmRleCA3ODU2ZjBkLi4zNDNmYzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwpAQCAtNTI0LDEwICs1MjQsMTYgQEAKIAljYXNlIDE6CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU47CisJCWlmIChzY2FsZWRQb3dlciA+IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOKQorCQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU47CisJCWVsc2UKKwkJCXNjYWxlZFBvd2VyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOOworCQlpZiAoc2NhbGVkUG93ZXIgPiBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOKQorCQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTjsKKwkJZWxzZQorCQkJc2NhbGVkUG93ZXIgPSAwOwogCQlicmVhazsKIAl9CiAJc2NhbGVkUG93ZXIgPSBtYXgoKHUxNikwLCBzY2FsZWRQb3dlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCmluZGV4IDcyNTQzY2UuLjFiZTdjOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCkBAIC0xNTU1LDkgKzE1NTUsMTIgQEAKIAlpZiAoYWgtPmJ0Y29leF9ody5lbmFibGVkKQogCQlhdGg5a19od19idGNvZXhfZW5hYmxlKGFoKTsKIAotCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQorCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCWFyOTAwM19od19iYl93YXRjaGRvZ19jb25maWcoYWgpOwogCisJCWFyOTAwM19od19kaXNhYmxlX3BoeV9yZXN0YXJ0KGFoKTsKKwl9CisKIAlhdGg5a19od19hcHBseV9ncGlvX292ZXJyaWRlKGFoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaAppbmRleCA1NzQzNWNlLi40YjE1N2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaApAQCAtODQyLDYgKzg0Miw3IEBACiAKIAl1MzIgYmJfd2F0Y2hkb2dfbGFzdF9zdGF0dXM7CiAJdTMyIGJiX3dhdGNoZG9nX3RpbWVvdXRfbXM7IC8qIGluIG1zLCAwIHRvIGRpc2FibGUgKi8KKwl1OCBiYl9oYW5nX3J4X29mZG07IC8qIHRydWUgaWYgYmIgaGFuZyBkdWUgdG8gcnhfb2ZkbSAqLwogCiAJdW5zaWduZWQgaW50IHBhcHJkX3RhcmdldF9wb3dlcjsKIAl1bnNpZ25lZCBpbnQgcGFwcmRfdHJhaW5pbmdfcG93ZXI7CkBAIC05OTAsNiArOTkxLDcgQEAKIHZvaWQgYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2NvbmZpZyhzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGFyOTAwM19od19iYl93YXRjaGRvZ19yZWFkKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2RiZ19pbmZvKHN0cnVjdCBhdGhfaHcgKmFoKTsKK3ZvaWQgYXI5MDAzX2h3X2Rpc2FibGVfcGh5X3Jlc3RhcnQoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhcjkwMDNfcGFwcmRfZW5hYmxlKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHZhbCk7CiB2b2lkIGFyOTAwM19wYXByZF9wb3B1bGF0ZV9zaW5nbGVfdGFibGUoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCXN0cnVjdCBhdGg5a19od19jYWxfZGF0YSAqY2FsZGF0YSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCmluZGV4IGExOThlZTMuLjJjYTM1MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwpAQCAtNjcwLDcgKzY3MCw4IEBACiAJdTMyIHN0YXR1cyA9IHNjLT5pbnRyc3RhdHVzOwogCXUzMiByeG1hc2s7CiAKLQlpZiAoc3RhdHVzICYgQVRIOUtfSU5UX0ZBVEFMKSB7CisJaWYgKChzdGF0dXMgJiBBVEg5S19JTlRfRkFUQUwpIHx8CisJICAgIChzdGF0dXMgJiBBVEg5S19JTlRfQkJfV0FUQ0hET0cpKSB7CiAJCWF0aF9yZXNldChzYywgdHJ1ZSk7CiAJCXJldHVybjsKIAl9CkBAIC03MzcsNiArNzM4LDcgQEAKIHsKICNkZWZpbmUgU0NIRURfSU5UUiAoCQkJCVwKIAkJQVRIOUtfSU5UX0ZBVEFMIHwJCVwKKwkJQVRIOUtfSU5UX0JCX1dBVENIRE9HIHwJCVwKIAkJQVRIOUtfSU5UX1JYT1JOIHwJCVwKIAkJQVRIOUtfSU5UX1JYRU9MIHwJCVwKIAkJQVRIOUtfSU5UX1JYIHwJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKaW5kZXggYjhjYmZjNy4uM2JhZDBiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYwpAQCAtMjc4LDYgKzI3OCwxMiBAQAogCiAJYXRoOWtfaHdfc2V0X2dwaW8oc2MtPnNjX2FoLCBzYy0+c2NfYWgtPmxlZF9waW4sIDEpOwogCisJLyogVGhlIGRldmljZSBoYXMgdG8gYmUgbW92ZWQgdG8gRlVMTFNMRUVQIGZvcmNpYmx5LgorCSAqIE90aGVyd2lzZSB0aGUgY2hpcCBuZXZlciBtb3ZlZCB0byBmdWxsIHNsZWVwLAorCSAqIHdoZW4gbm8gaW50ZXJmYWNlIGlzIHVwLgorCSAqLworCWF0aDlrX2h3X3NldHBvd2VyKHNjLT5zY19haCwgQVRIOUtfUE1fRlVMTF9TTEVFUCk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYwppbmRleCAxNzU0MjIxLi5iYTdmMzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYwpAQCAtNjg5LDcgKzY4OSw4IEBACiAKIAlpZiAoV0xBTl9SQ19QSFlfSFQocmF0ZV90YWJsZS0+aW5mb1tyaXhdLnBoeSkpIHsKIAkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX01DUzsKLQkJaWYgKFdMQU5fUkNfUEhZXzQwKHJhdGVfdGFibGUtPmluZm9bcml4XS5waHkpKQorCQlpZiAoV0xBTl9SQ19QSFlfNDAocmF0ZV90YWJsZS0+aW5mb1tyaXhdLnBoeSkgJiYKKwkJICAgIGNvbmZfaXNfaHQ0MCgmdHhyYy0+aHctPmNvbmYpKQogCQkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKIAkJaWYgKFdMQU5fUkNfUEhZX1NHSShyYXRlX3RhYmxlLT5pbmZvW3JpeF0ucGh5KSkKIAkJCXJhdGUtPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IDM3NzliODkuLjMzNDQzYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtNjcxLDcgKzY3MSw4IEBACiAJICogVE9ETyAtIHRoaXMgY291bGQgYmUgaW1wcm92ZWQgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSByYXRlLgogCSAqICAgICAgVGhlIGhhcmR3YXJlIGNhbiBrZWVwIHVwIGF0IGxvd2VyIHJhdGVzLCBidXQgbm90IGhpZ2hlciByYXRlcwogCSAqLwotCWlmIChmaS0+a2V5aXggIT0gQVRIOUtfVFhLRVlJWF9JTlZBTElEKQorCWlmICgoZmktPmtleWl4ICE9IEFUSDlLX1RYS0VZSVhfSU5WQUxJRCkgJiYKKwkgICAgIShzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9FRE1BKSkKIAkJbmRlbGltICs9IEFUSF9BR0dSX0VOQ1JZUFRERUxJTTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKaW5kZXggMmZiNTNkMC4uMzMzYjY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYwpAQCAtMTEyLDYgKzExMiw4IEBACiAJeyBVU0JfREVWSUNFKDB4MDRiYiwgMHgwOTNmKSB9LAogCS8qIE5FQyBXTDMwME5VLUcgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDA5LCAweDAyNDkpIH0sCisJLyogTkVDIFdMMzAwTlUtQUcgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDA5LCAweDAyYjQpIH0sCiAJLyogQVZNIEZSSVRaIVdMQU4gVVNCIFN0aWNrIE4gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNTdjLCAweDg0MDEpIH0sCiAJLyogQVZNIEZSSVRaIVdMQU4gVVNCIFN0aWNrIE4gMi40ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCmluZGV4IDllZDY1MTUuLjA1OTYwZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCkBAIC0zMDkzLDcgKzMwOTMsNyBAQAogCWludCBmcmVxOwogCWJvb2wgYXZvaWQgPSBmYWxzZTsKIAl1OCBsZW5ndGg7Ci0JdTE2IHRtcCwgY29yZSwgdHlwZSwgY291bnQsIG1heCwgbnVtYiwgbGFzdCwgY21kOworCXUxNiB0bXAsIGNvcmUsIHR5cGUsIGNvdW50LCBtYXgsIG51bWIsIGxhc3QgPSAwLCBjbWQ7CiAJY29uc3QgdTE2ICp0YWJsZTsKIAlib29sIHBoeTZvcjV4OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxpYi5jCmluZGV4IDdlNWU4NWEuLmE3YTQ3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxpYi5jCkBAIC02MjgsMTEgKzYyOCwxMSBAQAogCiAJLyogcnhfc3RhdHVzIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldCB0byBtYWM4MDIxMSAqLwogCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocGh5X3Jlcy0+dGltZXN0YW1wKTsKKwlyeF9zdGF0dXMuYmFuZCA9IChwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/CisJCQkJSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7CiAJcnhfc3RhdHVzLmZyZXEgPQogCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobGUxNl90b19jcHUocGh5X3Jlcy0+Y2hhbm5lbCksCiAJCQkJCQkJcnhfc3RhdHVzLmJhbmQpOwotCXJ4X3N0YXR1cy5iYW5kID0gKHBoeV9yZXMtPnBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfQkFORF8yNF9NU0spID8KLQkJCQlJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKIAlyeF9zdGF0dXMucmF0ZV9pZHggPQogCQlpd2w0OTY1X2h3cmF0ZV90b19tYWM4MDIxMV9pZHgocmF0ZV9uX2ZsYWdzLCByeF9zdGF0dXMuYmFuZCk7CiAJcnhfc3RhdHVzLmZsYWcgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKaW5kZXggZjU0MzNjNy4uZmFjYzk0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jCkBAIC0xMjE4LDEwICsxMjE4LDEwIEBACiAJICogcmVjZWl2ZSBjb21taXRfcnhvbiByZXF1ZXN0CiAJICogYWJvcnQgYW55IHByZXZpb3VzIGNoYW5uZWwgc3dpdGNoIGlmIHN0aWxsIGluIHByb2Nlc3MKIAkgKi8KLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzICYmCi0JICAgIChwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgeworCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKKwkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewogCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCkpOworCQkgICAgICBsZTE2X3RvX2NwdShwcml2LT5zd2l0Y2hfY2hhbm5lbCkpOwogCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIApAQCAtMTIzNyw3ICsxMjM3LDcgQEAKIAogCQltZW1jcHkoYWN0aXZlX3J4b24sICZjdHgtPnN0YWdpbmcsIHNpemVvZigqYWN0aXZlX3J4b24pKTsKIAkJaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHByaXYsIGN0eCk7Ci0JCXJldHVybiAwOworCQlnb3RvIHNldF90eF9wb3dlcjsKIAl9CiAKIAkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGFzc29jaWF0ZWQgYW5kIHRoZSBuZXcgY29uZmlnIHJlcXVpcmVzCkBAIC0xMzE3LDYgKzEzMTcsNyBAQAogCiAJaXdsNDk2NV9pbml0X3NlbnNpdGl2aXR5KHByaXYpOwogCitzZXRfdHhfcG93ZXI6CiAJLyogSWYgd2UgaXNzdWUgYSBuZXcgUlhPTiBjb21tYW5kIHdoaWNoIHJlcXVpcmVkIGEgdHVuZSB0aGVuIHdlIG11c3QKIAkgKiBzZW5kIGEgbmV3IFRYUE9XRVIgY29tbWFuZCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIFR4IGFueSBmcmFtZXMgKi8KIAlyZXQgPSBpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCB0cnVlKTsKQEAgLTE0MDMsOSArMTQwNCw2IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsID0gY21kLmNoYW5uZWw7Ci0JcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gdHJ1ZTsKLQogCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LAogCQkJIFJFUExZX0NIQU5ORUxfU1dJVENILCBzaXplb2YoY21kKSwgJmNtZCk7CiB9CkBAIC0xNTQzLDcgKzE1NDEsNyBAQAogCXMzMiB0ZW1wOwogCiAJdGVtcCA9IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCWlmICh0ZW1wIDwgMCkKKwlpZiAoSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX09VVF9PRl9SQU5HRSh0ZW1wKSkKIAkJcmV0dXJuOwogCiAJaWYgKHByaXYtPnRlbXBlcmF0dXJlICE9IHRlbXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCmluZGV4IDQyZGY4MzIuLjNiZTc2YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYwpAQCAtODU5LDEyICs4NTksOCBAQAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJcmV0dXJuOwogCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykgeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgaXNfc3VjY2Vzcyk7Ci0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gZmFsc2U7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCX0KIH0KIEVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKTsKIApAQCAtODc2LDE5ICs4NzIsMTkgQEAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwogCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7Ci0JCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmCi0JCSAgICAoY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwpKSB7Ci0JCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmIGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfY2hhbm5lbCkgeworCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAogCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKLQkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKLQkJfQorCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJSVdMX0VSUihwcml2LCAiQ1NBIG5vdGlmIChmYWlsKSA6IGNoYW5uZWwgJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKKwkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcnhfY3NhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCmluZGV4IGJjNjZjNjAuLmM1ZmJkYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaApAQCAtNTYwLDcgKzU2MCw3IEBACiAjZGVmaW5lIFNUQVRVU19TQ0FOX0hXCQkxNQogI2RlZmluZSBTVEFUVVNfUE9XRVJfUE1JCTE2CiAjZGVmaW5lIFNUQVRVU19GV19FUlJPUgkJMTcKLQorI2RlZmluZSBTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORyAxOAogCiBzdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaAppbmRleCBiZTAxMDZjLi5lYTMwMTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oCkBAIC04NTUsMTcgKzg1NSw2IEBACiB9OwogCiAvKgotICogaXdsX3N3aXRjaF9yeG9uOiAiY2hhbm5lbCBzd2l0Y2giIHN0cnVjdHVyZQotICoKLSAqIEAgc3dpdGNoX2luX3Byb2dyZXNzOiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcwotICogQCBjaGFubmVsOiBuZXcgY2hhbm5lbAotICovCi1zdHJ1Y3QgaXdsX3N3aXRjaF9yeG9uIHsKLQlib29sIHN3aXRjaF9pbl9wcm9ncmVzczsKLQlfX2xlMTYgY2hhbm5lbDsKLX07Ci0KLS8qCiAgKiBzY2hlZHVsZSB0aGUgdGltZXIgdG8gd2FrZSB1cCBldmVyeSBVQ09ERV9UUkFDRV9QRVJJT0QgbWlsbGlzZWNvbmRzCiAgKiB0byBwZXJmb3JtIGNvbnRpbnVvdXMgdUNvZGUgZXZlbnQgbG9nZ2luZyBvcGVyYXRpb24gaWYgZW5hYmxlZAogICovCkBAIC0xMTE1LDcgKzExMDQsNyBAQAogCiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgY29udGV4dHNbTlVNX0lXTF9SWE9OX0NUWF07CiAKLQlzdHJ1Y3QgaXdsX3N3aXRjaF9yeG9uIHN3aXRjaF9yeG9uOworCV9fbGUxNiBzd2l0Y2hfY2hhbm5lbDsKIAogCS8qIDFzdCByZXNwb25zZXMgZnJvbSBpbml0aWFsaXplIGFuZCBydW50aW1lIHVDb2RlIGltYWdlcy4KIAkgKiBfNDk2NSdzIGluaXRpYWxpemUgYWxpdmUgcmVzcG9uc2UgY29udGFpbnMgc29tZSBjYWxpYnJhdGlvbiBkYXRhLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsNDk2NS1iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYwppbmRleCBhZjJhZTIyLi43MTU3YmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYwpAQCAtMjg2MSwxNiArMjg2MSwxMyBAQAogCQlnb3RvIG91dDsKIAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKQorCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJZ290byBvdXQ7CiAKIAlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKIAkJZ290byBvdXQ7CiAKLQkvKiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcyAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPT0gdHJ1ZSkKLQkJZ290byBvdXQ7Ci0KIAlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKSB7CiAKIAkJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKQEAgLTI5MTksMTUgKzI5MTYsMTggQEAKIAkJCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCiAJCQkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAogCQkJICovCi0JCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKHByaXYsCi0JCQkJCQkJCSAgICBjaF9zd2l0Y2gpKQotCQkJCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJc2V0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cyk7CisJCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKKwkJCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgeworCQkJCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywKKwkJCQkJICAmcHJpdi0+c3RhdHVzKTsKKwkJCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKKwkJCX0KIAkJfQogCX0KIG91dDoKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQlpZiAoIXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCmluZGV4IDYxZDRhMTEuLjJhODhlNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCkBAIC01NSwxMCArNTYsMTAgQEAKICNkZWZpbmUgSVdMMTAwX1VDT0RFX0FQSV9NSU4gNQogCiAjZGVmaW5lIElXTDEwMDBfRldfUFJFICJpd2x3aWZpLTEwMDAtIgotI2RlZmluZSBJV0wxMDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwMDBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMMTAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMDAwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMMTAwX0ZXX1BSRSAiaXdsd2lmaS0xMDAtIgotI2RlZmluZSBJV0wxMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMTAwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDEwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMDBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCmluZGV4IDg2ZmVlYzguLjNkZjc2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCkBAIC01OCwxMyArNTksMTMgQEAKICNkZWZpbmUgSVdMMTA1X1VDT0RFX0FQSV9NSU4gNQogCiAjZGVmaW5lIElXTDIwMzBfRldfUFJFICJpd2x3aWZpLTIwMzAtIgotI2RlZmluZSBJV0wyMDMwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDIwMzBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMMjAzMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wyMDMwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMMjAwMF9GV19QUkUgIml3bHdpZmktMjAwMC0iCi0jZGVmaW5lIElXTDIwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMjAwMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0wyMDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDIwMDBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0wxMDVfRldfUFJFICJpd2x3aWZpLTEwNS0iCi0jZGVmaW5lIElXTDEwNV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMDVfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMMTA1X01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwNV9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiBzdGF0aWMgdm9pZCBpd2wyMDAwX3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpAQCAtMTc3LDc5ICsxNzgsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGl3bDIwMzBfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQotewotCS8qCi0JICogTVVMVEktRklYTUUKLQkgKiBTZWUgaXdsX21hY19jaGFubmVsX3N3aXRjaC4KLQkgKi8KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpd2w2MDAwX2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOwotCXUxNiBjaDsKLQl1MzIgdHNmX2xvdzsKLQl1OCBzd2l0Y2hfY291bnQ7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsCi0JCS5sZW4gPSB7IHNpemVvZihjbWQpLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKLQkJLmRhdGEgPSB7ICZjbWQsIH0sCi0JfTsKLQotCWNtZC5iYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwotCWNoID0gY2hfc3dpdGNoLT5jaGFubmVsLT5od192YWx1ZTsKLQlJV0xfREVCVUdfMTFIKHByaXYsICJjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAotCQljdHgtPmFjdGl2ZS5jaGFubmVsLCBjaCk7Ci0JY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JY21kLnJ4b25fZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0JY21kLnJ4b25fZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OwotCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOwotCS8qCi0JICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCi0JICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKLQkgKi8KLQlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7Ci0JCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLwotCQkgICAgYmVhY29uX2ludGVydmFsKSkgewotCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCi0JCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7Ci0JCX0gZWxzZQotCQkJc3dpdGNoX2NvdW50ID0gMDsKLQl9Ci0JaWYgKHN3aXRjaF9jb3VudCA8PSAxKQotCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7Ci0JZWxzZSB7Ci0JCXN3aXRjaF90aW1lX2luX3VzZWMgPQotCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOwotCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF91c2Vjc190b19iZWFjb25zKHByaXYsCi0JCQkJCQlzd2l0Y2hfdGltZV9pbl91c2VjLAotCQkJCQkJYmVhY29uX2ludGVydmFsKTsKLQkJY21kLnN3aXRjaF90aW1lID0gaXdsX2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCQkJcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUsCi0JCQkJCQl1Y29kZV9zd2l0Y2hfdGltZSwKLQkJCQkJCWJlYWNvbl9pbnRlcnZhbCk7Ci0JfQotCUlXTF9ERUJVR18xMUgocHJpdiwgInVDb2RlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggaXMgMHgleFxuIiwKLQkJICAgICAgY21kLnN3aXRjaF90aW1lKTsKLQljaF9pbmZvID0gaXdsX2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2gpOwotCWlmIChjaF9pbmZvKQotCQljbWQuZXhwZWN0X2JlYWNvbiA9IGlzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7Ci0JZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgImludmFsaWQgY2hhbm5lbCBzd2l0Y2ggZnJvbSAldSB0byAldVxuIiwKLQkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwotCi0JcmV0dXJuIGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2wyMDAwX2xpYiA9IHsKIAkuc2V0X2h3X3BhcmFtcyA9IGl3bDIwMDBfaHdfc2V0X2h3X3BhcmFtcywKIAkucnhfaGFuZGxlcl9zZXR1cCA9IGl3bGFnbl9yeF9oYW5kbGVyX3NldHVwLApAQCAtMjU4LDcgKzE4Niw2IEBACiAJLmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIgPSBpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKIAkuc2VuZF90eF9wb3dlciA9IGl3bGFnbl9zZW5kX3R4X3Bvd2VyLAogCS51cGRhdGVfY2hhaW5fZmxhZ3MgPSBpd2xfdXBkYXRlX2NoYWluX2ZsYWdzLAotCS5zZXRfY2hhbm5lbF9zd2l0Y2ggPSBpd2wyMDMwX2h3X2NoYW5uZWxfc3dpdGNoLAogCS5hcG1fb3BzID0gewogCQkuaW5pdCA9IGl3bF9hcG1faW5pdCwKIAkJLmNvbmZpZyA9IGl3bDIwMDBfbmljX2NvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwppbmRleCBhNzBiOGNmLi5lODE2YzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAKICNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCiAjaW5jbHVkZSAiaXdsLWRldi5oIgpAQCAtNTcsMTAgKzU4LDEwIEBACiAjZGVmaW5lIElXTDUxNTBfVUNPREVfQVBJX01JTiAxCiAKICNkZWZpbmUgSVdMNTAwMF9GV19QUkUgIml3bHdpZmktNTAwMC0iCi0jZGVmaW5lIElXTDUwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNTAwMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w1MDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDUwMDBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0w1MTUwX0ZXX1BSRSAiaXdsd2lmaS01MTUwLSIKLSNkZWZpbmUgSVdMNTE1MF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w1MTUwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDUxNTBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNTE1MF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAvKiBOSUMgY29uZmlndXJhdGlvbiBmb3IgNTAwMCBzZXJpZXMgKi8KIHN0YXRpYyB2b2lkIGl3bDUwMDBfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC0zMzEsOCArMzMyLDYgQEAKIAkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCiAJcmV0dXJuIGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKIH0KQEAgLTQyNSw3ICs0MjQsNiBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgaXdsX2h0X3BhcmFtcyBpd2w1MDAwX2h0X3BhcmFtcyA9IHsKIAkuaHRfZ3JlZW5maWVsZF9zdXBwb3J0ID0gdHJ1ZSwKLQkudXNlX3J0c19mb3JfYWdncmVnYXRpb24gPSB0cnVlLCAvKiB1c2UgcnRzL2N0cyBwcm90ZWN0aW9uICovCiB9OwogCiAjZGVmaW5lIElXTF9ERVZJQ0VfNTAwMAkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwppbmRleCBmOGM3MTBkLi41YjE1MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAKICNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCiAjaW5jbHVkZSAiaXdsLWRldi5oIgpAQCAtNTgsMTYgKzU5LDE2IEBACiAjZGVmaW5lIElXTDYwMDBHMl9VQ09ERV9BUElfTUlOIDQKIAogI2RlZmluZSBJV0w2MDAwX0ZXX1BSRSAiaXdsd2lmaS02MDAwLSIKLSNkZWZpbmUgSVdMNjAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDAwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAwMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIElXTDYwNTBfRldfUFJFICJpd2x3aWZpLTYwNTAtIgotI2RlZmluZSBJV0w2MDUwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwNTBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMNjA1MF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDUwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMNjAwNV9GV19QUkUgIml3bHdpZmktNjAwMGcyYS0iCi0jZGVmaW5lIElXTDYwMDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAwNV9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w2MDA1X01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwMDVfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0w2MDMwX0ZXX1BSRSAiaXdsd2lmaS02MDAwZzJiLSIKLSNkZWZpbmUgSVdMNjAzMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDMwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDYwMzBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAzMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiBzdGF0aWMgdm9pZCBpd2w2MDAwX3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpAQCAtMjcwLDggKzI3MSw2IEBACiAJCQljdHgtPmFjdGl2ZS5jaGFubmVsLCBjaCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsID0gY21kLmNoYW5uZWw7Ci0JcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAogCXJldHVybiBpd2xfc2VuZF9jbWRfc3luYyhwcml2LCAmaGNtZCk7CiB9CkBAIC02MDMsMTkgKzYwMiwyNyBAQAogCUlXTF9ERVZJQ0VfNjA1MCwKIH07CiAKKyNkZWZpbmUgSVdMX0RFVklDRV82MTUwCQkJCQkJXAorCS5md19uYW1lX3ByZSA9IElXTDYwNTBfRldfUFJFLAkJCQlcCisJLnVjb2RlX2FwaV9tYXggPSBJV0w2MDUwX1VDT0RFX0FQSV9NQVgsCQkJXAorCS51Y29kZV9hcGlfbWluID0gSVdMNjA1MF9VQ09ERV9BUElfTUlOLAkJCVwKKwkub3BzID0gJml3bDYxNTBfb3BzLAkJCQkJXAorCS5lZXByb21fdmVyID0gRUVQUk9NXzYxNTBfRUVQUk9NX1ZFUlNJT04sCQlcCisJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjE1MF9UWF9QT1dFUl9WRVJTSU9OLAlcCisJLmJhc2VfcGFyYW1zID0gJml3bDYwNTBfYmFzZV9wYXJhbXMsCQkJXAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKKwkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAkJCQlcCisJLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlCisKIHN0cnVjdCBpd2xfY2ZnIGl3bDYxNTBfYmduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OICsgV2lNQVggNjE1MCBCR04iLAotCS5md19uYW1lX3ByZSA9IElXTDYwNTBfRldfUFJFLAotCS51Y29kZV9hcGlfbWF4ID0gSVdMNjA1MF9VQ09ERV9BUElfTUFYLAotCS51Y29kZV9hcGlfbWluID0gSVdMNjA1MF9VQ09ERV9BUElfTUlOLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzYxNTBfRUVQUk9NX1ZFUlNJT04sCi0JLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjE1MF9UWF9QT1dFUl9WRVJTSU9OLAotCS5vcHMgPSAmaXdsNjE1MF9vcHMsCi0JLmJhc2VfcGFyYW1zID0gJml3bDYwNTBfYmFzZV9wYXJhbXMsCisJSVdMX0RFVklDRV82MTUwLAogCS5odF9wYXJhbXMgPSAmaXdsNjAwMF9odF9wYXJhbXMsCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAotCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCi0JLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlLAorfTsKKworc3RydWN0IGl3bF9jZmcgaXdsNjE1MF9iZ19jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgV2lyZWxlc3MtTiArIFdpTUFYIDYxNTAgQkciLAorCUlXTF9ERVZJQ0VfNjE1MCwKIH07CiAKIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMDBfM2Fnbl9jZmcgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taGNtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWhjbWQuYwppbmRleCBiMTJjNzJkLi4yM2ZhOTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taGNtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMKQEAgLTE2MywxNyArMTYzLDkgQEAKIAkJCQkgICAgIF9fbGUxNiBmYywgX19sZTMyICp0eF9mbGFncykKIHsKIAlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUyB8fAotCSAgICBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgeworCSAgICBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCB8fAorCSAgICBpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCiAJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1BST1RfUkVRVUlSRV9NU0s7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uICYmCi0JICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgewotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19QUk9UX1JFUVVJUkVfTVNLOwotCQlyZXR1cm47Ci0JfQogfQogCiAvKiBDYWxjIG1heCBzaWduYWwgbGV2ZWwgKGRCbSkgYW1vbmcgMyBwb3NzaWJsZSByZWNlaXZlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jCmluZGV4IGE5NWFkODQuLjA5ZjY3OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYwpAQCAtMzI1LDYgKzMyNSwxNCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiBmb3JjZSBDVFMtdG8tc2VsZiBmcmFtZXMgcHJvdGVjdGlvbiBpZiBSVFMtQ1RTIGlzIG5vdCBwcmVmZXJyZWQKKwkgKiBvbmUgYWdncmVnYXRpb24gcHJvdGVjdGlvbiBtZXRob2QKKwkgKi8KKwlpZiAoIShwcml2LT5jZmctPmh0X3BhcmFtcyAmJgorCSAgICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikpCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TRUxGX0NUU19FTjsKKwogCWlmICgoY3R4LT52aWYgJiYgY3R4LT52aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KSB8fAogCSAgICAhKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykpCiAJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKQEAgLTM0MiwxMCArMzUwLDEwIEBACiAJICogcmVjZWl2ZSBjb21taXRfcnhvbiByZXF1ZXN0CiAJICogYWJvcnQgYW55IHByZXZpb3VzIGNoYW5uZWwgc3dpdGNoIGlmIHN0aWxsIGluIHByb2Nlc3MKIAkgKi8KLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzICYmCi0JICAgIChwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgeworCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKKwkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewogCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCkpOworCQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX2NoYW5uZWwpKTsKIAkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIApAQCAtMzYyLDYgKzM3MCwxMSBAQAogCQl9CiAKIAkJbWVtY3B5KGFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmUpKTsKKwkJLyoKKwkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAorCQkgKiBkbyBpdCBub3cgaWYgYWZ0ZXIgc2V0dGluZ3MgY2hhbmdlZC4KKwkJICovCisJCWl3bF9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfbmV4dCwgZmFsc2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKaW5kZXggMTFjNmMxMS4uOGUxOTQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKQEAgLTI4NDMsMTYgKzI4NDMsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWdvdG8gb3V0OwogCiAJaWYgKCFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKIAkJZ290byBvdXQ7CiAKLQkvKiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcyAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPT0gdHJ1ZSkKLQkJZ290byBvdXQ7Ci0KIAlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKSB7CiAKIAkJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKQEAgLTI5MDEsMTUgKzI4OTgsMTkgQEAKIAkJCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCiAJCQkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAogCQkJICovCisJCQlzZXRfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKKwkJCXByaXYtPnN3aXRjaF9jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOwogCQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LAotCQkJCQkJCQkgICAgY2hfc3dpdGNoKSkKLQkJCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCQkJCQkJICAgIGNoX3N3aXRjaCkpIHsKKwkJCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsCisJCQkJCSAgJnByaXYtPnN0YXR1cyk7CisJCQkJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSAwOworCQkJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJCQl9CiAJCX0KIAl9CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKCFwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpCi0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CiAJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CiB9CiAKQEAgLTM4MzEsMTEgKzM4MzIsMTEgQEAKIAogLyogNjE1MCBXaUZpL1dpTWF4IFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMwNSwgaXdsNjE1MF9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzA2LCBpd2w2MTUwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMDcsIGl3bDYxNTBfYmdfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzI1LCBpd2w2MTUwX2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMjYsIGl3bDYxNTBfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMyNywgaXdsNjE1MF9iZ19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODg2LCAweDEzMTUsIGl3bDYxNTBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODYsIDB4MTMxNiwgaXdsNjE1MF9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NiwgMHgxMzE3LCBpd2w2MTUwX2JnX2NmZyl9LAogCiAvKiAxMDAwIFNlcmllcyBXaUZpICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MywgMHgxMjA1LCBpd2wxMDAwX2Jnbl9jZmcpfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmgKaW5kZXggMjQ5NWZlNy4uZDE3MTY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmgKQEAgLTg5LDYgKzg5LDcgQEAKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDUwXzJhZ25fY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwNTBfMmFiZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjE1MF9iZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYxNTBfYmdfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEwMDBfYmduX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDAwX2JnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDBfYmduX2NmZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYwppbmRleCA0NjUzZGVhLi40NWNjNTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCkBAIC04NDMsMTIgKzg0Myw4IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQogfQogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKQEAgLTE3NjcsNiArMTc2Myw3IEBACiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpic3NfY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXA7CisJZW51bSBubDgwMjExX2lmdHlwZSBuZXd2aWZ0eXBlID0gbmV3dHlwZTsKIAl1MzIgaW50ZXJmYWNlX21vZGVzOwogCWludCBlcnI7CiAKQEAgLTE4MjIsNyArMTgxOSw3IEBACiAKIAkvKiBzdWNjZXNzICovCiAJaXdsX3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIHRydWUpOwotCXZpZi0+dHlwZSA9IG5ld3R5cGU7CisJdmlmLT50eXBlID0gbmV3dmlmdHlwZTsKIAl2aWYtPnAycCA9IG5ld3AycDsKIAllcnIgPSBpd2xfc2V0dXBfaW50ZXJmYWNlKHByaXYsIGN0eCk7CiAJV0FSTl9PTihlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDNiYjc2ZjYuLmE1NGQ0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTU2MCw2ICs1NjAsNyBAQAogI2RlZmluZSBTVEFUVVNfUE9XRVJfUE1JCTE2CiAjZGVmaW5lIFNUQVRVU19GV19FUlJPUgkJMTcKICNkZWZpbmUgU1RBVFVTX0RFVklDRV9FTkFCTEVECTE4CisjZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE5CiAKIAogc3RhdGljIGlubGluZSBpbnQgaXdsX2lzX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKaW5kZXggMjJhNmUzZS4uYzhkZTIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKQEAgLTk4MiwxNyArOTgyLDYgQEAKIH07CiAKIC8qCi0gKiBpd2xfc3dpdGNoX3J4b246ICJjaGFubmVsIHN3aXRjaCIgc3RydWN0dXJlCi0gKgotICogQCBzd2l0Y2hfaW5fcHJvZ3Jlc3M6IGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzCi0gKiBAIGNoYW5uZWw6IG5ldyBjaGFubmVsCi0gKi8KLXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gewotCWJvb2wgc3dpdGNoX2luX3Byb2dyZXNzOwotCV9fbGUxNiBjaGFubmVsOwotfTsKLQotLyoKICAqIHNjaGVkdWxlIHRoZSB0aW1lciB0byB3YWtlIHVwIGV2ZXJ5IFVDT0RFX1RSQUNFX1BFUklPRCBtaWxsaXNlY29uZHMKICAqIHRvIHBlcmZvcm0gY29udGludW91cyB1Q29kZSBldmVudCBsb2dnaW5nIG9wZXJhdGlvbiBpZiBlbmFibGVkCiAgKi8KQEAgLTEyODcsNyArMTI3Niw3IEBACiAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCBjb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsKIAotCXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gc3dpdGNoX3J4b247CisJX19sZTE2IHN3aXRjaF9jaGFubmVsOwogCiAJc3RydWN0IHsKIAkJdTMyIGVycm9yX2V2ZW50X3RhYmxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKaW5kZXggMDA1M2U5ZS4uYjc3NDUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCkBAIC0yNTAsMTkgKzI1MCwxOSBAQAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CiAJc3RydWN0IGl3bF9yeG9uX2NtZCAqcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOwogCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykgewotCQlpZiAoIWxlMzJfdG9fY3B1KGNzYS0+c3RhdHVzKSAmJgotCQkgICAgKGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsKSkgewotCQkJcnhvbi0+Y2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKLQkJCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAorCWlmICghdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoIWxlMzJfdG9fY3B1KGNzYS0+c3RhdHVzKSAmJiBjc2EtPmNoYW5uZWwgPT0gcHJpdi0+c3dpdGNoX2NoYW5uZWwpIHsKKwkJcnhvbi0+Y2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7CisJCUlXTF9ERUJVR18xMUgocHJpdiwgIkNTQSBub3RpZjogY2hhbm5lbCAlZFxuIiwKIAkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKLQkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwotCQl9CisJCWl3bF9jaHN3aXRjaF9kb25lKHByaXYsIHRydWUpOworCX0gZWxzZSB7CisJCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAorCQkJbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7CisJCWl3bF9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jCmluZGV4IDY4NmUxNzYuLjEzN2RiYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYwpAQCAtMTI2LDcgKzEyNiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl3bGFnbl91bm1hcF90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2NtZF9tZXRhICptZXRhLAotCQkJICAgICBzdHJ1Y3QgaXdsX3RmZCAqdGZkKQorCQkJICAgICBzdHJ1Y3QgaXdsX3RmZCAqdGZkLCBpbnQgZG1hX2RpcikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcHJpdi0+cGNpX2RldjsKIAlpbnQgaTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCS8qIFVubWFwIGNodW5rcywgaWYgYW55LiAqLwogCWZvciAoaSA9IDE7IGkgPCBudW1fdGJzOyBpKyspCiAJCXBjaV91bm1hcF9zaW5nbGUoZGV2LCBpd2xfdGZkX3RiX2dldF9hZGRyKHRmZCwgaSksCi0JCQkJaXdsX3RmZF90Yl9nZXRfbGVuKHRmZCwgaSksIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWl3bF90ZmRfdGJfZ2V0X2xlbih0ZmQsIGkpLCBkbWFfZGlyKTsKIH0KIAogLyoqCkBAIC0xNjcsNyArMTY3LDggQEAKIAlzdHJ1Y3QgaXdsX3RmZCAqdGZkX3RtcCA9IHR4cS0+dGZkczsKIAlpbnQgaW5kZXggPSB0eHEtPnEucmVhZF9wdHI7CiAKLQlpd2xhZ25fdW5tYXBfdGZkKHByaXYsICZ0eHEtPm1ldGFbaW5kZXhdLCAmdGZkX3RtcFtpbmRleF0pOworCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgJnR4cS0+bWV0YVtpbmRleF0sICZ0ZmRfdG1wW2luZGV4XSwKKwkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCS8qIGZyZWUgU0tCICovCiAJaWYgKHR4cS0+dHhiKSB7CkBAIC0zMTAsOSArMzExLDcgQEAKIAkJaSA9IGdldF9jbWRfaW5kZXgocSwgcS0+cmVhZF9wdHIpOwogCiAJCWlmICh0eHEtPm1ldGFbaV0uZmxhZ3MgJiBDTURfTUFQUEVEKSB7Ci0JCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJCSBkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2ldLCBtYXBwaW5nKSwKLQkJCQkJIGRtYV91bm1hcF9sZW4oJnR4cS0+bWV0YVtpXSwgbGVuKSwKKwkJCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgJnR4cS0+bWV0YVtpXSwgJnR4cS0+dGZkc1tpXSwKIAkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCQl0eHEtPm1ldGFbaV0uZmxhZ3MgPSAwOwogCQl9CkBAIC01MzUsMTIgKzUzNCw3IEBACiB2b2lkIGl3bF90eF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKIAkJCWludCBzbG90c19udW0sIHUzMiB0eHFfaWQpCiB7Ci0JaW50IGFjdHVhbF9zbG90cyA9IHNsb3RzX251bTsKLQotCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQlhY3R1YWxfc2xvdHMrKzsKLQotCW1lbXNldCh0eHEtPm1ldGEsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9tZXRhKSAqIGFjdHVhbF9zbG90cyk7CisJbWVtc2V0KHR4cS0+bWV0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfY21kX21ldGEpICogc2xvdHNfbnVtKTsKIAogCXR4cS0+bmVlZF91cGRhdGUgPSAwOwogCkBAIC03MDAsMTAgKzY5NCwxMSBAQAogCQlpZiAoIShjbWQtPmRhdGFmbGFnc1tpXSAmIElXTF9IQ01EX0RGTF9OT0NPUFkpKQogCQkJY29udGludWU7CiAJCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsICh2b2lkICopY21kLT5kYXRhW2ldLAotCQkJCQkgICBjbWQtPmxlbltpXSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCSAgIGNtZC0+bGVuW2ldLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHByaXYtPnBjaV9kZXYsIHBoeXNfYWRkcikpIHsKIAkJCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgb3V0X21ldGEsCi0JCQkJCSAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJCQkgJnR4cS0+dGZkc1txLT53cml0ZV9wdHJdLAorCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAkJCWlkeCA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtODA3LDcgKzgwMiw3IEBACiAJY21kID0gdHhxLT5jbWRbY21kX2luZGV4XTsKIAltZXRhID0gJnR4cS0+bWV0YVtjbWRfaW5kZXhdOwogCi0JaXdsYWduX3VubWFwX3RmZChwcml2LCBtZXRhLCAmdHhxLT50ZmRzW2luZGV4XSk7CisJaXdsYWduX3VubWFwX3RmZChwcml2LCBtZXRhLCAmdHhxLT50ZmRzW2luZGV4XSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAogCS8qIElucHV0IGVycm9yIGNoZWNraW5nIGlzIGRvbmUgd2hlbiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gcXVldWUuICovCiAJaWYgKG1ldGEtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCmluZGV4IDg0NTY2ZGIuLjcxYzhmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCkBAIC05OTQsNiArOTk0LDggQEAKIAljbWQgPSBjbWRub2RlLT5jbWRidWY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5zZXFudW0rKzsKKwljbWQtPnNlcW51bSA9IGNwdV90b19sZTE2KHByaXYtPnNlcW51bSk7CiAJcHJpdi0+Y3VyX2NtZCA9IGNtZG5vZGU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIApAQCAtMTYyMSwxMSArMTYyMyw5IEBACiAJLyogQ29weSB0aGUgaW5jb21pbmcgY29tbWFuZCB0byB0aGUgYnVmZmVyICovCiAJbWVtY3B5KGNtZG5vZGUtPmNtZGJ1ZiwgaW5fY21kLCBpbl9jbWRfc2l6ZSk7CiAKLQkvKiBTZXQgc2VxdWVuY2UgbnVtYmVyLCBjbGVhbiByZXN1bHQsIG1vdmUgdG8gYnVmZmVyICovCi0JcHJpdi0+c2VxbnVtKys7CisJLyogU2V0IGNvbW1hbmQsIGNsZWFuIHJlc3VsdCwgbW92ZSB0byBidWZmZXIgKi8KIAljbWRub2RlLT5jbWRidWYtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjb21tYW5kKTsKIAljbWRub2RlLT5jbWRidWYtPnNpemUgICAgPSBjcHVfdG9fbGUxNihpbl9jbWRfc2l6ZSk7Ci0JY21kbm9kZS0+Y21kYnVmLT5zZXFudW0gID0gY3B1X3RvX2xlMTYocHJpdi0+c2VxbnVtKTsKIAljbWRub2RlLT5jbWRidWYtPnJlc3VsdCAgPSAwOwogCiAJbGJzX2RlYl9ob3N0KCJQUkVQX0NNRDogY29tbWFuZCAweCUwNHhcbiIsIGNvbW1hbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCmluZGV4IGE3YjVjYjAuLjIyNGU5ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKQEAgLTkwNyw3ICs5MDcsNyBAQAogCWNhcmQgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOwogCiAJY2F1c2UgPSBzZGlvX3JlYWRiKGNhcmQtPmZ1bmMsIElGX1NESU9fSF9JTlRfU1RBVFVTLCAmcmV0KTsKLQlpZiAocmV0KQorCWlmIChyZXQgfHwgIWNhdXNlKQogCQlnb3RvIG91dDsKIAogCWxic19kZWJfc2RpbygiaW50ZXJydXB0OiAweCVYXG4iLCAodW5zaWduZWQpY2F1c2UpOwpAQCAtMTAwOCwxMCArMTAwOCw2IEBACiAJaWYgKHJldCkKIAkJZ290byByZWxlYXNlOwogCi0JcmV0ID0gc2Rpb19jbGFpbV9pcnEoZnVuYywgaWZfc2Rpb19pbnRlcnJ1cHQpOwotCWlmIChyZXQpCi0JCWdvdG8gZGlzYWJsZTsKLQogCS8qIEZvciAxLWJpdCB0cmFuc2ZlcnMgdG8gdGhlIDg2ODYgbW9kZWwsIHdlIG5lZWQgdG8gZW5hYmxlIHRoZQogCSAqIGludGVycnVwdCBmbGFnIGluIHRoZSBDQ0NSIHJlZ2lzdGVyLiBTZXQgdGhlIE1NQ19RVUlSS19MRU5JRU5UX0ZOMAogCSAqIGJpdCB0byBhbGxvdyBhY2Nlc3MgdG8gbm9uLXZlbmRvciByZWdpc3RlcnMuICovCkBAIC0xMDgzLDYgKzEwNzksMjEgQEAKIAkJY2FyZC0+cnhfdW5pdCA9IDA7CiAKIAkvKgorCSAqIFNldCB1cCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbGF0ZS4KKwkgKgorCSAqIElmIHdlIHNldCBpdCB1cCBlYXJsaWVyLCB0aGUgKGJ1Z2d5KSBoYXJkd2FyZSBnZW5lcmF0ZXMgYSBzcHVyaW91cworCSAqIGludGVycnVwdCwgZXZlbiBiZWZvcmUgdGhlIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkLCB3aXRoCisJICogQ0NDUl9JTlR4ID0gMC4KKwkgKgorCSAqIFdlIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBsYXRlIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBhbnkKKwkgKiBzcHVyaW91cyBpbnRlcnJ1cHRzLCBhbmQgYWxzbyB0byBhdm9pZCBnZW5lcmF0aW9uIG9mIHRoYXQga25vd24KKwkgKiBzcHVyaW91cyBpbnRlcnJ1cHQgaW4gdGhlIGZpcnN0IHBsYWNlLgorCSAqLworCXJldCA9IHNkaW9fY2xhaW1faXJxKGZ1bmMsIGlmX3NkaW9faW50ZXJydXB0KTsKKwlpZiAocmV0KQorCQlnb3RvIGRpc2FibGU7CisKKwkvKgogCSAqIEVuYWJsZSBpbnRlcnJ1cHRzIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaXMgc2V0IHVwCiAJICovCiAJc2Rpb193cml0ZWIoZnVuYywgMHgwZiwgSUZfU0RJT19IX0lOVF9NQVNLLCAmcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYwppbmRleCA2NjA4MzFjLi42ODdjMWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCkBAIC0xMjg4LDYgKzEyODgsOCBAQAogCiAJKih1bnNpZ25lZCBsb25nICopIHdkZXZfcHJpdiA9ICh1bnNpZ25lZCBsb25nKSBwcml2OwogCisJc2V0X3dpcGh5X2Rldih3ZGV2LT53aXBoeSwgKHN0cnVjdCBkZXZpY2UgKikgcHJpdi0+YWRhcHRlci0+ZGV2KTsKKwogCXJldCA9IHdpcGh5X3JlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgIiVzOiByZWdpc3RlcmluZyBjZmc4MDIxMSBkZXZpY2VcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oCmluZGV4IGEwZTliYzUuLjRlOTdlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oCkBAIC0xNjcsOCArMTY3LDggQEAKIC8qIFJ4IHVuaXQgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ0FSRF9SWF9VTklUX1JFRwkJMHg2MwogCi0vKiBFdmVudCBoZWFkZXIgTGVuKi8KLSNkZWZpbmUgTVdJRklFWF9FVkVOVF9IRUFERVJfTEVOICAgICAgICAgICA4CisvKiBFdmVudCBoZWFkZXIgbGVuIHcvbyA0IGJ5dGVzIG9mIGludGVyZmFjZSBoZWFkZXIgKi8KKyNkZWZpbmUgTVdJRklFWF9FVkVOVF9IRUFERVJfTEVOICAgICAgICAgICA0CiAKIC8qIE1heCByZXRyeSBudW1iZXIgb2YgQ01ENTMgd3JpdGUgKi8KICNkZWZpbmUgTUFYX1dSSVRFX0lPTUVNX1JFVFJZCQkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYwppbmRleCAzMjI2MTE4Li5hZWFjM2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKQEAgLTI0NzQsNiArMjQ3NCw3IEBACiAgKiBmYXN0ZXIgY2xpZW50LgogICovCiAjZGVmaW5lIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfRU5BQkxFX0xJRkVfVElNRV9FWFBJUlkJMHgwMDAwMDQwMAorI2RlZmluZSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0dFTkVSQVRFX0NDTVBfSERSCTB4MDAwMDAyMDAKICNkZWZpbmUgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19IT1NUX0RFQ1JfTUdNVAkJMHgwMDAwMDA4MAogI2RlZmluZSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RGT1JNX1BST0JFUkVTUAkweDAwMDAwMDIwCiAjZGVmaW5lIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfSE9TVEZPUk1fQkVBQ09OCQkweDAwMDAwMDEwCkBAIC0yNTEwLDcgKzI1MTEsOCBAQAogCWNtZC0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RfREVDUl9NR01UIHwKIAkJCQkgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19IT1NURk9STV9QUk9CRVJFU1AgfAogCQkJCSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RGT1JNX0JFQUNPTiB8Ci0JCQkJIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfRU5BQkxFX0xJRkVfVElNRV9FWFBJUlkpOworCQkJCSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0VOQUJMRV9MSUZFX1RJTUVfRVhQSVJZIHwKKwkJCQkgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19HRU5FUkFURV9DQ01QX0hEUik7CiAJY21kLT5udW1fdHhfZGVzY19wZXJfcXVldWUgPSBjcHVfdG9fbGUzMihNV0w4S19UWF9ERVNDUyk7CiAJY21kLT50b3RhbF9yeGQgPSBjcHVfdG9fbGUzMihNV0w4S19SWF9ERVNDUyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL0tjb25maWcKaW5kZXggOWRlZjFlNS4uYjJmOGI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL0tjb25maWcKQEAgLTE2Niw3ICsxNjYsNiBAQAogY29uZmlnIFJUMjgwMFVTQl9SVDUzWFgKICAgICAgICBib29sICJydDI4MDB1c2IgLSBJbmNsdWRlIHN1cHBvcnQgZm9yIHJ0NTN4eCBkZXZpY2VzIChFWFBFUklNRU5UQUwpIgogICAgICAgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0gICAgICAgZGVmYXVsdCB5CiAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHJ0NTN4eCB3aXJlbGVzcyBjaGlwc2V0IGZhbWlseSB0byB0aGUKICAgICAgICAgIHJ0MjgwMHBjaSBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY29uZmlnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY29uZmlnLmMKaW5kZXggNTU1MTgwZC4uYjcwNGU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNvbmZpZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYwpAQCAtMjUwLDcgKzI1MCw4IEBACiAJaWYgKGllZWU4MDIxMV9mbGFncyAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKQogCQlydDJ4MDBsaW5rX3Jlc2V0X3R1bmVyKHJ0MngwMGRldiwgZmFsc2UpOwogCi0JaWYgKHRlc3RfYml0KFJFUVVJUkVfUFNfQVVUT1dBS0UsICZydDJ4MDBkZXYtPmNhcF9mbGFncykgJiYKKwlpZiAodGVzdF9iaXQoREVWSUNFX1NUQVRFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKSAmJgorCSAgICB0ZXN0X2JpdChSRVFVSVJFX1BTX0FVVE9XQUtFLCAmcnQyeDAwZGV2LT5jYXBfZmxhZ3MpICYmCiAJICAgIChpZWVlODAyMTFfZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpICYmCiAJICAgIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTKSkgewogCQliZWFjb25fZGlmZiA9IChsb25nKWppZmZpZXMgLSAobG9uZylydDJ4MDBkZXYtPmxhc3RfYmVhY29uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCmluZGV4IGMwMThkNjdhLi45Mzk4MjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCkBAIC0xNDYsNiArMTQ2LDkgQEAKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0KIAkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydDJ4MDBfZGV2LCBhdXRvd2FrZXVwX3dvcmsud29yayk7CiAKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpCisJCXJldHVybjsKKwogCWlmIChydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwgU1RBVEVfQVdBS0UpKQogCQlFUlJPUihydDJ4MDBkZXYsICJEZXZpY2UgZmFpbGVkIHRvIHdha2V1cC5cbiIpOwogCWNsZWFyX2JpdChDT05GSUdfUE9XRVJTQVZJTkcsICZydDJ4MDBkZXYtPmZsYWdzKTsKQEAgLTExNjAsNiArMTE2Myw3IEBACiAJICogU3RvcCBhbGwgd29yay4KIAkgKi8KIAljYW5jZWxfd29ya19zeW5jKCZydDJ4MDBkZXYtPmludGZfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydDJ4MDBkZXYtPmF1dG93YWtldXBfd29yayk7CiAJaWYgKHJ0MngwMF9pc191c2IocnQyeDAwZGV2KSkgewogCQlkZWxfdGltZXJfc3luYygmcnQyeDAwZGV2LT50eHN0YXR1c190aW1lcik7CiAJCWNhbmNlbF93b3JrX3N5bmMoJnJ0MngwMGRldi0+cnhkb25lX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKaW5kZXggYTQwOTUyOC4uMjU0YjY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCkBAIC02NjksNiArNjY5LDE0IEBACiAJCQkJCQkJICZyeF9zdGF0dXMsCiAJCQkJCQkJICh1OCAqKSBwZGVzYywgc2tiKTsKIAorCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOworCQkJaWYgKHVubGlrZWx5KCFuZXdfc2tiKSkgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIChDT01QX0lOVFIgfCBDT01QX1JFQ1YpLAorCQkJCQkgREJHX0RNRVNHLAorCQkJCQkgKCJjYW4ndCBhbGxvYyBza2IgZm9yIHJ4XG4iKSk7CisJCQkJZ290byBkb25lOworCQkJfQorCiAJCQlwY2lfdW5tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwKIAkJCQkJICooKGRtYV9hZGRyX3QgKikgc2tiLT5jYiksCiAJCQkJCSBydGxwY2ktPnJ4YnVmZmVyc2l6ZSwKQEAgLTY5MCw3ICs2OTgsNyBAQAogCQkJaGRyID0gcnRsX2dldF9oZHIoc2tiKTsKIAkJCWZjID0gcnRsX2dldF9mYyhza2IpOwogCi0JCQlpZiAoIXN0YXRzLmNyYyB8fCAhc3RhdHMuaHdlcnJvcikgeworCQkJaWYgKCFzdGF0cy5jcmMgJiYgIXN0YXRzLmh3ZXJyb3IpIHsKIAkJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksICZyeF9zdGF0dXMsCiAJCQkJICAgICAgIHNpemVvZihyeF9zdGF0dXMpKTsKIApAQCAtNzU4LDE1ICs3NjYsNyBAQAogCQkJCXJ0bF9scHNfbGVhdmUoaHcpOwogCQkJfQogCi0JCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYihydGxwY2ktPnJ4YnVmZmVyc2l6ZSk7Ci0JCQlpZiAodW5saWtlbHkoIW5ld19za2IpKSB7Ci0JCQkJUlRfVFJBQ0UocnRscHJpdiwgKENPTVBfSU5UUiB8IENPTVBfUkVDViksCi0JCQkJCSBEQkdfRE1FU0csCi0JCQkJCSAoImNhbid0IGFsbG9jIHNrYiBmb3IgcnhcbiIpKTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9CiAJCQlza2IgPSBuZXdfc2tiOwotCQkJLypza2ItPmRldiA9IGRldjsgKi8KIAogCQkJcnRscGNpLT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0ucnhfYnVmW3J0bHBjaS0+CiAJCQkJCQkJICAgICByeF9yaW5nCkBAIC0xMTEzLDYgKzExMTMsMTMgQEAKIAogCQlydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5pZHggPSAwOwogCisJCS8qIElmIGFtc2R1XzhrIGlzIGRpc2FibGVkLCBzZXQgYnVmZmVyc2l6ZSB0byA0MDk2LiBUaGlzCisJCSAqIGNoYW5nZSB3aWxsIHJlZHVjZSBtZW1vcnkgZnJhZ21lbnRhdGlvbi4KKwkJICovCisJCWlmIChydGxwY2ktPnJ4YnVmZmVyc2l6ZSA+IDQwOTYgJiYKKwkJICAgIHJ0bHByaXYtPnJ0bGhhbC5kaXNhYmxlX2Ftc2R1XzhrKQorCQkJcnRscGNpLT5yeGJ1ZmZlcnNpemUgPSA0MDk2OworCiAJCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsKIAkJCXN0cnVjdCBza19idWZmICpza2IgPQogCQkJICAgIGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOwpAQCAtMTYxNyw2ICsxNjI0LDE2IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg4LCAmcmV2aXNpb25pZCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHgzQywgJmlycWxpbmUpOwogCisJLyogUENJIElEIDB4MTBlYzoweDgxOTIgb2NjdXJzIGZvciBib3RoIFJUTDgxOTJFLCB3aGljaCB1c2VzCisJICogcjgxOTJlX3BjaSwgYW5kIFJUTDgxOTJTRSwgd2hpY2ggdXNlcyB0aGlzIGRyaXZlci4gSWYgdGhlCisJICogcmV2aXNpb24gSUQgaXMgUlRMX1BDSV9SRVZJU0lPTl9JRF84MTkyUENJRSAoMHgwMSksIHRoZW4KKwkgKiB0aGUgY29ycmVjdCBkcml2ZXIgaXMgcjgxOTJlX3BjaSwgdGh1cyB0aGlzIHJvdXRpbmUgc2hvdWxkCisJICogcmV0dXJuIGZhbHNlLgorCSAqLworCWlmIChkZXZpY2VpZCA9PSBSVExfUENJXzgxOTJTRV9ESUQgJiYKKwkgICAgcmV2aXNpb25pZCA9PSBSVExfUENJX1JFVklTSU9OX0lEXzgxOTJQQ0lFKQorCQlyZXR1cm4gZmFsc2U7CisKIAlpZiAoZGV2aWNlaWQgPT0gUlRMX1BDSV84MTkyX0RJRCB8fAogCSAgICBkZXZpY2VpZCA9PSBSVExfUENJXzAwNDRfRElEIHx8CiAJICAgIGRldmljZWlkID09IFJUTF9QQ0lfMDA0N19ESUQgfHwKQEAgLTE4NDksNyArMTg2Niw4IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDQsIDB4MDcpOwogCiAJLyogZmluZCBhZGFwdGVyICovCi0JX3J0bF9wY2lfZmluZF9hZGFwdGVyKHBkZXYsIGh3KTsKKwlpZiAoIV9ydGxfcGNpX2ZpbmRfYWRhcHRlcihwZGV2LCBodykpCisJCWdvdG8gZmFpbDM7CiAKIAkvKiBJbml0IElPIGhhbmRsZXIgKi8KIAlfcnRsX3BjaV9pb19oYW5kbGVyX2luaXQoJnBkZXYtPmRldiwgaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKaW5kZXggYmVlN2MxNC4uOTQyZjdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCkBAIC01Myw2ICs1Myw4IEBACiBzdGF0aWMgaW50IHJ0bDkyY3VfaW5pdF9zd192YXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCWludCBlcnI7CiAKIAlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSAxOwogCXJ0bHByaXYtPmRtLmRtX2ZsYWcgPSAwOwpAQCAtNjQsNiArNjYsMjQgQEAKIAkJCSAoIkNhbid0IGFsbG9jIGJ1ZmZlciBmb3IgZncuXG4iKSk7CiAJCXJldHVybiAxOwogCX0KKwkvKiByZXF1ZXN0IGZ3ICovCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIHJ0bHByaXYtPmNmZy0+ZndfbmFtZSwKKwkJCXJ0bHByaXYtPmlvLmRldik7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiRmFpbGVkIHRvIHJlcXVlc3QgZmlybXdhcmUhXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoZmlybXdhcmUtPnNpemUgPiAweDQwMDApIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIkZpcm13YXJlIGlzIHRvbyBiaWchXG4iKSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtY3B5KHJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUsIGZpcm13YXJlLT5kYXRhLCBmaXJtd2FyZS0+c2l6ZSk7CisJcnRscHJpdi0+cnRsaGFsLmZ3c2l6ZSA9IGZpcm13YXJlLT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3OCw2ICsyOTgsNyBAQAogCXtSVExfVVNCX0RFVklDRSgweDA2ZjgsIDB4ZTAzMywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qSGVyY3VsZXMgLSBFZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDA3YjgsIDB4ODE4OCwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQWJvY29tIC0gQWJvY29tKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxODksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkZ1bmFpIC0gQWJvY29tKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDkwNDEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKk5ldEdlYXIgV05BMTAwME0qLwogCXtSVExfVVNCX0RFVklDRSgweDBEZjYsIDB4MDA1MiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbSAtIEVkaW1heCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MGViMCwgMHg5MDcxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOTyBCcmFuZCAtIEV0b3AqLwogCS8qIEhQIC0gTGl0ZS1PbiAsODE4OENVUyBTbGltIENvbWJvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY29uZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaAppbmRleCAxYWI2Yzg2Li5jODNmZWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY29uZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jb25mLmgKQEAgLTExNTcsNiArMTE1Nyw5IEBACiAJLyogdGltZSB0byB3YWl0IG9uIHRoZSBjaGFubmVsIGZvciBwYXNzaXZlIHNjYW5zIChpbiBUVXMpICovCiAJdTMyIGR3ZWxsX3RpbWVfcGFzc2l2ZTsKIAorCS8qIHRpbWUgdG8gd2FpdCBvbiB0aGUgY2hhbm5lbCBmb3IgREZTIHNjYW5zIChpbiBUVXMpICovCisJdTMyIGR3ZWxsX3RpbWVfZGZzOworCiAJLyogbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHRvIHNlbmQgb24gZWFjaCBjaGFubmVsIGluIGFjdGl2ZSBzY2FucyAqLwogCXU4IG51bV9wcm9iZV9yZXFzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L21haW4uYwppbmRleCBiYzAwZTUyLi5lNjQ5N2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMKQEAgLTMxMSw2ICszMTEsNyBAQAogCQkubWluX2R3ZWxsX3RpbWVfYWN0aXZlID0gOCwKIAkJLm1heF9kd2VsbF90aW1lX2FjdGl2ZSA9IDMwLAogCQkuZHdlbGxfdGltZV9wYXNzaXZlICAgID0gMTAwLAorCQkuZHdlbGxfdGltZV9kZnMgICAgICAgID0gMTUwLAogCQkubnVtX3Byb2JlX3JlcXMgICAgICAgID0gMiwKIAkJLnJzc2lfdGhyZXNob2xkICAgICAgICA9IC05MCwKIAkJLnNucl90aHJlc2hvbGQgICAgICAgICA9IDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYwppbmRleCBmMzdlNWEzLi41NmY3NmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmMKQEAgLTMzMSwxNiArMzMxLDIyIEBACiAJc3RydWN0IGNvbmZfc2NoZWRfc2Nhbl9zZXR0aW5ncyAqYyA9ICZ3bC0+Y29uZi5zY2hlZF9zY2FuOwogCWludCBpLCBqOwogCXUzMiBmbGFnczsKKwlib29sIGZvcmNlX3Bhc3NpdmUgPSAhcmVxLT5uX3NzaWRzOwogCiAJZm9yIChpID0gMCwgaiA9IHN0YXJ0OwogCSAgICAgaSA8IHJlcS0+bl9jaGFubmVscyAmJiBqIDwgTUFYX0NIQU5ORUxTX0FMTF9CQU5EUzsKIAkgICAgIGkrKykgewogCQlmbGFncyA9IHJlcS0+Y2hhbm5lbHNbaV0tPmZsYWdzOwogCi0JCWlmICghKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpICYmCi0JCSAgICAoKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSA9PSBwYXNzaXZlKSAmJgotCQkgICAgKChmbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKSA9PSByYWRhcikgJiYKLQkJICAgIChyZXEtPmNoYW5uZWxzW2ldLT5iYW5kID09IGJhbmQpKSB7CisJCWlmIChmb3JjZV9wYXNzaXZlKQorCQkJZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOworCisJCWlmICgocmVxLT5jaGFubmVsc1tpXS0+YmFuZCA9PSBiYW5kKSAmJgorCQkgICAgIShmbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSAmJgorCQkgICAgKCEhKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIpID09IHJhZGFyKSAmJgorCQkgICAgLyogaWYgcmFkYXIgaXMgc2V0LCB3ZSBpZ25vcmUgdGhlIHBhc3NpdmUgZmxhZyAqLworCQkgICAgKHJhZGFyIHx8CisJCSAgICAgISEoZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pID09IHBhc3NpdmUpKSB7CiAJCQl3bDEyNzFfZGVidWcoREVCVUdfU0NBTiwgImJhbmQgJWQsIGNlbnRlcl9mcmVxICVkICIsCiAJCQkJICAgICByZXEtPmNoYW5uZWxzW2ldLT5iYW5kLAogCQkJCSAgICAgcmVxLT5jaGFubmVsc1tpXS0+Y2VudGVyX2ZyZXEpOwpAQCAtMzUwLDcgKzM1NiwxMiBAQAogCQkJd2wxMjcxX2RlYnVnKERFQlVHX1NDQU4sICJtYXhfcG93ZXIgJWQiLAogCQkJCSAgICAgcmVxLT5jaGFubmVsc1tpXS0+bWF4X3Bvd2VyKTsKIAotCQkJaWYgKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSB7CisJCQlpZiAoZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUikgeworCQkJCWNoYW5uZWxzW2pdLmZsYWdzIHw9IFNDQU5fQ0hBTk5FTF9GTEFHU19ERlM7CisJCQkJY2hhbm5lbHNbal0ucGFzc2l2ZV9kdXJhdGlvbiA9CisJCQkJCWNwdV90b19sZTE2KGMtPmR3ZWxsX3RpbWVfZGZzKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSB7CiAJCQkJY2hhbm5lbHNbal0ucGFzc2l2ZV9kdXJhdGlvbiA9CiAJCQkJCWNwdV90b19sZTE2KGMtPmR3ZWxsX3RpbWVfcGFzc2l2ZSk7CiAJCQl9IGVsc2UgewpAQCAtMzU5LDcgKzM3MCw3IEBACiAJCQkJY2hhbm5lbHNbal0ubWF4X2R1cmF0aW9uID0KIAkJCQkJY3B1X3RvX2xlMTYoYy0+bWF4X2R3ZWxsX3RpbWVfYWN0aXZlKTsKIAkJCX0KLQkJCWNoYW5uZWxzW2pdLnR4X3Bvd2VyX2F0dCA9IHJlcS0+Y2hhbm5lbHNbal0tPm1heF9wb3dlcjsKKwkJCWNoYW5uZWxzW2pdLnR4X3Bvd2VyX2F0dCA9IHJlcS0+Y2hhbm5lbHNbaV0tPm1heF9wb3dlcjsKIAkJCWNoYW5uZWxzW2pdLmNoYW5uZWwgPSByZXEtPmNoYW5uZWxzW2ldLT5od192YWx1ZTsKIAogCQkJaisrOwpAQCAtMzg2LDcgKzM5NywxMSBAQAogCQl3bDEyNzFfc2Nhbl9nZXRfc2NoZWRfc2Nhbl9jaGFubmVscyh3bCwgcmVxLCBjZmctPmNoYW5uZWxzLAogCQkJCQkJICAgIElFRUU4MDIxMV9CQU5EXzJHSFosCiAJCQkJCQkgICAgZmFsc2UsIGZhbHNlLCBpZHgpOwotCWlkeCArPSBjZmctPmFjdGl2ZVswXTsKKwkvKgorCSAqIDVHSHogY2hhbm5lbHMgYWx3YXlzIHN0YXJ0IGF0IHBvc2l0aW9uIDE0LCBub3QgaW1tZWRpYXRlbHkKKwkgKiBhZnRlciB0aGUgbGFzdCAyLjRHSHogY2hhbm5lbAorCSAqLworCWlkeCA9IDE0OwogCiAJY2ZnLT5wYXNzaXZlWzFdID0KIAkJd2wxMjcxX3NjYW5fZ2V0X3NjaGVkX3NjYW5fY2hhbm5lbHMod2wsIHJlcSwgY2ZnLT5jaGFubmVscywKQEAgLTM5NCwyMiArNDA5LDIzIEBACiAJCQkJCQkgICAgZmFsc2UsIHRydWUsIGlkeCk7CiAJaWR4ICs9IGNmZy0+cGFzc2l2ZVsxXTsKIAotCWNmZy0+YWN0aXZlWzFdID0KLQkJd2wxMjcxX3NjYW5fZ2V0X3NjaGVkX3NjYW5fY2hhbm5lbHMod2wsIHJlcSwgY2ZnLT5jaGFubmVscywKLQkJCQkJCSAgICBJRUVFODAyMTFfQkFORF81R0haLAotCQkJCQkJICAgIGZhbHNlLCBmYWxzZSwgMTQpOwotCWlkeCArPSBjZmctPmFjdGl2ZVsxXTsKLQogCWNmZy0+ZGZzID0KIAkJd2wxMjcxX3NjYW5fZ2V0X3NjaGVkX3NjYW5fY2hhbm5lbHMod2wsIHJlcSwgY2ZnLT5jaGFubmVscywKIAkJCQkJCSAgICBJRUVFODAyMTFfQkFORF81R0haLAotCQkJCQkJICAgIHRydWUsIGZhbHNlLCBpZHgpOworCQkJCQkJICAgIHRydWUsIHRydWUsIGlkeCk7CiAJaWR4ICs9IGNmZy0+ZGZzOwogCisJY2ZnLT5hY3RpdmVbMV0gPQorCQl3bDEyNzFfc2Nhbl9nZXRfc2NoZWRfc2Nhbl9jaGFubmVscyh3bCwgcmVxLCBjZmctPmNoYW5uZWxzLAorCQkJCQkJICAgIElFRUU4MDIxMV9CQU5EXzVHSFosCisJCQkJCQkgICAgZmFsc2UsIGZhbHNlLCBpZHgpOworCWlkeCArPSBjZmctPmFjdGl2ZVsxXTsKKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19TQ0FOLCAiICAgIDIuNEdIejogYWN0aXZlICVkIHBhc3NpdmUgJWQiLAogCQkgICAgIGNmZy0+YWN0aXZlWzBdLCBjZmctPnBhc3NpdmVbMF0pOwogCXdsMTI3MV9kZWJ1ZyhERUJVR19TQ0FOLCAiICAgIDVHSHo6IGFjdGl2ZSAlZCBwYXNzaXZlICVkIiwKIAkJICAgICBjZmctPmFjdGl2ZVsxXSwgY2ZnLT5wYXNzaXZlWzFdKTsKKwl3bDEyNzFfZGVidWcoREVCVUdfU0NBTiwgIiAgICBERlM6ICVkIiwgY2ZnLT5kZnMpOwogCiAJcmV0dXJuIGlkeDsKIH0KQEAgLTQyMSw2ICs0MzcsNyBAQAogCXN0cnVjdCB3bDEyNzFfY21kX3NjaGVkX3NjYW5fY29uZmlnICpjZmcgPSBOVUxMOwogCXN0cnVjdCBjb25mX3NjaGVkX3NjYW5fc2V0dGluZ3MgKmMgPSAmd2wtPmNvbmYuc2NoZWRfc2NhbjsKIAlpbnQgaSwgdG90YWxfY2hhbm5lbHMsIHJldDsKKwlib29sIGZvcmNlX3Bhc3NpdmUgPSAhcmVxLT5uX3NzaWRzOwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCBzY2hlZF9zY2FuIHNjYW4gY29uZmlnIik7CiAKQEAgLTQ0NCw3ICs0NjEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBTQ0FOX01BWF9DWUNMRV9JTlRFUlZBTFM7IGkrKykKIAkJY2ZnLT5pbnRlcnZhbHNbaV0gPSBjcHVfdG9fbGUzMihyZXEtPmludGVydmFsKTsKIAotCWlmIChyZXEtPnNzaWRzWzBdLnNzaWRfbGVuICYmIHJlcS0+c3NpZHNbMF0uc3NpZCkgeworCWlmICghZm9yY2VfcGFzc2l2ZSAmJiByZXEtPnNzaWRzWzBdLnNzaWRfbGVuICYmIHJlcS0+c3NpZHNbMF0uc3NpZCkgewogCQljZmctPmZpbHRlcl90eXBlID0gU0NBTl9TU0lEX0ZJTFRFUl9TUEVDSUZJQzsKIAkJY2ZnLT5zc2lkX2xlbiA9IHJlcS0+c3NpZHNbMF0uc3NpZF9sZW47CiAJCW1lbWNweShjZmctPnNzaWQsIHJlcS0+c3NpZHNbMF0uc3NpZCwKQEAgLTQ2MSw3ICs0NzgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoY2ZnLT5hY3RpdmVbMF0pIHsKKwlpZiAoIWZvcmNlX3Bhc3NpdmUgJiYgY2ZnLT5hY3RpdmVbMF0pIHsKIAkJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEod2wsIHJlcS0+c3NpZHNbMF0uc3NpZCwKIAkJCQkJCSByZXEtPnNzaWRzWzBdLnNzaWRfbGVuLAogCQkJCQkJIGllcy0+aWVbSUVFRTgwMjExX0JBTkRfMkdIWl0sCkBAIC00NzMsNyArNDkwLDcgQEAKIAkJfQogCX0KIAotCWlmIChjZmctPmFjdGl2ZVsxXSkgeworCWlmICghZm9yY2VfcGFzc2l2ZSAmJiBjZmctPmFjdGl2ZVsxXSkgewogCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgIHJlcS0+c3NpZHNbMF0uc3NpZCwKIAkJCQkJCSByZXEtPnNzaWRzWzBdLnNzaWRfbGVuLAogCQkJCQkJIGllcy0+aWVbSUVFRTgwMjExX0JBTkRfNUdIWl0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaAppbmRleCBjODMzMTk1Li5hMGI2YzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmgKQEAgLTEzNyw2ICsxMzcsOSBAQAogCVNDQU5fQlNTX1RZUEVfQU5ZLAogfTsKIAorI2RlZmluZSBTQ0FOX0NIQU5ORUxfRkxBR1NfREZTCQlCSVQoMCkKKyNkZWZpbmUgU0NBTl9DSEFOTkVMX0ZMQUdTX0RGU19FTkFCTEVECUJJVCgxKQorCiBzdHJ1Y3QgY29ubl9zY2FuX2NoX3BhcmFtcyB7CiAJX19sZTE2IG1pbl9kdXJhdGlvbjsKIAlfX2xlMTYgbWF4X2R1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCAwZTgxOTk0Li42MzExOTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtMTUzMyw2ICsxNTMzLDMxIEBACiBtb2R1bGVfaW5pdCh1c2JfaW5pdCk7CiBtb2R1bGVfZXhpdCh1c2JfZXhpdCk7CiAKK3N0YXRpYyBpbnQgemRfZXBfcmVnc19vdXRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuLAorCQkJICAgICAgaW50ICphY3R1YWxfbGVuZ3RoLCBpbnQgdGltZW91dCkKK3sKKwkvKiBJbiBVU0IgMi4wIG1vZGUgRVBfUkVHU19PVVQgZW5kcG9pbnQgaXMgaW50ZXJydXB0IHR5cGUuIEhvd2V2ZXIgaW4KKwkgKiBVU0IgMS4xIG1vZGUgZW5kcG9pbnQgaXMgYnVsay4gU2VsZWN0IGNvcnJlY3QgdHlwZSBVUkIgYnkgZW5kcG9pbnQKKwkgKiBkZXNjcmlwdG9yLgorCSAqLworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CisJdW5zaWduZWQgaW50IHBpcGU7CisKKwlwaXBlID0gdXNiX3NuZGludHBpcGUodWRldiwgRVBfUkVHU19PVVQpOworCWVwID0gdXNiX3BpcGVfZW5kcG9pbnQodWRldiwgcGlwZSk7CisJaWYgKCFlcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KCZlcC0+ZGVzYykpIHsKKwkJcmV0dXJuIHVzYl9pbnRlcnJ1cHRfbXNnKHVkZXYsIHBpcGUsIGRhdGEsIGxlbiwKKwkJCQkJIGFjdHVhbF9sZW5ndGgsIHRpbWVvdXQpOworCX0gZWxzZSB7CisJCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUodWRldiwgRVBfUkVHU19PVVQpOworCQlyZXR1cm4gdXNiX2J1bGtfbXNnKHVkZXYsIHBpcGUsIGRhdGEsIGxlbiwgYWN0dWFsX2xlbmd0aCwKKwkJCQkgICAgdGltZW91dCk7CisJfQorfQorCiBzdGF0aWMgaW50IHVzYl9pbnRfcmVnc19sZW5ndGgodW5zaWduZWQgaW50IGNvdW50KQogewogCXJldHVybiBzaXplb2Yoc3RydWN0IHVzYl9pbnRfcmVncykgKyBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcmVnX2RhdGEpOwpAQCAtMTY0OCwxNSArMTY3MywxNCBAQAogCiAJdWRldiA9IHpkX3VzYl90b191c2JkZXYodXNiKTsKIAlwcmVwYXJlX3JlYWRfcmVnc19pbnQodXNiKTsKLQlyID0gdXNiX2ludGVycnVwdF9tc2codWRldiwgdXNiX3NuZGludHBpcGUodWRldiwgRVBfUkVHU19PVVQpLAotCQkJICAgICAgcmVxLCByZXFfbGVuLCAmYWN0dWFsX3JlcV9sZW4sIDUwIC8qIG1zICovKTsKKwlyID0gemRfZXBfcmVnc19vdXRfbXNnKHVkZXYsIHJlcSwgcmVxX2xlbiwgJmFjdHVhbF9yZXFfbGVuLCA1MCAvKm1zKi8pOwogCWlmIChyKSB7CiAJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCi0JCQkiZXJyb3IgaW4gdXNiX2ludGVycnVwdF9tc2coKS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJCSJlcnJvciBpbiB6ZF9lcF9yZWdzX291dF9tc2coKS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJaWYgKHJlcV9sZW4gIT0gYWN0dWFsX3JlcV9sZW4pIHsKLQkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgImVycm9yIGluIHVzYl9pbnRlcnJ1cHRfbXNnKClcbiIKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgImVycm9yIGluIHpkX2VwX3JlZ3Nfb3V0X21zZygpXG4iCiAJCQkiIHJlcV9sZW4gJWQgIT0gYWN0dWFsX3JlcV9sZW4gJWRcbiIsCiAJCQlyZXFfbGVuLCBhY3R1YWxfcmVxX2xlbik7CiAJCXIgPSAtRUlPOwpAQCAtMTgxOCw5ICsxODQyLDE3IEBACiAJCXJ3LT52YWx1ZSA9IGNwdV90b19sZTE2KGlvcmVxc1tpXS52YWx1ZSk7CiAJfQogCi0JdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVkZXYsIHVzYl9zbmRpbnRwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKSwKLQkJCSByZXEsIHJlcV9sZW4sIGlvd3JpdGUxNnZfdXJiX2NvbXBsZXRlLCB1c2IsCi0JCQkgZXAtPmRlc2MuYkludGVydmFsKTsKKwkvKiBJbiBVU0IgMi4wIG1vZGUgZW5kcG9pbnQgaXMgaW50ZXJydXB0IHR5cGUuIEhvd2V2ZXIgaW4gVVNCIDEuMSBtb2RlCisJICogZW5kcG9pbnQgaXMgYnVsay4gU2VsZWN0IGNvcnJlY3QgdHlwZSBVUkIgYnkgZW5kcG9pbnQgZGVzY3JpcHRvci4KKwkgKi8KKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KCZlcC0+ZGVzYykpCisJCXVzYl9maWxsX2ludF91cmIodXJiLCB1ZGV2LCB1c2Jfc25kaW50cGlwZSh1ZGV2LCBFUF9SRUdTX09VVCksCisJCQkJIHJlcSwgcmVxX2xlbiwgaW93cml0ZTE2dl91cmJfY29tcGxldGUsIHVzYiwKKwkJCQkgZXAtPmRlc2MuYkludGVydmFsKTsKKwllbHNlCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdWRldiwgdXNiX3NuZGJ1bGtwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKSwKKwkJCQkgIHJlcSwgcmVxX2xlbiwgaW93cml0ZTE2dl91cmJfY29tcGxldGUsIHVzYik7CisKIAl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9GUkVFX0JVRkZFUjsKIAogCS8qIFN1Ym1pdCBwcmV2aW91cyBVUkIgKi8KQEAgLTE5MjQsMTUgKzE5NTYsMTQgQEAKIAl9CiAKIAl1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOwotCXIgPSB1c2JfaW50ZXJydXB0X21zZyh1ZGV2LCB1c2Jfc25kaW50cGlwZSh1ZGV2LCBFUF9SRUdTX09VVCksCi0JCQkgICAgICByZXEsIHJlcV9sZW4sICZhY3R1YWxfcmVxX2xlbiwgNTAgLyogbXMgKi8pOworCXIgPSB6ZF9lcF9yZWdzX291dF9tc2codWRldiwgcmVxLCByZXFfbGVuLCAmYWN0dWFsX3JlcV9sZW4sIDUwIC8qbXMqLyk7CiAJaWYgKHIpIHsKIAkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKLQkJCSJlcnJvciBpbiB1c2JfaW50ZXJydXB0X21zZygpLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQkJImVycm9yIGluIHpkX2VwX3JlZ3Nfb3V0X21zZygpLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHJlcV9sZW4gIT0gYWN0dWFsX3JlcV9sZW4pIHsKLQkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgImVycm9yIGluIHVzYl9pbnRlcnJ1cHRfbXNnKCkiCisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJlcnJvciBpbiB6ZF9lcF9yZWdzX291dF9tc2coKSIKIAkJCSIgcmVxX2xlbiAlZCAhPSBhY3R1YWxfcmVxX2xlbiAlZFxuIiwKIAkJCXJlcV9sZW4sIGFjdHVhbF9yZXFfbGVuKTsKIAkJciA9IC1FSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKaW5kZXggYTM5ODRmNC4uZjM0YjViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwpAQCAtMTQxLDYgKzE0MSwxMyBAQAogCS5ub3RpZmllcl9jYWxsID0gbW9kdWxlX2xvYWRfbm90aWZ5LAogfTsKIAorc3RhdGljIHZvaWQgZnJlZV9hbGxfdGFza3Modm9pZCkKK3sKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhayB0YXNrIHN0cnVjdHMgKi8KKwlwcm9jZXNzX3Rhc2tfbW9ydHVhcnkoKTsKKwlwcm9jZXNzX3Rhc2tfbW9ydHVhcnkoKTsKK30KKwogaW50IHN5bmNfc3RhcnQodm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtMTQ4LDggKzE1NSw2IEBACiAJaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJm1hcmtlZF9jcHVzLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwotCiAJZXJyID0gdGFza19oYW5kb2ZmX3JlZ2lzdGVyKCZ0YXNrX2ZyZWVfbmIpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MTsKQEAgLTE2Niw3ICsxNzEsNiBAQAogCXN0YXJ0X2NwdV93b3JrKCk7CiAKIG91dDoKLQltdXRleF91bmxvY2soJmJ1ZmZlcl9tdXRleCk7CiAJcmV0dXJuIGVycjsKIG91dDQ6CiAJcHJvZmlsZV9ldmVudF91bnJlZ2lzdGVyKFBST0ZJTEVfTVVOTUFQLCAmbXVubWFwX25iKTsKQEAgLTE3NCw2ICsxNzgsNyBAQAogCXByb2ZpbGVfZXZlbnRfdW5yZWdpc3RlcihQUk9GSUxFX1RBU0tfRVhJVCwgJnRhc2tfZXhpdF9uYik7CiBvdXQyOgogCXRhc2tfaGFuZG9mZl91bnJlZ2lzdGVyKCZ0YXNrX2ZyZWVfbmIpOworCWZyZWVfYWxsX3Rhc2tzKCk7CiBvdXQxOgogCWZyZWVfY3B1bWFza192YXIobWFya2VkX2NwdXMpOwogCWdvdG8gb3V0OwpAQCAtMTgyLDIwICsxODcsMTYgQEAKIAogdm9pZCBzeW5jX3N0b3Aodm9pZCkKIHsKLQkvKiBmbHVzaCBidWZmZXJzICovCi0JbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKIAllbmRfY3B1X3dvcmsoKTsKIAl1bnJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcigmbW9kdWxlX2xvYWRfbmIpOwogCXByb2ZpbGVfZXZlbnRfdW5yZWdpc3RlcihQUk9GSUxFX01VTk1BUCwgJm11bm1hcF9uYik7CiAJcHJvZmlsZV9ldmVudF91bnJlZ2lzdGVyKFBST0ZJTEVfVEFTS19FWElULCAmdGFza19leGl0X25iKTsKIAl0YXNrX2hhbmRvZmZfdW5yZWdpc3RlcigmdGFza19mcmVlX25iKTsKLQltdXRleF91bmxvY2soJmJ1ZmZlcl9tdXRleCk7CisJYmFycmllcigpOwkJCS8qIGRvIGFsbCBvZiB0aGUgYWJvdmUgZmlyc3QgKi8KKwogCWZsdXNoX2NwdV93b3JrKCk7CiAKLQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhayB0YXNrIHN0cnVjdHMgKi8KLQlwcm9jZXNzX3Rhc2tfbW9ydHVhcnkoKTsKLQlwcm9jZXNzX3Rhc2tfbW9ydHVhcnkoKTsKLQorCWZyZWVfYWxsX3Rhc2tzKCk7CiAJZnJlZV9jcHVtYXNrX3ZhcihtYXJrZWRfY3B1cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKaW5kZXggYzg1Zjc0NC4uMDk0MzA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKQEAgLTUxLDYgKzUxLDcgQEAKIG9iai0kKENPTkZJR19NTjEwMzAwKSArPSBzZXR1cC1idXMubwogb2JqLSQoQ09ORklHX01JQ1JPQkxBWkUpICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfVElMRSkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19TUEFSQ19MRU9OKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwogCiAjCiAjIEFDUEkgUmVsYXRlZCBQQ0kgRlcgRnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9kbWFyLmMgYi9kcml2ZXJzL3BjaS9kbWFyLmMKaW5kZXggMTJlMDJiZi4uM2RjOWJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvZG1hci5jCisrKyBiL2RyaXZlcnMvcGNpL2RtYXIuYwpAQCAtNjk4LDEyICs2OTgsNyBAQAogCXsKICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogCQlzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyICpkbWFyOwotCQkvKgotCQkgKiBmb3Igbm93IHdlIHdpbGwgZGlzYWJsZSBkbWEtcmVtYXBwaW5nIHdoZW4gaW50ZXJydXB0Ci0JCSAqIHJlbWFwcGluZyBpcyBlbmFibGVkLgotCQkgKiBXaGVuIHN1cHBvcnQgZm9yIHF1ZXVlZCBpbnZhbGlkYXRpb24gZm9yIElPVExCIGludmFsaWRhdGlvbgotCQkgKiBpcyBhZGRlZCwgd2Ugd2lsbCBub3QgbmVlZCB0aGlzIGFueSBtb3JlLgotCQkgKi8KKwogCQlkbWFyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2RtYXIgKikgZG1hcl90Ymw7CiAJCWlmIChyZXQgJiYgY3B1X2hhc194MmFwaWMgJiYgZG1hci0+ZmxhZ3MgJiAweDEpCiAJCQlwcmludGsoS0VSTl9JTkZPCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCA2YWY2YjYyLi5mMDJjMzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNkZWZpbmUgUk9PVF9TSVpFCQlWVERfUEFHRV9TSVpFCiAjZGVmaW5lIENPTlRFWFRfU0laRQkJVlREX1BBR0VfU0laRQogCisjZGVmaW5lIElTX0JSSURHRV9IT1NUX0RFVklDRShwZGV2KSBcCisJCQkgICAgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QpCiAjZGVmaW5lIElTX0dGWF9ERVZJQ0UocGRldikgKChwZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfRElTUExBWSkKICNkZWZpbmUgSVNfSVNBX0RFVklDRShwZGV2KSAoKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfSVNBKQogI2RlZmluZSBJU19BWkFMSUEocGRldikgKChwZGV2KS0+dmVuZG9yID09IDB4ODA4NiAmJiAocGRldiktPmRldmljZSA9PSAweDNhM2UpCkBAIC0xMTYsNiArMTE4LDExIEBACiAJcmV0dXJuIChwZm4gKyBsZXZlbF9zaXplKGxldmVsKSAtIDEpICYgbGV2ZWxfbWFzayhsZXZlbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsdmxfdG9fbnJfcGFnZXModW5zaWduZWQgaW50IGx2bCkKK3sKKwlyZXR1cm4gIDEgPDwgKChsdmwgLSAxKSAqIExFVkVMX1NUUklERSk7Cit9CisKIC8qIFZULWQgcGFnZXMgbXVzdCBhbHdheXMgYmUgX3NtYWxsZXJfIHRoYW4gTU0gcGFnZXMuIE90aGVyd2lzZSB0aGluZ3MKICAgIGFyZSBuZXZlciBnb2luZyB0byB3b3JrLiAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRtYV90b19tbV9wZm4odW5zaWduZWQgbG9uZyBkbWFfcGZuKQpAQCAtMTQzLDYgKzE1MCwxMiBAQAogc3RhdGljIGludCByd2JmX3F1aXJrOwogCiAvKgorICogc2V0IHRvIDEgdG8gcGFuaWMga2VybmVsIGlmIGNhbid0IHN1Y2Nlc3NmdWxseSBlbmFibGUgVlQtZAorICogKHVzZWQgd2hlbiBrZXJuZWwgaXMgbGF1bmNoZWQgdy8gVFhUKQorICovCitzdGF0aWMgaW50IGZvcmNlX29uID0gMDsKKworLyoKICAqIDA6IFByZXNlbnQKICAqIDEtMTE6IFJlc2VydmVkCiAgKiAxMi02MzogQ29udGV4dCBQdHIgKDEyIC0gKGhhdy0xKSkKQEAgLTMzOCw2ICszNTEsOSBAQAogCWludAkJaW9tbXVfY29oZXJlbmN5Oy8qIGluZGljYXRlIGNvaGVyZW5jeSBvZiBpb21tdSBhY2Nlc3MgKi8KIAlpbnQJCWlvbW11X3Nub29waW5nOyAvKiBpbmRpY2F0ZSBzbm9vcGluZyBjb250cm9sIGZlYXR1cmUqLwogCWludAkJaW9tbXVfY291bnQ7CS8qIHJlZmVyZW5jZSBjb3VudCBvZiBpb21tdSAqLworCWludAkJaW9tbXVfc3VwZXJwYWdlOy8qIExldmVsIG9mIHN1cGVycGFnZXMgc3VwcG9ydGVkOgorCQkJCQkgICAwID09IDRLaUIgKG5vIHN1cGVycGFnZXMpLCAxID09IDJNaUIsCisJCQkJCSAgIDIgPT0gMUdpQiwgMyA9PSA1MTJHaUIsIDQgPT0gMVRpQiAqLwogCXNwaW5sb2NrX3QJaW9tbXVfbG9jazsJLyogcHJvdGVjdCBpb21tdSBzZXQgaW4gZG9tYWluICovCiAJdTY0CQltYXhfYWRkcjsJLyogbWF4aW11bSBtYXBwZWQgYWRkcmVzcyAqLwogfTsKQEAgLTM4Nyw2ICs0MDMsNyBAQAogc3RhdGljIGludCBkbWFyX21hcF9nZnggPSAxOwogc3RhdGljIGludCBkbWFyX2ZvcmNlZGFjOwogc3RhdGljIGludCBpbnRlbF9pb21tdV9zdHJpY3Q7CitzdGF0aWMgaW50IGludGVsX2lvbW11X3N1cGVycGFnZSA9IDE7CiAKICNkZWZpbmUgRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPICgoc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqKSgtMSkpCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldmljZV9kb21haW5fbG9jayk7CkBAIC00MTcsNiArNDM0LDEwIEBACiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkJIkludGVsLUlPTU1VOiBkaXNhYmxlIGJhdGNoZWQgSU9UTEIgZmx1c2hcbiIpOwogCQkJaW50ZWxfaW9tbXVfc3RyaWN0ID0gMTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJzcF9vZmYiLCA2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJJbnRlbC1JT01NVTogZGlzYWJsZSBzdXBwb3J0ZWQgc3VwZXIgcGFnZVxuIik7CisJCQlpbnRlbF9pb21tdV9zdXBlcnBhZ2UgPSAwOwogCQl9CiAKIAkJc3RyICs9IHN0cmNzcG4oc3RyLCAiLCIpOwpAQCAtNTU1LDExICs1NzYsMzIgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGRvbWFpbl91cGRhdGVfaW9tbXVfc3VwZXJwYWdlKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQoreworCWludCBpLCBtYXNrID0gMHhmOworCisJaWYgKCFpbnRlbF9pb21tdV9zdXBlcnBhZ2UpIHsKKwkJZG9tYWluLT5pb21tdV9zdXBlcnBhZ2UgPSAwOworCQlyZXR1cm47CisJfQorCisJZG9tYWluLT5pb21tdV9zdXBlcnBhZ2UgPSA0OyAvKiAxVGlCICovCisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZkb21haW4tPmlvbW11X2JtcCwgZ19udW1fb2ZfaW9tbXVzKSB7CisJCW1hc2sgfD0gY2FwX3N1cGVyX3BhZ2VfdmFsKGdfaW9tbXVzW2ldLT5jYXApOworCQlpZiAoIW1hc2spIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gZmxzKG1hc2spOworfQorCiAvKiBTb21lIGNhcGFiaWxpdGllcyBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBpb21tdXMgKi8KIHN0YXRpYyB2b2lkIGRvbWFpbl91cGRhdGVfaW9tbXVfY2FwKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQogewogCWRvbWFpbl91cGRhdGVfaW9tbXVfY29oZXJlbmN5KGRvbWFpbik7CiAJZG9tYWluX3VwZGF0ZV9pb21tdV9zbm9vcGluZyhkb21haW4pOworCWRvbWFpbl91cGRhdGVfaW9tbXVfc3VwZXJwYWdlKGRvbWFpbik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmRldmljZV90b19pb21tdShpbnQgc2VnbWVudCwgdTggYnVzLCB1OCBkZXZmbikKQEAgLTY4OSwyMyArNzMxLDMxIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hX3B0ZSAqcGZuX3RvX2RtYV9wdGUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4pCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIGludCBsYXJnZV9sZXZlbCkKIHsKIAlpbnQgYWRkcl93aWR0aCA9IGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSAtIFZURF9QQUdFX1NISUZUOwogCXN0cnVjdCBkbWFfcHRlICpwYXJlbnQsICpwdGUgPSBOVUxMOwogCWludCBsZXZlbCA9IGFnYXdfdG9fbGV2ZWwoZG9tYWluLT5hZ2F3KTsKLQlpbnQgb2Zmc2V0OworCWludCBvZmZzZXQsIHRhcmdldF9sZXZlbDsKIAogCUJVR19PTighZG9tYWluLT5wZ2QpOwogCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBwZm4gPj4gYWRkcl93aWR0aCk7CiAJcGFyZW50ID0gZG9tYWluLT5wZ2Q7CiAKKwkvKiBTZWFyY2ggcHRlICovCisJaWYgKCFsYXJnZV9sZXZlbCkKKwkJdGFyZ2V0X2xldmVsID0gMTsKKwllbHNlCisJCXRhcmdldF9sZXZlbCA9IGxhcmdlX2xldmVsOworCiAJd2hpbGUgKGxldmVsID4gMCkgewogCQl2b2lkICp0bXBfcGFnZTsKIAogCQlvZmZzZXQgPSBwZm5fbGV2ZWxfb2Zmc2V0KHBmbiwgbGV2ZWwpOwogCQlwdGUgPSAmcGFyZW50W29mZnNldF07Ci0JCWlmIChsZXZlbCA9PSAxKQorCQlpZiAoIWxhcmdlX2xldmVsICYmIChwdGUtPnZhbCAmIERNQV9QVEVfTEFSR0VfUEFHRSkpCisJCQlicmVhazsKKwkJaWYgKGxldmVsID09IHRhcmdldF9sZXZlbCkKIAkJCWJyZWFrOwogCiAJCWlmICghZG1hX3B0ZV9wcmVzZW50KHB0ZSkpIHsKQEAgLTczMywxMCArNzgzLDExIEBACiAJcmV0dXJuIHB0ZTsKIH0KIAorCiAvKiByZXR1cm4gYWRkcmVzcydzIHB0ZSBhdCBzcGVjaWZpYyBsZXZlbCAqLwogc3RhdGljIHN0cnVjdCBkbWFfcHRlICpkbWFfcGZuX2xldmVsX3B0ZShzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgcGZuLAotCQkJCQkgaW50IGxldmVsKQorCQkJCQkgaW50IGxldmVsLCBpbnQgKmxhcmdlX3BhZ2UpCiB7CiAJc3RydWN0IGRtYV9wdGUgKnBhcmVudCwgKnB0ZSA9IE5VTEw7CiAJaW50IHRvdGFsID0gYWdhd190b19sZXZlbChkb21haW4tPmFnYXcpOwpAQCAtNzQ5LDggKzgwMCwxNiBAQAogCQlpZiAobGV2ZWwgPT0gdG90YWwpCiAJCQlyZXR1cm4gcHRlOwogCi0JCWlmICghZG1hX3B0ZV9wcmVzZW50KHB0ZSkpCisJCWlmICghZG1hX3B0ZV9wcmVzZW50KHB0ZSkpIHsKKwkJCSpsYXJnZV9wYWdlID0gdG90YWw7CiAJCQlicmVhazsKKwkJfQorCisJCWlmIChwdGUtPnZhbCAmIERNQV9QVEVfTEFSR0VfUEFHRSkgeworCQkJKmxhcmdlX3BhZ2UgPSB0b3RhbDsKKwkJCXJldHVybiBwdGU7CisJCX0KKwogCQlwYXJlbnQgPSBwaHlzX3RvX3ZpcnQoZG1hX3B0ZV9hZGRyKHB0ZSkpOwogCQl0b3RhbC0tOwogCX0KQEAgLTc2Myw2ICs4MjIsNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgbGFzdF9wZm4pCiB7CiAJaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBpbnQgbGFyZ2VfcGFnZSA9IDE7CiAJc3RydWN0IGRtYV9wdGUgKmZpcnN0X3B0ZSwgKnB0ZTsKIAogCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBzdGFydF9wZm4gPj4gYWRkcl93aWR0aCk7CkBAIC03NzEsMTQgKzgzMSwxNSBAQAogCiAJLyogd2UgZG9uJ3QgbmVlZCBsb2NrIGhlcmU7IG5vYm9keSBlbHNlIHRvdWNoZXMgdGhlIGlvdmEgcmFuZ2UgKi8KIAlkbyB7Ci0JCWZpcnN0X3B0ZSA9IHB0ZSA9IGRtYV9wZm5fbGV2ZWxfcHRlKGRvbWFpbiwgc3RhcnRfcGZuLCAxKTsKKwkJbGFyZ2VfcGFnZSA9IDE7CisJCWZpcnN0X3B0ZSA9IHB0ZSA9IGRtYV9wZm5fbGV2ZWxfcHRlKGRvbWFpbiwgc3RhcnRfcGZuLCAxLCAmbGFyZ2VfcGFnZSk7CiAJCWlmICghcHRlKSB7Ci0JCQlzdGFydF9wZm4gPSBhbGlnbl90b19sZXZlbChzdGFydF9wZm4gKyAxLCAyKTsKKwkJCXN0YXJ0X3BmbiA9IGFsaWduX3RvX2xldmVsKHN0YXJ0X3BmbiArIDEsIGxhcmdlX3BhZ2UgKyAxKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWRvIHsgCisJCWRvIHsKIAkJCWRtYV9jbGVhcl9wdGUocHRlKTsKLQkJCXN0YXJ0X3BmbisrOworCQkJc3RhcnRfcGZuICs9IGx2bF90b19ucl9wYWdlcyhsYXJnZV9wYWdlKTsKIAkJCXB0ZSsrOwogCQl9IHdoaWxlIChzdGFydF9wZm4gPD0gbGFzdF9wZm4gJiYgIWZpcnN0X3B0ZV9pbl9wYWdlKHB0ZSkpOwogCkBAIC03OTgsNiArODU5LDcgQEAKIAlpbnQgdG90YWwgPSBhZ2F3X3RvX2xldmVsKGRvbWFpbi0+YWdhdyk7CiAJaW50IGxldmVsOwogCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBsYXJnZV9wYWdlID0gMjsKIAogCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBzdGFydF9wZm4gPj4gYWRkcl93aWR0aCk7CiAJQlVHX09OKGFkZHJfd2lkdGggPCBCSVRTX1BFUl9MT05HICYmIGxhc3RfcGZuID4+IGFkZHJfd2lkdGgpOwpAQCAtODEzLDcgKzg3NSwxMCBAQAogCQkJcmV0dXJuOwogCiAJCWRvIHsKLQkJCWZpcnN0X3B0ZSA9IHB0ZSA9IGRtYV9wZm5fbGV2ZWxfcHRlKGRvbWFpbiwgdG1wLCBsZXZlbCk7CisJCQlsYXJnZV9wYWdlID0gbGV2ZWw7CisJCQlmaXJzdF9wdGUgPSBwdGUgPSBkbWFfcGZuX2xldmVsX3B0ZShkb21haW4sIHRtcCwgbGV2ZWwsICZsYXJnZV9wYWdlKTsKKwkJCWlmIChsYXJnZV9wYWdlID4gbGV2ZWwpCisJCQkJbGV2ZWwgPSBsYXJnZV9wYWdlICsgMTsKIAkJCWlmICghcHRlKSB7CiAJCQkJdG1wID0gYWxpZ25fdG9fbGV2ZWwodG1wICsgMSwgbGV2ZWwgKyAxKTsKIAkJCQljb250aW51ZTsKQEAgLTEzOTcsNiArMTQ2Miw3IEBACiAJZWxzZQogCQlkb21haW4tPmlvbW11X3Nub29waW5nID0gMDsKIAorCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gZmxzKGNhcF9zdXBlcl9wYWdlX3ZhbChpb21tdS0+Y2FwKSk7CiAJZG9tYWluLT5pb21tdV9jb3VudCA9IDE7CiAJZG9tYWluLT5uaWQgPSBpb21tdS0+bm9kZTsKIApAQCAtMTQxNyw2ICsxNDgzLDEwIEBACiAJaWYgKCFkb21haW4pCiAJCXJldHVybjsKIAorCS8qIEZsdXNoIGFueSBsYXp5IHVubWFwcyB0aGF0IG1heSByZWZlcmVuY2UgdGhpcyBkb21haW4gKi8KKwlpZiAoIWludGVsX2lvbW11X3N0cmljdCkKKwkJZmx1c2hfdW5tYXBzX3RpbWVvdXQoMCk7CisKIAlkb21haW5fcmVtb3ZlX2Rldl9pbmZvKGRvbWFpbik7CiAJLyogZGVzdHJveSBpb3ZhcyAqLwogCXB1dF9pb3ZhX2RvbWFpbigmZG9tYWluLT5pb3ZhZCk7CkBAIC0xNjQ4LDYgKzE3MTgsMzQgQEAKIAlyZXR1cm4gUEFHRV9BTElHTihob3N0X2FkZHIgKyBzaXplKSA+PiBWVERfUEFHRV9TSElGVDsKIH0KIAorLyogUmV0dXJuIGxhcmdlc3QgcG9zc2libGUgc3VwZXJwYWdlIGxldmVsIGZvciBhIGdpdmVuIG1hcHBpbmcgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhcmR3YXJlX2xhcmdlcGFnZV9jYXBzKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgaW92X3BmbiwKKwkJCQkJICB1bnNpZ25lZCBsb25nIHBoeV9wZm4sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBwYWdlcykKK3sKKwlpbnQgc3VwcG9ydCwgbGV2ZWwgPSAxOworCXVuc2lnbmVkIGxvbmcgcGZubWVyZ2U7CisKKwlzdXBwb3J0ID0gZG9tYWluLT5pb21tdV9zdXBlcnBhZ2U7CisKKwkvKiBUbyB1c2UgYSBsYXJnZSBwYWdlLCB0aGUgdmlydHVhbCAqYW5kKiBwaHlzaWNhbCBhZGRyZXNzZXMKKwkgICBtdXN0IGJlIGFsaWduZWQgdG8gMk1pQi8xR2lCL2V0Yy4gTG93ZXIgYml0cyBzZXQgaW4gZWl0aGVyCisJICAgb2YgdGhlbSB3aWxsIG1lYW4gd2UgaGF2ZSB0byB1c2Ugc21hbGxlciBwYWdlcy4gU28ganVzdAorCSAgIG1lcmdlIHRoZW0gYW5kIGNoZWNrIGJvdGggYXQgb25jZS4gKi8KKwlwZm5tZXJnZSA9IGlvdl9wZm4gfCBwaHlfcGZuOworCisJd2hpbGUgKHN1cHBvcnQgJiYgIShwZm5tZXJnZSAmIH5WVERfU1RSSURFX01BU0spKSB7CisJCXBhZ2VzID4+PSBWVERfU1RSSURFX1NISUZUOworCQlpZiAoIXBhZ2VzKQorCQkJYnJlYWs7CisJCXBmbm1lcmdlID4+PSBWVERfU1RSSURFX1NISUZUOworCQlsZXZlbCsrOworCQlzdXBwb3J0LS07CisJfQorCXJldHVybiBsZXZlbDsKK30KKwogc3RhdGljIGludCBfX2RvbWFpbl9tYXBwaW5nKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGlvdl9wZm4sCiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgbG9uZyBwaHlzX3BmbiwKIAkJCSAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBpbnQgcHJvdCkKQEAgLTE2NTYsNiArMTc1NCw4IEBACiAJcGh5c19hZGRyX3QgdW5pbml0aWFsaXplZF92YXIocHRldmFsKTsKIAlpbnQgYWRkcl93aWR0aCA9IGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSAtIFZURF9QQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgc2dfcmVzOworCXVuc2lnbmVkIGludCBsYXJnZXBhZ2VfbHZsID0gMDsKKwl1bnNpZ25lZCBsb25nIGx2bF9wYWdlcyA9IDA7CiAKIAlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgKGlvdl9wZm4gKyBucl9wYWdlcyAtIDEpID4+IGFkZHJfd2lkdGgpOwogCkBAIC0xNjcxLDcgKzE3NzEsNyBAQAogCQlwdGV2YWwgPSAoKHBoeXNfYWRkcl90KXBoeXNfcGZuIDw8IFZURF9QQUdFX1NISUZUKSB8IHByb3Q7CiAJfQogCi0Jd2hpbGUgKG5yX3BhZ2VzLS0pIHsKKwl3aGlsZSAobnJfcGFnZXMgPiAwKSB7CiAJCXVpbnQ2NF90IHRtcDsKIAogCQlpZiAoIXNnX3JlcykgewpAQCAtMTY3OSwxMSArMTc3OSwyMSBAQAogCQkJc2ctPmRtYV9hZGRyZXNzID0gKChkbWFfYWRkcl90KWlvdl9wZm4gPDwgVlREX1BBR0VfU0hJRlQpICsgc2ctPm9mZnNldDsKIAkJCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKIAkJCXB0ZXZhbCA9IHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHNnKSkgfCBwcm90OworCQkJcGh5c19wZm4gPSBwdGV2YWwgPj4gVlREX1BBR0VfU0hJRlQ7CiAJCX0KKwogCQlpZiAoIXB0ZSkgewotCQkJZmlyc3RfcHRlID0gcHRlID0gcGZuX3RvX2RtYV9wdGUoZG9tYWluLCBpb3ZfcGZuKTsKKwkJCWxhcmdlcGFnZV9sdmwgPSBoYXJkd2FyZV9sYXJnZXBhZ2VfY2Fwcyhkb21haW4sIGlvdl9wZm4sIHBoeXNfcGZuLCBzZ19yZXMpOworCisJCQlmaXJzdF9wdGUgPSBwdGUgPSBwZm5fdG9fZG1hX3B0ZShkb21haW4sIGlvdl9wZm4sIGxhcmdlcGFnZV9sdmwpOwogCQkJaWYgKCFwdGUpCiAJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkvKiBJdCBpcyBsYXJnZSBwYWdlKi8KKwkJCWlmIChsYXJnZXBhZ2VfbHZsID4gMSkKKwkJCQlwdGV2YWwgfD0gRE1BX1BURV9MQVJHRV9QQUdFOworCQkJZWxzZQorCQkJCXB0ZXZhbCAmPSB+KHVpbnQ2NF90KURNQV9QVEVfTEFSR0VfUEFHRTsKKwogCQl9CiAJCS8qIFdlIGRvbid0IG5lZWQgbG9jayBoZXJlLCBub2JvZHkgZWxzZQogCQkgKiB0b3VjaGVzIHRoZSBpb3ZhIHJhbmdlCkBAIC0xNjk5LDE2ICsxODA5LDM4IEBACiAJCQl9CiAJCQlXQVJOX09OKDEpOwogCQl9CisKKwkJbHZsX3BhZ2VzID0gbHZsX3RvX25yX3BhZ2VzKGxhcmdlcGFnZV9sdmwpOworCisJCUJVR19PTihucl9wYWdlcyA8IGx2bF9wYWdlcyk7CisJCUJVR19PTihzZ19yZXMgPCBsdmxfcGFnZXMpOworCisJCW5yX3BhZ2VzIC09IGx2bF9wYWdlczsKKwkJaW92X3BmbiArPSBsdmxfcGFnZXM7CisJCXBoeXNfcGZuICs9IGx2bF9wYWdlczsKKwkJcHRldmFsICs9IGx2bF9wYWdlcyAqIFZURF9QQUdFX1NJWkU7CisJCXNnX3JlcyAtPSBsdmxfcGFnZXM7CisKKwkJLyogSWYgdGhlIG5leHQgUFRFIHdvdWxkIGJlIHRoZSBmaXJzdCBpbiBhIG5ldyBwYWdlLCB0aGVuIHdlCisJCSAgIG5lZWQgdG8gZmx1c2ggdGhlIGNhY2hlIG9uIHRoZSBlbnRyaWVzIHdlJ3ZlIGp1c3Qgd3JpdHRlbi4KKwkJICAgQW5kIHRoZW4gd2UnbGwgbmVlZCB0byByZWNhbGN1bGF0ZSAncHRlJywgc28gY2xlYXIgaXQgYW5kCisJCSAgIGxldCBpdCBnZXQgc2V0IGFnYWluIGluIHRoZSBpZiAoIXB0ZSkgYmxvY2sgYWJvdmUuCisKKwkJICAgSWYgd2UncmUgZG9uZSAoIW5yX3BhZ2VzKSB3ZSBuZWVkIHRvIGZsdXNoIHRoZSBjYWNoZSB0b28uCisKKwkJICAgQWxzbyBpZiB3ZSd2ZSBiZWVuIHNldHRpbmcgc3VwZXJwYWdlcywgd2UgbWF5IG5lZWQgdG8KKwkJICAgcmVjYWxjdWxhdGUgJ3B0ZScgYW5kIHN3aXRjaCBiYWNrIHRvIHNtYWxsZXIgcGFnZXMgZm9yIHRoZQorCQkgICBlbmQgb2YgdGhlIG1hcHBpbmcsIGlmIHRoZSB0cmFpbGluZyBzaXplIGlzIG5vdCBlbm91Z2ggdG8KKwkJICAgdXNlIGFub3RoZXIgc3VwZXJwYWdlIChpLmUuIHNnX3JlcyA8IGx2bF9wYWdlcykuICovCiAJCXB0ZSsrOwotCQlpZiAoIW5yX3BhZ2VzIHx8IGZpcnN0X3B0ZV9pbl9wYWdlKHB0ZSkpIHsKKwkJaWYgKCFucl9wYWdlcyB8fCBmaXJzdF9wdGVfaW5fcGFnZShwdGUpIHx8CisJCSAgICAobGFyZ2VwYWdlX2x2bCA+IDEgJiYgc2dfcmVzIDwgbHZsX3BhZ2VzKSkgewogCQkJZG9tYWluX2ZsdXNoX2NhY2hlKGRvbWFpbiwgZmlyc3RfcHRlLAogCQkJCQkgICAodm9pZCAqKXB0ZSAtICh2b2lkICopZmlyc3RfcHRlKTsKIAkJCXB0ZSA9IE5VTEw7CiAJCX0KLQkJaW92X3BmbisrOwotCQlwdGV2YWwgKz0gVlREX1BBR0VfU0laRTsKLQkJc2dfcmVzLS07Ci0JCWlmICghc2dfcmVzKQorCisJCWlmICghc2dfcmVzICYmIG5yX3BhZ2VzKQogCQkJc2cgPSBzZ19uZXh0KHNnKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yMDE2LDcgKzIxNDgsNyBAQAogCWlmIChwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgPT0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gaW9tbXVfcHJlcGFyZV9pZGVudGl0eV9tYXAocGRldiwgcm1yci0+YmFzZV9hZGRyZXNzLAotCQlybXJyLT5lbmRfYWRkcmVzcyArIDEpOworCQlybXJyLT5lbmRfYWRkcmVzcyk7CiB9CiAKICNpZmRlZiBDT05GSUdfRE1BUl9GTE9QUFlfV0EKQEAgLTIwMzAsNyArMjE2Miw3IEBACiAJCXJldHVybjsKIAogCXByaW50ayhLRVJOX0lORk8gIklPTU1VOiBQcmVwYXJlIDAtMTZNaUIgdW5pdHkgbWFwcGluZyBmb3IgTFBDXG4iKTsKLQlyZXQgPSBpb21tdV9wcmVwYXJlX2lkZW50aXR5X21hcChwZGV2LCAwLCAxNioxMDI0KjEwMjQpOworCXJldCA9IGlvbW11X3ByZXBhcmVfaWRlbnRpdHlfbWFwKHBkZXYsIDAsIDE2KjEwMjQqMTAyNCAtIDEpOwogCiAJaWYgKHJldCkKIAkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogRmFpbGVkIHRvIGNyZWF0ZSAwLTE2TWlCIGlkZW50aXR5IG1hcDsgIgpAQCAtMjEwNiwxMCArMjIzOCwxMCBAQAogCWlmIChsaWtlbHkoIWlvbW11X2lkZW50aXR5X21hcHBpbmcpKQogCQlyZXR1cm4gMDsKIAorCWluZm8gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CisJaWYgKGluZm8gJiYgaW5mbyAhPSBEVU1NWV9ERVZJQ0VfRE9NQUlOX0lORk8pCisJCXJldHVybiAoaW5mby0+ZG9tYWluID09IHNpX2RvbWFpbik7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZzaV9kb21haW4tPmRldmljZXMsIGxpbmspCi0JCWlmIChpbmZvLT5kZXYgPT0gcGRldikKLQkJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCkBAIC0yMTg3LDggKzIzMTksMTkgQEAKIAkgKiBBc3N1bWUgdGhhdCB0aGV5IHdpbGwgLS0gaWYgdGhleSB0dXJuIG91dCBub3QgdG8gYmUsIHRoZW4gd2UgY2FuIAogCSAqIHRha2UgdGhlbSBvdXQgb2YgdGhlIDE6MSBkb21haW4gbGF0ZXIuCiAJICovCi0JaWYgKCFzdGFydHVwKQotCQlyZXR1cm4gcGRldi0+ZG1hX21hc2sgPiBETUFfQklUX01BU0soMzIpOworCWlmICghc3RhcnR1cCkgeworCQkvKgorCQkgKiBJZiB0aGUgZGV2aWNlJ3MgZG1hX21hc2sgaXMgbGVzcyB0aGFuIHRoZSBzeXN0ZW0ncyBtZW1vcnkKKwkJICogc2l6ZSB0aGVuIHRoaXMgaXMgbm90IGEgY2FuZGlkYXRlIGZvciBpZGVudGl0eSBtYXBwaW5nLgorCQkgKi8KKwkJdTY0IGRtYV9tYXNrID0gcGRldi0+ZG1hX21hc2s7CisKKwkJaWYgKHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayAmJgorCQkgICAgcGRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrIDwgZG1hX21hc2spCisJCQlkbWFfbWFzayA9IHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKKworCQlyZXR1cm4gZG1hX21hc2sgPj0gZG1hX2dldF9yZXF1aXJlZF9tYXNrKCZwZGV2LT5kZXYpOworCX0KIAogCXJldHVybiAxOwogfQpAQCAtMjIwMyw2ICsyMzQ2LDkgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJLyogU2tpcCBIb3N0L1BDSSBCcmlkZ2UgZGV2aWNlcyAqLworCQlpZiAoSVNfQlJJREdFX0hPU1RfREVWSUNFKHBkZXYpKQorCQkJY29udGludWU7CiAJCWlmIChpb21tdV9zaG91bGRfaWRlbnRpdHlfbWFwKHBkZXYsIDEpKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJJT01NVTogJXMgaWRlbnRpdHkgbWFwcGluZyBmb3IgZGV2aWNlICVzXG4iLAogCQkJICAgICAgIGh3ID8gImhhcmR3YXJlIiA6ICJzb2Z0d2FyZSIsIHBjaV9uYW1lKHBkZXYpKTsKQEAgLTIyMTgsNyArMjM2NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfZG1hcnMoaW50IGZvcmNlX29uKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9kbWFycyh2b2lkKQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKIAlzdHJ1Y3QgZG1hcl9ybXJyX3VuaXQgKnJtcnI7CkBAIC0yNTkyLDggKzI3MzgsNyBAQAogCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb21haW4pOwogCXNpemUgPSBhbGlnbmVkX25ycGFnZXMocGFkZHIsIHNpemUpOwogCi0JaW92YSA9IGludGVsX2FsbG9jX2lvdmEoaHdkZXYsIGRvbWFpbiwgZG1hX3RvX21tX3BmbihzaXplKSwKLQkJCQlwZGV2LT5kbWFfbWFzayk7CisJaW92YSA9IGludGVsX2FsbG9jX2lvdmEoaHdkZXYsIGRvbWFpbiwgZG1hX3RvX21tX3BmbihzaXplKSwgZG1hX21hc2spOwogCWlmICghaW92YSkKIAkJZ290byBlcnJvcjsKIApAQCAtMzExOCw3ICszMjYzLDE3IEBACiAJCWlmIChpb21tdS0+cWkpCiAJCQlkbWFyX3JlZW5hYmxlX3FpKGlvbW11KTsKIAotCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgeworCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKSB7CisJCWlmIChkcmhkLT5pZ25vcmVkKSB7CisJCQkvKgorCQkJICogd2UgYWx3YXlzIGhhdmUgdG8gZGlzYWJsZSBQTVJzIG9yIERNQSBtYXkgZmFpbCBvbgorCQkJICogdGhpcyBkZXZpY2UKKwkJCSAqLworCQkJaWYgKGZvcmNlX29uKQorCQkJCWlvbW11X2Rpc2FibGVfcHJvdGVjdF9tZW1fcmVnaW9ucyhpb21tdSk7CisJCQljb250aW51ZTsKKwkJfQorCQogCQlpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoaW9tbXUpOwogCiAJCWlvbW11X3NldF9yb290X2VudHJ5KGlvbW11KTsKQEAgLTMxMjcsNyArMzI4Miw4IEBACiAJCQkJCSAgIERNQV9DQ01EX0dMT0JBTF9JTlZMKTsKIAkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCAwLCAwLCAwLAogCQkJCQkgRE1BX1RMQl9HTE9CQUxfRkxVU0gpOwotCQlpb21tdV9lbmFibGVfdHJhbnNsYXRpb24oaW9tbXUpOworCQlpZiAoaW9tbXVfZW5hYmxlX3RyYW5zbGF0aW9uKGlvbW11KSkKKwkJCXJldHVybiAxOwogCQlpb21tdV9kaXNhYmxlX3Byb3RlY3RfbWVtX3JlZ2lvbnMoaW9tbXUpOwogCX0KIApAQCAtMzE5NCw3ICszMzUwLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJaWYgKGluaXRfaW9tbXVfaHcoKSkgewotCQlXQVJOKDEsICJJT01NVSBzZXR1cCBmYWlsZWQsIERNQVIgY2FuIG5vdCByZXN1bWUhXG4iKTsKKwkJaWYgKGZvcmNlX29uKQorCQkJcGFuaWMoInRib290OiBJT01NVSBzZXR1cCBmYWlsZWQsIERNQVIgY2FuIG5vdCByZXN1bWUhXG4iKTsKKwkJZWxzZQorCQkJV0FSTigxLCAiSU9NTVUgc2V0dXAgZmFpbGVkLCBETUFSIGNhbiBub3QgcmVzdW1lIVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMyMjksNyArMzM4OCw3IEBACiB9CiAKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBpbml0X2lvbW11X3BtX29wcyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2lvbW11X3BtX29wcyh2b2lkKSB7fQogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiAvKgpAQCAtMzI3MSw3ICszNDMwLDYgQEAKIGludCBfX2luaXQgaW50ZWxfaW9tbXVfaW5pdCh2b2lkKQogewogCWludCByZXQgPSAwOwotCWludCBmb3JjZV9vbiA9IDA7CiAKIAkvKiBWVC1kIGlzIHJlcXVpcmVkIGZvciBhIFRYVC90Ym9vdCBsYXVuY2gsIHNvIGVuZm9yY2UgdGhhdCAqLwogCWZvcmNlX29uID0gdGJvb3RfZm9yY2VfaW9tbXUoKTsKQEAgLTMzMDksNyArMzQ2Nyw3IEBACiAKIAlpbml0X25vX3JlbWFwcGluZ19kZXZpY2VzKCk7CiAKLQlyZXQgPSBpbml0X2RtYXJzKGZvcmNlX29uKTsKKwlyZXQgPSBpbml0X2RtYXJzKCk7CiAJaWYgKHJldCkgewogCQlpZiAoZm9yY2Vfb24pCiAJCQlwYW5pYygidGJvb3Q6IEZhaWxlZCB0byBpbml0aWFsaXplIERNQVJzXG4iKTsKQEAgLTMzODAsOCArMzUzOCw4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmZG9tYWluLT5kZXZpY2VzKSB7CiAJCWluZm8gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvLCBsaW5rKTsKLQkJLyogTm8gbmVlZCB0byBjb21wYXJlIFBDSSBkb21haW47IGl0IGhhcyB0byBiZSB0aGUgc2FtZSAqLwotCQlpZiAoaW5mby0+YnVzID09IHBkZXYtPmJ1cy0+bnVtYmVyICYmCisJCWlmIChpbmZvLT5zZWdtZW50ID09IHBjaV9kb21haW5fbnIocGRldi0+YnVzKSAmJgorCQkgICAgaW5mby0+YnVzID09IHBkZXYtPmJ1cy0+bnVtYmVyICYmCiAJCSAgICBpbmZvLT5kZXZmbiA9PSBwZGV2LT5kZXZmbikgewogCQkJbGlzdF9kZWwoJmluZm8tPmxpbmspOwogCQkJbGlzdF9kZWwoJmluZm8tPmdsb2JhbCk7CkBAIC0zNDE5LDEwICszNTc3LDEzIEBACiAJCWRvbWFpbl91cGRhdGVfaW9tbXVfY2FwKGRvbWFpbik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+aW9tbXVfbG9jaywgdG1wX2ZsYWdzKTsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIHRtcF9mbGFncyk7Ci0JCWNsZWFyX2JpdChkb21haW4tPmlkLCBpb21tdS0+ZG9tYWluX2lkcyk7Ci0JCWlvbW11LT5kb21haW5zW2RvbWFpbi0+aWRdID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIHRtcF9mbGFncyk7CisJCWlmICghKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUpICYmCisJCSAgICAhKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFkpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIHRtcF9mbGFncyk7CisJCQljbGVhcl9iaXQoZG9tYWluLT5pZCwgaW9tbXUtPmRvbWFpbl9pZHMpOworCQkJaW9tbXUtPmRvbWFpbnNbZG9tYWluLT5pZF0gPSBOVUxMOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIHRtcF9mbGFncyk7CisJCX0KIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKQEAgLTM1MDUsNiArMzY2Niw3IEBACiAJZG9tYWluLT5pb21tdV9jb3VudCA9IDA7CiAJZG9tYWluLT5pb21tdV9jb2hlcmVuY3kgPSAwOwogCWRvbWFpbi0+aW9tbXVfc25vb3BpbmcgPSAwOworCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gMDsKIAlkb21haW4tPm1heF9hZGRyID0gMDsKIAlkb21haW4tPm5pZCA9IC0xOwogCkBAIC0zNzIwLDcgKzM4ODIsNyBAQAogCXN0cnVjdCBkbWFfcHRlICpwdGU7CiAJdTY0IHBoeXMgPSAwOwogCi0JcHRlID0gcGZuX3RvX2RtYV9wdGUoZG1hcl9kb21haW4sIGlvdmEgPj4gVlREX1BBR0VfU0hJRlQpOworCXB0ZSA9IHBmbl90b19kbWFfcHRlKGRtYXJfZG9tYWluLCBpb3ZhID4+IFZURF9QQUdFX1NISUZULCAwKTsKIAlpZiAocHRlKQogCQlwaHlzID0gZG1hX3B0ZV9hZGRyKHB0ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdmEuYyBiL2RyaXZlcnMvcGNpL2lvdmEuYwppbmRleCA5NjA2ZTU5Li5jNWMyNzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pb3ZhLmMKKysrIGIvZHJpdmVycy9wY2kvaW92YS5jCkBAIC02Myw4ICs2MywxNiBAQAogCWN1cnIgPSBpb3ZhZC0+Y2FjaGVkMzJfbm9kZTsKIAljYWNoZWRfaW92YSA9IGNvbnRhaW5lcl9vZihjdXJyLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CiAKLQlpZiAoZnJlZS0+cGZuX2xvID49IGNhY2hlZF9pb3ZhLT5wZm5fbG8pCi0JCWlvdmFkLT5jYWNoZWQzMl9ub2RlID0gcmJfbmV4dCgmZnJlZS0+bm9kZSk7CisJaWYgKGZyZWUtPnBmbl9sbyA+PSBjYWNoZWRfaW92YS0+cGZuX2xvKSB7CisJCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dCgmZnJlZS0+bm9kZSk7CisJCXN0cnVjdCBpb3ZhICppb3ZhID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBpb3ZhLCBub2RlKTsKKworCQkvKiBvbmx5IGNhY2hlIGlmIGl0J3MgYmVsb3cgMzJiaXQgcGZuICovCisJCWlmIChub2RlICYmIGlvdmEtPnBmbl9sbyA8IGlvdmFkLT5kbWFfMzJiaXRfcGZuKQorCQkJaW92YWQtPmNhY2hlZDMyX25vZGUgPSBub2RlOworCQllbHNlCisJCQlpb3ZhZC0+Y2FjaGVkMzJfbm9kZSA9IE5VTEw7CisJfQogfQogCiAvKiBDb21wdXRlcyB0aGUgcGFkZGluZyBzaXplIHJlcXVpcmVkLCB0byBtYWtlIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IDEzNWRmMTYuLjQ2NzY3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTYyNCw3ICs2MjQsNyBAQAogCSAqIHN5c3RlbSBmcm9tIHRoZSBzbGVlcCBzdGF0ZSwgd2UnbGwgaGF2ZSB0byBwcmV2ZW50IGl0IGZyb20gc2lnbmFsaW5nCiAJICogd2FrZS11cC4KIAkgKi8KLQlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5wcmVwYXJlKQogCQllcnJvciA9IGRydi0+cG0tPnByZXBhcmUoZGV2KTsKQEAgLTYzOCw2ICs2MzgsOCBAQAogCiAJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPmNvbXBsZXRlKQogCQlkcnYtPnBtLT5jb21wbGV0ZShkZXYpOworCisJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogfQogCiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDU2MDk4YjMuLjY5MjY3MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0zMjcxLDExICszMjcxLDExIEBACiB9CiAKIHN0YXRpYyBpbnQgcGNpX3NldF92Z2Ffc3RhdGVfYXJjaChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBib29sIGRlY29kZSwKLQkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgYm9vbCBjaGFuZ2VfYnJpZGdlKQorCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCB1MzIgZmxhZ3MpCiB7CiAJaWYgKGFyY2hfc2V0X3ZnYV9zdGF0ZSkKIAkJcmV0dXJuIGFyY2hfc2V0X3ZnYV9zdGF0ZShkZXYsIGRlY29kZSwgY29tbWFuZF9iaXRzLAotCQkJCQkJY2hhbmdlX2JyaWRnZSk7CisJCQkJCQlmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyODQsNyArMzI4NCw3IEBACiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQogICogQGRlY29kZTogdHJ1ZSA9IGVuYWJsZSBkZWNvZGluZywgZmFsc2UgPSBkaXNhYmxlIGRlY29kaW5nCiAgKiBAY29tbWFuZF9iaXRzOiBQQ0lfQ09NTUFORF9JTyBhbmQvb3IgUENJX0NPTU1BTkRfTUVNT1JZCi0gKiBAY2hhbmdlX2JyaWRnZV9mbGFnczogdHJhdmVyc2UgYW5jZXN0b3JzIGFuZCBjaGFuZ2UgYnJpZGdlcworICogQGZsYWdzOiB0cmF2ZXJzZSBhbmNlc3RvcnMgYW5kIGNoYW5nZSBicmlkZ2VzCiAgKiBDSEFOR0VfQlJJREdFX09OTFkgLyBDSEFOR0VfQlJJREdFCiAgKi8KIGludCBwY2lfc2V0X3ZnYV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBib29sIGRlY29kZSwKQEAgLTM0ODMsNiArMzQ4Myw4IEBACiAJCQkJcGNpX25vX21zaSgpOwogCQkJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vYWVyIikpIHsKIAkJCQlwY2lfbm9fYWVyKCk7CisJCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgInJlYWxsb2MiLCA3KSkgeworCQkJCXBjaV9yZWFsbG9jKCk7CiAJCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9kb21haW5zIikpIHsKIAkJCQlwY2lfbm9fZG9tYWlucygpOwogCQkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJjYmlvc2l6ZT0iLCA5KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA3MzFlMjAyLi4zYTM5YmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMTQ2LDYgKzE0Niw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX21zaV9pbml0X3BjaV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9CiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgcGNpX3JlYWxsb2Modm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9ub19kMWQyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IHBhcmVudF9kc3RhdGVzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IDQ4ODQ5ZmYuLmJhZmIzYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJCXJlcy0+ZmxhZ3MgfD0gcGNpX2NhbGNfcmVzb3VyY2VfZmxhZ3MobCkgfCBJT1JFU09VUkNFX1NJWkVBTElHTjsKIAkJaWYgKHR5cGUgPT0gcGNpX2Jhcl9pbykgewogCQkJbCAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQltYXNrID0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLICYgSU9fU1BBQ0VfTElNSVQ7CisJCQltYXNrID0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLICYgKHUzMikgSU9fU1BBQ0VfTElNSVQ7CiAJCX0gZWxzZSB7CiAJCQlsICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CiAJCQltYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCBlOGExNDA2Li4wMjE0NWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtMjc2MSw2ICsyNzYxLDggQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODMyLCByaWNvaF9tbWNfZml4dXBfcjVjODMyKTsKIERFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRV9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1QzgzMiwgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1Q0U4MjMsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDRTgyMywgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CiAjZW5kaWYgLypDT05GSUdfTU1DX1JJQ09IX01NQyovCiAKICNpZiBkZWZpbmVkKENPTkZJR19ETUFSKSB8fCBkZWZpbmVkKENPTkZJR19JTlRSX1JFTUFQKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCAxZTllNWE1Li45OTk1ODQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNDcsNiArNDcsMTMgQEAKIAkoaGVhZCktPm5leHQgPSBOVUxMOwkJCQlcCiB9IHdoaWxlICgwKQogCitpbnQgcGNpX3JlYWxsb2NfZW5hYmxlID0gMDsKKyNkZWZpbmUgcGNpX3JlYWxsb2NfZW5hYmxlZCgpIHBjaV9yZWFsbG9jX2VuYWJsZQordm9pZCBwY2lfcmVhbGxvYyh2b2lkKQoreworCXBjaV9yZWFsbG9jX2VuYWJsZSA9IDE7Cit9CisKIC8qKgogICogYWRkX3RvX2xpc3QoKSAtIGFkZCBhIG5ldyByZXNvdXJjZSB0cmFja2VyIHRvIHRoZSBsaXN0CiAgKiBAaGVhZDoJSGVhZCBvZiB0aGUgbGlzdApAQCAtMTAyNSw2ICsxMDMyLDcgQEAKIAlyZXR1cm4gZGVwdGg7CiB9CiAKKwogLyoKICAqIGZpcnN0IHRyeSB3aWxsIG5vdCB0b3VjaCBwY2kgYnJpZGdlIHJlcwogICogc2Vjb25kICBhbmQgbGF0ZXIgdHJ5IHdpbGwgY2xlYXIgc21hbGwgbGVhZiBicmlkZ2UgcmVzCkBAIC0xMDY4LDYgKzEwNzYsMTMgQEAKIAkvKiBhbnkgZGV2aWNlIGNvbXBsYWluPyAqLwogCWlmICghaGVhZC5uZXh0KQogCQlnb3RvIGVuYWJsZV9hbmRfZHVtcDsKKworCS8qIGRvbid0IHJlYWxsb2MgaWYgYXNrZWQgdG8gZG8gc28gKi8KKwlpZiAoIXBjaV9yZWFsbG9jX2VuYWJsZWQoKSkgeworCQlmcmVlX2xpc3QocmVzb3VyY2VfbGlzdF94LCAmaGVhZCk7CisJCWdvdG8gZW5hYmxlX2FuZF9kdW1wOworCX0KKwogCWZhaWxlZF90eXBlID0gMDsKIAlmb3IgKGxpc3QgPSBoZWFkLm5leHQ7IGxpc3Q7KSB7CiAJCWZhaWxlZF90eXBlIHw9IGxpc3QtPmZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92cGFjMjcwLmMKaW5kZXggNDM1MDAyZC4uZTk1NmY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKQEAgLTc1LDEwICs3NiwxMCBAQAogc3RhdGljIHZvaWQgdnBhYzI3MF9wY21jaWFfaHdfc2h1dGRvd24oc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7CiAJaWYgKHNrdC0+bnIgPT0gMCkKLQkJZ3Bpb19yZXF1ZXN0X2FycmF5KHZwYWMyNzBfcGNtY2lhX2dwaW9zLAorCQlncGlvX2ZyZWVfYXJyYXkodnBhYzI3MF9wY21jaWFfZ3Bpb3MsCiAJCQkJCUFSUkFZX1NJWkUodnBhYzI3MF9wY21jaWFfZ3Bpb3MpKTsKIAllbHNlCi0JCWdwaW9fcmVxdWVzdF9hcnJheSh2cGFjMjcwX2NmX2dwaW9zLAorCQlncGlvX2ZyZWVfYXJyYXkodnBhYzI3MF9jZl9ncGlvcywKIAkJCQkJQVJSQVlfU0laRSh2cGFjMjcwX2NmX2dwaW9zKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCmluZGV4IDAwNTQxN2IuLmUxYzQ5MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwpAQCAtMTE1Niw5ICsxMTU2LDkgQEAKIAlzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHBhcmFtcyA9IHsKIAkJLmZ1bmN0aW9uX251bSA9IDB4MSwKIAkJLmhvdGtleV9udW1iZXIgPSAweDAxLAotCQkuZGV2aWNlcyA9IEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTICYKLQkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcgJgotCQkJCUFDRVJfV01JRDNfR0RTX1dJTUFYICYKKwkJLmRldmljZXMgPSBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUyB8CisJCQkJQUNFUl9XTUlEM19HRFNfVEhSRUVHIHwKKwkJCQlBQ0VSX1dNSUQzX0dEU19XSU1BWCB8CiAJCQkJQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RILAogCX07CiAJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0gewpAQCAtMTQ0NSw2ICsxNDQ1LDggQEAKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwogCXN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MTYgZGV2aWNlX3N0YXRlOworCWNvbnN0IHN0cnVjdCBrZXlfZW50cnkgKmtleTsKIAogCXN0YXR1cyA9IHdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKIAlpZiAoc3RhdHVzICE9IEFFX09LKSB7CkBAIC0xNDcyLDIzICsxNDc0LDMyIEBACiAKIAlzd2l0Y2ggKHJldHVybl92YWx1ZS5mdW5jdGlvbikgewogCWNhc2UgV01JRF9IT1RLRVlfRVZFTlQ6Ci0JCWlmIChyZXR1cm5fdmFsdWUuZGV2aWNlX3N0YXRlKSB7Ci0JCQl1MTYgZGV2aWNlX3N0YXRlID0gcmV0dXJuX3ZhbHVlLmRldmljZV9zdGF0ZTsKLQkJCXByX2RlYnVnKCJkZXZpY2Ugc3RhdGU6IDB4JXhcbiIsIGRldmljZV9zdGF0ZSk7Ci0JCQlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpCi0JCQkJcmZraWxsX3NldF9zd19zdGF0ZSh3aXJlbGVzc19yZmtpbGwsCi0JCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykpOwotCQkJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkKLQkJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKGJsdWV0b290aF9yZmtpbGwsCi0JCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgpKTsKLQkJCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykpCi0JCQkJcmZraWxsX3NldF9zd19zdGF0ZSh0aHJlZWdfcmZraWxsLAotCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfVEhSRUVHKSk7Ci0JCX0KLQkJaWYgKCFzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudChhY2VyX3dtaV9pbnB1dF9kZXYsCi0JCQkJcmV0dXJuX3ZhbHVlLmtleV9udW0sIDEsIHRydWUpKQorCQlkZXZpY2Vfc3RhdGUgPSByZXR1cm5fdmFsdWUuZGV2aWNlX3N0YXRlOworCQlwcl9kZWJ1ZygiZGV2aWNlIHN0YXRlOiAweCV4XG4iLCBkZXZpY2Vfc3RhdGUpOworCisJCWtleSA9IHNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZShhY2VyX3dtaV9pbnB1dF9kZXYsCisJCQkJCQkJcmV0dXJuX3ZhbHVlLmtleV9udW0pOworCQlpZiAoIWtleSkgewogCQkJcHJfd2FybigiVW5rbm93biBrZXkgbnVtYmVyIC0gMHgleFxuIiwKIAkJCQlyZXR1cm5fdmFsdWUua2V5X251bSk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGtleS0+a2V5Y29kZSkgeworCQkJY2FzZSBLRVlfV0xBTjoKKwkJCWNhc2UgS0VZX0JMVUVUT09USDoKKwkJCQlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpCisJCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUod2lyZWxlc3NfcmZraWxsLAorCQkJCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykpOworCQkJCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykpCisJCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUodGhyZWVnX3Jma2lsbCwKKwkJCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfVEhSRUVHKSk7CisJCQkJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkKKwkJCQkJcmZraWxsX3NldF9zd19zdGF0ZShibHVldG9vdGhfcmZraWxsLAorCQkJCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwYXJzZV9rZXltYXBfcmVwb3J0X2VudHJ5KGFjZXJfd21pX2lucHV0X2Rldiwga2V5LAorCQkJCQkJICAgMSwgdHJ1ZSk7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfd2FybigiVW5rbm93biBmdW5jdGlvbiBudW1iZXIgLSAlZCAtICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKaW5kZXggMDA0NjBjYi4uM2M3ODU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLXdtaS5jCkBAIC0xMDI1LDYgKzEwMjUsNyBAQAogCQlyZXR1cm4gcG93ZXI7CiAKIAltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKIAlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IG1heDsKIAliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoYXN1cy0+ZHJpdmVyLT5uYW1lLAogCQkJCSAgICAgICAmYXN1cy0+cGxhdGZvcm1fZGV2aWNlLT5kZXYsIGFzdXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKaW5kZXggM2YyMDRmZC4uODg3N2I4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYwpAQCAtMTAzMCw4ICsxMDMwLDEwIEBACiAJaW5pdGlhbGl6ZV9mYW5fY29udHJvbF9kYXRhKGRhdGEpOwogCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmNvbXBhbF9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIGVycjsKKwl9CiAKIAlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7CiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYwppbmRleCBkMzg0MWRlLi5lMzlhYjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKQEAgLTI5MiwxMiArMjkyLDkgQEAKIAlkZWxsX3NlbmRfcmVxdWVzdChidWZmZXIsIDE3LCAxMSk7CiAKIAkvKiBJZiB0aGUgaGFyZHdhcmUgc3dpdGNoIGNvbnRyb2xzIHRoaXMgcmFkaW8sIGFuZCB0aGUgaGFyZHdhcmUKLQkgICBzd2l0Y2ggaXMgZGlzYWJsZWQsIGRvbid0IGFsbG93IGNoYW5naW5nIHRoZSBzb2Z0d2FyZSBzdGF0ZS4KLQkgICBJZiB0aGUgaGFyZHdhcmUgc3dpdGNoIGlzIHJlcG9ydGVkIGFzIG5vdCBzdXBwb3J0ZWQsIGFsd2F5cwotCSAgIGZpcmUgdGhlIFNNSSB0byB0b2dnbGUgdGhlIGtpbGxzd2l0Y2guICovCisJICAgc3dpdGNoIGlzIGRpc2FibGVkLCBkb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgc29mdHdhcmUgc3RhdGUgKi8KIAlpZiAoKGh3c3dpdGNoX3N0YXRlICYgQklUKGh3c3dpdGNoX2JpdCkpICYmCi0JICAgICEoYnVmZmVyLT5vdXRwdXRbMV0gJiBCSVQoMTYpKSAmJgotCSAgICAoYnVmZmVyLT5vdXRwdXRbMV0gJiBCSVQoMCkpKSB7CisJICAgICEoYnVmZmVyLT5vdXRwdXRbMV0gJiBCSVQoMTYpKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MDMsMjMgKzQwMCw2IEBACiAKIHN0YXRpYyB2b2lkIGRlbGxfdXBkYXRlX3Jma2lsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpCiB7Ci0JaW50IHN0YXR1czsKLQotCWdldF9idWZmZXIoKTsKLQlkZWxsX3NlbmRfcmVxdWVzdChidWZmZXIsIDE3LCAxMSk7Ci0Jc3RhdHVzID0gYnVmZmVyLT5vdXRwdXRbMV07Ci0JcmVsZWFzZV9idWZmZXIoKTsKLQotCS8qIGlmIGhhcmR3YXJlIHJma2lsbCBpcyBub3Qgc3VwcG9ydGVkLCBzZXQgaXQgZXhwbGljaXRseSAqLwotCWlmICghKHN0YXR1cyAmIEJJVCgwKSkpIHsKLQkJaWYgKHdpZmlfcmZraWxsKQotCQkJZGVsbF9yZmtpbGxfc2V0KCh2b2lkICopMSwgISgoc3RhdHVzICYgQklUKDE3KSkgPj4gMTcpKTsKLQkJaWYgKGJsdWV0b290aF9yZmtpbGwpCi0JCQlkZWxsX3Jma2lsbF9zZXQoKHZvaWQgKikyLCAhKChzdGF0dXMgJiBCSVQoMTgpKSA+PiAxOCkpOwotCQlpZiAod3dhbl9yZmtpbGwpCi0JCQlkZWxsX3Jma2lsbF9zZXQoKHZvaWQgKikzLCAhKChzdGF0dXMgJiBCSVQoMTkpKSA+PiAxOSkpOwotCX0KLQogCWlmICh3aWZpX3Jma2lsbCkKIAkJZGVsbF9yZmtpbGxfcXVlcnkod2lmaV9yZmtpbGwsICh2b2lkICopMSk7CiAJaWYgKGJsdWV0b290aF9yZmtpbGwpCkBAIC01NjAsMTEgKzU0MCwxMSBAQAogCWVsc2UKIAkJZGVsbF9zZW5kX3JlcXVlc3QoYnVmZmVyLCAwLCAxKTsKIAorCXJldCA9IGJ1ZmZlci0+b3V0cHV0WzFdOworCiBvdXQ6CiAJcmVsZWFzZV9idWZmZXIoKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWZmZXItPm91dHB1dFsxXTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgZGVsbF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwLXdtaS5jCmluZGV4IGY5NDAxN2IuLmUyZmFhM2NiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwpAQCAtMjA3LDYgKzIwNyw3IEBACiAJfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IHNpemVvZihzdHJ1Y3QgYmlvc19hcmdzKSwgJmFyZ3MgfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXUzMiByYzsKIAogCWlmIChXQVJOX09OKGluc2l6ZSA+IHNpemVvZihhcmdzLmRhdGEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjQsMTMgKzIyNSwxMyBAQAogCX0KIAogCWJpb3NfcmV0dXJuID0gKHN0cnVjdCBiaW9zX3JldHVybiAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJcmMgPSBiaW9zX3JldHVybi0+cmV0dXJuX2NvZGU7CiAKLQlpZiAoYmlvc19yZXR1cm4tPnJldHVybl9jb2RlKSB7Ci0JCWlmIChiaW9zX3JldHVybi0+cmV0dXJuX2NvZGUgIT0gSFBXTUlfUkVUX1VOS05PV05fQ01EVFlQRSkKLQkJCXByX3dhcm4oInF1ZXJ5IDB4JXggcmV0dXJuZWQgZXJyb3IgMHgleFxuIiwKLQkJCQlxdWVyeSwgYmlvc19yZXR1cm4tPnJldHVybl9jb2RlKTsKKwlpZiAocmMpIHsKKwkJaWYgKHJjICE9IEhQV01JX1JFVF9VTktOT1dOX0NNRFRZUEUpCisJCQlwcl93YXJuKCJxdWVyeSAweCV4IHJldHVybmVkIGVycm9yIDB4JXhcbiIsIHF1ZXJ5LCByYyk7CiAJCWtmcmVlKG9iaik7Ci0JCXJldHVybiBiaW9zX3JldHVybi0+cmV0dXJuX2NvZGU7CisJCXJldHVybiByYzsKIAl9CiAKIAlpZiAoIW91dHNpemUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX29ha3RyYWlsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9vYWt0cmFpbC5jCmluZGV4IGU5MzYzNjQuLjdmODhjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX29ha3RyYWlsLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfb2FrdHJhaWwuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiAJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUExBVEZPUk07CiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBPVF9FQ19CTF9CUklHSFRORVNTX01BWDsKIAliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoRFJJVkVSX05BTUUsCiAJCQkJICAgICAgICZvYWt0cmFpbF9kZXZpY2UtPmRldiwgTlVMTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCA3N2Y2ZTcwLi4yNmM1YjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC0xODQsNiArMTg0LDEwIEBACiAKIAkvKiBNaXNjIGJheSBldmVudHMgKi8KIAlUUF9IS0VZX0VWX09QVERSVl9FSgkJPSAweDMwMDYsIC8qIG9wdC4gZHJpdmUgdHJheSBlamVjdGVkICovCisJVFBfSEtFWV9FVl9IT1RQTFVHX0RPQ0sJCT0gMHg0MDEwLCAvKiBkb2NrZWQgaW50byBob3RwbHVnIGRvY2sKKwkJCQkJCSAgICAgb3IgcG9ydCByZXBsaWNhdG9yICovCisJVFBfSEtFWV9FVl9IT1RQTFVHX1VORE9DSwk9IDB4NDAxMSwgLyogdW5kb2NrZWQgZnJvbSBob3RwbHVnCisJCQkJCQkgICAgIGRvY2sgb3IgcG9ydCByZXBsaWNhdG9yICovCiAKIAkvKiBVc2VyLWludGVyZmFjZSBldmVudHMgKi8KIAlUUF9IS0VZX0VWX0xJRF9DTE9TRQkJPSAweDUwMDEsIC8qIGxhcHRvcCBsaWQgY2xvc2VkICovCkBAIC0xOTQsNiArMTk4LDEwIEBACiAJVFBfSEtFWV9FVl9QRU5fUkVNT1ZFRAkJPSAweDUwMGMsIC8qIHRhYmxldCBwZW4gcmVtb3ZlZCAqLwogCVRQX0hLRVlfRVZfQlJHSFRfQ0hBTkdFRAk9IDB4NTAxMCwgLyogYmFja2xpZ2h0IGNvbnRyb2wgZXZlbnQgKi8KIAorCS8qIEtleS1yZWxhdGVkIHVzZXItaW50ZXJmYWNlIGV2ZW50cyAqLworCVRQX0hLRVlfRVZfS0VZX05VTUxPQ0sJCT0gMHg2MDAwLCAvKiBOdW1Mb2NrIGtleSBwcmVzc2VkICovCisJVFBfSEtFWV9FVl9LRVlfRk4JCT0gMHg2MDA1LCAvKiBGbiBrZXkgcHJlc3NlZD8gRTQyMCAqLworCiAJLyogVGhlcm1hbCBldmVudHMgKi8KIAlUUF9IS0VZX0VWX0FMQVJNX0JBVF9IT1QJPSAweDYwMTEsIC8qIGJhdHRlcnkgdG9vIGhvdCAqLwogCVRQX0hLRVlfRVZfQUxBUk1fQkFUX1hIT1QJPSAweDYwMTIsIC8qIGJhdHRlcnkgY3JpdGljYWxseSBob3QgKi8KQEAgLTIwMSw2ICsyMDksMTAgQEAKIAlUUF9IS0VZX0VWX0FMQVJNX1NFTlNPUl9YSE9UCT0gMHg2MDIyLCAvKiBzZW5zb3IgY3JpdGljYWxseSBob3QgKi8KIAlUUF9IS0VZX0VWX1RITV9UQUJMRV9DSEFOR0VECT0gMHg2MDMwLCAvKiB0aGVybWFsIHRhYmxlIGNoYW5nZWQgKi8KIAorCVRQX0hLRVlfRVZfVU5LXzYwNDAJCT0gMHg2MDQwLCAvKiBSZWxhdGVkIHRvIEFDIGNoYW5nZT8KKwkJCQkJCSAgICAgc29tZSBzb3J0IG9mIEFQTSBoaW50LAorCQkJCQkJICAgICBXNTIwICovCisKIAkvKiBNaXNjICovCiAJVFBfSEtFWV9FVl9SRktJTExfQ0hBTkdFRAk9IDB4NzAwMCwgLyogcmZraWxsIHN3aXRjaCBjaGFuZ2VkICovCiB9OwpAQCAtMzUxMyw2ICszNTI1LDM0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfZG9ja2V2ZW50KGNvbnN0IHUzMiBoa2V5LAorCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCisJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQoreworCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCBldmVudHMgKi8KKwkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKKwkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKKworCXN3aXRjaCAoaGtleSkgeworCWNhc2UgVFBfSEtFWV9FVl9VTkRPQ0tfQUNLOgorCQkvKiBBQ1BJIHVuZG9jayBvcGVyYXRpb24gY29tcGxldGVkIGFmdGVyIHdha2V1cCAqLworCQlob3RrZXlfYXV0b3NsZWVwX2FjayA9IDE7CisJCXByX2luZm8oInVuZG9ja2VkXG4iKTsKKwkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOworCQlyZXR1cm4gdHJ1ZTsKKworCWNhc2UgVFBfSEtFWV9FVl9IT1RQTFVHX0RPQ0s6IC8qIGRvY2tlZCB0byBwb3J0IHJlcGxpY2F0b3IgKi8KKwkJcHJfaW5mbygiZG9ja2VkIGludG8gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3JcbiIpOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFRQX0hLRVlfRVZfSE9UUExVR19VTkRPQ0s6IC8qIHVuZG9ja2VkIGZyb20gcG9ydCByZXBsaWNhdG9yICovCisJCXByX2luZm8oInVuZG9ja2VkIGZyb20gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3JcbiIpOworCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfdXNyZXZlbnQoY29uc3QgdTMyIGhrZXksCiAJCQkJIGJvb2wgKnNlbmRfYWNwaV9ldiwKIAkJCQkgYm9vbCAqaWdub3JlX2FjcGlfZXYpCkBAIC0zNTQ3LDEzICszNTg3LDEzIEBACiAKIHN0YXRpYyB2b2lkIHRoZXJtYWxfZHVtcF9hbGxfc2Vuc29ycyh2b2lkKTsKIAotc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV90aGVybWFsKGNvbnN0IHUzMiBoa2V5LAorc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV82eHh4KGNvbnN0IHUzMiBoa2V5LAogCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCiAJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQogewogCWJvb2wga25vd24gPSB0cnVlOwogCi0JLyogMHg2MDAwLTB4NkZGRjogdGhlcm1hbCBhbGFybXMgKi8KKwkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcy9ub3RpY2VzIGFuZCBrZXlib2FyZCBldmVudHMgKi8KIAkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKIAkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKIApAQCAtMzU4Miw4ICszNjIyLDE3IEBACiAJCQkgImEgc2Vuc29yIHJlcG9ydHMgc29tZXRoaW5nIGlzIGV4dHJlbWVseSBob3QhXG4iKTsKIAkJLyogcmVjb21tZW5kZWQgYWN0aW9uOiBpbW1lZGlhdGUgc2xlZXAvaGliZXJuYXRlICovCiAJCWJyZWFrOworCisJY2FzZSBUUF9IS0VZX0VWX0tFWV9OVU1MT0NLOgorCWNhc2UgVFBfSEtFWV9FVl9LRVlfRk46CisJCS8qIGtleSBwcmVzcyBldmVudHMsIHdlIGp1c3QgaWdub3JlIHRoZW0gYXMgbG9uZyBhcyB0aGUgRUMKKwkJICogaXMgc3RpbGwgcmVwb3J0aW5nIHRoZW0gaW4gdGhlIG5vcm1hbCBrZXlib2FyZCBzdHJlYW0gKi8KKwkJKnNlbmRfYWNwaV9ldiA9IGZhbHNlOworCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOworCQlyZXR1cm4gdHJ1ZTsKKwogCWRlZmF1bHQ6Ci0JCXByX2FsZXJ0KCJUSEVSTUFMIEFMRVJUOiB1bmtub3duIHRoZXJtYWwgYWxhcm0gcmVjZWl2ZWRcbiIpOworCQlwcl93YXJuKCJ1bmtub3duIHBvc3NpYmxlIHRoZXJtYWwgYWxhcm0gb3Iga2V5Ym9hcmQgZXZlbnQgcmVjZWl2ZWRcbiIpOwogCQlrbm93biA9IGZhbHNlOwogCX0KIApAQCAtMzY1MiwxNSArMzcwMSw5IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJLyogMHg0MDAwLTB4NEZGRjogZG9jay1yZWxhdGVkIHdha2V1cHMgKi8KLQkJCWlmIChoa2V5ID09IFRQX0hLRVlfRVZfVU5ET0NLX0FDSykgewotCQkJCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMTsKLQkJCQlwcl9pbmZvKCJ1bmRvY2tlZFxuIik7Ci0JCQkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOwotCQkJCWtub3duX2V2ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJa25vd25fZXYgPSBmYWxzZTsKLQkJCX0KKwkJCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCBldmVudHMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV9kb2NrZXZlbnQoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCQkJCSZpZ25vcmVfYWNwaV9ldik7CiAJCQlicmVhazsKIAkJY2FzZSA1OgogCQkJLyogMHg1MDAwLTB4NUZGRjogaHVtYW4gaW50ZXJmYWNlIGhlbHBlcnMgKi8KQEAgLTM2NjgsOCArMzcxMSw5IEBACiAJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKIAkJCWJyZWFrOwogCQljYXNlIDY6Ci0JCQkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcyAqLwotCQkJa25vd25fZXYgPSBob3RrZXlfbm90aWZ5X3RoZXJtYWwoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCS8qIDB4NjAwMC0weDZGRkY6IHRoZXJtYWwgYWxhcm1zL25vdGljZXMgYW5kCisJCQkgKiAgICAgICAgICAgICAgICBrZXlib2FyZCBldmVudHMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV82eHh4KGhrZXksICZzZW5kX2FjcGlfZXYsCiAJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKIAkJCWJyZWFrOwogCQljYXNlIDc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2hhcmRldi5jIGIvZHJpdmVycy9wdHAvcHRwX2NoYXJkZXYuYwppbmRleCBhOGQwM2FlLi5lN2YzMDFkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHRwL3B0cF9jaGFyZGV2LmMKKysrIGIvZHJpdmVycy9wdHAvcHRwX2NoYXJkZXYuYwpAQCAtNDYsNyArNDYsOCBAQAogCQljYXBzLm5fZXh0X3RzID0gcHRwLT5pbmZvLT5uX2V4dF90czsKIAkJY2Fwcy5uX3Blcl9vdXQgPSBwdHAtPmluZm8tPm5fcGVyX291dDsKIAkJY2Fwcy5wcHMgPSBwdHAtPmluZm8tPnBwczsKLQkJZXJyID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNhcHMsIHNpemVvZihjYXBzKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY2Fwcywgc2l6ZW9mKGNhcHMpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFBfRVhUVFNfUkVRVUVTVDoKQEAgLTEyOSw4ICsxMzAsMTAgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAKLQlpZiAocHRwLT5kZWZ1bmN0KQorCWlmIChwdHAtPmRlZnVuY3QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwdHAtPnRzZXZxX211eCk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOwogCkBAIC0xNTAsMTAgKzE1Myw4IEBACiAKIAltdXRleF91bmxvY2soJnB0cC0+dHNldnFfbXV4KTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBldmVudCwgY250KSkgewotCQltdXRleF91bmxvY2soJnB0cC0+dHNldnFfbXV4KTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZXZlbnQsIGNudCkpCiAJCXJldHVybiAtRUZBVUxUOwotCX0KIAogCXJldHVybiBjbnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jCmluZGV4IGU1ZjdiOGZlLi4yYmI4ZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgKiBSZWd1bGF0b3IgaW5mb3JtYXRpb24KICAqLwogc3RhdGljIHN0cnVjdCBkYjg1MDBfcmVndWxhdG9yX2luZm8KLQkJZGI4NTAwX3JlZ3VsYXRvcl9pbmZvW0RCODUwMF9OVU1fUkVHVUxBVE9SU10gPSB7CitkYjg1MDBfcmVndWxhdG9yX2luZm9bREI4NTAwX05VTV9SRUdVTEFUT1JTXSA9IHsKIAlbREI4NTAwX1JFR1VMQVRPUl9WQVBFXSA9IHsKIAkJLmRlc2MgPSB7CiAJCQkubmFtZQk9ICJkYjg1MDAtdmFwZSIsCkBAIC00OTIsMTEgKzQ5Miw5IEBACiAJCQkJaW5mby0+ZGVzYy5uYW1lLCBlcnIpOwogCiAJCQkvKiBpZiBmYWlsaW5nLCB1bnJlZ2lzdGVyIGFsbCBlYXJsaWVyIHJlZ3VsYXRvcnMgKi8KLQkJCWktLTsKLQkJCXdoaWxlIChpID49IDApIHsKKwkJCXdoaWxlICgtLWkgPj0gMCkgewogCQkJCWluZm8gPSAmZGI4NTAwX3JlZ3VsYXRvcl9pbmZvW2ldOwogCQkJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKGluZm8tPnJkZXYpOwotCQkJCWktLTsKIAkJCX0KIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTUzNiwxMyArNTM0LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZGI4NTAwX3JlZ3VsYXRvcl9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZGI4NTAwX3JlZ3VsYXRvcl9kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiAwOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRiODUwMF9yZWd1bGF0b3JfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGRiODUwMF9yZWd1bGF0b3JfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCmluZGV4IGRhZmY3ZmQuLjQ4NmVkODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCXM4IHZpZCA9IC0xLCBpOwogCiAJaWYgKCFncGlvX2lzX3ZhbGlkKG1heDg5NTItPnBkYXRhLT5ncGlvX3ZpZDApIHx8Ci0JCQkhZ3Bpb19pc192YWxpZChtYXg4OTUyLT5wZGF0YS0+Z3Bpb192aWQwKSkgeworCQkJIWdwaW9faXNfdmFsaWQobWF4ODk1Mi0+cGRhdGEtPmdwaW9fdmlkMSkpIHsKIAkJLyogRFZTIG5vdCBzdXBwb3J0ZWQgKi8KIAkJcmV0dXJuIC1FUEVSTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKaW5kZXggMTBkNWExZC4uYWQ2NjI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYwpAQCAtMzksMjUgKzM5LDI4IEBACiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OwogCWludCByYW1wX2RlbGF5OyAvKiBpbiBtVi91cyAqLwogCisJYm9vbCBidWNrMV9ncGlvZHZzOworCWJvb2wgYnVjazJfZ3Bpb2R2czsKKwlib29sIGJ1Y2s1X2dwaW9kdnM7CiAJdTggYnVjazFfdm9sWzhdOwogCXU4IGJ1Y2syX3ZvbFs4XTsKIAl1OCBidWNrNV92b2xbOF07CisJaW50IGJ1Y2sxMjVfZ3Bpb3NbM107CiAJaW50IGJ1Y2sxMjVfZ3Bpb2luZGV4OworCWJvb2wgaWdub3JlX2dwaW9kdnNfc2lkZV9lZmZlY3Q7CiAKIAl1OCBzYXZlZF9zdGF0ZXNbTUFYODk5N19SRUdfTUFYXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXg4OTk3X3NldF9ncGlvKHN0cnVjdCBtYXg4OTk3X2RhdGEgKm1heDg5OTcpCiB7Ci0Jc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQotCQlkZXZfZ2V0X3BsYXRkYXRhKG1heDg5OTctPmlvZGV2LT5kZXYpOwogCWludCBzZXQzID0gKG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb2luZGV4KSAmIDB4MTsKIAlpbnQgc2V0MiA9ICgobWF4ODk5Ny0+YnVjazEyNV9ncGlvaW5kZXgpID4+IDEpICYgMHgxOwogCWludCBzZXQxID0gKChtYXg4OTk3LT5idWNrMTI1X2dwaW9pbmRleCkgPj4gMikgJiAweDE7CiAKLQlncGlvX3NldF92YWx1ZShwZGF0YS0+YnVjazEyNV9ncGlvc1swXSwgc2V0MSk7Ci0JZ3Bpb19zZXRfdmFsdWUocGRhdGEtPmJ1Y2sxMjVfZ3Bpb3NbMV0sIHNldDIpOwotCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5idWNrMTI1X2dwaW9zWzJdLCBzZXQzKTsKKwlncGlvX3NldF92YWx1ZShtYXg4OTk3LT5idWNrMTI1X2dwaW9zWzBdLCBzZXQxKTsKKwlncGlvX3NldF92YWx1ZShtYXg4OTk3LT5idWNrMTI1X2dwaW9zWzFdLCBzZXQyKTsKKwlncGlvX3NldF92YWx1ZShtYXg4OTk3LT5idWNrMTI1X2dwaW9zWzJdLCBzZXQzKTsKIH0KIAogc3RydWN0IHZvbHRhZ2VfbWFwX2Rlc2MgewpAQCAtMzgwLDggKzM4Myw2IEBACiBzdGF0aWMgaW50IG1heDg5OTdfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IG1heDg5OTdfZGF0YSAqbWF4ODk5NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0Jc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQotCQlkZXZfZ2V0X3BsYXRkYXRhKG1heDg5OTctPmlvZGV2LT5kZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBtYXg4OTk3LT5pb2Rldi0+aTJjOwogCWludCByZWcsIHNoaWZ0LCBtYXNrLCByZXQ7CiAJaW50IHJpZCA9IG1heDg5OTdfZ2V0X3JpZChyZGV2KTsKQEAgLTM5MSw5ICszOTIsOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKHJpZCA9PSBNQVg4OTk3X0JVQ0sxICYmIHBkYXRhLT5idWNrMV9ncGlvZHZzKSB8fAotCQkJKHJpZCA9PSBNQVg4OTk3X0JVQ0syICYmIHBkYXRhLT5idWNrMl9ncGlvZHZzKSB8fAotCQkJKHJpZCA9PSBNQVg4OTk3X0JVQ0s1ICYmIHBkYXRhLT5idWNrNV9ncGlvZHZzKSkKKwlpZiAoKHJpZCA9PSBNQVg4OTk3X0JVQ0sxICYmIG1heDg5OTctPmJ1Y2sxX2dwaW9kdnMpIHx8CisJCQkocmlkID09IE1BWDg5OTdfQlVDSzIgJiYgbWF4ODk5Ny0+YnVjazJfZ3Bpb2R2cykgfHwKKwkJCShyaWQgPT0gTUFYODk5N19CVUNLNSAmJiBtYXg4OTk3LT5idWNrNV9ncGlvZHZzKSkKIAkJcmVnICs9IG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb2luZGV4OwogCiAJcmV0ID0gbWF4ODk5N19yZWFkX3JlZyhpMmMsIHJlZywgJnZhbCk7CkBAIC01NDMsNyArNTQ0LDggQEAKIAkJCXJpZCA9PSBNQVg4OTk3X0JVQ0s0IHx8IHJpZCA9PSBNQVg4OTk3X0JVQ0s1KSB7CiAJCS8qIElmIHRoZSB2b2x0YWdlIGlzIGluY3JlYXNpbmcgKi8KIAkJaWYgKG9yZyA8IGkpCi0JCQl1ZGVsYXkoZGVzYy0+c3RlcCAqIChpIC0gb3JnKSAvIG1heDg5OTctPnJhbXBfZGVsYXkpOworCQkJdWRlbGF5KERJVl9ST1VORF9VUChkZXNjLT5zdGVwICogKGkgLSBvcmcpLAorCQkJCQkJbWF4ODk5Ny0+cmFtcF9kZWxheSkpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC01NjEsOCArNTYzLDYgQEAKIAkJdTggbmV3X3ZhbCwgaW50ICpiZXN0KQogewogCXN0cnVjdCBtYXg4OTk3X2RhdGEgKm1heDg5OTcgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KLQkJZGV2X2dldF9wbGF0ZGF0YShtYXg4OTk3LT5pb2Rldi0+ZGV2KTsKIAlpbnQgcmlkID0gbWF4ODk5N19nZXRfcmlkKHJkZXYpOwogCXU4ICpidWNreF92YWxbM107CiAJYm9vbCBidWNreF9ncGlvZHZzWzNdOwpAQCAtNTg5LDkgKzU4OSw5IEBACiAJYnVja3hfdmFsWzBdID0gbWF4ODk5Ny0+YnVjazFfdm9sOwogCWJ1Y2t4X3ZhbFsxXSA9IG1heDg5OTctPmJ1Y2syX3ZvbDsKIAlidWNreF92YWxbMl0gPSBtYXg4OTk3LT5idWNrNV92b2w7Ci0JYnVja3hfZ3Bpb2R2c1swXSA9IHBkYXRhLT5idWNrMV9ncGlvZHZzOwotCWJ1Y2t4X2dwaW9kdnNbMV0gPSBwZGF0YS0+YnVjazJfZ3Bpb2R2czsKLQlidWNreF9ncGlvZHZzWzJdID0gcGRhdGEtPmJ1Y2s1X2dwaW9kdnM7CisJYnVja3hfZ3Bpb2R2c1swXSA9IG1heDg5OTctPmJ1Y2sxX2dwaW9kdnM7CisJYnVja3hfZ3Bpb2R2c1sxXSA9IG1heDg5OTctPmJ1Y2syX2dwaW9kdnM7CisJYnVja3hfZ3Bpb2R2c1syXSA9IG1heDg5OTctPmJ1Y2s1X2dwaW9kdnM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWludCBvdGhlcnM7CkBAIC02NDAsOCArNjQwLDYgQEAKIAkJaW50IG1pbl91ViwgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBtYXg4OTk3X2RhdGEgKm1heDg5OTcgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KLQkJZGV2X2dldF9wbGF0ZGF0YShtYXg4OTk3LT5pb2Rldi0+ZGV2KTsKIAlpbnQgcmlkID0gbWF4ODk5N19nZXRfcmlkKHJkZXYpOwogCWNvbnN0IHN0cnVjdCB2b2x0YWdlX21hcF9kZXNjICpkZXNjOwogCWludCBuZXdfdmFsLCBuZXdfaWR4LCBkYW1hZ2UsIHRtcF92YWwsIHRtcF9pZHgsIHRtcF9kbWc7CkBAIC02NTMsMTUgKzY1MSwxNSBAQAogCiAJc3dpdGNoIChyaWQpIHsKIAljYXNlIE1BWDg5OTdfQlVDSzE6Ci0JCWlmIChwZGF0YS0+YnVjazFfZ3Bpb2R2cykKKwkJaWYgKG1heDg5OTctPmJ1Y2sxX2dwaW9kdnMpCiAJCQlncGlvX2R2c19tb2RlID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0JVQ0syOgotCQlpZiAocGRhdGEtPmJ1Y2syX2dwaW9kdnMpCisJCWlmIChtYXg4OTk3LT5idWNrMl9ncGlvZHZzKQogCQkJZ3Bpb19kdnNfbW9kZSA9IHRydWU7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19CVUNLNToKLQkJaWYgKHBkYXRhLT5idWNrNV9ncGlvZHZzKQorCQlpZiAobWF4ODk5Ny0+YnVjazVfZ3Bpb2R2cykKIAkJCWdwaW9fZHZzX21vZGUgPSB0cnVlOwogCQlicmVhazsKIAl9CkBAIC02OTUsNyArNjkzLDcgQEAKIAluZXdfaWR4ID0gdG1wX2lkeDsKIAluZXdfdmFsID0gdG1wX3ZhbDsKIAotCWlmIChwZGF0YS0+aWdub3JlX2dwaW9kdnNfc2lkZV9lZmZlY3QgPT0gZmFsc2UpCisJaWYgKG1heDg5OTctPmlnbm9yZV9ncGlvZHZzX3NpZGVfZWZmZWN0ID09IGZhbHNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRldl93YXJuKCZyZGV2LT5kZXYsICJNQVg4OTk3IEdQSU8tRFZTIFNpZGUgRWZmZWN0IFdhcm5pbmc6IEdQSU8gU0VUOiIKQEAgLTk5Myw2ICs5OTEsMTEgQEAKIAlpMmMgPSBtYXg4OTk3LT5pb2Rldi0+aTJjOwogCiAJbWF4ODk5Ny0+YnVjazEyNV9ncGlvaW5kZXggPSBwZGF0YS0+YnVjazEyNV9kZWZhdWx0X2lkeDsKKwltYXg4OTk3LT5idWNrMV9ncGlvZHZzID0gcGRhdGEtPmJ1Y2sxX2dwaW9kdnM7CisJbWF4ODk5Ny0+YnVjazJfZ3Bpb2R2cyA9IHBkYXRhLT5idWNrMl9ncGlvZHZzOworCW1heDg5OTctPmJ1Y2s1X2dwaW9kdnMgPSBwZGF0YS0+YnVjazVfZ3Bpb2R2czsKKwltZW1jcHkobWF4ODk5Ny0+YnVjazEyNV9ncGlvcywgcGRhdGEtPmJ1Y2sxMjVfZ3Bpb3MsIHNpemVvZihpbnQpICogMyk7CisJbWF4ODk5Ny0+aWdub3JlX2dwaW9kdnNfc2lkZV9lZmZlY3QgPSBwZGF0YS0+aWdub3JlX2dwaW9kdnNfc2lkZV9lZmZlY3Q7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCW1heDg5OTctPmJ1Y2sxX3ZvbFtpXSA9IHJldCA9CkBAIC0xMTI0LDYgKzExMjcsMTAgQEAKIAkJCQkweDNmKTsKIAl9CiAKKwkvKiBNaXNjIFNldHRpbmdzICovCisJbWF4ODk5Ny0+cmFtcF9kZWxheSA9IDEwOyAvKiBzZXQgMTBtVi91cywgd2hpY2ggaXMgdGhlIGRlZmF1bHQgKi8KKwltYXg4OTk3X3dyaXRlX3JlZyhpMmMsIE1BWDg5OTdfUkVHX0JVQ0tSQU1QLCAoMHhmIDw8IDQpIHwgMHg5KTsKKwogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7IGkrKykgewogCQljb25zdCBzdHJ1Y3Qgdm9sdGFnZV9tYXBfZGVzYyAqZGVzYzsKIAkJaW50IGlkID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0uaWQ7CkBAIC0xMTQ4LDEwICsxMTU1LDYgQEAKIAkJfQogCX0KIAotCS8qIE1pc2MgU2V0dGluZ3MgKi8KLQltYXg4OTk3LT5yYW1wX2RlbGF5ID0gMTA7IC8qIHNldCAxMG1WL3VzLCB3aGljaCBpcyB0aGUgZGVmYXVsdCAqLwotCW1heDg5OTdfd3JpdGVfcmVnKGkyYywgTUFYODk5N19SRUdfQlVDS1JBTVAsICgweGYgPDwgNCkgfCAweDkpOwotCiAJcmV0dXJuIDA7CiBlcnI6CiAJZm9yIChpID0gMDsgaSA8IG1heDg5OTctPm51bV9yZWd1bGF0b3JzOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9LY29uZmlnIGIvZHJpdmVycy9ydGMvS2NvbmZpZwppbmRleCBmODIyZTEzLi5jZTJhYWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcnRjL0tjb25maWcKQEAgLTEwNTEsNCArMTA1MSwxMyBAQAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBMaW51eCBkcml2ZXIgc2lkZSBvZiB0aGUgVGlsZXJhCiAJICBoeXBlcnZpc29yJ3MgcmVhbC10aW1lIGNsb2NrIGludGVyZmFjZS4KIAorY29uZmlnIFJUQ19EUlZfUFVWMworCXRyaXN0YXRlICJQS1VuaXR5IHYzIFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9QVVYzCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBSVEMgaW4gdGhlIFBLVW5pdHktdjMgU29Dcy4KKworCSAgVGhpcyBkcml2ZSBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wdXYzLgorCiBlbmRpZiAjIFJUQ19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCAyMTNkNzI1Li4wZmZlZmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtNzgsNiArNzgsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzApCSs9IHJ0Yy1wbDAzMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QTDAzMSkJKz0gcnRjLXBsMDMxLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BTMykJKz0gcnRjLXBzMy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QVVYzKQkrPSBydGMtcHV2My5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QWEEpCSs9IHJ0Yy1weGEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUjk3MDEpCSs9IHJ0Yy1yOTcwMS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUDVDMDEpCSs9IHJ0Yy1ycDVjMDEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCBlZjYzMTZhLi5kZjY4NjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfcmVhZF9hbGFybSk7CiAKLWludCBfX3J0Y19zZXRfYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQorc3RhdGljIGludCBfX3J0Y19zZXRfYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQogewogCXN0cnVjdCBydGNfdGltZSB0bTsKIAlsb25nIG5vdywgc2NoZWR1bGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRldi5jIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCmluZGV4IGQwZTA2ZWQuLmNhY2U2ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKQEAgLTQyMSw3ICs0MjEsOCBAQAogCQkJZXJyID0gb3BzLT5pb2N0bChydGMtPmRldi5wYXJlbnQsIGNtZCwgYXJnKTsKIAkJCWlmIChlcnIgPT0gLUVOT0lPQ1RMQ01EKQogCQkJCWVyciA9IC1FTk9UVFk7Ci0JCX0KKwkJfSBlbHNlCisJCQllcnIgPSAtRU5PVFRZOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCA0NzI0YmEzLi5iMjAwNWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAl7ICJkczEzNDAiLCBkc18xMzQwIH0sCiAJeyAiZHMzMjMxIiwgZHNfMzIzMSB9LAogCXsgIm00MXQwMCIsIG00MXQwMCB9LAorCXsgInB0N2M0MzM4IiwgZHNfMTMwNyB9LAogCXsgInJ4ODAyNSIsIHJ4XzgwMjUgfSwKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQxdDkzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDkzLmMKaW5kZXggMWE4NGIzZS4uNzMxN2QzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW00MXQ5My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDF0OTMuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG00MXQ5M19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAKIAlpZiAocnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9ydGMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC91bmljb3JlMzIva2VybmVsL3J0Yy5jCnJlbmFtZSB0byBkcml2ZXJzL3J0Yy9ydGMtcHV2My5jCmluZGV4IDhjYWQ3MGIuLjQ2ZjE0YjggMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9ydGMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcHV2My5jCkBAIC0xLDcgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvdW5pY29yZTMyL2tlcm5lbC9ydGMuYwotICoKLSAqIENvZGUgc3BlY2lmaWMgdG8gUEtVbml0eSBTb0MgYW5kIFVuaUNvcmUgSVNBCisgKiBSVEMgZHJpdmVyIGNvZGUgc3BlY2lmaWMgdG8gUEtVbml0eSBTb0MgYW5kIFVuaUNvcmUgSVNBCiAgKgogICoJTWFpbnRhaW5lZCBieSBHVUFOIFh1ZS10YW8gPGd4dEBtcHJjLnBrdS5lZHUuY24+CiAgKglDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBHdWFuIFh1ZXRhbwpAQCAtMzYsNyArMzQsNiBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhwdXYzX3J0Y19waWVfbG9jayk7CiAKIC8qIElSUSBIYW5kbGVycyAqLwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgcHV2M19ydGNfYWxhcm1pcnEoaW50IGlycSwgdm9pZCAqaWQpCiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsKQEAgLTg5LDcgKzg2LDYgQEAKIH0KIAogLyogVGltZSByZWFkL3dyaXRlICovCi0KIHN0YXRpYyBpbnQgcHV2M19ydGNfZ2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQogewogCXJ0Y190aW1lX3RvX3RtKHJlYWRsKFJUQ19SQ05SKSwgcnRjX3RtKTsKQEAgLTE5Niw3ICsxOTIsNiBAQAogCXN0cnVjdCBydGNfZGV2aWNlICpydGNfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAkvKiBkbyBub3QgY2xlYXIgQUlFIGhlcmUsIGl0IG1heSBiZSBuZWVkZWQgZm9yIHdha2UgKi8KLQogCXB1djNfcnRjX3NldHBpZShkZXYsIDApOwogCWZyZWVfaXJxKHB1djNfcnRjX2FsYXJtbm8sIHJ0Y19kZXYpOwogCWZyZWVfaXJxKHB1djNfcnRjX3RpY2tubywgcnRjX2Rldik7CkBAIC0yMTgsNyArMjEzLDYgQEAKIAkJd3JpdGVsKHJlYWRsKFJUQ19SVFNSKSAmIH5SVENfUlRTUl9IWkUsIFJUQ19SVFNSKTsKIAl9IGVsc2UgewogCQkvKiByZS1lbmFibGUgdGhlIGRldmljZSwgYW5kIGNoZWNrIGl0IGlzIG9rICovCi0KIAkJaWYgKChyZWFkbChSVENfUlRTUikgJiBSVENfUlRTUl9IWkUpID09IDApIHsKIAkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJydGMgZGlzYWJsZWQsIHJlLWVuYWJsaW5nXG4iKTsKIAkJCXdyaXRlbChyZWFkbChSVENfUlRTUikgfCBSVENfUlRTUl9IWkUsIFJUQ19SVFNSKTsKQEAgLTI1MSw3ICsyNDUsNiBAQAogCXByX2RlYnVnKCIlczogcHJvYmU9JXBcbiIsIF9fZnVuY19fLCBwZGV2KTsKIAogCS8qIGZpbmQgdGhlIElSUXMgKi8KLQogCXB1djNfcnRjX3RpY2tubyA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CiAJaWYgKHB1djNfcnRjX3RpY2tubyA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBydGMgdGlja1xuIik7CkBAIC0yNjgsNyArMjYxLDYgQEAKIAkJIHB1djNfcnRjX3RpY2tubywgcHV2M19ydGNfYWxhcm1ubyk7CiAKIAkvKiBnZXQgdGhlIG1lbW9yeSByZWdpb24gKi8KLQogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKHJlcyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7CkBAIC0yODgsNyArMjgwLDYgQEAKIAlwdXYzX3J0Y19lbmFibGUocGRldiwgMSk7CiAKIAkvKiByZWdpc3RlciBSVEMgYW5kIGV4aXQgKi8KLQogCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInBrdW5pdHkiLCAmcGRldi0+ZGV2LCAmcHV2M19ydGNvcHMsCiAJCQkJICBUSElTX01PRFVMRSk7CiAKQEAgLTMxNSw4ICszMDYsNiBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiAKLS8qIFJUQyBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KLQogc3RhdGljIGludCB0aWNudF9zYXZlOwogCiBzdGF0aWMgaW50IHB1djNfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpAQCAtMzY4LDQgKzM1NywzIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBEcml2ZXIgZm9yIHRoZSBQS1VuaXR5IHYzIGNoaXAiKTsKIE1PRFVMRV9BVVRIT1IoIkh1IERvbmdsaWFuZyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdnQ4NTAwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdnQ4NTAwLmMKaW5kZXggYjhiYzg2Mi4uZWZkNjA2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXZ0ODUwMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYwpAQCAtNzgsNyArNzgsNiBAQAogCXZvaWQgX19pb21lbQkJKnJlZ2Jhc2U7CiAJc3RydWN0IHJlc291cmNlCQkqcmVzOwogCWludAkJCWlycV9hbGFybTsKLQlpbnQJCQlpcnFfaHo7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKIAlzcGlubG9ja190CQlsb2NrOwkJLyogUHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KIH07CkBAIC0xMDAsMTAgKzk5LDYgQEAKIAlpZiAoaXNyICYgMSkKIAkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOwogCi0JLyogT25seSBzZWNvbmQvbWludXRlIGludGVycnVwdHMgYXJlIHN1cHBvcnRlZCAqLwotCWlmIChpc3IgJiAyKQotCQlldmVudHMgfD0gUlRDX1VGIHwgUlRDX0lSUUY7Ci0KIAlydGNfdXBkYXRlX2lycSh2dDg1MDBfcnRjLT5ydGMsIDEsIGV2ZW50cyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xOTksMjcgKzE5NCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZ0ODUwMF91cGRhdGVfaXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQotewotCXN0cnVjdCB2dDg1MDBfcnRjICp2dDg1MDBfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyB0bXAgPSByZWFkbCh2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19DUik7Ci0KLQlpZiAoZW5hYmxlZCkKLQkJdG1wIHw9IFZUODUwMF9SVENfQ1JfU01fU0VDIHwgVlQ4NTAwX1JUQ19DUl9TTV9FTkFCTEU7Ci0JZWxzZQotCQl0bXAgJj0gflZUODUwMF9SVENfQ1JfU01fRU5BQkxFOwotCi0Jd3JpdGVsKHRtcCwgdnQ4NTAwX3J0Yy0+cmVnYmFzZSArIFZUODUwMF9SVENfQ1IpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdnQ4NTAwX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZSA9IHZ0ODUwMF9ydGNfcmVhZF90aW1lLAogCS5zZXRfdGltZSA9IHZ0ODUwMF9ydGNfc2V0X3RpbWUsCiAJLnJlYWRfYWxhcm0gPSB2dDg1MDBfcnRjX3JlYWRfYWxhcm0sCiAJLnNldF9hbGFybSA9IHZ0ODUwMF9ydGNfc2V0X2FsYXJtLAogCS5hbGFybV9pcnFfZW5hYmxlID0gdnQ4NTAwX2FsYXJtX2lycV9lbmFibGUsCi0JLnVwZGF0ZV9pcnFfZW5hYmxlID0gdnQ4NTAwX3VwZGF0ZV9pcnFfZW5hYmxlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgdnQ4NTAwX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMjQ4LDEzICsyMjgsNiBAQAogCQlnb3RvIGVycl9mcmVlOwogCX0KIAotCXZ0ODUwMF9ydGMtPmlycV9oeiA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7Ci0JaWYgKHZ0ODUwMF9ydGMtPmlycV9oeiA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gMUh6IElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQogCXZ0ODUwMF9ydGMtPnJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbih2dDg1MDBfcnRjLT5yZXMtPnN0YXJ0LAogCQkJCQkgICAgIHJlc291cmNlX3NpemUodnQ4NTAwX3J0Yy0+cmVzKSwKIAkJCQkJICAgICAidnQ4NTAwLXJ0YyIpOwpAQCAtMjcyLDkgKzI0NSw4IEBACiAJCWdvdG8gZXJyX3JlbGVhc2U7CiAJfQogCi0JLyogRW5hYmxlIHRoZSBzZWNvbmQvbWludXRlIGludGVycnVwdCBnZW5lcmF0aW9uIGFuZCBlbmFibGUgUlRDICovCi0Jd3JpdGVsKFZUODUwMF9SVENfQ1JfRU5BQkxFIHwgVlQ4NTAwX1JUQ19DUl8yNEgKLQkJfCBWVDg1MDBfUlRDX0NSX1NNX0VOQUJMRSB8IFZUODUwMF9SVENfQ1JfU01fU0VDLAorCS8qIEVuYWJsZSBSVEMgYW5kIHNldCBpdCB0byAyNC1ob3VyIG1vZGUgKi8KKwl3cml0ZWwoVlQ4NTAwX1JUQ19DUl9FTkFCTEUgfCBWVDg1MDBfUlRDX0NSXzI0SCwKIAkgICAgICAgdnQ4NTAwX3J0Yy0+cmVnYmFzZSArIFZUODUwMF9SVENfQ1IpOwogCiAJdnQ4NTAwX3J0Yy0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigidnQ4NTAwLXJ0YyIsICZwZGV2LT5kZXYsCkBAIC0yODYsMjYgKzI1OCwxNiBAQAogCQlnb3RvIGVycl91bm1hcDsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycSh2dDg1MDBfcnRjLT5pcnFfaHosIHZ0ODUwMF9ydGNfaXJxLCAwLAotCQkJICAicnRjIDFIeiIsIHZ0ODUwMF9ydGMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwKLQkJCXZ0ODUwMF9ydGMtPmlycV9oeiwgcmV0KTsKLQkJZ290byBlcnJfdW5yZWc7Ci0JfQotCiAJcmV0ID0gcmVxdWVzdF9pcnEodnQ4NTAwX3J0Yy0+aXJxX2FsYXJtLCB2dDg1MDBfcnRjX2lycSwgMCwKIAkJCSAgInJ0YyBhbGFybSIsIHZ0ODUwMF9ydGMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwKIAkJCXZ0ODUwMF9ydGMtPmlycV9hbGFybSwgcmV0KTsKLQkJZ290byBlcnJfZnJlZV9oejsKKwkJZ290byBlcnJfdW5yZWc7CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycl9mcmVlX2h6OgotCWZyZWVfaXJxKHZ0ODUwMF9ydGMtPmlycV9oeiwgdnQ4NTAwX3J0Yyk7CiBlcnJfdW5yZWc6CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHZ0ODUwMF9ydGMtPnJ0Yyk7CiBlcnJfdW5tYXA6CkBAIC0zMjMsNyArMjg1LDYgQEAKIAlzdHJ1Y3QgdnQ4NTAwX3J0YyAqdnQ4NTAwX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJZnJlZV9pcnEodnQ4NTAwX3J0Yy0+aXJxX2FsYXJtLCB2dDg1MDBfcnRjKTsKLQlmcmVlX2lycSh2dDg1MDBfcnRjLT5pcnFfaHosIHZ0ODUwMF9ydGMpOwogCiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHZ0ODUwMF9ydGMtPnJ0Yyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCmluZGV4IDU1ZThmNzIuLjU3MGQ0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwpAQCAtNDE2LDcgKzQxNiw3IEBACiAKIAkvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBubyB0YXJnZXQgYnVmZmVyIGVtcHR5ICovCiAJaWYgKCghcS0+aXNfaW5wdXRfcSAmJgotCSAgICAocS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTVdLmZsYWdzICYgMHhmZikgPT0gMHgxMCkpIHsKKwkgICAgKHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE1XS5zZmxhZ3MpID09IDB4MTApKSB7CiAJCXFwZXJmX2luYyhxLCB0YXJnZXRfZnVsbCk7CiAJCURCRl9ERVZfRVZFTlQoREJGX0lORk8sIHEtPmlycV9wdHIsICJPVVRGVUxMIEZUQzolMDJ4IiwKIAkJCSAgICAgIHEtPmZpcnN0X3RvX2NoZWNrKTsKQEAgLTQyNyw4ICs0MjcsOCBAQAogCURCRl9FUlJPUigocS0+aXNfaW5wdXRfcSkgPyAiSU46JTJkIiA6ICJPVVQ6JTJkIiwgcS0+bnIpOwogCURCRl9FUlJPUigiRlRDOiUzZCBDOiUzZCIsIHEtPmZpcnN0X3RvX2NoZWNrLCBjb3VudCk7CiAJREJGX0VSUk9SKCJGMTQ6JTJ4IEYxNTolMngiLAotCQkgIHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE0XS5mbGFncyAmIDB4ZmYsCi0JCSAgcS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTVdLmZsYWdzICYgMHhmZik7CisJCSAgcS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTRdLnNmbGFncywKKwkJICBxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNV0uc2ZsYWdzKTsKIAogCS8qCiAJICogSW50ZXJydXB0cyBtYXkgYmUgYXZvaWRlZCBhcyBsb25nIGFzIHRoZSBlcnJvciBpcyBwcmVzZW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAppbmRleCA1NWM2YWExLi5kM2NlZTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKQEAgLTM2MSw3ICszNjEsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBxZXRoX2lzX2xhc3Rfc2JhbGUoc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlKQogewotCXJldHVybiAoc2JhbGUtPmZsYWdzICYgU0JBTF9GTEFHU19MQVNUX0VOVFJZKTsKKwlyZXR1cm4gKHNiYWxlLT5lZmxhZ3MgJiBTQkFMX0VGTEFHU19MQVNUX0VOVFJZKTsKIH0KIAogZW51bSBxZXRoX3FkaW9fYnVmZmVyX3N0YXRlcyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKaW5kZXggNTAzNjc4YS4uZGQwOGY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwpAQCAtODkwLDcgKzg5MCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCS8qIGlzIFBDSSBmbGFnIHNldCBvbiBidWZmZXI/ICovCi0JaWYgKGJ1Zi0+YnVmZmVyLT5lbGVtZW50WzBdLmZsYWdzICYgMHg0MCkKKwlpZiAoYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uc2ZsYWdzICYgU0JBTF9TRkxBR1MwX1BDSV9SRVEpCiAJCWF0b21pY19kZWMoJnF1ZXVlLT5zZXRfcGNpX2ZsYWdzX2NvdW50KTsKIAogCXNrYiA9IHNrYl9kZXF1ZXVlKCZidWYtPnNrYl9saXN0KTsKQEAgLTkwNiw5ICs5MDYsMTEgQEAKIAkJYnVmLT5pc19oZWFkZXJbaV0gPSAwOwogCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5sZW5ndGggPSAwOwogCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5hZGRyID0gTlVMTDsKLQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZmxhZ3MgPSAwOworCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5lZmxhZ3MgPSAwOworCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5zZmxhZ3MgPSAwOwogCX0KLQlidWYtPmJ1ZmZlci0+ZWxlbWVudFsxNV0uZmxhZ3MgPSAwOworCWJ1Zi0+YnVmZmVyLT5lbGVtZW50WzE1XS5lZmxhZ3MgPSAwOworCWJ1Zi0+YnVmZmVyLT5lbGVtZW50WzE1XS5zZmxhZ3MgPSAwOwogCWJ1Zi0+bmV4dF9lbGVtZW50X3RvX2ZpbGwgPSAwOwogCWF0b21pY19zZXQoJmJ1Zi0+c3RhdGUsIFFFVEhfUURJT19CVUZfRU1QVFkpOwogfQpAQCAtMjM2OCw5ICsyMzcwLDEwIEBACiAJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmxlbmd0aCA9IFBBR0VfU0laRTsKIAkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uYWRkciA9ICBwb29sX2VudHJ5LT5lbGVtZW50c1tpXTsKIAkJaWYgKGkgPT0gUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpIC0gMSkKLQkJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmZsYWdzID0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOworCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZWZsYWdzID0gU0JBTF9FRkxBR1NfTEFTVF9FTlRSWTsKIAkJZWxzZQotCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZmxhZ3MgPSAwOworCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZWZsYWdzID0gMDsKKwkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uc2ZsYWdzID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzE4LDExICsyNzIxLDExIEBACiAJaWYgKHFkaW9fZXJyb3IpIHsKIAkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgZGJmdGV4dCk7CiAJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiIEYxNT0lMDJYIiwKLQkJCSAgICAgICBidWYtPmVsZW1lbnRbMTVdLmZsYWdzICYgMHhmZik7CisJCQkgICAgICAgYnVmLT5lbGVtZW50WzE1XS5zZmxhZ3MpOwogCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiBGMTQ9JTAyWCIsCi0JCQkgICAgICAgYnVmLT5lbGVtZW50WzE0XS5mbGFncyAmIDB4ZmYpOworCQkJICAgICAgIGJ1Zi0+ZWxlbWVudFsxNF0uc2ZsYWdzKTsKIAkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgcWVycj0lWCIsIHFkaW9fZXJyb3IpOwotCQlpZiAoKGJ1Zi0+ZWxlbWVudFsxNV0uZmxhZ3MgJiAweGZmKSA9PSAweDEyKSB7CisJCWlmICgoYnVmLT5lbGVtZW50WzE1XS5zZmxhZ3MpID09IDB4MTIpIHsKIAkJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UKQEAgLTI3OTgsNyArMjgwMSw3IEBACiBzdGF0aWMgaW50IHFldGhfaGFuZGxlX3NlbmRfZXJyb3Ioc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKIAkJc3RydWN0IHFldGhfcWRpb19vdXRfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGludCBxZGlvX2VycikKIHsKLQlpbnQgc2JhbGYxNSA9IGJ1ZmZlci0+YnVmZmVyLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmY7CisJaW50IHNiYWxmMTUgPSBidWZmZXItPmJ1ZmZlci0+ZWxlbWVudFsxNV0uc2ZsYWdzOwogCiAJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNiwgImhkc25kZXJyIik7CiAJaWYgKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9JUUQpIHsKQEAgLTI5MDcsOCArMjkxMCw4IEBACiAKIAlmb3IgKGkgPSBpbmRleDsgaSA8IGluZGV4ICsgY291bnQ7ICsraSkgewogCQlidWYgPSAmcXVldWUtPmJ1ZnNbaSAlIFFESU9fTUFYX0JVRkZFUlNfUEVSX1FdOwotCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtidWYtPm5leHRfZWxlbWVudF90b19maWxsIC0gMV0uZmxhZ3MgfD0KLQkJCQlTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2J1Zi0+bmV4dF9lbGVtZW50X3RvX2ZpbGwgLSAxXS5lZmxhZ3MgfD0KKwkJCQlTQkFMX0VGTEFHU19MQVNUX0VOVFJZOwogCiAJCWlmIChxdWV1ZS0+Y2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX0lRRCkKIAkJCWNvbnRpbnVlOwpAQCAtMjkyMSw3ICsyOTI0LDcgQEAKIAkJCQkvKiBpdCdzIGxpa2VseSB0aGF0IHdlJ2xsIGdvIHRvIHBhY2tpbmcKIAkJCQkgKiBtb2RlIHNvb24gKi8KIAkJCQlhdG9taWNfaW5jKCZxdWV1ZS0+c2V0X3BjaV9mbGFnc19jb3VudCk7Ci0JCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uZmxhZ3MgfD0gMHg0MDsKKwkJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFswXS5zZmxhZ3MgfD0gU0JBTF9TRkxBR1MwX1BDSV9SRVE7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoIWF0b21pY19yZWFkKCZxdWV1ZS0+c2V0X3BjaV9mbGFnc19jb3VudCkpIHsKQEAgLTI5MzQsNyArMjkzNyw3IEBACiAJCQkJICogZnVydGhlciBzZW5kIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHN0YWNrCiAJCQkJICovCiAJCQkJYXRvbWljX2luYygmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpOwotCQkJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50WzBdLmZsYWdzIHw9IDB4NDA7CisJCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uc2ZsYWdzIHw9IFNCQUxfU0ZMQUdTMF9QQ0lfUkVROwogCQkJfQogCQl9CiAJfQpAQCAtMzE4MCwyMCArMzE4MywyMCBAQAogCQlpZiAoIWxlbmd0aCkgewogCQkJaWYgKGZpcnN0X2xhcCkKIAkJCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKLQkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQkJCVNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9CisJCQkJCQlTQkFMX0VGTEFHU19GSVJTVF9GUkFHOwogCQkJCWVsc2UKLQkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0gMDsKKwkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9IDA7CiAJCQllbHNlCi0JCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQkgICAgU0JBTF9GTEFHU19NSURETEVfRlJBRzsKKwkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0KKwkJCQkgICAgU0JBTF9FRkxBR1NfTUlERExFX0ZSQUc7CiAJCX0gZWxzZSB7CiAJCQlpZiAoZmlyc3RfbGFwKQotCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9Ci0JCQkJICAgIFNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0KKwkJCQkgICAgU0JBTF9FRkxBR1NfRklSU1RfRlJBRzsKIAkJCWVsc2UKLQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPQotCQkJCSAgICBTQkFMX0ZMQUdTX01JRERMRV9GUkFHOworCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5lZmxhZ3MgPQorCQkJCSAgICBTQkFMX0VGTEFHU19NSURETEVfRlJBRzsKIAkJfQogCQlkYXRhICs9IGxlbmd0aF9oZXJlOwogCQllbGVtZW50Kys7CkBAIC0zMjA1LDEyICszMjA4LDEyIEBACiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5hZGRyID0gKGNoYXIgKilwYWdlX3RvX3BoeXMoZnJhZy0+cGFnZSkKIAkJCSsgZnJhZy0+cGFnZV9vZmZzZXQ7CiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5sZW5ndGggPSBmcmFnLT5zaXplOwotCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPSBTQkFMX0ZMQUdTX01JRERMRV9GUkFHOworCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0gU0JBTF9FRkxBR1NfTUlERExFX0ZSQUc7CiAJCWVsZW1lbnQrKzsKIAl9CiAKLQlpZiAoYnVmZmVyLT5lbGVtZW50W2VsZW1lbnQgLSAxXS5mbGFncykKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnQgLSAxXS5mbGFncyA9IFNCQUxfRkxBR1NfTEFTVF9GUkFHOworCWlmIChidWZmZXItPmVsZW1lbnRbZWxlbWVudCAtIDFdLmVmbGFncykKKwkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnQgLSAxXS5lZmxhZ3MgPSBTQkFMX0VGTEFHU19MQVNUX0ZSQUc7CiAJKm5leHRfZWxlbWVudF90b19maWxsID0gZWxlbWVudDsKIH0KIApAQCAtMzIzNCw3ICszMjM3LDcgQEAKIAkJLypmaWxsIGZpcnN0IGJ1ZmZlciBlbnRyeSBvbmx5IHdpdGggaGVhZGVyIGluZm9ybWF0aW9uICovCiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5hZGRyID0gc2tiLT5kYXRhOwogCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0ubGVuZ3RoID0gaGRyX2xlbjsKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0gU0JBTF9GTEFHU19GSVJTVF9GUkFHOworCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0gU0JBTF9FRkxBR1NfRklSU1RfRlJBRzsKIAkJYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCsrOwogCQlza2ItPmRhdGEgKz0gaGRyX2xlbjsKIAkJc2tiLT5sZW4gIC09IGhkcl9sZW47CkBAIC0zMjQ2LDcgKzMyNDksNyBAQAogCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uYWRkciA9IGhkcjsKIAkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpICsKIAkJCQkJCQloZF9sZW47Ci0JCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9IFNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9IFNCQUxfRUZMQUdTX0ZJUlNUX0ZSQUc7CiAJCWJ1Zi0+aXNfaGVhZGVyW2VsZW1lbnRdID0gMTsKIAkJYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCsrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCmluZGV4IDg1MTJiNWMuLjAyMmZiNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwpAQCAtNjQwLDcgKzY0MCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgemZjcF9mc2ZfcmVxICp6ZmNwX2ZzZl9yZXFfY3JlYXRlKHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sCi0JCQkJCQl1MzIgZnNmX2NtZCwgdTMyIHNidHlwZSwKKwkJCQkJCXUzMiBmc2ZfY21kLCB1OCBzYnR5cGUsCiAJCQkJCQltZW1wb29sX3QgKnBvb2wpCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHFkaW8tPmFkYXB0ZXI7CkBAIC04NDEsNyArODQxLDcgQEAKIAlpZiAoemZjcF9xZGlvX3NiYWxfZ2V0KHFkaW8pKQogCQlnb3RvIG91dDsKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0FCT1JUX0ZDUF9DTU5ELAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuc2NzaV9hYm9ydCk7CiAJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJlcSA9IE5VTEw7CkBAIC0xMDEyLDcgKzEwMTIsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfU0VORF9HRU5FUklDLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9XUklURV9SRUFELCBwb29sKTsKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQsIHBvb2wpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldCA9IFBUUl9FUlIocmVxKTsKQEAgLTExMTAsNyArMTExMCw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9TRU5EX0VMUywKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfV1JJVEVfUkVBRCwgTlVMTCk7CisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9XUklURV9SRUFELCBOVUxMKTsKIAogCWlmIChJU19FUlIocmVxKSkgewogCQlyZXQgPSBQVFJfRVJSKHJlcSk7CkBAIC0xMTU2LDcgKzExNTYsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfRVhDSEFOR0VfQ09ORklHX0RBVEEsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTE5OCw3ICsxMTk4LDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9FWENIQU5HRV9DT05GSUdfREFUQSwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwgTlVMTCk7CisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELCBOVUxMKTsKIAogCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CkBAIC0xMjUwLDcgKzEyNTAsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfRVhDSEFOR0VfUE9SVF9EQVRBLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTEyOTYsNyArMTI5Niw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfRVhDSEFOR0VfUE9SVF9EQVRBLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELCBOVUxMKTsKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsIE5VTEwpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKQEAgLTE0MTIsNyArMTQxMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9PUEVOX1BPUlRfV0lUSF9ESUQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTQ3OCw3ICsxNDc4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0NMT1NFX1BPUlQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTU1Myw3ICsxNTUzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX09QRU5fUE9SVF9XSVRIX0RJRCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xNjA2LDcgKzE2MDYsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfQ0xPU0VfUE9SVCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xNjk4LDcgKzE2OTgsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfQ0xPU0VfUEhZU0lDQUxfUE9SVCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xODEyLDcgKzE4MTIsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfT1BFTl9MVU4sCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgYWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTkwMSw3ICsxOTAxLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0NMT1NFX0xVTiwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0yMTYxLDcgKzIxNjEsNyBAQAogewogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcTsKIAlzdHJ1Y3QgZmNwX2NtbmQgKmZjcF9jbW5kOwotCXVuc2lnbmVkIGludCBzYnR5cGUgPSBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQ7CisJdTggc2J0eXBlID0gU0JBTF9TRkxBR1MwX1RZUEVfUkVBRDsKIAlpbnQgcmVhbF9ieXRlcywgcmV0dmFsID0gLUVJTywgZGl4X2J5dGVzID0gMDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzY3NpX2NtbmQtPmRldmljZTsKIAlzdHJ1Y3QgemZjcF9zY3NpX2RldiAqemZjcF9zZGV2ID0gc2Rldl90b196ZmNwKHNkZXYpOwpAQCAtMjE4MSw3ICsyMTgxLDcgQEAKIAl9CiAKIAlpZiAoc2NzaV9jbW5kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQotCQlzYnR5cGUgPSBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFOworCQlzYnR5cGUgPSBTQkFMX1NGTEFHUzBfVFlQRV9XUklURTsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfRkNQX0NNTkQsCiAJCQkJICBzYnR5cGUsIGFkYXB0ZXItPnBvb2wuc2NzaV9yZXEpOwpAQCAtMjI4MCw3ICsyMjgwLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0ZDUF9DTU5ELAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9XUklURSwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFLAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5zY3NpX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTIzMjgsMTcgKzIzMjgsMTggQEAKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gYWRhcHRlci0+cWRpbzsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEgPSBOVUxMOwogCXN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fc3VwcG9ydCAqYm90dG9tOwotCWludCBkaXJlY3Rpb24sIHJldHZhbCA9IC1FSU8sIGJ5dGVzOworCWludCByZXR2YWwgPSAtRUlPLCBieXRlczsKKwl1OCBkaXJlY3Rpb247CiAKIAlpZiAoIShhZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfQ0ZEQykpCiAJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKIAogCXN3aXRjaCAoZnNmX2NmZGMtPmNvbW1hbmQpIHsKIAljYXNlIEZTRl9RVENCX0RPV05MT0FEX0NPTlRST0xfRklMRToKLQkJZGlyZWN0aW9uID0gU0JBTF9GTEFHUzBfVFlQRV9XUklURTsKKwkJZGlyZWN0aW9uID0gU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEU7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1FUQ0JfVVBMT0FEX0NPTlRST0xfRklMRToKLQkJZGlyZWN0aW9uID0gU0JBTF9GTEFHUzBfVFlQRV9SRUFEOworCQlkaXJlY3Rpb24gPSBTQkFMX1NGTEFHUzBfVFlQRV9SRUFEOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTI0MTMsNyArMjQxNCw3IEBACiAJCWZzZl9yZXEtPnFkaW9fcmVxLnNiYWxfcmVzcG9uc2UgPSBzYmFsX2lkeDsKIAkJemZjcF9mc2ZfcmVxX2NvbXBsZXRlKGZzZl9yZXEpOwogCi0JCWlmIChsaWtlbHkoc2JhbGUtPmZsYWdzICYgU0JBTF9GTEFHU19MQVNUX0VOVFJZKSkKKwkJaWYgKGxpa2VseShzYmFsZS0+ZWZsYWdzICYgU0JBTF9FRkxBR1NfTEFTVF9FTlRSWSkpCiAJCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCmluZGV4IDk4ZTk3ZDkuLmQ5YzQwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogCS8qIHNldCBsYXN0IGVudHJ5IGZsYWcgaW4gY3VycmVudCBTQkFMRSBvZiBjdXJyZW50IFNCQUwgKi8KIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9jdXJyKHFkaW8sIHFfcmVxKTsKLQlzYmFsZS0+ZmxhZ3MgfD0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOworCXNiYWxlLT5lZmxhZ3MgfD0gU0JBTF9FRkxBR1NfTEFTVF9FTlRSWTsKIAogCS8qIGRvbid0IGV4Y2VlZCBsYXN0IGFsbG93ZWQgU0JBTCAqLwogCWlmIChxX3JlcS0+c2JhbF9sYXN0ID09IHFfcmVxLT5zYmFsX2xpbWl0KQpAQCAtMTMyLDcgKzEzMiw3IEBACiAKIAkvKiBzZXQgY2hhaW5pbmcgZmxhZyBpbiBmaXJzdCBTQkFMRSBvZiBjdXJyZW50IFNCQUwgKi8KIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9yZXEocWRpbywgcV9yZXEpOwotCXNiYWxlLT5mbGFncyB8PSBTQkFMX0ZMQUdTMF9NT1JFX1NCQUxTOworCXNiYWxlLT5zZmxhZ3MgfD0gU0JBTF9TRkxBR1MwX01PUkVfU0JBTFM7CiAKIAkvKiBjYWxjdWxhdGUgaW5kZXggb2YgbmV4dCBTQkFMICovCiAJcV9yZXEtPnNiYWxfbGFzdCsrOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKIAkvKiBzZXQgc3RvcmFnZS1ibG9jayB0eXBlIGZvciBuZXcgU0JBTCAqLwogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX2N1cnIocWRpbywgcV9yZXEpOwotCXNiYWxlLT5mbGFncyB8PSBxX3JlcS0+c2J0eXBlOworCXNiYWxlLT5zZmxhZ3MgfD0gcV9yZXEtPnNidHlwZTsKIAogCXJldHVybiBzYmFsZTsKIH0KQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAJLyogc2V0IHN0b3JhZ2UtYmxvY2sgdHlwZSBmb3IgdGhpcyByZXF1ZXN0ICovCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfcmVxKHFkaW8sIHFfcmVxKTsKLQlzYmFsZS0+ZmxhZ3MgfD0gcV9yZXEtPnNidHlwZTsKKwlzYmFsZS0+c2ZsYWdzIHw9IHFfcmVxLT5zYnR5cGU7CiAKIAlmb3IgKDsgc2c7IHNnID0gc2dfbmV4dChzZykpIHsKIAkJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfbmV4dChxZGlvLCBxX3JlcSk7CkBAIC0zODQsNyArMzg0LDggQEAKIAlmb3IgKGNjID0gMDsgY2MgPCBRRElPX01BWF9CVUZGRVJTX1BFUl9ROyBjYysrKSB7CiAJCXNiYWxlID0gJihxZGlvLT5yZXNfcVtjY10tPmVsZW1lbnRbMF0pOwogCQlzYmFsZS0+bGVuZ3RoID0gMDsKLQkJc2JhbGUtPmZsYWdzID0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOworCQlzYmFsZS0+ZWZsYWdzID0gU0JBTF9FRkxBR1NfTEFTVF9FTlRSWTsKKwkJc2JhbGUtPnNmbGFncyA9IDA7CiAJCXNiYWxlLT5hZGRyID0gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmgKaW5kZXggMjI5N2Q4ZC4uNTRlMjJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmgKQEAgLTY3LDcgKzY3LDcgQEAKICAqIEBxZGlvX291dGJfdXNhZ2U6IHVzYWdlIG9mIG91dGJvdW5kIHF1ZXVlCiAgKi8KIHN0cnVjdCB6ZmNwX3FkaW9fcmVxIHsKLQl1MzIJc2J0eXBlOworCXU4CXNidHlwZTsKIAl1OAlzYmFsX251bWJlcjsKIAl1OAlzYmFsX2ZpcnN0OwogCXU4CXNiYWxfbGFzdDsKQEAgLTExNiw3ICsxMTYsNyBAQAogICovCiBzdGF0aWMgaW5saW5lCiB2b2lkIHpmY3BfcWRpb19yZXFfaW5pdChzdHJ1Y3QgemZjcF9xZGlvICpxZGlvLCBzdHJ1Y3QgemZjcF9xZGlvX3JlcSAqcV9yZXEsCi0JCQl1bnNpZ25lZCBsb25nIHJlcV9pZCwgdTMyIHNidHlwZSwgdm9pZCAqZGF0YSwgdTMyIGxlbikKKwkJCXVuc2lnbmVkIGxvbmcgcmVxX2lkLCB1OCBzYnR5cGUsIHZvaWQgKmRhdGEsIHUzMiBsZW4pCiB7CiAJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCWludCBjb3VudCA9IG1pbihhdG9taWNfcmVhZCgmcWRpby0+cmVxX3FfZnJlZSksCkBAIC0xMzEsNyArMTMxLDggQEAKIAogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX3JlcShxZGlvLCBxX3JlcSk7CiAJc2JhbGUtPmFkZHIgPSAodm9pZCAqKSByZXFfaWQ7Ci0Jc2JhbGUtPmZsYWdzID0gU0JBTF9GTEFHUzBfQ09NTUFORCB8IHNidHlwZTsKKwlzYmFsZS0+ZWZsYWdzID0gMDsKKwlzYmFsZS0+c2ZsYWdzID0gU0JBTF9TRkxBR1MwX0NPTU1BTkQgfCBzYnR5cGU7CiAKIAlpZiAodW5saWtlbHkoIWRhdGEpKQogCQlyZXR1cm47CkBAIC0xNzMsNyArMTc0LDcgQEAKIAlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAKIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9jdXJyKHFkaW8sIHFfcmVxKTsKLQlzYmFsZS0+ZmxhZ3MgfD0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOworCXNiYWxlLT5lZmxhZ3MgfD0gU0JBTF9FRkxBR1NfTEFTVF9FTlRSWTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDRhMWYwMjkuLjhkOWRhZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC04MzAsNiArODMwLDE5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnZHRoLgogCitjb25maWcgU0NTSV9JU0NJCisJdHJpc3RhdGUgIkludGVsKFIpIEM2MDAgU2VyaWVzIENoaXBzZXQgU0FTIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWRlcGVuZHMgb24gWDg2CisJIyAodGVtcG9yYXJ5KToga25vd24gYWxwaGEgcXVhbGl0eSBkcml2ZXIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTQ1NJX1NBU19MSUJTQVMKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgNkdiL3MgU0FTIGNhcGFiaWxpdGllcyBvZiB0aGUgc3RvcmFnZQorCSAgY29udHJvbCB1bml0IGZvdW5kIGluIHRoZSBJbnRlbChSKSBDNjAwIHNlcmllcyBjaGlwc2V0LgorCisJICBUaGUgZXhwZXJpbWVudGFsIHRhZyB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlIGRyaXZlciBleGl0cyBhbHBoYQorCiBjb25maWcgU0NTSV9HRU5FUklDX05DUjUzODAKIAl0cmlzdGF0ZSAiR2VuZXJpYyBOQ1I1MzgwLzUzYzQwMCBTQ1NJIFBJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQppbmRleCA3YWQwYjhhLi4zYzA4ZjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCkBAIC03Myw2ICs3Myw3IEBACiBvYmotJChDT05GSUdfU0NTSV9BSUM3WFhYX09MRCkJKz0gYWljN3h4eF9vbGQubwogb2JqLSQoQ09ORklHX1NDU0lfQUlDOTRYWCkJKz0gYWljOTR4eC8KIG9iai0kKENPTkZJR19TQ1NJX1BNODAwMSkJKz0gcG04MDAxLworb2JqLSQoQ09ORklHX1NDU0lfSVNDSSkJCSs9IGlzY2kvCiBvYmotJChDT05GSUdfU0NTSV9JUFMpCQkrPSBpcHMubwogb2JqLSQoQ09ORklHX1NDU0lfRkRfTUNTKQkrPSBmZF9tY3Mubwogb2JqLSQoQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTikrPSBmZG9tYWluLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmMgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCmluZGV4IGM2YzA0MzQuLjZiYmEyM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwc2EuYwpAQCAtMTAzNyw2ICsxMDM3LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHNlbnNlX2tleTsKIAl1bnNpZ25lZCBjaGFyIGFzYzsgICAgICAvKiBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgKi8KIAl1bnNpZ25lZCBjaGFyIGFzY3E7ICAgICAvKiBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgcXVhbGlmaWVyICovCisJdW5zaWduZWQgbG9uZyBzZW5zZV9kYXRhX3NpemU7CiAKIAllaSA9IGNwLT5lcnJfaW5mbzsKIAljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjcC0+c2NzaV9jbWQ7CkBAIC0xMDUxLDEwICsxMDUyLDE0IEBACiAJY21kLT5yZXN1bHQgfD0gZWktPlNjc2lTdGF0dXM7CiAKIAkvKiBjb3B5IHRoZSBzZW5zZSBkYXRhIHdoZXRoZXIgd2UgbmVlZCB0byBvciBub3QuICovCi0JbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCBlaS0+U2Vuc2VJbmZvLAotCQllaS0+U2Vuc2VMZW4gPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUgPwotCQkJU0NTSV9TRU5TRV9CVUZGRVJTSVpFIDoKLQkJCWVpLT5TZW5zZUxlbik7CisJaWYgKFNDU0lfU0VOU0VfQlVGRkVSU0laRSA8IHNpemVvZihlaS0+U2Vuc2VJbmZvKSkKKwkJc2Vuc2VfZGF0YV9zaXplID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCWVsc2UKKwkJc2Vuc2VfZGF0YV9zaXplID0gc2l6ZW9mKGVpLT5TZW5zZUluZm8pOworCWlmIChlaS0+U2Vuc2VMZW4gPCBzZW5zZV9kYXRhX3NpemUpCisJCXNlbnNlX2RhdGFfc2l6ZSA9IGVpLT5TZW5zZUxlbjsKKworCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgZWktPlNlbnNlSW5mbywgc2Vuc2VfZGF0YV9zaXplKTsKIAlzY3NpX3NldF9yZXNpZChjbWQsIGVpLT5SZXNpZHVhbENudCk7CiAKIAlpZiAoZWktPkNvbW1hbmRTdGF0dXMgPT0gMCkgewpAQCAtMjU4MCw3ICsyNTg1LDggQEAKIAkJYy0+U0dbMF0uRXh0ID0gMDsgLyogd2UgYXJlIG5vdCBjaGFpbmluZyovCiAJfQogCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmUoaCwgYyk7Ci0JaHBzYV9wY2lfdW5tYXAoaC0+cGRldiwgYywgMSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkKKwkJaHBzYV9wY2lfdW5tYXAoaC0+cGRldiwgYywgMSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAljaGVja19pb2N0bF91bml0X2F0dGVudGlvbihoLCBjKTsKIAogCS8qIENvcHkgdGhlIGVycm9yIGluZm9ybWF0aW9uIG91dCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCmluZGV4IGI3NjUwNjEuLmJkZmEyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKQEAgLTQzMDYsOCArNDMwNiw4IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJaWYgKHJjID09IEhfQ0xPU0VEKQogCQkJdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHRvX3Zpb19kZXYodmhvc3QtPmRldikpOwotCQllbHNlIGlmIChyYyB8fCAocmMgPSBpYm12ZmNfc2VuZF9jcnFfaW5pdCh2aG9zdCkpIHx8Ci0JCQkgKHJjID0gdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHRvX3Zpb19kZXYodmhvc3QtPmRldikpKSkgeworCQlpZiAocmMgfHwgKHJjID0gaWJtdmZjX3NlbmRfY3JxX2luaXQodmhvc3QpKSB8fAorCQkgICAgKHJjID0gdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHRvX3Zpb19kZXYodmhvc3QtPmRldikpKSkgewogCQkJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0xJTktfREVBRCk7CiAJCQlkZXZfZXJyKHZob3N0LT5kZXYsICJFcnJvciBhZnRlciByZXNldCAocmM9JWQpXG4iLCByYyk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2lzY2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1OWUxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorb2JqLSQoQ09ORklHX1NDU0lfSVNDSSkgKz0gaXNjaS5vCitpc2NpLW9ianMgOj0gaW5pdC5vIHBoeS5vIHJlcXVlc3QubyBcCisJICAgICByZW1vdGVfZGV2aWNlLm8gcG9ydC5vIFwKKwkgICAgIGhvc3QubyB0YXNrLm8gcHJvYmVfcm9tcy5vIFwKKwkgICAgIHJlbW90ZV9ub2RlX2NvbnRleHQubyBcCisJICAgICByZW1vdGVfbm9kZV90YWJsZS5vIFwKKwkgICAgIHVuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wubyBcCisJICAgICBwb3J0X2NvbmZpZy5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1NDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKyMgTWFrZWZpbGUgZm9yIGNyZWF0ZV9mdworIworQ0M9Z2NjCitDRkxBR1M9LWMgLVdhbGwgLU8yIC1nCitMREZMQUdTPQorU09VUkNFUz1jcmVhdGVfZncuYworT0JKRUNUUz0kKFNPVVJDRVM6LmNwcD0ubykKK0VYRUNVVEFCTEU9Y3JlYXRlX2Z3CisKK2FsbDogJChTT1VSQ0VTKSAkKEVYRUNVVEFCTEUpCisKKyQoRVhFQ1VUQUJMRSk6ICQoT0JKRUNUUykKKwkkKENDKSAkKExERkxBR1MpICQoT0JKRUNUUykgLW8gJEAKKworLmMubzoKKwkkKENDKSAkKENGTEFHUykgJDwgLU8gJEAKKworY2xlYW46CisJcm0gLWYgKi5vICQoRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL1JFQURNRSBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDU2ZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvUkVBRE1FCkBAIC0wLDAgKzEsMzYgQEAKK1RoaXMgZGVmaW5lcyB0aGUgdGVtcG9yYXJ5IGJpbmFyeSBibG93IHdlIGFyZSB0byBwYXNzIHRvIHRoZSBTQ1UKK2RyaXZlciB0byBlbXVsYXRlIHRoZSBiaW5hcnkgZmlybXdhcmUgdGhhdCB3ZSB3aWxsIGV2ZW50dWFsbHkgYmUKK2FibGUgdG8gYWNjZXNzIHZpYSBOVlJBTSBvbiB0aGUgU0NVIGNvbnRyb2xsZXIuCisKK1RoZSBjdXJyZW50IHNpemUgb2YgdGhlIGJpbmFyeSBibG9iIGlzIGV4cGVjdGVkIHRvIGJlIDE0OSBieXRlcyBvciBsYXJnZXIKKworSGVhZGVyIFR5cGVzOgorMHgxOiBQaHkgTWFza3MKKzB4MjogUGh5IEdlbnMKKzB4MzogU0FTIEFkZHJzCisweGZmOiBFbmQgb2YgRGF0YQorCitJRCBzdHJpbmcgLSB1OFsxMl06ICIjU0NVIE1BR0lDI1wwIgorVmVyc2lvbiAtIHU4OiAxCitTdWJWZXJzaW9uIC0gdTg6IDAKKworSGVhZGVyIFR5cGUgLSB1ODogMHgxCitTaXplIC0gdTg6IDgKK1BoeSBNYXNrIC0gdTMyWzhdCisKK0hlYWRlciBUeXBlIC0gdTg6IDB4MgorU2l6ZSAtIHU4OiA4CitQaHkgR2VuIC0gdTMyWzhdCisKK0hlYWRlciBUeXBlIC0gdTg6IDB4MworU2l6ZSAtIHU4OiA4CitTYXMgQWRkciAtIHU2NFs4XQorCitIZWFkZXIgVHlwZSAtIHU4OiAweGYKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUGxhY2UgaXNjaV9maXJtd2FyZS5iaW4gaW4gL2xpYi9maXJtd2FyZQorQmUgc3VyZSB0byByZWNyZWF0ZSB0aGUgaW5pdHJhbWZzIGltYWdlIHRvIGluY2x1ZGUgdGhlIGZpcm13YXJlLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTI4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuYwpAQCAtMCwwICsxLDk5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjcmVhdGVfZncuaCIKKyNpbmNsdWRlICIuLi9wcm9iZV9yb21zLmgiCisKK2ludCB3cml0ZV9ibG9iKHN0cnVjdCBpc2NpX29yb20gKmlzY2lfb3JvbSkKK3sKKwlGSUxFICpmZDsKKwlpbnQgZXJyOworCXNpemVfdCBjb3VudDsKKworCWZkID0gZm9wZW4oYmxvYl9uYW1lLCAidysiKTsKKwlpZiAoIWZkKSB7CisJCXBlcnJvcigiT3BlbiBmaWxlIGZvciB3cml0ZSBmYWlsZWQiKTsKKwkJZmNsb3NlKGZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJY291bnQgPSBmd3JpdGUoaXNjaV9vcm9tLCBzaXplb2Yoc3RydWN0IGlzY2lfb3JvbSksIDEsIGZkKTsKKwlpZiAoY291bnQgIT0gMSkgeworCQlwZXJyb3IoIldyaXRlIGRhdGEgZmFpbGVkIik7CisJCWZjbG9zZShmZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWZjbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzZXRfYmluYXJ5X3ZhbHVlcyhzdHJ1Y3QgaXNjaV9vcm9tICppc2NpX29yb20pCit7CisJaW50IGN0cmxfaWR4LCBwaHlfaWR4LCBwb3J0X2lkeDsKKworCS8qIHNldHRpbmcgT1JPTSBzaWduYXR1cmUgKi8KKwlzdHJuY3B5KGlzY2lfb3JvbS0+aGRyLnNpZ25hdHVyZSwgc2lnLCBzdHJsZW4oc2lnKSk7CisJaXNjaV9vcm9tLT5oZHIudmVyc2lvbiA9IHZlcnNpb247CisJaXNjaV9vcm9tLT5oZHIudG90YWxfYmxvY2tfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpc2NpX29yb20pOworCWlzY2lfb3JvbS0+aGRyLmhkcl9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNjaV9iaW9zX29lbV9wYXJhbV9ibG9ja19oZHIpOworCWlzY2lfb3JvbS0+aGRyLm51bV9lbGVtZW50cyA9IG51bV9lbGVtZW50czsKKworCWZvciAoY3RybF9pZHggPSAwOyBjdHJsX2lkeCA8IDI7IGN0cmxfaWR4KyspIHsKKwkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5jb250cm9sbGVyLm1vZGVfdHlwZSA9IG1vZGVfdHlwZTsKKwkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwID0KKwkJCW1heF9udW1fY29uY3VycmVudF9kZXZfc3Bpbl91cDsKKwkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5jb250cm9sbGVyLmRvX2VuYWJsZV9zc2MgPQorCQkJZW5hYmxlX3NzYzsKKworCQlmb3IgKHBvcnRfaWR4ID0gMDsgcG9ydF9pZHggPCA0OyBwb3J0X2lkeCsrKQorCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5wb3J0c1twb3J0X2lkeF0ucGh5X21hc2sgPQorCQkJCXBoeV9tYXNrW2N0cmxfaWR4XVtwb3J0X2lkeF07CisKKwkJZm9yIChwaHlfaWR4ID0gMDsgcGh5X2lkeCA8IDQ7IHBoeV9pZHgrKykgeworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLnNhc19hZGRyZXNzLmhpZ2ggPQorCQkJCShfX3UzMikoc2FzX2FkZHJbY3RybF9pZHhdW3BoeV9pZHhdID4+IDMyKTsKKwkJCWlzY2lfb3JvbS0+Y3RybFtjdHJsX2lkeF0ucGh5c1twaHlfaWR4XS5zYXNfYWRkcmVzcy5sb3cgPQorCQkJCShfX3UzMikoc2FzX2FkZHJbY3RybF9pZHhdW3BoeV9pZHhdKTsKKworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLmFmZV90eF9hbXBfY29udHJvbDAgPQorCQkJCWFmZV90eF9hbXBfY29udHJvbDA7CisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uYWZlX3R4X2FtcF9jb250cm9sMSA9CisJCQkJYWZlX3R4X2FtcF9jb250cm9sMTsKKwkJCWlzY2lfb3JvbS0+Y3RybFtjdHJsX2lkeF0ucGh5c1twaHlfaWR4XS5hZmVfdHhfYW1wX2NvbnRyb2wyID0KKwkJCQlhZmVfdHhfYW1wX2NvbnRyb2wyOworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLmFmZV90eF9hbXBfY29udHJvbDMgPQorCQkJCWFmZV90eF9hbXBfY29udHJvbDM7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXNjaV9vcm9tICppc2NpX29yb207CisKKwlpc2NpX29yb20gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2NpX29yb20pKTsKKwltZW1zZXQoaXNjaV9vcm9tLCAwLCBzaXplb2Yoc3RydWN0IGlzY2lfb3JvbSkpOworCisJc2V0X2JpbmFyeV92YWx1ZXMoaXNjaV9vcm9tKTsKKworCWVyciA9IHdyaXRlX2Jsb2IoaXNjaV9vcm9tKTsKKwlpZiAoZXJyIDwgMCkgeworCQlmcmVlKGlzY2lfb3JvbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZnJlZShpc2NpX29yb20pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvY3JlYXRlX2Z3LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI5ODgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvY3JlYXRlX2Z3LmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfQ1JFQVRFX0ZXX0hfCisjZGVmaW5lIF9DUkVBVEVfRldfSF8KKyNpbmNsdWRlICIuLi9wcm9iZV9yb21zLmgiCisKKworLyogd2UgYXJlIGNvbmZpZ3VyaW5nIGZvciAyIFNDVXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgbnVtX2VsZW1lbnRzID0gMjsKKworLyoKKyAqIEZvciBhbGwgZGVmaW5lZCBhcnJheXM6CisgKiBlbGVtZW50cyAwLTMgYXJlIGZvciBTQ1UwLCBwb3J0cyAwLTMKKyAqIGVsZW1lbnRzIDQtNyBhcmUgZm9yIFNDVTEsIHBvcnRzIDAtMworICoKKyAqIHZhbGlkIGNvbmZpZ3VyYXRpb25zIGZvciBvbmUgU0NVIGFyZToKKyAqICBQMCAgUDEgIFAyICBQMworICogLS0tLS0tLS0tLS0tLS0tLQorICogMHhGLDB4MCwweDAsMHgwICMgMSB4NCBwb3J0CisgKiAweDMsMHgwLDB4NCwweDggIyBQaHlzIDAgYW5kIDEgYXJlIGEgeDIgcG9ydCwgcGh5IDIgYW5kIHBoeSAzIGFyZSBlYWNoIHgxCisgKiAgICAgICAgICAgICAgICAgIyBwb3J0cworICogMHgxLDB4MiwweEMsMHgwICMgUGh5cyAwIGFuZCAxIGFyZSBlYWNoIHgxIHBvcnRzLCBwaHkgMiBhbmQgcGh5IDMgYXJlIGEgeDIKKyAqICAgICAgICAgICAgICAgICAjIHBvcnQKKyAqIDB4MywweDAsMHhDLDB4MCAjIFBoeXMgMCBhbmQgMSBhcmUgYSB4MiBwb3J0LCBwaHkgMiBhbmQgcGh5IDMgYXJlIGEgeDIgcG9ydAorICogMHgxLDB4MiwweDQsMHg4ICMgRWFjaCBwaHkgaXMgYSB4MSBwb3J0ICh0aGlzIGlzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24pCisgKgorICogaWYgdGhlcmUgaXMgYSBwb3J0L3BoeSBvbiB3aGljaCB5b3UgZG8gbm90IHdpc2ggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKyAqIHZhbHVlcywgdXNlIHRoZSB2YWx1ZSBhc3NpZ25lZCB0byBVTklOSVRfUEFSQU0gKDI1NSkuCisgKi8KKworLyogZGlzY292ZXJ5IG1vZGUgdHlwZSAocG9ydCBhdXRvIGNvbmZpZyBtb2RlIGJ5IGRlZmF1bHQgKSAqLworCisvKgorICogaWYgdGhlcmUgaXMgYSBwb3J0L3BoeSBvbiB3aGljaCB5b3UgZG8gbm90IHdpc2ggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKyAqIHZhbHVlcywgdXNlIHRoZSB2YWx1ZSAiMDAwMDAwMDAwMDAwMDAwMCIuIFNBUyBhZGRyZXNzIG9mIHplcm8ncyBpcworICogY29uc2lkZXJlZCBpbnZhbGlkIGFuZCB3aWxsIG5vdCBiZSB1c2VkLgorICovCisjaWZkZWYgTVBDCitzdGF0aWMgY29uc3QgaW50IG1vZGVfdHlwZSA9IFNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFOworc3RhdGljIGNvbnN0IF9fdTggcGh5X21hc2tbMl1bNF0gPSB7IHsxLCAyLCA0LCA4fSwKKwkJCQkgICAgIHsxLCAyLCA0LCA4fSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBzYXNfYWRkclsyXVs0XSA9IHsgeyAweDVGQ0ZGRkZGRjAwMDAwMDFVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkZGMDAwMDAwMlVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRkYwMDAwMDAzVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGRjAwMDAwMDRVTEwgfSwKKwkJCQkJCSAgIHsgMHg1RkNGRkZGRkYwMDAwMDA1VUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGRjAwMDAwMDZVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkZGMDAwMDAwN1VMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRkYwMDAwMDA4VUxMIH0gfTsKKyNlbHNlCS8qIEFQQyAoZGVmYXVsdCkgKi8KK3N0YXRpYyBjb25zdCBpbnQgbW9kZV90eXBlID0gU0NJQ19QT1JUX0FVVE9NQVRJQ19DT05GSUdVUkFUSU9OX01PREU7CitzdGF0aWMgY29uc3QgX191OCBwaHlfbWFza1syXVs0XTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgc2FzX2FkZHJbMl1bNF0gPSB7IHsgMHg1RkNGRkZGRjAwMDAwMDAxVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGMDAwMDAwMDFVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkYwMDAwMDAwMVVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRjAwMDAwMDAxVUxMIH0sCisJCQkJCQkgICB7IDB4NUZDRkZGRkYwMDAwMDAwMlVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRjAwMDAwMDAyVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGMDAwMDAwMDJVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkYwMDAwMDAwMlVMTCB9IH07CisjZW5kaWYKKworLyogTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkZXZpY2Ugc3BpbiB1cCAqLworc3RhdGljIGNvbnN0IGludCBtYXhfbnVtX2NvbmN1cnJlbnRfZGV2X3NwaW5fdXAgPSAxOworCisvKiBlbmFibGUgb2Ygc3NjIG9wZXJhdGlvbiAqLworc3RhdGljIGNvbnN0IGludCBlbmFibGVfc3NjOworCisvKiBBRkVfVFhfQU1QX0NPTlRST0wgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWZlX3R4X2FtcF9jb250cm9sMCA9IDB4MDAwYmRkMDg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFmZV90eF9hbXBfY29udHJvbDEgPSAweDAwMGZmYzAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhZmVfdHhfYW1wX2NvbnRyb2wyID0gMHgwMDBiN2MwOTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWZlX3R4X2FtcF9jb250cm9sMyA9IDB4MDAwYWZjNmU7CisKK3N0YXRpYyBjb25zdCBjaGFyIGJsb2JfbmFtZVtdID0gImlzY2lfZmlybXdhcmUuYmluIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNpZ1tdID0gIklTQ1VPRU1CIjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZlcnNpb24gPSAweDEwOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA3MmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jCkBAIC0wLDAgKzEsMjc1MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2FzLmg+CisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInByb2JlX3JvbXMuaCIKKyNpbmNsdWRlICJyZW1vdGVfZGV2aWNlLmgiCisjaW5jbHVkZSAicmVxdWVzdC5oIgorI2luY2x1ZGUgInNjdV9jb21wbGV0aW9uX2NvZGVzLmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAic2N1X3JlbW90ZV9ub2RlX2NvbnRleHQuaCIKKyNpbmNsdWRlICJzY3VfdGFza19jb250ZXh0LmgiCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfUkFNX0lOSVRfU1RBTExfVElNRSAgICAgIDIwMAorCisjZGVmaW5lIHNtdV9tYXhfcG9ydHMoZGNjX3ZhbHVlKSBcCisJKFwKKwkJKCgoZGNjX3ZhbHVlKSAmIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfTFBfTUFTSykgXAorCQkgPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9TSElGVCkgKyAxIFwKKwkpCisKKyNkZWZpbmUgc211X21heF90YXNrX2NvbnRleHRzKGRjY192YWx1ZSkJXAorCShcCisJCSgoKGRjY192YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1RDX01BU0spIFwKKwkJID4+IFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfU0hJRlQpICsgMSBcCisJKQorCisjZGVmaW5lIHNtdV9tYXhfcm5jcyhkY2NfdmFsdWUpIFwKKwkoXAorCQkoKChkY2NfdmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9STkNfTUFTSykgXAorCQkgPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9STkNfU0hJRlQpICsgMSBcCisJKQorCisjZGVmaW5lIFNDSUNfU0RTX0NPTlRST0xMRVJfUEhZX1NUQVJUX1RJTUVPVVQgICAgICAxMDAKKworLyoqCisgKgorICoKKyAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgd2hpbGUgYSBnaXZlbiBwaHkgaXMgY29uc3VtaW5nIHBvd2VyCisgKiBiZWZvcmUgYWxsb3dpbmcgYW5vdGhlciBzZXQgb2YgcGh5cyB0byBjb25zdW1lIHBvd2VyLiBVbHRpbWF0ZWx5LCB0aGlzIHdpbGwKKyAqIGJlIHNwZWNpZmllZCBieSBPRU0gcGFyYW1ldGVyLgorICovCisjZGVmaW5lIFNDSUNfU0RTX0NPTlRST0xMRVJfUE9XRVJfQ09OVFJPTF9JTlRFUlZBTCA1MDAKKworLyoqCisgKiBOT1JNQUxJWkVfUFVUX1BPSU5URVIoKSAtCisgKgorICogVGhpcyBtYWNybyB3aWxsIG5vcm1hbGl6ZSB0aGUgY29tcGxldGlvbiBxdWV1ZSBwdXQgcG9pbnRlciBzbyBpdHMgdmFsdWUgY2FuCisgKiBiZSB1c2VkIGFzIGFuIGFycmF5IGluZGUKKyAqLworI2RlZmluZSBOT1JNQUxJWkVfUFVUX1BPSU5URVIoeCkgXAorCSgoeCkgJiBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfUE9JTlRFUl9NQVNLKQorCisKKy8qKgorICogTk9STUFMSVpFX0VWRU5UX1BPSU5URVIoKSAtCisgKgorICogVGhpcyBtYWNybyB3aWxsIG5vcm1hbGl6ZSB0aGUgY29tcGxldGlvbiBxdWV1ZSBldmVudCBlbnRyeSBzbyBpdHMgdmFsdWUgY2FuCisgKiBiZSB1c2VkIGFzIGFuIGluZGV4LgorICovCisjZGVmaW5lIE5PUk1BTElaRV9FVkVOVF9QT0lOVEVSKHgpIFwKKwkoXAorCQkoKHgpICYgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX1BPSU5URVJfTUFTSykgXAorCQk+PiBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfUE9JTlRFUl9TSElGVAlcCisJKQorCisvKioKKyAqIE5PUk1BTElaRV9HRVRfUE9JTlRFUigpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgbm9ybWFsaXplIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGdldCBwb2ludGVyIHNvIGl0cyB2YWx1ZSBjYW4KKyAqIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byBhbiBhcnJheQorICovCisjZGVmaW5lIE5PUk1BTElaRV9HRVRfUE9JTlRFUih4KSBcCisJKCh4KSAmIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9QT0lOVEVSX01BU0spCisKKy8qKgorICogTk9STUFMSVpFX0dFVF9QT0lOVEVSX0NZQ0xFX0JJVCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgbm9ybWFsaXplIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGN5Y2xlIHBvaW50ZXIgc28gaXQgbWF0Y2hlcworICogdGhlIGNvbXBsZXRpb24gcXVldWUgY3ljbGUgYml0CisgKi8KKyNkZWZpbmUgTk9STUFMSVpFX0dFVF9QT0lOVEVSX0NZQ0xFX0JJVCh4KSBcCisJKChTTVVfQ1FHUl9DWUNMRV9CSVQgJiAoeCkpIDw8ICgzMSAtIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9DWUNMRV9CSVRfU0hJRlQpKQorCisvKioKKyAqIENPTVBMRVRJT05fUVVFVUVfQ1lDTEVfQklUKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gd2lsbCByZXR1cm4gdGhlIGN5Y2xlIGJpdCBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSBlbnRyeQorICovCisjZGVmaW5lIENPTVBMRVRJT05fUVVFVUVfQ1lDTEVfQklUKHgpICgoeCkgJiAweDgwMDAwMDAwKQorCisvKiBJbml0IHRoZSBzdGF0ZSBtYWNoaW5lIGFuZCBjYWxsIHRoZSBzdGF0ZSBlbnRyeSBmdW5jdGlvbiAoaWYgYW55KSAqLwordm9pZCBzY2lfaW5pdF9zbShzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20sCisJCSBjb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgKnN0YXRlX3RhYmxlLCB1MzIgaW5pdGlhbF9zdGF0ZSkKK3sKKwlzY2lfc3RhdGVfdHJhbnNpdGlvbl90IGhhbmRsZXI7CisKKwlzbS0+aW5pdGlhbF9zdGF0ZV9pZCAgICA9IGluaXRpYWxfc3RhdGU7CisJc20tPnByZXZpb3VzX3N0YXRlX2lkICAgPSBpbml0aWFsX3N0YXRlOworCXNtLT5jdXJyZW50X3N0YXRlX2lkICAgID0gaW5pdGlhbF9zdGF0ZTsKKwlzbS0+c3RhdGVfdGFibGUgICAgICAgICA9IHN0YXRlX3RhYmxlOworCisJaGFuZGxlciA9IHNtLT5zdGF0ZV90YWJsZVtpbml0aWFsX3N0YXRlXS5lbnRlcl9zdGF0ZTsKKwlpZiAoaGFuZGxlcikKKwkJaGFuZGxlcihzbSk7Cit9CisKKy8qIENhbGwgdGhlIHN0YXRlIGV4aXQgZm4sIHVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSwgY2FsbCB0aGUgc3RhdGUgZW50cnkgZm4gKi8KK3ZvaWQgc2NpX2NoYW5nZV9zdGF0ZShzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20sIHUzMiBuZXh0X3N0YXRlKQoreworCXNjaV9zdGF0ZV90cmFuc2l0aW9uX3QgaGFuZGxlcjsKKworCWhhbmRsZXIgPSBzbS0+c3RhdGVfdGFibGVbc20tPmN1cnJlbnRfc3RhdGVfaWRdLmV4aXRfc3RhdGU7CisJaWYgKGhhbmRsZXIpCisJCWhhbmRsZXIoc20pOworCisJc20tPnByZXZpb3VzX3N0YXRlX2lkID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJc20tPmN1cnJlbnRfc3RhdGVfaWQgPSBuZXh0X3N0YXRlOworCisJaGFuZGxlciA9IHNtLT5zdGF0ZV90YWJsZVtzbS0+Y3VycmVudF9zdGF0ZV9pZF0uZW50ZXJfc3RhdGU7CisJaWYgKGhhbmRsZXIpCisJCWhhbmRsZXIoc20pOworfQorCitzdGF0aWMgYm9vbCBzY2lfY29udHJvbGxlcl9jb21wbGV0aW9uX3F1ZXVlX2hhc19lbnRyaWVzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBnZXRfdmFsdWUgPSBpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQ7CisJdTMyIGdldF9pbmRleCA9IGdldF92YWx1ZSAmIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9QT0lOVEVSX01BU0s7CisKKwlpZiAoTk9STUFMSVpFX0dFVF9QT0lOVEVSX0NZQ0xFX0JJVChnZXRfdmFsdWUpID09CisJICAgIENPTVBMRVRJT05fUVVFVUVfQ1lDTEVfQklUKGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlW2dldF9pbmRleF0pKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc2NpX2NvbnRyb2xsZXJfaXNyKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCWlmIChzY2lfY29udHJvbGxlcl9jb21wbGV0aW9uX3F1ZXVlX2hhc19lbnRyaWVzKGlob3N0KSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSBoYXZlIGEgc3B1cmlvdXMgaW50ZXJydXB0IGl0IGNvdWxkIGJlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5CisJCSAqIGVtcHRpZWQgdGhlIGNvbXBsZXRpb24gcXVldWUgZnJvbSBhIHByZXZpb3VzIGludGVycnVwdCAqLworCQl3cml0ZWwoU01VX0lTUl9DT01QTEVUSU9OLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCisJCS8qCisJCSAqIFRoZXJlIGlzIGEgcmFjZSBpbiB0aGUgaGFyZHdhcmUgdGhhdCBjb3VsZCBjYXVzZSB1cyBub3QgdG8gYmUgbm90aWZpZWQKKwkJICogb2YgYW4gaW50ZXJydXB0IGNvbXBsZXRpb24gaWYgd2UgZG8gbm90IHRha2UgdGhpcyBzdGVwLiAgV2Ugd2lsbCBtYXNrCisJCSAqIHRoZW4gdW5tYXNrIHRoZSBpbnRlcnJ1cHRzIHNvIGlmIHRoZXJlIGlzIGFub3RoZXIgaW50ZXJydXB0IHBlbmRpbmcKKwkJICogdGhlIGNsZWFyaW5nIG9mIHRoZSBpbnRlcnJ1cHQgc291cmNlIHdlIGdldCB0aGUgbmV4dCBpbnRlcnJ1cHQgbWVzc2FnZS4gKi8KKwkJd3JpdGVsKDB4RkYwMDAwMDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworCQl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitpcnFyZXR1cm5fdCBpc2NpX21zaXhfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBkYXRhOworCisJaWYgKHNjaV9jb250cm9sbGVyX2lzcihpaG9zdCkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmlob3N0LT5jb21wbGV0aW9uX3Rhc2tsZXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgYm9vbCBzY2lfY29udHJvbGxlcl9lcnJvcl9pc3Ioc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGludGVycnVwdF9zdGF0dXM7CisKKwlpbnRlcnJ1cHRfc3RhdHVzID0KKwkJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKwlpbnRlcnJ1cHRfc3RhdHVzICY9IChTTVVfSVNSX1FVRVVFX0VSUk9SIHwgU01VX0lTUl9RVUVVRV9TVVNQRU5EKTsKKworCWlmIChpbnRlcnJ1cHRfc3RhdHVzICE9IDApIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgYW4gZXJyb3IgaW50ZXJydXB0IHBlbmRpbmcgc28gbGV0IGl0IHRocm91Z2ggYW5kIGhhbmRsZQorCQkgKiBpbiB0aGUgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiBUaGVyZSBpcyBhIHJhY2UgaW4gdGhlIGhhcmR3YXJlIHRoYXQgY291bGQgY2F1c2UgdXMgbm90IHRvIGJlIG5vdGlmaWVkCisJICogb2YgYW4gaW50ZXJydXB0IGNvbXBsZXRpb24gaWYgd2UgZG8gbm90IHRha2UgdGhpcyBzdGVwLiAgV2Ugd2lsbCBtYXNrCisJICogdGhlbiB1bm1hc2sgdGhlIGVycm9yIGludGVycnVwdHMgc28gaWYgdGhlcmUgd2FzIGFub3RoZXIgaW50ZXJydXB0CisJICogcGVuZGluZyB3ZSB3aWxsIGJlIG5vdGlmaWVkLgorCSAqIENvdWxkIHdlIHdyaXRlIHRoZSB2YWx1ZSBvZiAoU01VX0lTUl9RVUVVRV9FUlJPUiB8IFNNVV9JU1JfUVVFVUVfU1VTUEVORCk/ICovCisJd3JpdGVsKDB4ZmYsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworCXdyaXRlbCgwLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9tYXNrKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfdGFza19jb21wbGV0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZW50KQoreworCXUzMiBpbmRleCA9IFNDVV9HRVRfQ09NUExFVElPTl9JTkRFWChlbnQpOworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBpaG9zdC0+cmVxc1tpbmRleF07CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSByZWFsbHkgd2FudCB0byBwcm9jZXNzIHRoaXMgSU8gcmVxdWVzdCAqLworCWlmICh0ZXN0X2JpdChJUkVRX0FDVElWRSwgJmlyZXEtPmZsYWdzKSAmJgorCSAgICBpcmVxLT5pb190YWcgIT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcgJiYKKwkgICAgSVNDSV9UQUdfU0VRKGlyZXEtPmlvX3RhZykgPT0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbaW5kZXhdKQorCQkvKiBZZXAgdGhpcyBpcyBhIHZhbGlkIGlvIHJlcXVlc3QgcGFzcyBpdCBhbG9uZyB0byB0aGUKKwkJICogaW8gcmVxdWVzdCBoYW5kbGVyCisJCSAqLworCQlzY2lfaW9fcmVxdWVzdF90Y19jb21wbGV0aW9uKGlyZXEsIGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3NkbWFfY29tcGxldGlvbihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTMyIGVudCkKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCisJaW5kZXggPSBTQ1VfR0VUX0NPTVBMRVRJT05fSU5ERVgoZW50KTsKKworCXN3aXRjaCAoc2N1X2dldF9jb21tYW5kX3JlcXVlc3RfdHlwZShlbnQpKSB7CisJY2FzZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDOgorCWNhc2UgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9UQzoKKwkJaXJlcSA9IGlob3N0LT5yZXFzW2luZGV4XTsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogJXggZm9yIGlvIHJlcXVlc3QgJXBcbiIsCisJCQkgX19mdW5jX18sIGVudCwgaXJlcSk7CisJCS8qIEB0b2RvIEZvciBhIHBvc3QgVEMgb3BlcmF0aW9uIHdlIG5lZWQgdG8gZmFpbCB0aGUgSU8KKwkJICogcmVxdWVzdAorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1JOQzoKKwljYXNlIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQzoKKwljYXNlIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DOgorCQlpZGV2ID0gaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF07CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6ICV4IGZvciBkZXZpY2UgJXBcbiIsCisJCQkgX19mdW5jX18sIGVudCwgaWRldik7CisJCS8qIEB0b2RvIEZvciBhIHBvcnQgUk5DIG9wZXJhdGlvbiB3ZSBuZWVkIHRvIGZhaWwgdGhlCisJCSAqIGRldmljZQorCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogdW5rbm93biBjb21wbGV0aW9uIHR5cGUgJXhcbiIsCisJCQkgX19mdW5jX18sIGVudCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfdW5zb2xpY2l0ZWRfZnJhbWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUzMiBlbnQpCit7CisJdTMyIGluZGV4OworCXUzMiBmcmFtZV9pbmRleDsKKworCXN0cnVjdCBzY3VfdW5zb2xpY2l0ZWRfZnJhbWVfaGVhZGVyICpmcmFtZV9oZWFkZXI7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5OworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisKKwllbnVtIHNjaV9zdGF0dXMgcmVzdWx0ID0gU0NJX0ZBSUxVUkU7CisKKwlmcmFtZV9pbmRleCA9IFNDVV9HRVRfRlJBTUVfSU5ERVgoZW50KTsKKworCWZyYW1lX2hlYWRlciA9IGlob3N0LT51Zl9jb250cm9sLmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLmhlYWRlcjsKKwlpaG9zdC0+dWZfY29udHJvbC5idWZmZXJzLmFycmF5W2ZyYW1lX2luZGV4XS5zdGF0ZSA9IFVOU09MSUNJVEVEX0ZSQU1FX0lOX1VTRTsKKworCWlmIChTQ1VfR0VUX0ZSQU1FX0VSUk9SKGVudCkpIHsKKwkJLyoKKwkJICogLyBAdG9kbyBJZiB0aGUgSUFGIGZyYW1lIG9yIFNJR05BVFVSRSBGSVMgZnJhbWUgaGFzIGFuIGVycm9yIHdpbGwKKwkJICogLyAgICAgICB0aGlzIGNhdXNlIGEgcHJvYmxlbT8gV2UgZXhwZWN0IHRoZSBwaHkgaW5pdGlhbGl6YXRpb24gd2lsbAorCQkgKiAvICAgICAgIGZhaWwgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGZyYW1lLiAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZnJhbWVfaGVhZGVyLT5pc19hZGRyZXNzX2ZyYW1lKSB7CisJCWluZGV4ID0gU0NVX0dFVF9QUk9UT0NPTF9FTkdJTkVfSU5ERVgoZW50KTsKKwkJaXBoeSA9ICZpaG9zdC0+cGh5c1tpbmRleF07CisJCXJlc3VsdCA9IHNjaV9waHlfZnJhbWVfaGFuZGxlcihpcGh5LCBmcmFtZV9pbmRleCk7CisJfSBlbHNlIHsKKworCQlpbmRleCA9IFNDVV9HRVRfQ09NUExFVElPTl9JTkRFWChlbnQpOworCisJCWlmIChpbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgc2lnbmF0dXJlIGZpcyBvciBhIGZyYW1lIGZyb20gYSBkaXJlY3QgYXR0YWNoZWQgU0FUQQorCQkJICogZGV2aWNlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLiAgSW4gZWl0aGVyIGNhc2UgZm9yd2FyZWQKKwkJCSAqIHRoZSBmcmFtZSB0byB0aGUgUEUgYW5kIGxldCBpdCB0YWtlIGNhcmUgb2YgdGhlIGZyYW1lIGRhdGEuICovCisJCQlpbmRleCA9IFNDVV9HRVRfUFJPVE9DT0xfRU5HSU5FX0lOREVYKGVudCk7CisJCQlpcGh5ID0gJmlob3N0LT5waHlzW2luZGV4XTsKKwkJCXJlc3VsdCA9IHNjaV9waHlfZnJhbWVfaGFuZGxlcihpcGh5LCBmcmFtZV9pbmRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5kZXggPCBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllcykKKwkJCQlpZGV2ID0gaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF07CisJCQllbHNlCisJCQkJaWRldiA9IE5VTEw7CisKKwkJCWlmIChpZGV2ICE9IE5VTEwpCisJCQkJcmVzdWx0ID0gc2NpX3JlbW90ZV9kZXZpY2VfZnJhbWVfaGFuZGxlcihpZGV2LCBmcmFtZV9pbmRleCk7CisJCQllbHNlCisJCQkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQl9CisJfQorCisJaWYgKHJlc3VsdCAhPSBTQ0lfU1VDQ0VTUykgeworCQkvKgorCQkgKiAvIEB0b2RvIElzIHRoZXJlIGFueSByZWFzb24gdG8gcmVwb3J0IHNvbWUgYWRkaXRpb25hbCBlcnJvciBtZXNzYWdlCisJCSAqIC8gICAgICAgd2hlbiB3ZSBnZXQgdGhpcyBmYWlsdXJlIG5vdGlmaWN0aW9uPyAqLworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfZXZlbnRfY29tcGxldGlvbihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTMyIGVudCkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5OworCXUzMiBpbmRleDsKKworCWluZGV4ID0gU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGVudCk7CisKKwlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfdHlwZShlbnQpKSB7CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9TTVVfQ09NTUFORF9FUlJPUjoKKwkJLyogLyBAdG9kbyBUaGUgZHJpdmVyIGRpZCBzb21ldGhpbmcgd3JvbmcgYW5kIHdlIG5lZWQgdG8gZml4IHRoZSBjb25kdGlvbi4gKi8KKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBDb250cm9sbGVyIDB4JXAgcmVjZWl2ZWQgU01VIGNvbW1hbmQgZXJyb3IgIgorCQkJIjB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlob3N0LAorCQkJZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1NNVV9QQ1FfRVJST1I6CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1I6CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9GQVRBTF9NRU1PUllfRVJST1I6CisJCS8qCisJCSAqIC8gQHRvZG8gVGhpcyBpcyBhIGhhcmR3YXJlIGZhaWx1cmUgYW5kIGl0cyBsaWtlbHkgdGhhdCB3ZSB3YW50IHRvCisJCSAqIC8gICAgICAgcmVzZXQgdGhlIGNvbnRyb2xsZXIuICovCisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IFNDSUMgQ29udHJvbGxlciAweCVwIHJlY2VpdmVkIGZhdGFsIGNvbnRyb2xsZXIgIgorCQkJImV2ZW50ICAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlpaG9zdCwKKwkJCWVudCk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9UUkFOU1BPUlRfRVJST1I6CisJCWlyZXEgPSBpaG9zdC0+cmVxc1tpbmRleF07CisJCXNjaV9pb19yZXF1ZXN0X2V2ZW50X2hhbmRsZXIoaXJlcSwgZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1BUWF9TQ0hFRFVMRV9FVkVOVDoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihlbnQpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NQRUNJRklDX1NNUF9SRVNQT05TRV9OT19QRToKKwkJY2FzZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfVEFTS19USU1FT1VUOgorCQkJaXJlcSA9IGlob3N0LT5yZXFzW2luZGV4XTsKKwkJCWlmIChpcmVxICE9IE5VTEwpCisJCQkJc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihpcmVxLCBlbnQpOworCQkJZWxzZQorCQkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkgIiVzOiBTQ0lDIENvbnRyb2xsZXIgMHglcCByZWNlaXZlZCAiCisJCQkJCSAiZXZlbnQgMHgleCBmb3IgaW8gcmVxdWVzdCBvYmplY3QgIgorCQkJCQkgInRoYXQgZG9lc250IGV4aXN0LlxuIiwKKwkJCQkJIF9fZnVuY19fLAorCQkJCQkgaWhvc3QsCisJCQkJCSBlbnQpOworCisJCQlicmVhazsKKworCQljYXNlIFNDVV9FVkVOVF9TUEVDSUZJQ19JVF9ORVhVU19USU1FT1VUOgorCQkJaWRldiA9IGlob3N0LT5kZXZpY2VfdGFibGVbaW5kZXhdOworCQkJaWYgKGlkZXYgIT0gTlVMTCkKKwkJCQlzY2lfcmVtb3RlX2RldmljZV9ldmVudF9oYW5kbGVyKGlkZXYsIGVudCk7CisJCQllbHNlCisJCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciAweCVwIHJlY2VpdmVkICIKKwkJCQkJICJldmVudCAweCV4IGZvciByZW1vdGUgZGV2aWNlIG9iamVjdCAiCisJCQkJCSAidGhhdCBkb2VzbnQgZXhpc3QuXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBpaG9zdCwKKwkJCQkJIGVudCk7CisKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFOgorCS8qCisJICogZGlyZWN0IHRoZSBicm9hZGNhc3QgY2hhbmdlIGV2ZW50IHRvIHRoZSBwaHkgZmlyc3QgYW5kIHRoZW4gbGV0CisJICogdGhlIHBoeSByZWRpcmVjdCB0aGUgYnJvYWRjYXN0IGNoYW5nZSB0byB0aGUgcG9ydCBvYmplY3QgKi8KKwljYXNlIFNDVV9FVkVOVF9UWVBFX0VSUl9DTlRfRVZFTlQ6CisJLyoKKwkgKiBkaXJlY3QgZXJyb3IgY291bnRlciBldmVudCB0byB0aGUgcGh5IG9iamVjdCBzaW5jZSB0aGF0IGlzIHdoZXJlCisJICogd2UgZ2V0IHRoZSBldmVudCBub3RpZmljYXRpb24uICBUaGlzIGlzIGEgdHlwZSA0IGV2ZW50LiAqLworCWNhc2UgU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVDoKKwkJaW5kZXggPSBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWChlbnQpOworCQlpcGh5ID0gJmlob3N0LT5waHlzW2luZGV4XTsKKwkJc2NpX3BoeV9ldmVudF9oYW5kbGVyKGlwaHksIGVudCk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWDoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYOgorCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDOgorCQlpZiAoaW5kZXggPCBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllcykgeworCQkJaWRldiA9IGlob3N0LT5kZXZpY2VfdGFibGVbaW5kZXhdOworCisJCQlpZiAoaWRldiAhPSBOVUxMKQorCQkJCXNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoaWRldiwgZW50KTsKKwkJfSBlbHNlCisJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJQyBDb250cm9sbGVyIDB4JXAgcmVjZWl2ZWQgZXZlbnQgMHgleCAiCisJCQkJImZvciByZW1vdGUgZGV2aWNlIG9iamVjdCAweCUweCB0aGF0IGRvZXNudCAiCisJCQkJImV4aXN0LlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlpaG9zdCwKKwkJCQllbnQsCisJCQkJaW5kZXgpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBTQ0lDIENvbnRyb2xsZXIgcmVjZWl2ZWQgdW5rbm93biBldmVudCBjb2RlICV4XG4iLAorCQkJIF9fZnVuY19fLAorCQkJIGVudCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcHJvY2Vzc19jb21wbGV0aW9ucyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgY29tcGxldGlvbl9jb3VudCA9IDA7CisJdTMyIGVudDsKKwl1MzIgZ2V0X2luZGV4OworCXUzMiBnZXRfY3ljbGU7CisJdTMyIGV2ZW50X2dldDsKKwl1MzIgZXZlbnRfY3ljbGU7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGNvbXBsZXRpb24gcXVldWUgYmVnaW5pbmcgZ2V0OjB4JTA4eFxuIiwKKwkJX19mdW5jX18sCisJCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisKKwkvKiBHZXQgdGhlIGNvbXBvbmVudCBwYXJ0cyBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSAqLworCWdldF9pbmRleCA9IE5PUk1BTElaRV9HRVRfUE9JTlRFUihpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQpOworCWdldF9jeWNsZSA9IFNNVV9DUUdSX0NZQ0xFX0JJVCAmIGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldDsKKworCWV2ZW50X2dldCA9IE5PUk1BTElaRV9FVkVOVF9QT0lOVEVSKGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisJZXZlbnRfY3ljbGUgPSBTTVVfQ1FHUl9FVkVOVF9DWUNMRV9CSVQgJiBpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQ7CisKKwl3aGlsZSAoCisJCU5PUk1BTElaRV9HRVRfUE9JTlRFUl9DWUNMRV9CSVQoZ2V0X2N5Y2xlKQorCQk9PSBDT01QTEVUSU9OX1FVRVVFX0NZQ0xFX0JJVChpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZVtnZXRfaW5kZXhdKQorCQkpIHsKKwkJY29tcGxldGlvbl9jb3VudCsrOworCisJCWVudCA9IGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlW2dldF9pbmRleF07CisKKwkJLyogaW5jcmVtZW50IHRoZSBnZXQgcG9pbnRlciBhbmQgY2hlY2sgZm9yIHJvbGxvdmVyIHRvIHRvZ2dsZSB0aGUgY3ljbGUgYml0ICovCisJCWdldF9jeWNsZSBePSAoKGdldF9pbmRleCsxKSAmIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTKSA8PAorCQkJICAgICAoU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0NZQ0xFX0JJVF9TSElGVCAtIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9TSElGVCk7CisJCWdldF9pbmRleCA9IChnZXRfaW5kZXgrMSkgJiAoU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMtMSk7CisKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogY29tcGxldGlvbiBxdWV1ZSBlbnRyeToweCUwOHhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWVudCk7CisKKwkJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVFlQRShlbnQpKSB7CisJCWNhc2UgU0NVX0NPTVBMRVRJT05fVFlQRV9UQVNLOgorCQkJc2NpX2NvbnRyb2xsZXJfdGFza19jb21wbGV0aW9uKGlob3N0LCBlbnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1VfQ09NUExFVElPTl9UWVBFX1NETUE6CisJCQlzY2lfY29udHJvbGxlcl9zZG1hX2NvbXBsZXRpb24oaWhvc3QsIGVudCk7CisJCQlicmVhazsKKworCQljYXNlIFNDVV9DT01QTEVUSU9OX1RZUEVfVUZJOgorCQkJc2NpX2NvbnRyb2xsZXJfdW5zb2xpY2l0ZWRfZnJhbWUoaWhvc3QsIGVudCk7CisJCQlicmVhazsKKworCQljYXNlIFNDVV9DT01QTEVUSU9OX1RZUEVfRVZFTlQ6CisJCWNhc2UgU0NVX0NPTVBMRVRJT05fVFlQRV9OT1RJRlk6IHsKKwkJCWV2ZW50X2N5Y2xlIF49ICgoZXZlbnRfZ2V0KzEpICYgU0NVX01BWF9FVkVOVFMpIDw8CisJCQkJICAgICAgIChTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfQ1lDTEVfQklUX1NISUZUIC0gU0NVX01BWF9FVkVOVFNfU0hJRlQpOworCQkJZXZlbnRfZ2V0ID0gKGV2ZW50X2dldCsxKSAmIChTQ1VfTUFYX0VWRU5UUy0xKTsKKworCQkJc2NpX2NvbnRyb2xsZXJfZXZlbnRfY29tcGxldGlvbihpaG9zdCwgZW50KTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBTQ0lDIENvbnRyb2xsZXIgcmVjZWl2ZWQgdW5rbm93biAiCisJCQkJICJjb21wbGV0aW9uIHR5cGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBlbnQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgdGhlIGdldCByZWdpc3RlciBpZiB3ZSBjb21wbGV0ZWQgb25lIG9yIG1vcmUgZW50cmllcyAqLworCWlmIChjb21wbGV0aW9uX2NvdW50ID4gMCkgeworCQlpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQgPQorCQkJU01VX0NRR1JfR0VOX0JJVChFTkFCTEUpIHwKKwkJCVNNVV9DUUdSX0dFTl9CSVQoRVZFTlRfRU5BQkxFKSB8CisJCQlldmVudF9jeWNsZSB8CisJCQlTTVVfQ1FHUl9HRU5fVkFMKEVWRU5UX1BPSU5URVIsIGV2ZW50X2dldCkgfAorCQkJZ2V0X2N5Y2xlIHwKKwkJCVNNVV9DUUdSX0dFTl9WQUwoUE9JTlRFUiwgZ2V0X2luZGV4KTsKKworCQl3cml0ZWwoaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0LAorCQkgICAgICAgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisKKwl9CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGNvbXBsZXRpb24gcXVldWUgZW5kaW5nIGdldDoweCUwOHhcbiIsCisJCV9fZnVuY19fLAorCQlpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQpOworCit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2Vycm9yX2hhbmRsZXIoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGludGVycnVwdF9zdGF0dXM7CisKKwlpbnRlcnJ1cHRfc3RhdHVzID0KKwkJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKworCWlmICgoaW50ZXJydXB0X3N0YXR1cyAmIFNNVV9JU1JfUVVFVUVfU1VTUEVORCkgJiYKKwkgICAgc2NpX2NvbnRyb2xsZXJfY29tcGxldGlvbl9xdWV1ZV9oYXNfZW50cmllcyhpaG9zdCkpIHsKKworCQlzY2lfY29udHJvbGxlcl9wcm9jZXNzX2NvbXBsZXRpb25zKGlob3N0KTsKKwkJd3JpdGVsKFNNVV9JU1JfUVVFVUVfU1VTUEVORCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IHN0YXR1czogJSN4XG4iLCBfX2Z1bmNfXywKKwkJCWludGVycnVwdF9zdGF0dXMpOworCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19GQUlMRUQpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB3ZSBkb250IHByb2Nlc3MgYW55IGNvbXBsZXRpb25zIEkgYW0gbm90IHN1cmUgdGhhdCB3ZSB3YW50IHRvIGRvIHRoaXMuCisJICogV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBoYXJkd2FyZSBmYXVsdCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHJlc2V0LgorCSAqLworCXdyaXRlbCgwLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9tYXNrKTsKK30KKworaXJxcmV0dXJuX3QgaXNjaV9pbnR4X2lzcihpbnQgdmVjLCB2b2lkICpkYXRhKQoreworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGF0YTsKKworCWlmIChzY2lfY29udHJvbGxlcl9pc3IoaWhvc3QpKSB7CisJCXdyaXRlbChTTVVfSVNSX0NPTVBMRVRJT04sICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X3N0YXR1cyk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmlob3N0LT5jb21wbGV0aW9uX3Rhc2tsZXQpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKHNjaV9jb250cm9sbGVyX2Vycm9yX2lzcihpaG9zdCkpIHsKKwkJc3Bpbl9sb2NrKCZpaG9zdC0+c2NpY19sb2NrKTsKKwkJc2NpX2NvbnRyb2xsZXJfZXJyb3JfaGFuZGxlcihpaG9zdCk7CisJCXNwaW5fdW5sb2NrKCZpaG9zdC0+c2NpY19sb2NrKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaXJxcmV0dXJuX3QgaXNjaV9lcnJvcl9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRhdGE7CisKKwlpZiAoc2NpX2NvbnRyb2xsZXJfZXJyb3JfaXNyKGlob3N0KSkKKwkJc2NpX2NvbnRyb2xsZXJfZXJyb3JfaGFuZGxlcihpaG9zdCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogaXNjaV9ob3N0X3N0YXJ0X2NvbXBsZXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgY29yZSBsaWJyYXJ5LAorICogICAgdGhyb3VnaCB0aGUgSVNDSSBNb2R1bGUsIHRvIGluZGljYXRlIGNvbnRyb2xsZXIgc3RhcnQgc3RhdHVzLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisgKiBAY29tcGxldGlvbl9zdGF0dXM6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY29tcGxldGlvbiBzdGF0dXMgZnJvbSB0aGUKKyAqICAgIGNvcmUgbGlicmFyeS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfaG9zdF9zdGFydF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgZW51bSBzY2lfc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKQoreworCWlmIChjb21wbGV0aW9uX3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJZGV2X2luZm8oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiY29udHJvbGxlciBzdGFydCB0aW1lZCBvdXQsIGNvbnRpbnVpbmcuLi5cbiIpOworCWlzY2lfaG9zdF9jaGFuZ2Vfc3RhdGUoaWhvc3QsIGlzY2lfcmVhZHkpOworCWNsZWFyX2JpdChJSE9TVF9TVEFSVF9QRU5ESU5HLCAmaWhvc3QtPmZsYWdzKTsKKwl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKK30KKworaW50IGlzY2lfaG9zdF9zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpLT5sbGRkX2hhOworCisJaWYgKHRlc3RfYml0KElIT1NUX1NUQVJUX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpKQorCQlyZXR1cm4gMDsKKworCS8qIHRvZG86IHVzZSBzYXNfZmx1c2hfZGlzY292ZXJ5IG9uY2UgaXQgaXMgdXBzdHJlYW0gKi8KKwlzY3NpX2ZsdXNoX3dvcmsoc2hvc3QpOworCisJc2NzaV9mbHVzaF93b3JrKHNob3N0KTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaWhvc3QtPnN0YXR1cyA9ICVkLCB0aW1lID0gJWxkXG4iLAorCQkgX19mdW5jX18sIGlzY2lfaG9zdF9nZXRfc3RhdGUoaWhvc3QpLCB0aW1lKTsKKworCXJldHVybiAxOworCit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfZ2V0X3N1Z2dlc3RlZF9zdGFydF90aW1lb3V0KCkgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZQorICogICAgc3VnZ2VzdGVkIHNjaV9jb250cm9sbGVyX3N0YXJ0KCkgdGltZW91dCBhbW91bnQuICBUaGUgdXNlciBpcyBmcmVlIHRvCisgKiAgICB1c2UgYW55IHRpbWVvdXQgdmFsdWUsIGJ1dCB0aGlzIG1ldGhvZCBwcm92aWRlcyB0aGUgc3VnZ2VzdGVkIG1pbmltdW0KKyAqICAgIHN0YXJ0IHRpbWVvdXQgdmFsdWUuICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYmFzZWQgdXBvbiBlbXBpcmljYWwKKyAqICAgIGluZm9ybWF0aW9uIGRldGVybWluZWQgYXMgYSByZXN1bHQgb2YgaW50ZXJvcGVyYWJpbGl0eSB0ZXN0aW5nLgorICogQGNvbnRyb2xsZXI6IHRoZSBoYW5kbGUgdG8gdGhlIGNvbnRyb2xsZXIgb2JqZWN0IGZvciB3aGljaCB0byByZXR1cm4gdGhlCisgKiAgICBzdWdnZXN0ZWQgc3RhcnQgdGltZW91dC4KKyAqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciB0aGUgc3VnZ2VzdGVkIHN0YXJ0CisgKiBvcGVyYXRpb24gdGltZW91dC4KKyAqLworc3RhdGljIHUzMiBzY2lfY29udHJvbGxlcl9nZXRfc3VnZ2VzdGVkX3N0YXJ0X3RpbWVvdXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJLyogVmFsaWRhdGUgdGhlIHVzZXIgc3VwcGxpZWQgcGFyYW1ldGVycy4gKi8KKwlpZiAoIWlob3N0KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlIHN1Z2dlc3RlZCBtaW5pbXVtIHRpbWVvdXQgdmFsdWUgZm9yIGEgY29udHJvbGxlciBzdGFydCBvcGVyYXRpb246CisJICoKKwkgKiAgICAgU2lnbmF0dXJlIEZJUyBUaW1lb3V0CisJICogICArIFBoeSBTdGFydCBUaW1lb3V0CisJICogICArIE51bWJlciBvZiBQaHkgU3BpbiBVcCBJbnRlcnZhbHMKKwkgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICAgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbnRyb2xsZXIgc3RhcnQgb3BlcmF0aW9uLgorCSAqCisJICogTk9URTogVGhlIG51bWJlciBvZiBwaHkgc3BpbiB1cCBpbnRlcnZhbHMgd2lsbCBiZSBlcXVpdmFsZW50CisJICogICAgICAgdG8gdGhlIG51bWJlciBvZiBwaHlzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBwaHlzIGFsbG93ZWQKKwkgKiAgICAgICBwZXIgaW50ZXJ2YWwgLSAxIChvbmNlIE9FTSBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQpLgorCSAqICAgICAgIEN1cnJlbnRseSB3ZSBhc3N1bWUgb25seSAxIHBoeSBwZXIgaW50ZXJ2YWwuICovCisKKwlyZXR1cm4gU0NJQ19TRFNfU0lHTkFUVVJFX0ZJU19USU1FT1VUCisJCSsgU0NJQ19TRFNfQ09OVFJPTExFUl9QSFlfU1RBUlRfVElNRU9VVAorCQkrICgoU0NJX01BWF9QSFlTIC0gMSkgKiBTQ0lDX1NEU19DT05UUk9MTEVSX1BPV0VSX0NPTlRST0xfSU5URVJWQUwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlCVUdfT04oaWhvc3QtPnNtdV9yZWdpc3RlcnMgPT0gTlVMTCk7CisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworfQorCit2b2lkIHNjaV9jb250cm9sbGVyX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlCVUdfT04oaWhvc3QtPnNtdV9yZWdpc3RlcnMgPT0gTlVMTCk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9lbmFibGVfcG9ydF90YXNrX3NjaGVkdWxlcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgcG9ydF90YXNrX3NjaGVkdWxlcl92YWx1ZTsKKworCXBvcnRfdGFza19zY2hlZHVsZXJfdmFsdWUgPQorCQlyZWFkbCgmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucHRzZy5jb250cm9sKTsKKwlwb3J0X3Rhc2tfc2NoZWR1bGVyX3ZhbHVlIHw9CisJCShTQ1VfUFRTR0NSX0dFTl9CSVQoRVRNX0VOQUJMRSkgfAorCQkgU0NVX1BUU0dDUl9HRU5fQklUKFBUU0dfRU5BQkxFKSk7CisJd3JpdGVsKHBvcnRfdGFza19zY2hlZHVsZXJfdmFsdWUsCisJICAgICAgICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5wdHNnLmNvbnRyb2wpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9hc3NpZ25fdGFza19lbnRyaWVzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiB0YXNrX2Fzc2lnbm1lbnQ7CisKKwkvKgorCSAqIEFzc2lnbiBhbGwgdGhlIFRDcyB0byBmdW5jdGlvbiAwCisJICogVE9ETzogRG8gd2UgYWN0dWFsbHkgbmVlZCB0byByZWFkIHRoaXMgcmVnaXN0ZXIgdG8gd3JpdGUgaXQgYmFjaz8KKwkgKi8KKworCXRhc2tfYXNzaWdubWVudCA9CisJCXJlYWRsKCZpaG9zdC0+c211X3JlZ2lzdGVycy0+dGFza19jb250ZXh0X2Fzc2lnbm1lbnRbMF0pOworCisJdGFza19hc3NpZ25tZW50IHw9IChTTVVfVENBX0dFTl9WQUwoU1RBUlRJTkcsIDApKSB8CisJCShTTVVfVENBX0dFTl9WQUwoRU5ESU5HLCAgaWhvc3QtPnRhc2tfY29udGV4dF9lbnRyaWVzIC0gMSkpIHwKKwkJKFNNVV9UQ0FfR0VOX0JJVChSQU5HRV9DSEVDS19FTkFCTEUpKTsKKworCXdyaXRlbCh0YXNrX2Fzc2lnbm1lbnQsCisJCSZpaG9zdC0+c211X3JlZ2lzdGVycy0+dGFza19jb250ZXh0X2Fzc2lnbm1lbnRbMF0pOworCit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfY29tcGxldGlvbl9xdWV1ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisJdTMyIGNvbXBsZXRpb25fcXVldWVfY29udHJvbF92YWx1ZTsKKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9nZXRfdmFsdWU7CisJdTMyIGNvbXBsZXRpb25fcXVldWVfcHV0X3ZhbHVlOworCisJaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0ID0gMDsKKworCWNvbXBsZXRpb25fcXVldWVfY29udHJvbF92YWx1ZSA9CisJCShTTVVfQ1FDX1FVRVVFX0xJTUlUX1NFVChTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUyAtIDEpIHwKKwkJIFNNVV9DUUNfRVZFTlRfTElNSVRfU0VUKFNDVV9NQVhfRVZFTlRTIC0gMSkpOworCisJd3JpdGVsKGNvbXBsZXRpb25fcXVldWVfY29udHJvbF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX2NvbnRyb2wpOworCisKKwkvKiBTZXQgdGhlIGNvbXBsZXRpb24gcXVldWUgZ2V0IHBvaW50ZXIgYW5kIGVuYWJsZSB0aGUgcXVldWUgKi8KKwljb21wbGV0aW9uX3F1ZXVlX2dldF92YWx1ZSA9ICgKKwkJKFNNVV9DUUdSX0dFTl9WQUwoUE9JTlRFUiwgMCkpCisJCXwgKFNNVV9DUUdSX0dFTl9WQUwoRVZFTlRfUE9JTlRFUiwgMCkpCisJCXwgKFNNVV9DUUdSX0dFTl9CSVQoRU5BQkxFKSkKKwkJfCAoU01VX0NRR1JfR0VOX0JJVChFVkVOVF9FTkFCTEUpKQorCQkpOworCisJd3JpdGVsKGNvbXBsZXRpb25fcXVldWVfZ2V0X3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKworCS8qIFNldCB0aGUgY29tcGxldGlvbiBxdWV1ZSBwdXQgcG9pbnRlciAqLworCWNvbXBsZXRpb25fcXVldWVfcHV0X3ZhbHVlID0gKAorCQkoU01VX0NRUFJfR0VOX1ZBTChQT0lOVEVSLCAwKSkKKwkJfCAoU01VX0NRUFJfR0VOX1ZBTChFVkVOVF9QT0lOVEVSLCAwKSkKKwkJKTsKKworCXdyaXRlbChjb21wbGV0aW9uX3F1ZXVlX3B1dF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX3B1dCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjeWNsZSBiaXQgb2YgdGhlIGNvbXBsZXRpb24gcXVldWUgZW50cmllcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTOyBpbmRleCsrKSB7CisJCS8qCisJCSAqIElmIGdldC5jeWNsZV9iaXQgIT0gY29tcGxldGlvbl9xdWV1ZS5jeWNsZV9iaXQKKwkJICogaXRzIG5vdCBhIHZhbGlkIGNvbXBsZXRpb24gcXVldWUgZW50cnkKKwkJICogc28gYXQgc3lzdGVtIHN0YXJ0IGFsbCBlbnRyaWVzIGFyZSBpbnZhbGlkICovCisJCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlW2luZGV4XSA9IDB4ODAwMDAwMDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9pbml0aWFsaXplX3Vuc29saWNpdGVkX2ZyYW1lX3F1ZXVlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBmcmFtZV9xdWV1ZV9jb250cm9sX3ZhbHVlOworCXUzMiBmcmFtZV9xdWV1ZV9nZXRfdmFsdWU7CisJdTMyIGZyYW1lX3F1ZXVlX3B1dF92YWx1ZTsKKworCS8qIFdyaXRlIHRoZSBxdWV1ZSBzaXplICovCisJZnJhbWVfcXVldWVfY29udHJvbF92YWx1ZSA9CisJCVNDVV9VRlFDX0dFTl9WQUwoUVVFVUVfU0laRSwgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMpOworCisJd3JpdGVsKGZyYW1lX3F1ZXVlX2NvbnRyb2xfdmFsdWUsCisJICAgICAgICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51bnNvbGljaXRlZF9mcmFtZV9xdWV1ZV9jb250cm9sKTsKKworCS8qIFNldHVwIHRoZSBnZXQgcG9pbnRlciBmb3IgdGhlIHVuc29saWNpdGVkIGZyYW1lIHF1ZXVlICovCisJZnJhbWVfcXVldWVfZ2V0X3ZhbHVlID0gKAorCQlTQ1VfVUZRR1BfR0VOX1ZBTChQT0lOVEVSLCAwKQorCQl8ICBTQ1VfVUZRR1BfR0VOX0JJVChFTkFCTEVfQklUKQorCQkpOworCisJd3JpdGVsKGZyYW1lX3F1ZXVlX2dldF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX2dldF9wb2ludGVyKTsKKwkvKiBTZXR1cCB0aGUgcHV0IHBvaW50ZXIgZm9yIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBxdWV1ZSAqLworCWZyYW1lX3F1ZXVlX3B1dF92YWx1ZSA9IFNDVV9VRlFQUF9HRU5fVkFMKFBPSU5URVIsIDApOworCXdyaXRlbChmcmFtZV9xdWV1ZV9wdXRfdmFsdWUsCisJICAgICAgICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51bnNvbGljaXRlZF9mcmFtZV9wdXRfcG9pbnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3RyYW5zaXRpb25fdG9fcmVhZHkoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGVudW0gc2NpX3N0YXR1cyBzdGF0dXMpCit7CisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkID09IFNDSUNfU1RBUlRJTkcpIHsKKwkJLyoKKwkJICogV2UgbW92ZSBpbnRvIHRoZSByZWFkeSBzdGF0ZSwgYmVjYXVzZSBzb21lIG9mIHRoZSBwaHlzL3BvcnRzCisJCSAqIG1heSBiZSB1cCBhbmQgb3BlcmF0aW9uYWwuCisJCSAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfUkVBRFkpOworCisJCWlzY2lfaG9zdF9zdGFydF9jb21wbGV0ZShpaG9zdCwgc3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGlzX3BoeV9zdGFydGluZyhzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBoeS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NUQVJUSU5HOgorCWNhc2UgU0NJX1BIWV9TVUJfSU5JVElBTDoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19TUEVFRF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVI6CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU46CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGOgorCWNhc2UgU0NJX1BIWV9TVUJfRklOQUw6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfc3RhcnRfbmV4dF9waHkgLSBzdGFydCBwaHkKKyAqIEBzY2ljOiBjb250cm9sbGVyCisgKgorICogSWYgYWxsIHRoZSBwaHlzIGhhdmUgYmVlbiBzdGFydGVkLCB0aGVuIGF0dGVtcHQgdG8gdHJhbnNpdGlvbiB0aGUKKyAqIGNvbnRyb2xsZXIgdG8gdGhlIFJFQURZIHN0YXRlIGFuZCBpbmZvcm0gdGhlIHVzZXIKKyAqIChzY2lfY2JfY29udHJvbGxlcl9zdGFydF9jb21wbGV0ZSgpKS4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSA9ICZpaG9zdC0+b2VtX3BhcmFtZXRlcnM7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCWlmIChpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnQgPj0gU0NJX01BWF9QSFlTKSB7CisJCWJvb2wgaXNfY29udHJvbGxlcl9zdGFydF9jb21wbGV0ZSA9IHRydWU7CisJCXUzMiBzdGF0ZTsKKwkJdTggaW5kZXg7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCQlpcGh5ID0gJmlob3N0LT5waHlzW2luZGV4XTsKKwkJCXN0YXRlID0gaXBoeS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCQkJaWYgKCFwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUaGUgY29udHJvbGxlciBzdGFydCBvcGVyYXRpb24gaXMgY29tcGxldGUgaWZmOgorCQkJICogLSBhbGwgbGlua3MgaGF2ZSBiZWVuIGdpdmVuIGFuIG9wcG9ydHVuaXR5IHRvIHN0YXJ0CisJCQkgKiAtIGhhdmUgbm8gaW5kaWNhdGlvbiBvZiBhIGNvbm5lY3RlZCBkZXZpY2UKKwkJCSAqIC0gaGF2ZSBhbiBpbmRpY2F0aW9uIG9mIGEgY29ubmVjdGVkIGRldmljZSBhbmQgaXQgaGFzCisJCQkgKiAgIGZpbmlzaGVkIHRoZSBsaW5rIHRyYWluaW5nIHByb2Nlc3MuCisJCQkgKi8KKwkJCWlmICgoaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9PSBmYWxzZSAmJiBzdGF0ZSA9PSBTQ0lfUEhZX0lOSVRJQUwpIHx8CisJCQkgICAgKGlwaHktPmlzX2luX2xpbmtfdHJhaW5pbmcgPT0gZmFsc2UgJiYgc3RhdGUgPT0gU0NJX1BIWV9TVE9QUEVEKSB8fAorCQkJICAgIChpcGh5LT5pc19pbl9saW5rX3RyYWluaW5nID09IHRydWUgJiYgaXNfcGh5X3N0YXJ0aW5nKGlwaHkpKSkgeworCQkJCWlzX2NvbnRyb2xsZXJfc3RhcnRfY29tcGxldGUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFRoZSBjb250cm9sbGVyIGhhcyBzdWNjZXNzZnVsbHkgZmluaXNoZWQgdGhlIHN0YXJ0IHByb2Nlc3MuCisJCSAqIEluZm9ybSB0aGUgU0NJIENvcmUgdXNlciBhbmQgdHJhbnNpdGlvbiB0byB0aGUgUkVBRFkgc3RhdGUuICovCisJCWlmIChpc19jb250cm9sbGVyX3N0YXJ0X2NvbXBsZXRlID09IHRydWUpIHsKKwkJCXNjaV9jb250cm9sbGVyX3RyYW5zaXRpb25fdG9fcmVhZHkoaWhvc3QsIFNDSV9TVUNDRVNTKTsKKwkJCXNjaV9kZWxfdGltZXIoJmlob3N0LT5waHlfdGltZXIpOworCQkJaWhvc3QtPnBoeV9zdGFydHVwX3RpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaWhvc3QtPm5leHRfcGh5X3RvX3N0YXJ0XTsKKworCQlpZiAob2VtLT5jb250cm9sbGVyLm1vZGVfdHlwZSA9PSBTQ0lDX1BPUlRfTUFOVUFMX0NPTkZJR1VSQVRJT05fTU9ERSkgeworCQkJaWYgKHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkgPT0gTlVMTCkgeworCQkJCWlob3N0LT5uZXh0X3BoeV90b19zdGFydCsrOworCisJCQkJLyogQ2F1dGlvbiByZWN1cnNpb24gYWhlYWQgYmUgZm9yd2FybmVkCisJCQkJICoKKwkJCQkgKiBUaGUgUEhZIHdhcyBuZXZlciBhZGRlZCB0byBhIFBPUlQgaW4gTVBDIG1vZGUKKwkJCQkgKiBzbyBzdGFydCB0aGUgbmV4dCBwaHkgaW4gc2VxdWVuY2UgVGhpcyBwaHkKKwkJCQkgKiB3aWxsIG5ldmVyIGdvIGxpbmsgdXAgYW5kIHdpbGwgbm90IGRyYXcgcG93ZXIKKwkJCQkgKiB0aGUgT0VNIHBhcmFtZXRlcnMgZWl0aGVyIGNvbmZpZ3VyZWQgdGhlIHBoeQorCQkJCSAqIGluY29ycmVjdGx5IGZvciB0aGUgUE9SVCBvciBpdCB3YXMgbmV2ZXIKKwkJCQkgKiBhc3NpZ25lZCB0byBhIFBPUlQKKwkJCQkgKi8KKwkJCQlyZXR1cm4gc2NpX2NvbnRyb2xsZXJfc3RhcnRfbmV4dF9waHkoaWhvc3QpOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0gc2NpX3BoeV9zdGFydChpcGh5KTsKKworCQlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCQlzY2lfbW9kX3RpbWVyKCZpaG9zdC0+cGh5X3RpbWVyLAorCQkJCSAgICAgIFNDSUNfU0RTX0NPTlRST0xMRVJfUEhZX1NUQVJUX1RJTUVPVVQpOworCQkJaWhvc3QtPnBoeV9zdGFydHVwX3RpbWVyX3BlbmRpbmcgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogQ29udHJvbGxlciBzdG9wIG9wZXJhdGlvbiBmYWlsZWQgIgorCQkJCSAidG8gc3RvcCBwaHkgJWQgYmVjYXVzZSBvZiBzdGF0dXMgIgorCQkJCSAiJWQuXG4iLAorCQkJCSBfX2Z1bmNfXywKKwkJCQkgaWhvc3QtPnBoeXNbaWhvc3QtPm5leHRfcGh5X3RvX3N0YXJ0XS5waHlfaW5kZXgsCisJCQkJIHN0YXR1cyk7CisJCX0KKworCQlpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnQrKzsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBwaHlfc3RhcnR1cF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKmlob3N0KSwgcGh5X3RpbWVyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRtci0+Y2FuY2VsKQorCQlnb3RvIGRvbmU7CisKKwlpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCisJZG8geworCQlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeShpaG9zdCk7CisJfSB3aGlsZSAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKTsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MTYgaXNjaV90Y2lfYWN0aXZlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXJldHVybiBDSVJDX0NOVChpaG9zdC0+dGNpX2hlYWQsIGlob3N0LT50Y2lfdGFpbCwgU0NJX01BWF9JT19SRVFVRVNUUyk7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RhcnQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgdTMyIHRpbWVvdXQpCit7CisJZW51bSBzY2lfc3RhdHVzIHJlc3VsdDsKKwl1MTYgaW5kZXg7CisKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19JTklUSUFMSVpFRCkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiU0NJQyBDb250cm9sbGVyIHN0YXJ0IG9wZXJhdGlvbiByZXF1ZXN0ZWQgaW4gIgorCQkJICJpbnZhbGlkIHN0YXRlXG4iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJLyogQnVpbGQgdGhlIFRDaSBmcmVlIHBvb2wgKi8KKwlCVUlMRF9CVUdfT04oU0NJX01BWF9JT19SRVFVRVNUUyA+IDEgPDwgc2l6ZW9mKGlob3N0LT50Y2lfcG9vbFswXSkgKiA4KTsKKwlpaG9zdC0+dGNpX2hlYWQgPSAwOworCWlob3N0LT50Y2lfdGFpbCA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaWhvc3QtPnRhc2tfY29udGV4dF9lbnRyaWVzOyBpbmRleCsrKQorCQlpc2NpX3RjaV9mcmVlKGlob3N0LCBpbmRleCk7CisKKwkvKiBCdWlsZCB0aGUgUk5pIGZyZWUgcG9vbCAqLworCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9pbml0aWFsaXplKCZpaG9zdC0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywKKwkJCQkJIGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzKTsKKworCS8qCisJICogQmVmb3JlIGFueXRoaW5nIGVsc2UgbGV0cyBtYWtlIHN1cmUgd2Ugd2lsbCBub3QgYmUKKwkgKiBpbnRlcnJ1cHRlZCBieSB0aGUgaGFyZHdhcmUuCisJICovCisJc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKGlob3N0KTsKKworCS8qIEVuYWJsZSB0aGUgcG9ydCB0YXNrIHNjaGVkdWxlciAqLworCXNjaV9jb250cm9sbGVyX2VuYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKGlob3N0KTsKKworCS8qIEFzc2lnbiBhbGwgdGhlIHRhc2sgZW50cmllcyB0byBpaG9zdCBwaHlzaWNhbCBmdW5jdGlvbiAqLworCXNjaV9jb250cm9sbGVyX2Fzc2lnbl90YXNrX2VudHJpZXMoaWhvc3QpOworCisJLyogTm93IGluaXRpYWxpemUgdGhlIGNvbXBsZXRpb24gcXVldWUgKi8KKwlzY2lfY29udHJvbGxlcl9pbml0aWFsaXplX2NvbXBsZXRpb25fcXVldWUoaWhvc3QpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgcXVldWUgZm9yIHVzZSAqLworCXNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfdW5zb2xpY2l0ZWRfZnJhbWVfcXVldWUoaWhvc3QpOworCisJLyogU3RhcnQgYWxsIG9mIHRoZSBwb3J0cyBvbiB0aGlzIGNvbnRyb2xsZXIgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXM7IGluZGV4KyspIHsKKwkJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSAmaWhvc3QtPnBvcnRzW2luZGV4XTsKKworCQlyZXN1bHQgPSBzY2lfcG9ydF9zdGFydChpcG9ydCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KGlob3N0KTsKKworCXNjaV9tb2RfdGltZXIoJmlob3N0LT50aW1lciwgdGltZW91dCk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfU1RBUlRJTkcpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCit2b2lkIGlzY2lfaG9zdF9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KS0+bGxkZF9oYTsKKwl1bnNpZ25lZCBsb25nIHRtbyA9IHNjaV9jb250cm9sbGVyX2dldF9zdWdnZXN0ZWRfc3RhcnRfdGltZW91dChpaG9zdCk7CisKKwlzZXRfYml0KElIT1NUX1NUQVJUX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisJc2NpX2NvbnRyb2xsZXJfc3RhcnQoaWhvc3QsIHRtbyk7CisJc2NpX2NvbnRyb2xsZXJfZW5hYmxlX2ludGVycnVwdHMoaWhvc3QpOworCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfaG9zdF9zdG9wX2NvbXBsZXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBlbnVtIHNjaV9zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9zdG9wcGVkKTsKKwlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCWNsZWFyX2JpdChJSE9TVF9TVE9QX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpOworCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9jb21wbGV0aW9uX2hhbmRsZXIoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJLyogRW1wdHkgb3V0IHRoZSBjb21wbGV0aW9uIHF1ZXVlICovCisJaWYgKHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25fcXVldWVfaGFzX2VudHJpZXMoaWhvc3QpKQorCQlzY2lfY29udHJvbGxlcl9wcm9jZXNzX2NvbXBsZXRpb25zKGlob3N0KTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgYW5kIGVuYWJsZSBhbGwgaW50ZXJydXB0cyBhZ2FpbiAqLworCXdyaXRlbChTTVVfSVNSX0NPTVBMRVRJT04sICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X3N0YXR1cyk7CisJLyogQ291bGQgd2Ugd3JpdGUgdGhlIHZhbHVlIG9mIFNNVV9JU1JfQ09NUExFVElPTj8gKi8KKwl3cml0ZWwoMHhGRjAwMDAwMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7CisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworfQorCisvKioKKyAqIGlzY2lfaG9zdF9jb21wbGV0aW9uX3JvdXRpbmUoKSAtIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGRlbGF5ZWQgc2VydmljZQorICogICAgcm91dGluZSB0aGF0IGNhbGxzIHRoZSBzY2kgY29yZSBsaWJyYXJ5J3MgY29tcGxldGlvbiBoYW5kbGVyLiBJdCdzCisgKiAgICBzY2hlZHVsZWQgYXMgYSB0YXNrbGV0IGZyb20gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgd2hlbiBpbnRlcnJ1cHRzCisgKiAgICBpbiB1c2UsIG9yIHNldCBhcyB0aGUgdGltZW91dCBmdW5jdGlvbiBpbiBwb2xsZWQgbW9kZS4KKyAqIEBkYXRhOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIElTQ0kgaG9zdCBvYmplY3QKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfaG9zdF9jb21wbGV0aW9uX3JvdXRpbmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gKHN0cnVjdCBpc2NpX2hvc3QgKilkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgICAgY29tcGxldGVkX3JlcXVlc3RfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIGVycm9yZWRfcmVxdWVzdF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgICAgKmN1cnJlbnRfcG9zaXRpb247CisJc3RydWN0IGxpc3RfaGVhZCAgICAqbmV4dF9wb3NpdGlvbjsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKm5leHRfcmVxdWVzdDsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgICAgICp0YXNrOworCisJSU5JVF9MSVNUX0hFQUQoJmNvbXBsZXRlZF9yZXF1ZXN0X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZlcnJvcmVkX3JlcXVlc3RfbGlzdCk7CisKKwlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKworCXNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25faGFuZGxlcihpaG9zdCk7CisKKwkvKiBUYWtlIHRoZSBsaXN0cyBvZiBjb21wbGV0ZWQgSS9PcyBmcm9tIHRoZSBob3N0LiAqLworCisJbGlzdF9zcGxpY2VfaW5pdCgmaWhvc3QtPnJlcXVlc3RzX3RvX2NvbXBsZXRlLAorCQkJICZjb21wbGV0ZWRfcmVxdWVzdF9saXN0KTsKKworCS8qIFRha2UgdGhlIGxpc3Qgb2YgZXJyb3JlZCBJL09zIGZyb20gdGhlIGhvc3QuICovCisJbGlzdF9zcGxpY2VfaW5pdCgmaWhvc3QtPnJlcXVlc3RzX3RvX2Vycm9yYmFjaywKKwkJCSAmZXJyb3JlZF9yZXF1ZXN0X2xpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKworCS8qIFByb2Nlc3MgYW55IGNvbXBsZXRpb25zIGluIHRoZSBsaXN0cy4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUoY3VycmVudF9wb3NpdGlvbiwgbmV4dF9wb3NpdGlvbiwKKwkJCSAgICZjb21wbGV0ZWRfcmVxdWVzdF9saXN0KSB7CisKKwkJcmVxdWVzdCA9IGxpc3RfZW50cnkoY3VycmVudF9wb3NpdGlvbiwgc3RydWN0IGlzY2lfcmVxdWVzdCwKKwkJCQkgICAgIGNvbXBsZXRlZF9ub2RlKTsKKwkJdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKworCQkvKiBOb3JtYWwgbm90aWZpY2F0aW9uICh0YXNrX2RvbmUpICovCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IE5vcm1hbCAtIHJlcXVlc3QvdGFzayA9ICVwLyVwXG4iLAorCQkJX19mdW5jX18sCisJCQlyZXF1ZXN0LAorCQkJdGFzayk7CisKKwkJLyogUmV0dXJuIHRoZSB0YXNrIHRvIGxpYnNhcyAqLworCQlpZiAodGFzayAhPSBOVUxMKSB7CisKKwkJCXRhc2stPmxsZGRfdGFzayA9IE5VTEw7CisJCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKworCQkJCS8qIElmIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gdGhlIGFib3J0IHBhdGgsCisJCQkJKiB0aGUgdGFza19kb25lIGNhbGxiYWNrIGNhbm5vdCBiZSBjYWxsZWQuCisJCQkJKi8KKwkJCQl0YXNrLT50YXNrX2RvbmUodGFzayk7CisJCQl9CisJCX0KKworCQlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgcmVxdWVzdC0+aW9fdGFnKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcXVlc3QsIG5leHRfcmVxdWVzdCwgJmVycm9yZWRfcmVxdWVzdF9saXN0LAorCQkJCSBjb21wbGV0ZWRfbm9kZSkgeworCisJCXRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2socmVxdWVzdCk7CisKKwkJLyogVXNlIHNhc190YXNrX2Fib3J0ICovCisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogRXJyb3IgLSByZXF1ZXN0L3Rhc2sgPSAlcC8lcFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSByZXF1ZXN0LAorCQkJIHRhc2spOworCisJCWlmICh0YXNrICE9IE5VTEwpIHsKKworCQkJLyogUHV0IHRoZSB0YXNrIGludG8gdGhlIGFib3J0IHBhdGggaWYgaXQncyBub3QgdGhlcmUKKwkJCSAqIGFscmVhZHkuCisJCQkgKi8KKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkKKwkJCQlzYXNfdGFza19hYm9ydCh0YXNrKTsKKworCQl9IGVsc2UgeworCQkJLyogVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCB3aXRoIGEKKwkJCSAqIHN0YXR1cyBzdWNoIHRoYXQgaXQgbmVlZGVkIGZ1cnRoZXIgdGFyZ2V0IHNlcnZpY2luZywKKwkJCSAqIGJ1dCB0aGUgc2FzX3Rhc2sgcmVmZXJlbmNlIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZAorCQkJICogZnJvbSB0aGUgcmVxdWVzdC4gIFNpbmNlIGl0IHdhcyBlcnJvcmVkLCBpdCB3YXMgbm90CisJCQkgKiBiZWluZyBhYm9ydGVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGV4Y2VwdCBmcmVlCisJCQkgKiBpdC4KKwkJCSAqLworCisJCQlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwkJCS8qIFJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIHRoZSByZW1vdGUgZGV2aWNlJ3MgbGlzdAorCQkJKiBvZiBwZW5kaW5nIHJlcXVlc3RzLgorCQkJKi8KKwkJCWxpc3RfZGVsX2luaXQoJnJlcXVlc3QtPmRldl9ub2RlKTsKKwkJCWlzY2lfZnJlZV90YWcoaWhvc3QsIHJlcXVlc3QtPmlvX3RhZyk7CisJCQlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCQl9CisJfQorCit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfc3RvcCgpIC0gVGhpcyBtZXRob2Qgd2lsbCBzdG9wIGFuIGluZGl2aWR1YWwgY29udHJvbGxlcgorICogICAgb2JqZWN0LlRoaXMgbWV0aG9kIHdpbGwgaW52b2tlIHRoZSBhc3NvY2lhdGVkIHVzZXIgY2FsbGJhY2sgdXBvbgorICogICAgY29tcGxldGlvbi4gIFRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBmb2xsb3dpbmcKKyAqICAgIGNvbmRpdGlvbnMgYXJlIG1ldDogLSMgdGhlIG1ldGhvZCByZXR1cm4gc3RhdHVzIGlzIFNDSV9TVUNDRVNTLiAtIyB0aGUKKyAqICAgIGNvbnRyb2xsZXIgaGFzIGJlZW4gcXVpZXNjZWQuIFRoaXMgbWV0aG9kIHdpbGwgZW5zdXJlIHRoYXQgYWxsIElPCisgKiAgICByZXF1ZXN0cyBhcmUgcXVpZXNjZWQsIHBoeXMgYXJlIHN0b3BwZWQsIGFuZCBhbGwgYWRkaXRpb25hbCBvcGVyYXRpb24gYnkKKyAqICAgIHRoZSBoYXJkd2FyZSBpcyBoYWx0ZWQuCisgKiBAY29udHJvbGxlcjogdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QgdG8gc3RvcC4KKyAqIEB0aW1lb3V0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggdGhlCisgKiAgICBzdG9wIG9wZXJhdGlvbiBzaG91bGQgY29tcGxldGUuCisgKgorICogVGhlIGNvbnRyb2xsZXIgbXVzdCBiZSBpbiB0aGUgU1RBUlRFRCBvciBTVE9QUEVEIHN0YXRlLiBJbmRpY2F0ZSBpZiB0aGUKKyAqIGNvbnRyb2xsZXIgc3RvcCBtZXRob2Qgc3VjY2VlZGVkIG9yIGZhaWxlZCBpbiBzb21lIHdheS4gU0NJX1NVQ0NFU1MgaWYgdGhlCisgKiBzdG9wIG9wZXJhdGlvbiBzdWNjZXNzZnVsbHkgYmVnYW4uIFNDSV9XQVJOSU5HX0FMUkVBRFlfSU5fU1RBVEUgaWYgdGhlCisgKiBjb250cm9sbGVyIGlzIGFscmVhZHkgaW4gdGhlIFNUT1BQRUQgc3RhdGUuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEUgaWYgdGhlCisgKiBjb250cm9sbGVyIGlzIG5vdCBlaXRoZXIgaW4gdGhlIFNUQVJURUQgb3IgU1RPUFBFRCBzdGF0ZXMuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RvcChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTMyIHRpbWVvdXQpCit7CisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIlNDSUMgQ29udHJvbGxlciBzdG9wIG9wZXJhdGlvbiByZXF1ZXN0ZWQgaW4gIgorCQkJICJpbnZhbGlkIHN0YXRlXG4iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX21vZF90aW1lcigmaWhvc3QtPnRpbWVyLCB0aW1lb3V0KTsKKwlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfU1RPUFBJTkcpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9yZXNldCgpIC0gVGhpcyBtZXRob2Qgd2lsbCByZXNldCB0aGUgc3VwcGxpZWQgY29yZQorICogICAgY29udHJvbGxlciByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiBzYWlkIGNvbnRyb2xsZXIuICBUaGlzIG9wZXJhdGlvbiBpcworICogICAgY29uc2lkZXJlZCBkZXN0cnVjdGl2ZS4gIEluIG90aGVyIHdvcmRzLCBhbGwgY3VycmVudCBvcGVyYXRpb25zIGFyZSB3aXBlZAorICogICAgb3V0LiAgTm8gSU8gY29tcGxldGlvbnMgZm9yIG91dHN0YW5kaW5nIGRldmljZXMgb2NjdXIuICBPdXRzdGFuZGluZyBJTworICogICAgcmVxdWVzdHMgYXJlIG5vdCBhYm9ydGVkIG9yIGNvbXBsZXRlZCBhdCB0aGUgYWN0dWFsIHJlbW90ZSBkZXZpY2UuCisgKiBAY29udHJvbGxlcjogdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QgdG8gcmVzZXQuCisgKgorICogSW5kaWNhdGUgaWYgdGhlIGNvbnRyb2xsZXIgcmVzZXQgbWV0aG9kIHN1Y2NlZWRlZCBvciBmYWlsZWQgaW4gc29tZSB3YXkuCisgKiBTQ0lfU1VDQ0VTUyBpZiB0aGUgcmVzZXQgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBzdGFydGVkLiBTQ0lfRkFUQUxfRVJST1IgaWYKKyAqIHRoZSBjb250cm9sbGVyIHJlc2V0IG9wZXJhdGlvbiBpcyB1bmFibGUgdG8gY29tcGxldGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfcmVzZXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc3dpdGNoIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCkgeworCWNhc2UgU0NJQ19SRVNFVDoKKwljYXNlIFNDSUNfUkVBRFk6CisJY2FzZSBTQ0lDX1NUT1BQRUQ6CisJY2FzZSBTQ0lDX0ZBSUxFRDoKKwkJLyoKKwkJICogVGhlIHJlc2V0IG9wZXJhdGlvbiBpcyBub3QgYSBncmFjZWZ1bCBjbGVhbnVwLCBqdXN0CisJCSAqIHBlcmZvcm0gdGhlIHN0YXRlIHRyYW5zaXRpb24uCisJCSAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfUkVTRVRUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICJTQ0lDIENvbnRyb2xsZXIgcmVzZXQgb3BlcmF0aW9uIHJlcXVlc3RlZCBpbiAiCisJCQkgImludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK3ZvaWQgaXNjaV9ob3N0X2RlaW5pdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlpbnQgaTsKKworCWlzY2lfaG9zdF9jaGFuZ2Vfc3RhdGUoaWhvc3QsIGlzY2lfc3RvcHBpbmcpOworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSAmaWhvc3QtPnBvcnRzW2ldOworCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCAqZDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaWRldiwgZCwgJmlwb3J0LT5yZW1vdGVfZGV2X2xpc3QsIG5vZGUpIHsKKwkJCWlmICh0ZXN0X2JpdChJREVWX0FMTE9DQVRFRCwgJmlkZXYtPmZsYWdzKSkKKwkJCQlpc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChpaG9zdCwgaWRldik7CisJCX0KKwl9CisKKwlzZXRfYml0KElIT1NUX1NUT1BfUEVORElORywgJmlob3N0LT5mbGFncyk7CisKKwlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwlzY2lfY29udHJvbGxlcl9zdG9wKGlob3N0LCBTQ0lDX0NPTlRST0xMRVJfU1RPUF9USU1FT1VUKTsKKwlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCisJd2FpdF9mb3Jfc3RvcChpaG9zdCk7CisJc2NpX2NvbnRyb2xsZXJfcmVzZXQoaWhvc3QpOworCisJLyogQ2FuY2VsIGFueS9hbGwgb3V0c3RhbmRpbmcgcG9ydCB0aW1lcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWhvc3QtPmxvZ2ljYWxfcG9ydF9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSAmaWhvc3QtPnBvcnRzW2ldOworCQlkZWxfdGltZXJfc3luYygmaXBvcnQtPnRpbWVyLnRpbWVyKTsKKwl9CisKKwkvKiBDYW5jZWwgYW55L2FsbCBvdXRzdGFuZGluZyBwaHkgdGltZXJzICovCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9ICZpaG9zdC0+cGh5c1tpXTsKKwkJZGVsX3RpbWVyX3N5bmMoJmlwaHktPnNhdGFfdGltZXIudGltZXIpOworCX0KKworCWRlbF90aW1lcl9zeW5jKCZpaG9zdC0+cG9ydF9hZ2VudC50aW1lci50aW1lcik7CisKKwlkZWxfdGltZXJfc3luYygmaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXIudGltZXIpOworCisJZGVsX3RpbWVyX3N5bmMoJmlob3N0LT50aW1lci50aW1lcik7CisKKwlkZWxfdGltZXJfc3luYygmaWhvc3QtPnBoeV90aW1lci50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlzY2lfaG9zdC0+cGRldjsKKwlpbnQgaWQgPSBpc2NpX2hvc3QtPmlkOworCisJcmV0dXJuIHBjaW1faW9tYXBfdGFibGUocGRldilbU0NJX1NDVV9CQVIgKiAyXSArIFNDSV9TQ1VfQkFSX1NJWkUgKiBpZDsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqc211X2Jhc2Uoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaXNjaV9ob3N0LT5wZGV2OworCWludCBpZCA9IGlzY2lfaG9zdC0+aWQ7CisKKwlyZXR1cm4gcGNpbV9pb21hcF90YWJsZShwZGV2KVtTQ0lfU01VX0JBUiAqIDJdICsgU0NJX1NNVV9CQVJfU0laRSAqIGlkOworfQorCitzdGF0aWMgdm9pZCBpc2NpX3VzZXJfcGFyYW1ldGVyc19nZXQoc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgKnUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspIHsKKwkJc3RydWN0IHNjaV9waHlfdXNlcl9wYXJhbXMgKnVfcGh5ID0gJnUtPnBoeXNbaV07CisKKwkJdV9waHktPm1heF9zcGVlZF9nZW5lcmF0aW9uID0gcGh5X2dlbjsKKworCQkvKiB3ZSBhcmUgbm90IGV4cG9ydGluZyB0aGVzZSBmb3Igbm93ICovCisJCXVfcGh5LT5hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHg3ZjsKKwkJdV9waHktPmluX2Nvbm5lY3Rpb25fYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9IDB4ZmY7CisJCXVfcGh5LT5ub3RpZnlfZW5hYmxlX3NwaW5fdXBfaW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9IDB4MzM7CisJfQorCisJdS0+c3RwX2luYWN0aXZpdHlfdGltZW91dCA9IHN0cF9pbmFjdGl2ZV90bzsKKwl1LT5zc3BfaW5hY3Rpdml0eV90aW1lb3V0ID0gc3NwX2luYWN0aXZlX3RvOworCXUtPnN0cF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPSBzdHBfbWF4X29jY190bzsKKwl1LT5zc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0ID0gc3NwX21heF9vY2NfdG87CisJdS0+bm9fb3V0Ym91bmRfdGFza190aW1lb3V0ID0gbm9fb3V0Ym91bmRfdGFza190bzsKKwl1LT5tYXhfbnVtYmVyX2NvbmN1cnJlbnRfZGV2aWNlX3NwaW5fdXAgPSBtYXhfY29uY3Vycl9zcGludXA7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlob3N0KSwgc20pOworCisJc2NpX2NoYW5nZV9zdGF0ZSgmaWhvc3QtPnNtLCBTQ0lDX1JFU0VUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjaV9jb250cm9sbGVyX3N0YXJ0aW5nX3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlob3N0KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaWhvc3QtPnRpbWVyKTsKK30KKworI2RlZmluZSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9CQVNFX1JBTkdFX0xPV0VSX0JPVU5EX05TIDg1MworI2RlZmluZSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9CQVNFX1JBTkdFX1VQUEVSX0JPVU5EX05TIDEyODAKKyNkZWZpbmUgSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfTUFYX1VTICAgICAgICAgICAgICAgICAgICAyNzAwMDAwCisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9OVU1CRVJfTUFYICAgICAgICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0VOQ09ERV9NSU4gICAgICAgICAgICAgICAgNworI2RlZmluZSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9FTkNPREVfTUFYICAgICAgICAgICAgICAgIDI4CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfc2V0X2ludGVycnVwdF9jb2FsZXNjZW5jZSgpIC0gVGhpcyBtZXRob2QgYWxsb3dzIHRoZSB1c2VyIHRvCisgKiAgICBjb25maWd1cmUgdGhlIGludGVycnVwdCBjb2FsZXNjZW5jZS4KKyAqIEBjb250cm9sbGVyOiBUaGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBoYW5kbGUgdG8gdGhlIGNvbnRyb2xsZXIgb2JqZWN0CisgKiAgICBmb3Igd2hpY2ggaXRzIGludGVycnVwdCBjb2FsZXNjZSByZWdpc3RlciBpcyBvdmVycmlkZGVuLgorICogQGNvYWxlc2NlX251bWJlcjogVXNlZCB0byBjb250cm9sIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgQ29tcGxldGlvbgorICogICAgUXVldWUgYmVmb3JlIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQuIElmIHRoZSBudW1iZXIgb2YgZW50cmllcyBleGNlZWQKKyAqICAgIHRoaXMgbnVtYmVyLCBhbiBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQuIFRoZSB2YWxpZCByYW5nZSBvZiB0aGUgaW5wdXQKKyAqICAgIGlzIFswLCAyNTZdLiBBIHNldHRpbmcgb2YgMCByZXN1bHRzIGluIGNvYWxlc2NpbmcgYmVpbmcgZGlzYWJsZWQuCisgKiBAY29hbGVzY2VfdGltZW91dDogVGltZW91dCB2YWx1ZSBpbiBtaWNyb3NlY29uZHMuIFRoZSB2YWxpZCByYW5nZSBvZiB0aGUKKyAqICAgIGlucHV0IGlzIFswLCAyNzAwMDAwXSAuIEEgc2V0dGluZyBvZiAwIGlzIGFsbG93ZWQgYW5kIHJlc3VsdHMgaW4gbm8KKyAqICAgIGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVvdXQuCisgKgorICogSW5kaWNhdGUgaWYgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHNldCB0aGUgaW50ZXJydXB0IGNvYWxlc2NlIHBhcmFtZXRlcnMuCisgKiBTQ0lfU1VDQ0VTUyBUaGUgdXNlciBzdWNjZXNzZnVsbHkgdXBkYXRlZCB0aGUgaW50ZXJydXRwIGNvYWxlc2NlbmNlLgorICogU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUgVGhlIHVzZXIgaW5wdXQgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfY29udHJvbGxlcl9zZXRfaW50ZXJydXB0X2NvYWxlc2NlbmNlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgdTMyIGNvYWxlc2NlX251bWJlciwKKwkJCQkJIHUzMiBjb2FsZXNjZV90aW1lb3V0KQoreworCXU4IHRpbWVvdXRfZW5jb2RlID0gMDsKKwl1MzIgbWluID0gMDsKKwl1MzIgbWF4ID0gMDsKKworCS8qIENoZWNrIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZhbGwgaW4gdGhlIHJhbmdlLiAqLworCWlmIChjb2FsZXNjZV9udW1iZXIgPiBJTlRFUlJVUFRfQ09BTEVTQ0VfTlVNQkVSX01BWCkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworCisJLyoKKwkgKiAgRGVmaW5lZCBlbmNvZGluZyBmb3IgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZW91dDoKKwkgKiAgICAgICAgICAgICAgVmFsdWUgICBNaW4gICAgICBNYXggICAgIFVuaXRzCisJICogICAgICAgICAgICAgIC0tLS0tICAgLS0tICAgICAgLS0tICAgICAtLS0tLQorCSAqICAgICAgICAgICAgICAwICAgICAgIC0gICAgICAgIC0gICAgICAgRGlzYWJsZWQKKwkgKiAgICAgICAgICAgICAgMSAgICAgICAxMy4zICAgICAyMC4wICAgIG5zCisJICogICAgICAgICAgICAgIDIgICAgICAgMjYuNyAgICAgNDAuMAorCSAqICAgICAgICAgICAgICAzICAgICAgIDUzLjMgICAgIDgwLjAKKwkgKiAgICAgICAgICAgICAgNCAgICAgICAxMDYuNyAgICAxNjAuMAorCSAqICAgICAgICAgICAgICA1ICAgICAgIDIxMy4zICAgIDMyMC4wCisJICogICAgICAgICAgICAgIDYgICAgICAgNDI2LjcgICAgNjQwLjAKKwkgKiAgICAgICAgICAgICAgNyAgICAgICA4NTMuMyAgICAxMjgwLjAKKwkgKiAgICAgICAgICAgICAgOCAgICAgICAxLjcgICAgICAyLjYgICAgIHVzCisJICogICAgICAgICAgICAgIDkgICAgICAgMy40ICAgICAgNS4xCisJICogICAgICAgICAgICAgIDEwICAgICAgNi44ICAgICAgMTAuMgorCSAqICAgICAgICAgICAgICAxMSAgICAgIDEzLjcgICAgIDIwLjUKKwkgKiAgICAgICAgICAgICAgMTIgICAgICAyNy4zICAgICA0MS4wCisJICogICAgICAgICAgICAgIDEzICAgICAgNTQuNiAgICAgODEuOQorCSAqICAgICAgICAgICAgICAxNCAgICAgIDEwOS4yICAgIDE2My44CisJICogICAgICAgICAgICAgIDE1ICAgICAgMjE4LjUgICAgMzI3LjcKKwkgKiAgICAgICAgICAgICAgMTYgICAgICA0MzYuOSAgICA2NTUuNAorCSAqICAgICAgICAgICAgICAxNyAgICAgIDg3My44ICAgIDEzMTAuNworCSAqICAgICAgICAgICAgICAxOCAgICAgIDEuNyAgICAgIDIuNiAgICAgbXMKKwkgKiAgICAgICAgICAgICAgMTkgICAgICAzLjUgICAgICA1LjIKKwkgKiAgICAgICAgICAgICAgMjAgICAgICA3LjAgICAgICAxMC41CisJICogICAgICAgICAgICAgIDIxICAgICAgMTQuMCAgICAgMjEuMAorCSAqICAgICAgICAgICAgICAyMiAgICAgIDI4LjAgICAgIDQxLjkKKwkgKiAgICAgICAgICAgICAgMjMgICAgICA1NS45ICAgICA4My45CisJICogICAgICAgICAgICAgIDI0ICAgICAgMTExLjggICAgMTY3LjgKKwkgKiAgICAgICAgICAgICAgMjUgICAgICAyMjMuNyAgICAzMzUuNQorCSAqICAgICAgICAgICAgICAyNiAgICAgIDQ0Ny40ICAgIDY3MS4xCisJICogICAgICAgICAgICAgIDI3ICAgICAgODk0LjggICAgMTM0Mi4yCisJICogICAgICAgICAgICAgIDI4ICAgICAgMS44ICAgICAgMi43ICAgICBzCisJICogICAgICAgICAgICAgIE90aGVycyBVbmRlZmluZWQgKi8KKworCS8qCisJICogVXNlIHRoZSB0YWJsZSBhYm92ZSB0byBkZWNpZGUgdGhlIGVuY29kZSBvZiBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lb3V0CisJICogdmFsdWUgZm9yIHJlZ2lzdGVyIHdyaXRpbmcuICovCisJaWYgKGNvYWxlc2NlX3RpbWVvdXQgPT0gMCkKKwkJdGltZW91dF9lbmNvZGUgPSAwOworCWVsc2V7CisJCS8qIG1ha2UgdGhlIHRpbWVvdXQgdmFsdWUgaW4gdW5pdCBvZiAoMTAgbnMpLiAqLworCQljb2FsZXNjZV90aW1lb3V0ID0gY29hbGVzY2VfdGltZW91dCAqIDEwMDsKKwkJbWluID0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfQkFTRV9SQU5HRV9MT1dFUl9CT1VORF9OUyAvIDEwOworCQltYXggPSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9CQVNFX1JBTkdFX1VQUEVSX0JPVU5EX05TIC8gMTA7CisKKwkJLyogZ2V0IHRoZSBlbmNvZGUgb2YgdGltZW91dCBmb3IgcmVnaXN0ZXIgd3JpdGluZy4gKi8KKwkJZm9yICh0aW1lb3V0X2VuY29kZSA9IElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0VOQ09ERV9NSU47CisJCSAgICAgIHRpbWVvdXRfZW5jb2RlIDw9IElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0VOQ09ERV9NQVg7CisJCSAgICAgIHRpbWVvdXRfZW5jb2RlKyspIHsKKwkJCWlmIChtaW4gPD0gY29hbGVzY2VfdGltZW91dCAmJiAgbWF4ID4gY29hbGVzY2VfdGltZW91dCkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKGNvYWxlc2NlX3RpbWVvdXQgPj0gbWF4ICYmIGNvYWxlc2NlX3RpbWVvdXQgPCBtaW4gKiAyCisJCQkJICYmIGNvYWxlc2NlX3RpbWVvdXQgPD0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfTUFYX1VTICogMTAwKSB7CisJCQkJaWYgKChjb2FsZXNjZV90aW1lb3V0IC0gbWF4KSA8ICgyICogbWluIC0gY29hbGVzY2VfdGltZW91dCkpCisJCQkJCWJyZWFrOworCQkJCWVsc2V7CisJCQkJCXRpbWVvdXRfZW5jb2RlKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbWF4ID0gbWF4ICogMjsKKwkJCQltaW4gPSBtaW4gKiAyOworCQkJfQorCQl9CisKKwkJaWYgKHRpbWVvdXRfZW5jb2RlID09IElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0VOQ09ERV9NQVggKyAxKQorCQkJLyogdGhlIHZhbHVlIGlzIG91dCBvZiByYW5nZS4gKi8KKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKwl9CisKKwl3cml0ZWwoU01VX0lDQ19HRU5fVkFMKE5VTUJFUiwgY29hbGVzY2VfbnVtYmVyKSB8CisJICAgICAgIFNNVV9JQ0NfR0VOX1ZBTChUSU1FUiwgdGltZW91dF9lbmNvZGUpLAorCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9jb2FsZXNjZV9jb250cm9sKTsKKworCisJaWhvc3QtPmludGVycnVwdF9jb2FsZXNjZV9udW1iZXIgPSAodTE2KWNvYWxlc2NlX251bWJlcjsKKwlpaG9zdC0+aW50ZXJydXB0X2NvYWxlc2NlX3RpbWVvdXQgPSBjb2FsZXNjZV90aW1lb3V0IC8gMTAwOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3JlYWR5X3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppaG9zdCksIHNtKTsKKworCS8qIHNldCB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgY29hbGVzY2VuY2UgbnVtYmVyIGFuZCB0aW1lb3V0IHZhbHVlLiAqLworCXNjaV9jb250cm9sbGVyX3NldF9pbnRlcnJ1cHRfY29hbGVzY2VuY2UoaWhvc3QsIDB4MTAsIDI1MCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3JlYWR5X3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlob3N0KSwgc20pOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgY29hbGVzY2VuY2UuICovCisJc2NpX2NvbnRyb2xsZXJfc2V0X2ludGVycnVwdF9jb2FsZXNjZW5jZShpaG9zdCwgMCwgMCk7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RvcF9waHlzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBpbmRleDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWVudW0gc2NpX3N0YXR1cyBwaHlfc3RhdHVzOworCisJc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJcGh5X3N0YXR1cyA9IHNjaV9waHlfc3RvcCgmaWhvc3QtPnBoeXNbaW5kZXhdKTsKKworCQlpZiAocGh5X3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUyAmJgorCQkgICAgcGh5X3N0YXR1cyAhPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFKSB7CisJCQlzdGF0dXMgPSBTQ0lfRkFJTFVSRTsKKworCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogQ29udHJvbGxlciBzdG9wIG9wZXJhdGlvbiBmYWlsZWQgdG8gc3RvcCAiCisJCQkJICJwaHkgJWQgYmVjYXVzZSBvZiBzdGF0dXMgJWQuXG4iLAorCQkJCSBfX2Z1bmNfXywKKwkJCQkgaWhvc3QtPnBoeXNbaW5kZXhdLnBoeV9pbmRleCwgcGh5X3N0YXR1cyk7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0b3BfcG9ydHMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGluZGV4OworCWVudW0gc2NpX3N0YXR1cyBwb3J0X3N0YXR1czsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXM7IGluZGV4KyspIHsKKwkJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSAmaWhvc3QtPnBvcnRzW2luZGV4XTsKKworCQlwb3J0X3N0YXR1cyA9IHNjaV9wb3J0X3N0b3AoaXBvcnQpOworCisJCWlmICgocG9ydF9zdGF0dXMgIT0gU0NJX1NVQ0NFU1MpICYmCisJCSAgICAocG9ydF9zdGF0dXMgIT0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSkpIHsKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFOworCisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCB0byAiCisJCQkJICJzdG9wIHBvcnQgJWQgYmVjYXVzZSBvZiBzdGF0dXMgJWQuXG4iLAorCQkJCSBfX2Z1bmNfXywKKwkJCQkgaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCwKKwkJCQkgcG9ydF9zdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdG9wX2RldmljZXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGluZGV4OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJZW51bSBzY2lfc3RhdHVzIGRldmljZV9zdGF0dXM7CisKKwlzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzOyBpbmRleCsrKSB7CisJCWlmIChpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XSAhPSBOVUxMKSB7CisJCQkvKiAvIEB0b2RvIFdoYXQgdGltZW91dCB2YWx1ZSBkbyB3ZSB3YW50IHRvIHByb3ZpZGUgdG8gdGhpcyByZXF1ZXN0PyAqLworCQkJZGV2aWNlX3N0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF0sIDApOworCisJCQlpZiAoKGRldmljZV9zdGF0dXMgIT0gU0NJX1NVQ0NFU1MpICYmCisJCQkgICAgKGRldmljZV9zdGF0dXMgIT0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSkpIHsKKwkJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJICIlczogQ29udHJvbGxlciBzdG9wIG9wZXJhdGlvbiBmYWlsZWQgIgorCQkJCQkgInRvIHN0b3AgZGV2aWNlIDB4JXAgYmVjYXVzZSBvZiAiCisJCQkJCSAic3RhdHVzICVkLlxuIiwKKwkJCQkJIF9fZnVuY19fLAorCQkJCQkgaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF0sIGRldmljZV9zdGF0dXMpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfc3RvcHBpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlob3N0KSwgc20pOworCisJLyogU3RvcCBhbGwgb2YgdGhlIGNvbXBvbmVudHMgZm9yIHRoaXMgY29udHJvbGxlciAqLworCXNjaV9jb250cm9sbGVyX3N0b3BfcGh5cyhpaG9zdCk7CisJc2NpX2NvbnRyb2xsZXJfc3RvcF9wb3J0cyhpaG9zdCk7CisJc2NpX2NvbnRyb2xsZXJfc3RvcF9kZXZpY2VzKGlob3N0KTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfc3RvcHBpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpaG9zdC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9yZXNldF9oYXJkd2FyZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgc28gd2UgZG9udCB0YWtlIGFueSBzcHVyaW91cyBpbnRlcnJ1cHRzICovCisJc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKGlob3N0KTsKKworCS8qIFJlc2V0IHRoZSBTQ1UgKi8KKwl3cml0ZWwoMHhGRkZGRkZGRiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5zb2Z0X3Jlc2V0X2NvbnRyb2wpOworCisJLyogRGVsYXkgZm9yIDFtcyB0byBiZWZvcmUgY2xlYXJpbmcgdGhlIENRUCBhbmQgVUZRUFIuICovCisJdWRlbGF5KDEwMDApOworCisJLyogVGhlIHdyaXRlIHRvIHRoZSBDUUdSIGNsZWFycyB0aGUgQ1FQICovCisJd3JpdGVsKDB4MDAwMDAwMDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+Y29tcGxldGlvbl9xdWV1ZV9nZXQpOworCisJLyogVGhlIHdyaXRlIHRvIHRoZSBVRlFHUCBjbGVhcnMgdGhlIFVGUVBSICovCisJd3JpdGVsKDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51bnNvbGljaXRlZF9mcmFtZV9nZXRfcG9pbnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3Jlc2V0dGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwlzY2lfY29udHJvbGxlcl9yZXNldF9oYXJkd2FyZShpaG9zdCk7CisJc2NpX2NoYW5nZV9zdGF0ZSgmaWhvc3QtPnNtLCBTQ0lDX1JFU0VUKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfY29udHJvbGxlcl9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lDX0lOSVRJQUxdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfY29udHJvbGxlcl9pbml0aWFsX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSUNfUkVTRVRdID0ge30sCisJW1NDSUNfSU5JVElBTElaSU5HXSA9IHt9LAorCVtTQ0lDX0lOSVRJQUxJWkVEXSA9IHt9LAorCVtTQ0lDX1NUQVJUSU5HXSA9IHsKKwkJLmV4aXRfc3RhdGUgID0gc2NpX2NvbnRyb2xsZXJfc3RhcnRpbmdfc3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lDX1JFQURZXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9jb250cm9sbGVyX3JlYWR5X3N0YXRlX2V4aXQsCisJfSwKKwlbU0NJQ19SRVNFVFRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfY29udHJvbGxlcl9yZXNldHRpbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJQ19TVE9QUElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9jb250cm9sbGVyX3N0b3BwaW5nX3N0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSA9IHNjaV9jb250cm9sbGVyX3N0b3BwaW5nX3N0YXRlX2V4aXQsCisJfSwKKwlbU0NJQ19TVE9QUEVEXSA9IHt9LAorCVtTQ0lDX0ZBSUxFRF0gPSB7fQorfTsKKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfc2V0X2RlZmF1bHRfY29uZmlnX3BhcmFtZXRlcnMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJLyogdGhlc2UgZGVmYXVsdHMgYXJlIG92ZXJyaWRkZW4gYnkgdGhlIHBsYXRmb3JtIC8gZmlybXdhcmUgKi8KKwl1MTYgaW5kZXg7CisKKwkvKiBEZWZhdWx0IHRvIEFQQyBtb2RlLiAqLworCWlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1vZGVfdHlwZSA9IFNDSUNfUE9SVF9BVVRPTUFUSUNfQ09ORklHVVJBVElPTl9NT0RFOworCisJLyogRGVmYXVsdCB0byBBUEMgbW9kZS4gKi8KKwlpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5tYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cCA9IDE7CisKKwkvKiBEZWZhdWx0IHRvIG5vIFNTQyBvcGVyYXRpb24uICovCisJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIuZG9fZW5hYmxlX3NzYyA9IGZhbHNlOworCisJLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHBvcnQgcGFyYW1ldGVyIGluZm9ybWF0aW9uIHRvIG5hcnJvdyBwb3J0cy4gKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BPUlRTOyBpbmRleCsrKSB7CisJCWlob3N0LT5vZW1fcGFyYW1ldGVycy5wb3J0c1tpbmRleF0ucGh5X21hc2sgPSAwOworCX0KKworCS8qIEluaXRpYWxpemUgYWxsIG9mIHRoZSBwaHkgcGFyYW1ldGVyIGluZm9ybWF0aW9uLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQkvKiBEZWZhdWx0IHRvIDZHIChpLmUuIEdlbiAzKSBmb3Igbm93LiAqLworCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLm1heF9zcGVlZF9nZW5lcmF0aW9uID0gMzsKKworCQkvKiB0aGUgZnJlcXVlbmNpZXMgY2Fubm90IGJlIDAgKi8KKwkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5waHlzW2luZGV4XS5hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHg3ZjsKKwkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5waHlzW2luZGV4XS5pbl9jb25uZWN0aW9uX2FsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweGZmOworCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLm5vdGlmeV9lbmFibGVfc3Bpbl91cF9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHgzMzsKKworCQkvKgorCQkgKiBQcmV2aW91cyBWaXRlc3NlIGJhc2VkIGV4cGFuZGVycyBoYWQgYSBhcmJpdHJhdGlvbiBpc3N1ZSB0aGF0CisJCSAqIGlzIHdvcmtlZCBhcm91bmQgYnkgaGF2aW5nIHRoZSB1cHBlciAzMi1iaXRzIG9mIFNBUyBhZGRyZXNzCisJCSAqIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoZW4gdGhlIFZpdGVzc2UgY29tcGFueSBpZGVudGlmaWVyLgorCQkgKiBIZW5jZSwgdXNhZ2Ugb2YgMHg1RkNGRkZGRi4gKi8KKwkJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLnNhc19hZGRyZXNzLmxvdyA9IDB4MSArIGlob3N0LT5pZDsKKwkJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLnNhc19hZGRyZXNzLmhpZ2ggPSAweDVGQ0ZGRkZGOworCX0KKworCWlob3N0LT51c2VyX3BhcmFtZXRlcnMuc3RwX2luYWN0aXZpdHlfdGltZW91dCA9IDU7CisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zc3BfaW5hY3Rpdml0eV90aW1lb3V0ID0gNTsKKwlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnN0cF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPSA1OworCWlob3N0LT51c2VyX3BhcmFtZXRlcnMuc3NwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IDIwOworCWlob3N0LT51c2VyX3BhcmFtZXRlcnMubm9fb3V0Ym91bmRfdGFza190aW1lb3V0ID0gMjA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnRyb2xsZXJfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCppaG9zdCksIHRpbWVyKTsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWhvc3QtPnNtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRtci0+Y2FuY2VsKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoc20tPmN1cnJlbnRfc3RhdGVfaWQgPT0gU0NJQ19TVEFSVElORykKKwkJc2NpX2NvbnRyb2xsZXJfdHJhbnNpdGlvbl90b19yZWFkeShpaG9zdCwgU0NJX0ZBSUxVUkVfVElNRU9VVCk7CisJZWxzZSBpZiAoc20tPmN1cnJlbnRfc3RhdGVfaWQgPT0gU0NJQ19TVE9QUElORykgeworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lDX0ZBSUxFRCk7CisJCWlzY2lfaG9zdF9zdG9wX2NvbXBsZXRlKGlob3N0LCBTQ0lfRkFJTFVSRV9USU1FT1VUKTsKKwl9IGVsc2UJLyogLyBAdG9kbyBOb3cgd2hhdCBkbyB3ZSB3YW50IHRvIGRvIGluIHRoaXMgY2FzZT8gKi8KKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogQ29udHJvbGxlciB0aW1lciBmaXJlZCB3aGVuIGNvbnRyb2xsZXIgd2FzIG5vdCAiCisJCQkiaW4gYSBzdGF0ZSBiZWluZyB0aW1lZC5cbiIsCisJCQlfX2Z1bmNfXyk7CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCXZvaWQgX19pb21lbSAqc2N1X2Jhc2UsCisJCQkJCQl2b2lkIF9faW9tZW0gKnNtdV9iYXNlKQoreworCXU4IGk7CisKKwlzY2lfaW5pdF9zbSgmaWhvc3QtPnNtLCBzY2lfY29udHJvbGxlcl9zdGF0ZV90YWJsZSwgU0NJQ19JTklUSUFMKTsKKworCWlob3N0LT5zY3VfcmVnaXN0ZXJzID0gc2N1X2Jhc2U7CisJaWhvc3QtPnNtdV9yZWdpc3RlcnMgPSBzbXVfYmFzZTsKKworCXNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfY29uc3RydWN0KCZpaG9zdC0+cG9ydF9hZ2VudCk7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIHBvcnRzIGZvciB0aGlzIGNvbnRyb2xsZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QT1JUUzsgaSsrKQorCQlzY2lfcG9ydF9jb25zdHJ1Y3QoJmlob3N0LT5wb3J0c1tpXSwgaSwgaWhvc3QpOworCXNjaV9wb3J0X2NvbnN0cnVjdCgmaWhvc3QtPnBvcnRzW2ldLCBTQ0lDX1NEU19EVU1NWV9QT1JULCBpaG9zdCk7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIHBoeXMgZm9yIHRoaXMgY29udHJvbGxlciAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCQkvKiBBZGQgYWxsIHRoZSBQSFlzIHRvIHRoZSBkdW1teSBwb3J0ICovCisJCXNjaV9waHlfY29uc3RydWN0KCZpaG9zdC0+cGh5c1tpXSwKKwkJCQkgICZpaG9zdC0+cG9ydHNbU0NJX01BWF9QT1JUU10sIGkpOworCX0KKworCWlob3N0LT5pbnZhbGlkX3BoeV9tYXNrID0gMDsKKworCXNjaV9pbml0X3RpbWVyKCZpaG9zdC0+dGltZXIsIGNvbnRyb2xsZXJfdGltZW91dCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBVc2VyIGFuZCBPRU0gcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcy4gKi8KKwlzY2lfY29udHJvbGxlcl9zZXRfZGVmYXVsdF9jb25maWdfcGFyYW1ldGVycyhpaG9zdCk7CisKKwlyZXR1cm4gc2NpX2NvbnRyb2xsZXJfcmVzZXQoaWhvc3QpOworfQorCitpbnQgc2NpX29lbV9wYXJhbWV0ZXJzX3ZhbGlkYXRlKHN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUE9SVFM7IGkrKykKKwkJaWYgKG9lbS0+cG9ydHNbaV0ucGh5X21hc2sgPiBTQ0lDX1NEU19QQVJNX1BIWV9NQVNLX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKQorCQlpZiAob2VtLT5waHlzW2ldLnNhc19hZGRyZXNzLmhpZ2ggPT0gMCAmJgorCQkgICAgb2VtLT5waHlzW2ldLnNhc19hZGRyZXNzLmxvdyA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob2VtLT5jb250cm9sbGVyLm1vZGVfdHlwZSA9PSBTQ0lDX1BPUlRfQVVUT01BVElDX0NPTkZJR1VSQVRJT05fTU9ERSkgeworCQlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspCisJCQlpZiAob2VtLT5wb3J0c1tpXS5waHlfbWFzayAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAob2VtLT5jb250cm9sbGVyLm1vZGVfdHlwZSA9PSBTQ0lDX1BPUlRfTUFOVUFMX0NPTkZJR1VSQVRJT05fTU9ERSkgeworCQl1OCBwaHlfbWFzayA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKQorCQkJcGh5X21hc2sgfD0gb2VtLT5wb3J0c1tpXS5waHlfbWFzazsKKworCQlpZiAocGh5X21hc2sgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZW0tPmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXAgPiBNQVhfQ09OQ1VSUkVOVF9ERVZJQ0VfU1BJTl9VUF9DT1VOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfb2VtX3BhcmFtZXRlcnNfc2V0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBzdGF0ZSA9IGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKHN0YXRlID09IFNDSUNfUkVTRVQgfHwKKwkgICAgc3RhdGUgPT0gU0NJQ19JTklUSUFMSVpJTkcgfHwKKwkgICAgc3RhdGUgPT0gU0NJQ19JTklUSUFMSVpFRCkgeworCisJCWlmIChzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoJmlob3N0LT5vZW1fcGFyYW1ldGVycykpCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworfQorCitzdGF0aWMgdm9pZCBwb3dlcl9jb250cm9sX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZih0bXIsIHR5cGVvZigqaWhvc3QpLCBwb3dlcl9jb250cm9sLnRpbWVyKTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyID0gMDsKKworCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX3dhaXRpbmcgPT0gMCkgeworCQlpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lcl9zdGFydGVkID0gZmFsc2U7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspIHsKKworCQlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c193YWl0aW5nID09IDApCisJCQlicmVhazsKKworCQlpcGh5ID0gaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVyc1tpXTsKKwkJaWYgKGlwaHkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX2dyYW50ZWRfcG93ZXIgPj0KKwkJICAgIGlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwKQorCQkJYnJlYWs7CisKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVyc1tpXSA9IE5VTEw7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZy0tOworCQlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX2dyYW50ZWRfcG93ZXIrKzsKKwkJc2NpX3BoeV9jb25zdW1lX3Bvd2VyX2hhbmRsZXIoaXBoeSk7CisJfQorCisJLyoKKwkgKiBJdCBkb2Vzbid0IG1hdHRlciBpZiB0aGUgcG93ZXIgbGlzdCBpcyBlbXB0eSwgd2UgbmVlZCB0byBzdGFydCB0aGUKKwkgKiB0aW1lciBpbiBjYXNlIGFub3RoZXIgcGh5IGJlY29tZXMgcmVhZHkuCisJICovCisJc2NpX21vZF90aW1lcih0bXIsIFNDSUNfU0RTX0NPTlRST0xMRVJfUE9XRVJfQ09OVFJPTF9JTlRFUlZBTCk7CisJaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXJfc3RhcnRlZCA9IHRydWU7CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHNjaV9jb250cm9sbGVyX3Bvd2VyX2NvbnRyb2xfcXVldWVfaW5zZXJ0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCUJVR19PTihpcGh5ID09IE5VTEwpOworCisJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA8CisJICAgIGlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwKSB7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlcisrOworCQlzY2lfcGh5X2NvbnN1bWVfcG93ZXJfaGFuZGxlcihpcGh5KTsKKworCQkvKgorCQkgKiBzdG9wIGFuZCBzdGFydCB0aGUgcG93ZXJfY29udHJvbCB0aW1lci4gV2hlbiB0aGUgdGltZXIgZmlyZXMsIHRoZQorCQkgKiBub19vZl9waHlzX2dyYW50ZWRfcG93ZXIgd2lsbCBiZSBzZXQgdG8gMAorCQkgKi8KKwkJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyX3N0YXJ0ZWQpCisJCQlzY2lfZGVsX3RpbWVyKCZpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lcik7CisKKwkJc2NpX21vZF90aW1lcigmaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXIsCisJCQkJIFNDSUNfU0RTX0NPTlRST0xMRVJfUE9XRVJfQ09OVFJPTF9JTlRFUlZBTCk7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyX3N0YXJ0ZWQgPSB0cnVlOworCisJfSBlbHNlIHsKKwkJLyogQWRkIHRoZSBwaHkgaW4gdGhlIHdhaXRpbmcgbGlzdCAqLworCQlpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2lwaHktPnBoeV9pbmRleF0gPSBpcGh5OworCQlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX3dhaXRpbmcrKzsKKwl9Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9yZW1vdmUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJQlVHX09OKGlwaHkgPT0gTlVMTCk7CisKKwlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVyc1tpcGh5LT5waHlfaW5kZXhdKQorCQlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX3dhaXRpbmctLTsKKworCWlob3N0LT5wb3dlcl9jb250cm9sLnJlcXVlc3RlcnNbaXBoeS0+cGh5X2luZGV4XSA9IE5VTEw7Cit9CisKKyNkZWZpbmUgQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZIDEwCisKKy8qIEluaXRpYWxpemUgdGhlIEFGRSBmb3IgdGhpcyBwaHkgaW5kZXguIFdlIG5lZWQgdG8gcmVhZCB0aGUgQUZFIHNldHVwIGZyb20KKyAqIHRoZSBPRU0gcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9hZmVfaW5pdGlhbGl6YXRpb24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJY29uc3Qgc3RydWN0IHNjaV9vZW1fcGFyYW1zICpvZW0gPSAmaWhvc3QtPm9lbV9wYXJhbWV0ZXJzOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWhvc3QtPnBkZXY7CisJdTMyIGFmZV9zdGF0dXM7CisJdTMyIHBoeV9pZDsKKworCS8qIENsZWFyIERGWCBTdGF0dXMgcmVnaXN0ZXJzICovCisJd3JpdGVsKDB4MDA4MTAwMGYsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9kZnhfbWFzdGVyX2NvbnRyb2wwKTsKKwl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCWlmIChpc19iMChwZGV2KSkgeworCQkvKiBQTSBSeCBFcXVhbGl6YXRpb24gU2F2ZSwgUE0gU1BoeSBSeCBBY2tub3dsZWRnZW1lbnQKKwkJICogVGltZXIsIFBNIFN0YWdnZXIgVGltZXIgKi8KKwkJd3JpdGVsKDB4MDAwN0JGRkYsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9wbXNuX21hc3Rlcl9jb250cm9sMik7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCX0KKworCS8qIENvbmZpZ3VyZSBiaWFzIGN1cnJlbnRzIHRvIG5vcm1hbCAqLworCWlmIChpc19hMihwZGV2KSkKKwkJd3JpdGVsKDB4MDAwMDVBMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9iaWFzX2NvbnRyb2wpOworCWVsc2UgaWYgKGlzX2IwKHBkZXYpIHx8IGlzX2MwKHBkZXYpKQorCQl3cml0ZWwoMHgwMDAwNUYwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2JpYXNfY29udHJvbCk7CisKKwl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCS8qIEVuYWJsZSBQTEwgKi8KKwlpZiAoaXNfYjAocGRldikgfHwgaXNfYzAocGRldikpCisJCXdyaXRlbCgweDgwMDQwQTA4LCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfcGxsX2NvbnRyb2wwKTsKKwllbHNlCisJCXdyaXRlbCgweDgwMDQwOTA4LCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfcGxsX2NvbnRyb2wwKTsKKworCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJLyogV2FpdCBmb3IgdGhlIFBMTCB0byBsb2NrICovCisJZG8geworCQlhZmVfc3RhdHVzID0gcmVhZGwoJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2NvbW1vbl9ibG9ja19zdGF0dXMpOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwl9IHdoaWxlICgoYWZlX3N0YXR1cyAmIDB4MDAwMDEwMDApID09IDApOworCisJaWYgKGlzX2EyKHBkZXYpKSB7CisJCS8qIFNob3J0ZW4gU0FTIFNOVyBsb2NrIHRpbWUgKFJ4TG9jayB0aW1lciB2YWx1ZSBmcm9tIDc2IHVzIHRvIDUwIHVzKSAqLworCQl3cml0ZWwoMHg3YmNjOTZhZCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wwKTsKKwkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJfQorCisJZm9yIChwaHlfaWQgPSAwOyBwaHlfaWQgPCBTQ0lfTUFYX1BIWVM7IHBoeV9pZCsrKSB7CisJCWNvbnN0IHN0cnVjdCBzY2lfcGh5X29lbV9wYXJhbXMgKm9lbV9waHkgPSAmb2VtLT5waHlzW3BoeV9pZF07CisKKwkJaWYgKGlzX2IwKHBkZXYpKSB7CisJCQkgLyogQ29uZmlndXJlIHRyYW5zbWl0dGVyIFNTQyBwYXJhbWV0ZXJzICovCisJCQl3cml0ZWwoMHgwMDAzMDAwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X3NzY19jb250cm9sKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCQl9IGVsc2UgaWYgKGlzX2MwKHBkZXYpKSB7CisJCQkgLyogQ29uZmlndXJlIHRyYW5zbWl0dGVyIFNTQyBwYXJhbWV0ZXJzICovCisJCQl3cml0ZWwoMHgwMDAzMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfc3NjX2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJCS8qCisJCQkgKiBBbGwgZGVmYXVsdHMsIGV4Y2VwdCB0aGUgUmVjZWl2ZSBXb3JkIEFsaWduYW1lbnQvQ29tbWEgRGV0ZWN0CisJCQkgKiBFbmFibGUuLi4uKDB4ZTgwMCkgKi8KKwkJCXdyaXRlbCgweDAwMDA0NTAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfeGN2cl9jb250cm9sMCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBBbGwgZGVmYXVsdHMsIGV4Y2VwdCB0aGUgUmVjZWl2ZSBXb3JkIEFsaWduYW1lbnQvQ29tbWEgRGV0ZWN0CisJCQkgKiBFbmFibGUuLi4uKDB4ZTgwMCkgKi8KKwkJCXdyaXRlbCgweDAwMDA0NTEyLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfeGN2cl9jb250cm9sMCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJd3JpdGVsKDB4MDA1MDEwMEYsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV94Y3ZyX2NvbnRyb2wxKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCQl9CisKKwkJLyoKKwkJICogUG93ZXIgdXAgVFggYW5kIFJYIG91dCBmcm9tIHBvd2VyIGRvd24gKFBXUkROVFggYW5kIFBXUkROUlgpCisJCSAqICYgaW5jcmVhc2UgVFggaW50ICYgZXh0IGJpYXMgMjAlLi4uLigweGU4NWMpICovCisJCWlmIChpc19hMihwZGV2KSkKKwkJCXdyaXRlbCgweDAwMDAwM0YwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfY2hhbm5lbF9jb250cm9sKTsKKwkJZWxzZSBpZiAoaXNfYjAocGRldikpIHsKKwkJCSAvKiBQb3dlciBkb3duIFRYIGFuZCBSWCAoUFdSRE5UWCBhbmQgUFdSRE5SWCkgKi8KKwkJCXdyaXRlbCgweDAwMDAwM0Q3LCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfY2hhbm5lbF9jb250cm9sKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCQkvKgorCQkJICogUG93ZXIgdXAgVFggYW5kIFJYIG91dCBmcm9tIHBvd2VyIGRvd24gKFBXUkROVFggYW5kIFBXUkROUlgpCisJCQkgKiAmIGluY3JlYXNlIFRYIGludCAmIGV4dCBiaWFzIDIwJS4uLi4oMHhlODVjKSAqLworCQkJd3JpdGVsKDB4MDAwMDAzRDQsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9jaGFubmVsX2NvbnRyb2wpOworCQl9IGVsc2UgeworCQkJd3JpdGVsKDB4MDAwMDAxRTcsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9jaGFubmVsX2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJCS8qCisJCQkgKiBQb3dlciB1cCBUWCBhbmQgUlggb3V0IGZyb20gcG93ZXIgZG93biAoUFdSRE5UWCBhbmQgUFdSRE5SWCkKKwkJCSAqICYgaW5jcmVhc2UgVFggaW50ICYgZXh0IGJpYXMgMjAlLi4uLigweGU4NWMpICovCisJCQl3cml0ZWwoMHgwMDAwMDFFNCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX2NoYW5uZWxfY29udHJvbCk7CisJCX0KKwkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJaWYgKGlzX2EyKHBkZXYpKSB7CisJCQkvKiBFbmFibGUgVFggZXF1YWxpemF0aW9uICgweGU4MjQpICovCisJCQl3cml0ZWwoMHgwMDA0MDAwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJCX0KKworCQkvKgorCQkgKiBSRFBJPTB4MChSWCBQb3dlciBPbiksIFJYT09CREVUUEROQz0weDAsIFRQRD0weDAoVFggUG93ZXIgT24pLAorCQkgKiBSREQ9MHgwKFJYIERldGVjdCBFbmFibGVkKSAuLi4uKDB4ZTgwMCkgKi8KKwkJd3JpdGVsKDB4MDAwMDQxMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV94Y3ZyX2NvbnRyb2wwKTsKKwkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJLyogTGVhdmUgREZFL0ZGRSBvbiAqLworCQlpZiAoaXNfYTIocGRldikpCisJCQl3cml0ZWwoMHgzRjExMTAzRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3J4X3NzY19jb250cm9sMCk7CisJCWVsc2UgaWYgKGlzX2IwKHBkZXYpKSB7CisJCQl3cml0ZWwoMHgzRjExMTAzRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3J4X3NzY19jb250cm9sMCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwkJCS8qIEVuYWJsZSBUWCBlcXVhbGl6YXRpb24gKDB4ZTgyNCkgKi8KKwkJCXdyaXRlbCgweDAwMDQwMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfY29udHJvbCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoMHgwMTQwREYwRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3J4X3NzY19jb250cm9sMSk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJd3JpdGVsKDB4M0Y2RjEwM0YsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9yeF9zc2NfY29udHJvbDApOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJCS8qIEVuYWJsZSBUWCBlcXVhbGl6YXRpb24gKDB4ZTgyNCkgKi8KKwkJCXdyaXRlbCgweDAwMDQwMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfY29udHJvbCk7CisJCX0KKworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQl3cml0ZWwob2VtX3BoeS0+YWZlX3R4X2FtcF9jb250cm9sMCwKKwkJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9hbXBfY29udHJvbDApOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQl3cml0ZWwob2VtX3BoeS0+YWZlX3R4X2FtcF9jb250cm9sMSwKKwkJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9hbXBfY29udHJvbDEpOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQl3cml0ZWwob2VtX3BoeS0+YWZlX3R4X2FtcF9jb250cm9sMiwKKwkJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9hbXBfY29udHJvbDIpOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQl3cml0ZWwob2VtX3BoeS0+YWZlX3R4X2FtcF9jb250cm9sMywKKwkJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9hbXBfY29udHJvbDMpOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwl9CisKKwkvKiBUcmFuc2ZlciBjb250cm9sIHRvIHRoZSBQRXMgKi8KKwl3cml0ZWwoMHgwMDAxMGYwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2RmeF9tYXN0ZXJfY29udHJvbDApOworCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9pbml0aWFsaXplX3Bvd2VyX2NvbnRyb2woc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc2NpX2luaXRfdGltZXIoJmlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyLCBwb3dlcl9jb250cm9sX3RpbWVvdXQpOworCisJbWVtc2V0KGlob3N0LT5wb3dlcl9jb250cm9sLnJlcXVlc3RlcnMsIDAsCisJICAgICAgIHNpemVvZihpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzKSk7CisKKwlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX3dhaXRpbmcgPSAwOworCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA9IDA7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWhvc3QtPnNtOworCWVudW0gc2NpX3N0YXR1cyByZXN1bHQgPSBTQ0lfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nIGksIHN0YXRlLCB2YWw7CisKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19SRVNFVCkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiU0NJQyBDb250cm9sbGVyIGluaXRpYWxpemUgb3BlcmF0aW9uIHJlcXVlc3RlZCAiCisJCQkgImluIGludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lDX0lOSVRJQUxJWklORyk7CisKKwlzY2lfaW5pdF90aW1lcigmaWhvc3QtPnBoeV90aW1lciwgcGh5X3N0YXJ0dXBfdGltZW91dCk7CisKKwlpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnQgPSAwOworCWlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwlzY2lfY29udHJvbGxlcl9pbml0aWFsaXplX3Bvd2VyX2NvbnRyb2woaWhvc3QpOworCisJLyoKKwkgKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUgZm9yIEIwIHNpbmNlIHdlIGRvIG5vdCBoYXZlIHRvCisJICogcHJvZ3JhbSB0aGUgQUZFIHJlZ2lzdGVycy4KKwkgKiAvIEB0b2RvIFRoZSBBRkUgc2V0dGluZ3MgYXJlIHN1cHBvc2VkIHRvIGJlIGNvcnJlY3QgZm9yIHRoZSBCMCBidXQKKwkgKiAvICAgICAgIHByZXNlbnRseSB0aGV5IHNlZW0gdG8gYmUgd3JvbmcuICovCisJc2NpX2NvbnRyb2xsZXJfYWZlX2luaXRpYWxpemF0aW9uKGlob3N0KTsKKworCisJLyogVGFrZSB0aGUgaGFyZHdhcmUgb3V0IG9mIHJlc2V0ICovCisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+c29mdF9yZXNldF9jb250cm9sKTsKKworCS8qCisJICogLyBAdG9kbyBQcm92aWRlIG1lYW5pbmdmdWxsIGVycm9yIGNvZGUgZm9yIGhhcmR3YXJlIGZhaWx1cmUKKwkgKiByZXN1bHQgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX0hBUkRXQVJFOyAqLworCWZvciAoaSA9IDEwMDsgaSA+PSAxOyBpLS0pIHsKKwkJdTMyIHN0YXR1czsKKworCQkvKiBMb29wIHVudGlsIHRoZSBoYXJkd2FyZSByZXBvcnRzIHN1Y2Nlc3MgKi8KKwkJdWRlbGF5KFNDVV9DT05URVhUX1JBTV9JTklUX1NUQUxMX1RJTUUpOworCQlzdGF0dXMgPSByZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbnRyb2xfc3RhdHVzKTsKKworCQlpZiAoKHN0YXR1cyAmIFNDVV9SQU1fSU5JVF9DT01QTEVURUQpID09IFNDVV9SQU1fSU5JVF9DT01QTEVURUQpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIERldGVybWluZSB3aGF0IGFyZSB0aGUgYWN0YXVsIGRldmljZSBjYXBhY2l0aWVzIHRoYXQgdGhlCisJICogaGFyZHdhcmUgd2lsbCBzdXBwb3J0ICovCisJdmFsID0gcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5kZXZpY2VfY29udGV4dF9jYXBhY2l0eSk7CisKKwkvKiBSZWNvcmQgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byBjYXBhY2l0eSB2YWx1ZXMgKi8KKwlpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXMgPSBtaW4oc211X21heF9wb3J0cyh2YWwpLCBTQ0lfTUFYX1BPUlRTKTsKKwlpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXMgPSBtaW4oc211X21heF90YXNrX2NvbnRleHRzKHZhbCksIFNDSV9NQVhfSU9fUkVRVUVTVFMpOworCWlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzID0gbWluKHNtdV9tYXhfcm5jcyh2YWwpLCBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTKTsKKworCS8qCisJICogTWFrZSBhbGwgUEVzIHRoYXQgYXJlIHVuYXNzaWduZWQgbWF0Y2ggdXAgd2l0aCB0aGUKKwkgKiBsb2dpY2FsIHBvcnRzCisJICovCisJZm9yIChpID0gMDsgaSA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgX19pb21lbQorCQkJKnB0c2cgPSAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucHRzZzsKKworCQl3cml0ZWwoaSwgJnB0c2ctPnByb3RvY29sX2VuZ2luZVtpXSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSBoYXJkd2FyZSBQQ0kgUmVsYXhlZCBvcmRlcmluZyBpbiBETUEgZW5naW5lcyAqLworCXZhbCA9IHJlYWRsKCZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS5wZG1hX2NvbmZpZ3VyYXRpb24pOworCXZhbCB8PSBTQ1VfUERNQUNSX0dFTl9CSVQoUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFKTsKKwl3cml0ZWwodmFsLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEucGRtYV9jb25maWd1cmF0aW9uKTsKKworCXZhbCA9IHJlYWRsKCZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS5jZG1hX2NvbmZpZ3VyYXRpb24pOworCXZhbCB8PSBTQ1VfQ0RNQUNSX0dFTl9CSVQoUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFKTsKKwl3cml0ZWwodmFsLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEuY2RtYV9jb25maWd1cmF0aW9uKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgUEhZcyBiZWZvcmUgdGhlIFBPUlRzIGJlY2F1c2UgdGhlIFBIWSByZWdpc3RlcnMKKwkgKiBhcmUgYWNjZXNzZWQgZHVyaW5nIHRoZSBwb3J0IGluaXRpYWxpemF0aW9uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCQlyZXN1bHQgPSBzY2lfcGh5X2luaXRpYWxpemUoJmlob3N0LT5waHlzW2ldLAorCQkJCQkgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnBlW2ldLnRsLAorCQkJCQkgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnBlW2ldLmxsKTsKKwkJaWYgKHJlc3VsdCAhPSBTQ0lfU1VDQ0VTUykKKwkJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CisKKwkJaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzID0gJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnB0c2cucG9ydFtpXTsKKwkJaXBvcnQtPnBvcnRfcGVfY29uZmlndXJhdGlvbl9yZWdpc3RlciA9ICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5wdHNnLnByb3RvY29sX2VuZ2luZVswXTsKKwkJaXBvcnQtPnZpaXRfcmVnaXN0ZXJzID0gJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnZpaXRbaV07CisJfQorCisJcmVzdWx0ID0gc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9pbml0aWFsaXplKGlob3N0LCAmaWhvc3QtPnBvcnRfYWdlbnQpOworCisgb3V0OgorCS8qIEFkdmFuY2UgdGhlIGNvbnRyb2xsZXIgc3RhdGUgbWFjaGluZSAqLworCWlmIChyZXN1bHQgPT0gU0NJX1NVQ0NFU1MpCisJCXN0YXRlID0gU0NJQ19JTklUSUFMSVpFRDsKKwllbHNlCisJCXN0YXRlID0gU0NJQ19GQUlMRUQ7CisJc2NpX2NoYW5nZV9zdGF0ZShzbSwgc3RhdGUpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfdXNlcl9wYXJhbWV0ZXJzX3NldChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2lfdXNlcl9wYXJhbWV0ZXJzICpzY2lfcGFybXMpCit7CisJdTMyIHN0YXRlID0gaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgPT0gU0NJQ19SRVNFVCB8fAorCSAgICBzdGF0ZSA9PSBTQ0lDX0lOSVRJQUxJWklORyB8fAorCSAgICBzdGF0ZSA9PSBTQ0lDX0lOSVRJQUxJWkVEKSB7CisJCXUxNiBpbmRleDsKKworCQkvKgorCQkgKiBWYWxpZGF0ZSB0aGUgdXNlciBwYXJhbWV0ZXJzLiAgSWYgdGhleSBhcmUgbm90IGxlZ2FsLCB0aGVuCisJCSAqIHJldHVybiBhIGZhaWx1cmUuCisJCSAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJCXN0cnVjdCBzY2lfcGh5X3VzZXJfcGFyYW1zICp1c2VyX3BoeTsKKworCQkJdXNlcl9waHkgPSAmc2NpX3Bhcm1zLT5waHlzW2luZGV4XTsKKworCQkJaWYgKCEoKHVzZXJfcGh5LT5tYXhfc3BlZWRfZ2VuZXJhdGlvbiA8PQorCQkJCQkJU0NJQ19TRFNfUEFSTV9NQVhfU1BFRUQpICYmCisJCQkgICAgICAodXNlcl9waHktPm1heF9zcGVlZF9nZW5lcmF0aW9uID4KKwkJCQkJCVNDSUNfU0RTX1BBUk1fTk9fU1BFRUQpKSkKKwkJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7CisKKwkJCWlmICh1c2VyX3BoeS0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5IDwKKwkJCQkJMykKKwkJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7CisKKwkJCWlmICgodXNlcl9waHktPmluX2Nvbm5lY3Rpb25fYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSA8CisJCQkJCQkzKSB8fAorCQkJICAgICh1c2VyX3BoeS0+YWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9PSAwKSB8fAorCQkJICAgICh1c2VyX3BoeS0+CisJCQkJbm90aWZ5X2VuYWJsZV9zcGluX3VwX2luc2VydGlvbl9mcmVxdWVuY3kgPT0KKwkJCQkJCTApKQorCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKwkJfQorCisJCWlmICgoc2NpX3Bhcm1zLT5zdHBfaW5hY3Rpdml0eV90aW1lb3V0ID09IDApIHx8CisJCSAgICAoc2NpX3Bhcm1zLT5zc3BfaW5hY3Rpdml0eV90aW1lb3V0ID09IDApIHx8CisJCSAgICAoc2NpX3Bhcm1zLT5zdHBfbWF4X29jY3VwYW5jeV90aW1lb3V0ID09IDApIHx8CisJCSAgICAoc2NpX3Bhcm1zLT5zc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0ID09IDApIHx8CisJCSAgICAoc2NpX3Bhcm1zLT5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQgPT0gMCkpCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7CisKKwkJbWVtY3B5KCZpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLCBzY2lfcGFybXMsIHNpemVvZigqc2NpX3Bhcm1zKSk7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworfQorCitzdGF0aWMgaW50IHNjaV9jb250cm9sbGVyX21lbV9pbml0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpaG9zdC0+cGRldi0+ZGV2OworCWRtYV9hZGRyX3QgZG1hOworCXNpemVfdCBzaXplOworCWludCBlcnI7CisKKwlzaXplID0gU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMgKiBzaXplb2YodTMyKTsKKwlpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAmZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGRtYSksICZpaG9zdC0+c211X3JlZ2lzdGVycy0+Y29tcGxldGlvbl9xdWV1ZV9sb3dlcik7CisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoZG1hKSwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX3VwcGVyKTsKKworCXNpemUgPSBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllcyAqIHNpemVvZih1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCk7CisJaWhvc3QtPnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGUgPSBkbWFtX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJmRtYSwKKwkJCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3cml0ZWwobG93ZXJfMzJfYml0cyhkbWEpLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPnJlbW90ZV9ub2RlX2NvbnRleHRfbG93ZXIpOworCXdyaXRlbCh1cHBlcl8zMl9iaXRzKGRtYSksICZpaG9zdC0+c211X3JlZ2lzdGVycy0+cmVtb3RlX25vZGVfY29udGV4dF91cHBlcik7CisKKwlzaXplID0gaWhvc3QtPnRhc2tfY29udGV4dF9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBzY3VfdGFza19jb250ZXh0KSwKKwlpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlID0gZG1hbV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICZkbWEsIEdGUF9LRVJORUwpOworCWlmICghaWhvc3QtPnRhc2tfY29udGV4dF90YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpaG9zdC0+dGFza19jb250ZXh0X2RtYSA9IGRtYTsKKwl3cml0ZWwobG93ZXJfMzJfYml0cyhkbWEpLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmhvc3RfdGFza190YWJsZV9sb3dlcik7CisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoZG1hKSwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5ob3N0X3Rhc2tfdGFibGVfdXBwZXIpOworCisJZXJyID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfY29uc3RydWN0KGlob3N0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBJbmZvcm0gdGhlIHNpbGljb24gYXMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBVRiBoZWFkZXJzIGFuZAorCSAqIGFkZHJlc3MgdGFibGUuCisJICovCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoaWhvc3QtPnVmX2NvbnRyb2wuaGVhZGVycy5waHlzaWNhbF9hZGRyZXNzKSwKKwkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVmX2hlYWRlcl9iYXNlX2FkZHJlc3NfbG93ZXIpOworCXdyaXRlbCh1cHBlcl8zMl9iaXRzKGlob3N0LT51Zl9jb250cm9sLmhlYWRlcnMucGh5c2ljYWxfYWRkcmVzcyksCisJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51Zl9oZWFkZXJfYmFzZV9hZGRyZXNzX3VwcGVyKTsKKworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGlob3N0LT51Zl9jb250cm9sLmFkZHJlc3NfdGFibGUucGh5c2ljYWxfYWRkcmVzcyksCisJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51Zl9hZGRyZXNzX3RhYmxlX2xvd2VyKTsKKwl3cml0ZWwodXBwZXJfMzJfYml0cyhpaG9zdC0+dWZfY29udHJvbC5hZGRyZXNzX3RhYmxlLnBoeXNpY2FsX2FkZHJlc3MpLAorCQkmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudWZfYWRkcmVzc190YWJsZV91cHBlcik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlzY2lfaG9zdF9pbml0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCWludCBlcnIgPSAwLCBpOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgc2NpX3VzZXJfcGFyYW1zOworCXN0cnVjdCBpc2NpX3BjaV9pbmZvICpwY2lfaW5mbyA9IHRvX3BjaV9pbmZvKGlob3N0LT5wZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZpaG9zdC0+c3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlob3N0LT5zY2ljX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlob3N0LT5ldmVudHEpOworCisJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9zdGFydGluZyk7CisKKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9jb25zdHJ1Y3QoaWhvc3QsIHNjdV9iYXNlKGlob3N0KSwKKwkJCQkJICBzbXVfYmFzZShpaG9zdCkpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBzY2lfY29udHJvbGxlcl9jb25zdHJ1Y3QgZmFpbGVkIC0gc3RhdHVzID0gJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXN0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlob3N0LT5zYXNfaGEuZGV2ID0gJmlob3N0LT5wZGV2LT5kZXY7CisJaWhvc3QtPnNhc19oYS5sbGRkX2hhID0gaWhvc3Q7CisKKwkvKgorCSAqIGdyYWIgaW5pdGlhbCB2YWx1ZXMgc3RvcmVkIGluIHRoZSBjb250cm9sbGVyIG9iamVjdCBmb3IgT0VNIGFuZCBVU0VSCisJICogcGFyYW1ldGVycworCSAqLworCWlzY2lfdXNlcl9wYXJhbWV0ZXJzX2dldCgmc2NpX3VzZXJfcGFyYW1zKTsKKwlzdGF0dXMgPSBzY2lfdXNlcl9wYXJhbWV0ZXJzX3NldChpaG9zdCwgJnNjaV91c2VyX3BhcmFtcyk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV91c2VyX3BhcmFtZXRlcnNfc2V0IGZhaWxlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGdyYWIgYW55IE9FTSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBvcm9tICovCisJaWYgKHBjaV9pbmZvLT5vcm9tKSB7CisJCXN0YXR1cyA9IGlzY2lfcGFyc2Vfb2VtX3BhcmFtZXRlcnMoJmlob3N0LT5vZW1fcGFyYW1ldGVycywKKwkJCQkJCSAgIHBjaV9pbmZvLT5vcm9tLAorCQkJCQkJICAgaWhvc3QtPmlkKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICJwYXJzaW5nIGZpcm13YXJlIG9lbSBwYXJhbWV0ZXJzIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXN0YXR1cyA9IHNjaV9vZW1fcGFyYW1ldGVyc19zZXQoaWhvc3QpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBzY2lfb2VtX3BhcmFtZXRlcnNfc2V0IGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXRhc2tsZXRfaW5pdCgmaWhvc3QtPmNvbXBsZXRpb25fdGFza2xldCwKKwkJICAgICBpc2NpX2hvc3RfY29tcGxldGlvbl9yb3V0aW5lLCAodW5zaWduZWQgbG9uZylpaG9zdCk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWhvc3QtPnJlcXVlc3RzX3RvX2NvbXBsZXRlKTsKKwlJTklUX0xJU1RfSEVBRCgmaWhvc3QtPnJlcXVlc3RzX3RvX2Vycm9yYmFjayk7CisKKwlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9pbml0aWFsaXplKGlob3N0KTsKKwlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBzY2lfY29udHJvbGxlcl9pbml0aWFsaXplIGZhaWxlZCAtIgorCQkJICIgc3RhdHVzID0gMHgleFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXJyID0gc2NpX2NvbnRyb2xsZXJfbWVtX2luaXQoaWhvc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QT1JUUzsgaSsrKQorCQlpc2NpX3BvcnRfaW5pdCgmaWhvc3QtPnBvcnRzW2ldLCBpaG9zdCwgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspCisJCWlzY2lfcGh5X2luaXQoJmlob3N0LT5waHlzW2ldLCBpaG9zdCwgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9SRU1PVEVfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSAmaWhvc3QtPmRldmljZXNbaV07CisKKwkJSU5JVF9MSVNUX0hFQUQoJmlkZXYtPnJlcXNfaW5fcHJvY2Vzcyk7CisJCUlOSVRfTElTVF9IRUFEKCZpZGV2LT5ub2RlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9JT19SRVFVRVNUUzsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisJCWRtYV9hZGRyX3QgZG1hOworCisJCWlyZXEgPSBkbWFtX2FsbG9jX2NvaGVyZW50KCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkgICBzaXplb2Yoc3RydWN0IGlzY2lfcmVxdWVzdCksICZkbWEsCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQlpZiAoIWlyZXEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpcmVxLT50YyA9ICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlW2ldOworCQlpcmVxLT5vd25pbmdfY29udHJvbGxlciA9IGlob3N0OworCQlzcGluX2xvY2tfaW5pdCgmaXJlcS0+c3RhdGVfbG9jayk7CisJCWlyZXEtPnJlcXVlc3RfZGFkZHIgPSBkbWE7CisJCWlyZXEtPmlzY2lfaG9zdCA9IGlob3N0OworCQlpaG9zdC0+cmVxc1tpXSA9IGlyZXE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfbGlua191cChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXN3aXRjaCAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpIHsKKwljYXNlIFNDSUNfU1RBUlRJTkc6CisJCXNjaV9kZWxfdGltZXIoJmlob3N0LT5waHlfdGltZXIpOworCQlpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCQlpaG9zdC0+cG9ydF9hZ2VudC5saW5rX3VwX2hhbmRsZXIoaWhvc3QsICZpaG9zdC0+cG9ydF9hZ2VudCwKKwkJCQkJCSAgaXBvcnQsIGlwaHkpOworCQlzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeShpaG9zdCk7CisJCWJyZWFrOworCWNhc2UgU0NJQ19SRUFEWToKKwkJaWhvc3QtPnBvcnRfYWdlbnQubGlua191cF9oYW5kbGVyKGlob3N0LCAmaWhvc3QtPnBvcnRfYWdlbnQsCisJCQkJCQkgIGlwb3J0LCBpcGh5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBDb250cm9sbGVyIGxpbmt1cCBldmVudCBmcm9tIHBoeSAlZCBpbiAiCisJCQkidW5leHBlY3RlZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIGlwaHktPnBoeV9pbmRleCwKKwkJCWlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkKTsKKwl9Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfbGlua19kb3duKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCSAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlzd2l0Y2ggKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkKSB7CisJY2FzZSBTQ0lDX1NUQVJUSU5HOgorCWNhc2UgU0NJQ19SRUFEWToKKwkJaWhvc3QtPnBvcnRfYWdlbnQubGlua19kb3duX2hhbmRsZXIoaWhvc3QsICZpaG9zdC0+cG9ydF9hZ2VudCwKKwkJCQkJCSAgIGlwb3J0LCBpcGh5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBDb250cm9sbGVyIGxpbmtkb3duIGV2ZW50IGZyb20gcGh5ICVkIGluICIKKwkJCSJ1bmV4cGVjdGVkIHN0YXRlICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlpcGh5LT5waHlfaW5kZXgsCisJCQlpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCk7CisJfQorfQorCitzdGF0aWMgYm9vbCBzY2lfY29udHJvbGxlcl9oYXNfcmVtb3RlX2RldmljZXNfc3RvcHBpbmcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXM7IGluZGV4KyspIHsKKwkJaWYgKChpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XSAhPSBOVUxMKSAmJgorCQkgICAoaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF0tPnNtLmN1cnJlbnRfc3RhdGVfaWQgPT0gU0NJX0RFVl9TVE9QUElORykpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcmVtb3RlX2RldmljZV9zdG9wcGVkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfU1RPUFBJTkcpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSJTQ0lDIENvbnRyb2xsZXIgMHglcCByZW1vdGUgZGV2aWNlIHN0b3BwZWQgZXZlbnQgIgorCQkJImZyb20gZGV2aWNlIDB4JXAgaW4gdW5leHBlY3RlZCBzdGF0ZSAlZFxuIiwKKwkJCWlob3N0LCBpZGV2LAorCQkJaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFzY2lfY29udHJvbGxlcl9oYXNfcmVtb3RlX2RldmljZXNfc3RvcHBpbmcoaWhvc3QpKQorCQlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfU1RPUFBFRCk7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgcmVxdWVzdCkKK3sKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXNbJWRdOiAlI3hcbiIsCisJCV9fZnVuY19fLCBpaG9zdC0+aWQsIHJlcXVlc3QpOworCisJd3JpdGVsKHJlcXVlc3QsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+cG9zdF9jb250ZXh0X3BvcnQpOworfQorCitzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpzY2lfcmVxdWVzdF9ieV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiBpb190YWcpCit7CisJdTE2IHRhc2tfaW5kZXg7CisJdTE2IHRhc2tfc2VxdWVuY2U7CisKKwl0YXNrX2luZGV4ID0gSVNDSV9UQUdfVENJKGlvX3RhZyk7CisKKwlpZiAodGFza19pbmRleCA8IGlob3N0LT50YXNrX2NvbnRleHRfZW50cmllcykgeworCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gaWhvc3QtPnJlcXNbdGFza19pbmRleF07CisKKwkJaWYgKHRlc3RfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpKSB7CisJCQl0YXNrX3NlcXVlbmNlID0gSVNDSV9UQUdfU0VRKGlvX3RhZyk7CisKKwkJCWlmICh0YXNrX3NlcXVlbmNlID09IGlob3N0LT5pb19yZXF1ZXN0X3NlcXVlbmNlW3Rhc2tfaW5kZXhdKQorCQkJCXJldHVybiBpcmVxOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgYWxsb2NhdGVzIHJlbW90ZSBub2RlIGluZGV4IGFuZCB0aGUgcmVzZXJ2ZXMgdGhlIHJlbW90ZSBub2RlCisgKiAgICBjb250ZXh0IHNwYWNlIGZvciB1c2UuIFRoaXMgbWV0aG9kIGNhbiBmYWlsIGlmIHRoZXJlIGFyZSBubyBtb3JlIHJlbW90ZQorICogICAgbm9kZSBpbmRleCBhdmFpbGFibGUuCisgKiBAc2NpYzogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHNldCBvZgorICogICAgZnJlZSByZW1vdGUgbm9kZSBpZHMKKyAqIEBzY2lfZGV2OiBUaGlzIGlzIHRoZSBkZXZpY2Ugb2JqZWN0IHdoaWNoIGlzIHJlcXVlc3RpbmcgdGhlIGEgcmVtb3RlIG5vZGUKKyAqICAgIGlkCisgKiBAbm9kZV9pZDogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgaWQgdGhhdCBpcyBhc3NpbmdlZCB0byB0aGUgZGV2aWNlIGlmIG9uZQorICogICAgaXMgYXZhaWxhYmxlCisgKgorICogZW51bSBzY2lfc3RhdHVzIFNDSV9GQUlMVVJFX09VVF9PRl9SRVNPVVJDRVMgaWYgdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSByZW1vdGUKKyAqIG5vZGUgaW5kZXggYXZhaWxhYmxlLgorICovCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfYWxsb2NhdGVfcmVtb3RlX25vZGVfY29udGV4dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCQkgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCQkgICAgdTE2ICpub2RlX2lkKQoreworCXUxNiBub2RlX2luZGV4OworCXUzMiByZW1vdGVfbm9kZV9jb3VudCA9IHNjaV9yZW1vdGVfZGV2aWNlX25vZGVfY291bnQoaWRldik7CisKKwlub2RlX2luZGV4ID0gc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3JlbW90ZV9ub2RlKAorCQkmaWhvc3QtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXMsIHJlbW90ZV9ub2RlX2NvdW50CisJCSk7CisKKwlpZiAobm9kZV9pbmRleCAhPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpIHsKKwkJaWhvc3QtPmRldmljZV90YWJsZVtub2RlX2luZGV4XSA9IGlkZXY7CisKKwkJKm5vZGVfaWQgPSBub2RlX2luZGV4OworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9mcmVlX3JlbW90ZV9ub2RlX2NvbnRleHQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJICAgICB1MTYgbm9kZV9pZCkKK3sKKwl1MzIgcmVtb3RlX25vZGVfY291bnQgPSBzY2lfcmVtb3RlX2RldmljZV9ub2RlX2NvdW50KGlkZXYpOworCisJaWYgKGlob3N0LT5kZXZpY2VfdGFibGVbbm9kZV9pZF0gPT0gaWRldikgeworCQlpaG9zdC0+ZGV2aWNlX3RhYmxlW25vZGVfaWRdID0gTlVMTDsKKworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9yZW1vdGVfbm9kZV9pbmRleCgKKwkJCSZpaG9zdC0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywgcmVtb3RlX25vZGVfY291bnQsIG5vZGVfaWQKKwkJCSk7CisJfQorfQorCit2b2lkIHNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSh2b2lkICpyZXNwb25zZV9idWZmZXIsCisJCQkJICAgICAgIHZvaWQgKmZyYW1lX2hlYWRlciwKKwkJCQkgICAgICAgdm9pZCAqZnJhbWVfYnVmZmVyKQoreworCS8qIFhYWCB0eXBlIHNhZmV0eT8gKi8KKwltZW1jcHkocmVzcG9uc2VfYnVmZmVyLCBmcmFtZV9oZWFkZXIsIHNpemVvZih1MzIpKTsKKworCW1lbWNweShyZXNwb25zZV9idWZmZXIgKyBzaXplb2YodTMyKSwKKwkgICAgICAgZnJhbWVfYnVmZmVyLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2ZpcykgLSBzaXplb2YodTMyKSk7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTMyIGZyYW1lX2luZGV4KQoreworCWlmIChzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9yZWxlYXNlX2ZyYW1lKCZpaG9zdC0+dWZfY29udHJvbCwgZnJhbWVfaW5kZXgpKQorCQl3cml0ZWwoaWhvc3QtPnVmX2NvbnRyb2wuZ2V0LAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX2dldF9wb2ludGVyKTsKK30KKwordm9pZCBpc2NpX3RjaV9mcmVlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MTYgdGNpKQoreworCXUxNiB0YWlsID0gaWhvc3QtPnRjaV90YWlsICYgKFNDSV9NQVhfSU9fUkVRVUVTVFMtMSk7CisKKwlpaG9zdC0+dGNpX3Bvb2xbdGFpbF0gPSB0Y2k7CisJaWhvc3QtPnRjaV90YWlsID0gdGFpbCArIDE7Cit9CisKK3N0YXRpYyB1MTYgaXNjaV90Y2lfYWxsb2Moc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTE2IGhlYWQgPSBpaG9zdC0+dGNpX2hlYWQgJiAoU0NJX01BWF9JT19SRVFVRVNUUy0xKTsKKwl1MTYgdGNpID0gaWhvc3QtPnRjaV9wb29sW2hlYWRdOworCisJaWhvc3QtPnRjaV9oZWFkID0gaGVhZCArIDE7CisJcmV0dXJuIHRjaTsKK30KKworc3RhdGljIHUxNiBpc2NpX3RjaV9zcGFjZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlyZXR1cm4gQ0lSQ19TUEFDRShpaG9zdC0+dGNpX2hlYWQsIGlob3N0LT50Y2lfdGFpbCwgU0NJX01BWF9JT19SRVFVRVNUUyk7Cit9CisKK3UxNiBpc2NpX2FsbG9jX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlpZiAoaXNjaV90Y2lfc3BhY2UoaWhvc3QpKSB7CisJCXUxNiB0Y2kgPSBpc2NpX3RjaV9hbGxvYyhpaG9zdCk7CisJCXU4IHNlcSA9IGlob3N0LT5pb19yZXF1ZXN0X3NlcXVlbmNlW3RjaV07CisKKwkJcmV0dXJuIElTQ0lfVEFHKHNlcSwgdGNpKTsKKwl9CisKKwlyZXR1cm4gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUc7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBpc2NpX2ZyZWVfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MTYgaW9fdGFnKQoreworCXUxNiB0Y2kgPSBJU0NJX1RBR19UQ0koaW9fdGFnKTsKKwl1MTYgc2VxID0gSVNDSV9UQUdfU0VRKGlvX3RhZyk7CisKKwkvKiBwcmV2ZW50IHRhaWwgZnJvbSBwYXNzaW5nIGhlYWQgKi8KKwlpZiAoaXNjaV90Y2lfYWN0aXZlKGlob3N0KSA9PSAwKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9JT19UQUc7CisKKwlpZiAoc2VxID09IGlob3N0LT5pb19yZXF1ZXN0X3NlcXVlbmNlW3RjaV0pIHsKKwkJaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGNpXSA9IChzZXErMSkgJiAoU0NJX01BWF9TRVEtMSk7CisKKwkJaXNjaV90Y2lfZnJlZShpaG9zdCwgdGNpKTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX0lPX1RBRzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X2lvKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19SRUFEWSkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgImludmFsaWQgc3RhdGUgdG8gc3RhcnQgSS9PIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X2lvKGlob3N0LCBpZGV2LCBpcmVxKTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc2V0X2JpdChJUkVRX0FDVElWRSwgJmlyZXEtPmZsYWdzKTsKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGlyZXEtPnBvc3RfY29udGV4dCk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQkgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCS8qIHRlcm1pbmF0ZSBhbiBvbmdvaW5nIChpLmUuIHN0YXJ0ZWQpIGNvcmUgSU8gcmVxdWVzdC4gIFRoaXMgZG9lcyBub3QKKwkgKiBhYm9ydCB0aGUgSU8gcmVxdWVzdCBhdCB0aGUgdGFyZ2V0LCBidXQgcmF0aGVyIHJlbW92ZXMgdGhlIElPCisJICogcmVxdWVzdCBmcm9tIHRoZSBob3N0IGNvbnRyb2xsZXIuCisJICovCisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX1JFQURZKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICJpbnZhbGlkIHN0YXRlIHRvIHRlcm1pbmF0ZSByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfdGVybWluYXRlKGlyZXEpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKgorCSAqIFV0aWxpemUgdGhlIG9yaWdpbmFsIHBvc3QgY29udGV4dCBjb21tYW5kIGFuZCBvciBpbiB0aGUgUE9TVF9UQ19BQk9SVAorCSAqIHJlcXVlc3Qgc3ViLXR5cGUuCisJICovCisJc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KGlob3N0LAorCQkJCSAgICBpcmVxLT5wb3N0X2NvbnRleHQgfCBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfUE9TVF9UQ19BQk9SVCk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9jb250cm9sbGVyX2NvbXBsZXRlX2lvKCkgLSBUaGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gY29yZSBzcGVjaWZpYworICogICAgY29tcGxldGlvbiBvcGVyYXRpb25zIGZvciBhbiBJTyByZXF1ZXN0LiAgQWZ0ZXIgdGhpcyBtZXRob2QgaXMgaW52b2tlZCwKKyAqICAgIHRoZSB1c2VyIHNob3VsZCBjb25zaWRlciB0aGUgSU8gcmVxdWVzdCBhcyBpbnZhbGlkIHVudGlsIGl0IGlzIHByb3Blcmx5CisgKiAgICByZXVzZWQgKGkuZS4gcmUtY29uc3RydWN0ZWQpLgorICogQGlob3N0OiBUaGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCBmb3Igd2hpY2ggdG8gY29tcGxldGUgdGhlCisgKiAgICBJTyByZXF1ZXN0LgorICogQGlkZXY6IFRoZSBoYW5kbGUgdG8gdGhlIHJlbW90ZSBkZXZpY2Ugb2JqZWN0IGZvciB3aGljaCB0byBjb21wbGV0ZQorICogICAgdGhlIElPIHJlcXVlc3QuCisgKiBAaXJlcTogdGhlIGhhbmRsZSB0byB0aGUgaW8gcmVxdWVzdCBvYmplY3QgdG8gY29tcGxldGUuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb21wbGV0ZV9pbyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXUxNiBpbmRleDsKKworCXN3aXRjaCAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpIHsKKwljYXNlIFNDSUNfU1RPUFBJTkc6CisJCS8qIFhYWDogSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gKi8KKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCWNhc2UgU0NJQ19SRUFEWToKKwkJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2VfY29tcGxldGVfaW8oaWhvc3QsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpbmRleCA9IElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpOworCQljbGVhcl9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgImludmFsaWQgc3RhdGUgdG8gY29tcGxldGUgSS9PIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfY29udGludWVfaW8oc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlyZXEtPm93bmluZ19jb250cm9sbGVyOworCisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICJpbnZhbGlkIHN0YXRlIHRvIGNvbnRpbnVlIEkvTyIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzZXRfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpOworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgaXJlcS0+cG9zdF9jb250ZXh0KTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfc3RhcnRfdGFzaygpIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBTQ0lDIHVzZXIgdG8KKyAqICAgIHNlbmQvc3RhcnQgYSBmcmFtZXdvcmsgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QuCisgKiBAY29udHJvbGxlcjogdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QgZm9yIHdoaWNoIHRvIHN0YXJ0IHRoZSB0YXNrCisgKiAgICBtYW5hZ2VtZW50IHJlcXVlc3QuCisgKiBAcmVtb3RlX2RldmljZTogdGhlIGhhbmRsZSB0byB0aGUgcmVtb3RlIGRldmljZSBvYmplY3QgZm9yIHdoaWNoIHRvIHN0YXJ0CisgKiAgICB0aGUgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QuCisgKiBAdGFza19yZXF1ZXN0OiB0aGUgaGFuZGxlIHRvIHRoZSB0YXNrIHJlcXVlc3Qgb2JqZWN0IHRvIHN0YXJ0LgorICovCitlbnVtIHNjaV90YXNrX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX1JFQURZKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogU0NJQyBDb250cm9sbGVyIHN0YXJ0aW5nIHRhc2sgZnJvbSBpbnZhbGlkICIKKwkJCSAic3RhdGVcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gU0NJX1RBU0tfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3Rhc2soaWhvc3QsIGlkZXYsIGlyZXEpOworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBTQ0lfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTOgorCQlzZXRfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpOworCisJCS8qCisJCSAqIFdlIHdpbGwgbGV0IGZyYW1ld29yayBrbm93IHRoaXMgdGFzayByZXF1ZXN0IHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LAorCQkgKiBhbHRob3VnaCBjb3JlIGlzIHN0aWxsIHdvcmluZyBvbiBzdGFydGluZyB0aGUgcmVxdWVzdCAodG8gcG9zdCB0YyB3aGVuCisJCSAqIFJOQyBpcyByZXN1bWVkLikKKwkJICovCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9TVUNDRVNTOgorCQlzZXRfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpOworCQlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGlyZXEtPnBvc3RfY29udGV4dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyMTAxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaApAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX1NDSV9IT1NUX0hfCisjZGVmaW5lIF9TQ0lfSE9TVF9IXworCisjaW5jbHVkZSAicmVtb3RlX2RldmljZS5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJyZW1vdGVfbm9kZV90YWJsZS5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgInVuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJwcm9iZV9yb21zLmgiCisKK3N0cnVjdCBpc2NpX3JlcXVlc3Q7CitzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dDsKKworCisvKioKKyAqIHN0cnVjdCBzY2lfcG93ZXJfY29udHJvbCAtCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZmllbGRzIGZvciBtYW5hZ2luZyBwb3dlciBjb250cm9sIGZvciBkaXJlY3QKKyAqIGF0dGFjaGVkIGRpc2sgZGV2aWNlcy4KKyAqLworc3RydWN0IHNjaV9wb3dlcl9jb250cm9sIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB3aGVuIHRoZSBwb3dlciBjb250cm9sIHRpbWVyIGlzIHJ1bm5pbmcgYW5kIGNsZWFyZWQgd2hlbgorCSAqIGl0IGlzIG5vdC4KKwkgKi8KKwlib29sIHRpbWVyX3N0YXJ0ZWQ7CisKKwkvKioKKwkgKiBUaW1lciB0byBjb250cm9sIHdoZW4gdGhlIGRpcmVjdGVkIGF0dGFjaGVkIGRpc2tzIGNhbiBjb25zdW1lIHBvd2VyLgorCSAqLworCXN0cnVjdCBzY2lfdGltZXIgdGltZXI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBwaHlzIGFyZSBwdXQgaW50byB0aGUKKwkgKiByZXF1ZXN0ZXJzIGZpZWxkLgorCSAqLworCXU4IHBoeXNfd2FpdGluZzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHBoeXMgaGF2ZSBiZWVuIGdyYW50ZWQgdG8gY29uc3VtZSBwb3dlcgorCSAqLworCXU4IHBoeXNfZ3JhbnRlZF9wb3dlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgYW4gYXJyYXkgb2YgcGh5cyB0aGF0IHdlIGFyZSB3YWl0aW5nIG9uLiBUaGUgcGh5cyBhcmUgZGlyZWN0CisJICogbWFwcGVkIGludG8gcmVxdWVzdGVycyB2aWEgc3RydWN0IHNjaV9waHkucGh5X2luZGV4CisJICovCisJc3RydWN0IGlzY2lfcGh5ICpyZXF1ZXN0ZXJzW1NDSV9NQVhfUEhZU107CisKK307CisKK3N0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50OwordHlwZWRlZiB2b2lkICgqcG9ydF9jb25maWdfZm4pKHN0cnVjdCBpc2NpX2hvc3QgKiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqLAorCQkJICAgICAgIHN0cnVjdCBpc2NpX3BvcnQgKiwgc3RydWN0IGlzY2lfcGh5ICopOworCitzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCB7CisJdTE2IHBoeV9jb25maWd1cmVkX21hc2s7CisJdTE2IHBoeV9yZWFkeV9tYXNrOworCXN0cnVjdCB7CisJCXU4IG1pbl9pbmRleDsKKwkJdTggbWF4X2luZGV4OworCX0gcGh5X3ZhbGlkX3BvcnRfcmFuZ2VbU0NJX01BWF9QSFlTXTsKKwlib29sIHRpbWVyX3BlbmRpbmc7CisJcG9ydF9jb25maWdfZm4gbGlua191cF9oYW5kbGVyOworCXBvcnRfY29uZmlnX2ZuIGxpbmtfZG93bl9oYW5kbGVyOworCXN0cnVjdCBzY2lfdGltZXIJdGltZXI7Cit9OworCisvKioKKyAqIGlzY2lfaG9zdCAtIHByaW1hcnkgaG9zdC9jb250cm9sbGVyIG9iamVjdAorICogQHRpbWVyOiB0aW1lb3V0IHN0YXJ0L3N0b3Agb3BlcmF0aW9ucworICogQGRldmljZV90YWJsZTogcm5pIChodyByZW1vdGUgbm9kZSBpbmRleCkgdG8gcmVtb3RlIGRldmljZSBsb29rdXAgdGFibGUKKyAqIEBhdmFpbGFibGVfcmVtb3RlX25vZGVzOiBybmkgYWxsb2NhdG9yCisgKiBAcG93ZXJfY29udHJvbDogbWFuYWdlIGRldmljZSBzcGluIHVwCisgKiBAaW9fcmVxdWVzdF9zZXF1ZW5jZTogZ2VuZXJhdGlvbiBudW1iZXIgZm9yIHRjaSdzICh0YXNrIGNvbnRleHRzKQorICogQHRhc2tfY29udGV4dF90YWJsZTogaHcgdGFzayBjb250ZXh0IHRhYmxlCisgKiBAcmVtb3RlX25vZGVfY29udGV4dF90YWJsZTogaHcgcmVtb3RlIG5vZGUgY29udGV4dCB0YWJsZQorICogQGNvbXBsZXRpb25fcXVldWU6IGh3LXByb2R1Y2VyIGRyaXZlci1jb25zdW1lciBjb21tdW5pY2F0aW9uIHJpbmcKKyAqIEBjb21wbGV0aW9uX3F1ZXVlX2dldDogdHJhY2tzIHRoZSBkcml2ZXIgJ2hlYWQnIG9mIHRoZSByaW5nIHRvIG5vdGlmeSBodworICogQGxvZ2ljYWxfcG9ydF9lbnRyaWVzOiBtaW4oe2RyaXZlcnxzaWxpY29ufS1zdXBwb3J0ZWQtcG9ydC1jb3VudCkKKyAqIEByZW1vdGVfbm9kZV9lbnRyaWVzOiBtaW4oe2RyaXZlcnxzaWxpY29ufS1zdXBwb3J0ZWQtbm9kZS1jb3VudCkKKyAqIEB0YXNrX2NvbnRleHRfZW50cmllczogbWluKHtkcml2ZXJ8c2lsaWNvbn0tc3VwcG9ydGVkLXRhc2stY291bnQpCisgKiBAcGh5X3RpbWVyOiBwaHkgc3RhcnR1cCB0aW1lcgorICogQGludmFsaWRfcGh5X21hc2s6IGlmIGFuIGludmFsaWRfbGlua191cCBub3RpZmljYXRpb24gaXMgcmVwb3J0ZWQgYSBiaXQgZm9yCisgKiAJCSAgICAgIHRoZSBwaHkgaW5kZXggaXMgc2V0IHNvIGZ1cnRoZXIgbm90aWZpY2F0aW9ucyBhcmUgbm90CisgKiAJCSAgICAgIG1hZGUuICBPbmNlIHRoZSBwaHkgcmVwb3J0cyBsaW5rIHVwIGFuZCBpcyBtYWRlIHBhcnQgb2YgYQorICogCQkgICAgICBwb3J0IHRoZW4gdGhpcyBiaXQgaXMgY2xlYXJlZC4KKworICovCitzdHJ1Y3QgaXNjaV9ob3N0IHsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwkvKiBYWFggY2FuIHdlIHRpbWUgdGhpcyBleHRlcm5hbGx5ICovCisJc3RydWN0IHNjaV90aW1lciB0aW1lcjsKKwkvKiBYWFggZHJvcCByZWZlcmVuY2UgbW9kdWxlIHBhcmFtcyBkaXJlY3RseSAqLworCXN0cnVjdCBzY2lfdXNlcl9wYXJhbWV0ZXJzIHVzZXJfcGFyYW1ldGVyczsKKwkvKiBYWFggbm8gbmVlZCB0byBiZSBhIHVuaW9uICovCisJc3RydWN0IHNjaV9vZW1fcGFyYW1zIG9lbV9wYXJhbWV0ZXJzOworCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50IHBvcnRfYWdlbnQ7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqZGV2aWNlX3RhYmxlW1NDSV9NQVhfUkVNT1RFX0RFVklDRVNdOworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgYXZhaWxhYmxlX3JlbW90ZV9ub2RlczsKKwlzdHJ1Y3Qgc2NpX3Bvd2VyX2NvbnRyb2wgcG93ZXJfY29udHJvbDsKKwl1OCBpb19yZXF1ZXN0X3NlcXVlbmNlW1NDSV9NQVhfSU9fUkVRVUVTVFNdOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHRfdGFibGU7CisJZG1hX2FkZHJfdCB0YXNrX2NvbnRleHRfZG1hOworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpyZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlOworCXUzMiAqY29tcGxldGlvbl9xdWV1ZTsKKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9nZXQ7CisJdTMyIGxvZ2ljYWxfcG9ydF9lbnRyaWVzOworCXUzMiByZW1vdGVfbm9kZV9lbnRyaWVzOworCXUzMiB0YXNrX2NvbnRleHRfZW50cmllczsKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgdWZfY29udHJvbDsKKworCS8qIHBoeSBzdGFydHVwICovCisJc3RydWN0IHNjaV90aW1lciBwaHlfdGltZXI7CisJLyogWFhYIGtpbGwgKi8KKwlib29sIHBoeV9zdGFydHVwX3RpbWVyX3BlbmRpbmc7CisJdTMyIG5leHRfcGh5X3RvX3N0YXJ0OworCS8qIFhYWCBjb252ZXJ0IHRvIHVuc2lnbmVkIGxvbmcgYW5kIHVzZSBiaXRvcHMgKi8KKwl1OCBpbnZhbGlkX3BoeV9tYXNrOworCisJLyogVE9ETyBhdHRlbXB0IGR5bmFtaWMgaW50ZXJydXB0IGNvYWxlc2Npbmcgc2NoZW1lICovCisJdTE2IGludGVycnVwdF9jb2FsZXNjZV9udW1iZXI7CisJdTMyIGludGVycnVwdF9jb2FsZXNjZV90aW1lb3V0OworCXN0cnVjdCBzbXVfcmVnaXN0ZXJzIF9faW9tZW0gKnNtdV9yZWdpc3RlcnM7CisJc3RydWN0IHNjdV9yZWdpc3RlcnMgX19pb21lbSAqc2N1X3JlZ2lzdGVyczsKKworCXUxNiB0Y2lfaGVhZDsKKwl1MTYgdGNpX3RhaWw7CisJdTE2IHRjaV9wb29sW1NDSV9NQVhfSU9fUkVRVUVTVFNdOworCisJaW50IGlkOyAvKiB1bmlxdWUgd2l0aGluIGEgZ2l2ZW4gcGNpIGRldmljZSAqLworCXN0cnVjdCBpc2NpX3BoeSBwaHlzW1NDSV9NQVhfUEhZU107CisJc3RydWN0IGlzY2lfcG9ydCBwb3J0c1tTQ0lfTUFYX1BPUlRTICsgMV07IC8qIGluY2x1ZGVzIGR1bW15IHBvcnQgKi8KKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCBzYXNfaGE7CisKKwlzcGlubG9ja190IHN0YXRlX2xvY2s7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJZW51bSBpc2NpX3N0YXR1cyBzdGF0dXM7CisJI2RlZmluZSBJSE9TVF9TVEFSVF9QRU5ESU5HIDAKKwkjZGVmaW5lIElIT1NUX1NUT1BfUEVORElORyAxCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudHE7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGNvbXBsZXRpb25fdGFza2xldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcXVlc3RzX3RvX2NvbXBsZXRlOworCXN0cnVjdCBsaXN0X2hlYWQgcmVxdWVzdHNfdG9fZXJyb3JiYWNrOworCXNwaW5sb2NrX3Qgc2NpY19sb2NrOworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXNbU0NJX01BWF9JT19SRVFVRVNUU107CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSBkZXZpY2VzW1NDSV9NQVhfUkVNT1RFX0RFVklDRVNdOworfTsKKworLyoqCisgKiBlbnVtIHNjaV9jb250cm9sbGVyX3N0YXRlcyAtIFRoaXMgZW51bWVyYXRpb24gZGVwaWN0cyBhbGwgdGhlIHN0YXRlcworICogICAgZm9yIHRoZSBjb21tb24gY29udHJvbGxlciBzdGF0ZSBtYWNoaW5lLgorICovCitlbnVtIHNjaV9jb250cm9sbGVyX3N0YXRlcyB7CisJLyoqCisJICogU2ltcGx5IHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgYmFzZSBjb250cm9sbGVyIHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJQ19JTklUSUFMID0gMCwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgcmVzZXQuICBUaGUgbWVtb3J5IGZvcgorCSAqIHRoZSBjb250cm9sbGVyIGlzIGluIGl0J3MgaW5pdGlhbCBzdGF0ZSwgYnV0IHRoZSBjb250cm9sbGVyIHJlcXVpcmVzCisJICogaW5pdGlhbGl6YXRpb24uCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUwgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFU0VUVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX1JFU0VULAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpcyB0eXBpY2FsbHkgYW4gYWN0aW9uIHN0YXRlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250cm9sbGVyCisJICogaXMgaW4gdGhlIHByb2Nlc3Mgb2YgaW5pdGlhbGl6YXRpb24uICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zCisJICogYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVTRVQgc3RhdGUuCisJICovCisJU0NJQ19JTklUSUFMSVpJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorCSAqIGluaXRpYWxpemVkLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMSVpJTkcgc3RhdGUuCisJICovCisJU0NJQ19JTklUSUFMSVpFRCwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoZSB0aGUgY29udHJvbGxlciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWNvbWluZworCSAqIHJlYWR5IChpLmUuIHN0YXJ0aW5nKS4gIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTElaRUQgc3RhdGUuCisJICovCisJU0NJQ19TVEFSVElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoZSBjb250cm9sbGVyIGlzIG5vdyByZWFkeS4gIFRodXMsIHRoZSB1c2VyCisJICogaXMgYWJsZSB0byBwZXJmb3JtIElPIG9wZXJhdGlvbnMgb24gdGhlIGNvbnRyb2xsZXIuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUQVJUSU5HIHN0YXRlLgorCSAqLworCVNDSUNfUkVBRFksCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHR5cGljYWxseSBhbiBhY3Rpb24gc3RhdGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRyb2xsZXIKKwkgKiBpcyBpbiB0aGUgcHJvY2VzcyBvZiByZXNldHRpbmcuICBUaHVzLCB0aGUgdXNlciBpcyB1bmFibGUgdG8gcGVyZm9ybQorCSAqIElPIG9wZXJhdGlvbnMgb24gdGhlIGNvbnRyb2xsZXIuICBBIHJlc2V0IGlzIGNvbnNpZGVyZWQgZGVzdHJ1Y3RpdmUgaW4KKwkgKiBtb3N0IGNhc2VzLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRUFEWSBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgRkFJTEVEIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUEVEIHN0YXRlLgorCSAqLworCVNDSUNfUkVTRVRUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbGxlciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBzdG9wcGluZy4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQsIGJ1dCBleGlzdGluZyBJTworCSAqIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgdG8gY29tcGxldGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqLworCVNDSUNfU1RPUFBJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBzdG9wcGVkLgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RPUFBJTkcgc3RhdGUuCisJICovCisJU0NJQ19TVE9QUEVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbGxlciBjb3VsZCBub3Qgc3VjY2Vzc2Z1bGx5IGJlCisJICogaW5pdGlhbGl6ZWQuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUxJWklORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQSU5HIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRVNFVFRJTkcgc3RhdGUuCisJICovCisJU0NJQ19GQUlMRUQsCit9OworCisvKioKKyAqIHN0cnVjdCBpc2NpX3BjaV9pbmZvIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBwY2kgZnVuY3Rpb24gY29udGFpbmluZyB0aGUKKyAqICAgIGNvbnRyb2xsZXJzLiBEZXBlbmRpbmcgb24gUENJIFNLVSwgdGhlcmUgY291bGQgYmUgdXAgdG8gMiBjb250cm9sbGVycyBpbgorICogICAgdGhlIFBDSSBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBTQ0lfTUFYX01TSVhfSU5UIChTQ0lfTlVNX01TSV9YX0lOVCpTQ0lfTUFYX0NPTlRST0xMRVJTKQorCitzdHJ1Y3QgaXNjaV9wY2lfaW5mbyB7CisJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRyaWVzW1NDSV9NQVhfTVNJWF9JTlRdOworCXN0cnVjdCBpc2NpX2hvc3QgKmhvc3RzW1NDSV9NQVhfQ09OVFJPTExFUlNdOworCXN0cnVjdCBpc2NpX29yb20gKm9yb207Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpc2NpX3BjaV9pbmZvICp0b19wY2lfaW5mbyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworfQorCisjZGVmaW5lIGZvcl9lYWNoX2lzY2lfaG9zdChpZCwgaWhvc3QsIHBkZXYpIFwKKwlmb3IgKGlkID0gMCwgaWhvc3QgPSB0b19wY2lfaW5mbyhwZGV2KS0+aG9zdHNbaWRdOyBcCisJICAgICBpZCA8IEFSUkFZX1NJWkUodG9fcGNpX2luZm8ocGRldiktPmhvc3RzKSAmJiBpaG9zdDsgXAorCSAgICAgaWhvc3QgPSB0b19wY2lfaW5mbyhwZGV2KS0+aG9zdHNbKytpZF0pCisKK3N0YXRpYyBpbmxpbmUgZW51bSBpc2NpX3N0YXR1cyBpc2NpX2hvc3RfZ2V0X3N0YXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCkKK3sKKwlyZXR1cm4gaXNjaV9ob3N0LT5zdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX2hvc3RfY2hhbmdlX3N0YXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwkJCQkJICBlbnVtIGlzY2lfc3RhdHVzIHN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9ob3N0ID0gJXAsIHN0YXRlID0gMHgleCIsCisJCV9fZnVuY19fLAorCQlpc2NpX2hvc3QsCisJCXN0YXR1cyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCWlzY2lfaG9zdC0+c3RhdHVzID0gc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9zdGFydChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl3YWl0X2V2ZW50KGlob3N0LT5ldmVudHEsICF0ZXN0X2JpdChJSE9TVF9TVEFSVF9QRU5ESU5HLCAmaWhvc3QtPmZsYWdzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXdhaXRfZXZlbnQoaWhvc3QtPmV2ZW50cSwgIXRlc3RfYml0KElIT1NUX1NUT1BfUEVORElORywgJmlob3N0LT5mbGFncykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9mb3JfZGV2aWNlX3N0YXJ0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXdhaXRfZXZlbnQoaWhvc3QtPmV2ZW50cSwgIXRlc3RfYml0KElERVZfU1RBUlRfUEVORElORywgJmlkZXYtPmZsYWdzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9kZXZpY2Vfc3RvcChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwl3YWl0X2V2ZW50KGlob3N0LT5ldmVudHEsICF0ZXN0X2JpdChJREVWX1NUT1BfUEVORElORywgJmlkZXYtPmZsYWdzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfaG9zdCAqZGV2X3RvX2lob3N0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+cG9ydC0+aGEtPmxsZGRfaGE7Cit9CisKKy8qIHdlIGFsd2F5cyB1c2UgcHJvdG9jb2wgZW5naW5lIGdyb3VwIHplcm8gKi8KKyNkZWZpbmUgSVNDSV9QRUcgMAorCisvKiBzZWUgc2NpX2NvbnRyb2xsZXJfaW9fdGFnX2FsbG9jYXRlfGZyZWUgZm9yIGhvdyBzZXEgYW5kIHRjaSBhcmUgYnVpbHQgKi8KKyNkZWZpbmUgSVNDSV9UQUcoc2VxLCB0Y2kpICgoKHUxNikgKHNlcSkpIDw8IDEyIHwgdGNpKQorCisvKiB0aGVzZSBhcmUgcmV0dXJuZWQgYnkgdGhlIGhhcmR3YXJlLCBzbyBzYW5pdGl6ZSB0aGVtICovCisjZGVmaW5lIElTQ0lfVEFHX1NFUSh0YWcpICgoKHRhZykgPj4gMTIpICYgKFNDSV9NQVhfU0VRLTEpKQorI2RlZmluZSBJU0NJX1RBR19UQ0kodGFnKSAoKHRhZykgJiAoU0NJX01BWF9JT19SRVFVRVNUUy0xKSkKKworLyogZXhwYW5kZXIgYXR0YWNoZWQgc2F0YSBkZXZpY2VzIHJlcXVpcmUgMyBybmMgc2xvdHMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjaV9yZW1vdGVfZGV2aWNlX25vZGVfY291bnQoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCWlmICgoZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fCAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSkgJiYKKwkgICAgIWlkZXYtPmlzX2RpcmVjdF9hdHRhY2hlZCkKKwkJcmV0dXJuIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisJcmV0dXJuIFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQ7Cit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfY2xlYXJfaW52YWxpZF9waHkoKSAtCisgKgorICogVGhpcyBtYWNybyB3aWxsIGNsZWFyIHRoZSBiaXQgaW4gdGhlIGludmFsaWQgcGh5IG1hc2sgZm9yIHRoaXMgY29udHJvbGxlcgorICogb2JqZWN0LiAgVGhpcyBpcyB1c2VkIHRvIGNvbnRyb2wgbWVzc2FnZXMgcmVwb3J0ZWQgZm9yIGludmFsaWQgbGluayB1cAorICogbm90aWZpY2F0aW9ucy4KKyAqLworI2RlZmluZSBzY2lfY29udHJvbGxlcl9jbGVhcl9pbnZhbGlkX3BoeShjb250cm9sbGVyLCBwaHkpIFwKKwkoKGNvbnRyb2xsZXIpLT5pbnZhbGlkX3BoeV9tYXNrICY9IH4oMSA8PCAocGh5KS0+cGh5X2luZGV4KSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzY2lwaHlfdG9fZGV2KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKworCWlmICghaXBoeSB8fCAhaXBoeS0+aXNjaV9wb3J0IHx8ICFpcGh5LT5pc2NpX3BvcnQtPmlzY2lfaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmlwaHktPmlzY2lfcG9ydC0+aXNjaV9ob3N0LT5wZGV2LT5kZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqc2NpcG9ydF90b19kZXYoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisKKwlpZiAoIWlwb3J0IHx8ICFpcG9ydC0+aXNjaV9ob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmaXBvcnQtPmlzY2lfaG9zdC0+cGRldi0+ZGV2OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKnNjaXJkZXZfdG9fZGV2KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJaWYgKCFpZGV2IHx8ICFpZGV2LT5pc2NpX3BvcnQgfHwgIWlkZXYtPmlzY2lfcG9ydC0+aXNjaV9ob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmaWRldi0+aXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldjsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2EyKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5yZXZpc2lvbiA8IDQpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2IwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5yZXZpc2lvbiA9PSA0KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19jMChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAocGRldi0+cmV2aXNpb24gPj0gNSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIHNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICB1MzIgcmVxdWVzdCk7Cit2b2lkIHNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICAgICAgIHUzMiBmcmFtZV9pbmRleCk7Cit2b2lkIHNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSh2b2lkICpyZXNwb25zZV9idWZmZXIsCisJCQkJCSAgICB2b2lkICpmcmFtZV9oZWFkZXIsCisJCQkJCSAgICB2b2lkICpmcmFtZV9idWZmZXIpOworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX2FsbG9jYXRlX3JlbW90ZV9ub2RlX2NvbnRleHQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQkJCSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJCQkgdTE2ICpub2RlX2lkKTsKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfZnJlZV9yZW1vdGVfbm9kZV9jb250ZXh0KAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTE2IG5vZGVfaWQpOworCitzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpzY2lfcmVxdWVzdF9ieV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgdTE2IGlvX3RhZyk7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9pbnNlcnQoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX3JlbW92ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX2xpbmtfdXAoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9saW5rX2Rvd24oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9yZW1vdGVfZGV2aWNlX3N0b3BwZWQoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfY29weV90YXNrX2NvbnRleHQoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcmVnaXN0ZXJfc2V0dXAoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfY29udGludWVfaW8oc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CitpbnQgaXNjaV9ob3N0X3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaXNjaV9ob3N0X3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3UxNiBpc2NpX2FsbG9jX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCk7CitlbnVtIHNjaV9zdGF0dXMgaXNjaV9mcmVlX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IGlvX3RhZyk7Cit2b2lkIGlzY2lfdGNpX2ZyZWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiB0Y2kpOworCitpbnQgaXNjaV9ob3N0X2luaXQoc3RydWN0IGlzY2lfaG9zdCAqKTsKKwordm9pZCBpc2NpX2hvc3RfaW5pdF9jb250cm9sbGVyX25hbWVzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwl1bnNpZ25lZCBpbnQgY29udHJvbGxlcl9pZHgpOworCit2b2lkIGlzY2lfaG9zdF9kZWluaXQoCisJc3RydWN0IGlzY2lfaG9zdCAqKTsKKwordm9pZCBpc2NpX2hvc3RfcG9ydF9saW5rX3VwKAorCXN0cnVjdCBpc2NpX2hvc3QgKiwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICosCisJc3RydWN0IGlzY2lfcGh5ICopOworaW50IGlzY2lfaG9zdF9kZXZfZm91bmQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKik7CisKK3ZvaWQgaXNjaV9ob3N0X3JlbW90ZV9kZXZpY2Vfc3RhcnRfY29tcGxldGUoCisJc3RydWN0IGlzY2lfaG9zdCAqLAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKiwKKwllbnVtIHNjaV9zdGF0dXMpOworCit2b2lkIHNjaV9jb250cm9sbGVyX2Rpc2FibGVfaW50ZXJydXB0cygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdGFydF9pbygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNjaV90YXNrX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKwordm9pZCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2NvbnN0cnVjdCgKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2luaXRpYWxpemUoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlMGQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlICJpc2NpLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInByb2JlX3JvbXMuaCIKKworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqaXNjaV90cmFuc3BvcnRfdGVtcGxhdGU7CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpc2NpX2lkX3RhYmxlKSA9IHsKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjEpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDYzKSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2NSksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjcpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDY5KSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2QiksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjApLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDYyKSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2NCksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjYpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDY4KSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2QSksfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlzY2lfaWRfdGFibGUpOworCisvKiBsaW51eCBpc2NpIHNwZWNpZmljIHNldHRpbmdzICovCisKK3Vuc2lnbmVkIGNoYXIgbm9fb3V0Ym91bmRfdGFza190byA9IDIwOworbW9kdWxlX3BhcmFtKG5vX291dGJvdW5kX3Rhc2tfdG8sIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhub19vdXRib3VuZF90YXNrX3RvLCAiTm8gT3V0Ym91bmQgVGFzayBUaW1lb3V0ICgxdXMgaW5jcikiKTsKKwordTE2IHNzcF9tYXhfb2NjX3RvID0gMjA7Cittb2R1bGVfcGFyYW0oc3NwX21heF9vY2NfdG8sIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNzcF9tYXhfb2NjX3RvLCAiU1NQIE1heCBvY2N1cGFuY3kgdGltZW91dCAoMTAwdXMgaW5jcikiKTsKKwordTE2IHN0cF9tYXhfb2NjX3RvID0gNTsKK21vZHVsZV9wYXJhbShzdHBfbWF4X29jY190bywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3RwX21heF9vY2NfdG8sICJTVFAgTWF4IG9jY3VwYW5jeSB0aW1lb3V0ICgxMDB1cyBpbmNyKSIpOworCit1MTYgc3NwX2luYWN0aXZlX3RvID0gNTsKK21vZHVsZV9wYXJhbShzc3BfaW5hY3RpdmVfdG8sIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNzcF9pbmFjdGl2ZV90bywgIlNTUCBpbmFjdGl2aXR5IHRpbWVvdXQgKDEwMHVzIGluY3IpIik7CisKK3UxNiBzdHBfaW5hY3RpdmVfdG8gPSA1OworbW9kdWxlX3BhcmFtKHN0cF9pbmFjdGl2ZV90bywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3RwX2luYWN0aXZlX3RvLCAiU1RQIGluYWN0aXZpdHkgdGltZW91dCAoMTAwdXMgaW5jcikiKTsKKwordW5zaWduZWQgY2hhciBwaHlfZ2VuID0gMzsKK21vZHVsZV9wYXJhbShwaHlfZ2VuLCBieXRlLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGh5X2dlbiwgIlBIWSBnZW5lcmF0aW9uICgxOiAxLjVHYnBzIDI6IDMuMEdicHMgMzogNi4wR2JwcykiKTsKKwordW5zaWduZWQgY2hhciBtYXhfY29uY3Vycl9zcGludXAgPSAxOworbW9kdWxlX3BhcmFtKG1heF9jb25jdXJyX3NwaW51cCwgYnl0ZSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9jb25jdXJyX3NwaW51cCwgIk1heCBjb25jdXJyZW50IGRldmljZSBzcGludXAiKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaXNjaV9zaHQgPSB7CisKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSBEUlZfTkFNRSwKKwkucHJvY19uYW1lCQkJPSBEUlZfTkFNRSwKKwkucXVldWVjb21tYW5kCQkJPSBzYXNfcXVldWVjb21tYW5kLAorCS50YXJnZXRfYWxsb2MJCQk9IHNhc190YXJnZXRfYWxsb2MsCisJLnNsYXZlX2NvbmZpZ3VyZQkJPSBzYXNfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9kZXN0cm95CQkJPSBzYXNfc2xhdmVfZGVzdHJveSwKKwkuc2Nhbl9maW5pc2hlZAkJCT0gaXNjaV9ob3N0X3NjYW5fZmluaXNoZWQsCisJLnNjYW5fc3RhcnQJCQk9IGlzY2lfaG9zdF9zY2FuX3N0YXJ0LAorCS5jaGFuZ2VfcXVldWVfZGVwdGgJCT0gc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2hhbmdlX3F1ZXVlX3R5cGUJCT0gc2FzX2NoYW5nZV9xdWV1ZV90eXBlLAorCS5iaW9zX3BhcmFtCQkJPSBzYXNfYmlvc19wYXJhbSwKKwkuY2FuX3F1ZXVlCQkJPSBJU0NJX0NBTl9RVUVVRV9WQUwsCisJLmNtZF9wZXJfbHVuCQkJPSAxLAorCS50aGlzX2lkCQkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQkJPSBTR19BTEwsCisJLm1heF9zZWN0b3JzCQkJPSBTQ1NJX0RFRkFVTFRfTUFYX1NFQ1RPUlMsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBzYXNfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGlzY2lfYnVzX3Jlc2V0X2hhbmRsZXIsCisJLnNsYXZlX2FsbG9jCQkJPSBzYXNfc2xhdmVfYWxsb2MsCisJLnRhcmdldF9kZXN0cm95CQkJPSBzYXNfdGFyZ2V0X2Rlc3Ryb3ksCisJLmlvY3RsCQkJCT0gc2FzX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBzYXNfZG9tYWluX2Z1bmN0aW9uX3RlbXBsYXRlIGlzY2lfdHJhbnNwb3J0X29wcyAgPSB7CisKKwkvKiBUaGUgY2xhc3MgY2FsbHMgdGhlc2UgdG8gbm90aWZ5IHRoZSBMTEREIG9mIGFuIGV2ZW50LiAqLworCS5sbGRkX3BvcnRfZm9ybWVkCT0gaXNjaV9wb3J0X2Zvcm1lZCwKKwkubGxkZF9wb3J0X2RlZm9ybWVkCT0gaXNjaV9wb3J0X2RlZm9ybWVkLAorCisJLyogVGhlIGNsYXNzIGNhbGxzIHRoZXNlIHdoZW4gYSBkZXZpY2UgaXMgZm91bmQgb3IgZ29uZS4gKi8KKwkubGxkZF9kZXZfZm91bmQJCT0gaXNjaV9yZW1vdGVfZGV2aWNlX2ZvdW5kLAorCS5sbGRkX2Rldl9nb25lCQk9IGlzY2lfcmVtb3RlX2RldmljZV9nb25lLAorCisJLmxsZGRfZXhlY3V0ZV90YXNrCT0gaXNjaV90YXNrX2V4ZWN1dGVfdGFzaywKKwkvKiBUYXNrIE1hbmFnZW1lbnQgRnVuY3Rpb25zLiBNdXN0IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dC4gKi8KKwkubGxkZF9hYm9ydF90YXNrCT0gaXNjaV90YXNrX2Fib3J0X3Rhc2ssCisJLmxsZGRfYWJvcnRfdGFza19zZXQJPSBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQsCisJLmxsZGRfY2xlYXJfYWNhCQk9IGlzY2lfdGFza19jbGVhcl9hY2EsCisJLmxsZGRfY2xlYXJfdGFza19zZXQJPSBpc2NpX3Rhc2tfY2xlYXJfdGFza19zZXQsCisJLmxsZGRfSV9UX25leHVzX3Jlc2V0CT0gaXNjaV90YXNrX0lfVF9uZXh1c19yZXNldCwKKwkubGxkZF9sdV9yZXNldAkJPSBpc2NpX3Rhc2tfbHVfcmVzZXQsCisJLmxsZGRfcXVlcnlfdGFzawk9IGlzY2lfdGFza19xdWVyeV90YXNrLAorCisJLyogUG9ydCBhbmQgQWRhcHRlciBtYW5hZ2VtZW50ICovCisJLmxsZGRfY2xlYXJfbmV4dXNfcG9ydAk9IGlzY2lfdGFza19jbGVhcl9uZXh1c19wb3J0LAorCS5sbGRkX2NsZWFyX25leHVzX2hhCT0gaXNjaV90YXNrX2NsZWFyX25leHVzX2hhLAorCisJLyogUGh5IG1hbmFnZW1lbnQgKi8KKwkubGxkZF9jb250cm9sX3BoeQk9IGlzY2lfcGh5X2NvbnRyb2wsCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUCBSIE8gVCBFIEMgVCBFIEQgIE0gRSBUIEggTyBEIFMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKgorICogaXNjaV9yZWdpc3Rlcl9zYXNfaGEoKSAtIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHZhcmlvdXMgbGxkZAorICogICAgc3BlY2lmaWMgbWVtYmVycyBvZiB0aGUgc2FzX2hhIHN0cnVjdCBhbmQgY2FsbHMgdGhlIGxpYnNhcworICogICAgc2FzX3JlZ2lzdGVyX2hhKCkgZnVuY3Rpb24uCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGxsZGQgc3BlY2lmaWMgd3JhcHBlciBmb3IgdGhlCisgKiAgICBsaWJzYXMgc2FzX2hhIHN0cnVjdC4KKyAqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyBzdWNlc3Mgb3IgZmFpbHVyZS4gVGhlIHVzZXIKKyAqIHNob3VsZCBjaGVjayBmb3IgcG9zc2libGUgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgcmV0dXJuIG90aGVyd2lzZSwgYSB6ZXJvCisgKiBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpc2NpX3JlZ2lzdGVyX3Nhc19oYShzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QpCit7CisJaW50IGk7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9ICYoaXNjaV9ob3N0LT5zYXNfaGEpOworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqKnNhc19waHlzOworCXN0cnVjdCBhc2Rfc2FzX3BvcnQgKipzYXNfcG9ydHM7CisKKwlzYXNfcGh5cyA9IGRldm1fa3phbGxvYygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJU0NJX01BWF9QSFlTICogc2l6ZW9mKHZvaWQgKiksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXNfcGh5cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzYXNfcG9ydHMgPSBkZXZtX2t6YWxsb2MoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJCSBTQ0lfTUFYX1BPUlRTICogc2l6ZW9mKHZvaWQgKiksCisJCQkJIEdGUF9LRVJORUwpOworCWlmICghc2FzX3BvcnRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0gTGlic2FzIEluaXRpYWxpemF0aW9uIFN0dWZmLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldCB2YXJpb3VzIGZpZWxkcyBpbiB0aGUgc2FzX2hhIHN0cnVjdDoKKwkgKi8KKworCXNhc19oYS0+c2FzX2hhX25hbWUgPSBEUlZfTkFNRTsKKwlzYXNfaGEtPmxsZGRfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc2FzX2hhLT5zYXNfYWRkciAgICA9ICZpc2NpX2hvc3QtPnBoeXNbMF0uc2FzX2FkZHJbMF07CisKKwkvKiBzZXQgdGhlIGFycmF5IG9mIHBoeSBhbmQgcG9ydCBzdHJ1Y3RzLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspIHsKKwkJc2FzX3BoeXNbaV0gPSAmaXNjaV9ob3N0LT5waHlzW2ldLnNhc19waHk7CisJCXNhc19wb3J0c1tpXSA9ICZpc2NpX2hvc3QtPnBvcnRzW2ldLnNhc19wb3J0OworCX0KKworCXNhc19oYS0+c2FzX3BoeSAgPSBzYXNfcGh5czsKKwlzYXNfaGEtPnNhc19wb3J0ID0gc2FzX3BvcnRzOworCXNhc19oYS0+bnVtX3BoeXMgPSBTQ0lfTUFYX1BIWVM7CisKKwlzYXNfaGEtPmxsZGRfcXVldWVfc2l6ZSA9IElTQ0lfQ0FOX1FVRVVFX1ZBTDsKKwlzYXNfaGEtPmxsZGRfbWF4X2V4ZWN1dGVfbnVtID0gMTsKKwlzYXNfaGEtPnN0cmljdF93aWRlX3BvcnRzID0gMTsKKworCXNhc19yZWdpc3Rlcl9oYShzYXNfaGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlzY2lfc2hvd19pZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjb250YWluZXJfb2YoZGV2LCB0eXBlb2YoKnNob3N0KSwgc2hvc3RfZGV2KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZihzYXNfaGEsIHR5cGVvZigqaWhvc3QpLCBzYXNfaGEpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGlob3N0LT5pZCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpc2NpX2lkLCBTX0lSVUdPLCBpc2NpX3Nob3dfaWQsIE5VTEwpOworCitzdGF0aWMgdm9pZCBpc2NpX3VucmVnaXN0ZXIoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCisJaWYgKCFpc2NpX2hvc3QpCisJCXJldHVybjsKKworCXNob3N0ID0gaXNjaV9ob3N0LT5zaG9zdDsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYsICZkZXZfYXR0cl9pc2NpX2lkKTsKKworCXNhc191bnJlZ2lzdGVyX2hhKCZpc2NpX2hvc3QtPnNhc19oYSk7CisKKwlzYXNfcmVtb3ZlX2hvc3QoaXNjaV9ob3N0LT5zaG9zdCk7CisJc2NzaV9yZW1vdmVfaG9zdChpc2NpX2hvc3QtPnNob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGlzY2lfaG9zdC0+c2hvc3QpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2NpX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBlcnIsIGJhcl9udW0sIGJhcl9tYXNrID0gMDsKKwl2b2lkIF9faW9tZW0gKiBjb25zdCAqaW9tYXA7CisKKwllcnIgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiZmFpbGVkIGVuYWJsZSBQQ0kgZGV2aWNlICVzIVxuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmb3IgKGJhcl9udW0gPSAwOyBiYXJfbnVtIDwgU0NJX1BDSV9CQVJfQ09VTlQ7IGJhcl9udW0rKykKKwkJYmFyX21hc2sgfD0gMSA8PCAoYmFyX251bSAqIDIpOworCisJZXJyID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIGJhcl9tYXNrLCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwlpZiAoIWlvbWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnVtX2NvbnRyb2xsZXJzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCS8qIGJhciBzaXplIGFsb25lIGNhbiB0ZWxsIHVzIGlmIHdlIGFyZSBydW5uaW5nIHdpdGggYSBkdWFsIGNvbnRyb2xsZXIKKwkgKiBwYXJ0LCBubyBuZWVkIHRvIHRydXN0IHJldmlzaW9uIGlkcyB0aGF0IG1pZ2h0IGJlIHVuZGVyIGJyb2tlbiBmaXJtd2FyZQorCSAqIGNvbnRyb2wKKwkgKi8KKwlyZXNvdXJjZV9zaXplX3Qgc2N1X2Jhcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBTQ0lfU0NVX0JBUioyKTsKKwlyZXNvdXJjZV9zaXplX3Qgc211X2Jhcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBTQ0lfU01VX0JBUioyKTsKKworCWlmIChzY3VfYmFyX3NpemUgPj0gU0NJX1NDVV9CQVJfU0laRSpTQ0lfTUFYX0NPTlRST0xMRVJTICYmCisJICAgIHNtdV9iYXJfc2l6ZSA+PSBTQ0lfU01VX0JBUl9TSVpFKlNDSV9NQVhfQ09OVFJPTExFUlMpCisJCXJldHVybiBTQ0lfTUFYX0NPTlRST0xMRVJTOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaXNjaV9zZXR1cF9pbnRlcnJ1cHRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBlcnIsIGksIG51bV9tc2l4OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCXN0cnVjdCBpc2NpX3BjaV9pbmZvICpwY2lfaW5mbyA9IHRvX3BjaV9pbmZvKHBkZXYpOworCisJLyoKKwkgKiAgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqICBQQ0kgZnVuY3Rpb24uCisJICovCisJbnVtX21zaXggPSBudW1fY29udHJvbGxlcnMocGRldikgKiBTQ0lfTlVNX01TSV9YX0lOVDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbXNpeDsgaSsrKQorCQlwY2lfaW5mby0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKworCWVyciA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCBwY2lfaW5mby0+bXNpeF9lbnRyaWVzLCBudW1fbXNpeCk7CisJaWYgKGVycikKKwkJZ290byBpbnR4OworCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2l4OyBpKyspIHsKKwkJaW50IGlkID0gaSAvIFNDSV9OVU1fTVNJX1hfSU5UOworCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeCA9ICZwY2lfaW5mby0+bXNpeF9lbnRyaWVzW2ldOworCQlpcnFfaGFuZGxlcl90IGlzcjsKKworCQlpaG9zdCA9IHBjaV9pbmZvLT5ob3N0c1tpZF07CisJCS8qIG9kZCBudW1iZXJlZCB2ZWN0b3JzIGFyZSBlcnJvciBpbnRlcnJ1cHRzICovCisJCWlmIChpICYgMSkKKwkJCWlzciA9IGlzY2lfZXJyb3JfaXNyOworCQllbHNlCisJCQlpc3IgPSBpc2NpX21zaXhfaXNyOworCisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgbXNpeC0+dmVjdG9yLCBpc3IsIDAsCisJCQkJICAgICAgIERSVl9OQU1FIi1tc2l4IiwgaWhvc3QpOworCQlpZiAoIWVycikKKwkJCWNvbnRpbnVlOworCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJtc2l4IHNldHVwIGZhaWxlZCBmYWxsaW5nIGJhY2sgdG8gaW50eFxuIik7CisJCXdoaWxlIChpLS0pIHsKKwkJCWlkID0gaSAvIFNDSV9OVU1fTVNJX1hfSU5UOworCQkJaWhvc3QgPSBwY2lfaW5mby0+aG9zdHNbaWRdOworCQkJbXNpeCA9ICZwY2lfaW5mby0+bXNpeF9lbnRyaWVzW2ldOworCQkJZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBtc2l4LT52ZWN0b3IsIGlob3N0KTsKKwkJfQorCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOworCQlnb3RvIGludHg7CisJfQorCXJldHVybiAwOworCisgaW50eDoKKwlmb3JfZWFjaF9pc2NpX2hvc3QoaSwgaWhvc3QsIHBkZXYpIHsKKwkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBwZGV2LT5pcnEsIGlzY2lfaW50eF9pc3IsCisJCQkJICAgICAgIElSUUZfU0hBUkVELCBEUlZfTkFNRSItaW50eCIsIGlob3N0KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0X2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWludCBlcnI7CisKKwlpc2NpX2hvc3QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppc2NpX2hvc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlzY2lfaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpc2NpX2hvc3QtPnBkZXYgPSBwZGV2OworCWlzY2lfaG9zdC0+aWQgPSBpZDsKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpc2NpX3NodCwgc2l6ZW9mKHZvaWQgKikpOworCWlmICghc2hvc3QpCisJCXJldHVybiBOVUxMOworCWlzY2lfaG9zdC0+c2hvc3QgPSBzaG9zdDsKKworCWVyciA9IGlzY2lfaG9zdF9pbml0KGlzY2lfaG9zdCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfc2hvc3Q7CisKKwlTSE9TVF9UT19TQVNfSEEoc2hvc3QpID0gJmlzY2lfaG9zdC0+c2FzX2hhOworCWlzY2lfaG9zdC0+c2FzX2hhLmNvcmUuc2hvc3QgPSBzaG9zdDsKKwlzaG9zdC0+dHJhbnNwb3J0dCA9IGlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlOworCisJc2hvc3QtPm1heF9pZCA9IH4wOworCXNob3N0LT5tYXhfbHVuID0gfjA7CisJc2hvc3QtPm1heF9jbWRfbGVuID0gTUFYX0NPTU1BTkRfU0laRTsKKworCWVyciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3Nob3N0OworCisJZXJyID0gaXNjaV9yZWdpc3Rlcl9zYXNfaGEoaXNjaV9ob3N0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9zaG9zdF9yZW1vdmU7CisKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYsICZkZXZfYXR0cl9pc2NpX2lkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2hhOworCisJcmV0dXJuIGlzY2lfaG9zdDsKKworIGVycl91bnJlZ2lzdGVyX2hhOgorCXNhc191bnJlZ2lzdGVyX2hhKCYoaXNjaV9ob3N0LT5zYXNfaGEpKTsKKyBlcnJfc2hvc3RfcmVtb3ZlOgorCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworIGVycl9zaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2NpX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpc2NpX3BjaV9pbmZvICpwY2lfaW5mbzsKKwlpbnQgZXJyLCBpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwlzdHJ1Y3QgaXNjaV9vcm9tICpvcm9tID0gTlVMTDsKKwljaGFyICpzb3VyY2UgPSAiKHBsYXRmb3JtKSI7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZHJpdmVyIGNvbmZpZ3VyZWQgZm9yIHJldjogJWQgc2lsaWNvblxuIiwKKwkJIHBkZXYtPnJldmlzaW9uKTsKKworCXBjaV9pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGNpX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaV9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgcGNpX2luZm8pOworCisJaWYgKGVmaV9lbmFibGVkKQorCQlvcm9tID0gaXNjaV9nZXRfZWZpX3ZhcihwZGV2KTsKKworCWlmICghb3JvbSkKKwkJb3JvbSA9IGlzY2lfcmVxdWVzdF9vcHJvbShwZGV2KTsKKworCWZvciAoaSA9IDA7IG9yb20gJiYgaSA8IEFSUkFZX1NJWkUob3JvbS0+Y3RybCk7IGkrKykgeworCQlpZiAoc2NpX29lbV9wYXJhbWV0ZXJzX3ZhbGlkYXRlKCZvcm9tLT5jdHJsW2ldKSkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkgIlslZF06IGludmFsaWQgb2VtIHBhcmFtZXRlcnMgZGV0ZWN0ZWQsIGZhbGxpbmcgYmFjayB0byBmaXJtd2FyZVxuIiwgaSk7CisJCQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG9yb20pOworCQkJb3JvbSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghb3JvbSkgeworCQlzb3VyY2UgPSAiKGZpcm13YXJlKSI7CisJCW9yb20gPSBpc2NpX3JlcXVlc3RfZmlybXdhcmUocGRldiwgZncpOworCQlpZiAoIW9yb20pIHsKKwkJCS8qIFRPRE8gY29udmVydCB0aGlzIHRvIFdBUk5fVEFJTlRfT05DRSBvbmNlIHRoZQorCQkJICogb3JvbS9lZmkgcGFyYW1ldGVyIHN1cHBvcnQgaXMgd2lkZWx5IGF2YWlsYWJsZQorCQkJICovCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiTG9hZGluZyB1c2VyIGZpcm13YXJlIGZhaWxlZCwgdXNpbmcgZGVmYXVsdCAiCisJCQkJICJ2YWx1ZXNcbiIpOworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkgIkRlZmF1bHQgT0VNIGNvbmZpZ3VyYXRpb24gYmVpbmcgdXNlZDogNCAiCisJCQkJICJuYXJyb3cgcG9ydHMsIGFuZCBkZWZhdWx0IFNBUyBBZGRyZXNzZXNcbiIpOworCQl9CisJfQorCisJaWYgKG9yb20pCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIk9FTSBTQVMgcGFyYW1ldGVycyAodmVyc2lvbjogJXUuJXUpIGxvYWRlZCAlc1xuIiwKKwkJCSAob3JvbS0+aGRyLnZlcnNpb24gJiAweGYwKSA+PiA0LAorCQkJIChvcm9tLT5oZHIudmVyc2lvbiAmIDB4ZiksIHNvdXJjZSk7CisKKwlwY2lfaW5mby0+b3JvbSA9IG9yb207CisKKwllcnIgPSBpc2NpX3BjaV9pbml0KHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnRyb2xsZXJzKHBkZXYpOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfaG9zdCAqaCA9IGlzY2lfaG9zdF9hbGxvYyhwZGV2LCBpKTsKKworCQlpZiAoIWgpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9ob3N0X2FsbG9jOworCQl9CisJCXBjaV9pbmZvLT5ob3N0c1tpXSA9IGg7CisJfQorCisJZXJyID0gaXNjaV9zZXR1cF9pbnRlcnJ1cHRzKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2hvc3RfYWxsb2M7CisKKwlmb3JfZWFjaF9pc2NpX2hvc3QoaSwgaXNjaV9ob3N0LCBwZGV2KQorCQlzY3NpX3NjYW5faG9zdChpc2NpX2hvc3QtPnNob3N0KTsKKworCXJldHVybiAwOworCisgZXJyX2hvc3RfYWxsb2M6CisJZm9yX2VhY2hfaXNjaV9ob3N0KGksIGlzY2lfaG9zdCwgcGRldikKKwkJaXNjaV91bnJlZ2lzdGVyKGlzY2lfaG9zdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGlzY2lfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdDsKKwlpbnQgaTsKKworCWZvcl9lYWNoX2lzY2lfaG9zdChpLCBpaG9zdCwgcGRldikgeworCQlpc2NpX3VucmVnaXN0ZXIoaWhvc3QpOworCQlpc2NpX2hvc3RfZGVpbml0KGlob3N0KTsKKwkJc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKGlob3N0KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpc2NpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gaXNjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gaXNjaV9wY2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpc2NpX3BjaV9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgaXNjaV9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCXByX2luZm8oIiVzOiBJbnRlbChSKSBDNjAwIFNBUyBDb250cm9sbGVyIERyaXZlclxuIiwgRFJWX05BTUUpOworCisJaXNjaV90cmFuc3BvcnRfdGVtcGxhdGUgPSBzYXNfZG9tYWluX2F0dGFjaF90cmFuc3BvcnQoJmlzY2lfdHJhbnNwb3J0X29wcyk7CisJaWYgKCFpc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpc2NpX3BjaV9kcml2ZXIpOworCWlmIChlcnIpCisJCXNhc19yZWxlYXNlX3RyYW5zcG9ydChpc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgaXNjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpc2NpX3BjaV9kcml2ZXIpOworCXNhc19yZWxlYXNlX3RyYW5zcG9ydChpc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9GSVJNV0FSRShJU0NJX0ZXX05BTUUpOworbW9kdWxlX2luaXQoaXNjaV9pbml0KTsKK21vZHVsZV9leGl0KGlzY2lfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9pc2NpLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9pc2NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkZTYzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaApAQCAtMCwwICsxLDUzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0lTQ0lfSF9fCisjZGVmaW5lIF9fSVNDSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImlzY2kiCisjZGVmaW5lIFNDSV9QQ0lfQkFSX0NPVU5UIDIKKyNkZWZpbmUgU0NJX05VTV9NU0lfWF9JTlQgMgorI2RlZmluZSBTQ0lfU01VX0JBUiAgICAgICAwCisjZGVmaW5lIFNDSV9TTVVfQkFSX1NJWkUgICgxNioxMDI0KQorI2RlZmluZSBTQ0lfU0NVX0JBUiAgICAgICAxCisjZGVmaW5lIFNDSV9TQ1VfQkFSX1NJWkUgICg0KjEwMjQqMTAyNCkKKyNkZWZpbmUgU0NJX0lPX1NQQUNFX0JBUjAgMgorI2RlZmluZSBTQ0lfSU9fU1BBQ0VfQkFSMSAzCisjZGVmaW5lIElTQ0lfQ0FOX1FVRVVFX1ZBTCAyNTAgLyogPCBTQ0lfTUFYX0lPX1JFUVVFU1RTID8gKi8KKyNkZWZpbmUgU0NJQ19DT05UUk9MTEVSX1NUT1BfVElNRU9VVCA1MDAwCisKKyNkZWZpbmUgU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcgMHhGRkZGCisKKyNkZWZpbmUgU0NJX01BWF9QSFlTICAoNFVMKQorI2RlZmluZSBTQ0lfTUFYX1BPUlRTIFNDSV9NQVhfUEhZUworI2RlZmluZSBTQ0lfTUFYX1NNUF9QSFlTICAoMzg0KSAvKiBub3Qgc2lsaWNvbiBjb25zdHJhaW5lZCAqLworI2RlZmluZSBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTICgyNTZVTCkKKyNkZWZpbmUgU0NJX01BWF9JT19SRVFVRVNUUyAoMjU2VUwpCisjZGVmaW5lIFNDSV9NQVhfU0VRICgxNikKKyNkZWZpbmUgU0NJX01BWF9NU0lYX01FU1NBR0VTICAoMikKKyNkZWZpbmUgU0NJX01BWF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UUyAxMzAgLyogbm90IHNpbGljb24gY29uc3RyYWluZWQgKi8KKyNkZWZpbmUgU0NJX01BWF9DT05UUk9MTEVSUyAyCisjZGVmaW5lIFNDSV9NQVhfRE9NQUlOUyAgU0NJX01BWF9QT1JUUworCisjZGVmaW5lIFNDVV9NQVhfQ1JJVElDQUxfTk9USUZJQ0FUSU9OUyAgICAoMzg0KQorI2RlZmluZSBTQ1VfTUFYX0VWRU5UU19TSElGVAkJICAoNykKKyNkZWZpbmUgU0NVX01BWF9FVkVOVFMgICAgICAgICAgICAgICAgICAgICgxIDw8IFNDVV9NQVhfRVZFTlRTX1NISUZUKQorI2RlZmluZSBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyAgICAgICAgKDEyOCkKKyNkZWZpbmUgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX1NDUkFUQ0ggICgxMjgpCisjZGVmaW5lIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTICAoU0NVX01BWF9DUklUSUNBTF9OT1RJRklDQVRJT05TIFwKKwkJCQkJICAgKyBTQ1VfTUFYX0VWRU5UUyBcCisJCQkJCSAgICsgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMJXAorCQkJCQkgICArIFNDSV9NQVhfSU9fUkVRVUVTVFMgXAorCQkJCQkgICArIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9TQ1JBVENIKQorI2RlZmluZSBTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfU0hJRlQJICAoaWxvZzIoU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMpKQorCisjZGVmaW5lIFNDVV9BQlNPTFVURV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTICg0MDk2KQorI2RlZmluZSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkUgICAoMTAyNCkKKyNkZWZpbmUgU0NVX0lOVkFMSURfRlJBTUVfSU5ERVggICAgICAgICAgICAgKDB4RkZGRikKKworI2RlZmluZSBTQ1VfSU9fUkVRVUVTVF9NQVhfU0dFX1NJWkUgICAgICAgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgU0NVX0lPX1JFUVVFU1RfTUFYX1RSQU5TRkVSX0xFTkdUSCAgKDB4MDBGRkZGRkYpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19zaXplcyh2b2lkKQoreworCUJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihTQ1VfTUFYX0VWRU5UUyk7CisJQlVJTERfQlVHX09OKFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTIDw9IDgpOworCUJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyk7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTKTsKKwlCVUlMRF9CVUdfT04oU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgPiBTQ1VfQUJTT0xVVEVfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyk7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDSV9NQVhfSU9fUkVRVUVTVFMpOworCUJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihTQ0lfTUFYX1NFUSk7Cit9CisKKy8qKgorICogZW51bSBzY2lfc3RhdHVzIC0gVGhpcyBpcyB0aGUgZ2VuZXJhbCByZXR1cm4gc3RhdHVzIGVudW1lcmF0aW9uIGZvciBub24tSU8sCisgKiAgICBub24tdGFzayBtYW5hZ2VtZW50IHJlbGF0ZWQgU0NJIGludGVyZmFjZSBtZXRob2RzLgorICoKKyAqCisgKi8KK2VudW0gc2NpX3N0YXR1cyB7CisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KKwkgKi8KKwlTQ0lfU1VDQ0VTUyA9IDAsCisKKwkvKioKKwkgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsaW5nIG1ldGhvZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LAorCSAqIGJ1dCB0aGF0IHRoZSBJTyBtYXkgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIGhhdmluZyBpdCdzIHN0YXJ0IG1ldGhvZAorCSAqIGludm9rZWQuICBUaGlzIG9jY3VycyBkdXJpbmcgU0FUIHRyYW5zbGF0aW9uIGZvciByZXF1ZXN0cyB0aGF0IGRvCisJICogbm90IHJlcXVpcmUgYW4gSU8gdG8gdGhlIHRhcmdldCBvciBmb3IgYW55IG90aGVyIHJlcXVlc3RzIHRoYXQgbWF5CisJICogYmUgY29tcGxldGVkIHdpdGhvdXQgaGF2aW5nIHRvIHN1Ym1pdCBJTy4KKwkgKi8KKwlTQ0lfU1VDQ0VTU19JT19DT01QTEVURV9CRUZPUkVfU1RBUlQsCisKKwkvKioKKwkgKiAgVGhpcyBWYWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgU0NVIGhhcmR3YXJlIHJldHVybmVkIGFuIGVhcmx5IHJlc3BvbnNlCisJICogIGJlY2F1c2UgdGhlIGlvIHJlcXVlc3Qgc3BlY2lmaWVkIG1vcmUgZGF0YSB0aGFuIGlzIHJldHVybmVkIGJ5IHRoZQorCSAqICB0YXJnZXQgZGV2aWNlIChtb2RlIHBhZ2VzLCBpbnF1aXJ5IGRhdGEsIGV0Yy4pLiBUaGUgY29tcGxldGlvbiByb3V0aW5lCisJICogIHdpbGwgaGFuZGxlIHRoaXMgY2FzZSB0byBnZXQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCisJICovCisJU0NJX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgZm9yIHdoaWNoIGEgc3RhdGUgY2hhbmdlIGlzCisJICogYmVpbmcgcmVxdWVzdGVkIGlzIGFscmVhZHkgaW4gc2FpZCBzdGF0ZS4KKwkgKi8KKwlTQ0lfV0FSTklOR19BTFJFQURZX0lOX1NUQVRFLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIGludGVycnVwdCBjb2FsZXNjZW5jZSB0aW1lciBtYXkgY2F1c2UgU0FTCisJICogc3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlIGlzc3VlcyAoaS5lLiBTTVAgdGFyZ2V0IG1vZGUgcmVzcG9uc2UKKwkgKiBmcmFtZXMgbXVzdCBiZSByZXR1cm5lZCB3aXRoaW4gMS45IG1pbGxpc2Vjb25kcykuCisJICovCisJU0NJX1dBUk5JTkdfVElNRVJfQ09ORkxJQ1QsCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyBhIHNlcXVlbmNlIG9mIGFjdGlvbiBpcyBub3QgY29tcGxldGVkIHlldC4gTW9zdGx5LAorCSAqIHRoaXMgc3RhdHVzIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSBBVEEgY29tbWFuZHMgYXJlIG5lZWRlZCBpbiBhIFNBVEkgdHJhbnNsYXRpb24uCisJICovCisJU0NJX1dBUk5JTkdfU0VRVUVOQ0VfSU5DT01QTEVURSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhIGdlbmVyYWwgZmFpbHVyZS4KKwkgKi8KKwlTQ0lfRkFJTFVSRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBTQ0kgaW1wbGVtZW50YXRpb24gaXMgdW5hYmxlIHRvIGNvbXBsZXRlCisJICogYW4gb3BlcmF0aW9uIGR1ZSB0byBhIGNyaXRpY2FsIGZsYXcgdGhlIHByZXZlbnRzIGFueSBmdXJ0aGVyIG9wZXJhdGlvbgorCSAqIChpLmUuIGFuIGludmFsaWQgcG9pbnRlcikuCisJICovCisJU0NJX0ZBVEFMX0VSUk9SLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUgc3RhdGUKKwkgKiBvZiB0aGUgY29udHJvbGxlciBpcyBpbiBhIHN0YXRlIHRoYXQgcHJldmVudHMgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEUsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZXJlIGlzCisJICogaW5zdWZmaWNpZW50IHJlc291cmNlcy9tZW1vcnkgdG8gY29tcGxldGUgdGhlIHJlcXVlc3QuCisJICovCisJU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUywKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogY29udHJvbGxlciBvYmplY3QgcmVxdWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gY2FuJ3QgYmUgbG9jYXRlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX05PVF9GT1VORCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogZGlzY292ZXJlZCBjb250cm9sbGVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9DT05UUk9MTEVSX1RZUEUsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZQorCSAqIHJlcXVlc3RlZCBpbml0aWFsaXphdGlvbiBkYXRhIHZlcnNpb24gaXNuJ3Qgc3VwcG9ydGVkLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX0lOSVRfREFUQV9WRVJTSU9OLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBvZiBTQVMgUGh5cyBpbnRvIFNBUyBQb3J0cyBpcyBub3Qgc3VwcG9ydGVkLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTiwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogcmVxdWVzdGVkIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJlbW90ZSBkZXZpY2UsIHBvcnQsCisJICogb3IgY29udHJvbGxlci4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogcmVxdWVzdGVkIGluZm9ybWF0aW9uIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgU0NJIGltcGxlbWVudGF0aW9uLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX0lORk9STUFUSU9OX1RZUEUsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZQorCSAqIGRldmljZSBhbHJlYWR5IGV4aXN0cy4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9ERVZJQ0VfRVhJU1RTLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSBhZGRpbmcKKwkgKiBhIHBoeSB0byB0aGUgb2JqZWN0IGlzIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9BRERJTkdfUEhZX1VOU1VQUE9SVEVELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBTQ0kgaW1wbGVtZW50YXRpb24uCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfSU5GT1JNQVRJT05fRklFTEQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZSBTQ0kKKwkgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzdXBwbGllZCB0aW1lIGxpbWl0LgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1RJTUVfTElNSVQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIGZhaWxlZCwgYmVjYXVzZSB0aGUgU0NJCisJICogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIFBoeS4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX1BIWSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2QgZmFpbGVkLCBiZWNhdXNlIHRoZSBTQ0kKKwkgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgUG9ydC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX1BPUlQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIHdhcyBwYXJ0bHkgc3VjY2Vzc2Z1bAorCSAqIFRoZSBwb3J0IHdhcyByZXNldCBidXQgbm90IGFsbCBwaHlzIGluIHBvcnQgYXJlIG9wZXJhdGlvbmFsCisJICovCisJU0NJX0ZBSUxVUkVfUkVTRVRfUE9SVF9QQVJUSUFMX1NVQ0NFU1MsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCBjYWxsaW5nIG1ldGhvZCBmYWlsZWQKKwkgKiBUaGUgcG9ydCByZXNldCBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugbm9uZSBvZiB0aGUgcGh5cyBhcmUgb3BlcmF0aW9uYWwKKwkgKi8KKwlTQ0lfRkFJTFVSRV9SRVNFVF9QT1JUX0ZBSUxVUkUsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIGZhaWxlZCwgYmVjYXVzZSB0aGUgU0NJCisJICogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBkZXZpY2UuCisJICovCisJU0NJX0ZBSUxVUkVfSU5WQUxJRF9SRU1PVEVfREVWSUNFLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIG1ldGhvZCBmYWlsZWQsIGJlY2F1c2UgdGhlIHJlbW90ZQorCSAqIGRldmljZSBpcyBpbiBhIGJhZCBzdGF0ZSBhbmQgcmVxdWlyZXMgYSByZXNldC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIG1ldGhvZCBmYWlsZWQsIGJlY2F1c2UgdGhlIFNDSQorCSAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gb3Igc3VwcG9ydCB0aGUgc3BlY2lmaWVkIElPIHRhZy4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX0lPX1RBRywKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkIGFuZCB0aGUgdXNlciBzaG91bGQKKwkgKiBjaGVjayB0aGUgcmVzcG9uc2UgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIElPLgorCSAqLworCVNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQsIHRoZSBmYWlsdXJlIGlzCisJICogY29udHJvbGxlciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYywgYW5kIHRoZSByZXNwb25zZSBkYXRhIGFzc29jaWF0ZWQKKwkgKiB3aXRoIHRoZSByZXF1ZXN0IGlzIG5vdCB2YWxpZC4gIFlvdSBjYW4gcXVlcnkgZm9yIHRoZSBjb250cm9sbGVyCisJICogc3BlY2lmaWMgZXJyb3IgaW5mb3JtYXRpb24gdmlhIHNjaV9jb250cm9sbGVyX2dldF9yZXF1ZXN0X3N0YXR1cygpCisJICovCisJU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZWQgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZQorCSAqIHVzZXIgcmVxdWVzdGVkIHRoaXMgSU8gdG8gYmUgdGVybWluYXRlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JT19URVJNSU5BVEVELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYW5kIHRoZSBhc3NvY2lhdGVkCisJICogcmVxdWVzdCByZXF1aXJlcyBhIFNDU0kgYWJvcnQgdGFzayB0byBiZSBzZW50IHRvIHRoZSB0YXJnZXQuCisJICovCisJU0NJX0ZBSUxVUkVfSU9fUkVRVUlSRVNfU0NTSV9BQk9SVCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIHN1cHBsaWVkCisJICogZGV2aWNlIGNvdWxkIG5vdCBiZSBsb2NhdGVkLgorCSAqLworCVNDSV9GQUlMVVJFX0RFVklDRV9OT1RfRk9VTkQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZQorCSAqIG9iamVjdHMgYXNzb2NpYXRpb24gaXMgcmVxdWlyZWQgYW5kIGlzIG5vdCBjb3JyZWN0bHkgc2V0LgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfQVNTT0NJQVRJT04sCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCwgYmVjYXVzZSBhIHRpbWVvdXQKKwkgKiBvY2N1cnJlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9USU1FT1VULAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlIHVzZXIKKwkgKiBzcGVjaWZpZWQgYSB2YWx1ZSB0aGF0IGlzIGVpdGhlciBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUsCisKKwkvKioKKwkgKiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkLCBiZWNhdXNlIHRoZSBudW1iZXIKKwkgKiBvZiBtZXNzYWdlcyAoTVNJLVgpIGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfTUVTU0FHRV9DT1VOVCwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1ldGhvZCBmYWlsZWQgZHVlIHRvIGEgbGFjayBvZgorCSAqIGF2YWlsYWJsZSBOQ1EgdGFncy4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9OT19OQ1FfVEFHX0FWQUlMQUJMRSwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgYSBwcm90b2NvbCB2aW9sYXRpb24gaGFzIG9jY3VycmVkIG9uIHRoZQorCSAqIGxpbmsuCisJICovCisJU0NJX0ZBSUxVUkVfUFJPVE9DT0xfVklPTEFUSU9OLAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgYSBmYWlsdXJlIGNvbmRpdGlvbiB0aGF0IHJldHJ5IG1heSBoZWxwIHRvIGNsZWFyLgorCSAqLworCVNDSV9GQUlMVVJFX1JFVFJZX1JFUVVJUkVELAorCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHJldHJ5IGxpbWl0IHdhcyByZWFjaGVkIHdoZW4gYSByZXRyeSBpcyBhdHRlbXB0ZWQKKwkgKi8KKwlTQ0lfRkFJTFVSRV9SRVRSWV9MSU1JVF9SRUFDSEVELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIG1ldGhvZCB3YXMgcGFydGx5IHN1Y2Nlc3NmdWwuCisJICogTW9zdGx5LCB0aGlzIHN0YXR1cyBpcyB1c2VkIHdoZW4gYSBMVU5fUkVTRVQgaXNzdWVkIHRvIGFuIGV4cGFuZGVyIGF0dGFjaGVkCisJICogU1RQIGRldmljZSBpbiBSRUFEWSBOQ1Egc3Vic3RhdGUgbmVlZHMgdG8gaGF2ZSBSTkMgc3VzcGVuZGVkL3Jlc3VtZWQKKwkgKiBiZWZvcmUgcG9zdGluZyBUQy4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTLAorCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgYW4gaWxsZWdhbCBwaHkgY29ubmVjdGlvbiBiYXNlZCBvbiB0aGUgcm91dGluZyBhdHRyaWJ1dGUKKwkgKiBvZiBib3RoIGV4cGFuZGVyIHBoeSBhdHRhY2hlZCB0byBlYWNoIG90aGVyLgorCSAqLworCVNDSV9GQUlMVVJFX0lMTEVHQUxfUk9VVElOR19BVFRSSUJVVEVfQ09ORklHVVJBVElPTiwKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIGEgQ09ORklHIFJPVVRFIElORk8gY29tbWFuZCBoYXMgYSByZXNwb25zZSB3aXRoIGZ1bmN0aW9uIHJlc3VsdAorCSAqIElOREVYIERPRVMgTk9UIEVYSVNULCB1c3VhbGx5IG1lYW5zIGV4Y2VlZGluZyBtYXggcm91dGUgaW5kZXguCisJICovCisJU0NJX0ZBSUxVUkVfRVhDRUVEX01BWF9ST1VURV9JTkRFWCwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgYW4gdW5zdXBwb3J0ZWQgUENJIGRldmljZSBJRCBoYXMgYmVlbgorCSAqIHNwZWNpZmllZC4gIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXR0ZW1wdHMgdG8gaW52b2tlCisJICogc2NpX2xpYnJhcnlfYWxsb2NhdGVfY29udHJvbGxlcigpIHdpbGwgZmFpbC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QQ0lfREVWSUNFX0lECisKK307CisKKy8qKgorICogZW51bSBzY2lfaW9fc3RhdHVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCBvZiB0aGUgcG9zc2libGUgSU8KKyAqICAgIGNvbXBsZXRpb24gc3RhdHVzIHZhbHVlcy4gIEVhY2ggdmFsdWUgaW4gdGhpcyBlbnVtZXJhdGlvbiBtYXBzIGRpcmVjdGx5CisgKiAgICB0byBhIHZhbHVlIGluIHRoZSBlbnVtIHNjaV9zdGF0dXMgZW51bWVyYXRpb24uICBQbGVhc2UgcmVmZXIgdG8gdGhhdAorICogICAgZW51bWVyYXRpb24gZm9yIGRldGFpbGVkIGNvbW1lbnRzIGNvbmNlcm5pbmcgd2hhdCB0aGUgc3RhdHVzIHJlcHJlc2VudHMuCisgKgorICogQWRkIHRoZSBBUEkgdG8gcmV0cmlldmUgdGhlIFNDVSBzdGF0dXMgZnJvbSB0aGUgY29yZS4gQ2hlY2sgdG8gc2VlIHRoYXQgdGhlCisgKiBmb2xsb3dpbmcgc3RhdHVzIGFyZSBwcm9wZXJseSBoYW5kbGVkOiAtIFNDSV9JT19GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MCisgKiAtIFNDSV9JT19GQUlMVVJFX0lOVkFMSURfSU9fVEFHCisgKi8KK2VudW0gc2NpX2lvX3N0YXR1cyB7CisJU0NJX0lPX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgPSBTQ0lfU1VDQ0VTUywKKwlTQ0lfSU9fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICA9IFNDSV9GQUlMVVJFLAorCVNDSV9JT19TVUNDRVNTX0NPTVBMRVRFX0JFRk9SRV9TVEFSVCAgID0gU0NJX1NVQ0NFU1NfSU9fQ09NUExFVEVfQkVGT1JFX1NUQVJULAorCVNDSV9JT19TVUNDRVNTX0lPX0RPTkVfRUFSTFkgICAgICAgICAgID0gU0NJX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWSwKKwlTQ0lfSU9fRkFJTFVSRV9JTlZBTElEX1NUQVRFICAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEUsCisJU0NJX0lPX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyAgPSBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCVNDSV9JT19GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MICAgID0gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wsCisJU0NJX0lPX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRCwKKwlTQ0lfSU9fRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0VSUiA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSLAorCVNDSV9JT19GQUlMVVJFX1RFUk1JTkFURUQgICAgICAgICAgICAgID0gU0NJX0ZBSUxVUkVfSU9fVEVSTUlOQVRFRCwKKwlTQ0lfSU9fRkFJTFVSRV9SRVFVSVJFU19TQ1NJX0FCT1JUICAgICA9IFNDSV9GQUlMVVJFX0lPX1JFUVVJUkVTX1NDU0lfQUJPUlQsCisJU0NJX0lPX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSwKKwlTQ0lfSU9fRkFJTFVSRV9OT19OQ1FfVEFHX0FWQUlMQUJMRSAgICA9IFNDSV9GQUlMVVJFX05PX05DUV9UQUdfQVZBSUxBQkxFLAorCVNDSV9JT19GQUlMVVJFX1BST1RPQ09MX1ZJT0xBVElPTiAgICAgID0gU0NJX0ZBSUxVUkVfUFJPVE9DT0xfVklPTEFUSU9OLAorCisJU0NJX0lPX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCA9IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQsCisKKwlTQ0lfSU9fRkFJTFVSRV9SRVRSWV9SRVFVSVJFRCAgICAgID0gU0NJX0ZBSUxVUkVfUkVUUllfUkVRVUlSRUQsCisJU0NJX0lPX0ZBSUxVUkVfUkVUUllfTElNSVRfUkVBQ0hFRCA9IFNDSV9GQUlMVVJFX1JFVFJZX0xJTUlUX1JFQUNIRUQsCisJU0NJX0lPX0ZBSUxVUkVfSU5WQUxJRF9SRU1PVEVfREVWSUNFID0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9SRU1PVEVfREVWSUNFCit9OworCisvKioKKyAqIGVudW0gc2NpX3Rhc2tfc3RhdHVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCBvZiB0aGUgcG9zc2libGUgdGFzaworICogICAgY29tcGxldGlvbiBzdGF0dXMgdmFsdWVzLiAgRWFjaCB2YWx1ZSBpbiB0aGlzIGVudW1lcmF0aW9uIG1hcHMgZGlyZWN0bHkKKyAqICAgIHRvIGEgdmFsdWUgaW4gdGhlIGVudW0gc2NpX3N0YXR1cyBlbnVtZXJhdGlvbi4gIFBsZWFzZSByZWZlciB0byB0aGF0CisgKiAgICBlbnVtZXJhdGlvbiBmb3IgZGV0YWlsZWQgY29tbWVudHMgY29uY2VybmluZyB3aGF0IHRoZSBzdGF0dXMgcmVwcmVzZW50cy4KKyAqCisgKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgZm9sbG93aW5nIHN0YXR1cyBhcmUgcHJvcGVybHkgaGFuZGxlZDoKKyAqLworZW51bSBzY2lfdGFza19zdGF0dXMgeworCVNDSV9UQVNLX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgPSBTQ0lfU1VDQ0VTUywKKwlTQ0lfVEFTS19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgID0gU0NJX0ZBSUxVUkUsCisJU0NJX1RBU0tfRkFJTFVSRV9JTlZBTElEX1NUQVRFICAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEUsCisJU0NJX1RBU0tfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTICA9IFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMsCisJU0NJX1RBU0tfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCAgICA9IFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MLAorCVNDSV9UQVNLX0ZBSUxVUkVfSU5WQUxJRF9UQUcgICAgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX0lPX1RBRywKKwlTQ0lfVEFTS19GQUlMVVJFX1JFU1BPTlNFX1ZBTElEICAgICAgICAgID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQsCisJU0NJX1RBU0tfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0VSUiA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSLAorCVNDSV9UQVNLX0ZBSUxVUkVfVEVSTUlOQVRFRCAgICAgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JT19URVJNSU5BVEVELAorCVNDSV9UQVNLX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSwKKworCVNDSV9UQVNLX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCA9IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQsCisJU0NJX1RBU0tfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTID0gU0NJX0ZBSUxVUkVfUkVTRVRfREVWSUNFX1BBUlRJQUxfU1VDQ0VTUworCit9OworCisvKioKKyAqIHNjaV9zd2FiMzJfY3B5IC0gY29udmVydCBiZXR3ZWVuIHNjc2kgYW5kIHNjdS1oYXJkd2FyZSBieXRlIGZvcm1hdAorICogQGRlc3Q6IHJlY2VpdmUgdGhlIDQtYnl0ZSBlbmRpYW4gc3dhcHBlZCB2ZXJzaW9uIG9mIHNyYworICogQHNyYzogd29yZCBhbGlnbmVkIHNvdXJjZSBidWZmZXIKKyAqCisgKiBzY3UgaGFyZHdhcmUgaGFuZGxlcyBTU1AvU01QIGNvbnRyb2wsIHJlc3BvbnNlLCBhbmQgdW5pZGVudGlmaWVkCisgKiBmcmFtZXMgaW4gImJpZyBlbmRpYW4gZHdvcmQiIG9yZGVyLiAgUmVnYXJkbGVzcyBvZiBob3N0IGVuZGlhbiB0aGlzCisgKiBpcyBhbHdheXMgYSBzd2FiMzIoKS1wZXItZHdvcmQgY29udmVyc2lvbiBvZiB0aGUgc3RhbmRhcmQgZGVmaW5pdGlvbiwKKyAqIGkuZS4gc2luZ2xlIGJ5dGUgZmllbGRzIHN3YXBwZWQgYW5kIG11bHRpLWJ5dGUgZmllbGRzIGluIGxpdHRsZS0KKyAqIGVuZGlhbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX3N3YWIzMl9jcHkodm9pZCAqX2Rlc3QsIHZvaWQgKl9zcmMsIHNzaXplX3Qgd29yZF9jbnQpCit7CisJdTMyICpkZXN0ID0gX2Rlc3QsICpzcmMgPSBfc3JjOworCisJd2hpbGUgKC0td29yZF9jbnQgPj0gMCkKKwkJZGVzdFt3b3JkX2NudF0gPSBzd2FiMzIoc3JjW3dvcmRfY250XSk7Cit9CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIG5vX291dGJvdW5kX3Rhc2tfdG87CitleHRlcm4gdTE2IHNzcF9tYXhfb2NjX3RvOworZXh0ZXJuIHUxNiBzdHBfbWF4X29jY190bzsKK2V4dGVybiB1MTYgc3NwX2luYWN0aXZlX3RvOworZXh0ZXJuIHUxNiBzdHBfaW5hY3RpdmVfdG87CitleHRlcm4gdW5zaWduZWQgY2hhciBwaHlfZ2VuOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbWF4X2NvbmN1cnJfc3BpbnVwOworCitpcnFyZXR1cm5fdCBpc2NpX21zaXhfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpOworaXJxcmV0dXJuX3QgaXNjaV9pbnR4X2lzcihpbnQgdmVjLCB2b2lkICpkYXRhKTsKK2lycXJldHVybl90IGlzY2lfZXJyb3JfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpOworCisvKgorICogRWFjaCB0aW1lciBpcyBhc3NvY2lhdGVkIHdpdGggYSBjYW5jZWxsYXRpb24gZmxhZyB0aGF0IGlzIHNldCB3aGVuCisgKiBkZWxfdGltZXIoKSBpcyBjYWxsZWQgYW5kIGNoZWNrZWQgaW4gdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzCisgKiBpcyBuZWVkZWQgc2luY2UgZGVsX3RpbWVyX3N5bmMoKSBjYW5ub3QgYmUgY2FsbGVkIHdpdGggc2NpX2xvY2sgaGVsZC4KKyAqIEZvciBkZWluaXQgaG93ZXZlciwgZGVsX3RpbWVyX3N5bmMoKSBpcyB1c2VkIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jay4KKyAqLworc3RydWN0IHNjaV90aW1lciB7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJYm9vbAkJCWNhbmNlbDsKK307CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgc2NpX2luaXRfdGltZXIoc3RydWN0IHNjaV90aW1lciAqdG1yLCB2b2lkICgqZm4pKHVuc2lnbmVkIGxvbmcpKQoreworCXRtci0+dGltZXIuZnVuY3Rpb24gPSBmbjsKKwl0bXItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdG1yOworCXRtci0+Y2FuY2VsID0gMDsKKwlpbml0X3RpbWVyKCZ0bXItPnRpbWVyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjaV9tb2RfdGltZXIoc3RydWN0IHNjaV90aW1lciAqdG1yLCB1bnNpZ25lZCBsb25nIG1zZWMpCit7CisJdG1yLT5jYW5jZWwgPSAwOworCW1vZF90aW1lcigmdG1yLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXNlYykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX2RlbF90aW1lcihzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIpCit7CisJdG1yLT5jYW5jZWwgPSAxOworCWRlbF90aW1lcigmdG1yLT50aW1lcik7Cit9CisKK3N0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lIHsKKwljb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgKnN0YXRlX3RhYmxlOworCXUzMiBpbml0aWFsX3N0YXRlX2lkOworCXUzMiBjdXJyZW50X3N0YXRlX2lkOworCXUzMiBwcmV2aW91c19zdGF0ZV9pZDsKK307CisKK3R5cGVkZWYgdm9pZCAoKnNjaV9zdGF0ZV90cmFuc2l0aW9uX3QpKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSk7CisKK3N0cnVjdCBzY2lfYmFzZV9zdGF0ZSB7CisJc2NpX3N0YXRlX3RyYW5zaXRpb25fdCBlbnRlcl9zdGF0ZTsJLyogQ2FsbGVkIG9uIHN0YXRlIGVudHJ5ICovCisJc2NpX3N0YXRlX3RyYW5zaXRpb25fdCBleGl0X3N0YXRlOwkvKiBDYWxsZWQgb24gc3RhdGUgZXhpdCAqLworfTsKKworZXh0ZXJuIHZvaWQgc2NpX2luaXRfc20oc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtLAorCQkJY29uc3Qgc3RydWN0IHNjaV9iYXNlX3N0YXRlICpzdGF0ZV90YWJsZSwKKwkJCXUzMiBpbml0aWFsX3N0YXRlKTsKK2V4dGVybiB2b2lkIHNjaV9jaGFuZ2Vfc3RhdGUoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtLCB1MzIgbmV4dF9zdGF0ZSk7CisjZW5kaWYgIC8qIF9fSVNDSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzMTNhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5jCkBAIC0wLDAgKzEsMTMxMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgorCisvKiBNYXhpbXVtIGFyYml0cmF0aW9uIHdhaXQgdGltZSBpbiBtaWNyby1zZWNvbmRzICovCisjZGVmaW5lIFNDSUNfU0RTX1BIWV9NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FICAoNzAwKQorCitlbnVtIHNhc19saW5rcmF0ZSBzY2lfcGh5X2xpbmtyYXRlKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlyZXR1cm4gaXBoeS0+bWF4X25lZ290aWF0ZWRfc3BlZWQ7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9waHlfdHJhbnNwb3J0X2xheWVyX2luaXRpYWxpemF0aW9uKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkgICAgICAgc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKnJlZykKK3sKKwl1MzIgdGxfY29udHJvbDsKKworCWlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgPSByZWc7CisKKwl3cml0ZWwoU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYLAorCQkmaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycy0+c3RwX3JuaSk7CisKKwkvKgorCSAqIEhhcmR3YXJlIHRlYW0gcmVjb21tZW5kcyB0aGF0IHdlIGVuYWJsZSB0aGUgU1RQIHByZWZldGNoIGZvciBhbGwKKwkgKiB0cmFuc3BvcnRzCisJICovCisJdGxfY29udHJvbCA9IHJlYWRsKCZpcGh5LT50cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKKwl0bF9jb250cm9sIHw9IFNDVV9UTENSX0dFTl9CSVQoU1RQX1dSSVRFX0RBVEFfUFJFRkVUQ0gpOworCXdyaXRlbCh0bF9jb250cm9sLCAmaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9waHlfbGlua19sYXllcl9pbml0aWFsaXphdGlvbihzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJCQkJICBzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKnJlZykKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwaHktPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwlpbnQgcGh5X2lkeCA9IGlwaHktPnBoeV9pbmRleDsKKwlzdHJ1Y3Qgc2NpX3BoeV91c2VyX3BhcmFtcyAqcGh5X3VzZXIgPSAmaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5waHlzW3BoeV9pZHhdOworCXN0cnVjdCBzY2lfcGh5X29lbV9wYXJhbXMgKnBoeV9vZW0gPQorCQkmaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLnBoeXNbcGh5X2lkeF07CisJdTMyIHBoeV9jb25maWd1cmF0aW9uOworCXN0cnVjdCBzY2lfcGh5X2NhcCBwaHlfY2FwOworCXUzMiBwYXJpdHlfY2hlY2sgPSAwOworCXUzMiBwYXJpdHlfY291bnQgPSAwOworCXUzMiBsbGN0bCwgbGlua19yYXRlOworCXUzMiBjbGtzbV92YWx1ZSA9IDA7CisKKwlpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycyA9IHJlZzsKKworCS8qIFNldCBvdXIgSURFTlRJRlkgZnJhbWUgZGF0YSAqLworCSNkZWZpbmUgU0NJX0VORF9ERVZJQ0UgMHgwMQorCisJd3JpdGVsKFNDVV9TQVNfVElJRF9HRU5fQklUKFNNUF9JTklUSUFUT1IpIHwKKwkgICAgICAgU0NVX1NBU19USUlEX0dFTl9CSVQoU1NQX0lOSVRJQVRPUikgfAorCSAgICAgICBTQ1VfU0FTX1RJSURfR0VOX0JJVChTVFBfSU5JVElBVE9SKSB8CisJICAgICAgIFNDVV9TQVNfVElJRF9HRU5fQklUKERBX1NBVEFfSE9TVCkgfAorCSAgICAgICBTQ1VfU0FTX1RJSURfR0VOX1ZBTChERVZJQ0VfVFlQRSwgU0NJX0VORF9ERVZJQ0UpLAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnRyYW5zbWl0X2lkZW50aWZpY2F0aW9uKTsKKworCS8qIFdyaXRlIHRoZSBkZXZpY2UgU0FTIEFkZHJlc3MgKi8KKwl3cml0ZWwoMHhGRURDQkE5OCwKKwkgICAgICAgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zYXNfZGV2aWNlX25hbWVfaGlnaCk7CisJd3JpdGVsKHBoeV9pZHgsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+c2FzX2RldmljZV9uYW1lX2xvdyk7CisKKwkvKiBXcml0ZSB0aGUgc291cmNlIFNBUyBBZGRyZXNzICovCisJd3JpdGVsKHBoeV9vZW0tPnNhc19hZGRyZXNzLmhpZ2gsCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+c291cmNlX3Nhc19hZGRyZXNzX2hpZ2gpOworCXdyaXRlbChwaHlfb2VtLT5zYXNfYWRkcmVzcy5sb3csCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+c291cmNlX3Nhc19hZGRyZXNzX2xvdyk7CisKKwkvKiBDbGVhciBhbmQgU2V0IHRoZSBQSFkgSWRlbnRpZmllciAqLworCXdyaXRlbCgwLCAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmlkZW50aWZ5X2ZyYW1lX3BoeV9pZCk7CisJd3JpdGVsKFNDVV9TQVNfVElQSURfR0VOX1ZBTFVFKElELCBwaHlfaWR4KSwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5pZGVudGlmeV9mcmFtZV9waHlfaWQpOworCisJLyogQ2hhbmdlIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBwaHkgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCXBoeV9jb25maWd1cmF0aW9uID0KKwkJcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwkvKiBIb2xkIE9PQiBzdGF0ZSBtYWNoaW5lIGluIHJlc2V0ICovCisJcGh5X2NvbmZpZ3VyYXRpb24gfD0gIFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9SRVNFVCk7CisJd3JpdGVsKHBoeV9jb25maWd1cmF0aW9uLAorCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgU05XIGNhcGFiaWxpdGllcyAqLworCXBoeV9jYXAuYWxsID0gMDsKKwlwaHlfY2FwLnN0YXJ0ID0gMTsKKwlwaHlfY2FwLmdlbjNfbm9fc3NjID0gMTsKKwlwaHlfY2FwLmdlbjJfbm9fc3NjID0gMTsKKwlwaHlfY2FwLmdlbjFfbm9fc3NjID0gMTsKKwlpZiAoaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIuZG9fZW5hYmxlX3NzYyA9PSB0cnVlKSB7CisJCXBoeV9jYXAuZ2VuM19zc2MgPSAxOworCQlwaHlfY2FwLmdlbjJfc3NjID0gMTsKKwkJcGh5X2NhcC5nZW4xX3NzYyA9IDE7CisJfQorCisJLyoKKwkgKiBUaGUgU0FTIHNwZWNpZmljYXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHBoeV9jYXBhYmlsaXRpZXMgdGhhdAorCSAqIGFyZSB0cmFuc21pdHRlZCBzaGFsbCBoYXZlIGFuIGV2ZW4gcGFyaXR5LiAgQ2FsY3VsYXRlIHRoZSBwYXJpdHkuICovCisJcGFyaXR5X2NoZWNrID0gcGh5X2NhcC5hbGw7CisJd2hpbGUgKHBhcml0eV9jaGVjayAhPSAwKSB7CisJCWlmIChwYXJpdHlfY2hlY2sgJiAweDEpCisJCQlwYXJpdHlfY291bnQrKzsKKwkJcGFyaXR5X2NoZWNrID4+PSAxOworCX0KKworCS8qCisJICogSWYgcGFyaXR5IGluZGljYXRlcyB0aGVyZSBhcmUgYW4gb2RkIG51bWJlciBvZiBiaXRzIHNldCwgdGhlbgorCSAqIHNldCB0aGUgcGFyaXR5IGJpdCB0byAxIGluIHRoZSBwaHkgY2FwYWJpbGl0aWVzLiAqLworCWlmICgocGFyaXR5X2NvdW50ICUgMikgIT0gMCkKKwkJcGh5X2NhcC5wYXJpdHkgPSAxOworCisJd3JpdGVsKHBoeV9jYXAuYWxsLCAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jYXBhYmlsaXRpZXMpOworCisJLyogU2V0IHRoZSBlbmFibGUgc3BpbnVwIHBlcmlvZCBidXQgZGlzYWJsZSB0aGUgYWJpbGl0eSB0byBzZW5kCisJICogbm90aWZ5IGVuYWJsZSBzcGludXAKKwkgKi8KKwl3cml0ZWwoU0NVX0VOU1BJTlVQX0dFTl9WQUwoQ09VTlQsCisJCQlwaHlfdXNlci0+bm90aWZ5X2VuYWJsZV9zcGluX3VwX2luc2VydGlvbl9mcmVxdWVuY3kpLAorCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPm5vdGlmeV9lbmFibGVfc3BpbnVwX2NvbnRyb2wpOworCisJLyogV3JpdGUgdGhlIEFMSUdOIEluc2VydGlvbiBGZXJlcXVlbmN5IGZvciBjb25uZWN0ZWQgcGh5IGFuZAorCSAqIGlucGVuZGVudCBvZiBjb25uZWN0ZWQgc3RhdGUKKwkgKi8KKwljbGtzbV92YWx1ZSA9IFNDVV9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0dFTl9WQUwoQ09OTkVDVEVELAorCQkJcGh5X3VzZXItPmluX2Nvbm5lY3Rpb25fYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSk7CisKKwljbGtzbV92YWx1ZSB8PSBTQ1VfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9HRU5fVkFMKEdFTkVSQUwsCisJCQlwaHlfdXNlci0+YWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSk7CisKKwl3cml0ZWwoY2xrc21fdmFsdWUsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+Y2xvY2tfc2tld19tYW5hZ2VtZW50KTsKKworCS8qIEB0b2RvIFByb3ZpZGUgYSB3YXkgdG8gd3JpdGUgdGhpcyByZWdpc3RlciBjb3JyZWN0bHkgKi8KKwl3cml0ZWwoMHgwMjEwODQyMSwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5hZmVfbG9va3VwX3RhYmxlX2NvbnRyb2wpOworCisJbGxjdGwgPSBTQ1VfU0FTX0xMQ1RMX0dFTl9WQUwoTk9fT1VUQk9VTkRfVEFTS19USU1FT1VULAorCQkodTgpaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQpOworCisJc3dpdGNoIChwaHlfdXNlci0+bWF4X3NwZWVkX2dlbmVyYXRpb24pIHsKKwljYXNlIFNDSUNfU0RTX1BBUk1fR0VOM19TUEVFRDoKKwkJbGlua19yYXRlID0gU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9HRU4zOworCQlicmVhazsKKwljYXNlIFNDSUNfU0RTX1BBUk1fR0VOMl9TUEVFRDoKKwkJbGlua19yYXRlID0gU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9HRU4yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsaW5rX3JhdGUgPSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjE7CisJCWJyZWFrOworCX0KKwlsbGN0bCB8PSBTQ1VfU0FTX0xMQ1RMX0dFTl9WQUwoTUFYX0xJTktfUkFURSwgbGlua19yYXRlKTsKKwl3cml0ZWwobGxjdGwsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9jb250cm9sKTsKKworCWlmIChpc19hMihpaG9zdC0+cGRldikpIHsKKwkJLyogUHJvZ3JhbSB0aGUgbWF4IEFSQiB0aW1lIGZvciB0aGUgUEhZIHRvIDcwMHVzIHNvIHdlIGludGVyLW9wZXJhdGUgd2l0aAorCQkgKiB0aGUgUE1DIGV4cGFuZGVyIHdoaWNoIHNodXRzIGRvd24gUEhZcyBpZiB0aGUgZXhwYW5kZXIgUEhZIGdlbmVyYXRlcyB0b28KKwkJICogbWFueSBicmVha3MuICBUaGlzIHRpbWUgdmFsdWUgd2lsbCBndWFyYW50ZWUgdGhhdCB0aGUgaW5pdGlhdG9yIFBIWSB3aWxsCisJCSAqIGdlbmVyYXRlIHRoZSBicmVhay4KKwkJICovCisJCXdyaXRlbChTQ0lDX1NEU19QSFlfTUFYX0FSQklUUkFUSU9OX1dBSVRfVElNRSwKKwkJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bWF4aW11bV9hcmJpdHJhdGlvbl93YWl0X3RpbWVyX3RpbWVvdXQpOworCX0KKworCS8qIERpc2FibGUgbGluayBsYXllciBoYW5nIGRldGVjdGlvbiwgcmVseSBvbiB0aGUgT1MgdGltZW91dCBmb3IgSS9PIHRpbWVvdXRzLiAqLworCXdyaXRlbCgwLCAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmxpbmtfbGF5ZXJfaGFuZ19kZXRlY3Rpb25fdGltZW91dCk7CisKKwkvKiBXZSBjYW4gZXhpdCB0aGUgaW5pdGlhbCBzdGF0ZSB0byB0aGUgc3RvcHBlZCBzdGF0ZSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUT1BQRUQpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwaHlfc2F0YV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCppcGh5KSwgc2F0YV90aW1lcik7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcGh5LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCWRldl9kYmcoc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJICIlczogU0NJQyBTRFMgUGh5IDB4JXAgZGlkIG5vdCByZWNlaXZlIHNpZ25hdHVyZSBmaXMgYmVmb3JlICIKKwkJICJ0aW1lb3V0LlxuIiwKKwkJIF9fZnVuY19fLAorCQkgaXBoeSk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBwb3J0IGN1cnJlbnRseSBjb250YWluaW5nIHRoaXMgcGh5LiBJZiB0aGUgcGh5IGlzCisgKiAgICBjdXJyZW50bHkgY29udGFpbmVkIGJ5IHRoZSBkdW1teSBwb3J0LCB0aGVuIHRoZSBwaHkgaXMgY29uc2lkZXJlZCB0byBub3QKKyAqICAgIGJlIHBhcnQgb2YgYSBwb3J0LgorICogQHNjaV9waHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcGh5IGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUKKyAqICAgIGNvbnRhaW5pbmcgcG9ydC4KKyAqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEgcG9ydCB0aGF0IGNvbnRhaW5zIHRoZSBzdXBwbGllZCBwaHkuCisgKiBOVUxMIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIHBoeSBpcyBub3QgcGFydCBvZiBhIHJlYWwKKyAqIHBvcnQgKGkuZS4gaXQncyBjb250YWluZWQgaW4gdGhlIGR1bW15IHBvcnQpLiAhTlVMTCBBbGwgb3RoZXIKKyAqIHZhbHVlcyBpbmRpY2F0ZSBhIGhhbmRsZS9wb2ludGVyIHRvIHRoZSBwb3J0IGNvbnRhaW5pbmcgdGhlIHBoeS4KKyAqLworc3RydWN0IGlzY2lfcG9ydCAqcGh5X2dldF9ub25fZHVtbXlfcG9ydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5vd25pbmdfcG9ydDsKKworCWlmIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9PSBTQ0lDX1NEU19EVU1NWV9QT1JUKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpcGh5LT5vd25pbmdfcG9ydDsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFzc2lnbiBhIHBvcnQgdG8gdGhlIHBoeSBvYmplY3QuCisgKiBAb3V0XTogaXBoeSBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHBoeSBmb3Igd2hpY2ggdG8gYXNzaWduIGEgcG9ydAorICogICAgb2JqZWN0LgorICoKKyAqCisgKi8KK3ZvaWQgc2NpX3BoeV9zZXRfcG9ydCgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJaXBoeS0+b3duaW5nX3BvcnQgPSBpcG9ydDsKKworCWlmIChpcGh5LT5iY25fcmVjZWl2ZWRfd2hpbGVfcG9ydF91bmFzc2lnbmVkKSB7CisJCWlwaHktPmJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQgPSBmYWxzZTsKKwkJc2NpX3BvcnRfYnJvYWRjYXN0X2NoYW5nZV9yZWNlaXZlZChpcGh5LT5vd25pbmdfcG9ydCwgaXBoeSk7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9pbml0aWFsaXplKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkgICBzdHJ1Y3Qgc2N1X3RyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqdGwsCisJCQkJICAgc3RydWN0IHNjdV9saW5rX2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICpsbCkKK3sKKwkvKiBQZXJmcm9tIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgVEwgaGFyZHdhcmUgKi8KKwlzY2lfcGh5X3RyYW5zcG9ydF9sYXllcl9pbml0aWFsaXphdGlvbihpcGh5LCB0bCk7CisKKwkvKiBQZXJvZnJtIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgUEUgaGFyZHdhcmUgKi8KKwlzY2lfcGh5X2xpbmtfbGF5ZXJfaW5pdGlhbGl6YXRpb24oaXBoeSwgbGwpOworCisJLyogVGhlcmUgaXMgbm90aGluZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW4gdGhpcyBzdGF0ZSBqdXN0CisJICogdHJhbnNpdGlvbiB0byB0aGUgc3RvcHBlZCBzdGF0ZQorCSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUT1BQRUQpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGFzc2lnbnMgdGhlIGRpcmVjdCBhdHRhY2hlZCBkZXZpY2UgSUQgZm9yIHRoaXMgcGh5LgorICoKKyAqIEBpcGh5IFRoZSBwaHkgZm9yIHdoaWNoIHRoZSBkaXJlY3QgYXR0YWNoZWQgZGV2aWNlIGlkIGlzIHRvCisgKiAgICAgICBiZSBhc3NpZ25lZC4KKyAqIEBkZXZpY2VfaWQgVGhlIGRpcmVjdCBhdHRhY2hlZCBkZXZpY2UgSUQgdG8gYXNzaWduIHRvIHRoZSBwaHkuCisgKiAgICAgICBUaGlzIHdpbGwgZWl0aGVyIGJlIHRoZSBSTmkgZm9yIHRoZSBkZXZpY2Ugb3IgYW4gaW52YWxpZCBSTmkgaWYgdGhlcmUKKyAqICAgICAgIGlzIG5vIGN1cnJlbnQgZGV2aWNlIGFzc2lnbmVkIHRvIHRoZSBwaHkuCisgKi8KK3ZvaWQgc2NpX3BoeV9zZXR1cF90cmFuc3BvcnQoc3RydWN0IGlzY2lfcGh5ICppcGh5LCB1MzIgZGV2aWNlX2lkKQoreworCXUzMiB0bF9jb250cm9sOworCisJd3JpdGVsKGRldmljZV9pZCwgJmlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMtPnN0cF9ybmkpOworCisJLyoKKwkgKiBUaGUgcmVhZCBzaG91bGQgZ3VhcmFudGVlIHRoYXQgdGhlIGZpcnN0IHdyaXRlIGdldHMgcG9zdGVkCisJICogYmVmb3JlIHRoZSBuZXh0IHdyaXRlCisJICovCisJdGxfY29udHJvbCA9IHJlYWRsKCZpcGh5LT50cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKKwl0bF9jb250cm9sIHw9IFNDVV9UTENSX0dFTl9CSVQoQ0xFQVJfVENJX05DUV9NQVBQSU5HX1RBQkxFKTsKKwl3cml0ZWwodGxfY29udHJvbCwgJmlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N1c3BlbmQoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXUzMiBzY3Vfc2FzX3BjZmdfdmFsdWU7CisKKwlzY3Vfc2FzX3BjZmdfdmFsdWUgPQorCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKwlzY3Vfc2FzX3BjZmdfdmFsdWUgfD0gU0NVX1NBU19QQ0ZHX0dFTl9CSVQoU1VTUEVORF9QUk9UT0NPTF9FTkdJTkUpOworCXdyaXRlbChzY3Vfc2FzX3BjZmdfdmFsdWUsCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJc2NpX3BoeV9zZXR1cF90cmFuc3BvcnQoaXBoeSwgU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYKTsKK30KKwordm9pZCBzY2lfcGh5X3Jlc3VtZShzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXNjdV9zYXNfcGNmZ192YWx1ZSAmPSB+U0NVX1NBU19QQ0ZHX0dFTl9CSVQoU1VTUEVORF9QUk9UT0NPTF9FTkdJTkUpOworCXdyaXRlbChzY3Vfc2FzX3BjZmdfdmFsdWUsCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworfQorCit2b2lkIHNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzKQoreworCXNhcy0+aGlnaCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+c291cmNlX3Nhc19hZGRyZXNzX2hpZ2gpOworCXNhcy0+bG93ID0gcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfbG93KTsKK30KKwordm9pZCBzY2lfcGh5X2dldF9hdHRhY2hlZF9zYXNfYWRkcmVzcyhzdHJ1Y3QgaXNjaV9waHkgKmlwaHksIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhcykKK3sKKwlzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lICppYWY7CisKKwlpYWYgPSAmaXBoeS0+ZnJhbWVfcmN2ZC5pYWY7CisJbWVtY3B5KHNhcywgaWFmLT5zYXNfYWRkciwgU0FTX0FERFJfU0laRSk7Cit9CisKK3ZvaWQgc2NpX3BoeV9nZXRfcHJvdG9jb2xzKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IHNjaV9waHlfcHJvdG8gKnByb3RvKQoreworCXByb3RvLT5hbGwgPSByZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnRyYW5zbWl0X2lkZW50aWZpY2F0aW9uKTsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfc3RhcnQoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWVudW0gc2NpX3BoeV9zdGF0ZXMgc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKHN0YXRlICE9IFNDSV9QSFlfU1RPUFBFRCkgeworCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X3N0b3Aoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWVudW0gc2NpX3BoeV9zdGF0ZXMgc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BIWV9TVUJfSU5JVElBTDoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU46CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU46CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVI6CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BPV0VSOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QSFlfRU46CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1NQRUVEX0VOOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0lHX0ZJU19VRjoKKwljYXNlIFNDSV9QSFlfU1VCX0ZJTkFMOgorCWNhc2UgU0NJX1BIWV9SRUFEWToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUT1BQRUQpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfcmVzZXQoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWVudW0gc2NpX3BoeV9zdGF0ZXMgc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKHN0YXRlICE9IFNDSV9QSFlfUkVBRFkpIHsKKwkJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1JFU0VUVElORyk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9jb25zdW1lX3Bvd2VyX2hhbmRsZXIoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWVudW0gc2NpX3BoeV9zdGF0ZXMgc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1BPV0VSOiB7CisJCXUzMiBlbmFibGVfc3BpbnVwOworCisJCWVuYWJsZV9zcGludXAgPSByZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPm5vdGlmeV9lbmFibGVfc3BpbnVwX2NvbnRyb2wpOworCQllbmFibGVfc3BpbnVwIHw9IFNDVV9FTlNQSU5VUF9HRU5fQklUKEVOQUJMRSk7CisJCXdyaXRlbChlbmFibGVfc3BpbnVwLCAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPm5vdGlmeV9lbmFibGVfc3BpbnVwX2NvbnRyb2wpOworCisJCS8qIENoYW5nZSBzdGF0ZSB0byB0aGUgZmluYWwgc3RhdGUgdGhpcyBzdWJzdGF0ZSBtYWNoaW5lIGhhcyBydW4gdG8gY29tcGxldGlvbiAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfRklOQUwpOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BPV0VSOiB7CisJCXUzMiBzY3Vfc2FzX3BjZmdfdmFsdWU7CisKKwkJLyogUmVsZWFzZSB0aGUgc3BpbnVwIGhvbGQgc3RhdGUgYW5kIHJlc2V0IHRoZSBPT0Igc3RhdGUgbWFjaGluZSAqLworCQlzY3Vfc2FzX3BjZmdfdmFsdWUgPQorCQkJcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJCXNjdV9zYXNfcGNmZ192YWx1ZSAmPQorCQkJfihTQ1VfU0FTX1BDRkdfR0VOX0JJVChTQVRBX1NQSU5VUF9IT0xEKSB8IFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9FTkFCTEUpKTsKKwkJc2N1X3Nhc19wY2ZnX3ZhbHVlIHw9IFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9SRVNFVCk7CisJCXdyaXRlbChzY3Vfc2FzX3BjZmdfdmFsdWUsCisJCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCQkvKiBOb3cgcmVzdGFydCB0aGUgT09CIG9wZXJhdGlvbiAqLworCQlzY3Vfc2FzX3BjZmdfdmFsdWUgJj0gflNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9SRVNFVCk7CisJCXNjdV9zYXNfcGNmZ192YWx1ZSB8PSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfRU5BQkxFKTsKKwkJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJCS8qIENoYW5nZSBzdGF0ZSB0byB0aGUgZmluYWwgc3RhdGUgdGhpcyBzdWJzdGF0ZSBtYWNoaW5lIGhhcyBydW4gdG8gY29tcGxldGlvbiAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QSFlfRU4pOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydF9zYXNfbGlua190cmFpbmluZyhzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJLyogY29udGludWUgdGhlIGxpbmsgdHJhaW5pbmcgZm9yIHRoZSBwaHkgYXMgaWYgaXQgd2VyZSBhIFNBUyBQSFkKKwkgKiBpbnN0ZWFkIG9mIGEgU0FUQSBQSFkuIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGhhZCBhIFNBUworCSAqIFBIWSBERVRFQ1RFRCBldmVudCB3aGVuIHRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBleHBlY3RpbmcgYSBTQVRBIFBIWSBldmVudC4KKwkgKi8KKwl1MzIgcGh5X2NvbnRyb2w7CisKKwlwaHlfY29udHJvbCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXBoeV9jb250cm9sIHw9IFNDVV9TQVNfUENGR19HRU5fQklUKFNBVEFfU1BJTlVQX0hPTEQpOworCXdyaXRlbChwaHlfY29udHJvbCwKKwkgICAgICAgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1NQRUVEX0VOKTsKKworCWlwaHktPnByb3RvY29sID0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBUzsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydF9zYXRhX2xpbmtfdHJhaW5pbmcoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCS8qIFRoaXMgbWV0aG9kIGNvbnRpbnVlcyB0aGUgbGluayB0cmFpbmluZyBmb3IgdGhlIHBoeSBhcyBpZiBpdCB3ZXJlIGEgU0FUQSBQSFkKKwkgKiBpbnN0ZWFkIG9mIGEgU0FTIFBIWS4gIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGhhZCBhIFNBVEEKKwkgKiBTUElOVVAgSE9MRCBldmVudCB3aGVuIHRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBleHBlY3RpbmcgYSBTQVMgUEhZIGV2ZW50LiBub25lCisJICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVIpOworCisJaXBoeS0+cHJvdG9jb2wgPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQTsKK30KKworLyoqCisgKiBzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcgLSBwZXJmb3JtIHByb2Nlc3NpbmcgY29tbW9uIHRvCisgKiAgICBhbGwgcHJvdG9jb2xzIHVwb24gY29tcGxldGlvbiBvZiBsaW5rIHRyYWluaW5nLgorICogQHNjaV9waHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcGh5IG9iamVjdCBmb3Igd2hpY2ggbGluayB0cmFpbmluZworICogICAgaGFzIGNvbXBsZXRlZC4KKyAqIEBtYXhfbGlua19yYXRlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG1heGltdW0gbGluayByYXRlIHRvIGJlCisgKiAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBwaHkuCisgKiBAbmV4dF9zdGF0ZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBuZXh0IHN0YXRlIGZvciB0aGUgcGh5J3Mgc3RhcnRpbmcKKyAqICAgIHN1Yi1zdGF0ZSBtYWNoaW5lLgorICoKKyAqLworc3RhdGljIHZvaWQgc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkJICAgZW51bSBzYXNfbGlua3JhdGUgbWF4X2xpbmtfcmF0ZSwKKwkJCQkJICAgdTMyIG5leHRfc3RhdGUpCit7CisJaXBoeS0+bWF4X25lZ290aWF0ZWRfc3BlZWQgPSBtYXhfbGlua19yYXRlOworCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIG5leHRfc3RhdGUpOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgdTMyIGV2ZW50X2NvZGUpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9PU1NQX0VOOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEOgorCQkJc2NpX3BoeV9zdGFydF9zYXNfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWlwaHktPmlzX2luX2xpbmtfdHJhaW5pbmcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCQlzY2lfcGh5X3N0YXJ0X3NhdGFfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWlwaHktPmlzX2luX2xpbmtfdHJhaW5pbmcgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlldmVudF9jb2RlKTsKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU46CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBU19QSFlfREVURUNURUQ6CisJCQkvKgorCQkJICogV2h5IGlzIHRoaXMgYmVpbmcgcmVwb3J0ZWQgYWdhaW4gYnkgdGhlIGNvbnRyb2xsZXI/CisJCQkgKiBXZSB3b3VsZCByZS1lbnRlciB0aGlzIHN0YXRlIHNvIGp1c3Qgc3RheSBoZXJlICovCisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTXzE1OgorCQljYXNlIFNDVV9FVkVOVF9TQVNfMTVfU1NDOgorCQkJc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKGlwaHksIFNBU19MSU5LX1JBVEVfMV81X0dCUFMsCisJCQkJCQkgICAgICAgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVNfMzA6CisJCWNhc2UgU0NVX0VWRU5UX1NBU18zMF9TU0M6CisJCQlzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoaXBoeSwgU0FTX0xJTktfUkFURV8zXzBfR0JQUywKKwkJCQkJCSAgICAgICBTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUYpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBU182MDoKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTXzYwX1NTQzoKKwkJCXNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyhpcGh5LCBTQVNfTElOS19SQVRFXzZfMF9HQlBTLAorCQkJCQkJICAgICAgIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9TUElOVVBfSE9MRDoKKwkJCS8qCisJCQkgKiBXZSB3ZXJlIGRvaW5nIFNBUyBQSFkgbGluayB0cmFpbmluZyBhbmQgcmVjZWl2ZWQgYSBTQVRBIFBIWSBldmVudAorCQkJICogY29udGludWUgT09CL1NOIGFzIGlmIHRoaXMgd2VyZSBhIFNBVEEgUEhZICovCisJCQlzY2lfcGh5X3N0YXJ0X3NhdGFfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZXZlbnRfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qIEJhY2t1cCB0aGUgc3RhdGUgbWFjaGluZSAqLworCQkJc2NpX3BoeV9zdGFydF9zYXNfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBX1NQSU5VUF9IT0xEOgorCQkJLyogV2Ugd2VyZSBkb2luZyBTQVMgUEhZIGxpbmsgdHJhaW5pbmcgYW5kIHJlY2VpdmVkIGEKKwkJCSAqIFNBVEEgUEhZIGV2ZW50IGNvbnRpbnVlIE9PQi9TTiBhcyBpZiB0aGlzIHdlcmUgYQorCQkJICogU0FUQSBQSFkKKwkJCSAqLworCQkJc2NpX3BoeV9zdGFydF9zYXRhX2xpbmtfdHJhaW5pbmcoaXBoeSk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfUkVDRUlWRURfSURFTlRJRllfVElNRU9VVDoKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQljYXNlIFNDVV9FVkVOVF9IQVJEX1JFU0VUX1JFQ0VJVkVEOgorCQkJLyogU3RhcnQgdGhlIG9vYi9zbiBzdGF0ZSBtYWNoaW5lIG92ZXIgYWdhaW4gKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLCBldmVudF9jb2RlKTsKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVI6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX0xJTktfRkFJTFVSRToKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkIHVuZXhwZWN0ZWQgIgorCQkJCSJldmVudF9jb2RlICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWV2ZW50X2NvZGUpOworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVI6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX0xJTktfRkFJTFVSRToKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBX1NQSU5VUF9IT0xEOgorCQkJLyogVGhlc2UgZXZlbnRzIGFyZSByZWNlaXZlZCBldmVyeSAxMG1zIGFuZCBhcmUKKwkJCSAqIGV4cGVjdGVkIHdoaWxlIGluIHRoaXMgc3RhdGUKKwkJCSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qIFRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlIGluIHRoZSBwaHkgdHlwZSBiZWZvcmUgT09CL1NOIGZvciB0aGUKKwkJCSAqIFNBVEEgZmluaXNoZWQgc3RhcnQgZG93biB0aGUgU0FTIGxpbmsgdHJhbmluZyBwYXRoLgorCQkJICovCisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZXZlbnRfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCQkvKiBUaGVzZSBldmVudHMgbWlnaHQgYmUgcmVjZWl2ZWQgc2luY2Ugd2UgZG9udCBrbm93IGhvdyBtYW55IG1heSBiZSBpbgorCQkJICogdGhlIGNvbXBsZXRpb24gcXVldWUgd2hpbGUgd2FpdGluZyBmb3IgcG93ZXIKKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfUEhZX0RFVEVDVEVEOgorCQkJaXBoeS0+cHJvdG9jb2wgPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQTsKKworCQkJLyogV2UgaGF2ZSByZWNlaXZlZCB0aGUgU0FUQSBQSFkgbm90aWZpY2F0aW9uIGNoYW5nZSBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBU19QSFlfREVURUNURUQ6CisJCQkvKiBUaGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiB0aGUgcGh5IHR5cGUgYmVmb3JlIE9PQi9TTiBmb3IgdGhlCisJCQkgKiBTQVRBIGZpbmlzaGVkIHN0YXJ0IGRvd24gdGhlIFNBUyBsaW5rIHRyYW5pbmcgcGF0aC4KKwkJCSAqLworCQkJc2NpX3BoeV9zdGFydF9zYXNfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOzsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1NQRUVEX0VOOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9TQVRBX1BIWV9ERVRFQ1RFRDoKKwkJCS8qCisJCQkgKiBUaGUgaGFyZHdhcmUgcmVwb3J0cyBtdWx0aXBsZSBTQVRBIFBIWSBkZXRlY3RlZCBldmVudHMKKwkJCSAqIGlnbm9yZSB0aGUgZXh0cmFzICovCisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV8xNToKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV8xNV9TU0M6CisJCQlzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoaXBoeSwgU0FTX0xJTktfUkFURV8xXzVfR0JQUywKKwkJCQkJCSAgICAgICBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBXzMwOgorCQljYXNlIFNDVV9FVkVOVF9TQVRBXzMwX1NTQzoKKwkJCXNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyhpcGh5LCBTQVNfTElOS19SQVRFXzNfMF9HQlBTLAorCQkJCQkJICAgICAgIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUYpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfNjA6CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfNjBfU1NDOgorCQkJc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKGlwaHksIFNBU19MSU5LX1JBVEVfNl8wX0dCUFMsCisJCQkJCQkgICAgICAgU0NJX1BIWV9TVUJfQVdBSVRfU0lHX0ZJU19VRik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBU19QSFlfREVURUNURUQ6CisJCQkvKgorCQkJICogVGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIHBoeSB0eXBlIGJlZm9yZSBPT0IvU04gZm9yIHRoZQorCQkJICogU0FUQSBmaW5pc2hlZCBzdGFydCBkb3duIHRoZSBTQVMgbGluayB0cmFuaW5nIHBhdGguICovCisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSAiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sIGV2ZW50X2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCX0KKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9TQVRBX1BIWV9ERVRFQ1RFRDoKKwkJCS8qIEJhY2t1cCB0aGUgc3RhdGUgbWFjaGluZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywKKwkJCQkgZXZlbnRfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1JFQURZOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfQlJPQURDQVNUX0NIQU5HRToKKwkJCS8qIEJyb2FkY2FzdCBjaGFuZ2UgcmVjZWl2ZWQuIE5vdGlmeSB0aGUgcG9ydC4gKi8KKwkJCWlmIChwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpICE9IE5VTEwpCisJCQkJc2NpX3BvcnRfYnJvYWRjYXN0X2NoYW5nZV9yZWNlaXZlZChpcGh5LT5vd25pbmdfcG9ydCwgaXBoeSk7CisJCQllbHNlCisJCQkJaXBoeS0+YmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZCA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlc1AgU0NJQyBQSFkgMHglcCByZWFkeSBzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sIGlwaHksIGV2ZW50X2NvZGUpOworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJCX0KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BIWV9SRVNFVFRJTkc6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX0hBUkRfUkVTRVRfVFJBTlNNSVRURUQ6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogU0NJQyBQSFkgMHglcCByZXNldHRpbmcgc3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLCBpcGh5LCBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9waHkgKmlwaHksIHUzMiBmcmFtZV9pbmRleCkKK3sKKwllbnVtIHNjaV9waHlfc3RhdGVzIHN0YXRlID0gaXBoeS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwaHktPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUY6IHsKKwkJdTMyICpmcmFtZV93b3JkczsKKwkJc3RydWN0IHNhc19pZGVudGlmeV9mcmFtZSBpYWY7CisKKwkJcmVzdWx0ID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgKHZvaWQgKiopJmZyYW1lX3dvcmRzKTsKKworCQlpZiAocmVzdWx0ICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQlzY2lfc3dhYjMyX2NweSgmaWFmLCBmcmFtZV93b3Jkcywgc2l6ZW9mKGlhZikgLyBzaXplb2YodTMyKSk7CisJCWlmIChpYWYuZnJhbWVfdHlwZSA9PSAwKSB7CisJCQl1MzIgc3RhdGU7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCQkJbWVtY3B5KCZpcGh5LT5mcmFtZV9yY3ZkLmlhZiwgJmlhZiwgc2l6ZW9mKGlhZikpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX2xvY2ssIGZsYWdzKTsKKwkJCWlmIChpYWYuc21wX3Rwb3J0KSB7CisJCQkJLyogV2UgZ290IHRoZSBJQUYgZm9yIGFuIGV4cGFuZGVyIFBIWSBnbyB0byB0aGUgZmluYWwKKwkJCQkgKiBzdGF0ZSBzaW5jZSB0aGVyZSBhcmUgbm8gcG93ZXIgcmVxdWlyZW1lbnRzIGZvcgorCQkJCSAqIGV4cGFuZGVyIHBoeXMuCisJCQkJICovCisJCQkJc3RhdGUgPSBTQ0lfUEhZX1NVQl9GSU5BTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2UgZ290IHRoZSBJQUYgd2UgY2FuIG5vdyBnbyB0byB0aGUgYXdhaXQgc3BpbnVwCisJCQkJICogc2VtYXBob3JlIHN0YXRlCisJCQkJICovCisJCQkJc3RhdGUgPSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVI7CisJCQl9CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgc3RhdGUpOworCQkJcmVzdWx0ID0gU0NJX1NVQ0NFU1M7CisJCX0gZWxzZQorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkidW5leHBlY3RlZCBmcmFtZSBpZCAleFxuIiwKKwkJCQlfX2Z1bmNfXywgZnJhbWVfaW5kZXgpOworCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGOiB7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmZyYW1lX2hlYWRlcjsKKwkJdTMyICpmaXNfZnJhbWVfZGF0YTsKKworCQlyZXN1bHQgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAodm9pZCAqKikmZnJhbWVfaGVhZGVyKTsKKworCQlpZiAocmVzdWx0ICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQlpZiAoKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUgPT0gRklTX1JFR0QySCkgJiYKKwkJICAgICEoZnJhbWVfaGVhZGVyLT5zdGF0dXMgJiBBVEFfQlVTWSkpIHsKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAodm9pZCAqKikmZmlzX2ZyYW1lX2RhdGEpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX2xvY2ssIGZsYWdzKTsKKwkJCXNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSgmaXBoeS0+ZnJhbWVfcmN2ZC5maXMsCisJCQkJCQkJICBmcmFtZV9oZWFkZXIsCisJCQkJCQkJICBmaXNfZnJhbWVfZGF0YSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCisJCQkvKiBnb3QgSUFGIHdlIGNhbiBub3cgZ28gdG8gdGhlIGF3YWl0IHNwaW51cCBzZW1hcGhvcmUgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9GSU5BTCk7CisKKwkJCXJlc3VsdCA9IFNDSV9TVUNDRVNTOworCQl9IGVsc2UKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBmcmFtZSBpZCAleFxuIiwKKwkJCQkgX19mdW5jX18sIGZyYW1lX2luZGV4KTsKKworCQkvKiBSZWdhcmRsZXNzIG9mIHRoZSByZXN1bHQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGZyYW1lIHdpdGggaXQgKi8KKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCWRlZmF1bHQ6CisJCWRldl9kYmcoc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCSIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19pbml0aWFsX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCS8qIFRoaXMgaXMganVzdCBhbiB0ZW1wb3Jhcnkgc3RhdGUgZ28gb2ZmIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9BV0FJVF9PU1NQX0VOKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXNfcG93ZXJfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9pbnNlcnQoaWhvc3QsIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3Nhc19wb3dlcl9zdWJzdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwaHktPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXNjaV9jb250cm9sbGVyX3Bvd2VyX2NvbnRyb2xfcXVldWVfcmVtb3ZlKGlob3N0LCBpcGh5KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3Bvd2VyX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwaHktPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXNjaV9jb250cm9sbGVyX3Bvd2VyX2NvbnRyb2xfcXVldWVfaW5zZXJ0KGlob3N0LCBpcGh5KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3Bvd2VyX3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9yZW1vdmUoaWhvc3QsIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcGh5X3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCXNjaV9tb2RfdGltZXIoJmlwaHktPnNhdGFfdGltZXIsIFNDSUNfU0RTX1NBVEFfTElOS19UUkFJTklOR19USU1FT1VUKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3BoeV9zdWJzdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCXNjaV9kZWxfdGltZXIoJmlwaHktPnNhdGFfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfc3BlZWRfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX21vZF90aW1lcigmaXBoeS0+c2F0YV90aW1lciwgU0NJQ19TRFNfU0FUQV9MSU5LX1RSQUlOSU5HX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfc3BlZWRfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zaWdfZmlzX3VmX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCWlmIChzY2lfcG9ydF9saW5rX2RldGVjdGVkKGlwaHktPm93bmluZ19wb3J0LCBpcGh5KSkgeworCisJCS8qCisJCSAqIENsZWFyIHRoZSBQRSBzdXNwZW5kIGNvbmRpdGlvbiBzbyB3ZSBjYW4gYWN0dWFsbHkKKwkJICogcmVjZWl2ZSBTSUcgRklTCisJCSAqIFRoZSBoYXJkd2FyZSB3aWxsIG5vdCByZXNwb25kIHRvIHRoZSBYUkRZIHVudGlsIHRoZSBQRQorCQkgKiBzdXNwZW5kIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgorCQkgKi8KKwkJc2NpX3BoeV9yZXN1bWUoaXBoeSk7CisKKwkJc2NpX21vZF90aW1lcigmaXBoeS0+c2F0YV90aW1lciwKKwkJCSAgICAgIFNDSUNfU0RTX1NJR05BVFVSRV9GSVNfVElNRU9VVCk7CisJfSBlbHNlCisJCWlwaHktPmlzX2luX2xpbmtfdHJhaW5pbmcgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zaWdfZmlzX3VmX3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaXBoeS0+c2F0YV90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfZmluYWxfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJLyogU3RhdGUgbWFjaGluZSBoYXMgcnVuIHRvIGNvbXBsZXRpb24gc28gZXhpdCBvdXQgYW5kIGNoYW5nZQorCSAqIHRoZSBiYXNlIHN0YXRlIG1hY2hpbmUgdG8gdGhlIHJlYWR5IHN0YXRlCisJICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfUkVBRFkpOworfQorCisvKioKKyAqCisgKiBAc2NpX3BoeTogVGhpcyBpcyB0aGUgc3RydWN0IGlzY2lfcGh5IG9iamVjdCB0byBzdG9wLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgc3RvcCB0aGUgc3RydWN0IGlzY2lfcGh5IG9iamVjdC4gVGhpcyBkb2VzIG5vdCByZXNldCB0aGUKKyAqIHByb3RvY29sIGVuZ2luZSBpdCBqdXN0IHN1c3BlbmRzIGl0IGFuZCBwbGFjZXMgaXQgaW4gYSBzdGF0ZSB3aGVyZSBpdCB3aWxsCisgKiBub3QgY2F1c2UgdGhlIGVuZCBkZXZpY2UgdG8gcG93ZXIgdXAuIG5vbmUKKyAqLworc3RhdGljIHZvaWQgc2N1X2xpbmtfbGF5ZXJfc3RvcF9wcm90b2NvbF9lbmdpbmUoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXUzMiBzY3Vfc2FzX3BjZmdfdmFsdWU7CisJdTMyIGVuYWJsZV9zcGludXBfdmFsdWU7CisKKwkvKiBTdXNwZW5kIHRoZSBwcm90b2NvbCBlbmdpbmUgYW5kIHBsYWNlIGl0IGluIGEgc2F0YSBzcGludXAgaG9sZCBzdGF0ZSAqLworCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXNjdV9zYXNfcGNmZ192YWx1ZSB8PQorCQkoU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKSB8CisJCSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChTVVNQRU5EX1BST1RPQ09MX0VOR0lORSkgfAorCQkgU0NVX1NBU19QQ0ZHX0dFTl9CSVQoU0FUQV9TUElOVVBfSE9MRCkpOworCXdyaXRlbChzY3Vfc2FzX3BjZmdfdmFsdWUsCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJLyogRGlzYWJsZSB0aGUgbm90aWZ5IGVuYWJsZSBzcGludXAgcHJpbWl0aXZlcyAqLworCWVuYWJsZV9zcGludXBfdmFsdWUgPSByZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPm5vdGlmeV9lbmFibGVfc3BpbnVwX2NvbnRyb2wpOworCWVuYWJsZV9zcGludXBfdmFsdWUgJj0gflNDVV9FTlNQSU5VUF9HRU5fQklUKEVOQUJMRSk7CisJd3JpdGVsKGVuYWJsZV9zcGludXBfdmFsdWUsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7Cit9CisKKy8qKgorICoKKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHN0YXJ0IHRoZSBPT0IvU04gc3RhdGUgbWFjaGluZSBmb3IgdGhpcyBzdHJ1Y3QgaXNjaV9waHkgb2JqZWN0LgorICovCitzdGF0aWMgdm9pZCBzY3VfbGlua19sYXllcl9zdGFydF9vb2IoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXUzMiBzY3Vfc2FzX3BjZmdfdmFsdWU7CisKKwlzY3Vfc2FzX3BjZmdfdmFsdWUgPQorCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKwlzY3Vfc2FzX3BjZmdfdmFsdWUgfD0gU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX0VOQUJMRSk7CisJc2N1X3Nhc19wY2ZnX3ZhbHVlICY9CisJCX4oU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKSB8CisJCVNDVV9TQVNfUENGR19HRU5fQklUKEhBUkRfUkVTRVQpKTsKKwl3cml0ZWwoc2N1X3Nhc19wY2ZnX3ZhbHVlLAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKK30KKworLyoqCisgKgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgdHJhbnNtaXQgYSBoYXJkIHJlc2V0IHJlcXVlc3Qgb24gdGhlIHNwZWNpZmllZCBwaHkuIFRoZSBTQ1UKKyAqIGhhcmR3YXJlIHJlcXVpcmVzIHRoYXQgd2UgcmVzZXQgdGhlIE9PQiBzdGF0ZSBtYWNoaW5lIGFuZCBzZXQgdGhlIGhhcmQgcmVzZXQKKyAqIGJpdCBpbiB0aGUgcGh5IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuIFdlIHRoZW4gbXVzdCBzdGFydCBPT0Igb3ZlciB3aXRoIHRoZQorICogaGFyZCByZXNldCBiaXQgc2V0LgorICovCitzdGF0aWMgdm9pZCBzY3VfbGlua19sYXllcl90eF9oYXJkX3Jlc2V0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwl1MzIgcGh5X2NvbmZpZ3VyYXRpb25fdmFsdWU7CisKKwkvKgorCSAqIFNBUyBQaHlzIG11c3Qgd2FpdCBmb3IgdGhlIEhBUkRfUkVTRVRfVFggZXZlbnQgbm90aWZpY2F0aW9uIHRvIHRyYW5zaXRpb24KKwkgKiB0byB0aGUgc3RhcnRpbmcgc3RhdGUuICovCisJcGh5X2NvbmZpZ3VyYXRpb25fdmFsdWUgPQorCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKwlwaHlfY29uZmlndXJhdGlvbl92YWx1ZSB8PQorCQkoU0NVX1NBU19QQ0ZHX0dFTl9CSVQoSEFSRF9SRVNFVCkgfAorCQkgU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKSk7CisJd3JpdGVsKHBoeV9jb25maWd1cmF0aW9uX3ZhbHVlLAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCS8qIE5vdyB0YWtlIHRoZSBPT0Igc3RhdGUgbWFjaGluZSBvdXQgb2YgcmVzZXQgKi8KKwlwaHlfY29uZmlndXJhdGlvbl92YWx1ZSB8PSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfRU5BQkxFKTsKKwlwaHlfY29uZmlndXJhdGlvbl92YWx1ZSAmPSB+U0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwl3cml0ZWwocGh5X2NvbmZpZ3VyYXRpb25fdmFsdWUsCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0b3BwZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaXBoeS0+b3duaW5nX3BvcnQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKgorCSAqIEB0b2RvIFdlIG5lZWQgdG8gZ2V0IHRvIHRoZSBjb250cm9sbGVyIHRvIHBsYWNlIHRoaXMgUEUgaW4gYQorCSAqIHJlc2V0IHN0YXRlCisJICovCisJc2NpX2RlbF90aW1lcigmaXBoeS0+c2F0YV90aW1lcik7CisKKwlzY3VfbGlua19sYXllcl9zdG9wX3Byb3RvY29sX2VuZ2luZShpcGh5KTsKKworCWlmIChpcGh5LT5zbS5wcmV2aW91c19zdGF0ZV9pZCAhPSBTQ0lfUEhZX0lOSVRJQUwpCisJCXNjaV9jb250cm9sbGVyX2xpbmtfZG93bihpaG9zdCwgcGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaXBoeS0+b3duaW5nX3BvcnQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzY3VfbGlua19sYXllcl9zdG9wX3Byb3RvY29sX2VuZ2luZShpcGh5KTsKKwlzY3VfbGlua19sYXllcl9zdGFydF9vb2IoaXBoeSk7CisKKwkvKiBXZSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBwaHkgd2UgYXJlIGdvaW5nIHRvIGJlIGp1c3QgeWV0ICovCisJaXBoeS0+cHJvdG9jb2wgPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfVU5LTk9XTjsKKwlpcGh5LT5iY25fcmVjZWl2ZWRfd2hpbGVfcG9ydF91bmFzc2lnbmVkID0gZmFsc2U7CisKKwlpZiAoaXBoeS0+c20ucHJldmlvdXNfc3RhdGVfaWQgPT0gU0NJX1BIWV9SRUFEWSkKKwkJc2NpX2NvbnRyb2xsZXJfbGlua19kb3duKGlob3N0LCBwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpLCBpcGh5KTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9JTklUSUFMKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9yZWFkeV9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5vd25pbmdfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXNjaV9jb250cm9sbGVyX2xpbmtfdXAoaWhvc3QsIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSksIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3JlYWR5X3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX3BoeV9zdXNwZW5kKGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3Jlc2V0dGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwkvKiBUaGUgcGh5IGlzIGJlaW5nIHJlc2V0LCB0aGVyZWZvcmUgZGVhY3RpdmF0ZSBpdCBmcm9tIHRoZSBwb3J0LiAgSW4KKwkgKiB0aGUgcmVzZXR0aW5nIHN0YXRlIHdlIGRvbid0IG5vdGlmeSB0aGUgdXNlciByZWdhcmRpbmcgbGluayB1cCBhbmQKKwkgKiBsaW5rIGRvd24gbm90aWZpY2F0aW9ucworCSAqLworCXNjaV9wb3J0X2RlYWN0aXZhdGVfcGh5KGlwaHktPm93bmluZ19wb3J0LCBpcGh5LCBmYWxzZSk7CisKKwlpZiAoaXBoeS0+cHJvdG9jb2wgPT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBUykgeworCQlzY3VfbGlua19sYXllcl90eF9oYXJkX3Jlc2V0KGlwaHkpOworCX0gZWxzZSB7CisJCS8qIFRoZSBTQ1UgZG9lcyBub3QgbmVlZCB0byBoYXZlIGEgZGlzY3JldGUgcmVzZXQgc3RhdGUgc28KKwkJICoganVzdCBnbyBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZS4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgc2NpX3BoeV9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfUEhZX0lOSVRJQUxdID0geyB9LAorCVtTQ0lfUEhZX1NUT1BQRURdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcGh5X3N0b3BwZWRfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1BIWV9TVEFSVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1BIWV9TVUJfSU5JVElBTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfaW5pdGlhbF9zdWJzdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9PU1NQX0VOXSA9IHsgfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1NQRUVEX0VOXSA9IHsgfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGXSA9IHsgfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1BPV0VSXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXNfcG93ZXJfc3Vic3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2FzX3Bvd2VyX3N1YnN0YXRlX2V4aXQsCisJfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9wb3dlcl9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3Bvd2VyX3N1YnN0YXRlX2V4aXQKKwl9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9waHlfc3Vic3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9waHlfc3Vic3RhdGVfZXhpdAorCX0sCisJW1NDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU5dID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfc3BlZWRfc3Vic3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfU0lHX0ZJU19VRl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2lnX2Zpc191Zl9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zaWdfZmlzX3VmX3N1YnN0YXRlX2V4aXQKKwl9LAorCVtTQ0lfUEhZX1NVQl9GSU5BTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfZmluYWxfc3Vic3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1BIWV9SRUFEWV0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfcmVhZHlfc3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlID0gc2NpX3BoeV9yZWFkeV9zdGF0ZV9leGl0LAorCX0sCisJW1NDSV9QSFlfUkVTRVRUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9yZXNldHRpbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1BIWV9GSU5BTF0gPSB7IH0sCit9OworCit2b2lkIHNjaV9waHlfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCSAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgdTggcGh5X2luZGV4KQoreworCXNjaV9pbml0X3NtKCZpcGh5LT5zbSwgc2NpX3BoeV9zdGF0ZV90YWJsZSwgU0NJX1BIWV9JTklUSUFMKTsKKworCS8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGlucHV0IGRhdGEgdG8gb3VyIGxvY2FscyAqLworCWlwaHktPm93bmluZ19wb3J0ID0gaXBvcnQ7CisJaXBoeS0+cGh5X2luZGV4ID0gcGh5X2luZGV4OworCWlwaHktPmJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQgPSBmYWxzZTsKKwlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9VTktOT1dOOworCWlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzID0gTlVMTDsKKwlpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKKworCS8qIENyZWF0ZSB0aGUgU0lHTkFUVVJFIEZJUyBUaW1lb3V0IHRpbWVyIGZvciB0aGlzIHBoeSAqLworCXNjaV9pbml0X3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyLCBwaHlfc2F0YV90aW1lb3V0KTsKK30KKwordm9pZCBpc2NpX3BoeV9pbml0KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSA9ICZpaG9zdC0+b2VtX3BhcmFtZXRlcnM7CisJdTY0IHNjaV9zYXNfYWRkcjsKKwlfX2JlNjQgc2FzX2FkZHI7CisKKwlzY2lfc2FzX2FkZHIgPSBvZW0tPnBoeXNbaW5kZXhdLnNhc19hZGRyZXNzLmhpZ2g7CisJc2NpX3Nhc19hZGRyIDw8PSAzMjsKKwlzY2lfc2FzX2FkZHIgfD0gb2VtLT5waHlzW2luZGV4XS5zYXNfYWRkcmVzcy5sb3c7CisJc2FzX2FkZHIgPSBjcHVfdG9fYmU2NChzY2lfc2FzX2FkZHIpOworCW1lbWNweShpcGh5LT5zYXNfYWRkciwgJnNhc19hZGRyLCBzaXplb2Yoc2FzX2FkZHIpKTsKKworCWlwaHktPmlzY2lfcG9ydCA9IE5VTEw7CisJaXBoeS0+c2FzX3BoeS5lbmFibGVkID0gMDsKKwlpcGh5LT5zYXNfcGh5LmlkID0gaW5kZXg7CisJaXBoeS0+c2FzX3BoeS5zYXNfYWRkciA9ICZpcGh5LT5zYXNfYWRkclswXTsKKwlpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmQgPSAodTggKikmaXBoeS0+ZnJhbWVfcmN2ZDsKKwlpcGh5LT5zYXNfcGh5LmhhID0gJmlob3N0LT5zYXNfaGE7CisJaXBoeS0+c2FzX3BoeS5sbGRkX3BoeSA9IGlwaHk7CisJaXBoeS0+c2FzX3BoeS5lbmFibGVkID0gMTsKKwlpcGh5LT5zYXNfcGh5LmNsYXNzID0gU0FTOworCWlwaHktPnNhc19waHkuaXByb3RvID0gU0FTX1BST1RPQ09MX0FMTDsKKwlpcGh5LT5zYXNfcGh5LnRwcm90byA9IDA7CisJaXBoeS0+c2FzX3BoeS50eXBlID0gUEhZX1RZUEVfUEhZU0lDQUw7CisJaXBoeS0+c2FzX3BoeS5yb2xlID0gUEhZX1JPTEVfSU5JVElBVE9SOworCWlwaHktPnNhc19waHkub29iX21vZGUgPSBPT0JfTk9UX0NPTk5FQ1RFRDsKKwlpcGh5LT5zYXNfcGh5LmxpbmtyYXRlID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCW1lbXNldCgmaXBoeS0+ZnJhbWVfcmN2ZCwgMCwgc2l6ZW9mKGlwaHktPmZyYW1lX3JjdmQpKTsKK30KKworCisvKioKKyAqIGlzY2lfcGh5X2NvbnRyb2woKSAtIFRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSBTQVMgRG9tYWluIFRlbXBsYXRlCisgKiAgICBmdW5jdGlvbnMuIFRoaXMgaXMgYSBwaHkgbWFuYWdlbWVudCBmdW5jdGlvbi4KKyAqIEBwaHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc3BoeSBiZWluZyBjb250cm9sbGVkLgorICogQGZ1bmM6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcGh5IGNvbnRyb2wgZnVuY3Rpb24gYmVpbmcgaW52b2tlZC4KKyAqIEBidWY6IFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmljIHRvIHRoZSBwaHkgZnVuY3Rpb24gYmVpbmcgaW52b2tlZC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3BoeV9jb250cm9sKHN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSwKKwkJICAgICBlbnVtIHBoeV9mdW5jIGZ1bmMsCisJCSAgICAgdm9pZCAqYnVmKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IHNhc19waHktPmxsZGRfcGh5OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaXBoeS0+aXNjaV9wb3J0OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gc2FzX3BoeS0+aGEtPmxsZGRfaGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogcGh5ICVwOyBmdW5jICVkOyBidWYgJXA7IGlzY2kgcGh5ICVwLCBwb3J0ICVwXG4iLAorCQlfX2Z1bmNfXywgc2FzX3BoeSwgZnVuYywgYnVmLCBpcGh5LCBpcG9ydCk7CisKKwlzd2l0Y2ggKGZ1bmMpIHsKKwljYXNlIFBIWV9GVU5DX0RJU0FCTEU6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCXNjaV9waHlfc3RvcChpcGh5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgUEhZX0ZVTkNfTElOS19SRVNFVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJc2NpX3BoeV9zdG9wKGlwaHkpOworCQlzY2lfcGh5X3N0YXJ0KGlwaHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBQSFlfRlVOQ19IQVJEX1JFU0VUOgorCQlpZiAoIWlwb3J0KQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogUGVyZm9ybSB0aGUgcG9ydCByZXNldC4gKi8KKwkJcmV0ID0gaXNjaV9wb3J0X3BlcmZvcm1faGFyZF9yZXNldChpaG9zdCwgaXBvcnQsIGlwaHkpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAgICIlczogcGh5ICVwOyBmdW5jICVkIE5PVCBJTVBMRU1FTlRFRCFcbiIsCisJCQkgICBfX2Z1bmNfXywgc2FzX3BoeSwgZnVuYyk7CisJCXJldCA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzY5OWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmgKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9JU0NJX1BIWV9IXworI2RlZmluZSBfSVNDSV9QSFlfSF8KKworI2luY2x1ZGUgPHNjc2kvc2FzLmg+CisjaW5jbHVkZSA8c2NzaS9saWJzYXMuaD4KKyNpbmNsdWRlICJpc2NpLmgiCisjaW5jbHVkZSAic2FzLmgiCisKKy8qIFRoaXMgaXMgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBTQVRBIHBoeSB0byB3YWl0IGZvciBhIFNJR05BVFVSRSBGSVMKKyAqIGJlZm9yZSByZXN0YXJ0aW5nIHRoZSBzdGFydGluZyBzdGF0ZSBtYWNoaW5lLiAgVGVjaG5pY2FsbHksIHRoZSBvbGQgcGFyYWxsZWwKKyAqIEFUQSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVkIHVwIHRvIDMwIHNlY29uZHMgZm9yIGEgZGV2aWNlIHRvIGlzc3VlIGl0cworICogc2lnbmF0dXJlIEZJUyBhcyBhIHJlc3VsdCBvZiBhIHNvZnQgcmVzZXQuICBOb3cgd2Ugc2VlIHRoYXQgZGV2aWNlcyByZXNwb25kCisgKiBnZW5lcmFsbHkgd2l0aGluIDE1IHNlY29uZHMsIGJ1dCB3ZSdsbCB1c2UgMjUgZm9yIG5vdy4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19TSUdOQVRVUkVfRklTX1RJTUVPVVQgICAgMjUwMDAKKworLyogVGhpcyBpcyB0aGUgdGltZW91dCBmb3IgdGhlIFNBVEEgT09CL1NOIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRvZXMgbm90CisgKiByZWNvZ25pemUgYSBob3QgcGx1ZyBhZnRlciBPT0Igc2lnbmFsIGJ1dCBiZWZvcmUgdGhlIFNOIHNpZ25hbHMuICBXZSBuZWVkIHRvCisgKiBtYWtlIHN1cmUgYWZ0ZXIgYSBob3RwbHVnIHRpbWVvdXQgaWYgd2UgaGF2ZSBub3QgcmVjZWl2ZWQgdGhlIHNwZWVkIGV2ZW50CisgKiBub3RpZmljYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUgdGhhdCB3ZSByZXN0YXJ0IHRoZSBoYXJkd2FyZSBPT0Igc3RhdGUKKyAqIG1hY2hpbmUuCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfU0FUQV9MSU5LX1RSQUlOSU5HX1RJTUVPVVQgIDI1MAorCitlbnVtIHNjaV9waHlfcHJvdG9jb2wgeworCVNDSUNfU0RTX1BIWV9QUk9UT0NPTF9VTktOT1dOLAorCVNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVMsCisJU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBVEEsCisJU0NJQ19TRFNfTUFYX1BIWV9QUk9UT0NPTFMKK307CisKKy8qKgorICogaXNjaV9waHkgLSBoYmEgbG9jYWwgcGh5IGluZnJhc3RydWN0dXJlCisgKiBAc206CisgKiBAcHJvdG9jb2w6IGF0dGFjaGVkIGRldmljZSBwcm90b2NvbAorICogQHBoeV9pbmRleDogcGh5c2ljYWwgaW5kZXggcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2xsZXIgKDAtMykKKyAqIEBiY25fcmVjZWl2ZWRfd2hpbGVfcG9ydF91bmFzc2lnbmVkOiBiY24gdG8gcmVwb3J0IGFmdGVyIHBvcnQgYXNzb2NpYXRpb24KKyAqIEBzYXRhX3RpbWVyOiB0aW1lb3V0IFNBVEEgc2lnbmF0dXJlIEZJUyBhcnJpdmFsCisgKi8KK3N0cnVjdCBpc2NpX3BoeSB7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgc207CisJc3RydWN0IGlzY2lfcG9ydCAqb3duaW5nX3BvcnQ7CisJZW51bSBzYXNfbGlua3JhdGUgbWF4X25lZ290aWF0ZWRfc3BlZWQ7CisJZW51bSBzY2lfcGh5X3Byb3RvY29sIHByb3RvY29sOworCXU4IHBoeV9pbmRleDsKKwlib29sIGJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQ7CisJYm9vbCBpc19pbl9saW5rX3RyYWluaW5nOworCXN0cnVjdCBzY2lfdGltZXIgc2F0YV90aW1lcjsKKwlzdHJ1Y3Qgc2N1X3RyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVyczsKKwlzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKmxpbmtfbGF5ZXJfcmVnaXN0ZXJzOworCXN0cnVjdCBhc2Rfc2FzX3BoeSBzYXNfcGh5OworCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydDsKKwl1OCBzYXNfYWRkcltTQVNfQUREUl9TSVpFXTsKKwl1bmlvbiB7CisJCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgaWFmOworCQlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzIGZpczsKKwl9IGZyYW1lX3JjdmQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpc2NpX3BoeSAqdG9faXBoeShzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkpCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNhc19waHksIHR5cGVvZigqaXBoeSksIHNhc19waHkpOworCisJcmV0dXJuIGlwaHk7Cit9CisKK3N0cnVjdCBzY2lfcGh5X2NhcCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyoKKwkJCSAqIFRoZSBTQVMgc3BlY2lmaWNhdGlvbiBpbmRpY2F0ZXMgdGhlIHN0YXJ0IGJpdCBzaGFsbAorCQkJICogYWx3YXlzIGJlIHNldCB0bworCQkJICogMS4gIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHRoZSBzdGFydCBiaXQgc2V0CisJCQkgKiB0byAwIGlmIHRoZSBQSFkgQ0FQQUJJTElUSUVTIHdlcmUgZWl0aGVyIG5vdAorCQkJICogcmVjZWl2ZWQgb3Igc3BlZWQgbmVnb3RpYXRpb24gZmFpbGVkLgorCQkJICovCisJCQl1OCBzdGFydDoxOworCQkJdTggdHhfc3NjX3R5cGU6MTsKKwkJCXU4IHJlczE6MjsKKwkJCXU4IHJlcV9sb2dpY2FsX2xpbmtyYXRlOjQ7CisKKwkJCXUzMiBnZW4xX25vX3NzYzoxOworCQkJdTMyIGdlbjFfc3NjOjE7CisJCQl1MzIgZ2VuMl9ub19zc2M6MTsKKwkJCXUzMiBnZW4yX3NzYzoxOworCQkJdTMyIGdlbjNfbm9fc3NjOjE7CisJCQl1MzIgZ2VuM19zc2M6MTsKKwkJCXUzMiByZXMyOjE3OworCQkJdTMyIHBhcml0eToxOworCQl9OworCQl1MzIgYWxsOworCX07Cit9ICBfX3BhY2tlZDsKKworLyogdGhpcyBkYXRhIHN0cnVjdHVyZSByZWZsZWN0cyB0aGUgbGluayBsYXllciB0cmFuc21pdCBpZGVudGlmaWNhdGlvbiByZWcgKi8KK3N0cnVjdCBzY2lfcGh5X3Byb3RvIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MTYgX3JfYToxOworCQkJdTE2IHNtcF9pcG9ydDoxOworCQkJdTE2IHN0cF9pcG9ydDoxOworCQkJdTE2IHNzcF9pcG9ydDoxOworCQkJdTE2IF9yX2I6NDsKKwkJCXUxNiBfcl9jOjE7CisJCQl1MTYgc21wX3Rwb3J0OjE7CisJCQl1MTYgc3RwX3Rwb3J0OjE7CisJCQl1MTYgc3NwX3Rwb3J0OjE7CisJCQl1MTYgX3JfZDo0OworCQl9OworCQl1MTYgYWxsOworCX07Cit9IF9fcGFja2VkOworCisKKy8qKgorICogc3RydWN0IHNjaV9waHlfcHJvcGVydGllcyAtIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHByb3BlcnRpZXMgY29tbW9uIHRvCisgKiAgICBhbGwgcGh5cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuCisgKgorICoKKyAqLworc3RydWN0IHNjaV9waHlfcHJvcGVydGllcyB7CisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHBvcnQgdGhhdCBjdXJyZW50bHkgY29udGFpbnMgdGhlCisJICogc3VwcGxpZWQgcGh5LiAgVGhpcyBmaWVsZCBtYXkgYmUgc2V0IHRvIE5VTEwKKwkgKiBpZiB0aGUgcGh5IGlzIG5vdCBjdXJyZW50bHkgY29udGFpbmVkIGluIGEgcG9ydC4KKwkgKi8KKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBsaW5rIHJhdGUgYXQgd2hpY2ggdGhlIHBoeSBpcworCSAqIGN1cnJlbnRseSBvcGVyYXRpbmcuCisJICovCisJZW51bSBzYXNfbGlua3JhdGUgbmVnb3RpYXRlZF9saW5rX3JhdGU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIHBoeSBpbiByZWxhdGlvbiB0byBvdGhlcgorCSAqIHBoeXMgd2l0aGluIHRoZSBjb250cm9sbGVyLiAgVGhpcyBpbmRleCBpcyB6ZXJvIHJlbGF0aXZlLgorCSAqLworCXU4IGluZGV4OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3Nhc19waHlfcHJvcGVydGllcyAtIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHByb3BlcnRpZXMsCisgKiAgICBzcGVjaWZpYyB0byBhIFNBUyBwaHksIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3Nhc19waHlfcHJvcGVydGllcyB7CisJLyoqCisJICogVGhpcyBmaWVsZCBkZWxpbmVhdGVzIHRoZSBJZGVudGlmeSBBZGRyZXNzIEZyYW1lIHJlY2VpdmVkCisJICogZnJvbSB0aGUgcmVtb3RlIGVuZCBwb2ludC4KKwkgKi8KKwlzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lIHJjdmRfaWFmOworCisJLyoqCisJICogVGhpcyBmaWVsZCBkZWxpbmVhdGVzIHRoZSBQaHkgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZSByZWNlaXZlZAorCSAqIGZyb20gdGhlIHJlbW90ZSBlbmQgcG9pbnQuCisJICovCisJc3RydWN0IHNjaV9waHlfY2FwIHJjdmRfY2FwOworCit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfc2F0YV9waHlfcHJvcGVydGllcyAtIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHByb3BlcnRpZXMsCisgKiAgICBzcGVjaWZpYyB0byBhIFNBVEEgcGh5LCB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuCisgKgorICoKKyAqLworc3RydWN0IHNjaV9zYXRhX3BoeV9wcm9wZXJ0aWVzIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGRlbGluZWF0ZXMgdGhlIHNpZ25hdHVyZSBGSVMgcmVjZWl2ZWQgZnJvbSB0aGUKKwkgKiBhdHRhY2hlZCB0YXJnZXQuCisJICovCisJc3RydWN0IGRldl90b19ob3N0X2ZpcyBzaWduYXR1cmVfZmlzOworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdG8gdGhlIHVzZXIgaWYgYSBwb3J0IHNlbGVjdG9yIGlzIGNvbm5lY3RlZAorCSAqIG9uIHRoZSBzcGVjaWZpZWQgcGh5LgorCSAqLworCWJvb2wgaXNfcG9ydF9zZWxlY3Rvcl9wcmVzZW50OworCit9OworCisvKioKKyAqIGVudW0gc2NpX3BoeV9jb3VudGVyX2lkIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIHRoZSB2YXJpb3VzIHBpZWNlcyBvZgorICogICAgb3B0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZvciBhIHNwZWNpZmljIHBoeS4KKyAqCisgKgorICovCitlbnVtIHNjaV9waHlfY291bnRlcl9pZCB7CisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRlJBTUUsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9UUkFOU01JVFRFRF9GUkFNRSwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIERXT1JEcyByZWNlaXZlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0ZSQU1FX1dPUkQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBEV09SRHMgdHJhbnNtaXR0ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9UUkFOU01JVFRFRF9GUkFNRV9EV09SRCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHRpbWVzIERXT1JECisJICogc3luY2hyb25pemF0aW9uIHdhcyBsb3N0LgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfTE9TU19PRl9TWU5DX0VSUk9SLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgRFdPUkRzIHdpdGgKKwkgKiBydW5uaW5nIGRpc3Bhcml0eSBlcnJvcnMuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9ESVNQQVJJVFlfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgd2l0aCBhCisJICogQ1JDIGVycm9yIChub3QgaW5jbHVkaW5nIHNob3J0IG9yIHRydW5jYXRlZCBmcmFtZXMpLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRlJBTUVfQ1JDX0VSUk9SLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgRE9ORSAoQUNLL05BSyBUSU1FT1VUKQorCSAqIHByaW1pdGl2ZXMgcmVjZWl2ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9ET05FX0FDS19OQUtfVElNRU9VVCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIERPTkUgKEFDSy9OQUsgVElNRU9VVCkKKwkgKiBwcmltaXRpdmVzIHRyYW5zbWl0dGVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfVFJBTlNNSVRURURfRE9ORV9BQ0tfTkFLX1RJTUVPVVQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgaW5hY3Rpdml0eQorCSAqIHRpbWVyIGZvciBjb25uZWN0aW9ucyBvbiB0aGUgcGh5IGhhcyBiZWVuIHV0aWxpemVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfSU5BQ1RJVklUWV9USU1FUl9FWFBJUkVELAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgRE9ORSAoQ1JFRElUIFRJTUVPVVQpCisJICogcHJpbWl0aXZlcyByZWNlaXZlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0RPTkVfQ1JFRElUX1RJTUVPVVQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBET05FIChDUkVESVQgVElNRU9VVCkKKwkgKiBwcmltaXRpdmVzIHRyYW5zbWl0dGVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfVFJBTlNNSVRURURfRE9ORV9DUkVESVRfVElNRU9VVCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIENSRURJVCBCTE9DS0VECisJICogcHJpbWl0aXZlcyByZWNlaXZlZC4KKwkgKiBAbm90ZSBEZXBlbmRpbmcgb24gcmVtb3RlIGRldmljZSBpbXBsZW1lbnRhdGlvbiwgY3JlZGl0IGJsb2NrcworCSAqICAgICAgIG1heSBvY2N1ciByZWd1bGFybHkuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9DUkVESVRfQkxPQ0tFRCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygc2hvcnQgZnJhbWVzCisJICogcmVjZWl2ZWQuICBBIHNob3J0IGZyYW1lIGlzIHNpbXBseSBhIGZyYW1lIHNtYWxsZXIgdGhlbiB3aGF0IGlzCisJICogYWxsb3dlZCBieSBlaXRoZXIgdGhlIFNBUyBvciBTQVRBIHNwZWNpZmljYXRpb24uCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9TSE9SVF9GUkFNRSwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIGFmdGVyCisJICogY3JlZGl0IGhhcyBiZWVuIGV4aGF1c3RlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0ZSQU1FX1dJVEhPVVRfQ1JFRElULAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgYWZ0ZXIKKwkgKiBhIERPTkUgaGFzIGJlZW4gcmVjZWl2ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9GUkFNRV9BRlRFUl9ET05FLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcGh5CisJICogZmFpbGVkIHRvIGFjaGlldmUgRFdPUkQgc3luY2hyb25pemF0aW9uIGR1cmluZyBzcGVlZCBuZWdvdGlhdGlvbi4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1NOX0RXT1JEX1NZTkNfRVJST1IKK307CisKK2VudW0gc2NpX3BoeV9zdGF0ZXMgeworCS8qKgorCSAqIFNpbXBseSB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGJhc2UgZG9tYWluIHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX1BIWV9JTklUSUFMLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGh5IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBzdG9wcGVkLgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCBvbiB0aGlzIHBoeS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTCBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRVNFVFRJTkcgc3RhdGUuCisJICovCisJU0NJX1BIWV9TVE9QUEVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGh5IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlY29tbWluZworCSAqIHJlYWR5LiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkIG9uIHRoaXMgcGh5LgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUEVEIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRUFEWSBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVTRVRUSU5HIHN0YXRlLgorCSAqLworCVNDSV9QSFlfU1RBUlRJTkcsCisKKwkvKioKKwkgKiBJbml0aWFsIHN0YXRlCisJICovCisJU0NJX1BIWV9TVUJfSU5JVElBTCwKKworCS8qKgorCSAqIFdhaXQgc3RhdGUgZm9yIHRoZSBoYXJkd2FyZSBPU1NQIGV2ZW50IHR5cGUgbm90aWZpY2F0aW9uCisJICovCisJU0NJX1BIWV9TVUJfQVdBSVRfT1NTUF9FTiwKKworCS8qKgorCSAqIFdhaXQgc3RhdGUgZm9yIHRoZSBQSFkgc3BlZWQgbm90aWZpY2F0aW9uCisJICovCisJU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1NQRUVEX0VOLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIElBRiBVbnNvbGljaXRlZCBmcmFtZSBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUYsCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciB0aGUgcmVxdWVzdCB0byBjb25zdW1lIHBvd2VyCisJICovCisJU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1BPV0VSLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgcmVxdWVzdCB0byBjb25zdW1lIHBvd2VyCisJICovCisJU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUiwKKworCS8qKgorCSAqIFdhaXQgc3RhdGUgZm9yIHRoZSBTQVRBIFBIWSBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTiwKKworCS8qKgorCSAqIFdhaXQgZm9yIHRoZSBTQVRBIFBIWSBzcGVlZCBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1NQRUVEX0VOLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIFNJR05BVFVSRSBGSVMgdW5zb2xpY2l0ZWQgZnJhbWUgbm90aWZpY2F0aW9uCisJICovCisJU0NJX1BIWV9TVUJfQVdBSVRfU0lHX0ZJU19VRiwKKworCS8qKgorCSAqIEV4aXQgc3RhdGUgZm9yIHRoaXMgc3RhdGUgbWFjaGluZQorCSAqLworCVNDSV9QSFlfU1VCX0ZJTkFMLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHRoZSBwaHkgaXMgbm93IHJlYWR5LiAgVGh1cywgdGhlIHVzZXIKKwkgKiBpcyBhYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyB1dGlsaXppbmcgdGhpcyBwaHkgYXMgbG9uZyBhcyBpdAorCSAqIGlzIGN1cnJlbnRseSBwYXJ0IG9mIGEgdmFsaWQgcG9ydC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJX1BIWV9SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHBoeSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZXNldC4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQgb24gdGhpcyBwaHkuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqLworCVNDSV9QSFlfUkVTRVRUSU5HLAorCisJLyoqCisJICogU2ltcGx5IHRoZSBmaW5hbCBzdGF0ZSBmb3IgdGhlIGJhc2UgcGh5IHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX1BIWV9GSU5BTCwKK307CisKK3ZvaWQgc2NpX3BoeV9jb25zdHJ1Y3QoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXU4IHBoeV9pbmRleCk7CisKK3N0cnVjdCBpc2NpX3BvcnQgKnBoeV9nZXRfbm9uX2R1bW15X3BvcnQoc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcGh5X3NldF9wb3J0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2luaXRpYWxpemUoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICp0cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLAorCXN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqbGlua19sYXllcl9yZWdpc3RlcnMpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9zdGFydCgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9zdG9wKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X3Jlc2V0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK3ZvaWQgc2NpX3BoeV9yZXN1bWUoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcGh5X3NldHVwX3RyYW5zcG9ydCgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJdTMyIGRldmljZV9pZCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2V2ZW50X2hhbmRsZXIoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXUzMiBldmVudF9jb2RlKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfZnJhbWVfaGFuZGxlcigKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJdTMyIGZyYW1lX2luZGV4KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfY29uc3VtZV9wb3dlcl9oYW5kbGVyKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK3ZvaWQgc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhc19hZGRyZXNzKTsKKwordm9pZCBzY2lfcGh5X2dldF9hdHRhY2hlZF9zYXNfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzX2FkZHJlc3MpOworCitzdHJ1Y3Qgc2NpX3BoeV9wcm90bzsKK3ZvaWQgc2NpX3BoeV9nZXRfcHJvdG9jb2xzKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwlzdHJ1Y3Qgc2NpX3BoeV9wcm90byAqcHJvdG9jb2xzKTsKK2VudW0gc2FzX2xpbmtyYXRlIHNjaV9waHlfbGlua3JhdGUoc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworc3RydWN0IGlzY2lfaG9zdDsKK3ZvaWQgaXNjaV9waHlfaW5pdChzdHJ1Y3QgaXNjaV9waHkgKmlwaHksIHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBpbnQgaW5kZXgpOworaW50IGlzY2lfcGh5X2NvbnRyb2woc3RydWN0IGFzZF9zYXNfcGh5ICpwaHksIGVudW0gcGh5X2Z1bmMgZnVuYywgdm9pZCAqYnVmKTsKKworI2VuZGlmIC8qICFkZWZpbmVkKF9JU0NJX1BIWV9IXykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjZmOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jCkBAIC0wLDAgKzEsMTc1NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmVxdWVzdC5oIgorCisjZGVmaW5lIFNDSUNfU0RTX1BPUlRfSEFSRF9SRVNFVF9USU1FT1VUICAoMTAwMCkKKyNkZWZpbmUgU0NVX0RVTU1ZX0lOREVYICAgICgweEZGRkYpCisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIGVudW0gaXNjaV9zdGF0dXMgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpcG9ydC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXBvcnQgPSAlcCwgc3RhdGUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaXBvcnQsIHN0YXR1cyk7CisKKwkvKiBYWFggcG9pbnRsZXNzIGxvY2sgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXBvcnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwlpcG9ydC0+c3RhdHVzID0gc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwb3J0LT5zdGF0ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2dldF9wcm90b2NvbHMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBzY2lfcGh5X3Byb3RvICpwcm90bykKK3sKKwl1OCBpbmRleDsKKworCXByb3RvLT5hbGwgPSAwOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBpcG9ydC0+cGh5X3RhYmxlW2luZGV4XTsKKworCQlpZiAoIWlwaHkpCisJCQljb250aW51ZTsKKwkJc2NpX3BoeV9nZXRfcHJvdG9jb2xzKGlwaHksIHByb3RvKTsKKwl9Cit9CisKK3N0YXRpYyB1MzIgc2NpX3BvcnRfZ2V0X3BoeXMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTMyIGluZGV4OworCXUzMiBtYXNrOworCisJbWFzayA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKQorCQlpZiAoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0pCisJCQltYXNrIHw9ICgxIDw8IGluZGV4KTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqIHNjaV9wb3J0X2dldF9wcm9wZXJ0aWVzKCkgLSBUaGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgcHJvcGVydGllcworICogICAgcmVnYXJkaW5nIHRoZSBwb3J0LCBzdWNoIGFzOiBwaHlzaWNhbCBpbmRleCwgcHJvdG9jb2xzLCBzYXMgYWRkcmVzcywgZXRjLgorICogQHBvcnQ6IHRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcG9ydCBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHBoeXNpY2FsCisgKiAgICBpbmRleC4KKyAqIEBwcm9wZXJ0aWVzOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHByb3BlcnRpZXMgc3RydWN0dXJlIGludG8gd2hpY2ggdG8KKyAqICAgIGNvcHkgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbi4KKyAqCisgKiBJbmRpY2F0ZSBpZiB0aGUgdXNlciBzcGVjaWZpZWQgYSB2YWxpZCBwb3J0LiBTQ0lfU1VDQ0VTUyBUaGlzIHZhbHVlIGlzCisgKiByZXR1cm5lZCBpZiB0aGUgc3BlY2lmaWVkIHBvcnQgd2FzIHZhbGlkLiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BPUlQgVGhpcworICogdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIHNwZWNpZmllZCBwb3J0IGlzIG5vdCB2YWxpZC4gIFdoZW4gdGhpcyB2YWx1ZSBpcworICogcmV0dXJuZWQsIG5vIGRhdGEgaXMgY29waWVkIHRvIHRoZSBwcm9wZXJ0aWVzIG91dHB1dCBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfZ2V0X3Byb3BlcnRpZXMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCQlzdHJ1Y3Qgc2NpX3BvcnRfcHJvcGVydGllcyAqcHJvcCkKK3sKKwlpZiAoIWlwb3J0IHx8IGlwb3J0LT5sb2dpY2FsX3BvcnRfaW5kZXggPT0gU0NJQ19TRFNfRFVNTVlfUE9SVCkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUE9SVDsKKworCXByb3AtPmluZGV4ID0gaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleDsKKwlwcm9wLT5waHlfbWFzayA9IHNjaV9wb3J0X2dldF9waHlzKGlwb3J0KTsKKwlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZwcm9wLT5sb2NhbC5zYXNfYWRkcmVzcyk7CisJc2NpX3BvcnRfZ2V0X3Byb3RvY29scyhpcG9ydCwgJnByb3AtPmxvY2FsLnByb3RvY29scyk7CisJc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwb3J0LCAmcHJvcC0+cmVtb3RlLnNhc19hZGRyZXNzKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfYmNuX2VuYWJsZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJdTMyIHZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwb3J0LT5waHlfdGFibGUpOyBpKyspIHsKKwkJaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaV07CisJCWlmICghaXBoeSkKKwkJCWNvbnRpbnVlOworCQl2YWwgPSByZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmxpbmtfbGF5ZXJfY29udHJvbCk7CisJCS8qIGNsZWFyIHRoZSBiaXQgYnkgd3JpdGluZyAxLiAqLworCQl3cml0ZWwodmFsLCAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmxpbmtfbGF5ZXJfY29udHJvbCk7CisJfQorfQorCisvKiBjYWxsZWQgdW5kZXIgc2NpX2xvY2sgdG8gc3RhYmlsaXplIHBoeTpwb3J0IGFzc29jaWF0aW9ucyAqLwordm9pZCBpc2NpX3BvcnRfYmNuX2VuYWJsZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJaW50IGk7CisKKwljbGVhcl9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpOworCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSVBPUlRfQkNOX1BFTkRJTkcsICZpcG9ydC0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcG9ydC0+cGh5X3RhYmxlKTsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaV07CisKKwkJaWYgKCFpcGh5KQorCQkJY29udGludWU7CisKKwkJaWhvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwKKwkJCQkJCVBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpc2NpX3BvcnRfYmNfY2hhbmdlX3JlY2VpdmVkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCSBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJaWYgKGlwb3J0ICYmIHRlc3RfYml0KElQT1JUX0JDTl9CTE9DS0VELCAmaXBvcnQtPmZsYWdzKSkgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBkaXNhYmxlZCBCQ047IGlzY2lfcGh5ID0gJXAsIHNhc19waHkgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpcGh5LCAmaXBoeS0+c2FzX3BoeSk7CisJCXNldF9iaXQoSVBPUlRfQkNOX1BFTkRJTkcsICZpcG9ydC0+ZmxhZ3MpOworCQlhdG9taWNfaW5jKCZpcG9ydC0+ZXZlbnQpOworCQl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpc2NpX3BoeSA9ICVwLCBzYXNfcGh5ID0gJXBcbiIsCisJCQlfX2Z1bmNfXywgaXBoeSwgJmlwaHktPnNhc19waHkpOworCisJCWlob3N0LT5zYXNfaGEubm90aWZ5X3BvcnRfZXZlbnQoJmlwaHktPnNhc19waHksCisJCQkJCQlQT1JURV9CUk9BRENBU1RfUkNWRCk7CisJfQorCXNjaV9wb3J0X2Jjbl9lbmFibGUoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBpc2NpX3BvcnRfbGlua191cChzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCisJCQkgICAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCSAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY2lfcG9ydF9wcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisJdW5zaWduZWQgbG9uZyBzdWNjZXNzID0gdHJ1ZTsKKworCUJVR19PTihpcGh5LT5pc2NpX3BvcnQgIT0gTlVMTCk7CisKKwlpcGh5LT5pc2NpX3BvcnQgPSBpcG9ydDsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwXG4iLAorCQlfX2Z1bmNfXywgaXBvcnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisKKwlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlwaHktPmlzY2lfcG9ydCwgaXNjaV9zdGFydGluZyk7CisKKwlzY2lfcG9ydF9nZXRfcHJvcGVydGllcyhpcG9ydCwgJnByb3BlcnRpZXMpOworCisJaWYgKGlwaHktPnByb3RvY29sID09IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVRBKSB7CisJCXU2NCBhdHRhY2hlZF9zYXNfYWRkcmVzczsKKworCQlpcGh5LT5zYXNfcGh5Lm9vYl9tb2RlID0gU0FUQV9PT0JfTU9ERTsKKwkJaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2Zpcyk7CisKKwkJLyoKKwkJICogRm9yIGRpcmVjdC1hdHRhY2hlZCBTQVRBIGRldmljZXMsIHRoZSBTQ0kgY29yZSB3aWxsCisJCSAqIGF1dG9tYWdpY2FsbHkgYXNzaWduIGEgU0FTIGFkZHJlc3MgdG8gdGhlIGVuZCBkZXZpY2UKKwkJICogZm9yIHRoZSBwdXJwb3NlIG9mIGNyZWF0aW5nIGEgcG9ydC4gVGhpcyBTQVMgYWRkcmVzcworCQkgKiB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhcyBhc3NpZ25lZCB0byB0aGUgUEhZIGFuZCBuZWVkcworCQkgKiB0byBiZSBvYnRhaW5lZCBmcm9tIHN0cnVjdCBzY2lfcG9ydF9wcm9wZXJ0aWVzIHByb3BlcnRpZXMuCisJCSAqLworCQlhdHRhY2hlZF9zYXNfYWRkcmVzcyA9IHByb3BlcnRpZXMucmVtb3RlLnNhc19hZGRyZXNzLmhpZ2g7CisJCWF0dGFjaGVkX3Nhc19hZGRyZXNzIDw8PSAzMjsKKwkJYXR0YWNoZWRfc2FzX2FkZHJlc3MgfD0gcHJvcGVydGllcy5yZW1vdGUuc2FzX2FkZHJlc3MubG93OworCQlzd2FiNjRzKCZhdHRhY2hlZF9zYXNfYWRkcmVzcyk7CisKKwkJbWVtY3B5KCZpcGh5LT5zYXNfcGh5LmF0dGFjaGVkX3Nhc19hZGRyLAorCQkgICAgICAgJmF0dGFjaGVkX3Nhc19hZGRyZXNzLCBzaXplb2YoYXR0YWNoZWRfc2FzX2FkZHJlc3MpKTsKKwl9IGVsc2UgaWYgKGlwaHktPnByb3RvY29sID09IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVMpIHsKKwkJaXBoeS0+c2FzX3BoeS5vb2JfbW9kZSA9IFNBU19PT0JfTU9ERTsKKwkJaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX3NpemUgPSBzaXplb2Yoc3RydWN0IHNhc19pZGVudGlmeV9mcmFtZSk7CisKKwkJLyogQ29weSB0aGUgYXR0YWNoZWQgU0FTIGFkZHJlc3MgZnJvbSB0aGUgSUFGICovCisJCW1lbWNweShpcGh5LT5zYXNfcGh5LmF0dGFjaGVkX3Nhc19hZGRyLAorCQkgICAgICAgaXBoeS0+ZnJhbWVfcmN2ZC5pYWYuc2FzX2FkZHIsIFNBU19BRERSX1NJWkUpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LCAiJXM6IHVua293biB0YXJnZXRcbiIsIF9fZnVuY19fKTsKKwkJc3VjY2VzcyA9IGZhbHNlOworCX0KKworCWlwaHktPnNhc19waHkucGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gc2NpX3BoeV9saW5rcmF0ZShpcGh5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisKKwkvKiBOb3RpZnkgbGlic2FzIHRoYXQgd2UgaGF2ZSBhbiBhZGRyZXNzIGZyYW1lLCBpZiBpbmRlZWQKKwkgKiB3ZSd2ZSBmb3VuZCBhbiBTU1AsIFNNUCwgb3IgU1RQIHRhcmdldCAqLworCWlmIChzdWNjZXNzKQorCQlpc2NpX2hvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwKKwkJCQkJCSAgICBQT1JURV9CWVRFU19ETUFFRCk7Cit9CisKKworLyoqCisgKiBpc2NpX3BvcnRfbGlua19kb3duKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUgd2hlbiBhIGxpbmsKKyAqICAgIGJlY29tZXMgaW5hY3RpdmUuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAcGh5OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgcGh5IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICogQHBvcnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBwb3J0IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9wb3J0X2xpbmtfZG93bihzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCisJCQkJc3RydWN0IGlzY2lfcGh5ICppc2NpX3BoeSwKKwkJCQlzdHJ1Y3QgaXNjaV9wb3J0ICppc2NpX3BvcnQpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2U7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfcG9ydCk7CisKKwlpZiAoaXNjaV9wb3J0KSB7CisKKwkJLyogY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcGh5IG9uIHRoaXMgcG9ydC4gKi8KKwkJaWYgKGlzY2lfcGh5LT5zYXNfcGh5LnBvcnQgJiYKKwkJICAgIGlzY2lfcGh5LT5zYXNfcGh5LnBvcnQtPm51bV9waHlzID09IDEpIHsKKwkJCWF0b21pY19pbmMoJmlzY2lfcG9ydC0+ZXZlbnQpOworCQkJaXNjaV9wb3J0X2Jjbl9lbmFibGUoaXNjaV9ob3N0LCBpc2NpX3BvcnQpOworCisJCQkvKiBjaGFuZ2UgdGhlIHN0YXRlIGZvciBhbGwgZGV2aWNlcyBvbiB0aGlzIHBvcnQuICBUaGUKKwkJCSAqIG5leHQgdGFzayBzZW50IHRvIHRoaXMgZGV2aWNlIHdpbGwgYmUgcmV0dXJuZWQgYXMKKwkJCSAqIFNBU19UQVNLX1VOREVMSVZFUkVELCBhbmQgdGhlIHNjc2kgbWlkIGxheWVyIHdpbGwKKwkJCSAqIHJlbW92ZSB0aGUgdGFyZ2V0CisJCQkgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaXNjaV9kZXZpY2UsCisJCQkJCSAgICAmaXNjaV9wb3J0LT5yZW1vdGVfZGV2X2xpc3QsCisJCQkJCSAgICBub2RlKSB7CisJCQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwKKwkJCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlKTsKKwkJCQlzZXRfYml0KElERVZfR09ORSwgJmlzY2lfZGV2aWNlLT5mbGFncyk7CisJCQl9CisJCX0KKwkJaXNjaV9wb3J0X2NoYW5nZV9zdGF0ZShpc2NpX3BvcnQsIGlzY2lfc3RvcHBpbmcpOworCX0KKworCS8qIE5vdGlmeSBsaWJzYXMgb2YgdGhlIGJvcmtlbiBsaW5rLCB0aGlzIHdpbGwgdHJpZ2dlciBjYWxscyB0byBvdXIKKwkgKiBpc2NpX3BvcnRfZGVmb3JtZWQgYW5kIGlzY2lfZGV2X2dvbmUgZnVuY3Rpb25zLgorCSAqLworCXNhc19waHlfZGlzY29ubmVjdGVkKCZpc2NpX3BoeS0+c2FzX3BoeSk7CisJaXNjaV9ob3N0LT5zYXNfaGEubm90aWZ5X3BoeV9ldmVudCgmaXNjaV9waHktPnNhc19waHksCisJCQkJCSAgIFBIWUVfTE9TU19PRl9TSUdOQUwpOworCisJaXNjaV9waHktPmlzY2lfcG9ydCA9IE5VTEw7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcCAtIERvbmVcbiIsIF9fZnVuY19fLCBpc2NpX3BvcnQpOworfQorCisKKy8qKgorICogaXNjaV9wb3J0X3JlYWR5KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUgd2hlbiBhIGxpbmsKKyAqICAgIGJlY29tZXMgcmVhZHkuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAcG9ydDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzY2kgcG9ydCB3aXRoIHRoZSBhY3RpdmUgbGluay4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCkKK3sKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfcG9ydCk7CisKKwljb21wbGV0ZV9hbGwoJmlzY2lfcG9ydC0+c3RhcnRfY29tcGxldGUpOworCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXNjaV9wb3J0LCBpc2NpX3JlYWR5KTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogaXNjaV9wb3J0X25vdF9yZWFkeSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNjaSBjb3JlIHdoZW4gYSBsaW5rCisgKiAgICBpcyBub3QgcmVhZHkuIEFsbCByZW1vdGUgZGV2aWNlcyBvbiB0aGlzIGxpbmsgd2lsbCBiZSByZW1vdmVkIGlmIHRoZXkgYXJlCisgKiAgICBpbiB0aGUgc3RvcHBpbmcgc3RhdGUuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAcG9ydDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzY2kgcG9ydCB3aXRoIHRoZSBhY3RpdmUgbGluay4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9ub3RfcmVhZHkoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppc2NpX3BvcnQpCit7CisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9wb3J0ID0gJXBcbiIsIF9fZnVuY19fLCBpc2NpX3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBpc2NpX3BvcnRfc3RvcF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICAgIGVudW0gc2NpX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cykKK3sKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiUG9ydCBzdG9wIGNvbXBsZXRlXG4iKTsKK30KKworLyoqCisgKiBpc2NpX3BvcnRfaGFyZF9yZXNldF9jb21wbGV0ZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNjaSBjb3JlCisgKiAgICB3aGVuIHRoZSBoYXJkIHJlc2V0IGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBoYXMgYmVlbiByZWNlaXZlZC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNjaSBwb3J0IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICogQGNvbXBsZXRpb25fc3RhdHVzOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvcmUgc3RhdHVzIGZvciB0aGUgcmVzZXQKKyAqICAgIHByb2Nlc3MuCisgKgorICovCitzdGF0aWMgdm9pZCBpc2NpX3BvcnRfaGFyZF9yZXNldF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9wb3J0ICppc2NpX3BvcnQsCisJCQkJCSAgZW51bSBzY2lfc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKQoreworCWRldl9kYmcoJmlzY2lfcG9ydC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9wb3J0ID0gJXAsIGNvbXBsZXRpb25fc3RhdHVzPSV4XG4iLAorCQkgICAgIF9fZnVuY19fLCBpc2NpX3BvcnQsIGNvbXBsZXRpb25fc3RhdHVzKTsKKworCS8qIFNhdmUgdGhlIHN0YXR1cyBvZiB0aGUgaGFyZCByZXNldCBmcm9tIHRoZSBwb3J0LiAqLworCWlzY2lfcG9ydC0+aGFyZF9yZXNldF9zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1czsKKworCWNvbXBsZXRlX2FsbCgmaXNjaV9wb3J0LT5oYXJkX3Jlc2V0X2NvbXBsZXRlKTsKK30KKworLyogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBzcGVjaWZpZWQgcGh5IGNhbiBiZSBhc3NpZ25lZCB0bworICogdGhpcyBwb3J0IFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHBoeXMgZm9yIGVhY2ggcG9ydCB0aGF0IGFyZSBhbGxvd2VkOiAtCisgKiBQb3J0IDAgLSAzIDIgMSAwIC0gUG9ydCAxIC0gICAgIDEgLSBQb3J0IDIgLSAzIDIgLSBQb3J0IDMgLSAzIFRoaXMgbWV0aG9kCisgKiBkb2Vzbid0IHByZWNsdWRlIGFsbCBjb25maWd1cmF0aW9ucy4gIEl0IG1lcmVseSBlbnN1cmVzIHRoYXQgYSBwaHkgaXMgcGFydAorICogb2YgdGhlIGFsbG93YWJsZSBzZXQgb2YgcGh5IGlkZW50aWZpZXJzIGZvciB0aGF0IHBvcnQuICBGb3IgZXhhbXBsZSwgb25lCisgKiBjb3VsZCBhc3NpZ24gcGh5IDMgdG8gcG9ydCAwIGFuZCBubyBvdGhlciBwaHlzLiAgUGxlYXNlIHJlZmVyIHRvCisgKiBzY2lfcG9ydF9pc19waHlfbWFza192YWxpZCgpIGZvciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgd2hldGhlciB0aGUKKyAqIHBoeV9tYXNrIGZvciBhIHBvcnQgY2FuIGJlIHN1cHBvcnRlZC4gYm9vbCB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBwaHkKKyAqIGFzc2lnbm1lbnQgZm9yIHRoZSBwb3J0IGZhbHNlIGlmIHRoaXMgaXMgbm90IGEgdmFsaWQgcGh5IGFzc2lnbm1lbnQgZm9yIHRoZQorICogcG9ydAorICovCitib29sIHNjaV9wb3J0X2lzX3ZhbGlkX3BoeV9hc3NpZ25tZW50KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1MzIgcGh5X2luZGV4KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXN0cnVjdCBzY2lfdXNlcl9wYXJhbWV0ZXJzICp1c2VyID0gJmlob3N0LT51c2VyX3BhcmFtZXRlcnM7CisKKwkvKiBJbml0aWFsaXplIHRvIGludmFsaWQgdmFsdWUuICovCisJdTMyIGV4aXN0aW5nX3BoeV9pbmRleCA9IFNDSV9NQVhfUEhZUzsKKwl1MzIgaW5kZXg7CisKKwlpZiAoKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IDEpICYmIChwaHlfaW5kZXggIT0gMSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9PSAzICYmIHBoeV9pbmRleCAhPSAzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMiAmJgorCSAgICAocGh5X2luZGV4ID09IDAgfHwgcGh5X2luZGV4ID09IDEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspCisJCWlmIChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSAmJiBpbmRleCAhPSBwaHlfaW5kZXgpCisJCQlleGlzdGluZ19waHlfaW5kZXggPSBpbmRleDsKKworCS8qIEVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgcGh5cyBpbiB0aGUgcG9ydCBhcmUgY2FwYWJsZSBvZgorCSAqIG9wZXJhdGluZyBhdCB0aGUgc2FtZSBtYXhpbXVtIGxpbmsgcmF0ZS4KKwkgKi8KKwlpZiAoZXhpc3RpbmdfcGh5X2luZGV4IDwgU0NJX01BWF9QSFlTICYmCisJICAgIHVzZXItPnBoeXNbcGh5X2luZGV4XS5tYXhfc3BlZWRfZ2VuZXJhdGlvbiAhPQorCSAgICB1c2VyLT5waHlzW2V4aXN0aW5nX3BoeV9pbmRleF0ubWF4X3NwZWVkX2dlbmVyYXRpb24pCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqCisgKiBAc2NpX3BvcnQ6IFRoaXMgaXMgdGhlIHBvcnQgb2JqZWN0IGZvciB3aGljaCB0byBkZXRlcm1pbmUgaWYgdGhlIHBoeSBtYXNrCisgKiAgICBjYW4gYmUgc3VwcG9ydGVkLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgcG9ydCdzIHBoeSBtYXNrIGNhbiBiZSBzdXBwb3J0ZWQKKyAqIGJ5IHRoZSBTQ1UuIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHZhbGlkIFBIWSBtYXNrIGNvbmZpZ3VyYXRpb25zIGZvcgorICogZWFjaCBwb3J0OiAtIFBvcnQgMCAtIFtbMyAgMl0gMV0gMCAtIFBvcnQgMSAtICAgICAgICBbMV0gLSBQb3J0IDIgLSBbWzNdIDJdCisgKiAtIFBvcnQgMyAtICBbM10gVGhpcyBtZXRob2QgcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGlvbiBzcGVjaWZ5aW5nIGlmIHRoZQorICogcGh5IG1hc2sgY2FuIGJlIHN1cHBvcnRlZC4gdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgcGh5IGFzc2lnbm1lbnQgZm9yIHRoZQorICogcG9ydCBmYWxzZSBpZiB0aGlzIGlzIG5vdCBhIHZhbGlkIHBoeSBhc3NpZ25tZW50IGZvciB0aGUgcG9ydAorICovCitzdGF0aWMgYm9vbCBzY2lfcG9ydF9pc19waHlfbWFza192YWxpZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwl1MzIgcGh5X21hc2spCit7CisJaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IDApIHsKKwkJaWYgKCgocGh5X21hc2sgJiAweDBGKSA9PSAweDBGKQorCQkgICAgfHwgKChwaHlfbWFzayAmIDB4MDMpID09IDB4MDMpCisJCSAgICB8fCAoKHBoeV9tYXNrICYgMHgwMSkgPT0gMHgwMSkKKwkJICAgIHx8IChwaHlfbWFzayA9PSAwKSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMSkgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MDIpID09IDB4MDIpCisJCSAgICB8fCAocGh5X21hc2sgPT0gMCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IDIpIHsKKwkJaWYgKCgocGh5X21hc2sgJiAweDBDKSA9PSAweDBDKQorCQkgICAgfHwgKChwaHlfbWFzayAmIDB4MDQpID09IDB4MDQpCisJCSAgICB8fCAocGh5X21hc2sgPT0gMCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IDMpIHsKKwkJaWYgKCgocGh5X21hc2sgJiAweDA4KSA9PSAweDA4KQorCQkgICAgfHwgKHBoeV9tYXNrID09IDApKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogVGhpcyBtZXRob2QgcmV0cmlldmVzIGEgY3VycmVudGx5IGFjdGl2ZSAoaS5lLiBjb25uZWN0ZWQpIHBoeSBjb250YWluZWQgaW4KKyAqIHRoZSBwb3J0LiAgQ3VycmVudGx5LCB0aGUgbG93ZXN0IG9yZGVyIHBoeSB0aGF0IGlzIGNvbm5lY3RlZCBpcyByZXR1cm5lZC4KKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwb2ludGVyIHRvIGEgU0NJU19TRFNfUEhZIG9iamVjdC4gTlVMTCBUaGlzIHZhbHVlIGlzCisgKiByZXR1cm5lZCBpZiB0aGVyZSBhcmUgbm8gY3VycmVudGx5IGFjdGl2ZSAoaS5lLiBjb25uZWN0ZWQgdG8gYSByZW1vdGUgZW5kCisgKiBwb2ludCkgcGh5cyBjb250YWluZWQgaW4gdGhlIHBvcnQuIEFsbCBvdGhlciB2YWx1ZXMgc3BlY2lmeSBhIHN0cnVjdCBzY2lfcGh5CisgKiBvYmplY3QgdGhhdCBpcyBhY3RpdmUgaW4gdGhlIHBvcnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNjaV9waHkgKnNjaV9wb3J0X2dldF9hX2Nvbm5lY3RlZF9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTMyIGluZGV4OworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQkvKiBFbnN1cmUgdGhhdCB0aGUgcGh5IGlzIGJvdGggcGFydCBvZiB0aGUgcG9ydCBhbmQgY3VycmVudGx5CisJCSAqIGNvbm5lY3RlZCB0byB0aGUgcmVtb3RlIGVuZC1wb2ludC4KKwkJICovCisJCWlwaHkgPSBpcG9ydC0+cGh5X3RhYmxlW2luZGV4XTsKKwkJaWYgKGlwaHkgJiYgc2NpX3BvcnRfYWN0aXZlX3BoeShpcG9ydCwgaXBoeSkpCisJCQlyZXR1cm4gaXBoeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9zZXRfcGh5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBhZGQgdGhpcyBwaHkgdG8gYSBwb3J0CisJICogdGhhdCBtZWFucyB0aGF0IHRoZSBwaHkgaXMgbm90IHBhcnQgb2YgYSBwb3J0IGFuZCB0aGF0IHRoZSBwb3J0IGRvZXMKKwkgKiBub3QgYWxyZWFkeSBoYXZlIGEgcGh5IGFzc2luZ2VkIHRvIHRoZSBwaHkgaW5kZXguCisJICovCisJaWYgKCFpcG9ydC0+cGh5X3RhYmxlW2lwaHktPnBoeV9pbmRleF0gJiYKKwkgICAgIXBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkgJiYKKwkgICAgc2NpX3BvcnRfaXNfdmFsaWRfcGh5X2Fzc2lnbm1lbnQoaXBvcnQsIGlwaHktPnBoeV9pbmRleCkpIHsKKwkJLyogUGh5IGlzIGJlaW5nIGFkZGVkIGluIHRoZSBzdG9wcGVkIHN0YXRlIHNvIHdlIGFyZSBpbiBNUEMgbW9kZQorCQkgKiBtYWtlIGxvZ2ljYWwgcG9ydCBpbmRleCA9IHBoeXNpY2FsIHBvcnQgaW5kZXgKKwkJICovCisJCWlwb3J0LT5sb2dpY2FsX3BvcnRfaW5kZXggPSBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKwkJaXBvcnQtPnBoeV90YWJsZVtpcGh5LT5waHlfaW5kZXhdID0gaXBoeTsKKwkJc2NpX3BoeV9zZXRfcG9ydChpcGh5LCBpcG9ydCk7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jbGVhcl9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGlzIHBoeSBpcyBwYXJ0IG9mIHRoaXMgcG9ydCAqLworCWlmIChpcG9ydC0+cGh5X3RhYmxlW2lwaHktPnBoeV9pbmRleF0gPT0gaXBoeSAmJgorCSAgICBwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpID09IGlwb3J0KSB7CisJCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJCS8qIFllcCBpdCBpcyBhc3NpZ25lZCB0byB0aGlzIHBvcnQgc28gcmVtb3ZlIGl0ICovCisJCXNjaV9waHlfc2V0X3BvcnQoaXBoeSwgJmlob3N0LT5wb3J0c1tTQ0lfTUFYX1BPUlRTXSk7CisJCWlwb3J0LT5waHlfdGFibGVbaXBoeS0+cGh5X2luZGV4XSA9IE5VTEw7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gU0NJX0ZBSUxVUkU7Cit9CisKK3ZvaWQgc2NpX3BvcnRfZ2V0X3Nhc19hZGRyZXNzKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXMpCit7CisJdTMyIGluZGV4OworCisJc2FzLT5oaWdoID0gMDsKKwlzYXMtPmxvdyAgPSAwOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykKKwkJaWYgKGlwb3J0LT5waHlfdGFibGVbaW5kZXhdKQorCQkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0sIHNhcyk7Cit9CisKK3ZvaWQgc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXMpCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5OworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgcGh5IGlzIGJvdGggcGFydCBvZiB0aGUgcG9ydCBhbmQgY3VycmVudGx5CisJICogY29ubmVjdGVkIHRvIHRoZSByZW1vdGUgZW5kLXBvaW50LgorCSAqLworCWlwaHkgPSBzY2lfcG9ydF9nZXRfYV9jb25uZWN0ZWRfcGh5KGlwb3J0KTsKKwlpZiAoaXBoeSkgeworCQlpZiAoaXBoeS0+cHJvdG9jb2wgIT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBVEEpIHsKKwkJCXNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwaHksIHNhcyk7CisJCX0gZWxzZSB7CisJCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcyhpcGh5LCBzYXMpOworCQkJc2FzLT5sb3cgKz0gaXBoeS0+cGh5X2luZGV4OworCQl9CisJfSBlbHNlIHsKKwkJc2FzLT5oaWdoID0gMDsKKwkJc2FzLT5sb3cgID0gMDsKKwl9Cit9CisKKy8qKgorICogc2NpX3BvcnRfY29uc3RydWN0X2R1bW15X3JuYygpIC0gY3JlYXRlIGR1bW15IHJuYyBmb3Igc2kgd29ya2Fyb3VuZAorICoKKyAqIEBzY2lfcG9ydDogbG9naWNhbCBwb3J0IG9uIHdoaWNoIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0CisgKiBAcm5pOiByZW1vdGUgbm9kZSBpbmRleCBmb3IgdGhpcyByZW1vdGUgbm9kZSBjb250ZXh0LgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGNvbnN0cnVjdCBhIGR1bW15IHJlbW90ZSBub2RlIGNvbnRleHQgZGF0YSBzdHJ1Y3R1cmUKKyAqIFRoaXMgc3RydWN0dXJlIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBoYXJkd2FyZSB0byB3b3JrIGFyb3VuZCBhIHNjaGVkdWxlcgorICogZXJyb3IgaW4gdGhlIGhhcmR3YXJlLgorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9jb25zdHJ1Y3RfZHVtbXlfcm5jKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1MTYgcm5pKQoreworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmM7CisKKwlybmMgPSAmaXBvcnQtPm93bmluZ19jb250cm9sbGVyLT5yZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlW3JuaV07CisKKwltZW1zZXQocm5jLCAwLCBzaXplb2YodW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQpKTsKKworCXJuYy0+c3NwLnJlbW90ZV9zYXNfYWRkcmVzc19oaSA9IDA7CisJcm5jLT5zc3AucmVtb3RlX3Nhc19hZGRyZXNzX2xvID0gMDsKKworCXJuYy0+c3NwLnJlbW90ZV9ub2RlX2luZGV4ID0gcm5pOworCXJuYy0+c3NwLnJlbW90ZV9ub2RlX3BvcnRfd2lkdGggPSAxOworCXJuYy0+c3NwLmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCisJcm5jLT5zc3AubmV4dXNfbG9zc190aW1lcl9lbmFibGUgPSBmYWxzZTsKKwlybmMtPnNzcC5jaGVja19iaXQgPSBmYWxzZTsKKwlybmMtPnNzcC5pc192YWxpZCA9IHRydWU7CisJcm5jLT5zc3AuaXNfcmVtb3RlX25vZGVfY29udGV4dCA9IHRydWU7CisJcm5jLT5zc3AuZnVuY3Rpb25fbnVtYmVyID0gMDsKKwlybmMtPnNzcC5hcmJpdHJhdGlvbl93YWl0X3RpbWUgPSAwOworfQorCisvKgorICogY29uc3RydWN0IGEgZHVtbXkgdGFzayBjb250ZXh0IGRhdGEgc3RydWN0dXJlLiAgVGhpcworICogc3RydWN0dXJlIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBoYXJkd3JlIHRvIHdvcmsgYXJvdW5kIGEgc2NoZWR1bGVyIGVycm9yCisgKiBpbiB0aGUgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2NvbnN0cnVjdF9kdW1teV90YXNrKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1MTYgdGFnKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQ7CisKKwl0YXNrX2NvbnRleHQgPSAmaWhvc3QtPnRhc2tfY29udGV4dF90YWJsZVtJU0NJX1RBR19UQ0kodGFnKV07CisJbWVtc2V0KHRhc2tfY29udGV4dCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3VfdGFza19jb250ZXh0KSk7CisKKwl0YXNrX2NvbnRleHQtPmluaXRpYXRvcl9yZXF1ZXN0ID0gMTsKKwl0YXNrX2NvbnRleHQtPmNvbm5lY3Rpb25fcmF0ZSA9IDE7CisJdGFza19jb250ZXh0LT5sb2dpY2FsX3BvcnRfaW5kZXggPSBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NTUDsKKwl0YXNrX2NvbnRleHQtPnRhc2tfaW5kZXggPSBJU0NJX1RBR19UQ0kodGFnKTsKKwl0YXNrX2NvbnRleHQtPnZhbGlkID0gU0NVX1RBU0tfQ09OVEVYVF9WQUxJRDsKKwl0YXNrX2NvbnRleHQtPmNvbnRleHRfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfVFlQRTsKKwl0YXNrX2NvbnRleHQtPnJlbW90ZV9ub2RlX2luZGV4ID0gaXBvcnQtPnJlc2VydmVkX3JuaTsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+dGFza19waGFzZSA9IDB4MDE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2Rlc3Ryb3lfZHVtbXlfcmVzb3VyY2VzKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJaWYgKGlwb3J0LT5yZXNlcnZlZF90YWcgIT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpCisJCWlzY2lfZnJlZV90YWcoaWhvc3QsIGlwb3J0LT5yZXNlcnZlZF90YWcpOworCisJaWYgKGlwb3J0LT5yZXNlcnZlZF9ybmkgIT0gU0NVX0RVTU1ZX0lOREVYKQorCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9yZW1vdGVfbm9kZV9pbmRleCgmaWhvc3QtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXMsCisJCQkJCQkJCSAgICAgMSwgaXBvcnQtPnJlc2VydmVkX3JuaSk7CisKKwlpcG9ydC0+cmVzZXJ2ZWRfcm5pID0gU0NVX0RVTU1ZX0lOREVYOworCWlwb3J0LT5yZXNlcnZlZF90YWcgPSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRzsKK30KKwordm9pZCBzY2lfcG9ydF9zZXR1cF90cmFuc3BvcnRzKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1MzIgZGV2aWNlX2lkKQoreworCXU4IGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCWlmIChpcG9ydC0+YWN0aXZlX3BoeV9tYXNrICYgKDEgPDwgaW5kZXgpKQorCQkJc2NpX3BoeV9zZXR1cF90cmFuc3BvcnQoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0sIGRldmljZV9pZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9hY3RpdmF0ZV9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkgIGJvb2wgZG9fbm90aWZ5X3VzZXIpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaXBoeS0+cHJvdG9jb2wgIT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBVEEpCisJCXNjaV9waHlfcmVzdW1lKGlwaHkpOworCisJaXBvcnQtPmFjdGl2ZV9waHlfbWFzayB8PSAxIDw8IGlwaHktPnBoeV9pbmRleDsKKworCXNjaV9jb250cm9sbGVyX2NsZWFyX2ludmFsaWRfcGh5KGlob3N0LCBpcGh5KTsKKworCWlmIChkb19ub3RpZnlfdXNlciA9PSB0cnVlKQorCQlpc2NpX3BvcnRfbGlua191cChpaG9zdCwgaXBvcnQsIGlwaHkpOworfQorCit2b2lkIHNjaV9wb3J0X2RlYWN0aXZhdGVfcGh5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJCQkgICAgIGJvb2wgZG9fbm90aWZ5X3VzZXIpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpcG9ydC0+YWN0aXZlX3BoeV9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCisJaXBoeS0+bWF4X25lZ290aWF0ZWRfc3BlZWQgPSBTQVNfTElOS19SQVRFX1VOS05PV047CisKKwkvKiBSZS1hc3NpZ24gdGhlIHBoeSBiYWNrIHRvIHRoZSBMUCBhcyBpZiBpdCB3ZXJlIGEgbmFycm93IHBvcnQgKi8KKwl3cml0ZWwoaXBoeS0+cGh5X2luZGV4LAorCQkmaXBvcnQtPnBvcnRfcGVfY29uZmlndXJhdGlvbl9yZWdpc3RlcltpcGh5LT5waHlfaW5kZXhdKTsKKworCWlmIChkb19ub3RpZnlfdXNlciA9PSB0cnVlKQorCQlpc2NpX3BvcnRfbGlua19kb3duKGlob3N0LCBpcGh5LCBpcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2ludmFsaWRfbGlua191cChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYXkgcmVwb3J0ZWQgdGhpcyBsaW5rIGFzIGJhZCBhbmQgaWYKKwkgKiBub3QgZ28gYWhlYWQgYW5kIHRlbGwgdGhlIFNDSV9VU0VSIHRoYXQgd2UgaGF2ZSBkaXNjb3ZlcmVkIGFuCisJICogaW52YWxpZCBsaW5rLgorCSAqLworCWlmICgoaWhvc3QtPmludmFsaWRfcGh5X21hc2sgJiAoMSA8PCBpcGh5LT5waHlfaW5kZXgpKSA9PSAwKSB7CisJCWlob3N0LT5pbnZhbGlkX3BoeV9tYXNrIHw9IDEgPDwgaXBoeS0+cGh5X2luZGV4OworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIkludmFsaWQgbGluayB1cCFcbiIpOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfcG9ydF9yZWFkeV9zdGF0ZShlbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUE9SVF9SRUFEWToKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvKiBmbGFnIGR1bW15IHJuYyBoYW5saW5nIHdoZW4gZXhpdGluZyBhIHJlYWR5IHN0YXRlICovCitzdGF0aWMgdm9pZCBwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgIGVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlKQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpcG9ydC0+c207CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgb2xkX3N0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoaXNfcG9ydF9yZWFkeV9zdGF0ZShvbGRfc3RhdGUpICYmICFpc19wb3J0X3JlYWR5X3N0YXRlKHN0YXRlKSkKKwkJaXBvcnQtPnJlYWR5X2V4aXQgPSB0cnVlOworCisJc2NpX2NoYW5nZV9zdGF0ZShzbSwgc3RhdGUpOworCWlwb3J0LT5yZWFkeV9leGl0ID0gZmFsc2U7Cit9CisKKy8qKgorICogc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIgLSBwaHkgY2FuIGJlIGFzc2lnbmVkIHRvIHBvcnQ/CisgKiBAc2NpX3BvcnQ6IHNjaV9wb3J0IG9iamVjdCBmb3Igd2hpY2ggaGFzIGEgcGh5IHRoYXQgaGFzIGdvbmUgbGluayB1cC4KKyAqIEBzY2lfcGh5OiBUaGlzIGlzIHRoZSBzdHJ1Y3QgaXNjaV9waHkgb2JqZWN0IHRoYXQgaGFzIGdvbmUgbGluayB1cC4KKyAqIEBkb19ub3RpZnlfdXNlcjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5mb3JtIHRoZSB1c2VyICh2aWEKKyAqICAgIHNjaV9wb3J0X2xpbmtfdXAoKSkgYXMgdG8gdGhlIGZhY3QgdGhhdCBhIG5ldyBwaHkgYXMgYmVjb21lIHJlYWR5LgorICoKKyAqIERldGVybWluZSBpZiB0aGlzIHBoeSBjYW4gYmUgYXNzaWduZWQgdG8gdGhpcworICogcG9ydCAuIElmIHRoZSBwaHkgaXMgbm90IGEgdmFsaWQgUEhZIGZvcgorICogdGhpcyBwb3J0IHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgbm90aWZ5IHRoZSB1c2VyLiBBIFBIWSBjYW4gb25seSBiZQorICogcGFydCBvZiBhIHBvcnQgaWYgaXQncyBhdHRhY2hlZCBTQVMgQUREUkVTUyBpcyB0aGUgc2FtZSBhcyBhbGwgb3RoZXIgUEhZcyBpbgorICogdGhlIHNhbWUgcG9ydC4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlcihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCSAgc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCQkJICBib29sIGRvX25vdGlmeV91c2VyKQoreworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcG9ydF9zYXNfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHBoeV9zYXNfYWRkcmVzczsKKworCXNjaV9wb3J0X2dldF9hdHRhY2hlZF9zYXNfYWRkcmVzcyhpcG9ydCwgJnBvcnRfc2FzX2FkZHJlc3MpOworCXNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwaHksICZwaHlfc2FzX2FkZHJlc3MpOworCisJLyogSWYgdGhlIFNBUyBhZGRyZXNzIG9mIHRoZSBuZXcgcGh5IG1hdGNoZXMgdGhlIFNBUyBhZGRyZXNzIG9mCisJICogb3RoZXIgcGh5cyBpbiB0aGUgcG9ydCBPUiB0aGlzIGlzIHRoZSBmaXJzdCBwaHkgaW4gdGhlIHBvcnQsCisJICogdGhlbiBhY3RpdmF0ZSB0aGUgcGh5IGFuZCBhbGxvdyBpdCB0byBiZSB1c2VkIGZvciBvcGVyYXRpb25zCisJICogaW4gdGhpcyBwb3J0LgorCSAqLworCWlmICgocGh5X3Nhc19hZGRyZXNzLmhpZ2ggPT0gcG9ydF9zYXNfYWRkcmVzcy5oaWdoICYmCisJICAgICBwaHlfc2FzX2FkZHJlc3MubG93ICA9PSBwb3J0X3Nhc19hZGRyZXNzLmxvdykgfHwKKwkgICAgaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA9PSAwKSB7CisJCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpcG9ydC0+c207CisKKwkJc2NpX3BvcnRfYWN0aXZhdGVfcGh5KGlwb3J0LCBpcGh5LCBkb19ub3RpZnlfdXNlcik7CisJCWlmIChzbS0+Y3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lfUE9SVF9SRVNFVFRJTkcpCisJCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LCBTQ0lfUE9SVF9SRUFEWSk7CisJfSBlbHNlCisJCXNjaV9wb3J0X2ludmFsaWRfbGlua191cChpcG9ydCwgaXBoeSk7Cit9CisKKworCisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIHBvcnQgb25seSBoYXMgYSBzaW5nbGUgcGh5IG9iamVjdCBhc3NpZ25lZC4KKyAqICAgICBJZiB0aGVyZSBhcmUgbm8gcGh5cyBvciBtb3JlIHRoYW4gb25lIHBoeSB0aGVuIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4KKyAqICAgIHRydWUuCisgKiBAc2NpX3BvcnQ6IFRoZSBwb3J0IGZvciB3aGljaCB0aGUgd2lkZSBwb3J0IGNvbmRpdGlvbiBpcyB0byBiZSBjaGVja2VkLgorICoKKyAqIGJvb2wgdHJ1ZSBJcyByZXR1cm5lZCBpZiB0aGlzIGlzIGEgd2lkZSBwb3J0ZWQgcG9ydC4gZmFsc2UgSXMgcmV0dXJuZWQgaWYKKyAqIHRoaXMgaXMgYSBuYXJyb3cgcG9ydC4KKyAqLworc3RhdGljIGJvb2wgc2NpX3BvcnRfaXNfd2lkZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgaW5kZXg7CisJdTMyIHBoeV9jb3VudCA9IDA7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJaWYgKGlwb3J0LT5waHlfdGFibGVbaW5kZXhdICE9IE5VTEwpIHsKKwkJCXBoeV9jb3VudCsrOworCQl9CisJfQorCisJcmV0dXJuIHBoeV9jb3VudCAhPSAxOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUEhZIG9iamVjdCB3aGVuIHRoZSBsaW5rIGlzIGRldGVjdGVkLiBpZiB0aGUKKyAqICAgIHBvcnQgd2FudHMgdGhlIFBIWSB0byBjb250aW51ZSBvbiB0byB0aGUgbGluayB1cCBzdGF0ZSB0aGVuIHRoZSBwb3J0CisgKiAgICBsYXllciBtdXN0IHJldHVybiB0cnVlLiAgSWYgdGhlIHBvcnQgb2JqZWN0IHJldHVybnMgZmFsc2UgdGhlIHBoeSBvYmplY3QKKyAqICAgIG11c3QgaGFsdCBpdHMgYXR0ZW1wdCB0byBnbyBsaW5rIHVwLgorICogQHNjaV9wb3J0OiBUaGUgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHBoeSBvYmplY3QuCisgKiBAc2NpX3BoeTogVGhlIHBoeSBvYmplY3QgdGhhdCBpcyB0cnlpbmcgdG8gZ28gbGluayB1cC4KKyAqCisgKiB0cnVlIGlmIHRoZSBwaHkgb2JqZWN0IGNhbiBjb250aW51ZSB0byB0aGUgbGluayB1cCBjb25kaXRpb24uIHRydWUgSXMKKyAqIHJldHVybmVkIGlmIHRoaXMgcGh5IGNhbiBjb250aW51ZSB0byB0aGUgcmVhZHkgc3RhdGUuIGZhbHNlIElzIHJldHVybmVkIGlmCisgKiBjYW4gbm90IGNvbnRpbnVlIG9uIHRvIHRoZSByZWFkeSBzdGF0ZS4gVGhpcyBub3RpZmljYXRpb24gaXMgaW4gcGxhY2UgZm9yCisgKiB3aWRlIHBvcnRzIGFuZCBkaXJlY3QgYXR0YWNoZWQgcGh5cy4gIFNpbmNlIHRoZXJlIGFyZSBubyB3aWRlIHBvcnRlZCBTQVRBCisgKiBkZXZpY2VzIHRoaXMgY291bGQgYmVjb21lIGFuIGludmFsaWQgcG9ydCBjb25maWd1cmF0aW9uLgorICovCitib29sIHNjaV9wb3J0X2xpbmtfZGV0ZWN0ZWQoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWlmICgoaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCAhPSBTQ0lDX1NEU19EVU1NWV9QT1JUKSAmJgorCSAgICAoaXBoeS0+cHJvdG9jb2wgPT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBVEEpICYmCisJICAgIHNjaV9wb3J0X2lzX3dpZGUoaXBvcnQpKSB7CisJCXNjaV9wb3J0X2ludmFsaWRfbGlua191cChpcG9ydCwgaXBoeSk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBwb3J0X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZih0bXIsIHR5cGVvZigqaXBvcnQpLCB0aW1lcik7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgY3VycmVudF9zdGF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCWN1cnJlbnRfc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChjdXJyZW50X3N0YXRlID09IFNDSV9QT1JUX1JFU0VUVElORykgeworCQkvKiBpZiB0aGUgcG9ydCBpcyBzdGlsbCBpbiB0aGUgcmVzZXR0aW5nIHN0YXRlIHRoZW4gdGhlIHRpbWVvdXQKKwkJICogZmlyZWQgYmVmb3JlIHRoZSByZXNldCBjb21wbGV0ZWQuCisJCSAqLworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LCBTQ0lfUE9SVF9GQUlMRUQpOworCX0gZWxzZSBpZiAoY3VycmVudF9zdGF0ZSA9PSBTQ0lfUE9SVF9TVE9QUEVEKSB7CisJCS8qIGlmIHRoZSBwb3J0IGlzIHN0b3BwZWQgdGhlbiB0aGUgc3RhcnQgcmVxdWVzdCBmYWlsZWQgSW4gdGhpcworCQkgKiBjYXNlIHN0YXkgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisJCSAqLworCQlkZXZfZXJyKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSIlczogU0NJQyBQb3J0IDB4JXAgZmFpbGVkIHRvIHN0b3AgYmVmb3JlIHRpZW1vdXQuXG4iLAorCQkJX19mdW5jX18sCisJCQlpcG9ydCk7CisJfSBlbHNlIGlmIChjdXJyZW50X3N0YXRlID09IFNDSV9QT1JUX1NUT1BQSU5HKSB7CisJCS8qIGlmIHRoZSBwb3J0IGlzIHN0aWxsIHN0b3BwaW5nIHRoZW4gdGhlIHN0b3AgaGFzIG5vdCBjb21wbGV0ZWQgKi8KKwkJaXNjaV9wb3J0X3N0b3BfY29tcGxldGUoaXBvcnQtPm93bmluZ19jb250cm9sbGVyLAorCQkJCQlpcG9ydCwKKwkJCQkJU0NJX0ZBSUxVUkVfVElNRU9VVCk7CisJfSBlbHNlIHsKKwkJLyogVGhlIHBvcnQgaXMgaW4gdGhlIHJlYWR5IHN0YXRlIGFuZCB3ZSBoYXZlIGEgdGltZXIKKwkJICogcmVwb3J0aW5nIGEgdGltZW91dCB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorCQkgKi8KKwkJZGV2X2VycihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkiJXM6IFNDSUMgUG9ydCAweCVwIGlzIHByb2Nlc3NpbmcgYSB0aW1lb3V0IG9wZXJhdGlvbiAiCisJCQkiaW4gc3RhdGUgJWQuXG4iLCBfX2Z1bmNfXywgaXBvcnQsIGN1cnJlbnRfc3RhdGUpOworCX0KKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgaGFyZHdhcmVzIFZJSVQgZW50cnkgZm9yIHRoaXMgcG9ydC4KKyAqCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF91cGRhdGVfdmlpdF9lbnRyeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHNhc19hZGRyZXNzOworCisJc2NpX3BvcnRfZ2V0X3Nhc19hZGRyZXNzKGlwb3J0LCAmc2FzX2FkZHJlc3MpOworCisJd3JpdGVsKHNhc19hZGRyZXNzLmhpZ2gsCisJCSZpcG9ydC0+dmlpdF9yZWdpc3RlcnMtPmluaXRpYXRvcl9zYXNfYWRkcmVzc19oaSk7CisJd3JpdGVsKHNhc19hZGRyZXNzLmxvdywKKwkJJmlwb3J0LT52aWl0X3JlZ2lzdGVycy0+aW5pdGlhdG9yX3Nhc19hZGRyZXNzX2xvKTsKKworCS8qIFRoaXMgdmFsdWUgZ2V0IGNsZWFyZWQganVzdCBpbiBjYXNlIGl0cyBub3QgYWxyZWFkeSBjbGVhcmVkICovCisJd3JpdGVsKDAsICZpcG9ydC0+dmlpdF9yZWdpc3RlcnMtPnJlc2VydmVkKTsKKworCS8qIFdlIGFyZSByZXF1aXJlZCB0byB1cGRhdGUgdGhlIHN0YXR1cyByZWdpc3RlciBsYXN0ICovCisJd3JpdGVsKFNDVV9WSUlUX0VOVFJZX0lEX1ZJSVQgfAorCSAgICAgICBTQ1VfVklJVF9JUFBUX0lOSVRJQVRPUiB8CisJICAgICAgICgoMSA8PCBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCkgPDwgU0NVX1ZJSVRfRU5UUllfTFBWSUVfU0hJRlQpIHwKKwkgICAgICAgU0NVX1ZJSVRfU1RBVFVTX0FMTF9WQUxJRCwKKwkgICAgICAgJmlwb3J0LT52aWl0X3JlZ2lzdGVycy0+c3RhdHVzKTsKK30KKworZW51bSBzYXNfbGlua3JhdGUgc2NpX3BvcnRfZ2V0X21heF9hbGxvd2VkX3NwZWVkKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUxNiBpbmRleDsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJZW51bSBzYXNfbGlua3JhdGUgbWF4X2FsbG93ZWRfc3BlZWQgPSBTQVNfTElOS19SQVRFXzZfMF9HQlBTOworCisJLyoKKwkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBwaHlzIGluIHRoaXMgcG9ydCBhbmQgZmluZCB0aGUgcGh5IHdpdGggdGhlCisJICogbG93ZXN0IG1heGltdW0gbGluayByYXRlLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlpcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpbmRleF07CisJCWlmIChpcGh5ICYmIHNjaV9wb3J0X2FjdGl2ZV9waHkoaXBvcnQsIGlwaHkpICYmCisJCSAgICBpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA8IG1heF9hbGxvd2VkX3NwZWVkKQorCQkJbWF4X2FsbG93ZWRfc3BlZWQgPSBpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZDsKKwl9CisKKwlyZXR1cm4gbWF4X2FsbG93ZWRfc3BlZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3N1c3BlbmRfcG9ydF90YXNrX3NjaGVkdWxlcihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgcHRzX2NvbnRyb2xfdmFsdWU7CisKKwlwdHNfY29udHJvbF92YWx1ZSA9IHJlYWRsKCZpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXB0c19jb250cm9sX3ZhbHVlIHw9IFNDVV9QVFN4Q1JfR0VOX0JJVChTVVNQRU5EKTsKKwl3cml0ZWwocHRzX2NvbnRyb2xfdmFsdWUsICZpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworfQorCisvKioKKyAqIHNjaV9wb3J0X3Bvc3RfZHVtbXlfcmVxdWVzdCgpIC0gcG9zdCBkdW1teS93b3JrYXJvdW5kIHJlcXVlc3QKKyAqIEBzY2lfcG9ydDogcG9ydCB0byBwb3N0IHRhc2sKKyAqCisgKiBQcmV2ZW50IHRoZSBoYXJkd2FyZSBzY2hlZHVsZXIgZnJvbSBwb3N0aW5nIG5ldyByZXF1ZXN0cyB0byB0aGUgZnJvbnQKKyAqIG9mIHRoZSBzY2hlZHVsZXIgcXVldWUgY2F1c2luZyBhIHN0YXJ2YXRpb24gcHJvYmxlbSBmb3IgY3VycmVudGx5CisgKiBvbmdvaW5nIHJlcXVlc3RzLgorICoKKyAqLworc3RhdGljIHZvaWQgc2NpX3BvcnRfcG9zdF9kdW1teV9yZXF1ZXN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXUxNiB0YWcgPSBpcG9ydC0+cmVzZXJ2ZWRfdGFnOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YzsKKwl1MzIgY29tbWFuZDsKKworCXRjID0gJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbSVNDSV9UQUdfVENJKHRhZyldOworCXRjLT5hYm9ydCA9IDA7CisKKwljb21tYW5kID0gU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQyB8CisJCSAgaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQgfAorCQkgIElTQ0lfVEFHX1RDSSh0YWcpOworCisJc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KGlob3N0LCBjb21tYW5kKTsKK30KKworLyoqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBhYm9ydCB0aGUgZHVtbXkgcmVxdWVzdC4gIFRoaXMgd2lsbCBhbG93IHRoZSBoYXJkd2FyZSB0bworICogcG93ZXIgZG93biBwYXJ0cyBvZiB0aGUgc2lsaWNvbiB0byBzYXZlIHBvd2VyLgorICoKKyAqIEBzY2lfcG9ydDogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHRhc2sgbXVzdCBiZSBhYm9ydGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgc2NpX3BvcnRfYWJvcnRfZHVtbXlfcmVxdWVzdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1MTYgdGFnID0gaXBvcnQtPnJlc2VydmVkX3RhZzsKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGM7CisJdTMyIGNvbW1hbmQ7CisKKwl0YyA9ICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlW0lTQ0lfVEFHX1RDSSh0YWcpXTsKKwl0Yy0+YWJvcnQgPSAxOworCisJY29tbWFuZCA9IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9QT1NUX1RDX0FCT1JUIHwKKwkJICBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8CisJCSAgSVNDSV9UQUdfVENJKHRhZyk7CisKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGNvbW1hbmQpOworfQorCisvKioKKyAqCisgKiBAc2NpX3BvcnQ6IFRoaXMgaXMgdGhlIHN0cnVjdCBpc2NpX3BvcnQgb2JqZWN0IHRvIHJlc3VtZS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHJlc3VtZSB0aGUgcG9ydCB0YXNrIHNjaGVkdWxlciBmb3IgdGhpcyBwb3J0IG9iamVjdC4gbm9uZQorICovCitzdGF0aWMgdm9pZAorc2NpX3BvcnRfcmVzdW1lX3BvcnRfdGFza19zY2hlZHVsZXIoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTMyIHB0c19jb250cm9sX3ZhbHVlOworCisJcHRzX2NvbnRyb2xfdmFsdWUgPSByZWFkbCgmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKKwlwdHNfY29udHJvbF92YWx1ZSAmPSB+U0NVX1BUU3hDUl9HRU5fQklUKFNVU1BFTkQpOworCXdyaXRlbChwdHNfY29udHJvbF92YWx1ZSwgJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX3dhaXRpbmdfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJc2NpX3BvcnRfc3VzcGVuZF9wb3J0X3Rhc2tfc2NoZWR1bGVyKGlwb3J0KTsKKworCWlwb3J0LT5ub3RfcmVhZHlfcmVhc29uID0gU0NJQ19QT1JUX05PVF9SRUFEWV9OT19BQ1RJVkVfUEhZUzsKKworCWlmIChpcG9ydC0+YWN0aXZlX3BoeV9tYXNrICE9IDApIHsKKwkJLyogQXQgbGVhc3Qgb25lIG9mIHRoZSBwaHlzIG9uIHRoZSBwb3J0IGlzIHJlYWR5ICovCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX29wZXJhdGlvbmFsX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpc2NpX3BvcnRfcmVhZHkoaWhvc3QsIGlwb3J0KTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlpZiAoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0pIHsKKwkJCXdyaXRlbChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCwKKwkJCQkmaXBvcnQtPnBvcnRfcGVfY29uZmlndXJhdGlvbl9yZWdpc3RlclsKKwkJCQkJaXBvcnQtPnBoeV90YWJsZVtpbmRleF0tPnBoeV9pbmRleF0pOworCQl9CisJfQorCisJc2NpX3BvcnRfdXBkYXRlX3ZpaXRfZW50cnkoaXBvcnQpOworCisJc2NpX3BvcnRfcmVzdW1lX3BvcnRfdGFza19zY2hlZHVsZXIoaXBvcnQpOworCisJLyoKKwkgKiBQb3N0IHRoZSBkdW1teSB0YXNrIGZvciB0aGUgcG9ydCBzbyB0aGUgaGFyZHdhcmUgY2FuIHNjaGVkdWxlCisJICogaW8gY29ycmVjdGx5CisJICovCisJc2NpX3BvcnRfcG9zdF9kdW1teV9yZXF1ZXN0KGlwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfaW52YWxpZGF0ZV9kdW1teV9yZW1vdGVfbm9kZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1OCBwaHlzX2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYzsKKwl1MTYgcm5pID0gaXBvcnQtPnJlc2VydmVkX3JuaTsKKwl1MzIgY29tbWFuZDsKKworCXJuYyA9ICZpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZVtybmldOworCisJcm5jLT5zc3AuaXNfdmFsaWQgPSBmYWxzZTsKKworCS8qIGVuc3VyZSB0aGUgcHJlY2VkaW5nIHRjIGFib3J0IHJlcXVlc3QgaGFzIHJlYWNoZWQgdGhlCisJICogY29udHJvbGxlciBhbmQgZ2l2ZSBpdCBhbXBsZSB0aW1lIHRvIGFjdCBiZWZvcmUgcG9zdGluZyB0aGUgcm5jCisJICogaW52YWxpZGF0ZQorCSAqLworCXJlYWRsKCZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X3N0YXR1cyk7IC8qIGZsdXNoICovCisJdWRlbGF5KDEwKTsKKworCWNvbW1hbmQgPSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX0lOVkFMSURBVEUgfAorCQkgIHBoeXNfaW5kZXggPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQgfCBybmk7CisKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGNvbW1hbmQpOworfQorCisvKioKKyAqCisgKiBAb2JqZWN0OiBUaGlzIGlzIHRoZSBvYmplY3Qgd2hpY2ggaXMgY2FzdCB0byBhIHN0cnVjdCBpc2NpX3BvcnQgb2JqZWN0LgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgYWN0aW9ucyByZXF1aXJlZCBieSB0aGUgc3RydWN0IGlzY2lfcG9ydCBvbgorICogZXhpdGluZyB0aGUgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMLiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMKKyAqIHRoZSBwb3J0IG5vdCByZWFkeSBhbmQgc3VzcGVuZHMgdGhlIHBvcnQgdGFzayBzY2hlZHVsZXIuIG5vbmUKKyAqLworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfb3BlcmF0aW9uYWxfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKgorCSAqIEtpbGwgdGhlIGR1bW15IHRhc2sgZm9yIHRoaXMgcG9ydCBpZiBpdCBoYXMgbm90IHlldCBwb3N0ZWQKKwkgKiB0aGUgaGFyZHdhcmUgd2lsbCB0cmVhdCB0aGlzIGFzIGEgTk9QIGFuZCBqdXN0IHJldHVybiBhYm9ydAorCSAqIGNvbXBsZXRlLgorCSAqLworCXNjaV9wb3J0X2Fib3J0X2R1bW15X3JlcXVlc3QoaXBvcnQpOworCisJaXNjaV9wb3J0X25vdF9yZWFkeShpaG9zdCwgaXBvcnQpOworCisJaWYgKGlwb3J0LT5yZWFkeV9leGl0KQorCQlzY2lfcG9ydF9pbnZhbGlkYXRlX2R1bW15X3JlbW90ZV9ub2RlKGlwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfY29uZmlndXJpbmdfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgPT0gMCkgeworCQlpc2NpX3BvcnRfbm90X3JlYWR5KGlob3N0LCBpcG9ydCk7CisKKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfV0FJVElORyk7CisJfSBlbHNlIGlmIChpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfY29uZmlndXJpbmdfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwlzY2lfcG9ydF9zdXNwZW5kX3BvcnRfdGFza19zY2hlZHVsZXIoaXBvcnQpOworCWlmIChpcG9ydC0+cmVhZHlfZXhpdCkKKwkJc2NpX3BvcnRfaW52YWxpZGF0ZV9kdW1teV9yZW1vdGVfbm9kZShpcG9ydCk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9zdGFydChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisJdTMyIHBoeV9tYXNrOworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlpZiAoc3RhdGUgIT0gU0NJX1BPUlRfU1RPUFBFRCkgeworCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCWlmIChpcG9ydC0+YXNzaWduZWRfZGV2aWNlX2NvdW50ID4gMCkgeworCQkvKiBUT0RPIFRoaXMgaXMgYSBzdGFydCBmYWlsdXJlIG9wZXJhdGlvbiBiZWNhdXNlCisJCSAqIHRoZXJlIGFyZSBzdGlsbCBkZXZpY2VzIGFzc2lnbmVkIHRvIHRoaXMgcG9ydC4KKwkJICogVGhlcmUgbXVzdCBiZSBubyBkZXZpY2VzIGFzc2lnbmVkIHRvIGEgcG9ydCBvbiBhCisJCSAqIHN0YXJ0IG9wZXJhdGlvbi4KKwkJICovCisJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJfQorCisJaWYgKGlwb3J0LT5yZXNlcnZlZF9ybmkgPT0gU0NVX0RVTU1ZX0lOREVYKSB7CisJCXUxNiBybmkgPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfcmVtb3RlX25vZGUoCisJCQkJJmlob3N0LT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLCAxKTsKKworCQlpZiAocm5pICE9IFNDVV9EVU1NWV9JTkRFWCkKKwkJCXNjaV9wb3J0X2NvbnN0cnVjdF9kdW1teV9ybmMoaXBvcnQsIHJuaSk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7CisJCWlwb3J0LT5yZXNlcnZlZF9ybmkgPSBybmk7CisJfQorCisJaWYgKGlwb3J0LT5yZXNlcnZlZF90YWcgPT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpIHsKKwkJdTE2IHRhZzsKKworCQl0YWcgPSBpc2NpX2FsbG9jX3RhZyhpaG9zdCk7CisJCWlmICh0YWcgPT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpCisJCQlzdGF0dXMgPSBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTOworCQllbHNlCisJCQlzY2lfcG9ydF9jb25zdHJ1Y3RfZHVtbXlfdGFzayhpcG9ydCwgdGFnKTsKKwkJaXBvcnQtPnJlc2VydmVkX3RhZyA9IHRhZzsKKwl9CisKKwlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCXBoeV9tYXNrID0gc2NpX3BvcnRfZ2V0X3BoeXMoaXBvcnQpOworCisJCS8qCisJCSAqIFRoZXJlIGFyZSBvbmUgb3IgbW9yZSBwaHlzIGFzc2lnbmVkIHRvIHRoaXMgcG9ydC4gIE1ha2Ugc3VyZQorCQkgKiB0aGUgcG9ydCdzIHBoeSBtYXNrIGlzIGluIGZhY3QgbGVnYWwgYW5kIHN1cHBvcnRlZCBieSB0aGUKKwkJICogc2lsaWNvbi4KKwkJICovCisJCWlmIChzY2lfcG9ydF9pc19waHlfbWFza192YWxpZChpcG9ydCwgcGh5X21hc2spID09IHRydWUpIHsKKwkJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCQkgIFNDSV9QT1JUX1JFQURZKTsKKworCQkJcmV0dXJuIFNDSV9TVUNDRVNTOworCQl9CisJCXN0YXR1cyA9IFNDSV9GQUlMVVJFOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXNjaV9wb3J0X2Rlc3Ryb3lfZHVtbXlfcmVzb3VyY2VzKGlwb3J0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9zdG9wKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUE9SVF9TVE9QUEVEOgorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUE9SVF9TVUJfV0FJVElORzoKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwljYXNlIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORzoKKwljYXNlIFNDSV9QT1JUX1JFU0VUVElORzoKKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVE9QUElORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9oYXJkX3Jlc2V0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1MzIgdGltZW91dCkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QSFk7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gTlVMTDsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKwl1MzIgcGh5X2luZGV4OworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlpZiAoc3RhdGUgIT0gU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMKSB7CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJLyogU2VsZWN0IGEgcGh5IG9uIHdoaWNoIHdlIGNhbiBzZW5kIHRoZSBoYXJkIHJlc2V0IHJlcXVlc3QuICovCisJZm9yIChwaHlfaW5kZXggPSAwOyBwaHlfaW5kZXggPCBTQ0lfTUFYX1BIWVMgJiYgIWlwaHk7IHBoeV9pbmRleCsrKSB7CisJCWlwaHkgPSBpcG9ydC0+cGh5X3RhYmxlW3BoeV9pbmRleF07CisJCWlmIChpcGh5ICYmICFzY2lfcG9ydF9hY3RpdmVfcGh5KGlwb3J0LCBpcGh5KSkgeworCQkJLyoKKwkJCSAqIFdlIGZvdW5kIGEgcGh5IGJ1dCBpdCBpcyBub3QgcmVhZHkgc2VsZWN0CisJCQkgKiBkaWZmZXJlbnQgcGh5CisJCQkgKi8KKwkJCWlwaHkgPSBOVUxMOworCQl9CisJfQorCisJLyogSWYgd2UgaGF2ZSBhIHBoeSB0aGVuIGdvIGFoZWFkIGFuZCBzdGFydCB0aGUgcmVzZXQgcHJvY2VkdXJlICovCisJaWYgKCFpcGh5KQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IHNjaV9waHlfcmVzZXQoaXBoeSk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc2NpX21vZF90aW1lcigmaXBvcnQtPnRpbWVyLCB0aW1lb3V0KTsKKwlpcG9ydC0+bm90X3JlYWR5X3JlYXNvbiA9IFNDSUNfUE9SVF9OT1RfUkVBRFlfSEFSRF9SRVNFVF9SRVFVRVNURUQ7CisKKwlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LCBTQ0lfUE9SVF9SRVNFVFRJTkcpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzY2lfcG9ydF9hZGRfcGh5KCkgLQorICogQHNjaV9wb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHBvcnQgaW4gd2hpY2ggdGhlIHBoeSB3aWxsIGJlIGFkZGVkLgorICogQHNjaV9waHk6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBwaHkgd2hpY2ggaXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBvcnQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBhZGQgYSBQSFkgdG8gdGhlIHNlbGVjdGVkIHBvcnQuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4KKyAqIGVudW0gc2NpX3N0YXR1cy4gU0NJX1NVQ0NFU1MgdGhlIHBoeSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcG9ydC4gQW55IG90aGVyCisgKiBzdGF0dXMgaXMgYSBmYWlsdXJlIHRvIGFkZCB0aGUgcGh5IHRvIHRoZSBwb3J0LgorICovCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfYWRkX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1RPUFBFRDogeworCQlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHBvcnRfc2FzX2FkZHJlc3M7CisKKwkJLyogUmVhZCB0aGUgcG9ydCBhc3NpZ25lZCBTQVMgQWRkcmVzcyBpZiB0aGVyZSBpcyBvbmUgKi8KKwkJc2NpX3BvcnRfZ2V0X3Nhc19hZGRyZXNzKGlwb3J0LCAmcG9ydF9zYXNfYWRkcmVzcyk7CisKKwkJaWYgKHBvcnRfc2FzX2FkZHJlc3MuaGlnaCAhPSAwICYmIHBvcnRfc2FzX2FkZHJlc3MubG93ICE9IDApIHsKKwkJCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X3Nhc19hZGRyZXNzOworCisJCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgUEhZIFNBUyBBZGRyZXNzIG1hdGNoZXMgdGhlIFNBUyBBZGRyZXNzCisJCQkgKiBmb3IgdGhpcyBwb3J0CisJCQkgKi8KKwkJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKGlwaHksICZwaHlfc2FzX2FkZHJlc3MpOworCisJCQlpZiAocG9ydF9zYXNfYWRkcmVzcy5oaWdoICE9IHBoeV9zYXNfYWRkcmVzcy5oaWdoIHx8CisJCQkgICAgcG9ydF9zYXNfYWRkcmVzcy5sb3cgICE9IHBoeV9zYXNfYWRkcmVzcy5sb3cpCisJCQkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwkJfQorCQlyZXR1cm4gc2NpX3BvcnRfc2V0X3BoeShpcG9ydCwgaXBoeSk7CisJfQorCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJY2FzZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUw6CisJCXN0YXR1cyA9IHNjaV9wb3J0X3NldF9waHkoaXBvcnQsIGlwaHkpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXNjaV9wb3J0X2dlbmVyYWxfbGlua191cF9oYW5kbGVyKGlwb3J0LCBpcGh5LCB0cnVlKTsKKwkJaXBvcnQtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1BPUlRfTk9UX1JFQURZX1JFQ09ORklHVVJJTkc7CisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORyk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwljYXNlIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORzoKKwkJc3RhdHVzID0gc2NpX3BvcnRfc2V0X3BoeShpcG9ydCwgaXBoeSk7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisJCXNjaV9wb3J0X2dlbmVyYWxfbGlua191cF9oYW5kbGVyKGlwb3J0LCBpcGh5LCB0cnVlKTsKKworCQkvKiBSZS1lbnRlciB0aGUgY29uZmlndXJpbmcgc3RhdGUgc2luY2UgdGhpcyBtYXkgYmUgdGhlIGxhc3QgcGh5IGluCisJCSAqIHRoZSBwb3J0LgorCQkgKi8KKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKKy8qKgorICogc2NpX3BvcnRfcmVtb3ZlX3BoeSgpIC0KKyAqIEBzY2lfcG9ydDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwb3J0IGluIHdoaWNoIHRoZSBwaHkgd2lsbCBiZSBhZGRlZC4KKyAqIEBzY2lfcGh5OiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgcGh5IHdoaWNoIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBwb3J0LgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSBQSFkgZnJvbSB0aGUgc2VsZWN0ZWQgUE9SVC4gVGhpcyBtZXRob2QgcmV0dXJucworICogYW4gZW51bSBzY2lfc3RhdHVzLiBTQ0lfU1VDQ0VTUyB0aGUgcGh5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcG9ydC4gQW55CisgKiBvdGhlciBzdGF0dXMgaXMgYSBmYWlsdXJlIHRvIGFkZCB0aGUgcGh5IHRvIHRoZSBwb3J0LgorICovCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfcmVtb3ZlX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NUT1BQRUQ6CisJCXJldHVybiBzY2lfcG9ydF9jbGVhcl9waHkoaXBvcnQsIGlwaHkpOworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9jbGVhcl9waHkoaXBvcnQsIGlwaHkpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeShpcG9ydCwgaXBoeSwgdHJ1ZSk7CisJCWlwb3J0LT5ub3RfcmVhZHlfcmVhc29uID0gU0NJQ19QT1JUX05PVF9SRUFEWV9SRUNPTkZJR1VSSU5HOworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORzoKKwkJc3RhdHVzID0gc2NpX3BvcnRfY2xlYXJfcGh5KGlwb3J0LCBpcGh5KTsKKworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIHRydWUpOworCisJCS8qIFJlLWVudGVyIHRoZSBjb25maWd1cmluZyBzdGF0ZSBzaW5jZSB0aGlzIG1heSBiZSB0aGUgbGFzdCBwaHkgaW4KKwkJICogdGhlIHBvcnQKKwkJICovCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfbGlua191cChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCQkvKiBTaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBwaHkgZ29pbmcgbGluayB1cCBmb3IgdGhlIHBvcnQgd2UKKwkJICogY2FuIGp1c3QgZW5hYmxlIGl0IGFuZCBjb250aW51ZQorCQkgKi8KKwkJc2NpX3BvcnRfYWN0aXZhdGVfcGh5KGlwb3J0LCBpcGh5LCB0cnVlKTsKKworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwkJc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIoaXBvcnQsIGlwaHksIHRydWUpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUE9SVF9SRVNFVFRJTkc6CisJCS8qIFRPRE8gV2Ugc2hvdWxkICBtYWtlICBzdXJlICB0aGF0ICB0aGUgcGh5ICB0aGF0ICBoYXMgZ29uZQorCQkgKiBsaW5rIHVwIGlzIHRoZSBzYW1lIG9uZSBvbiB3aGljaCB3ZSBzZW50IHRoZSByZXNldC4gIEl0IGlzCisJCSAqIHBvc3NpYmxlIHRoYXQgdGhlIHBoeSBvbiB3aGljaCB3ZSBzZW50ICB0aGUgcmVzZXQgaXMgbm90IHRoZQorCQkgKiBvbmUgdGhhdCBoYXMgIGdvbmUgIGxpbmsgdXAgIGFuZCB3ZSAgd2FudCB0byBtYWtlIHN1cmUgdGhhdAorCQkgKiBwaHkgYmVpbmcgcmVzZXQgIGNvbWVzICBiYWNrLiAgQ29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgYQorCQkgKiByZXNldCBpcyBzZW50IGJ1dCBiZWZvcmUgdGhlIGhhcmR3YXJlIHByb2Nlc3NlcyB0aGUgcmVzZXQgaXQKKwkJICogZ2V0IGEgbGluayB1cCBvbiAgdGhlICBwb3J0IGJlY2F1c2Ugb2YgYSBob3QgcGx1ZyBldmVudC4KKwkJICogYmVjYXVzZSAgb2YgIHRoZSByZXNldCByZXF1ZXN0IHRoaXMgcGh5IHdpbGwgZ28gbGluayBkb3duCisJCSAqIGFsbW9zdCBpbW1lZGlhdGVseS4KKwkJICovCisKKwkJLyogSW4gdGhlIHJlc2V0dGluZyBzdGF0ZSB3ZSBkb24ndCBub3RpZnkgdGhlIHVzZXIgcmVnYXJkaW5nCisJCSAqIGxpbmsgdXAgYW5kIGxpbmsgZG93biBub3RpZmljYXRpb25zLgorCQkgKi8KKwkJc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIoaXBvcnQsIGlwaHksIGZhbHNlKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfbGlua19kb3duKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwkJc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIHRydWUpOworCisJCS8qIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcGh5cyBsZWZ0IGluIHRoZSBwb3J0LCB0aGVuCisJCSAqIHRyYW5zaXRpb24gdGhlIHBvcnQgdG8gdGhlIFdBSVRJTkcgc3RhdGUgdW50aWwgc3VjaCB0aW1lCisJCSAqIGFzIGEgcGh5IGdvZXMgbGluayB1cAorCQkgKi8KKwkJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgPT0gMCkKKwkJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCQkgIFNDSV9QT1JUX1NVQl9XQUlUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BPUlRfUkVTRVRUSU5HOgorCQkvKiBJbiB0aGUgcmVzZXR0aW5nIHN0YXRlIHdlIGRvbid0IG5vdGlmeSB0aGUgdXNlciByZWdhcmRpbmcKKwkJICogbGluayB1cCBhbmQgbGluayBkb3duIG5vdGlmaWNhdGlvbnMuICovCisJCXNjaV9wb3J0X2RlYWN0aXZhdGVfcGh5KGlwb3J0LCBpcGh5LCBmYWxzZSk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0YXJ0X2lvKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwkJaXBvcnQtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCsrOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jb21wbGV0ZV9pbyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUE9SVF9TVE9QUEVEOgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX1BPUlRfU1RPUFBJTkc6CisJCXNjaV9wb3J0X2RlY3JlbWVudF9yZXF1ZXN0X2NvdW50KGlwb3J0KTsKKworCQlpZiAoaXBvcnQtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwKQorCQkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJCSAgU0NJX1BPUlRfU1RPUFBFRCk7CisJCWJyZWFrOworCWNhc2UgU0NJX1BPUlRfUkVBRFk6CisJY2FzZSBTQ0lfUE9SVF9SRVNFVFRJTkc6CisJY2FzZSBTQ0lfUE9SVF9GQUlMRUQ6CisJY2FzZSBTQ0lfUE9SVF9TVUJfV0FJVElORzoKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwkJc2NpX3BvcnRfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoaXBvcnQpOworCQlicmVhazsKKwljYXNlIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORzoKKwkJc2NpX3BvcnRfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoaXBvcnQpOworCQlpZiAoaXBvcnQtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwKSB7CisJCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkJICBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2VuYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBwdHNfY29udHJvbF92YWx1ZTsKKworCSAvKiBlbmFibGUgdGhlIHBvcnQgdGFzayBzY2hlZHVsZXIgaW4gYSBzdXNwZW5kZWQgc3RhdGUgKi8KKwlwdHNfY29udHJvbF92YWx1ZSA9IHJlYWRsKCZpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXB0c19jb250cm9sX3ZhbHVlIHw9IFNDVV9QVFN4Q1JfR0VOX0JJVChFTkFCTEUpIHwgU0NVX1BUU3hDUl9HRU5fQklUKFNVU1BFTkQpOworCXdyaXRlbChwdHNfY29udHJvbF92YWx1ZSwgJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2Rpc2FibGVfcG9ydF90YXNrX3NjaGVkdWxlcihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgcHRzX2NvbnRyb2xfdmFsdWU7CisKKwlwdHNfY29udHJvbF92YWx1ZSA9IHJlYWRsKCZpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXB0c19jb250cm9sX3ZhbHVlICY9CisJCX4oU0NVX1BUU3hDUl9HRU5fQklUKEVOQUJMRSkgfCBTQ1VfUFRTeENSX0dFTl9CSVQoU1VTUEVORCkpOworCXdyaXRlbChwdHNfY29udHJvbF92YWx1ZSwgJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3Bvc3RfZHVtbXlfcmVtb3RlX25vZGUoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTggcGh5c19pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmM7CisJdTE2IHJuaSA9IGlwb3J0LT5yZXNlcnZlZF9ybmk7CisJdTMyIGNvbW1hbmQ7CisKKwlybmMgPSAmaWhvc3QtPnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGVbcm5pXTsKKwlybmMtPnNzcC5pc192YWxpZCA9IHRydWU7CisKKwljb21tYW5kID0gU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ18zMiB8CisJCSAgcGh5c19pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8IHJuaTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7CisKKwkvKiBlbnN1cmUgaGFyZHdhcmUgaGFzIHNlZW4gdGhlIHBvc3Qgcm5jIGNvbW1hbmQgYW5kIGdpdmUgaXQKKwkgKiBhbXBsZSB0aW1lIHRvIGFjdCBiZWZvcmUgc2VuZGluZyB0aGUgc3VzcGVuZAorCSAqLworCXJlYWRsKCZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X3N0YXR1cyk7IC8qIGZsdXNoICovCisJdWRlbGF5KDEwKTsKKworCWNvbW1hbmQgPSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX1NVU1BFTkRfVFhfUlggfAorCQkgIHBoeXNfaW5kZXggPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQgfCBybmk7CisKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGNvbW1hbmQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9zdG9wcGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKworCWlmIChpcG9ydC0+c20ucHJldmlvdXNfc3RhdGVfaWQgPT0gU0NJX1BPUlRfU1RPUFBJTkcpIHsKKwkJLyoKKwkJICogSWYgd2UgZW50ZXIgdGhpcyBzdGF0ZSBiZWNhc3VzZSBvZiBhIHJlcXVlc3QgdG8gc3RvcAorCQkgKiB0aGUgcG9ydCB0aGVuIHdlIHdhbnQgdG8gZGlzYWJsZSB0aGUgaGFyZHdhcmVzIHBvcnQKKwkJICogdGFzayBzY2hlZHVsZXIuICovCisJCXNjaV9wb3J0X2Rpc2FibGVfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9zdG9wcGVkX3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJLyogRW5hYmxlIGFuZCBzdXNwZW5kIHRoZSBwb3J0IHRhc2sgc2NoZWR1bGVyICovCisJc2NpX3BvcnRfZW5hYmxlX3BvcnRfdGFza19zY2hlZHVsZXIoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTMyIHByZXZfc3RhdGU7CisKKwlwcmV2X3N0YXRlID0gaXBvcnQtPnNtLnByZXZpb3VzX3N0YXRlX2lkOworCWlmIChwcmV2X3N0YXRlICA9PSBTQ0lfUE9SVF9SRVNFVFRJTkcpCisJCWlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKGlwb3J0LCBTQ0lfU1VDQ0VTUyk7CisJZWxzZQorCQlpc2NpX3BvcnRfbm90X3JlYWR5KGlob3N0LCBpcG9ydCk7CisKKwkvKiBQb3N0IGFuZCBzdXNwZW5kIHRoZSBkdW1teSByZW1vdGUgbm9kZSBjb250ZXh0IGZvciB0aGlzIHBvcnQuICovCisJc2NpX3BvcnRfcG9zdF9kdW1teV9yZW1vdGVfbm9kZShpcG9ydCk7CisKKwkvKiBTdGFydCB0aGUgcmVhZHkgc3Vic3RhdGUgbWFjaGluZSAqLworCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJICBTQ0lfUE9SVF9TVUJfV0FJVElORyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3Jlc2V0dGluZ19zdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKworCXNjaV9kZWxfdGltZXIoJmlwb3J0LT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3N0b3BwaW5nX3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaXBvcnQtPnRpbWVyKTsKKworCXNjaV9wb3J0X2Rlc3Ryb3lfZHVtbXlfcmVzb3VyY2VzKGlwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZmFpbGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKworCWlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKGlwb3J0LCBTQ0lfRkFJTFVSRV9USU1FT1VUKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgc2NpX3BvcnRfc3RhdGVfdGFibGVbXSA9IHsKKwlbU0NJX1BPUlRfU1RPUFBFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9wb3J0X3N0b3BwZWRfc3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9wb3J0X3N0b3BwZWRfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9QT1JUX1NUT1BQSU5HXSA9IHsKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BvcnRfc3RvcHBpbmdfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9QT1JUX1JFQURZXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfcmVhZHlfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1BPUlRfU1VCX1dBSVRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV93YWl0aW5nX2VudGVyLAorCX0sCisJW1NDSV9QT1JUX1NVQl9PUEVSQVRJT05BTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX29wZXJhdGlvbmFsX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9vcGVyYXRpb25hbF9leGl0CisJfSwKKwlbU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfY29uZmlndXJpbmdfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX2NvbmZpZ3VyaW5nX2V4aXQKKwl9LAorCVtTQ0lfUE9SVF9SRVNFVFRJTkddID0geworCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcG9ydF9yZXNldHRpbmdfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9QT1JUX0ZBSUxFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9wb3J0X2ZhaWxlZF9zdGF0ZV9lbnRlciwKKwl9Cit9OworCit2b2lkIHNjaV9wb3J0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgdTggaW5kZXgsCisJCQkgICAgIHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXNjaV9pbml0X3NtKCZpcG9ydC0+c20sIHNjaV9wb3J0X3N0YXRlX3RhYmxlLCBTQ0lfUE9SVF9TVE9QUEVEKTsKKworCWlwb3J0LT5sb2dpY2FsX3BvcnRfaW5kZXggID0gU0NJQ19TRFNfRFVNTVlfUE9SVDsKKwlpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9IGluZGV4OworCWlwb3J0LT5hY3RpdmVfcGh5X21hc2sgICAgID0gMDsKKwlpcG9ydC0+cmVhZHlfZXhpdAkgICAgICA9IGZhbHNlOworCisJaXBvcnQtPm93bmluZ19jb250cm9sbGVyID0gaWhvc3Q7CisKKwlpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID0gMDsKKwlpcG9ydC0+YXNzaWduZWRfZGV2aWNlX2NvdW50ID0gMDsKKworCWlwb3J0LT5yZXNlcnZlZF9ybmkgPSBTQ1VfRFVNTVlfSU5ERVg7CisJaXBvcnQtPnJlc2VydmVkX3RhZyA9IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHOworCisJc2NpX2luaXRfdGltZXIoJmlwb3J0LT50aW1lciwgcG9ydF90aW1lb3V0KTsKKworCWlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycyA9IE5VTEw7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspCisJCWlwb3J0LT5waHlfdGFibGVbaW5kZXhdID0gTlVMTDsKK30KKwordm9pZCBpc2NpX3BvcnRfaW5pdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGludCBpbmRleCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmaXBvcnQtPnJlbW90ZV9kZXZfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlwb3J0LT5kb21haW5fZGV2X2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZpcG9ydC0+c3RhdGVfbG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZpcG9ydC0+c3RhcnRfY29tcGxldGUpOworCWlwb3J0LT5pc2NpX2hvc3QgPSBpaG9zdDsKKwlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlwb3J0LCBpc2NpX2ZyZWVkKTsKKwlhdG9taWNfc2V0KCZpcG9ydC0+ZXZlbnQsIDApOworfQorCisvKioKKyAqIGlzY2lfcG9ydF9nZXRfc3RhdGUoKSAtIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc3RhdHVzIG9mIHRoZSBwb3J0IG9iamVjdC4KKyAqIEBpc2NpX3BvcnQ6IFRoaXMgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgaXNjaV9wb3J0IG9iamVjdAorICoKKyAqIHN0YXR1cyBvZiB0aGUgb2JqZWN0IGFzIGEgaXNjaV9zdGF0dXMgZW51bS4KKyAqLworZW51bSBpc2NpX3N0YXR1cyBpc2NpX3BvcnRfZ2V0X3N0YXRlKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCkKK3sKKwlyZXR1cm4gaXNjaV9wb3J0LT5zdGF0dXM7Cit9CisKK3ZvaWQgc2NpX3BvcnRfYnJvYWRjYXN0X2NoYW5nZV9yZWNlaXZlZChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJLyogbm90aWZ5IHRoZSB1c2VyLiAqLworCWlzY2lfcG9ydF9iY19jaGFuZ2VfcmVjZWl2ZWQoaWhvc3QsIGlwb3J0LCBpcGh5KTsKK30KKworaW50IGlzY2lfcG9ydF9wZXJmb3JtX2hhcmRfcmVzZXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWludCBpZHgsIHJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlwb3J0ID0gJXBcbiIsCisJCV9fZnVuY19fLCBpcG9ydCk7CisKKwlpbml0X2NvbXBsZXRpb24oJmlwb3J0LT5oYXJkX3Jlc2V0X2NvbXBsZXRlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkjZGVmaW5lIElTQ0lfUE9SVF9SRVNFVF9USU1FT1VUIFNDSUNfU0RTX1NJR05BVFVSRV9GSVNfVElNRU9VVAorCXN0YXR1cyA9IHNjaV9wb3J0X2hhcmRfcmVzZXQoaXBvcnQsIElTQ0lfUE9SVF9SRVNFVF9USU1FT1VUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmaXBvcnQtPmhhcmRfcmVzZXRfY29tcGxldGUpOworCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlwb3J0ID0gJXA7IGhhcmQgcmVzZXQgY29tcGxldGlvblxuIiwKKwkJCV9fZnVuY19fLCBpcG9ydCk7CisKKwkJaWYgKGlwb3J0LT5oYXJkX3Jlc2V0X3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCX0gZWxzZSB7CisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlwb3J0ID0gJXA7IHNjaV9wb3J0X2hhcmRfcmVzZXQgY2FsbCIKKwkJCSIgZmFpbGVkIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaXBvcnQsIHN0YXR1cyk7CisKKwl9CisKKwkvKiBJZiB0aGUgaGFyZCByZXNldCBmb3IgdGhlIHBvcnQgaGFzIGZhaWxlZCwgY29uc2lkZXIgdGhpcworCSAqIHRoZSBzYW1lIGFzIGxpbmsgZmFpbHVyZXMgb24gYWxsIHBoeXMgaW4gdGhlIHBvcnQuCisJICovCisJaWYgKHJldCAhPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKSB7CisKKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgPSAlcDsgaGFyZCByZXNldCBmYWlsZWQgIgorCQkJIigweCV4KSAtIGRyaXZpbmcgZXhwbGljaXQgbGluayBmYWlsIGZvciBhbGwgcGh5c1xuIiwKKwkJCV9fZnVuY19fLCBpcG9ydCwgaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzKTsKKworCQkvKiBEb3duIGFsbCBwaHlzIGluIHRoZSBwb3J0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNDSV9NQVhfUEhZUzsgKytpZHgpIHsKKwkJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaWR4XTsKKworCQkJaWYgKCFpcGh5KQorCQkJCWNvbnRpbnVlOworCQkJc2NpX3BoeV9zdG9wKGlwaHkpOworCQkJc2NpX3BoeV9zdGFydChpcGh5KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXNjaV9wb3J0X2RlZm9ybWVkKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgd2hlbiBhIHBvcnQgYmVjb21lcworICogICAgaW5hY3RpdmUuCisgKiBAcGh5OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGxpYnNhcyBwaHkgd2l0aCB0aGUgaW5hY3RpdmUgcG9ydC4KKyAqCisgKi8KK3ZvaWQgaXNjaV9wb3J0X2RlZm9ybWVkKHN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5KQoreworCXByX2RlYnVnKCIlczogc2FzX3BoeSA9ICVwXG4iLCBfX2Z1bmNfXywgcGh5KTsKK30KKworLyoqCisgKiBpc2NpX3BvcnRfZm9ybWVkKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgd2hlbiBhIHBvcnQgYmVjb21lcworICogICAgYWN0aXZlLgorICogQHBoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsaWJzYXMgcGh5IHdpdGggdGhlIGFjdGl2ZSBwb3J0LgorICoKKyAqLwordm9pZCBpc2NpX3BvcnRfZm9ybWVkKHN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5KQoreworCXByX2RlYnVnKCIlczogc2FzX3BoeSA9ICVwLCBzYXNfcG9ydCA9ICVwXG4iLCBfX2Z1bmNfXywgcGh5LCBwaHktPnBvcnQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGVjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmgKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0lTQ0lfUE9SVF9IXworI2RlZmluZSBfSVNDSV9QT1JUX0hfCisKKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJzYXMuaCIKKyNpbmNsdWRlICJwaHkuaCIKKworI2RlZmluZSBTQ0lDX1NEU19EVU1NWV9QT1JUICAgMHhGRgorCitzdHJ1Y3QgaXNjaV9waHk7CitzdHJ1Y3QgaXNjaV9ob3N0OworCitlbnVtIGlzY2lfc3RhdHVzIHsKKwlpc2NpX2ZyZWVkICAgICAgICA9IDB4MDAsCisJaXNjaV9zdGFydGluZyAgICAgPSAweDAxLAorCWlzY2lfcmVhZHkgICAgICAgID0gMHgwMiwKKwlpc2NpX3JlYWR5X2Zvcl9pbyA9IDB4MDMsCisJaXNjaV9zdG9wcGluZyAgICAgPSAweDA0LAorCWlzY2lfc3RvcHBlZCAgICAgID0gMHgwNSwKK307CisKKy8qKgorICogc3RydWN0IGlzY2lfcG9ydCAtIGlzY2kgZGlyZWN0IGF0dGFjaGVkIHNhcyBwb3J0IG9iamVjdAorICogQGV2ZW50OiBjb3VudHMgYmNucyBhbmQgcG9ydCBzdG9wIGV2ZW50cyAoZm9yIGJjbiBmaWx0ZXJpbmcpCisgKiBAcmVhZHlfZXhpdDogc2V2ZXJhbCBzdGF0ZXMgY29uc3RpdHV0ZSAncmVhZHknLiBXaGVuIGV4aXRpbmcgcmVhZHkgd2UKKyAqICAgICAgICAgICAgICBuZWVkIHRvIHRha2UgZXh0cmEgcG9ydC10ZWFyZG93biBhY3Rpb25zIHRoYXQgYXJlCisgKiAgICAgICAgICAgICAgc2tpcHBlZCB3aGVuIGV4aXRpbmcgdG8gYW5vdGhlciAncmVhZHknIHN0YXRlLgorICogQGxvZ2ljYWxfcG9ydF9pbmRleDogc29mdHdhcmUgcG9ydCBpbmRleAorICogQHBoeXNpY2FsX3BvcnRfaW5kZXg6IGhhcmR3YXJlIHBvcnQgaW5kZXgKKyAqIEBhY3RpdmVfcGh5X21hc2s6IGlkZW50aWZpZXMgcGh5IG1lbWJlcnMKKyAqIEByZXNlcnZlZF90YWc6CisgKiBAcmVzZXJ2ZWRfcm5pOiByZXNlcnZlciBmb3IgcG9ydCB0YXNrIHNjaGVkdWxlciB3b3JrYXJvdW5kCisgKiBAc3RhcnRlZF9yZXF1ZXN0X2NvdW50OiByZWZlcmVuY2UgY291bnQgZm9yIG91dHN0YW5kaW5nIGNvbW1hbmRzCisgKiBAbm90X3JlYWR5X3JlYXNvbjogc2V0IGR1cmluZyBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgbm90aWZpZWQKKyAqIEB0aW1lcjogdGltZW91dCBzdGFydC9zdG9wIG9wZXJhdGlvbnMKKyAqLworc3RydWN0IGlzY2lfcG9ydCB7CisJZW51bSBpc2NpX3N0YXR1cyBzdGF0dXM7CisJI2RlZmluZSBJUE9SVF9CQ05fQkxPQ0tFRCAwCisJI2RlZmluZSBJUE9SVF9CQ05fUEVORElORyAxCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdG9taWNfdCBldmVudDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3Q7CisJc3RydWN0IGFzZF9zYXNfcG9ydCBzYXNfcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlbW90ZV9kZXZfbGlzdDsKKwlzcGlubG9ja190IHN0YXRlX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBkb21haW5fZGV2X2xpc3Q7CisJc3RydWN0IGNvbXBsZXRpb24gc3RhcnRfY29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24gaGFyZF9yZXNldF9jb21wbGV0ZTsKKwllbnVtIHNjaV9zdGF0dXMgaGFyZF9yZXNldF9zdGF0dXM7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgc207CisJYm9vbCByZWFkeV9leGl0OworCXU4IGxvZ2ljYWxfcG9ydF9pbmRleDsKKwl1OCBwaHlzaWNhbF9wb3J0X2luZGV4OworCXU4IGFjdGl2ZV9waHlfbWFzazsKKwl1MTYgcmVzZXJ2ZWRfcm5pOworCXUxNiByZXNlcnZlZF90YWc7CisJdTMyIHN0YXJ0ZWRfcmVxdWVzdF9jb3VudDsKKwl1MzIgYXNzaWduZWRfZGV2aWNlX2NvdW50OworCXUzMiBub3RfcmVhZHlfcmVhc29uOworCXN0cnVjdCBpc2NpX3BoeSAqcGh5X3RhYmxlW1NDSV9NQVhfUEhZU107CisJc3RydWN0IGlzY2lfaG9zdCAqb3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IHNjaV90aW1lciB0aW1lcjsKKwlzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzOworCS8qIFhYWCByZXdvcms6IG9ubHkgb25lIHJlZ2lzdGVyLCBubyBuZWVkIHRvIHJlcGxpY2F0ZSBwZXItcG9ydCAqLworCXUzMiBfX2lvbWVtICpwb3J0X3BlX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXI7CisJc3RydWN0IHNjdV92aWl0X2VudHJ5IF9faW9tZW0gKnZpaXRfcmVnaXN0ZXJzOworfTsKKworZW51bSBzY2lfcG9ydF9ub3RfcmVhZHlfcmVhc29uX2NvZGUgeworCVNDSUNfUE9SVF9OT1RfUkVBRFlfTk9fQUNUSVZFX1BIWVMsCisJU0NJQ19QT1JUX05PVF9SRUFEWV9IQVJEX1JFU0VUX1JFUVVFU1RFRCwKKwlTQ0lDX1BPUlRfTk9UX1JFQURZX0lOVkFMSURfUE9SVF9DT05GSUdVUkFUSU9OLAorCVNDSUNfUE9SVF9OT1RfUkVBRFlfUkVDT05GSUdVUklORywKKworCVNDSUNfUE9SVF9OT1RfUkVBRFlfUkVBU09OX0NPREVfTUFYCit9OworCitzdHJ1Y3Qgc2NpX3BvcnRfZW5kX3BvaW50X3Byb3BlcnRpZXMgeworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9waHlfcHJvdG8gcHJvdG9jb2xzOworfTsKKworc3RydWN0IHNjaV9wb3J0X3Byb3BlcnRpZXMgeworCXUzMiBpbmRleDsKKwlzdHJ1Y3Qgc2NpX3BvcnRfZW5kX3BvaW50X3Byb3BlcnRpZXMgbG9jYWw7CisJc3RydWN0IHNjaV9wb3J0X2VuZF9wb2ludF9wcm9wZXJ0aWVzIHJlbW90ZTsKKwl1MzIgcGh5X21hc2s7Cit9OworCisvKioKKyAqIGVudW0gc2NpX3BvcnRfc3RhdGVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCB0aGUgc3RhdGVzIGZvciB0aGUKKyAqICAgIGNvbW1vbiBwb3J0IHN0YXRlIG1hY2hpbmUuCisgKgorICoKKyAqLworZW51bSBzY2lfcG9ydF9zdGF0ZXMgeworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHBvcnQgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHN0b3BwZWQuCisJICogSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUE9SVF9TVE9QUEVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBzdG9wcGluZy4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQsIGJ1dCBleGlzdGluZyBJTworCSAqIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgdG8gY29tcGxldGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX1NUT1BQSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHBvcnQgaXMgbm93IHJlYWR5LiAgVGh1cywgdGhlIHVzZXIgaXMKKwkgKiBhYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGlzIHBvcnQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUQVJUSU5HIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX1JFQURZLAorCisJLyoqCisJICogVGhlIHN1YnN0YXRlIHdoZXJlIHRoZSBwb3J0IGlzIHN0YXJ0ZWQgYW5kIHJlYWR5IGJ1dCBoYXMgbm8KKwkgKiBhY3RpdmUgcGh5cy4KKwkgKi8KKwlTQ0lfUE9SVF9TVUJfV0FJVElORywKKworCS8qKgorCSAqIFRoZSBzdWJzdGF0ZSB3aGVyZSB0aGUgcG9ydCBpcyBzdGFydGVkIGFuZCByZWFkeSBhbmQgdGhlcmUgaXMKKwkgKiBhdCBsZWFzdCBvbmUgcGh5IG9wZXJhdGlvbmFsLgorCSAqLworCVNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTCwKKworCS8qKgorCSAqIFRoZSBzdWJzdGF0ZSB3aGVyZSB0aGUgcG9ydCBpcyBzdGFydGVkIGFuZCB0aGVyZSB3YXMgYW4KKwkgKiBhZGQvcmVtb3ZlIHBoeSBldmVudC4gIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGluIEF1dG9tYXRpYworCSAqIFBvcnQgQ29uZmlndXJhdGlvbiBNb2RlIChBUEMpCisJICovCisJU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHBvcnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcGVyZm9ybWluZyBhIGhhcmQKKwkgKiByZXNldC4gIFRodXMsIHRoZSB1c2VyIGlzIHVuYWJsZSB0byBwZXJmb3JtIElPIG9wZXJhdGlvbnMgb24gdGhpcworCSAqIHBvcnQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX1JFU0VUVElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoZSBwb3J0IGhhcyBmYWlsZWQgYSByZXNldCByZXF1ZXN0LiAgVGhpcyBzdGF0ZQorCSAqIGlzIGVudGVyZWQgd2hlbiBhIHBvcnQgcmVzZXQgcmVxdWVzdCB0aW1lcyBvdXQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFU0VUVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUE9SVF9GQUlMRUQsCisKKworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNjaV9wb3J0X2RlY3JlbWVudF9yZXF1ZXN0X2NvdW50KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCWlmIChXQVJOX09OQ0UoaXBvcnQtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwLAorCQkgICAgICAgIiVzOiB0cmllZCB0byBkZWNyZW1lbnQgc3RhcnRlZF9yZXF1ZXN0X2NvdW50IHBhc3QgMCE/IiwKKwkJCV9fZnVuY19fKSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCWlwb3J0LT5zdGFydGVkX3JlcXVlc3RfY291bnQtLTsKK30KKworI2RlZmluZSBzY2lfcG9ydF9hY3RpdmVfcGh5KHBvcnQsIHBoeSkgXAorCSgoKHBvcnQpLT5hY3RpdmVfcGh5X21hc2sgJiAoMSA8PCAocGh5KS0+cGh5X2luZGV4KSkgIT0gMCkKKwordm9pZCBzY2lfcG9ydF9jb25zdHJ1Y3QoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJdTggcG9ydF9pbmRleCwKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9zdGFydChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCk7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfc3RvcChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9hZGRfcGh5KAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9yZW1vdmVfcGh5KAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK3ZvaWQgc2NpX3BvcnRfc2V0dXBfdHJhbnNwb3J0cygKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwl1MzIgZGV2aWNlX2lkKTsKKwordm9pZCBpc2NpX3BvcnRfYmNuX2VuYWJsZShzdHJ1Y3QgaXNjaV9ob3N0ICosIHN0cnVjdCBpc2NpX3BvcnQgKik7CisKK3ZvaWQgc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCWJvb2wgZG9fbm90aWZ5X3VzZXIpOworCitib29sIHNjaV9wb3J0X2xpbmtfZGV0ZWN0ZWQoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2xpbmtfdXAoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9saW5rX2Rvd24oc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK3N0cnVjdCBpc2NpX3JlcXVlc3Q7CitzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlOworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0YXJ0X2lvKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jb21wbGV0ZV9pbygKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNhc19saW5rcmF0ZSBzY2lfcG9ydF9nZXRfbWF4X2FsbG93ZWRfc3BlZWQoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpOworCit2b2lkIHNjaV9wb3J0X2Jyb2FkY2FzdF9jaGFuZ2VfcmVjZWl2ZWQoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworYm9vbCBzY2lfcG9ydF9pc192YWxpZF9waHlfYXNzaWdubWVudCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwl1MzIgcGh5X2luZGV4KTsKKwordm9pZCBzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzX2FkZHJlc3MpOworCit2b2lkIHNjaV9wb3J0X2dldF9hdHRhY2hlZF9zYXNfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXNfYWRkcmVzcyk7CisKK2VudW0gaXNjaV9zdGF0dXMgaXNjaV9wb3J0X2dldF9zdGF0ZSgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppc2NpX3BvcnQpOworCit2b2lkIGlzY2lfcG9ydF9mb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICopOwordm9pZCBpc2NpX3BvcnRfZGVmb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICopOworCit2b2lkIGlzY2lfcG9ydF9pbml0KAorCXN0cnVjdCBpc2NpX3BvcnQgKnBvcnQsCisJc3RydWN0IGlzY2lfaG9zdCAqaG9zdCwKKwlpbnQgaW5kZXgpOworCitpbnQgaXNjaV9wb3J0X3BlcmZvcm1faGFyZF9yZXNldChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisjZW5kaWYgLyogIWRlZmluZWQoX0lTQ0lfUE9SVF9IXykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0X2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NmIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0X2NvbmZpZy5jCkBAIC0wLDAgKzEsNzU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaG9zdC5oIgorCisjZGVmaW5lIFNDSUNfU0RTX01QQ19SRUNPTkZJR1VSQVRJT05fVElNRU9VVCAgICAoMTApCisjZGVmaW5lIFNDSUNfU0RTX0FQQ19SRUNPTkZJR1VSQVRJT05fVElNRU9VVCAgICAoMTApCisjZGVmaW5lIFNDSUNfU0RTX0FQQ19XQUlUX0xJTktfVVBfTk9USUZJQ0FUSU9OICAoMTAwKQorCitlbnVtIFNDSUNfU0RTX0FQQ19BQ1RJVklUWSB7CisJU0NJQ19TRFNfQVBDX1NLSVBfUEhZLAorCVNDSUNfU0RTX0FQQ19BRERfUEhZLAorCVNDSUNfU0RTX0FQQ19TVEFSVF9USU1FUiwKKworCVNDSUNfU0RTX0FQQ19BQ1RJVklUWV9NQVgKK307CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyYWwgcG9ydCBjb25maWd1cmF0aW9uIGFnZW50IHJvdXRpbmVzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqCisgKgorICogQGFkZHJlc3Nfb25lOiBBIFNBUyBBZGRyZXNzIHRvIGJlIGNvbXBhcmVkLgorICogQGFkZHJlc3NfdHdvOiBBIFNBUyBBZGRyZXNzIHRvIGJlIGNvbXBhcmVkLgorICoKKyAqIENvbXBhcmUgdGhlIHR3byBTQVMgQWRkcmVzcyBhbmQgaWYgU0FTIEFkZHJlc3MgT25lIGlzIGdyZWF0ZXIgdGhhbiBTQVMKKyAqIEFkZHJlc3MgVHdvIHRoZW4gcmV0dXJuID4gMCBlbHNlIGlmIFNBUyBBZGRyZXNzIE9uZSBpcyBsZXNzIHRoYW4gU0FTIEFkZHJlc3MKKyAqIFR3byByZXR1cm4gPCAwIE90aGVyd2lzZSB0aGV5IGFyZSB0aGUgc2FtZSByZXR1cm4gMCBBIHNpZ25lZCB2YWx1ZSBvZiB4ID4gMAorICogPiB5IHdoZXJlIHggaXMgcmV0dXJuZWQgZm9yIEFkZHJlc3MgT25lID4gQWRkcmVzcyBUd28geSBpcyByZXR1cm5lZCBmb3IKKyAqIEFkZHJlc3MgT25lIDwgQWRkcmVzcyBUd28gMCBpcyByZXR1cm5lZCBvZnIgQWRkcmVzcyBPbmUgPSBBZGRyZXNzIFR3bworICovCitzdGF0aWMgczMyIHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKAorCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgYWRkcmVzc19vbmUsCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBhZGRyZXNzX3R3bykKK3sKKwlpZiAoYWRkcmVzc19vbmUuaGlnaCA+IGFkZHJlc3NfdHdvLmhpZ2gpIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChhZGRyZXNzX29uZS5oaWdoIDwgYWRkcmVzc190d28uaGlnaCkgeworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChhZGRyZXNzX29uZS5sb3cgPiBhZGRyZXNzX3R3by5sb3cpIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChhZGRyZXNzX29uZS5sb3cgPCBhZGRyZXNzX3R3by5sb3cpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRoZSB0d28gU0FTIEFkZHJlc3MgbXVzdCBiZSBpZGVudGljYWwgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgorICogQGNvbnRyb2xsZXI6IFRoZSBjb250cm9sbGVyIG9iamVjdCB1c2VkIGZvciB0aGUgcG9ydCBzZWFyY2guCisgKiBAcGh5OiBUaGUgcGh5IG9iamVjdCB0byBtYXRjaC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBmaW5kIGEgbWF0Y2hpbmcgcG9ydCBmb3IgdGhlIHBoeS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAqIHBvcnQgYW5kIHBoeSBib3RoIGhhdmUgdGhlIHNhbWUgYnJvYWRjYXN0IHNhcyBhZGRyZXNzIGFuZCBzYW1lIHJlY2VpdmVkIHNhcworICogYWRkcmVzcy4gVGhlIHBvcnQgYWRkcmVzcyBvciB0aGUgTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZworICogcG9ydC4gcG9ydCBhZGRyZXNzIGlmIHRoZSBwb3J0IGNhbiBiZSBmb3VuZCB0byBtYXRjaCB0aGUgcGh5LgorICogTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBwb3J0IGZvciB0aGUgcGh5LgorICovCitzdGF0aWMgc3RydWN0IGlzY2lfcG9ydCAqc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9maW5kX3BvcnQoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXU4IGk7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwb3J0X3Nhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcG9ydF9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHBoeV9zYXNfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHBoeV9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzczsKKworCS8qCisJICogU2luY2UgdGhpcyBwaHkgY2FuIGJlIGEgbWVtYmVyIG9mIGEgd2lkZSBwb3J0IGNoZWNrIHRvIHNlZSBpZiBvbmUgb3IKKwkgKiBtb3JlIHBoeXMgbWF0Y2ggdGhlIHNlbnQgYW5kIHJlY2VpdmVkIFNBUyBhZGRyZXNzIGFzIHRoaXMgcGh5IGluIHdoaWNoCisJICogY2FzZSBpdCBzaG91bGQgcGFydGljaXBhdGUgaW4gdGhlIHNhbWUgcG9ydC4KKwkgKi8KKwlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcyhpcGh5LCAmcGh5X3Nhc19hZGRyZXNzKTsKKwlzY2lfcGh5X2dldF9hdHRhY2hlZF9zYXNfYWRkcmVzcyhpcGh5LCAmcGh5X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzKTsKKworCWZvciAoaSA9IDA7IGkgPCBpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CisKKwkJc2NpX3BvcnRfZ2V0X3Nhc19hZGRyZXNzKGlwb3J0LCAmcG9ydF9zYXNfYWRkcmVzcyk7CisJCXNjaV9wb3J0X2dldF9hdHRhY2hlZF9zYXNfYWRkcmVzcyhpcG9ydCwgJnBvcnRfYXR0YWNoZWRfZGV2aWNlX2FkZHJlc3MpOworCisJCWlmIChzY2lfc2FzX2FkZHJlc3NfY29tcGFyZShwb3J0X3Nhc19hZGRyZXNzLCBwaHlfc2FzX2FkZHJlc3MpID09IDAgJiYKKwkJICAgIHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKHBvcnRfYXR0YWNoZWRfZGV2aWNlX2FkZHJlc3MsIHBoeV9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzcykgPT0gMCkKKwkJCXJldHVybiBpcG9ydDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKgorICogQGNvbnRyb2xsZXI6IFRoaXMgaXMgdGhlIGNvbnRyb2xsZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHBvcnQgYWdlbnQKKyAqIEBwb3J0X2FnZW50OiBUaGlzIGlzIHRoZSBwb3J0IGNvbmZpZ3J1YXRpb24gYWdlbnQgZm9yIHRoZSBjb250cm9sbGVyLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHZhbGlkYXRlIHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24gaXMgY29ycmVjdCBmb3IgdGhlIFNDVQorICogaGFyZHdhcmUuICBUaGUgU0NVIGhhcmR3YXJlIGFsbG93cyBmb3IgcG9ydCBjb25maWd1cmF0aW9ucyBhcyBmb2xsb3dzLiBMUDAKKyAqIC0+IChQRTApLCAoUEUwLCBQRTEpLCAoUEUwLCBQRTEsIFBFMiwgUEUzKSBMUDEgLT4gKFBFMSkgTFAyIC0+IChQRTIpLCAoUEUyLAorICogUEUzKSBMUDMgLT4gKFBFMykgZW51bSBzY2lfc3RhdHVzIFNDSV9TVUNDRVNTIHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgZm9yCisgKiB0aGlzIHBvcnQgY29uZmlndXJhdGlvbiBhZ2VudC4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OCisgKiB0aGUgcG9ydCBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF92YWxpZGF0ZV9wb3J0cygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIGZpcnN0X2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBzZWNvbmRfYWRkcmVzczsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIHRoZSBtYXggcmFuZ2VzIGZvciBhbGwgdGhlIHBoeXMgdGhlIG1heCBpbmRleAorCSAqIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgcG9ydCByYW5nZSBpbmRleCAqLworCWlmIChwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVswXS5tYXhfaW5kZXggIT0gMCB8fAorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsxXS5tYXhfaW5kZXggIT0gMSB8fAorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsyXS5tYXhfaW5kZXggIT0gMiB8fAorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVszXS5tYXhfaW5kZXggIT0gMykKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKworCS8qCisJICogVGhpcyBpcyBhIHJlcXVlc3QgdG8gY29uZmlndXJlIGEgc2luZ2xlIHg0IHBvcnQgb3IgYXQgbGVhc3QgYXR0ZW1wdAorCSAqIHRvIG1ha2UgYWxsIHRoZSBwaHlzIGludG8gYSBzaW5nbGUgcG9ydCAqLworCWlmIChwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVswXS5taW5faW5kZXggPT0gMCAmJgorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsxXS5taW5faW5kZXggPT0gMCAmJgorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsyXS5taW5faW5kZXggPT0gMCAmJgorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVszXS5taW5faW5kZXggPT0gMCkKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCisJLyoKKwkgKiBUaGlzIGlzIGEgZGVnZW5lcmF0ZSBjYXNlIHdoZXJlIHBoeSAxIGFuZCBwaHkgMiBhcmUgYXNzaWduZWQKKwkgKiB0byB0aGUgc2FtZSBwb3J0IHRoaXMgaXMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGJ5IHRoZSBoYXJkd2FyZQorCSAqIHVubGVzcyB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBzYW1lIHg0IHBvcnQgYW5kIHRoaXMgY29uZGl0aW9uIHdhcworCSAqIGFscmVhZHkgY2hlY2tlZCBhYm92ZS4gKi8KKwlpZiAocG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbMl0ubWluX2luZGV4ID09IDEpIHsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwl9CisKKwkvKgorCSAqIFBFMCBhbmQgUEUzIGNhbiBuZXZlciBoYXZlIHRoZSBzYW1lIFNBUyBBZGRyZXNzIHVubGVzcyB0aGV5CisJICogYXJlIHBhcnQgb2YgdGhlIHNhbWUgeDQgd2lkZSBwb3J0IGFuZCB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZAorCSAqIGZvciB0aGlzIGNvbmRpdGlvbi4gKi8KKwlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbMF0sICZmaXJzdF9hZGRyZXNzKTsKKwlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbM10sICZzZWNvbmRfYWRkcmVzcyk7CisKKwlpZiAoc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoZmlyc3RfYWRkcmVzcywgc2Vjb25kX2FkZHJlc3MpID09IDApIHsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwl9CisKKwkvKgorCSAqIFBFMCBhbmQgUEUxIGFyZSBjb25maWd1cmVkIGludG8gYSAyeDEgcG9ydHMgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogU0FTIEFkZHJlc3MgZm9yIFBFMCBhbmQgUEUyIGFyZSBkaWZmZXJlbnQgc2luY2UgdGhleSBjYW4gbm90IGJlCisJICogcGFydCBvZiB0aGUgc2FtZSBwb3J0LiAqLworCWlmIChwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVswXS5taW5faW5kZXggPT0gMCAmJgorCSAgICBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsxXS5taW5faW5kZXggPT0gMSkgeworCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbMF0sICZmaXJzdF9hZGRyZXNzKTsKKwkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzWzJdLCAmc2Vjb25kX2FkZHJlc3MpOworCisJCWlmIChzY2lfc2FzX2FkZHJlc3NfY29tcGFyZShmaXJzdF9hZGRyZXNzLCBzZWNvbmRfYWRkcmVzcykgPT0gMCkgeworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwkJfQorCX0KKworCS8qCisJICogUEUyIGFuZCBQRTMgYXJlIGNvbmZpZ3VyZWQgaW50byBhIDJ4MSBwb3J0cyBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBTQVMgQWRkcmVzcyBmb3IgUEUxIGFuZCBQRTMgYXJlIGRpZmZlcmVudCBzaW5jZSB0aGV5IGNhbiBub3QgYmUKKwkgKiBwYXJ0IG9mIHRoZSBzYW1lIHBvcnQuICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzJdLm1pbl9pbmRleCA9PSAyICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzNdLm1pbl9pbmRleCA9PSAzKSB7CisJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1sxXSwgJmZpcnN0X2FkZHJlc3MpOworCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbM10sICZzZWNvbmRfYWRkcmVzcyk7CisKKwkJaWYgKHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKGZpcnN0X2FkZHJlc3MsIHNlY29uZF9hZGRyZXNzKSA9PSAwKSB7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCQl9CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYW51YWwgcG9ydCBjb25maWd1cmF0aW9uIGFnZW50IHJvdXRpbmVzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogdmVyaWZ5IGFsbCBvZiB0aGUgcGh5cyBpbiB0aGUgc2FtZSBwb3J0IGFyZSB1c2luZyB0aGUgc2FtZSBTQVMgYWRkcmVzcyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX21wY19hZ2VudF92YWxpZGF0ZV9waHlfY29uZmlndXJhdGlvbihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQpCit7CisJdTMyIHBoeV9tYXNrOworCXUzMiBhc3NpZ25lZF9waHlfbWFzazsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHNhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X2Fzc2lnbmVkX2FkZHJlc3M7CisJdTggcG9ydF9pbmRleDsKKwl1OCBwaHlfaW5kZXg7CisKKwlhc3NpZ25lZF9waHlfbWFzayA9IDA7CisJc2FzX2FkZHJlc3MuaGlnaCA9IDA7CisJc2FzX2FkZHJlc3MubG93ID0gMDsKKworCWZvciAocG9ydF9pbmRleCA9IDA7IHBvcnRfaW5kZXggPCBTQ0lfTUFYX1BPUlRTOyBwb3J0X2luZGV4KyspIHsKKwkJcGh5X21hc2sgPSBpaG9zdC0+b2VtX3BhcmFtZXRlcnMucG9ydHNbcG9ydF9pbmRleF0ucGh5X21hc2s7CisKKwkJaWYgKCFwaHlfbWFzaykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhhdCBvbmUgb3IgbW9yZSBvZiB0aGUgcGh5cyB3ZXJlIG5vdCBhbHJlYWR5IGFzc2luZ2VkIHRvCisJCSAqIGEgZGlmZmVyZW50IHBvcnQuICovCisJCWlmICgocGh5X21hc2sgJiB+YXNzaWduZWRfcGh5X21hc2spID09IDApIHsKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJCX0KKworCQkvKiBGaW5kIHRoZSBzdGFydGluZyBwaHkgaW5kZXggZm9yIHRoaXMgcm91bmQgdGhyb3VnaCB0aGUgbG9vcCAqLworCQlmb3IgKHBoeV9pbmRleCA9IDA7IHBoeV9pbmRleCA8IFNDSV9NQVhfUEhZUzsgcGh5X2luZGV4KyspIHsKKwkJCWlmICgocGh5X21hc2sgJiAoMSA8PCBwaHlfaW5kZXgpKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzW3BoeV9pbmRleF0sCisJCQkJCQkgICAgICZzYXNfYWRkcmVzcyk7CisKKwkJCS8qCisJCQkgKiBUaGUgcGh5X2luZGV4IGNhbiBiZSB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlCisJCQkgKiBwb3J0IHJhbmdlIHNpbmNlIHRoZSBoYXJkd2FyZSBzdGFydHMgYWxsIGxvZ2ljYWwgcG9ydHMKKwkJCSAqIHRoZSBzYW1lIGFzIHRoZSBQRSBpbmRleC4gKi8KKwkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWluX2luZGV4ID0gcG9ydF9pbmRleDsKKwkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWF4X2luZGV4ID0gcGh5X2luZGV4OworCisJCQlpZiAocGh5X2luZGV4ICE9IHBvcnRfaW5kZXgpIHsKKwkJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFNlZSBob3cgbWFueSBhZGRpdGlvbmFsIHBoeXMgYXJlIGJlaW5nIGFkZGVkIHRvIHRoaXMgbG9naWNhbCBwb3J0LgorCQkgKiBOb3RlOiBXZSBoYXZlIG5vdCBtb3ZlZCB0aGUgY3VycmVudCBwaHlfaW5kZXggc28gd2Ugd2lsbCBhY3R1YWxseQorCQkgKiAgICAgICBjb21wYXJlIHRoZSBzdGFydHRpbmcgcGh5IHdpdGggaXRzZWxmLgorCQkgKiAgICAgICBUaGlzIGlzIGV4cGVjdGVkIGFuZCByZXF1aXJlZCB0byBhZGQgdGhlIHBoeSB0byB0aGUgcG9ydC4gKi8KKwkJd2hpbGUgKHBoeV9pbmRleCA8IFNDSV9NQVhfUEhZUykgeworCQkJaWYgKChwaHlfbWFzayAmICgxIDw8IHBoeV9pbmRleCkpID09IDApCisJCQkJY29udGludWU7CisJCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbcGh5X2luZGV4XSwKKwkJCQkJCSAgICAgJnBoeV9hc3NpZ25lZF9hZGRyZXNzKTsKKworCQkJaWYgKHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKHNhc19hZGRyZXNzLCBwaHlfYXNzaWduZWRfYWRkcmVzcykgIT0gMCkgeworCQkJCS8qCisJCQkJICogVGhlIHBoeSBtYXNrIHNwZWNpZmllZCB0aGF0IHRoaXMgcGh5IGlzIHBhcnQgb2YgdGhlIHNhbWUgcG9ydAorCQkJCSAqIGFzIHRoZSBzdGFydGluZyBwaHkgYW5kIGl0IGlzIG5vdCBzbyBmYWlsIHRoaXMgY29uZmlndXJhdGlvbiAqLworCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJCQl9CisKKwkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWluX2luZGV4ID0gcG9ydF9pbmRleDsKKwkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWF4X2luZGV4ID0gcGh5X2luZGV4OworCisJCQlzY2lfcG9ydF9hZGRfcGh5KCZpaG9zdC0+cG9ydHNbcG9ydF9pbmRleF0sCisJCQkJCSAgICAgICZpaG9zdC0+cGh5c1twaHlfaW5kZXhdKTsKKworCQkJYXNzaWduZWRfcGh5X21hc2sgfD0gKDEgPDwgcGh5X2luZGV4KTsKKwkJfQorCisJCXBoeV9pbmRleCsrOworCX0KKworCXJldHVybiBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X3ZhbGlkYXRlX3BvcnRzKGlob3N0LCBwb3J0X2FnZW50KTsKK30KKworc3RhdGljIHZvaWQgbXBjX2FnZW50X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXU4IGluZGV4OworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBjb25maWd1cmVfcGh5X21hc2s7CisKKwlwb3J0X2FnZW50ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCpwb3J0X2FnZW50KSwgdGltZXIpOworCWlob3N0ID0gY29udGFpbmVyX29mKHBvcnRfYWdlbnQsIHR5cGVvZigqaWhvc3QpLCBwb3J0X2FnZW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCXBvcnRfYWdlbnQtPnRpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKworCS8qIEZpbmQgdGhlIG1hc2sgb2YgcGh5cyB0aGF0IGFyZSByZXBvcnRlZCByZWFkIGJ1dCBhcyB5ZXQgdW5jb25maWd1cmVkIGludG8gYSBwb3J0ICovCisJY29uZmlndXJlX3BoeV9tYXNrID0gfnBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJiBwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzazsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCisJCWlmIChjb25maWd1cmVfcGh5X21hc2sgJiAoMSA8PCBpbmRleCkpIHsKKwkJCXBvcnRfYWdlbnQtPmxpbmtfdXBfaGFuZGxlcihpaG9zdCwgcG9ydF9hZ2VudCwKKwkJCQkJCSAgICBwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpLAorCQkJCQkJICAgIGlwaHkpOworCQl9CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NpX21wY19hZ2VudF9saW5rX3VwKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCwKKwkJCQkgICAgICAgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwkvKiBJZiB0aGUgcG9ydCBpcyBOVUxMIHRoZW4gdGhlIHBoeSB3YXMgbm90IGFzc2lnbmVkIHRvIGEgcG9ydC4KKwkgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIHBoeSB3YXMgbm90IGdpdmVuIHRoZSBzYW1lIFNBUyBBZGRyZXNzIGFzCisJICogdGhlIG90aGVyIFBIWXMgaW4gdGhlIHBvcnQuCisJICovCisJaWYgKCFpcG9ydCkKKwkJcmV0dXJuOworCisJcG9ydF9hZ2VudC0+cGh5X3JlYWR5X21hc2sgfD0gKDEgPDwgaXBoeS0+cGh5X2luZGV4KTsKKwlzY2lfcG9ydF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKKwlpZiAoKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgJiAoMSA8PCBpcGh5LT5waHlfaW5kZXgpKSkKKwkJcG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayB8PSAoMSA8PCBpcGh5LT5waHlfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAY29udHJvbGxlcjogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgbGluayBkb3duCisgKiAgICBub3RpZmljYXRpb24uCisgKiBAcG9ydDogVGhpcyBpcyB0aGUgcG9ydCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaHkuICBJZiB0aGUgaXMgbm8KKyAqICAgIGFzc29jaWF0ZWQgcG9ydCB0aGlzIGlzIGFuIE5VTEwuICBUaGUgcG9ydCBpcyBhbiBpbnZhbGlkCisgKiAgICBoYW5kbGUgb25seSBpZiB0aGUgcGh5IHdhcyBuZXZlciBwb3J0IG9mIHRoaXMgcG9ydC4gIFRoaXMgaGFwcGVucyB3aGVuCisgKiAgICB0aGUgcGh5IGlzIG5vdCBicm9hZGNhc3RpbmcgdGhlIHNhbWUgU0FTIGFkZHJlc3MgYXMgdGhlIG90aGVyIHBoeXMgaW4gdGhlCisgKiAgICBhc3NpZ25lZCBwb3J0LgorICogQHBoeTogVGhpcyBpcyB0aGUgcGh5IG9iamVjdCB3aGljaCBoYXMgZ29uZSBsaW5rIGRvd24uCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBtYW51YWwgcG9ydCBjb25maWd1cmF0aW9uIGxpbmsgZG93biBub3RpZmljYXRpb25zLgorICogU2luY2UgYWxsIHBvcnRzIGFuZCBwaHlzIGFyZSBhc3NvY2lhdGVkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgd2UganVzdCB0dXJuCisgKiBhcm91bmQgYW5kIG5vdGlmaXkgdGhlIHBvcnQgb2JqZWN0IG9mIHRoZSBsaW5rIGRvd24gZXZlbnQuICBJZiB0aGlzIFBIWSBpcworICogbm90IGFzc29jaWF0ZWQgd2l0aCBhIHBvcnQgdGhlcmUgaXMgbm8gYWN0aW9uIHRha2VuLiBJcyBpdCBwb3NzaWJsZSB0byBnZXQgYQorICogbGluayBkb3duIG5vdGlmaWNhdGlvbiBmcm9tIGEgcGh5IHRoYXQgaGFzIG5vIGFzc29jb2F0ZWQgcG9ydD8KKyAqLworc3RhdGljIHZvaWQgc2NpX21wY19hZ2VudF9saW5rX2Rvd24oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQsCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWlmIChpcG9ydCAhPSBOVUxMKSB7CisJCS8qCisJCSAqIElmIHdlIGNhbiBmb3JtIGEgbmV3IHBvcnQgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBwaHlzCisJCSAqIHRoZW4gd2Ugd2FudCB0byBzdGFydCB0aGUgdGltZXIgdG8gYWxsb3cgdGhlIFNDSSBVc2VyIHRvCisJCSAqIGNsZWFudXAgb2xkIGRldmljZXMgYW5kIHJlZGlzY292ZXIgdGhlIHBvcnQgYmVmb3JlCisJCSAqIHJlYnVpbGRpbmcgdGhlIHBvcnQgd2l0aCB0aGUgcGh5cyB0aGF0IHJlbWFpbiBpbiB0aGUgcmVhZHkKKwkJICogc3RhdGUuCisJCSAqLworCQlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayAmPSB+KDEgPDwgaXBoeS0+cGh5X2luZGV4KTsKKwkJcG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayAmPSB+KDEgPDwgaXBoeS0+cGh5X2luZGV4KTsKKworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIG1vcmUgcGh5cyB3YWl0aW5nIHRvIGJlCisJCSAqIGNvbmZpZ3VyZWQgaW50byBhIHBvcnQuIElmIHRoZXJlIGFyZSBhbGxvdyB0aGUgU0NJIFVzZXIKKwkJICogdG8gdGVhciBkb3duIHRoaXMgcG9ydCwgaWYgbmVjZXNzYXJ5LCBhbmQgdGhlbiByZWNvbnN0cnVjdAorCQkgKiB0aGUgcG9ydCBhZnRlciB0aGUgdGltZW91dC4KKwkJICovCisJCWlmICgocG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayA9PSAweDAwMDApICYmCisJCSAgICAocG9ydF9hZ2VudC0+cGh5X3JlYWR5X21hc2sgIT0gMHgwMDAwKSAmJgorCQkgICAgIXBvcnRfYWdlbnQtPnRpbWVyX3BlbmRpbmcpIHsKKwkJCXBvcnRfYWdlbnQtPnRpbWVyX3BlbmRpbmcgPSB0cnVlOworCisJCQlzY2lfbW9kX3RpbWVyKCZwb3J0X2FnZW50LT50aW1lciwKKwkJCQkgICAgICBTQ0lDX1NEU19NUENfUkVDT05GSUdVUkFUSU9OX1RJTUVPVVQpOworCQl9CisKKwkJc2NpX3BvcnRfbGlua19kb3duKGlwb3J0LCBpcGh5KTsKKwl9Cit9CisKKy8qIHZlcmlmeSBwaHlzIGFyZSBhc3NpZ25lZCBhIHZhbGlkIFNBUyBhZGRyZXNzIGZvciBhdXRvbWF0aWMgcG9ydAorICogY29uZmlndXJhdGlvbiBtb2RlLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfYXBjX2FnZW50X3ZhbGlkYXRlX3BoeV9jb25maWd1cmF0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwl1OCBwaHlfaW5kZXg7CisJdTggcG9ydF9pbmRleDsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHNhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X2Fzc2lnbmVkX2FkZHJlc3M7CisKKwlwaHlfaW5kZXggPSAwOworCisJd2hpbGUgKHBoeV9pbmRleCA8IFNDSV9NQVhfUEhZUykgeworCQlwb3J0X2luZGV4ID0gcGh5X2luZGV4OworCisJCS8qIEdldCB0aGUgYXNzaWduZWQgU0FTIEFkZHJlc3MgZm9yIHRoZSBmaXJzdCBQSFkgb24gdGhlIGNvbnRyb2xsZXIuICovCisJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1twaHlfaW5kZXhdLAorCQkJCQkgICAgJnNhc19hZGRyZXNzKTsKKworCQl3aGlsZSAoKytwaHlfaW5kZXggPCBTQ0lfTUFYX1BIWVMpIHsKKwkJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1twaHlfaW5kZXhdLAorCQkJCQkJICAgICAmcGh5X2Fzc2lnbmVkX2FkZHJlc3MpOworCisJCQkvKiBWZXJpZnkgZWFjaCBvZiB0aGUgU0FTIGFkZHJlc3MgYXJlIGFsbCB0aGUgc2FtZSBmb3IgZXZlcnkgUEhZICovCisJCQlpZiAoc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoc2FzX2FkZHJlc3MsIHBoeV9hc3NpZ25lZF9hZGRyZXNzKSA9PSAwKSB7CisJCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5taW5faW5kZXggPSBwb3J0X2luZGV4OworCQkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWF4X2luZGV4ID0gcGh5X2luZGV4OworCQkJfSBlbHNlIHsKKwkJCQlwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtwaHlfaW5kZXhdLm1pbl9pbmRleCA9IHBoeV9pbmRleDsKKwkJCQlwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtwaHlfaW5kZXhdLm1heF9pbmRleCA9IHBoeV9pbmRleDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X3ZhbGlkYXRlX3BvcnRzKGlob3N0LCBwb3J0X2FnZW50KTsKK30KKworc3RhdGljIHZvaWQgc2NpX2FwY19hZ2VudF9jb25maWd1cmVfcG9ydHMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkJICAgICAgIGJvb2wgc3RhcnRfdGltZXIpCit7CisJdTggcG9ydF9pbmRleDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCWVudW0gU0NJQ19TRFNfQVBDX0FDVElWSVRZIGFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TS0lQX1BIWTsKKworCWlwb3J0ID0gc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9maW5kX3BvcnQoaWhvc3QsIGlwaHkpOworCisJaWYgKGlwb3J0KSB7CisJCWlmIChzY2lfcG9ydF9pc192YWxpZF9waHlfYXNzaWdubWVudChpcG9ydCwgaXBoeS0+cGh5X2luZGV4KSkKKwkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19BRERfUEhZOworCQllbHNlCisJCQlhcGNfYWN0aXZpdHkgPSBTQ0lDX1NEU19BUENfU0tJUF9QSFk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgbm8gbWF0Y2hpbmcgUG9ydCBmb3IgdGhpcyBQSFkgc28gbGV0cyBzZWFyY2ggdGhyb3VnaCB0aGUKKwkJICogUG9ydHMgYW5kIHNlZSBpZiB3ZSBjYW4gYWRkIHRoZSBQSFkgdG8gaXRzIG93biBwb3J0IG9yIG1heWJlIHN0YXJ0CisJCSAqIHRoZSB0aW1lciBhbmQgd2FpdCB0byBzZWUgaWYgYSB3aWRlciBwb3J0IGNhbiBiZSBtYWRlLgorCQkgKgorCQkgKiBOb3RlIHRoZSBicmVhayB3aGVuIHdlIHJlYWNoIHRoZSBjb25kaXRpb24gb2YgdGhlIHBvcnQgaWQgPT0gcGh5IGlkICovCisJCWZvciAocG9ydF9pbmRleCA9IHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW2lwaHktPnBoeV9pbmRleF0ubWluX2luZGV4OworCQkgICAgIHBvcnRfaW5kZXggPD0gcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbaXBoeS0+cGh5X2luZGV4XS5tYXhfaW5kZXg7CisJCSAgICAgcG9ydF9pbmRleCsrKSB7CisKKwkJCWlwb3J0ID0gJmlob3N0LT5wb3J0c1twb3J0X2luZGV4XTsKKworCQkJLyogRmlyc3Qgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGlzIFBIWSBjYW4gYmUgYWRkZWQgdG8gdGhpcyBQb3J0LiAqLworCQkJaWYgKHNjaV9wb3J0X2lzX3ZhbGlkX3BoeV9hc3NpZ25tZW50KGlwb3J0LCBpcGh5LT5waHlfaW5kZXgpKSB7CisJCQkJLyoKKwkJCQkgKiBQb3J0IGNvbnRhaW5zIGEgUEhZIHdpdGggYSBncmVhdGVyIFBIWSBJRCB0aGFuIHRoZSBjdXJyZW50CisJCQkJICogUEhZIHRoYXQgaGFzIGdvbmUgbGluayB1cC4gIFRoaXMgcGh5IGNhbiBub3QgYmUgcGFydCBvZiBhbnkKKwkJCQkgKiBwb3J0IHNvIHNraXAgaXQgYW5kIG1vdmUgb24uICovCisJCQkJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgPiAoMSA8PCBpcGh5LT5waHlfaW5kZXgpKSB7CisJCQkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TS0lQX1BIWTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiBvdXIgUG9ydCBsaXN0IGFuZCBoYXZlIG5vdCBmb3VuZAorCQkJCSAqIGFueSByZWFzb24gd2h5IHdlIHNob3VsZCBub3QgZWl0aGVyIGFkZCB0aGUgUEhZIHRvIHRoZSBwb3J0CisJCQkJICogb3Igd2FpdCBmb3IgbW9yZSBwaHlzIHRvIGJlY29tZSBhY3RpdmUuICovCisJCQkJaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IGlwaHktPnBoeV9pbmRleCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgUG9ydCBlaXRoZXIgaGFzIG5vIGFjdGl2ZSBQSFlzLgorCQkJCQkgKiBDb25zaWRlciB0aGF0IGlmIHRoZSBwb3J0IGhhZCBhbnkgYWN0aXZlIFBIWXMgd2Ugd291bGQgaGF2ZQorCQkJCQkgKiBvciBhY3RpdmUgUEhZcyB3aXRoCisJCQkJCSAqIGEgbG93ZXIgUEhZIElkIHRoYW4gdGhpcyBQSFkuICovCisJCQkJCWlmIChhcGNfYWN0aXZpdHkgIT0gU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSKSB7CisJCQkJCQlhcGNfYWN0aXZpdHkgPSBTQ0lDX1NEU19BUENfQUREX1BIWTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qCisJCQkJICogVGhlIGN1cnJlbnQgUG9ydCBoYXMgbm8gYWN0aXZlIFBIWXMgYW5kIHRoaXMgUEhZIGNvdWxkIGJlIHBhcnQKKwkJCQkgKiBvZiB0aGlzIFBvcnQuICBTaW5jZSB3ZSBkb250IGtub3cgYXMgeWV0IHNldHVwIHRvIHN0YXJ0IHRoZQorCQkJCSAqIHRpbWVyIGFuZCBzZWUgaWYgdGhlcmUgaXMgYSBiZXR0ZXIgY29uZmlndXJhdGlvbi4gKi8KKwkJCQlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA9PSAwKSB7CisJCQkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TVEFSVF9USU1FUjsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgIT0gMCkgeworCQkJCS8qCisJCQkJICogVGhlIFBvcnQgaGFzIGFuIGFjdGl2ZSBwaHkgYW5kIHRoZSBjdXJyZW50IFBoeSBjYW4gbm90CisJCQkJICogcGFydGljaXBhdGUgaW4gdGhpcyBwb3J0IHNvIHNraXAgdGhlIFBIWSBhbmQgc2VlIGlmCisJCQkJICogdGhlcmUgaXMgYSBiZXR0ZXIgY29uZmlndXJhdGlvbi4gKi8KKwkJCQlhcGNfYWN0aXZpdHkgPSBTQ0lDX1NEU19BUENfU0tJUF9QSFk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc3RhcnQgdGltZXIgb3BlcmF0aW9ucyBzaG91bGQgaW5zdGVhZCBtYXAgdG8gYW4KKwkgKiBhZGQgcGh5IG9wZXJhdGlvbi4gIFRoaXMgaXMgY2F1c2VkIGJlY2F1c2Ugd2UgaGF2ZSBiZWVuIHdhaXRpbmcgdG8KKwkgKiBhZGQgYSBwaHkgdG8gYSBwb3J0IGJ1dCBjb3VsZCBub3QgYmVjdWFzZSB0aGUgYXV0b21hdGljIHBvcnQKKwkgKiBjb25maWd1cmF0aW9uIGVuZ2luZSBoYWQgYSBjaG9pY2Ugb2YgcG9zc2libGUgcG9ydHMgZm9yIHRoZSBwaHkuCisJICogU2luY2Ugd2UgaGF2ZSBnb25lIHRocm91Z2ggYSB0aW1lb3V0IHdlIGFyZSBnb2luZyB0byByZXN0cmljdCB0aGUKKwkgKiBjaG9pY2UgdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHBvcnQuICovCisJaWYgKAorCQkoc3RhcnRfdGltZXIgPT0gZmFsc2UpCisJCSYmIChhcGNfYWN0aXZpdHkgPT0gU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSKQorCQkpIHsKKwkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX0FERF9QSFk7CisJfQorCisJc3dpdGNoIChhcGNfYWN0aXZpdHkpIHsKKwljYXNlIFNDSUNfU0RTX0FQQ19BRERfUEhZOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9hZGRfcGh5KGlwb3J0LCBpcGh5KTsKKworCQlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCQlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrIHw9ICgxIDw8IGlwaHktPnBoeV9pbmRleCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNDSUNfU0RTX0FQQ19TVEFSVF9USU1FUjoKKwkJLyoKKwkJICogVGhpcyBjYW4gb2NjdXIgZm9yIGVpdGhlciBhIGxpbmsgZG93biBldmVudCwgb3IgYSBsaW5rCisJCSAqIHVwIGV2ZW50IHdoZXJlIHdlIGNhbm5vdCB5ZXQgdGVsbCB0aGUgcG9ydCB0byB3aGljaCBhCisJCSAqIHBoeSBiZWxvbmdzLgorCQkgKi8KKwkJaWYgKHBvcnRfYWdlbnQtPnRpbWVyX3BlbmRpbmcpCisJCQlzY2lfZGVsX3RpbWVyKCZwb3J0X2FnZW50LT50aW1lcik7CisKKwkJcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZyA9IHRydWU7CisJCXNjaV9tb2RfdGltZXIoJnBvcnRfYWdlbnQtPnRpbWVyLAorCQkJICAgICAgU0NJQ19TRFNfQVBDX1dBSVRfTElOS19VUF9OT1RJRklDQVRJT04pOworCQlicmVhazsKKworCWNhc2UgU0NJQ19TRFNfQVBDX1NLSVBfUEhZOgorCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgdGhlIFBIWSBjYW4gbm90IGJlIG1hZGUgcGFydCBvZiBhIHBvcnQgYXQgdGhpcyB0aW1lLiAqLworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogc2NpX2FwY19hZ2VudF9saW5rX3VwIC0gaGFuZGxlIGFwYyBsaW5rIHVwIGV2ZW50cworICogQHNjaWM6IFRoaXMgaXMgdGhlIGNvbnRyb2xsZXIgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgdGhlIGxpbmsgdXAKKyAqICAgIG5vdGlmaWNhdGlvbi4KKyAqIEBzY2lfcG9ydDogVGhpcyBpcyB0aGUgcG9ydCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaHkuICBJZiB0aGUgaXMgbm8KKyAqICAgIGFzc29jaWF0ZWQgcG9ydCB0aGlzIGlzIGFuIE5VTEwuCisgKiBAc2NpX3BoeTogVGhpcyBpcyB0aGUgcGh5IG9iamVjdCB3aGljaCBoYXMgZ29uZSBsaW5rIHVwLgorICoKKyAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGF1dG9tYXRpYyBwb3J0IGNvbmZpZ3VyYXRpb24gZm9yIGxpbmsgdXAKKyAqIG5vdGlmaWNhdGlvbnMuIElzIGl0IHBvc3NpYmxlIHRvIGdldCBhIGxpbmsgZG93biBub3RpZmljYXRpb24gZnJvbSBhIHBoeQorICogdGhhdCBoYXMgbm8gYXNzb2NvYXRlZCBwb3J0PworICovCitzdGF0aWMgdm9pZCBzY2lfYXBjX2FnZW50X2xpbmtfdXAoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50LAorCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXU4IHBoeV9pbmRleCAgPSBpcGh5LT5waHlfaW5kZXg7CisKKwlpZiAoIWlwb3J0KSB7CisJCS8qIHRoZSBwaHkgaXMgbm90IHRoZSBwYXJ0IG9mIHRoaXMgcG9ydCAqLworCQlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayB8PSAxIDw8IHBoeV9pbmRleDsKKwkJc2NpX2FwY19hZ2VudF9jb25maWd1cmVfcG9ydHMoaWhvc3QsIHBvcnRfYWdlbnQsIGlwaHksIHRydWUpOworCX0gZWxzZSB7CisJCS8qIHRoZSBwaHkgaXMgYWxyZWFkeSB0aGUgcGFydCBvZiB0aGUgcG9ydCAqLworCQl1MzIgcG9ydF9zdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJCS8qIGlmIHRoZSBQT1JUJ1Mgc3RhdGUgaXMgcmVzZXR0aW5nIHRoZW4gdGhlIGxpbmsgdXAgaXMgZnJvbQorCQkgKiBwb3J0IGhhcmQgcmVzZXQgaW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHRlbGwgdGhlIHBvcnQKKwkJICogdGhhdCBsaW5rIHVwIGlzIHJlY2lldmVkCisJCSAqLworCQlCVUdfT04ocG9ydF9zdGF0ZSAhPSBTQ0lfUE9SVF9SRVNFVFRJTkcpOworCQlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayB8PSAxIDw8IHBoeV9pbmRleDsKKwkJc2NpX3BvcnRfbGlua191cChpcG9ydCwgaXBoeSk7CisJfQorfQorCisvKioKKyAqCisgKiBAY29udHJvbGxlcjogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgbGluayBkb3duCisgKiAgICBub3RpZmljYXRpb24uCisgKiBAaXBvcnQ6IFRoaXMgaXMgdGhlIHBvcnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGh5LiAgSWYgdGhlIGlzIG5vCisgKiAgICBhc3NvY2lhdGVkIHBvcnQgdGhpcyBpcyBhbiBOVUxMLgorICogQGlwaHk6IFRoaXMgaXMgdGhlIHBoeSBvYmplY3Qgd2hpY2ggaGFzIGdvbmUgbGluayBkb3duLgorICoKKyAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGF1dG9tYXRpYyBwb3J0IGNvbmZpZ3VyYXRpb24gbGluayBkb3duCisgKiBub3RpZmljYXRpb25zLiBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcG9ydCB0aGVyZSBpcyBubyBhY3Rpb24gdGFrZW4uIElzIGl0CisgKiBwb3NzaWJsZSB0byBnZXQgYSBsaW5rIGRvd24gbm90aWZpY2F0aW9uIGZyb20gYSBwaHkgdGhhdCBoYXMgbm8gYXNzb2NvYXRlZAorICogcG9ydD8KKyAqLworc3RhdGljIHZvaWQgc2NpX2FwY19hZ2VudF9saW5rX2Rvd24oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQsCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCisJaWYgKCFpcG9ydCkKKwkJcmV0dXJuOworCWlmIChwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrICYgKDEgPDwgaXBoeS0+cGh5X2luZGV4KSkgeworCQllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJCXN0YXR1cyA9IHNjaV9wb3J0X3JlbW92ZV9waHkoaXBvcnQsIGlwaHkpOworCisJCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpCisJCQlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCX0KK30KKworLyogY29uZmlndXJlIHRoZSBwaHlzIGludG8gcG9ydHMgd2hlbiB0aGUgdGltZXIgZmlyZXMgKi8KK3N0YXRpYyB2b2lkIGFwY19hZ2VudF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGNvbmZpZ3VyZV9waHlfbWFzazsKKworCXBvcnRfYWdlbnQgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKnBvcnRfYWdlbnQpLCB0aW1lcik7CisJaWhvc3QgPSBjb250YWluZXJfb2YocG9ydF9hZ2VudCwgdHlwZW9mKCppaG9zdCksIHBvcnRfYWdlbnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZyA9IGZhbHNlOworCisJY29uZmlndXJlX3BoeV9tYXNrID0gfnBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJiBwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzazsKKworCWlmICghY29uZmlndXJlX3BoeV9tYXNrKQorCQlyZXR1cm47CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJaWYgKChjb25maWd1cmVfcGh5X21hc2sgJiAoMSA8PCBpbmRleCkpID09IDApCisJCQljb250aW51ZTsKKworCQlzY2lfYXBjX2FnZW50X2NvbmZpZ3VyZV9wb3J0cyhpaG9zdCwgcG9ydF9hZ2VudCwKKwkJCQkJCSAgICZpaG9zdC0+cGh5c1tpbmRleF0sIGZhbHNlKTsKKwl9CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdWJsaWMgcG9ydCBjb25maWd1cmF0aW9uIGFnZW50IHJvdXRpbmVzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqCisgKgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgZm9yIG9wZXJhdGlvbi4gVGhpcworICogY2FsbCBpcyB1bml2ZXJzYWwgZm9yIGJvdGggbWFudWFsIHBvcnQgY29uZmlndXJhdGlvbiBhbmQgYXV0b21hdGljIHBvcnQKKyAqIGNvbmZpZ3VyYXRpb24gbW9kZXMuCisgKi8KK3ZvaWQgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9jb25zdHJ1Y3QoCisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQpCit7CisJdTMyIGluZGV4OworCisJcG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayA9IDB4MDA7CisJcG9ydF9hZ2VudC0+cGh5X3JlYWR5X21hc2sgPSAweDAwOworCisJcG9ydF9hZ2VudC0+bGlua191cF9oYW5kbGVyID0gTlVMTDsKKwlwb3J0X2FnZW50LT5saW5rX2Rvd25faGFuZGxlciA9IE5VTEw7CisKKwlwb3J0X2FnZW50LT50aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BPUlRTOyBpbmRleCsrKSB7CisJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW2luZGV4XS5taW5faW5kZXggPSAwOworCQlwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtpbmRleF0ubWF4X2luZGV4ID0gMDsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2luaXRpYWxpemUoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwllbnVtIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fbW9kZSBtb2RlOworCisJbW9kZSA9IGlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1vZGVfdHlwZTsKKworCWlmIChtb2RlID09IFNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCXN0YXR1cyA9IHNjaV9tcGNfYWdlbnRfdmFsaWRhdGVfcGh5X2NvbmZpZ3VyYXRpb24oCisJCQkJaWhvc3QsIHBvcnRfYWdlbnQpOworCisJCXBvcnRfYWdlbnQtPmxpbmtfdXBfaGFuZGxlciA9IHNjaV9tcGNfYWdlbnRfbGlua191cDsKKwkJcG9ydF9hZ2VudC0+bGlua19kb3duX2hhbmRsZXIgPSBzY2lfbXBjX2FnZW50X2xpbmtfZG93bjsKKworCQlzY2lfaW5pdF90aW1lcigmcG9ydF9hZ2VudC0+dGltZXIsIG1wY19hZ2VudF90aW1lb3V0KTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBzY2lfYXBjX2FnZW50X3ZhbGlkYXRlX3BoeV9jb25maWd1cmF0aW9uKAorCQkJCWlob3N0LCBwb3J0X2FnZW50KTsKKworCQlwb3J0X2FnZW50LT5saW5rX3VwX2hhbmRsZXIgPSBzY2lfYXBjX2FnZW50X2xpbmtfdXA7CisJCXBvcnRfYWdlbnQtPmxpbmtfZG93bl9oYW5kbGVyID0gc2NpX2FwY19hZ2VudF9saW5rX2Rvd247CisKKwkJc2NpX2luaXRfdGltZXIoJnBvcnRfYWdlbnQtPnRpbWVyLCBhcGNfYWdlbnRfdGltZW91dCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY0MzQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICovCisKKy8qIHByb2JlX3JvbXMgLSBzY2FuIGZvciBvZW0gcGFyYW1ldGVycyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2JlX3JvbXMuaD4KKworI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgorCitzdGF0aWMgZWZpX2NoYXIxNl90IGlzY2lfZWZpdmFyX25hbWVbXSA9IHsKKwknUicsICdzJywgJ3QnLCAnUycsICdjJywgJ3UnLCAnTycKK307CisKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfcmVxdWVzdF9vcHJvbShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl2b2lkIF9faW9tZW0gKm9wcm9tID0gcGNpX21hcF9iaW9zcm9tKHBkZXYpOworCXN0cnVjdCBpc2NpX29yb20gKnJvbSA9IE5VTEw7CisJc2l6ZV90IGxlbiwgaTsKKwlpbnQgajsKKwljaGFyIG9lbV9zaWdbNF07CisJc3RydWN0IGlzY2lfb2VtX2hkciBvZW1faGRyOworCXU4ICp0bXAsIHN1bTsKKworCWlmICghb3Byb20pCisJCXJldHVybiBOVUxMOworCisJbGVuID0gcGNpX2Jpb3Nyb21fc2l6ZShwZGV2KTsKKwlyb20gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpyb20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJvbSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvcm9tXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbiAmJiByb207IGkgKz0gSVNDSV9PRU1fU0lHX1NJWkUpIHsKKwkJbWVtY3B5X2Zyb21pbyhvZW1fc2lnLCBvcHJvbSArIGksIElTQ0lfT0VNX1NJR19TSVpFKTsKKworCQkvKiB3ZSB0aGluayB3ZSBmb3VuZCB0aGUgT0VNIHRhYmxlICovCisJCWlmIChtZW1jbXAob2VtX3NpZywgSVNDSV9PRU1fU0lHLCBJU0NJX09FTV9TSUdfU0laRSkgPT0gMCkgeworCQkJc2l6ZV90IGNvcHlfbGVuOworCisJCQltZW1jcHlfZnJvbWlvKCZvZW1faGRyLCBvcHJvbSArIGksIHNpemVvZihvZW1faGRyKSk7CisKKwkJCWNvcHlfbGVuID0gbWluKG9lbV9oZHIubGVuIC0gc2l6ZW9mKG9lbV9oZHIpLAorCQkJCSAgICAgICBzaXplb2YoKnJvbSkpOworCisJCQltZW1jcHlfZnJvbWlvKHJvbSwKKwkJCQkgICAgICBvcHJvbSArIGkgKyBzaXplb2Yob2VtX2hkciksCisJCQkJICAgICAgY29weV9sZW4pOworCisJCQkvKiBjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKwkJCXRtcCA9ICh1OCAqKSZvZW1faGRyOworCQkJZm9yIChqID0gMCwgc3VtID0gMDsgaiA8IHNpemVvZihvZW1faGRyKTsgaisrLCB0bXArKykKKwkJCQlzdW0gKz0gKnRtcDsKKworCQkJdG1wID0gKHU4ICopcm9tOworCQkJZm9yIChqID0gMDsgaiA8IHNpemVvZigqcm9tKTsgaisrLCB0bXArKykKKwkJCQlzdW0gKz0gKnRtcDsKKworCQkJaWYgKHN1bSAhPSAwKSB7CisJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkJICJPRU0gdGFibGUgY2hlY2tzdW0gZmFpbGVkXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoga2VlcCBnb2luZyBpZiB0aGF0J3Mgbm90IHRoZSBvZW0gcGFyYW0gdGFibGUgKi8KKwkJCWlmIChtZW1jbXAocm9tLT5oZHIuc2lnbmF0dXJlLAorCQkJCSAgIElTQ0lfUk9NX1NJRywKKwkJCQkgICBJU0NJX1JPTV9TSUdfU0laRSkgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIk9FTSBwYXJhbWV0ZXIgdGFibGUgZm91bmQgaW4gT1JPTVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID49IGxlbikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvcHJvbSBwYXJzZSBlcnJvclxuIik7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcm9tKTsKKwkJcm9tID0gTlVMTDsKKwl9CisJcGNpX3VubWFwX2Jpb3Nyb20ob3Byb20pOworCisJcmV0dXJuIHJvbTsKK30KKworZW51bSBzY2lfc3RhdHVzIGlzY2lfcGFyc2Vfb2VtX3BhcmFtZXRlcnMoc3RydWN0IHNjaV9vZW1fcGFyYW1zICpvZW0sCisJCQkJCSAgc3RydWN0IGlzY2lfb3JvbSAqb3JvbSwgaW50IHNjdV9pbmRleCkKK3sKKwkvKiBjaGVjayBmb3IgdmFsaWQgaW5wdXRzICovCisJaWYgKHNjdV9pbmRleCA8IDAgfHwgc2N1X2luZGV4ID49IFNDSV9NQVhfQ09OVFJPTExFUlMgfHwKKwkgICAgc2N1X2luZGV4ID4gb3JvbS0+aGRyLm51bV9lbGVtZW50cyB8fCAhb2VtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpvZW0gPSBvcm9tLT5jdHJsW3NjdV9pbmRleF07CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlzdHJ1Y3QgaXNjaV9vcm9tICpvcm9tID0gTlVMTCwgKmRhdGE7CisJaW50IGksIGo7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIElTQ0lfRldfTkFNRSwgJnBkZXYtPmRldikgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZnctPnNpemUgPCBzaXplb2YoKm9yb20pKQorCQlnb3RvIG91dDsKKworCWRhdGEgPSAoc3RydWN0IGlzY2lfb3JvbSAqKWZ3LT5kYXRhOworCisJaWYgKHN0cm5jbXAoSVNDSV9ST01fU0lHLCBkYXRhLT5oZHIuc2lnbmF0dXJlLAorCQkgICAgc3RybGVuKElTQ0lfUk9NX1NJRykpICE9IDApCisJCWdvdG8gb3V0OworCisJb3JvbSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcm9tKQorCQlnb3RvIG91dDsKKworCW1lbWNweShvcm9tLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCisJaWYgKGlzX2MwKHBkZXYpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogZGVwcmVjYXRlZDogb3ZlcnJpZGUgZGVmYXVsdCBhbXBfY29udHJvbCBmb3IgcHJlLXByZXByb2R1Y3Rpb24KKwkgKiBzaWxpY29uIHJldmlzaW9ucworCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9yb20tPmN0cmwpOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKG9yb20tPmN0cmxbaV0ucGh5cyk7IGorKykgeworCQkJb3JvbS0+Y3RybFtpXS5waHlzW2pdLmFmZV90eF9hbXBfY29udHJvbDAgPSAweGU3YzAzOworCQkJb3JvbS0+Y3RybFtpXS5waHlzW2pdLmFmZV90eF9hbXBfY29udHJvbDEgPSAweGU3YzAzOworCQkJb3JvbS0+Y3RybFtpXS5waHlzW2pdLmFmZV90eF9hbXBfY29udHJvbDIgPSAweGU3YzAzOworCQkJb3JvbS0+Y3RybFtpXS5waHlzW2pdLmFmZV90eF9hbXBfY29udHJvbDMgPSAweGU3YzAzOworCQl9Cisgb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIG9yb207Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWZpICpnZXRfZWZpKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0VGSQorCXJldHVybiAmZWZpOworI2Vsc2UKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdHJ1Y3QgaXNjaV9vcm9tICppc2NpX2dldF9lZmlfdmFyKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJc3RydWN0IGlzY2lfb3JvbSAqcm9tOworCXN0cnVjdCBpc2NpX29lbV9oZHIgKm9lbV9oZHI7CisJdTggKnRtcCwgc3VtOworCWludCBqOworCXVuc2lnbmVkIGxvbmcgZGF0YV9sZW47CisJdTggKmVmaV9kYXRhOworCXUzMiBlZmlfYXR0cmliID0gMDsKKworCWRhdGFfbGVuID0gMTAyNDsKKwllZmlfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZmlfZGF0YSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFRkkgZGF0YVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJvbSA9IChzdHJ1Y3QgaXNjaV9vcm9tICopKGVmaV9kYXRhICsgc2l6ZW9mKHN0cnVjdCBpc2NpX29lbV9oZHIpKTsKKworCWlmIChnZXRfZWZpKCkpCisJCXN0YXR1cyA9IGdldF9lZmkoKS0+Z2V0X3ZhcmlhYmxlKGlzY2lfZWZpdmFyX25hbWUsCisJCQkJCQkgJklTQ0lfRUZJX1ZFTkRPUl9HVUlELAorCQkJCQkJICZlZmlfYXR0cmliLAorCQkJCQkJICZkYXRhX2xlbiwKKwkJCQkJCSBlZmlfZGF0YSk7CisJZWxzZQorCQlzdGF0dXMgPSBFRklfTk9UX0ZPVU5EOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJVbmFibGUgdG8gb2J0YWluIEVGSSB2YXIgZGF0YSBmb3IgT0VNIHBhcm1zXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJb2VtX2hkciA9IChzdHJ1Y3QgaXNjaV9vZW1faGRyICopZWZpX2RhdGE7CisKKwlpZiAobWVtY21wKG9lbV9oZHItPnNpZywgSVNDSV9PRU1fU0lHLCBJU0NJX09FTV9TSUdfU0laRSkgIT0gMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJJbnZhbGlkIE9FTSBoZWFkZXIgc2lnbmF0dXJlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogY2FsY3VsYXRlIGNoZWNrc3VtICovCisJdG1wID0gKHU4ICopZWZpX2RhdGE7CisJZm9yIChqID0gMCwgc3VtID0gMDsgaiA8IChzaXplb2YoKm9lbV9oZHIpICsgc2l6ZW9mKCpyb20pKTsgaisrLCB0bXArKykKKwkJc3VtICs9ICp0bXA7CisKKwlpZiAoc3VtICE9IDApIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiT0VNIHRhYmxlIGNoZWNrc3VtIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChtZW1jbXAocm9tLT5oZHIuc2lnbmF0dXJlLAorCQkgICBJU0NJX1JPTV9TSUcsCisJCSAgIElTQ0lfUk9NX1NJR19TSVpFKSAhPSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIkludmFsaWQgT0VNIHRhYmxlIHNpZ25hdHVyZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiByb207Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9wcm9iZV9yb21zLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9wcm9iZV9yb21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwMDdlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX0lTQ0lfUFJPQkVfUk9NU19IXworI2RlZmluZSBfSVNDSV9QUk9CRV9ST01TX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlICJpc2NpLmgiCisKKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9OT19TUEVFRCAgIDAKKworLyogZ2VuZXJhdGlvbiAxIChpLmUuIDEuNSBHYi9zKSAqLworI2RlZmluZSBTQ0lDX1NEU19QQVJNX0dFTjFfU1BFRUQgMQorCisvKiBnZW5lcmF0aW9uIDIgKGkuZS4gMy4wIEdiL3MpICovCisjZGVmaW5lIFNDSUNfU0RTX1BBUk1fR0VOMl9TUEVFRCAyCisKKy8qIGdlbmVyYXRpb24gMyAoaS5lLiA2LjAgR2IvcykgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9HRU4zX1NQRUVEIDMKKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9NQVhfU1BFRUQgU0NJQ19TRFNfUEFSTV9HRU4zX1NQRUVECisKKy8qIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGJ5IG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdHJ1Y3Qgc2NpX3VzZXJfcGFyYW1ldGVycyB7CisJc3RydWN0IHNjaV9waHlfdXNlcl9wYXJhbXMgeworCQkvKioKKwkJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIE5PVElGWSAoRU5BQkxFIFNQSU4gVVApIHByaW1pdGl2ZQorCQkgKiBpbnNlcnRpb24gZnJlcXVlbmN5IGZvciB0aGlzIHBoeSBpbmRleC4KKwkJICovCisJCXUzMiBub3RpZnlfZW5hYmxlX3NwaW5fdXBfaW5zZXJ0aW9uX2ZyZXF1ZW5jeTsKKworCQkvKioKKwkJICogVGhpcyBtZXRob2Qgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgRFdPUkRzIHdpdGhpbiB3aGljaAorCQkgKiB0byB0cmFuc21pdCBhIHNpbmdsZSBBTElHTiBwcmltaXRpdmUuICBUaGlzIHZhbHVlIGFwcGxpZXMgcmVnYXJkbGVzcworCQkgKiBvZiB3aGF0IHR5cGUgb2YgZGV2aWNlIGlzIGF0dGFjaGVkIG9yIGNvbm5lY3Rpb24gc3RhdGUuICBBIHZhbHVlIG9mCisJCSAqIDAgaW5kaWNhdGVzIHRoYXQgbm8gQUxJR04gcHJpbWl0aXZlcyB3aWxsIGJlIGluc2VydGVkLgorCQkgKi8KKwkJdTE2IGFsaWduX2luc2VydGlvbl9mcmVxdWVuY3k7CisKKwkJLyoqCisJCSAqIFRoaXMgbWV0aG9kIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIERXT1JEcyB3aXRoaW4gd2hpY2gKKwkJICogdG8gdHJhbnNtaXQgMiBBTElHTiBwcmltaXRpdmVzLiAgVGhpcyBhcHBsaWVzIGZvciBTQVMgY29ubmVjdGlvbnMKKwkJICogb25seS4gIEEgbWluaW11bSB2YWx1ZSBvZiAzIGlzIHJlcXVpcmVkIGZvciB0aGlzIGZpZWxkLgorCQkgKi8KKwkJdTE2IGluX2Nvbm5lY3Rpb25fYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeTsKKworCQkvKioKKwkJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gc3BlZWQgZ2VuZXJhdGlvbiB0byBiZSB1dGlsaXplZAorCQkgKiBieSBwaHlzIGluIHRoZSBzdXBwbGllZCBwb3J0LgorCQkgKiAtIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgZ2VuZXJhdGlvbiAxIChpLmUuIDEuNSBHYi9zKS4KKwkJICogLSBBIHZhbHVlIG9mIDIgaW5kaWNhdGVzIGdlbmVyYXRpb24gMiAoaS5lLiAzLjAgR2IvcykuCisJCSAqIC0gQSB2YWx1ZSBvZiAzIGluZGljYXRlcyBnZW5lcmF0aW9uIDMgKGkuZS4gNi4wIEdiL3MpLgorCQkgKi8KKwkJdTggbWF4X3NwZWVkX2dlbmVyYXRpb247CisKKwl9IHBoeXNbU0NJX01BWF9QSFlTXTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXJlY3QgYXR0YWNoZWQgZGV2aWNlcworCSAqIHRoYXQgY2FuIGhhdmUgcG93ZXIgc3VwcGxpZWQgdG8gdGhlbSBzaW11bHRhbmVvdXNseS4KKwkgKi8KKwl1OCBtYXhfbnVtYmVyX2NvbmN1cnJlbnRfZGV2aWNlX3NwaW5fdXA7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gYWxsb3cgYSBwaHkgdG8gY29uc3VtZQorCSAqIHBvd2VyIGJlZm9yZSB5aWVsZGluZyB0byBhbm90aGVyIHBoeS4KKwkgKgorCSAqLworCXU4IHBoeV9zcGluX3VwX2RlbGF5X2ludGVydmFsOworCisJLyoqCisJICogVGhlc2UgdGltZXIgdmFsdWVzIHNwZWNpZmllcyBob3cgbG9uZyBhIGxpbmsgd2lsbCByZW1haW4gb3BlbiB3aXRoIG5vCisJICogYWN0aXZpdHkgaW4gaW5jcmVtZW50cyBvZiBhIG1pY3Jvc2Vjb25kLCBpdCBjYW4gYmUgaW4gaW5jcmVtZW50cyBvZgorCSAqIDEwMCBtaWNyb3NlY29uZHMgaWYgdGhlIHVwcGVyIG1vc3QgYml0IGlzIHNldC4KKwkgKgorCSAqLworCXUxNiBzdHBfaW5hY3Rpdml0eV90aW1lb3V0OworCXUxNiBzc3BfaW5hY3Rpdml0eV90aW1lb3V0OworCisJLyoqCisJICogVGhlc2UgdGltZXIgdmFsdWVzIHNwZWNpZmllcyBob3cgbG9uZyBhIGxpbmsgd2lsbCByZW1haW4gb3BlbiBpbiBpbmNyZW1lbnRzCisJICogb2YgMTAwIG1pY3Jvc2Vjb25kcy4KKwkgKgorCSAqLworCXUxNiBzdHBfbWF4X29jY3VwYW5jeV90aW1lb3V0OworCXUxNiBzc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0OworCisJLyoqCisJICogVGhpcyB0aW1lciB2YWx1ZSBzcGVjaWZpZXMgaG93IGxvbmcgYSBsaW5rIHdpbGwgcmVtYWluIG9wZW4gd2l0aCBubworCSAqIG91dGJvdW5kIHRyYWZmaWMgaW4gaW5jcmVtZW50cyBvZiBhIG1pY3Jvc2Vjb25kLgorCSAqCisJICovCisJdTggbm9fb3V0Ym91bmRfdGFza190aW1lb3V0OworCit9OworCisjZGVmaW5lIFNDSUNfU0RTX1BBUk1fUEhZX01BU0tfTUlOIDB4MAorI2RlZmluZSBTQ0lDX1NEU19QQVJNX1BIWV9NQVNLX01BWCAweEYKKyNkZWZpbmUgTUFYX0NPTkNVUlJFTlRfREVWSUNFX1NQSU5fVVBfQ09VTlQgNAorCitzdHJ1Y3Qgc2NpX29lbV9wYXJhbXM7CitpbnQgc2NpX29lbV9wYXJhbWV0ZXJzX3ZhbGlkYXRlKHN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtKTsKKworc3RydWN0IGlzY2lfb3JvbTsKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfcmVxdWVzdF9vcHJvbShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitlbnVtIHNjaV9zdGF0dXMgaXNjaV9wYXJzZV9vZW1fcGFyYW1ldGVycyhzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSwKKwkJCQkJICBzdHJ1Y3QgaXNjaV9vcm9tICpvcm9tLCBpbnQgc2N1X2luZGV4KTsKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CitzdHJ1Y3QgaXNjaV9vcm9tICppc2NpX2dldF9lZmlfdmFyKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RydWN0IGlzY2lfb2VtX2hkciB7CisJdTggc2lnWzRdOworCXU4IHJldl9tYWpvcjsKKwl1OCByZXZfbWlub3I7CisJdTE2IGxlbjsKKwl1OCBjaGVja3N1bTsKKwl1OCByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZWxzZQorI2RlZmluZSBTQ0lfTUFYX1BPUlRTIDQKKyNkZWZpbmUgU0NJX01BWF9QSFlTIDQKKyNkZWZpbmUgU0NJX01BWF9DT05UUk9MTEVSUyAyCisjZW5kaWYKKworI2RlZmluZSBJU0NJX0ZXX05BTUUJCSJpc2NpL2lzY2lfZmlybXdhcmUuYmluIgorCisjZGVmaW5lIFJPTVNJR05BVFVSRQkJMHhhYTU1CisKKyNkZWZpbmUgSVNDSV9PRU1fU0lHCQkiJE9FTSIKKyNkZWZpbmUgSVNDSV9PRU1fU0lHX1NJWkUJNAorI2RlZmluZSBJU0NJX1JPTV9TSUcJCSJJU0NVT0VNQiIKKyNkZWZpbmUgSVNDSV9ST01fU0lHX1NJWkUJOAorCisjZGVmaW5lIElTQ0lfRUZJX1ZFTkRPUl9HVUlECVwKKwlFRklfR1VJRCgweDE5M2RmZWZhLCAweGE0NDUsIDB4NDMwMiwgMHg5OSwgMHhkOCwgMHhlZiwgMHgzYSwgMHhhZCwgXAorCQkJMHgxYSwgMHgwNCwgMHhjNikKKyNkZWZpbmUgSVNDSV9FRklfVkFSX05BTUUJIlJzdFNjdU8iCisKKy8qIEFsbG93ZWQgUE9SVCBjb25maWd1cmF0aW9uIG1vZGVzIEFQQyBBdXRvbWF0aWMgUE9SVCBjb25maWd1cmF0aW9uIG1vZGUgaXMKKyAqIGRlZmluZWQgYnkgdGhlIE9FTSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgcHJvdmlkaW5nIG5vIFBIWV9NQVNLIHBhcmFtZXRlcnMKKyAqIGZvciBhbnkgUE9SVC4gaS5lLiBUaGVyZSBhcmUgbm8gcGh5cyBhc3NpZ25lZCB0byBhbnkgb2YgdGhlIHBvcnRzIGF0IHN0YXJ0LgorICogTVBDIE1hbnVhbCBQT1JUIGNvbmZpZ3VyYXRpb24gbW9kZSBpcyBkZWZpbmVkIGJ5IHRoZSBPRU0gY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVycyBwcm92aWRpbmcgYSBQSFlfTUFTSyB2YWx1ZSBmb3IgYW55IFBPUlQuICBJdCBpcyBhc3N1bWVkIHRoYXQgYW55CisgKiBQT1JUIHdpdGggbm8gUEhZX01BU0sgaXMgYW4gaW52YWxpZCBwb3J0IGFuZCBub3QgYWxsIFBIWXMgbXVzdCBiZSBhc3NpZ25lZC4KKyAqIEEgUE9SVF9QSFkgbWFzayB0aGF0IGFzc2lnbnMganVzdCBhIHNpbmdsZSBQSFkgdG8gYSBwb3J0IGFuZCBubyBvdGhlciBQSFlzCisgKiBiZWluZyBhc3NpZ25lZCBpcyBzdWZmaWNpZW50IHRvIGRlY2xhcmUgbWFudWFsIFBPUlQgY29uZmlndXJhdGlvbi4KKyAqLworZW51bSBzY2lfcG9ydF9jb25maWd1cmF0aW9uX21vZGUgeworCVNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFID0gMCwKKwlTQ0lDX1BPUlRfQVVUT01BVElDX0NPTkZJR1VSQVRJT05fTU9ERSA9IDEKK307CisKK3N0cnVjdCBzY2lfYmlvc19vZW1fcGFyYW1fYmxvY2tfaGRyIHsKKwl1aW50OF90IHNpZ25hdHVyZVtJU0NJX1JPTV9TSUdfU0laRV07CisJdWludDE2X3QgdG90YWxfYmxvY2tfbGVuZ3RoOworCXVpbnQ4X3QgaGRyX2xlbmd0aDsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCBwcmVib290X3NvdXJjZTsKKwl1aW50OF90IG51bV9lbGVtZW50czsKKwl1aW50MTZfdCBlbGVtZW50X2xlbmd0aDsKKwl1aW50OF90IHJlc2VydmVkWzhdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBzY2lfb2VtX3BhcmFtcyB7CisJc3RydWN0IHsKKwkJdWludDhfdCBtb2RlX3R5cGU7CisJCXVpbnQ4X3QgbWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXA7CisJCXVpbnQ4X3QgZG9fZW5hYmxlX3NzYzsKKwkJdWludDhfdCByZXNlcnZlZDsKKwl9IGNvbnRyb2xsZXI7CisKKwlzdHJ1Y3QgeworCQl1aW50OF90IHBoeV9tYXNrOworCX0gcG9ydHNbU0NJX01BWF9QT1JUU107CisKKwlzdHJ1Y3Qgc2NpX3BoeV9vZW1fcGFyYW1zIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IGhpZ2g7CisJCQl1aW50MzJfdCBsb3c7CisJCX0gc2FzX2FkZHJlc3M7CisKKwkJdWludDMyX3QgYWZlX3R4X2FtcF9jb250cm9sMDsKKwkJdWludDMyX3QgYWZlX3R4X2FtcF9jb250cm9sMTsKKwkJdWludDMyX3QgYWZlX3R4X2FtcF9jb250cm9sMjsKKwkJdWludDMyX3QgYWZlX3R4X2FtcF9jb250cm9sMzsKKwl9IHBoeXNbU0NJX01BWF9QSFlTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXNjaV9vcm9tIHsKKwlzdHJ1Y3Qgc2NpX2Jpb3Nfb2VtX3BhcmFtX2Jsb2NrX2hkciBoZHI7CisJc3RydWN0IHNjaV9vZW1fcGFyYW1zIGN0cmxbU0NJX01BWF9DT05UUk9MTEVSU107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZWdpc3RlcnMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjY2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZWdpc3RlcnMuaApAQCAtMCwwICsxLDE5MzQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDVV9SRUdJU1RFUlNfSF8KKyNkZWZpbmUgX1NDVV9SRUdJU1RFUlNfSF8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyBmb3IgdGhlIFNDVSBtZW1vcnkgbWFwcGVkCisgKiAgICByZWdpc3RlcnMuCisgKgorICoKKyAqLworCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lEX01BU0sgICAgICAgICAoMHhDMDAwMDAwMCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfU0hJRlQgICAgICAgICgzMCkKKworI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9GVU5DVElPTl9NQVNLICAgKDB4MEZGMDAwMDApCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0ZVTkNUSU9OX1NISUZUICAoMjApCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSVBQVE1PREVfTUFTSyAgICgweDAwMDFGODAwKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9TSElGVCAgKDEyKQorCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0xQVklFX01BU0sgICAgICAoMHgwMDAwMEYwMCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfTFBWSUVfU0hJRlQgICAgICg4KQorCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX1NUQVRVU19NQVNLICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfU1RBVFVTX1NISUZUICAgICgwKQorCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lEX0lOVkFMSUQgICAoMCA8PCBTQ1VfVklJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfVklJVCAgICAgICgxIDw8IFNDVV9WSUlUX0VOVFJZX0lEX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JRF9JSVQgICAgICAgKDIgPDwgU0NVX1ZJSVRfRU5UUllfSURfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lEX1ZJUlRfRVhQICAoMyA8PCBTQ1VfVklJVF9FTlRSWV9JRF9TSElGVCkKKworI2RlZmluZSBTQ1VfVklJVF9JUFBUX1NTUF9JTklUSUFUT1IgKDB4MDEgPDwgU0NVX1ZJSVRfRU5UUllfSVBQVE1PREVfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX0lQUFRfU01QX0lOSVRJQVRPUiAoMHgwMiA8PCBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9TSElGVCkKKyNkZWZpbmUgU0NVX1ZJSVRfSVBQVF9TVFBfSU5JVElBVE9SICgweDA0IDw8IFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9JUFBUX0lOSVRJQVRPUgkgICAgXAorCShcCisJCVNDVV9WSUlUX0lQUFRfU1NQX0lOSVRJQVRPUiAgXAorCQl8IFNDVV9WSUlUX0lQUFRfU01QX0lOSVRJQVRPUiAgXAorCQl8IFNDVV9WSUlUX0lQUFRfU1RQX0lOSVRJQVRPUiAgXAorCSkKKworI2RlZmluZSBTQ1VfVklJVF9TVEFUVVNfUk5DX1ZBTElEICAgICAgKDB4MDEgPDwgU0NVX1ZJSVRfRU5UUllfU1RBVFVTX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9TVEFUVVNfQUREUkVTU19WQUxJRCAgKDB4MDIgPDwgU0NVX1ZJSVRfRU5UUllfU1RBVFVTX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9TVEFUVVNfUk5JX1ZBTElEICAgICAgKDB4MDQgPDwgU0NVX1ZJSVRfRU5UUllfU1RBVFVTX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9TVEFUVVNfQUxMX1ZBTElEICAgICAgXAorCShcCisJCVNDVV9WSUlUX1NUQVRVU19STkNfVkFMSUQJXAorCQl8IFNDVV9WSUlUX1NUQVRVU19BRERSRVNTX1ZBTElECSAgXAorCQl8IFNDVV9WSUlUX1NUQVRVU19STklfVkFMSUQJICBcCisJKQorCisjZGVmaW5lIFNDVV9WSUlUX0lQUFRfU01QX1RBUkdFVCAgICAoMHgxMCA8PCBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9TSElGVCkKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3ZpaXRfZW50cnkgLSBUaGlzIGlzIHRoZSBTQ1UgVmlydHVhbCBJbml0aWF0b3IgVGFibGUgRW50cnkKKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3ZpaXRfZW50cnkgeworCS8qKgorCSAqIFRoaXMgbXVzdCBiZSBlbmNvZGVkIGFzIHRvIHRoZSB0eXBlIG9mIGluaXRpYXRvciB0aGF0IGlzIGJlaW5nIGNvbnN0cnVjdGVkCisJICogZm9yIHRoaXMgcG9ydC4KKwkgKi8KKwl1MzIgc3RhdHVzOworCisJLyoqCisJICogVmlydHVhbCBpbml0aWF0b3IgaGlnaCBTQVMgQWRkcmVzcworCSAqLworCXUzMiBpbml0aWF0b3Jfc2FzX2FkZHJlc3NfaGk7CisKKwkvKioKKwkgKiBWaXJ0dWFsIGluaXRpYXRvciBsb3cgU0FTIEFkZHJlc3MKKwkgKi8KKwl1MzIgaW5pdGlhdG9yX3Nhc19hZGRyZXNzX2xvOworCisJLyoqCisJICogVGhpcyBtdXN0IGJlIDAKKwkgKi8KKwl1MzIgcmVzZXJ2ZWQ7CisKK307CisKKworLyogSUlUIFN0YXR1cyBEZWZpbmVzICovCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfSURfTUFTSyAgICAgICAgICAgICAgICAoMHhDMDAwMDAwMCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCAgICAgICAgICAgICAgICgzMCkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1NUQVRVU19VUERBVEVfTUFTSyAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfU1RBVFVTX1VQREFURV9TSElGVCAgICAoMjkpCisKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9MUElfTUFTSyAgICAgICAgICAgICAgICgweDAwMDAwRjAwKQorI2RlZmluZSBTQ1VfSUlUX0VOVFJZX0xQSV9TSElGVCAgICAgICAgICAgICAgKDgpCisKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9TVEFUVVNfTUFTSyAgICAgICAgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1NUQVRVU19TSElGVCAgICAgICAgICAgKDApCisKKy8qIElJVCBSZW1vdGUgSW5pdGlhdG9yIERlZmluZXMgKi8KKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9SRU1PVEVfVEFHX01BU0sgICgweDAwMDBGRkZGKQorI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1JFTU9URV9UQUdfU0hJRlQgKDApCisKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9SRU1PVEVfUk5DX01BU0sgICgweDBGRkYwMDAwKQorI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1JFTU9URV9STkNfU0hJRlQgKDE2KQorCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfSURfSU5WQUxJRCAgICgwIDw8IFNDVV9JSVRfRU5UUllfSURfU0hJRlQpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfSURfVklJVCAgICAgICgxIDw8IFNDVV9JSVRfRU5UUllfSURfU0hJRlQpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfSURfSUlUICAgICAgICgyIDw8IFNDVV9JSVRfRU5UUllfSURfU0hJRlQpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfSURfVklSVF9FWFAgICgzIDw8IFNDVV9JSVRfRU5UUllfSURfU0hJRlQpCisKKy8qKgorICogc3RydWN0IHNjdV9paXRfZW50cnkgLSBUaGlzIHdpbGwgYmUgaW1wbGVtZW50ZWQgbGF0ZXIgd2hlbiB3ZSBzdXBwb3J0CisgKiAgICB2aXJ0dWFsIGZ1bmN0aW9ucworICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfaWl0X2VudHJ5IHsKKwl1MzIgc3RhdHVzOworCXUzMiByZW1vdGVfaW5pdGlhdG9yX3Nhc19hZGRyZXNzX2hpOworCXUzMiByZW1vdGVfaW5pdGlhdG9yX3Nhc19hZGRyZXNzX2xvOworCXUzMiByZW1vdGVfaW5pdGlhdG9yOworCit9OworCisvKiBHZW5lcmF0ZSBhIHZhbHVlIGZvciBhbiBTQ1UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0NVX0dFTl9WQUxVRShuYW1lLCB2YWx1ZSkgXAorCSgoKHZhbHVlKSA8PCBuYW1lICMjIF9TSElGVCkgJiAobmFtZSAjIyBfTUFTSykpCisKKy8qCisgKiBHZW5lcmF0ZSBhIGJpdCB2YWx1ZSBmb3IgYW4gU0NVIHJlZ2lzdGVyCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVnaXN0ZXIgTUFTSyBpcyBqdXN0IGEgc2luZ2xlIGJpdCAqLworI2RlZmluZSBTQ1VfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9WQUxVRShuYW1lLCAoKHUzMikxKSkKKworI2RlZmluZSBTQ1VfU0VUX0JJVChuYW1lLCByZWdfdmFsdWUpIFwKKwkoKHJlZ192YWx1ZSkgfCBTQ1VfR0VOX0JJVChuYW1lKSkKKworI2RlZmluZSBTQ1VfQ0xFQVJfQklUKG5hbWUsIHJlZ192YWx1ZSkgXAorCSgocmVnX3ZhbHVlKSQgfihTQ1VfR0VOX0JJVChuYW1lKSkpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVW5pb25zIGZvciBiaXRmaWVsZCBkZWZpbml0aW9ucyBvZiBTQ1UgUmVnaXN0ZXJzCisgKiBTTVUgUG9zdCBDb250ZXh0IFBvcnQKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9DT05URVhUX0lOREVYX1NISUZUICAgICAgICAgKDApCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9DT05URVhUX0lOREVYX01BU0sgICAgICAgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9MT0dJQ0FMX1BPUlRfSU5ERVhfU0hJRlQgICAgKDEyKQorI2RlZmluZSBTTVVfUE9TVF9DT05URVhUX1BPUlRfTE9HSUNBTF9QT1JUX0lOREVYX01BU0sgICAgICgweDAwMDBGMDAwKQorI2RlZmluZSBTTVVfUE9TVF9DT05URVhUX1BPUlRfUFJPVE9DT0xfRU5HSU5FX1NISUZUICAgICAgICgxNikKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX1BST1RPQ09MX0VOR0lORV9NQVNLICAgICAgICAoMHgwMDAzMDAwMCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTU1BTkRfQ09OVEVYVF9TSElGVCAgICAgICAoMTgpCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9DT01NQU5EX0NPTlRFWFRfTUFTSyAgICAgICAgKDB4MDBGQzAwMDApCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgKDB4RkYwMDAwMDApCisKKyNkZWZpbmUgU01VX1BDUF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfUE9TVF9DT05URVhUX1BPUlRfICMjIG5hbWUsIHZhbHVlKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19DT01QTEVUSU9OX1NISUZUICAgICAgICgzMSkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9TVEFUVVNfQ09NUExFVElPTl9NQVNLICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9TVEFUVVNfUVVFVUVfU1VTUEVORF9TSElGVCAgICAoMSkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9TVEFUVVNfUVVFVUVfU1VTUEVORF9NQVNLICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9TVEFUVVNfUVVFVUVfRVJST1JfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9TVEFUVVNfUVVFVUVfRVJST1JfTUFTSyAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9TVEFUVVNfUkVTRVJWRURfTUFTSyAgICAgICAgICAoMHg3RkZGRkZGQykKKworI2RlZmluZSBTTVVfSVNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNNVV9JTlRFUlJVUFRfU1RBVFVTXyAjIyBuYW1lKQorCisjZGVmaW5lIFNNVV9JU1JfUVVFVUVfRVJST1IgICBTTVVfSVNSX0dFTl9CSVQoUVVFVUVfRVJST1IpCisjZGVmaW5lIFNNVV9JU1JfUVVFVUVfU1VTUEVORCBTTVVfSVNSX0dFTl9CSVQoUVVFVUVfU1VTUEVORCkKKyNkZWZpbmUgU01VX0lTUl9DT01QTEVUSU9OICAgIFNNVV9JU1JfR0VOX0JJVChDT01QTEVUSU9OKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfQ09NUExFVElPTl9TSElGVCAgICAgICAgICgzMSkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9NQVNLX0NPTVBMRVRJT05fTUFTSyAgICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9NQVNLX1FVRVVFX1NVU1BFTkRfU0hJRlQgICAgICAoMSkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9NQVNLX1FVRVVFX1NVU1BFTkRfTUFTSyAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9NQVNLX1FVRVVFX0VSUk9SX1NISUZUICAgICAgICAoMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9NQVNLX1FVRVVFX0VSUk9SX01BU0sgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9NQVNLX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAoMHg3RkZGRkZGQykKKworI2RlZmluZSBTTVVfSU1SX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNNVV9JTlRFUlJVUFRfTUFTS18gIyMgbmFtZSkKKworI2RlZmluZSBTTVVfSU1SX1FVRVVFX0VSUk9SICAgU01VX0lNUl9HRU5fQklUKFFVRVVFX0VSUk9SKQorI2RlZmluZSBTTVVfSU1SX1FVRVVFX1NVU1BFTkQgU01VX0lNUl9HRU5fQklUKFFVRVVFX1NVU1BFTkQpCisjZGVmaW5lIFNNVV9JTVJfQ09NUExFVElPTiAgICBTTVVfSU1SX0dFTl9CSVQoQ09NUExFVElPTikKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfVElNRVJfU0hJRlQgICAgKDApCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfQ09BTEVTQ0lOR19DT05UUk9MX1RJTUVSX01BU0sgICAgICgweDAwMDAwMDFGKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF9OVU1CRVJfU0hJRlQgICAoOCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfTlVNQkVSX01BU0sgICAgKDB4MDAwMEZGMDApCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfQ09BTEVTQ0lOR19DT05UUk9MX1JFU0VSVkVEX01BU0sgICgweEZGRkYwMEUwKQorCisjZGVmaW5lIFNNVV9JQ0NfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX1NUQVJUX1NISUZUICAgICAgKDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfU1RBUlRfTUFTSyAgICAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9SQU5HRV9FTkRJTkdfU0hJRlQgICAgICgxNikKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9SQU5HRV9FTkRJTkdfTUFTSyAgICAgICgweDBGRkYwMDAwKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX0VOQUJMRV9TSElGVCAgICAgKDMxKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX0VOQUJMRV9NQVNLICAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfUkVTRVJWRURfTUFTSyAgICAoMHg3MDAwRjAwMCkKKworI2RlZmluZSBTTVVfVENSX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNNVV9UQ1JfR0VOX0JJVChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fQklUKFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfICMjIG5hbWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX1BPSU5URVJfU0hJRlQgICAgICAgICAgKDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9QT0lOVEVSX01BU0sgICAgICAgICAgICgweDAwMDAzRkZGKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfQ1lDTEVfQklUX1NISUZUICAgICAgICAoMTUpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9DWUNMRV9CSVRfTUFTSyAgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfRVZFTlRfUE9JTlRFUl9TSElGVCAgICAoMTYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9FVkVOVF9QT0lOVEVSX01BU0sgICAgICgweDAzRkYwMDAwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfRVZFTlRfQ1lDTEVfQklUX1NISUZUICAoMjYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9FVkVOVF9DWUNMRV9CSVRfTUFTSyAgICgweDA0MDAwMDAwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfUkVTRVJWRURfTUFTSyAgICAgICAgICAoMHhGODAwNDAwMCkKKworI2RlZmluZSBTTVVfQ1FQUl9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNNVV9DUVBSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF8gIyMgbmFtZSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfUE9JTlRFUl9TSElGVCAgICAgICAgICAoMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1BPSU5URVJfTUFTSyAgICAgICAgICAgKDB4MDAwMDNGRkYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9DWUNMRV9CSVRfU0hJRlQgICAgICAgICgxNSkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0NZQ0xFX0JJVF9NQVNLICAgICAgICAgKDB4MDAwMDgwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9QT0lOVEVSX1NISUZUICAgICgxNikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX1BPSU5URVJfTUFTSyAgICAgKDB4MDNGRjAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9DWUNMRV9CSVRfU0hJRlQgICgyNikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX0NZQ0xFX0JJVF9NQVNLICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FTkFCTEVfU0hJRlQgICAgICAgICAgICgzMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VOQUJMRV9NQVNLICAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9FTkFCTEVfU0hJRlQgICAgICgzMSkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX0VOQUJMRV9NQVNLICAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9SRVNFUlZFRF9NQVNLICAgICAgICAgICgweDM4MDA0MDAwKQorCisjZGVmaW5lIFNNVV9DUUdSX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX0NRR1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUXyAjIyBuYW1lKQorCisjZGVmaW5lIFNNVV9DUUdSX0NZQ0xFX0JJVCBcCisJU01VX0NRR1JfR0VOX0JJVChDWUNMRV9CSVQpCisKKyNkZWZpbmUgU01VX0NRR1JfRVZFTlRfQ1lDTEVfQklUIFwKKwlTTVVfQ1FHUl9HRU5fQklUKEVWRU5UX0NZQ0xFX0JJVCkKKworI2RlZmluZSBTTVVfQ1FHUl9HRVRfUE9JTlRFUl9TRVQodmFsdWUpCVwKKwlTTVVfQ1FHUl9HRU5fVkFMKFBPSU5URVIsIHZhbHVlKQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfUVVFVUVfTElNSVRfU0hJRlQgICgwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MX1FVRVVFX0xJTUlUX01BU0sgICAoMHgwMDAwM0ZGRikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfQ09OVFJPTF9FVkVOVF9MSU1JVF9TSElGVCAgKDE2KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MX0VWRU5UX0xJTUlUX01BU0sgICAoMHgwM0ZGMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAgICAgKDB4RkMwMEMwMDApCisKKyNkZWZpbmUgU01VX0NRQ19HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTTVVfQ1FDX1FVRVVFX0xJTUlUX1NFVCh2YWx1ZSkgXAorCVNNVV9DUUNfR0VOX1ZBTChRVUVVRV9MSU1JVCwgdmFsdWUpCisKKyNkZWZpbmUgU01VX0NRQ19FVkVOVF9MSU1JVF9TRVQodmFsdWUpIFwKKwlTTVVfQ1FDX0dFTl9WQUwoRVZFTlRfTElNSVQsIHZhbHVlKQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfU0hJRlQgICAgKDApCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfTUFTSyAgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfTFBfU0hJRlQgICAgKDEyKQorI2RlZmluZSBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX01BU0sgICAgICgweDAwMDA3MDAwKQorI2RlZmluZSBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19TSElGVCAgICgxNSkKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9STkNfTUFTSyAgICAoMHgwN0ZGODAwMCkKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9QRUdfU0hJRlQgICAoMjcpCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfUEVHX01BU0sgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9SRVNFUlZFRF9NQVNLICAgKDB4RjAwMDAwMDApCisKKyNkZWZpbmUgU01VX0RDQ19HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNNVV9EQ0NfR0VUX01BWF9QRUcodmFsdWUpIFwKKwkoXAorCQkoKHZhbHVlKSAmIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfUEVHX01BU0spIFwKKwkJPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9TSElGVCBcCisJKQorCisjZGVmaW5lIFNNVV9EQ0NfR0VUX01BWF9MUCh2YWx1ZSkgXAorCShcCisJCSgodmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9NQVNLKSBcCisJCT4+IFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfTFBfU0hJRlQgXAorCSkKKworI2RlZmluZSBTTVVfRENDX0dFVF9NQVhfVEModmFsdWUpIFwKKwkoXAorCQkoKHZhbHVlKSAmIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfTUFTSykgXAorCQk+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1RDX1NISUZUIFwKKwkpCisKKyNkZWZpbmUgU01VX0RDQ19HRVRfTUFYX1JOQyh2YWx1ZSkgXAorCShcCisJCSgodmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9STkNfTUFTSykgXAorCQk+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19TSElGVCBcCisJKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19UQVNLX0NPTlRFWFRfUkFOR0VfRU5BQkxFX1NISUZUICAgICAgKDApCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19UQVNLX0NPTlRFWFRfUkFOR0VfRU5BQkxFX01BU0sgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19DT01QTEVUSU9OX0JZVEVfU1dBUF9FTkFCTEVfU0hJRlQgICAgKDEpCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19DT01QTEVUSU9OX0JZVEVfU1dBUF9FTkFCTEVfTUFTSyAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19DT05URVhUX1JBTV9JTklUX0NPTVBMRVRFRF9TSElGVCAgICAgKDE2KQorI2RlZmluZSBTTVVfQ09OVFJPTF9TVEFUVVNfQ09OVEVYVF9SQU1fSU5JVF9DT01QTEVURURfTUFTSyAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTTVVfQ09OVFJPTF9TVEFUVVNfU0NIRURVTEVSX1JBTV9JTklUX0NPTVBMRVRFRF9TSElGVCAgICgxNykKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX1NDSEVEVUxFUl9SQU1fSU5JVF9DT01QTEVURURfTUFTSyAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRkZDRkZGQykKKworI2RlZmluZSBTTVVfU01VQ1NSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNNVV9DT05UUk9MX1NUQVRVU18gIyMgbmFtZSkKKworI2RlZmluZSBTTVVfU01VQ1NSX1NDSEVEVUxFUl9SQU1fSU5JVF9DT01QTEVURUQJXAorCShTTVVfU01VQ1NSX0dFTl9CSVQoU0NIRURVTEVSX1JBTV9JTklUX0NPTVBMRVRFRCkpCisKKyNkZWZpbmUgU01VX1NNVUNTUl9DT05URVhUX1JBTV9JTklUX0NPTVBMRVRFRAlcCisJKFNNVV9TTVVDU1JfR0VOX0JJVChDT05URVhUX1JBTV9JTklUX0NPTVBMRVRFRCkpCisKKyNkZWZpbmUgU0NVX1JBTV9JTklUX0NPTVBMRVRFRCBcCisJKFwKKwkJU01VX1NNVUNTUl9DT05URVhUX1JBTV9JTklUX0NPTVBMRVRFRCBcCisJCXwgU01VX1NNVUNTUl9TQ0hFRFVMRVJfUkFNX0lOSVRfQ09NUExFVEVEIFwKKwkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUwX1NISUZUICAoMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUwX01BU0sgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUxX1NISUZUICAoMSkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUxX01BU0sgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUyX1NISUZUICAoMikKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUyX01BU0sgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUzX1NISUZUICAoMykKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfUEUzX01BU0sgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUwX1NISUZUICAoOCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUwX01BU0sgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUxX1NISUZUICAoOSkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUxX01BU0sgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUyX1NISUZUICAoMTApCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcxX1BFMl9NQVNLICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcxX1BFM19TSElGVCAgKDExKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTNfTUFTSyAgICgweDAwMDAwODAwKQorCisjZGVmaW5lIFNNVV9SRVNFVF9QUk9UT0NPTF9FTkdJTkUocGVnLCBwZSkgXAorCSgoMSA8PCAocGUpKSA8PCAoKHBlZykgKiA4KSkKKworI2RlZmluZSBTTVVfUkVTRVRfUEVHX1BST1RPQ09MX0VOR0lORVMocGVnKSBcCisJKFwKKwkJU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORShwZWcsIDApIFwKKwkJfCBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FKHBlZywgMSkgXAorCQl8IFNNVV9SRVNFVF9QUk9UT0NPTF9FTkdJTkUocGVnLCAyKSBcCisJCXwgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORShwZWcsIDMpIFwKKwkpCisKKyNkZWZpbmUgU01VX1JFU0VUX0FMTF9QUk9UT0NPTF9FTkdJTkVTKCkgXAorCShcCisJCVNNVV9SRVNFVF9QRUdfUFJPVE9DT0xfRU5HSU5FUygwKSBcCisJCXwgU01VX1JFU0VUX1BFR19QUk9UT0NPTF9FTkdJTkVTKDEpIFwKKwkpCisKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1dJREVfUE9SVF9QRUcwX0xQMF9TSElGVCAgKDE2KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzBfTFAwX01BU0sgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1dJREVfUE9SVF9QRUcwX0xQMl9TSElGVCAgKDE3KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzBfTFAyX01BU0sgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1dJREVfUE9SVF9QRUcxX0xQMF9TSElGVCAgKDE4KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzFfTFAwX01BU0sgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1dJREVfUE9SVF9QRUcxX0xQMl9TSElGVCAgKDE5KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzFfTFAyX01BU0sgICAoMHgwMDA4MDAwMCkKKworI2RlZmluZSBTTVVfUkVTRVRfV0lERV9QT1JUX1FVRVVFKHBlZywgd2lkZV9wb3J0KSBcCisJKCgxIDw8ICgod2lkZV9wb3J0KSAvIDIpKSA8PCAoKHBlZykgKiAyKSA8PCAxNikKKworI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9TSElGVCAgICAgICgyMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzBfTUFTSyAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfU0hJRlQgICAgICAoMjEpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcxX01BU0sgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9TQ1VfU0hJRlQgICAgICAgKDIyKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfU0NVX01BU0sgICAgICAgICgweDAwNDAwMDAwKQorCisvKgorICogSXQgc2VlbXMgdG8gbWFrZSBzZW5zZSB0aGF0IGlmIHlvdSBhcmUgZ29pbmcgdG8gcmVzZXQgdGhlIHByb3RvY29sCisgKiBlbmdpbmUgZ3JvdXAgdGhhdCB5b3Ugd291bGQgYWxzbyByZXNldCBhbGwgb2YgdGhlIHByb3RvY29sIGVuZ2luZXMgKi8KKyNkZWZpbmUgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORV9HUk9VUChwZWcpIFwKKwkoXAorCQkoMSA8PCAoKHBlZykgKyAyMCkpIFwKKwkJfCBTTVVfUkVTRVRfV0lERV9QT1JUX1FVRVVFKHBlZywgMCkgXAorCQl8IFNNVV9SRVNFVF9XSURFX1BPUlRfUVVFVUUocGVnLCAxKSBcCisJCXwgU01VX1JFU0VUX1BFR19QUk9UT0NPTF9FTkdJTkVTKHBlZykgXAorCSkKKworI2RlZmluZSBTTVVfUkVTRVRfQUxMX1BST1RPQ09MX0VOR0lORV9HUk9VUFMoKSBcCisJKFwKKwkJU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORV9HUk9VUCgwKSBcCisJCXwgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORV9HUk9VUCgxKSBcCisJKQorCisjZGVmaW5lIFNNVV9SRVNFVF9TQ1UoKSAgKDB4RkZGRkZGRkYpCisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfU1RBUlRJTkdfU0hJRlQgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfU1RBUlRJTkdfTUFTSyAgICAgICAgICAgICAgICgweDAwMDAwRkZGKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfRU5ESU5HX1NISUZUICAgICAgICAgICAgICAgICgxNikKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UX0VORElOR19NQVNLICAgICAgICAgICAgICAgICAoMHgwRkZGMDAwMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UX1JBTkdFX0NIRUNLX0VOQUJMRV9TSElGVCAgICAoMzEpCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9SQU5HRV9DSEVDS19FTkFCTEVfTUFTSyAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgKDB4NzAwMEYwMDApCisKKyNkZWZpbmUgU01VX1RDQV9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNNVV9UQ0FfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UXyAjIyBuYW1lKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9DT05UUk9MX1FVRVVFX1NJWkVfU0hJRlQgICAoMCkKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfQ09OVFJPTF9RVUVVRV9TSVpFX01BU0sgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICgweEZGRkZGMDAwKQorCisjZGVmaW5lIFNDVV9VRlFDX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFDX1FVRVVFX1NJWkVfU0VUKHZhbHVlKSBcCisJU0NVX1VGUUNfR0VOX1ZBTChRVUVVRV9TSVpFLCB2YWx1ZSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX1BPSU5URVJfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX1BPSU5URVJfTUFTSyAgICAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX0NZQ0xFX0JJVF9TSElGVCAgICAoMTIpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX1BVVF9DWUNMRV9CSVRfTUFTSyAgICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX1BVVF9SRVNFUlZFRF9NQVNLICAgICAgKDB4RkZGRkUwMDApCisKKyNkZWZpbmUgU0NVX1VGUVBQX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX1BVVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUVBQX0dFTl9CSVQobmFtZSkJXAorCVNDVV9HRU5fQklUKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX1BVVF8gIyMgbmFtZSkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIFNETUEgUmVnaXN0ZXJzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfUE9JTlRFUl9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfUE9JTlRFUl9NQVNLICAgICAgICgweDAwMDAwRkZGKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfQ1lDTEVfQklUX1NISUZUICAgICgxMikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfR0VUX0NZQ0xFX0JJVF9NQVNLICAgICAoMTIpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9FTkFCTEVfQklUX1NISUZUICAgKDMxKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfRU5BQkxFX0JJVF9NQVNLICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfUkVTRVJWRURfTUFTSyAgICAgICgweDdGRkZFMDAwKQorCisjZGVmaW5lIFNDVV9VRlFHUF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFHUF9HRU5fQklUKG5hbWUpCVwKKwlTQ1VfR0VOX0JJVChTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfICMjIG5hbWUpCisKKyNkZWZpbmUgU0NVX1VGUUdQX0NZQ0xFX0JJVCh2YWx1ZSkgXAorCVNDVV9VRlFHUF9HRU5fQklUKENZQ0xFX0JJVCwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUdQX0dFVF9QT0lOVEVSKHZhbHVlKSBcCisJU0NVX1VGUUdQX0dFTl9WQUxVRShQT0lOVEVSLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfVUZRR1BfRU5BQkxFKHZhbHVlKQlcCisJKFNDVV9VRlFHUF9HRU5fQklUKEVOQUJMRSkgfCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfVUZRR1BfRElTQUJMRSh2YWx1ZSkgXAorCSh+U0NVX1VGUUdQX0dFTl9CSVQoRU5BQkxFKSAmIHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFHUF9WQUxVRShiaXQsIHZhbHVlKSBcCisJKFNDVV9VRlFHUF9DWUNMRV9CSVQoYml0KSB8IFNDVV9VRlFHUF9HRVRfUE9JTlRFUih2YWx1ZSkpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQUREUkVTU19NT0RJRklFUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9BRERSRVNTX01PRElGSUVSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX1BDSV9SRUxBWEVEX09SREVSSU5HX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX1BDSV9SRUxBWEVEX09SREVSSU5HX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUENJX05PX1NOT09QX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTcpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUENJX05PX1NOT09QX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfQllURV9TV0FQX1NISUZUICAgICAgICAgICAgICAgICAgICgxOCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfQllURV9TV0FQX01BU0sgICAgICAgICAgICAgICAgICAgICgweDAwMDQwMDAwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9YUElfU0dMX0ZFVENIX1NISUZUICAgICAgICAgICAgICAgKDE5KQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9YUElfU0dMX0ZFVENIX01BU0sgICAgICAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQklHX0VORElBTl9DT05UUk9MX1hQSV9SWF9IRUFERVJfUkFNX1dSSVRFX1NISUZUICAgICAoMjApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQklHX0VORElBTl9DT05UUk9MX1hQSV9SWF9IRUFERVJfUkFNX1dSSVRFX01BU0sgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfWFBJX1VGX0FERFJFU1NfRkVUQ0hfU0hJRlQgICAgICAgICgyMSkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfWFBJX1VGX0FERFJFU1NfRkVUQ0hfTUFTSyAgICAgICAgICgweDAwMjAwMDAwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0FERFJFU1NfTU9ESUZJRVJfU0VMRUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgKDIyKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0FERFJFU1NfTU9ESUZJRVJfU0VMRUNUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRjgwMDAwMCkKKworI2RlZmluZSBTQ1VfUERNQUNSX0dFTl9WQUxVRShuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1BETUFfQ09ORklHVVJBVElPTl8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1BETUFDUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfUERNQV9DT05GSUdVUkFUSU9OXyAjIyBuYW1lKQorCisjZGVmaW5lIFNDVV9QRE1BQ1JfQkVfR0VOX0JJVChuYW1lKSBcCisJU0NVX1BDTUFDUl9HRU5fQklUKEJJR19FTkRJQU5fQ09OVFJPTF8gIyMgbmFtZSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX0NETUFfQ09ORklHVVJBVElPTl9QQ0lfUkVMQVhFRF9PUkRFUklOR19FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICg4KQorI2RlZmluZSBTQ1VfQ0RNQV9DT05GSUdVUkFUSU9OX1BDSV9SRUxBWEVEX09SREVSSU5HX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAxMDApCisKKyNkZWZpbmUgU0NVX0NETUFDUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfQ0RNQV9DT05GSUdVUkFUSU9OXyAjIyBuYW1lKQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0NVIExpbmsgTGF5ZXIgUmVnaXN0ZXJzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfVElNRU9VVF9TSElGVCAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTX1RJTUVPVVRfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwRkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19MT0NLX1RJTUVfU0hJRlQgICAgICAgICAgICg4KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfTE9DS19USU1FX01BU0sgICAgICAgICAgICAoMHgwMDAwRkYwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTX1JBVEVfQ0hBTkdFX0RFTEFZX1NISUZUICAgKDE2KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfUkFURV9DSEFOR0VfREVMQVlfTUFTSyAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTX0RXT1JEX1NZTkNfVElNRU9VVF9TSElGVCAgKDI0KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfRFdPUkRfU1lOQ19USU1FT1VUX01BU0sgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVDR09JQVRJT05fVElNRVJfVkFMVUVTX1JFUVVJUkVEX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FQ0dPSUFUSU9OX1RJTUVSX1ZBTFVFU19ERUZBVUxUX01BU0sgICAgICAgICAgICAgICgweDdEMDA2NzZGKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUNHT0lBVElPTl9USU1FUl9WQUxVRVNfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAoMHgwMEZGMDAwMCkKKworI2RlZmluZSBTQ1VfU0FTX1NQRFRPVl9HRU5fVkFMVUUobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU18gIyMgbmFtZSwgdmFsdWUpCisKKworI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfRFdPUkRfU1lOQ19BUVVJUkVEX1NISUZUICAgICAgICAgICAgKDIpCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19EV09SRF9TWU5DX0FRVUlSRURfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX0xJTktfU1RBVFVTX1RSQU5TTUlUX1BPUlRfU0VMRUNUSU9OX0RPTkVfU0hJRlQgICg0KQorI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfVFJBTlNNSVRfUE9SVF9TRUxFQ1RJT05fRE9ORV9NQVNLICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19SRUNFSVZFUl9DUkVESVRfRVhIQVVTVEVEX1NISUZUICAgICAoNSkKKyNkZWZpbmUgU0NVX0xJTktfU1RBVFVTX1JFQ0VJVkVSX0NSRURJVF9FWEhBVVNURURfTUFTSyAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4RkZGRkZGQ0QpCisKKyNkZWZpbmUgU0NVX1NBU19MTFNUQV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfTElOS19TVEFUVVNfICMjIG5hbWUpCisKKworLyogVE9ETzogV2hlcmUgaXMgdGhlIFNBVEFfUFNFTFRPViByZWdpc3Rlcj8gKi8KKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIFNDVSBTQVMgTWF4aW11bSBBcmJpdHJhdGlvbiBXYWl0IFRpbWUgVGltZW91dCBSZWdpc3RlcgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfVkFMVUVfU0hJRlQgICAgICAgKDApCisjZGVmaW5lIFNDVV9TQVNfTUFYX0FSQklUUkFUSU9OX1dBSVRfVElNRV9USU1FT1VUX1ZBTFVFX01BU0sgICAgICAgICgweDAwMDA3RkZGKQorI2RlZmluZSBTQ1VfU0FTX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUVfVElNRU9VVF9TQ0FMRV9TSElGVCAgICAgICAoMTUpCisjZGVmaW5lIFNDVV9TQVNfTUFYX0FSQklUUkFUSU9OX1dBSVRfVElNRV9USU1FT1VUX1NDQUxFX01BU0sgICAgICAgICgweDAwMDA4MDAwKQorCisjZGVmaW5lIFNDVV9TQVNfTUFXVFRPVl9HRU5fVkFMVUUobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TQVNfTUFYX0FSQklUUkFUSU9OX1dBSVRfVElNRV9USU1FT1VUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0FTX01BV1RUT1ZfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfICMjIG5hbWUpCisKKworLyoKKyAqIFRPRE86IFdoZXJlIGlzIHRoZSBTQVNfTE5LVE9WIHJlZ3NpdGVyPworICogVE9ETzogV2hlcmUgaXMgdGhlIFNBU19QSFlUT1YgcmVnaXN0ZXI/ICovCisKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TTVBfVEFSR0VUX1NISUZUICAgICAgICAgICAgKDEpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU01QX1RBUkdFVF9NQVNLICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NUUF9UQVJHRVRfU0hJRlQgICAgICAgICAgICAoMikKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TVFBfVEFSR0VUX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1NQX1RBUkdFVF9TSElGVCAgICAgICAgICAgICgzKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NTUF9UQVJHRVRfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9EQV9TQVRBX0hPU1RfU0hJRlQgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fREFfU0FUQV9IT1NUX01BU0sgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NNUF9JTklUSUFUT1JfU0hJRlQgICAgICAgICAoOSkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TTVBfSU5JVElBVE9SX01BU0sgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1RQX0lOSVRJQVRPUl9TSElGVCAgICAgICAgICgxMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TVFBfSU5JVElBVE9SX01BU0sgICAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1NQX0lOSVRJQVRPUl9TSElGVCAgICAgICAgICgxMSkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TU1BfSU5JVElBVE9SX01BU0sgICAgICAgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fUkVBU09OX0NPREVfU0hJRlQgICAgICAgICAgICgxNikKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9SRUFTT05fQ09ERV9NQVNLICAgICAgICAgICAgKDB4MDAwRjAwMDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fQUREUkVTU19GUkFNRV9UWVBFX1NISUZUICAgICgyNCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9BRERSRVNTX0ZSQU1FX1RZUEVfTUFTSyAgICAgKDB4MEYwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fREVWSUNFX1RZUEVfU0hJRlQgICAgICAgICAgICgyOCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9ERVZJQ0VfVFlQRV9NQVNLICAgICAgICAgICAgKDB4NzAwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICgweDgwRjBGMUYxKQorCisjZGVmaW5lIFNDVV9TQVNfVElJRF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0FTX1RJSURfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl8gIyMgbmFtZSkKKworLyogU0FTIElkZW50aWZ5IEZyYW1lIFBIWSBJZGVudGlmaWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0JSRUFLX1JFUExZX0NBUEFCTEVfU0hJRlQgICAgICAoMTYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0JSRUFLX1JFUExZX0NBUEFCTEVfTUFTSyAgICAgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfUkVRVUVTVEVEX0lOU0lERV9aUFNEU19TSElGVCAgICgxNykKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfUkVRVUVTVEVEX0lOU0lERV9aUFNEU19NQVNLICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9JTlNJREVfWlBTRFNfUEVSU0lTVEVOVF9TSElGVCAgKDE4KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9JTlNJREVfWlBTRFNfUEVSU0lTVEVOVF9NQVNLICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAoMjQpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICgweDAwRjgwMEZGKQorCisjZGVmaW5lIFNDVV9TQVNfVElQSURfR0VOX1ZBTFVFKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NBU19USVBJRF9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl8gIyMgbmFtZSkKKworCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVFhfUEFSSVRZX0NIRUNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVFhfUEFSSVRZX0NIRUNLX01BU0sgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVFhfQkFEX0NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVFhfQkFEX0NSQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9TQ1JBTUJMRVJfU0hJRlQgICAgICAgICAgICAgICAgICAgKDcpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9TQ1JBTUJMRVJfTUFTSyAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9ERVNDUkFNQkxFUl9TSElGVCAgICAgICAgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9ERVNDUkFNQkxFUl9NQVNLICAgICAgICAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9DUkVESVRfSU5TRVJUSU9OX1NISUZUICAgICAgICAgICAgKDkpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9DUkVESVRfSU5TRVJUSU9OX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fU1VTUEVORF9QUk9UT0NPTF9FTkdJTkVfU0hJRlQgICAgICAgICAgICAgKDExKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1NVU1BFTkRfUFJPVE9DT0xfRU5HSU5FX01BU0sgICAgICAgICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1NBVEFfU1BJTlVQX0hPTERfU0hJRlQgICAgICAgICAgICAgICAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9TQVRBX1NQSU5VUF9IT0xEX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UUkFOU01JVF9QT1JUX1NFTEVDVElPTl9TSUdOQUxfU0hJRlQgICAgICAoMTMpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVFJBTlNNSVRfUE9SVF9TRUxFQ1RJT05fU0lHTkFMX01BU0sgICAgICAgKDB4MDAwMDIwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fSEFSRF9SRVNFVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDE0KQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0hBUkRfUkVTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA0MDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9PT0JfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9FTkFCTEVfRlJBTUVfVFhfSU5TRVJUX0FMSUdOX1NISUZUICAgICAgICAoMjMpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRU5BQkxFX0ZSQU1FX1RYX0lOU0VSVF9BTElHTl9NQVNLICAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRk9SV0FSRF9JREVOVElGWV9GUkFNRV9TSElGVCAgICAgICAgICAgICAgKDI3KQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0ZPUldBUkRfSURFTlRJRllfRlJBTUVfTUFTSyAgICAgICAgICAgICAgICgweDA4MDAwMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0RJU0FCTEVfQllURV9UUkFOU1BPU0VfU1RQX0ZSQU1FX1NISUZUICAgICgyOCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0JZVEVfVFJBTlNQT1NFX1NUUF9GUkFNRV9NQVNLICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9PT0JfUkVTRVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjkpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fT09CX1JFU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVEhSRUVfSUFGX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgKDMwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1RIUkVFX0lBRl9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9BTElHTjBfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICgzMSkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9PT0JfQUxJR04wX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9SRVFVSVJFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMTAwMDAwRikKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ERUZBVUxUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MTgwMTAwRikKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKworI2RlZmluZSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl8gIyMgbmFtZSkKKworI2RlZmluZSBTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0dFTkVSQUxfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9HRU5FUkFMX01BU0sgICAgICAgKDB4MDAwMDA3RkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0FMSUdOX0lOU0VSVElPTl9GUkVRVUVOQ1lfQ09OTkVDVEVEX1NISUZUICAgICgxNikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9DT05ORUNURURfTUFTSyAgICAgKDB4MDBmZjAwMDApCisKKyNkZWZpbmUgU0NVX0FMSUdOX0lOU0VSVElPTl9GUkVRVUVOQ1lfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV8jI25hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0VOQUJMRV9TUElOVVBfQ09OVFJPTF9DT1VOVF9TSElGVCAgICAoMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MX0NPVU5UX01BU0sgICAgICgweDAwMDNGRkZGKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfRU5BQkxFX1NISUZUICAgKDMxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfRU5BQkxFX01BU0sgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0VOQUJMRV9TUElOVVBfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAoMHg3RkZDMDAwMCkKKworI2RlZmluZSBTQ1VfRU5TUElOVVBfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfRU5TUElOVVBfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MXyAjIyBuYW1lKQorCisKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19UWFNTQ1RZUEVfU0hJRlQgICAgICgxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1RYU1NDVFlQRV9NQVNLICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfUkxMUkFURV9TSElGVCAgICAgICAoNCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19STExSQVRFX01BU0sgICAgICAgICgweDAwMDAwMEYwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXTzE1R0JQU19TSElGVCAgICAgKDgpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPMTVHQlBTX01BU0sgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzE1R0JQU19TSElGVCAgICAgICg5KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMTVHQlBTX01BU0sgICAgICAgKDB4MDAwMDAyMDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPMzBHQlBTX1NISUZUICAgICAoMTApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPMzBHQlBTX01BU0sgICAgICAoMHgwMDAwMDQwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzMwR0JQU19TSElGVCAgICAgICgxMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzMwR0JQU19NQVNLICAgICAgICgweDAwMDAwODAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXTzYwR0JQU19TSElGVCAgICAgKDEyKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXTzYwR0JQU19NQVNLICAgICAgKDB4MDAwMDEwMDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1c2MEdCUFNfU0hJRlQgICAgICAoMTMpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1c2MEdCUFNfTUFTSyAgICAgICAoMHgwMDAwMjAwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19FVkVOX1BBUklUWV9TSElGVCAgICgzMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19FVkVOX1BBUklUWV9NQVNLICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX0RFRkFVTFRfTUFTSyAgICAgICAgKDB4MDAwMDNGMDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfUkVRVUlSRURfTUFTSyAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19SRVNFUlZFRF9NQVNLICAgICAgICgweDdGRkZDMDBEKQorCisjZGVmaW5lIFNDVV9TQVNfUEhZQ0FQX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfUEhZQ0FQX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfICMjIG5hbWUpCisKKworI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF9WSVJUVUFMX0VYUEFOREVSX1BIWV9aT05FX0dST1VQX1NISUZUICAoMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfVklSVFVBTF9FWFBBTkRFUl9QSFlfWk9ORV9HUk9VUF9NQVNLICAgKDB4MDAwMDAwRkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9TT1VSQ0VfWk9ORV9HUk9VUF9DT05UUk9MX0lOU0lERV9TT1VSQ0VfWk9ORV9HUk9VUF9TSElGVCAgICAgICAgICgzMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfSU5TSURFX1NPVVJDRV9aT05FX0dST1VQX01BU0sgICAgICAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9TT1VSQ0VfWk9ORV9HUk9VUF9DT05UUk9MX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICgweDdGRkZGRjAwKQorCisjZGVmaW5lIFNDVV9QU1pHQ1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9QU1pHQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfICMjIG5hbWUpCisKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUwX0xPQ0tFRF9TSElGVCAgICAgICAgKDEpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMF9MT0NLRURfTUFTSyAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTBfVVBEQVRJTkdfU0hJRlQgICAgICAoMikKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUwX1VQREFUSU5HX01BU0sgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMV9MT0NLRURfU0hJRlQgICAgICAgICg0KQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTFfTE9DS0VEX01BU0sgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUxX1VQREFUSU5HX1NISUZUICAgICAgKDUpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMV9VUERBVElOR19NQVNLICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWlBUX0FTU09DSUFUSU9OX1BFMF9TSElGVCAoMTYpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUwX01BU0sgICgweDAwMDMwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfQUlQX0VOQUJMRV9QRTBfU0hJRlQgICAgICAoMTkpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMF9NQVNLICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWlBUX0FTU09DSUFUSU9OX1BFMV9TSElGVCAoMjApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUxX01BU0sgICgweDAwMzAwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfQUlQX0VOQUJMRV9QRTFfU0hJRlQgICAgICAoMjMpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMV9NQVNLICAgICAgICgweDAwODAwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWlBUX0FTU09DSUFUSU9OX1BFMl9TSElGVCAoMjQpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUyX01BU0sgICgweDAzMDAwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfQUlQX0VOQUJMRV9QRTJfU0hJRlQgICAgICAoMjcpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMl9NQVNLICAgICAgICgweDA4MDAwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWlBUX0FTU09DSUFUSU9OX1BFM19TSElGVCAoMjgpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUzX01BU0sgICgweDMwMDAwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfQUlQX0VOQUJMRV9QRTNfU0hJRlQgICAgICAoMzEpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFM19NQVNLICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAoMHg0NDQ0RkZDOSkKKworI2RlZmluZSBTQ1VfUEVHX1NDVVZaRUNSX0dFTl9WQUwobmFtZSwgdmFsKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfICMjIG5hbWUsIHZhbCkKKworI2RlZmluZSBTQ1VfUEVHX1NDVVZaRUNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF8gIyMgbmFtZSkKKworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogUG9ydCBUYXNrIFNjaGVkdWxlciByZWdpc3RlcnMgc2hpZnQgYW5kIG1hc2sgdmFsdWVzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX0lUX05FWFVTX1RJTUVPVVRfU0hJRlQgICAgICgwKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX0lUX05FWFVTX1RJTUVPVVRfTUFTSyAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1RBU0tfVElNRU9VVF9TSElGVCAgICAgICAgICgxNikKKyNkZWZpbmUgU0NVX1BUU0dfQ09OVFJPTF9UQVNLX1RJTUVPVVRfTUFTSyAgICAgICAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgU0NVX1BUU0dfQ09OVFJPTF9QVFNHX0VOQUJMRV9TSElGVCAgICAgICAgICAoMjQpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfUFRTR19FTkFCTEVfTUFTSyAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfRVRNX0VOQUJMRV9TSElGVCAgICAgICAgICAgKDI1KQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX0VUTV9FTkFCTEVfTUFTSyAgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX0RFRkFVTFRfTUFTSyAgICAgICAgICAgICAgICgweDAwMDIwMDAyKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1JFUVVJUkVEX01BU0sgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICgweEZDMDAwMDAwKQorCisjZGVmaW5lIFNDVV9QVFNHQ1JfR0VOX1ZBTChuYW1lLCB2YWwpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9QVFNHX0NPTlRST0xfICMjIG5hbWUsIHZhbCkKKworI2RlZmluZSBTQ1VfUFRTR0NSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9QVFNHX0NPTlRST0xfICMjIG5hbWUpCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX1NISUZUICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfUFRTR19SRUFMX1RJTUVfQ0xPQ0tfTUFTSyAgICAgICAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19SRVNFUlZFRF9NQVNLICAoMHhGRkZGMDAwMCkKKworI2RlZmluZSBTQ1VfUlRDUl9HRU5fVkFMKG5hbWUsIHZhbCkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1BUU0dfICMjIG5hbWUsIHZhbCkKKworCisjZGVmaW5lIFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19DT05UUk9MX1BSRVNDQUxFUl9WQUxVRV9TSElGVCAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19DT05UUk9MX1BSRVNDQUxFUl9WQUxVRV9NQVNLICAgKDB4MDBGRkZGRkYpCisjZGVmaW5lIFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19DT05UUk9MX1JFU0VSVkVEX01BU0sgICAgICAgICAgKDB4RkYwMDAwMDApCisKKyNkZWZpbmUgU0NVX1JUQ0NSX0dFTl9WQUwobmFtZSwgdmFsKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfUFRTR19SRUFMX1RJTUVfQ0xPQ0tfQ09OVFJPTF8gIyMgbmFtZSwgdmFsKQorCisKKyNkZWZpbmUgU0NVX1BUU0dfUE9SVF9UQVNLX1NDSEVEVUxFUl9DT05UUk9MX1NVU1BFTkRfU0hJRlQgICgwKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfU1VTUEVORF9NQVNLICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF9FTkFCTEVfU0hJRlQgICAoMSkKKyNkZWZpbmUgU0NVX1BUU0dfUE9SVF9UQVNLX1NDSEVEVUxFUl9DT05UUk9MX0VOQUJMRV9NQVNLICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgKDB4RkZGRkZGRkMpCisKKyNkZWZpbmUgU0NVX1BUU3hDUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfICMjIG5hbWUpCisKKworI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19ORVhUX1JOX1ZBTElEX1NISUZUICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19ORVhUX1JOX1ZBTElEX01BU0sgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19BQ1RJVkVfUk5TQ19MSVNUX1ZBTElEX1NISUZUICAgICgxKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19BQ1RJVkVfUk5TQ19MSVNUX1ZBTElEX01BU0sgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19QVFNfU1VTUEVOREVEX1NISUZUICAgICAgICAgICAgICgyKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19QVFNfU1VTUEVOREVEX01BU0sgICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU19SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICgweEZGRkZGRkY4KQorCisjZGVmaW5lIFNDVV9QVFN4U1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1BUU0dfUE9SVF9UQVNLX1NDSEVEVUxFUl9TVEFUVVNfICMjIG5hbWUpCisKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIFNHUElPIFJlZ2lzdGVyIHNoaWZ0IGFuZCBtYXNrIHZhbHVlcworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX0NMT0NLX1NFTEVDVF9TSElGVCAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX0NMT0NLX1NFTEVDVF9NQVNLICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX1NISUZUX1dJRFRIX1NFTEVDVF9TSElGVCAoMikKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX1NISUZUX1dJRFRIX1NFTEVDVF9NQVNLICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fVEVTVF9CSVRfU0hJRlQgICAgICAgICAgICAgICAgICAoMTUpCisjZGVmaW5lIFNDVV9TR1BJT19DT05UUk9MX1NHUElPX1RFU1RfQklUX01BU0sgICAgICAgICAgICAgICAgICAgKDB4MDAwMDgwMDApCisjZGVmaW5lIFNDVV9TR1BJT19DT05UUk9MX1NHUElPX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgKDB4RkZGRjdGRjgpCisKKyNkZWZpbmUgU0NVX1NHSUNSeF9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT18gIyMgbmFtZSkKKworI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IwX1NISUZUICAgICAgKDApCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjBfTUFTSyAgICAgICAoMHgwMDAwMDAwRikKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMV9TSElGVCAgICAgICg0KQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IxX01BU0sgICAgICAgKDB4MDAwMDAwRjApCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjJfU0hJRlQgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMl9NQVNLICAgICAgICgweDAwMDAwRjAwKQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IzX1NISUZUICAgICAgKDEyKQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IzX01BU0sgICAgICAgKDB4MDAwMEYwMDApCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUkVTRVJWRURfTUFTSyAoMHhGRkZGMDAwMCkKKworI2RlZmluZSBTQ1VfU0dQQlJ4X0dFTl9WQUwobmFtZSwgdmFsdWUpCVwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMF9TSElGVCAgICAgICAgKDApCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMF9NQVNLICAgICAgICAgKDB4MDAwMDAwMDMpCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMV9TSElGVCAgICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMV9NQVNLICAgICAgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMl9TSElGVCAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMl9NQVNLICAgICAgICAgKDB4MDAwMDAzMDApCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SM19TSElGVCAgICAgICAgKDEyKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfUjNfTUFTSyAgICAgICAgICgweDAwMDAzMDAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfUkVTRVJWRURfTUFTSyAgICgweEZGRkY4ODg4KQorCisjZGVmaW5lIFNDVV9TR1NETFJ4X0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IwX1NISUZUICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IwX01BU0sgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IxX1NISUZUICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IxX01BU0sgICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IyX1NISUZUICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IyX01BU0sgICAgICAgICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IzX1NISUZUICAgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9VUFBFUl9SM19NQVNLICAgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9VUFBFUl9SRVNFUlZFRF9NQVNLICAgKDB4RkZGRjg4ODgpCisKKyNkZWZpbmUgU0NVX1NHU0RVUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDBfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QwX01BU0sgICAgICAgKDB4MDAwMDAwMDMpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMV9TSElGVCAgICAgICg0KQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDFfTUFTSyAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QyX1NISUZUICAgICAgKDgpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMl9NQVNLICAgICAgICgweDAwMDAwMzAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDNfU0hJRlQgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EM19NQVNLICAgICAgICgweDAwMDAzMDAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfUkVTRVJWRURfTUFTSyAoMHhGRkZGODg4OCkKKworI2RlZmluZSBTQ1VfU0dTSURMUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDBfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QwX01BU0sgICAgICAgKDB4MDAwMDAwMDMpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMV9TSElGVCAgICAgICg0KQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDFfTUFTSyAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QyX1NISUZUICAgICAgKDgpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMl9NQVNLICAgICAgICgweDAwMDAwMzAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDNfU0hJRlQgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EM19NQVNLICAgICAgICgweDAwMDAzMDAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfUkVTRVJWRURfTUFTSyAoMHhGRkZGODg4OCkKKworI2RlZmluZSBTQ1VfU0dTSURVUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREVfU0hJRlQgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMEYpCisjZGVmaW5lIFNDVV9TR1BJT19WRU5ET1JfU1BFQ0lGSUNfQ09ERV9SRVNFUlZFRF9NQVNLICAgICgweEZGRkZGRkYwKQorCisjZGVmaW5lIFNDVV9TR1ZTQ1JfR0VOX1ZBTCh2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMF9TSElGVCAgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMF9NQVNLICAgICAgICAgICAgKDB4MDAwMDAwMDMpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTBfU0hJRlQgICAgKDIpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTBfTUFTSyAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEwX1NISUZUICAgICAgKDMpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEwX01BU0sgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMV9TSElGVCAgICAgICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMV9NQVNLICAgICAgICAgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTFfU0hJRlQgICAgKDYpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTFfTUFTSyAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEExX1NISUZUICAgICAgKDcpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEExX01BU0sgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMl9TSElGVCAgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMl9NQVNLICAgICAgICAgICAgKDB4MDAwMDAzMDApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTJfU0hJRlQgICAgKDEwKQorI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSU5WRVJUX0lOUFVUX0RBVEEyX01BU0sgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSk9HX0VOQUJMRV9EQVRBMl9TSElGVCAgICAgICgxMSkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTJfTUFTSyAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAoMHhGRkZGRjAwMCkKKworI2RlZmluZSBTQ1VfU0dPRFNSX0dFTl9WQUwobmFtZSwgdmFsdWUpCVwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NHT0RTUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfICMjIG5hbWUpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBTTVUgUmVnaXN0ZXJzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU01VIFJlZ2lzdGVycworICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBiYXNlZCBvZmYgb2YgQkFSMAorICoKKyAqIFRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBvdGhlciBmdW5jdGlvbnMgdXNlCisgKiAgICAgICBCQVIwICsgRk4jICogU3lzdGVtUGFnZVNpemUgKiAyCisgKgorICogVGhlIFRDQSBpcyBvbmx5IGFjY2Vzc2FibGUgZnJvbSBGTiMwIChQaHlzaWNhbCBGdW5jdGlvbikgYW5kIGVhY2gKKyAqIGlzIHByb2dyYW1tZWQgYnkgKEJBUjAgKyBTQ1VfU01VX1RDQV9PRkZTRVQgKyAoRk4jICogMHgwNCkpIG9yCisgKiAgICBUQ0EwIGZvciBGTiMwIGlzIGF0IEJBUjAgKyAweDA0MDAKKyAqICAgIFRDQTEgZm9yIEZOIzEgaXMgYXQgQkFSMCArIDB4MDQwNAorICogICAgZXRjLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWNjZXNzYWJsZSB0byBhbGwgRk4jcyAqLworI2RlZmluZSBTQ1VfU01VX1BDUF9PRkZTRVQgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9TTVVfQU1SX09GRlNFVCAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1NNVV9JU1JfT0ZGU0VUICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTQ1VfU01VX0lNUl9PRkZTRVQgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIFNDVV9TTVVfSUNDX09GRlNFVCAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgU0NVX1NNVV9IVFRMQkFSX09GRlNFVCAgICAgIDB4MDAyMAorI2RlZmluZSBTQ1VfU01VX0hUVFVCQVJfT0ZGU0VUICAgICAgMHgwMDI0CisjZGVmaW5lIFNDVV9TTVVfVENSX09GRlNFVCAgICAgICAgICAweDAwMjgKKyNkZWZpbmUgU0NVX1NNVV9DUUxCQVJfT0ZGU0VUICAgICAgIDB4MDAzMAorI2RlZmluZSBTQ1VfU01VX0NRVUJBUl9PRkZTRVQgICAgICAgMHgwMDM0CisjZGVmaW5lIFNDVV9TTVVfQ1FQUl9PRkZTRVQgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU0NVX1NNVV9DUUdSX09GRlNFVCAgICAgICAgIDB4MDA0NAorI2RlZmluZSBTQ1VfU01VX0NRQ19PRkZTRVQgICAgICAgICAgMHgwMDQ4CisvKiBBY2Nlc3NhYmxlIHRvIEZOIzAgb25seSAqLworI2RlZmluZSBTQ1VfU01VX1JOQ0xCQVJfT0ZGU0VUICAgICAgMHgwMDgwCisjZGVmaW5lIFNDVV9TTVVfUk5DVUJBUl9PRkZTRVQgICAgICAweDAwODQKKyNkZWZpbmUgU0NVX1NNVV9EQ0NfT0ZGU0VUICAgICAgICAgIDB4MDA5MAorI2RlZmluZSBTQ1VfU01VX0RGQ19PRkZTRVQgICAgICAgICAgMHgwMDk0CisjZGVmaW5lIFNDVV9TTVVfU01VQ1NSX09GRlNFVCAgICAgICAweDAwOTgKKyNkZWZpbmUgU0NVX1NNVV9TQ1VTUkNSX09GRlNFVCAgICAgIDB4MDA5QworI2RlZmluZSBTQ1VfU01VX1NNQVdfT0ZGU0VUICAgICAgICAgMHgwMEEwCisjZGVmaW5lIFNDVV9TTVVfU01EV19PRkZTRVQgICAgICAgICAweDAwQTQKKy8qIEFjY2Vzc2FibGUgdG8gRk4jMCBvbmx5ICovCisjZGVmaW5lIFNDVV9TTVVfVENBX09GRlNFVCAgICAgICAgICAweDA0MDAKKy8qIEFjY2Vzc2FibGUgdG8gYWxsIEZOI3MgKi8KKyNkZWZpbmUgU0NVX1NNVV9NVF9NTEFSMF9PRkZTRVQgICAgIDB4MjAwMAorI2RlZmluZSBTQ1VfU01VX01UX01VQVIwX09GRlNFVCAgICAgMHgyMDA0CisjZGVmaW5lIFNDVV9TTVVfTVRfTURSMF9PRkZTRVQgICAgICAweDIwMDgKKyNkZWZpbmUgU0NVX1NNVV9NVF9WQ1IwX09GRlNFVCAgICAgIDB4MjAwQworI2RlZmluZSBTQ1VfU01VX01UX01MQVIxX09GRlNFVCAgICAgMHgyMDEwCisjZGVmaW5lIFNDVV9TTVVfTVRfTVVBUjFfT0ZGU0VUICAgICAweDIwMTQKKyNkZWZpbmUgU0NVX1NNVV9NVF9NRFIxX09GRlNFVCAgICAgIDB4MjAxOAorI2RlZmluZSBTQ1VfU01VX01UX1ZDUjFfT0ZGU0VUICAgICAgMHgyMDFDCisjZGVmaW5lIFNDVV9TTVVfTVBCQV9PRkZTRVQgICAgICAgICAweDMwMDAKKworLyoqCisgKiBzdHJ1Y3Qgc211X3JlZ2lzdGVycyAtIFRoZXNlIGFyZSB0aGUgU01VIHJlZ2lzdGVycworICoKKyAqCisgKi8KK3N0cnVjdCBzbXVfcmVnaXN0ZXJzIHsKKy8qIDB4MDAwMCBQQ1AgKi8KKwl1MzIgcG9zdF9jb250ZXh0X3BvcnQ7CisvKiAweDAwMDQgQU1SICovCisJdTMyIGFkZHJlc3NfbW9kaWZpZXI7CisJdTMyIHJlc2VydmVkXzA4OworCXUzMiByZXNlcnZlZF8wQzsKKy8qIDB4MDAxMCBJU1IgKi8KKwl1MzIgaW50ZXJydXB0X3N0YXR1czsKKy8qIDB4MDAxNCBJTVIgKi8KKwl1MzIgaW50ZXJydXB0X21hc2s7CisvKiAweDAwMTggSUNDICovCisJdTMyIGludGVycnVwdF9jb2FsZXNjZV9jb250cm9sOworCXUzMiByZXNlcnZlZF8xQzsKKy8qIDB4MDAyMCBIVFRMQkFSICovCisJdTMyIGhvc3RfdGFza190YWJsZV9sb3dlcjsKKy8qIDB4MDAyNCBIVFRVQkFSICovCisJdTMyIGhvc3RfdGFza190YWJsZV91cHBlcjsKKy8qIDB4MDAyOCBUQ1IgKi8KKwl1MzIgdGFza19jb250ZXh0X3JhbmdlOworCXUzMiByZXNlcnZlZF8yQzsKKy8qIDB4MDAzMCBDUUxCQVIgKi8KKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9sb3dlcjsKKy8qIDB4MDAzNCBDUVVCQVIgKi8KKwl1MzIgY29tcGxldGlvbl9xdWV1ZV91cHBlcjsKKwl1MzIgcmVzZXJ2ZWRfMzg7CisJdTMyIHJlc2VydmVkXzNDOworLyogMHgwMDQwIENRUFIgKi8KKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9wdXQ7CisvKiAweDAwNDQgQ1FHUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2dldDsKKy8qIDB4MDA0OCBDUUMgKi8KKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9jb250cm9sOworCXUzMiByZXNlcnZlZF80QzsKKwl1MzIgcmVzZXJ2ZWRfNXhbNF07CisJdTMyIHJlc2VydmVkXzZ4WzRdOworCXUzMiByZXNlcnZlZF83eFs0XTsKKy8qCisgKiBBY2Nlc3NhYmxlIHRvIEZOIzAgb25seQorICogMHgwMDgwIFJOQ0xCQVIgKi8KKwl1MzIgcmVtb3RlX25vZGVfY29udGV4dF9sb3dlcjsKKy8qIDB4MDA4NCBSTkNVQkFSICovCisJdTMyIHJlbW90ZV9ub2RlX2NvbnRleHRfdXBwZXI7CisJdTMyIHJlc2VydmVkXzg4OworCXUzMiByZXNlcnZlZF84QzsKKy8qIDB4MDA5MCBEQ0MgKi8KKwl1MzIgZGV2aWNlX2NvbnRleHRfY2FwYWNpdHk7CisvKiAweDAwOTQgREZDICovCisJdTMyIGRldmljZV9mdW5jdGlvbl9jYXBhY2l0eTsKKy8qIDB4MDA5OCBTTVVDU1IgKi8KKwl1MzIgY29udHJvbF9zdGF0dXM7CisvKiAweDAwOUMgU0NVU1JDUiAqLworCXUzMiBzb2Z0X3Jlc2V0X2NvbnRyb2w7CisvKiAweDAwQTAgU01BVyAqLworCXUzMiBtbXJfYWRkcmVzc193aW5kb3c7CisvKiAweDAwQTQgU01EVyAqLworCXUzMiBtbXJfZGF0YV93aW5kb3c7CisJdTMyIHJlc2VydmVkX0E4OworCXUzMiByZXNlcnZlZF9BQzsKKy8qIEEgd2hvbGUgYnVuY2ggb2YgcmVzZXJ2ZWQgc3BhY2UgKi8KKwl1MzIgcmVzZXJ2ZWRfQnhbNF07CisJdTMyIHJlc2VydmVkX0N4WzRdOworCXUzMiByZXNlcnZlZF9EeFs0XTsKKwl1MzIgcmVzZXJ2ZWRfRXhbNF07CisJdTMyIHJlc2VydmVkX0Z4WzRdOworCXUzMiByZXNlcnZlZF8xeHhbNjRdOworCXUzMiByZXNlcnZlZF8yeHhbNjRdOworCXUzMiByZXNlcnZlZF8zeHhbNjRdOworLyoKKyAqIEFjY2Vzc2FibGUgdG8gRk4jMCBvbmx5CisgKiAweDA0MDAgVENBICovCisJdTMyIHRhc2tfY29udGV4dF9hc3NpZ25tZW50WzI1Nl07CisvKiBNU0ktWCByZWdpc3RlcnMgbm90IGluY2x1ZGVkICovCit9OworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNETUEgUmVnaXN0ZXJzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0RNQV9CQVNFICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIFNDVV9TRE1BX1BVRkFUTEhBUl9PRkZTRVQgICAweDAwMDAKKyNkZWZpbmUgU0NVX1NETUFfUFVGQVRVSEFSX09GRlNFVCAgIDB4MDAwNAorI2RlZmluZSBTQ1VfU0RNQV9VRkxIQkFSX09GRlNFVCAgICAgMHgwMDA4CisjZGVmaW5lIFNDVV9TRE1BX1VGVUhCQVJfT0ZGU0VUICAgICAweDAwMEMKKyNkZWZpbmUgU0NVX1NETUFfVUZRQ19PRkZTRVQgICAgICAgIDB4MDAxMAorI2RlZmluZSBTQ1VfU0RNQV9VRlFQUF9PRkZTRVQgICAgICAgMHgwMDE0CisjZGVmaW5lIFNDVV9TRE1BX1VGUUdQX09GRlNFVCAgICAgICAweDAwMTgKKyNkZWZpbmUgU0NVX1NETUFfUERNQUNSX09GRlNFVCAgICAgIDB4MDAxQworI2RlZmluZSBTQ1VfU0RNQV9DRE1BQ1JfT0ZGU0VUICAgICAgMHgwMDgwCisKKy8qKgorICogc3RydWN0IHNjdV9zZG1hX3JlZ2lzdGVycyAtIFRoZXNlIGFyZSB0aGUgU0NVIFNETUEgUmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNjdV9zZG1hX3JlZ2lzdGVycyB7CisvKiAweDAwMDAgUFVGQVRMSEFSICovCisJdTMyIHVmX2FkZHJlc3NfdGFibGVfbG93ZXI7CisvKiAweDAwMDQgUFVGQVRVSEFSICovCisJdTMyIHVmX2FkZHJlc3NfdGFibGVfdXBwZXI7CisvKiAweDAwMDggVUZMSEJBUiAqLworCXUzMiB1Zl9oZWFkZXJfYmFzZV9hZGRyZXNzX2xvd2VyOworLyogMHgwMDBDIFVGVUhCQVIgKi8KKwl1MzIgdWZfaGVhZGVyX2Jhc2VfYWRkcmVzc191cHBlcjsKKy8qIDB4MDAxMCBVRlFDICovCisJdTMyIHVuc29saWNpdGVkX2ZyYW1lX3F1ZXVlX2NvbnRyb2w7CisvKiAweDAwMTQgVUZRUFAgKi8KKwl1MzIgdW5zb2xpY2l0ZWRfZnJhbWVfcHV0X3BvaW50ZXI7CisvKiAweDAwMTggVUZRR1AgKi8KKwl1MzIgdW5zb2xpY2l0ZWRfZnJhbWVfZ2V0X3BvaW50ZXI7CisvKiAweDAwMUMgUERNQUNSICovCisJdTMyIHBkbWFfY29uZmlndXJhdGlvbjsKKy8qIFJlc2VydmVkIHVudGlsIG9mZnNldCAweDgwICovCisJdTMyIHJlc2VydmVkXzAwMjBfMDA3Q1sweDE4XTsKKy8qIDB4MDA4MCBDRE1BQ1IgKi8KKwl1MzIgY2RtYV9jb25maWd1cmF0aW9uOworLyogUmVtYWluZGVyIFNETUEgcmVnaXN0ZXIgc3BhY2UgKi8KKwl1MzIgcmVzZXJ2ZWRfMDA4NF8wNDAwWzB4REZdOworCit9OworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0NVIExpbmsgUmVnaXN0ZXJzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfUEVHMF9PRkZTRVQgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9QRUcxX09GRlNFVCAgICAweDgwMDAKKworI2RlZmluZSBTQ1VfVEwwX09GRlNFVCAgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9UTDFfT0ZGU0VUICAgICAweDA0MDAKKyNkZWZpbmUgU0NVX1RMMl9PRkZTRVQgICAgIDB4MDgwMAorI2RlZmluZSBTQ1VfVEwzX09GRlNFVCAgICAgMHgwQzAwCisKKyNkZWZpbmUgU0NVX0xMX09GRlNFVCAgICAgIDB4MDA4MAorI2RlZmluZSBTQ1VfTEwwX09GRlNFVCAgICAgKFNDVV9UTDBfT0ZGU0VUICsgU0NVX0xMX09GRlNFVCkKKyNkZWZpbmUgU0NVX0xMMV9PRkZTRVQgICAgIChTQ1VfVEwxX09GRlNFVCArIFNDVV9MTF9PRkZTRVQpCisjZGVmaW5lIFNDVV9MTDJfT0ZGU0VUICAgICAoU0NVX1RMMl9PRkZTRVQgKyBTQ1VfTExfT0ZGU0VUKQorI2RlZmluZSBTQ1VfTEwzX09GRlNFVCAgICAgKFNDVV9UTDNfT0ZGU0VUICsgU0NVX0xMX09GRlNFVCkKKworLyogVHJhbnNwb3J0IExheWVyIE9mZnNldHMgKFBFRyArIFRMKSAqLworI2RlZmluZSBTQ1VfVExDUl9PRkZTRVQgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1RMQURUUl9PRkZTRVQgICAgICAgMHgwMDA0CisjZGVmaW5lIFNDVV9UTFRUTVJfT0ZGU0VUICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ1VfVExFRUNSMF9PRkZTRVQgICAgICAweDAwMEMKKyNkZWZpbmUgU0NVX1NUUFRMREFSTklfT0ZGU0VUICAgMHgwMDEwCisKKworI2RlZmluZSBTQ1VfVExDUl9IQVNIX1NBU19DSEVDS0lOR19FTkFCTEVfU0hJRlQgICAgKDApCisjZGVmaW5lIFNDVV9UTENSX0hBU0hfU0FTX0NIRUNLSU5HX0VOQUJMRV9NQVNLICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU0NVX1RMQ1JfQ0xFQVJfVENJX05DUV9NQVBQSU5HX1RBQkxFX1NISUZUICgxKQorI2RlZmluZSBTQ1VfVExDUl9DTEVBUl9UQ0lfTkNRX01BUFBJTkdfVEFCTEVfTUFTSyAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9UTENSX1NUUF9XUklURV9EQVRBX1BSRUZFVENIX1NISUZUICAgICAoMykKKyNkZWZpbmUgU0NVX1RMQ1JfU1RQX1dSSVRFX0RBVEFfUFJFRkVUQ0hfTUFTSyAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBTQ1VfVExDUl9DTURfTkFLX1NUQVRVU19DT0RFX1NISUZUICAgICAgICAgKDQpCisjZGVmaW5lIFNDVV9UTENSX0NNRF9OQUtfU1RBVFVTX0NPREVfTUFTSyAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgU0NVX1RMQ1JfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweEZGRkZGRkVCKQorCisjZGVmaW5lIFNDVV9UTENSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9UTENSXyAjIyBuYW1lKQorCisvKioKKyAqIHN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyAtIFRoZXNlIGFyZSB0aGUgU0NVIFRyYW5zcG9ydCBMYXllcgorICogICAgcmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIHsKKwkvKiAweDAwMDAgVExDUiAqLworCXUzMiBjb250cm9sOworCS8qIDB4MDAwNCBUTEFEVFIgKi8KKwl1MzIgYXJiaXRyYXRpb25fZGVsYXlfdGltZXI7CisJLyogMHgwMDA4IFRMVFRNUiAqLworCXUzMiB0aW1lcl90ZXN0X21vZGU7CisJLyogMHgwMDBDIHJlc2VydmVkICovCisJdTMyIHJlc2VydmVkXzBDOworCS8qIDB4MDAxMCBTVFBUTERBUk5JICovCisJdTMyIHN0cF9ybmk7CisJLyogMHgwMDE0IFRMRkVXUE9SQ1RSTCAqLworCXUzMiB0bGZlX3dwb19yZWFkX2NvbnRyb2w7CisJLyogMHgwMDE4IFRMRkVXUE9SREFUQSAqLworCXUzMiB0bGZlX3dwb19yZWFkX2RhdGE7CisJLyogMHgwMDFDIFJYVExTU0NTUjEgKi8KKwl1MzIgcnh0bF9zaW5nbGVfc3RlcF9jb250cm9sX3N0YXR1c18xOworCS8qIDB4MDAyMCBSWFRMU1NDU1IyICovCisJdTMyIHJ4dGxfc2luZ2xlX3N0ZXBfY29udHJvbF9zdGF0dXNfMjsKKwkvKiAweDAwMjQgQVdUUkREQ1IgKi8KKwl1MzIgdGxmZV9hd3RfcmV0cnlfZGVsYXlfZGVidWdfY29udHJvbDsKKwkvKiBSZW1haW5kZXIgb2YgVEwgbWVtb3J5IHNwYWNlICovCisJdTMyIHJlc2VydmVkXzAwMjhfMDA3RlsweDE2XTsKKworfTsKKworLyogUHJvdG9jb2wgRW5naW5lIEdyb3VwIFJlZ2lzdGVycyAqLworI2RlZmluZSBTQ1VfU0NVVlpFQ1J4X09GRlNFVCAgICAgICAgMHgxMDgwCisKKy8qIExpbmsgTGF5ZXIgT2Zmc2V0cyAoUEVHICsgVEwgKyBMTCkgKi8KKyNkZWZpbmUgU0NVX1NBU19TUERUT1ZfT0ZGU0VUICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ1VfU0FTX0xMU1RBX09GRlNFVCAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNDVV9TQVRBX1BTRUxUT1ZfT0ZGU0VUICAgICAweDAwMDgKKyNkZWZpbmUgU0NVX1NBU19USU1FVE9WX09GRlNFVCAgICAgIDB4MDAxMAorI2RlZmluZSBTQ1VfU0FTX0xPU1RPVF9PRkZTRVQgICAgICAgMHgwMDE0CisjZGVmaW5lIFNDVV9TQVNfTE5LVE9WX09GRlNFVCAgICAgICAweDAwMTgKKyNkZWZpbmUgU0NVX1NBU19QSFlUT1ZfT0ZGU0VUICAgICAgIDB4MDAxQworI2RlZmluZSBTQ1VfU0FTX0FGRVJDTlRfT0ZGU0VUICAgICAgMHgwMDIwCisjZGVmaW5lIFNDVV9TQVNfV0VSQ05UX09GRlNFVCAgICAgICAweDAwMjQKKyNkZWZpbmUgU0NVX1NBU19USUlEX09GRlNFVCAgICAgICAgIDB4MDAyOAorI2RlZmluZSBTQ1VfU0FTX1RJRE5IX09GRlNFVCAgICAgICAgMHgwMDJDCisjZGVmaW5lIFNDVV9TQVNfVElETkxfT0ZGU0VUICAgICAgICAweDAwMzAKKyNkZWZpbmUgU0NVX1NBU19USVNTQUhfT0ZGU0VUICAgICAgIDB4MDAzNAorI2RlZmluZSBTQ1VfU0FTX1RJU1NBTF9PRkZTRVQgICAgICAgMHgwMDM4CisjZGVmaW5lIFNDVV9TQVNfVElQSURfT0ZGU0VUICAgICAgICAweDAwM0MKKyNkZWZpbmUgU0NVX1NBU19USVJFUzJfT0ZGU0VUICAgICAgIDB4MDA0MAorI2RlZmluZSBTQ1VfU0FTX0FEUlNUQV9PRkZTRVQgICAgICAgMHgwMDQ0CisjZGVmaW5lIFNDVV9TQVNfTUFXVFRPVl9PRkZTRVQgICAgICAweDAwNDgKKyNkZWZpbmUgU0NVX1NBU19GUlBMREZJTF9PRkZTRVQgICAgIDB4MDA1NAorI2RlZmluZSBTQ1VfU0FTX1JGQ05UX09GRlNFVCAgICAgICAgMHgwMDYwCisjZGVmaW5lIFNDVV9TQVNfVEZDTlRfT0ZGU0VUICAgICAgICAweDAwNjQKKyNkZWZpbmUgU0NVX1NBU19SRkRDTlRfT0ZGU0VUICAgICAgIDB4MDA2OAorI2RlZmluZSBTQ1VfU0FTX1RGRENOVF9PRkZTRVQgICAgICAgMHgwMDZDCisjZGVmaW5lIFNDVV9TQVNfTEVSQ05UX09GRlNFVCAgICAgICAweDAwNzAKKyNkZWZpbmUgU0NVX1NBU19SRElTRVJSQ05UX09GRlNFVCAgIDB4MDA3NAorI2RlZmluZSBTQ1VfU0FTX0NSRVJDTlRfT0ZGU0VUICAgICAgMHgwMDc4CisjZGVmaW5lIFNDVV9TVFBDVExfT0ZGU0VUICAgICAgICAgICAweDAwN0MKKyNkZWZpbmUgU0NVX1NBU19QQ0ZHX09GRlNFVCAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTQ1VfU0FTX0NMS1NNX09GRlNFVCAgICAgICAgMHgwMDg0CisjZGVmaW5lIFNDVV9TQVNfVFhDT01XQUtFX09GRlNFVCAgICAweDAwODgKKyNkZWZpbmUgU0NVX1NBU19UWENPTUlOSVRfT0ZGU0VUICAgIDB4MDA4QworI2RlZmluZSBTQ1VfU0FTX1RYQ09NU0FTX09GRlNFVCAgICAgMHgwMDkwCisjZGVmaW5lIFNDVV9TQVNfQ09NSU5JVF9PRkZTRVQgICAgICAweDAwOTQKKyNkZWZpbmUgU0NVX1NBU19DT01XQUtFX09GRlNFVCAgICAgIDB4MDA5OAorI2RlZmluZSBTQ1VfU0FTX0NPTVNBU19PRkZTRVQgICAgICAgMHgwMDlDCisjZGVmaW5lIFNDVV9TQVNfU0ZFUkNOVF9PRkZTRVQgICAgICAweDAwQTAKKyNkZWZpbmUgU0NVX1NBU19DREZFUkNOVF9PRkZTRVQgICAgIDB4MDBBNAorI2RlZmluZSBTQ1VfU0FTX0RORkVSQ05UX09GRlNFVCAgICAgMHgwMEE4CisjZGVmaW5lIFNDVV9TQVNfUFJTVEVSQ05UX09GRlNFVCAgICAweDAwQUMKKyNkZWZpbmUgU0NVX1NBU19DTlRDVExfT0ZGU0VUICAgICAgIDB4MDBCMAorI2RlZmluZSBTQ1VfU0FTX1NTUFRPVl9PRkZTRVQgICAgICAgMHgwMEI0CisjZGVmaW5lIFNDVV9GVENUTF9PRkZTRVQgICAgICAgICAgICAweDAwQjgKKyNkZWZpbmUgU0NVX0ZSQ1RMX09GRlNFVCAgICAgICAgICAgIDB4MDBCQworI2RlZmluZSBTQ1VfRlRXTVJLX09GRlNFVCAgICAgICAgICAgMHgwMEMwCisjZGVmaW5lIFNDVV9FTlNQSU5VUF9PRkZTRVQgICAgICAgICAweDAwQzQKKyNkZWZpbmUgU0NVX1NBU19UUk5UT1ZfT0ZGU0VUICAgICAgIDB4MDBDOAorI2RlZmluZSBTQ1VfU0FTX1BIWUNBUF9PRkZTRVQgICAgICAgMHgwMENDCisjZGVmaW5lIFNDVV9TQVNfUEhZQ1RMX09GRlNFVCAgICAgICAweDAwRDAKKyNkZWZpbmUgU0NVX1NBU19MTENUTF9PRkZTRVQgICAgICAgIDB4MDBEOAorI2RlZmluZSBTQ1VfQUZFX1hDVlJDUl9PRkZTRVQgICAgICAgMHgwMERDCisjZGVmaW5lIFNDVV9BRkVfTFVUQ1JfT0ZGU0VUICAgICAgICAweDAwRTAKKworI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9HRU4xICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjIgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfR0VOMyAgICAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQlJPQURDQVNUX1BSSU1JVElWRV9TSElGVCAgICAgICAgICAgICgyKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9CUk9BRENBU1RfUFJJTUlUSVZFX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAzRkMpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX0NMT1NFX05PX0FDVElWRV9UQVNLX0RJU0FCTEVfU0hJRlQgICAoMTYpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX0NMT1NFX05PX0FDVElWRV9UQVNLX0RJU0FCTEVfTUFTSyAgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQ0xPU0VfTk9fT1VUQk9VTkRfVEFTS19ESVNBQkxFX1NISUZUICgxNykKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQ0xPU0VfTk9fT1VUQk9VTkRfVEFTS19ESVNBQkxFX01BU0sgICgweDAwMDIwMDAwKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9OT19PVVRCT1VORF9UQVNLX1RJTUVPVVRfU0hJRlQgICAgICAgKDI0KQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9OT19PVVRCT1VORF9UQVNLX1RJTUVPVVRfTUFTSyAgICAgICAgKDB4RkYwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMEZDRkMwMCkKKworI2RlZmluZSBTQ1VfU0FTX0xMQ1RMX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0FTX0xMQ1RMX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MXyAjIyBuYW1lKQorCisKKy8qICNkZWZpbmUgU0NVX0ZSWEhFQ1JfRENOVF9PRkZTRVQgICAgICAweDAwQjAgKi8KKyNkZWZpbmUgU0NVX1BTWkdDUl9PRkZTRVQgICAgICAgICAgIDB4MDBFNAorI2RlZmluZSBTQ1VfU0FTX1JFQ1BIWUNBUF9PRkZTRVQgICAgMHgwMEU4CisvKiAjZGVmaW5lIFNDVV9UWF9MVVRTRUxfT0ZGU0VUICAgICAgICAgMHgwMEI4ICovCisKKyNkZWZpbmUgU0NVX1NBU19QVHhDX09GRlNFVCAgICAgICAgIDB4MDBENCAvKiBTYW1lIG9mZnNldCBhcyBTQVNfVENUU1RNICovCisKKy8qKgorICogc3RydWN0IHNjdV9saW5rX2xheWVyX3JlZ2lzdGVycyAtIFNDVSBMaW5rIExheWVyIFJlZ2lzdGVycworICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgeworLyogMHgwMDAwIFNBU19TUERUT1YgKi8KKwl1MzIgc3BlZWRfbmVnb3RpYXRpb25fdGltZXJzOworLyogMHgwMDA0IFNBU19MTFNUQSAqLworCXUzMiBsaW5rX2xheWVyX3N0YXR1czsKKy8qIDB4MDAwOCBTQVRBX1BTRUxUT1YgKi8KKwl1MzIgcG9ydF9zZWxlY3Rvcl90aW1lb3V0OworCXUzMiByZXNlcnZlZDBDOworLyogMHgwMDEwIFNBU19USU1FVE9WICovCisJdTMyIHRpbWVvdXRfdW5pdF92YWx1ZTsKKy8qIDB4MDAxNCBTQVNfUkNEVE9WICovCisJdTMyIHJjZF90aW1lb3V0OworLyogMHgwMDE4IFNBU19MTktUT1YgKi8KKwl1MzIgbGlua190aW1lcl90aW1lb3V0czsKKy8qIDB4MDAxQyBTQVNfUEhZVE9WICovCisJdTMyIHNhc19waHlfdGltZW91dHM7CisvKiAweDAwMjAgU0FTX0FGRVJDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfYWRkcmVzc19mcmFtZV9lcnJvcl9jb3VudGVyOworLyogMHgwMDI0IFNBU19XRVJDTlQgKi8KKwl1MzIgaW52YWxpZF9kd29yZF9jb3VudGVyOworLyogMHgwMDI4IFNBU19USUlEICovCisJdTMyIHRyYW5zbWl0X2lkZW50aWZpY2F0aW9uOworLyogMHgwMDJDIFNBU19USUROSCAqLworCXUzMiBzYXNfZGV2aWNlX25hbWVfaGlnaDsKKy8qIDB4MDAzMCBTQVNfVElETkwgKi8KKwl1MzIgc2FzX2RldmljZV9uYW1lX2xvdzsKKy8qIDB4MDAzNCBTQVNfVElTU0FIICovCisJdTMyIHNvdXJjZV9zYXNfYWRkcmVzc19oaWdoOworLyogMHgwMDM4IFNBU19USVNTQUwgKi8KKwl1MzIgc291cmNlX3Nhc19hZGRyZXNzX2xvdzsKKy8qIDB4MDAzQyBTQVNfVElQSUQgKi8KKwl1MzIgaWRlbnRpZnlfZnJhbWVfcGh5X2lkOworLyogMHgwMDQwIFNBU19USVJFUzIgKi8KKwl1MzIgaWRlbnRpZnlfZnJhbWVfcmVzZXJ2ZWQ7CisvKiAweDAwNDQgU0FTX0FEUlNUQSAqLworCXUzMiByZWNlaXZlZF9hZGRyZXNzX2ZyYW1lOworLyogMHgwMDQ4IFNBU19NQVdUVE9WICovCisJdTMyIG1heGltdW1fYXJiaXRyYXRpb25fd2FpdF90aW1lcl90aW1lb3V0OworLyogMHgwMDRDIFNBU19QVHhDICovCisJdTMyIHRyYW5zbWl0X3ByaW1pdGl2ZTsKKy8qIDB4MDA1MCBTQVNfUk9SRVMgKi8KKwl1MzIgZXJyb3JfY291bnRlcl9ldmVudF9ub3RpZmljYXRpb25fY29udHJvbDsKKy8qIDB4MDA1NCBTQVNfRlJQTERGSUwgKi8KKwl1MzIgZnJ4cV9wYXlsb2FkX2ZpbGxfdGhyZXNob2xkOworLyogMHgwMDU4IFNBU19MTEhBTkdfVE9UICovCisJdTMyIGxpbmtfbGF5ZXJfaGFuZ19kZXRlY3Rpb25fdGltZW91dDsKKwl1MzIgcmVzZXJ2ZWRfNUM7CisvKiAweDAwNjAgU0FTX1JGQ05UICovCisJdTMyIHJlY2VpdmVkX2ZyYW1lX2NvdW50OworLyogMHgwMDY0IFNBU19URkNOVCAqLworCXUzMiB0cmFuc21pdF9mcmFtZV9jb3VudDsKKy8qIDB4MDA2OCBTQVNfUkZEQ05UICovCisJdTMyIHJlY2VpdmVkX2R3b3JkX2NvdW50OworLyogMHgwMDZDIFNBU19URkRDTlQgKi8KKwl1MzIgdHJhbnNtaXRfZHdvcmRfY291bnQ7CisvKiAweDAwNzAgU0FTX0xFUkNOVCAqLworCXUzMiBsb3NzX29mX3N5bmNfZXJyb3JfY291bnQ7CisvKiAweDAwNzQgU0FTX1JESVNFUlJDTlQgKi8KKwl1MzIgcnVubmluZ19kaXNwYXJpdHlfZXJyb3JfY291bnQ7CisvKiAweDAwNzggU0FTX0NSRVJDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZnJhbWVfY3JjX2Vycm9yX2NvdW50OworLyogMHgwMDdDIFNUUENUTCAqLworCXUzMiBzdHBfY29udHJvbDsKKy8qIDB4MDA4MCBTQVNfUENGRyAqLworCXUzMiBwaHlfY29uZmlndXJhdGlvbjsKKy8qIDB4MDA4NCBTQVNfQ0xLU00gKi8KKwl1MzIgY2xvY2tfc2tld19tYW5hZ2VtZW50OworLyogMHgwMDg4IFNBU19UWENPTVdBS0UgKi8KKwl1MzIgdHJhbnNtaXRfY29td2FrZV9zaWduYWw7CisvKiAweDAwOEMgU0FTX1RYQ09NSU5JVCAqLworCXUzMiB0cmFuc21pdF9jb21pbml0X3NpZ25hbDsKKy8qIDB4MDA5MCBTQVNfVFhDT01TQVMgKi8KKwl1MzIgdHJhbnNtaXRfY29tc2FzX3NpZ25hbDsKKy8qIDB4MDA5NCBTQVNfQ09NSU5JVCAqLworCXUzMiBjb21pbml0X2NvbnRyb2w7CisvKiAweDAwOTggU0FTX0NPTVdBS0UgKi8KKwl1MzIgY29td2FrZV9jb250cm9sOworLyogMHgwMDlDIFNBU19DT01TQVMgKi8KKwl1MzIgY29tc2FzX2NvbnRyb2w7CisvKiAweDAwQTAgU0FTX1NGRVJDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfc2hvcnRfZnJhbWVfY291bnQ7CisvKiAweDAwQTQgU0FTX0NERkVSQ05UICovCisJdTMyIHJlY2VpdmVkX2ZyYW1lX3dpdGhvdXRfY3JlZGl0X2NvdW50OworLyogMHgwMEE4IFNBU19ETkZFUkNOVCAqLworCXUzMiByZWNlaXZlZF9mcmFtZV9hZnRlcl9kb25lX2NvdW50OworLyogMHgwMEFDIFNBU19QUlNURVJDTlQgKi8KKwl1MzIgcGh5X3Jlc2V0X3Byb2JsZW1fY291bnQ7CisvKiAweDAwQjAgU0FTX0NOVENUTCAqLworCXUzMiBjb3VudGVyX2NvbnRyb2w7CisvKiAweDAwQjQgU0FTX1NTUFRPViAqLworCXUzMiBzc3BfdGltZXJfdGltZW91dF92YWx1ZXM7CisvKiAweDAwQjggRlRDVEwgKi8KKwl1MzIgZnR4X2NvbnRyb2w7CisvKiAweDAwQkMgRlJDVEwgKi8KKwl1MzIgZnJ4X2NvbnRyb2w7CisvKiAweDAwQzAgRlRXTVJLICovCisJdTMyIGZ0eF93YXRlcm1hcms7CisvKiAweDAwQzQgRU5TUElOVVAgKi8KKwl1MzIgbm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbDsKKy8qIDB4MDBDOCBTQVNfVFJOVE9WICovCisJdTMyIHNhc190cmFpbmluZ19zZXF1ZW5jZV90aW1lcl92YWx1ZXM7CisvKiAweDAwQ0MgU0FTX1BIWUNBUCAqLworCXUzMiBwaHlfY2FwYWJpbGl0aWVzOworLyogMHgwMEQwIFNBU19QSFlDVEwgKi8KKwl1MzIgcGh5X2NvbnRyb2w7CisJdTMyIHJlc2VydmVkX2Q0OworLyogMHgwMEQ4IExMQ1RMICovCisJdTMyIGxpbmtfbGF5ZXJfY29udHJvbDsKKy8qIDB4MDBEQyBBRkVfWENWUkNSICovCisJdTMyIGFmZV94Y3ZyX2NvbnRyb2w7CisvKiAweDAwRTAgQUZFX0xVVENSICovCisJdTMyIGFmZV9sb29rdXBfdGFibGVfY29udHJvbDsKKy8qIDB4MDBFNCBQU1pHQ1IgKi8KKwl1MzIgcGh5X3NvdXJjZV96b25lX2dyb3VwX2NvbnRyb2w7CisvKiAweDAwRTggU0FTX1JFQ1BIWUNBUCAqLworCXUzMiByZWNlaXZlX3BoeWNhcDsKKwl1MzIgcmVzZXJ2ZWRfZWM7CisvKiAweDAwRjAgU05BRkVSWFJTVENUTCAqLworCXUzMiBzcGVlZF9uZWdvdGlhdGlvbl9hZmVfcnhfcmVzZXRfY29udHJvbDsKKy8qIDB4MDBGNCBTQVNfU1NJUE1DVEwgKi8KKwl1MzIgcG93ZXJfbWFuYWdlbWVudF9jb250cm9sOworLyogMHgwMEY4IFNBU19QU1BSRVFfUFJJTSAqLworCXUzMiBzYXNfcG1fcGFydGlhbF9yZXF1ZXN0X3ByaW1pdGl2ZTsKKy8qIDB4MDBGQyBTQVNfUFNTUkVRX1BSSU0gKi8KKwl1MzIgc2FzX3BtX3NsdW1iZXJfcmVxdWVzdF9wcmltaXRpdmU7CisvKiAweDAxMDAgU0FTX1BQU0FDS19QUklNICovCisJdTMyIHNhc19wbV9hY2tfcHJpbWl0aXZlX3JlZ2lzdGVyOworLyogMHgwMTA0IFNBU19QU05BS19QUklNICovCisJdTMyIHNhc19wbV9uYWtfcHJpbWl0aXZlX3JlZ2lzdGVyOworLyogMHgwMTA4IFNBU19TU0lQTVRPViAqLworCXUzMiBzYXNfcHJpbWl0aXZlX3RpbWVvdXQ7CisJdTMyIHJlc2VydmVkXzEwYzsKKy8qIDB4MDExMCAtIDB4MDExQyBQTEFQUkRDVFJMeFJFRyAqLworCXUzMiBwbGFfcHJvZHVjdF9jb250cm9sWzRdOworLyogMHgwMTIwIFBMQVBSRFNVTVJFRyAqLworCXUzMiBwbGFfcHJvZHVjdF9zdW07CisvKiAweDAxMjQgUExBQ09OVFJPTFJFRyAqLworCXUzMiBwbGFfY29udHJvbDsKKy8qIFJlbWFpbmRlciBvZiBtZW1vcnkgc3BhY2UgODk2IGJ5dGVzICovCisJdTMyIHJlc2VydmVkXzAxMjhfMDM3ZlsweDk2XTsKKworfTsKKworLyoKKyAqIDB4MDBENCAvLyBTYW1lIG9mZnNldCBhcyBTQVNfVENUU1RNIFNBU19QVHhDCisgKiAgIHUzMiAgIHByaW1pdGl2ZV90cmFuc21pdF9jb250cm9sOyAqLworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0dQSU8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgU0NVX1NHUElPX09GRlNFVCAgICAgICAgIDB4MTQwMAorCisvKiAjZGVmaW5lIFNDVV9TR1BJT19PRkZTRVQgICAgICAgICAweDYwMDAgICAvLyBsYXRlciBtb3ZlcyB0byAweDE0MDAgc2VlIEhTRCA2NTI2MjUgKi8KKyNkZWZpbmUgU0NVX1NHUElPX1NHSUNSX09GRlNFVCAgIDB4MDAwMAorI2RlZmluZSBTQ1VfU0dQSU9fU0dQQlJfT0ZGU0VUICAgMHgwMDA0CisjZGVmaW5lIFNDVV9TR1BJT19TR1NETFJfT0ZGU0VUICAweDAwMDgKKyNkZWZpbmUgU0NVX1NHUElPX1NHU0RVUl9PRkZTRVQgIDB4MDAwQworI2RlZmluZSBTQ1VfU0dQSU9fU0dTSURMUl9PRkZTRVQgMHgwMDEwCisjZGVmaW5lIFNDVV9TR1BJT19TR1NJRFVSX09GRlNFVCAweDAwMTQKKyNkZWZpbmUgU0NVX1NHUElPX1NHVlNDUl9PRkZTRVQgIDB4MDAxOAorLyogQWRkcmVzcyBmcm9tIDB4MDgyMCB0byAweDA4M0MgKi8KKyNkZWZpbmUgU0NVX1NHUElPX1NHT0RTUl9PRkZTRVQgIDB4MDAyMAorCisvKioKKyAqIHN0cnVjdCBzY3Vfc2dwaW9fcmVnaXN0ZXJzIC0gU0NVIFNHUElPIFJlZ2lzdGVycworICoKKyAqCisgKi8KK3N0cnVjdCBzY3Vfc2dwaW9fcmVnaXN0ZXJzIHsKKy8qIDB4MDAwMCBTR1BJT19TR0lDUiAqLworCXUzMiBpbnRlcmZhY2VfY29udHJvbDsKKy8qIDB4MDAwNCBTR1BJT19TR1BCUiAqLworCXUzMiBibGlua19yYXRlOworLyogMHgwMDA4IFNHUElPX1NHU0RMUiAqLworCXUzMiBzdGFydF9kcml2ZV9sb3dlcjsKKy8qIDB4MDAwQyBTR1BJT19TR1NEVVIgKi8KKwl1MzIgc3RhcnRfZHJpdmVfdXBwZXI7CisvKiAweDAwMTAgU0dQSU9fU0dTSURMUiAqLworCXUzMiBzZXJpYWxfaW5wdXRfbG93ZXI7CisvKiAweDAwMTQgU0dQSU9fU0dTSURVUiAqLworCXUzMiBzZXJpYWxfaW5wdXRfdXBwZXI7CisvKiAweDAwMTggU0dQSU9fU0dWU0NSICovCisJdTMyIHZlbmRvcl9zcGVjaWZpY19jb2RlOworLyogMHgwMDIwIFNHUElPX1NHT0RTUiAqLworCXUzMiBvdXB1dF9kYXRhX3NlbGVjdFs4XTsKKy8qIFJlbWFpbmRlciBvZiBtZW1vcnkgc3BhY2UgMjU2IGJ5dGVzICovCisJdTMyIHJlc2VydmVkXzE0NDRfMTRmZlsweDMxXTsKKworfTsKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIERlZmluZXMgZm9yIFZJSVQgZW50cnkgb2Zmc2V0cworICogKiBBY2Nlc3MgYWRkaXRpb25hbCBlbnRyaWVzIGJ5IFNDVV9WSUlUX0JBU0UgKyBpbmRleCAqIDB4MTAKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICAgICBTQ1VfVklJVF9CQVNFICAgICAweDFjMDAKKworc3RydWN0IHNjdV92aWl0X3JlZ2lzdGVycyB7CisJdTMyIHJlZ2lzdGVyc1syNTZdOworfTsKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIFNDVSBQT1JUIFRBU0sgU0NIRURVTEVSIFJFR0lTVEVSUworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBTQ1VfUFRTR19CQVNFICAgICAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgU0NVX1BUU0dfUFRTR0NSX09GRlNFVCAgICAgIDB4MDAwMAorI2RlZmluZSBTQ1VfUFRTR19SVENSX09GRlNFVCAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNDVV9QVFNHX1JUQ0NSX09GRlNFVCAgICAgICAweDAwMDgKKyNkZWZpbmUgU0NVX1BUU0dfUFRTMENSX09GRlNFVCAgICAgIDB4MDAxMAorI2RlZmluZSBTQ1VfUFRTR19QVFMwU1JfT0ZGU0VUICAgICAgMHgwMDE0CisjZGVmaW5lIFNDVV9QVFNHX1BUUzFDUl9PRkZTRVQgICAgICAweDAwMTgKKyNkZWZpbmUgU0NVX1BUU0dfUFRTMVNSX09GRlNFVCAgICAgIDB4MDAxQworI2RlZmluZSBTQ1VfUFRTR19QVFMyQ1JfT0ZGU0VUICAgICAgMHgwMDIwCisjZGVmaW5lIFNDVV9QVFNHX1BUUzJTUl9PRkZTRVQgICAgICAweDAwMjQKKyNkZWZpbmUgU0NVX1BUU0dfUFRTM0NSX09GRlNFVCAgICAgIDB4MDAyOAorI2RlZmluZSBTQ1VfUFRTR19QVFMzU1JfT0ZGU0VUICAgICAgMHgwMDJDCisjZGVmaW5lIFNDVV9QVFNHX1BDU1BFMENSX09GRlNFVCAgICAweDAwMzAKKyNkZWZpbmUgU0NVX1BUU0dfUENTUEUxQ1JfT0ZGU0VUICAgIDB4MDAzNAorI2RlZmluZSBTQ1VfUFRTR19QQ1NQRTJDUl9PRkZTRVQgICAgMHgwMDM4CisjZGVmaW5lIFNDVV9QVFNHX1BDU1BFM0NSX09GRlNFVCAgICAweDAwM0MKKyNkZWZpbmUgU0NVX1BUU0dfRVRNVFNDQ1JfT0ZGU0VUICAgIDB4MDA0MAorI2RlZmluZSBTQ1VfUFRTR19FVE1STlNDQ1JfT0ZGU0VUICAgMHgwMDQ0CisKKy8qKgorICogc3RydWN0IHNjdV9wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycyAtIFRoZXNlIGFyZSB0aGUgY29udHJvbC9zdGF0cyBwYWlycworICogICAgZm9yIGVhY2ggUG9ydCBUYXNrIFNjaGVkdWxlci4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzIHsKKwl1MzIgY29udHJvbDsKKwl1MzIgc3RhdHVzOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfZ3JvdXBfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBQT1JUIFRhc2sKKyAqICAgIFNjaGVkdWxlciByZWdpc3RlcnMKKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfZ3JvdXBfcmVnaXN0ZXJzIHsKKy8qIDB4MDAwMCBQVFNHQ1IgKi8KKwl1MzIgY29udHJvbDsKKy8qIDB4MDAwNCBSVENSICovCisJdTMyIHJlYWxfdGltZV9jbG9jazsKKy8qIDB4MDAwOCBSVENDUiAqLworCXUzMiByZWFsX3RpbWVfY2xvY2tfY29udHJvbDsKKy8qIDB4MDAwQyAqLworCXUzMiByZXNlcnZlZF8wQzsKKy8qCisgKiAweDAwMTAgUFRTMENSCisgKiAweDAwMTQgUFRTMFNSCisgKiAweDAwMTggUFRTMUNSCisgKiAweDAwMUMgUFRTMVNSCisgKiAweDAwMjAgUFRTMkNSCisgKiAweDAwMjQgUFRTMlNSCisgKiAweDAwMjggUFRTM0NSCisgKiAweDAwMkMgUFRTM1NSICovCisJc3RydWN0IHNjdV9wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycyBwb3J0WzRdOworLyoKKyAqIDB4MDAzMCBQQ1NQRTBDUgorICogMHgwMDM0IFBDU1BFMUNSCisgKiAweDAwMzggUENTUEUyQ1IKKyAqIDB4MDAzQyBQQ1NQRTNDUiAqLworCXUzMiBwcm90b2NvbF9lbmdpbmVbNF07CisvKiAweDAwNDAgRVRNVFNDQ1IgKi8KKwl1MzIgdGNfc2Nhbm5pbmdfaW50ZXJ2YWxfY29udHJvbDsKKy8qIDB4MDA0NCBFVE1STlNDQ1IgKi8KKwl1MzIgcm5jX3NjYW5uaW5nX2ludGVydmFsX2NvbnRyb2w7CisvKiBSZW1haW5kZXIgb2YgbWVtb3J5IHNwYWNlIDEyOCBieXRlcyAqLworCXUzMiByZXNlcnZlZF8xMDQ4XzEwN2ZbMHgwRV07CisKK307CisKKyNkZWZpbmUgU0NVX1BUU0dfU0NVVlpFQ1JfT0ZGU0VUICAgICAgICAweDAwM0MKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIEFGRSBSRUdJU1RFUlMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9BRkVfTU1SX0JBU0UgICAgICAgICAgICAgICAgICAweEUwMDAKKworLyoKKyAqIEFGRSAwIGlzIGF0IG9mZnNldCAweDA4MDAKKyAqIEFGRSAxIGlzIGF0IG9mZnNldCAweDA5MDAKKyAqIEFGRSAyIGlzIGF0IG9mZnNldCAweDBhMDAKKyAqIEFGRSAzIGlzIGF0IG9mZnNldCAweDBiMDAgKi8KK3N0cnVjdCBzY3VfYWZlX3RyYW5zY2VpdmVyIHsKKwkvKiAweDAwMDAgQUZFX1hDVlJfQ1RSTDAgKi8KKwl1MzIgYWZlX3hjdnJfY29udHJvbDA7CisJLyogMHgwMDA0IEFGRV9YQ1ZSX0NUUkwxICovCisJdTMyIGFmZV94Y3ZyX2NvbnRyb2wxOworCS8qIDB4MDAwOCAqLworCXUzMiByZXNlcnZlZF8wMDA4OworCS8qIDB4MDAwYyBhZmVfZGZ4X3J4X2NvbnRyb2wwICovCisJdTMyIGFmZV9kZnhfcnhfY29udHJvbDA7CisJLyogMHgwMDEwIEFGRV9ERlhfUlhfQ1RSTDEgKi8KKwl1MzIgYWZlX2RmeF9yeF9jb250cm9sMTsKKwkvKiAweDAwMTQgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAxNDsKKwkvKiAweDAwMTggQUZFX0RGWF9SWF9TVFMwICovCisJdTMyIGFmZV9kZnhfcnhfc3RhdHVzMDsKKwkvKiAweDAwMWMgQUZFX0RGWF9SWF9TVFMxICovCisJdTMyIGFmZV9kZnhfcnhfc3RhdHVzMTsKKwkvKiAweDAwMjAgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAyMDsKKwkvKiAweDAwMjQgQUZFX1RYX0NUUkwgKi8KKwl1MzIgYWZlX3R4X2NvbnRyb2w7CisJLyogMHgwMDI4IEFGRV9UWF9BTVBfQ1RSTDAgKi8KKwl1MzIgYWZlX3R4X2FtcF9jb250cm9sMDsKKwkvKiAweDAwMmMgQUZFX1RYX0FNUF9DVFJMMSAqLworCXUzMiBhZmVfdHhfYW1wX2NvbnRyb2wxOworCS8qIDB4MDAzMCBBRkVfVFhfQU1QX0NUUkwyICovCisJdTMyIGFmZV90eF9hbXBfY29udHJvbDI7CisJLyogMHgwMDM0IEFGRV9UWF9BTVBfQ1RSTDMgKi8KKwl1MzIgYWZlX3R4X2FtcF9jb250cm9sMzsKKwkvKiAweDAwMzggYWZlX3R4X3NzY19jb250cm9sICovCisJdTMyIGFmZV90eF9zc2NfY29udHJvbDsKKwkvKiAweDAwM2MgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAzYzsKKwkvKiAweDAwNDAgQUZFX1JYX1NTQ19DVFJMMCAqLworCXUzMiBhZmVfcnhfc3NjX2NvbnRyb2wwOworCS8qIDB4MDA0NCBBRkVfUlhfU1NDX0NUUkwxICovCisJdTMyIGFmZV9yeF9zc2NfY29udHJvbDE7CisJLyogMHgwMDQ4IEFGRV9SWF9TU0NfQ1RSTDIgKi8KKwl1MzIgYWZlX3J4X3NzY19jb250cm9sMjsKKwkvKiAweDAwNGMgQUZFX1JYX0VRX1NUUzAgKi8KKwl1MzIgYWZlX3J4X2VxX3N0YXR1czA7CisJLyogMHgwMDUwIEFGRV9SWF9FUV9TVFMxICovCisJdTMyIGFmZV9yeF9lcV9zdGF0dXMxOworCS8qIDB4MDA1NCBBRkVfUlhfQ0RSX1NUUyAqLworCXUzMiBhZmVfcnhfY2RyX3N0YXR1czsKKwkvKiAweDAwNTggKi8KKwl1MzIgcmVzZXJ2ZWRfMDA1ODsKKwkvKiAweDAwNWMgQUZFX0NIQU5fQ1RSTCAqLworCXUzMiBhZmVfY2hhbm5lbF9jb250cm9sOworCS8qIDB4MDA2MC0weDAwNmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDA2MF8wMDZjWzB4MDRdOworCS8qIDB4MDA3MCBBRkVfWENWUl9FQ19TVFMwICovCisJdTMyIGFmZV94Y3ZyX2Vycm9yX2NhcHR1cmVfc3RhdHVzMDsKKwkvKiAweDAwNzQgQUZFX1hDVlJfRUNfU1RTMSAqLworCXUzMiBhZmVfeGN2cl9lcnJvcl9jYXB0dXJlX3N0YXR1czE7CisJLyogMHgwMDc4IEFGRV9YQ1ZSX0VDX1NUUzIgKi8KKwl1MzIgYWZlX3hjdnJfZXJyb3JfY2FwdHVyZV9zdGF0dXMyOworCS8qIDB4MDA3YyBhZmVfeGN2cl9lY19zdGF0dXMzICovCisJdTMyIGFmZV94Y3ZyX2Vycm9yX2NhcHR1cmVfc3RhdHVzMzsKKwkvKiAweDAwODAgQUZFX1hDVlJfRUNfU1RTNCAqLworCXUzMiBhZmVfeGN2cl9lcnJvcl9jYXB0dXJlX3N0YXR1czQ7CisJLyogMHgwMDg0IEFGRV9YQ1ZSX0VDX1NUUzUgKi8KKwl1MzIgYWZlX3hjdnJfZXJyb3JfY2FwdHVyZV9zdGF0dXM1OworCS8qIDB4MDA4OC0weDAwZmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDA4Y18wMGZjWzB4MWVdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X2FmZV9yZWdpc3RlcnMgLSBBRkUgUmVnc2l0ZXJzCisgKgorICoKKyAqLworLyogVWFvYSBBRkUgcmVnaXN0ZXJzICovCitzdHJ1Y3Qgc2N1X2FmZV9yZWdpc3RlcnMgeworCS8qIDBYZTAwMCBBRkVfQklBU19DVFJMICovCisJdTMyIGFmZV9iaWFzX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzAwMDQ7CisJLyogMHgwMDA4IEFGRV9QTExfQ1RSTDAgKi8KKwl1MzIgYWZlX3BsbF9jb250cm9sMDsKKwkvKiAweDAwMGMgQUZFX1BMTF9DVFJMMSAqLworCXUzMiBhZmVfcGxsX2NvbnRyb2wxOworCS8qIDB4MDAxMCBBRkVfUExMX0NUUkwyICovCisJdTMyIGFmZV9wbGxfY29udHJvbDI7CisJLyogMHgwMDE0IEFGRV9DQl9TVFMgKi8KKwl1MzIgYWZlX2NvbW1vbl9ibG9ja19zdGF0dXM7CisJLyogMHgwMDE4LTB4MDA3YyAqLworCXUzMiByZXNlcnZlZF8xOF83Y1sweDFhXTsKKwkvKiAweDAwODAgQUZFX1BNU05fTUNUUkwwICovCisJdTMyIGFmZV9wbXNuX21hc3Rlcl9jb250cm9sMDsKKwkvKiAweDAwODQgQUZFX1BNU05fTUNUUkwxICovCisJdTMyIGFmZV9wbXNuX21hc3Rlcl9jb250cm9sMTsKKwkvKiAweDAwODggQUZFX1BNU05fTUNUUkwyICovCisJdTMyIGFmZV9wbXNuX21hc3Rlcl9jb250cm9sMjsKKwkvKiAweDAwOEMtMHgwMGZjICovCisJdTMyIHJlc2VydmVkXzAwOGNfMDBmY1sweDFEXTsKKwkvKiAweDAxMDAgQUZFX0RGWF9NU1RfQ1RSTDAgKi8KKwl1MzIgYWZlX2RmeF9tYXN0ZXJfY29udHJvbDA7CisJLyogMHgwMTA0IEFGRV9ERlhfTVNUX0NUUkwxICovCisJdTMyIGFmZV9kZnhfbWFzdGVyX2NvbnRyb2wxOworCS8qIDB4MDEwOCBBRkVfREZYX0RDTF9DVFJMICovCisJdTMyIGFmZV9kZnhfZGNsX2NvbnRyb2w7CisJLyogMHgwMTBjIEFGRV9ERlhfRE1PTl9DVFJMICovCisJdTMyIGFmZV9kZnhfZGlnaXRhbF9tb25pdG9yX2NvbnRyb2w7CisJLyogMHgwMTEwIEFGRV9ERlhfQU1PTlBfQ1RSTCAqLworCXUzMiBhZmVfZGZ4X2FuYWxvZ19wX21vbml0b3JfY29udHJvbDsKKwkvKiAweDAxMTQgQUZFX0RGWF9BTU9OTl9DVFJMICovCisJdTMyIGFmZV9kZnhfYW5hbG9nX25fbW9uaXRvcl9jb250cm9sOworCS8qIDB4MDExOCBBRkVfREZYX05UTF9TVFMgKi8KKwl1MzIgYWZlX2RmeF9udGxfc3RhdHVzOworCS8qIDB4MDExYyBBRkVfREZYX0ZJRk9fU1RTMCAqLworCXUzMiBhZmVfZGZ4X2ZpZm9fc3RhdHVzMDsKKwkvKiAweDAxMjAgQUZFX0RGWF9GSUZPX1NUUzEgKi8KKwl1MzIgYWZlX2RmeF9maWZvX3N0YXR1czE7CisJLyogMHgwMTI0IEFGRV9ERlhfTVBBVF9DVFJMICovCisJdTMyIGFmZV9kZnhfbWFzdGVyX3BhdHRlcm5fY29udHJvbDsKKwkvKiAweDAxMjggQUZFX0RGWF9QMF9DVFJMICovCisJdTMyIGFmZV9kZnhfcDBfY29udHJvbDsKKwkvKiAweDAxMmMtMHgwMWE4IEFGRV9ERlhfUDBfRFJ4ICovCisJdTMyIGFmZV9kZnhfcDBfZGF0YVszMl07CisJLyogMHgwMWFjICovCisJdTMyIHJlc2VydmVkXzAxYWM7CisJLyogMHgwMWIwLTB4MDIwYyBBRkVfREZYX1AwX0lSeCAqLworCXUzMiBhZmVfZGZ4X3AwX2luc3RydWN0aW9uWzI0XTsKKwkvKiAweDAyMTAgKi8KKwl1MzIgcmVzZXJ2ZWRfMDIxMDsKKwkvKiAweDAyMTQgQUZFX0RGWF9QMV9DVFJMICovCisJdTMyIGFmZV9kZnhfcDFfY29udHJvbDsKKwkvKiAweDAyMTgtMHgyNDUgQUZFX0RGWF9QMV9EUnggKi8KKwl1MzIgYWZlX2RmeF9wMV9kYXRhWzE2XTsKKwkvKiAweDAyNTgtMHgwMjljICovCisJdTMyIHJlc2VydmVkXzAyNThfMDI5Y1sweDEyXTsKKwkvKiAweDAyYTAtMHgwMmJjIEFGRV9ERlhfUDFfSVJ4ICovCisJdTMyIGFmZV9kZnhfcDFfaW5zdHJ1Y3Rpb25bOF07CisJLyogMHgwMmMwLTB4MmZjICovCisJdTMyIHJlc2VydmVkXzAyYzBfMDJmY1sweDEwXTsKKwkvKiAweDAzMDAgQUZFX0RGWF9UWF9QTVNOX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF90eF9wbXNuX2NvbnRyb2w7CisJLyogMHgwMzA0IEFGRV9ERlhfUlhfUE1TTl9DVFJMICovCisJdTMyIGFmZV9kZnhfcnhfcG1zbl9jb250cm9sOworCXUzMiByZXNlcnZlZF8wMzA4OworCS8qIDB4MDMwYyBBRkVfREZYX05PQV9DVFJMMCAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sMDsKKwkvKiAweDAzMTAgQUZFX0RGWF9OT0FfQ1RSTDEgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDE7CisJLyogMHgwMzE0IEFGRV9ERlhfTk9BX0NUUkwyICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2wyOworCS8qIDB4MDMxOCBBRkVfREZYX05PQV9DVFJMMyAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sMzsKKwkvKiAweDAzMWMgQUZFX0RGWF9OT0FfQ1RSTDQgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDQ7CisJLyogMHgwMzIwIEFGRV9ERlhfTk9BX0NUUkw1ICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2w1OworCS8qIDB4MDMyNCBBRkVfREZYX05PQV9DVFJMNiAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sNjsKKwkvKiAweDAzMjggQUZFX0RGWF9OT0FfQ1RSTDcgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDc7CisJLyogMHgwMzJjLTB4MDdmYyAqLworCXUzMiByZXNlcnZlZF8wMzJjXzA3ZmNbMHgxMzVdOworCisJLyogMHgwODAwLTB4MGJmYyAqLworCXN0cnVjdCBzY3VfYWZlX3RyYW5zY2VpdmVyIHNjdV9hZmVfeGN2cls0XTsKKworCS8qIDB4MGMwMC0weDBmZmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMGMwMF8wZmZjWzB4MDEwMF07Cit9OworCitzdHJ1Y3Qgc2N1X3Byb3RvY29sX2VuZ2luZV9ncm91cF9yZWdpc3RlcnMgeworCXUzMiB0YWJsZVsweEUwXTsKK307CisKKworc3RydWN0IHNjdV92aWl0X2lpdCB7CisJdTMyIHRhYmxlWzI1Nl07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgWk9ORSBQYXJ0aXRpb24gVGFibGUgaW5mb3JtYXRpb24gWk9OSU5HIHdpbGwgbm90IGJlCisgKiAgICBpbmNsdWRlZCBpbiB0aGUgMS4xIHJlbGVhc2UuCisgKgorICoKKyAqLworc3RydWN0IHNjdV96b25lX3BhcnRpdGlvbl90YWJsZSB7CisJdTMyIHRhYmxlWzIwNDhdOworfTsKKworLyoqCisgKiBQbGFjZWhvbGRlciBmb3IgdGhlIENSQU0gcmVnaXN0ZXIgc2luY2UgSSBhbSBub3Qgc3VyZSBpZiB3ZSBuZWVkIHRvCisgKiAgICByZWFkL3dyaXRlIHRvIHRoZXNlIHJlZ2lzdGVycyBhcyB5ZXQuCisgKgorICoKKyAqLworc3RydWN0IHNjdV9jb21wbGV0aW9uX3JhbSB7CisJdTMyIHJhbVsxMjhdOworfTsKKworLyoqCisgKiBQbGFjZWhvbGRlciBmb3IgdGhlIEZCUkFNIHJlZ2lzdGVycyBzaW5jZSBJIGFtIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8KKyAqICAgIHJlYWQvd3JpdGUgdG8gdGhlc2UgcmVnaXN0ZXJzIGFzIHlldC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X2ZyYW1lX2J1ZmZlcl9yYW0geworCXUzMiByYW1bMTI4XTsKK307CisKKyNkZWZpbmUgc2N1X3NjcmF0Y2hfcmFtX1NJWkVfSU5fRFdPUkRTICAyNTYKKworLyoqCisgKiBQbGFjZWhvbGRlciBmb3IgdGhlIHNjcmF0Y2ggUkFNIHJlZ2lzdGVycy4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3NjcmF0Y2hfcmFtIHsKKwl1MzIgcmFtW3NjdV9zY3JhdGNoX3JhbV9TSVpFX0lOX0RXT1JEU107Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIHNpbmNlIEkgYW0gbm90IHlldCBzdXJlIHdoYXQgdGhlc2UgcmVnaXN0ZXJzIGFyZSBoZXJlIGZvci4KKyAqCisgKgorICovCitzdHJ1Y3Qgbm9hX3Byb3RvY29sX2VuZ2luZV9wYXJ0aXRpb24geworCXUzMiByZXNlcnZlZFs2NF07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIHNpbmNlIEkgYW0gbm90IHlldCBzdXJlIHdoYXQgdGhlc2UgcmVnaXN0ZXJzIGFyZSBoZXJlIGZvci4KKyAqCisgKgorICovCitzdHJ1Y3Qgbm9hX2h1Yl9wYXJ0aXRpb24geworCXUzMiByZXNlcnZlZFs2NF07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIHNpbmNlIEkgYW0gbm90IHlldCBzdXJlIHdoYXQgdGhlc2UgcmVnaXN0ZXJzIGFyZSBoZXJlIGZvci4KKyAqCisgKgorICovCitzdHJ1Y3Qgbm9hX2hvc3RfaW50ZXJmYWNlX3BhcnRpdGlvbiB7CisJdTMyIHJlc2VydmVkWzY0XTsKK307CisKKy8qKgorICogc3RydWN0IHRyYW5zcG9ydF9saW5rX2xheWVyX3BhaXIgLSBUaGUgU0NVIEhhcmR3YXJlIHBhaXJzIHVwIHRoZSBUTAorICogICAgcmVnaXN0ZXJzIHdpdGggdGhlIExMIHJlZ2lzdGVycyBzbyB3ZSBtdXN0IHBsYWNlIHRoZW0gYWRqY2VudCB0byBtYWtlIHRoZQorICogICAgYXJyYXkgb2YgcmVnaXN0ZXJzIGluIHRoZSBQRUcuCisgKgorICoKKyAqLworc3RydWN0IHRyYW5zcG9ydF9saW5rX2xheWVyX3BhaXIgeworCXN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyB0bDsKKwlzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIGxsOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgLSBTQ1UgUHJvdG9jb2wgRW5naW5lIE1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgc3BhY2UuCisgKiAgICAgVGhlc2UgcmVnaXN0ZXJzIGFyZSB1bmlxdWUgdG8gZWFjaCBwcm90b2NvbCBlbmdpbmUgZ3JvdXAuICBUaGVyZSBjYW4gYmUKKyAqICAgIGF0IG1vc3QgdHdvIFBFRyBmb3IgYSBzaW5nbGUgU0NVIHBhcnQuCisgKgorICoKKyAqLworc3RydWN0IHNjdV9wZWdfcmVnaXN0ZXJzIHsKKwlzdHJ1Y3QgdHJhbnNwb3J0X2xpbmtfbGF5ZXJfcGFpciBwZVs0XTsKKwlzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfZ3JvdXBfcmVnaXN0ZXJzIHB0c2c7CisJc3RydWN0IHNjdV9wcm90b2NvbF9lbmdpbmVfZ3JvdXBfcmVnaXN0ZXJzIHBlZzsKKwlzdHJ1Y3Qgc2N1X3NncGlvX3JlZ2lzdGVycyBzZ3BpbzsKKwl1MzIgcmVzZXJ2ZWRfMDE1MDBfMUJGRlsweDFDMF07CisJc3RydWN0IHNjdV92aWl0X2VudHJ5IHZpaXRbNjRdOworCXN0cnVjdCBzY3Vfem9uZV9wYXJ0aXRpb25fdGFibGUgenB0MDsKKwlzdHJ1Y3Qgc2N1X3pvbmVfcGFydGl0aW9uX3RhYmxlIHpwdDE7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfcmVnaXN0ZXJzIC0gU0NVIHJlZ3NpdGVycyBpbmNsdWRpbmcgYm90aCBQRUcgcmVnaXN0ZXJzIGlmIHdlIHR1cm4KKyAqICAgIG9uIHRoYXQgY29tcGlsZSBvcHRpb24uIEFsbCBvZiB0aGVzZSByZWdpc3RlcnMgYXJlIGluIHRoZSBtZW1vcnkgbWFwcGVkCisgKiAgICBzcGFjZSByZXR1cm5lZCBmcm9tIEJBUjEuCisgKgorICoKKyAqLworc3RydWN0IHNjdV9yZWdpc3RlcnMgeworCS8qIDB4MDAwMCAtIFBFRyAwICovCisJc3RydWN0IHNjdV9wZWdfcmVnaXN0ZXJzIHBlZzA7CisKKwkvKiAweDYwMDAgLSBTRE1BIGFuZCBNaXNjZWxsYW5lb3VzICovCisJc3RydWN0IHNjdV9zZG1hX3JlZ2lzdGVycyBzZG1hOworCXN0cnVjdCBzY3VfY29tcGxldGlvbl9yYW0gY3JhbTsKKwlzdHJ1Y3Qgc2N1X2ZyYW1lX2J1ZmZlcl9yYW0gZmJyYW07CisJdTMyIHJlc2VydmVkXzY4MDBfNjlGRlsweDgwXTsKKwlzdHJ1Y3Qgbm9hX3Byb3RvY29sX2VuZ2luZV9wYXJ0aXRpb24gbm9hX3BlOworCXN0cnVjdCBub2FfaHViX3BhcnRpdGlvbiBub2FfaHViOworCXN0cnVjdCBub2FfaG9zdF9pbnRlcmZhY2VfcGFydGl0aW9uIG5vYV9pZjsKKwl1MzIgcmVzZXJ2ZWRfNmQwMF83ZmZmWzB4NGMwXTsKKworCS8qIDB4ODAwMCAtIFBFRyAxICovCisJc3RydWN0IHNjdV9wZWdfcmVnaXN0ZXJzIHBlZzE7CisKKwkvKiAweEUwMDAgLSBBRkUgUmVnaXN0ZXJzICovCisJc3RydWN0IHNjdV9hZmVfcmVnaXN0ZXJzIGFmZTsKKworCS8qIDB4RjAwMCAtIHJlc2VydmVkICovCisJdTMyIHJlc2VydmVkX2YwMDBfMjExZmZmWzB4ODBjMDBdOworCisJLyogMHgyMTIwMDAgLSBzY3JhdGNoIFJBTSAqLworCXN0cnVjdCBzY3Vfc2NyYXRjaF9yYW0gc2NyYXRjaF9yYW07Cit9OworCisjZW5kaWYgICAvKiBfU0NVX1JFR0lTVEVSU19IRUFERVJfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlNjM2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYwpAQCAtMCwwICsxLDE1MDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSA8c2NzaS9zYXMuaD4KKyNpbmNsdWRlICJpc2NpLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJlbW90ZV9kZXZpY2UuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAicmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgInNjdV9ldmVudF9jb2Rlcy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaWhvc3Qgd2hlbgorICogICAgdGhlIHJlbW90ZSBkZXZpY2UgaXMgbm90IHJlYWR5LiBXZSBtYXJrIHRoZSBpc2NpIGRldmljZSBhcyByZWFkeSAobm90CisgKiAgICAicmVhZHlfZm9yX2lvIikgYW5kIHNpZ25hbCB0aGUgd2FpdGluZyBwcm9jY2Vzcy4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBpc2NpX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZW1vdGUgZGV2aWNlCisgKgorICogc2NpX2xvY2sgaXMgaGVsZCBvbiBlbnRyYW5jZSB0byB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwgdTMyIHJlYXNvbikKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2RldmljZSA9ICVwXG4iLCBfX2Z1bmNfXywgaWRldik7CisKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TVE9QX1JFUVVFU1RFRDoKKwkJc2V0X2JpdChJREVWX0dPTkUsICZpZGV2LT5mbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1NEQl9FUlJPUl9GSVNfUkVDRUlWRUQ6CisJCXNldF9iaXQoSURFVl9JT19OQ1FFUlJPUiwgJmlkZXYtPmZsYWdzKTsKKworCQkvKiBLaWxsIGFsbCBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgdGhlIGRldmljZS4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpcmVxLCAmaWRldi0+cmVxc19pbl9wcm9jZXNzLCBkZXZfbm9kZSkgeworCisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogaXNjaV9kZXZpY2UgPSAlcCByZXF1ZXN0ID0gJXBcbiIsCisJCQkJX19mdW5jX18sIGlkZXYsIGlyZXEpOworCisJCQlzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChpaG9zdCwKKwkJCQkJCQkgIGlkZXYsCisJCQkJCQkJICBpcmVxKTsKKwkJfQorCQkvKiBGYWxsIHRocm91Z2ggaW50byB0aGUgZGVmYXVsdCBjYXNlLi4uICovCisJZGVmYXVsdDoKKwkJY2xlYXJfYml0KElERVZfSU9fUkVBRFksICZpZGV2LT5mbGFncyk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHkoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpaG9zdCB3aGVuIHRoZQorICogICAgcmVtb3RlIGRldmljZSBpcyByZWFkeS4gV2UgbWFyayB0aGUgaXNjaSBkZXZpY2UgYXMgcmVhZHkgYW5kIHNpZ25hbCB0aGUKKyAqICAgIHdhaXRpbmcgcHJvY2Nlc3MuCisgKiBAaWhvc3Q6IG91ciB2YWxpZCBpc2NpX2hvc3QKKyAqIEBpZGV2OiByZW1vdGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHkoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpZGV2ID0gJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCWNsZWFyX2JpdChJREVWX0lPX05DUUVSUk9SLCAmaWRldi0+ZmxhZ3MpOworCXNldF9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElERVZfU1RBUlRfUEVORElORywgJmlkZXYtPmZsYWdzKSkKKwkJd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7Cit9CisKKy8qIGNhbGxlZCBvbmNlIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIHJlYWR5IHRvIGJlIGZyZWVkLgorICogVGhlIHJlbW90ZSBkZXZpY2UgY2FuIG5vdyByZXBvcnQgdGhhdCBpdHMgc3RvcCBvcGVyYXRpb24gaXMgY29tcGxldGUuIG5vbmUKKyAqLworc3RhdGljIHZvaWQgcm5jX2Rlc3RydWN0X2RvbmUodm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gX2RldjsKKworCUJVR19PTihpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgIT0gMCk7CisJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9ERVZfU1RPUFBFRCk7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfdGVybWluYXRlX3JlcXVlc3RzKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyAgPSBTQ0lfU1VDQ0VTUzsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX0lPX1JFUVVFU1RTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGlob3N0LT5yZXFzW2ldOworCQllbnVtIHNjaV9zdGF0dXMgczsKKworCQlpZiAoIXRlc3RfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpIHx8CisJCSAgICBpcmVxLT50YXJnZXRfZGV2aWNlICE9IGlkZXYpCisJCQljb250aW51ZTsKKworCQlzID0gc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QoaWhvc3QsIGlkZXYsIGlyZXEpOworCQlpZiAocyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXN0YXR1cyA9IHM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N0b3Aoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX0lOSVRJQUw6CisJY2FzZSBTQ0lfREVWX0ZBSUxFRDoKKwljYXNlIFNDSV9ERVZfRklOQUw6CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfREVWX1NUQVJUSU5HOgorCQkvKiBkZXZpY2Ugbm90IHN0YXJ0ZWQgc28gdGhlcmUgaGFkIGJldHRlciBiZSBubyByZXF1ZXN0cyAqLworCQlCVUdfT04oaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ICE9IDApOworCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdCgmaWRldi0+cm5jLAorCQkJCQkJICAgICAgcm5jX2Rlc3RydWN0X2RvbmUsIGlkZXYpOworCQkvKiBUcmFuc2l0aW9uIHRvIHRoZSBzdG9wcGluZyBzdGF0ZSBhbmQgd2FpdCBmb3IgdGhlCisJCSAqIHJlbW90ZSBub2RlIHRvIGNvbXBsZXRlIGJlaW5nIHBvc3RlZCBhbmQgaW52YWxpZGF0ZWQuCisJCSAqLworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfREVWX1NUT1BQSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX0RFVl9SRUFEWToKKwljYXNlIFNDSV9TVFBfREVWX0lETEU6CisJY2FzZSBTQ0lfU1RQX0RFVl9DTUQ6CisJY2FzZSBTQ0lfU1RQX0RFVl9OQ1E6CisJY2FzZSBTQ0lfU1RQX0RFVl9OQ1FfRVJST1I6CisJY2FzZSBTQ0lfU1RQX0RFVl9BV0FJVF9SRVNFVDoKKwljYXNlIFNDSV9TTVBfREVWX0lETEU6CisJY2FzZSBTQ0lfU01QX0RFVl9DTUQ6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfU1RPUFBJTkcpOworCQlpZiAoaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApIHsKKwkJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2Rlc3RydWN0KCZpZGV2LT5ybmMsCisJCQkJCQkJICAgICAgcm5jX2Rlc3RydWN0X2RvbmUsIGlkZXYpOworCQkJcmV0dXJuIFNDSV9TVUNDRVNTOworCQl9IGVsc2UKKwkJCXJldHVybiBzY2lfcmVtb3RlX2RldmljZV90ZXJtaW5hdGVfcmVxdWVzdHMoaWRldik7CisJCWJyZWFrOworCWNhc2UgU0NJX0RFVl9TVE9QUElORzoKKwkJLyogQWxsIHJlcXVlc3RzIHNob3VsZCBoYXZlIGJlZW4gdGVybWluYXRlZCwgYnV0IGlmIHRoZXJlIGlzIGFuCisJCSAqIGF0dGVtcHQgdG8gc3RvcCBhIGRldmljZSBhbHJlYWR5IGluIHRoZSBzdG9wcGluZyBzdGF0ZSwgdGhlbgorCQkgKiB0cnkgYWdhaW4gdG8gdGVybWluYXRlLgorCQkgKi8KKwkJcmV0dXJuIHNjaV9yZW1vdGVfZGV2aWNlX3Rlcm1pbmF0ZV9yZXF1ZXN0cyhpZGV2KTsKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfREVWX1NUT1BQSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX0lOSVRJQUw6CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJY2FzZSBTQ0lfREVWX1NUQVJUSU5HOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwljYXNlIFNDSV9ERVZfU1RPUFBJTkc6CisJY2FzZSBTQ0lfREVWX0ZBSUxFRDoKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfSURMRToKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfREVWX1JFU0VUVElORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9yZXNldF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpZGV2LT5zbTsKKwllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBzdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKHN0YXRlICE9IFNDSV9ERVZfUkVTRVRUSU5HKSB7CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfREVWX1JFQURZKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdXNwZW5kKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCSAgICAgICB1MzIgc3VzcGVuZF90eXBlKQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpZGV2LT5zbTsKKwllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBzdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKHN0YXRlICE9IFNDSV9TVFBfREVWX0NNRCkgeworCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJcmV0dXJuIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoJmlkZXYtPnJuYywKKwkJCQkJCSAgICBzdXNwZW5kX3R5cGUsIE5VTEwsIE5VTEwpOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJICAgICB1MzIgZnJhbWVfaW5kZXgpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfSU5JVElBTDoKKwljYXNlIFNDSV9ERVZfU1RPUFBFRDoKKwljYXNlIFNDSV9ERVZfU1RBUlRJTkc6CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9ERVZfRklOQUw6CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCS8qIFJldHVybiB0aGUgZnJhbWUgYmFjayB0byB0aGUgY29udHJvbGxlciAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX0RFVl9SRUFEWToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCWNhc2UgU0NJX0RFVl9TVE9QUElORzoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6IHsKKwkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwkJc3RydWN0IHNzcF9mcmFtZV9oZHIgaGRyOworCQl2b2lkICpmcmFtZV9oZWFkZXI7CisJCXNzaXplX3Qgd29yZF9jbnQ7CisKKwkJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgICZmcmFtZV9oZWFkZXIpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQl3b3JkX2NudCA9IHNpemVvZihoZHIpIC8gc2l6ZW9mKHUzMik7CisJCXNjaV9zd2FiMzJfY3B5KCZoZHIsIGZyYW1lX2hlYWRlciwgd29yZF9jbnQpOworCisJCWlyZXEgPSBzY2lfcmVxdWVzdF9ieV90YWcoaWhvc3QsIGJlMTZfdG9fY3B1KGhkci50YWcpKTsKKwkJaWYgKGlyZXEgJiYgaXJlcS0+dGFyZ2V0X2RldmljZSA9PSBpZGV2KSB7CisJCQkvKiBUaGUgSU8gcmVxdWVzdCBpcyBub3cgaW4gY2hhcmdlIG9mIHJlbGVhc2luZyB0aGUgZnJhbWUgKi8KKwkJCXN0YXR1cyA9IHNjaV9pb19yZXF1ZXN0X2ZyYW1lX2hhbmRsZXIoaXJlcSwgZnJhbWVfaW5kZXgpOworCQl9IGVsc2UgeworCQkJLyogV2UgY291bGQgbm90IG1hcCB0aGlzIHRhZyB0byBhIHZhbGlkIElPCisJCQkgKiByZXF1ZXN0IEp1c3QgdG9zcyB0aGUgZnJhbWUgYW5kIGNvbnRpbnVlCisJCQkgKi8KKwkJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTQ0lfU1RQX0RFVl9OQ1E6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqaGRyOworCisJCXN0YXR1cyA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICAodm9pZCAqKikmaGRyKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJaWYgKGhkci0+ZmlzX3R5cGUgPT0gRklTX1NFVERFVkJJVFMgJiYKKwkJICAgIChoZHItPnN0YXR1cyAmIEFUQV9FUlIpKSB7CisJCQlpZGV2LT5ub3RfcmVhZHlfcmVhc29uID0gU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1NEQl9FUlJPUl9GSVNfUkVDRUlWRUQ7CisKKwkJCS8qIFRPRE8gQ2hlY2sgc2FjdGl2ZSBhbmQgY29tcGxldGUgYXNzb2NpYXRlZCBJTyBpZiBhbnkuICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfU1RQX0RFVl9OQ1FfRVJST1IpOworCQl9IGVsc2UgaWYgKGhkci0+ZmlzX3R5cGUgPT0gRklTX1JFR0QySCAmJgorCQkJICAgKGhkci0+c3RhdHVzICYgQVRBX0VSUikpIHsKKwkJCS8qCisJCQkgKiBTb21lIGRldmljZXMgcmV0dXJuIEQySCBGSVMgd2hlbiBhbiBOQ1EgZXJyb3IgaXMgZGV0ZWN0ZWQuCisJCQkgKiBUcmVhdCB0aGlzIGxpa2UgYW4gU0RCIGVycm9yIEZJUyByZWFkeSByZWFzb24uCisJCQkgKi8KKwkJCWlkZXYtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfU0RCX0VSUk9SX0ZJU19SRUNFSVZFRDsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU1RQX0RFVl9OQ1FfRVJST1IpOworCQl9IGVsc2UKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFOworCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQkvKiBUaGUgZGV2aWNlIGRvZXMgbm90IHByb2Nlc3MgYW55IFVGIHJlY2VpdmVkIGZyb20gdGhlIGhhcmR3YXJlIHdoaWxlCisJCSAqIGluIHRoaXMgc3RhdGUuICBBbGwgdW5zb2xpY2l0ZWQgZnJhbWVzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGlvIHJlcXVlc3QKKwkJICogb2JqZWN0LgorCQkgKi8KKwkJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihpZGV2LT53b3JraW5nX3JlcXVlc3QsIGZyYW1lX2luZGV4KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGJvb2wgaXNfcmVtb3RlX2RldmljZV9yZWFkeShzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfSURMRToKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgICAgdTMyIGV2ZW50X2NvZGUpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN3aXRjaCAoc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpKSB7CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0M6CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWDoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYOgorCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9ldmVudF9oYW5kbGVyKCZpZGV2LT5ybmMsIGV2ZW50X2NvZGUpOworCQlicmVhazsKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1BUWF9TQ0hFRFVMRV9FVkVOVDoKKwkJaWYgKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfSVRfTkVYVVNfVElNRU9VVCkgeworCQkJc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwkJCS8qIFN1c3BlbmQgdGhlIGFzc29jaWF0ZWQgUk5DICovCisJCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdXNwZW5kKCZpZGV2LT5ybmMsCisJCQkJCQkJICAgICAgU0NJX1NPRlRXQVJFX1NVU1BFTlNJT04sCisJCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CisKKwkJCWRldl9kYmcoc2NpcmRldl90b19kZXYoaWRldiksCisJCQkJIiVzOiBkZXZpY2U6ICVwIGV2ZW50IGNvZGU6ICV4OiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgaWRldiwgZXZlbnRfY29kZSwKKwkJCQlpc19yZW1vdGVfZGV2aWNlX3JlYWR5KGlkZXYpCisJCQkJPyAiSV9UX05leHVzX1RpbWVvdXQgZXZlbnQiCisJCQkJOiAiSV9UX05leHVzX1RpbWVvdXQgZXZlbnQgaW4gd3Jvbmcgc3RhdGUiKTsKKworCQkJYnJlYWs7CisJCX0KKwkvKiBFbHNlLCBmYWxsIHRocm91Z2ggYW5kIHRyZWF0IGFzIHVuaGFuZGxlZC4uLiAqLworCWRlZmF1bHQ6CisJCWRldl9kYmcoc2NpcmRldl90b19kZXYoaWRldiksCisJCQkiJXM6IGRldmljZTogJXAgZXZlbnQgY29kZTogJXg6ICVzXG4iLAorCQkJX19mdW5jX18sIGlkZXYsIGV2ZW50X2NvZGUsCisJCQlpc19yZW1vdGVfZGV2aWNlX3JlYWR5KGlkZXYpCisJCQk/ICJ1bmV4cGVjdGVkIGV2ZW50IgorCQkJOiAidW5leHBlY3RlZCBldmVudCBpbiB3cm9uZyBzdGF0ZSIpOworCQlzdGF0dXMgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKHN0YXRlID09IFNDSV9TVFBfREVWX0lETEUpIHsKKworCQkvKiBXZSBwaWNrIHVwIHN1c3BlbnNpb24gZXZlbnRzIHRvIGhhbmRsZSBzcGVjaWZpY2FsbHkgdG8gdGhpcworCQkgKiBzdGF0ZS4gV2UgcmVzdW1lIHRoZSBSTkMgcmlnaHQgYXdheS4KKwkJICovCisJCWlmIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkgPT0gU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFggfHwKKwkJICAgIHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWF9SWCkKKwkJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZSgmaWRldi0+cm5jLCBOVUxMLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9zdGFydF9yZXF1ZXN0KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSBlbnVtIHNjaV9zdGF0dXMgc3RhdHVzKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+b3duaW5nX3BvcnQ7CisKKwkvKiBjbGVhbnVwIHJlcXVlc3RzIHRoYXQgZmFpbGVkIGFmdGVyIHN0YXJ0aW5nIG9uIHRoZSBwb3J0ICovCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJc2NpX3BvcnRfY29tcGxldGVfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCWVsc2UgeworCQlrcmVmX2dldCgmaWRldi0+a3JlZik7CisJCWlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCsrOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X2lvKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX0RFVl9JTklUSUFMOgorCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCWNhc2UgU0NJX0RFVl9TVEFSVElORzoKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9ERVZfU1RPUFBJTkc6CisJY2FzZSBTQ0lfREVWX0ZBSUxFRDoKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCQkvKiBhdHRlbXB0IHRvIHN0YXJ0IGFuIGlvIHJlcXVlc3QgZm9yIHRoaXMgZGV2aWNlIG9iamVjdC4gVGhlIHJlbW90ZQorCQkgKiBkZXZpY2Ugb2JqZWN0IHdpbGwgaXNzdWUgdGhlIHN0YXJ0IHJlcXVlc3QgZm9yIHRoZSBpbyBhbmQgaWYKKwkJICogc3VjY2Vzc2Z1bCBpdCB3aWxsIHN0YXJ0IHRoZSByZXF1ZXN0IGZvciB0aGUgcG9ydCBvYmplY3QgdGhlbgorCQkgKiBpbmNyZW1lbnQgaXRzIG93biByZXF1ZXN0IGNvdW50LgorCQkgKi8KKwkJc3RhdHVzID0gc2NpX3BvcnRfc3RhcnRfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlicmVhazsKKwljYXNlIFNDSV9TVFBfREVWX0lETEU6IHsKKwkJLyogaGFuZGxlIHRoZSBzdGFydCBpbyBvcGVyYXRpb24gZm9yIGEgc2F0YSBkZXZpY2UgdGhhdCBpcyBpbgorCQkgKiB0aGUgY29tbWFuZCBpZGxlIHN0YXRlLiAtIEV2YWx1dGUgdGhlIHR5cGUgb2YgSU8gcmVxdWVzdCB0bworCQkgKiBiZSBzdGFydGVkIC0gSWYgaXRzIGFuIE5DUSByZXF1ZXN0IGNoYW5nZSB0byBOQ1Egc3Vic3RhdGUgLQorCQkgKiBJZiBpdHMgYW55IG90aGVyIGNvbW1hbmQgY2hhbmdlIHRvIHRoZSBDTUQgc3Vic3RhdGUKKwkJICoKKwkJICogSWYgdGhpcyBpcyBhIHNvZnRyZXNldCB3ZSBtYXkgd2FudCB0byBoYXZlIGEgZGlmZmVyZW50CisJCSAqIHN1YnN0YXRlLgorCQkgKi8KKwkJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgbmV3X3N0YXRlOworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwkJc3RhdHVzID0gc2NpX3BvcnRfc3RhcnRfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EpCisJCQluZXdfc3RhdGUgPSBTQ0lfU1RQX0RFVl9OQ1E7CisJCWVsc2UgeworCQkJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gaXJlcTsKKwkJCW5ld19zdGF0ZSA9IFNDSV9TVFBfREVWX0NNRDsKKwkJfQorCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBuZXdfc3RhdGUpOworCQlicmVhazsKKwl9CisJY2FzZSBTQ0lfU1RQX0RFVl9OQ1E6IHsKKwkJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJCWlmICh0YXNrLT5hdGFfdGFzay51c2VfbmNxKSB7CisJCQlzdGF0dXMgPSBzY2lfcG9ydF9zdGFydF9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJCXJldHVybiBzdGF0dXM7CisKKwkJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKCZpZGV2LT5ybmMsIGlyZXEpOworCQkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCQlicmVhazsKKworCQkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCX0gZWxzZQorCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJCWJyZWFrOworCX0KKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRDsKKwljYXNlIFNDSV9TTVBfREVWX0lETEU6CisJCXN0YXR1cyA9IHNjaV9wb3J0X3N0YXJ0X2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfaW8oJmlkZXYtPnJuYywgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBzY2lfcmVxdWVzdF9zdGFydChpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlkZXYtPndvcmtpbmdfcmVxdWVzdCA9IGlyZXE7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU01QX0RFVl9DTUQpOworCQlicmVhazsKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwkJLyogZGV2aWNlIGlzIGFscmVhZHkgaGFuZGxpbmcgYSBjb21tYW5kIGl0IGNhbiBub3QgYWNjZXB0IG5ldyBjb21tYW5kcworCQkgKiB1bnRpbCB0aGlzIG9uZSBpcyBjb21wbGV0ZS4KKwkJICovCisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3JlcXVlc3QoaWRldiwgaXJlcSwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGNvbW1vbl9jb21wbGV0ZV9pbyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X2NvbXBsZXRlKGlyZXEpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBzY2lfcG9ydF9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCXNjaV9yZW1vdGVfZGV2aWNlX2RlY3JlbWVudF9yZXF1ZXN0X2NvdW50KGlkZXYpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9jb21wbGV0ZV9pbyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpZGV2LT5zbTsKKwllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBzdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+b3duaW5nX3BvcnQ7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfSU5JVElBTDoKKwljYXNlIFNDSV9ERVZfU1RPUFBFRDoKKwljYXNlIFNDSV9ERVZfU1RBUlRJTkc6CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJY2FzZSBTQ0lfREVWX1JFU0VUVElORzoKKwkJc3RhdHVzID0gY29tbW9uX2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lfU1RQX0RFVl9DTUQ6CisJY2FzZSBTQ0lfU1RQX0RFVl9OQ1E6CisJY2FzZSBTQ0lfU1RQX0RFVl9OQ1FfRVJST1I6CisJCXN0YXR1cyA9IGNvbW1vbl9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoaXJlcS0+c2NpX3N0YXR1cyA9PSBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEKSB7CisJCQkvKiBUaGlzIHJlcXVlc3QgY2F1c2VzIGhhcmR3YXJlIGVycm9yLCBkZXZpY2UgbmVlZHMgdG8gYmUgTHVuIFJlc2V0LgorCQkJICogU28gaGVyZSB3ZSBmb3JjZSB0aGUgc3RhdGUgbWFjaGluZSB0byBJRExFIHN0YXRlIHNvIHRoZSByZXN0IElPcworCQkJICogY2FuIHJlYWNoIFJOQyBzdGF0ZSBoYW5kbGVyLCB0aGVzZSBJT3Mgd2lsbCBiZSBjb21wbGV0ZWQgYnkgUk5DIHdpdGgKKwkJCSAqIHN0YXR1cyBvZiAiREVWSUNFX1JFU0VUX1JFUVVJUkVEIiwgaW5zdGVhZCBvZiAiSU5WQUxJRCBTVEFURSIuCisJCQkgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUKTsKKwkJfSBlbHNlIGlmIChpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPT0gMCkKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9TVFBfREVWX0lETEUpOworCQlicmVhazsKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwkJc3RhdHVzID0gY29tbW9uX2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfU01QX0RFVl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lfREVWX1NUT1BQSU5HOgorCQlzdGF0dXMgPSBjb21tb25fY29tcGxldGVfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWYgKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwKQorCQkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdHJ1Y3QoJmlkZXYtPnJuYywKKwkJCQkJCQkgcm5jX2Rlc3RydWN0X2RvbmUsCisJCQkJCQkJIGlkZXYpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlkZXZfZXJyKHNjaXJkZXZfdG9fZGV2KGlkZXYpLAorCQkJIiVzOiBQb3J0OjB4JXAgRGV2aWNlOjB4JXAgUmVxdWVzdDoweCVwIFN0YXR1czoweCV4ICIKKwkJCSJjb3VsZCBub3QgY29tcGxldGVcbiIsIF9fZnVuY19fLCBpcG9ydCwKKwkJCWlkZXYsIGlyZXEsIHN0YXR1cyk7CisJZWxzZQorCQlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9jb250aW51ZV9yZXF1ZXN0KHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gZGV2OworCisJLyogd2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIHJlcXVlc3QgaXMgc3RpbGwgdmFsaWQgdG8gY29udGludWUuICovCisJaWYgKGlkZXYtPndvcmtpbmdfcmVxdWVzdCkKKwkJc2NpX2NvbnRyb2xsZXJfY29udGludWVfaW8oaWRldi0+d29ya2luZ19yZXF1ZXN0KTsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3Rhc2soc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX0RFVl9JTklUSUFMOgorCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCWNhc2UgU0NJX0RFVl9TVEFSVElORzoKKwljYXNlIFNDSV9TTVBfREVWX0lETEU6CisJY2FzZSBTQ0lfU01QX0RFVl9DTUQ6CisJY2FzZSBTQ0lfREVWX1NUT1BQSU5HOgorCWNhc2UgU0NJX0RFVl9GQUlMRUQ6CisJY2FzZSBTQ0lfREVWX1JFU0VUVElORzoKKwljYXNlIFNDSV9ERVZfRklOQUw6CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX1NUUF9ERVZfSURMRToKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9zdGFydF9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X3Rhc2soJmlkZXYtPnJuYywgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlnb3RvIG91dDsKKworCQlzdGF0dXMgPSBzY2lfcmVxdWVzdF9zdGFydChpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWdvdG8gb3V0OworCisJCS8qIE5vdGU6IElmIHRoZSByZW1vdGUgZGV2aWNlIHN0YXRlIGlzIG5vdCBJRExFIHRoaXMgd2lsbAorCQkgKiByZXBsYWNlIHRoZSByZXF1ZXN0IHRoYXQgcHJvYmFibHkgcmVzdWx0ZWQgaW4gdGhlIHRhc2sKKwkJICogbWFuYWdlbWVudCByZXF1ZXN0LgorCQkgKi8KKwkJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gaXJlcTsKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1NUUF9ERVZfQ01EKTsKKworCQkvKiBUaGUgcmVtb3RlIG5vZGUgY29udGV4dCBtdXN0IGNsZWFudXAgdGhlIFRDaSB0byBOQ1EgbWFwcGluZworCQkgKiB0YWJsZS4gIFRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGNvcnJlY3RseSBpcyB0byBlaXRoZXIgd3JpdGUKKwkJICogdG8gdGhlIFRMQ1IgcmVnaXN0ZXIgb3IgdG8gaW52YWxpZGF0ZSBhbmQgcmVwb3N0IHRoZSBSTkMuIEluCisJCSAqIGVpdGhlciBjYXNlIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHN0YXRlIG1hY2hpbmUgd2lsbCB0YWtlCisJCSAqIHRoZSBjb3JyZWN0IGFjdGlvbiB3aGVuIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIHN1c3BlbmRlZAorCQkgKiBhbmQgbGF0ZXIgcmVzdW1lZC4KKwkJICovCisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoJmlkZXYtPnJuYywKKwkJCQlTQ0lfU09GVFdBUkVfU1VTUEVOU0lPTiwgTlVMTCwgTlVMTCk7CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZSgmaWRldi0+cm5jLAorCQkJCXNjaV9yZW1vdGVfZGV2aWNlX2NvbnRpbnVlX3JlcXVlc3QsCisJCQkJCQkgICAgaWRldik7CisKKwlvdXQ6CisJCXNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3JlcXVlc3QoaWRldiwgaXJlcSwgc3RhdHVzKTsKKwkJLyogV2UgbmVlZCB0byBsZXQgdGhlIGNvbnRyb2xsZXIgc3RhcnQgcmVxdWVzdCBoYW5kbGVyIGtub3cgdGhhdAorCQkgKiBpdCBjYW4ndCBwb3N0IFRDIHlldC4gV2Ugd2lsbCBwcm92aWRlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8KKwkJICogcG9zdCBUQyB3aGVuIFJOQyBnZXRzIHJlc3VtZWQuCisJCSAqLworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfUkVTRVRfREVWSUNFX1BBUlRJQUxfU1VDQ0VTUzsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJCXN0YXR1cyA9IHNjaV9wb3J0X3N0YXJ0X2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfdGFzaygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlicmVhazsKKwl9CisJc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfcmVxdWVzdChpZGV2LCBpcmVxLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBzY2lfcmVtb3RlX2RldmljZV9wb3N0X3JlcXVlc3Qoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwgdTMyIHJlcXVlc3QpCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKwl1MzIgY29udGV4dDsKKworCWNvbnRleHQgPSByZXF1ZXN0IHwKKwkJICAoSVNDSV9QRUcgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQpIHwKKwkJICAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQpIHwKKwkJICBpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXg7CisKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaXBvcnQtPm93bmluZ19jb250cm9sbGVyLCBjb250ZXh0KTsKK30KKworLyogY2FsbGVkIG9uY2UgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaGFzIHRyYW5zaXNpdGlvbmVkIHRvIGEKKyAqIHJlYWR5IHN0YXRlLiAgVGhpcyBpcyB0aGUgaW5kaWNhdGlvbiB0aGF0IHRoZSByZW1vdGUgZGV2aWNlIG9iamVjdCBjYW4gYWxzbworICogdHJhbnNpdGlvbiB0byByZWFkeS4KKyAqLworc3RhdGljIHZvaWQgcmVtb3RlX2RldmljZV9yZXN1bWVfZG9uZSh2b2lkICpfZGV2KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBfZGV2OworCisJaWYgKGlzX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWRldikpCisJCXJldHVybjsKKworCS8qIGdvICdyZWFkeScgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IGluIGEgcmVhZHkgc3RhdGUgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX0RFVl9SRUFEWSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9pZGxlX3N1YnN0YXRlX3Jlc3VtZV9jb21wbGV0ZV9oYW5kbGVyKHZvaWQgKl9kZXYpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IF9kZXY7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKiBGb3IgTkNRIG9wZXJhdGlvbiB3ZSBkbyBub3QgaXNzdWUgYSBpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KCkuCisJICogQXMgYSByZXN1bHQsIGF2b2lkIHNlbmRpbmcgdGhlIHJlYWR5IG5vdGlmaWNhdGlvbi4KKwkgKi8KKwlpZiAoaWRldi0+c20ucHJldmlvdXNfc3RhdGVfaWQgIT0gU0NJX1NUUF9ERVZfTkNRKQorCQlpc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWhvc3QsIGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9pbml0aWFsX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisKKwkvKiBJbml0aWFsIHN0YXRlIGlzIGEgdHJhbnNpdGlvbmFsIHN0YXRlIHRvIHRoZSBzdG9wcGVkIHN0YXRlICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9ERVZfU1RPUFBFRCk7Cit9CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2VfZGVzdHJ1Y3QoKSAtIGZyZWUgcmVtb3RlIG5vZGUgY29udGV4dCBhbmQgZGVzdHJ1Y3QKKyAqIEByZW1vdGVfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlbW90ZSBkZXZpY2UgdG8gYmUgZGVzdHJ1Y3RlZC4KKyAqCisgKiBSZW1vdGUgZGV2aWNlIG9iamVjdHMgYXJlIGEgbGltaXRlZCByZXNvdXJjZS4gIEFzIHN1Y2gsIHRoZXkgbXVzdCBiZQorICogcHJvdGVjdGVkLiAgVGh1cyBjYWxscyB0byBjb25zdHJ1Y3QgYW5kIGRlc3RydWN0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kCisgKiBub24tcmVlbnRyYW50LiBUaGUgcmV0dXJuIHZhbHVlIHNoYWxsIGluZGljYXRlIGlmIHRoZSBkZXZpY2Ugd2FzCisgKiBzdWNjZXNzZnVsbHkgZGVzdHJ1Y3RlZCBvciBpZiBzb21lIGZhaWx1cmUgb2NjdXJyZWQuIGVudW0gc2NpX3N0YXR1cyBUaGlzIHZhbHVlCisgKiBpcyByZXR1cm5lZCBpZiB0aGUgZGV2aWNlIGlzIHN1Y2Nlc3NmdWxseSBkZXN0cnVjdGVkLgorICogU0NJX0ZBSUxVUkVfSU5WQUxJRF9SRU1PVEVfREVWSUNFIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIHN1cHBsaWVkCisgKiBkZXZpY2UgaXNuJ3QgdmFsaWQgKGUuZy4gaXQncyBhbHJlYWR5IGJlZW4gZGVzdG9yeWVkLCB0aGUgaGFuZGxlIGlzbid0CisgKiB2YWxpZCwgZXRjLikuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZGVzdHJ1Y3Qoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdDsKKworCWlmIChzdGF0ZSAhPSBTQ0lfREVWX1NUT1BQRUQpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCWlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCXNjaV9jb250cm9sbGVyX2ZyZWVfcmVtb3RlX25vZGVfY29udGV4dChpaG9zdCwgaWRldiwKKwkJCQkJCSAgICAgaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4KTsKKwlpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXggPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVg7CisJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX0RFVl9GSU5BTCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaXNjaV9yZW1vdGVfZGV2aWNlX2RlY29uc3RydWN0KCkgLSBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFuIGlzY2lfcmVtb3RlX2RldmljZS4KKyAqIEBpaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpc2NpIGhvc3Qgb2JqZWN0LgorICogQGlkZXY6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVtb3RlIGRldmljZSB0byBiZSBmcmVlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9kZWNvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCS8qIFRoZXJlIHNob3VsZCBub3QgYmUgYW55IG91dHN0YW5kaW5nIGlvJ3MuIEFsbCBwYXRocyB0bworCSAqIGhlcmUgc2hvdWxkIGdvIHRocm91Z2ggaXNjaV9yZW1vdGVfZGV2aWNlX251a2VfcmVxdWVzdHMuCisJICogSWYgd2UgaGl0IHRoaXMgY29uZGl0aW9uLCB3ZSB3aWxsIG5lZWQgYSB3YXkgdG8gY29tcGxldGUKKwkgKiBpbyByZXF1ZXN0cyBpbiBwcm9jZXNzICovCisJQlVHX09OKCFsaXN0X2VtcHR5KCZpZGV2LT5yZXFzX2luX3Byb2Nlc3MpKTsKKworCXNjaV9yZW1vdGVfZGV2aWNlX2Rlc3RydWN0KGlkZXYpOworCWxpc3RfZGVsX2luaXQoJmlkZXYtPm5vZGUpOworCWlzY2lfcHV0X2RldmljZShpZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcHBlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCXUzMiBwcmV2X3N0YXRlOworCisJLyogSWYgd2UgYXJlIGVudGVyaW5nIGZyb20gdGhlIHN0b3BwaW5nIHN0YXRlIGxldCB0aGUgU0NJIFVzZXIga25vdyB0aGF0CisJICogdGhlIHN0b3Agb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisJICovCisJcHJldl9zdGF0ZSA9IGlkZXYtPnNtLnByZXZpb3VzX3N0YXRlX2lkOworCWlmIChwcmV2X3N0YXRlID09IFNDSV9ERVZfU1RPUFBJTkcpCisJCWlzY2lfcmVtb3RlX2RldmljZV9kZWNvbnN0cnVjdChpaG9zdCwgaWRldik7CisKKwlzY2lfY29udHJvbGxlcl9yZW1vdGVfZGV2aWNlX3N0b3BwZWQoaWhvc3QsIGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9zdGFydGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJaXNjaV9yZW1vdGVfZGV2aWNlX25vdF9yZWFkeShpaG9zdCwgaWRldiwKKwkJCQkgICAgIFNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU1RBUlRfUkVRVUVTVEVEKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHlfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TQVRBKSkgeworCQlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX1NUUF9ERVZfSURMRSk7CisJfSBlbHNlIGlmIChkZXZfaXNfZXhwYW5kZXIoZGV2KSkgeworCQlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX1NNUF9ERVZfSURMRSk7CisJfSBlbHNlCisJCWlzY2lfcmVtb3RlX2RldmljZV9yZWFkeShpaG9zdCwgaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3JlYWR5X3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKSB7CisJCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJCWlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoaWhvc3QsIGlkZXYsCisJCQkJCSAgICAgU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TVE9QX1JFUVVFU1RFRCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9yZXNldHRpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKworCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoCisJCSZpZGV2LT5ybmMsIFNDSV9TT0ZUV0FSRV9TVVNQRU5TSU9OLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXR0aW5nX3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKworCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZSgmaWRldi0+cm5jLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKworCWlkZXYtPndvcmtpbmdfcmVxdWVzdCA9IE5VTEw7CisJaWYgKHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2lzX3JlYWR5KCZpZGV2LT5ybmMpKSB7CisJCS8qCisJCSAqIFNpbmNlIHRoZSBSTkMgaXMgcmVhZHksIGl0J3MgYWxyaWdodCB0byBmaW5pc2ggY29tcGxldGlvbgorCQkgKiBwcm9jZXNzaW5nIChlLmcuIHNpZ25hbCB0aGUgcmVtb3RlIGRldmljZSBpcyByZWFkeSkuICovCisJCXNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9pZGxlX3N1YnN0YXRlX3Jlc3VtZV9jb21wbGV0ZV9oYW5kbGVyKGlkZXYpOworCX0gZWxzZSB7CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZSgmaWRldi0+cm5jLAorCQkJc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfcmVzdW1lX2NvbXBsZXRlX2hhbmRsZXIsCisJCQlpZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9jbWRfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCUJVR19PTihpZGV2LT53b3JraW5nX3JlcXVlc3QgPT0gTlVMTCk7CisKKwlpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KGlob3N0LCBpZGV2LAorCQkJCSAgICAgU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1JFUVVFU1RfU1RBUlRFRCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9uY3FfZXJyb3Jfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlmIChpZGV2LT5ub3RfcmVhZHlfcmVhc29uID09IFNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU0FUQV9TREJfRVJST1JfRklTX1JFQ0VJVkVEKQorCQlpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KGlob3N0LCBpZGV2LAorCQkJCQkgICAgIGlkZXYtPm5vdF9yZWFkeV9yZWFzb24pOworfQorCitzdGF0aWMgdm9pZCBzY2lfc21wX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJaXNjaV9yZW1vdGVfZGV2aWNlX3JlYWR5KGlob3N0LCBpZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJQlVHX09OKGlkZXYtPndvcmtpbmdfcmVxdWVzdCA9PSBOVUxMKTsKKworCWlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoaWhvc3QsIGlkZXYsCisJCQkJICAgICBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NNUF9SRVFVRVNUX1NUQVJURUQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfc21wX3JlbW90ZV9kZXZpY2VfcmVhZHlfY21kX3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKworCWlkZXYtPndvcmtpbmdfcmVxdWVzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVfdGFibGVbXSA9IHsKKwlbU0NJX0RFVl9JTklUSUFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9kZXZpY2VfaW5pdGlhbF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfREVWX1NUT1BQRURdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX2RldmljZV9zdG9wcGVkX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9ERVZfU1RBUlRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX2RldmljZV9zdGFydGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfREVWX1JFQURZXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHlfc3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9yZW1vdGVfZGV2aWNlX3JlYWR5X3N0YXRlX2V4aXQKKwl9LAorCVtTQ0lfU1RQX0RFVl9JRExFXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1NUUF9ERVZfQ01EXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfU1RQX0RFVl9OQ1FdID0geyB9LAorCVtTQ0lfU1RQX0RFVl9OQ1FfRVJST1JdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfbmNxX2Vycm9yX3N1YnN0YXRlX2VudGVyLAorCX0sCisJW1NDSV9TVFBfREVWX0FXQUlUX1JFU0VUXSA9IHsgfSwKKwlbU0NJX1NNUF9ERVZfSURMRV0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9pZGxlX3N1YnN0YXRlX2VudGVyLAorCX0sCisJW1NDSV9TTVBfREVWX0NNRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9jbWRfc3Vic3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9jbWRfc3Vic3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lfREVWX1NUT1BQSU5HXSA9IHsgfSwKKwlbU0NJX0RFVl9GQUlMRURdID0geyB9LAorCVtTQ0lfREVWX1JFU0VUVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0dGluZ19zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXR0aW5nX3N0YXRlX2V4aXQKKwl9LAorCVtTQ0lfREVWX0ZJTkFMXSA9IHsgfSwKK307CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2VfY29uc3RydWN0KCkgLSBjb21tb24gY29uc3RydWN0aW9uCisgKiBAc2NpX3BvcnQ6IFNBUy9TQVRBIHBvcnQgdGhyb3VnaCB3aGljaCB0aGlzIGRldmljZSBpcyBhY2Nlc3NlZC4KKyAqIEBzY2lfZGV2OiByZW1vdGUgZGV2aWNlIHRvIGNvbnN0cnVjdAorICoKKyAqIFRoaXMgcm91dGluZSBqdXN0IHBlcmZvcm1zIGJlbmlnbiBpbml0aWFsaXphdGlvbiBhbmQgZG9lcyBub3QKKyAqIGFsbG9jYXRlIHRoZSByZW1vdGVfbm9kZV9jb250ZXh0IHdoaWNoIGlzIGxlZnQgdG8KKyAqIHNjaV9yZW1vdGVfZGV2aWNlX1tkZV1hX2NvbnN0cnVjdCgpLiAgc2NpX3JlbW90ZV9kZXZpY2VfZGVzdHJ1Y3QoKQorICogZnJlZXMgdGhlIHJlbW90ZV9ub2RlX2NvbnRleHQocykgZm9yIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJaWRldi0+b3duaW5nX3BvcnQgPSBpcG9ydDsKKwlpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPSAwOworCisJc2NpX2luaXRfc20oJmlkZXYtPnNtLCBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZV90YWJsZSwgU0NJX0RFVl9JTklUSUFMKTsKKworCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnN0cnVjdCgmaWRldi0+cm5jLAorCQkJCQkgICAgICAgU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYKTsKK30KKworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9kYV9jb25zdHJ1Y3QoKSAtIGNvbnN0cnVjdCBkaXJlY3QgYXR0YWNoZWQgZGV2aWNlLgorICoKKyAqIFRoZSBpbmZvcm1hdGlvbiAoZS5nLiBJQUYsIFNpZ25hdHVyZSBGSVMsIGV0Yy4pIG5lY2Vzc2FyeSB0byBidWlsZAorICogdGhlIGRldmljZSBpcyBrbm93biB0byB0aGUgU0NJIENvcmUgc2luY2UgaXQgaXMgY29udGFpbmVkIGluIHRoZQorICogc2NpX3BoeSBvYmplY3QuICBSZW1vdGUgbm9kZSBjb250ZXh0KHMpIGlzL2FyZSBhIGdsb2JhbCByZXNvdXJjZQorICogYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSwgZnJlZWQgYnkgc2NpX3JlbW90ZV9kZXZpY2VfZGVzdHJ1Y3QoKS4KKyAqCisgKiBSZXR1cm5zOgorICogU0NJX0ZBSUxVUkVfREVWSUNFX0VYSVNUUyAtIGRldmljZSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN0cnVjdGVkLgorICogU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wgLSBlLmcuIHNhcyBkZXZpY2UgYXR0YWNoZWQgdG8KKyAqIHNhdGEtb25seSBjb250cm9sbGVyIGluc3RhbmNlLgorICogU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyAtIHJlbW90ZSBub2RlIGNvbnRleHRzIGV4aGF1c3RlZC4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9kYV9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJc2NpX3JlbW90ZV9kZXZpY2VfY29uc3RydWN0KGlwb3J0LCBpZGV2KTsKKworCS8qCisJICogVGhpcyBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0IHRvIGRldGVybWluZSBob3cgbWFueSByZW1vdGUgbm9kZSBjb250ZXh0CisJICogZW50cmllcyB3aWxsIGJlIG5lZWRlZCB0byBzdG9yZSB0aGUgcmVtb3RlIG5vZGUuCisJICovCisJaWRldi0+aXNfZGlyZWN0X2F0dGFjaGVkID0gdHJ1ZTsKKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9hbGxvY2F0ZV9yZW1vdGVfbm9kZV9jb250ZXh0KGlwb3J0LT5vd25pbmdfY29udHJvbGxlciwKKwkJCQkJCQkJICBpZGV2LAorCQkJCQkJCQkgICZpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXgpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWIHx8IGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwKKwkgICAgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkgfHwgZGV2X2lzX2V4cGFuZGVyKGRldikpCisJCS8qIHBhc3MgKi87CisJZWxzZQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0w7CisKKwlpZGV2LT5jb25uZWN0aW9uX3JhdGUgPSBzY2lfcG9ydF9nZXRfbWF4X2FsbG93ZWRfc3BlZWQoaXBvcnQpOworCisJLyogLyBAdG9kbyBTaG91bGQgSSBhc3NpZ24gdGhlIHBvcnQgd2lkdGggYnkgcmVhZGluZyBhbGwgb2YgdGhlIHBoeXMgb24gdGhlIHBvcnQ/ICovCisJaWRldi0+ZGV2aWNlX3BvcnRfd2lkdGggPSAxOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX2VhX2NvbnN0cnVjdCgpIC0gY29uc3RydWN0IGV4cGFuZGVyIGF0dGFjaGVkIGRldmljZQorICoKKyAqIFJlbW90ZSBub2RlIGNvbnRleHQocykgaXMvYXJlIGEgZ2xvYmFsIHJlc291cmNlIGFsbG9jYXRlZCBieSB0aGlzCisgKiByb3V0aW5lLCBmcmVlZCBieSBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpLgorICoKKyAqIFJldHVybnM6CisgKiBTQ0lfRkFJTFVSRV9ERVZJQ0VfRVhJU1RTIC0gZGV2aWNlIGhhcyBhbHJlYWR5IGJlZW4gY29uc3RydWN0ZWQuCisgKiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCAtIGUuZy4gc2FzIGRldmljZSBhdHRhY2hlZCB0bworICogc2F0YS1vbmx5IGNvbnRyb2xsZXIgaW5zdGFuY2UuCisgKiBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIC0gcmVtb3RlIG5vZGUgY29udGV4dHMgZXhoYXVzdGVkLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2VhX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3QoaXBvcnQsIGlkZXYpOworCisJc3RhdHVzID0gc2NpX2NvbnRyb2xsZXJfYWxsb2NhdGVfcmVtb3RlX25vZGVfY29udGV4dChpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIsCisJCQkJCQkJCSAgaWRldiwKKwkJCQkJCQkJICAmaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4KTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYgfHwgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fAorCSAgICAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSB8fCBkZXZfaXNfZXhwYW5kZXIoZGV2KSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKworCS8qCisJICogRm9yIFNBUy0yIHRoZSBwaHlzaWNhbCBsaW5rIHJhdGUgaXMgYWN0dWFsbHkgYSBsb2dpY2FsIGxpbmsKKwkgKiByYXRlIHRoYXQgaW5jb3Jwb3JhdGVzIG11bHRpcGxleGluZy4gIFRoZSBTQ1UgZG9lc24ndAorCSAqIGluY29ycG9yYXRlIG11bHRpcGxleGluZyBhbmQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUKKwkgKiBjb25uZWN0aW9uIHRoZSBsb2dpY2FsIGxpbmsgcmF0ZSBpcyB0aGF0IHNhbWUgYXMgdGhlCisJICogcGh5c2ljYWwuICBGdXJ0aGVybW9yZSwgdGhlIFNBUy0yIGFuZCBTQVMtMS4xIGZpZWxkcyBvdmVybGF5CisJICogb25lIGFub3RoZXIsIHNvIHRoaXMgY29kZSB3b3JrcyBmb3IgYm90aCBzaXR1YXRpb25zLiAqLworCWlkZXYtPmNvbm5lY3Rpb25fcmF0ZSA9IG1pbl90KHUxNiwgc2NpX3BvcnRfZ2V0X21heF9hbGxvd2VkX3NwZWVkKGlwb3J0KSwKKwkJCQkJIGRldi0+bGlua3JhdGUpOworCisJLyogLyBAdG9kbyBTaG91bGQgSSBhc3NpZ24gdGhlIHBvcnQgd2lkdGggYnkgcmVhZGluZyBhbGwgb2YgdGhlIHBoeXMgb24gdGhlIHBvcnQ/ICovCisJaWRldi0+ZGV2aWNlX3BvcnRfd2lkdGggPSAxOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0KCkgLSBUaGlzIG1ldGhvZCB3aWxsIHN0YXJ0IHRoZSBzdXBwbGllZCByZW1vdGUKKyAqICAgIGRldmljZS4gIFRoaXMgbWV0aG9kIGVuYWJsZXMgbm9ybWFsIElPIHJlcXVlc3RzIHRvIGZsb3cgdGhyb3VnaCB0byB0aGUKKyAqICAgIHJlbW90ZSBkZXZpY2UuCisgKiBAcmVtb3RlX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdG8gYmUgc3RhcnRlZC4KKyAqIEB0aW1lb3V0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggdGhlCisgKiAgICBzdGFydCBvcGVyYXRpb24gc2hvdWxkIGNvbXBsZXRlLgorICoKKyAqIEFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgZGV2aWNlIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZC4gU0NJX1NVQ0NFU1MKKyAqIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSB3YXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgKiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BIWSBUaGlzIHZhbHVlIGlzIHJldHVybmVkIGlmIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHN0YXJ0CisgKiB0aGUgZGV2aWNlIHdoZW4gdGhlcmUgaGF2ZSBiZWVuIG5vIHBoeXMgYWRkZWQgdG8gaXQuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnQoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCXUzMiB0aW1lb3V0KQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpZGV2LT5zbTsKKwllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBzdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlpZiAoc3RhdGUgIT0gU0NJX0RFVl9TVE9QUEVEKSB7CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoJmlkZXYtPnJuYywKKwkJCQkJCSAgICAgcmVtb3RlX2RldmljZV9yZXN1bWVfZG9uZSwKKwkJCQkJCSAgICAgaWRldik7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfU1RBUlRJTkcpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGlzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCQkgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5pc2NpX2hvc3Q7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChkZXYtPnBhcmVudCAmJiBkZXZfaXNfZXhwYW5kZXIoZGV2LT5wYXJlbnQpKQorCQlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9lYV9jb25zdHJ1Y3QoaXBvcnQsIGlkZXYpOworCWVsc2UKKwkJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2VfZGFfY29uc3RydWN0KGlwb3J0LCBpZGV2KTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBjb25zdHJ1Y3QgZmFpbGVkOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogc3RhcnQgdGhlIGRldmljZS4gKi8KKwlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9zdGFydChpZGV2LCBJU0NJX1JFTU9URV9ERVZJQ0VfU1RBUlRfVElNRU9VVCk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgInJlbW90ZSBkZXZpY2Ugc3RhcnQgZmFpbGVkOiAlZFxuIiwKKwkJCSBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhhYm9ydGVkX3Rhc2tfY29tcGxldGlvbik7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlkZXYgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJLyogQ2xlYW51cCBhbGwgcmVxdWVzdHMgcGVuZGluZyBmb3IgdGhpcyBkZXZpY2UuICovCisJaXNjaV90ZXJtaW5hdGVfcGVuZGluZ19yZXF1ZXN0cyhpaG9zdCwgaWRldik7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlkZXYgPSAlcCwgZG9uZVxuIiwgX19mdW5jX18sIGlkZXYpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBpc2NpX3JlbW90ZV9kZXZpY2Ugd2hlbiBhIGxpYnNhcyBkZXZfZm91bmQgbWVzc2FnZQorICogICAgaXMgcmVjZWl2ZWQuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAcG9ydDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpc2NpX3BvcnQgY29uZWN0ZWQgdG8gdGhpcyBkZXZpY2UuCisgKgorICogcG9pbnRlciB0byBuZXcgaXNjaV9yZW1vdGVfZGV2aWNlLgorICovCitzdGF0aWMgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqCitpc2NpX3JlbW90ZV9kZXZpY2VfYWxsb2Moc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9SRU1PVEVfREVWSUNFUzsgaSsrKSB7CisJCWlkZXYgPSAmaWhvc3QtPmRldmljZXNbaV07CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChJREVWX0FMTE9DQVRFRCwgJmlkZXYtPmZsYWdzKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IFNDSV9NQVhfUkVNT1RFX0RFVklDRVMpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChXQVJOX09OQ0UoIWxpc3RfZW1wdHkoJmlkZXYtPnJlcXNfaW5fcHJvY2VzcyksICJmb3VuZCByZXF1ZXN0cyBpbiBwcm9jZXNzXG4iKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoV0FSTl9PTkNFKCFsaXN0X2VtcHR5KCZpZGV2LT5ub2RlKSwgImZvdW5kIG5vbi1pZGxlIHJlbW90ZSBkZXZpY2VcbiIpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpZGV2OworfQorCit2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgdHlwZW9mKCppZGV2KSwga3JlZik7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5pc2NpX3BvcnQtPmlzY2lfaG9zdDsKKworCWlkZXYtPmRvbWFpbl9kZXYgPSBOVUxMOworCWlkZXYtPmlzY2lfcG9ydCA9IE5VTEw7CisJY2xlYXJfYml0KElERVZfU1RBUlRfUEVORElORywgJmlkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoSURFVl9TVE9QX1BFTkRJTkcsICZpZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KElERVZfSU9fUkVBRFksICZpZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KElERVZfR09ORSwgJmlkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoSURFVl9FSCwgJmlkZXYtPmZsYWdzKTsKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoSURFVl9BTExPQ0FURUQsICZpZGV2LT5mbGFncyk7CisJd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7Cit9CisKKy8qKgorICogaXNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGludGVybmFsbHkgdG8gc3RvcCB0aGUKKyAqICAgIHJlbW90ZSBkZXZpY2UuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAaXNjaV9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVtb3RlIGRldmljZS4KKyAqCisgKiBUaGUgc3RhdHVzIG9mIHRoZSBpaG9zdCByZXF1ZXN0IHRvIHN0b3AuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBpc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJaWRldi0+ZG9tYWluX2Rldi0+bGxkZF9kZXYgPSBOVUxMOyAvKiBkaXNhYmxlIG5ldyBsb29rdXBzICovCisJc2V0X2JpdChJREVWX0dPTkUsICZpZGV2LT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogS2lsbCBhbGwgb3V0c3RhbmRpbmcgcmVxdWVzdHMuICovCisJaXNjaV9yZW1vdGVfZGV2aWNlX251a2VfcmVxdWVzdHMoaWhvc3QsIGlkZXYpOworCisJc2V0X2JpdChJREVWX1NUT1BfUEVORElORywgJmlkZXYtPmZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChpZGV2LCA1MCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogV2FpdCBmb3IgdGhlIHN0b3AgY29tcGxldGUgY2FsbGJhY2suICovCisJaWYgKFdBUk5fT05DRShzdGF0dXMgIT0gU0NJX1NVQ0NFU1MsICJmYWlsZWQgdG8gc3RvcCBkZXZpY2VcbiIpKQorCQkvKiBub3RoaW5nIHRvIHdhaXQgZm9yICovOworCWVsc2UKKwkJd2FpdF9mb3JfZGV2aWNlX3N0b3AoaWhvc3QsIGlkZXYpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2VfZ29uZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGlic2FzIHdoZW4gYSBkb21haW4KKyAqICAgIGRldmljZSBpcyByZW1vdmVkLgorICogQGRvbWFpbl9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGlic2FzIGRvbWFpbiBkZXZpY2UuCisgKgorICovCit2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9nb25lKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBkZXZfdG9faWhvc3QoZGV2KTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gZGV2LT5sbGRkX2RldjsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogZG9tYWluX2RldmljZSA9ICVwLCBpc2NpX2RldmljZSA9ICVwLCBpc2NpX3BvcnQgPSAlcFxuIiwKKwkJX19mdW5jX18sIGRldiwgaWRldiwgaWRldi0+aXNjaV9wb3J0KTsKKworCWlzY2lfcmVtb3RlX2RldmljZV9zdG9wKGlob3N0LCBpZGV2KTsKK30KKworCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9mb3VuZCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGlic2FzIHdoZW4gYSByZW1vdGUKKyAqICAgIGRldmljZSBpcyBkaXNjb3ZlcmVkLiBBIHJlbW90ZSBkZXZpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHN0YXJ0ZWQuIHRoZQorICogICAgZnVuY3Rpb24gdGhlbiBzbGVlcHMgdW50aWwgdGhlIHNjaSBjb3JlIGRldmljZSBzdGFydGVkIG1lc3NhZ2UgaXMKKyAqICAgIHJlY2VpdmVkLgorICogQGRvbWFpbl9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGlic2FzIGRvbWFpbiBkZXZpY2UuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV9yZW1vdGVfZGV2aWNlX2ZvdW5kKHN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCA9IGRldl90b19paG9zdChkb21haW5fZGV2KTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppc2NpX3BvcnQ7CisJc3RydWN0IGlzY2lfcGh5ICppc2NpX3BoeTsKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpzYXNfcG9ydDsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHk7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2U7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGRvbWFpbl9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGRvbWFpbl9kZXYpOworCisJd2FpdF9mb3Jfc3RhcnQoaXNjaV9ob3N0KTsKKworCXNhc19wb3J0ID0gZG9tYWluX2Rldi0+cG9ydDsKKwlzYXNfcGh5ID0gbGlzdF9maXJzdF9lbnRyeSgmc2FzX3BvcnQtPnBoeV9saXN0LCBzdHJ1Y3QgYXNkX3Nhc19waHksCisJCQkJICAgcG9ydF9waHlfZWwpOworCWlzY2lfcGh5ID0gdG9faXBoeShzYXNfcGh5KTsKKwlpc2NpX3BvcnQgPSBpc2NpX3BoeS0+aXNjaV9wb3J0OworCisJLyogd2UgYXJlIGJlaW5nIGNhbGxlZCBmb3IgYSBkZXZpY2Ugb24gdGhpcyBwb3J0LAorCSAqIHNvIGl0IGhhcyB0byBjb21lIHVwIGV2ZW50dWFsbHkKKwkgKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpc2NpX3BvcnQtPnN0YXJ0X2NvbXBsZXRlKTsKKworCWlmICgoaXNjaV9zdG9wcGluZyA9PSBpc2NpX3BvcnRfZ2V0X3N0YXRlKGlzY2lfcG9ydCkpIHx8CisJICAgIChpc2NpX3N0b3BwZWQgPT0gaXNjaV9wb3J0X2dldF9zdGF0ZShpc2NpX3BvcnQpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpc2NpX2RldmljZSA9IGlzY2lfcmVtb3RlX2RldmljZV9hbGxvYyhpc2NpX2hvc3QsIGlzY2lfcG9ydCk7CisJaWYgKCFpc2NpX2RldmljZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlrcmVmX2luaXQoJmlzY2lfZGV2aWNlLT5rcmVmKTsKKwlJTklUX0xJU1RfSEVBRCgmaXNjaV9kZXZpY2UtPm5vZGUpOworCisJc3Bpbl9sb2NrX2lycSgmaXNjaV9ob3N0LT5zY2ljX2xvY2spOworCWlzY2lfZGV2aWNlLT5kb21haW5fZGV2ID0gZG9tYWluX2RldjsKKwlpc2NpX2RldmljZS0+aXNjaV9wb3J0ID0gaXNjaV9wb3J0OworCWxpc3RfYWRkX3RhaWwoJmlzY2lfZGV2aWNlLT5ub2RlLCAmaXNjaV9wb3J0LT5yZW1vdGVfZGV2X2xpc3QpOworCisJc2V0X2JpdChJREVWX1NUQVJUX1BFTkRJTkcsICZpc2NpX2RldmljZS0+ZmxhZ3MpOworCXN0YXR1cyA9IGlzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3QoaXNjaV9wb3J0LCBpc2NpX2RldmljZSk7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2RldmljZSA9ICVwXG4iLAorCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UpOworCisJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgeworCQkvKiBkZXZpY2UgY2FtZSB1cCwgYWR2ZXJ0aXNlIGl0IHRvIHRoZSB3b3JsZCAqLworCQlkb21haW5fZGV2LT5sbGRkX2RldiA9IGlzY2lfZGV2aWNlOworCX0gZWxzZQorCQlpc2NpX3B1dF9kZXZpY2UoaXNjaV9kZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycSgmaXNjaV9ob3N0LT5zY2ljX2xvY2spOworCisJLyogd2FpdCBmb3IgdGhlIGRldmljZSByZWFkeSBjYWxsYmFjay4gKi8KKwl3YWl0X2Zvcl9kZXZpY2Vfc3RhcnQoaXNjaV9ob3N0LCBpc2NpX2RldmljZSk7CisKKwlyZXR1cm4gc3RhdHVzID09IFNDSV9TVUNDRVNTID8gMCA6IC1FTk9ERVY7Cit9CisvKioKKyAqIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpZiB0aGVyZSBpcyBhbnkKKyAqICAgIHBlbmRpbmcgcmVzZXQgY29uZGl0aW9uIG9uIHRoZSBkZXZpY2UuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGlzY2lfZGV2aWNlIG9iamVjdC4KKyAqCisgKiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVzZXQgcGVuZGluZyBmb3IgdGhlIGRldmljZS4KKyAqLworYm9vbCBpc2NpX2RldmljZV9pc19yZXNldF9wZW5kaW5nKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3Q7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqdG1wX3JlcTsKKwlib29sIHJlc2V0X2lzX3BlbmRpbmcgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfZGV2aWNlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgZm9yIHJlc2V0IG9uIGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpc2NpX3JlcXVlc3QsIHRtcF9yZXEsCisJCQkJICZpc2NpX2RldmljZS0+cmVxc19pbl9wcm9jZXNzLCBkZXZfbm9kZSkgeworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXNjaV9kZXZpY2UgPSAlcCByZXF1ZXN0ID0gJXBcbiIsCisJCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UsIGlzY2lfcmVxdWVzdCk7CisKKwkJaWYgKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykgeworCQkJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKAorCQkJCWlzY2lfcmVxdWVzdCk7CisKKwkJCXNwaW5fbG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKKwkJCWlmICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpCisJCQkJcmVzZXRfaXNfcGVuZGluZyA9IHRydWU7CisJCQlzcGluX3VubG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2RldmljZSA9ICVwIHJlc2V0X2lzX3BlbmRpbmcgPSAlZFxuIiwKKwkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCByZXNldF9pc19wZW5kaW5nKTsKKworCXJldHVybiByZXNldF9pc19wZW5kaW5nOworfQorCisvKioKKyAqIGlzY2lfZGV2aWNlX2NsZWFyX3Jlc2V0X3BlbmRpbmcoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhciBpZiBhbnkgcGVuZGluZworICogICAgcmVzZXQgY29uZGl0aW9uIGZsYWdzIG9uIHRoZSBkZXZpY2UuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGlzY2lfZGV2aWNlIG9iamVjdC4KKyAqCisgKiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVzZXQgcGVuZGluZyBmb3IgdGhlIGRldmljZS4KKyAqLwordm9pZCBpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICp0bXBfcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBpZGV2PSVwLCBpaG9zdD0lcFxuIiwKKwkJIF9fZnVuY19fLCBpZGV2LCBpaG9zdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogQ2xlYXIgcmVzZXQgcGVuZGluZyBvbiBhbGwgcGVuZGluZyByZXF1ZXN0cy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXNjaV9yZXF1ZXN0LCB0bXBfcmVxLAorCQkJCSAmaWRldi0+cmVxc19pbl9wcm9jZXNzLCBkZXZfbm9kZSkgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlkZXYgPSAlcCByZXF1ZXN0ID0gJXBcbiIsCisJCQkgX19mdW5jX18sIGlkZXYsIGlzY2lfcmVxdWVzdCk7CisKKwkJaWYgKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykgeworCisJCQl1bnNpZ25lZCBsb25nIGZsYWdzMjsKKwkJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzaygKKwkJCQlpc2NpX3JlcXVlc3QpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFnczIpOworCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzMik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2NmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmgKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0lTQ0lfUkVNT1RFX0RFVklDRV9IXworI2RlZmluZSBfSVNDSV9SRU1PVEVfREVWSUNFX0hfCisjaW5jbHVkZSA8c2NzaS9saWJzYXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSAic2N1X3JlbW90ZV9ub2RlX2NvbnRleHQuaCIKKyNpbmNsdWRlICJyZW1vdGVfbm9kZV9jb250ZXh0LmgiCisjaW5jbHVkZSAicG9ydC5oIgorCitlbnVtIHNjaV9yZW1vdGVfZGV2aWNlX25vdF9yZWFkeV9yZWFzb25fY29kZSB7CisJU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TVEFSVF9SRVFVRVNURUQsCisJU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TVE9QX1JFUVVFU1RFRCwKKwlTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfUkVRVUVTVF9TVEFSVEVELAorCVNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU0FUQV9TREJfRVJST1JfRklTX1JFQ0VJVkVELAorCVNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU01QX1JFUVVFU1RfU1RBUlRFRCwKKwlTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1JFQVNPTl9DT0RFX01BWAorfTsKKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2UgLSBpc2NpIHJlcHJlc2VudGF0aW9uIG9mIGEgc2FzIGV4cGFuZGVyIC8gZW5kIHBvaW50CisgKiBAZGV2aWNlX3BvcnRfd2lkdGg6IGh3IHNldHRpbmcgZm9yIG51bWJlciBvZiBzaW11bHRhbmVvdXMgY29ubmVjdGlvbnMKKyAqIEBjb25uZWN0aW9uX3JhdGU6IHBlci10YXNrY29udGV4dCBjb25uZWN0aW9uIHJhdGUgZm9yIHRoaXMgZGV2aWNlCisgKiBAd29ya2luZ19yZXF1ZXN0OiBTQVRBIHJlcXVlc3RzIGhhdmUgbm8gdGFnIHdlIGZvciB1bmFjY2VsZXJhdGVkCisgKiAgICAgICAgICAgICAgICAgICBwcm90b2NvbHMgd2UgbmVlZCBhIG1ldGhvZCB0byBhc3NvY2lhdGUgdW5zb2xpY2l0ZWQKKyAqICAgICAgICAgICAgICAgICAgIGZyYW1lcyB3aXRoIGEgcGVuZGluZyByZXF1ZXN0CisgKi8KK3N0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgeworCSNkZWZpbmUgSURFVl9TVEFSVF9QRU5ESU5HIDAKKwkjZGVmaW5lIElERVZfU1RPUF9QRU5ESU5HIDEKKwkjZGVmaW5lIElERVZfQUxMT0NBVEVEIDIKKwkjZGVmaW5lIElERVZfRUggMworCSNkZWZpbmUgSURFVl9HT05FIDQKKwkjZGVmaW5lIElERVZfSU9fUkVBRFkgNQorCSNkZWZpbmUgSURFVl9JT19OQ1FFUlJPUiA2CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZG9tYWluX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCByZXFzX2luX3Byb2Nlc3M7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgc207CisJdTMyIGRldmljZV9wb3J0X3dpZHRoOworCWVudW0gc2FzX2xpbmtyYXRlIGNvbm5lY3Rpb25fcmF0ZTsKKwlib29sIGlzX2RpcmVjdF9hdHRhY2hlZDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICpvd25pbmdfcG9ydDsKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgcm5jOworCS8qIFhYWCB1bmlmeSB3aXRoIGRldmljZSByZWZlcmVuY2UgY291bnRpbmcgYW5kIGRlbGV0ZSAqLworCXUzMiBzdGFydGVkX3JlcXVlc3RfY291bnQ7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqd29ya2luZ19yZXF1ZXN0OworCXUzMiBub3RfcmVhZHlfcmVhc29uOworfTsKKworI2RlZmluZSBJU0NJX1JFTU9URV9ERVZJQ0VfU1RBUlRfVElNRU9VVCA1MDAwCisKKy8qIGRldmljZSByZWZlcmVuY2Ugcm91dGluZXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgc2NpX2xvY2sgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9sb29rdXBfZGV2aWNlKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGRldi0+bGxkZF9kZXY7CisKKwlpZiAoaWRldiAmJiAhdGVzdF9iaXQoSURFVl9HT05FLCAmaWRldi0+ZmxhZ3MpKSB7CisJCWtyZWZfZ2V0KCZpZGV2LT5rcmVmKTsKKwkJcmV0dXJuIGlkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfcHV0X2RldmljZShzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWlmIChpZGV2KQorCQlrcmVmX3B1dCgmaWRldi0+a3JlZiwgaXNjaV9yZW1vdGVfZGV2aWNlX3JlbGVhc2UpOworfQorCitlbnVtIHNjaV9zdGF0dXMgaXNjaV9yZW1vdGVfZGV2aWNlX3N0b3Aoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOwordm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKK3ZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX2dvbmUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXYpOworaW50IGlzY2lfcmVtb3RlX2RldmljZV9mb3VuZChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZG9tYWluX2Rldik7Citib29sIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKK3ZvaWQgaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9zdG9wKCkgLSBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgYm90aCB0cmFuc21pc3Npb24gYW5kCisgKiAgICByZWNlcHRpb24gb2YgbGluayBhY3Rpdml0eSBmb3IgdGhlIHN1cHBsaWVkIHJlbW90ZSBkZXZpY2UuICBUaGlzIG1ldGhvZAorICogICAgZGlzYWJsZXMgbm9ybWFsIElPIHJlcXVlc3RzIGZyb20gZmxvd2luZyB0aHJvdWdoIHRvIHRoZSByZW1vdGUgZGV2aWNlLgorICogQHJlbW90ZV9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZGV2aWNlIHRvIGJlIHN0b3BwZWQuCisgKiBAdGltZW91dDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIHdoaWNoIHRoZQorICogICAgc3RvcCBvcGVyYXRpb24gc2hvdWxkIGNvbXBsZXRlLgorICoKKyAqIEFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgZGV2aWNlIHdhcyBzdWNjZXNzZnVsbHkgc3RvcHBlZC4gU0NJX1NVQ0NFU1MKKyAqIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGZvciB0aGUgZGV2aWNlIHdhcworICogc3VjY2Vzc2Z1bGx5IHN0b3BwZWQuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdG9wKAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTMyIHRpbWVvdXQpOworCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KCkgLSBUaGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoZSBkZXZpY2UgbWFraW5nIGl0CisgKiAgICByZWFkeSBmb3Igb3BlcmF0aW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhbnl0aW1lIHRoZSBkZXZpY2UgaXMKKyAqICAgIHJlc2V0IGVpdGhlciB0aHJvdWdoIGEgU01QIHBoeSBjb250cm9sIG9yIGEgcG9ydCBoYXJkIHJlc2V0IHJlcXVlc3QuCisgKiBAcmVtb3RlX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdG8gYmUgcmVzZXQuCisgKgorICogVGhpcyBtZXRob2QgZG9lcyBub3QgYWN0dWFsbHkgY2F1c2UgdGhlIGRldmljZSBoYXJkd2FyZSB0byBiZSByZXNldC4gVGhpcworICogbWV0aG9kIHJlc2V0cyB0aGUgc29mdHdhcmUgb2JqZWN0IHNvIHRoYXQgaXQgd2lsbCBiZSBvcGVyYXRpb25hbCBhZnRlciBhCisgKiBkZXZpY2UgaGFyZHdhcmUgcmVzZXQgY29tcGxldGVzLiBBbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhlIGRldmljZSByZXNldAorICogd2FzIGFjY2VwdGVkLiBTQ0lfU1VDQ0VTUyBUaGlzIHZhbHVlIGlzIHJldHVybmVkIGlmIHRoZSBkZXZpY2UgcmVzZXQgaXMKKyAqIHN0YXJ0ZWQuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9yZXNldCgKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKKworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9yZXNldF9jb21wbGV0ZSgpIC0gVGhpcyBtZXRob2QgaW5mb3JtcyB0aGUgZGV2aWNlIG9iamVjdAorICogICAgdGhhdCB0aGUgcmVzZXQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIGFuZCB0aGUgZGV2aWNlIGNhbiByZXN1bWUgb3BlcmF0aW9uCisgKiAgICBhZ2Fpbi4KKyAqIEByZW1vdGVfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRldmljZSB3aGljaCBpcyB0byBiZSBpbmZvcm1lZAorICogICAgb2YgdGhlIHJlc2V0IGNvbXBsZXRlIG9wZXJhdGlvbi4KKyAqCisgKiBBbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGRldmljZSBpcyByZXN1bWluZyBvcGVyYXRpb24uIFNDSV9TVUNDRVNTIHRoZSBkZXZpY2UKKyAqIGlzIHJlc3VtaW5nIG9wZXJhdGlvbi4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOworCisvKioKKyAqIGVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCB0aGUgc3RhdGVzCisgKiAgICBmb3IgdGhlIGNvbW1vbiByZW1vdGUgZGV2aWNlIHN0YXRlIG1hY2hpbmUuCisgKgorICoKKyAqLworZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgeworCS8qKgorCSAqIFNpbXBseSB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGJhc2UgcmVtb3RlIGRldmljZSBzdGF0ZSBtYWNoaW5lLgorCSAqLworCVNDSV9ERVZfSU5JVElBTCwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBkZXZpY2UgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuCisJICogc3RvcHBlZC4gIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTCBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RPUFBJTkcgc3RhdGUuCisJICovCisJU0NJX0RFVl9TVE9QUEVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHRoZSByZW1vdGUgZGV2aWNlIGlzIGluIHRoZSBwcm9jZXNzIG9mCisJICogYmVjb21pbmcgcmVhZHkgKGkuZS4gc3RhcnRpbmcpLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucworCSAqIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQRUQgc3RhdGUuCisJICovCisJU0NJX0RFVl9TVEFSVElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoZSByZW1vdGUgZGV2aWNlIGlzIG5vdyByZWFkeS4gIFRodXMsIHRoZSB1c2VyCisJICogaXMgYWJsZSB0byBwZXJmb3JtIElPIG9wZXJhdGlvbnMgb24gdGhlIHJlbW90ZSBkZXZpY2UuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUQVJUSU5HIHN0YXRlLgorCSAqLworCVNDSV9ERVZfUkVBRFksCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGxlIHN1YnN0YXRlIGZvciB0aGUgc3RwIHJlbW90ZSBkZXZpY2UuICBXaGVuIHRoZXJlIGFyZSBubworCSAqIGFjdGl2ZSBJTyBmb3IgdGhlIGRldmljZSBpdCBpcyBpcyBpbiB0aGlzIHN0YXRlLgorCSAqLworCVNDSV9TVFBfREVWX0lETEUsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb21tYW5kIHN0YXRlIGZvciBmb3IgdGhlIFNUUCByZW1vdGUgZGV2aWNlLiAgVGhpcyBzdGF0ZSBpcworCSAqIGVudGVyZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHByb2Nlc3NpbmcgYSBub24tTkNRIGNvbW1hbmQuICBUaGUgZGV2aWNlIG9iamVjdAorCSAqIHdpbGwgZmFpbCBhbnkgbmV3IHN0YXJ0IElPIHJlcXVlc3RzIHVudGlsIHRoaXMgY29tbWFuZCBpcyBjb21wbGV0ZS4KKwkgKi8KKwlTQ0lfU1RQX0RFVl9DTUQsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBOQ1Egc3RhdGUgZm9yIHRoZSBTVFAgcmVtb3RlIGRldmljZS4gIFRoaXMgc3RhdGUgaXMgZW50ZXJlZAorCSAqIHdoZW4gdGhlIGRldmljZSBpcyBwcm9jZXNzaW5nIGFuIE5DUSByZXVxZXN0LiAgSXQgd2lsbCByZW1haW4gaW4gdGhpcyBzdGF0ZQorCSAqIHNvIGxvbmcgYXMgdGhlcmUgaXMgb25lIG9yIG1vcmUgTkNRIHJlcXVlc3RzIGJlaW5nIHByb2Nlc3NlZC4KKwkgKi8KKwlTQ0lfU1RQX0RFVl9OQ1EsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBOQ1EgZXJyb3Igc3RhdGUgZm9yIHRoZSBTVFAgcmVtb3RlIGRldmljZS4gIFRoaXMgc3RhdGUgaXMKKwkgKiBlbnRlcmVkIHdoZW4gYW4gU0RCIGVycm9yIEZJUyBpcyByZWNlaXZlZCBieSB0aGUgZGV2aWNlIG9iamVjdCB3aGlsZSBpbiB0aGUKKwkgKiBOQ1Egc3RhdGUuICBUaGUgZGV2aWNlIG9iamVjdCB3aWxsIG9ubHkgYWNjZXB0IGEgUkVBRCBMT0cgY29tbWFuZCB3aGlsZSBpbgorCSAqIHRoaXMgc3RhdGUuCisJICovCisJU0NJX1NUUF9ERVZfTkNRX0VSUk9SLAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgUkVBRFkgc3Vic3RhdGUgaW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgd2FpdGluZyBmb3IgdGhlIFJFU0VUIHRhc2sKKwkgKiBjb21pbmcgdG8gYmUgcmVjb3ZlcmVkIGZyb20gY2VydGFpbiBoYXJkd2FyZSBzcGVjaWZpYyBlcnJvci4KKwkgKi8KKwlTQ0lfU1RQX0RFVl9BV0FJVF9SRVNFVCwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHJlYWR5IG9wZXJhdGlvbmFsIHN1YnN0YXRlIGZvciB0aGUgcmVtb3RlIGRldmljZS4gIFRoaXMgaXMgdGhlCisJICogbm9ybWFsIG9wZXJhdGlvbmFsIHN0YXRlIGZvciBhIHJlbW90ZSBkZXZpY2UuCisJICovCisJU0NJX1NNUF9ERVZfSURMRSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN1c3BlbmRlZCBzdGF0ZSBmb3IgdGhlIHJlbW90ZSBkZXZpY2UuICBUaGlzIGlzIHRoZSBzdGF0ZSB0aGF0CisJICogdGhlIGRldmljZSBpcyBwbGFjZWQgaW4gd2hlbiBhIFJOQyBzdXNwZW5kIGlzIHJlY2VpdmVkIGJ5IHRoZSBTQ1UgaGFyZHdhcmUuCisJICovCisJU0NJX1NNUF9ERVZfQ01ELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVtb3RlIGRldmljZSBpcyBpbiB0aGUgcHJvY2VzcyBvZgorCSAqIHN0b3BwaW5nLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLCBidXQKKwkgKiBleGlzdGluZyBJTyBvcGVyYXRpb25zIGFyZSBhbGxvd2VkIHRvIGNvbXBsZXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRUFEWSBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgRkFJTEVEIHN0YXRlLgorCSAqLworCVNDSV9ERVZfU1RPUFBJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSByZW1vdGUgZGV2aWNlIGhhcyBmYWlsZWQuCisJICogSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMSVpJTkcgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqLworCVNDSV9ERVZfRkFJTEVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyBiZWluZyByZXNldC4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqLworCVNDSV9ERVZfUkVTRVRUSU5HLAorCisJLyoqCisJICogU2ltcGx5IHRoZSBmaW5hbCBzdGF0ZSBmb3IgdGhlIGJhc2UgcmVtb3RlIGRldmljZSBzdGF0ZSBtYWNoaW5lLgorCSAqLworCVNDSV9ERVZfRklOQUwsCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKnJuY190b19kZXYoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKworCWlkZXYgPSBjb250YWluZXJfb2Yocm5jLCB0eXBlb2YoKmlkZXYpLCBybmMpOworCisJcmV0dXJuIGlkZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZfaXNfZXhwYW5kZXIoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5kZXZfdHlwZSA9PSBFREdFX0RFViB8fCBkZXYtPmRldl90eXBlID09IEZBTk9VVF9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9kZWNyZW1lbnRfcmVxdWVzdF9jb3VudChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCS8qIFhYWCBkZWxldGUgdGhpcyB2b29kb28gd2hlbiBjb252ZXJ0aW5nIHRvIHRoZSB0b3AtbGV2ZWwgZGV2aWNlCisJICogcmVmZXJlbmNlIGNvdW50CisJICovCisJaWYgKFdBUk5fT05DRShpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPT0gMCwKKwkJICAgICAgIiVzOiB0cmllZCB0byBkZWNyZW1lbnQgc3RhcnRlZF9yZXF1ZXN0X2NvdW50IHBhc3QgMCE/IiwKKwkJCV9fZnVuY19fKSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCWlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudC0tOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZnJhbWVfaGFuZGxlcigKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXUzMiBmcmFtZV9pbmRleCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9ldmVudF9oYW5kbGVyKAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTMyIGV2ZW50X2NvZGUpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfaW8oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3Rhc2soCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2NvbXBsZXRlX2lvKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdXNwZW5kKAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTMyIHN1c3BlbmRfdHlwZSk7CisKK3ZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTMyIHJlcXVlc3QpOworCisjZW5kaWYgLyogIWRlZmluZWQoX0lTQ0lfUkVNT1RFX0RFVklDRV9IXykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX2NvbnRleHQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhlODMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5jCkBAIC0wLDAgKzEsNjI3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJyZW1vdGVfZGV2aWNlLmgiCisjaW5jbHVkZSAicmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgInNjdV9ldmVudF9jb2Rlcy5oIgorI2luY2x1ZGUgInNjdV90YXNrX2NvbnRleHQuaCIKKworCisvKioKKyAqCisgKiBAc2NpX3JuYzogVGhlIFJOQyBmb3Igd2hpY2ggdGhlIGlzIHBvc3RlZCByZXF1ZXN0IGlzIGJlaW5nIG1hZGUuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgUk5DIGlzIG5vdCBpbiB0aGUgaW5pdGlhbCBzdGF0ZS4gIEluIGFsbAorICogb3RoZXIgc3RhdGVzIHRoZSBSTkMgaXMgY29uc2lkZXJlZCBhY3RpdmUgYW5kIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4gVGhlCisgKiBkZXN0cm95IHJlcXVlc3Qgb2YgdGhlIHN0YXRlIG1hY2hpbmUgZHJpdmVzIHRoZSBSTkMgYmFjayB0byB0aGUgaW5pdGlhbAorICogc3RhdGUuICBJZiB0aGUgc3RhdGUgbWFjaGluZSBjaGFuZ2VzIHRoZW4gdGhpcyByb3V0aW5lIHdpbGwgYWxzbyBoYXZlIHRvIGJlCisgKiBjaGFuZ2VkLiBib29sIHRydWUgaWYgdGhlIHN0YXRlIG1hY2hpbmUgaXMgbm90IGluIHRoZSBpbml0aWFsIHN0YXRlIGZhbHNlIGlmCisgKiB0aGUgc3RhdGUgbWFjaGluZSBpcyBpbiB0aGUgaW5pdGlhbCBzdGF0ZQorICovCisKKy8qKgorICoKKyAqIEBzY2lfcm5jOiBUaGUgc3RhdGUgb2YgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgb2JqZWN0IHRvIGNoZWNrLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgaW4gYSBSRUFEWSBzdGF0ZQorICogb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGJvb2wgdHJ1ZSBpZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpcyBpbgorICogdGhlIHJlYWR5IHN0YXRlLiBmYWxzZSBpZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpcyBub3QgaW4gdGhlIHJlYWR5IHN0YXRlLgorICovCitib29sIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2lzX3JlYWR5KAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYykKK3sKKwl1MzIgY3VycmVudF9zdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoY3VycmVudF9zdGF0ZSA9PSBTQ0lfUk5DX1JFQURZKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jX2J5X2lkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MTYgaWQpCit7CisJaWYgKGlkIDwgaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXMgJiYKKwkgICAgaWhvc3QtPmRldmljZV90YWJsZVtpZF0pCisJCXJldHVybiAmaWhvc3QtPnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGVbaWRdOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnN0cnVjdF9idWZmZXIoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBybmNfdG9fZGV2KHNjaV9ybmMpOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCWludCBybmkgPSBzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleDsKKwl1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCV9fbGU2NCBzYXNfYWRkcjsKKworCWlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCXJuYyA9IHNjaV9ybmNfYnlfaWQoaWhvc3QsIHJuaSk7CisKKwltZW1zZXQocm5jLCAwLCBzaXplb2YodW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQpCisJCSogc2NpX3JlbW90ZV9kZXZpY2Vfbm9kZV9jb3VudChpZGV2KSk7CisKKwlybmMtPnNzcC5yZW1vdGVfbm9kZV9pbmRleCA9IHJuaTsKKwlybmMtPnNzcC5yZW1vdGVfbm9kZV9wb3J0X3dpZHRoID0gaWRldi0+ZGV2aWNlX3BvcnRfd2lkdGg7CisJcm5jLT5zc3AubG9naWNhbF9wb3J0X2luZGV4ID0gaWRldi0+b3duaW5nX3BvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisKKwkvKiBzYXMgYWRkcmVzcyBpcyBfX2JlNjQsIGNvbnRleHQgcmFtIGZvcm1hdCBpcyBfX2xlNjQgKi8KKwlzYXNfYWRkciA9IGNwdV90b19sZTY0KFNBU19BRERSKGRldi0+c2FzX2FkZHIpKTsKKwlybmMtPnNzcC5yZW1vdGVfc2FzX2FkZHJlc3NfaGkgPSB1cHBlcl8zMl9iaXRzKHNhc19hZGRyKTsKKwlybmMtPnNzcC5yZW1vdGVfc2FzX2FkZHJlc3NfbG8gPSBsb3dlcl8zMl9iaXRzKHNhc19hZGRyKTsKKworCXJuYy0+c3NwLm5leHVzX2xvc3NfdGltZXJfZW5hYmxlID0gdHJ1ZTsKKwlybmMtPnNzcC5jaGVja19iaXQgICAgICAgICAgICAgICA9IGZhbHNlOworCXJuYy0+c3NwLmlzX3ZhbGlkICAgICAgICAgICAgICAgID0gZmFsc2U7CisJcm5jLT5zc3AuaXNfcmVtb3RlX25vZGVfY29udGV4dCAgPSB0cnVlOworCXJuYy0+c3NwLmZ1bmN0aW9uX251bWJlciAgICAgICAgID0gMDsKKworCXJuYy0+c3NwLmFyYml0cmF0aW9uX3dhaXRfdGltZSA9IDA7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fCAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSkgeworCQlybmMtPnNzcC5jb25uZWN0aW9uX29jY3VwYW5jeV90aW1lb3V0ID0KKwkJCWlob3N0LT51c2VyX3BhcmFtZXRlcnMuc3RwX21heF9vY2N1cGFuY3lfdGltZW91dDsKKwkJcm5jLT5zc3AuY29ubmVjdGlvbl9pbmFjdGl2aXR5X3RpbWVvdXQgPQorCQkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zdHBfaW5hY3Rpdml0eV90aW1lb3V0OworCX0gZWxzZSB7CisJCXJuYy0+c3NwLmNvbm5lY3Rpb25fb2NjdXBhbmN5X3RpbWVvdXQgID0KKwkJCWlob3N0LT51c2VyX3BhcmFtZXRlcnMuc3NwX21heF9vY2N1cGFuY3lfdGltZW91dDsKKwkJcm5jLT5zc3AuY29ubmVjdGlvbl9pbmFjdGl2aXR5X3RpbWVvdXQgPQorCQkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zc3BfaW5hY3Rpdml0eV90aW1lb3V0OworCX0KKworCXJuYy0+c3NwLmluaXRpYWxfYXJiaXRyYXRpb25fd2FpdF90aW1lID0gMDsKKworCS8qIE9wZW4gQWRkcmVzcyBGcmFtZSBQYXJhbWV0ZXJzICovCisJcm5jLT5zc3Aub2FmX2Nvbm5lY3Rpb25fcmF0ZSA9IGlkZXYtPmNvbm5lY3Rpb25fcmF0ZTsKKwlybmMtPnNzcC5vYWZfZmVhdHVyZXMgPSAwOworCXJuYy0+c3NwLm9hZl9zb3VyY2Vfem9uZV9ncm91cCA9IDA7CisJcm5jLT5zc3Aub2FmX21vcmVfY29tcGF0aWJpbGl0eV9mZWF0dXJlcyA9IDA7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcm5jOgorICogQGNhbGxiYWNrOgorICogQGNhbGxiYWNrX3BhcmFtZXRlcjoKKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHNldHVwIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG9iamVjdCBzbyBpdCB3aWxsIHRyYW5zaXRpb24KKyAqIHRvIGl0cyByZWFkeSBzdGF0ZS4gIElmIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIGFscmVhZHkgc2V0dXAgdG8KKyAqIHRyYW5zaXRpb24gdG8gaXRzIGZpbmFsIHN0YXRlIHRoZW4gdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuIG5vbmUKKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fcmVzdW1lKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwlzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYWxsYmFjaywKKwl2b2lkICpjYWxsYmFja19wYXJhbWV0ZXIpCit7CisJaWYgKHNjaV9ybmMtPmRlc3RpbmF0aW9uX3N0YXRlICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX0ZJTkFMKSB7CisJCXNjaV9ybmMtPmRlc3RpbmF0aW9uX3N0YXRlID0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfUkVBRFk7CisJCXNjaV9ybmMtPnVzZXJfY2FsbGJhY2sgICAgID0gY2FsbGJhY2s7CisJCXNjaV9ybmMtPnVzZXJfY29va2llICAgICAgID0gY2FsbGJhY2tfcGFyYW1ldGVyOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fZGVzdG9yeSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJc2NpY3Nfc2RzX3JlbW90ZV9ub2RlX2NvbnRleHRfY2FsbGJhY2sgY2FsbGJhY2ssCisJdm9pZCAqY2FsbGJhY2tfcGFyYW1ldGVyKQoreworCXNjaV9ybmMtPmRlc3RpbmF0aW9uX3N0YXRlID0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUw7CisJc2NpX3JuYy0+dXNlcl9jYWxsYmFjayAgICAgPSBjYWxsYmFjazsKKwlzY2lfcm5jLT51c2VyX2Nvb2tpZSAgICAgICA9IGNhbGxiYWNrX3BhcmFtZXRlcjsKK30KKworLyoqCisgKgorICoKKyAqIFRoaXMgbWV0aG9kIGp1c3QgY2FsbHMgdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIHRoZW4gcmVzZXRzIHRoZQorICogY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X25vdGlmeV91c2VyKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jKQoreworCWlmIChybmMtPnVzZXJfY2FsbGJhY2sgIT0gTlVMTCkgeworCQkoKnJuYy0+dXNlcl9jYWxsYmFjaykocm5jLT51c2VyX2Nvb2tpZSk7CisKKwkJcm5jLT51c2VyX2NhbGxiYWNrID0gTlVMTDsKKwkJcm5jLT51c2VyX2Nvb2tpZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb250aW51ZV9zdGF0ZV90cmFuc2l0aW9ucyhzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYykKK3sKKwlpZiAocm5jLT5kZXN0aW5hdGlvbl9zdGF0ZSA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9SRUFEWSkKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKHJuYywgcm5jLT51c2VyX2NhbGxiYWNrLAorCQkJCQkJICAgIHJuYy0+dXNlcl9jb29raWUpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF92YWxpZGF0ZV9jb250ZXh0X2J1ZmZlcihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMpCit7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuY19idWZmZXI7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IHJuY190b19kZXYoc2NpX3JuYyk7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlybmNfYnVmZmVyID0gc2NpX3JuY19ieV9pZChpaG9zdCwgc2NpX3JuYy0+cmVtb3RlX25vZGVfaW5kZXgpOworCisJcm5jX2J1ZmZlci0+c3NwLmlzX3ZhbGlkID0gdHJ1ZTsKKworCWlmICghaWRldi0+aXNfZGlyZWN0X2F0dGFjaGVkICYmCisJICAgIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSkgeworCQlzY2lfcmVtb3RlX2RldmljZV9wb3N0X3JlcXVlc3QoaWRldiwgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ185Nik7CisJfSBlbHNlIHsKKwkJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KGlkZXYsIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfMzIpOworCisJCWlmIChpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQpCisJCQlzY2lfcG9ydF9zZXR1cF90cmFuc3BvcnRzKGlkZXYtPm93bmluZ19wb3J0LAorCQkJCQkJICBzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9pbnZhbGlkYXRlX2NvbnRleHRfYnVmZmVyKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYykKK3sKKwl1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jX2J1ZmZlcjsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gcm5jX3RvX2RldihzY2lfcm5jKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXJuY19idWZmZXIgPSBzY2lfcm5jX2J5X2lkKGlob3N0LCBzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleCk7CisKKwlybmNfYnVmZmVyLT5zc3AuaXNfdmFsaWQgPSBmYWxzZTsKKworCXNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChybmNfdG9fZGV2KHNjaV9ybmMpLAorCQkJCSAgICAgICBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX0lOVkFMSURBVEUpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9pbml0aWFsX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYyA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCpybmMpLCBzbSk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBnb3R0ZW4gYmFjayB0byB0aGUgaW5pdGlhbCBzdGF0ZSBiZWNhdXNlCisJICogc29tZW9uZSByZXF1ZXN0ZWQgdG8gZGVzdHJveSB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBvYmplY3QuCisJICovCisJaWYgKHNtLT5wcmV2aW91c19zdGF0ZV9pZCA9PSBTQ0lfUk5DX0lOVkFMSURBVElORykgeworCQlybmMtPmRlc3RpbmF0aW9uX3N0YXRlID0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfVU5TUEVDSUZJRUQ7CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X25vdGlmeV91c2VyKHJuYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9wb3N0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqc2NpX3JuYyksIHNtKTsKKworCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3ZhbGlkYXRlX2NvbnRleHRfYnVmZmVyKHNjaV9ybmMpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9pbnZhbGlkYXRpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKworCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGVfY29udGV4dF9idWZmZXIocm5jKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1pbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXY7CisKKwlpZGV2ID0gcm5jX3RvX2RldihybmMpOworCWRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisKKwkvKgorCSAqIEZvciBkaXJlY3QgYXR0YWNoZWQgU0FUQSBkZXZpY2VzIHdlIG5lZWQgdG8gY2xlYXIgdGhlIFRMQ1IKKwkgKiBOQ1EgdG8gVENpIHRhZyBtYXBwaW5nIG9uIHRoZSBwaHkgYW5kIGluIGNhc2VzIHdoZXJlIHdlCisJICogcmVzdW1lIGJlY2F1c2Ugb2YgYSB0YXJnZXQgcmVzZXQgd2UgYWxzbyBuZWVkIHRvIHVwZGF0ZQorCSAqIHRoZSBTVFBUTERBUk5JIHJlZ2lzdGVyIHdpdGggdGhlIFJOaSBvZiB0aGUgZGV2aWNlCisJICovCisJaWYgKChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSAmJgorCSAgICBpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQpCisJCXNjaV9wb3J0X3NldHVwX3RyYW5zcG9ydHMoaWRldi0+b3duaW5nX3BvcnQsCisJCQkJCSAgICAgICBybmMtPnJlbW90ZV9ub2RlX2luZGV4KTsKKworCXNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChpZGV2LCBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX1JFU1VNRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3JlYWR5X3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYyA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCpybmMpLCBzbSk7CisKKwlybmMtPmRlc3RpbmF0aW9uX3N0YXRlID0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfVU5TUEVDSUZJRUQ7CisKKwlpZiAocm5jLT51c2VyX2NhbGxiYWNrKQorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9ub3RpZnlfdXNlcihybmMpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF90eF9zdXNwZW5kZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKworCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnRpbnVlX3N0YXRlX3RyYW5zaXRpb25zKHJuYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3R4X3J4X3N1c3BlbmRlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29udGludWVfc3RhdGVfdHJhbnNpdGlvbnMocm5jKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfUk5DX0lOSVRJQUxdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9pbml0aWFsX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfUE9TVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Bvc3Rpbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JOQ19JTlZBTElEQVRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9pbnZhbGlkYXRpbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JOQ19SRVNVTUlOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtaW5nX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZWFkeV9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX1RYX1NVU1BFTkRFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3R4X3N1c3BlbmRlZF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3R4X3J4X3N1c3BlbmRlZF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT05dID0geyB9LAorfTsKKwordm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb25zdHJ1Y3Qoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMsCisJCQkJCSAgICB1MTYgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJbWVtc2V0KHJuYywgMCwgc2l6ZW9mKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCkpOworCisJcm5jLT5yZW1vdGVfbm9kZV9pbmRleCA9IHJlbW90ZV9ub2RlX2luZGV4OworCXJuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9VTlNQRUNJRklFRDsKKworCXNjaV9pbml0X3NtKCZybmMtPnNtLCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZV90YWJsZSwgU0NJX1JOQ19JTklUSUFMKTsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJCSAgIHUzMiBldmVudF9jb2RlKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JOQ19QT1NUSU5HOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9QT1NUX1JOQ19DT01QTEVURToKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1JFQURZKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX0lOVkFMSURBVElORzoKKwkJaWYgKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfUE9TVF9STkNfSU5WQUxJREFURV9DT01QTEVURSkgeworCQkJaWYgKHNjaV9ybmMtPmRlc3RpbmF0aW9uX3N0YXRlID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX0ZJTkFMKQorCQkJCXN0YXRlID0gU0NJX1JOQ19JTklUSUFMOworCQkJZWxzZQorCQkJCXN0YXRlID0gU0NJX1JOQ19QT1NUSU5HOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpKSB7CisJCQljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYOgorCQkJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWF9SWDoKKwkJCQkvKiBXZSByZWFsbHkgZG9udCBjYXJlIGlmIHRoZSBoYXJkd2FyZSBpcyBnb2luZyB0byBzdXNwZW5kCisJCQkJICogdGhlIGRldmljZSBzaW5jZSBpdCdzIGJlaW5nIGludmFsaWRhdGVkIGFueXdheSAqLworCQkJCWRldl9kYmcoc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkJCSIlczogU0NJQyBSZW1vdGUgTm9kZSBDb250ZXh0IDB4JXAgd2FzICIKKwkJCQkJInN1c3BlbmVkZWQgYnkgaGFyZHdhcmUgd2hpbGUgYmVpbmcgIgorCQkJCQkiaW52YWxpZGF0ZWQuXG4iLCBfX2Z1bmNfXywgc2NpX3JuYyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU0NJX1JOQ19SRVNVTUlORzoKKwkJaWYgKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfUE9TVF9SQ05fUkVMRUFTRSkgeworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVBRFkpOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkpIHsKKwkJCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFg6CisJCQljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYOgorCQkJCS8qIFdlIHJlYWxseSBkb250IGNhcmUgaWYgdGhlIGhhcmR3YXJlIGlzIGdvaW5nIHRvIHN1c3BlbmQKKwkJCQkgKiB0aGUgZGV2aWNlIHNpbmNlIGl0J3MgYmVpbmcgcmVzdW1lZCBhbnl3YXkgKi8KKwkJCQlkZXZfZGJnKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJCQkiJXM6IFNDSUMgUmVtb3RlIE5vZGUgQ29udGV4dCAweCVwIHdhcyAiCisJCQkJCSJzdXNwZW5lZGVkIGJ5IGhhcmR3YXJlIHdoaWxlIGJlaW5nIHJlc3VtZWQuXG4iLAorCQkJCQlfX2Z1bmNfXywgc2NpX3JuYyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU0NJX1JOQ19SRUFEWToKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfVExfUk5DX1NVU1BFTkRfVFg6CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19UWF9TVVNQRU5ERUQpOworCQkJc2NpX3JuYy0+c3VzcGVuc2lvbl9jb2RlID0gc2N1X2dldF9ldmVudF9zcGVjaWZpZXIoZXZlbnRfY29kZSk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfVExfUk5DX1NVU1BFTkRfVFhfUlg6CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19UWF9SWF9TVVNQRU5ERUQpOworCQkJc2NpX3JuYy0+c3VzcGVuc2lvbl9jb2RlID0gc2N1X2dldF9ldmVudF9zcGVjaWZpZXIoZXZlbnRfY29kZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0OworCQl9CisJCWJyZWFrOworCWNhc2UgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9UTF9STkNfU1VTUEVORF9UWDoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1RYX1NVU1BFTkRFRCk7CisJCQlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9UTF9STkNfU1VTUEVORF9UWF9SWDoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRCk7CisJCQlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisJcmV0dXJuIFNDSV9TVUNDRVNTOworCisgb3V0OgorCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkgIiVzOiBjb2RlOiAlI3ggc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnRfY29kZSwgc3RhdGUpOworCXJldHVybiBTQ0lfRkFJTFVSRTsKKworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdHJ1Y3Qoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgICAgc2NpY3Nfc2RzX3JlbW90ZV9ub2RlX2NvbnRleHRfY2FsbGJhY2sgY2JfZm4sCisJCQkJCQkgICAgICB2b2lkICpjYl9wKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JOQ19JTlZBTElEQVRJTkc6CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3NldHVwX3RvX2Rlc3Rvcnkoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX1BPU1RJTkc6CisJY2FzZSBTQ0lfUk5DX1JFU1VNSU5HOgorCWNhc2UgU0NJX1JOQ19SRUFEWToKKwljYXNlIFNDSV9STkNfVFhfU1VTUEVOREVEOgorCWNhc2UgU0NJX1JOQ19UWF9SWF9TVVNQRU5ERUQ6CisJY2FzZSBTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT046CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3NldHVwX3RvX2Rlc3Rvcnkoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19JTlZBTElEQVRJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX0lOSVRJQUw6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJLyogV2UgaGF2ZSBkZWNpZGVkIHRoYXQgdGhlIGRlc3RydWN0IHJlcXVlc3Qgb24gdGhlIHJlbW90ZSBub2RlIGNvbnRleHQKKwkJICogY2FuIG5vdCBmYWlsIHNpbmNlIGl0IGlzIGVpdGhlciBpbiB0aGUgaW5pdGlhbC9kZXN0cm95ZWQgc3RhdGUgb3IgaXMKKwkJICogY2FuIGJlIGRlc3Ryb3llZC4KKwkJICovCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCSAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgICB1MzIgc3VzcGVuZF90eXBlLAorCQkJCQkJICAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYl9mbiwKKwkJCQkJCSAgICAgdm9pZCAqY2JfcCkKK3sKKwllbnVtIHNjaXNfc2RzX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBzY2lfcm5jLT5zbS5jdXJyZW50X3N0YXRlX2lkOworCWlmIChzdGF0ZSAhPSBTQ0lfUk5DX1JFQURZKSB7CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX3JuYy0+dXNlcl9jYWxsYmFjayAgID0gY2JfZm47CisJc2NpX3JuYy0+dXNlcl9jb29raWUgICAgID0gY2JfcDsKKwlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzdXNwZW5kX3R5cGU7CisKKwlpZiAoc3VzcGVuZF90eXBlID09IFNDSV9TT0ZUV0FSRV9TVVNQRU5TSU9OKSB7CisJCXNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChybmNfdG9fZGV2KHNjaV9ybmMpLAorCQkJCQkJICAgIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfU1VTUEVORF9UWCk7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfQVdBSVRfU1VTUEVOU0lPTik7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCSAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYl9mbiwKKwkJCQkJCSAgICB2b2lkICpjYl9wKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JOQ19JTklUSUFMOgorCQlpZiAoc2NpX3JuYy0+cmVtb3RlX25vZGVfaW5kZXggPT0gU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYKQorCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fcmVzdW1lKHNjaV9ybmMsIGNiX2ZuLCBjYl9wKTsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29uc3RydWN0X2J1ZmZlcihzY2lfcm5jKTsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUE9TVElORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfUE9TVElORzoKKwljYXNlIFNDSV9STkNfSU5WQUxJREFUSU5HOgorCWNhc2UgU0NJX1JOQ19SRVNVTUlORzoKKwkJaWYgKHNjaV9ybmMtPmRlc3RpbmF0aW9uX3N0YXRlICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1JFQURZKQorCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisKKwkJc2NpX3JuYy0+dXNlcl9jYWxsYmFjayA9IGNiX2ZuOworCQlzY2lfcm5jLT51c2VyX2Nvb2tpZSAgID0gY2JfcDsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JOQ19UWF9TVVNQRU5ERUQ6IHsKKwkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IHJuY190b19kZXYoc2NpX3JuYyk7CisJCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3NldHVwX3RvX3Jlc3VtZShzY2lfcm5jLCBjYl9mbiwgY2JfcCk7CisKKwkJLyogVE9ETzogY29uc2lkZXIgYWRkaW5nIGEgcmVzdW1lIGFjdGlvbiBvZiBOT05FLCBJTlZBTElEQVRFLCBXUklURV9UTENSICovCisJCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWIHx8IGRldl9pc19leHBhbmRlcihkZXYpKQorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVTVU1JTkcpOworCQllbHNlIGlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCQlpZiAoaWRldi0+aXNfZGlyZWN0X2F0dGFjaGVkKSB7CisJCQkJLyogQHRvZG8gRml4IHRoaXMgc2luY2UgSSBhbSBiZWluZyBzaWxseSBpbiB3cml0aW5nIHRvIHRoZSBTVFBUTERBUk5JIHJlZ2lzdGVyLiAqLworCQkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1JFU1VNSU5HKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfSU5WQUxJREFUSU5HKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisJY2FzZSBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRDoKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fcmVzdW1lKHNjaV9ybmMsIGNiX2ZuLCBjYl9wKTsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVTVU1JTkcpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9STkNfQVdBSVRfU1VTUEVOU0lPTjoKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fcmVzdW1lKHNjaV9ybmMsIGNiX2ZuLCBjYl9wKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfaW8oc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJCSAgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaXNfc2RzX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBzY2lfcm5jLT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JOQ19SRUFEWToKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JOQ19UWF9TVVNQRU5ERUQ6CisJY2FzZSBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRDoKKwljYXNlIFNDSV9STkNfQVdBSVRfU1VTUEVOU0lPTjoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJIiVzOiByZXF1ZXN0ZWQgdG8gc3RhcnQgSU8gd2hpbGUgc3RpbGwgcmVzdW1pbmcsICVkXG4iLAorCQlfX2Z1bmNfXywgc3RhdGUpOworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfdGFzayhzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaXNfc2RzX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBzY2lfcm5jLT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9STkNfUkVTVU1JTkc6CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCWNhc2UgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OOgorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX1RYX1NVU1BFTkRFRDoKKwljYXNlIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEOgorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoc2NpX3JuYywgTlVMTCwgTlVMTCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCSAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX2NvbnRleHQuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU4MGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0hfCisjZGVmaW5lIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0hfCisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmVzLCBjb25zdGFudHMsIGFuZCBwcm90b3R5cGVzIGFzc29jaWF0ZWQgd2l0aAorICogICAgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaW4gdGhlIHNpbGljb24uICBJdCBleGlzdHMgdG8gbW9kZWwgYW5kIG1hbmFnZQorICogICAgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaW4gdGhlIHNpbGljb24uCisgKgorICoKKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorCisvKioKKyAqCisgKgorICogVGhpcyBjb25zdGFudCByZXByZXNlbnRzIGFuIGludmFsaWQgcmVtb3RlIGRldmljZSBpZCwgaXQgaXMgdXNlZCB0byBwcm9ncmFtCisgKiB0aGUgU1RQREFSTkkgcmVnaXN0ZXIgc28gdGhlIGRyaXZlciBrbm93cyB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFNJR05BVFVSRQorICogRklTIGZyb20gdGhlIFNDVS4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVggICAgMHgwRkZGCisKKyNkZWZpbmUgU0NVX0hBUkRXQVJFX1NVU1BFTlNJT04gICgwKQorI2RlZmluZSBTQ0lfU09GVFdBUkVfU1VTUEVOU0lPTiAgKDEpCisKK3N0cnVjdCBpc2NpX3JlcXVlc3Q7CitzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlOworc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0OworCit0eXBlZGVmIHZvaWQgKCpzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjaykodm9pZCAqKTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBzdGF0ZXMuCisgKi8KK2VudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgeworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgdGhlIGluaXRpYWwgc3RhdGUgZm9yIGEgcmVtb3RlIG5vZGUgY29udGV4dC4gIE9uIGEgcmVzdW1lCisJICogcmVxdWVzdCB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCB3aWxsIHRyYW5zaXRpb24gdG8gdGhlIHBvc3Rpbmcgc3RhdGUuCisJICovCisJU0NJX1JOQ19JTklUSUFMLAorCisJLyoqCisJICogVGhpcyBpcyBhIHRyYW5zaXRpb24gc3RhdGUgdGhhdCBwb3N0cyB0aGUgUk5pIHRvIHRoZSBoYXJkd2FyZS4gT25jZSB0aGUgUk5DCisJICogaXMgcG9zdGVkIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHdpbGwgYmUgbWFkZSByZWFkeS4KKwkgKi8KKwlTQ0lfUk5DX1BPU1RJTkcsCisKKwkvKioKKwkgKiBUaGlzIGlzIGEgdHJhbnNpdGlvbiBzdGF0ZSB0aGF0IHdpbGwgcG9zdCBhbiBSTkMgaW52YWxpZGF0ZSB0byB0aGUKKwkgKiBoYXJkd2FyZS4gIE9uY2UgdGhlIGludmFsaWRhdGUgaXMgY29tcGxldGUgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgd2lsbAorCSAqIHRyYW5zaXRpb24gdG8gdGhlIHBvc3Rpbmcgc3RhdGUuCisJICovCisJU0NJX1JOQ19JTlZBTElEQVRJTkcsCisKKwkvKioKKwkgKiBUaGlzIGlzIGEgdHJhbnNpdGlvbiBzdGF0ZSB0aGF0IHdpbGwgcG9zdCBhbiBSTkMgcmVzdW1lIHRvIHRoZSBoYXJkYXJlLgorCSAqIE9uY2UgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbiBvZiByZXN1bWUgY29tcGxldGUgaXMgcmVjZWl2ZWQgdGhlIHJlbW90ZSBub2RlCisJICogY29udGV4dCB3aWxsIHRyYW5zaXRpb24gdG8gdGhlIHJlYWR5IHN0YXRlLgorCSAqLworCVNDSV9STkNfUkVTVU1JTkcsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzdGF0ZSB0aGF0IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG11c3QgYmUgaW4gdG8gYWNjZXB0IGlvCisJICogcmVxdWVzdCBvcGVyYXRpb25zLgorCSAqLworCVNDSV9STkNfUkVBRFksCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzdGF0ZSB0aGF0IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHRyYW5zaXRpb25zIHRvIHdoZW4gaXQgZ2V0cworCSAqIGEgVFggc3VzcGVuZCBub3RpZmljYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUuCisJICovCisJU0NJX1JOQ19UWF9TVVNQRU5ERUQsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzdGF0ZSB0aGF0IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHRyYW5zaXRpb25zIHRvIHdoZW4gaXQgZ2V0cworCSAqIGEgVFggUlggc3VzcGVuZCBub3RpZmljYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUuCisJICovCisJU0NJX1JOQ19UWF9SWF9TVVNQRU5ERUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIGEgd2FpdCBzdGF0ZSBmb3IgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgdGhhdCB3YWl0cyBmb3IgYQorCSAqIHN1c3BlbmQgbm90aWZpY2F0aW9uIGZyb20gdGhlIGhhcmR3YXJlLiAgVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIHdoZW4gZWl0aGVyCisJICogdGhlcmUgaXMgYSByZXF1ZXN0IHRvIHN1cGVuZCB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBvciB3aGVuIHRoZXJlIGlzIGEgVEMKKwkgKiBjb21wbGV0aW9uIHdoZXJlIHRoZSByZW1vdGUgbm9kZSB3aWxsIGJlIHN1c3BlbmRlZCBieSB0aGUgaGFyZHdhcmUuCisJICovCisJU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OCit9OworCisvKioKKyAqCisgKgorICogVGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgZW5kIGRlc3RpbmF0aW9uIHN0YXRlIGZvciB0aGUgcmVtb3RlCisgKiBub2RlIGNvbnRleHQuCisgKi8KK2VudW0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdGluYXRpb25fc3RhdGUgeworCVNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1VOU1BFQ0lGSUVELAorCVNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1JFQURZLAorCVNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX0ZJTkFMCit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAtIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBkYXRhCisgKiAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgb2JqZWN0LiAgVGhlIHJlbW90ZSBub2RlIGNvbnRleHQKKyAqICAgIChSTkMpIG9iamVjdCBtb2RlbHMgdGhlIHRoZSByZW1vdGUgZGV2aWNlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYW5hZ2UKKyAqICAgIHRoZSBzaWxpY29uIFJOQy4KKyAqLworc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgcmVtb3RlIG5vZGUgaW5kZXggKFJOSSkgYXNzb2NpYXRlZCB3aXRoCisJICogdGhpcyBSTkMuCisJICovCisJdTE2IHJlbW90ZV9ub2RlX2luZGV4OworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgcmVjb3JlZCBzdXNwZW5zaW9uIGNvZGUgb3IgdGhlIHJlYXNvbiBmb3IgdGhlIHJlbW90ZSBub2RlCisJICogY29udGV4dCBzdXNwZW5zaW9uLgorCSAqLworCXUzMiBzdXNwZW5zaW9uX2NvZGU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRydWUgaWYgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgcmVzdW1pbmcgZnJvbSBpdHMgY3VycmVudAorCSAqIHN0YXRlLiAgVGhpcyBjYW4gY2F1c2UgYW4gYXV0b21hdGljIHJlc3VtZSBvbiByZWNlaXZpbmcgYSBzdXNwZW5zaW9uCisJICogbm90aWZpY2F0aW9uLgorCSAqLworCWVudW0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdGluYXRpb25fc3RhdGUgZGVzdGluYXRpb25fc3RhdGU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSB1c2VyIHJlcXVlc3RlZCB0byBiZQorCSAqIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0ZWQgc3RhdGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS4KKwkgKi8KKwlzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayB1c2VyX2NhbGxiYWNrOworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgcGFyYW1ldGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcmVxdWVzdGVkCisJICogc3RhdGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZWQuCisJICovCisJdm9pZCAqdXNlcl9jb29raWU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgb2JqZWN0J3Mgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKK307CisKK3ZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29uc3RydWN0KHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jLAorCQkJCQkgICAgdTE2IHJlbW90ZV9ub2RlX2luZGV4KTsKKworCitib29sIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2lzX3JlYWR5KAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYyk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9ldmVudF9oYW5kbGVyKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCQkgICB1MzIgZXZlbnRfY29kZSk7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdHJ1Y3Qoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgICAgc2NpY3Nfc2RzX3JlbW90ZV9ub2RlX2NvbnRleHRfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCQkgICAgICB2b2lkICpjYWxsYmFja19wYXJhbWV0ZXIpOworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgICB1MzIgc3VzcGVuZF90eXBlLAorCQkJCQkJICAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYl9mbiwKKwkJCQkJCSAgICAgdm9pZCAqY2JfcCk7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCSAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYl9mbiwKKwkJCQkJCSAgICB2b2lkICpjYl9wKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF90YXNrKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbyhzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworI2VuZGlmICAvKiBfU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxYjMxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEUKKyAqICAgIHB1YmxpYywgcHJvdGVjdGVkLCBhbmQgcHJpdmF0ZSBtZXRob2RzLgorICoKKyAqCisgKi8KKyNpbmNsdWRlICJyZW1vdGVfbm9kZV90YWJsZS5oIgorI2luY2x1ZGUgInJlbW90ZV9ub2RlX2NvbnRleHQuaCIKKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSBpbmRleCB0YWJsZSBmcm9tIHdoaWNoIHRoZQorICogICAgc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KKyAqIEBncm91cF90YWJsZV9pbmRleDogVGhpcyBpcyB0aGUgaW5kZXggdG8gdGhlIGdyb3VwIHRhYmxlIGZyb20gd2hpY2ggdG8KKyAqICAgIHNlYXJjaCBmb3IgYW4gYXZhaWxhYmxlIHNlbGVjdGlvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBmaW5kIHRoZSBiaXQgcG9zaXRpb24gaW4gYWJzb2x1dGUgYml0IHRlcm1zIG9mIHRoZSBuZXh0IDMyCisgKiArIGJpdCBwb3NpdGlvbi4gIElmIHRoZXJlIGFyZSBhdmFpbGFibGUgYml0cyBpbiB0aGUgZmlyc3QgdTMyIHRoZW4gaXQgaXMKKyAqIGp1c3QgYml0IHBvc2l0aW9uLiB1MzIgVGhpcyBpcyB0aGUgYWJzb2x1dGUgYml0IHBvc2l0aW9uIGZvciBhbiBhdmFpbGFibGUKKyAqIGdyb3VwLgorICovCitzdGF0aWMgdTMyIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9nZXRfZ3JvdXBfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4KQoreworCXUzMiBkd29yZF9pbmRleDsKKwl1MzIgKmdyb3VwX3RhYmxlOworCXUzMiBiaXRfaW5kZXg7CisKKwlncm91cF90YWJsZSA9IHJlbW90ZV9ub2RlX3RhYmxlLT5yZW1vdGVfbm9kZV9ncm91cHNbZ3JvdXBfdGFibGVfaW5kZXhdOworCisJZm9yIChkd29yZF9pbmRleCA9IDA7IGR3b3JkX2luZGV4IDwgcmVtb3RlX25vZGVfdGFibGUtPmdyb3VwX2FycmF5X3NpemU7IGR3b3JkX2luZGV4KyspIHsKKwkJaWYgKGdyb3VwX3RhYmxlW2R3b3JkX2luZGV4XSAhPSAwKSB7CisJCQlmb3IgKGJpdF9pbmRleCA9IDA7IGJpdF9pbmRleCA8IDMyOyBiaXRfaW5kZXgrKykgeworCQkJCWlmICgoZ3JvdXBfdGFibGVbZHdvcmRfaW5kZXhdICYgKDEgPDwgYml0X2luZGV4KSkgIT0gMCkgeworCQkJCQlyZXR1cm4gKGR3b3JkX2luZGV4ICogMzIpICsgYml0X2luZGV4OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9JTlZBTElEX0lOREVYOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgaW4gd2hpY2ggdG8gY2xlYXIgdGhlCisgKiAgICBzZWxlY3Rvci4KKyAqIEBzZXRfaW5kZXg6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHNlbGVjdG9yIGluIHdoaWNoIHRoZSBjaGFuZ2Ugd2lsbCBiZQorICogICAgbWFkZS4KKyAqIEBncm91cF9pbmRleDogVGhpcyBpcyB0aGUgYml0IGluZGV4IGluIHRoZSB0YWJsZSB0byBiZSBtb2RpZmllZC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGNsZWFyIHRoZSBncm91cCBpbmRleCBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGdyb3VwIGluZGV4CisgKiB0YWJsZS4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXBfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4LAorCXUzMiBncm91cF9pbmRleCkKK3sKKwl1MzIgZHdvcmRfaW5kZXg7CisJdTMyIGJpdF9pbmRleDsKKwl1MzIgKmdyb3VwX3RhYmxlOworCisJQlVHX09OKGdyb3VwX3RhYmxlX2luZGV4ID49IFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpOworCUJVR19PTihncm91cF9pbmRleCA+PSAodTMyKShyZW1vdGVfbm9kZV90YWJsZS0+Z3JvdXBfYXJyYXlfc2l6ZSAqIDMyKSk7CisKKwlkd29yZF9pbmRleCA9IGdyb3VwX2luZGV4IC8gMzI7CisJYml0X2luZGV4ICAgPSBncm91cF9pbmRleCAlIDMyOworCWdyb3VwX3RhYmxlID0gcmVtb3RlX25vZGVfdGFibGUtPnJlbW90ZV9ub2RlX2dyb3Vwc1tncm91cF90YWJsZV9pbmRleF07CisKKwlncm91cF90YWJsZVtkd29yZF9pbmRleF0gPSBncm91cF90YWJsZVtkd29yZF9pbmRleF0gJiB+KDEgPDwgYml0X2luZGV4KTsKK30KKworLyoqCisgKgorICogQG91dF06IHJlbW90ZV9ub2RlX3RhYmxlIFRoaXMgdGhlIHJlbW90ZSBub2RlIHRhYmxlIGluIHdoaWNoIHRvIHNldCB0aGUKKyAqICAgIHNlbGVjdG9yLgorICogQGdyb3VwX3RhYmxlX2luZGV4OiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSBzZWxlY3RvciBpbiB3aGljaCB0aGUgY2hhbmdlCisgKiAgICB3aWxsIGJlIG1hZGUuCisgKiBAZ3JvdXBfaW5kZXg6IFRoaXMgaXMgdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgdGFibGUgdG8gYmUgbW9kaWZpZWQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIGdyb3VwIGluZGV4IGJpdCBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGdyb3B1IGluZGV4CisgKiB0YWJsZS4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiBncm91cF90YWJsZV9pbmRleCwKKwl1MzIgZ3JvdXBfaW5kZXgpCit7CisJdTMyIGR3b3JkX2luZGV4OworCXUzMiBiaXRfaW5kZXg7CisJdTMyICpncm91cF90YWJsZTsKKworCUJVR19PTihncm91cF90YWJsZV9pbmRleCA+PSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKTsKKwlCVUdfT04oZ3JvdXBfaW5kZXggPj0gKHUzMikocmVtb3RlX25vZGVfdGFibGUtPmdyb3VwX2FycmF5X3NpemUgKiAzMikpOworCisJZHdvcmRfaW5kZXggPSBncm91cF9pbmRleCAvIDMyOworCWJpdF9pbmRleCAgID0gZ3JvdXBfaW5kZXggJSAzMjsKKwlncm91cF90YWJsZSA9IHJlbW90ZV9ub2RlX3RhYmxlLT5yZW1vdGVfbm9kZV9ncm91cHNbZ3JvdXBfdGFibGVfaW5kZXhdOworCisJZ3JvdXBfdGFibGVbZHdvcmRfaW5kZXhdID0gZ3JvdXBfdGFibGVbZHdvcmRfaW5kZXhdIHwgKDEgPDwgYml0X2luZGV4KTsKK30KKworLyoqCisgKgorICogQG91dF06IHJlbW90ZV9ub2RlX3RhYmxlIFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHRhYmxlIGluIHdoaWNoIHRvIG1vZGlmeQorICogICAgdGhlIHJlbW90ZSBub2RlIGF2YWlsYWJpbGl0eS4KKyAqIEByZW1vdGVfbm9kZV9pbmRleDogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgaW5kZXggdGhhdCBpcyBiZWluZyByZXR1cm5lZCB0bworICogICAgdGhlIHRhYmxlLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSByZW1vdGUgdG8gYXZhaWxhYmxlIGluIHRoZSByZW1vdGUgbm9kZSBhbGxvY2F0aW9uCisgKiB0YWJsZS4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X25vZGVfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2luZGV4KQoreworCXUzMiBkd29yZF9sb2NhdGlvbjsKKwl1MzIgZHdvcmRfcmVtYWluZGVyOworCXUzMiBzbG90X25vcm1hbGl6ZWQ7CisJdTMyIHNsb3RfcG9zaXRpb247CisKKwlCVUdfT04oCisJCShyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX25vZGVzX2FycmF5X3NpemUgKiBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRCkKKwkJPD0gKHJlbW90ZV9ub2RlX2luZGV4IC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkKKwkJKTsKKworCWR3b3JkX2xvY2F0aW9uICA9IHJlbW90ZV9ub2RlX2luZGV4IC8gU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRDsKKwlkd29yZF9yZW1haW5kZXIgPSByZW1vdGVfbm9kZV9pbmRleCAlIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQ7CisJc2xvdF9ub3JtYWxpemVkID0gKGR3b3JkX3JlbWFpbmRlciAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpICogc2l6ZW9mKHUzMik7CisJc2xvdF9wb3NpdGlvbiAgID0gcmVtb3RlX25vZGVfaW5kZXggJSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbZHdvcmRfbG9jYXRpb25dIHw9CisJCTEgPDwgKHNsb3Rfbm9ybWFsaXplZCArIHNsb3RfcG9zaXRpb24pOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgZnJvbSB3aGljaCB0byBjbGVhcgorICogICAgdGhlIGF2YWlsYWJsZSByZW1vdGUgbm9kZSBiaXQuCisgKiBAcmVtb3RlX25vZGVfaW5kZXg6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIGluZGV4IHdoaWNoIGlzIHRvIGJlIGNsZWFyZWQKKyAqICAgIGZyb20gdGhlIHRhYmxlLgorICoKKyAqIFRoaXMgbWV0aG9kIGNsZWFycyB0aGUgcmVtb3RlIG5vZGUgaW5kZXggZnJvbSB0aGUgdGFibGUgb2YgYXZhaWxhYmxlIHJlbW90ZQorICogbm9kZXMuIG5vbmUKKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2NsZWFyX25vZGVfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2luZGV4KQoreworCXUzMiBkd29yZF9sb2NhdGlvbjsKKwl1MzIgZHdvcmRfcmVtYWluZGVyOworCXUzMiBzbG90X3Bvc2l0aW9uOworCXUzMiBzbG90X25vcm1hbGl6ZWQ7CisKKwlCVUdfT04oCisJCShyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX25vZGVzX2FycmF5X3NpemUgKiBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRCkKKwkJPD0gKHJlbW90ZV9ub2RlX2luZGV4IC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkKKwkJKTsKKworCWR3b3JkX2xvY2F0aW9uICA9IHJlbW90ZV9ub2RlX2luZGV4IC8gU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRDsKKwlkd29yZF9yZW1haW5kZXIgPSByZW1vdGVfbm9kZV9pbmRleCAlIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQ7CisJc2xvdF9ub3JtYWxpemVkID0gKGR3b3JkX3JlbWFpbmRlciAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpICogc2l6ZW9mKHUzMik7CisJc2xvdF9wb3NpdGlvbiAgID0gcmVtb3RlX25vZGVfaW5kZXggJSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbZHdvcmRfbG9jYXRpb25dICY9CisJCX4oMSA8PCAoc2xvdF9ub3JtYWxpemVkICsgc2xvdF9wb3NpdGlvbikpOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhlIHJlbW90ZSBub2RlIHRhYmxlIGZyb20gd2hpY2ggdGhlIHNsb3Qgd2lsbCBiZQorICogICAgY2xlYXJlZC4KKyAqIEBncm91cF9pbmRleDogVGhlIGluZGV4IGZvciB0aGUgc2xvdCB0aGF0IGlzIHRvIGJlIGNsZWFyZWQuCisgKgorICogVGhpcyBtZXRob2QgY2xlYXJzIHRoZSBlbnRpcmUgdGFibGUgc2xvdCBhdCB0aGUgc3BlY2lmaWVkIHNsb3QgaW5kZXguIG5vbmUKKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2NsZWFyX2dyb3VwKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiBncm91cF9pbmRleCkKK3sKKwl1MzIgZHdvcmRfbG9jYXRpb247CisJdTMyIGR3b3JkX3JlbWFpbmRlcjsKKwl1MzIgZHdvcmRfdmFsdWU7CisKKwlCVUdfT04oCisJCShyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX25vZGVzX2FycmF5X3NpemUgKiBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRCkKKwkJPD0gKGdyb3VwX2luZGV4IC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkKKwkJKTsKKworCWR3b3JkX2xvY2F0aW9uICA9IGdyb3VwX2luZGV4IC8gU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQ7CisJZHdvcmRfcmVtYWluZGVyID0gZ3JvdXBfaW5kZXggJSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRDsKKworCWR3b3JkX3ZhbHVlID0gcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbZHdvcmRfbG9jYXRpb25dOworCWR3b3JkX3ZhbHVlICY9IH4oU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFIDw8IChkd29yZF9yZW1haW5kZXIgKiA0KSk7CisJcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbZHdvcmRfbG9jYXRpb25dID0gZHdvcmRfdmFsdWU7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZToKKyAqCisgKiBUSGlzIG1ldGhvZCBzZXRzIGFuIGVudGlyZSByZW1vdGUgbm9kZSBncm91cCBpbiB0aGUgcmVtb3RlIG5vZGUgdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXAoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX2luZGV4KQoreworCXUzMiBkd29yZF9sb2NhdGlvbjsKKwl1MzIgZHdvcmRfcmVtYWluZGVyOworCXUzMiBkd29yZF92YWx1ZTsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAoZ3JvdXBfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gZ3JvdXBfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRDsKKwlkd29yZF9yZW1haW5kZXIgPSBncm91cF9pbmRleCAlIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCisJZHdvcmRfdmFsdWUgPSByZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl07CisJZHdvcmRfdmFsdWUgfD0gKFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0ZVTExfU0xPVF9WQUxVRSA8PCAoZHdvcmRfcmVtYWluZGVyICogNCkpOworCXJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzW2R3b3JkX2xvY2F0aW9uXSA9IGR3b3JkX3ZhbHVlOworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHRhYmxlIHRoYXQgZm9yIHdoaWNoIHRoZSBncm91cAorICogICAgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQuCisgKiBAZ3JvdXBfaW5kZXg6IFRoaXMgaXMgdGhlIGdyb3VwIGluZGV4IHRvIHVzZSB0byBmaW5kIHRoZSBncm91cCB2YWx1ZS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZ3JvdXAgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgZ3JvdXAgaW5kZXguIFRoZQorICogYml0IHZhbHVlcyBhdCB0aGUgc3BlY2lmaWVkIHJlbW90ZSBub2RlIGdyb3VwIGluZGV4LgorICovCitzdGF0aWMgdTggc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2dldF9ncm91cF92YWx1ZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIGR3b3JkX3ZhbHVlOworCisJZHdvcmRfbG9jYXRpb24gID0gZ3JvdXBfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRDsKKwlkd29yZF9yZW1haW5kZXIgPSBncm91cF9pbmRleCAlIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCisJZHdvcmRfdmFsdWUgPSByZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl07CisJZHdvcmRfdmFsdWUgJj0gKFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0ZVTExfU0xPVF9WQUxVRSA8PCAoZHdvcmRfcmVtYWluZGVyICogNCkpOworCWR3b3JkX3ZhbHVlID0gZHdvcmRfdmFsdWUgPj4gKGR3b3JkX3JlbWFpbmRlciAqIDQpOworCisJcmV0dXJuICh1OClkd29yZF92YWx1ZTsKK30KKworLyoqCisgKgorICogQG91dF06IHJlbW90ZV9ub2RlX3RhYmxlIFRoZSByZW1vdGUgdGhhdCB3aGljaCBpcyB0byBiZSBpbml0aWFsaXplZC4KKyAqIEByZW1vdGVfbm9kZV9lbnRyaWVzOiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gcHV0IGluIHRoZSB0YWJsZS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGluaXRpYWxpemUgdGhlIHJlbW90ZSBub2RlIHRhYmxlIGZvciB1c2UuIG5vbmUKKyAqLwordm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfZW50cmllcykKK3sKKwl1MzIgaW5kZXg7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHJhdyBkYXRhIHdlIGNvdWxkIGltcHJvdmUgdGhlIHNwZWVkIGJ5IG9ubHkgaW5pdGlhbGl6aW5nCisJICogdGhvc2UgZW50cmllcyB0aGF0IHdlIGFyZSBhY3R1YWxseSBnb2luZyB0byBiZSB1c2VkICovCisJbWVtc2V0KAorCQlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywKKwkJMHgwMCwKKwkJc2l6ZW9mKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzKQorCQkpOworCisJbWVtc2V0KAorCQlyZW1vdGVfbm9kZV90YWJsZS0+cmVtb3RlX25vZGVfZ3JvdXBzLAorCQkweDAwLAorCQlzaXplb2YocmVtb3RlX25vZGVfdGFibGUtPnJlbW90ZV9ub2RlX2dyb3VwcykKKwkJKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGF2YWlsYWJsZSByZW1vdGUgbm9kZSBzZXRzICovCisJcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9ub2Rlc19hcnJheV9zaXplID0gKHUxNikKKwkJCQkJCQkocmVtb3RlX25vZGVfZW50cmllcyAvIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQpCisJCQkJCQkJKyAoKHJlbW90ZV9ub2RlX2VudHJpZXMgJSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEKSAhPSAwKTsKKworCisJLyogSW5pdGlhbGl6ZSBlYWNoIGZ1bGwgRFdPUkQgdG8gYSBGVUxMIFNFVCBvZiByZW1vdGUgbm9kZXMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCByZW1vdGVfbm9kZV9lbnRyaWVzOyBpbmRleCsrKSB7CisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfbm9kZV9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgaW5kZXgpOworCX0KKworCXJlbW90ZV9ub2RlX3RhYmxlLT5ncm91cF9hcnJheV9zaXplID0gKHUxNikKKwkJCQkJICAgICAgKHJlbW90ZV9ub2RlX2VudHJpZXMgLyAoU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCAqIDMyKSkKKwkJCQkJICAgICAgKyAoKHJlbW90ZV9ub2RlX2VudHJpZXMgJSAoU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCAqIDMyKSkgIT0gMCk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAocmVtb3RlX25vZGVfZW50cmllcyAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpOyBpbmRleCsrKSB7CisJCS8qCisJCSAqIFRoZXNlIGFyZSBhbGwgZ3VhcmFudGVlZCB0byBiZSBmdWxsIHNsb3QgdmFsdWVzIHNvIGZpbGwgdGhlbSBpbiB0aGUKKwkJICogYXZhaWxhYmxlIHNldHMgb2YgMyByZW1vdGUgbm9kZXMgKi8KKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMiwgaW5kZXgpOworCX0KKworCS8qIE5vdyBmaWxsIGluIGFueSByZW1haW5kZXJzIHRoYXQgd2UgbWF5IGZpbmQgKi8KKwlpZiAoKHJlbW90ZV9ub2RlX2VudHJpZXMgJSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSA9PSAyKSB7CisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgocmVtb3RlX25vZGVfdGFibGUsIDEsIGluZGV4KTsKKwl9IGVsc2UgaWYgKChyZW1vdGVfbm9kZV9lbnRyaWVzICUgU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgPT0gMSkgeworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAwLCBpbmRleCk7CisJfQorfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhlIHJlbW90ZSBub2RlIHRhYmxlIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgYQorICogICAgcmVtb3RlIG5vZGUuCisgKiBAdGFibGVfaW5kZXg6IFRoZSBncm91cCBpbmRleCB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBzZWFyY2guCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBhbGxvY2F0ZSBhIHNpbmdsZSBSTmkgZnJvbSB0aGUgcmVtb3RlIG5vZGUgdGFibGUuICBUaGUKKyAqIHRhYmxlIGluZGV4IHdpbGwgZGV0ZXJtaW5lIGZyb20gd2hpY2ggcmVtb3RlIG5vZGUgZ3JvdXAgdGFibGUgdG8gc2VhcmNoLgorICogVGhpcyBzZWFyY2ggbWF5IGZhaWwgYW5kIGFub3RoZXIgZ3JvdXAgbm9kZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhlCisgKiBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBhbGxvdyBhIHNlcmFjaCBvZiB0aGUgYXZhaWxhYmxlIHNpbmdsZSByZW1vdGUgbm9kZQorICogZ3JvdXAgdXAgdG8gdGhlIHRyaXBsZSByZW1vdGUgbm9kZSBncm91cC4gIElmIGFuIGVudHJ5IGlzIGZvdW5kIGluIHRoZQorICogc3BlY2lmaWVkIHRhYmxlIHRoZSByZW1vdGUgbm9kZSBpcyByZW1vdmVkIGFuZCB0aGUgcmVtb3RlIG5vZGUgZ3JvdXBzIGFyZQorICogdXBkYXRlZC4gVGhlIFJOaSB2YWx1ZSBvciBhbiBpbnZhbGlkIHJlbW90ZSBub2RlIGNvbnRleHQgaWYgYW4gUk5pIGNhbiBub3QKKyAqIGJlIGZvdW5kLgorICovCitzdGF0aWMgdTE2IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4KQoreworCXU4IGluZGV4OworCXU4IGdyb3VwX3ZhbHVlOworCXUzMiBncm91cF9pbmRleDsKKwl1MTYgcmVtb3RlX25vZGVfaW5kZXggPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVg7CisKKwlncm91cF9pbmRleCA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9nZXRfZ3JvdXBfaW5kZXgoCisJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCk7CisKKwkvKiBXZSBjb3VsZCBub3QgZmluZCBhbiBhdmFpbGFibGUgc2xvdCBpbiB0aGUgdGFibGUgc2VsZWN0b3IgMCAqLworCWlmIChncm91cF9pbmRleCAhPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9JTlZBTElEX0lOREVYKSB7CisJCWdyb3VwX3ZhbHVlID0gc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2dldF9ncm91cF92YWx1ZSgKKwkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF9pbmRleCk7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVDsgaW5kZXgrKykgeworCQkJaWYgKCgoMSA8PCBpbmRleCkgJiBncm91cF92YWx1ZSkgIT0gMCkgeworCQkJCS8qIFdlIGhhdmUgc2VsZWN0ZWQgYSBiaXQgbm93IGNsZWFyIGl0ICovCisJCQkJcmVtb3RlX25vZGVfaW5kZXggPSAodTE2KShncm91cF9pbmRleCAqIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQKKwkJCQkJCQkgICsgaW5kZXgpOworCisJCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2NsZWFyX2dyb3VwX2luZGV4KAorCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgZ3JvdXBfdGFibGVfaW5kZXgsIGdyb3VwX2luZGV4CisJCQkJCSk7CisKKwkJCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfbm9kZV9pbmRleCgKKwkJCQkJcmVtb3RlX25vZGVfdGFibGUsIHJlbW90ZV9ub2RlX2luZGV4CisJCQkJCSk7CisKKwkJCQlpZiAoZ3JvdXBfdGFibGVfaW5kZXggPiAwKSB7CisJCQkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgoCisJCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgZ3JvdXBfdGFibGVfaW5kZXggLSAxLCBncm91cF9pbmRleAorCQkJCQkJKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZW1vdGVfbm9kZV9pbmRleDsKK30KKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRoZQorICogICAgcmVtb3RlIG5vZGUgZW50cmllcy4KKyAqIEBncm91cF90YWJsZV9pbmRleDogVEhpcyBpcyB0aGUgZ3JvdXAgdGFibGUgaW5kZXggd2hpY2ggbXVzdCBlcXVhbCB0d28gKDIpCisgKiAgICBmb3IgdGhpcyBvcGVyYXRpb24uCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBhbGxvY2F0ZSB0aHJlZSBjb25zZWN1dGl2ZSByZW1vdGUgbm9kZSBjb250ZXh0IGVudHJpZXMuIElmCisgKiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHRyaXBsZSBlbnRyaWVzIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIGZhaWx1cmUuCisgKiBUaGUgcmVtb3RlIG5vZGUgaW5kZXggdGhhdCByZXByZXNlbnRzIHRocmVlIGNvbnNlY3V0aXZlIHJlbW90ZSBub2RlIGVudHJpZXMKKyAqIG9yIGFuIGludmFsaWQgcmVtb3RlIG5vZGUgY29udGV4dCBpZiBub25lIGNhbiBiZSBmb3VuZC4KKyAqLworc3RhdGljIHUxNiBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfdHJpcGxlX3JlbW90ZV9ub2RlKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiBncm91cF90YWJsZV9pbmRleCkKK3sKKwl1MzIgZ3JvdXBfaW5kZXg7CisJdTE2IHJlbW90ZV9ub2RlX2luZGV4ID0gU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYOworCisJZ3JvdXBfaW5kZXggPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfZ2V0X2dyb3VwX2luZGV4KAorCQlyZW1vdGVfbm9kZV90YWJsZSwgZ3JvdXBfdGFibGVfaW5kZXgpOworCisJaWYgKGdyb3VwX2luZGV4ICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0lOVkFMSURfSU5ERVgpIHsKKwkJcmVtb3RlX25vZGVfaW5kZXggPSAodTE2KWdyb3VwX2luZGV4ICogU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVDsKKworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXBfaW5kZXgoCisJCQlyZW1vdGVfbm9kZV90YWJsZSwgZ3JvdXBfdGFibGVfaW5kZXgsIGdyb3VwX2luZGV4CisJCQkpOworCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cCgKKwkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF9pbmRleAorCQkJKTsKKwl9CisKKwlyZXR1cm4gcmVtb3RlX25vZGVfaW5kZXg7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgZnJvbSB3aGljaCB0aGUgcmVtb3RlIG5vZGUKKyAqICAgIGFsbG9jYXRpb24gaXMgdG8gdGFrZSBwbGFjZS4KKyAqIEByZW1vdGVfbm9kZV9jb3VudDogVGhpcyBpcyB0aGVyIHJlbW90ZSBub2RlIGNvdW50IHdoaWNoIGlzIG9uZSBvZgorICogICAgU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVCgxKSBvciBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKDMpLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgYWxsb2NhdGUgYSByZW1vdGUgbm9kZSB0aGF0IG1hdGFjaGVzIHRoZSByZW1vdGUgbm9kZSBjb3VudAorICogc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIuICBWYWxpZCB2YWx1ZXMgZm9yIHJlbW90ZSBub2RlIGNvdW50IGlzCisgKiBTQ1VfU1NQX1JFTU9URV9OT0RFX0NPVU5UKDEpIG9yIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQoMykuIHUxNiBUaGlzIGlzCisgKiB0aGUgcmVtb3RlIG5vZGUgaW5kZXggdGhhdCBpcyByZXR1cm5lZCBvciBhbiBpbnZhbGlkIHJlbW90ZSBub2RlIGNvbnRleHQuCisgKi8KK3UxNiBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2NvdW50KQoreworCXUxNiByZW1vdGVfbm9kZV9pbmRleCA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWDsKKworCWlmIChyZW1vdGVfbm9kZV9jb3VudCA9PSBTQ1VfU1NQX1JFTU9URV9OT0RFX0NPVU5UKSB7CisJCXJlbW90ZV9ub2RlX2luZGV4ID0KKwkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJCQkJcmVtb3RlX25vZGVfdGFibGUsIDApOworCisJCWlmIChyZW1vdGVfbm9kZV9pbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpIHsKKwkJCXJlbW90ZV9ub2RlX2luZGV4ID0KKwkJCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfc2luZ2xlX3JlbW90ZV9ub2RlKAorCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMSk7CisJCX0KKworCQlpZiAocmVtb3RlX25vZGVfaW5kZXggPT0gU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYKSB7CisJCQlyZW1vdGVfbm9kZV9pbmRleCA9CisJCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwkJCQkJcmVtb3RlX25vZGVfdGFibGUsIDIpOworCQl9CisJfSBlbHNlIGlmIChyZW1vdGVfbm9kZV9jb3VudCA9PSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSB7CisJCXJlbW90ZV9ub2RlX2luZGV4ID0KKwkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV90cmlwbGVfcmVtb3RlX25vZGUoCisJCQkJcmVtb3RlX25vZGVfdGFibGUsIDIpOworCX0KKworCXJldHVybiByZW1vdGVfbm9kZV9pbmRleDsKK30KKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgZnJlZSBhIHNpbmdsZSByZW1vdGUgbm9kZSBpbmRleCBiYWNrIHRvIHRoZSByZW1vdGUgbm9kZQorICogdGFibGUuICBUaGlzIHJvdXRpbmUgd2lsbCB1cGRhdGUgdGhlIHJlbW90ZSBub2RlIGdyb3VwcworICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTE2IHJlbW90ZV9ub2RlX2luZGV4KQoreworCXUzMiBncm91cF9pbmRleDsKKwl1OCBncm91cF92YWx1ZTsKKworCWdyb3VwX2luZGV4ID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJZ3JvdXBfdmFsdWUgPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfZ2V0X2dyb3VwX3ZhbHVlKHJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF9pbmRleCk7CisKKwkvKgorCSAqIEFzc2VydCB0aGF0IHdlIGFyZSBub3QgdHJ5aW5nIHRvIGFkZCBhbiBlbnRyeSB0byBhIHNsb3QgdGhhdCBpcyBhbHJlYWR5CisJICogZnVsbC4gKi8KKwlCVUdfT04oZ3JvdXBfdmFsdWUgPT0gU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFKTsKKworCWlmIChncm91cF92YWx1ZSA9PSAweDAwKSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBubyBlbnRyaWVzIGluIHRoaXMgc2xvdCBzbyBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBzaW5nbGUKKwkJICogc2xvdCB0YWJsZS4gKi8KKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMCwgZ3JvdXBfaW5kZXgpOworCX0gZWxzZSBpZiAoKGdyb3VwX3ZhbHVlICYgKGdyb3VwX3ZhbHVlIC0gMSkpID09IDApIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgb25seSBvbmUgZW50cnkgaW4gdGhpcyBzbG90IHNvIGl0IG11c3QgYmUgbW92ZWQgZnJvbSB0aGUKKwkJICogc2luZ2xlIHNsb3QgdGFibGUgdG8gdGhlIGR1YWwgc2xvdCB0YWJsZSAqLworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXBfaW5kZXgocmVtb3RlX25vZGVfdGFibGUsIDAsIGdyb3VwX2luZGV4KTsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMSwgZ3JvdXBfaW5kZXgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSB0d28gZW50cmllcyBpbiB0aGUgc2xvdCBzbyBpdCBtdXN0IGJlIG1vdmVkIGZyb20gdGhlIGR1YWwKKwkJICogc2xvdCB0YWJsZSB0byB0aGUgdHJpcHBsZSBzbG90IHRhYmxlLiAqLworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXBfaW5kZXgocmVtb3RlX25vZGVfdGFibGUsIDEsIGdyb3VwX2luZGV4KTsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMiwgZ3JvdXBfaW5kZXgpOworCX0KKworCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfbm9kZV9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHRhYmxlIHRvIHdoaWNoIHRoZSByZW1vdGUgbm9kZQorICogICAgaW5kZXggaXMgdG8gYmUgZnJlZWQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZWxlYXNlIGEgZ3JvdXAgb2YgdGhyZWUgY29uc2VjdXRpdmUgcmVtb3RlIG5vZGVzIGJhY2sgdG8KKyAqIHRoZSBmcmVlIHJlbW90ZSBub2Rlcy4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3JlbGVhc2VfdHJpcGxlX3JlbW90ZV9ub2RlKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUxNiByZW1vdGVfbm9kZV9pbmRleCkKK3sKKwl1MzIgZ3JvdXBfaW5kZXg7CisKKwlncm91cF9pbmRleCA9IHJlbW90ZV9ub2RlX2luZGV4IC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVDsKKworCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgoCisJCXJlbW90ZV9ub2RlX3RhYmxlLCAyLCBncm91cF9pbmRleAorCQkpOworCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cChyZW1vdGVfbm9kZV90YWJsZSwgZ3JvdXBfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoZSByZW1vdGUgbm9kZSB0YWJsZSB0byB3aGljaCB0aGUgcmVtb3RlIG5vZGUgaW5kZXggaXMKKyAqICAgIHRvIGJlIGZyZWVkLgorICogQHJlbW90ZV9ub2RlX2NvdW50OiBUaGlzIGlzIHRoZSBjb3VudCBvZiBjb25zZWN1dGl2ZSByZW1vdGUgbm9kZXMgdGhhdCBhcmUKKyAqICAgIHRvIGJlIGZyZWVkLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmVsZWFzZSB0aGUgcmVtb3RlIG5vZGUgaW5kZXggYmFjayBpbnRvIHRoZSByZW1vdGUgbm9kZQorICogdGFibGUgZnJlZSBwb29sLgorICovCit2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3JlbW90ZV9ub2RlX2luZGV4KAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiByZW1vdGVfbm9kZV9jb3VudCwKKwl1MTYgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJaWYgKHJlbW90ZV9ub2RlX2NvdW50ID09IFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQpIHsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3JlbGVhc2Vfc2luZ2xlX3JlbW90ZV9ub2RlKAorCQkJcmVtb3RlX25vZGVfdGFibGUsIHJlbW90ZV9ub2RlX2luZGV4KTsKKwl9IGVsc2UgaWYgKHJlbW90ZV9ub2RlX2NvdW50ID09IFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpIHsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3JlbGVhc2VfdHJpcGxlX3JlbW90ZV9ub2RlKAorCQkJcmVtb3RlX25vZGVfdGFibGUsIHJlbW90ZV9ub2RlX2luZGV4KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMWFiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV90YWJsZS5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9IXworI2RlZmluZSBfU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfSF8KKworI2luY2x1ZGUgImlzY2kuaCIKKworLyoqCisgKgorICoKKyAqIFJlbW90ZSBub2RlIHNldHMgYXJlIHNldHMgb2YgcmVtb3RlIG5vZGUgaW5kZXggaW4gdGhlIHJlbXRvZSBub2RlIHRhYmxlIFRoZQorICogU0NVIGhhcmR3YXJlIHJlcXVpcmVzIHRoYXQgU1RQIHJlbW90ZSBub2RlIGVudHJpZXMgdGFrZSB0aHJlZSBjb25zZWN1dGl2ZQorICogcmVtb3RlIG5vZGUgaW5kZXggc28gdGhlIHRhYmxlIGlzIGFycmFuZ2VkIGluIHNldHMgb2YgdGhyZWUuIFRoZSBiaXRzIGFyZQorICogdXNlZCBhcyAwMTExIDAxMTEgdG8gbWFrZSBhIGJ5dGUgYW5kIHRoZSBiaXRzIGRlZmluZSB0aGUgc2V0IG9mIHRocmVlIHJlbW90ZQorICogbm9kZXMgdG8gdXNlIGFzIGEgc2VxdWVuY2UuCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfQllURSAyCisKKy8qKgorICoKKyAqCisgKiBTaW5jZSB0aGUgcmVtb3RlIG5vZGUgdGFibGUgaXMgb3JnYW5pemVkIGFzIERXT1JEUyB0YWtlIHRoZSByZW1vdGUgbm9kZSBzZXRzCisgKiBpbiBieXRlcyBhbmQgcmVwcmVzZW50IHRoZW0gaW4gRFdPUkRzLiBUaGUgbG93ZXN0IG9yZGVyZWQgYml0cyBhcmUgdGhlIG9uZXMKKyAqIHVzZWQgaW4gY2FzZSBmdWxsIERXT1JEIGlzIG5vdCBiZWluZyB1c2VkLiBpLmUuIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDExMQorICogMDExMSAwMTExIDAxMTEgLy8gaWYgb25seSBhIHNpbmdsZSBXT1JEIGlzIGluIHVzZSBpbiB0aGUgRFdPUkQuCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQgXAorCShzaXplb2YodTMyKSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0JZVEUpCisvKioKKyAqCisgKgorICogVGhpcyBpcyBhIGNvdW50IG9mIHRoZSBudW1lYmVyIG9mIHJlbW90ZSBub2RlcyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBhCisgKiBieXRlCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9CWVRFCVwKKwkoU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0JZVEUpCisKKy8qKgorICoKKyAqCisgKiBUaGlzIGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiByZW1vdGUgbm9kZXMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gYQorICogRFdST0QKKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JECVwKKwkoc2l6ZW9mKHUzMikgKiBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0JZVEUpCisKKy8qKgorICoKKyAqCisgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIHJlbW90ZSBub2RlIGdyb3VwCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVTX0JJVFNfUEVSX0dST1VQICAgNAorCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0lOVkFMSURfSU5ERVggICAgICAoMHhGRkZGRkZGRikKKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFICAgICgweDA3KQorI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9FTVBUWV9TTE9UX1ZBTFVFICAgKDB4MDApCisKKy8qKgorICoKKyAqCisgKiBFeHBhbmRlciBhdHRhY2hlZCBzYXRhIHJlbW90ZSBub2RlIGNvdW50CisgKi8KKyNkZWZpbmUgU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCAgICAgICAgMworCisvKioKKyAqCisgKgorICogRXhwYW5kZXIgb3IgZGlyZWN0IGF0dGFjaGVkIHNzcCByZW1vdGUgbm9kZSBjb3VudAorICovCisjZGVmaW5lIFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQgICAgICAgIDEKKworLyoqCisgKgorICoKKyAqIERpcmVjdCBhdHRhY2hlZCBTVFAgcmVtb3RlIG5vZGUgY291bnQKKyAqLworI2RlZmluZSBTQ1VfU0FUQV9SRU1PVEVfTk9ERV9DT1VOVCAgICAgICAxCisKKy8qKgorICogc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAtCisgKgorICoKKyAqLworc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSB7CisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgYXJyYXkgc2l6ZSBpbiBkd29yZHMKKwkgKi8KKwl1MTYgYXZhaWxhYmxlX25vZGVzX2FycmF5X3NpemU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBhcnJheSBzaXplIG9mIHRoZQorCSAqLworCXUxNiBncm91cF9hcnJheV9zaXplOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgYXJyYXkgb2YgYXZhaWxhYmxlIHJlbW90ZSBub2RlIGVudHJpZXMgaW4gYml0cy4KKwkgKiBCZWNhdXNlIG9mIHRoZSB3YXkgU1RQIHJlbW90ZSBub2RlIGRhdGEgaXMgYWxsb2NhdGVkIG9uIHRoZSBTQ1UgaGFyZHdhcmUKKwkgKiB0aGUgcmVtb3RlIG5vZGVzIG11c3Qgb2NjdXB5IHRocmVlIGNvbnNlY3V0aXZlIHJlbW90ZSBub2RlIGNvbnRleHQKKwkgKiBlbnRyaWVzLiAgRm9yIGVhc2Ugb2YgYWxsb2NhdGlvbiBhbmQgZGUtYWxsb2NhdGlvbiB3ZSBoYXZlIGJyb2tlbiB0aGUKKwkgKiBzZXRzIG9mIHRocmVlIGludG8gYSBzaW5nbGUgbmliYmxlLiAgV2hlbiB0aGUgU1RQIFJOaSBpcyBhbGxvY2F0ZWQgYWxsCisJICogb2YgdGhlIGJpdHMgaW4gdGhlIG5pYmJsZSBhcmUgY2xlYXJlZC4gIFRoaXMgbWF0aCByZXN1bHRzIGluIGEgdGFibGUgc2l6ZQorCSAqIG9mIE1BWF9SRU1PVEVfTk9ERVMgLyBDT05TRUNVVElWRSBSTmkgRU5UUklFUyBmb3IgU1RQIC8gMiBlbnRyaWVzIHBlciBieXRlLgorCSAqLworCXUzMiBhdmFpbGFibGVfcmVtb3RlX25vZGVzWworCQkoU0NJX01BWF9SRU1PVEVfREVWSUNFUyAvIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQpCisJCSsgKChTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTICUgU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRCkgIT0gMCldOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgbmliYmxlIHNlbGVjdG9yIGZvciB0aGUgYWJvdmUgdGFibGUuICBUaGVyZSBhcmUgdGhyZWUKKwkgKiBwb3NzaWJsZSBzZWxlY3RvcnMgZWFjaCBmb3IgZmFzdCBsb29rdXAgd2hlbiB0cnlpbmcgdG8gZmluZCBvbmUsIHR3byBvcgorCSAqIHRocmVlIHJlbW90ZSBub2RlIGVudHJpZXMuCisJICovCisJdTMyIHJlbW90ZV9ub2RlX2dyb3Vwc1sKKwkJU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVF1bCisJCShTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTIC8gKDMyICogU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkpCisJCSsgKChTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTICUgKDMyICogU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkpICE9IDApXTsKKworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2luaXRpYWxpemUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2VudHJpZXMpOworCit1MTYgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3JlbW90ZV9ub2RlKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiByZW1vdGVfbm9kZV9jb3VudCk7CisKK3ZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3JlbGVhc2VfcmVtb3RlX25vZGVfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2NvdW50LAorCXUxNiByZW1vdGVfbm9kZV9pbmRleCk7CisKKyNlbmRpZiAvKiBfU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZlMDdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCkBAIC0wLDAgKzEsMzM5MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicmVxdWVzdC5oIgorI2luY2x1ZGUgInNjdV9jb21wbGV0aW9uX2NvZGVzLmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAic2FzLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnRvX3NnbF9lbGVtZW50X3BhaXIoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCQlpbnQgaWR4KQoreworCWlmIChpZHggPT0gMCkKKwkJcmV0dXJuICZpcmVxLT50Yy0+c2dsX3BhaXJfYWI7CisJZWxzZSBpZiAoaWR4ID09IDEpCisJCXJldHVybiAmaXJlcS0+dGMtPnNnbF9wYWlyX2NkOworCWVsc2UgaWYgKGlkeCA8IDApCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuICZpcmVxLT5zZ190YWJsZVtpZHggLSAyXTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgdG9fc2dsX2VsZW1lbnRfcGFpcl9kbWEoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwgdTMyIGlkeCkKK3sKKwl1MzIgb2Zmc2V0OworCisJaWYgKGlkeCA9PSAwKSB7CisJCW9mZnNldCA9ICh2b2lkICopICZpcmVxLT50Yy0+c2dsX3BhaXJfYWIgLQorCQkJICh2b2lkICopICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlWzBdOworCQlyZXR1cm4gaWhvc3QtPnRhc2tfY29udGV4dF9kbWEgKyBvZmZzZXQ7CisJfSBlbHNlIGlmIChpZHggPT0gMSkgeworCQlvZmZzZXQgPSAodm9pZCAqKSAmaXJlcS0+dGMtPnNnbF9wYWlyX2NkIC0KKwkJCSAodm9pZCAqKSAmaWhvc3QtPnRhc2tfY29udGV4dF90YWJsZVswXTsKKwkJcmV0dXJuIGlob3N0LT50YXNrX2NvbnRleHRfZG1hICsgb2Zmc2V0OworCX0KKworCXJldHVybiBzY2lfaW9fcmVxdWVzdF9nZXRfZG1hX2FkZHIoaXJlcSwgJmlyZXEtPnNnX3RhYmxlW2lkeCAtIDJdKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zZ2xfZWxlbWVudChzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50ICplLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCWUtPmxlbmd0aCA9IHNnX2RtYV9sZW4oc2cpOworCWUtPmFkZHJlc3NfdXBwZXIgPSB1cHBlcl8zMl9iaXRzKHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJZS0+YWRkcmVzc19sb3dlciA9IGxvd2VyXzMyX2JpdHMoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwllLT5hZGRyZXNzX21vZGlmaWVyID0gMDsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlcXVlc3RfYnVpbGRfc2dsKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5pc2NpX2hvc3Q7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBOVUxMOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTMyIHNnX2lkeCA9IDA7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyICpzY3Vfc2cgICA9IE5VTEw7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyICpwcmV2X3NnICA9IE5VTEw7CisKKwlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPiAwKSB7CisJCXNnID0gdGFzay0+c2NhdHRlcjsKKworCQl3aGlsZSAoc2cpIHsKKwkJCXNjdV9zZyA9IHRvX3NnbF9lbGVtZW50X3BhaXIoaXJlcSwgc2dfaWR4KTsKKwkJCWluaXRfc2dsX2VsZW1lbnQoJnNjdV9zZy0+QSwgc2cpOworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCWlmIChzZykgeworCQkJCWluaXRfc2dsX2VsZW1lbnQoJnNjdV9zZy0+Qiwgc2cpOworCQkJCXNnID0gc2dfbmV4dChzZyk7CisJCQl9IGVsc2UKKwkJCQltZW1zZXQoJnNjdV9zZy0+QiwgMCwgc2l6ZW9mKHNjdV9zZy0+QikpOworCisJCQlpZiAocHJldl9zZykgeworCQkJCWRtYV9hZGRyID0gdG9fc2dsX2VsZW1lbnRfcGFpcl9kbWEoaWhvc3QsCisJCQkJCQkJCSAgIGlyZXEsCisJCQkJCQkJCSAgIHNnX2lkeCk7CisKKwkJCQlwcmV2X3NnLT5uZXh0X3BhaXJfdXBwZXIgPQorCQkJCQl1cHBlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKwkJCQlwcmV2X3NnLT5uZXh0X3BhaXJfbG93ZXIgPQorCQkJCQlsb3dlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKwkJCX0KKworCQkJcHJldl9zZyA9IHNjdV9zZzsKKwkJCXNnX2lkeCsrOworCQl9CisJfSBlbHNlIHsJLyogaGFuZGxlIHdoZW4gbm8gc2cgKi8KKwkJc2N1X3NnID0gdG9fc2dsX2VsZW1lbnRfcGFpcihpcmVxLCBzZ19pZHgpOworCisJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSAgdGFzay0+c2NhdHRlciwKKwkJCQkJICB0YXNrLT50b3RhbF94ZmVyX2xlbiwKKwkJCQkJICB0YXNrLT5kYXRhX2Rpcik7CisKKwkJaXJlcS0+emVyb19zY2F0dGVyX2RhZGRyID0gZG1hX2FkZHI7CisKKwkJc2N1X3NnLT5BLmxlbmd0aCA9IHRhc2stPnRvdGFsX3hmZXJfbGVuOworCQlzY3Vfc2ctPkEuYWRkcmVzc191cHBlciA9IHVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCQlzY3Vfc2ctPkEuYWRkcmVzc19sb3dlciA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworCX0KKworCWlmIChzY3Vfc2cpIHsKKwkJc2N1X3NnLT5uZXh0X3BhaXJfdXBwZXIgPSAwOworCQlzY3Vfc2ctPm5leHRfcGFpcl9sb3dlciA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfaW9fcmVxdWVzdF9idWlsZF9zc3BfY29tbWFuZF9pdShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzc3BfY21kX2l1ICpjbWRfaXU7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJY21kX2l1ID0gJmlyZXEtPnNzcC5jbWQ7CisKKwltZW1jcHkoY21kX2l1LT5MVU4sIHRhc2stPnNzcF90YXNrLkxVTiwgOCk7CisJY21kX2l1LT5hZGRfY2RiX2xlbiA9IDA7CisJY21kX2l1LT5fcl9hID0gMDsKKwljbWRfaXUtPl9yX2IgPSAwOworCWNtZF9pdS0+ZW5fZmJ1cnN0ID0gMDsgLyogdW5zdXBwb3J0ZWQgKi8KKwljbWRfaXUtPnRhc2tfcHJpbyA9IHRhc2stPnNzcF90YXNrLnRhc2tfcHJpbzsKKwljbWRfaXUtPnRhc2tfYXR0ciA9IHRhc2stPnNzcF90YXNrLnRhc2tfYXR0cjsKKwljbWRfaXUtPl9yX2MgPSAwOworCisJc2NpX3N3YWIzMl9jcHkoJmNtZF9pdS0+Y2RiLCB0YXNrLT5zc3BfdGFzay5jZGIsCisJCSAgICAgICBzaXplb2YodGFzay0+c3NwX3Rhc2suY2RiKSAvIHNpemVvZih1MzIpKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3Rhc2tfcmVxdWVzdF9idWlsZF9zc3BfdGFza19pdShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzc3BfdGFza19pdSAqdGFza19pdTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJdGFza19pdSA9ICZpcmVxLT5zc3AudG1mOworCisJbWVtc2V0KHRhc2tfaXUsIDAsIHNpemVvZihzdHJ1Y3Qgc3NwX3Rhc2tfaXUpKTsKKworCW1lbWNweSh0YXNrX2l1LT5MVU4sIHRhc2stPnNzcF90YXNrLkxVTiwgOCk7CisKKwl0YXNrX2l1LT50YXNrX2Z1bmMgPSBpc2NpX3RtZi0+dG1mX2NvZGU7CisJdGFza19pdS0+dGFza190YWcgPQorCQkoaXJlcS0+dHR5cGUgPT0gdG1mX3Rhc2spID8KKwkJaXNjaV90bWYtPmlvX3RhZyA6CisJCVNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYW55IHR5cGUgb2YgU1NQIHJlcXVlc3QuCisgKiBAc2NpX3JlcToKKyAqIEB0YXNrX2NvbnRleHQ6CisgKgorICovCitzdGF0aWMgdm9pZCBzY3Vfc3NwX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQpCit7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCisJaWRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2U7CisJaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKworCS8qIEZpbGwgaW4gdGhlIFRDIHdpdGggdGhlIGl0cyByZXF1aXJlZCBkYXRhICovCisJdGFza19jb250ZXh0LT5hYm9ydCA9IDA7CisJdGFza19jb250ZXh0LT5wcmlvcml0eSA9IDA7CisJdGFza19jb250ZXh0LT5pbml0aWF0b3JfcmVxdWVzdCA9IDE7CisJdGFza19jb250ZXh0LT5jb25uZWN0aW9uX3JhdGUgPSBpZGV2LT5jb25uZWN0aW9uX3JhdGU7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF9lbmdpbmVfaW5kZXggPSBJU0NJX1BFRzsKKwl0YXNrX2NvbnRleHQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCXRhc2tfY29udGV4dC0+cHJvdG9jb2xfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1NQOworCXRhc2tfY29udGV4dC0+dmFsaWQgPSBTQ1VfVEFTS19DT05URVhUX1ZBTElEOworCXRhc2tfY29udGV4dC0+Y29udGV4dF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9UWVBFOworCisJdGFza19jb250ZXh0LT5yZW1vdGVfbm9kZV9pbmRleCA9IGlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleDsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfY29kZSA9IDA7CisKKwl0YXNrX2NvbnRleHQtPmxpbmtfbGF5ZXJfY29udHJvbCA9IDA7CisJdGFza19jb250ZXh0LT5kb19ub3RfZG1hX3NzcF9nb29kX3Jlc3BvbnNlID0gMTsKKwl0YXNrX2NvbnRleHQtPnN0cmljdF9vcmRlcmluZyA9IDA7CisJdGFza19jb250ZXh0LT5jb250cm9sX2ZyYW1lID0gMDsKKwl0YXNrX2NvbnRleHQtPnRpbWVvdXRfZW5hYmxlID0gMDsKKwl0YXNrX2NvbnRleHQtPmJsb2NrX2d1YXJkX2VuYWJsZSA9IDA7CisKKwl0YXNrX2NvbnRleHQtPmFkZHJlc3NfbW9kaWZpZXIgPSAwOworCisJLyogdGFza19jb250ZXh0LT50eXBlLnNzcC50YWcgPSBpcmVxLT5pb190YWc7ICovCisJdGFza19jb250ZXh0LT50YXNrX3BoYXNlID0gMHgwMTsKKworCWlyZXEtPnBvc3RfY29udGV4dCA9IChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDIHwKKwkJCSAgICAgIChJU0NJX1BFRyA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX1BST1RPQ09MX0VOR0lORV9HUk9VUF9TSElGVCkgfAorCQkJICAgICAgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4IDw8CisJCQkgICAgICAgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQpIHwKKwkJCSAgICAgIElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpKTsKKworCS8qCisJICogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyIHRvIHRoZQorCSAqIFNDVSBUYXNrIENvbnRleHQKKwkgKi8KKwlkbWFfYWRkciA9IHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLCAmaXJlcS0+c3NwLmNtZCk7CisKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfdXBwZXIgPSB1cHBlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBsb3dlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKworCS8qCisJICogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIHJlc3BvbnNlIGJ1ZmZlciB0byB0aGUKKwkgKiBTQ1UgVGFzayBDb250ZXh0CisJICovCisJZG1hX2FkZHIgPSBzY2lfaW9fcmVxdWVzdF9nZXRfZG1hX2FkZHIoaXJlcSwgJmlyZXEtPnNzcC5yc3ApOworCisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV91cHBlciA9IHVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCXRhc2tfY29udGV4dC0+cmVzcG9uc2VfaXVfbG93ZXIgPSBsb3dlcl8zMl9iaXRzKGRtYV9hZGRyKTsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCBpcyB3aWxsIGZpbGwgaW4gdGhlIFNDVSBUYXNrIENvbnRleHQgZm9yIGEgU1NQIElPIHJlcXVlc3QuCisgKiBAc2NpX3JlcToKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zc3BfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJCQkgICAgICB1MzIgbGVuKQoreworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKworCXNjdV9zc3BfcmVxZXVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEsIHRhc2tfY29udGV4dCk7CisKKwl0YXNrX2NvbnRleHQtPnNzcF9jb21tYW5kX2l1X2xlbmd0aCA9CisJCXNpemVvZihzdHJ1Y3Qgc3NwX2NtZF9pdSkgLyBzaXplb2YodTMyKTsKKwl0YXNrX2NvbnRleHQtPnR5cGUuc3NwLmZyYW1lX3R5cGUgPSBTU1BfQ09NTUFORDsKKworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJY2FzZSBETUFfTk9ORToKKwlkZWZhdWx0OgorCQl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSA9IFNDVV9UQVNLX1RZUEVfSU9SRUFEOworCQlicmVhazsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gU0NVX1RBU0tfVFlQRV9JT1dSSVRFOworCQlicmVhazsKKwl9CisKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IGxlbjsKKworCWlmICh0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA+IDApCisJCXNjaV9yZXF1ZXN0X2J1aWxkX3NnbChpcmVxKTsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbGwgaW4gdGhlIFNDVSBUYXNrIENvbnRleHQgZm9yIGEgU1NQIFRhc2sgcmVxdWVzdC4gIFRoZQorICogICAgZm9sbG93aW5nIGltcG9ydGFudCBzZXR0aW5ncyBhcmUgdXRpbGl6ZWQ6IC0jIHByaW9yaXR5ID09CisgKiAgICBTQ1VfVEFTS19QUklPUklUWV9ISUdILiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHRhc2sgcmVxdWVzdCBpcyBpc3N1ZWQKKyAqICAgIGFoZWFkIG9mIG90aGVyIHRhc2sgZGVzdGluZWQgZm9yIHRoZSBzYW1lIFJlbW90ZSBOb2RlLiAtIyB0YXNrX3R5cGUgPT0KKyAqICAgIFNDVV9UQVNLX1RZUEVfSU9SRUFELiAgVGhpcyBzaW1wbHkgaW5kaWNhdGVzIHRoYXQgYSBub3JtYWwgcmVxdWVzdCB0eXBlCisgKiAgICAoaS5lLiBub24tcmF3IGZyYW1lKSBpcyBiZWluZyB1dGlsaXplZCB0byBwZXJmb3JtIHRhc2sgbWFuYWdlbWVudC4gLSMKKyAqICAgIGNvbnRyb2xfZnJhbWUgPT0gMS4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwcm9wZXIgZW5kaWFuZXNzIGlzIHNldCBzbworICogICAgdGhhdCB0aGUgYnl0ZXMgYXJlIHRyYW5zbWl0dGVkIGluIHRoZSByaWdodCBvcmRlciBmb3IgYSB0YXNrIGZyYW1lLgorICogQHNjaV9yZXE6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdGFzayByZXF1ZXN0IG9iamVjdCBiZWluZworICogICAgY29uc3RydWN0ZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBzY3Vfc3NwX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJc2N1X3NzcF9yZXFldXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSwgdGFza19jb250ZXh0KTsKKworCXRhc2tfY29udGV4dC0+Y29udHJvbF9mcmFtZSAgICAgICAgICAgICAgICA9IDE7CisJdGFza19jb250ZXh0LT5wcmlvcml0eSAgICAgICAgICAgICAgICAgICAgID0gU0NVX1RBU0tfUFJJT1JJVFlfSElHSDsKKwl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSAgICAgICAgICAgICAgICAgICAgPSBTQ1VfVEFTS19UWVBFX1JBV19GUkFNRTsKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyAgICAgICAgPSAwOworCXRhc2tfY29udGV4dC0+dHlwZS5zc3AuZnJhbWVfdHlwZSAgICAgICAgICA9IFNTUF9UQVNLOworCXRhc2tfY29udGV4dC0+c3NwX2NvbW1hbmRfaXVfbGVuZ3RoID0KKwkJc2l6ZW9mKHN0cnVjdCBzc3BfdGFza19pdSkgLyBzaXplb2YodTMyKTsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCBpcyB3aWxsIGZpbGwgaW4gdGhlIFNDVSBUYXNrIENvbnRleHQgZm9yIGFueSB0eXBlIG9mIFNBVEEKKyAqICAgIHJlcXVlc3QuICBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSB2YXJpb3VzIFNBVEEgY29uc3RydWN0b3JzLgorICogQHNjaV9yZXE6IFRoZSBnZW5lcmFsIElPIHJlcXVlc3Qgb2JqZWN0IHdoaWNoIGlzIHRvIGJlIHVzZWQgaW4KKyAqICAgIGNvbnN0cnVjdGluZyB0aGUgU0NVIHRhc2sgY29udGV4dC4KKyAqIEB0YXNrX2NvbnRleHQ6IFRoZSBidWZmZXIgcG9pbnRlciBmb3IgdGhlIFNDVSB0YXNrIGNvbnRleHQgd2hpY2ggaXMgYmVpbmcKKyAqICAgIGNvbnN0cnVjdGVkLgorICoKKyAqIFRoZSBnZW5lcmFsIGlvIHJlcXVlc3QgY29uc3RydWN0aW9uIGlzIGNvbXBsZXRlLiBUaGUgYnVmZmVyIGFzc2lnbm1lbnQgZm9yCisgKiB0aGUgY29tbWFuZCBidWZmZXIgaXMgY29tcGxldGUuIG5vbmUgUmV2aXNpdCB0YXNrIGNvbnRleHQgY29uc3RydWN0aW9uIHRvCisgKiBkZXRlcm1pbmUgd2hhdCBpcyBjb21tb24gZm9yIFNTUC9TTVAvU1RQIHRhc2sgY29udGV4dCBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgdm9pZCBzY3Vfc2F0YV9yZXFldXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0KQoreworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydDsKKworCWlkZXYgPSBpcmVxLT50YXJnZXRfZGV2aWNlOworCWlwb3J0ID0gaWRldi0+b3duaW5nX3BvcnQ7CisKKwkvKiBGaWxsIGluIHRoZSBUQyB3aXRoIHRoZSBpdHMgcmVxdWlyZWQgZGF0YSAqLworCXRhc2tfY29udGV4dC0+YWJvcnQgPSAwOworCXRhc2tfY29udGV4dC0+cHJpb3JpdHkgPSBTQ1VfVEFTS19QUklPUklUWV9OT1JNQUw7CisJdGFza19jb250ZXh0LT5pbml0aWF0b3JfcmVxdWVzdCA9IDE7CisJdGFza19jb250ZXh0LT5jb25uZWN0aW9uX3JhdGUgPSBpZGV2LT5jb25uZWN0aW9uX3JhdGU7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF9lbmdpbmVfaW5kZXggPSBJU0NJX1BFRzsKKwl0YXNrX2NvbnRleHQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCXRhc2tfY29udGV4dC0+cHJvdG9jb2xfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1RQOworCXRhc2tfY29udGV4dC0+dmFsaWQgPSBTQ1VfVEFTS19DT05URVhUX1ZBTElEOworCXRhc2tfY29udGV4dC0+Y29udGV4dF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9UWVBFOworCisJdGFza19jb250ZXh0LT5yZW1vdGVfbm9kZV9pbmRleCA9IGlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleDsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfY29kZSA9IDA7CisKKwl0YXNrX2NvbnRleHQtPmxpbmtfbGF5ZXJfY29udHJvbCA9IDA7CisJdGFza19jb250ZXh0LT5kb19ub3RfZG1hX3NzcF9nb29kX3Jlc3BvbnNlID0gMTsKKwl0YXNrX2NvbnRleHQtPnN0cmljdF9vcmRlcmluZyA9IDA7CisJdGFza19jb250ZXh0LT5jb250cm9sX2ZyYW1lID0gMDsKKwl0YXNrX2NvbnRleHQtPnRpbWVvdXRfZW5hYmxlID0gMDsKKwl0YXNrX2NvbnRleHQtPmJsb2NrX2d1YXJkX2VuYWJsZSA9IDA7CisKKwl0YXNrX2NvbnRleHQtPmFkZHJlc3NfbW9kaWZpZXIgPSAwOworCXRhc2tfY29udGV4dC0+dGFza19waGFzZSA9IDB4MDE7CisKKwl0YXNrX2NvbnRleHQtPnNzcF9jb21tYW5kX2l1X2xlbmd0aCA9CisJCShzaXplb2Yoc3RydWN0IGhvc3RfdG9fZGV2X2ZpcykgLSBzaXplb2YodTMyKSkgLyBzaXplb2YodTMyKTsKKworCS8qIFNldCB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgSDJEIFJFRyBGSVMgKi8KKwl0YXNrX2NvbnRleHQtPnR5cGUud29yZHNbMF0gPSAqKHUzMiAqKSZpcmVxLT5zdHAuY21kOworCisJaXJlcS0+cG9zdF9jb250ZXh0ID0gKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEMgfAorCQkJICAgICAgKElTQ0lfUEVHIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1NISUZUKSB8CisJCQkgICAgICAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwKKwkJCSAgICAgICBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkJICAgICAgSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZykpOworCS8qCisJICogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyIHRvIHRoZSBTQ1UgVGFzaworCSAqIENvbnRleHQuIFdlIG11c3Qgb2Zmc2V0IHRoZSBjb21tYW5kIGJ1ZmZlciBieSA0IGJ5dGVzIGJlY2F1c2UgdGhlCisJICogZmlyc3QgNCBieXRlcyBhcmUgdHJhbnNmZXJlZCBpbiB0aGUgYm9keSBvZiB0aGUgVEMuCisJICovCisJZG1hX2FkZHIgPSBzY2lfaW9fcmVxdWVzdF9nZXRfZG1hX2FkZHIoaXJlcSwKKwkJCQkJCSgoY2hhciAqKSAmaXJlcS0+c3RwLmNtZCkgKworCQkJCQkJc2l6ZW9mKHUzMikpOworCisJdGFza19jb250ZXh0LT5jb21tYW5kX2l1X3VwcGVyID0gdXBwZXJfMzJfYml0cyhkbWFfYWRkcik7CisJdGFza19jb250ZXh0LT5jb21tYW5kX2l1X2xvd2VyID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcik7CisKKwkvKiBTQVRBIFJlcXVlc3RzIGRvIG5vdCBoYXZlIGEgcmVzcG9uc2UgYnVmZmVyICovCisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV91cHBlciA9IDA7CisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV9sb3dlciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjdV9zdHBfcmF3X3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKworCXNjdV9zYXRhX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxLCB0YXNrX2NvbnRleHQpOworCisJdGFza19jb250ZXh0LT5jb250cm9sX2ZyYW1lICAgICAgICAgPSAwOworCXRhc2tfY29udGV4dC0+cHJpb3JpdHkgICAgICAgICAgICAgID0gU0NVX1RBU0tfUFJJT1JJVFlfTk9STUFMOworCXRhc2tfY29udGV4dC0+dGFza190eXBlICAgICAgICAgICAgID0gU0NVX1RBU0tfVFlQRV9TQVRBX1JBV19GUkFNRTsKKwl0YXNrX2NvbnRleHQtPnR5cGUuc3RwLmZpc190eXBlICAgICA9IEZJU19SRUdIMkQ7CisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGhvc3RfdG9fZGV2X2ZpcykgLSBzaXplb2YodTMyKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfc3RwX3Bpb19yZXF1ZXN0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJCSAgYm9vbCBjb3B5X3J4X2ZyYW1lKQoreworCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxID0gJmlyZXEtPnN0cC5yZXE7CisKKwlzY3Vfc3RwX3Jhd19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisKKwlzdHBfcmVxLT5zdGF0dXMgPSAwOworCXN0cF9yZXEtPnNnbC5vZmZzZXQgPSAwOworCXN0cF9yZXEtPnNnbC5zZXQgPSBTQ1VfU0dMX0VMRU1FTlRfUEFJUl9BOworCisJaWYgKGNvcHlfcnhfZnJhbWUpIHsKKwkJc2NpX3JlcXVlc3RfYnVpbGRfc2dsKGlyZXEpOworCQlzdHBfcmVxLT5zZ2wuaW5kZXggPSAwOworCX0gZWxzZSB7CisJCS8qIFRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdGhlIGRhdGEgY29waWVkIHRvIHRoZSBTR0wgYnVmZmVyIGxvY2F0aW9uICovCisJCXN0cF9yZXEtPnNnbC5pbmRleCA9IC0xOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKgorICogQHNjaV9yZXE6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVxdWVzdCB0byBiZSBjb25zdHJ1Y3RlZCBhcyBhbgorICogICAgb3B0aW1pemVkIHJlcXVlc3QuCisgKiBAb3B0aW1pemVkX3Rhc2tfdHlwZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdG8gYmUKKyAqICAgIGFuIFVETUEgcmVxdWVzdCBvciBhIE5DUSByZXF1ZXN0LiAtIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgVURNQS4gLSBBCisgKiAgICB2YWx1ZSBvZiAxIGluZGljYXRlcyBOQ1EuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBwZXJmb3JtIHJlcXVlc3QgY29uc3RydWN0aW9uIGNvbW1vbiB0byBhbGwgdHlwZXMgb2YgU1RQCisgKiByZXF1ZXN0cyB0aGF0IGFyZSBvcHRpbWl6ZWQgYnkgdGhlIHNpbGljb24gKGkuZS4gVURNQSwgTkNRKS4gVGhpcyBtZXRob2QKKyAqIHJldHVybnMgYW4gaW5kaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9zdHBfb3B0aW1pemVkX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICAgIHU4IG9wdGltaXplZF90YXNrX3R5cGUsCisJCQkJCQkgICAgIHUzMiBsZW4sCisJCQkJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisKKwkvKiBCdWlsZCB0aGUgU1RQIHRhc2sgY29udGV4dCBzdHJ1Y3R1cmUgKi8KKwlzY3Vfc2F0YV9yZXFldXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSwgdGFza19jb250ZXh0KTsKKworCS8qIENvcHkgb3ZlciB0aGUgU0dMIGVsZW1lbnRzICovCisJc2NpX3JlcXVlc3RfYnVpbGRfc2dsKGlyZXEpOworCisJLyogQ29weSBvdmVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNmZXJlZCAqLworCXRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzID0gbGVuOworCisJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKSB7CisJCS8qCisJCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIERNQSBJTiBhbmQgRE1BIE9VVCByZXF1ZXN0IHRhc2sgdHlwZQorCQkgKiB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEZQRE1BIFJFQUQKKwkJICogYW5kIEZQRE1BIFdSSVRFIHZhbHVlcy4gIEFkZCB0aGUgc3VwcGxpZWQgdGFzayB0eXBlIHBhcmFtZXRlcgorCQkgKiB0byB0aGlzIGRpZmZlcmVuY2UgdG8gc2V0IHRoZSB0YXNrIHR5cGUgcHJvcGVybHkgZm9yIHRoaXMKKwkJICogREFUQSBPVVQgKFdSSVRFKSBjYXNlLiAqLworCQl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSA9IG9wdGltaXplZF90YXNrX3R5cGUgKyAoU0NVX1RBU0tfVFlQRV9ETUFfT1VUCisJCQkJCQkJCSAtIFNDVV9UQVNLX1RZUEVfRE1BX0lOKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgdGhlIERBVEEgSU4gKFJFQUQpIGNhc2UsIHNpbXBseSBzYXZlIHRoZSBzdXBwbGllZAorCQkgKiBvcHRpbWl6ZWQgdGFzayB0eXBlLiAqLworCQl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSA9IG9wdGltaXplZF90YXNrX3R5cGU7CisJfQorfQorCisKKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X3NhdGEoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCSAgICAgICB1MzIgbGVuLAorCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCSAgICAgICBib29sIGNvcHkpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCS8qIGNoZWNrIGZvciBtYW5hZ2VtZW50IHByb3RvY29scyAqLworCWlmIChpcmVxLT50dHlwZSA9PSB0bWZfdGFzaykgeworCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJCWlmICh0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoIHx8CisJCSAgICB0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9sb3cpIHsKKwkJCXNjdV9zdHBfcmF3X3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxKTsKKwkJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJmlyZXEtPm93bmluZ19jb250cm9sbGVyLT5wZGV2LT5kZXYsCisJCQkJIiVzOiBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgdW4taGFuZGxlZCBTQVQgIgorCQkJCSJtYW5hZ2VtZW50IHByb3RvY29sIDB4JXguXG4iLAorCQkJCV9fZnVuY19fLCBpcmVxLCB0bWYtPnRtZl9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJfQorCisJaWYgKCFzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKSB7CisJCWRldl9lcnIoJmlyZXEtPm93bmluZ19jb250cm9sbGVyLT5wZGV2LT5kZXYsCisJCQkiJXM6IE5vbi1BVEEgcHJvdG9jb2wgaW4gU0FUQSBwYXRoOiAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQl0YXNrLT50YXNrX3Byb3RvKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCisJfQorCisJLyogbm9uIGRhdGEgKi8KKwlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpIHsKKwkJc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJLyogTkNRICovCisJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EpIHsKKwkJc2NpX3N0cF9vcHRpbWl6ZWRfcmVxdWVzdF9jb25zdHJ1Y3QoaXJlcSwKKwkJCQkJCQkgU0NVX1RBU0tfVFlQRV9GUERNQVFfUkVBRCwKKwkJCQkJCQkgbGVuLCBkaXIpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJLyogRE1BICovCisJaWYgKHRhc2stPmF0YV90YXNrLmRtYV94ZmVyKSB7CisJCXNjaV9zdHBfb3B0aW1pemVkX3JlcXVlc3RfY29uc3RydWN0KGlyZXEsCisJCQkJCQkJIFNDVV9UQVNLX1RZUEVfRE1BX0lOLAorCQkJCQkJCSBsZW4sIGRpcik7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9IGVsc2UgLyogUElPICovCisJCXJldHVybiBzY2lfc3RwX3Bpb19yZXF1ZXN0X2NvbnN0cnVjdChpcmVxLCBjb3B5KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X2Jhc2ljX3NzcChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCWlyZXEtPnByb3RvY29sID0gU0NJQ19TU1BfUFJPVE9DT0w7CisKKwlzY3Vfc3NwX2lvX3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxLAorCQkJCQkJICB0YXNrLT5kYXRhX2RpciwKKwkJCQkJCSAgdGFzay0+dG90YWxfeGZlcl9sZW4pOworCisJc2NpX2lvX3JlcXVlc3RfYnVpbGRfc3NwX2NvbW1hbmRfaXUoaXJlcSk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT05TVFJVQ1RFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF9zc3AoCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwkvKiBDb25zdHJ1Y3QgdGhlIFNTUCBUYXNrIFNDVSBUYXNrIENvbnRleHQgKi8KKwlzY3Vfc3NwX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEpOworCisJLyogRmlsbCBpbiB0aGUgU1NQIFRhc2sgSVUgKi8KKwlzY2lfdGFza19yZXF1ZXN0X2J1aWxkX3NzcF90YXNrX2l1KGlyZXEpOworCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09OU1RSVUNURUQpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9iYXNpY19zYXRhKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwlib29sIGNvcHkgPSBmYWxzZTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwlpcmVxLT5wcm90b2NvbCA9IFNDSUNfU1RQX1BST1RPQ09MOworCisJY29weSA9ICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkgPyBmYWxzZSA6IHRydWU7CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShpcmVxLAorCQkJCQkJdGFzay0+dG90YWxfeGZlcl9sZW4sCisJCQkJCQl0YXNrLT5kYXRhX2RpciwKKwkJCQkJCWNvcHkpOworCisJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09OU1RSVUNURUQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NhdGEoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwkvKiBjaGVjayBmb3IgbWFuYWdlbWVudCBwcm90b2NvbHMgKi8KKwlpZiAoaXJlcS0+dHR5cGUgPT0gdG1mX3Rhc2spIHsKKwkJc3RydWN0IGlzY2lfdG1mICp0bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKKworCQlpZiAodG1mLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCB8fAorCQkgICAgdG1mLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfbG93KSB7CisJCQlzY3Vfc3RwX3Jhd19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZpcmVxLT5vd25pbmdfY29udHJvbGxlci0+cGRldi0+ZGV2LAorCQkJCSIlczogUmVxdWVzdCAweCVwIHJlY2VpdmVkIHVuLWhhbmRsZWQgU0FUICIKKwkJCQkiUHJvdG9jb2wgMHgleC5cbiIsCisJCQkJX19mdW5jX18sIGlyZXEsIHRtZi0+dG1mX2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTlNUUlVDVEVEKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogc2NpX3JlcV90eF9ieXRlcyAtIGJ5dGVzIHRyYW5zZmVycmVkIHdoZW4gcmVwbHkgdW5kZXJydW5zIHJlcXVlc3QKKyAqIEBzY2lfcmVxOiByZXF1ZXN0IHRoYXQgd2FzIHRlcm1pbmF0ZWQgZWFybHkKKyAqLworI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1NSQU0gMHgyMDAwMDAKK3N0YXRpYyB1MzIgc2NpX3JlcV90eF9ieXRlcyhzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTMyIHJldF92YWwgPSAwOworCisJaWYgKHJlYWRsKCZpaG9zdC0+c211X3JlZ2lzdGVycy0+YWRkcmVzc19tb2RpZmllcikgPT0gMCkgeworCQl2b2lkIF9faW9tZW0gKnNjdV9yZWdfYmFzZSA9IGlob3N0LT5zY3VfcmVnaXN0ZXJzOworCisJCS8qIGdldCB0aGUgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBBZGRyZXNzID09IEJBUjEgKyAyMDAwMkNoICsgKDI1NipUQ2kpIHdoZXJlCisJCSAqICAgQkFSMSBpcyB0aGUgc2N1X3JlZ2lzdGVycworCQkgKiAgIDB4MjAwMDJDID0gMHgyMDAwMDAgKyAweDJjCisJCSAqICAgICAgICAgICAgPSBzdGFydCBvZiB0YXNrIGNvbnRleHQgU1JBTSArIG9mZnNldCBvZiAodHlwZS5zc3AuZGF0YV9vZmZzZXQpCisJCSAqICAgVENpIGlzIHRoZSBpb190YWcgb2Ygc3RydWN0IHNjaV9yZXF1ZXN0CisJCSAqLworCQlyZXRfdmFsID0gcmVhZGwoc2N1X3JlZ19iYXNlICsKKwkJCQkoU0NVX1RBU0tfQ09OVEVYVF9TUkFNICsgb2Zmc2V0b2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQsIHR5cGUuc3NwLmRhdGFfb2Zmc2V0KSkgKworCQkJCSgoc2l6ZW9mKHN0cnVjdCBzY3VfdGFza19jb250ZXh0KSkgKiBJU0NJX1RBR19UQ0koaXJlcS0+aW9fdGFnKSkpOworCX0KKworCXJldHVybiByZXRfdmFsOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlcXVlc3Rfc3RhcnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YyA9IGlyZXEtPnRjOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJaWYgKHN0YXRlICE9IFNDSV9SRVFfQ09OU1RSVUNURUQpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCByZXF1ZXN0ZWQgdG8gc3RhcnQgd2hpbGUgaW4gd3JvbmcgIgorCQkJICJzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJdGMtPnRhc2tfaW5kZXggPSBJU0NJX1RBR19UQ0koaXJlcS0+aW9fdGFnKTsKKworCXN3aXRjaCAodGMtPnByb3RvY29sX3R5cGUpIHsKKwljYXNlIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU01QOgorCWNhc2UgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1A6CisJCS8qIFNTUC9TTVAgRnJhbWUgKi8KKwkJdGMtPnR5cGUuc3NwLnRhZyA9IGlyZXEtPmlvX3RhZzsKKwkJdGMtPnR5cGUuc3NwLnRhcmdldF9wb3J0X3RyYW5zZmVyX3RhZyA9IDB4RkZGRjsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1RQOgorCQkvKiBTVFAvU0FUQSBGcmFtZQorCQkgKiB0Yy0+dHlwZS5zdHAubmNxX3RhZyA9IGlyZXEtPm5jcV90YWc7CisJCSAqLworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9OT05FOgorCQkvKiAvIEB0b2RvIFdoZW4gZG8gd2Ugc2V0IG5vIHByb3RvY29sIHR5cGU/ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHdlIGJ1aWxkIHRoZSBJTworCQkgKiByZXF1ZXN0cyAqLworCQlicmVhazsKKwl9CisKKwkvKiBBZGQgdG8gdGhlIHBvc3RfY29udGV4dCB0aGUgaW8gdGFnIHZhbHVlICovCisJaXJlcS0+cG9zdF9jb250ZXh0IHw9IElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpOworCisJLyogRXZlcnl0aGluZyBpcyBnb29kIGdvIGFoZWFkIGFuZCBjaGFuZ2Ugc3RhdGUgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVEFSVEVEKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF90ZXJtaW5hdGUoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcmVxLT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JFUV9DT05TVFJVQ1RFRDoKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVEFTS19BQk9SVDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQ7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9SRVFfU1RBUlRFRDoKKwljYXNlIFNDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVA6CisJY2FzZSBTQ0lfUkVRX1NNUF9XQUlUX1JFU1A6CisJY2FzZSBTQ0lfUkVRX1NNUF9XQUlUX1RDX0NPTVA6CisJY2FzZSBTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUDoKKwljYXNlIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9EMkg6CisJY2FzZSBTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0gyRDoKKwljYXNlIFNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfRDJIOgorCWNhc2UgU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEOgorCWNhc2UgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUU6CisJY2FzZSBTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTjoKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19EQVRBX09VVDoKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfQVNTRVJURUQ6CisJY2FzZSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUc6CisJY2FzZSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfRDJIOgorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9BQk9SVElORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1A6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0FCT1JUSU5HKTsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JFUV9BQk9SVElORzoKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JFUV9DT01QTEVURUQ6CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmlyZXEtPm93bmluZ19jb250cm9sbGVyLT5wZGV2LT5kZXYsCisJCQkgIiVzOiBTQ0lDIElPIFJlcXVlc3QgcmVxdWVzdGVkIHRvIGFib3J0IHdoaWxlIGluIHdyb25nICIKKwkJCSAic3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkgaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJaWYgKFdBUk5fT05DRShzdGF0ZSAhPSBTQ0lfUkVRX0NPTVBMRVRFRCwKKwkJICAgICAgImlzY2k6IHJlcXVlc3QgY29tcGxldGlvbiBmcm9tIHdyb25nIHN0YXRlICglZClcbiIsIHN0YXRlKSkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisKKwlpZiAoaXJlcS0+c2F2ZWRfcnhfZnJhbWVfaW5kZXggIT0gU0NVX0lOVkFMSURfRlJBTUVfSU5ERVgpCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsCisJCQkJCQkgIGlyZXEtPnNhdmVkX3J4X2ZyYW1lX2luZGV4KTsKKworCS8qIFhYWCBjYW4gd2UganVzdCBzdG9wIHRoZSBtYWNoaW5lIGFuZCByZW1vdmUgdGhlICdmaW5hbCcgc3RhdGU/ICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfRklOQUwpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9pb19yZXF1ZXN0X2V2ZW50X2hhbmRsZXIoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgdTMyIGV2ZW50X2NvZGUpCit7CisJZW51bSBzY2lfYmFzZV9yZXF1ZXN0X3N0YXRlcyBzdGF0ZTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlyZXEtPm93bmluZ19jb250cm9sbGVyOworCisJc3RhdGUgPSBpcmVxLT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKHN0YXRlICE9IFNDSV9SRVFfU1RQX1BJT19EQVRBX0lOKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6ICgleCkgaW4gd3Jvbmcgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sIGV2ZW50X2NvZGUsIHN0YXRlKTsKKworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpKSB7CisJY2FzZSBTQ1VfVEFTS19ET05FX0NSQ19FUlIgPDwgU0NVX0VWRU5UX1NQRUNJRklDX0NPREVfU0hJRlQ6CisJCS8qIFdlIGFyZSB3YWl0aW5nIGZvciBkYXRhIGFuZCB0aGUgU0NVIGhhcyBSX0VSUiB0aGUgZGF0YSBmcmFtZS4KKwkJICogR28gYmFjayB0byB3YWl0aW5nIGZvciB0aGUgRDJIIFJlZ2lzdGVyIEZJUworCQkgKi8KKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfU1RQX1BJT19XQUlUX0ZSQU1FKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHBpbyByZXF1ZXN0IHVuZXhwZWN0ZWQgZXZlbnQgJSN4XG4iLAorCQkJX19mdW5jX18sIGV2ZW50X2NvZGUpOworCisJCS8qIFRPRE8gU2hvdWxkIHdlIGZhaWwgdGhlIFBJTyByZXF1ZXN0IHdoZW4gd2UgZ2V0IGFuCisJCSAqIHVuZXhwZWN0ZWQgZXZlbnQ/CisJCSAqLworCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgcmVzcG9uc2UgZGF0YSBmb3IgcmVxdWVzdHMgcmV0dXJuaW5nIHJlc3BvbnNlIGRhdGEKKyAqICAgIGluc3RlYWQgb2Ygc2Vuc2UgZGF0YS4KKyAqIEBzY2lfcmVxOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlcXVlc3Qgb2JqZWN0IGZvciB3aGljaCB0byBjb3B5CisgKiAgICB0aGUgcmVzcG9uc2UgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgc2NpX2lvX3JlcXVlc3RfY29weV9yZXNwb25zZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXZvaWQgKnJlc3BfYnVmOworCXUzMiBsZW47CisJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqc3NwX3Jlc3BvbnNlOworCXN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKKworCXNzcF9yZXNwb25zZSA9ICZpcmVxLT5zc3AucnNwOworCisJcmVzcF9idWYgPSAmaXNjaV90bWYtPnJlc3AucmVzcF9pdTsKKworCWxlbiA9IG1pbl90KHUzMiwKKwkJICAgIFNTUF9SRVNQX0lVX01BWF9TSVpFLAorCQkgICAgYmUzMl90b19jcHUoc3NwX3Jlc3BvbnNlLT5yZXNwb25zZV9kYXRhX2xlbikpOworCisJbWVtY3B5KHJlc3BfYnVmLCBzc3BfcmVzcG9uc2UtPnJlc3BfZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworcmVxdWVzdF9zdGFydGVkX3N0YXRlX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkgICAgICAgdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICpyZXNwX2l1OworCXU4IGRhdGFwcmVzOworCisJLyogVE9ETzogQW55IFNETUEgcmV0dXJuIGNvZGUgb2Ygb3RoZXIgdGhhbiAwIGlzIGJhZCBkZWNvZGUgMHgwMDNDMDAwMAorCSAqIHRvIGRldGVybWluZSBTRE1BIHN0YXR1cworCSAqLworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9FQVJMWV9SRVNQKTogeworCQkvKiBUaGVyZSBhcmUgdGltZXMgd2hlbiB0aGUgU0NVIGhhcmR3YXJlIHdpbGwgcmV0dXJuIGFuIGVhcmx5CisJCSAqIHJlc3BvbnNlIGJlY2F1c2UgdGhlIGlvIHJlcXVlc3Qgc3BlY2lmaWVkIG1vcmUgZGF0YSB0aGFuIGlzCisJCSAqIHJldHVybmVkIGJ5IHRoZSB0YXJnZXQgZGV2aWNlIChtb2RlIHBhZ2VzLCBpbnF1aXJ5IGRhdGEsCisJCSAqIGV0Yy4pLiAgV2UgbXVzdCBjaGVjayB0aGUgcmVzcG9uc2Ugc3RhdHMgdG8gc2VlIGlmIHRoaXMgaXMKKwkJICogdHJ1bHkgYSBmYWlsZWQgcmVxdWVzdCBvciBhIGdvb2QgcmVxdWVzdCB0aGF0IGp1c3QgZ290CisJCSAqIGNvbXBsZXRlZCBlYXJseS4KKwkJICovCisJCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3AgPSAmaXJlcS0+c3NwLnJzcDsKKwkJc3NpemVfdCB3b3JkX2NudCA9IFNTUF9SRVNQX0lVX01BWF9TSVpFIC8gc2l6ZW9mKHUzMik7CisKKwkJc2NpX3N3YWIzMl9jcHkoJmlyZXEtPnNzcC5yc3AsCisJCQkgICAgICAgJmlyZXEtPnNzcC5yc3AsCisJCQkgICAgICAgd29yZF9jbnQpOworCisJCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTU19JT19ET05FX0VBUkxZOworCQl9IGVsc2UgeworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRSk6IHsKKwkJc3NpemVfdCB3b3JkX2NudCA9IFNTUF9SRVNQX0lVX01BWF9TSVpFIC8gc2l6ZW9mKHUzMik7CisKKwkJc2NpX3N3YWIzMl9jcHkoJmlyZXEtPnNzcC5yc3AsCisJCQkgICAgICAgJmlyZXEtPnNzcC5yc3AsCisJCQkgICAgICAgd29yZF9jbnQpOworCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9SRVNQX0xFTl9FUlIpOgorCQkvKiBUT0RPIFdpdGggVEFTS19ET05FX1JFU1BfTEVOX0VSUiBpcyB0aGUgcmVzcG9uc2UgZnJhbWUKKwkJICogZ3VhcmFudGVlZCB0byBiZSByZWNlaXZlZCBiZWZvcmUgdGhpcyBjb21wbGV0aW9uIHN0YXR1cyBpcworCQkgKiBwb3N0ZWQ/CisJCSAqLworCQlyZXNwX2l1ID0gJmlyZXEtPnNzcC5yc3A7CisJCWRhdGFwcmVzID0gcmVzcF9pdS0+ZGF0YXByZXM7CisKKwkJaWYgKGRhdGFwcmVzID09IDEgfHwgZGF0YXByZXMgPT0gMikgeworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCX0gZWxzZSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQl9CisJCWJyZWFrOworCS8qIG9ubHkgc3RwIGRldmljZSBnZXRzIHN1c3BlbmRlZC4gKi8KKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfQUNLX05BS19UTyk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0xMX1BFUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9OQUtfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfREFUQV9MRU5fRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTExfQUJPUlRfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfWFJfV0RfTEVOKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTUFYX1BMRF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9SRVNQKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfVU5FWFBfU0RCRklTKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfUkVHX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NEQl9FUlIpOgorCQlpZiAoaXJlcS0+cHJvdG9jb2wgPT0gU0NJQ19TVFBfUFJPVE9DT0wpIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgPj4KKwkJCQkJICAgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQ7CisJCX0gZWxzZSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpID4+CisJCQkJCSAgIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVDsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJfQorCQlicmVhazsKKworCS8qIGJvdGggc3RwL3NzcCBkZXZpY2UgZ2V0cyBzdXNwZW5kZWQgKi8KKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTEZfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1dST05HX0RFU1RJTkFUSU9OKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMSk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8zKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX0JBRF9ERVNUSU5BVElPTik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9aT05FX1ZJT0xBVElPTik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9TVFBfUkVTT1VSQ0VTX0JVU1kpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUFJPVE9DT0xfTk9UX1NVUFBPUlRFRCk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgPj4KKwkJCQkgICBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQ7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEOworCQlicmVhazsKKworCS8qIG5laXRoZXIgc3NwIG5vciBzdHAgZ2V0cyBzdXNwZW5kZWQuICovCisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX05BS19DTURfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfVU5FWFBfWFIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9YUl9JVV9MRU5fRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU0RNQV9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9PRkZTRVRfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfRVhDRVNTX0RBVEEpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TTVBfUkVTUF9UT19FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TTVBfVUZJX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9GUk1fVFlQRV9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TTVBfTExfUlhfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfVU5FWFBfREFUQSk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX09QRU5fRkFJTCk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1ZJSVRfRU5UUllfTlYpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9JSVRfRU5UUllfTlYpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9STkNOVl9PVVRCT1VORCk6CisJZGVmYXVsdDoKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSA+PgorCQkJCSAgIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFRPRE86IFRoaXMgaXMgcHJvYmFibHkgd3JvbmcgZm9yIEFDSy9OQUsgdGltZW91dCBjb25kaXRpb25zCisJICovCisKKwkvKiBJbiBhbGwgY2FzZXMgd2Ugd2lsbCB0cmVhdCB0aGlzIGFzIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBJTyByZXEuICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3JlcXVlc3RfYWJvcnRpbmdfc3RhdGVfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQl1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSAoU0NVX1RBU0tfRE9ORV9HT09EIDw8IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCk6CisJY2FzZSAoU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUIDw8IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX1RBU0tfQUJPUlQ7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19URVJNSU5BVEVEOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFVubGVzcyB3ZSBnZXQgc29tZSBzdHJhbmdlIGVycm9yIHdhaXQgZm9yIHRoZSB0YXNrIGFib3J0IHRvIGNvbXBsZXRlCisJCSAqIFRPRE86IFNob3VsZCB0aGVyZSBiZSBhIHN0YXRlIGNoYW5nZSBmb3IgdGhpcyBjb21wbGV0aW9uPworCQkgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNzcF90YXNrX3JlcXVlc3RfYXdhaXRfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0FDS19OQUtfVE8pOgorCQkvKiBDdXJyZW50bHksIHRoZSBkZWNpc2lvbiBpcyB0byBzaW1wbHkgYWxsb3cgdGhlIHRhc2sgcmVxdWVzdAorCQkgKiB0byB0aW1lb3V0IGlmIHRoZSB0YXNrIElVIHdhc24ndCByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisJCSAqIFRoZXJlIGlzIGEgcG90ZW50aWFsIGZvciByZWNlaXZpbmcgbXVsdGlwbGUgdGFzayByZXNwb25zZXMgaWYKKwkJICogd2UgZGVjaWRlIHRvIHNlbmQgdGhlIHRhc2sgSVUgYWdhaW4uCisJCSAqLworCQlkZXZfd2FybigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCSAiJXM6IFRhc2tSZXF1ZXN0OjB4JXAgQ29tcGxldGlvbkNvZGU6JXggLSAiCisJCQkgIkFDSy9OQUsgdGltZW91dFxuIiwgX19mdW5jX18sIGlyZXEsCisJCQkgY29tcGxldGlvbl9jb2RlKTsKKworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9UQVNLX1dBSVRfVENfUkVTUCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qCisJCSAqIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuCisJCSAqIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0byB0aGUgdXNlciB0byByZXRyeQorCQkgKiB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzbXBfcmVxdWVzdF9hd2FpdF9yZXNwb25zZV90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQkvKiBJbiB0aGUgQVdBSVQgUkVTUE9OU0Ugc3RhdGUsIGFueSBUQyBjb21wbGV0aW9uIGlzCisJCSAqIHVuZXhwZWN0ZWQuICBidXQgaWYgdGhlIFRDIGhhcyBzdWNjZXNzIHN0YXR1cywgd2UKKwkJICogY29tcGxldGUgdGhlIElPIGFueXdheS4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9SRVNQX1RPX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9VRklfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9MTF9SWF9FUlIpOgorCQkvKiBUaGVzZSBzdGF0dXMgaGFzIGJlZW4gc2VlbiBpbiBhIHNwZWNpZmljIExTSQorCQkgKiBleHBhbmRlciwgd2hpY2ggc29tZXRpbWVzIGlzIG5vdCBhYmxlIHRvIHNlbmQgc21wCisJCSAqIHJlc3BvbnNlIHdpdGhpbiAyIG1zLiBUaGlzIGNhdXNlcyBvdXIgaGFyZHdhcmUgYnJlYWsKKwkJICogdGhlIGNvbm5lY3Rpb24gYW5kIHNldCBUQyBjb21wbGV0aW9uIHdpdGggb25lIG9mCisJCSAqIHRoZXNlIFNNUF9YWFhfWFhfRVJSIHN0YXR1cy4gRm9yIHRoZXNlIHR5cGUgb2YgZXJyb3IsCisJCSAqIHdlIGFzayBpaG9zdCB1c2VyIHRvIHJldHJ5IHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfU01QX1JFU1BfVE9fRVJSOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfUkVUUllfUkVRVUlSRUQ7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuICBJZiBhIE5BSworCQkgKiB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QKKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzbXBfcmVxdWVzdF9hd2FpdF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJICAgdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlCisJCSAqIGNvbXBsZXRlLiAgSWYgYSBOQUsgd2FzIHJlY2VpdmVkLCB0aGVuIGl0IGlzIHVwIHRvCisJCSAqIHRoZSB1c2VyIHRvIHJldHJ5IHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50ICpwaW9fc2dsX25leHQoc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEpCit7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudCAqc2dsOworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAqc2dsX3BhaXI7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IHRvX2lyZXEoc3RwX3JlcSk7CisJc3RydWN0IGlzY2lfc3RwX3Bpb19zZ2wgKnBpb19zZ2wgPSAmc3RwX3JlcS0+c2dsOworCisJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHBpb19zZ2wtPmluZGV4KTsKKwlpZiAoIXNnbF9wYWlyKQorCQlzZ2wgPSBOVUxMOworCWVsc2UgaWYgKHBpb19zZ2wtPnNldCA9PSBTQ1VfU0dMX0VMRU1FTlRfUEFJUl9BKSB7CisJCWlmIChzZ2xfcGFpci0+Qi5hZGRyZXNzX2xvd2VyID09IDAgJiYKKwkJICAgIHNnbF9wYWlyLT5CLmFkZHJlc3NfdXBwZXIgPT0gMCkgeworCQkJc2dsID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXBpb19zZ2wtPnNldCA9IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0I7CisJCQlzZ2wgPSAmc2dsX3BhaXItPkI7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc2dsX3BhaXItPm5leHRfcGFpcl9sb3dlciA9PSAwICYmCisJCSAgICBzZ2xfcGFpci0+bmV4dF9wYWlyX3VwcGVyID09IDApIHsKKwkJCXNnbCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlwaW9fc2dsLT5pbmRleCsrOworCQkJcGlvX3NnbC0+c2V0ID0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQTsKKwkJCXNnbF9wYWlyID0gdG9fc2dsX2VsZW1lbnRfcGFpcihpcmVxLCBwaW9fc2dsLT5pbmRleCk7CisJCQlzZ2wgPSAmc2dsX3BhaXItPkE7CisJCX0KKwl9CisKKwlyZXR1cm4gc2dsOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzdHBfcmVxdWVzdF9ub25fZGF0YV9hd2FpdF9oMmRfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUKKwkJICogY29tcGxldGUuICBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8KKwkJICogdGhlIHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworI2RlZmluZSBTQ1VfTUFYX0ZSQU1FX0JVRkZFUl9TSVpFICAweDQwMCAgLyogMUsgaXMgdGhlIG1heGltdW0gU0NVIGZyYW1lIGRhdGEgcGF5bG9hZCAqLworCisvKiB0cmFuc21pdCBEQVRBX0ZJUyBmcm9tIChjdXJyZW50IHNnbCArIG9mZnNldCkgZm9yIGlucHV0CisgKiBwYXJhbWV0ZXIgbGVuZ3RoLiBjdXJyZW50IHNnbCBhbmQgb2Zmc2V0IGlzIGFscmVheSBzdG9yZWQgaW4gdGhlIElPIHJlcXVlc3QKKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfb3V0X3RyYXNtaXRfZGF0YV9mcmFtZSgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCXUzMiBsZW5ndGgpCit7CisJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyICpzZ2xfcGFpcjsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50ICpjdXJyZW50X3NnbDsKKworCS8qIFJlY3ljbGUgdGhlIFRDIGFuZCByZWNvbnN0cnVjdCBpdCBmb3Igc2VuZGluZyBvdXQgREFUQSBGSVMgY29udGFpbmluZworCSAqIGZvciB0aGUgZGF0YSBmcm9tIGN1cnJlbnRfc2dsK29mZnNldCBmb3IgdGhlIGlucHV0IGxlbmd0aAorCSAqLworCXNnbF9wYWlyID0gdG9fc2dsX2VsZW1lbnRfcGFpcihpcmVxLCBzdHBfcmVxLT5zZ2wuaW5kZXgpOworCWlmIChzdHBfcmVxLT5zZ2wuc2V0ID09IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0EpCisJCWN1cnJlbnRfc2dsID0gJnNnbF9wYWlyLT5BOworCWVsc2UKKwkJY3VycmVudF9zZ2wgPSAmc2dsX3BhaXItPkI7CisKKwkvKiB1cGRhdGUgdGhlIFRDICovCisJdGFza19jb250ZXh0LT5jb21tYW5kX2l1X3VwcGVyID0gY3VycmVudF9zZ2wtPmFkZHJlc3NfdXBwZXI7CisJdGFza19jb250ZXh0LT5jb21tYW5kX2l1X2xvd2VyID0gY3VycmVudF9zZ2wtPmFkZHJlc3NfbG93ZXI7CisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSBsZW5ndGg7CisJdGFza19jb250ZXh0LT50eXBlLnN0cC5maXNfdHlwZSA9IEZJU19EQVRBOworCisJLyogc2VuZCB0aGUgbmV3IFRDIG91dC4gKi8KKwlyZXR1cm4gc2NpX2NvbnRyb2xsZXJfY29udGludWVfaW8oaXJlcSk7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFuc21pdF9kYXRhKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnNnbF9wYWlyOworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKnNnbDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXUzMiBvZmZzZXQ7CisJdTMyIGxlbiA9IDA7CisKKwlvZmZzZXQgPSBzdHBfcmVxLT5zZ2wub2Zmc2V0OworCXNnbF9wYWlyID0gdG9fc2dsX2VsZW1lbnRfcGFpcihpcmVxLCBzdHBfcmVxLT5zZ2wuaW5kZXgpOworCWlmIChXQVJOX09OQ0UoIXNnbF9wYWlyLCAiJXM6IG51bGwgc2dsIGVsZW1lbnQiLCBfX2Z1bmNfXykpCisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKworCWlmIChzdHBfcmVxLT5zZ2wuc2V0ID09IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0EpIHsKKwkJc2dsID0gJnNnbF9wYWlyLT5BOworCQlsZW4gPSBzZ2xfcGFpci0+QS5sZW5ndGggLSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJc2dsID0gJnNnbF9wYWlyLT5COworCQlsZW4gPSBzZ2xfcGFpci0+Qi5sZW5ndGggLSBvZmZzZXQ7CisJfQorCisJaWYgKHN0cF9yZXEtPnBpb19sZW4gPT0gMCkKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCisJaWYgKHN0cF9yZXEtPnBpb19sZW4gPj0gbGVuKSB7CisJCXN0YXR1cyA9IHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9vdXRfdHJhc21pdF9kYXRhX2ZyYW1lKGlyZXEsIGxlbik7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCQlzdHBfcmVxLT5waW9fbGVuIC09IGxlbjsKKworCQkvKiB1cGRhdGUgdGhlIGN1cnJlbnQgc2dsLCBvZmZzZXQgYW5kIHNhdmUgZm9yIGZ1dHVyZSAqLworCQlzZ2wgPSBwaW9fc2dsX25leHQoc3RwX3JlcSk7CisJCW9mZnNldCA9IDA7CisJfSBlbHNlIGlmIChzdHBfcmVxLT5waW9fbGVuIDwgbGVuKSB7CisJCXNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9vdXRfdHJhc21pdF9kYXRhX2ZyYW1lKGlyZXEsIHN0cF9yZXEtPnBpb19sZW4pOworCisJCS8qIFNnbCBvZmZzZXQgd2lsbCBiZSBhZGp1c3RlZCBhbmQgc2F2ZWQgZm9yIGZ1dHVyZSAqLworCQlvZmZzZXQgKz0gc3RwX3JlcS0+cGlvX2xlbjsKKwkJc2dsLT5hZGRyZXNzX2xvd2VyICs9IHN0cF9yZXEtPnBpb19sZW47CisJCXN0cF9yZXEtPnBpb19sZW4gPSAwOworCX0KKworCXN0cF9yZXEtPnNnbC5vZmZzZXQgPSBvZmZzZXQ7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqCisgKiBAc3RwX3JlcXVlc3Q6IFRoZSByZXF1ZXN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIFNHTCBwcm9jZXNzaW5nLgorICogQGRhdGFfYnVmZmVyOiBUaGUgYnVmZmVyIG9mIGRhdGEgdG8gYmUgY29waWVkLgorICogQGxlbmd0aDogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0cmFuc2Zlci4KKyAqCisgKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIGJ1ZmZlciBmb3IgdGhlIGxlbmd0aCBzcGVjaWZpZWQgdG8gdGhlIElPIHJlcWV1c3QgU0dMCisgKiBzcGVjaWZpZWQgZGF0YSByZWdpb24uIGVudW0gc2NpX3N0YXR1cworICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhX2J1ZmZlcihzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSwKKwkJCQkJCSAgdTggKmRhdGFfYnVmLCB1MzIgbGVuKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisJdTggKnNyY19hZGRyOworCWludCBjb3B5X2xlbjsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl2b2lkICprYWRkcjsKKwlpbnQgdG90YWxfbGVuID0gbGVuOworCisJaXJlcSA9IHRvX2lyZXEoc3RwX3JlcSk7CisJdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzcmNfYWRkciA9IGRhdGFfYnVmOworCisJaWYgKHRhc2stPm51bV9zY2F0dGVyID4gMCkgeworCQlzZyA9IHRhc2stPnNjYXR0ZXI7CisKKwkJd2hpbGUgKHRvdGFsX2xlbiA+IDApIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZShzZyk7CisKKwkJCWNvcHlfbGVuID0gbWluX3QoaW50LCB0b3RhbF9sZW4sIHNnX2RtYV9sZW4oc2cpKTsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fSVJRMCk7CisJCQltZW1jcHkoa2FkZHIgKyBzZy0+b2Zmc2V0LCBzcmNfYWRkciwgY29weV9sZW4pOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fSVJRMCk7CisJCQl0b3RhbF9sZW4gLT0gY29weV9sZW47CisJCQlzcmNfYWRkciArPSBjb3B5X2xlbjsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCX0KKwl9IGVsc2UgeworCQlCVUdfT04odGFzay0+dG90YWxfeGZlcl9sZW4gPCB0b3RhbF9sZW4pOworCQltZW1jcHkodGFzay0+c2NhdHRlciwgc3JjX2FkZHIsIHRvdGFsX2xlbik7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqCisgKiBAc2NpX3JlcTogVGhlIFBJTyBEQVRBIElOIHJlcXVlc3QgdGhhdCBpcyB0byByZWNlaXZlIHRoZSBkYXRhLgorICogQGRhdGFfYnVmZmVyOiBUaGUgYnVmZmVyIHRvIGNvcHkgZnJvbS4KKyAqCisgKiBDb3B5IHRoZSBkYXRhIGJ1ZmZlciB0byB0aGUgaW8gcmVxdWVzdCBkYXRhIHJlZ2lvbi4gZW51bSBzY2lfc3RhdHVzCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX2luX2NvcHlfZGF0YSgKKwlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSwKKwl1OCAqZGF0YV9idWZmZXIpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbGVzcyB0aGFuIDFLIHJlbWFpbmluZyBpbiB0aGUgdHJhbnNmZXIgcmVxdWVzdAorCSAqIGNvcHkganVzdCB0aGUgZGF0YSBmb3IgdGhlIHRyYW5zZmVyICovCisJaWYgKHN0cF9yZXEtPnBpb19sZW4gPCBTQ1VfTUFYX0ZSQU1FX0JVRkZFUl9TSVpFKSB7CisJCXN0YXR1cyA9IHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9pbl9jb3B5X2RhdGFfYnVmZmVyKAorCQkJc3RwX3JlcSwgZGF0YV9idWZmZXIsIHN0cF9yZXEtPnBpb19sZW4pOworCisJCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpCisJCQlzdHBfcmVxLT5waW9fbGVuID0gMDsKKwl9IGVsc2UgeworCQkvKiBXZSBhcmUgdHJhbnNmZXJpbmcgdGhlIHdob2xlIGZyYW1lIHNvIGNvcHkgKi8KKwkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX2luX2NvcHlfZGF0YV9idWZmZXIoCisJCQlzdHBfcmVxLCBkYXRhX2J1ZmZlciwgU0NVX01BWF9GUkFNRV9CVUZGRVJfU0laRSk7CisKKwkJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykKKwkJCXN0cF9yZXEtPnBpb19sZW4gLT0gU0NVX01BWF9GUkFNRV9CVUZGRVJfU0laRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzdHBfcmVxdWVzdF9waW9fYXdhaXRfaDJkX2NvbXBsZXRpb25fdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJICAgICAgdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUKKwkJICogY29tcGxldGUuICBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8KKwkJICogdGhlIHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3Bpb19kYXRhX291dF90eF9kb25lX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwlib29sIGFsbF9mcmFtZXNfdHJhbnNmZXJyZWQgPSBmYWxzZTsKKwlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSA9ICZpcmVxLT5zdHAucmVxOworCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCS8qIFRyYW5zbWl0IGRhdGEgKi8KKwkJaWYgKHN0cF9yZXEtPnBpb19sZW4gIT0gMCkgeworCQkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFuc21pdF9kYXRhKGlyZXEpOworCQkJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgeworCQkJCWlmIChzdHBfcmVxLT5waW9fbGVuID09IDApCisJCQkJCWFsbF9mcmFtZXNfdHJhbnNmZXJyZWQgPSB0cnVlOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cF9yZXEtPnBpb19sZW4gPT0gMCkgeworCQkJLyoKKwkJCSAqIHRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGFsbCBkYXRhIGlzIHdyaXR0ZW4gYXQgdGhlCisJCQkgKiBmaXJzdCB0aW1lIGFmdGVyIHRoZSBwaW8gc2V0dXAgZmlzIGlzIHJlY2VpdmVkCisJCQkgKi8KKwkJCWFsbF9mcmFtZXNfdHJhbnNmZXJyZWQgID0gdHJ1ZTsKKwkJfQorCisJCS8qIGFsbCBkYXRhIHRyYW5zZmVycmVkLiAqLworCQlpZiAoYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCkgeworCQkJLyoKKwkJCSAqIENoYW5nZSB0aGUgc3RhdGUgdG8gU0NJX1JFUV9TVFBfUElPX0RBVEFfSU4KKwkJCSAqIGFuZCB3YWl0IGZvciBQSU9fU0VUVVAgZmlzIC8gb3IgRDJIIFJFZyBmaXMuICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZSBjb21wbGV0ZS4KKwkJICogSWYgYSBOQUsgd2FzIHJlY2VpdmVkLCB0aGVuIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIHJldHJ5CisJCSAqIHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9zdHBfcmVxdWVzdF91ZG1hX2dlbmVyYWxfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJCQkgICAgICAgdTMyIGZyYW1lX2luZGV4KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdTMyICpmcmFtZV9idWZmZXI7CisKKwlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkgICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJICAgICAgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCisJaWYgKChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpICYmCisJICAgIChmcmFtZV9oZWFkZXItPmZpc190eXBlID09IEZJU19SRUdEMkgpKSB7CisJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCSAgICAgICh2b2lkICoqKSZmcmFtZV9idWZmZXIpOworCisJCXNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSgmaXJlcS0+c3RwLnJzcCwKKwkJCQkJCSAgICAgICBmcmFtZV9oZWFkZXIsCisJCQkJCQkgICAgICAgZnJhbWVfYnVmZmVyKTsKKwl9CisKKwlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X2ZyYW1lX2hhbmRsZXIoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkgIHUzMiBmcmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlyZXEtPm93bmluZ19jb250cm9sbGVyOworCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxID0gJmlyZXEtPnN0cC5yZXE7CisJZW51bSBzY2lfYmFzZV9yZXF1ZXN0X3N0YXRlcyBzdGF0ZTsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXNzaXplX3Qgd29yZF9jbnQ7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgIHsKKwljYXNlIFNDSV9SRVFfU1RBUlRFRDogeworCQlzdHJ1Y3Qgc3NwX2ZyYW1lX2hkciBzc3BfaGRyOworCQl2b2lkICpmcmFtZV9oZWFkZXI7CisKKwkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJICAgICAgJmZyYW1lX2hlYWRlcik7CisKKwkJd29yZF9jbnQgPSBzaXplb2Yoc3RydWN0IHNzcF9mcmFtZV9oZHIpIC8gc2l6ZW9mKHUzMik7CisJCXNjaV9zd2FiMzJfY3B5KCZzc3BfaGRyLCBmcmFtZV9oZWFkZXIsIHdvcmRfY250KTsKKworCQlpZiAoc3NwX2hkci5mcmFtZV90eXBlID09IFNTUF9SRVNQT05TRSkgeworCQkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqcmVzcF9pdTsKKwkJCXNzaXplX3Qgd29yZF9jbnQgPSBTU1BfUkVTUF9JVV9NQVhfU0laRSAvIHNpemVvZih1MzIpOworCisJCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICh2b2lkICoqKSZyZXNwX2l1KTsKKworCQkJc2NpX3N3YWIzMl9jcHkoJmlyZXEtPnNzcC5yc3AsIHJlc3BfaXUsIHdvcmRfY250KTsKKworCQkJcmVzcF9pdSA9ICZpcmVxLT5zc3AucnNwOworCisJCQlpZiAocmVzcF9pdS0+ZGF0YXByZXMgPT0gMHgwMSB8fAorCQkJICAgIHJlc3BfaXUtPmRhdGFwcmVzID09IDB4MDIpIHsKKwkJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCQl9IGVsc2UgeworCQkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogbm90IGEgcmVzcG9uc2UgZnJhbWUsIHdoeSBkaWQgaXQgZ2V0IGZvcndhcmRlZD8gKi8KKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIElPIFJlcXVlc3QgMHglcCByZWNlaXZlZCB1bmV4cGVjdGVkICIKKwkJCQkiZnJhbWUgJWQgdHlwZSAweCUwMnhcbiIsIF9fZnVuY19fLCBpcmVxLAorCQkJCWZyYW1lX2luZGV4LCBzc3BfaGRyLmZyYW1lX3R5cGUpOworCQl9CisKKwkJLyoKKwkJICogSW4gYW55IGNhc2Ugd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGZyYW1lIGJ1ZmZlciByZXR1cm4gaXQgdG8KKwkJICogdGhlIGNvbnRyb2xsZXIKKwkJICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJY2FzZSBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQOgorCQlzY2lfaW9fcmVxdWVzdF9jb3B5X3Jlc3BvbnNlKGlyZXEpOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKworCWNhc2UgU0NJX1JFUV9TTVBfV0FJVF9SRVNQOiB7CisJCXN0cnVjdCBzbXBfcmVzcCAqcnNwX2hkciA9ICZpcmVxLT5zbXAucnNwOworCQl2b2lkICpmcmFtZV9oZWFkZXI7CisKKwkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJICAgICAgJmZyYW1lX2hlYWRlcik7CisKKwkJLyogYnl0ZSBzd2FwIHRoZSBoZWFkZXIuICovCisJCXdvcmRfY250ID0gU01QX1JFU1BfSERSX1NaIC8gc2l6ZW9mKHUzMik7CisJCXNjaV9zd2FiMzJfY3B5KHJzcF9oZHIsIGZyYW1lX2hlYWRlciwgd29yZF9jbnQpOworCisJCWlmIChyc3BfaGRyLT5mcmFtZV90eXBlID09IFNNUF9SRVNQT05TRSkgeworCQkJdm9pZCAqc21wX3Jlc3A7CisKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgJnNtcF9yZXNwKTsKKworCQkJd29yZF9jbnQgPSAoc2l6ZW9mKHN0cnVjdCBzbXBfcmVzcCkgLSBTTVBfUkVTUF9IRFJfU1opIC8KKwkJCQlzaXplb2YodTMyKTsKKworCQkJc2NpX3N3YWIzMl9jcHkoKCh1OCAqKSByc3BfaGRyKSArIFNNUF9SRVNQX0hEUl9TWiwKKwkJCQkgICAgICAgc21wX3Jlc3AsIHdvcmRfY250KTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NNUF9XQUlUX1RDX0NPTVApOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoaXMgd2FzIG5vdCBhIHJlc3BvbnNlIGZyYW1lIHdoeSBkaWQgaXQgZ2V0CisJCQkgKiBmb3J3YXJkZWQ/CisJCQkgKi8KKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIFNNUCBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgdW5leHBlY3RlZCAiCisJCQkJImZyYW1lICVkIHR5cGUgMHglMDJ4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWlyZXEsCisJCQkJZnJhbWVfaW5kZXgsCisJCQkJcnNwX2hkci0+ZnJhbWVfdHlwZSk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX1NNUF9GUk1fVFlQRV9FUlI7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQl9CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwljYXNlIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gc2NpX3N0cF9yZXF1ZXN0X3VkbWFfZ2VuZXJhbF9mcmFtZV9oYW5kbGVyKGlyZXEsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9EMkg6CisJCS8qIFVzZSB0aGUgZ2VuZXJhbCBmcmFtZSBoYW5kbGVyIHRvIGNvcHkgdGhlIHJlc3Bvc25lIGRhdGEgKi8KKwkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3VkbWFfZ2VuZXJhbF9mcmFtZV9oYW5kbGVyKGlyZXEsIGZyYW1lX2luZGV4KTsKKworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKwljYXNlIFNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfRDJIOiB7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmZyYW1lX2hlYWRlcjsKKwkJdTMyICpmcmFtZV9idWZmZXI7CisKKwkJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIElPIFJlcXVlc3QgMHglcCBjb3VsZCBub3QgZ2V0IGZyYW1lICIKKwkJCQkiaGVhZGVyIGZvciBmcmFtZSBpbmRleCAlZCwgc3RhdHVzICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0cF9yZXEsCisJCQkJZnJhbWVfaW5kZXgsCisJCQkJc3RhdHVzKTsKKworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCXN3aXRjaCAoZnJhbWVfaGVhZGVyLT5maXNfdHlwZSkgeworCQljYXNlIEZJU19SRUdEMkg6CisJCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICh2b2lkICoqKSZmcmFtZV9idWZmZXIpOworCisJCQlzY2lfY29udHJvbGxlcl9jb3B5X3NhdGFfcmVzcG9uc2UoJmlyZXEtPnN0cC5yc3AsCisJCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgICAgICAgZnJhbWVfYnVmZmVyKTsKKworCQkJLyogVGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCB3aXRoIGVycm9yICovCisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBJTyBSZXF1ZXN0OjB4JXAgRnJhbWUgSWQ6JWQgcHJvdG9jb2wgIgorCQkJCSAgInZpb2xhdGlvbiBvY2N1cnJlZFxuIiwgX19mdW5jX18sIHN0cF9yZXEsCisJCQkJICBmcmFtZV9pbmRleCk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX1VORVhQX0ZJUzsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9QUk9UT0NPTF9WSU9MQVRJT047CisJCQlicmVhazsKKwkJfQorCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisKKwkJLyogRnJhbWUgaGFzIGJlZW4gZGVjb2RlZCByZXR1cm4gaXQgdG8gdGhlIGNvbnRyb2xsZXIgKi8KKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJY2FzZSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRTogeworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmZyYW1lX2hlYWRlcjsKKwkJdTMyICpmcmFtZV9idWZmZXI7CisKKwkJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIElPIFJlcXVlc3QgMHglcCBjb3VsZCBub3QgZ2V0IGZyYW1lICIKKwkJCQkiaGVhZGVyIGZvciBmcmFtZSBpbmRleCAlZCwgc3RhdHVzICV4XG4iLAorCQkJCV9fZnVuY19fLCBzdHBfcmVxLCBmcmFtZV9pbmRleCwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlzd2l0Y2ggKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUpIHsKKwkJY2FzZSBGSVNfUElPX1NFVFVQOgorCQkJLyogR2V0IGZyb20gdGhlIGZyYW1lIGJ1ZmZlciB0aGUgUElPIFNldHVwIERhdGEgKi8KKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJCS8qIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBQSU8gU2V0dXAgVGhlIFNDVSBIYXJkd2FyZQorCQkJICogcmV0dXJucyBmaXJzdCB3b3JkIGluIHRoZSBmcmFtZV9oZWFkZXIgYW5kIHRoZSByZXN0CisJCQkgKiBvZiB0aGUgZGF0YSBpcyBpbiB0aGUgZnJhbWUgYnVmZmVyIHNvIHdlIG5lZWQgdG8KKwkJCSAqIGJhY2sgdXAgb25lIGR3b3JkCisJCQkgKi8KKworCQkJLyogdHJhbnNmZXJfY291bnQ6IGZpcnN0IDE2Yml0cyBpbiB0aGUgNHRoIGR3b3JkICovCisJCQlzdHBfcmVxLT5waW9fbGVuID0gZnJhbWVfYnVmZmVyWzNdICYgMHhmZmZmOworCisJCQkvKiBzdGF0dXM6IDR0aCBieXRlIGluIHRoZSAzcmQgZHdvcmQgKi8KKwkJCXN0cF9yZXEtPnN0YXR1cyA9IChmcmFtZV9idWZmZXJbMl0gPj4gMjQpICYgMHhmZjsKKworCQkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucnNwLAorCQkJCQkJCSAgICAgICBmcmFtZV9oZWFkZXIsCisJCQkJCQkJICAgICAgIGZyYW1lX2J1ZmZlcik7CisKKwkJCWlyZXEtPnN0cC5yc3Auc3RhdHVzID0gc3RwX3JlcS0+c3RhdHVzOworCisJCQkvKiBUaGUgbmV4dCBzdGF0ZSBpcyBkZXBlbmRlbnQgb24gd2hldGhlciB0aGUKKwkJCSAqIHJlcXVlc3Qgd2FzIFBJTyBEYXRhLWluIG9yIERhdGEgb3V0CisJCQkgKi8KKwkJCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX0RBVEFfSU4pOworCQkJfSBlbHNlIGlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfVE9fREVWSUNFKSB7CisJCQkJLyogVHJhbnNtaXQgZGF0YSAqLworCQkJCXN0YXR1cyA9IHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9vdXRfdHJhbnNtaXRfZGF0YShpcmVxKTsKKwkJCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJCQlicmVhazsKKwkJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRklTX1NFVERFVkJJVFM6CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGSVNfUkVHRDJIOgorCQkJaWYgKGZyYW1lX2hlYWRlci0+c3RhdHVzICYgQVRBX0JVU1kpIHsKKwkJCQkvKgorCQkJCSAqIE5vdyB3aHkgaXMgdGhlIGRyaXZlIHNlbmRpbmcgYSBEMkggUmVnaXN0ZXIKKwkJCQkgKiBGSVMgd2hlbiBpdCBpcyBzdGlsbCBidXN5PyAgRG8gbm90aGluZyBzaW5jZQorCQkJCSAqIHdlIGFyZSBzdGlsbCBpbiB0aGUgcmlnaHQgc3RhdGUuCisJCQkJICovCisJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBTQ0lDIFBJTyBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgIgorCQkJCQkiRDJIIFJlZ2lzdGVyIEZJUyB3aXRoIEJTWSBzdGF0dXMgIgorCQkJCQkiMHgleFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCXN0cF9yZXEsCisJCQkJCWZyYW1lX2hlYWRlci0+c3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAodm9pZCAqKikmZnJhbWVfYnVmZmVyKTsKKworCQkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucmVxLAorCQkJCQkJCSAgICAgICBmcmFtZV9oZWFkZXIsCisJCQkJCQkJICAgICAgIGZyYW1lX2J1ZmZlcik7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBGSVhNRTogd2hhdCBkbyB3ZSBkbyBoZXJlPyAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKiBGcmFtZSBpcyBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19EQVRBX0lOOiB7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmZyYW1lX2hlYWRlcjsKKwkJc3RydWN0IHNhdGFfZmlzX2RhdGEgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIGNvdWxkIG5vdCBnZXQgZnJhbWUgIgorCQkJCSJoZWFkZXIgZm9yIGZyYW1lIGluZGV4ICVkLCBzdGF0dXMgJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJc3RwX3JlcSwKKwkJCQlmcmFtZV9pbmRleCwKKwkJCQlzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCWlmIChmcmFtZV9oZWFkZXItPmZpc190eXBlICE9IEZJU19EQVRBKSB7CisJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJQyBQSU8gUmVxdWVzdCAweCVwIHJlY2VpdmVkIGZyYW1lICVkICIKKwkJCQkid2l0aCBmaXMgdHlwZSAweCUwMnggd2hlbiBleHBlY3RpbmcgYSBkYXRhICIKKwkJCQkiZmlzLlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdHBfcmVxLAorCQkJCWZyYW1lX2luZGV4LAorCQkJCWZyYW1lX2hlYWRlci0+ZmlzX3R5cGUpOworCisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFUVVJUkVTX1NDU0lfQUJPUlQ7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCisJCQkvKiBGcmFtZSBpcyBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCWlmIChzdHBfcmVxLT5zZ2wuaW5kZXggPCAwKSB7CisJCQlpcmVxLT5zYXZlZF9yeF9mcmFtZV9pbmRleCA9IGZyYW1lX2luZGV4OworCQkJc3RwX3JlcS0+cGlvX2xlbiA9IDA7CisJCX0gZWxzZSB7CisJCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICh2b2lkICoqKSZmcmFtZV9idWZmZXIpOworCisJCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhKHN0cF9yZXEsCisJCQkJCQkJCQkgICAgKHU4ICopZnJhbWVfYnVmZmVyKTsKKworCQkJLyogRnJhbWUgaXMgZGVjb2RlZCByZXR1cm4gaXQgdG8gdGhlIGNvbnRyb2xsZXIgKi8KKwkJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJfQorCisJCS8qIENoZWNrIGZvciB0aGUgZW5kIG9mIHRoZSB0cmFuc2ZlciwgYXJlIHRoZXJlIG1vcmUKKwkJICogYnl0ZXMgcmVtYWluaW5nIGZvciB0aGlzIGRhdGEgdHJhbnNmZXIKKwkJICovCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MgfHwgc3RwX3JlcS0+cGlvX2xlbiAhPSAwKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpZiAoKHN0cF9yZXEtPnN0YXR1cyAmIEFUQV9CVVNZKSA9PSAwKSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCX0gZWxzZSB7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUpOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJY2FzZSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfRDJIOiB7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmZyYW1lX2hlYWRlcjsKKwkJdTMyICpmcmFtZV9idWZmZXI7CisKKwkJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJQyBJTyBSZXF1ZXN0IDB4JXAgY291bGQgbm90IGdldCBmcmFtZSAiCisJCQkJImhlYWRlciBmb3IgZnJhbWUgaW5kZXggJWQsIHN0YXR1cyAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdHBfcmVxLAorCQkJCWZyYW1lX2luZGV4LAorCQkJCXN0YXR1cyk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJc3dpdGNoIChmcmFtZV9oZWFkZXItPmZpc190eXBlKSB7CisJCWNhc2UgRklTX1JFR0QySDoKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJCXNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSgmaXJlcS0+c3RwLnJzcCwKKwkJCQkJCQkgICAgICAgZnJhbWVfaGVhZGVyLAorCQkJCQkJCSAgICAgICBmcmFtZV9idWZmZXIpOworCisJCQkvKiBUaGUgY29tbWFuZCBoYXMgY29tcGxldGVkIHdpdGggZXJyb3IgKi8KKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IElPIFJlcXVlc3Q6MHglcCBGcmFtZSBJZDolZCBwcm90b2NvbCAiCisJCQkJICJ2aW9sYXRpb24gb2NjdXJyZWRcbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBzdHBfcmVxLAorCQkJCSBmcmFtZV9pbmRleCk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX1VORVhQX0ZJUzsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9QUk9UT0NPTF9WSU9MQVRJT047CisJCQlicmVhazsKKwkJfQorCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisKKwkJLyogRnJhbWUgaGFzIGJlZW4gZGVjb2RlZCByZXR1cm4gaXQgdG8gdGhlIGNvbnRyb2xsZXIgKi8KKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJCXJldHVybiBzdGF0dXM7CisJfQorCWNhc2UgU0NJX1JFUV9BQk9SVElORzoKKwkJLyoKKwkJICogVE9ETzogSXMgaXQgZXZlbiBwb3NzaWJsZSB0byBnZXQgYW4gdW5zb2xpY2l0ZWQgZnJhbWUgaW4gdGhlCisJCSAqIGFib3J0aW5nIHN0YXRlPworCQkgKi8KKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgSU8gUmVxdWVzdCBnaXZlbiB1bmV4cGVjdGVkIGZyYW1lICV4IHdoaWxlICIKKwkJCSAiaW4gc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkgZnJhbWVfaW5kZXgsCisJCQkgc3RhdGUpOworCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHN0cF9yZXF1ZXN0X3VkbWFfYXdhaXRfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9GSVMpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9SRUdfRVJSKToKKwkJLyogV2UgbXVzdCBjaGVjayB0aGVyIHJlc3BvbnNlIGJ1ZmZlciB0byBzZWUgaWYgdGhlIEQySAorCQkgKiBSZWdpc3RlciBGSVMgd2FzIHJlY2VpdmVkIGJlZm9yZSB3ZSBnb3QgdGhlIFRDCisJCSAqIGNvbXBsZXRpb24uCisJCSAqLworCQlpZiAoaXJlcS0+c3RwLnJzcC5maXNfdHlwZSA9PSBGSVNfUkVHRDJIKSB7CisJCQlzY2lfcmVtb3RlX2RldmljZV9zdXNwZW5kKGlyZXEtPnRhcmdldF9kZXZpY2UsCisJCQkJU0NVX0VWRU5UX1NQRUNJRklDKFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkpOworCisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCX0gZWxzZSB7CisJCQkvKiBJZiB3ZSBoYXZlIGFuIGVycm9yIGNvbXBsZXRpb24gc3RhdHVzIGZvciB0aGUKKwkJCSAqIFRDIHRoZW4gd2UgY2FuIGV4cGVjdCBhIEQySCByZWdpc3RlciBGSVMgZnJvbQorCQkJICogdGhlIGRldmljZSBzbyB3ZSBtdXN0IGNoYW5nZSBzdGF0ZSB0byB3YWl0CisJCQkgKiBmb3IgaXQKKwkJCSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9EMkgpOworCQl9CisJCWJyZWFrOworCisJLyogVE9ETyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZXNlIGNvbXBsZXRpb24gc3RhdHVzIG5lZWQgdG8KKwkgKiB3YWl0IGZvciB0aGUgZGV2aWNlIHRvIGhvc3QgcmVnaXN0ZXIgZmlzLgorCSAqLworCS8qIFRPRE8gV2UgY2FuIHJldHJ5IHRoZSBjb21tYW5kIGZvciBTQ1VfVEFTS19ET05FX0NNRF9MTF9SX0VSUgorCSAqIC0gdGhpcyBjb21lcyBvbmx5IGZvciBCMAorCSAqLworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9JTlZfRklTX0xFTik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX01BWF9QTERfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTExfUl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9DTURfTExfUl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9DUkNfRVJSKToKKwkJc2NpX3JlbW90ZV9kZXZpY2Vfc3VzcGVuZChpcmVxLT50YXJnZXRfZGV2aWNlLAorCQkJU0NVX0VWRU5UX1NQRUNJRklDKFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkpOworCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBjYXNlICovCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZSBjb21wbGV0ZS4gKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzdHBfcmVxdWVzdF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9hc3NlcnRlZF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICAgdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9ESUFHKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLgorCQkgKiBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkKKwkJICogdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc3RwX3JlcXVlc3Rfc29mdF9yZXNldF9hd2FpdF9oMmRfZGlhZ25vc3RpY190Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfRDJIKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLiAgSWYKKwkJICogYSBOQUsgd2FzIHJlY2VpdmVkLCB0aGVuIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIHJldHJ5IHRoZQorCQkgKiByZXF1ZXN0LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfdGNfY29tcGxldGlvbihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUkVRX1NUQVJURUQ6CisJCXJldHVybiByZXF1ZXN0X3N0YXJ0ZWRfc3RhdGVfdGNfZXZlbnQoaXJlcSwgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUDoKKwkJcmV0dXJuIHNzcF90YXNrX3JlcXVlc3RfYXdhaXRfdGNfZXZlbnQoaXJlcSwKKwkJCQkJCSAgICAgICBjb21wbGV0aW9uX2NvZGUpOworCisJY2FzZSBTQ0lfUkVRX1NNUF9XQUlUX1JFU1A6CisJCXJldHVybiBzbXBfcmVxdWVzdF9hd2FpdF9yZXNwb25zZV90Y19ldmVudChpcmVxLAorCQkJCQkJCSAgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfVENfQ09NUDoKKwkJcmV0dXJuIHNtcF9yZXF1ZXN0X2F3YWl0X3RjX2V2ZW50KGlyZXEsIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gc3RwX3JlcXVlc3RfdWRtYV9hd2FpdF90Y19ldmVudChpcmVxLAorCQkJCQkJICAgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfSDJEOgorCQlyZXR1cm4gc3RwX3JlcXVlc3Rfbm9uX2RhdGFfYXdhaXRfaDJkX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJICAgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19XQUlUX0gyRDoKKwkJcmV0dXJuIHN0cF9yZXF1ZXN0X3Bpb19hd2FpdF9oMmRfY29tcGxldGlvbl90Y19ldmVudChpcmVxLAorCQkJCQkJCQkgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19EQVRBX09VVDoKKwkJcmV0dXJuIHBpb19kYXRhX291dF90eF9kb25lX3RjX2V2ZW50KGlyZXEsIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfQVNTRVJURUQ6CisJCXJldHVybiBzdHBfcmVxdWVzdF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9hc3NlcnRlZF90Y19ldmVudChpcmVxLAorCQkJCQkJCQkJICBjb21wbGV0aW9uX2NvZGUpOworCisJY2FzZSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUc6CisJCXJldHVybiBzdHBfcmVxdWVzdF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9kaWFnbm9zdGljX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJCQkgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9BQk9SVElORzoKKwkJcmV0dXJuIHJlcXVlc3RfYWJvcnRpbmdfc3RhdGVfdGNfZXZlbnQoaXJlcSwKKwkJCQkJCSAgICAgICBjb21wbGV0aW9uX2NvZGUpOworCisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBTQ0lDIElPIFJlcXVlc3QgZ2l2ZW4gdGFzayBjb21wbGV0aW9uICIKKwkJCSAibm90aWZpY2F0aW9uICV4IHdoaWxlIGluIHdyb25nIHN0YXRlICVkXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIGNvbXBsZXRpb25fY29kZSwKKwkJCSBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworLyoqCisgKiBpc2NpX3JlcXVlc3RfcHJvY2Vzc19yZXNwb25zZV9pdSgpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0dXMgYW5kCisgKiAgICByZXNwb25zZSBpdSwgaW4gdGhlIHRhc2sgc3RydWN0LCBmcm9tIHRoZSByZXF1ZXN0IG9iamVjdCBmb3IgdGhlIHVwcGVyCisgKiAgICBsYXllciBkcml2ZXIuCisgKiBAc2FzX3Rhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSB0YXNrIHN0cnVjdCBmcm9tIHRoZSB1cHBlciBsYXllciBkcml2ZXIuCisgKiBAcmVzcF9pdTogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSByZXNwb25zZSBpdSBvZiB0aGUgY29tcGxldGVkIHJlcXVlc3QuCisgKiBAZGV2OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGxpbnV4IGRldmljZSBzdHJ1Y3QuCisgKgorICogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X3Byb2Nlc3NfcmVzcG9uc2VfaXUoCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3BfaXUsCisJc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldl9kYmcoZGV2LAorCQkiJXM6IHJlc3BfaXUgPSAlcCAiCisJCSJyZXNwX2l1LT5zdGF0dXMgPSAweCV4LFxucmVzcF9pdS0+ZGF0YXByZXMgPSAlZCAiCisJCSJyZXNwX2l1LT5yZXNwb25zZV9kYXRhX2xlbiA9ICV4LCAiCisJCSJyZXNwX2l1LT5zZW5zZV9kYXRhX2xlbiA9ICV4XG5yZXBzb25zZSBkYXRhOiAiLAorCQlfX2Z1bmNfXywKKwkJcmVzcF9pdSwKKwkJcmVzcF9pdS0+c3RhdHVzLAorCQlyZXNwX2l1LT5kYXRhcHJlcywKKwkJcmVzcF9pdS0+cmVzcG9uc2VfZGF0YV9sZW4sCisJCXJlc3BfaXUtPnNlbnNlX2RhdGFfbGVuKTsKKworCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPSByZXNwX2l1LT5zdGF0dXM7CisKKwkvKiBsaWJzYXMgdXBkYXRlcyB0aGUgdGFzayBzdGF0dXMgZmllbGRzIGJhc2VkIG9uIHRoZSByZXNwb25zZSBpdS4gKi8KKwlzYXNfc3NwX3Rhc2tfcmVzcG9uc2UoZGV2LCB0YXNrLCByZXNwX2l1KTsKK30KKworLyoqCisgKiBpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygpIC0gVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgSS9PCisgKiAgICBjb21wbGV0aW9uIGZvciBPUEVOX1JFSkVDVCBjb25kaXRpb25zLgorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb21wbGV0ZWQgaXNjaV9yZXF1ZXN0IG9iamVjdC4KKyAqIEByZXNwb25zZV9wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2VydmljZSByZXNwb25zZSBmb3IgdGhlIEkvTy4KKyAqIEBzdGF0dXNfcHRyOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGV4ZWMgc3RhdHVzIGZvciB0aGUgSS9PLgorICogQGNvbXBsZXRlX3RvX2hvc3RfcHRyOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGFjdGlvbiB0byBiZSB0YWtlbiBieQorICogICAgdGhlIExMREQgd2l0aCByZXNwZWN0IHRvIGNvbXBsZXRpbmcgdGhpcyByZXF1ZXN0IG9yIGZvcmNpbmcgYW4gYWJvcnQKKyAqICAgIGNvbmRpdGlvbiBvbiB0aGUgSS9PLgorICogQG9wZW5fcmVqX3JlYXNvbjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBlbmNvZGVkIHJlYXNvbiBmb3IgdGhlCisgKiAgICBhYmFuZG9uLWNsYXNzIHJlamVjdC4KKyAqCisgKiBub25lLgorICovCitzdGF0aWMgdm9pZCBpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaywKKwllbnVtIHNlcnZpY2VfcmVzcG9uc2UgKnJlc3BvbnNlX3B0ciwKKwllbnVtIGV4ZWNfc3RhdHVzICpzdGF0dXNfcHRyLAorCWVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiAqY29tcGxldGVfdG9faG9zdF9wdHIsCisJZW51bSBzYXNfb3Blbl9yZWpfcmVhc29uIG9wZW5fcmVqX3JlYXNvbikKK3sKKwkvKiBUYXNrIGluIHRoZSB0YXJnZXQgaXMgZG9uZS4gKi8KKwlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCSpyZXNwb25zZV9wdHIgICAgICAgICAgICAgICAgICAgICA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCSpzdGF0dXNfcHRyICAgICAgICAgICAgICAgICAgICAgICA9IFNBU19PUEVOX1JFSkVDVDsKKwkqY29tcGxldGVfdG9faG9zdF9wdHIgICAgICAgICAgICAgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJdGFzay0+dGFza19zdGF0dXMub3Blbl9yZWpfcmVhc29uID0gb3Blbl9yZWpfcmVhc29uOworfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9oYW5kbGVfY29udHJvbGxlcl9zcGVjaWZpY19lcnJvcnMoKSAtIFRoaXMgZnVuY3Rpb24gZGVjb2RlcworICogICAgY29udHJvbGxlci1zcGVjaWZpYyBJL08gY29tcGxldGlvbiBlcnJvciBjb25kaXRpb25zLgorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb21wbGV0ZWQgaXNjaV9yZXF1ZXN0IG9iamVjdC4KKyAqIEByZXNwb25zZV9wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2VydmljZSByZXNwb25zZSBmb3IgdGhlIEkvTy4KKyAqIEBzdGF0dXNfcHRyOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGV4ZWMgc3RhdHVzIGZvciB0aGUgSS9PLgorICogQGNvbXBsZXRlX3RvX2hvc3RfcHRyOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGFjdGlvbiB0byBiZSB0YWtlbiBieQorICogICAgdGhlIExMREQgd2l0aCByZXNwZWN0IHRvIGNvbXBsZXRpbmcgdGhpcyByZXF1ZXN0IG9yIGZvcmNpbmcgYW4gYWJvcnQKKyAqICAgIGNvbmRpdGlvbiBvbiB0aGUgSS9PLgorICoKKyAqIG5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVxdWVzdF9oYW5kbGVfY29udHJvbGxlcl9zcGVjaWZpY19lcnJvcnMoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaywKKwllbnVtIHNlcnZpY2VfcmVzcG9uc2UgKnJlc3BvbnNlX3B0ciwKKwllbnVtIGV4ZWNfc3RhdHVzICpzdGF0dXNfcHRyLAorCWVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiAqY29tcGxldGVfdG9faG9zdF9wdHIpCit7CisJdW5zaWduZWQgaW50IGNzdGF0dXM7CisKKwljc3RhdHVzID0gcmVxdWVzdC0+c2N1X3N0YXR1czsKKworCWRldl9kYmcoJnJlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6ICVwIFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSICIKKwkJIi0gY29udHJvbGxlciBzdGF0dXMgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgcmVxdWVzdCwgY3N0YXR1cyk7CisKKwkvKiBEZWNvZGUgdGhlIGNvbnRyb2xsZXItc3BlY2lmaWMgZXJyb3JzOyBtb3N0CisJICogaW1wb3J0YW50IGlzIHRvIHJlY29nbml6ZSB0aG9zZSBjb25kaXRpb25zIGluIHdoaWNoCisJICogdGhlIHRhcmdldCBtYXkgc3RpbGwgaGF2ZSBhIHRhc2sgb3V0c3RhbmRpbmcgdGhhdAorCSAqIG11c3QgYmUgYWJvcnRlZC4KKwkgKgorCSAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgU0NVIGNvbXBsZXRpb24gY29kZXMgYmVpbmcKKwkgKiBuYW1lZCBpbiB0aGUgZGVjb2RlIGJlbG93IGZvciB3aGljaCBTQ0lDIGhhcyBhbHJlYWR5CisJICogZG9uZSB3b3JrIHRvIGhhbmRsZSB0aGVtIGluIGEgd2F5IG90aGVyIHRoYW4gYXMKKwkgKiBhIGNvbnRyb2xsZXItc3BlY2lmaWMgY29tcGxldGlvbiBjb2RlOyB0aGVzZSBhcmUgbGVmdAorCSAqIGluIHRoZSBkZWNvZGUgYmVsb3cgZm9yIGNvbXBsZXRlbmVzcyBzYWtlLgorCSAqLworCXN3aXRjaCAoY3N0YXR1cykgeworCWNhc2UgU0NVX1RBU0tfRE9ORV9ETUFTRVRVUF9ESVJFUlI6CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX1NNUF9GUk1fVFlQRV9FUlI6ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1hGRVJDTlRfRVJSOgorCQkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfU01QX1VGSV9FUlI6ICovCisJCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKKwkJCS8qIFNDVV9UQVNLX0RPTkVfU01QX1VGSV9FUlIgPT0gVGFzayBEb25lLiAqLworCQkJKnJlc3BvbnNlX3B0ciA9IFNBU19UQVNLX0NPTVBMRVRFOworCisJCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCQkgKiB0aGF0IHdlIGlnbm9yZSB0aGUgcXVpZXNjZSBzdGF0ZSwgc2luY2Ugd2UgYXJlCisJCQkgKiBjb25jZXJuZWQgYWJvdXQgdGhlIGFjdHVhbCBkZXZpY2Ugc3RhdGUuCisJCQkgKi8KKwkJCWlmICghaWRldikKKwkJCQkqc3RhdHVzX3B0ciA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJCWVsc2UKKwkJCQkqc3RhdHVzX3B0ciA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisKKwkJCSpjb21wbGV0ZV90b19ob3N0X3B0ciA9CisJCQkJaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCQl9IGVsc2UgeworCQkJLyogVGFzayBpbiB0aGUgdGFyZ2V0IGlzIG5vdCBkb25lLiAqLworCQkJKnJlc3BvbnNlX3B0ciA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCisJCQlpZiAoIWlkZXYpCisJCQkJKnN0YXR1c19wdHIgPSBTQVNfREVWSUNFX1VOS05PV047CisJCQllbHNlCisJCQkJKnN0YXR1c19wdHIgPSBTQU1fU1RBVF9UQVNLX0FCT1JURUQ7CisKKwkJCWNsZWFyX2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkJKmNvbXBsZXRlX3RvX2hvc3RfcHRyID0KKwkJCQlpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19ET05FX0NSQ19FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX05BS19DTURfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9FWENFU1NfREFUQToKKwljYXNlIFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTOgorCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9VTkVYUF9SRVNQOiAqLworCWNhc2UgU0NVX1RBU0tfRE9ORV9WSUlUX0VOVFJZX05WOiAgICAgICAvKiBUT0RPIC0gY29uZGl0aW9ucz8gKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfSUlUX0VOVFJZX05WOiAgICAgICAgLyogVE9ETyAtIGNvbmRpdGlvbnM/ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1JOQ05WX09VVEJPVU5EOiAgICAgIC8qIFRPRE8gLSBjb25kaXRpb25zPyAqLworCQkvKiBUaGVzZSBhcmUgY29uZGl0aW9ucyBpbiB3aGljaCB0aGUgdGFyZ2V0CisJCSAqIGhhcyBjb21wbGV0ZWQgdGhlIHRhc2ssIHNvIHRoYXQgbm8gY2xlYW51cAorCQkgKiBpcyBuZWNlc3NhcnkuCisJCSAqLworCQkqcmVzcG9uc2VfcHRyID0gU0FTX1RBU0tfQ09NUExFVEU7CisKKwkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkgKiB0aGF0IHdlIGlnbm9yZSB0aGUgcXVpZXNjZSBzdGF0ZSwgc2luY2Ugd2UgYXJlCisJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJICovCisJCWlmICghaWRldikKKwkJCSpzdGF0dXNfcHRyID0gU0FTX0RFVklDRV9VTktOT1dOOworCQllbHNlCisJCQkqc3RhdHVzX3B0ciA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkqY29tcGxldGVfdG9faG9zdF9wdHIgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCWJyZWFrOworCisKKwkvKiBOb3RlIHRoYXQgdGhlIG9ubHkgb3BlbiByZWplY3QgY29tcGxldGlvbiBjb2RlcyBzZWVuIGhlcmUgd2lsbCBiZQorCSAqIGFiYW5kb24tY2xhc3MgY29kZXM7IGFsbCBvdGhlcnMgYXJlIGF1dG9tYXRpY2FsbHkgcmV0cmllZCBpbiB0aGUgU0NVLgorCSAqLworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfV1JPTkdfREVTVElOQVRJT046CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfV1JPTkdfREVTVCk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9aT05FX1ZJT0xBVElPTjoKKworCQkvKiBOb3RlIC0gdGhlIHJldHVybiBvZiBBQjAgd2lsbCBjaGFuZ2Ugd2hlbgorCQkgKiBsaWJzYXMgaW1wbGVtZW50cyBkZXRlY3Rpb24gb2Ygem9uZSB2aW9sYXRpb25zLgorCQkgKi8KKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfUkVTVl9BQjApOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8xOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX1JFU1ZfQUIxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMjoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9SRVNWX0FCMik7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzM6CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfUkVTVl9BQjMpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfQkFEX0RFU1RJTkFUSU9OOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX0JBRF9ERVNUKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX09QRU5fUkVKRUNUX1NUUF9SRVNPVVJDRVNfQlVTWToKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9TVFBfTk9SRVMpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUFJPVE9DT0xfTk9UX1NVUFBPUlRFRDoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9FUFJPVE8pOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfQ09OTkVDVElPTl9SQVRFX05PVF9TVVBQT1JURUQ6CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfQ09OTl9SQVRFKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX0RPTkVfTExfUl9FUlI6CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX0FDS19OQUtfVE86ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX0xMX1BFUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX0xMX1NZX1RFUk06CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX05BS19FUlI6Ki8KKwljYXNlIFNDVV9UQVNLX0RPTkVfTExfTEZfVEVSTToKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfREFUQV9MRU5fRVJSOiAqLworCWNhc2UgU0NVX1RBU0tfRE9ORV9MTF9BQk9SVF9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX1NFUV9JTlZfVFlQRToKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfVU5FWFBfWFI6ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1hSX0lVX0xFTl9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX0lOVl9GSVNfTEVOOgorCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9YUl9XRF9MRU46ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1NETUFfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9PRkZTRVRfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9NQVhfUExEX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfTEZfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9TTVBfUkVTUF9UT19FUlI6ICAvKiBFc2NhbGF0ZSB0byBkZXYgcmVzZXQ/ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1NNUF9MTF9SWF9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX1VORVhQX0RBVEE6CisJY2FzZSBTQ1VfVEFTS19ET05FX1VORVhQX1NEQkZJUzoKKwljYXNlIFNDVV9UQVNLX0RPTkVfUkVHX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfU0RCX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfVEFTS19BQk9SVDoKKwlkZWZhdWx0OgorCQkvKiBUYXNrIGluIHRoZSB0YXJnZXQgaXMgbm90IGRvbmUuICovCisJCSpyZXNwb25zZV9wdHIgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJKnN0YXR1c19wdHIgPSBTQU1fU1RBVF9UQVNLX0FCT1JURUQ7CisKKwkJaWYgKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCkgeworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkJKmNvbXBsZXRlX3RvX2hvc3RfcHRyID0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCQl9IGVsc2UgeworCQkJY2xlYXJfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCQkqY29tcGxldGVfdG9faG9zdF9wdHIgPSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaXNjaV90YXNrX3NhdmVfZm9yX3VwcGVyX2xheWVyX2NvbXBsZXRpb24oKSAtIFRoaXMgZnVuY3Rpb24gc2F2ZXMgdGhlCisgKiAgICByZXF1ZXN0IGZvciBsYXRlciBjb21wbGV0aW9uIHRvIHRoZSB1cHBlciBsYXllciBkcml2ZXIuCisgKiBAaG9zdDogVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBob3N0IG9uIHdoaWNoIHRoZSB0aGUgcmVxdWVzdAorICogICAgc2hvdWxkIGJlIHF1ZXVlZCAoZWl0aGVyIGFzIGFuIGVycm9yIG9yIHN1Y2Nlc3MpLgorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb21wbGV0ZWQgcmVxdWVzdC4KKyAqIEByZXNwb25zZTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHJlc3BvbnNlIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyAqIEBzdGF0dXM6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBzdGF0dXMgY29kZSBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorICoKKyAqIG5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfdGFza19zYXZlX2Zvcl91cHBlcl9sYXllcl9jb21wbGV0aW9uKAorCXN0cnVjdCBpc2NpX2hvc3QgKmhvc3QsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCwKKwllbnVtIHNlcnZpY2VfcmVzcG9uc2UgcmVzcG9uc2UsCisJZW51bSBleGVjX3N0YXR1cyBzdGF0dXMsCisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbikKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2socmVxdWVzdCk7CisKKwl0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24KKwkJPSBpc2NpX3Rhc2tfc2V0X2NvbXBsZXRpb25fc3RhdHVzKHRhc2ssIHJlc3BvbnNlLCBzdGF0dXMsCisJCQkJCQkgIHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbik7CisKKwkvKiBUYXNrcyBhYm9ydGVkIHNwZWNpZmljYWxseSBieSBhIGNhbGwgdG8gdGhlIGxsZGRfYWJvcnRfdGFzaworCSAqIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY29tcGxldGVkIHRvIHRoZSBob3N0IGluIHRoZSByZWd1bGFyIHBhdGguCisJICovCisJc3dpdGNoICh0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24pIHsKKworCWNhc2UgaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOgorCisJCS8qIE5vcm1hbCBub3RpZmljYXRpb24gKHRhc2tfZG9uZSkgKi8KKwkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBOb3JtYWwgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAorCQkJX19mdW5jX18sCisJCQl0YXNrLAorCQkJdGFzay0+dGFza19zdGF0dXMucmVzcCwgcmVzcG9uc2UsCisJCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOworCQkvKiBBZGQgdG8gdGhlIGNvbXBsZXRlZCBsaXN0LiAqLworCQlsaXN0X2FkZCgmcmVxdWVzdC0+Y29tcGxldGVkX25vZGUsCisJCQkgJmhvc3QtPnJlcXVlc3RzX3RvX2NvbXBsZXRlKTsKKworCQkvKiBUYWtlIHRoZSByZXF1ZXN0IG9mZiB0aGUgZGV2aWNlJ3MgcGVuZGluZyByZXF1ZXN0IGxpc3QuICovCisJCWxpc3RfZGVsX2luaXQoJnJlcXVlc3QtPmRldl9ub2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIGlzY2lfcGVyZm9ybV9hYm9ydGVkX2lvX2NvbXBsZXRpb246CisJCS8qIE5vIG5vdGlmaWNhdGlvbiB0byBsaWJzYXMgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMKKwkJICogYWxyZWFkeSBpbiB0aGUgYWJvcnQgcGF0aC4KKwkJICovCisJCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IEFib3J0ZWQgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHRhc2ssCisJCQkgdGFzay0+dGFza19zdGF0dXMucmVzcCwgcmVzcG9uc2UsCisJCQkgdGFzay0+dGFza19zdGF0dXMuc3RhdCwgc3RhdHVzKTsKKworCQkvKiBXYWtlIHVwIHdoYXRldmVyIHByb2Nlc3Mgd2FzIHdhaXRpbmcgZm9yIHRoaXMKKwkJICogcmVxdWVzdCB0byBjb21wbGV0ZS4KKwkJICovCisJCVdBUk5fT04ocmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID09IE5VTEwpOworCisJCWlmIChyZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gIT0gTlVMTCkgeworCisJCQkvKiBTaWduYWwgd2hvZXZlciBpcyB3YWl0aW5nIHRoYXQgdGhpcworCQkJKiByZXF1ZXN0IGlzIGNvbXBsZXRlLgorCQkJKi8KKwkJCWNvbXBsZXRlKHJlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOgorCQkvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KKwkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogRXJyb3IgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHRhc2ssCisJCQkgdGFzay0+dGFza19zdGF0dXMucmVzcCwgcmVzcG9uc2UsCisJCQkgdGFzay0+dGFza19zdGF0dXMuc3RhdCwgc3RhdHVzKTsKKwkJLyogQWRkIHRvIHRoZSBhYm9ydGVkIGxpc3QuICovCisJCWxpc3RfYWRkKCZyZXF1ZXN0LT5jb21wbGV0ZWRfbm9kZSwKKwkJCSAmaG9zdC0+cmVxdWVzdHNfdG9fZXJyb3JiYWNrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBVbmtub3duIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCAoJWQpLCBzdGF0dXM9JWQgKCVkKVxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSB0YXNrLAorCQkJIHRhc2stPnRhc2tfc3RhdHVzLnJlc3AsIHJlc3BvbnNlLAorCQkJIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQsIHN0YXR1cyk7CisKKwkJLyogQWRkIHRvIHRoZSBlcnJvciB0byBsaWJzYXMgbGlzdC4gKi8KKwkJbGlzdF9hZGQoJnJlcXVlc3QtPmNvbXBsZXRlZF9ub2RlLAorCQkJICZob3N0LT5yZXF1ZXN0c190b19lcnJvcmJhY2spOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcmVxdWVzdF9wcm9jZXNzX3N0cF9yZXNwb25zZShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJCQkJCSAgICAgIHZvaWQgKnJlc3BvbnNlX2J1ZmZlcikKK3sKKwlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpkMmhfcmVnX2ZpcyA9IHJlc3BvbnNlX2J1ZmZlcjsKKwlzdHJ1Y3QgdGFza19zdGF0dXNfc3RydWN0ICp0cyA9ICZ0YXNrLT50YXNrX3N0YXR1czsKKwlzdHJ1Y3QgYXRhX3Rhc2tfcmVzcCAqcmVzcCA9ICh2b2lkICopJnRzLT5idWZbMF07CisKKwlyZXNwLT5mcmFtZV9sZW4gPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKShyZXNwb25zZV9idWZmZXIgKyA2KSk7CisJbWVtY3B5KCZyZXNwLT5lbmRpbmdfZmlzWzBdLCByZXNwb25zZV9idWZmZXIgKyAxNiwgMjQpOworCXRzLT5idWZfdmFsaWRfc2l6ZSA9IHNpemVvZigqcmVzcCk7CisKKwkvKioKKwkgKiBJZiB0aGUgZGV2aWNlIGZhdWx0IGJpdCBpcyBzZXQgaW4gdGhlIHN0YXR1cyByZWdpc3RlciwgdGhlbgorCSAqIHNldCB0aGUgc2Vuc2UgZGF0YSBhbmQgcmV0dXJuLgorCSAqLworCWlmIChkMmhfcmVnX2Zpcy0+c3RhdHVzICYgQVRBX0RGKQorCQl0cy0+c3RhdCA9IFNBU19QUk9UT19SRVNQT05TRTsKKwllbHNlCisJCXRzLT5zdGF0ID0gU0FNX1NUQVRfR09PRDsKKworCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcmVxdWVzdF9pb19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJCSAgICAgZW51bSBzY2lfaW9fc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKwlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICpyZXNwX2l1OworCXZvaWQgKnJlc3BfYnVmOworCXVuc2lnbmVkIGxvbmcgdGFza19mbGFnczsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gaXNjaV9sb29rdXBfZGV2aWNlKHRhc2stPmRldik7CisJZW51bSBzZXJ2aWNlX3Jlc3BvbnNlIHJlc3BvbnNlICAgICAgID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJZW51bSBleGVjX3N0YXR1cyBzdGF0dXMgICAgICAgICA9IFNBU19BQk9SVEVEX1RBU0s7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHJlcXVlc3Rfc3RhdHVzOworCWVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiBjb21wbGV0ZV90b19ob3N0CisJCT0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiByZXF1ZXN0ID0gJXAsIHRhc2sgPSAlcCxcbiIKKwkJInRhc2stPmRhdGFfZGlyID0gJWQgY29tcGxldGlvbl9zdGF0dXMgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywKKwkJcmVxdWVzdCwKKwkJdGFzaywKKwkJdGFzay0+ZGF0YV9kaXIsCisJCWNvbXBsZXRpb25fc3RhdHVzKTsKKworCXNwaW5fbG9jaygmcmVxdWVzdC0+c3RhdGVfbG9jayk7CisJcmVxdWVzdF9zdGF0dXMgPSByZXF1ZXN0LT5zdGF0dXM7CisKKwkvKiBEZWNvZGUgdGhlIHJlcXVlc3Qgc3RhdHVzLiAgTm90ZSB0aGF0IGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisJICogYWJvcnRlZCBieSBhIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbiwgd2UgZG9uJ3QgY2FyZQorCSAqIHdoYXQgdGhlIHN0YXR1cyBpcy4KKwkgKi8KKwlzd2l0Y2ggKHJlcXVlc3Rfc3RhdHVzKSB7CisKKwljYXNlIGFib3J0ZWQ6CisJCS8qICJhYm9ydGVkIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCB3YXMgYWJvcnRlZCBieSBhIHRhc2sKKwkJICogbWFuYWdlbWVudCBmdW5jdGlvbiwgc2luY2Ugb25jZSBhIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IGlzCisJCSAqIHBlcmZvbWVkIGJ5IHRoZSBkZXZpY2UsIHRoZSByZXF1ZXN0IG9ubHkgY29tcGxldGVzIGJlY2F1c2UKKwkJICogb2YgdGhlIHN1YnNlcXVlbnQgZHJpdmVyIHRlcm1pbmF0ZS4KKwkJICoKKwkJICogQWJvcnRlZCBhbHNvIG1lYW5zIGFuIGV4dGVybmFsIHRocmVhZCBpcyBleHBsaWNpdGx5IG1hbmFnaW5nCisJCSAqIHRoaXMgcmVxdWVzdCwgc28gdGhhdCB3ZSBkbyBub3QgY29tcGxldGUgaXQgdXAgdGhlIHN0YWNrLgorCQkgKgorCQkgKiBUaGUgdGFyZ2V0IGlzIHN0aWxsIHRoZXJlIChzaW5jZSB0aGUgVE1GIHdhcyBzdWNjZXNzZnVsKS4KKwkJICovCisJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCXJlc3BvbnNlID0gU0FTX1RBU0tfQ09NUExFVEU7CisKKwkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkgKiB0aGF0IHdlIGlnbm9yZSB0aGUgcXVpZXNjZSBzdGF0ZSwgc2luY2Ugd2UgYXJlCisJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJICovCisJCWlmICghaWRldikKKwkJCXN0YXR1cyA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJZWxzZQorCQkJc3RhdHVzID0gU0FTX0FCT1JURURfVEFTSzsKKworCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjsKKwkJLyogVGhpcyB3YXMgYW4gYWJvcnRlZCByZXF1ZXN0LiAqLworCisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIGFib3J0aW5nOgorCQkvKiBhYm9ydGluZyBtZWFucyB0aGF0IHRoZSB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24gdHJpZWQgYW5kCisJCSAqIGZhaWxlZCB0byBhYm9ydCB0aGUgcmVxdWVzdC4gV2UgbmVlZCB0byBub3RlIHRoZSByZXF1ZXN0CisJCSAqIGFzIFNBU19UQVNLX1VOREVMSVZFUkVELCBzbyB0aGF0IHRoZSBzY3NpIG1pZCBsYXllciBtYXJrcyB0aGUKKwkJICogdGFyZ2V0IGFzIGRvd24uCisJCSAqCisJCSAqIEFib3J0aW5nIGFsc28gbWVhbnMgYW4gZXh0ZXJuYWwgdGhyZWFkIGlzIGV4cGxpY2l0bHkgbWFuYWdpbmcKKwkJICogdGhpcyByZXF1ZXN0LCBzbyB0aGF0IHdlIGRvIG5vdCBjb21wbGV0ZSBpdCB1cCB0aGUgc3RhY2suCisJCSAqLworCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQlyZXNwb25zZSA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCisJCWlmICghaWRldikKKwkJCS8qIFRoZSBkZXZpY2UgaGFzIGJlZW4gL2lzIGJlaW5nIHN0b3BwZWQuIE5vdGUgdGhhdAorCQkJICogd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJCSAqLworCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQllbHNlCisJCQlzdGF0dXMgPSBTQVNfUEhZX0RPV047CisKKwkJY29tcGxldGVfdG9faG9zdCA9IGlzY2lfcGVyZm9ybV9hYm9ydGVkX2lvX2NvbXBsZXRpb247CisKKwkJLyogVGhpcyB3YXMgYW4gYWJvcnRlZCByZXF1ZXN0LiAqLworCisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIHRlcm1pbmF0aW5nOgorCisJCS8qIFRoaXMgd2FzIGFuIHRlcm1pbmF0ZWQgcmVxdWVzdC4gIFRoaXMgaGFwcGVucyB3aGVuCisJCSAqIHRoZSBJL08gaXMgYmVpbmcgdGVybWluYXRlZCBiZWNhdXNlIG9mIGFuIGFjdGlvbiBvbgorCQkgKiB0aGUgZGV2aWNlIChyZXNldCwgdGVhciBkb3duLCBldGMuKSwgYW5kIHRoZSBJL08gbmVlZHMKKwkJICogdG8gYmUgY29tcGxldGVkIHVwIHRoZSBzdGFjay4KKwkJICovCisJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkgKiB0aGF0IHdlIGlnbm9yZSB0aGUgcXVpZXNjZSBzdGF0ZSwgc2luY2Ugd2UgYXJlCisJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJICovCisJCWlmICghaWRldikKKwkJCXN0YXR1cyA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJZWxzZQorCQkJc3RhdHVzID0gU0FTX0FCT1JURURfVEFTSzsKKworCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjsKKworCQkvKiBUaGlzIHdhcyBhIHRlcm1pbmF0ZWQgcmVxdWVzdC4gKi8KKworCQlzcGluX3VubG9jaygmcmVxdWVzdC0+c3RhdGVfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBkZWFkOgorCQkvKiBUaGlzIHdhcyBhIHRlcm1pbmF0ZWQgcmVxdWVzdCB0aGF0IHRpbWVkLW91dCBkdXJpbmcgdGhlCisJCSAqIHRlcm1pbmF0aW9uIHByb2Nlc3MuICBUaGVyZSBpcyBubyB0YXNrIHRvIGNvbXBsZXRlIHRvCisJCSAqIGxpYnNhcy4KKwkJICovCisJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8qIFRoZSByZXF1ZXN0IGlzIGRvbmUgZnJvbSBhbiBTQ1UgSFcgcGVyc3BlY3RpdmUuICovCisJCXJlcXVlc3QtPnN0YXR1cyA9IGNvbXBsZXRlZDsKKworCQlzcGluX3VubG9jaygmcmVxdWVzdC0+c3RhdGVfbG9jayk7CisKKwkJLyogVGhpcyBpcyBhbiBhY3RpdmUgcmVxdWVzdCBiZWluZyBjb21wbGV0ZWQgZnJvbSB0aGUgY29yZS4gKi8KKwkJc3dpdGNoIChjb21wbGV0aW9uX3N0YXR1cykgeworCisJCWNhc2UgU0NJX0lPX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQ6CisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJX0lPX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQgKCVwLyVwKVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlyZXF1ZXN0LAorCQkJCXRhc2spOworCisJCQlpZiAoc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSkgeworCQkJCXJlc3BfYnVmID0gJnJlcXVlc3QtPnN0cC5yc3A7CisJCQkJaXNjaV9yZXF1ZXN0X3Byb2Nlc3Nfc3RwX3Jlc3BvbnNlKHRhc2ssCisJCQkJCQkJCSAgcmVzcF9idWYpOworCQkJfSBlbHNlIGlmIChTQVNfUFJPVE9DT0xfU1NQID09IHRhc2stPnRhc2tfcHJvdG8pIHsKKworCQkJCS8qIGNyYWNrIHRoZSBpdSByZXNwb25zZSBidWZmZXIuICovCisJCQkJcmVzcF9pdSA9ICZyZXF1ZXN0LT5zc3AucnNwOworCQkJCWlzY2lfcmVxdWVzdF9wcm9jZXNzX3Jlc3BvbnNlX2l1KHRhc2ssIHJlc3BfaXUsCisJCQkJCQkJCSAmaWhvc3QtPnBkZXYtPmRldik7CisKKwkJCX0gZWxzZSBpZiAoU0FTX1BST1RPQ09MX1NNUCA9PSB0YXNrLT50YXNrX3Byb3RvKSB7CisKKwkJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSV9JT19GQUlMVVJFX1JFU1BPTlNFX1ZBTElEOiAiCisJCQkJCSJTQVNfUFJPVE9DT0xfU01QIHByb3RvY29sXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisKKwkJCX0gZWxzZQorCQkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogdW5rbm93biBwcm90b2NvbFxuIiwgX19mdW5jX18pOworCisJCQkvKiB1c2UgdGhlIHRhc2sgc3RhdHVzIHNldCBpbiB0aGUgdGFzayBzdHJ1Y3QgYnkgdGhlCisJCQkgKiBpc2NpX3JlcXVlc3RfcHJvY2Vzc19yZXNwb25zZV9pdSBjYWxsLgorCQkJICovCisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJcmVzcG9uc2UgPSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwOworCQkJc3RhdHVzID0gdGFzay0+dGFza19zdGF0dXMuc3RhdDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0lPX1NVQ0NFU1M6CisJCWNhc2UgU0NJX0lPX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWToKKworCQkJcmVzcG9uc2UgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJCXN0YXR1cyAgID0gU0FNX1NUQVRfR09PRDsKKwkJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisKKwkJCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKKwkJCQl2b2lkICpyc3AgPSAmcmVxdWVzdC0+c21wLnJzcDsKKworCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogU01QIHByb3RvY29sIGNvbXBsZXRpb25cbiIsCisJCQkJCV9fZnVuY19fKTsKKworCQkJCXNnX2NvcHlfZnJvbV9idWZmZXIoCisJCQkJCSZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcCwgMSwKKwkJCQkJcnNwLCBzaXplb2Yoc3RydWN0IHNtcF9yZXNwKSk7CisJCQl9IGVsc2UgaWYgKGNvbXBsZXRpb25fc3RhdHVzCisJCQkJICAgPT0gU0NJX0lPX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWSkgeworCisJCQkJLyogVGhpcyB3YXMgYW4gU1NQIC8gU1RQIC8gU0FUQSB0cmFuc2Zlci4KKwkJCQkgKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgbGVzcyBkYXRhIHRoYW4KKwkJCQkgKiB0aGUgbWF4aW11bSB3YXMgdHJhbnNmZXJyZWQuCisJCQkJICovCisJCQkJdTMyIHRyYW5zZmVycmVkX2xlbmd0aCA9IHNjaV9yZXFfdHhfYnl0ZXMocmVxdWVzdCk7CisKKwkJCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNpZHVhbAorCQkJCQk9IHRhc2stPnRvdGFsX3hmZXJfbGVuIC0gdHJhbnNmZXJyZWRfbGVuZ3RoOworCisJCQkJLyogSWYgdGhlcmUgd2VyZSByZXNpZHVhbCBieXRlcywgY2FsbCB0aGlzIGFuCisJCQkJICogdW5kZXJydW4uCisJCQkJICovCisJCQkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc2lkdWFsICE9IDApCisJCQkJCXN0YXR1cyA9IFNBU19EQVRBX1VOREVSUlVOOworCisJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBTQ0lfSU9fU1VDQ0VTU19JT19ET05FX0VBUkxZICVkXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJc3RhdHVzKTsKKworCQkJfSBlbHNlCisJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBTQ0lfSU9fU1VDQ0VTU1xuIiwKKwkJCQkJX19mdW5jX18pOworCisJCQlicmVhazsKKworCQljYXNlIFNDSV9JT19GQUlMVVJFX1RFUk1JTkFURUQ6CisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJX0lPX0ZBSUxVUkVfVEVSTUlOQVRFRCAoJXAvJXApXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXJlcXVlc3QsCisJCQkJdGFzayk7CisKKwkJCS8qIFRoZSByZXF1ZXN0IHdhcyB0ZXJtaW5hdGVkIGV4cGxpY2l0bHkuICBObyBoYW5kbGluZworCQkJICogaXMgbmVlZGVkIGluIHRoZSBTQ1NJIGVycm9yIGhhbmRsZXIgcGF0aC4KKwkJCSAqLworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJCS8qIFNlZSBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuL2lzIGJlaW5nIHN0b3BwZWQuIE5vdGUKKwkJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJCSAqLworCQkJaWYgKCFpZGV2KQorCQkJCXN0YXR1cyA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjoKKworCQkJaXNjaV9yZXF1ZXN0X2hhbmRsZV9jb250cm9sbGVyX3NwZWNpZmljX2Vycm9ycygKKwkJCQlpZGV2LCByZXF1ZXN0LCB0YXNrLCAmcmVzcG9uc2UsICZzdGF0dXMsCisJCQkJJmNvbXBsZXRlX3RvX2hvc3QpOworCisJCQlicmVhazsKKworCQljYXNlIFNDSV9JT19GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQ6CisJCQkvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBpbiB0aGF0IHRoZSBJL08gY29tcGxldGlvbgorCQkJICogaXMgdGVsbGluZyB1cyB0aGF0IHRoZSBkZXZpY2UgbmVlZHMgYSByZXNldC4KKwkJCSAqIEluIG9yZGVyIGZvciB0aGUgZGV2aWNlIHJlc2V0IGNvbmRpdGlvbiB0byBiZQorCQkJICogbm90aWNlZCwgdGhlIEkvTyBoYXMgdG8gYmUgaGFuZGxlZCBpbiB0aGUgZXJyb3IKKwkJCSAqIGhhbmRsZXIuICBTZXQgdGhlIHJlc2V0IGZsYWcgYW5kIGNhdXNlIHRoZQorCQkJICogU0NTSSBlcnJvciB0aHJlYWQgdG8gYmUgc2NoZWR1bGVkLgorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCB0YXNrX2ZsYWdzKTsKKwkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIHRhc2tfZmxhZ3MpOworCisJCQkvKiBGYWlsIHRoZSBJL08uICovCisJCQlyZXNwb25zZSA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCQkJc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOworCisJCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb247CisJCQljbGVhcl9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIFNDSV9GQUlMVVJFX1JFVFJZX1JFUVVJUkVEOgorCisJCQkvKiBGYWlsIHRoZSBJL08gc28gaXQgY2FuIGJlIHJldHJpZWQuICovCisJCQlyZXNwb25zZSA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCQkJaWYgKCFpZGV2KQorCQkJCXN0YXR1cyA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCWJyZWFrOworCisKKwkJZGVmYXVsdDoKKwkJCS8qIENhdGNoIGFueSBvdGhlcndpc2UgdW5oYW5kbGVkIGVycm9yIGNvZGVzIGhlcmUuICovCisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IGludmFsaWQgY29tcGxldGlvbiBjb2RlOiAweCV4IC0gIgorCQkJCSAiaXNjaV9yZXF1ZXN0ID0gJXBcbiIsCisJCQkJIF9fZnVuY19fLCBjb21wbGV0aW9uX3N0YXR1cywgcmVxdWVzdCk7CisKKwkJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJCS8qIFNlZSBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuL2lzIGJlaW5nIHN0b3BwZWQuIE5vdGUKKwkJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJCSAqLworCQkJaWYgKCFpZGV2KQorCQkJCXN0YXR1cyA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCQlpZiAoU0FTX1BST1RPQ09MX1NNUCA9PSB0YXNrLT50YXNrX3Byb3RvKSB7CisJCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCQkJfSBlbHNlIHsKKwkJCQljbGVhcl9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCQkJY29tcGxldGVfdG9faG9zdCA9IGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0YXNrLT50YXNrX3Byb3RvKSB7CisJY2FzZSBTQVNfUFJPVE9DT0xfU1NQOgorCQlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpCisJCQlicmVhazsKKwkJaWYgKHRhc2stPm51bV9zY2F0dGVyID09IDApCisJCQkvKiAwIGluZGljYXRlcyBhIHNpbmdsZSBkbWEgYWRkcmVzcyAqLworCQkJZG1hX3VubWFwX3NpbmdsZSgmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIHJlcXVlc3QtPnplcm9fc2NhdHRlcl9kYWRkciwKKwkJCQkJIHRhc2stPnRvdGFsX3hmZXJfbGVuLCB0YXNrLT5kYXRhX2Rpcik7CisJCWVsc2UgIC8qIHVubWFwIHRoZSBzZ2wgZG1hIGFkZHJlc3NlcyAqLworCQkJZG1hX3VubWFwX3NnKCZpaG9zdC0+cGRldi0+ZGV2LCB0YXNrLT5zY2F0dGVyLAorCQkJCSAgICAgcmVxdWVzdC0+bnVtX3NnX2VudHJpZXMsIHRhc2stPmRhdGFfZGlyKTsKKwkJYnJlYWs7CisJY2FzZSBTQVNfUFJPVE9DT0xfU01QOiB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmdGFzay0+c21wX3Rhc2suc21wX3JlcTsKKwkJc3RydWN0IHNtcF9yZXEgKnNtcF9yZXE7CisJCXZvaWQgKmthZGRyOworCisJCWRtYV91bm1hcF9zZygmaWhvc3QtPnBkZXYtPmRldiwgc2csIDEsIERNQV9UT19ERVZJQ0UpOworCisJCS8qIG5lZWQgdG8gc3dhYiBpdCBiYWNrIGluIGNhc2UgdGhlIGNvbW1hbmQgYnVmZmVyIGlzIHJlLXVzZWQgKi8KKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSwgS01fSVJRMCk7CisJCXNtcF9yZXEgPSBrYWRkciArIHNnLT5vZmZzZXQ7CisJCXNjaV9zd2FiMzJfY3B5KHNtcF9yZXEsIHNtcF9yZXEsIHNnLT5sZW5ndGggLyBzaXplb2YodTMyKSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX0lSUTApOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogUHV0IHRoZSBjb21wbGV0ZWQgcmVxdWVzdCBvbiB0aGUgY29ycmVjdCBsaXN0ICovCisJaXNjaV90YXNrX3NhdmVfZm9yX3VwcGVyX2xheWVyX2NvbXBsZXRpb24oaWhvc3QsIHJlcXVlc3QsIHJlc3BvbnNlLAorCQkJCQkJICBzdGF0dXMsIGNvbXBsZXRlX3RvX2hvc3QKKwkJCQkJCSAgKTsKKworCS8qIGNvbXBsZXRlIHRoZSBpbyByZXF1ZXN0IHRvIHRoZSBjb3JlLiAqLworCXNjaV9jb250cm9sbGVyX2NvbXBsZXRlX2lvKGlob3N0LCByZXF1ZXN0LT50YXJnZXRfZGV2aWNlLCByZXF1ZXN0KTsKKwlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisKKwkvKiBzZXQgdGVybWluYXRlZCBoYW5kbGUgc28gaXQgY2Fubm90IGJlIGNvbXBsZXRlZCBvcgorCSAqIHRlcm1pbmF0ZWQgYWdhaW4sIGFuZCB0byBjYXVzZSBhbnkgY2FsbHMgaW50byBhYm9ydAorCSAqIHRhc2sgdG8gcmVjb2duaXplIHRoZSBhbHJlYWR5IGNvbXBsZXRlZCBjYXNlLgorCSAqLworCXNldF9iaXQoSVJFUV9URVJNSU5BVEVELCAmcmVxdWVzdC0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVxdWVzdF9zdGFydGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2UtPmRvbWFpbl9kZXY7CisJc3RydWN0IHNhc190YXNrICp0YXNrOworCisJLyogWFhYIGFzIGhjaCBzYWlkIGFsd2F5cyBjcmVhdGluZyBhbiBpbnRlcm5hbCBzYXNfdGFzayBmb3IgdG1mCisJICogcmVxdWVzdHMgd291bGQgc2ltcGxpZnkgdGhlIGRyaXZlcgorCSAqLworCXRhc2sgPSBpcmVxLT50dHlwZSA9PSBpb190YXNrID8gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpIDogTlVMTDsKKworCS8qIGFsbCB1bmFjY2VsZXJhdGVkIHJlcXVlc3QgdHlwZXMgKG5vbiBzc3Agb3IgbmNxKSBoYW5kbGVkIHdpdGgKKwkgKiBzdWJzdGF0ZXMKKwkgKi8KKwlpZiAoIXRhc2sgJiYgZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFVikgeworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19DT01QKTsKKwl9IGVsc2UgaWYgKCF0YXNrICYmCisJCSAgIChpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKS0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2ggfHwKKwkJICAgIGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfbG93KSkgeworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVEKTsKKwl9IGVsc2UgaWYgKHRhc2sgJiYgdGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfU01QX1dBSVRfUkVTUCk7CisJfSBlbHNlIGlmICh0YXNrICYmIHNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykgJiYKKwkJICAgIXRhc2stPmF0YV90YXNrLnVzZV9uY3EpIHsKKwkJdTMyIHN0YXRlOworCisJCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkKKwkJCXN0YXRlID0gU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkQ7CisJCWVsc2UgaWYgKHRhc2stPmF0YV90YXNrLmRtYV94ZmVyKQorCQkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUDsKKwkJZWxzZSAvKiBQSU8gKi8KKwkJCXN0YXRlID0gU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEOworCisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIHN0YXRlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZXF1ZXN0X2NvbXBsZXRlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcmVxKSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKiBUZWxsIHRoZSBTQ0lfVVNFUiB0aGF0IHRoZSBJTyByZXF1ZXN0IGlzIGNvbXBsZXRlICovCisJaWYgKCF0ZXN0X2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKSkKKwkJaXNjaV9yZXF1ZXN0X2lvX3JlcXVlc3RfY29tcGxldGUoaWhvc3QsIGlyZXEsCisJCQkJCQkgaXJlcS0+c2NpX3N0YXR1cyk7CisJZWxzZQorCQlpc2NpX3Rhc2tfcmVxdWVzdF9jb21wbGV0ZShpaG9zdCwgaXJlcSwgaXJlcS0+c2NpX3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZXF1ZXN0X2Fib3J0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisKKwkvKiBTZXR0aW5nIHRoZSBhYm9ydCBiaXQgaW4gdGhlIFRhc2sgQ29udGV4dCBpcyByZXF1aXJlZCBieSB0aGUgc2lsaWNvbi4gKi8KKwlpcmVxLT50Yy0+YWJvcnQgPSAxOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9ub25fZGF0YV9hd2FpdF9oMmRfY29tcGxldGlvbl9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcmVxKSwgc20pOworCisJaXJlcS0+dGFyZ2V0X2RldmljZS0+d29ya2luZ19yZXF1ZXN0ID0gaXJlcTsKK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZXF1ZXN0X3N0YXJ0ZWRfcGlvX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisKKwlpcmVxLT50YXJnZXRfZGV2aWNlLT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9hc3NlcnRlZF9jb21wbGV0aW9uX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisKKwlpcmVxLT50YXJnZXRfZGV2aWNlLT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9kaWFnbm9zdGljX2NvbXBsZXRpb25fZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGMgPSBpcmVxLT50YzsKKwlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICpoMmRfZmlzOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBDbGVhciB0aGUgU1JTVCBiaXQgKi8KKwloMmRfZmlzID0gJmlyZXEtPnN0cC5jbWQ7CisJaDJkX2Zpcy0+Y29udHJvbCA9IDA7CisKKwkvKiBDbGVhciB0aGUgVEMgY29udHJvbCBiaXQgKi8KKwl0Yy0+Y29udHJvbF9mcmFtZSA9IDA7CisKKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhpcmVxKTsKKwlXQVJOX09OQ0Uoc3RhdHVzICE9IFNDSV9TVUNDRVNTLCAiaXNjaTogY29udGludWUgaW8gZmFpbHVyZVxuIik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgc2NpX3JlcXVlc3Rfc3RhdGVfdGFibGVbXSA9IHsKKwlbU0NJX1JFUV9JTklUXSA9IHsgfSwKKwlbU0NJX1JFUV9DT05TVFJVQ1RFRF0gPSB7IH0sCisJW1NDSV9SRVFfU1RBUlRFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZXF1ZXN0X3N0YXJ0ZWRfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkRdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9ub25fZGF0YV9hd2FpdF9oMmRfY29tcGxldGlvbl9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0QySF0gPSB7IH0sCisJW1NDSV9SRVFfU1RQX1BJT19XQUlUX0gyRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX3Bpb19hd2FpdF9oMmRfY29tcGxldGlvbl9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRV0gPSB7IH0sCisJW1NDSV9SRVFfU1RQX1BJT19EQVRBX0lOXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VUXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfVURNQV9XQUlUX1RDX0NPTVBdID0geyB9LAorCVtTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfRDJIXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX2NvbXBsZXRpb25fZW50ZXIsCisJfSwKKwlbU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9ESUFHXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZXF1ZXN0X3N0YXJ0ZWRfc29mdF9yZXNldF9hd2FpdF9oMmRfZGlhZ25vc3RpY19jb21wbGV0aW9uX2VudGVyLAorCX0sCisJW1NDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkhdID0geyB9LAorCVtTQ0lfUkVRX1RBU0tfV0FJVF9UQ19DT01QXSA9IHsgfSwKKwlbU0NJX1JFUV9UQVNLX1dBSVRfVENfUkVTUF0gPSB7IH0sCisJW1NDSV9SRVFfU01QX1dBSVRfUkVTUF0gPSB7IH0sCisJW1NDSV9SRVFfU01QX1dBSVRfVENfQ09NUF0gPSB7IH0sCisJW1NDSV9SRVFfQ09NUExFVEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlcXVlc3RfY29tcGxldGVkX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9SRVFfQUJPUlRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVxdWVzdF9hYm9ydGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX0ZJTkFMXSA9IHsgfSwKK307CisKK3N0YXRpYyB2b2lkCitzY2lfZ2VuZXJhbF9yZXF1ZXN0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCSAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc2NpX2luaXRfc20oJmlyZXEtPnNtLCBzY2lfcmVxdWVzdF9zdGF0ZV90YWJsZSwgU0NJX1JFUV9JTklUKTsKKworCWlyZXEtPnRhcmdldF9kZXZpY2UgPSBpZGV2OworCWlyZXEtPnByb3RvY29sID0gU0NJQ19OT19QUk9UT0NPTDsKKwlpcmVxLT5zYXZlZF9yeF9mcmFtZV9pbmRleCA9IFNDVV9JTlZBTElEX0ZSQU1FX0lOREVYOworCisJaXJlcS0+c2NpX3N0YXR1cyAgID0gU0NJX1NVQ0NFU1M7CisJaXJlcS0+c2N1X3N0YXR1cyAgID0gMDsKKwlpcmVxLT5wb3N0X2NvbnRleHQgPSAweEZGRkZGRkZGOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJLyogQnVpbGQgdGhlIGNvbW1vbiBwYXJ0IG9mIHRoZSByZXF1ZXN0ICovCisJc2NpX2dlbmVyYWxfcmVxdWVzdF9jb25zdHJ1Y3QoaWhvc3QsIGlkZXYsIGlyZXEpOworCisJaWYgKGlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpCisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0U7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFVikKKwkJLyogcGFzcyAqLzsKKwllbHNlIGlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKQorCQltZW1zZXQoJmlyZXEtPnN0cC5jbWQsIDAsIHNpemVvZihpcmVxLT5zdHAuY21kKSk7CisJZWxzZSBpZiAoZGV2X2lzX2V4cGFuZGVyKGRldikpCisJCS8qIHBhc3MgKi87CisJZWxzZQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0w7CisKKwltZW1zZXQoaXJlcS0+dGMsIDAsIG9mZnNldG9mKHN0cnVjdCBzY3VfdGFza19jb250ZXh0LCBzZ2xfcGFpcl9hYikpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJICAgIHUxNiBpb190YWcsIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJLyogQnVpbGQgdGhlIGNvbW1vbiBwYXJ0IG9mIHRoZSByZXF1ZXN0ICovCisJc2NpX2dlbmVyYWxfcmVxdWVzdF9jb25zdHJ1Y3QoaWhvc3QsIGlkZXYsIGlyZXEpOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYgfHwKKwkgICAgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fCAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSkgeworCQlzZXRfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpOworCQltZW1zZXQoaXJlcS0+dGMsIDAsIHNpemVvZihzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCkpOworCX0gZWxzZQorCQlzdGF0dXMgPSBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9yZXF1ZXN0X3NzcF9yZXF1ZXN0X2NvbnN0cnVjdCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlkZXZfZGJnKCZyZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiByZXF1ZXN0ID0gJXBcbiIsCisJCV9fZnVuY19fLAorCQlyZXF1ZXN0KTsKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfYmFzaWNfc3NwKHJlcXVlc3QpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9yZXF1ZXN0X3N0cF9yZXF1ZXN0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICpmaXMgPSAmaXJlcS0+c3RwLmNtZDsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjID0gdGFzay0+dWxkZF90YXNrOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlkZXZfZGJnKCZpcmVxLT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpcmVxID0gJXBcbiIsCisJCV9fZnVuY19fLAorCQlpcmVxKTsKKworCW1lbWNweShmaXMsICZ0YXNrLT5hdGFfdGFzay5maXMsIHNpemVvZihzdHJ1Y3QgaG9zdF90b19kZXZfZmlzKSk7CisJaWYgKCF0YXNrLT5hdGFfdGFzay5kZXZpY2VfY29udHJvbF9yZWdfdXBkYXRlKQorCQlmaXMtPmZsYWdzIHw9IDB4ODA7CisJZmlzLT5mbGFncyAmPSAweEYwOworCisJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X2Jhc2ljX3NhdGEoaXJlcSk7CisKKwlpZiAocWMgJiYgKHFjLT50Zi5jb21tYW5kID09IEFUQV9DTURfRlBETUFfV1JJVEUgfHwKKwkJICAgcWMtPnRmLmNvbW1hbmQgPT0gQVRBX0NNRF9GUERNQV9SRUFEKSkgeworCQlmaXMtPnNlY3Rvcl9jb3VudCA9IHFjLT50YWcgPDwgMzsKKwkJaXJlcS0+dGMtPnR5cGUuc3RwLm5jcV90YWcgPSBxYy0+dGFnOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9zbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCSAgICAgIHN0cnVjdCBzYXNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJnRhc2stPnNtcF90YXNrLnNtcF9yZXE7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCXN0cnVjdCBzbXBfcmVxICpzbXBfcmVxOworCXZvaWQgKmthZGRyOworCXU4IHJlcV9sZW47CisJdTMyIGNtZDsKKworCWthZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyksIEtNX0lSUTApOworCXNtcF9yZXEgPSBrYWRkciArIHNnLT5vZmZzZXQ7CisJLyoKKwkgKiBMb29rIGF0IHRoZSBTTVAgcmVxdWVzdHMnIGhlYWRlciBmaWVsZHM7IGZvciBjZXJ0YWluIFNBUyAxLnggU01QCisJICogZnVuY3Rpb25zIHVuZGVyIFNBUyAyLjAsIGEgemVybyByZXF1ZXN0IGxlbmd0aCByZWFsbHkgaW5kaWNhdGVzCisJICogYSBub24temVybyBkZWZhdWx0IGxlbmd0aC4KKwkgKi8KKwlpZiAoc21wX3JlcS0+cmVxX2xlbiA9PSAwKSB7CisJCXN3aXRjaCAoc21wX3JlcS0+ZnVuYykgeworCQljYXNlIFNNUF9ESVNDT1ZFUjoKKwkJY2FzZSBTTVBfUkVQT1JUX1BIWV9FUlJfTE9HOgorCQljYXNlIFNNUF9SRVBPUlRfUEhZX1NBVEE6CisJCWNhc2UgU01QX1JFUE9SVF9ST1VURV9JTkZPOgorCQkJc21wX3JlcS0+cmVxX2xlbiA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBTTVBfQ09ORl9ST1VURV9JTkZPOgorCQljYXNlIFNNUF9QSFlfQ09OVFJPTDoKKwkJY2FzZSBTTVBfUEhZX1RFU1RfRlVOQ1RJT046CisJCQlzbXBfcmVxLT5yZXFfbGVuID0gOTsKKwkJCWJyZWFrOworCQkJLyogRGVmYXVsdCAtIHplcm8gaXMgYSB2YWxpZCBkZWZhdWx0IGZvciAyLjAuICovCisJCX0KKwl9CisJcmVxX2xlbiA9IHNtcF9yZXEtPnJlcV9sZW47CisJc2NpX3N3YWIzMl9jcHkoc21wX3JlcSwgc21wX3JlcSwgc2ctPmxlbmd0aCAvIHNpemVvZih1MzIpKTsKKwljbWQgPSAqKHUzMiAqKSBzbXBfcmVxOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX0lSUTApOworCisJaWYgKCFkbWFfbWFwX3NnKGRldiwgc2csIDEsIERNQV9UT19ERVZJQ0UpKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisKKwlpcmVxLT5wcm90b2NvbCA9IFNDSUNfU01QX1BST1RPQ09MOworCisJLyogYnl0ZSBzd2FwIHRoZSBzbXAgcmVxdWVzdC4gKi8KKworCXRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJaWRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2U7CisJaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKworCS8qCisJICogRmlsbCBpbiB0aGUgVEMgd2l0aCB0aGUgaXRzIHJlcXVpcmVkIGRhdGEKKwkgKiAwMGgKKwkgKi8KKwl0YXNrX2NvbnRleHQtPnByaW9yaXR5ID0gMDsKKwl0YXNrX2NvbnRleHQtPmluaXRpYXRvcl9yZXF1ZXN0ID0gMTsKKwl0YXNrX2NvbnRleHQtPmNvbm5lY3Rpb25fcmF0ZSA9IGlkZXYtPmNvbm5lY3Rpb25fcmF0ZTsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX2VuZ2luZV9pbmRleCA9IElTQ0lfUEVHOworCXRhc2tfY29udGV4dC0+bG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TTVA7CisJdGFza19jb250ZXh0LT5hYm9ydCA9IDA7CisJdGFza19jb250ZXh0LT52YWxpZCA9IFNDVV9UQVNLX0NPTlRFWFRfVkFMSUQ7CisJdGFza19jb250ZXh0LT5jb250ZXh0X3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1RZUEU7CisKKwkvKiAwNGggKi8KKwl0YXNrX2NvbnRleHQtPnJlbW90ZV9ub2RlX2luZGV4ID0gaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4OworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9jb2RlID0gMDsKKwl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSA9IFNDVV9UQVNLX1RZUEVfU01QX1JFUVVFU1Q7CisKKwkvKiAwOGggKi8KKwl0YXNrX2NvbnRleHQtPmxpbmtfbGF5ZXJfY29udHJvbCA9IDA7CisJdGFza19jb250ZXh0LT5kb19ub3RfZG1hX3NzcF9nb29kX3Jlc3BvbnNlID0gMTsKKwl0YXNrX2NvbnRleHQtPnN0cmljdF9vcmRlcmluZyA9IDA7CisJdGFza19jb250ZXh0LT5jb250cm9sX2ZyYW1lID0gMTsKKwl0YXNrX2NvbnRleHQtPnRpbWVvdXRfZW5hYmxlID0gMDsKKwl0YXNrX2NvbnRleHQtPmJsb2NrX2d1YXJkX2VuYWJsZSA9IDA7CisKKwkvKiAwY2ggKi8KKwl0YXNrX2NvbnRleHQtPmFkZHJlc3NfbW9kaWZpZXIgPSAwOworCisJLyogMTBoICovCisJdGFza19jb250ZXh0LT5zc3BfY29tbWFuZF9pdV9sZW5ndGggPSByZXFfbGVuOworCisJLyogMTRoICovCisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSAwOworCisJLyoKKwkgKiAxOGggfiAzMGgsIHByb3RvY29sIHNwZWNpZmljCisJICogc2luY2UgY29tbWFuZElVIGhhcyBiZWVuIGJ1aWxkIGJ5IGZyYW1ld29yayBhdCB0aGlzIHBvaW50LCB3ZSBqdXN0CisJICogY29weSB0aGUgZnJpc3QgRFdvcmQgZnJvbSBjb21tYW5kIElVIHRvIHRoaXMgbG9jYXRpb24uICovCisJbWVtY3B5KCZ0YXNrX2NvbnRleHQtPnR5cGUuc21wLCAmY21kLCBzaXplb2YodTMyKSk7CisKKwkvKgorCSAqIDQwaAorCSAqICJGb3IgU01QIHlvdSBjb3VsZCBwcm9ncmFtIGl0IHRvIHplcm8uIFdlIHdvdWxkIHByZWZlciB0aGF0IHdheQorCSAqIHNvIHRoYXQgZG9uZSBjb2RlIHdpbGwgYmUgY29uc2lzdGVudC4iIC0gVmVua2kKKwkgKi8KKwl0YXNrX2NvbnRleHQtPnRhc2tfcGhhc2UgPSAwOworCisJaXJlcS0+cG9zdF9jb250ZXh0ID0gKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEMgfAorCQkJICAgICAgKElTQ0lfUEVHIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1NISUZUKSB8CisJCQkgICAgICAgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4IDw8CisJCQkJU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQpIHwKKwkJCSAgICAgIElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpKTsKKwkvKgorCSAqIENvcHkgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBjb21tYW5kIGJ1ZmZlciB0byB0aGUgU0NVIFRhc2sKKwkgKiBDb250ZXh0IGNvbW1hbmQgYnVmZmVyIHNob3VsZCBub3QgY29udGFpbiBjb21tYW5kIGhlYWRlci4KKwkgKi8KKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfdXBwZXIgPSB1cHBlcl8zMl9iaXRzKHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJdGFza19jb250ZXh0LT5jb21tYW5kX2l1X2xvd2VyID0gbG93ZXJfMzJfYml0cyhzZ19kbWFfYWRkcmVzcyhzZykgKyBzaXplb2YodTMyKSk7CisKKwkvKiBTTVAgcmVzcG9uc2UgY29tZXMgYXMgVUYsIHNvIG5vIG5lZWQgdG8gc2V0IHJlc3BvbnNlIElVIGFkZHJlc3MuICovCisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV91cHBlciA9IDA7CisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV9sb3dlciA9IDA7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT05TVFJVQ1RFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBpc2NpX3NtcF9yZXF1ZXN0X2J1aWxkKCkgLSBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgc21wIHJlcXVlc3QuCisgKiBAaXJlcTogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBpc2NpX3JlcXVlc3QgYWxsb2NhdGVkIGluIHRoZQorICogICAgcmVxdWVzdCBjb25zdHJ1Y3QgZnVuY3Rpb24uCisgKgorICogU0NJX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bGwgY29tcGxldGlvbiwgb3Igc3BlY2lmaWMgZmFpbHVyZSBjb2RlLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGlzY2lfc21wX3JlcXVlc3RfYnVpbGQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlyZXEtPmlzY2lfaG9zdC0+cGRldi0+ZGV2OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRTsKKworCXN0YXR1cyA9IHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9zbXAoZGV2LCBpcmVxLCB0YXNrKTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlkZXZfZGJnKCZpcmVxLT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGlzY2lfaW9fcmVxdWVzdF9idWlsZCgpIC0gVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIGlvIHJlcXVlc3Qgb2JqZWN0LgorICogQGlob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIElTQ0kgaG9zdCBvYmplY3QKKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIGlzY2lfcmVxdWVzdCBvYmplY3QgYWxsb2NhdGVkIGluIHRoZQorICogICAgcmVxdWVzdCBjb25zdHJ1Y3QgZnVuY3Rpb24uCisgKiBAc2NpX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGhhbmRsZSBmb3IgdGhlIHNjaSBjb3JlJ3MgcmVtb3RlIGRldmljZQorICogICAgb2JqZWN0IHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGlzIHJlcXVlc3QuCisgKgorICogU0NJX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bGwgY29tcGxldGlvbiwgb3Igc3BlY2lmaWMgZmFpbHVyZSBjb2RlLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGlzY2lfaW9fcmVxdWVzdF9idWlsZChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCQkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaWRldiA9IDB4JXA7IHJlcXVlc3QgPSAlcCwgIgorCQkibnVtX3NjYXR0ZXIgPSAlZFxuIiwKKwkJX19mdW5jX18sCisJCWlkZXYsCisJCXJlcXVlc3QsCisJCXRhc2stPm51bV9zY2F0dGVyKTsKKworCS8qIG1hcCB0aGUgc2dsIGFkZHJlc3NlcywgaWYgcHJlc2VudC4KKwkgKiBsaWJhdGEgZG9lcyB0aGUgbWFwcGluZyBmb3Igc2F0YSBkZXZpY2VzCisJICogYmVmb3JlIHdlIGdldCB0aGUgcmVxdWVzdC4KKwkgKi8KKwlpZiAodGFzay0+bnVtX3NjYXR0ZXIgJiYKKwkgICAgIXNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykgJiYKKwkgICAgIShTQVNfUFJPVE9DT0xfU01QICYgdGFzay0+dGFza19wcm90bykpIHsKKworCQlyZXF1ZXN0LT5udW1fc2dfZW50cmllcyA9IGRtYV9tYXBfc2coCisJCQkmaWhvc3QtPnBkZXYtPmRldiwKKwkJCXRhc2stPnNjYXR0ZXIsCisJCQl0YXNrLT5udW1fc2NhdHRlciwKKwkJCXRhc2stPmRhdGFfZGlyCisJCQkpOworCisJCWlmIChyZXF1ZXN0LT5udW1fc2dfZW50cmllcyA9PSAwKQorCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7CisJfQorCisJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0KGlob3N0LCBpZGV2LCByZXF1ZXN0KTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IGZhaWxlZCByZXF1ZXN0IGNvbnN0cnVjdFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnRhc2tfcHJvdG8pIHsKKwljYXNlIFNBU19QUk9UT0NPTF9TTVA6CisJCXN0YXR1cyA9IGlzY2lfc21wX3JlcXVlc3RfYnVpbGQocmVxdWVzdCk7CisJCWJyZWFrOworCWNhc2UgU0FTX1BST1RPQ09MX1NTUDoKKwkJc3RhdHVzID0gaXNjaV9yZXF1ZXN0X3NzcF9yZXF1ZXN0X2NvbnN0cnVjdChyZXF1ZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBTQVNfUFJPVE9DT0xfU0FUQToKKwljYXNlIFNBU19QUk9UT0NPTF9TVFA6CisJY2FzZSBTQVNfUFJPVE9DT0xfU0FUQSB8IFNBU19QUk9UT0NPTF9TVFA6CisJCXN0YXR1cyA9IGlzY2lfcmVxdWVzdF9zdHBfcmVxdWVzdF9jb25zdHJ1Y3QocmVxdWVzdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiB1bmtub3duIHByb3RvY29sXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3RfZnJvbV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiB0YWcpCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKworCWlyZXEgPSBpaG9zdC0+cmVxc1tJU0NJX1RBR19UQ0kodGFnKV07CisJaXJlcS0+aW9fdGFnID0gdGFnOworCWlyZXEtPmlvX3JlcXVlc3RfY29tcGxldGlvbiA9IE5VTEw7CisJaXJlcS0+ZmxhZ3MgPSAwOworCWlyZXEtPm51bV9zZ19lbnRyaWVzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmaXJlcS0+Y29tcGxldGVkX25vZGUpOworCUlOSVRfTElTVF9IRUFEKCZpcmVxLT5kZXZfbm9kZSk7CisJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBhbGxvY2F0ZWQpOworCisJcmV0dXJuIGlyZXE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX2lvX3JlcXVlc3RfZnJvbV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQkgICAgIHN0cnVjdCBzYXNfdGFzayAqdGFzaywKKwkJCQkJCSAgICAgdTE2IHRhZykKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IGlzY2lfcmVxdWVzdF9mcm9tX3RhZyhpaG9zdCwgdGFnKTsKKwlpcmVxLT50dHlwZV9wdHIuaW9fdGFza19wdHIgPSB0YXNrOworCWlyZXEtPnR0eXBlID0gaW9fdGFzazsKKwl0YXNrLT5sbGRkX3Rhc2sgPSBpcmVxOworCisJcmV0dXJuIGlyZXE7Cit9CisKK3N0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfdG1mX3JlcXVlc3RfZnJvbV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV90bWYgKmlzY2lfdG1mLAorCQkJCQkgICAgICAgdTE2IHRhZykKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IGlzY2lfcmVxdWVzdF9mcm9tX3RhZyhpaG9zdCwgdGFnKTsKKwlpcmVxLT50dHlwZV9wdHIudG1mX3Rhc2tfcHRyID0gaXNjaV90bWY7CisJaXJlcS0+dHR5cGUgPSB0bWZfdGFzazsKKworCXJldHVybiBpcmVxOworfQorCitpbnQgaXNjaV9yZXF1ZXN0X2V4ZWN1dGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkgc3RydWN0IHNhc190YXNrICp0YXNrLCB1MTYgdGFnKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBkbyBjb21tb24gYWxsb2NhdGlvbiBhbmQgaW5pdCBvZiByZXF1ZXN0IG9iamVjdC4gKi8KKwlpcmVxID0gaXNjaV9pb19yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCB0YXNrLCB0YWcpOworCisJc3RhdHVzID0gaXNjaV9pb19yZXF1ZXN0X2J1aWxkKGlob3N0LCBpcmVxLCBpZGV2KTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiByZXF1ZXN0X2NvbnN0cnVjdCBmYWlsZWQgLSBzdGF0dXMgPSAweCV4XG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0ZXN0X2JpdChJREVWX0lPX05DUUVSUk9SLCAmaWRldi0+ZmxhZ3MpKSB7CisKKwkJaWYgKGlzY2lfdGFza19pc19uY3FfcmVjb3ZlcnkodGFzaykpIHsKKworCQkJLyogVGhlIGRldmljZSBpcyBpbiBhbiBOQ1EgcmVjb3Zlcnkgc3RhdGUuICBJc3N1ZSB0aGUKKwkJCSAqIHJlcXVlc3Qgb24gdGhlIHRhc2sgc2lkZS4gIE5vdGUgdGhhdCBpdCB3aWxsCisJCQkgKiBjb21wbGV0ZSBvbiB0aGUgSS9PIHJlcXVlc3Qgc2lkZSBiZWNhdXNlIHRoZQorCQkJICogcmVxdWVzdCB3YXMgYnVpbHQgdGhhdCB3YXkgKGllLgorCQkJICogaXJlcS0+aXNfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QgaXMgZmFsc2UpLgorCQkJICovCisJCQlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKGlob3N0LAorCQkJCQkJCSAgICBpZGV2LAorCQkJCQkJCSAgICBpcmVxKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJLyogc2VuZCB0aGUgcmVxdWVzdCwgbGV0IHRoZSBjb3JlIGFzc2lnbiB0aGUgSU8gVEFHLgkqLworCQlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9zdGFydF9pbyhpaG9zdCwgaWRldiwKKwkJCQkJCSAgaXJlcSk7CisJfQorCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUyAmJgorCSAgICBzdGF0dXMgIT0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCkgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogZmFpbGVkIHJlcXVlc3Qgc3RhcnQgKDB4JXgpXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0dXMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogRWl0aGVyIEkvTyBzdGFydGVkIE9LLCBvciB0aGUgY29yZSBoYXMgc2lnbmFsZWQgdGhhdAorCSAqIHRoZSBkZXZpY2UgbmVlZHMgYSB0YXJnZXQgcmVzZXQuCisJICoKKwkgKiBJbiBlaXRoZXIgY2FzZSwgaG9sZCBvbnRvIHRoZSBJL08gZm9yIGxhdGVyLgorCSAqCisJICogVXBkYXRlIGl0J3Mgc3RhdHVzIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3QgaW4gdGhlCisJICogcmVtb3RlIGRldmljZSBvYmplY3QuCisJICovCisJbGlzdF9hZGQoJmlyZXEtPmRldl9ub2RlLCAmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKworCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBzdGFydGVkKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgcmVxdWVzdCBkaWQgbm90IHJlYWxseSBzdGFydCBpbiB0aGUKKwkJICogaGFyZHdhcmUsIHNvIGNsZWFyIHRoZSByZXF1ZXN0IGhhbmRsZQorCQkgKiBoZXJlIHNvIG5vIHRlcm1pbmF0aW9ucyB3aWxsIGJlIGRvbmUuCisJCSAqLworCQlzZXRfYml0KElSRVFfVEVSTUlOQVRFRCwgJmlyZXEtPmZsYWdzKTsKKwkJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBjb21wbGV0ZWQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhdHVzID09CisJICAgIFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQpIHsKKwkJLyogU2lnbmFsIGxpYnNhcyB0aGF0IHdlIG5lZWQgdGhlIFNDU0kgZXJyb3IKKwkJICogaGFuZGxlciB0aHJlYWQgdG8gd29yayBvbiB0aGlzIEkvTyBhbmQgdGhhdAorCQkgKiB3ZSB3YW50IGEgZGV2aWNlIHJlc2V0LgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX05FRURfREVWX1JFU0VUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkvKiBDYXVzZSB0aGlzIHRhc2sgdG8gYmUgc2NoZWR1bGVkIGluIHRoZSBTQ1NJIGVycm9yCisJCSAqIGhhbmRsZXIgdGhyZWFkLgorCQkgKi8KKwkJaXNjaV9leGVjcGF0aF9jYWxsYmFjayhpaG9zdCwgdGFzaywKKwkJCQkgICAgICAgc2FzX3Rhc2tfYWJvcnQpOworCisJCS8qIENoYW5nZSB0aGUgc3RhdHVzLCBzaW5jZSB3ZSBhcmUgaG9sZGluZworCQkgKiB0aGUgSS9PIHVudGlsIGl0IGlzIG1hbmFnZWQgYnkgdGhlIFNDU0kKKwkJICogZXJyb3IgaGFuZGxlci4KKwkJICovCisJCXN0YXR1cyA9IFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExZDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaApAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfSVNDSV9SRVFVRVNUX0hfCisjZGVmaW5lIF9JU0NJX1JFUVVFU1RfSF8KKworI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAic2N1X3Rhc2tfY29udGV4dC5oIgorCisvKioKKyAqIHN0cnVjdCBpc2NpX3JlcXVlc3Rfc3RhdHVzIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHBvc3NpYmxlIHN0YXRlcyBvZiBhbiBJL08KKyAqICAgIHJlcXVlc3QuCisgKgorICoKKyAqLworZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHsKKwl1bmFsbG9jYXRlZCA9IDB4MDAsCisJYWxsb2NhdGVkICAgPSAweDAxLAorCXN0YXJ0ZWQgICAgID0gMHgwMiwKKwljb21wbGV0ZWQgICA9IDB4MDMsCisJYWJvcnRpbmcgICAgPSAweDA0LAorCWFib3J0ZWQgICAgID0gMHgwNSwKKwl0ZXJtaW5hdGluZyA9IDB4MDYsCisJZGVhZCAgICAgICAgPSAweDA3Cit9OworCitlbnVtIHRhc2tfdHlwZSB7CisJaW9fdGFzayAgPSAwLAorCXRtZl90YXNrID0gMQorfTsKKworZW51bSBzY2lfcmVxdWVzdF9wcm90b2NvbCB7CisJU0NJQ19OT19QUk9UT0NPTCwKKwlTQ0lDX1NNUF9QUk9UT0NPTCwKKwlTQ0lDX1NTUF9QUk9UT0NPTCwKKwlTQ0lDX1NUUF9QUk9UT0NPTAorfTsgLyogWFhYIHJlbW92ZSBtZSwgdXNlIHNhc190YXNrLntkZXZ8dGFza19wcm90b30gaW5zdGVhZCAqLzsKKworLyoqCisgKiBpc2NpX3N0cF9yZXF1ZXN0IC0gZXh0cmEgcmVxdWVzdCBpbmZyYXN0cnVjdHVyZSB0byBoYW5kbGUgcGlvL2F0YXBpIHByb3RvY29sCisgKiBAcGlvX2xlbiAtIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQgYXQgUElPIHNldHVwCisgKiBAc3RhdHVzIC0gcGlvIHNldHVwIGVuZGluZyBzdGF0dXMgdmFsdWUgdG8gdGVsbCB1cyBpZiB3ZSBuZWVkCisgKgkgICAgIHRvIHdhaXQgZm9yIGFub3RoZXIgZmlzIG9yIGlmIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4gIFVwb24KKyAqICAgICAgICAgICByZWNlaXB0IG9mIGEgZDJoIGZpcyB0aGlzIHdpbGwgYmUgdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGF0IGZpcy4KKyAqIEBzZ2wgLSB0cmFjayBwaW8gdHJhbnNmZXIgcHJvZ3Jlc3MgYXMgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZ2wKKyAqIEBkZXZpY2VfY2RiX2xlbiAtIGF0YXBpIGRldmljZSBhZHZlcnRpc2VzIGl0J3MgdHJhbnNmZXIgY29uc3RyYWludHMgYXQgc2V0dXAKKyAqLworc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgeworCXUzMiBwaW9fbGVuOworCXU4IHN0YXR1czsKKworCXN0cnVjdCBpc2NpX3N0cF9waW9fc2dsIHsKKwkJaW50IGluZGV4OworCQl1OCBzZXQ7CisJCXUzMiBvZmZzZXQ7CisJfSBzZ2w7CisJdTMyIGRldmljZV9jZGJfbGVuOworfTsKKworc3RydWN0IGlzY2lfcmVxdWVzdCB7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHN0YXR1czsKKwkjZGVmaW5lIElSRVFfQ09NUExFVEVfSU5fVEFSR0VUIDAKKwkjZGVmaW5lIElSRVFfVEVSTUlOQVRFRCAxCisJI2RlZmluZSBJUkVRX1RNRiAyCisJI2RlZmluZSBJUkVRX0FDVElWRSAzCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKiBYWFgga2lsbCB0dHlwZSBhbmQgdHR5cGVfcHRyLCBhbGxvY2F0ZSBmdWxsIHNhc190YXNrICovCisJZW51bSB0YXNrX3R5cGUgdHR5cGU7CisJdW5pb24gdHR5cGVfcHRyX3VuaW9uIHsKKwkJc3RydWN0IHNhc190YXNrICppb190YXNrX3B0cjsgICAvKiBXaGVuIHR0eXBlPT1pb190YXNrICAqLworCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZl90YXNrX3B0cjsgIC8qIFdoZW4gdHR5cGU9PXRtZl90YXNrICovCisJfSB0dHlwZV9wdHI7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0OworCS8qIEZvciB1c2UgaW4gdGhlIHJlcXVlc3RzX3RvX3tjb21wbGV0ZXxhYm9ydH0gbGlzdHM6ICovCisJc3RydWN0IGxpc3RfaGVhZCBjb21wbGV0ZWRfbm9kZTsKKwkvKiBGb3IgdXNlIGluIHRoZSByZXFzX2luX3Byb2Nlc3MgbGlzdDogKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9ub2RlOworCXNwaW5sb2NrX3Qgc3RhdGVfbG9jazsKKwlkbWFfYWRkcl90IHJlcXVlc3RfZGFkZHI7CisJZG1hX2FkZHJfdCB6ZXJvX3NjYXR0ZXJfZGFkZHI7CisJdW5zaWduZWQgaW50IG51bV9zZ19lbnRyaWVzOworCS8qIE5vdGU6ICJpb19yZXF1ZXN0X2NvbXBsZXRpb24iIGlzIGNvbXBsZXRlZCBpbiB0d28gZGlmZmVyZW50IHdheXMKKwkgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIGlzIGEgVE1GIG9yIHJlZ3VsYXIgcmVxdWVzdC4KKwkgKiAtIFRNRiByZXF1ZXN0cyBhcmUgY29tcGxldGVkIGluIHRoZSB0aHJlYWQgdGhhdCBzdGFydGVkIHRoZW07CisJICogLSByZWd1bGFyIHJlcXVlc3RzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIHJlcXVlc3QgY29tcGxldGlvbiBjYWxsYmFjaworCSAqICAgZnVuY3Rpb24uCisJICogVGhpcyBkaWZmZXJlbmNlIGluIG9wZXJhdGlvbiBhbGxvd3MgdGhlIGFib3J0ZXIgb2YgYSBUTUYgcmVxdWVzdAorCSAqIHRvIGJlIHN1cmUgdGhhdCBvbmNlIHRoZSBUTUYgcmVxdWVzdCBjb21wbGV0ZXMsIHRoZSBJL08gdGhhdCB0aGUKKwkgKiBUTUYgd2FzIGFib3J0aW5nIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb21wbGV0ZWQuCisJICoKKwkgKiBYWFgga2lsbCBpb19yZXF1ZXN0X2NvbXBsZXRpb24KKwkgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiAqaW9fcmVxdWVzdF9jb21wbGV0aW9uOworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lIHNtOworCXN0cnVjdCBpc2NpX2hvc3QgKm93bmluZ19jb250cm9sbGVyOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKnRhcmdldF9kZXZpY2U7CisJdTE2IGlvX3RhZzsKKwllbnVtIHNjaV9yZXF1ZXN0X3Byb3RvY29sIHByb3RvY29sOworCXUzMiBzY3Vfc3RhdHVzOyAvKiBoYXJkd2FyZSByZXN1bHQgKi8KKwl1MzIgc2NpX3N0YXR1czsgLyogdXBwZXIgbGF5ZXIgZGlzcG9zaXRpb24gKi8KKwl1MzIgcG9zdF9jb250ZXh0OworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YzsKKwkvKiBjb3VsZCBiZSBsYXJnZXIgd2l0aCBzZyBjaGFpbmluZyAqLworCSNkZWZpbmUgU0NVX1NHTF9TSVpFICgoU0NJX01BWF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UUyArIDEpIC8gMikKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgc2dfdGFibGVbU0NVX1NHTF9TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsKKwkvKiBUaGlzIGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgc3RvcmVkIHJ4IGZyYW1lIGRhdGEuICBJdCBpcyB1c2VkIGluCisJICogU1RQIGludGVybmFsIHJlcXVlc3RzIGFuZCBTTVAgcmVzcG9uc2UgZnJhbWVzLiAgSWYgdGhpcyBmaWVsZCBpcworCSAqIG5vbi1OVUxMIHRoZSBzYXZlZCBmcmFtZSBtdXN0IGJlIHJlbGVhc2VkIG9uIElPIHJlcXVlc3QgY29tcGxldGlvbi4KKwkgKi8KKwl1MzIgc2F2ZWRfcnhfZnJhbWVfaW5kZXg7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bmlvbiB7CisJCQkJc3RydWN0IHNzcF9jbWRfaXUgY21kOworCQkJCXN0cnVjdCBzc3BfdGFza19pdSB0bWY7CisJCQl9OworCQkJdW5pb24geworCQkJCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgcnNwOworCQkJCXU4IHJzcF9idWZbU1NQX1JFU1BfSVVfTUFYX1NJWkVdOworCQkJfTsKKwkJfSBzc3A7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgc21wX3Jlc3AgcnNwOworCQl9IHNtcDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0IHJlcTsKKwkJCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgY21kOworCQkJc3RydWN0IGRldl90b19ob3N0X2ZpcyByc3A7CisJCX0gc3RwOworCX07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpc2NpX3JlcXVlc3QgKnRvX2lyZXEoc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEpCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKworCWlyZXEgPSBjb250YWluZXJfb2Yoc3RwX3JlcSwgdHlwZW9mKCppcmVxKSwgc3RwLnJlcSk7CisJcmV0dXJuIGlyZXE7Cit9CisKKy8qKgorICogZW51bSBzY2lfYmFzZV9yZXF1ZXN0X3N0YXRlcyAtIFRoaXMgZW51bWVyYXRpb24gZGVwaWN0cyBhbGwgdGhlIHN0YXRlcyBmb3IKKyAqICAgIHRoZSBjb21tb24gcmVxdWVzdCBzdGF0ZSBtYWNoaW5lLgorICoKKyAqCisgKi8KK2VudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgeworCS8qCisJICogU2ltcGx5IHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgYmFzZSByZXF1ZXN0IHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX1JFUV9JTklULAorCisJLyoKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNvbnN0cnVjdGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMIHN0YXRlLgorCSAqLworCVNDSV9SRVFfQ09OU1RSVUNURUQsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc3RhcnRlZC4gVGhpcyBzdGF0ZQorCSAqIGlzIGVudGVyZWQgZnJvbSB0aGUgQ09OU1RSVUNURUQgc3RhdGUuCisJICovCisJU0NJX1JFUV9TVEFSVEVELAorCisJU0NJX1JFUV9TVFBfVURNQV9XQUlUX1RDX0NPTVAsCisJU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySCwKKworCVNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfSDJELAorCVNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfRDJILAorCisJU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRCwKKwlTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUcsCisJU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0QySCwKKworCS8qCisJICogV2hpbGUgaW4gdGhpcyBzdGF0ZSB0aGUgSU8gcmVxdWVzdCBvYmplY3QgaXMgd2FpdGluZyBmb3IgdGhlIFRDCisJICogY29tcGxldGlvbiBub3RpZmljYXRpb24gZm9yIHRoZSBIMkQgUmVnaXN0ZXIgRklTCisJICovCisJU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJELAorCisJLyoKKwkgKiBXaGlsZSBpbiB0aGlzIHN0YXRlIHRoZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvciBlaXRoZXIgYQorCSAqIFBJTyBTZXR1cCBGSVMgb3IgYSBEMkggcmVnaXN0ZXIgRklTLiAgVGhlIHR5cGUgb2YgZnJhbWUgcmVjZWl2ZWQgaXMKKwkgKiBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mIHRoZSBwcmlvciBmcmFtZSBhbmQgbGluZSBjb25kaXRpb25zLgorCSAqLworCVNDSV9SRVFfU1RQX1BJT19XQUlUX0ZSQU1FLAorCisJLyoKKwkgKiBXaGlsZSBpbiB0aGlzIHN0YXRlIHRoZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvciBhIERBVEEKKwkgKiBmcmFtZSBmcm9tIHRoZSBkZXZpY2UuCisJICovCisJU0NJX1JFUV9TVFBfUElPX0RBVEFfSU4sCisKKwkvKgorCSAqIFdoaWxlIGluIHRoaXMgc3RhdGUgdGhlIElPIHJlcXVlc3Qgb2JqZWN0IGlzIHdhaXRpbmcgdG8gdHJhbnNtaXQKKwkgKiB0aGUgbmV4dCBkYXRhIGZyYW1lIHRvIHRoZSBkZXZpY2UuCisJICovCisJU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VULAorCisJLyoKKwkgKiBUaGUgQVdBSVRfVENfQ09NUExFVElPTiBzdWItc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXJ0ZWQgcmF3CisJICogdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgaXMgd2FpdGluZyBmb3IgdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGUKKwkgKiBpbml0aWFsIGZyYW1lIChpLmUuIGNvbW1hbmQsIHRhc2ssIGV0Yy4pLgorCSAqLworCVNDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVAsCisKKwkvKgorCSAqIFRoaXMgc3ViLXN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBzdGFydGVkIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0CisJICogaXMgd2FpdGluZyBmb3IgdGhlIHJlY2VwdGlvbiBvZiBhbiB1bnNvbGljaXRlZCBmcmFtZQorCSAqIChpLmUuIHJlc3BvbnNlIElVKS4KKwkgKi8KKwlTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQLAorCisJLyoKKwkgKiBUaGlzIHN1Yi1zdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhcnRlZCB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdAorCSAqIGlzIHdhaXRpbmcgZm9yIHRoZSByZWNlcHRpb24gb2YgYW4gdW5zb2xpY2l0ZWQgZnJhbWUKKwkgKiAoaS5lLiByZXNwb25zZSBJVSkuCisJICovCisJU0NJX1JFUV9TTVBfV0FJVF9SRVNQLAorCisJLyoKKwkgKiBUaGUgQVdBSVRfVENfQ09NUExFVElPTiBzdWItc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXJ0ZWQgU01QCisJICogcmVxdWVzdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBpbml0aWFsIGZyYW1lCisJICogKGkuZS4gY29tbWFuZCwgdGFzaywgZXRjLikuCisJICovCisJU0NJX1JFUV9TTVBfV0FJVF9UQ19DT01QLAorCisJLyoKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUQVJURUQgc3RhdGUuIFRoaXMgc3RhdGUgaXMgZW50ZXJlZAorCSAqIGZyb20gdGhlIEFCT1JUSU5HIHN0YXRlLgorCSAqLworCVNDSV9SRVFfQ09NUExFVEVELAorCisJLyoKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nCisJICogdGVybWluYXRlZC9hYm9ydGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBDT05TVFJVQ1RFRCBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lfUkVRX0FCT1JUSU5HLAorCisJLyoKKwkgKiBTaW1wbHkgdGhlIGZpbmFsIHN0YXRlIGZvciB0aGUgYmFzZSByZXF1ZXN0IHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX1JFUV9GSU5BTCwKK307CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVxdWVzdF9zdGFydChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfaW9fcmVxdWVzdF90ZXJtaW5hdGUoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CitlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X2V2ZW50X2hhbmRsZXIoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkgIHUzMiBldmVudF9jb2RlKTsKK2VudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgdTMyIGZyYW1lX2luZGV4KTsKK2VudW0gc2NpX3N0YXR1cworc2NpX3Rhc2tfcmVxdWVzdF90ZXJtaW5hdGUoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CitleHRlcm4gZW51bSBzY2lfc3RhdHVzCitzY2lfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2V4dGVybiBlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X3RjX2NvbXBsZXRpb24oc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwgdTMyIGNvZGUpOworCisvKiBYWFggb3BlbiBjb2RlIGluIGNhbGxlciAqLworc3RhdGljIGlubGluZSBkbWFfYWRkcl90CitzY2lfaW9fcmVxdWVzdF9nZXRfZG1hX2FkZHIoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwgdm9pZCAqdmlydF9hZGRyKQoreworCisJY2hhciAqcmVxdWVzdGVkX2FkZHIgPSAoY2hhciAqKXZpcnRfYWRkcjsKKwljaGFyICpiYXNlX2FkZHIgPSAoY2hhciAqKWlyZXE7CisKKwlCVUdfT04ocmVxdWVzdGVkX2FkZHIgPCBiYXNlX2FkZHIpOworCUJVR19PTigocmVxdWVzdGVkX2FkZHIgLSBiYXNlX2FkZHIpID49IHNpemVvZigqaXJlcSkpOworCisJcmV0dXJuIGlyZXEtPnJlcXVlc3RfZGFkZHIgKyAocmVxdWVzdGVkX2FkZHIgLSBiYXNlX2FkZHIpOworfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoKSAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0CisgKiAgICBvYmplY3QuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBpc2NpX3JlcXVlc3Qgb2JqZWN0CisgKiBAc3RhdHVzOiBUaGlzIFBhcmFtZXRlciBpcyB0aGUgbmV3IHN0YXR1cyBvZiB0aGUgb2JqZWN0CisgKgorICovCitzdGF0aWMgaW5saW5lIGVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cworaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QsCisJCQkgIGVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBzdGF0dXMpCit7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIG9sZF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaXNjaV9yZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3JlcXVlc3QgPSAlcCwgc3RhdGUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywKKwkJaXNjaV9yZXF1ZXN0LAorCQlzdGF0dXMpOworCisJQlVHX09OKGlzY2lfcmVxdWVzdCA9PSBOVUxMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwlvbGRfc3RhdGUgPSBpc2NpX3JlcXVlc3QtPnN0YXR1czsKKwlpc2NpX3JlcXVlc3QtPnN0YXR1cyA9IHN0YXR1czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBvbGRfc3RhdGU7Cit9CisKKy8qKgorICogaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX25ld3N0YXRlKCkgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0YXR1cyBvZgorICogICAgdGhlIHJlcXVlc3Qgb2JqZWN0LgorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgaXNjaV9yZXF1ZXN0IG9iamVjdAorICogQHN0YXR1czogVGhpcyBQYXJhbWV0ZXIgaXMgdGhlIG5ldyBzdGF0dXMgb2YgdGhlIG9iamVjdAorICoKKyAqIHN0YXRlIHByZXZpb3VzIHRvIGFueSBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzCitpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fbmV3c3RhdGUoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV9yZXF1ZXN0LAorCQkJCQlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbl9wdHIsCisJCQkJCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBuZXdzdGF0ZSkKK3sKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgb2xkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9yZXF1ZXN0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlvbGRfc3RhdGUgPSBpc2NpX3JlcXVlc3QtPnN0YXR1czsKKworCWlmIChvbGRfc3RhdGUgPT0gc3RhcnRlZCB8fCBvbGRfc3RhdGUgPT0gYWJvcnRpbmcpIHsKKwkJQlVHX09OKGlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uICE9IE5VTEwpOworCisJCWlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gY29tcGxldGlvbl9wdHI7CisJCWlzY2lfcmVxdWVzdC0+c3RhdHVzID0gbmV3c3RhdGU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9yZXF1ZXN0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZpc2NpX3JlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcmVxdWVzdCA9ICVwLCBvbGRfc3RhdGUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywKKwkJaXNjaV9yZXF1ZXN0LAorCQlvbGRfc3RhdGUpOworCisJcmV0dXJuIG9sZF9zdGF0ZTsKK30KKworLyoqCisgKiBpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fYWJvcnRlZCgpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0dXMgb2YKKyAqICAgIHRoZSByZXF1ZXN0IG9iamVjdC4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIGlzY2lfcmVxdWVzdCBvYmplY3QKKyAqIEBjb21wbGV0aW9uX3B0cjogVGhpcyBwYXJhbWV0ZXIgaXMgc2F2ZWQgYXMgdGhlIGtlcm5lbCBjb21wbGV0aW9uIHN0cnVjdHVyZQorICogICAgc2lnbmFsbGVkIHdoZW4gdGhlIG9sZCByZXF1ZXN0IGNvbXBsZXRlcy4KKyAqCisgKiBzdGF0ZSBwcmV2aW91cyB0byBhbnkgY2hhbmdlLgorICovCitzdGF0aWMgaW5saW5lIGVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cworaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX2Fib3J0ZWQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV9yZXF1ZXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbl9wdHIpCit7CisJcmV0dXJuIGlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhcnRlZF90b19uZXdzdGF0ZShpc2NpX3JlcXVlc3QsCisJCQkJCQkgICAgICAgY29tcGxldGlvbl9wdHIsCisJCQkJCQkgICAgICAgYWJvcnRlZCk7Cit9CisKKyNkZWZpbmUgaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcSkgKChyZXEpLT50dHlwZV9wdHIuaW9fdGFza19wdHIpCisKKyNkZWZpbmUgaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYocmVxKSAoKHJlcSktPnR0eXBlX3B0ci50bWZfdGFza19wdHIpCisKK3N0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfdG1mX3JlcXVlc3RfZnJvbV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV90bWYgKmlzY2lfdG1mLAorCQkJCQkgICAgICAgdTE2IHRhZyk7CitpbnQgaXNjaV9yZXF1ZXN0X2V4ZWN1dGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkgc3RydWN0IHNhc190YXNrICp0YXNrLCB1MTYgdGFnKTsKK3ZvaWQgaXNjaV90ZXJtaW5hdGVfcGVuZGluZ19yZXF1ZXN0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOworZW51bSBzY2lfc3RhdHVzCitzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJICAgIHUxNiBpb190YWcsCisJCQkgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CitlbnVtIHNjaV9zdGF0dXMKK3NjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NzcChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cworc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK3ZvaWQgc2NpX3NtcF9yZXF1ZXN0X2NvcHlfcmVzcG9uc2Uoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzY2lfdGFza19pc19uY3FfcmVjb3Zlcnkoc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCXJldHVybiAoc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSAmJgorCQl0YXNrLT5hdGFfdGFzay5maXMuY29tbWFuZCA9PSBBVEFfQ01EX1JFQURfTE9HX0VYVCAmJgorCQl0YXNrLT5hdGFfdGFzay5maXMubGJhbCA9PSBBVEFfTE9HX1NBVEFfTkNRKTsKKworfQorCisjZW5kaWYgLyogIWRlZmluZWQoX0lTQ0lfUkVRVUVTVF9IXykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Nhcy5oIGIvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyYjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Nhcy5oCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TQ0lfU0FTX0hfCisjZGVmaW5lIF9TQ0lfU0FTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworLyoKKyAqIFNBVEEgRklTIFR5cGVzIFRoZXNlIGNvbnN0YW50cyBkZXBpY3QgdGhlIHZhcmlvdXMgU0FUQSBGSVMgdHlwZXMgZGV2aW5lZCBpbgorICogdGhlIHNlcmlhbCBBVEEgc3BlY2lmaWNhdGlvbi4KKyAqIFhYWDogVGhpcyBuZWVkcyB0byBnbyBpbnRvIDxzY3NpL3Nhcy5oPgorICovCisjZGVmaW5lIEZJU19SRUdIMkQgICAgICAgICAgMHgyNworI2RlZmluZSBGSVNfUkVHRDJIICAgICAgICAgIDB4MzQKKyNkZWZpbmUgRklTX1NFVERFVkJJVFMgICAgICAweEExCisjZGVmaW5lIEZJU19ETUFfQUNUSVZBVEUgICAgMHgzOQorI2RlZmluZSBGSVNfRE1BX1NFVFVQICAgICAgIDB4NDEKKyNkZWZpbmUgRklTX0JJU1RfQUNUSVZBVEUgICAweDU4CisjZGVmaW5lIEZJU19QSU9fU0VUVVAgICAgICAgMHg1RgorI2RlZmluZSBGSVNfREFUQSAgICAgICAgICAgIDB4NDYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTU1BfUkVTUF9JVV9NQVhfU0laRQkyODAKKworLyoKKyAqIGNvbnRlbnRzIG9mIHRoZSBTU1AgQ09NTUFORCBJTkZPUk1BVElPTiBVTklULgorICogRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlc2UgaW5kaXZpZHVhbCBmaWVsZHMgcGxlYXNlCisgKiByZWZlcmVuY2UgdGhlIFNBUyBzcGVjaWZpY2F0aW9uIFNTUCB0cmFuc3BvcnQgbGF5ZXIgc2VjdGlvbi4KKyAqIFhYWDogVGhpcyBuZWVkcyB0byBnbyBpbnRvIDxzY3NpL3Nhcy5oPgorICovCitzdHJ1Y3Qgc3NwX2NtZF9pdSB7CisJdTggTFVOWzhdOworCXU4IGFkZF9jZGJfbGVuOjY7CisJdTggX3JfYToyOworCXU4IF9yX2I7CisJdTggZW5fZmJ1cnN0OjE7CisJdTggdGFza19wcmlvOjQ7CisJdTggdGFza19hdHRyOjM7CisJdTggX3JfYzsKKworCXU4IGNkYlsxNl07Cit9ICBfX3BhY2tlZDsKKworLyoKKyAqIGNvbnRlbnRzIG9mIHRoZSBTU1AgVEFTSyBJTkZPUk1BVElPTiBVTklULgorICogRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlc2UgaW5kaXZpZHVhbCBmaWVsZHMgcGxlYXNlCisgKiByZWZlcmVuY2UgdGhlIFNBUyBzcGVjaWZpY2F0aW9uIFNTUCB0cmFuc3BvcnQgbGF5ZXIgc2VjdGlvbi4KKyAqIFhYWDogVGhpcyBuZWVkcyB0byBnbyBpbnRvIDxzY3NpL3Nhcy5oPgorICovCitzdHJ1Y3Qgc3NwX3Rhc2tfaXUgeworCXU4IExVTls4XTsKKwl1OCBfcl9hOworCXU4IHRhc2tfZnVuYzsKKwl1OCBfcl9iWzRdOworCXUxNiB0YXNrX3RhZzsKKwl1OCBfcl9jWzEyXTsKK30gIF9fcGFja2VkOworCisKKy8qCisgKiBzdHJ1Y3Qgc21wX3JlcV9waHlfaWQgLSBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZW50cyBvZgorICogICAgYW4gU01QIFJlcXVlc3QgdGhhdCBpcyBjb21wcmlzZWQgb2YgdGhlIHN0cnVjdCBzbXBfcmVxdWVzdF9oZWFkZXIgYW5kIGEKKyAqICAgIHBoeSBpZGVudGlmaWVyLgorICogICAgRXhhbXBsZXM6IFNNUF9SRVFVRVNUX0RJU0NPVkVSLCBTTVBfUkVRVUVTVF9SRVBPUlRfUEhZX1NBVEEuCisgKgorICogRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlc2UgaW5kaXZpZHVhbCBmaWVsZHMgcGxlYXNlIHJlZmVyZW5jZQorICogdGhlIFNBUyBzcGVjaWZpY2F0aW9uLgorICovCitzdHJ1Y3Qgc21wX3JlcV9waHlfaWQgeworCXU4IF9yX2FbNF07CQkvKiBieXRlcyA0LTcgKi8KKworCXU4IGlnbl96b25lX2dycDoxOwkvKiBieXRlIDggKi8KKwl1OCBfcl9iOjc7CisKKwl1OCBwaHlfaWQ7CQkvKiBieXRlIDkgKi8KKwl1OCBfcl9jOwkJLyogYnl0ZSAxMCAqLworCXU4IF9yX2Q7CQkvKiBieXRlIDExICovCit9ICBfX3BhY2tlZDsKKworLyoKKyAqIHN0cnVjdCBzbXBfcmVxX2NvbmZpZ19yb3V0ZV9pbmZvIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUKKyAqICAgIGNvbnRlbnRzIG9mIGFuIFNNUCBDb25maWd1cmUgUm91dGUgSW5mb3JtYXRpb24gcmVxdWVzdC4KKyAqCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UgcmVmZXJlbmNlCisgKiB0aGUgU0FTIHNwZWNpZmljYXRpb24uCisgKi8KK3N0cnVjdCBzbXBfcmVxX2NvbmZfcnRpbmZvIHsKKwl1MTYgZXhwX2NoYW5nZV9jbnQ7CQkvKiBieXRlcyA0LTUgKi8KKwl1OCBleHBfcnRfaWR4X2hpOwkJLyogYnl0ZSA2ICovCisJdTggZXhwX3J0X2lkeDsJCQkvKiBieXRlIDcgKi8KKworCXU4IF9yX2E7CQkJLyogYnl0ZSA4ICovCisJdTggcGh5X2lkOwkJCS8qIGJ5dGUgOSAqLworCXUxNiBfcl9iOwkJCS8qIGJ5dGVzIDEwLTExICovCisKKwl1OCBfcl9jOjc7CQkJLyogYnl0ZSAxMiAqLworCXU4IGRpc19ydF9lbnRyeToxOworCXU4IF9yX2RbM107CQkJLyogYnl0ZXMgMTMtMTUgKi8KKworCXU4IHJ0X3Nhc19hZGRyWzhdOwkJLyogYnl0ZXMgMTYtMjMgKi8KKwl1OCBfcl9lWzE2XTsJCQkvKiBieXRlcyAyNC0zOSAqLworfSAgX19wYWNrZWQ7CisKKy8qCisgKiBzdHJ1Y3Qgc21wX3JlcV9waHljbnRsIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGVudHMgb2YgYW4KKyAqICAgIFNNUCBQaHkgQ29udHJvbGxlciByZXF1ZXN0LgorICoKKyAqIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZXNlIGluZGl2aWR1YWwgZmllbGRzIHBsZWFzZSByZWZlcmVuY2UKKyAqIHRoZSBTQVMgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RydWN0IHNtcF9yZXFfcGh5Y250bCB7CisJdTE2IGV4cF9jaGFuZ2VfY250OwkJLyogYnl0ZSA0LTUgKi8KKworCXU4IF9yX2FbM107CQkJLyogYnl0ZXMgNi04ICovCisKKwl1OCBwaHlfaWQ7CQkJLyogYnl0ZSA5ICovCisJdTggcGh5X29wOwkJCS8qIGJ5dGUgMTAgKi8KKworCXU4IHVwZF9wYXRod2F5OjE7CQkvKiBieXRlIDExICovCisJdTggX3JfYjo3OworCisJdTggX3JfY1sxMl07CQkJLyogYnl0ZSAxMi0yMyAqLworCisJdTggYXR0X2Rldl9uYW1lWzhdOyAgICAgICAgICAgICAvKiBieXRlIDI0LTMxICovCisKKwl1OCBfcl9kOjQ7CQkJLyogYnl0ZSAzMiAqLworCXU4IG1pbl9saW5rcmF0ZTo0OworCisJdTggX3JfZTo0OwkJCS8qIGJ5dGUgMzMgKi8KKwl1OCBtYXhfbGlua3JhdGU6NDsKKworCXU4IF9yX2ZbMl07CQkJLyogYnl0ZSAzNC0zNSAqLworCisJdTggcGF0aHdheTo0OwkJCS8qIGJ5dGUgMzYgKi8KKwl1OCBfcl9nOjQ7CisKKwl1OCBfcl9oWzNdOwkJCS8qIGJ5dGVzIDM3LTM5ICovCit9ICBfX3BhY2tlZDsKKworLyoKKyAqIHN0cnVjdCBzbXBfcmVxIC0gVGhpcyBzdHJ1Y3R1cmUgc2ltcGx5IHVuaW9uaXplcyB0aGUgZXhpc3RpbmcgcmVxdWVzdAorICogICAgc3RydWN0dXJlcyBpbnRvIGEgY29tbW9uIHJlcXVlc3QgdHlwZS4KKyAqCisgKiBYWFg6IFRoaXMgZGF0YSBzdHJ1Y3R1cmUgbWF5IG5lZWQgdG8gZ28gdG8gc2NzaS9zYXMuaAorICovCitzdHJ1Y3Qgc21wX3JlcSB7CisJdTggdHlwZTsJCS8qIGJ5dGUgMCAqLworCXU4IGZ1bmM7CQkvKiBieXRlIDEgKi8KKwl1OCBhbGxvY19yZXNwX2xlbjsJLyogYnl0ZSAyICovCisJdTggcmVxX2xlbjsJCS8qIGJ5dGUgMyAqLworCXU4IHJlcV9kYXRhWzBdOworfSAgX19wYWNrZWQ7CisKKyNkZWZpbmUgU01QX1JFU1BfSERSX1NaCTQKKworLyoKKyAqIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgLSBUaGlzIHN0cnVjdHVyZSBkZXBpY3RzIGhvdyBhIFNBUyBhZGRyZXNzIGlzCisgKiAgICByZXByZXNlbnRlZCBieSBTQ0kuCisgKiBYWFggY29udmVydCB0aGlzIHRvIHU4IFtTQVNfQUREUl9TSVpFXSBsaWtlIHRoZSByZXN0IG9mIGxpYnNhcworICoKKyAqLworc3RydWN0IHNjaV9zYXNfYWRkcmVzcyB7CisJdTMyIGhpZ2g7CisJdTMyIGxvdzsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9jb21wbGV0aW9uX2NvZGVzLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfY29tcGxldGlvbl9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjMyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfY29tcGxldGlvbl9jb2Rlcy5oCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TQ1VfQ09NUExFVElPTl9DT0RFU19IRUFERVJfCisjZGVmaW5lIF9TQ1VfQ09NUExFVElPTl9DT0RFU19IRUFERVJfCisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb25zdGFudHMgYW5kIG1hY3JvcyBmb3IgdGhlIFNDVSBoYXJkd2FyZSBjb21wbGV0aW9uCisgKiAgICBjb2Rlcy4KKyAqCisgKgorICovCisKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVFlQRV9TSElGVCAgICAgIDI4CisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfTUFTSyAgICAgICAweDcwMDAwMDAwCisKKy8qKgorICogU0NVX0NPTVBMRVRJT05fVFlQRSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgYW4gU0NVIGNvbXBsZXRpb24gdHlwZQorICovCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEUodHlwZSkgXAorCSgodTMyKSh0eXBlKSA8PCBTQ1VfQ09NUExFVElPTl9UWVBFX1NISUZUKQorCisvKioKKyAqIFNDVV9DT01QTEVUSU9OX1RZUEUoKSAtCisgKgorICogVGhlc2UgbWFjcm9zIGNvbnRhaW4gdGhlIFNDVSBjb21wbGV0aW9uIHR5cGVzIFNDVV9DT01QTEVUSU9OX1RZUEUKKyAqLworI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX1RBU0sgICAgICAgU0NVX0NPTVBMRVRJT05fVFlQRSgwKQorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX1NETUEgICAgICAgU0NVX0NPTVBMRVRJT05fVFlQRSgxKQorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX1VGSSAgICAgICAgU0NVX0NPTVBMRVRJT05fVFlQRSgyKQorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX0VWRU5UICAgICAgU0NVX0NPTVBMRVRJT05fVFlQRSgzKQorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX05PVElGWSAgICAgU0NVX0NPTVBMRVRJT05fVFlQRSg0KQorCisvKioKKyAqCisgKgorICogVGhlc2UgY29uc3RhbnRzIHByb3ZpZGUgdGhlIHNoaWZ0IGFuZCBtYXNrIHZhbHVlcyBmb3IgdGhlIHZhcmlvdXMgcGFydHMgb2YKKyAqIGFuIFNDVSBjb21wbGV0aW9uIGNvZGUuCisgKi8KKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fU1RBVFVTX01BU0sgICAgICAgMHgwRkZDMDAwMAorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfTUFTSyAgICAweDBGQzAwMDAwCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCAgIDIyCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1NETUFfU1RBVFVTX01BU0sgIDB4MDAzQzAwMDAKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fUEVHX01BU0sgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9QT1JUX01BU0sgICAgICAgICAweDAwMDA3MDAwCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1BFX01BU0sgICAgICAgICAgIFNDVV9DT01QTEVUSU9OX1BPUlRfTUFTSworI2RlZmluZSBTQ1VfQ09NUExFVElPTl9QRV9TSElGVCAgICAgICAgICAxMgorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9JTkRFWF9NQVNLICAgICAgICAweDAwMDAwRkZGCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX1RZUEUoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBTQ1UgY29tcGxldGlvbiB0eXBlLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9UWVBFKGNvbXBsZXRpb25fY29kZSkgXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1RZUEVfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fU1RBVFVTKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgU0NVIGNvbXBsZXRpb24gc3RhdHVzLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSBcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fU1RBVFVTX01BU0spCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUygpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIHRyYW5zcG9ydCBsYXllciBjb21wbGV0aW9uIHN0YXR1cy4KKyAqLworI2RlZmluZSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19NQVNLKQorCisvKioKKyAqIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gdGFrZXMgYSBjb21wbGV0aW9uIGNvZGUgYW5kIHBlcmZvcm1zIHRoZSBzaGlmdCBhbmQgbWFzaworICogb3BlcmF0aW9ucyB0byB0dXJuIGl0IGludG8gYSBjb21wbGV0aW9uIGNvZGUgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8gYQorICogU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUy4KKyAqLworI2RlZmluZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpIFwKKwkoKHUzMikoY29tcGxldGlvbl9jb2RlKSA8PCBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQpCisKKy8qKgorICogU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUygpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHRha2VzIGEgU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyBhbmQgbm9ybWFsaXplcyBpdCBmb3IgYQorICogcmV0dXJuIGNvZGUuCisgKi8KKyNkZWZpbmUgU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpIFwKKwkoXAorCQkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfTUFTSykgXAorCQk+PiBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQgXAorCSkKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fU0RNQV9TVEFUVVMoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBTRE1BIGNvbXBsZXRpb24gc3RhdHVzLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9TRE1BX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpCVwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9TRE1BX1NUQVRVU19NQVNLKQorCisvKioKKyAqIFNDVV9HRVRfQ09NUExFVElPTl9QRUcoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBQcm90b2NvbCBFbmdpbmUgR3JvdXAgZnJvbSB0aGUgY29tcGxldGlvbiBjb2RlLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9QRUcoY29tcGxldGlvbl9jb2RlKQlcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fUEVHX01BU0spCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX1BPUlQoKSAtCisgKgorICogVGhpcyBtYWNybyByZXV0dXJucyB0aGUgbG9naWNhbCBwb3J0IGluZGV4IGZyb20gdGhlIGNvbXBsZXRpb24gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfR0VUX0NPTVBMRVRJT05fUE9SVChjb21wbGV0aW9uX2NvZGUpIFwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9QT1JUX01BU0spCisKKy8qKgorICogU0NVX0dFVF9QUk9UT0NPTF9FTkdJTkVfSU5ERVgoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBQRSBpbmRleCBmcm9tIHRoZSBjb21wbGV0aW9uIGNvZGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9QUk9UT0NPTF9FTkdJTkVfSU5ERVgoY29tcGxldGlvbl9jb2RlKSBcCisJKCgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1BFX01BU0spID4+IFNDVV9DT01QTEVUSU9OX1BFX1NISUZUKQorCisvKioKKyAqIFNDVV9HRVRfQ09NUExFVElPTl9JTkRFWCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb21wbGV0aW9uIHdoaWNoIGlzIGVpdGhlciBhIFRDaSBvciBhbgorICogUk5pIGRlcGVuZGluZyBvbiB0aGUgY29tcGxldGlvbiB0eXBlLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9JTkRFWChjb21wbGV0aW9uX2NvZGUpIFwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9JTkRFWF9NQVNLKQorCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9NQVNLICAgICAweDBGRkYwMDAwCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9TSElGVCAgICAxNgorCisvKioKKyAqIFNDVV9HRVRfRlJBTUVfSU5ERVgoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIGEgbm9ybWFsaXplZCBmcmFtZSBpbmRleCBmcm9tIGFuIHVuc29saWNpdGVkIGZyYW1lCisgKiBjb21wbGV0aW9uLgorICovCisjZGVmaW5lIFNDVV9HRVRfRlJBTUVfSU5ERVgoY29tcGxldGlvbl9jb2RlKSBcCisJKFwKKwkJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX01BU0spIFwKKwkJPj4gU0NVX1VOU09MSUNJVEVEX0ZSQU1FX1NISUZUIFwKKwkpCisKKyNkZWZpbmUgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX0VSUk9SX01BU0sgIDB4MDAwMDgwMDAKKworLyoqCisgKiBTQ1VfR0VUX0ZSQU1FX0VSUk9SKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyBhIHplcm8gKDApIHZhbHVlIGlmIHRoZXJlIGlzIG5vIGZyYW1lIGVycm9yIG90aGVyd2lzZSBpdAorICogcmV0dXJucyBub24temVybyAoITApLgorICovCisjZGVmaW5lIFNDVV9HRVRfRlJBTUVfRVJST1IoY29tcGxldGlvbl9jb2RlKSBcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX0VSUk9SX01BU0spCisKKy8qKgorICoKKyAqCisgKiBUaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IG5vcm1hbGl6ZWQgY29tcGxldGlvbiBjb2RlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQKKyAqIDE4IGJpdHMgdG8gbWF0Y2ggaXQgd2l0aCB0aGUgaGFyZHdhcmUgY29tcGxldGlvbiBjb2RlLiBJbiBhIDE2LWJpdCBjb21waWxlciwKKyAqIGltbWVkaWF0ZSBjb25zdGFudHMgYXJlIDE2LWJpdCB2YWx1ZXMgKHRoZSBzaXplIG9mIGFuIGludCkuIElmIHdlIHNoaWZ0CisgKiB0aG9zZSBieSAxOCBiaXRzLCB3ZSBjb21wbGV0ZWx5IGxvc2UgdGhlIHZhbHVlLiBUbyBlbnN1cmUgdGhlIHZhbHVlIGlzIGEKKyAqIDMyLWJpdCB2YWx1ZSBsaWtlIHdlIHdhbnQsIGVhY2ggaW1tZWRpYXRlIHZhbHVlIG11c3QgYmUgY2FzdCB0byBhIHUzMi4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19ET05FX0dPT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgwMCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9DUkNfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE0KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0dFTl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9OQUtfQ01EX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTYpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfQ01EX0xMX1JfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE2KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0xMX1JfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9BQ0tfTkFLX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTcpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfUEVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE4KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0xMX1NZX1RFUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9OQUtfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTkpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfTEZfVEVSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFBKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0RBVEFfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxQSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9DTF9URVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUIpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfQUJPUlRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFCKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NFUV9JTlZfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxQykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9VTkVYUF9YUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUMpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfSU5WX0ZJU19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFEKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1hSX0lVX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxRCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9JTlZfRklTX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUUpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfWFJfV0RfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFFKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NETUFfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxRikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9PRkZTRVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjApCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTUFYX1BMRF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDIxKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0VYQ0VTU19EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyMikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MRl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjMpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI0KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1VORVhQX1JFU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyNCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9FQVJMWV9SRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjUpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU01QX1JFU1BfVE9fRVJSICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI2KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0RNQVNFVFVQX0RJUkVSUiAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyNykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9TTVBfVUZJX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjcpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfWEZFUkNOVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI4KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NNUF9GUk1fVFlQRV9FUlIgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyOCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9TTVBfTExfUlhfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjkpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfUkVTUF9MRU5fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDJBKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1VORVhQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyQikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9PUEVOX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MkMpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVU5FWFBfU0RCRklTICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDJEKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1JFR19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyRSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9TREJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MkYpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVEFTS19BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDMwKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0NNRF9TRE1BX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgKChVMzIpMHgzMikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9DTURfTExfQUJPUlRfRVJSICAgICAgICAgICAgICAgICAgICAgICgoVTMyKTB4MzMpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1dST05HX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAoKHUzMikweDM0KQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzEgICAgICAgICAgICAgKCh1MzIpMHgzNSkKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8yICAgICAgICAgICAgICgodTMyKTB4MzYpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMyAgICAgICAgICAgICAoKHUzMikweDM3KQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9CQURfREVTVElOQVRJT04gICAgICAgICAgICAgICAgKCh1MzIpMHgzOCkKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfWk9ORV9WSU9MQVRJT04gICAgICAgICAgICAgICAgICgodTMyKTB4MzkpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVklJVF9FTlRSWV9OViAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDNBKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0lJVF9FTlRSWV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgzQikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9STkNOVl9PVVRCT1VORCAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4M0MpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1NUUF9SRVNPVVJDRVNfQlVTWSAgICAgICAgICAgICAoKHUzMikweDNEKQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEICAgICAgICAgKCh1MzIpMHgzRSkKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfQ09OTkVDVElPTl9SQVRFX05PVF9TVVBQT1JURUQgICgodTMyKTB4M0YpCisKKyNlbmRpZiAvKiBfU0NVX0NPTVBMRVRJT05fQ09ERVNfSEVBREVSXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2N1X2V2ZW50X2NvZGVzLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfZXZlbnRfY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmE5NDVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvc2N1X2V2ZW50X2NvZGVzLmgKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19TQ1VfRVZFTlRfQ09ERVNfSEVBREVSX18KKyNkZWZpbmUgX19TQ1VfRVZFTlRfQ09ERVNfSEVBREVSX18KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnN0YW50cyBhbmQgbWFjcm9zIGZvciB0aGUgU0NVIGV2ZW50IGNvZGVzLgorICoKKyAqCisgKi8KKworI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9DT0RFX1NISUZUICAgICAgMjQKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfQ09ERV9NQVNLICAgICAgIDB4MEYwMDAwMDAKKworI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9TSElGVCAgMTgKKyNkZWZpbmUgU0NVX0VWRU5UX1NQRUNJRklDX0NPREVfTUFTSyAgIDB4MDBGQzAwMDAKKworI2RlZmluZSBTQ1VfRVZFTlRfQ09ERV9NQVNLIFwKKwkoU0NVX0VWRU5UX1RZUEVfQ09ERV9NQVNLIHwgU0NVX0VWRU5UX1NQRUNJRklDX0NPREVfTUFTSykKKworLyoqCisgKiBTQ1VfRVZFTlRfVFlQRSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgYW4gU0NVIGV2ZW50IHR5cGUgZnJvbSB0aGUgdHlwZSB2YWx1ZS4KKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfVFlQRSh0eXBlKSBcCisJKCh1MzIpKHR5cGUpIDw8IFNDVV9FVkVOVF9UWVBFX0NPREVfU0hJRlQpCisKKy8qKgorICogU0NVX0VWRU5UX1NQRUNJRklDKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gY29uc3RydWN0cyBhbiBTQ1UgZXZlbnQgc3BlY2lmaWVyIGZyb20gdGhlIGNvZGUgdmFsdWUuCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1NQRUNJRklDKGNvZGUpIFwKKwkoKHUzMikoY29kZSkgPDwgU0NVX0VWRU5UX1NQRUNJRklDX0NPREVfU0hJRlQpCisKKy8qKgorICogU0NVX0VWRU5UX01FU1NBR0UoKSAtCisgKgorICogVGhpcyBtYWNybyBjb25zdHJ1Y3RzIGEgY29tYmluZXMgYW4gU0NVIGV2ZW50IHR5cGUgYW5kIFNDVSBldmVudCBzcGVjaWZpZXIKKyAqIGZyb20gdGhlIHR5cGUgYW5kIGNvZGUgdmFsdWVzLgorICovCisjZGVmaW5lIFNDVV9FVkVOVF9NRVNTQUdFKHR5cGUsIGNvZGUpIFwKKwkoKHR5cGUpIHwgU0NVX0VWRU5UX1NQRUNJRklDKGNvZGUpKQorCisvKioKKyAqIFNDVV9FVkVOVF9UWVBFKCkgLQorICoKKyAqIFNDVV9FVkVOVF9UWVBFUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1NNVV9DT01NQU5EX0VSUk9SICBTQ1VfRVZFTlRfVFlQRSgweDA4KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9TTVVfUENRX0VSUk9SICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwOSkKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfU01VX0VSUk9SICAgICAgICAgIFNDVV9FVkVOVF9UWVBFKDB4MDApCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1RSQU5TUE9SVF9FUlJPUiAgICBTQ1VfRVZFTlRfVFlQRSgweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFICAgU0NVX0VWRU5UX1RZUEUoMHgwMikKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCAgICAgICAgIFNDVV9FVkVOVF9UWVBFKDB4MDMpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX0ZBVEFMX01FTU9SWV9FUlJPUiBTQ1VfRVZFTlRfVFlQRSgweDBGKQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWCAgICAgU0NVX0VWRU5UX1RZUEUoMHgwNCkKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlggIFNDVV9FVkVOVF9UWVBFKDB4MDUpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQyAgICAgICBTQ1VfRVZFTlRfVFlQRSgweDA2KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9QVFhfU0NIRURVTEVfRVZFTlQgU0NVX0VWRU5UX1RZUEUoMHgwNykKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfRVJSX0NOVF9FVkVOVCAgICAgIFNDVV9FVkVOVF9UWVBFKDB4MEEpCisKKy8qKgorICoKKyAqCisgKiBTQ1VfRVZFTlRfU1BFQ0lGSUVSUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJRVJfRFJJVkVSX1NVU1BFTkQgMHgyMAorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUVSX1JOQ19SRUxFQVNFICAgIDB4MDAKKworLyoqCisgKgorICoKKyAqIFNNVV9DT01NQU5EX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9JTlZBTElEX0NPTlRFWFRfQ09NTUFORCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfU01VX0NPTU1BTkRfRVJST1IsIDB4MDApCisKKy8qKgorICoKKyAqCisgKiBTTVVfUENRX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9VTkNPUlJFQ1RBQkxFX1BDUV9FUlJPUiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfU01VX1BDUV9FUlJPUiwgMHgwMCkKKworLyoqCisgKgorICoKKyAqIFNNVV9FVkVOVFMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfVU5DT1JSRUNUQUJMRV9SRUdJU1RFUl9XUklURSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfU01VX0VSUk9SLCAweDAyKQorI2RlZmluZSBTQ1VfRVZFTlRfVU5DT1JSRUNUQUJMRV9SRUdJU1RFUl9SRUFEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IsIDB4MDMpCisjZGVmaW5lIFNDVV9FVkVOVF9QQ0lFX0lOVEVSRkFDRV9FUlJPUiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfU01VX0VSUk9SLCAweDA0KQorI2RlZmluZSBTQ1VfRVZFTlRfRlVOQ1RJT05fTEVWRUxfUkVTRVQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1NNVV9FUlJPUiwgMHgwNSkKKworLyoqCisgKgorICoKKyAqIFRSQU5TUE9SVF9MRVZFTF9FUlJPUlMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfQUNLX05BS19USU1FT1VUX0VSUk9SCVwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9UUkFOU1BPUlRfRVJST1IsIDB4MDApCisKKy8qKgorICoKKyAqCisgKiBCUk9BRENBU1RfQ0hBTkdFX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfQ0hBTkdFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX1JFU0VSVkVEMCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfQlJPQURDQVNUX0NIQU5HRSwgMHgwMikKKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9SRVNFUlZFRDEgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDMpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfU0VTCVwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDA0KQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX0VYUEFOREVSIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDA1KQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX0FFTglcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfQlJPQURDQVNUX0NIQU5HRSwgMHgwNikKKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9SRVNFUlZFRDMgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDcpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfUkVTRVJWRUQ0IFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDA4KQorI2RlZmluZSBTQ1VfRVZFTlRfUEVfU1VTUEVOREVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDA5KQorCisvKioKKyAqCisgKgorICogT1NTUF9FVkVOVFMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfUE9SVF9TRUxFQ1RPUl9ERVRFQ1RFRCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1NFTlRfUE9SVF9TRUxFQ1RJT04gXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTEpCisjZGVmaW5lIFNDVV9FVkVOVF9IQVJEX1JFU0VUX1RSQU5TTUlUVEVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDEyKQorI2RlZmluZSBTQ1VfRVZFTlRfSEFSRF9SRVNFVF9SRUNFSVZFRCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxMykKKyNkZWZpbmUgU0NVX0VWRU5UX1JFQ0VJVkVEX0lERU5USUZZX1RJTUVPVVQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTUpCisjZGVmaW5lIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkUgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTYpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBX1NQSU5VUF9IT0xEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDE3KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTXzE1X1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxOCkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBU18xNSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxOSkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBU18zMF9TU0MgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUEpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfMzAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUIpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfNjBfU1NDIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDFDKQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTXzYwIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDFEKQorI2RlZmluZSBTQ1VfRVZFTlRfU0FUQV8xNV9TU0MgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUUpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzE1IFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDFGKQorI2RlZmluZSBTQ1VfRVZFTlRfU0FUQV8zMF9TU0MgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjApCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzMwIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDIxKQorI2RlZmluZSBTQ1VfRVZFTlRfU0FUQV82MF9TU0MgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjIpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzYwIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDIzKQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgyNCkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfUEhZX0RFVEVDVEVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDI1KQorCisvKioKKyAqCisgKgorICogRkFUQUxfSU5URVJOQUxfTUVNT1JZX0VSUk9SX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9UU0NfUk5TQ19VTkNPUlJFQ1RBQkxFX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9GQVRBTF9NRU1PUllfRVJST1IsICAweDAwKQorI2RlZmluZSBTQ1VfRVZFTlRfVENfUk5DX1VOQ09SUkVDVEFCTEVfRVJST1IgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0ZBVEFMX01FTU9SWV9FUlJPUiwgIDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9aUFRfVU5DT1JSRUNUQUJMRV9FUlJPUiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfRkFUQUxfTUVNT1JZX0VSUk9SLCAgMHgwMikKKworLyoqCisgKgorICoKKyAqIFJFTU9URV9OT0RFX1NVU1BFTkRfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1RMX1JOQ19TVVNQRU5EX1RYIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWCwgMHgwMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1RMX1JOQ19TVVNQRU5EX1RYX1JYIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWF9SWCwgMHgwMCkKKyNkZWZpbmUgU0NVX0VWRU5UX0RSSVZFUl9QT1NUX1JOQ19TVVNQRU5EX1RYIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWCwgMHgyMCkKKyNkZWZpbmUgU0NVX0VWRU5UX0RSSVZFUl9QT1NUX1JOQ19TVVNQRU5EX1RYX1JYCVwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWF9SWCwgMHgyMCkKKworLyoqCisgKgorICoKKyAqIFJFTU9URV9OT0RFX01JU0NfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1BPU1RfUkNOX1JFTEVBU0UgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQywgU0NVX0VWRU5UX1NQRUNJRklFUl9STkNfUkVMRUFTRSkKKyNkZWZpbmUgU0NVX0VWRU5UX1BPU1RfSVRfTkVYVVNfTE9TU19USU1FUl9FTkFCTEUgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQywgMHgwMSkKKyNkZWZpbmUgU0NVX0VWRU5UX1BPU1RfSVRfTkVYVVNfTE9TU19USU1FUl9ESVNBQkxFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0MsIDB4MDIpCisjZGVmaW5lIFNDVV9FVkVOVF9QT1NUX1JOQ19DT01QTEVURSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDLCAweDAzKQorI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9STkNfSU5WQUxJREFURV9DT01QTEVURSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDLCAweDA0KQorCisvKioKKyAqCisgKgorICogRVJST1JfQ09VTlRfRVZFTlQKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfUlhfQ1JFRElUX0JMT0NLRURfUkVDRUlWRUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0VSUl9DTlRfRVZFTlQsIDB4MDApCisjZGVmaW5lIFNDVV9FVkVOVF9UWF9ET05FX0NSRURJVF9USU1FT1VUIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9FUlJfQ05UX0VWRU5ULCAweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfUlhfRE9ORV9DUkVESVRfVElNRU9VVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfRVJSX0NOVF9FVkVOVCwgMHgwMikKKworLyoqCisgKiBzY3VfZ2V0X2V2ZW50X3R5cGUoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBTQ1UgZXZlbnQgdHlwZSBmcm9tIHRoZSBldmVudCBjb2RlLgorICovCisjZGVmaW5lIHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSBcCisJKChldmVudF9jb2RlKSAmIFNDVV9FVkVOVF9UWVBFX0NPREVfTUFTSykKKworLyoqCisgKiBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcigpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNDVSBldmVudCBzcGVjaWZpZXIgZnJvbSB0aGUgZXZlbnQgY29kZS4KKyAqLworI2RlZmluZSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKSBcCisJKChldmVudF9jb2RlKSAmIFNDVV9FVkVOVF9TUEVDSUZJQ19DT0RFX01BU0spCisKKy8qKgorICogc2N1X2dldF9ldmVudF9jb2RlKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgY29tYmluZWQgU0NVIGV2ZW50IHR5cGUgYW5kIFNDVSBldmVudCBzcGVjaWZpZXIgZnJvbQorICogdGhlIGV2ZW50IGNvZGUuCisgKi8KKyNkZWZpbmUgc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpIFwKKwkoKGV2ZW50X2NvZGUpICYgU0NVX0VWRU5UX0NPREVfTUFTSykKKworCisvKioKKyAqCisgKgorICogUFRTX1NDSEVEVUxFX0VWRU5UCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1NNUF9SRVNQT05TRV9OT19QRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5ULCAweDAwKQorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfU01QX1JFU1BPTlNFX05PX1BFIFwKKwlzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihTQ1VfRVZFTlRfU01QX1JFU1BPTlNFX05PX1BFKQorCisjZGVmaW5lIFNDVV9FVkVOVF9UQVNLX1RJTUVPVVQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1BUWF9TQ0hFRFVMRV9FVkVOVCwgMHgwMSkKKyNkZWZpbmUgU0NVX0VWRU5UX1NQRUNJRklDX1RBU0tfVElNRU9VVAlcCisJc2N1X2dldF9ldmVudF9zcGVjaWZpZXIoU0NVX0VWRU5UX1RBU0tfVElNRU9VVCkKKworI2RlZmluZSBTQ1VfRVZFTlRfSVRfTkVYVVNfVElNRU9VVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5ULCAweDAyKQorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfSVRfTkVYVVNfVElNRU9VVCBcCisJc2N1X2dldF9ldmVudF9zcGVjaWZpZXIoU0NVX0VWRU5UX0lUX05FWFVTX1RJTUVPVVQpCisKKworI2VuZGlmIC8qIF9fU0NVX0VWRU5UX0NPREVTX0hFQURFUl9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfcmVtb3RlX25vZGVfY29udGV4dC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc0NWFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQuaApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX1NDVV9SRU1PVEVfTk9ERV9DT05URVhUX0hFQURFUl9fCisjZGVmaW5lIF9fU0NVX1JFTU9URV9OT0RFX0NPTlRFWFRfSEVBREVSX18KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YXRucyB1c2VkIGJ5IHRoZSBTQ1UgaGFyZHdhcmUgdG8KKyAqICAgIGRlc2NyaWJlIGEgcmVtb3RlIG5vZGUgY29udGV4dC4KKyAqCisgKgorICovCisKKy8qKgorICogc3RydWN0IHNzcF9yZW1vdGVfbm9kZV9jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIFNDVSBoYXJkd2FyZQorICogICAgZGVmaW5pdGlvbiBmb3IgYW4gU1NQIHJlbW90ZSBub2RlLgorICoKKyAqCisgKi8KK3N0cnVjdCBzc3BfcmVtb3RlX25vZGVfY29udGV4dCB7CisJLyogV09SRCAwICovCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSByZW1vdGUgbm9kZSBpbmRleCBhc3NpZ25lZCBmb3IgdGhpcyByZW1vdGUgbm9kZS4gQWxsCisJICogcmVtb3RlIG5vZGVzIG11c3QgaGF2ZSBhIHVuaXF1ZSByZW1vdGUgbm9kZSBpbmRleC4gVGhlIHZhbHVlIG9mIHRoZSByZW1vdGUKKwkgKiBub2RlIGluZGV4IGNhbiBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZW1vdGUgbm9kZXMgcmVwb3J0ZWQgaW4KKwkgKiB0aGUgU0NVIGRldmljZSBjb250ZXh0IGNhcGFjaXR5IHJlZ2lzdGVyLgorCSAqLworCXUzMiByZW1vdGVfbm9kZV9pbmRleDoxMjsKKwl1MzIgcmVzZXJ2ZWQwXzE6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSBob3cgbWFueSBzaW11bHRhbmVvdXMgY29ubmVjdGlvbnMgdGhhdAorCSAqIHRoaXMgcmVtb3RlIG5vZGUgd2lsbCBzdXBwb3J0LgorCSAqLworCXUzMiByZW1vdGVfbm9kZV9wb3J0X3dpZHRoOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgd2hpY2ggbG9naWNhbCBwb3J0IHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMKKwkgKiByZW1vdGUgbm9kZS4KKwkgKi8KKwl1MzIgbG9naWNhbF9wb3J0X2luZGV4OjM7CisJdTMyIHJlc2VydmVkMF8yOjU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHdpbGwgZW5hYmxlIHRoZSBJX1QgbmV4dXMgbG9zcyB0aW1lciBmb3IgdGhpcyByZW1vdGUgbm9kZS4KKwkgKi8KKwl1MzIgbmV4dXNfbG9zc190aW1lcl9lbmFibGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGZvciBkcml2ZXIgZGVidWcgb25seSBhbmQgaXMgbm90IHVzZWQuCisJICovCisJdTMyIGNoZWNrX2JpdDoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB0cnVlIHdoZW4gdGhlIGhhcmR3YXJlIERNQXMgdGhlIHJlbW90ZSBub2RlCisJICogY29udGV4dCB0byB0aGUgaGFyZHdhcmUgU1JBTS4gIFdoZW4gdGhlIHJlbW90ZSBub2RlIGlzIGJlaW5nIGludmFsaWRhdGVkCisJICogdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBmYWxzZS4KKwkgKi8KKwl1MzIgaXNfdmFsaWQ6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gdHJ1ZS4KKwkgKi8KKwl1MzIgaXNfcmVtb3RlX25vZGVfY29udGV4dDoxOworCisJLyogV09SRCAxIC0gMiAqLworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbG93IHdvcmQgb2YgdGhlIHJlbW90ZSBkZXZpY2UgU0FTIEFkZHJlc3MKKwkgKi8KKwl1MzIgcmVtb3RlX3Nhc19hZGRyZXNzX2xvOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgaGlnaCB3b3JkIG9mIHRoZSByZW1vdGUgZGV2aWNlIFNBUyBBZGRyZXNzCisJICovCisJdTMyIHJlbW90ZV9zYXNfYWRkcmVzc19oaTsKKworCS8qIFdPUkQgMyAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgcmVwcmVuc2V0cyB0aGUgZnVuY3Rpb24gbnVtYmVyIGFzc2lnbmVkIHRvIHRoaXMgcmVtb3RlIGRldmljZS4KKwkgKiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHZpcnR1YWwgZnVuY3Rpb24gbnVtYmVyIHRoYXQgaXMgYmVpbmcgdXNlZCB0bworCSAqIGNvbW11bmljYXRlIHRvIHRoZSBkZXZpY2UuCisJICovCisJdTMyIGZ1bmN0aW9uX251bWJlcjo4OworCXUzMiByZXNlcnZlZDNfMTo4OworCisJLyoqCisJICogVGhpcyBmaWVsZCBwcm92aWRlcyB0aGUgZHJpdmVyIGEgd2F5IHRvIGNoZWF0IG9uIHRoZSBhcmJpdHJhdGlvbiB3YWl0IHRpbWUKKwkgKiBmb3IgdGhpcyByZW1vdGUgbm9kZS4KKwkgKi8KKwl1MzIgYXJiaXRyYXRpb25fd2FpdF90aW1lOjE2OworCisJLyogV09SRCA0ICovCisJLyoqCisJICogVGhpcyBmaWVsZCB0ZWxscyB0aGUgU0NVIGhhcmR3YXJlIGhvdyBsb25nIHRoaXMgZGV2aWNlIG1heSBvY2N1cHkgdGhlCisJICogY29ubmVjdGlvbiBiZWZvcmUgaXQgbXVzdCBiZSBjbG9zZWQuCisJICovCisJdTMyIGNvbm5lY3Rpb25fb2NjdXBhbmN5X3RpbWVvdXQ6MTY7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgaG93IGxvbmcgdG8gbWFpbnRhaW4gYSBjb25uZWN0aW9uIHdoZW4KKwkgKiB0aGVyZSBhcmUgbm8gZnJhbWVzIGJlaW5nIHRyYW5zbWl0dGVkIG9uIHRoZSBsaW5rLgorCSAqLworCXUzMiBjb25uZWN0aW9uX2luYWN0aXZpdHlfdGltZW91dDoxNjsKKworCS8qIFdPUkQgIDUgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGFsbG93cyB0aGUgZHJpdmVyIHRvIGNoZWF0IG9uIHRoZSBhcmJpdHJhdGlvbiB3YWl0IHRpbWUgZm9yIHRoaXMKKwkgKiByZW1vdGUgbm9kZS4KKwkgKi8KKwl1MzIgaW5pdGlhbF9hcmJpdHJhdGlvbl93YWl0X3RpbWU6MTY7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRlbGxzIHRoZSBoYXJkd2FyZSB3aGF0IHRvIHByb2dyYW0gZm9yIHRoZSBjb25uZWN0aW9uIHJhdGUgaW4KKwkgKiB0aGUgb3BlbiBhZGRyZXNzIGZyYW1lLiAgU2VlIHRoZSBTQVMgc3BlYyBmb3IgdmFsaWQgdmFsdWVzLgorCSAqLworCXUzMiBvYWZfY29ubmVjdGlvbl9yYXRlOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgd2hhdCB0byBwcm9ncmFtIGZvciB0aGUgZmVhdHVyZXMgaW4gdGhlCisJICogb3BlbiBhZGRyZXNzIGZyYW1lLiAgU2VlIHRoZSBTQVMgc3BlYyBmb3IgdmFsaWQgdmFsdWVzLgorCSAqLworCXUzMiBvYWZfZmVhdHVyZXM6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSB3aGF0IHRvIHVzZSBmb3IgdGhlIHNvdXJjZSB6b25lIGdyb3VwIGluCisJICogdGhlIG9wZW4gYWRkcmVzcyBmcmFtZS4gIFNlZSB0aGUgU0FTIHNwZWMgZm9yIG1vcmUgZGV0YWlscyBvbiB6b25pbmcuCisJICovCisJdTMyIG9hZl9zb3VyY2Vfem9uZV9ncm91cDo4OworCisJLyogV09SRCA2ICovCisJLyoqCisJICogVGhpcyBmaWVsZCB0ZWxscyB0aGUgU0NVIGhhcmR3YXJlIHdoYXQgdG8gdXNlIGFzIHRoZSBtb3JlIGNhcGliaWxpdGllcyBpbgorCSAqIHRoZSBvcGVuIGFkZHJlc3MgZnJhbWUuIFNlZSB0aGUgU0FTIFNwZWMgZm9yIGRldGFpbHMuCisJICovCisJdTMyIG9hZl9tb3JlX2NvbXBhdGliaWxpdHlfZmVhdHVyZXM7CisKKwkvKiBXT1JEIDcgKi8KKwl1MzIgcmVzZXJ2ZWQ3OworCit9OworCisvKioKKyAqIHN0cnVjdCBzdHBfcmVtb3RlX25vZGVfY29udGV4dCAtIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBTQ1UgaGFyZHdhcmUKKyAqICAgIGRlZmluaXRpb24gZm9yIGEgU1RQIHJlbW90ZSBub2RlLgorICoKKyAqIFNUUCBUYXJnZXRzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBzbyB0aGlzIGRlZmluaXRpb24gaXMgYSBwbGFjZWhvbGRlciB1bnRpbAorICogd2UgZG8gc3VwcG9ydCB0aGVtLgorICovCitzdHJ1Y3Qgc3RwX3JlbW90ZV9ub2RlX2NvbnRleHQgeworCS8qKgorCSAqIFBsYWNlaG9sZGVyIGRhdGEgZm9yIHRoZSBTVFAgcmVtb3RlIG5vZGUuCisJICovCisJdTMyIGRhdGFbOF07CisKK307CisKKy8qKgorICogVGhpcyB1bmlvbiBjb21iaW5lcyB0aGUgU0FTIGFuZCBTQVRBIHJlbW90ZSBub2RlIGRlZmluaXRpb25zLgorICoKKyAqIHVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0CisgKi8KK3VuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0IHsKKwkvKioKKwkgKiBTU1AgUmVtb3RlIE5vZGUKKwkgKi8KKwlzdHJ1Y3Qgc3NwX3JlbW90ZV9ub2RlX2NvbnRleHQgc3NwOworCisJLyoqCisJICogU1RQIFJlbW90ZSBOb2RlCisJICovCisJc3RydWN0IHN0cF9yZW1vdGVfbm9kZV9jb250ZXh0IHN0cDsKKworfTsKKworI2VuZGlmIC8qIF9fU0NVX1JFTU9URV9OT0RFX0NPTlRFWFRfSEVBREVSX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV90YXNrX2NvbnRleHQuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV90YXNrX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY4N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3Rhc2tfY29udGV4dC5oCkBAIC0wLDAgKzEsOTQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TQ1VfVEFTS19DT05URVhUX0hfCisjZGVmaW5lIF9TQ1VfVEFTS19DT05URVhUX0hfCisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgZm9yIHRoZSBTQ1UgaGFyZHdhcmUgdGFzaworICogICAgY29udGV4dC4KKyAqCisgKgorICovCisKKworLyoqCisgKiBlbnVtIHNjdV9zc3BfdGFza190eXBlIC0gVGhpcyBlbnVtYmVyYXRpb24gZGVmaW5lcyB0aGUgdmFyaW91cyBTU1AgdGFzaworICogICAgdHlwZXMgdGhlIFNDVSBoYXJkd2FyZSB3aWxsIGFjY2VwdC4gVGhlIGRlZmluaXRpb24gZm9yIHRoZSB2YXJpb3VzIHRhc2sKKyAqICAgIHR5cGVzIHRoZSBTQ1UgaGFyZHdhcmUgd2lsbCBhY2NlcHQgY2FuIGJlIGZvdW5kIGluIHRoZSBEUyBzcGVjaWZpY2F0aW9uLgorICoKKyAqCisgKi8KK3R5cGVkZWYgZW51bSB7CisJU0NVX1RBU0tfVFlQRV9JT1JFQUQsICAgICAgICAgICAvKiAvPCBJTyBSRUFEIGRpcmVjdGlvbiBvciBubyBkaXJlY3Rpb24gKi8KKwlTQ1VfVEFTS19UWVBFX0lPV1JJVEUsICAgICAgICAgIC8qIC88IElPIFdyaXRlIGRpcmVjdGlvbiAqLworCVNDVV9UQVNLX1RZUEVfU01QX1JFUVVFU1QsICAgICAgLyogLzwgU01QIFJlcXVlc3QgdHlwZSAqLworCVNDVV9UQVNLX1RZUEVfUkVTUE9OU0UsICAgICAgICAgLyogLzwgRHJpdmVyIGdlbmVyYXRlZCByZXNwb25zZSBmcmFtZSAodGFyZ3QgbW9kZSkgKi8KKwlTQ1VfVEFTS19UWVBFX1JBV19GUkFNRSwgICAgICAgIC8qIC88IFJhdyBmcmFtZSByZXF1ZXN0IHR5cGUgKi8KKwlTQ1VfVEFTS19UWVBFX1BSSU1JVElWRSAgICAgICAgIC8qIC88IFJlcXVlc3QgZm9yIGEgcHJpbWl0aXZlIHRvIGJlIHRyYW5zbWl0dGVkICovCit9IHNjdV9zc3BfdGFza190eXBlOworCisvKioKKyAqIGVudW0gc2N1X3NhdGFfdGFza190eXBlIC0gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2YXJpb3VzIFNBVEEgdGFzaworICogICAgdHlwZXMgdGhlIFNDVSBoYXJkd2FyZSB3aWxsIGFjY2VwdC4gVGhlIGRlZmluaXRpb24gZm9yIHRoZSB2YXJpb3VzIHRhc2sKKyAqICAgIHR5cGVzIHRoZSBTQ1UgaGFyZHdhcmUgd2lsbCBhY2NlcHQgY2FuIGJlIGZvdW5kIGluIHRoZSBEUyBzcGVjaWZpY2F0aW9uLgorICoKKyAqCisgKi8KK3R5cGVkZWYgZW51bSB7CisJU0NVX1RBU0tfVFlQRV9ETUFfSU4sICAgICAgICAgICAvKiAvPCBSZWFkIHJlcXVlc3QgKi8KKwlTQ1VfVEFTS19UWVBFX0ZQRE1BUV9SRUFELCAgICAgIC8qIC88IE5DUSByZWFkIHJlcXVlc3QgKi8KKwlTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfSU4sICAgIC8qIC88IFBhY2tldCByZWFkIHJlcXVlc3QgKi8KKwlTQ1VfVEFTS19UWVBFX1NBVEFfUkFXX0ZSQU1FLCAgIC8qIC88IFJhdyBmcmFtZSByZXF1ZXN0ICovCisJUkVTRVJWRURfNCwKKwlSRVNFUlZFRF81LAorCVJFU0VSVkVEXzYsCisJUkVTRVJWRURfNywKKwlTQ1VfVEFTS19UWVBFX0RNQV9PVVQsICAgICAgICAgIC8qIC88IFdyaXRlIHJlcXVlc3QgKi8KKwlTQ1VfVEFTS19UWVBFX0ZQRE1BUV9XUklURSwgICAgIC8qIC88IE5DUSB3cml0ZSBSZXF1ZXN0ICovCisJU0NVX1RBU0tfVFlQRV9QQUNLRVRfRE1BX09VVCAgICAvKiAvPCBQYWNrZXQgd3JpdGUgcmVxdWVzdCAqLworfSBzY3Vfc2F0YV90YXNrX3R5cGU7CisKKworLyoqCisgKgorICoKKyAqIFNDVV9DT05URVhUX1RZUEUKKyAqLworI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1RZUEUgIDAKKyNkZWZpbmUgU0NVX1JOQ19DT05URVhUX1RZUEUgICAxCisKKy8qKgorICoKKyAqCisgKiBTQ1VfVEFTS19DT05URVhUX1ZBTElESVRZCisgKi8KKyNkZWZpbmUgU0NVX1RBU0tfQ09OVEVYVF9JTlZBTElEICAgICAgICAgIDAKKyNkZWZpbmUgU0NVX1RBU0tfQ09OVEVYVF9WQUxJRCAgICAgICAgICAgIDEKKworLyoqCisgKgorICoKKyAqIFNDVV9DT01NQU5EX0NPREUKKyAqLworI2RlZmluZSBTQ1VfQ09NTUFORF9DT0RFX0lOSVRJQVRPUl9ORVdfVEFTSyAgIDAKKyNkZWZpbmUgU0NVX0NPTU1BTkRfQ09ERV9BQ1RJVkVfVEFTSyAgICAgICAgICAxCisjZGVmaW5lIFNDVV9DT01NQU5EX0NPREVfUFJJTUlUSVZFX1NFUV9UQVNLICAgMgorI2RlZmluZSBTQ1VfQ09NTUFORF9DT0RFX1RBUkdFVF9SQVdfRlJBTUVTICAgIDMKKworLyoqCisgKgorICoKKyAqIFNDVV9UQVNLX1BSSU9SSVRZCisgKi8KKy8qKgorICoKKyAqCisgKiBUaGlzIHByaW9yaXR5IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmlvcml0eSByZXF1ZXN0IGZvciB0aGlzIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgU0NVX1RBU0tfUFJJT1JJVFlfTk9STUFMICAgICAgICAgIDAKKworLyoqCisgKgorICoKKyAqIFRoaXMgcHJpb3JpdHkgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgc2hvdWxkIGJlIHNjaGVkdWxlZCB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIHF1ZXVlLiAgVGhlIHRhc2sgd2lsbCBOT1QgYmUgZXhlY3V0ZWQgaWYgdGhlIFRYIGlzIHN1c3BlbmRlZCBmb3IgdGhlIHJlbW90ZQorICogbm9kZS4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19QUklPUklUWV9IRUFEX09GX1EgICAgICAgMQorCisvKioKKyAqCisgKgorICogVGhpcyBwcmlvcml0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSBhbGwKKyAqIFNDVV9UQVNLX1BSSU9SSVRZX05PUk1BTCBhbmQgU0NVX1RBU0tfUFJJT1JJVFlfSEVBRF9PRl9RIHRhc2tzLiBUaGUgdGFzaworICogV0lMTCBiZSBleGVjdXRlZCBpZiB0aGUgVFggaXMgc3VzcGVuZGVkIGZvciB0aGUgcmVtb3RlIG5vZGUuCisgKi8KKyNkZWZpbmUgU0NVX1RBU0tfUFJJT1JJVFlfSElHSCAgICAgICAgICAgIDIKKworLyoqCisgKgorICoKKyAqIFRoaXMgdGFzayBwcmlvcml0eSBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgorICovCisjZGVmaW5lIFNDVV9UQVNLX1BSSU9SSVRZX1JFU0VSVkVEICAgICAgICAzCisKKyNkZWZpbmUgU0NVX1RBU0tfSU5JVElBVE9SX01PREUgICAgICAgICAgIDEKKyNkZWZpbmUgU0NVX1RBU0tfVEFSR0VUX01PREUgICAgICAgICAgICAgIDAKKworI2RlZmluZSBTQ1VfVEFTS19SRUdVTEFSICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTQ1VfVEFTS19BQk9SVEVEICAgICAgICAgICAgICAgICAgMQorCisvKiBkaXJlY3Rpb24gYml0IGRlZmludGlvbiAqLworLyoqCisgKgorICoKKyAqIFNBVEFfRElSRUNUSU9OCisgKi8KKyNkZWZpbmUgU0NVX1NBVEFfV1JJVEVfREFUQV9ESVJFQ1RJT04gICAgIDAKKyNkZWZpbmUgU0NVX1NBVEFfUkVBRF9EQVRBX0RJUkVDVElPTiAgICAgIDEKKworLyoqCisgKgorICoKKyAqIFNDVV9DT01NQU5EX0NPTlRFWFRfTUFDUk9TIFRoZXNlIG1hY3JvcyBwcm92aWRlIHRoZSBtYXNrIGFuZCBzaGlmdAorICogb3BlcmF0aW9ucyB0byBjb25zdHJ1Y3QgdGhlIHZhcmlvdXMgU0NVIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfU0hJRlQgICAgICAgICAgIDIxCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX01BU0sgICAgICAgICAgICAweDAwRTAwMDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9yZXF1ZXN0X3R5cGUoeCkJXAorCSgoeCkgJiBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9NQVNLKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9TVUJUWVBFX1NISUZUICAgICAgICAxOAorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfU1VCVFlQRV9NQVNLICAgICAgICAgMHgwMDFDMDAwMAorI2RlZmluZSBzY3VfZ2V0X2NvbW1hbmRfcmVxdWVzdF9zdWJ0eXBlKHgpIFwKKwkoKHgpICYgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfTUFTSykKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfRlVMTFRZUEVfTUFTSwkgXAorCShcCisJCVNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX01BU0sJCSAgXAorCQl8IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9TVUJUWVBFX01BU0sJICAgIFwKKwkpCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9yZXF1ZXN0X2Z1bGxfdHlwZSh4KSBcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9GVUxMVFlQRV9NQVNLKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1NISUZUICAxNgorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BST1RPQ09MX0VOR0lORV9HUk9VUF9NQVNLICAgMHgwMDAxMDAwMAorI2RlZmluZSBzY3VfZ2V0X2NvbW1hbmRfcHJvdG9jbF9lbmdpbmVfZ3JvdXAoeCkJXAorCSgoeCkgJiBTQ1VfQ09OVEVYVF9DT01NQU5EX1BST1RPQ09MX0VOR0lORV9HUk9VUF9NQVNLKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUICAgICAgICAgICAxMgorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9NQVNLICAgICAgICAgICAgMHgwMDAwNzAwMAorI2RlZmluZSBzY3VfZ2V0X2NvbW1hbmRfcmVxZXVzdF9sb2dpY2FsX3BvcnQoeCkJXAorCSgoeCkgJiBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9NQVNLKQorCisKKyNkZWZpbmUgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1RZUEUodHlwZSkgXAorCSgodTMyKSh0eXBlKSA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9TSElGVCkKKworLyoqCisgKiBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSgpIC0KKyAqCisgKiBTQ1VfQ09NTUFORF9UWVBFUyBUaGVzZSBjb25zdGFudHMgcHJvdmlkZSB0aGUgZ3JvdXBpbmcgb2YgdGhlIGRpZmZlcmVudCBTQ1UKKyAqIGNvbW1hbmQgdHlwZXMuCisgKi8KKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQyAgICBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSgwKQorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1RDICAgIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKDEpCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DICAgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1RZUEUoMikKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9STkMgICBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSgzKQorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9PVEhFUl9STkMgIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKDYpCisKKyNkZWZpbmUgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QodHlwZSwgY29tbWFuZCkJXAorCSgodHlwZSkgfCAoKGNvbW1hbmQpIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9TVUJUWVBFX1NISUZUKSkKKworLyoqCisgKgorICoKKyAqIFNDVV9SRVFVRVNUX1RZUEVTIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIHZhcmlvdXMgcmVxdWVzdCB0eXBlcyB0aGF0IGNhbiBiZQorICogcG9zdGVkIHRvIHRoZSBTQ1UgaGFyZHdhcmUuCisgKi8KKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVU1RfUE9TVF9UQyBcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEMsIDApKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9QT1NUX1RDX0FCT1JUIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQywgMSkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVU1RfRFVNUF9UQyBcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX0RVTVBfVEMsIDApKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfMzIJXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1JOQywgMCkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ185NglcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DLCAxKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX0lOVkFMSURBVEUJXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1JOQywgMikpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9EVU1QX1JOQ18zMglcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX0RVTVBfUk5DLCAwKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX0RVTVBfUk5DXzk2CVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9STkMsIDEpKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfU1VTUEVORF9UWAlcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQywgMCkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ19TVVNQRU5EX1RYX1JYIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCAxKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX1JFU1VNRSBcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQywgMikpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfSVRfTkVYVVNfTE9TU19USU1FUl9FTkFCTEUgXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9PVEhFUl9STkMsIDMpKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0lUX05FWFVTX0xPU1NfVElNRVJfRElTQUJMRQlcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQywgNCkpCisKKy8qKgorICoKKyAqCisgKiBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MIFNDVSBUYXNrIGNvbnRleHQgcHJvdG9jb2wgdHlwZXMgdGhpcyBpcyB1ZXNkIHRvCisgKiBwcm9ncmFtIHRoZSBTQ1UgVGFzayBjb250ZXh0IHByb3RvY29sIGZpZWxkIGluIHdvcmQgMHgwMC4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NNUCAgICAweDAwCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1NQICAgIDB4MDEKKyNkZWZpbmUgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TVFAgICAgMHgwMgorI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX05PTkUgICAweDA3CisKKy8qKgorICogc3RydWN0IHNzcF90YXNrX2NvbnRleHQgLSBUaGlzIGlzIHRoZSBTQ1UgaGFyZHdhcmUgZGVmaW5pdGlvbiBmb3IgYW4gU1NQCisgKiAgICByZXF1ZXN0LgorICoKKyAqCisgKi8KK3N0cnVjdCBzc3BfdGFza19jb250ZXh0IHsKKwkvKiBPRkZTRVQgMHgxOCAqLworCXUzMiByZXNlcnZlZDAwOjI0OworCXUzMiBmcmFtZV90eXBlOjg7CisKKwkvKiBPRkZTRVQgMHgxQyAqLworCXUzMiByZXNlcnZlZDAxOworCisJLyogT0ZGU0VUIDB4MjAgKi8KKwl1MzIgZmlsbF9ieXRlczoyOworCXUzMiByZXNlcnZlZDAyOjY7CisJdTMyIGNoYW5naW5nX2RhdGFfcG9pbnRlcjoxOworCXUzMiByZXRyYW5zbWl0OjE7CisJdTMyIHJldHJ5X2RhdGFfZnJhbWU6MTsKKwl1MzIgdGxyX2NvbnRyb2w6MjsKKwl1MzIgcmVzZXJ2ZWQwMzoxOTsKKworCS8qIE9GRlNFVCAweDI0ICovCisJdTMyIHVpUnN2ZDQ7CisKKwkvKiBPRkZTRVQgMHgyOCAqLworCXUzMiB0YXJnZXRfcG9ydF90cmFuc2Zlcl90YWc6MTY7CisJdTMyIHRhZzoxNjsKKworCS8qIE9GRlNFVCAweDJDICovCisJdTMyIGRhdGFfb2Zmc2V0OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3RwX3Rhc2tfY29udGV4dCAtIFRoaXMgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uIGZvciBhbiBTVFAKKyAqICAgIHJlcXVlc3QuCisgKgorICoKKyAqLworc3RydWN0IHN0cF90YXNrX2NvbnRleHQgeworCS8qIE9GRlNFVCAweDE4ICovCisJdTMyIGZpc190eXBlOjg7CisJdTMyIHBtX3BvcnQ6NDsKKwl1MzIgcmVzZXJ2ZWQwOjM7CisJdTMyIGNvbnRyb2w6MTsKKwl1MzIgY29tbWFuZDo4OworCXUzMiBmZWF0dXJlczo4OworCisJLyogT0ZGU0VUIDB4MUMgKi8KKwl1MzIgcmVzZXJ2ZWQxOworCisJLyogT0ZGU0VUIDB4MjAgKi8KKwl1MzIgcmVzZXJ2ZWQyOworCisJLyogT0ZGU0VUIDB4MjQgKi8KKwl1MzIgcmVzZXJ2ZWQzOworCisJLyogT0ZGU0VUIDB4MjggKi8KKwl1MzIgbmNxX3RhZzo1OworCXUzMiByZXNlcnZlZDQ6Mjc7CisKKwkvKiBPRkZTRVQgMHgyQyAqLworCXUzMiBkYXRhX29mZnNldDsgLyogVE9ETzogV2hhdCBpcyB0aGlzIHVzZWQgZm9yPyAqLworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc21wX3Rhc2tfY29udGV4dCAtIFRoaXMgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uIGZvciBhbiBTTVAKKyAqICAgIHJlcXVlc3QuCisgKgorICoKKyAqLworc3RydWN0IHNtcF90YXNrX2NvbnRleHQgeworCS8qIE9GRlNFVCAweDE4ICovCisJdTMyIHJlc3BvbnNlX2xlbmd0aDo4OworCXUzMiBmdW5jdGlvbl9yZXN1bHQ6ODsKKwl1MzIgZnVuY3Rpb246ODsKKwl1MzIgZnJhbWVfdHlwZTo4OworCisJLyogT0ZGU0VUIDB4MUMgKi8KKwl1MzIgc21wX3Jlc3BvbnNlX3VmaToxMjsKKwl1MzIgcmVzZXJ2ZWQxOjIwOworCisJLyogT0ZGU0VUIDB4MjAgKi8KKwl1MzIgcmVzZXJ2ZWQyOworCisJLyogT0ZGU0VUIDB4MjQgKi8KKwl1MzIgcmVzZXJ2ZWQzOworCisJLyogT0ZGU0VUIDB4MjggKi8KKwl1MzIgcmVzZXJ2ZWQ0OworCisJLyogT0ZGU0VUIDB4MkMgKi8KKwl1MzIgcmVzZXJ2ZWQ1OworfTsKKworLyoqCisgKiBzdHJ1Y3QgcHJpbWl0aXZlX3Rhc2tfY29udGV4dCAtIFRoaXMgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uIHVzZWQKKyAqICAgIHdoZW4gdGhlIGRyaXZlciB3YW50cyB0byBzZW5kIGEgcHJpbWl0aXZlIG9uIHRoZSBsaW5rLgorICoKKyAqCisgKi8KK3N0cnVjdCBwcmltaXRpdmVfdGFza19jb250ZXh0IHsKKwkvKiBPRkZTRVQgMHgxOCAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGNvbnRyb2wgd29yZCBhbmQgaXQgbXVzdCBiZSAwLgorCSAqLworCXUzMiBjb250cm9sOyAvKiAvPCBtdXN0IGJlIHNldCB0byAwICovCisKKwkvKiBPRkZTRVQgMHgxQyAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBwcmltaXRpdmUgdGhhdCBpcyB0byBiZSB0cmFuc21pdHRlZC4KKwkgKi8KKwl1MzIgc2VxdWVuY2U7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiByZXNlcnZlZDA7CisKKwkvKiBPRkZTRVQgMHgyNCAqLworCXUzMiByZXNlcnZlZDE7CisKKwkvKiBPRkZTRVQgMHgyOCAqLworCXUzMiByZXNlcnZlZDI7CisKKwkvKiBPRkZTRVQgMHgyQyAqLworCXUzMiByZXNlcnZlZDM7Cit9OworCisvKioKKyAqIFRoZSB1bmlvbiBvZiB0aGUgcHJvdG9jb2xzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIHRoZSBTQ1UgdGFzayBjb250ZXh0CisgKiAgICBmaWVsZC4KKyAqCisgKiBwcm90b2NvbF9jb250ZXh0CisgKi8KK3VuaW9uIHByb3RvY29sX2NvbnRleHQgeworCXN0cnVjdCBzc3BfdGFza19jb250ZXh0IHNzcDsKKwlzdHJ1Y3Qgc3RwX3Rhc2tfY29udGV4dCBzdHA7CisJc3RydWN0IHNtcF90YXNrX2NvbnRleHQgc21wOworCXN0cnVjdCBwcmltaXRpdmVfdGFza19jb250ZXh0IHByaW1pdGl2ZTsKKwl1MzIgd29yZHNbNl07Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgLSBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgc2luZ2xlIFNDVSBkZWZpbmVkIFNHTAorICogICAgZWxlbWVudC4gU0NVIFNHTHMgY29udGFpbiBhIDY0IGJpdCBhZGRyZXNzIHdpdGggdGhlIG1heGltdW0gZGF0YSB0cmFuc2ZlcgorICogICAgYmVpbmcgMjQgYml0cyBpbiBzaXplLiAgVGhlIFNHTCBjYW4gbm90IGNyb3NzIGEgNEdCIGJvdW5kYXJ5LgorICoKKyAqIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQKKyAqLworc3RydWN0IHNjdV9zZ2xfZWxlbWVudCB7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdXBwZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHBoeXNpY2FsIGFkZHJlc3MuCisJICovCisJdTMyIGFkZHJlc3NfdXBwZXI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcy4KKwkgKi8KKwl1MzIgYWRkcmVzc19sb3dlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KKwkgKi8KKwl1MzIgbGVuZ3RoOjI0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgYWRkcmVzcyBtb2RpZmllciB0byBiZSB1c2VkIHdoZW4gYSB2aXJ0dWFsIGZ1bmN0aW9uIGlzCisJICogcmVxdWVzdGluZyBhIGRhdGEgdHJhbnNmZXIuCisJICovCisJdTMyIGFkZHJlc3NfbW9kaWZpZXI6ODsKKworfTsKKworI2RlZmluZSBTQ1VfU0dMX0VMRU1FTlRfUEFJUl9BICAgMAorI2RlZmluZSBTQ1VfU0dMX0VMRU1FTlRfUEFJUl9CICAgMQorCisvKioKKyAqIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAtIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBTQ1UgaGFyZHdhcmUgZGVmaW5pdGlvbgorICogICAgb2YgYSBwYWlyIG9mIFNHTCBlbGVtZW50cy4gVGhlIFNDVSBoYXJkd2FyZSBhbHdheXMgd29ya3Mgb24gU0dMIHBhaXJzLgorICogICAgVGhleSBhcmUgcmVmZXJlZCB0byBpbiB0aGUgRFMgc3BlY2lmaWNhdGlvbiBhcyBTR0wgQSBhbmQgU0dMIEIuICBFYWNoIFNHTAorICogICAgcGFpciBpcyBmb2xsb3dlZCBieSB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBwYWlyLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciB7CisJLyogT0ZGU0VUIDB4NjAtMHg2OCAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIFNHTCBlbGVtZW50IEEgb2YgdGhlIFNHTCBwYWlyLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgQTsKKworCS8qIE9GRlNFVCAweDZDLTB4NzQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBTR0wgZWxlbWVudCBCIG9mIHRoZSBTR0wgcGFpci4KKwkgKi8KKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50IEI7CisKKwkvKiBPRkZTRVQgMHg3OC0weDdDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdXBwZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IGFkZHJlc3MgdG8gdGhlIG5leHQgU0dMCisJICogZWxlbWVudCBwYWlyLgorCSAqLworCXUzMiBuZXh0X3BhaXJfdXBwZXI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgYWRkcmVzcyB0byB0aGUgbmV4dCBTR0wKKwkgKiBlbGVtZW50IHBhaXIuCisJICovCisJdTMyIG5leHRfcGFpcl9sb3dlcjsKKworfTsKKworLyoqCisgKiBzdHJ1Y3QgdHJhbnNwb3J0X3NuYXBzaG90IC0gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFNDVSBoYXJkd2FyZSBzY3JhdGNoIGFyZWEKKyAqICAgIGZvciB0aGUgdGFzayBjb250ZXh0LiBUaGlzIGlzIHNldCB0byAwIGJ5IHRoZSBkcml2ZXIgYnV0IGNhbiBiZSByZWFkIGJ5CisgKiAgICBpc3N1aW5nIGEgZHVtcCBUQyByZXF1ZXN0IHRvIHRoZSBTQ1UuCisgKgorICoKKyAqLworc3RydWN0IHRyYW5zcG9ydF9zbmFwc2hvdCB7CisJLyogT0ZGU0VUIDB4NDggKi8KKwl1MzIgeGZlcl9yZHlfd3JpdGVfZGF0YV9sZW5ndGg7CisKKwkvKiBPRkZTRVQgMHg0QyAqLworCXUzMiBkYXRhX29mZnNldDsKKworCS8qIE9GRlNFVCAweDUwICovCisJdTMyIGRhdGFfdHJhbnNmZXJfc2l6ZToyNDsKKwl1MzIgcmVzZXJ2ZWRfNTBfMDo4OworCisJLyogT0ZGU0VUIDB4NTQgKi8KKwl1MzIgbmV4dF9pbml0aWF0b3Jfd3JpdGVfZGF0YV9vZmZzZXQ7CisKKwkvKiBPRkZTRVQgMHg1OCAqLworCXUzMiBuZXh0X2luaXRpYXRvcl93cml0ZV9kYXRhX3hmZXJfc2l6ZToyNDsKKwl1MzIgcmVzZXJ2ZWRfNThfMDo4OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAtIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBTQ1UKKyAqICAgIHNpbGljb24gdGFzayBjb250ZXh0LiBJdCBsYXlzIG91dCBhbGwgb2YgdGhlIGZpZWxkcyBhY2NvcmRpbmcgdG8gdGhlCisgKiAgICBleHBlY3RlZCBvcmRlciBhbmQgbG9jYXRpb24gZm9yIHRoZSBTdG9yYWdlIENvbnRyb2xsZXIgdW5pdC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCB7CisJLyogT0ZGU0VUIDB4MDAgLS0tLS0tICovCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIGVuY29kZWQgdG8gb25lIG9mIHRoZSB2YWxpZCBTQ1UgdGFzayBwcmlvcml0eSB2YWx1ZXMKKwkgKiAgICAtIFNDVV9UQVNLX1BSSU9SSVRZX05PUk1BTAorCSAqICAgIC0gU0NVX1RBU0tfUFJJT1JJVFlfSEVBRF9PRl9RCisJICogICAgLSBTQ1VfVEFTS19QUklPUklUWV9ISUdICisJICovCisJdTMyIHByaW9yaXR5OjI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRydWUgaWYgdGhpcyBpcyBhbiBpbml0aWF0b3IgZ2VuZXJhdGVkIHJlcXVlc3QuCisJICogVW50aWwgdGFyZ2V0IG1vZGUgaXMgc3VwcG9ydGVkIGFsbCB0YXNrIHJlcXVlc3RzIGFyZSBpbml0aWF0b3IgcmVxdWVzdHMuCisJICovCisJdTMyIGluaXRpYXRvcl9yZXF1ZXN0OjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIG9uZSBvZiB0aGUgdmFsaWQgY29ubmVjdGlvbiByYXRlcyB2YWxpZCB2YWx1ZXMKKwkgKiBhcmUgMHg4LCAweDksIGFuZCAweEEuCisJICovCisJdTMyIGNvbm5lY3Rpb25fcmF0ZTo0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXNlIGJlIHByb2dyYW1lZCB3aGVuIGdlbmVyYXRpbmcgYW4gU01QIHJlc3BvbnNlIHNpbmNlIHRoZSBTTVAKKwkgKiBjb25uZWN0aW9uIHJlbWFpbnMgb3BlbiB1bnRpbCB0aGUgU01QIHJlc3BvbnNlIGlzIGdlbmVyYXRlZC4KKwkgKi8KKwl1MzIgcHJvdG9jb2xfZW5naW5lX2luZGV4OjM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgY29udGFpbiB0aGUgbG9naWNhbCBwb3J0IGZvciB0aGUgdGFzayByZXF1ZXN0LgorCSAqLworCXUzMiBsb2dpY2FsX3BvcnRfaW5kZXg6MzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gb25lIG9mIHRoZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MIHZhbHVlcworCSAqICAgIC0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TTVAKKwkgKiAgICAtIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1NQCisJICogICAgLSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NUUAorCSAqICAgIC0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9OT05FCisJICovCisJdTMyIHByb3RvY29sX3R5cGU6MzsKKworCS8qKgorCSAqIFRoaXMgZmlsZWQgbXVzdCBiZSBzZXQgdG8gdGhlIFRDaSBhbGxvY2F0ZWQgZm9yIHRoaXMgdGFzaworCSAqLworCXUzMiB0YXNrX2luZGV4OjEyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgbXVzdCBiZSBzZXQgdG8gMHgwMAorCSAqLworCXUzMiByZXNlcnZlZF8wMF8wOjE7CisKKwkvKioKKwkgKiBGb3IgYSBub3JtYWwgdGFzayByZXF1ZXN0IHRoaXMgbXVzdCBiZSBzZXQgdG8gMC4gIElmIHRoaXMgaXMgYW4gYWJvcnQgb2YKKwkgKiB0aGlzIHRhc2sgcmVxdWVzdCBpdCBtdXN0IGJlIHNldCB0byAxLgorCSAqLworCXUzMiBhYm9ydDoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB0cnVlIGZvciB0aGUgU0NVIGhhcmR3YXJlIHRvIHByb2Nlc3MgdGhlIHRhc2suCisJICovCisJdTMyIHZhbGlkOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIFNDVV9UQVNLX0NPTlRFWFRfVFlQRQorCSAqLworCXUzMiBjb250ZXh0X3R5cGU6MTsKKworCS8qIE9GRlNFVCAweDA0ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgUk5pIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGlzIHJlcXVlc3QuCisJICovCisJdTMyIHJlbW90ZV9ub2RlX2luZGV4OjEyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBwcm9ncmFtbWVkIGlmIHRoaXMgaXMgYSBtaXJyb3JlZCByZXF1ZXN0LCB3aGljaCB3ZSBhcmUgbm90CisJICogdXNpbmcsIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlIFJOaSBmb3IgdGhlIG1pcnJvcmVkIHRhcmdldC4KKwkgKi8KKwl1MzIgbWlycm9yZWRfbm9kZV9pbmRleDoxMjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcHJvZ3JhbW1lZCB3aXRoIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFNBVEEgcmVxZXVzdAorCSAqICAgIC0gU0NVX1NBVEFfV1JJVEVfREFUQV9ESVJFQ1RJT04KKwkgKiAgICAtIFNDVV9TQVRBX1JFQURfREFUQV9ESVJFQ1RJT04KKwkgKi8KKwl1MzIgc2F0YV9kaXJlY3Rpb246MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcHJvZ3JhbW1zZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBTQ1VfQ09NTUFORF9DT0RFCisJICogICAgLSBTQ1VfQ09NTUFORF9DT0RFX0lOSVRJQVRPUl9ORVdfVEFTSworCSAqICAgIC0gU0NVX0NPTU1BTkRfQ09ERV9BQ1RJVkVfVEFTSworCSAqICAgIC0gU0NVX0NPTU1BTkRfQ09ERV9QUklNSVRJVkVfU0VRX1RBU0sKKwkgKiAgICAtIFNDVV9DT01NQU5EX0NPREVfVEFSR0VUX1JBV19GUkFNRVMKKwkgKi8KKwl1MzIgY29tbWFuZF9jb2RlOjI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB0byB0cnVlIGlmIHRoZSByZW1vdGUgbm9kZSBzaG91bGQgYmUgc3VzcGVuZGVkLgorCSAqIFRoaXMgYml0IGlzIG9ubHkgdmFsaWQgZm9yIFNTUCAmIFNNUCB0YXJnZXQgZGV2aWNlcy4KKwkgKi8KKwl1MzIgc3VzcGVuZF9ub2RlOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHByb2dyYW1tZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kIHR5cGUgY29kZXMKKwkgKgorCSAqIEZvciBTQVMgcmVxdWVzdHMgdXNlIHRoZSBzY3Vfc3NwX3Rhc2tfdHlwZQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9JT1JFQUQKKwkgKiAgICAtIFNDVV9UQVNLX1RZUEVfSU9XUklURQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9TTVBfUkVRVUVTVAorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9SRVNQT05TRQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9SQVdfRlJBTUUKKwkgKiAgICAtIFNDVV9UQVNLX1RZUEVfUFJJTUlUSVZFCisJICoKKwkgKiBGb3IgU0FUQSByZXF1ZXN0cyB1c2UgdGhlIHNjdV9zYXRhX3Rhc2tfdHlwZQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9ETUFfSU4KKwkgKiAgICAtIFNDVV9UQVNLX1RZUEVfRlBETUFRX1JFQUQKKwkgKiAgICAtIFNDVV9UQVNLX1RZUEVfUEFDS0VUX0RNQV9JTgorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9TQVRBX1JBV19GUkFNRQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9ETUFfT1VUCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0ZQRE1BUV9XUklURQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9QQUNLRVRfRE1BX09VVAorCSAqLworCXUzMiB0YXNrX3R5cGU6NDsKKworCS8qIE9GRlNFVCAweDA4ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIG11c3QgYmUgc2V0IHRvIDB4MDAKKwkgKi8KKwl1MzIgbGlua19sYXllcl9jb250cm9sOjg7IC8qIHByZXNlbnRseSBhbGwgcmVzZXJ2ZWQgKi8KKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRydWUgd2hlbiBUTFIgaXMgdG8gYmUgZW5hYmxlZAorCSAqLworCXUzMiBzc3BfdGxyX2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBpcyBmaWVsZCBzcGVjaWZpZXMgaWYgdGhlIFNDVSBETUFzIGEgcmVzcG9uc2UgZnJhbWUgdG8gaG9zdAorCSAqIG1lbW9yeSBmb3IgZ29vZCByZXNwb25zZSBmcmFtZXMgd2hlbiBvcGVyYXRpbmcgaW4gdGFyZ2V0IG1vZGUuCisJICovCisJdTMyIGRtYV9zc3BfdGFyZ2V0X2dvb2RfcmVzcG9uc2U6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIGlmIHRoZSBTQ1Ugc2hvdWxkIERNQSB0aGUgcmVzcG9uc2UgZnJhbWUgdG8KKwkgKiBob3N0IG1lbW9yeS4KKwkgKi8KKwl1MzIgZG9fbm90X2RtYV9zc3BfZ29vZF9yZXNwb25zZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHN0cmljdCBvcmRlcmluZyBpcyB0byBiZSBlbmFibGVkCisJICovCisJdTMyIHN0cmljdF9vcmRlcmluZzoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZW5kaWFuZXNzIHRvIGJlIHV0aWxpemVkIGZvciB0aGUKKwkgKiBmcmFtZS4gIGNvbW1hbmQsIHRhc2ssIGFuZCByZXNwb25zZSBmcmFtZXMgdXRpbGl6ZWQgY29udHJvbF9mcmFtZQorCSAqIHNldCB0byAxLgorCSAqLworCXUzMiBjb250cm9sX2ZyYW1lOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIHNob3VsZCBzZXQgdG8gMHgwMAorCSAqLworCXUzMiB0bF9jb250cm9sX3Jlc2VydmVkOjM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB0byB0cnVlIHdoZW4gdGhlIFNDVSBoYXJkd2FyZSB0YXNrIHRpbWVvdXQgY29udHJvbCBpcyB0bworCSAqIGJlIGVuYWJsZWQKKwkgKi8KKwl1MzIgdGltZW91dF9lbmFibGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHB0c19jb250cm9sX3Jlc2VydmVkOjc7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIGJsb2NrIGd1YXJkIGlzIHRvIGJlIGVuYWJsZWQKKwkgKi8KKwl1MzIgYmxvY2tfZ3VhcmRfZW5hYmxlOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIHNob3VsZCBzZXQgdG8gMHgwMAorCSAqLworCXUzMiBzZG1hX2NvbnRyb2xfcmVzZXJ2ZWQ6NzsKKworCS8qIE9GRlNFVCAweDBDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgYWRkcmVzcyBtb2RpZmllciBmb3IgdGhpcyBpbyByZXF1ZXN0IGl0IHNob3VsZCBiZQorCSAqIHByb2dyYW1tZWQgd2l0aCB0aGUgdmlydHVhbCBmdW5jdGlvbiB0aGF0IGlzIG1ha2luZyB0aGUgcmVxdWVzdC4KKwkgKi8KKwl1MzIgYWRkcmVzc19tb2RpZmllcjoxNjsKKworCS8qKgorCSAqIEB0b2RvIFdoYXQgd2Ugc3VwcG9ydCBtaXJyb3JlZCBTTVAgcmVzcG9uc2UgZnJhbWU/CisJICovCisJdTMyIG1pcnJvcmVkX3Byb3RvY29sX2VuZ2luZTozOyAgLyogbWlycm9yZWQgcHJvdG9jb2wgRW5naW5lIEluZGV4ICovCisKKwkvKioKKwkgKiBJZiB0aGlzIGlzIGEgbWlycm9yZWQgcmVxdWVzdCB0aGUgbG9naWNhbCBwb3J0IGluZGV4IGZvciB0aGUgbWlycm9yZWQgUk5pCisJICogbXVzdCBiZSBwcm9ncmFtbWVkLgorCSAqLworCXUzMiBtaXJyb3JlZF9sb2dpY2FsX3BvcnQ6NDsgIC8qIG1pcnJvcmVkIGxvY2FsIHBvcnQgaW5kZXggKi8KKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgbXVzdCBzZXQgaXQgdG8gMHgwMAorCSAqLworCXUzMiByZXNlcnZlZF8wQ18wOjg7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRydWUgaWYgdGhlIG1pcnJvcmVkIHJlcXVlc3QgcHJvY2Vzc2luZyBpcyB0byBiZQorCSAqIGVuYWJsZWQuCisJICovCisJdTMyIG1pcnJvcl9yZXF1ZXN0X2VuYWJsZToxOyAgLyogTWlycm9yZWQgcmVxdWVzdCBFbmFibGUgKi8KKworCS8qIE9GRlNFVCAweDEwICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgY29tbWFuZCBpdSBsZW5ndGggaW4gZHdvcmRzCisJICovCisJdTMyIHNzcF9jb21tYW5kX2l1X2xlbmd0aDo4OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdGFyZ2V0IFRMUiBlbmFibGUgYml0IGl0IG11c3QgYmUgc2V0IHRvIDAgd2hlbiBjcmVhdG5pbmcgdGhlCisJICogdGFzayBjb250ZXh0LgorCSAqLworCXUzMiB4ZmVyX3JlYWR5X3Rscl9lbmFibGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgbXVzdCBzZXQgaXQgdG8gMHgwMAorCSAqLworCXUzMiByZXNlcnZlZF8xMF8wOjc7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIGJ1cnN0IHNpemUgdGhhdCB0aGUgU0NVIGhhcmR3YXJlIHdpbGwgc2VuZCBpbiBvbmUKKwkgKiBjb25uZWN0aW9uIGl0cyB2YWx1ZSBpcyAoTiB4IDUxMikgYW5kIE4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIuICBJZiB0aGUKKwkgKiB2YWx1ZSBpcyAweDAwIHRoZW4gbWF4aW11bSBidXJzdCBzaXplIGlzIGRpc2FibGVkLgorCSAqLworCXUzMiBzc3BfbWF4X2J1cnN0X3NpemU6MTY7CisKKwkvKiBPRkZTRVQgMHgxNCAqLworCS8qKgorCSAqIFRoaXMgZmlsZWQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNmZXJlZCBpbiB0aGUgcmVxdWVzdC4KKwkgKi8KKwl1MzIgdHJhbnNmZXJfbGVuZ3RoX2J5dGVzOjI0OyAvKiBJbiB0ZXJtcyBvZiBieXRlcyAqLworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBzaG91bGQgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcmVzZXJ2ZWRfMTRfMDo4OworCisJLyogT0ZGU0VUIDB4MTgtMHgyQyAqLworCS8qKgorCSAqIFRoaXMgdW5pb24gcHJvdmlkZXMgZm9yIHRoZSBwcm90b2NvbCBzcGVjaWYgcGFydCBvZiB0aGUgU0NVIFRhc2sgQ29udGV4dC4KKwkgKi8KKwl1bmlvbiBwcm90b2NvbF9jb250ZXh0IHR5cGU7CisKKwkvKiBPRkZTRVQgMHgzMC0weDM0ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdXBwZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisJICogY29tbWFuZCBpdSBidWZmZXIKKwkgKi8KKwl1MzIgY29tbWFuZF9pdV91cHBlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIDY0IGJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorCSAqIGNvbW1hbmQgaXUgYnVmZmVyCisJICovCisJdTMyIGNvbW1hbmRfaXVfbG93ZXI7CisKKwkvKiBPRkZTRVQgMHgzOC0weDNDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdXBwZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisJICogcmVzcG9uc2UgaXUgYnVmZmVyCisJICovCisJdTMyIHJlc3BvbnNlX2l1X3VwcGVyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisJICogcmVzcG9uc2UgaXUgYnVmZmVyCisJICovCisJdTMyIHJlc3BvbnNlX2l1X2xvd2VyOworCisJLyogT0ZGU0VUIDB4NDAgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB0byB0aGUgdGFzayBwaGFzZSBvZiB0aGUgU0NVIGhhcmR3YXJlLiBUaGUgZHJpdmVyIG11c3QKKwkgKiBzZXQgdGhpcyB0byAweDAxCisJICovCisJdTMyIHRhc2tfcGhhc2U6ODsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRoZSB0cmFuc3BvcnQgbGF5ZXIgdGFzayBzdGF0dXMuICBUaGUgZHJpdmVyIG11c3Qgc2V0CisJICogdGhpcyB0byAweDAwCisJICovCisJdTMyIHRhc2tfc3RhdHVzOjg7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgZHVyaW5nIGluaXRpYXRvciB3cml0ZSBUTFIKKwkgKi8KKwl1MzIgcHJldmlvdXNfZXh0ZW5kZWRfdGFnOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgYSBTVFAgbm9uLWRhdGEgRklTCisJICovCisJdTMyIHN0cF9yZXRyeV9jb3VudDoyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBtdXN0IHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzQwXzE6MjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdXNlZCBieSB0aGUgU0NVIFRMIHRvIGRldGVybWluZSB3aGVuIHRvIHRha2UgYSBzbmFwc2hvdCB3aGVuCisJICogdHJhbm1pdHRpbmcgcmVhZCBkYXRhIGZyYW1lcy4KKwkgKiAgICAtIDB4MDAgVGhlIGVudGlyZSBJTworCSAqICAgIC0gMHgwMSAzMmsKKwkgKiAgICAtIDB4MDIgNjRrCisJICogICAgLSAweDA0IDEyOGsKKwkgKiAgICAtIDB4MDggMjU2aworCSAqLworCXUzMiBzc3BfdGxyX3RocmVzaG9sZDo0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBtdXN0IHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzQwXzI6NDsKKworCS8qIE9GRlNFVCAweDQ0ICovCisJdTMyIHdyaXRlX2RhdGFfbGVuZ3RoOyAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweDQ4LTB4NTggKi8KKwlzdHJ1Y3QgdHJhbnNwb3J0X3NuYXBzaG90IHNuYXBzaG90OyAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweDVDICovCisJdTMyIGJsb2NrX3Byb3RlY3Rpb25fZW5hYmxlOjE7CisJdTMyIGJsb2NrX3NpemU6MjsKKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9mdW5jdGlvbjoyOworCXUzMiByZXNlcnZlZF81Q18wOjk7CisJdTMyIGFjdGl2ZV9zZ2xfZWxlbWVudDoyOyAgLyogcmVhZCBvbmx5IHNldCB0byAwICovCisJdTMyIHNnbF9leGhhdXN0ZWQ6MTsgIC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCXUzMiBwYXlsb2FkX2RhdGFfdHJhbnNmZXJfZXJyb3I6NDsgIC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCXUzMiBmcmFtZV9idWZmZXJfb2Zmc2V0OjExOyAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweDYwLTB4N0MgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBmaXJzdCBTR0wgZWxlbWVudCBwYWlyIGZvdW5kIGluIHRoZSBUQyBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgc2dsX3BhaXJfYWI7CisJLyogT0ZGU0VUIDB4ODAtMHg5QyAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHNlY29uZCBTR0wgZWxlbWVudCBwYWlyIGZvdW5kIGluIHRoZSBUQyBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgc2dsX3BhaXJfY2Q7CisKKwkvKiBPRkZTRVQgMHhBMC1CQyAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ2xfc25hcHNob3RfYWM7CisKKwkvKiBPRkZTRVQgMHhDMCAqLworCXUzMiBhY3RpdmVfc2dsX2VsZW1lbnRfcGFpcjsgLyogcmVhZCBvbmx5IHNldCB0byAwICovCisKKwkvKiBPRkZTRVQgMHhDNC0weENDICovCisJdTMyIHJlc2VydmVkX0M0X0NDWzNdOworCisJLyogT0ZGU0VUIDB4RDAgKi8KKwl1MzIgaW50ZXJtZWRpYXRlX2NyY192YWx1ZToxNjsKKwl1MzIgaW5pdGlhbF9jcmNfc2VlZDoxNjsKKworCS8qIE9GRlNFVCAweEQ0ICovCisJdTMyIGFwcGxpY2F0aW9uX3RhZ19mb3JfdmVyaWZ5OjE2OworCXUzMiBhcHBsaWNhdGlvbl90YWdfZm9yX2dlbmVyYXRlOjE2OworCisJLyogT0ZGU0VUIDB4RDggKi8KKwl1MzIgcmVmZXJlbmNlX3RhZ19zZWVkX2Zvcl92ZXJpZnlfZnVuY3Rpb247CisKKwkvKiBPRkZTRVQgMHhEQyAqLworCXUzMiByZXNlcnZlZF9EQzsKKworCS8qIE9GRlNFVCAweEUwICovCisJdTMyIHJlc2VydmVkX0UwXzA6MTY7CisJdTMyIGFwcGxpY2F0aW9uX3RhZ19tYXNrX2Zvcl9nZW5lcmF0ZToxNjsKKworCS8qIE9GRlNFVCAweEU0ICovCisJdTMyIGJsb2NrX3Byb3RlY3Rpb25fY29udHJvbDoxNjsKKwl1MzIgYXBwbGljYXRpb25fdGFnX21hc2tfZm9yX3ZlcmlmeToxNjsKKworCS8qIE9GRlNFVCAweEU4ICovCisJdTMyIGJsb2NrX3Byb3RlY3Rpb25fZXJyb3I6ODsKKwl1MzIgcmVzZXJ2ZWRfRThfMDoyNDsKKworCS8qIE9GRlNFVCAweEVDICovCisJdTMyIHJlZmVyZW5jZV90YWdfc2VlZF9mb3JfdmVyaWZ5OworCisJLyogT0ZGU0VUIDB4RjAgKi8KKwl1MzIgaW50ZXJtZWRpYXRlX2NyY192YWxpZF9zbmFwc2hvdDoxNjsKKwl1MzIgcmVzZXJ2ZWRfRjBfMDoxNjsKKworCS8qIE9GRlNFVCAweEY0ICovCisJdTMyIHJlZmVyZW5jZV90YWdfc2VlZF9mb3JfdmVyaWZ5X2Z1bmN0aW9uX3NuYXBzaG90OworCisJLyogT0ZGU0VUIDB4RjggKi8KKwl1MzIgc25hcHNob3Rfb2ZfcmVzZXJ2ZWRfZHdvcmRfRENfb2ZfdGM7CisKKwkvKiBPRkZTRVQgMHhGQyAqLworCXUzMiByZWZlcmVuY2VfdGFnX3NlZWRfZm9yX2dlbmVyYXRlX2Z1bmN0aW9uX3NuYXBzaG90OworCit9OworCisjZW5kaWYgLyogX1NDVV9UQVNLX0NPTlRFWFRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmJjZGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jCkBAIC0wLDAgKzEsMTY3NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgInNhcy5oIgorI2luY2x1ZGUgPHNjc2kvbGlic2FzLmg+CisjaW5jbHVkZSAicmVtb3RlX2RldmljZS5oIgorI2luY2x1ZGUgInJlbW90ZV9ub2RlX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpc2NpLmgiCisjaW5jbHVkZSAicmVxdWVzdC5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJob3N0LmgiCisKKy8qKgorKiBpc2NpX3Rhc2tfcmVmdXNlKCkgLSBjb21wbGV0ZSB0aGUgcmVxdWVzdCB0byB0aGUgdXBwZXIgbGF5ZXIgZHJpdmVyIGluCisqICAgICB0aGUgY2FzZSB3aGVyZSBhbiBJL08gbmVlZHMgdG8gYmUgY29tcGxldGVkIGJhY2sgaW4gdGhlIHN1Ym1pdCBwYXRoLgorKiBAaWhvc3Q6IGhvc3Qgb24gd2hpY2ggdGhlIHRoZSByZXF1ZXN0IHdhcyBxdWV1ZWQKKyogQHRhc2s6IHJlcXVlc3QgdG8gY29tcGxldGUKKyogQHJlc3BvbnNlOiByZXNwb25zZSBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisqIEBzdGF0dXM6IHN0YXR1cyBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisqCisqLworc3RhdGljIHZvaWQgaXNjaV90YXNrX3JlZnVzZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IHNhc190YXNrICp0YXNrLAorCQkJICAgICBlbnVtIHNlcnZpY2VfcmVzcG9uc2UgcmVzcG9uc2UsCisJCQkgICAgIGVudW0gZXhlY19zdGF0dXMgc3RhdHVzKQorCit7CisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIGRpc3Bvc2l0aW9uOworCisJZGlzcG9zaXRpb24gPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJZGlzcG9zaXRpb24gPSBpc2NpX3Rhc2tfc2V0X2NvbXBsZXRpb25fc3RhdHVzKHRhc2ssIHJlc3BvbnNlLCBzdGF0dXMsCisJCQkJCQkgICAgICBkaXNwb3NpdGlvbik7CisKKwkvKiBUYXNrcyBhYm9ydGVkIHNwZWNpZmljYWxseSBieSBhIGNhbGwgdG8gdGhlIGxsZGRfYWJvcnRfdGFzaworCSAqIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY29tcGxldGVkIHRvIHRoZSBob3N0IGluIHRoZSByZWd1bGFyIHBhdGguCisJICovCisJc3dpdGNoIChkaXNwb3NpdGlvbikgeworCWNhc2UgaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOgorCQkvKiBOb3JtYWwgbm90aWZpY2F0aW9uICh0YXNrX2RvbmUpICovCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IE5vcm1hbCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQsICIKKwkJCSJzdGF0dXM9JWRcbiIsCisJCQlfX2Z1bmNfXywgdGFzaywgcmVzcG9uc2UsIHN0YXR1cyk7CisKKwkJdGFzay0+bGxkZF90YXNrID0gTlVMTDsKKworCQlpc2NpX2V4ZWNwYXRoX2NhbGxiYWNrKGlob3N0LCB0YXNrLCB0YXNrLT50YXNrX2RvbmUpOworCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjoKKwkJLyoKKwkJICogTm8gbm90aWZpY2F0aW9uIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGFscmVhZHkgaW4gdGhlCisJCSAqIGFib3J0IHBhdGguCisJCSAqLworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBBYm9ydGVkIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCwgIgorCQkJInN0YXR1cz0lZFxuIiwKKwkJCV9fZnVuY19fLCB0YXNrLCByZXNwb25zZSwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOgorCQkvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogRXJyb3IgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkLCAiCisJCQkic3RhdHVzPSVkXG4iLAorCQkJX19mdW5jX18sIHRhc2ssIHJlc3BvbnNlLCBzdGF0dXMpOworCisJCWlzY2lfZXhlY3BhdGhfY2FsbGJhY2soaWhvc3QsIHRhc2ssIHNhc190YXNrX2Fib3J0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpc2NpIHRhc2sgbm90aWZpY2F0aW9uIGRlZmF1bHQgY2FzZSEiLAorCQkJX19mdW5jX18pOworCQlzYXNfdGFza19hYm9ydCh0YXNrKTsKKwkJYnJlYWs7CisJfQorfQorCisjZGVmaW5lIGZvcl9lYWNoX3Nhc190YXNrKG51bSwgdGFzaykgXAorCWZvciAoOyBudW0gPiAwOyBudW0tLSxcCisJICAgICB0YXNrID0gbGlzdF9lbnRyeSh0YXNrLT5saXN0Lm5leHQsIHN0cnVjdCBzYXNfdGFzaywgbGlzdCkpCisKKworc3RhdGljIGlubGluZSBpbnQgaXNjaV9kZXZpY2VfaW9fcmVhZHkoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkgICAgICAgc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCXJldHVybiBpZGV2ID8gdGVzdF9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKSB8fAorCQkgICAgICAodGVzdF9iaXQoSURFVl9JT19OQ1FFUlJPUiwgJmlkZXYtPmZsYWdzKSAmJgorCQkgICAgICAgaXNjaV90YXNrX2lzX25jcV9yZWNvdmVyeSh0YXNrKSkKKwkJICAgIDogMDsKK30KKy8qKgorICogaXNjaV90YXNrX2V4ZWN1dGVfdGFzaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGlic2FzIHRvIHNlbmQgYSB0YXNrIGRvd24gdG8KKyAqICAgIGhhcmR3YXJlLgorICogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgU0FTIHRhc2sgdG8gc2VuZC4KKyAqIEBudW06IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRhc2tzIHRvIHF1ZXVlLgorICogQGdmcF9mbGFnczogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjb250ZXh0IG9mIHRoaXMgY2FsbC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgaW50IG51bSwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGV2X3RvX2lob3N0KHRhc2stPmRldik7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgaW9fcmVhZHk7CisJdTE2IHRhZzsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogbnVtPSVkXG4iLCBfX2Z1bmNfXywgbnVtKTsKKworCWZvcl9lYWNoX3Nhc190YXNrKG51bSwgdGFzaykgeworCQllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJaWRldiA9IGlzY2lfbG9va3VwX2RldmljZSh0YXNrLT5kZXYpOworCQlpb19yZWFkeSA9IGlzY2lfZGV2aWNlX2lvX3JlYWR5KGlkZXYsIHRhc2spOworCQl0YWcgPSBpc2NpX2FsbG9jX3RhZyhpaG9zdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJInRhc2s6ICVwLCBudW06ICVkIGRldjogJXAgaWRldjogJXA6JSNseCBjbWQgPSAlcFxuIiwKKwkJCXRhc2ssIG51bSwgdGFzay0+ZGV2LCBpZGV2LCBpZGV2ID8gaWRldi0+ZmxhZ3MgOiAwLAorCQkJdGFzay0+dWxkZF90YXNrKTsKKworCQlpZiAoIWlkZXYpIHsKKwkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssIFNBU19UQVNLX1VOREVMSVZFUkVELAorCQkJCQkgU0FTX0RFVklDRV9VTktOT1dOKTsKKwkJfSBlbHNlIGlmICghaW9fcmVhZHkgfHwgdGFnID09IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHKSB7CisJCQkvKiBJbmRpY2F0ZSBRVUVVRV9GVUxMIHNvIHRoYXQgdGhlIHNjc2kgbWlkbGF5ZXIKKwkJCSAqIHJldHJpZXMuCisJCQkgICovCisJCQlpc2NpX3Rhc2tfcmVmdXNlKGlob3N0LCB0YXNrLCBTQVNfVEFTS19DT01QTEVURSwKKwkJCQkJIFNBU19RVUVVRV9GVUxMKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZXJlIGlzIGEgZGV2aWNlIGFuZCBpdCdzIHJlYWR5IGZvciBJL08uICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwkJCWlmICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkgeworCQkJCS8qIFRoZSBJL08gd2FzIGFib3J0ZWQuICovCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKworCQkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssCisJCQkJCQkgU0FTX1RBU0tfVU5ERUxJVkVSRUQsCisJCQkJCQkgU0FNX1NUQVRfVEFTS19BQk9SVEVEKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19BVF9JTklUSUFUT1I7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwkJCQkvKiBidWlsZCBhbmQgc2VuZCB0aGUgcmVxdWVzdC4gKi8KKwkJCQlzdGF0dXMgPSBpc2NpX3JlcXVlc3RfZXhlY3V0ZShpaG9zdCwgaWRldiwgdGFzaywgdGFnKTsKKworCQkJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQkJCS8qIERpZCBub3QgcmVhbGx5IHN0YXJ0IHRoaXMgY29tbWFuZC4gKi8KKwkJCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJCQkvKiBJbmRpY2F0ZSBRVUVVRV9GVUxMIHNvIHRoYXQgdGhlIHNjc2kKKwkJCQkJKiBtaWRsYXllciByZXRyaWVzLiBpZiB0aGUgcmVxdWVzdAorCQkJCQkqIGZhaWxlZCBmb3IgcmVtb3RlIGRldmljZSByZWFzb25zLAorCQkJCQkqIGl0IGdldHMgcmV0dXJuZWQgYXMKKwkJCQkJKiBTQVNfVEFTS19VTkRFTElWRVJFRCBuZXh0IHRpbWUKKwkJCQkJKiB0aHJvdWdoLgorCQkJCQkqLworCQkJCQlpc2NpX3Rhc2tfcmVmdXNlKGlob3N0LCB0YXNrLAorCQkJCQkJCSBTQVNfVEFTS19DT01QTEVURSwKKwkJCQkJCQkgU0FTX1FVRVVFX0ZVTEwpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTICYmIHRhZyAhPSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJCS8qIGNvbW1hbmQgbmV2ZXIgaGl0IHRoZSBkZXZpY2UsIHNvIGp1c3QgZnJlZQorCQkJICogdGhlIHRjaSBhbmQgc2tpcCB0aGUgc2VxdWVuY2UgaW5jcmVtZW50CisJCQkgKi8KKwkJCWlzY2lfdGNpX2ZyZWUoaWhvc3QsIElTQ0lfVEFHX1RDSSh0YWcpKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGlzY2lfc2F0YV9tYW5hZ2VtZW50X3Rhc2tfcmVxdWVzdF9idWlsZChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmICh0bWZfdGFzayAhPSBpcmVxLT50dHlwZSkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCisJaXNjaV90bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKKworCXN3aXRjaCAoaXNjaV90bWYtPnRtZl9jb2RlKSB7CisKKwljYXNlIGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoOgorCWNhc2UgaXNjaV90bWZfc2F0YV9zcnN0X2xvdzogeworCQlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICpmaXMgPSAmaXJlcS0+c3RwLmNtZDsKKworCQltZW1zZXQoZmlzLCAwLCBzaXplb2YoKmZpcykpOworCisJCWZpcy0+ZmlzX3R5cGUgID0gIDB4Mjc7CisJCWZpcy0+ZmxhZ3MgICAgICY9IH4weDgwOworCQlmaXMtPmZsYWdzICAgICAmPSAweEYwOworCQlpZiAoaXNjaV90bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoKQorCQkJZmlzLT5jb250cm9sIHw9IEFUQV9TUlNUOworCQllbHNlCisJCQlmaXMtPmNvbnRyb2wgJj0gfkFUQV9TUlNUOworCQlicmVhazsKKwl9CisJLyogb3RoZXIgbWFuYWdlbWVudCBjb21tbmQgZ28gaGVyZS4uLiAqLworCWRlZmF1bHQ6CisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwl9CisKKwkvKiBjb3JlIGJ1aWxkcyB0aGUgcHJvdG9jb2wgc3BlY2lmaWMgcmVxdWVzdAorCSAqICBiYXNlZCBvbiB0aGUgaDJkIGZpcy4KKwkgKi8KKwlzdGF0dXMgPSBzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF9zYXRhKGlyZXEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfdGFza19yZXF1ZXN0X2J1aWxkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkgICAgdTE2IHRhZywgc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IE5VTEw7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldjsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV90bWYgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfdG1mKTsKKworCWRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisKKwkvKiBkbyBjb21tb24gYWxsb2NhdGlvbiBhbmQgaW5pdCBvZiByZXF1ZXN0IG9iamVjdC4gKi8KKwlpcmVxID0gaXNjaV90bWZfcmVxdWVzdF9mcm9tX3RhZyhpaG9zdCwgaXNjaV90bWYsIHRhZyk7CisJaWYgKCFpcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGxldCB0aGUgY29yZSBkbyBpdCdzIGNvbnN0cnVjdC4gKi8KKwlzdGF0dXMgPSBzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdChpaG9zdCwgaWRldiwgdGFnLAorCQkJCQkgICAgIGlyZXEpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0IGZhaWxlZCAtICIKKwkJCSAic3RhdHVzID0gMHgleFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBzdGF0dXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBYWFggY29udmVydCB0byBnZXQgdGhpcyBmcm9tIHRhc2stPnRwcm90byBsaWtlIG90aGVyIGRyaXZlcnMgKi8KKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFVikgeworCQlpc2NpX3RtZi0+cHJvdG8gPSBTQVNfUFJPVE9DT0xfU1NQOworCQlzdGF0dXMgPSBzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF9zc3AoaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fCAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSkgeworCQlpc2NpX3RtZi0+cHJvdG8gPSBTQVNfUFJPVE9DT0xfU0FUQTsKKwkJc3RhdHVzID0gaXNjaV9zYXRhX21hbmFnZW1lbnRfdGFza19yZXF1ZXN0X2J1aWxkKGlyZXEpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGlyZXE7Cit9CisKK3N0YXRpYyBpbnQgaXNjaV90YXNrX2V4ZWN1dGVfdG1mKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCSBzdHJ1Y3QgaXNjaV90bWYgKnRtZiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKQoreworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCWVudW0gc2NpX3Rhc2tfc3RhdHVzIHN0YXR1cyA9IFNDSV9UQVNLX0ZBSUxVUkU7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwlpbnQgcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OworCXUxNiB0YWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCXRhZyA9IGlzY2lfYWxsb2NfdGFnKGlob3N0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodGFnID09IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHKQorCQlyZXR1cm4gcmV0OworCisJLyogc2FuaXR5IGNoZWNrLCByZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQKKwkgKiBpZiB0aGUgZGV2aWNlIGlzIG5vdCB0aGVyZSBhbmQgcmVhZHkuCisJICovCisJaWYgKCFpZGV2IHx8CisJICAgICghdGVzdF9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKSAmJgorCSAgICAgIXRlc3RfYml0KElERVZfSU9fTkNRRVJST1IsICZpZGV2LT5mbGFncykpKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlkZXYgPSAlcCBub3QgcmVhZHkgKCUjbHgpXG4iLAorCQkJX19mdW5jX18sCisJCQlpZGV2LCBpZGV2ID8gaWRldi0+ZmxhZ3MgOiAwKTsKKwkJZ290byBlcnJfdGNpOworCX0gZWxzZQorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpZGV2ID0gJXBcbiIsCisJCQlfX2Z1bmNfXywgaWRldik7CisKKwkvKiBBc3NpZ24gdGhlIHBvaW50ZXIgdG8gdGhlIFRNRidzIGNvbXBsZXRpb24ga2VybmVsIHdhaXQgc3RydWN0dXJlLiAqLworCXRtZi0+Y29tcGxldGUgPSAmY29tcGxldGlvbjsKKworCWlyZXEgPSBpc2NpX3Rhc2tfcmVxdWVzdF9idWlsZChpaG9zdCwgaWRldiwgdGFnLCB0bWYpOworCWlmICghaXJlcSkKKwkJZ290byBlcnJfdGNpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCS8qIHN0YXJ0IHRoZSBUTUYgaW8uICovCisJc3RhdHVzID0gc2NpX2NvbnRyb2xsZXJfc3RhcnRfdGFzayhpaG9zdCwgaWRldiwgaXJlcSk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9UQVNLX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHN0YXJ0X2lvIGZhaWxlZCAtIHN0YXR1cyA9IDB4JXgsIHJlcXVlc3QgPSAlcFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBzdGF0dXMsCisJCQkgaXJlcSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJZ290byBlcnJfdGNpOworCX0KKworCWlmICh0bWYtPmNiX3N0YXRlX2Z1bmMgIT0gTlVMTCkKKwkJdG1mLT5jYl9zdGF0ZV9mdW5jKGlzY2lfdG1mX3N0YXJ0ZWQsIHRtZiwgdG1mLT5jYl9kYXRhKTsKKworCWlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoaXJlcSwgc3RhcnRlZCk7CisKKwkvKiBhZGQgdGhlIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkZXZpY2UgcmVxdWVzdCBsaXN0LiAqLworCWxpc3RfYWRkKCZpcmVxLT5kZXZfbm9kZSwgJmlkZXYtPnJlcXNfaW5fcHJvY2Vzcyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciB0aGUgVE1GIHRvIGNvbXBsZXRlLCBvciBhIHRpbWVvdXQuICovCisJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbXBsZXRpb24sCisJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXMpKTsKKworCWlmICh0aW1lbGVmdCA9PSAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJaWYgKHRtZi0+Y2Jfc3RhdGVfZnVuYyAhPSBOVUxMKQorCQkJdG1mLT5jYl9zdGF0ZV9mdW5jKGlzY2lfdG1mX3RpbWVkX291dCwgdG1mLCB0bWYtPmNiX2RhdGEpOworCisJCXNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KGlob3N0LAorCQkJCQkJICBpZGV2LAorCQkJCQkJICBpcmVxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbih0bWYtPmNvbXBsZXRlKTsKKwl9CisKKwlpc2NpX3ByaW50X3RtZih0bWYpOworCisJaWYgKHRtZi0+c3RhdHVzID09IFNDSV9TVUNDRVNTKQorCQlyZXQgPSAgVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwllbHNlIGlmICh0bWYtPnN0YXR1cyA9PSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRCkgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiB0bWYuc3RhdHVzID09ICIKKwkJCSJTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gIFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJfQorCS8qIEVsc2UgLSBsZWF2ZSB0aGUgZGVmYXVsdCAiZmFpbGVkIiBzdGF0dXMgYWxvbmUuICovCisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGNvbXBsZXRlZCByZXF1ZXN0ID0gJXBcbiIsCisJCV9fZnVuY19fLAorCQlpcmVxKTsKKworCXJldHVybiByZXQ7CisKKyBlcnJfdGNpOgorCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJaXNjaV90Y2lfZnJlZShpaG9zdCwgSVNDSV9UQUdfVENJKHRhZykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfdGFza19idWlsZF90bWYoc3RydWN0IGlzY2lfdG1mICp0bWYsCisJCQkJZW51bSBpc2NpX3RtZl9mdW5jdGlvbl9jb2RlcyBjb2RlLAorCQkJCXZvaWQgKCp0bWZfc2VudF9jYikoZW51bSBpc2NpX3RtZl9jYl9zdGF0ZSwKKwkJCQkJCSAgICBzdHJ1Y3QgaXNjaV90bWYgKiwKKwkJCQkJCSAgICB2b2lkICopLAorCQkJCXZvaWQgKmNiX2RhdGEpCit7CisJbWVtc2V0KHRtZiwgMCwgc2l6ZW9mKCp0bWYpKTsKKworCXRtZi0+dG1mX2NvZGUgICAgICA9IGNvZGU7CisJdG1mLT5jYl9zdGF0ZV9mdW5jID0gdG1mX3NlbnRfY2I7CisJdG1mLT5jYl9kYXRhICAgICAgID0gY2JfZGF0YTsKK30KKworc3RhdGljIHZvaWQgaXNjaV90YXNrX2J1aWxkX2Fib3J0X3Rhc2tfdG1mKHN0cnVjdCBpc2NpX3RtZiAqdG1mLAorCQkJCQkgICBlbnVtIGlzY2lfdG1mX2Z1bmN0aW9uX2NvZGVzIGNvZGUsCisJCQkJCSAgIHZvaWQgKCp0bWZfc2VudF9jYikoZW51bSBpc2NpX3RtZl9jYl9zdGF0ZSwKKwkJCQkJCQkgICAgICAgc3RydWN0IGlzY2lfdG1mICosCisJCQkJCQkJICAgICAgIHZvaWQgKiksCisJCQkJCSAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKm9sZF9yZXF1ZXN0KQoreworCWlzY2lfdGFza19idWlsZF90bWYodG1mLCBjb2RlLCB0bWZfc2VudF9jYiwgb2xkX3JlcXVlc3QpOworCXRtZi0+aW9fdGFnID0gb2xkX3JlcXVlc3QtPmlvX3RhZzsKK30KKworLyoqCisgKiBpc2NpX3Rhc2tfdmFsaWRhdGVfcmVxdWVzdF90b19hYm9ydCgpIC0gVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIGdpdmVuIEkvTworICogICAgYWdhaW5zdCB0aGUgInN0YXJ0ZWQiIHN0YXRlLiAgSWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgInN0YXJ0ZWQiLCBpdCdzCisgKiAgICBzdGF0ZSBpcyBjaGFuZ2VkIHRvIGFib3J0ZWQuIE5PVEU6IGlzY2lfaG9zdC0+c2NpY19sb2NrIE1VU1QgQkUgSEVMRAorICogICAgQkVGT1JFIENBTExJTkcgVEhJUyBGVU5DVElPTi4KKyAqIEBpc2NpX3JlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVxdWVzdCBvYmplY3QgdG8gY29udHJvbC4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorICogQGlzY2lfZGV2aWNlOiBUaGlzIGlzIHRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgcGVuZGluZy4KKyAqIEBhYm9ydGVkX2lvX2NvbXBsZXRpb246IFRoaXMgaXMgYSBjb21wbGV0aW9uIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8KKyAqICAgIHRoZSByZXF1ZXN0IGluIGNhc2UgaXQgaXMgY2hhbmdlZCB0byBhYm9ydGluZzsgdGhpcyBjb21wbGV0aW9uIGlzCisgKiAgICB0cmlnZ2VyZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyBmdWxseSBjb21wbGV0ZWQuCisgKgorICogRWl0aGVyICJzdGFydGVkIiBvbiBzdWNjZXNzZnVsIGNoYW5nZSBvZiB0aGUgdGFzayBzdGF0dXMgdG8gImFib3J0ZWQiLCBvcgorICogInVuYWxsb2NhdGVkIiBpZiB0aGUgdGFzayBjYW5ub3QgYmUgY29udHJvbGxlZC4KKyAqLworc3RhdGljIGVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBpc2NpX3Rhc2tfdmFsaWRhdGVfcmVxdWVzdF90b19hYm9ydCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QsCisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlLAorCXN0cnVjdCBjb21wbGV0aW9uICphYm9ydGVkX2lvX2NvbXBsZXRpb24pCit7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIG9sZF9zdGF0ZSA9IHVuYWxsb2NhdGVkOworCisJLyogT25seSBhYm9ydCB0aGUgdGFzayBpZiBpdCdzIGluIHRoZQorCSAqICBkZXZpY2UncyByZXF1ZXN0X2luX3Byb2Nlc3MgbGlzdAorCSAqLworCWlmIChpc2NpX3JlcXVlc3QgJiYgIWxpc3RfZW1wdHkoJmlzY2lfcmVxdWVzdC0+ZGV2X25vZGUpKSB7CisJCW9sZF9zdGF0ZSA9IGlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhcnRlZF90b19hYm9ydGVkKAorCQkJaXNjaV9yZXF1ZXN0LCBhYm9ydGVkX2lvX2NvbXBsZXRpb24pOworCisJfQorCisJcmV0dXJuIG9sZF9zdGF0ZTsKK30KKworLyoqCisqIGlzY2lfcmVxdWVzdF9jbGVhbnVwX2NvbXBsZXRlZF9sb2l0ZXJlcigpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgY2FyZSBvZgorKiAgICB0aGUgZmluYWwgY2xlYW51cCBvbiBhbnkgcmVxdWVzdCB3aGljaCBoYXMgYmVlbiBleHBsaWNpdGx5IHRlcm1pbmF0ZWQuCisqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorKiBAaXNjaV9kZXZpY2U6IFRoaXMgaXMgdGhlIGRldmljZSB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBwZW5kaW5nLgorKiBAaXNjaV9yZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHRlcm1pbmF0ZWQgcmVxdWVzdCBvYmplY3QuCisqIEB0YXNrOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgbGlic2FzIEkvTyByZXF1ZXN0LgorKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVxdWVzdF9jbGVhbnVwX2NvbXBsZXRlZF9sb2l0ZXJlcigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICAgICAgICAgICppc2NpX2hvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAgICAgICAqaXNjaV9yZXF1ZXN0LAorCXN0cnVjdCBzYXNfdGFzayAgICAgICAgICAgKnRhc2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlPSVwLCByZXF1ZXN0PSVwLCB0YXNrPSVwXG4iLAorCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UsIGlzY2lfcmVxdWVzdCwgdGFzayk7CisKKwlpZiAodGFzayAhPSBOVUxMKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQl0YXNrLT5sbGRkX3Rhc2sgPSBOVUxMOworCisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX05FRURfREVWX1JFU0VUOworCisJCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOworCisJCS8qIElmIHRoaXMgdGFzayBpcyBub3QgaW4gdGhlIGFib3J0IHBhdGgsIGNhbGwgdGFza19kb25lLiAqLworCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQl0YXNrLT50YXNrX2RvbmUodGFzayk7CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKGlzY2lfcmVxdWVzdCAhPSBOVUxMKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbF9pbml0KCZpc2NpX3JlcXVlc3QtPmRldl9ub2RlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qKgorICogaXNjaV90ZXJtaW5hdGVfcmVxdWVzdF9jb3JlKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgdGVybWluYXRlIHRoZSBnaXZlbgorICogICAgcmVxdWVzdCwgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgY2FsbGVkCisgKiAgICBmcm9tIGEgdGhyZWFkIHRoYXQgY2FuIHdhaXQuICBOb3RlIHRoYXQgdGhlIHJlcXVlc3QgaXMgdGVybWluYXRlZCBhbmQKKyAqICAgIGNvbXBsZXRlZCAoYmFjayB0byB0aGUgaG9zdCwgaWYgc3RhcnRlZCB0aGVyZSkuCisgKiBAaWhvc3Q6IFRoaXMgU0NVLgorICogQGlkZXY6IFRoZSB0YXJnZXQuCisgKiBAaXNjaV9yZXF1ZXN0OiBUaGUgSS9PIHJlcXVlc3QgdG8gYmUgdGVybWluYXRlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV9yZXF1ZXN0KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgICAgICA9IFNDSV9TVUNDRVNTOworCWJvb2wgd2FzX3Rlcm1pbmF0ZWQgICAgICAgICA9IGZhbHNlOworCWJvb2wgbmVlZHNfY2xlYW51cF9oYW5kbGluZyA9IGZhbHNlOworCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyByZXF1ZXN0X3N0YXR1czsKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKwl1bnNpZ25lZCBsb25nICAgICB0ZXJtaW5hdGlvbl9jb21wbGV0ZWQgPSAxOworCXN0cnVjdCBjb21wbGV0aW9uICppb19yZXF1ZXN0X2NvbXBsZXRpb247CisJc3RydWN0IHNhc190YXNrICAgKnRhc2s7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGRldmljZSA9ICVwOyByZXF1ZXN0ID0gJXBcbiIsCisJCV9fZnVuY19fLCBpZGV2LCBpc2NpX3JlcXVlc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlvX3JlcXVlc3RfY29tcGxldGlvbiA9IGlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uOworCisJdGFzayA9IChpc2NpX3JlcXVlc3QtPnR0eXBlID09IGlvX3Rhc2spCisJCT8gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlzY2lfcmVxdWVzdCkKKwkJOiBOVUxMOworCisJLyogTm90ZSB0aGF0IHdlIGFyZSBub3QgZ29pbmcgdG8gY29udHJvbAorCSAqIHRoZSB0YXJnZXQgdG8gYWJvcnQgdGhlIHJlcXVlc3QuCisJICovCisJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJmlzY2lfcmVxdWVzdC0+ZmxhZ3MpOworCisJLyogTWFrZSBzdXJlIHRoZSByZXF1ZXN0IHdhc24ndCBqdXN0IHNpdHRpbmcgYXJvdW5kIHNpZ25hbGxpbmcKKwkgKiBkZXZpY2UgY29uZGl0aW9uIChpZiB0aGUgcmVxdWVzdCBoYW5kbGUgaXMgTlVMTCwgdGhlbiB0aGUKKwkgKiByZXF1ZXN0IGNvbXBsZXRlZCBidXQgbmVlZGVkIGFkZGl0aW9uYWwgaGFuZGxpbmcgaGVyZSkuCisJICovCisJaWYgKCF0ZXN0X2JpdChJUkVRX1RFUk1JTkFURUQsICZpc2NpX3JlcXVlc3QtPmZsYWdzKSkgeworCQl3YXNfdGVybWluYXRlZCA9IHRydWU7CisJCW5lZWRzX2NsZWFudXBfaGFuZGxpbmcgPSB0cnVlOworCQlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChpaG9zdCwKKwkJCQkJCQkgICBpZGV2LAorCQkJCQkJCSAgIGlzY2lfcmVxdWVzdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogVGhlIG9ubHkgdGltZSB0aGUgcmVxdWVzdCB0byB0ZXJtaW5hdGUgd2lsbAorCSAqIGZhaWwgaXMgd2hlbiB0aGUgaW8gcmVxdWVzdCBpcyBjb21wbGV0ZWQgYW5kCisJICogYmVpbmcgYWJvcnRlZC4KKwkgKi8KKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0IgorCQkJIiByZXR1cm5lZCA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKworCQlpc2NpX3JlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbiA9IE5VTEw7CisKKwl9IGVsc2UgeworCQlpZiAod2FzX3Rlcm1pbmF0ZWQpIHsKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBiZWZvcmUgY29tcGxldGlvbiB3YWl0ICglcC8lcClcbiIsCisJCQkJX19mdW5jX18sIGlzY2lfcmVxdWVzdCwgaW9fcmVxdWVzdF9jb21wbGV0aW9uKTsKKworCQkJLyogV2FpdCBoZXJlIGZvciB0aGUgcmVxdWVzdCB0byBjb21wbGV0ZS4gKi8KKwkJCSNkZWZpbmUgVEVSTUlOQVRJT05fVElNRU9VVF9NU0VDIDUwMAorCQkJdGVybWluYXRpb25fY29tcGxldGVkCisJCQkJPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCisJCQkJICAgaW9fcmVxdWVzdF9jb21wbGV0aW9uLAorCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoVEVSTUlOQVRJT05fVElNRU9VVF9NU0VDKSk7CisKKwkJCWlmICghdGVybWluYXRpb25fY29tcGxldGVkKSB7CisKKwkJCQkvKiBUaGUgcmVxdWVzdCB0byB0ZXJtaW5hdGUgaGFzIHRpbWVkIG91dC4gICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssCisJCQkJCQkgIGZsYWdzKTsKKworCQkJCS8qIENoZWNrIGZvciBzdGF0ZSBjaGFuZ2VzLiAqLworCQkJCWlmICghdGVzdF9iaXQoSVJFUV9URVJNSU5BVEVELCAmaXNjaV9yZXF1ZXN0LT5mbGFncykpIHsKKworCQkJCQkvKiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXMgdG8gaGF2ZSB0aGUKKwkJCQkJICogcmVxdWVzdCBkaWUgYSBzaWxlbnQgZGVhdGggaWYgaXQKKwkJCQkJICogZXZlciByZWFsbHkgY29tcGxldGVzLgorCQkJCQkgKgorCQkJCQkgKiBTZXQgdGhlIHJlcXVlc3Qgc3RhdGUgdG8gImRlYWQiLAorCQkJCQkgKiBhbmQgY2xlYXIgdGhlIHRhc2sgcG9pbnRlciBzbyB0aGF0CisJCQkJCSAqIGFuIGFjdHVhbCBjb21wbGV0aW9uIGV2ZW50IGNhbGxiYWNrCisJCQkJCSAqIGRvZXNuJ3QgZG8gYW55dGhpbmcuCisJCQkJCSAqLworCQkJCQlpc2NpX3JlcXVlc3QtPnN0YXR1cyA9IGRlYWQ7CisJCQkJCWlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uCisJCQkJCQk9IE5VTEw7CisKKwkJCQkJaWYgKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykgeworCisJCQkJCQkvKiBCcmVhayBsaW5rcyB3aXRoIHRoZQorCQkJCQkJKiBzYXNfdGFzay4KKwkJCQkJCSovCisJCQkJCQlpc2NpX3JlcXVlc3QtPnR0eXBlX3B0ci5pb190YXNrX3B0cgorCQkJCQkJCT0gTlVMTDsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQl0ZXJtaW5hdGlvbl9jb21wbGV0ZWQgPSAxOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywKKwkJCQkJCSAgICAgICBmbGFncyk7CisKKwkJCQlpZiAoIXRlcm1pbmF0aW9uX2NvbXBsZXRlZCkgeworCisJCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCQkiJXM6ICoqKiBUaW1lb3V0IHdhaXRpbmcgZm9yICIKKwkJCQkJCSJ0ZXJtaW5hdGlvbiglcC8lcClcbiIsCisJCQkJCQlfX2Z1bmNfXywgaW9fcmVxdWVzdF9jb21wbGV0aW9uLAorCQkJCQkJaXNjaV9yZXF1ZXN0KTsKKworCQkJCQkvKiBUaGUgcmVxdWVzdCBjYW4gbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQKKwkJCQkJICogc2FmZWx5IHNpbmNlIGl0IG1heSBnbyBhd2F5IGlmIHRoZQorCQkJCQkgKiB0ZXJtaW5hdGlvbiBldmVyeSByZWFsbHkgZG9lcyBjb21wbGV0ZS4KKwkJCQkJICovCisJCQkJCWlzY2lfcmVxdWVzdCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJaWYgKHRlcm1pbmF0aW9uX2NvbXBsZXRlZCkKKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IGFmdGVyIGNvbXBsZXRpb24gd2FpdCAoJXAvJXApXG4iLAorCQkJCQlfX2Z1bmNfXywgaXNjaV9yZXF1ZXN0LCBpb19yZXF1ZXN0X2NvbXBsZXRpb24pOworCQl9CisKKwkJaWYgKHRlcm1pbmF0aW9uX2NvbXBsZXRlZCkgeworCisJCQlpc2NpX3JlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbiA9IE5VTEw7CisKKwkJCS8qIFBlZWsgYXQgdGhlIHN0YXR1cyBvZiB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCB0ZWxsCisJCQkgKiB1cyBpZiB0aGVyZSB3YXMgc3BlY2lhbCBoYW5kbGluZyBvbiB0aGUgcmVxdWVzdCBzdWNoIHRoYXQgaXQKKwkJCSAqIG5lZWRzIHRvIGJlIGRldGFjaGVkIGFuZCBmcmVlZCBoZXJlLgorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9yZXF1ZXN0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQlyZXF1ZXN0X3N0YXR1cyA9IGlzY2lfcmVxdWVzdC0+c3RhdHVzOworCisJCQlpZiAoKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykgLyogVE1GcyBhcmUgaW4gdGhlaXIgb3duIHRocmVhZCAqLworCQkJICAgICYmICgocmVxdWVzdF9zdGF0dXMgPT0gYWJvcnRlZCkKKwkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gYWJvcnRpbmcpCisJCQkJfHwgKHJlcXVlc3Rfc3RhdHVzID09IHRlcm1pbmF0aW5nKQorCQkJCXx8IChyZXF1ZXN0X3N0YXR1cyA9PSBjb21wbGV0ZWQpCisJCQkJfHwgKHJlcXVlc3Rfc3RhdHVzID09IGRlYWQpCisJCQkJKQorCQkJICAgICkgeworCisJCQkJLyogVGhlIGNvbXBsZXRpb24gcm91dGluZSB3b24ndCBmcmVlIGEgcmVxdWVzdCBpbgorCQkJCSAqIHRoZSBhYm9ydGVkL2Fib3J0aW5nL2V0Yy4gc3RhdGVzLCBzbyB3ZSBkbworCQkJCSAqIGl0IGhlcmUuCisJCQkJICovCisJCQkJbmVlZHNfY2xlYW51cF9oYW5kbGluZyA9IHRydWU7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCQl9CisJCWlmIChuZWVkc19jbGVhbnVwX2hhbmRsaW5nKQorCQkJaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKAorCQkJCWlob3N0LCBpZGV2LCBpc2NpX3JlcXVlc3QsIHRhc2spOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBhbGwgb2YgdGhlCisgKiAgICByZXF1ZXN0cyBvbiB0aGUgZ2l2ZW4gZGV2aWNlJ3Mgc3RhdGUgdG8gImFib3J0aW5nIiwgd2lsbCB0ZXJtaW5hdGUgdGhlCisgKiAgICByZXF1ZXN0cywgYW5kIHdhaXQgZm9yIHRoZW0gdG8gY29tcGxldGUuICBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZQorICogICAgY2FsbGVkIGZyb20gYSB0aHJlYWQgdGhhdCBjYW4gd2FpdC4gIE5vdGUgdGhhdCB0aGUgcmVxdWVzdHMgYXJlIGFsbAorICogICAgdGVybWluYXRlZCBhbmQgY29tcGxldGVkIChiYWNrIHRvIHRoZSBob3N0LCBpZiBzdGFydGVkIHRoZXJlKS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyBTQ1UuCisgKiBAaWRldjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSB0YXJnZXQuCisgKgorICovCit2b2lkIGlzY2lfdGVybWluYXRlX3BlbmRpbmdfcmVxdWVzdHMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBjb21wbGV0aW9uIHJlcXVlc3RfY29tcGxldGlvbjsKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgb2xkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGxpc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZpZGV2LT5yZXFzX2luX3Byb2Nlc3MsICZsaXN0KTsKKworCS8qIGFzc3VtZXMgdGhhdCBpc2NpX3Rlcm1pbmF0ZV9yZXF1ZXN0X2NvcmUgZGVsZXRlcyBmcm9tIHRoZSBsaXN0ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgeworCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHR5cGVvZigqaXJlcSksIGRldl9ub2RlKTsKKworCQkvKiBDaGFuZ2Ugc3RhdGUgdG8gInRlcm1pbmF0aW5nIiBpZiBpdCBpcyBjdXJyZW50bHkKKwkJICogInN0YXJ0ZWQiLgorCQkgKi8KKwkJb2xkX3N0YXRlID0gaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX25ld3N0YXRlKGlyZXEsCisJCQkJCQkJCSAgICAmcmVxdWVzdF9jb21wbGV0aW9uLAorCQkJCQkJCQkgICAgdGVybWluYXRpbmcpOworCQlzd2l0Y2ggKG9sZF9zdGF0ZSkgeworCQljYXNlIHN0YXJ0ZWQ6CisJCWNhc2UgY29tcGxldGVkOgorCQljYXNlIGFib3J0aW5nOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB0ZXJtaW5hdGlvbiBpbiBwcm9ncmVzcywgb3Igb3RoZXJ3aXNlIGRpc3Bvc2l0aW9uZWQuCisJCQkgKiBXZSBrbm93IHRoZSByZXF1ZXN0IHdhcyBvbiAnbGlzdCcgc28gc2hvdWxkIGJlIHNhZmUKKwkJCSAqIHRvIG1vdmUgaXQgYmFjayB0byByZXFzX2luX3Byb2Nlc3MKKwkJCSAqLworCQkJbGlzdF9tb3ZlKCZpcmVxLT5kZXZfbm9kZSwgJmlkZXYtPnJlcXNfaW5fcHJvY2Vzcyk7CisJCQlpcmVxID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFpcmVxKQorCQkJY29udGludWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQlpbml0X2NvbXBsZXRpb24oJnJlcXVlc3RfY29tcGxldGlvbik7CisKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IGlkZXY9JXAgcmVxdWVzdD0lcDsgdGFzaz0lcCBvbGRfc3RhdGU9JWRcbiIsCisJCQkgX19mdW5jX18sIGlkZXYsIGlyZXEsCisJCQlpcmVxLT50dHlwZSA9PSBpb190YXNrID8gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpIDogTlVMTCwKKwkJCW9sZF9zdGF0ZSk7CisKKwkJLyogSWYgdGhlIG9sZF9zdGF0ZSBpcyBzdGFydGVkOgorCQkgKiBUaGlzIHJlcXVlc3Qgd2FzIG5vdCBhbHJlYWR5IGJlaW5nIGFib3J0ZWQuIElmIGl0IGhhZCBiZWVuLAorCQkgKiB0aGVuIHRoZSBhYm9ydGluZyBJL08gKGllLiB0aGUgVE1GIHJlcXVlc3QpIHdvdWxkIG5vdCBiZSBpbgorCQkgKiB0aGUgYWJvcnRpbmcgc3RhdGUsIGFuZCB0aHVzIHdvdWxkIGJlIHRlcm1pbmF0ZWQgaGVyZS4gIE5vdGUKKwkJICogdGhhdCBzaW5jZSB0aGUgVE1GIGNvbXBsZXRpb24ncyBjYWxsIHRvIHRoZSBrZXJuZWwgZnVuY3Rpb24KKwkJICogImNvbXBsZXRlKCkiIGRvZXMgbm90IGhhcHBlbiB1bnRpbCB0aGUgcGVuZGluZyBJL08gcmVxdWVzdAorCQkgKiB0ZXJtaW5hdGUgZnVsbHkgY29tcGxldGVzLCB3ZSBkbyBub3QgaGF2ZSB0byBpbXBsZW1lbnQgYQorCQkgKiBzcGVjaWFsIHdhaXQgaGVyZSBmb3IgYWxyZWFkeSBhYm9ydGluZyByZXF1ZXN0cyAtIHRoZQorCQkgKiB0ZXJtaW5hdGlvbiBvZiB0aGUgVE1GIHJlcXVlc3Qgd2lsbCBmb3JjZSB0aGUgcmVxdWVzdAorCQkgKiB0byBmaW5pc2ggaXQncyBhbHJlYWR5IHN0YXJ0ZWQgdGVybWluYXRlLgorCQkgKgorCQkgKiBJZiBvbGRfc3RhdGUgPT0gY29tcGxldGVkOgorCQkgKiBUaGlzIHJlcXVlc3QgY29tcGxldGVkIGZyb20gdGhlIFNDVSBoYXJkd2FyZSBwZXJzcGVjdGl2ZQorCQkgKiBhbmQgbm93IGp1c3QgbmVlZHMgY2xlYW5pbmcgdXAgaW4gdGVybXMgb2YgZnJlZWluZyB0aGUKKwkJICogcmVxdWVzdCBhbmQgcG90ZW50aWFsbHkgY2FsbGluZyB1cCB0byBsaWJzYXMuCisJCSAqCisJCSAqIElmIG9sZF9zdGF0ZSA9PSBhYm9ydGluZzoKKwkJICogVGhpcyByZXF1ZXN0IGhhcyBhbHJlYWR5IGdvbmUgdGhyb3VnaCBhIFRNRiB0aW1lb3V0LCBidXQgbWF5CisJCSAqIG5vdCBoYXZlIGJlZW4gdGVybWluYXRlZDsgbmVlZHMgY2xlYW5pbmcgdXAgYXQgbGVhc3QuCisJCSAqLworCQlpc2NpX3Rlcm1pbmF0ZV9yZXF1ZXN0X2NvcmUoaWhvc3QsIGlkZXYsIGlyZXEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogaXNjaV90YXNrX3NlbmRfbHVfcmVzZXRfc2FzKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBvZiB0aGUgU0FTIERvbWFpbgorICogICAgVGVtcGxhdGUgZnVuY3Rpb25zLgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4gdG8gYmUgcmVzZXQuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGlzY2lfdGFza19zZW5kX2x1X3Jlc2V0X3NhcygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UsCisJdTggKmx1bikKK3sKKwlzdHJ1Y3QgaXNjaV90bWYgdG1mOworCWludCByZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfaG9zdCA9ICVwLCBpc2NpX2RldmljZSA9ICVwXG4iLAorCQlfX2Z1bmNfXywgaXNjaV9ob3N0LCBpc2NpX2RldmljZSk7CisJLyogU2VuZCB0aGUgTFVOIHJlc2V0IHRvIHRoZSB0YXJnZXQuICBCeSB0aGUgdGltZSB0aGUgY2FsbCByZXR1cm5zLAorCSAqIHRoZSBUTUYgaGFzIGZ1bGx5IGV4ZWN0ZWQgaW4gdGhlIHRhcmdldCAoaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuCisJICogdmFsdWUgaXMgIlRNRl9SRVNQX0ZVTkNfQ09NUExFVEUiLCBvciB0aGUgcmVxdWVzdCB0aW1lZC1vdXQgKG9yCisJICogd2FzIG90aGVyd2lzZSB1bmFibGUgdG8gYmUgZXhlY3V0ZWQgKCJUTUZfUkVTUF9GVU5DX0ZBSUxFRCIpLgorCSAqLworCWlzY2lfdGFza19idWlsZF90bWYoJnRtZiwgaXNjaV90bWZfc3NwX2x1bl9yZXNldCwgTlVMTCwgTlVMTCk7CisKKwkjZGVmaW5lIElTQ0lfTFVfUkVTRVRfVElNRU9VVF9NUyAyMDAwIC8qIDIgc2Vjb25kIHRpbWVvdXQuICovCisJcmV0ID0gaXNjaV90YXNrX2V4ZWN1dGVfdG1mKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsICZ0bWYsIElTQ0lfTFVfUkVTRVRfVElNRU9VVF9NUyk7CisKKwlpZiAocmV0ID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiAlcDogVE1GX0xVX1JFU0VUIHBhc3NlZFxuIiwKKwkJCV9fZnVuY19fLCBpc2NpX2RldmljZSk7CisJZWxzZQorCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogJXA6IFRNRl9MVV9SRVNFVCBmYWlsZWQgKCV4KVxuIiwKKwkJCV9fZnVuY19fLCBpc2NpX2RldmljZSwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNjaV90YXNrX3NlbmRfbHVfcmVzZXRfc2F0YShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwgdTggKmx1bikKK3sKKwlpbnQgcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJc3RydWN0IGlzY2lfdG1mIHRtZjsKKworCS8qIFNlbmQgdGhlIHNvZnQgcmVzZXQgdG8gdGhlIHRhcmdldCAqLworCSNkZWZpbmUgSVNDSV9TUlNUX1RJTUVPVVRfTVMgMjUwMDAgLyogMjUgc2Vjb25kIHRpbWVvdXQuICovCisJaXNjaV90YXNrX2J1aWxkX3RtZigmdG1mLCBpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCwgTlVMTCwgTlVMTCk7CisKKwlyZXQgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoaWhvc3QsIGlkZXYsICZ0bWYsIElTQ0lfU1JTVF9USU1FT1VUX01TKTsKKworCWlmIChyZXQgIT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogQXNzZXJ0IFNSU1QgZmFpbGVkICglcCkgPSAleCIsCisJCQkgX19mdW5jX18sIGlkZXYsIHJldCk7CisKKwkJLyogUmV0dXJuIHRoZSBmYWlsdXJlIHNvIHRoYXQgdGhlIExVTiByZXNldCBpcyBlc2NhbGF0ZWQKKwkJICogdG8gYSB0YXJnZXQgcmVzZXQuCisJCSAqLworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlzY2lfdGFza19sdV9yZXNldCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBvbmUgb2YgdGhlIFRhc2sgTWFuYWdlbWVudCBmdW5jdG9pbnMgY2FsbGVkIGJ5IGxpYnNhcywKKyAqICAgIHRvIHJlc2V0IHRoZSBnaXZlbiBsdW4uIE5vdGUgdGhlIGFzc3VtcHRpb24gdGhhdCB3aGlsZSB0aGlzIGNhbGwgaXMKKyAqICAgIGV4ZWN1dGluZywgbm8gSS9PIHdpbGwgYmUgc2VudCBieSB0aGUgaG9zdCB0byB0aGUgZGV2aWNlLgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4gdG8gYmUgcmVzZXQuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2x1X3Jlc2V0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2aWNlLCB1OCAqbHVuKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCA9IGRldl90b19paG9zdChkb21haW5fZGV2aWNlKTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpc2NpX2RldmljZSA9IGlzY2lfbG9va3VwX2RldmljZShkb21haW5fZGV2aWNlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogZG9tYWluX2RldmljZT0lcCwgaXNjaV9ob3N0PSVwOyBpc2NpX2RldmljZT0lcFxuIiwKKwkJIF9fZnVuY19fLCBkb21haW5fZGV2aWNlLCBpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKworCWlmIChpc2NpX2RldmljZSkKKwkJc2V0X2JpdChJREVWX0VILCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKKworCS8qIElmIHRoZXJlIGlzIGEgZGV2aWNlIHJlc2V0IHBlbmRpbmcgb24gYW55IHJlcXVlc3QgaW4gdGhlCisJICogZGV2aWNlJ3MgbGlzdCwgZmFpbCB0aGlzIExVTiByZXNldCByZXF1ZXN0IGluIG9yZGVyIHRvCisJICogZXNjYWxhdGUgdG8gdGhlIGRldmljZSByZXNldC4KKwkgKi8KKwlpZiAoIWlzY2lfZGV2aWNlIHx8CisJICAgIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoaXNjaV9ob3N0LCBpc2NpX2RldmljZSkpIHsKKwkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBObyBkZXYgKCVwKSwgb3IgIgorCQkJICJSRVNFVCBQRU5ESU5HOiBkb21haW5fZGV2aWNlPSVwXG4iLAorCQkJIF9fZnVuY19fLCBpc2NpX2RldmljZSwgZG9tYWluX2RldmljZSk7CisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZW5kIHRoZSB0YXNrIG1hbmFnZW1lbnQgcGFydCBvZiB0aGUgcmVzZXQuICovCisJaWYgKHNhc19wcm90b2NvbF9hdGEoZG9tYWluX2RldmljZS0+dHByb3RvKSkgeworCQlyZXQgPSBpc2NpX3Rhc2tfc2VuZF9sdV9yZXNldF9zYXRhKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsIGx1bik7CisJfSBlbHNlCisJCXJldCA9IGlzY2lfdGFza19zZW5kX2x1X3Jlc2V0X3Nhcyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlLCBsdW4pOworCisJLyogSWYgdGhlIExVTiByZXNldCB3b3JrZWQsIGFsbCB0aGUgSS9PIGNhbiBub3cgYmUgdGVybWluYXRlZC4gKi8KKwlpZiAocmV0ID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpCisJCS8qIFRlcm1pbmF0ZSBhbGwgSS9PIG5vdy4gKi8KKwkJaXNjaV90ZXJtaW5hdGVfcGVuZGluZ19yZXF1ZXN0cyhpc2NpX2hvc3QsCisJCQkJCQlpc2NpX2RldmljZSk7CisKKyBvdXQ6CisJaXNjaV9wdXRfZGV2aWNlKGlzY2lfZGV2aWNlKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCSBpbnQgKCpsbGRkX2NsZWFyX25leHVzX3BvcnQpKHN0cnVjdCBhc2Rfc2FzX3BvcnQgKik7ICovCitpbnQgaXNjaV90YXNrX2NsZWFyX25leHVzX3BvcnQoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7Cit9CisKKworCitpbnQgaXNjaV90YXNrX2NsZWFyX25leHVzX2hhKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpoYSkKK3sKKwlyZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7Cit9CisKKy8qIFRhc2sgTWFuYWdlbWVudCBGdW5jdGlvbnMuIE11c3QgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LgkgKi8KKworLyoqCisgKiBpc2NpX2Fib3J0X3Rhc2tfcHJvY2Vzc19jYigpIC0gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGFib3J0IHRhc2sKKyAqICAgIFRNRiBjb21tYW5kLiAgSXQgbWFuYWdlcyB0aGUgcmVxdWVzdCBzdGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN1Y2Nlc3NmdWwKKyAqICAgIHRyYW5zbWlzc2lvbiAvIGNvbXBsZXRpb24gb2YgdGhlIGFib3J0IHRhc2sgcmVxdWVzdC4KKyAqIEBjYl9zdGF0ZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZW4gdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIC0gYWZ0ZXIKKyAqICAgIHRoZSBUTUYgcmVxdWVzdCBoYXMgYmVlbiBzdGFydGVkIGFuZCBhZnRlciBpdCBoYXMgdGltZWQtb3V0LgorICogQHRtZjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBUTUYgaW4gcHJvZ3Jlc3MuCisgKgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9hYm9ydF90YXNrX3Byb2Nlc3NfY2IoCisJZW51bSBpc2NpX3RtZl9jYl9zdGF0ZSBjYl9zdGF0ZSwKKwlzdHJ1Y3QgaXNjaV90bWYgKnRtZiwKKwl2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKm9sZF9yZXF1ZXN0OworCisJb2xkX3JlcXVlc3QgPSAoc3RydWN0IGlzY2lfcmVxdWVzdCAqKWNiX2RhdGE7CisKKwlkZXZfZGJnKCZvbGRfcmVxdWVzdC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogdG1mPSVwLCBvbGRfcmVxdWVzdD0lcFxuIiwKKwkJX19mdW5jX18sIHRtZiwgb2xkX3JlcXVlc3QpOworCisJc3dpdGNoIChjYl9zdGF0ZSkgeworCisJY2FzZSBpc2NpX3RtZl9zdGFydGVkOgorCQkvKiBUaGUgVE1GIGhhcyBiZWVuIHN0YXJ0ZWQuICBOb3RoaW5nIHRvIGRvIGhlcmUsIHNpbmNlIHRoZQorCQkgKiByZXF1ZXN0IHN0YXRlIHdhcyBhbHJlYWR5IHNldCB0byAiYWJvcnRlZCIgYnkgdGhlIGFib3J0CisJCSAqIHRhc2sgZnVuY3Rpb24uCisJCSAqLworCQlpZiAoKG9sZF9yZXF1ZXN0LT5zdGF0dXMgIT0gYWJvcnRlZCkKKwkJCSYmIChvbGRfcmVxdWVzdC0+c3RhdHVzICE9IGNvbXBsZXRlZCkpCisJCQlkZXZfZGJnKCZvbGRfcmVxdWVzdC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBCYWQgcmVxdWVzdCBzdGF0dXMgKCVkKTogdG1mPSVwLCBvbGRfcmVxdWVzdD0lcFxuIiwKKwkJCQlfX2Z1bmNfXywgb2xkX3JlcXVlc3QtPnN0YXR1cywgdG1mLCBvbGRfcmVxdWVzdCk7CisJCWJyZWFrOworCisJY2FzZSBpc2NpX3RtZl90aW1lZF9vdXQ6CisKKwkJLyogU2V0IHRoZSB0YXNrJ3Mgc3RhdGUgdG8gImFib3J0aW5nIiwgc2luY2UgdGhlIGFib3J0IHRhc2sKKwkJICogZnVuY3Rpb24gdGhyZWFkIHNldCBpdCB0byAiYWJvcnRlZCIgKGFib3ZlKSBpbiBhbnRpY2lwYXRpb24KKwkJICogb2YgdGhlIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IHdvcmtpbmcgY29ycmVjdGx5LiAgU2luY2UgdGhlCisJCSAqIHRpbWVvdXQgaGFzIG5vdyBmaXJlZCwgdGhlIFRNRiByZXF1ZXN0IGZhaWxlZC4gIFdlIHNldCB0aGUKKwkJICogc3RhdGUgc3VjaCB0aGF0IHRoZSByZXF1ZXN0IGNvbXBsZXRpb24gd2lsbCBpbmRpY2F0ZSB0aGUKKwkJICogZGV2aWNlIGlzIG5vIGxvbmdlciBwcmVzZW50LgorCQkgKi8KKwkJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShvbGRfcmVxdWVzdCwgYWJvcnRpbmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJm9sZF9yZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogQmFkIGNiX3N0YXRlICglZCk6IHRtZj0lcCwgb2xkX3JlcXVlc3Q9JXBcbiIsCisJCQlfX2Z1bmNfXywgY2Jfc3RhdGUsIHRtZiwgb2xkX3JlcXVlc3QpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaXNjaV90YXNrX2Fib3J0X3Rhc2soKSAtIFRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSBTQVMgRG9tYWluIFRlbXBsYXRlCisgKiAgICBmdW5jdGlvbnMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpYnNhcyB0byBhYm9ydCBhIHNwZWNpZmllZCB0YXNrLgorICogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgU0FTIHRhc2sgdG8gYWJvcnQuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2Fib3J0X3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCA9IGRldl90b19paG9zdCh0YXNrLT5kZXYpOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGFib3J0ZWRfaW9fY29tcGxldGlvbik7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAgICAgICAqb2xkX3JlcXVlc3QgPSBOVUxMOworCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyAgb2xkX3N0YXRlOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgaXNjaV90bWYgICAgICAgICAgIHRtZjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgZmxhZ3M7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICBhbnlfZGV2X3Jlc2V0ID0gZmFsc2U7CisKKwkvKiBHZXQgdGhlIGlzY2lfcmVxdWVzdCByZWZlcmVuY2UgZnJvbSB0aGUgdGFzay4gIE5vdGUgdGhhdAorCSAqIHRoaXMgY2hlY2sgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBwZW5kaW5nIHJlcXVlc3QgbGlzdAorCSAqIGluIHRoZSBkZXZpY2UsIGJlY2F1c2UgdGFza3MgZHJpdmluZyByZXNldHMgbWF5IGxhbmQgaGVyZQorCSAqIGFmdGVyIGNvbXBsZXRpb24gaW4gdGhlIGNvcmUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCisJb2xkX3JlcXVlc3QgPSB0YXNrLT5sbGRkX3Rhc2s7CisKKwkvKiBJZiB0YXNrIGlzIGFscmVhZHkgZG9uZSwgdGhlIHJlcXVlc3QgaXNuJ3QgdmFsaWQgKi8KKwlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkgJiYKKwkgICAgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19BVF9JTklUSUFUT1IpICYmCisJICAgIG9sZF9yZXF1ZXN0KQorCQlpc2NpX2RldmljZSA9IGlzY2lfbG9va3VwX2RldmljZSh0YXNrLT5kZXYpOworCisJc3Bpbl91bmxvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHRhc2sgPSAlcFxuIiwgX19mdW5jX18sIHRhc2spOworCisJaWYgKCFpc2NpX2RldmljZSB8fCAhb2xkX3JlcXVlc3QpCisJCWdvdG8gb3V0OworCisJc2V0X2JpdChJREVWX0VILCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKKworCS8qIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIHdpbGwgZmFpbCBhYm9ydCByZXF1ZXN0cyBmb3IKKwkgKiBTQVRBL1NUUC4gIEZhaWxpbmcgdGhlIGFib3J0IHJlcXVlc3QgdGhpcyB3YXkgd2lsbCBjYXVzZSB0aGUKKwkgKiBTQ1NJIGVycm9yIGhhbmRsZXIgdGhyZWFkIHRvIGVzY2FsYXRlIHRvIExVTiByZXNldAorCSAqLworCWlmIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKSB7CisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJICAgICIgdGFzayAlcCBpcyBmb3IgYSBTVFAvU0FUQSBkZXZpY2U7IgorCQkJICAgICIgcmV0dXJuaW5nIFRNRl9SRVNQX0ZVTkNfRkFJTEVEXG4iCisJCQkgICAgIiB0byBjYXVzZSBhIExVTiByZXNldC4uLlxuIiwgdGFzayk7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IG9sZF9yZXF1ZXN0ID09ICVwXG4iLCBfX2Z1bmNfXywgb2xkX3JlcXVlc3QpOworCisJYW55X2Rldl9yZXNldCA9IGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoaXNjaV9ob3N0LCBpc2NpX2RldmljZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlhbnlfZGV2X3Jlc2V0ID0gYW55X2Rldl9yZXNldCB8fCAodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX05FRURfREVWX1JFU0VUKTsKKworCS8qIElmIHRoZSBleHRyYWN0aW9uIG9mIHRoZSByZXF1ZXN0IHJlZmVyZW5jZSBmcm9tIHRoZSB0YXNrCisJICogZmFpbGVkLCB0aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNvbXBsZXRlZCAob3IgaWYgdGhlcmUgaXMgYQorCSAqIHBlbmRpbmcgcmVzZXQgdGhlbiB0aGlzIGFib3J0IHJlcXVlc3QgZnVuY3Rpb24gbXVzdCBiZSBmYWlsZWQKKwkgKiBpbiBvcmRlciB0byBlc2NhbGF0ZSB0byB0aGUgdGFyZ2V0IHJlc2V0KS4KKwkgKi8KKwlpZiAoKG9sZF9yZXF1ZXN0ID09IE5VTEwpIHx8IGFueV9kZXZfcmVzZXQpIHsKKworCQkvKiBJZiB0aGUgZGV2aWNlIHJlc2V0IHRhc2sgZmxhZyBpcyBzZXQsIGZhaWwgdGhlIHRhc2sKKwkJICogbWFuYWdlbWVudCByZXF1ZXN0LiAgT3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgcmVxdWVzdAorCQkgKiBoYXMgY29tcGxldGVkLgorCQkgKi8KKwkJaWYgKGFueV9kZXZfcmVzZXQpIHsKKworCQkJLyogVHVybiBvZmYgdGhlIHRhc2sncyBET05FIHRvIG1ha2Ugc3VyZSB0aGlzCisJCQkgKiB0YXNrIGlzIGVzY2FsYXRlZCB0byBhIHRhcmdldCByZXNldC4KKwkJCSAqLworCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfRE9ORTsKKworCQkJLyogTWFrZSB0aGUgcmVzZXQgaGFwcGVuIGFzIHNvb24gYXMgcG9zc2libGUuICovCisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX05FRURfREVWX1JFU0VUOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJLyogRmFpbCB0aGUgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgaW4gb3JkZXIgdG8KKwkJCSAqIGVzY2FsYXRlIHRvIHRoZSB0YXJnZXQgcmVzZXQuCisJCQkgKi8KKwkJCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCisJCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IEZhaWxpbmcgdGFzayBhYm9ydCBpbiBvcmRlciB0byAiCisJCQkJImVzY2FsYXRlIHRvIHRhcmdldCByZXNldCBiZWNhdXNlXG4iCisJCQkJIlNBU19UQVNLX05FRURfREVWX1JFU0VUIGlzIHNldCBmb3IgIgorCQkJCSJ0YXNrICVwIG9uIGRldiAlcFxuIiwKKwkJCQlfX2Z1bmNfXywgdGFzaywgaXNjaV9kZXZpY2UpOworCisKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBhbmQgdGhlcmUKKwkJCSAqIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSBvdGhlciB0aGFuIHRvIHNldCB0aGUgdGFzaworCQkJICogZG9uZSBiaXQsIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZSB0YXNrIGFib3J0IGZ1bmN0aW9uCisJCQkgKiB3YXMgc3VjZXNzZnVsLgorCQkJICovCisJCQlpc2NpX3NldF90YXNrX2RvbmVmbGFncyh0YXNrKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwkJCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisKKwkJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogYWJvcnQgdGFzayBub3QgbmVlZGVkIGZvciAlcFxuIiwKKwkJCQlfX2Z1bmNfXywgdGFzayk7CisJCX0KKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB0aGUgcmVxdWVzdCBzdGF0dXMgYW5kIGNoYW5nZSB0byAiYWJvcnRlZCIgaWYgY3VycmVudGx5CisJICogInN0YXJ0aW5nIjsgaWYgdHJ1ZSB0aGVuIHNldCB0aGUgSS9PIGtlcm5lbCBjb21wbGV0aW9uCisJICogc3RydWN0IHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgcmVxdWVzdCBjb21wbGV0ZXMuCisJICovCisJb2xkX3N0YXRlID0gaXNjaV90YXNrX3ZhbGlkYXRlX3JlcXVlc3RfdG9fYWJvcnQoCisJCQkJb2xkX3JlcXVlc3QsIGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsCisJCQkJJmFib3J0ZWRfaW9fY29tcGxldGlvbik7CisJaWYgKChvbGRfc3RhdGUgIT0gc3RhcnRlZCkgJiYKKwkgICAgKG9sZF9zdGF0ZSAhPSBjb21wbGV0ZWQpICYmCisJICAgIChvbGRfc3RhdGUgIT0gYWJvcnRpbmcpKSB7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQkvKiBUaGUgcmVxdWVzdCB3YXMgYWxyZWFkeSBiZWluZyBoYW5kbGVkIGJ5IHNvbWVvbmUgZWxzZSAoYmVjYXVzZQorCQkqIHRoZXkgZ290IHRvIHNldCB0aGUgc3RhdGUgYXdheSBmcm9tIHN0YXJ0ZWQpLgorCQkqLworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogIGRldmljZSA9ICVwOyBvbGRfcmVxdWVzdCAlcCBhbHJlYWR5IGJlaW5nIGFib3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlzY2lfZGV2aWNlLCBvbGRfcmVxdWVzdCk7CisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QIHx8CisJICAgIHRlc3RfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmb2xkX3JlcXVlc3QtPmZsYWdzKSkgeworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IFNNUCByZXF1ZXN0ICglZCkiCisJCQkiIG9yIGNvbXBsZXRlX2luX3RhcmdldCAoJWQpLCB0aHVzIG5vIFRNRlxuIiwKKwkJCV9fZnVuY19fLCAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSwKKwkJCXRlc3RfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmb2xkX3JlcXVlc3QtPmZsYWdzKSk7CisKKwkJLyogU2V0IHRoZSBzdGF0ZSBvbiB0aGUgdGFzay4gKi8KKwkJaXNjaV90YXNrX2FsbF9kb25lKHRhc2spOworCisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisKKwkJLyogU3RvcHBpbmcgYW5kIFNNUCBkZXZpY2VzIGFyZSBub3Qgc2VudCBhIFRNRiwgYW5kIGFyZSBub3QKKwkJICogcmVzZXQsIGJ1dCB0aGUgb3V0c3RhbmRpbmcgSS9PIHJlcXVlc3QgaXMgdGVybWluYXRlZCBiZWxvdy4KKwkJICovCisJfSBlbHNlIHsKKwkJLyogRmlsbCBpbiB0aGUgdG1mIHN0dWN0dXJlICovCisJCWlzY2lfdGFza19idWlsZF9hYm9ydF90YXNrX3RtZigmdG1mLCBpc2NpX3RtZl9zc3BfdGFza19hYm9ydCwKKwkJCQkJICAgICAgIGlzY2lfYWJvcnRfdGFza19wcm9jZXNzX2NiLAorCQkJCQkgICAgICAgb2xkX3JlcXVlc3QpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJI2RlZmluZSBJU0NJX0FCT1JUX1RBU0tfVElNRU9VVF9NUyA1MDAgLyogaGFsZiBzZWNvbmQgdGltZW91dC4gKi8KKwkJcmV0ID0gaXNjaV90YXNrX2V4ZWN1dGVfdG1mKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsICZ0bWYsCisJCQkJCSAgICBJU0NJX0FCT1JUX1RBU0tfVElNRU9VVF9NUyk7CisKKwkJaWYgKHJldCAhPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKQorCQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBpc2NpX3Rhc2tfc2VuZF90bWYgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwl9CisJaWYgKHJldCA9PSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKSB7CisJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpOworCisJCS8qIENsZWFuIHVwIHRoZSByZXF1ZXN0IG9uIG91ciBzaWRlLCBhbmQgd2FpdCBmb3IgdGhlIGFib3J0ZWQKKwkJICogSS9PIHRvIGNvbXBsZXRlLgorCQkgKi8KKwkJaXNjaV90ZXJtaW5hdGVfcmVxdWVzdF9jb3JlKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsIG9sZF9yZXF1ZXN0KTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgZG8gbm90IGxlYXZlIGEgcmVmZXJlbmNlIHRvIGFib3J0ZWRfaW9fY29tcGxldGlvbiAqLworCW9sZF9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gPSBOVUxMOworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaXNjaV9kZXZpY2UpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXNjaV90YXNrX2Fib3J0X3Rhc2tfc2V0KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIG9uZSBvZiB0aGUgU0FTIERvbWFpbiBUZW1wbGF0ZQorICogICAgZnVuY3Rpb25zLiBUaGlzIGlzIG9uZSBvZiB0aGUgVGFzayBNYW5hZ2VtZW50IGZ1bmN0b2lucyBjYWxsZWQgYnkgbGlic2FzLAorICogICAgdG8gYWJvcnQgYWxsIHRhc2sgZm9yIHRoZSBnaXZlbiBsdW4uCisgKiBAZF9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZG9tYWluIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogICAgcmVxdWVzdC4KKyAqIEBsdW46IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbHVuIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2Fib3J0X3Rhc2tfc2V0KAorCXN0cnVjdCBkb21haW5fZGV2aWNlICpkX2RldmljZSwKKwl1OCAqbHVuKQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworCisvKioKKyAqIGlzY2lfdGFza19jbGVhcl9hY2EoKSAtIFRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSBTQVMgRG9tYWluIFRlbXBsYXRlCisgKiAgICBmdW5jdGlvbnMuIFRoaXMgaXMgb25lIG9mIHRoZSBUYXNrIE1hbmFnZW1lbnQgZnVuY3RvaW5zIGNhbGxlZCBieSBsaWJzYXMuCisgKiBAZF9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZG9tYWluIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogICAgcmVxdWVzdC4KKyAqIEBsdW46IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbHVuCSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfdGFza19jbGVhcl9hY2EoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pCit7CisJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworfQorCisKKworLyoqCisgKiBpc2NpX3Rhc2tfY2xlYXJfdGFza19zZXQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSBTQVMgRG9tYWluIFRlbXBsYXRlCisgKiAgICBmdW5jdGlvbnMuIFRoaXMgaXMgb25lIG9mIHRoZSBUYXNrIE1hbmFnZW1lbnQgZnVuY3RvaW5zIGNhbGxlZCBieSBsaWJzYXMuCisgKiBAZF9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZG9tYWluIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogICAgcmVxdWVzdC4KKyAqIEBsdW46IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbHVuCSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfdGFza19jbGVhcl90YXNrX3NldCgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bikKK3sKKwlyZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7Cit9CisKKworLyoqCisgKiBpc2NpX3Rhc2tfcXVlcnlfdGFzaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCB0byBjYXVzZSBsaWJzYXMgdG8KKyAqICAgIGNvcnJlY3RseSBlc2NhbGF0ZSB0aGUgZmFpbGVkIGFib3J0IHRvIGEgTFVOIG9yIHRhcmdldCByZXNldCAodGhpcyBpcworICogICAgYmVjYXVzZSBzYXNfc2NzaV9maW5kX3Rhc2sgbGlic2FzIGZ1bmN0aW9uIGRvZXMgbm90IGNvcnJlY3RseSBpbnRlcnByZXQKKyAqICAgIGFsbCByZXR1cm4gY29kZXMgZnJvbSB0aGUgYWJvcnQgdGFzayBjYWxsKS4gIFdoZW4gVE1GX1JFU1BfRlVOQ19TVUNDIGlzCisgKiAgICByZXR1cm5lZCwgbGlic2FzIHR1cm5zIHRoaXMgaW50byBhIExVTiByZXNldDsgd2hlbiBGVU5DX0ZBSUxFRCBpcworICogICAgcmV0dXJuZWQsIGxpYnNhcyB3aWxsIHR1cm4gdGhpcyBpbnRvIGEgdGFyZ2V0IHJlc2V0CisgKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzYXMgdGFzayBiZWluZyBxdWVyaWVkLgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfcXVlcnlfdGFzaygKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJLyogU2VlIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBkZXZpY2UgcmVzZXQgZm9yIHRoaXMgZGV2aWNlLiAqLworCWlmICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpCisJCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwllbHNlCisJCXJldHVybiBUTUZfUkVTUF9GVU5DX1NVQ0M7Cit9CisKKy8qCisgKiBpc2NpX3Rhc2tfcmVxdWVzdF9jb21wbGV0ZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNjaSBjb3JlIHdoZW4KKyAqICAgIGFuIHRhc2sgcmVxdWVzdCBjb21wbGV0ZXMuCisgKiBAaWhvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorICogQGlyZXE6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb21wbGV0ZWQgaXNjaV9yZXF1ZXN0IG9iamVjdC4KKyAqIEBjb21wbGV0aW9uX3N0YXR1czogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBmcm9tIHRoZQorICogICAgc2NpIGNvcmUuCisgKgorICogbm9uZS4KKyAqLwordm9pZAoraXNjaV90YXNrX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJICAgZW51bSBzY2lfdGFza19zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJc3RydWN0IGlzY2lfdG1mICp0bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqdG1mX2NvbXBsZXRlOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiByZXF1ZXN0ID0gJXAsIHN0YXR1cz0lZFxuIiwKKwkJX19mdW5jX18sIGlyZXEsIGNvbXBsZXRpb25fc3RhdHVzKTsKKworCWlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoaXJlcSwgY29tcGxldGVkKTsKKworCXRtZi0+c3RhdHVzID0gY29tcGxldGlvbl9zdGF0dXM7CisJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJmlyZXEtPmZsYWdzKTsKKworCWlmICh0bWYtPnByb3RvID09IFNBU19QUk9UT0NPTF9TU1ApIHsKKwkJbWVtY3B5KCZ0bWYtPnJlc3AucmVzcF9pdSwKKwkJICAgICAgICZpcmVxLT5zc3AucnNwLAorCQkgICAgICAgU1NQX1JFU1BfSVVfTUFYX1NJWkUpOworCX0gZWxzZSBpZiAodG1mLT5wcm90byA9PSBTQVNfUFJPVE9DT0xfU0FUQSkgeworCQltZW1jcHkoJnRtZi0+cmVzcC5kMmhfZmlzLAorCQkgICAgICAgJmlyZXEtPnN0cC5yc3AsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2ZpcykpOworCX0KKworCS8qIFBSSU5UX1RNRiggKChzdHJ1Y3QgaXNjaV90bWYgKilyZXF1ZXN0LT50YXNrKSk7ICovCisJdG1mX2NvbXBsZXRlID0gdG1mLT5jb21wbGV0ZTsKKworCXNjaV9jb250cm9sbGVyX2NvbXBsZXRlX2lvKGlob3N0LCBpcmVxLT50YXJnZXRfZGV2aWNlLCBpcmVxKTsKKwkvKiBzZXQgdGhlICd0ZXJtaW5hdGVkJyBmbGFnIGhhbmRsZSB0byBtYWtlIHN1cmUgaXQgY2Fubm90IGJlIHRlcm1pbmF0ZWQKKwkgKiAgb3IgY29tcGxldGVkIGFnYWluLgorCSAqLworCXNldF9iaXQoSVJFUV9URVJNSU5BVEVELCAmaXJlcS0+ZmxhZ3MpOworCisJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCB1bmFsbG9jYXRlZCk7CisJbGlzdF9kZWxfaW5pdCgmaXJlcS0+ZGV2X25vZGUpOworCisJLyogVGhlIHRhc2sgbWFuYWdlbWVudCBwYXJ0IGNvbXBsZXRlcyBsYXN0LiAqLworCWNvbXBsZXRlKHRtZl9jb21wbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfc21wX3Rhc2tfdGltZWRvdXQodW5zaWduZWQgbG9uZyBfdGFzaykKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSAodm9pZCAqKSBfdGFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9BQk9SVEVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJY29tcGxldGUoJnRhc2stPmNvbXBsZXRpb24pOworfQorCitzdGF0aWMgdm9pZCBpc2NpX3NtcF90YXNrX2RvbmUoc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCWlmICghZGVsX3RpbWVyKCZ0YXNrLT50aW1lcikpCisJCXJldHVybjsKKwljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2FzX3Rhc2sgKmlzY2lfYWxsb2NfdGFzayh2b2lkKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGt6YWxsb2Moc2l6ZW9mKCp0YXNrKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAodGFzaykgeworCQlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdCk7CisJCXNwaW5fbG9ja19pbml0KCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzID0gU0FTX1RBU0tfU1RBVEVfUEVORElORzsKKwkJaW5pdF90aW1lcigmdGFzay0+dGltZXIpOworCQlpbml0X2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOworCX0KKworCXJldHVybiB0YXNrOworfQorCitzdGF0aWMgdm9pZCBpc2NpX2ZyZWVfdGFzayhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IHNhc190YXNrICAqdGFzaykKK3sKKwlpZiAodGFzaykgeworCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRhc2stPmxpc3QpKTsKKwkJa2ZyZWUodGFzayk7CisJfQorfQorCitzdGF0aWMgaW50IGlzY2lfc21wX2V4ZWN1dGVfdGFzayhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdm9pZCAqcmVxLAorCQkJCSBpbnQgcmVxX3NpemUsIHZvaWQgKnJlc3AsIGludCByZXNwX3NpemUpCit7CisJaW50IHJlcywgcmV0cnk7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gTlVMTDsKKworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDM7IHJldHJ5KyspIHsKKwkJdGFzayA9IGlzY2lfYWxsb2NfdGFzaygpOworCQlpZiAoIXRhc2spCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQl0YXNrLT5kZXYgPSBkZXY7CisJCXRhc2stPnRhc2tfcHJvdG8gPSBkZXYtPnRwcm90bzsKKwkJc2dfaW5pdF9vbmUoJnRhc2stPnNtcF90YXNrLnNtcF9yZXEsIHJlcSwgcmVxX3NpemUpOworCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3Jlc3AsIHJlc3AsIHJlc3Bfc2l6ZSk7CisKKwkJdGFzay0+dGFza19kb25lID0gaXNjaV9zbXBfdGFza19kb25lOworCisJCXRhc2stPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdGFzazsKKwkJdGFzay0+dGltZXIuZnVuY3Rpb24gPSBpc2NpX3NtcF90YXNrX3RpbWVkb3V0OworCQl0YXNrLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDEwKkhaOworCQlhZGRfdGltZXIoJnRhc2stPnRpbWVyKTsKKworCQlyZXMgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrKHRhc2ssIDEsIEdGUF9LRVJORUwpOworCisJCWlmIChyZXMpIHsKKwkJCWRlbF90aW1lcigmdGFzay0+dGltZXIpOworCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGV4ZWN1dGluZyBTTVAgdGFzayBmYWlsZWQ6JWRcbiIsCisJCQkJX19mdW5jX18sIHJlcyk7CisJCQlnb3RvIGV4X2VycjsKKwkJfQorCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOworCQlyZXMgPSAtRUNPTU07CisJCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7CisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogc21wIHRhc2sgdGltZWQgb3V0IG9yIGFib3J0ZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJaXNjaV90YXNrX2Fib3J0X3Rhc2sodGFzayk7CisJCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkpIHsKKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNNUCB0YXNrIGFib3J0ZWQgYW5kIG5vdCBkb25lXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJZ290byBleF9lcnI7CisJCQl9CisJCX0KKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX1NUQVRfR09PRCkgeworCQkJcmVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCisJCSAgICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FTX0RBVEFfVU5ERVJSVU4pIHsKKwkJCS8qIG5vIGVycm9yLCBidXQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YKKwkJCSogdW5kZXJydW4gKi8KKwkJCXJlcyA9IHRhc2stPnRhc2tfc3RhdHVzLnJlc2lkdWFsOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJICAgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9PVkVSUlVOKSB7CisJCQlyZXMgPSAtRU1TR1NJWkU7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIHRvIGRldiAlMDE2bGx4IHJlc3BvbnNlOiAweCV4ICIKKwkJCQkic3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCVNBU19BRERSKGRldi0+c2FzX2FkZHIpLAorCQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCisJCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCk7CisJCQlpc2NpX2ZyZWVfdGFzayhpaG9zdCwgdGFzayk7CisJCQl0YXNrID0gTlVMTDsKKwkJfQorCX0KK2V4X2VycjoKKwlCVUdfT04ocmV0cnkgPT0gMyAmJiB0YXNrICE9IE5VTEwpOworCWlzY2lfZnJlZV90YXNrKGlob3N0LCB0YXNrKTsKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIERJU0NPVkVSX1JFUV9TSVpFICAxNgorI2RlZmluZSBESVNDT1ZFUl9SRVNQX1NJWkUgNTYKKworaW50IGlzY2lfc21wX2dldF9waHlfYXR0YWNoZWRfZGV2X3R5cGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICAgICAgIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGludCBwaHlfaWQsIGludCAqYWR0KQoreworCXN0cnVjdCBzbXBfcmVzcCAqZGlzY19yZXNwOworCXU4ICpkaXNjX3JlcTsKKwlpbnQgcmVzOworCisJZGlzY19yZXNwID0ga3phbGxvYyhESVNDT1ZFUl9SRVNQX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGlzY19yZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRpc2NfcmVxID0ga3phbGxvYyhESVNDT1ZFUl9SRVFfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRpc2NfcmVxKSB7CisJCWRpc2NfcmVxWzBdID0gU01QX1JFUVVFU1Q7CisJCWRpc2NfcmVxWzFdID0gU01QX0RJU0NPVkVSOworCQlkaXNjX3JlcVs5XSA9IHBoeV9pZDsKKwl9IGVsc2UgeworCQlrZnJlZShkaXNjX3Jlc3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVzID0gaXNjaV9zbXBfZXhlY3V0ZV90YXNrKGlob3N0LCBkZXYsIGRpc2NfcmVxLCBESVNDT1ZFUl9SRVFfU0laRSwKKwkJCQkgICAgZGlzY19yZXNwLCBESVNDT1ZFUl9SRVNQX1NJWkUpOworCWlmICghcmVzKSB7CisJCWlmIChkaXNjX3Jlc3AtPnJlc3VsdCAhPSBTTVBfUkVTUF9GVU5DX0FDQykKKwkJCXJlcyA9IGRpc2NfcmVzcC0+cmVzdWx0OworCQllbHNlCisJCQkqYWR0ID0gZGlzY19yZXNwLT5kaXNjLmF0dGFjaGVkX2Rldl90eXBlOworCX0KKwlrZnJlZShkaXNjX3JlcSk7CisJa2ZyZWUoZGlzY19yZXNwKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfd2FpdF9mb3Jfc21wX3BoeV9yZXNldChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCBpbnQgcGh5X251bSkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPmlzY2lfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5pc2NpX2hvc3Q7CisJaW50IHJlcywgaXRlcmF0aW9uID0gMCwgYXR0YWNoZWRfZGV2aWNlX3R5cGU7CisJI2RlZmluZSBTVFBfV0FJVF9NU0VDUyAyNTAwMAorCXVuc2lnbmVkIGxvbmcgdG1vID0gbXNlY3NfdG9famlmZmllcyhTVFBfV0FJVF9NU0VDUyk7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyB0bW87CisJZW51bSB7CisJCVNNUF9QSFlXQUlUX1BIWURPV04sCisJCVNNUF9QSFlXQUlUX1BIWVVQLAorCQlTTVBfUEhZV0FJVF9ET05FCisJfSBwaHlfc3RhdGUgPSBTTVBfUEhZV0FJVF9QSFlET1dOOworCisJLyogV2hpbGUgdGhlcmUgaXMgdGltZSwgd2FpdCBmb3IgdGhlIHBoeSB0byBnbyBhd2F5IGFuZCBjb21lIGJhY2sgKi8KKwl3aGlsZSAodGltZV9pc19hZnRlcl9qaWZmaWVzKGRlYWRsaW5lKSAmJiBwaHlfc3RhdGUgIT0gU01QX1BIWVdBSVRfRE9ORSkgeworCQlpbnQgZXZlbnQgPSBhdG9taWNfcmVhZCgmaXBvcnQtPmV2ZW50KTsKKworCQkrK2l0ZXJhdGlvbjsKKworCQl0bW8gPSB3YWl0X2V2ZW50X3RpbWVvdXQoaWhvc3QtPmV2ZW50cSwKKwkJCQkJIGV2ZW50ICE9IGF0b21pY19yZWFkKCZpcG9ydC0+ZXZlbnQpIHx8CisJCQkJCSAhdGVzdF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpLAorCQkJCQkgdG1vKTsKKwkJLyogbGluayBkb3duLCBzdG9wIHBvbGxpbmcgKi8KKwkJaWYgKCF0ZXN0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncykpCisJCQlicmVhazsKKworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpcG9ydCAlcCwgaXRlcmF0aW9uICVkLCIKKwkJCSIgcGhhc2UgJWQ6IHRpbWVfcmVtYWluaW5nICVsdSwgYmNucyA9ICVkXG4iLAorCQkJX19mdW5jX18sIGlwb3J0LCBpdGVyYXRpb24sIHBoeV9zdGF0ZSwKKwkJCXRtbywgdGVzdF9iaXQoSVBPUlRfQkNOX1BFTkRJTkcsICZpcG9ydC0+ZmxhZ3MpKTsKKworCQlyZXMgPSBpc2NpX3NtcF9nZXRfcGh5X2F0dGFjaGVkX2Rldl90eXBlKGlob3N0LCBkZXYsIHBoeV9udW0sCisJCQkJCQkJICZhdHRhY2hlZF9kZXZpY2VfdHlwZSk7CisJCXRtbyA9IGRlYWRsaW5lIC0gamlmZmllczsKKworCQlpZiAocmVzKSB7CisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IGl0ZXJhdGlvbiAlZCwgcGhhc2UgJWQ6IgorCQkJCSAiIFNNUCBlcnJvcj0lZCwgdGltZV9yZW1haW5pbmc9JWx1XG4iLAorCQkJCSBfX2Z1bmNfXywgaXRlcmF0aW9uLCBwaHlfc3RhdGUsIHJlcywgdG1vKTsKKwkJCWJyZWFrOworCQl9CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlwb3J0ICVwLCBpdGVyYXRpb24gJWQsIgorCQkJIiBwaGFzZSAlZDogdGltZV9yZW1haW5pbmcgJWx1LCBiY25zID0gJWQsICIKKwkJCSJhdHRkZXZ0eXBlID0gJXhcbiIsCisJCQlfX2Z1bmNfXywgaXBvcnQsIGl0ZXJhdGlvbiwgcGh5X3N0YXRlLAorCQkJdG1vLCB0ZXN0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncyksCisJCQlhdHRhY2hlZF9kZXZpY2VfdHlwZSk7CisKKwkJc3dpdGNoIChwaHlfc3RhdGUpIHsKKwkJY2FzZSBTTVBfUEhZV0FJVF9QSFlET1dOOgorCQkJLyogSGFzIHRoZSBkZXZpY2UgZ29uZSBhd2F5PyAqLworCQkJaWYgKCFhdHRhY2hlZF9kZXZpY2VfdHlwZSkKKwkJCQlwaHlfc3RhdGUgPSBTTVBfUEhZV0FJVF9QSFlVUDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTTVBfUEhZV0FJVF9QSFlVUDoKKwkJCS8qIEhhcyB0aGUgZGV2aWNlIGNvbWUgYmFjaz8gKi8KKwkJCWlmIChhdHRhY2hlZF9kZXZpY2VfdHlwZSkKKwkJCQlwaHlfc3RhdGUgPSBTTVBfUEhZV0FJVF9ET05FOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTVBfUEhZV0FJVF9ET05FOgorCQkJYnJlYWs7CisJCX0KKworCX0KKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGRvbmVcbiIsICBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbnQgaXNjaV9yZXNldF9kZXZpY2Uoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IHNhc19waHkgKnBoeSA9IHNhc19maW5kX2xvY2FsX3BoeShpZGV2LT5kb21haW5fZGV2KTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPmlzY2lfcG9ydDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBpZGV2ICVwXG4iLCBfX2Z1bmNfXywgaWRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KGlkZXYpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBzY2lfcmVtb3RlX2RldmljZV9yZXNldCglcCkgcmV0dXJuZWQgJWQhXG4iLAorCQkJIF9fZnVuY19fLCBpZGV2LCBzdGF0dXMpOworCisJCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogTWFrZSBzdXJlIGFsbCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBhYmxlIHRvIGJlIGZ1bGx5IHRlcm1pbmF0ZWQuICovCisJaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZyhpaG9zdCwgaWRldik7CisKKwkvKiBJZiB0aGlzIGlzIGEgZGV2aWNlIG9uIGFuIGV4cGFuZGVyLCBkaXNhYmxlIEJDTiBwcm9jZXNzaW5nLiAqLworCWlmICghc2NzaV9pc19zYXNfcGh5X2xvY2FsKHBoeSkpCisJCXNldF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpOworCisJcmMgPSBzYXNfcGh5X3Jlc2V0KHBoeSwgdHJ1ZSk7CisKKwkvKiBUZXJtaW5hdGUgaW4tcHJvZ3Jlc3MgSS9PIG5vdy4gKi8KKwlpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cyhpaG9zdCwgaWRldik7CisKKwkvKiBTaW5jZSBhbGwgcGVuZGluZyBUQ3MgaGF2ZSBiZWVuIGNsZWFuZWQsIHJlc3VtZSB0aGUgUk5DLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXRfY29tcGxldGUoaWRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhpcyBpcyBhIGRldmljZSBvbiBhbiBleHBhbmRlciwgYnJpbmcgdGhlIHBoeSBiYWNrIHVwLiAqLworCWlmICghc2NzaV9pc19zYXNfcGh5X2xvY2FsKHBoeSkpIHsKKwkJLyogQSBwaHkgcmVzZXQgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIGdvIGF3YXkgdGhlbiByZWFwcGVhci4KKwkJICogU2luY2UgbGlic2FzIHdpbGwgdGFrZSBhY3Rpb24gb24gaW5jb21pbmcgQkNOcyAoZWcuIHJlbW92ZQorCQkgKiBhIGRldmljZSBnb2luZyB0aHJvdWdoIGFuIFNNUCBwaHktY29udHJvbCBkcml2ZW4gcmVzZXQpLAorCQkgKiB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHBoeSBjb21lcyBiYWNrIHVwIGJlZm9yZSBsZXR0aW5nCisJCSAqIGRpc2NvdmVyeSBwcm9jZWVkIGluIGxpYnNhcy4KKwkJICovCisJCWlzY2lfd2FpdF9mb3Jfc21wX3BoeV9yZXNldChpZGV2LCBwaHktPm51bWJlcik7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJaXNjaV9wb3J0X2Jjbl9lbmFibGUoaWhvc3QsIGlkZXYtPmlzY2lfcG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBzY2lfcmVtb3RlX2RldmljZV9yZXNldF9jb21wbGV0ZSglcCkgIgorCQkJICJyZXR1cm5lZCAlZCFcbiIsIF9fZnVuY19fLCBpZGV2LCBzdGF0dXMpOworCX0KKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaWRldiAlcCBjb21wbGV0ZS5cbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCXJldHVybiByYzsKK30KKworaW50IGlzY2lfdGFza19JX1RfbmV4dXNfcmVzZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRldl90b19paG9zdChkZXYpOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpZGV2ID0gaXNjaV9sb29rdXBfZGV2aWNlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKCFpZGV2IHx8ICF0ZXN0X2JpdChJREVWX0VILCAmaWRldi0+ZmxhZ3MpKSB7CisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGlzY2lfcmVzZXRfZGV2aWNlKGlob3N0LCBpZGV2KTsKKyBvdXQ6CisJaXNjaV9wdXRfZGV2aWNlKGlkZXYpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBpc2NpX2J1c19yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KGNtZC0+ZGV2aWNlKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRldl90b19paG9zdChkZXYpOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpZGV2ID0gaXNjaV9sb29rdXBfZGV2aWNlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKCFpZGV2KSB7CisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGlzY2lfcmVzZXRfZGV2aWNlKGlob3N0LCBpZGV2KTsKKyBvdXQ6CisJaXNjaV9wdXRfZGV2aWNlKGlkZXYpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmggYi9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3ZmE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX0lTQ0lfVEFTS19IXworI2RlZmluZSBfSVNDSV9UQVNLX0hfCisKKyNpbmNsdWRlIDxzY3NpL3Nhc19hdGEuaD4KKyNpbmNsdWRlICJob3N0LmgiCisKK3N0cnVjdCBpc2NpX3JlcXVlc3Q7CisKKy8qKgorICogZW51bSBpc2NpX3RtZl9jYl9zdGF0ZSAtIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBzdGF0ZXMgaW4gd2hpY2ggdGhlCisgKiAgICBUTUYgY2FsbGJhY2sgZnVuY3Rpb24gaXMgaW52b2tlZCBkdXJpbmcgdGhlIFRNRiBleGVjdXRpb24gcHJvY2Vzcy4KKyAqCisgKgorICovCitlbnVtIGlzY2lfdG1mX2NiX3N0YXRlIHsKKworCWlzY2lfdG1mX2luaXRfc3RhdGUgPSAwLAorCWlzY2lfdG1mX3N0YXJ0ZWQsCisJaXNjaV90bWZfdGltZWRfb3V0Cit9OworCisvKioKKyAqIGVudW0gaXNjaV90bWZfZnVuY3Rpb25fY29kZXMgLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgcHJlcGFyYXRpb25zCisgKiAgICBvZiB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMuCisgKgorICoKKyAqLworZW51bSBpc2NpX3RtZl9mdW5jdGlvbl9jb2RlcyB7CisKKwlpc2NpX3RtZl9mdW5jX25vbmUgICAgICA9IDAsCisJaXNjaV90bWZfc3NwX3Rhc2tfYWJvcnQgPSBUTUZfQUJPUlRfVEFTSywKKwlpc2NpX3RtZl9zc3BfbHVuX3Jlc2V0ICA9IFRNRl9MVV9SRVNFVCwKKwlpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCA9IFRNRl9MVV9SRVNFVCArIDB4MTAwLCAvKiBOb24gU0NTSSAqLworCWlzY2lfdG1mX3NhdGFfc3JzdF9sb3cgID0gVE1GX0xVX1JFU0VUICsgMHgxMDEgIC8qIE5vbiBTQ1NJICovCit9OworLyoqCisgKiBzdHJ1Y3QgaXNjaV90bWYgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHRhc2sgbWFuYWdlbWVudCBvYmplY3Qgd2hpY2gKKyAqICAgIGFjdHMgYXMgYW4gaW50ZXJmYWNlIHRvIGxpYnNhcyBmb3IgcHJvY2Vzc2luZyB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMKKyAqCisgKgorICovCitzdHJ1Y3QgaXNjaV90bWYgeworCisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRlOworCWVudW0gc2FzX3Byb3RvY29sIHByb3RvOworCXVuaW9uIHsKKwkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSByZXNwX2l1OworCQlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzIGQyaF9maXM7CisJCXU4IHJzcF9idWZbU1NQX1JFU1BfSVVfTUFYX1NJWkVdOworCX0gcmVzcDsKKwl1bnNpZ25lZCBjaGFyIGx1bls4XTsKKwl1MTYgaW9fdGFnOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmRldmljZTsKKwllbnVtIGlzY2lfdG1mX2Z1bmN0aW9uX2NvZGVzIHRtZl9jb2RlOworCWludCBzdGF0dXM7CisKKwkvKiBUaGUgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gYWxsb3dzIHRoZSB1c2VyIHByb2Nlc3MgdG8KKwkgKiB0cmFjayB0aGUgVE1GIHRyYW5zbWl0IC8gdGltZW91dCBjb25kaXRpb25zLgorCSAqLworCXZvaWQgKCpjYl9zdGF0ZV9mdW5jKSgKKwkJZW51bSBpc2NpX3RtZl9jYl9zdGF0ZSwKKwkJc3RydWN0IGlzY2lfdG1mICosIHZvaWQgKik7CisJdm9pZCAqY2JfZGF0YTsKKworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfcHJpbnRfdG1mKHN0cnVjdCBpc2NpX3RtZiAqdG1mKQoreworCWlmIChTQVNfUFJPVE9DT0xfU0FUQSA9PSB0bWYtPnByb3RvKQorCQlkZXZfZGJnKCZ0bWYtPmRldmljZS0+aXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogc3RhdHVzID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AuZDJoX2Zpcy5zdGF0dXMgPSAleFxuIgorCQkJInRtZi0+cmVzcC5kMmhfZmlzLmVycm9yID0gJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXRtZi0+c3RhdHVzLAorCQkJdG1mLT5yZXNwLmQyaF9maXMuc3RhdHVzLAorCQkJdG1mLT5yZXNwLmQyaF9maXMuZXJyb3IpOworCWVsc2UKKwkJZGV2X2RiZygmdG1mLT5kZXZpY2UtPmlzY2lfcG9ydC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHN0YXR1cyA9ICV4XG4iCisJCQkidG1mLT5yZXNwLnJlc3BfaXUuZGF0YV9wcmVzZW50ID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5zdGF0dXMgPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFfbGVuZ3RoID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5kYXRhWzBdID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5kYXRhWzFdID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5kYXRhWzJdID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5kYXRhWzNdID0gJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXRtZi0+c3RhdHVzLAorCQkJdG1mLT5yZXNwLnJlc3BfaXUuZGF0YXByZXMsCisJCQl0bWYtPnJlc3AucmVzcF9pdS5zdGF0dXMsCisJCQliZTMyX3RvX2NwdSh0bWYtPnJlc3AucmVzcF9pdS5yZXNwb25zZV9kYXRhX2xlbiksCisJCQl0bWYtPnJlc3AucmVzcF9pdS5yZXNwX2RhdGFbMF0sCisJCQl0bWYtPnJlc3AucmVzcF9pdS5yZXNwX2RhdGFbMV0sCisJCQl0bWYtPnJlc3AucmVzcF9pdS5yZXNwX2RhdGFbMl0sCisJCQl0bWYtPnJlc3AucmVzcF9pdS5yZXNwX2RhdGFbM10pOworfQorCisKK2ludCBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrKAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaywKKwlpbnQgbnVtLAorCWdmcF90IGdmcF9mbGFncyk7CisKK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFzaygKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spOworCitpbnQgaXNjaV90YXNrX2Fib3J0X3Rhc2tfc2V0KAorCXN0cnVjdCBkb21haW5fZGV2aWNlICpkX2RldmljZSwKKwl1OCAqbHVuKTsKKworaW50IGlzY2lfdGFza19jbGVhcl9hY2EoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pOworCitpbnQgaXNjaV90YXNrX2NsZWFyX3Rhc2tfc2V0KAorCXN0cnVjdCBkb21haW5fZGV2aWNlICpkX2RldmljZSwKKwl1OCAqbHVuKTsKKworaW50IGlzY2lfdGFza19xdWVyeV90YXNrKAorCXN0cnVjdCBzYXNfdGFzayAqdGFzayk7CisKK2ludCBpc2NpX3Rhc2tfbHVfcmVzZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pOworCitpbnQgaXNjaV90YXNrX2NsZWFyX25leHVzX3BvcnQoCisJc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCk7CisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfaGEoCisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKmhhKTsKKworaW50IGlzY2lfdGFza19JX1RfbmV4dXNfcmVzZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlKTsKKwordm9pZCBpc2NpX3Rhc2tfcmVxdWVzdF9jb21wbGV0ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCwKKwllbnVtIHNjaV90YXNrX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cyk7CisKK3UxNiBpc2NpX3Rhc2tfc3NwX3JlcXVlc3RfZ2V0X2lvX3RhZ190b19tYW5hZ2UoCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCk7CisKK3U4IGlzY2lfdGFza19zc3BfcmVxdWVzdF9nZXRfZnVuY3Rpb24oCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCk7CisKKwordm9pZCAqaXNjaV90YXNrX3NzcF9yZXF1ZXN0X2dldF9yZXNwb25zZV9kYXRhX2FkZHJlc3MoCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCk7CisKK3UzMiBpc2NpX3Rhc2tfc3NwX3JlcXVlc3RfZ2V0X3Jlc3BvbnNlX2RhdGFfbGVuZ3RoKAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QpOworCitpbnQgaXNjaV9xdWV1ZWNvbW1hbmQoCisJc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQsCisJdm9pZCAoKmRvbmVmdW5jKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKKworaW50IGlzY2lfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKKworLyoqCisgKiBlbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24gLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgYWN0aW9ucyB0bworICogICAgdGFrZSB3aXRoIHJlc3BlY3QgdG8gYSBnaXZlbiByZXF1ZXN0J3Mgbm90aWZpY2F0aW9uIGJhY2sgdG8gbGlic2FzLgorICoKKyAqCisgKi8KK2VudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiB7CisKKwlpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb24sICAgICAgLyogTm9ybWFsIG5vdGlmeSAodGFza19kb25lKSAqLworCWlzY2lfcGVyZm9ybV9hYm9ydGVkX2lvX2NvbXBsZXRpb24sICAgICAvKiBObyBub3RpZmljYXRpb24uICAgKi8KKwlpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbiAgICAgICAgLyogVXNlIHNhc190YXNrX2Fib3J0ICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaXNjaV9zZXRfdGFza19kb25lZmxhZ3MoCisJc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCS8qIFNpbmNlIG5vIGZ1dGhlciBhY3Rpb24gd2lsbCBiZSB0YWtlbiBvbiB0aGlzIHRhc2ssCisJICogbWFrZSBzdXJlIHRvIG1hcmsgaXQgY29tcGxldGUgZnJvbSB0aGUgbGxkZCBwZXJzcGVjdGl2ZS4KKwkgKi8KKwl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0RPTkU7CisJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOworCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX1NUQVRFX1BFTkRJTkc7Cit9CisvKioKKyAqIGlzY2lfdGFza19hbGxfZG9uZSgpIC0gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIHRhc2sgYml0cyB0byBpbmRpY2F0ZSB0aGUKKyAqICAgIExMREQgaXMgZG9uZSB3aXRoIHRoZSB0YXNrLgorICoKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX3Rhc2tfYWxsX2RvbmUoCisJc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBTaW5jZSBubyBmdXRoZXIgYWN0aW9uIHdpbGwgYmUgdGFrZW4gb24gdGhpcyB0YXNrLAorCSAqIG1ha2Ugc3VyZSB0byBtYXJrIGl0IGNvbXBsZXRlIGZyb20gdGhlIGxsZGQgcGVyc3BlY3RpdmUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGlzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXMoKSAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgY29tcGxldGlvbiBzdGF0dXMKKyAqICAgIGZvciB0aGUgcmVxdWVzdC4KKyAqIEB0YXNrOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgY29tcGxldGVkIHJlcXVlc3QuCisgKiBAcmVzcG9uc2U6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSByZXNwb25zZSBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisgKiBAc3RhdHVzOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgc3RhdHVzIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyAqCisqIEByZXR1cm4gVGhlIG5ldyBub3RpZmljYXRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuCisqLworc3RhdGljIGlubGluZSBlbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24KK2lzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXMoCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSwKKwllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cywKKwllbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24gdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwkvKiBJZiBhIGRldmljZSByZXNldCBpcyBiZWluZyBpbmRpY2F0ZWQsIG1ha2Ugc3VyZSB0aGUgSS9PCisJKiBpcyBpbiB0aGUgZXJyb3IgcGF0aC4KKwkqLworCWlmICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpIHsKKwkJLyogRmFpbCB0aGUgSS9PIHRvIG1ha2Ugc3VyZSBpdCBnb2VzIGludG8gdGhlIGVycm9yIHBhdGguICovCisJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCXN0YXR1cyA9IFNBTV9TVEFUX1RBU0tfQUJPUlRFRDsKKworCQl0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24gPSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjsKKwl9CisJdGFzay0+dGFza19zdGF0dXMucmVzcCA9IHJlc3BvbnNlOworCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPSBzdGF0dXM7CisKKwlzd2l0Y2ggKHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbikgeworCisJY2FzZSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjoKKworCQlpZiAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSB7CisJCQkvKiBUaGVyZSBpcyBubyBlcnJvciBlc2NhbGF0aW9uIGluIHRoZSBTTVAgY2FzZS4KKwkJCSAqIENvbnZlcnQgdG8gYSBub3JtYWwgY29tcGxldGlvbiB0byBhdm9pZCB0aGUKKwkJCSAqIHRpbWVvdXQgaW4gdGhlIGRpc2NvdmVyeSBwYXRoIGFuZCB0byBsZXQgdGhlCisJCQkgKiBuZXh0IGFjdGlvbiB0YWtlIHBsYWNlIHF1aWNrbHkuCisJCQkgKi8KKwkJCXRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbgorCQkJCT0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCisJCQkvKiBGYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBjYXNlLi4uICovCisJCX0gZWxzZSB7CisJCQkvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KKwkJCS8qIExlYXZlIFNBU19UQVNLX1NUQVRFX0RPTkUgY2xlYXIKKwkJCSAqIExlYXZlIFNBU19UQVNLX0FUX0lOSVRJQVRPUiBzZXQuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGlzY2lfcGVyZm9ybV9hYm9ydGVkX2lvX2NvbXBsZXRpb246CisJCS8qIFRoaXMgcGF0aCBjYW4gb2NjdXIgd2l0aCB0YXNrLW1hbmFnZWQgcmVxdWVzdHMgYXMgd2VsbCBhcworCQkgKiByZXF1ZXN0cyB0ZXJtaW5hdGVkIGJlY2F1c2Ugb2YgTFVOIG9yIGRldmljZSByZXNldHMuCisJCSAqLworCQkvKiBGYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBjYXNlLi4uICovCisJY2FzZSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb246CisJCS8qIE5vcm1hbCBub3RpZmljYXRpb24gKHRhc2tfZG9uZSkgKi8KKwkJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT05DRSgxLCAidW5rbm93biB0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb246ICVkXG4iLAorCQkJIHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbik7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbjsKKworfQorLyoqCisqIGlzY2lfZXhlY3BhdGhfY2FsbGJhY2soKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHRhc2sKKyogZXhlY3V0ZSBwYXRoIHdoZW4gdGhlIHRhc2sgbmVlZHMgdG8gY2FsbGJhY2sgbGlic2FzIGFib3V0IHRoZSBzdWJtaXQtdGltZQorKiB0YXNrIGZhaWx1cmUuICBUaGUgY2FsbGJhY2sgb2NjdXJzIGVpdGhlciB0aHJvdWdoIHRoZSB0YXNrJ3MgZG9uZSBmdW5jdGlvbgorKiBvciB0aHJvdWdoIHNhc190YXNrX2Fib3J0LiAgSW4gdGhlIGNhc2Ugb2YgcmVndWxhciBub24tZGlzY292ZXJ5IFNBVEEvU1RQIEkvTworKiByZXF1ZXN0cywgbGlic2FzIHRha2VzIHRoZSBob3N0IGxvY2sgYmVmb3JlIGNhbGxpbmcgZXhlY3V0ZSB0YXNrLiAgVGhlcmVmb3JlCisqIGluIHRoaXMgc2l0dWF0aW9uIHRoZSBob3N0IGxvY2sgbXVzdCBiZSBtYW5hZ2VkIGJlZm9yZSBjYWxsaW5nIHRoZSBmdW5jLgorKgorKiBAaWhvc3Q6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBJL08gcmVxdWVzdCB3YXMgc2VudC4KKyogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBJL08gcmVxdWVzdC4KKyogQGZ1bmM6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBmdW5jdGlvbiB0byBjYWxsIGluIHRoZSBjb3JyZWN0IGNvbnRleHQuCisqIEBzdGF0dXM6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBzdGF0dXMgY29kZSBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorKgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX2V4ZWNwYXRoX2NhbGxiYWNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgIHN0cnVjdCBzYXNfdGFzayAgKnRhc2ssCisJCQkJCSAgdm9pZCAoKmZ1bmMpKHN0cnVjdCBzYXNfdGFzayAqKSkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gdGFzay0+ZGV2OworCisJaWYgKGRldl9pc19zYXRhKGRldikgJiYgdGFzay0+dWxkZF90YXNrKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogU2luY2Ugd2UgYXJlIHN0aWxsIGluIHRoZSBzdWJtaXQgcGF0aCwgYW5kIHNpbmNlCisJCSAqIGxpYnNhcyB0YWtlcyB0aGUgaG9zdCBsb2NrIG9uIGJlaGFsZiBvZiBTQVRBCisJCSAqIGRldmljZXMgYmVmb3JlIEkvTyBzdGFydHMgKGluIHRoZSBub24tZGlzY292ZXJ5IGNhc2UpLAorCQkgKiB3ZSBuZWVkIHRvIHVubG9jayBiZWZvcmUgd2UgY2FuIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorCQkgKi8KKwkJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJc3Bpbl91bmxvY2soZGV2LT5zYXRhX2Rldi5hcC0+bG9jayk7CisJCWZ1bmModGFzayk7CisJCXNwaW5fbG9jayhkZXYtPnNhdGFfZGV2LmFwLT5sb2NrKTsKKwkJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9IGVsc2UKKwkJZnVuYyh0YXNrKTsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChfU0NJX1RBU0tfSF8pICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmMgYi9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllMWUyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJ1bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisKK2ludCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sID0gJmlob3N0LT51Zl9jb250cm9sOworCXN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWUgKnVmOworCXUzMiBidWZfbGVuLCBoZWFkZXJfbGVuLCBpOworCWRtYV9hZGRyX3QgZG1hOworCXNpemVfdCBzaXplOworCXZvaWQgKnZpcnQ7CisKKwkvKgorCSAqIFByZXBhcmUgYWxsIG9mIHRoZSBtZW1vcnkgc2l6ZXMgZm9yIHRoZSBVRiBoZWFkZXJzLCBVRiBhZGRyZXNzCisJICogdGFibGUsIGFuZCBVRiBidWZmZXJzIHRoZW1zZWx2ZXMuCisJICovCisJYnVmX2xlbiA9IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTICogU0NVX1VOU09MSUNJVEVEX0ZSQU1FX0JVRkZFUl9TSVpFOworCWhlYWRlcl9sZW4gPSBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyAqIHNpemVvZihzdHJ1Y3Qgc2N1X3Vuc29saWNpdGVkX2ZyYW1lX2hlYWRlcik7CisJc2l6ZSA9IGJ1Zl9sZW4gKyBoZWFkZXJfbGVuICsgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgKiBzaXplb2YoZG1hX2FkZHJfdCk7CisKKwkvKgorCSAqIFRoZSBVbnNvbGljaXRlZCBGcmFtZSBidWZmZXJzIGFyZSBzZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBVRgorCSAqIG1lbW9yeSBkZXNjcmlwdG9yIGVudHJ5LiBUaGUgaGVhZGVycyBhbmQgYWRkcmVzcyB0YWJsZSB3aWxsIGJlCisJICogcGxhY2VkIGFmdGVyIHRoZSBidWZmZXJzLgorCSAqLworCXZpcnQgPSBkbWFtX2FsbG9jX2NvaGVyZW50KCZpaG9zdC0+cGRldi0+ZGV2LCBzaXplLCAmZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZpcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBsb2NhdGlvbiBvZiB0aGUgVUYgaGVhZGVyIHRhYmxlIGludG8gdGhlIFNDVS4KKwkgKiBOb3RlczoKKwkgKiAtIFRoZSBhZGRyZXNzIG11c3QgYWxpZ24gb24gYSA2NC1ieXRlIGJvdW5kYXJ5LiBHdWFyYW50ZWVkIHRvIGJlCisJICogICBvbiA2NC1ieXRlIGJvdW5kYXJ5IGFscmVhZHkgMUtCIGJvdW5kYXJ5IGZvciB1bnNvbGljaXRlZCBmcmFtZXMuCisJICogLSBQcm9ncmFtIHVudXNlZCBoZWFkZXIgZW50cmllcyB0byBvdmVybGFwIHdpdGggdGhlIGxhc3QKKwkgKiAgIHVuc29saWNpdGVkIGZyYW1lLiAgVGhlIHNpbGljb24gd2lsbCBuZXZlciBETUEgdG8gdGhlc2UgdW51c2VkCisJICogICBoZWFkZXJzLCBzaW5jZSB3ZSBwcm9ncmFtIHRoZSBVRiBhZGRyZXNzIHRhYmxlIHBvaW50ZXJzIHRvCisJICogICBOVUxMLgorCSAqLworCXVmX2NvbnRyb2wtPmhlYWRlcnMucGh5c2ljYWxfYWRkcmVzcyA9IGRtYSArIGJ1Zl9sZW47CisJdWZfY29udHJvbC0+aGVhZGVycy5hcnJheSA9IHZpcnQgKyBidWZfbGVuOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBsb2NhdGlvbiBvZiB0aGUgVUYgYWRkcmVzcyB0YWJsZSBpbnRvIHRoZSBTQ1UuCisJICogTm90ZXM6CisJICogLSBUaGUgYWRkcmVzcyBtdXN0IGFsaWduIG9uIGEgNjQtYml0IGJvdW5kYXJ5LiBHdWFyYW50ZWVkIHRvIGJlIG9uIDY0CisJICogICBieXRlIGJvdW5kYXJ5IGFscmVhZHkgZHVlIHRvIGFib3ZlIHByb2dyYW1taW5nIGhlYWRlcnMgYmVpbmcgb24gYQorCSAqICAgNjQtYml0IGJvdW5kYXJ5IGFuZCBoZWFkZXJzIGFyZSBvbiBhIDY0LWJ5dGVzIGluIHNpemUuCisJICovCisJdWZfY29udHJvbC0+YWRkcmVzc190YWJsZS5waHlzaWNhbF9hZGRyZXNzID0gZG1hICsgYnVmX2xlbiArIGhlYWRlcl9sZW47CisJdWZfY29udHJvbC0+YWRkcmVzc190YWJsZS5hcnJheSA9IHZpcnQgKyBidWZfbGVuICsgaGVhZGVyX2xlbjsKKwl1Zl9jb250cm9sLT5nZXQgPSAwOworCisJLyoKKwkgKiBVRiBidWZmZXIgcmVxdWlyZW1lbnRzIGFyZToKKwkgKiAtIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBVRiBxdWV1ZSBpcyBub3QgTlVMTC4KKwkgKiAtIFRoZXJlIGlzIGEgcG93ZXIgb2YgMiBudW1iZXIgb2YgZW50cmllcyAoTlVMTCBvciBub3QtTlVMTCkKKwkgKiAgIHByb2dyYW1tZWQgaW50byB0aGUgcXVldWUuCisJICogLSBBbGlnbmVkIG9uIGEgMUtCIGJvdW5kYXJ5LiAqLworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBhY3R1YWwgdXNlZCBVRiBidWZmZXJzIGludG8gdGhlIFVGIGFkZHJlc3MgdGFibGUgYW5kCisJICogdGhlIGNvbnRyb2xsZXIncyBhcnJheSBvZiBVRnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTOyBpKyspIHsKKwkJdWYgPSAmdWZfY29udHJvbC0+YnVmZmVycy5hcnJheVtpXTsKKworCQl1Zl9jb250cm9sLT5hZGRyZXNzX3RhYmxlLmFycmF5W2ldID0gZG1hOworCisJCXVmLT5idWZmZXIgPSB2aXJ0OworCQl1Zi0+aGVhZGVyID0gJnVmX2NvbnRyb2wtPmhlYWRlcnMuYXJyYXlbaV07CisJCXVmLT5zdGF0ZSAgPSBVTlNPTElDSVRFRF9GUkFNRV9FTVBUWTsKKworCQkvKgorCQkgKiBJbmNyZW1lbnQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIGFuZCB2aXJ0dWFsIG1lbW9yeQorCQkgKiBwb2ludGVycy4gRXZlcnl0aGluZyBpcyBhbGlnbmVkIG9uIDFrIGJvdW5kYXJ5IHdpdGggYW4KKwkJICogaW5jcmVtZW50IG9mIDFrLgorCQkgKi8KKwkJdmlydCArPSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkU7CisJCWRtYSArPSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKHN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbCAqdWZfY29udHJvbCwKKwkJCQkJCQkgdTMyIGZyYW1lX2luZGV4LAorCQkJCQkJCSB2b2lkICoqZnJhbWVfaGVhZGVyKQoreworCWlmIChmcmFtZV9pbmRleCA8IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKSB7CisJCS8qIFNraXAgdGhlIGZpcnN0IHdvcmQgaW4gdGhlIGZyYW1lIHNpbmNlIHRoaXMgaXMgYSBjb250cm9sbCB3b3JkIHVzZWQKKwkJICogYnkgdGhlIGhhcmR3YXJlLgorCQkgKi8KKwkJKmZyYW1lX2hlYWRlciA9ICZ1Zl9jb250cm9sLT5idWZmZXJzLmFycmF5W2ZyYW1lX2luZGV4XS5oZWFkZXItPmRhdGE7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCQkJCQkJCSB1MzIgZnJhbWVfaW5kZXgsCisJCQkJCQkJIHZvaWQgKipmcmFtZV9idWZmZXIpCit7CisJaWYgKGZyYW1lX2luZGV4IDwgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMpIHsKKwkJKmZyYW1lX2J1ZmZlciA9IHVmX2NvbnRyb2wtPmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLmJ1ZmZlcjsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworfQorCitib29sIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX3JlbGVhc2VfZnJhbWUoc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCQkJCQkJIHUzMiBmcmFtZV9pbmRleCkKK3sKKwl1MzIgZnJhbWVfZ2V0OworCXUzMiBmcmFtZV9jeWNsZTsKKworCWZyYW1lX2dldCAgID0gdWZfY29udHJvbC0+Z2V0ICYgKFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTIC0gMSk7CisJZnJhbWVfY3ljbGUgPSB1Zl9jb250cm9sLT5nZXQgJiBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUzsKKworCS8qCisJICogSW4gdGhlIGV2ZW50IHRoZXJlIGFyZSBOVUxMIGVudHJpZXMgaW4gdGhlIFVGIHRhYmxlLCB3ZSBuZWVkIHRvCisJICogYWR2YW5jZSB0aGUgZ2V0IHBvaW50ZXIgaW4gb3JkZXIgdG8gZmluZCBvdXQgaWYgdGhpcyBmcmFtZSBzaG91bGQKKwkgKiBiZSByZWxlYXNlZCAoaS5lLiB1cGRhdGUgdGhlIGdldCBwb2ludGVyKQorCSAqLworCXdoaWxlIChsb3dlcl8zMl9iaXRzKHVmX2NvbnRyb2wtPmFkZHJlc3NfdGFibGUuYXJyYXlbZnJhbWVfZ2V0XSkgPT0gMCAmJgorCSAgICAgICB1cHBlcl8zMl9iaXRzKHVmX2NvbnRyb2wtPmFkZHJlc3NfdGFibGUuYXJyYXlbZnJhbWVfZ2V0XSkgPT0gMCAmJgorCSAgICAgICBmcmFtZV9nZXQgPCBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUykKKwkJZnJhbWVfZ2V0Kys7CisKKwkvKgorCSAqIFRoZSB0YWJsZSBoYXMgYSBOVUxMIGVudHJ5IGFzIGl0J3MgbGFzdCBlbGVtZW50LiAgVGhpcyBpcworCSAqIGlsbGVnYWwuCisJICovCisJQlVHX09OKGZyYW1lX2dldCA+PSBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyk7CisJaWYgKGZyYW1lX2luZGV4ID49IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKQorCQlyZXR1cm4gZmFsc2U7CisKKwl1Zl9jb250cm9sLT5idWZmZXJzLmFycmF5W2ZyYW1lX2luZGV4XS5zdGF0ZSA9IFVOU09MSUNJVEVEX0ZSQU1FX1JFTEVBU0VEOworCisJaWYgKGZyYW1lX2dldCAhPSBmcmFtZV9pbmRleCkgeworCQkvKgorCQkgKiBGcmFtZXMgcmVtYWluIGluIHVzZSB1bnRpbCB3ZSBhZHZhbmNlIHRoZSBnZXQgcG9pbnRlcgorCQkgKiBzbyB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlCisJCSAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBUaGUgZnJhbWUgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgZ2V0IHBvaW50ZXIgc28gd2UKKwkgKiBjYW4gbm93IGZyZWUgdXAgYWxsIG9mIHRoZSBmcmFtZSBlbnRyaWVzIHRoYXQKKwkgKi8KKwl3aGlsZSAodWZfY29udHJvbC0+YnVmZmVycy5hcnJheVtmcmFtZV9nZXRdLnN0YXRlID09IFVOU09MSUNJVEVEX0ZSQU1FX1JFTEVBU0VEKSB7CisJCXVmX2NvbnRyb2wtPmJ1ZmZlcnMuYXJyYXlbZnJhbWVfZ2V0XS5zdGF0ZSA9IFVOU09MSUNJVEVEX0ZSQU1FX0VNUFRZOworCisJCWlmIChmcmFtZV9nZXQrMSA9PSBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUy0xKSB7CisJCQlmcmFtZV9jeWNsZSBePSBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUzsKKwkJCWZyYW1lX2dldCA9IDA7CisJCX0gZWxzZQorCQkJZnJhbWVfZ2V0Kys7CisJfQorCisJdWZfY29udHJvbC0+Z2V0ID0gU0NVX1VGUUdQX0dFTl9CSVQoRU5BQkxFX0JJVCkgfCBmcmFtZV9jeWNsZSB8IGZyYW1lX2dldDsKKworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2I5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmgKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSUNfU0RTX1VOU09MSUNJVEVEX0ZSQU1FX0NPTlRST0xfSF8KKyNkZWZpbmUgX1NDSUNfU0RTX1VOU09MSUNJVEVEX0ZSQU1FX0NPTlRST0xfSF8KKworI2luY2x1ZGUgImlzY2kuaCIKKworI2RlZmluZSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfSEVBREVSX0RBVEFfRFdPUkRTIDE1CisKKy8qKgorICogc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgLQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGRlbGluZWF0ZXMgdGhlIGZvcm1hdCBvZiBhbiB1bnNvbGljaXRlZCBmcmFtZSBoZWFkZXIuIFRoZQorICogZmlyc3QgRFdPUkQgYXJlIFVGIGF0dHJpYnV0ZXMgZGVmaW5lZCBieSB0aGUgc2lsaWNvbiBhcmNoaXRlY3R1cmUuIFRoZSBkYXRhCisgKiBkZXBpY3RzIGFjdHVhbCBoZWFkZXIgaW5mb3JtYXRpb24gcmVjZWl2ZWQgb24gdGhlIGxpbmsuCisgKi8KK3N0cnVjdCBzY3VfdW5zb2xpY2l0ZWRfZnJhbWVfaGVhZGVyIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyBpZiB0aGVyZSBpcyBhbiBJbml0aWF0b3IgSW5kZXggVGFibGUgZW50cnkgd2l0aAorCSAqIHdoaWNoIHRoaXMgaGVhZGVyIGlzIGFzc29jaWF0ZWQuCisJICovCisJdTMyIGlpdF9leGlzdHM6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc2ltcGx5IGluZGljYXRlcyB0aGUgcHJvdG9jb2wgdHlwZSAoaS5lLiBTU1AsIFNUUCwgU01QKS4KKwkgKi8KKwl1MzIgcHJvdG9jb2xfdHlwZTozOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgaWYgdGhlIGZyYW1lIGlzIGFuIGFkZHJlc3MgZnJhbWUgKElBRiBvciBPQUYpCisJICogb3IgaWYgaXQgaXMgYSBpbmZvcm1hdGlvbiB1bml0IGZyYW1lLgorCSAqLworCXUzMiBpc19hZGRyZXNzX2ZyYW1lOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNpbXBseSBpbmRpY2F0ZXMgdGhlIGNvbm5lY3Rpb24gcmF0ZSBhdCB3aGljaCB0aGUgZnJhbWUKKwkgKiB3YXMgcmVjZWl2ZWQuCisJICovCisJdTMyIGNvbm5lY3Rpb25fcmF0ZTo0OworCisJdTMyIHJlc2VydmVkOjIzOworCisJLyoqCisJICogVGhpcyBmaWVsZCByZXByZXNlbnRzIHRoZSBhY3R1YWwgaGVhZGVyIGRhdGEgcmVjZWl2ZWQgb24gdGhlIGxpbmsuCisJICovCisJdTMyIGRhdGFbU0NVX1VOU09MSUNJVEVEX0ZSQU1FX0hFQURFUl9EQVRBX0RXT1JEU107CisKK307CisKKworCisvKioKKyAqIGVudW0gdW5zb2xpY2l0ZWRfZnJhbWVfc3RhdGUgLQorICoKKyAqIFRoaXMgZW51bWVyYXRpb24gcmVwcmVzZW50cyB0aGUgY3VycmVudCB1bnNvbGljaXRlZCBmcmFtZSBzdGF0ZS4gIFRoZQorICogY29udHJvbGxlciBvYmplY3QgY2FuIG5vdCB1cGR0YXRlIHRoZSBoYXJkd2FyZSB1bnNvbGljaXRlZCBmcmFtZSBwdXQgcG9pbnRlcgorICogdW5sZXNzIGl0IGhhcyBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgcHJpcm9yIHVuc29saWNpdGVkIGZyYW1lcy4KKyAqLworZW51bSB1bnNvbGljaXRlZF9mcmFtZV9zdGF0ZSB7CisJLyoqCisJICogVGhpcyBzdGF0ZSBpcyB3aGVuIHRoZSBmcmFtZSBpcyBlbXB0eSBhbmQgbm90IGluIHVzZS4gIEl0IGlzCisJICogZGlmZmVyZW50IGZyb20gdGhlIHJlbGVhc2VkIHN0YXRlIGluIHRoYXQgdGhlIGhhcmR3YXJlIGNvdWxkIERNQQorCSAqIGRhdGEgdG8gdGhpcyBmcmFtZSBidWZmZXIuCisJICovCisJVU5TT0xJQ0lURURfRlJBTUVfRU1QVFksCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHNldCB3aGVuIHRoZSBmcmFtZSBidWZmZXIgaXMgaW4gdXNlIGJ5IGJ5IHNvbWUKKwkgKiBvYmplY3QgaW4gdGhlIHN5c3RlbS4KKwkgKi8KKwlVTlNPTElDSVRFRF9GUkFNRV9JTl9VU0UsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHNldCB3aGVuIHRoZSBmcmFtZSBpcyByZXR1cm5lZCB0byB0aGUgZnJlZSBwb29sCisJICogYnV0IG9uZSBvciBtb3JlIGZyYW1lcyBwcmlvciB0byB0aGlzIG9uZSBhcmUgc3RpbGwgaW4gdXNlLgorCSAqIE9uY2UgYWxsIG9mIHRoZSBmcmFtZSBiZWZvcmUgdGhpcyBvbmUgYXJlIGZyZWVkIGl0IHdpbGwgZ28gdG8KKwkgKiB0aGUgZW1wdHkgc3RhdGUuCisJICovCisJVU5TT0xJQ0lURURfRlJBTUVfUkVMRUFTRUQsCisKKwlVTlNPTElDSVRFRF9GUkFNRV9NQVhfU1RBVEVTCit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWUgLQorICoKKyAqIFRoaXMgaXMgdGhlIHVuc29saWNpdGVkIGZyYW1lIGRhdGEgc3RydWN0dXJlIGl0IGFjdHMgYXMgdGhlIGNvbnRhaW5lciBmb3IKKyAqIHRoZSBjdXJyZW50IGZyYW1lIHN0YXRlLCBmcmFtZSBoZWFkZXIgYW5kIGZyYW1lIGJ1ZmZlci4KKyAqLworc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSB7CisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgY3VycmVudCBmcmFtZSBzdGF0ZQorCSAqLworCWVudW0gdW5zb2xpY2l0ZWRfZnJhbWVfc3RhdGUgc3RhdGU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHBvaW50cyB0byB0aGUgZnJhbWUgaGVhZGVyIGRhdGEuCisJICovCisJc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgKmhlYWRlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgcG9pbnRzIHRvIHRoZSBmcmFtZSBidWZmZXIgZGF0YS4KKwkgKi8KKwl2b2lkICpidWZmZXI7CisKK307CisKKy8qKgorICogc3RydWN0IHNjaV91Zl9oZWFkZXJfYXJyYXkgLQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBvZiB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgaGVhZGVyIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3Qgc2NpX3VmX2hlYWRlcl9hcnJheSB7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXByZXNlbnRzIGEgdmlydHVhbCBwb2ludGVyIHRvIHRoZSBzdGFydAorCSAqIGFkZHJlc3Mgb2YgdGhlIFVGIGFkZHJlc3MgdGFibGUuICBUaGUgdGFibGUgY29udGFpbnMKKwkgKiA2NC1iaXQgcG9pbnRlcnMgYXMgcmVxdWlyZWQgYnkgdGhlIGhhcmR3YXJlLgorCSAqLworCXN0cnVjdCBzY3VfdW5zb2xpY2l0ZWRfZnJhbWVfaGVhZGVyICphcnJheTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGxvY2F0aW9uIGZvciB0aGUgVUYKKwkgKiBidWZmZXIgYXJyYXkuCisJICovCisJZG1hX2FkZHJfdCBwaHlzaWNhbF9hZGRyZXNzOworCit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfdWZfYnVmZmVyX2FycmF5IC0KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGJ1ZmZlciAoYWN0dWFsIHBheWxvYWQpCisgKiBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IHNjaV91Zl9idWZmZXJfYXJyYXkgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHVuc29saWNpdGVkIGZyYW1lIGRhdGEgaXRzIHVzZWQgdG8gbWFuYWdlCisJICogdGhlIGRhdGEgZm9yIHRoZSB1bnNvbGljaXRlZCBmcmFtZSByZXF1ZXN0cy4gIEl0IGFsc28gcmVwcmVzZW50cworCSAqIHRoZSB2aXJ0dWFsIGFkZHJlc3MgbG9jYXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKKwkgKiBwaHlzaWNhbF9hZGRyZXNzIGZpZWxkLgorCSAqLworCXN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWUgYXJyYXlbU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVNdOworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgbG9jYXRpb24gZm9yIHRoZSBVRgorCSAqIGJ1ZmZlciBhcnJheS4KKwkgKi8KKwlkbWFfYWRkcl90IHBoeXNpY2FsX2FkZHJlc3M7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfdWZfYWRkcmVzc190YWJsZV9hcnJheSAtCisgKgorICogVGhpcyBvYmplY3QgbWFpbnRhaW5zIGFsbCBvZiB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgYWRkcmVzcyB0YWJsZSBzcGVjaWZpYworICogZGF0YS4gIFRoZSBhZGRyZXNzIHRhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiA2NC1iaXQgcG9pbnRlcnMgdGhhdCBwb2ludCB0bworICogMUtCIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgc2lsaWNvbiB3aWxsIERNQSB1bnNvbGljaXRlZCBmcmFtZXMuCisgKi8KK3N0cnVjdCBzY2lfdWZfYWRkcmVzc190YWJsZV9hcnJheSB7CisJLyoqCisJICogVGhpcyBmaWVsZCByZXByZXNlbnRzIGEgdmlydHVhbCBwb2ludGVyIHRoYXQgcmVmZXJzIHRvIHRoZQorCSAqIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIFVGIGFkZHJlc3MgdGFibGUuCisJICogNjQtYml0IHBvaW50ZXJzIGFyZSByZXF1aXJlZCBieSB0aGUgaGFyZHdhcmUuCisJICovCisJZG1hX2FkZHJfdCAqYXJyYXk7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBsb2NhdGlvbiBmb3IgdGhlIFVGCisJICogYWRkcmVzcyB0YWJsZS4KKwkgKi8KKwlkbWFfYWRkcl90IHBoeXNpY2FsX2FkZHJlc3M7CisKK307CisKKy8qKgorICogc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sIC0KKyAqCisgKiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgb2YgdGhlIGRhdGEgbmVjZXNzYXJ5IHRvIGhhbmRsZSB1bnNvbGljaXRlZCBmcmFtZXMuCisgKi8KK3N0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbCB7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgc29mdHdhcmUgY29weSBvZiB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgcXVldWUKKwkgKiBnZXQgcG9pbnRlci4gIFRoZSBjb250cm9sbGVyIG9iamVjdCB3cml0ZXMgdGhpcyB2YWx1ZSB0byB0aGUKKwkgKiBoYXJkd2FyZSB0byBsZXQgdGhlIGhhcmR3YXJlIHB1dCBtb3JlIHVuc29saWNpdGVkIGZyYW1lIGVudHJpZXMuCisJICovCisJdTMyIGdldDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBoZWFkZXIKKwkgKiBzcGVjaWZpYyBmaWVsZHMuCisJICovCisJc3RydWN0IHNjaV91Zl9oZWFkZXJfYXJyYXkgaGVhZGVyczsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBidWZmZXIKKwkgKiBzcGVjaWZpYyBmaWVsZHMuCisJICovCisJc3RydWN0IHNjaV91Zl9idWZmZXJfYXJyYXkgYnVmZmVyczsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBhZGRyZXNzIHRhYmxlCisJICogc3BlY2lmaWMgZmllbGRzLgorCSAqLworCXN0cnVjdCBzY2lfdWZfYWRkcmVzc190YWJsZV9hcnJheSBhZGRyZXNzX3RhYmxlOworCit9OworCitzdHJ1Y3QgaXNjaV9ob3N0OworCitpbnQgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoCisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCXUzMiBmcmFtZV9pbmRleCwKKwl2b2lkICoqZnJhbWVfaGVhZGVyKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoCisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCXUzMiBmcmFtZV9pbmRleCwKKwl2b2lkICoqZnJhbWVfYnVmZmVyKTsKKworYm9vbCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9yZWxlYXNlX2ZyYW1lKAorCXN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbCAqdWZfY29udHJvbCwKKwl1MzIgZnJhbWVfaW5kZXgpOworCisjZW5kaWYgLyogX1NDSUNfU0RTX1VOU09MSUNJVEVEX0ZSQU1FX0NPTlRST0xfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCA1ODU4NGRjLi40NGU4Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0yOTcsNyArMjk3LDcgQEAKIAkJa2ZyZWUoc2Rldik7CiAJCWdvdG8gb3V0OwogCX0KLQorCWJsa19nZXRfcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CiAJc2Rldi0+cmVxdWVzdF9xdWV1ZS0+cXVldWVkYXRhID0gc2RldjsKIAlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwLCBzZGV2LT5ob3N0LT5jbWRfcGVyX2x1bik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGU2MzkxMjUuLmUwYmQzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMzIyLDYgKzMyMiw3IEBACiAJCWtmcmVlKGV2dCk7CiAJfQogCisJYmxrX3B1dF9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKIAkvKiBOVUxMIHF1ZXVlIG1lYW5zIHRoZSBkZXZpY2UgY2FuJ3QgYmUgdXNlZCAqLwogCXNkZXYtPnJlcXVlc3RfcXVldWUgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKaW5kZXggNGY2NDE4My4uN2U5YzM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9jbGsvY29yZS5jCisrKyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJc3RydWN0IGNsayAqY2xrcDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrcCwgJmNsb2NrX2xpc3QsIG5vZGUpIHsKLQkJaWYgKGxpa2VseShjbGtwLT5vcHMpKSB7CisJCWlmIChsaWtlbHkoY2xrcC0+dXNlY291bnQgJiYgY2xrcC0+b3BzKSkgewogCQkJdW5zaWduZWQgbG9uZyByYXRlID0gY2xrcC0+cmF0ZTsKIAogCQkJaWYgKGxpa2VseShjbGtwLT5vcHMtPnNldF9wYXJlbnQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYW1iYS1wbDAyMi5jIGIvZHJpdmVycy9zcGkvYW1iYS1wbDAyMi5jCmluZGV4IDZhOWU1OGQuLmQxOGNlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2FtYmEtcGwwMjIuYworKysgYi9kcml2ZXJzL3NwaS9hbWJhLXBsMDIyLmMKQEAgLTE4NjEsNiArMTg2MSw3IEBACiAJfQogCWlmICgoY2xrX2ZyZXEuY3BzZHZzciA8IENQU0RWUl9NSU4pCiAJICAgIHx8IChjbGtfZnJlcS5jcHNkdnNyID4gQ1BTRFZSX01BWCkpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKIAkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkiY3BzZHZzciBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKIAkJZ290byBlcnJfY29uZmlnX3BhcmFtczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMgYi9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jCmluZGV4IDZmODZiYTAuLjk2OWNkZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJdW5zaWduZWQgaW50CQljb3VudCwgYzsKIAl1bnNpZ25lZCBsb25nCQliYXNlLCB0eF9yZWcsIHJ4X3JlZzsKIAlpbnQJCQl3b3JkX2xlbiwgZGF0YV90eXBlLCBlbGVtZW50X2NvdW50OwotCWludAkJCWVsZW1lbnRzOworCWludAkJCWVsZW1lbnRzID0gMDsKIAl1MzIJCQlsOwogCXU4CQkJKiByeDsKIAljb25zdCB1OAkJKiB0eDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iZmluNXh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfYmZpbjV4eC5jCmluZGV4IGY3MDZkYmEuLmNjODgwYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iZmluNXh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JmaW41eHguYwpAQCAtNjgxLDEzICs2ODEsMTQgQEAKIAlkcnZfZGF0YS0+Y3NfY2hhbmdlID0gdHJhbnNmZXItPmNzX2NoYW5nZTsKIAogCS8qIEJpdHMgcGVyIHdvcmQgc2V0dXAgKi8KLQliaXRzX3Blcl93b3JkID0gdHJhbnNmZXItPmJpdHNfcGVyX3dvcmQgPyA6IG1lc3NhZ2UtPnNwaS0+Yml0c19wZXJfd29yZDsKLQlpZiAoKGJpdHNfcGVyX3dvcmQgPiAwKSAmJiAoYml0c19wZXJfd29yZCAlIDE2ID09IDApKSB7CisJYml0c19wZXJfd29yZCA9IHRyYW5zZmVyLT5iaXRzX3Blcl93b3JkID8gOgorCQltZXNzYWdlLT5zcGktPmJpdHNfcGVyX3dvcmQgPyA6IDg7CisJaWYgKGJpdHNfcGVyX3dvcmQgJSAxNiA9PSAwKSB7CiAJCWRydl9kYXRhLT5uX2J5dGVzID0gYml0c19wZXJfd29yZC84OwogCQlkcnZfZGF0YS0+bGVuID0gKHRyYW5zZmVyLT5sZW4pID4+IDE7CiAJCWNyX3dpZHRoID0gQklUX0NUTF9XT1JEU0laRTsKIAkJZHJ2X2RhdGEtPm9wcyA9ICZiZmluX2JmaW5fc3BpX3RyYW5zZmVyX29wc191MTY7Ci0JfSBlbHNlIGlmICgoYml0c19wZXJfd29yZCA+IDApICYmIChiaXRzX3Blcl93b3JkICUgOCA9PSAwKSkgeworCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCAlIDggPT0gMCkgewogCQlkcnZfZGF0YS0+bl9ieXRlcyA9IGJpdHNfcGVyX3dvcmQvODsKIAkJZHJ2X2RhdGEtPmxlbiA9IHRyYW5zZmVyLT5sZW47CiAJCWNyX3dpZHRoID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zM2M2NHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfczNjNjR4eC5jCmluZGV4IDc5NTgyOGIuLjg5NDVlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zM2M2NHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX3MzYzY0eHguYwpAQCAtMTE2LDkgKzExNiw3IEBACiAJCQkJCSgoKGkpLT5maWZvX2x2bF9tYXNrICsgMSkpKSBcCiAJCQkJCT8gMSA6IDApCiAKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1RfVFhfRE9ORSh2LCBpKSAoKCgodikgPj4gKGkpLT5yeF9sdmxfb2Zmc2V0KSAmIFwKLQkJCQkJKCgoaSktPmZpZm9fbHZsX21hc2sgKyAxKSA8PCAxKSkgXAotCQkJCQk/IDEgOiAwKQorI2RlZmluZSBTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHYsIGkpICgoKHYpICYgKDEgPDwgKGkpLT50eF9zdF9kb25lKSkgPyAxIDogMCkKICNkZWZpbmUgVFhfRklGT19MVkwodiwgaSkgKCgodikgPj4gNikgJiAoaSktPmZpZm9fbHZsX21hc2spCiAjZGVmaW5lIFJYX0ZJRk9fTFZMKHYsIGkpICgoKHYpID4+IChpKS0+cnhfbHZsX29mZnNldCkgJiAoaSktPmZpZm9fbHZsX21hc2spCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCmluZGV4IDgyZmViMzQuLmQ2NjIwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYwpAQCAtNTE2LDggKzUxNiwxNyBAQAogCiBzdGF0aWMgdm9pZCBzc2JfcGNpY29yZV9pbml0X2NsaWVudG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKIHsKKwlzc2JfcGNpY29yZV9maXhfc3Byb21fY29yZV9pbmRleChwYyk7CisKIAkvKiBEaXNhYmxlIFBDSSBpbnRlcnJ1cHRzLiAqLwogCXNzYl93cml0ZTMyKHBjLT5kZXYsIFNTQl9JTlRWRUMsIDApOworCisJLyogQWRkaXRpb25hbCBQQ0llIGFsd2F5cyBvbmNlLWV4ZWN1dGVkIHdvcmthcm91bmRzICovCisJaWYgKHBjLT5kZXYtPmlkLmNvcmVpZCA9PSBTU0JfREVWX1BDSUUpIHsKKwkJc3NiX3BjaWNvcmVfc2VyZGVzX3dvcmthcm91bmQocGMpOworCQkvKiBUT0RPOiBBU1BNICovCisJCS8qIFRPRE86IENsb2NrIFJlcXVlc3QgVXBkYXRlICovCisJfQogfQogCiB2b2lkIHNzYl9wY2ljb3JlX2luaXQoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKQEAgLTUyOSw4ICs1MzgsNiBAQAogCWlmICghc3NiX2RldmljZV9pc19lbmFibGVkKGRldikpCiAJCXNzYl9kZXZpY2VfZW5hYmxlKGRldiwgMCk7CiAKLQlzc2JfcGNpY29yZV9maXhfc3Byb21fY29yZV9pbmRleChwYyk7Ci0KICNpZmRlZiBDT05GSUdfU1NCX1BDSUNPUkVfSE9TVE1PREUKIAlwYy0+aG9zdG1vZGUgPSBwY2ljb3JlX2lzX2luX2hvc3Rtb2RlKHBjKTsKIAlpZiAocGMtPmhvc3Rtb2RlKQpAQCAtNTM4LDExICs1NDUsNiBAQAogI2VuZGlmIC8qIENPTkZJR19TU0JfUENJQ09SRV9IT1NUTU9ERSAqLwogCWlmICghcGMtPmhvc3Rtb2RlKQogCQlzc2JfcGNpY29yZV9pbml0X2NsaWVudG1vZGUocGMpOwotCi0JLyogQWRkaXRpb25hbCBhbHdheXMgb25jZS1leGVjdXRlZCB3b3JrYXJvdW5kcyAqLwotCXNzYl9wY2ljb3JlX3NlcmRlc193b3JrYXJvdW5kKHBjKTsKLQkvKiBUT0RPOiBBU1BNICovCi0JLyogVE9ETzogQ2xvY2sgUmVxdWVzdCBVcGRhdGUgKi8KIH0KIAogc3RhdGljIHUzMiBzc2JfcGNpZV9yZWFkKHN0cnVjdCBzc2JfcGNpY29yZSAqcGMsIHUzMiBhZGRyZXNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCBkZmMxNmY5Li4xOTYyODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtMjQsMjMgKzI0LDYgQEAKIAogaWYgU1RBR0lORwogCi1jb25maWcgU1RBR0lOR19FWENMVURFX0JVSUxECi0JYm9vbCAiRXhjbHVkZSBTdGFnaW5nIGRyaXZlcnMgZnJvbSBiZWluZyBidWlsdCIgaWYgU1RBR0lORwotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIEFyZSB5b3Ugc3VyZSB5b3UgcmVhbGx5IHdhbnQgdG8gYnVpbGQgdGhlIHN0YWdpbmcgZHJpdmVycz8KLQkgIFRoZXkgdGFpbnQgeW91ciBrZXJuZWwsIGRvbid0IGxpdmUgdXAgdG8gdGhlIG5vcm1hbCBMaW51eAotCSAga2VybmVsIHF1YWxpdHkgc3RhbmRhcmRzLCBhcmUgYSBiaXQgY3J1ZnR5IGFyb3VuZCB0aGUgZWRnZXMsCi0JICBhbmQgbWlnaHQgZ28gb2ZmIGFuZCBraWNrIHlvdXIgZG9nIHdoZW4geW91IGFyZW4ndCBwYXlpbmcKLQkgIGF0dGVudGlvbi4KLQotCSAgU2F5IE4gaGVyZSB0byBiZSBhYmxlIHRvIHNlbGVjdCBhbmQgYnVpbGQgdGhlIFN0YWdpbmcgZHJpdmVycy4KLQkgIFRoaXMgb3B0aW9uIGlzIHByaW1hcmlseSBoZXJlIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGJ1aWx0Ci0JICB3aGVuIHNlbGVjdGluZyAnbWFrZSBhbGx5ZXNjb25mZycgYW5kICdtYWtlIGFsbG1vZGNvbmZpZycgc28KLQkgIGRvbid0IGJlIGFsbCB0aGF0IHB1dCBvZmYsIHlvdXIgZG9nIHdpbGwgYmUganVzdCBmaW5lLgotCi1pZiAhU1RBR0lOR19FWENMVURFX0JVSUxECi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3R0eS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9nZW5lcmljX3NlcmlhbC9LY29uZmlnIgpAQCAtMTc3LDUgKzE2MCw0IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL252ZWMvS2NvbmZpZyIKIAotZW5kaWYgIyAhU1RBR0lOR19FWENMVURFX0JVSUxECiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYwppbmRleCA4NzYzMDg4Li44YjE2MjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzdGFnaW5nL2FsdGVyYS5oPgorI2luY2x1ZGUgImFsdGVyYS5oIgogI2luY2x1ZGUgImFsdGVyYS1leHBydC5oIgogI2luY2x1ZGUgImFsdGVyYS1qdGFnLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jCmluZGV4IDA1YWFkMzUuLjljZDVlNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHN0YWdpbmcvYWx0ZXJhLmg+CisjaW5jbHVkZSAiYWx0ZXJhLmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGFnaW5nL2FsdGVyYS5oIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9zdGFnaW5nL2FsdGVyYS5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL0tjb25maWcKaW5kZXggMWYxNWUxZi4uYWZkNmNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBBVEg2S19MRUdBQ1kKIAl0cmlzdGF0ZSAiQXRoZXJvcyBBUjYwMDMgc3VwcG9ydCAobm9uIG1hYzgwMjExKSIKICAgICAgICAgZGVwZW5kcyBvbiBNTUMgJiYgV0xBTgorCWRlcGVuZHMgb24gQ0ZHODAyMTEKICAgICAgICAgc2VsZWN0IFdJUkVMRVNTX0VYVAogICAgICAgICBzZWxlY3QgV0VYVF9QUklWCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9jZmc4MDIxMS5jCmluZGV4IDc3ZGZiNDAuLmQzYTc3NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2NmZzgwMjExLmMKQEAgLTg3MCw3ICs4NzAsOCBAQAogICAgIGlmKGFyLT5zY2FuX3JlcXVlc3QpCiAgICAgewogICAgICAgICAvKiBUcmFuc2xhdGUgZGF0YSB0byBjZmc4MDIxMSBtZ210IGZvcm1hdCAqLwotICAgICAgICB3bWlfaXRlcmF0ZV9ub2Rlcyhhci0+YXJXbWksIGFyNmtfY2ZnODAyMTFfc2Nhbl9ub2RlLCBhci0+d2Rldi0+d2lwaHkpOworCWlmIChhci0+YXJXbWkpCisJCXdtaV9pdGVyYXRlX25vZGVzKGFyLT5hcldtaSwgYXI2a19jZmc4MDIxMV9zY2FuX25vZGUsIGFyLT53ZGV2LT53aXBoeSk7CiAKICAgICAgICAgY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcXVlc3QsCiAgICAgICAgICAgICAoKHN0YXR1cyAmIEFfRUNBTkNFTEVEKSB8fCAoc3RhdHVzICYgQV9FQlVTWSkpID8gdHJ1ZSA6IGZhbHNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvS2NvbmZpZwppbmRleCBmNGNmOWIyLi4zNzljZjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gUENJCiAJZGVwZW5kcyBvbiBXTEFOICYmIE1BQzgwMjExCisJZGVwZW5kcyBvbiBYODYgfHwgTUlQUwogCXNlbGVjdCBCUkNNVVRJTAogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgQ1JDX0NDSVRUCkBAIC0yMCw2ICsyMSw3IEBACiAJZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiBNTUMKIAlkZXBlbmRzIG9uIFdMQU4gJiYgQ0ZHODAyMTEKKwlkZXBlbmRzIG9uIFg4NiB8fCBNSVBTCiAJc2VsZWN0IEJSQ01VVElMCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBXSVJFTEVTU19FWFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYwppbmRleCA5MjljZWFmLi4xNWUxYjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jCkBAIC02NCw4ICs2NCw2IEBACiBleHRlcm4gYm9vbCB3bF9pd19jb25uX3N0YXR1c19zdHIodTMyIGV2ZW50X3R5cGUsIHUzMiBzdGF0dXMsCiAJCQkJICB1MzIgcmVhc29uLCBjaGFyICpzdHJpbmdCdWYsIHVpbnQgYnVmbGVuKTsKIAotdWludCB3bF9tc2dfbGV2ZWwgPSBXTF9FUlJPUl9WQUw7Ci0KICNkZWZpbmUgTUFYX1dMSVdfSU9DVExfTEVOIDEwMjQKIAogI2lmZGVmIENPTkZJR19XSVJFTEVTU19FWFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwppbmRleCAxNTAyZDgwLi4yMDAwOGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCXRyaXN0YXRlICJEYXRhIGFjcXVpc2l0aW9uIHN1cHBvcnQgKGNvbWVkaSkiCiAJZGVmYXVsdCBOCiAJZGVwZW5kcyBvbiBtCisJZGVwZW5kcyBvbiBCUk9LRU4gfHwgRlJWIHx8IE0zMlIgfHwgTU4xMDMwMCB8fCBTVVBFUkggfHwgVElMRSB8fCBYODYKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBhIHdpZGUgcmFuZ2Ugb2YgZGF0YSBhY3F1aXNpdGlvbiBkZXZpY2VzCiAJICBmb3IgTGludXguCkBAIC0xNjAsNiArMTYxLDcgQEAKIAogY29uZmlnIENPTUVESV9QQ0w4MTIKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC04MTIvODEzIGFuZCBBRGxpbmsgQUNMLTgxMTIvODExMy84MTEzLzgyMTYiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxMi9QRywgUENMLTgxMy9CLCBBRExpbmsKQEAgLTE3MSw2ICsxNzMsNyBAQAogCiBjb25maWcgQ09NRURJX1BDTDgxNgogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTgxNCBhbmQgUENMLTgxNiBJU0EgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC04MTQgYW5kIFBDTC04MTYgSVNBIGNhcmRzCkBAIC0xODAsNiArMTgzLDcgQEAKIAogY29uZmlnIENPTUVESV9QQ0w4MTgKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC03MTggYW5kIFBDTC04MTggSVNBIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODE4IElTQSBjYXJkcwpAQCAtMjY5LDYgKzI3Myw3IEBACiAKIGNvbmZpZyBDT01FRElfREFTMTgwMAogCXRyaXN0YXRlICJEQVMxODAwIGFuZCBjb21wYXRpYmxlIElTQSBjYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCXNlbGVjdCBDT01FRElfRkMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCkBAIC0zNDAsNiArMzQ1LDcgQEAKIGNvbmZpZyBDT01FRElfRFQyODJYCiAJdHJpc3RhdGUgIkRhdGEgVHJhbnNsYXRpb24gRFQyODIxIHNlcmllcyBhbmQgRFQtRVogSVNBIGNhcmQgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJX0ZDCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBEYXRhIFRyYW5zbGF0aW9uIERUMjgyMSBzZXJpZXMgaW5jbHVkaW5nIERULUVaCkBAIC00MTksNiArNDI1LDcgQEAKIGNvbmZpZyBDT01FRElfTklfQVRfQTIxNTAKIAl0cmlzdGF0ZSAiTkkgQVQtQTIxNTAgSVNBIGNhcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENPTUVESV9OSV9DT01NT04KKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIEFULUEyMTUwIGNhcmRzCkBAIC01MzYsNiArNTQzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMDM1CiAJdHJpc3RhdGUgIkFEREktREFUQSBBUENJXzAzNSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMDM1IGNhcmRzCkBAIC01NDUsNiArNTUzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMTAzMgogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8xMDMyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8xMDMyIGNhcmRzCkBAIC01NTQsNiArNTYzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMTUwMAogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8xNTAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8xNTAwIGNhcmRzCkBAIC01NjMsNiArNTczLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMTUxNgogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8xNTE2IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8xNTE2IGNhcmRzCkBAIC01NzIsNiArNTgzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMTU2NAogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8xNTY0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8xNTY0IGNhcmRzCkBAIC01ODEsNiArNTkzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMTZYWAogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8xNnh4IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8xNnh4IGNhcmRzCkBAIC01OTAsNiArNjAzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMjAxNgogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8yMDE2IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8yMDE2IGNhcmRzCkBAIC01OTksNiArNjEzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMjAzMgogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8yMDMyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8yMDMyIGNhcmRzCkBAIC02MDgsNiArNjIzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMjIwMAogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8yMjAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8yMjAwIGNhcmRzCkBAIC02MTcsNiArNjMzLDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMzAwMQogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8zMDAxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCXNlbGVjdCBDT01FRElfRkMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCkBAIC02MjcsNiArNjQ0LDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMzEyMAogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8zNTIwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCXNlbGVjdCBDT01FRElfRkMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCkBAIC02MzcsNiArNjU1LDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfMzUwMQogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8zNTAxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8zNTAxIGNhcmRzCkBAIC02NDYsNiArNjY1LDcgQEAKIAogY29uZmlnIENPTUVESV9BRERJX0FQQ0lfM1hYWAogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8zeHh4IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRERJLURBVEEgQVBDSV8zeHh4IGNhcmRzCkBAIC03MTIsNiArNzMyLDcgQEAKIGNvbmZpZyBDT01FRElfQURMX1BDSTkxMTgKIAl0cmlzdGF0ZSAiQURMaW5rIFBDSS05MTE4REcsIFBDSS05MTE4SEcsIFBDSS05MTE4SFIgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJX0ZDCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRGxpbmsgUENJLTkxMThERywgUENJLTkxMThIRywgUENJLTkxMThIUiBjYXJkcwpAQCAtMTI4Nyw2ICsxMzA4LDcgQEAKIAlkZXBlbmRzIG9uIENPTUVESV9NSVRFCiAJc2VsZWN0IENPTUVESV84MjU1CiAJc2VsZWN0IENPTUVESV9GQworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgTGFiLVBDIGFuZCBjb21wYXRpYmxlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYwppbmRleCAxYzQ1YzExLi5hYTg3YjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYwpAQCAtNTQyLDYgKzU0Miw4IEBACiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAl1aW50MzJfdCB0dF9wYWdlczsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpwc2JfaW50ZWxfb3V0cHV0OwogCiAJZGV2X3ByaXYgPSBremFsbG9jKHNpemVvZigqZGV2X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKQEAgLTY2Myw3ICs2NjUsMTggQEAKIAkJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRldik7CiAJfQogCi0JcmV0ID0gcHNiX2JhY2tsaWdodF9pbml0KGRldik7CisJLyogT25seSBhZGQgYmFja2xpZ2h0IHN1cHBvcnQgaWYgd2UgaGF2ZSBMVkRTIG91dHB1dCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwKKwkJCSAgICBoZWFkKSB7CisJCXBzYl9pbnRlbF9vdXRwdXQgPSB0b19wc2JfaW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwkJc3dpdGNoIChwc2JfaW50ZWxfb3V0cHV0LT50eXBlKSB7CisJCWNhc2UgSU5URUxfT1VUUFVUX0xWRFM6CisJCQlyZXQgPSBwc2JfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKICNpZiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZmIuYwppbmRleCA5OWMwM2EyLi4wODRjMzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ZiLmMKQEAgLTQ0MSw2ICs0NDEsMTYgQEAKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNpemU7CiAJbWVtc2V0KGluZm8tPnNjcmVlbl9iYXNlLCAwLCBzaXplKTsKIAorCWlmIChkZXZfcHJpdi0+cGctPnN0b2xlbl9zaXplKSB7CisJCWluZm8tPmFwZXJ0dXJlcyA9IGFsbG9jX2FwZXJ0dXJlcygxKTsKKwkJaWYgKCFpbmZvLT5hcGVydHVyZXMpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnIwOworCQl9CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2U7CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLnNpemUgPSBkZXZfcHJpdi0+cGctPnN0b2xlbl9zaXplOworCX0KKwogCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOwogCWRybV9mYl9oZWxwZXJfZmlsbF92YXIoaW5mbywgJmZiZGV2LT5wc2JfZmJfaGVscGVyLAogCQkJCXNpemVzLT5mYl93aWR0aCwgc2l6ZXMtPmZiX2hlaWdodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9iaW9zLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9iaW9zLmMKaW5kZXggNDhhYzhiYS4uNDE3OTY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfYmlvcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2Jpb3MuYwpAQCAtMTU0LDEwICsxNTQsMTUgQEAKIAogCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHBhbmVsX2ZpeGVkX21vZGUsIGR2b190aW1pbmcpOwogCi0JZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9tb2RlID0gcGFuZWxfZml4ZWRfbW9kZTsKLQotCURSTV9ERUJVRygiRm91bmQgcGFuZWwgbW9kZSBpbiBCSU9TIFZCVCB0YWJsZXM6XG4iKTsKLQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOworCWlmIChwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPiAwICYmIHBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA+IDApIHsKKwkJZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9tb2RlID0gcGFuZWxfZml4ZWRfbW9kZTsKKwkJRFJNX0RFQlVHKCJGb3VuZCBwYW5lbCBtb2RlIGluIEJJT1MgVkJUIHRhYmxlczpcbiIpOworCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOworCX0gZWxzZSB7CisJCURSTV9ERUJVRygiSWdub3JpbmcgYm9ndXMgTFZEUyBWQlQgbW9kZS5cbiIpOworCQlkZXZfcHJpdi0+bHZkc192YnQgPSAwOworCQlrZnJlZShwYW5lbF9maXhlZF9tb2RlKTsKKwl9CiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKaW5kZXggZjk2ZDViNS4uZDMyOTYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKIAogbWVudWNvbmZpZyBJSU8KIAl0cmlzdGF0ZSAiSW5kdXN0cmlhbCBJL08gc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiBHRU5FUklDX0hBUkRJUlFTCiAJaGVscAogCSAgVGhlIGluZHVzdHJpYWwgSS9PIHN1YnN5c3RlbSBwcm92aWRlcyBhIHVuaWZpZWQgZnJhbWV3b3JrIGZvcgogCSAgZHJpdmVycyBmb3IgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgZW1iZWRkZWQgc2Vuc29ycyB1c2luZyBhCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaAppbmRleCAwYjliODU0Li40Y2MxYTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKQEAgLTgxLDcgKzgxLDYgQEAKIAogaW50IGFkaXMxNjIwMV9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIGVudW0gYWRpczE2MjAxX3NjYW4gewogCUFESVMxNjIwMV9TQ0FOX1NVUFBMWSwKIAlBRElTMTYyMDFfU0NBTl9BQ0NfWCwKQEAgLTkyLDYgKzkxLDcgQEAKIAlBRElTMTYyMDFfU0NBTl9JTkNMSV9ZLAogfTsKIAorI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIHZvaWQgYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaAppbmRleCA4YmI4Y2U1Li4xNzVlMjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKQEAgLTc2LDcgKzc2LDYgQEAKIAogaW50IGFkaXMxNjIwM19zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIGVudW0gYWRpczE2MjAzX3NjYW4gewogCUFESVMxNjIwM19TQ0FOX1NVUFBMWSwKIAlBRElTMTYyMDNfU0NBTl9BVVhfQURDLApAQCAtODUsNiArODQsNyBAQAogCUFESVMxNjIwM19TQ0FOX0lOQ0xJX1ksCiB9OwogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oCmluZGV4IDUzMTBhNDIuLjE2OTBjMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApAQCAtODQsNyArODQsNiBAQAogCiBpbnQgYWRpczE2MjA0X3NldF9pcnEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgYm9vbCBlbmFibGUpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogZW51bSBhZGlzMTYyMDRfc2NhbiB7CiAJQURJUzE2MjA0X1NDQU5fU1VQUExZLAogCUFESVMxNjIwNF9TQ0FOX0FDQ19YLApAQCAtOTMsNiArOTIsNyBAQAogCUFESVMxNjIwNF9TQ0FOX1RFTVAsCiB9OwogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCmluZGV4IDU4ZDA4ZGIuLjMxNTNjYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaApAQCAtMTIxLDggKzEyMSw2IEBACiAKIGludCBhZGlzMTYyMDlfc2V0X2lycShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBib29sIGVuYWJsZSk7CiAKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCi0KICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fU1VQUExZCTAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fQUNDX1gJMQogI2RlZmluZSBBRElTMTYyMDlfU0NBTl9BQ0NfWQkyCkBAIC0xMzIsNiArMTMwLDggQEAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fSU5DTElfWQk2CiAjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX1JPVAk3CiAKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCisKIHZvaWQgYWRpczE2MjA5X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjIwOV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9tYXg1MTcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jCmluZGV4IDg4MTc2OGQuLjJmZTM0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbWF4NTE4X2luZm8gPSB7Ci0JLmF0dHJzID0gJm1heDUxN19hdHRyaWJ1dGVfZ3JvdXAsCisJLmF0dHJzID0gJm1heDUxOF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaAppbmRleCA3MDJkYzk4Li4yNGJmNzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCkBAIC0xMDQsNyArMTA0LDYgQEAKIAogaW50IGFkaXMxNjI2MF9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIC8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKICAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKICAqLwpAQCAtMTE1LDYgKzExNCw3IEBACiAjZGVmaW5lIEFESVMxNjI2MF9TQ0FOX1RFTVAJMwogI2RlZmluZSBBRElTMTYyNjBfU0NBTl9BTkdMCTQKIAorI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIHZvaWQgYWRpczE2MjYwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjI2MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCmluZGV4IGRiMTg0ZDEuLmU4NzcxNWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDAuaApAQCAtMTU4LDcgKzE1OCw2IEBACiAKIGludCBhZGlzMTY0MDBfc2V0X2lycShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBib29sIGVuYWJsZSk7CiAKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCiAvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCiAgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCiAgKi8KQEAgLTE4Miw2ICsxODEsNyBAQAogI2RlZmluZSBBRElTMTYzMDBfU0NBTl9JTkNMSV9YCTEyCiAjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX0lOQ0xJX1kJMTMKIAorI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIHZvaWQgYWRpczE2NDAwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjQwMF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYwppbmRleCAyNTg5YTdlLi4zNjEyMzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKQEAgLTEzNywxMyArMTM3LDEzIEBACiAJCWlmIChzdC0+dmFyaWFudC0+ZmxhZ3MgJiBBRElTMTY0MDBfTk9fQlVSU1QpIHsKIAkJCXJldCA9IGFkaXMxNjM1MF9zcGlfcmVhZF9hbGwoJmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGVycjsKIAkJCWZvciAoOyBpIDwgcmluZy0+c2Nhbl9jb3VudDsgaSsrKQogCQkJCWRhdGFbaV0JPSAqKHMxNiAqKShzdC0+cnggKyBpKjIpOwogCQl9IGVsc2UgewogCQkJcmV0ID0gYWRpczE2NDAwX3NwaV9yZWFkX2J1cnN0KCZpbmRpb19kZXYtPmRldiwgc3QtPnJ4KTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byBlcnI7CiAJCQlmb3IgKDsgaSA8IGluZGlvX2Rldi0+cmluZy0+c2Nhbl9jb3VudDsgaSsrKSB7CiAJCQkJaiA9IF9fZmZzKG1hc2spOwogCQkJCW1hc2sgJj0gfigxIDw8IGopOwpAQCAtMTU4LDkgKzE1OCwxMyBAQAogCXJpbmctPmFjY2Vzcy0+c3RvcmVfdG8oaW5kaW9fZGV2LT5yaW5nLCAodTggKikgZGF0YSwgcGYtPnRpbWVzdGFtcCk7CiAKIAlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOwotCWtmcmVlKGRhdGEpOwogCisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOworCitlcnI6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBhZGlzMTY0MDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCmluZGV4IDYxNTkwMjMuLmQ1MDRhYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKQEAgLTI5NCw2ICsyOTQsNyBAQAogCXBmLT5oID0gaDsKIAlwZi0+dGhyZWFkID0gdGhyZWFkOwogCXBmLT50eXBlID0gdHlwZTsKKwlwZi0+cHJpdmF0ZV9kYXRhID0gcHJpdmF0ZTsKIAogCXJldHVybiBwZjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pbW9uLmMKaW5kZXggNDAzOWVkYS4uNGE5ZTU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pbW9uLmMKQEAgLTY3Miw4ICs2NzIsNiBAQAogc3RhdGljIHZvaWQgdXNiX3J4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0OwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQlpbnQgbGVuOwogCWludCBpbnRmbnVtID0gMDsKIAogCWlmICghdXJiKQpAQCAtNjgzLDkgKzY4MSw2IEBACiAJaWYgKCFjb250ZXh0KQogCQlyZXR1cm47CiAKLQlidWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlsZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0KIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAtRU5PRU5UOgkJLyogdXNiY29yZSB1bmxpbmsgc3VjY2Vzc2Z1bCEgKi8KIAkJcmV0dXJuOwpAQCAtNzI4LDcgKzcyMyw2IEBACiAJaW50IGlyX2VwX2ZvdW5kID0gMDsKIAlpbnQgYWxsb2Nfc3RhdHVzID0gMDsKIAlpbnQgdmZkX3Byb3RvXzZwID0gMDsKLQlpbnQgY29kZV9sZW5ndGg7CiAJc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dCA9IE5VTEw7CiAJaW50IGk7CiAJdTE2IHZlbmRvciwgcHJvZHVjdDsKQEAgLTc0OSw4ICs3NDMsNiBAQAogCWVsc2UKIAkJY29udGV4dC0+ZGlzcGxheSA9IDE7CiAKLQljb2RlX2xlbmd0aCA9IEJVRl9DSFVOS19TSVpFICogODsKLQogCXVzYmRldiAgICAgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwogCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCW51bV9lbmRwdHMgPSBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7CkBAIC04NTYsNyArODQ4LDcgQEAKIAogCXN0cmNweShkcml2ZXItPm5hbWUsIE1PRF9OQU1FKTsKIAlkcml2ZXItPm1pbm9yID0gLTE7Ci0JZHJpdmVyLT5jb2RlX2xlbmd0aCA9IHNpemVvZihpbnQpICogODsKKwlkcml2ZXItPmNvZGVfbGVuZ3RoID0gQlVGX0NIVU5LX1NJWkUgKiA4OwogCWRyaXZlci0+c2FtcGxlX3JhdGUgPSAwOwogCWRyaXZlci0+ZmVhdHVyZXMgPSBMSVJDX0NBTl9SRUNfTU9ERTI7CiAJZHJpdmVyLT5kYXRhID0gY29udGV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCmluZGV4IDRhM2NjYTAuLjgwNWRmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zZXJpYWwuYwpAQCAtODM4LDcgKzgzOCwyMyBAQAogCiBzdGF0aWMgaW50IGluaXRfcG9ydCh2b2lkKQogewotCWludCBpLCBubG93LCBuaGlnaDsKKwlpbnQgaSwgbmxvdywgbmhpZ2gsIHJlc3VsdDsKKworCXJlc3VsdCA9IHJlcXVlc3RfaXJxKGlycSwgaXJxX2hhbmRsZXIsCisJCQkgICAgIElSUUZfRElTQUJMRUQgfCAoc2hhcmVfaXJxID8gSVJRRl9TSEFSRUQgOiAwKSwKKwkJCSAgICAgTElSQ19EUklWRVJfTkFNRSwgKHZvaWQgKikmaGFyZHdhcmUpOworCisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIC1FQlVTWToKKwkJcHJpbnRrKEtFUk5fRVJSIExJUkNfRFJJVkVSX05BTUUgIjogSVJRICVkIGJ1c3lcbiIsIGlycSk7CisJCXJldHVybiAtRUJVU1k7CisJY2FzZSAtRUlOVkFMOgorCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogQmFkIGlycSBudW1iZXIgb3IgaGFuZGxlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CiAKIAkvKiBSZXNlcnZlIGlvIHJlZ2lvbi4gKi8KIAkvKgpAQCAtODkzLDM0ICs5MDksMTcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyBMSVJDX0RSSVZFUl9OQU1FICAiOiBNYW51YWxseSB1c2luZyBhY3RpdmUgIgogCQkgICAgICAgIiVzIHJlY2VpdmVyXG4iLCBzZW5zZSA/ICJsb3ciIDogImhpZ2giKTsKIAorCWRwcmludGsoIkludGVycnVwdCAlZCwgcG9ydCAlMDR4IG9idGFpbmVkXG4iLCBpcnEsIGlvKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzZXRfdXNlX2luYyh2b2lkICpkYXRhKQogewotCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGluaXRpYWxpemUgdGltZXN0YW1wICovCiAJZG9fZ2V0dGltZW9mZGF5KCZsYXN0dHYpOwogCi0JcmVzdWx0ID0gcmVxdWVzdF9pcnEoaXJxLCBpcnFfaGFuZGxlciwKLQkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IChzaGFyZV9pcnEgPyBJUlFGX1NIQVJFRCA6IDApLAotCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCAodm9pZCAqKSZoYXJkd2FyZSk7Ci0KLQlzd2l0Y2ggKHJlc3VsdCkgewotCWNhc2UgLUVCVVNZOgotCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRSAiOiBJUlEgJWQgYnVzeVxuIiwgaXJxKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQljYXNlIC1FSU5WQUw6Ci0JCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FCi0JCSAgICAgICAiOiBCYWQgaXJxIG51bWJlciBvciBoYW5kbGVyXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGVmYXVsdDoKLQkJZHByaW50aygiSW50ZXJydXB0ICVkLCBwb3J0ICUwNHggb2J0YWluZWRcbiIsIGlycSwgaW8pOwotCQlicmVhazsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGFyZHdhcmVbdHlwZV0ubG9jaywgZmxhZ3MpOwogCiAJLyogU2V0IERMQUIgMC4gKi8KQEAgLTk0NSwxMCArOTQ0LDYgQEAKIAlzb3V0cChVQVJUX0lFUiwgc2lucChVQVJUX0lFUikgJgogCSAgICAgICh+KFVBUlRfSUVSX01TSXxVQVJUX0lFUl9STFNJfFVBUlRfSUVSX1RIUkl8VUFSVF9JRVJfUkRJKSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKLQotCWZyZWVfaXJxKGlycSwgKHZvaWQgKikmaGFyZHdhcmUpOwotCi0JZHByaW50aygiZnJlZWQgSVJRICVkXG4iLCBpcnEpOwogfQogCiBzdGF0aWMgc3NpemVfdCBsaXJjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCkBAIC0xMjU2LDYgKzEyNTEsOSBAQAogc3RhdGljIHZvaWQgX19leGl0IGxpcmNfc2VyaWFsX2V4aXRfbW9kdWxlKHZvaWQpCiB7CiAJbGlyY19zZXJpYWxfZXhpdCgpOworCisJZnJlZV9pcnEoaXJxLCAodm9pZCAqKSZoYXJkd2FyZSk7CisKIAlpZiAoaW9tbWFwICE9IDApCiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihpb21tYXAsIDggPDwgaW9zaGlmdCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMKaW5kZXggYTdiNDZmMi4uMGQzODY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jCkBAIC03MzksMjMgKzczOSwxNiBAQAogc3RhdGljIHZvaWQgc2VuZF9wdWxzZSh1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlsb25nIGJ5dGVzX291dCA9IGxlbiAvIFRJTUVfQ09OU1Q7Ci0JbG9uZyB0aW1lX2xlZnQ7CiAKLQl0aW1lX2xlZnQgPSAobG9uZylsZW4gLSAobG9uZylieXRlc19vdXQgKiAobG9uZylUSU1FX0NPTlNUOwotCWlmIChieXRlc19vdXQgPT0gMCkgeworCWlmIChieXRlc19vdXQgPT0gMCkKIAkJYnl0ZXNfb3V0Kys7Ci0JCXRpbWVfbGVmdCA9IDA7Ci0JfQorCiAJd2hpbGUgKGJ5dGVzX291dC0tKSB7CiAJCW91dGIoUFVMU0UsIGlvICsgVUFSVF9UWCk7CiAJCS8qIEZJWE1FIHRyZWJhIHNlcmlvem5lIGNha2FuaWUgeiBjaGFyL3NlcmlhbC5jICovCiAJCXdoaWxlICghKGluYihpbyArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkUpKQogCQkJOwogCX0KLSNpZiAwCi0JaWYgKHRpbWVfbGVmdCA+IDApCi0JCXNhZmVfdWRlbGF5KHRpbWVfbGVmdCk7Ci0jZW5kaWYKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMKaW5kZXggZGQ2YTU3Yy4uNGUwNTFmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYwpAQCAtNDc1LDE0ICs0NzUsMTQgQEAKIAlkcHJpbnRrKCJwb2xsIHRocmVhZCBzdGFydGVkXG4iKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKIAkJLyogaWYgZGV2aWNlIG5vdCBvcGVuZWQsIHdlIGNhbiBzbGVlcCBoYWxmIGEgc2Vjb25kICovCiAJCWlmIChhdG9taWNfcmVhZCgmaXItPm9wZW5fY291bnQpID09IDApIHsKIAkJCXNjaGVkdWxlX3RpbWVvdXQoSFovMik7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KIAkJLyoKIAkJICogVGhpcyBpcyB+MTEzKjIgKyAyNCArIGppdHRlciAoMipyZXBlYXQgZ2FwICsgY29kZSBsZW5ndGgpLgogCQkgKiBXZSB1c2UgdGhpcyBpbnRlcnZhbCBhcyB0aGUgY2hpcCByZXNldHMgZXZlcnkgdGltZSB5b3UgcG9sbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laS9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYwppbmRleCAyODE4ODUxLi42ODVmY2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCX0KIAotCWlmICghZXJyICYmICFkZXYtPnJlY3ZkX21zZykgeworCWlmIChlcnIgPD0gMCAmJiAhZGV2LT5yZWN2ZF9tc2cpIHsKIAkJZGV2LT5tZWlfc3RhdGUgPSBNRUlfRElTQUJMRUQ7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAogCQkJIndhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0IGZhaWxlZCIKQEAgLTIwNSwxMCArMjA1LDEwIEBACiAJCQkiaG9zdF9od19zdGF0ZSA9IDB4JTA4eCwgbWVfaHdfc3RhdGUgPSAweCUwOHguXG4iLAogCQkJZGV2LT5ob3N0X2h3X3N0YXRlLCBkZXYtPm1lX2h3X3N0YXRlKTsKIAotCQlpZiAoIShkZXYtPmhvc3RfaHdfc3RhdGUgJiBIX1JEWSkgIT0gSF9SRFkpCisJCWlmICghKGRldi0+aG9zdF9od19zdGF0ZSAmIEhfUkRZKSkKIAkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaG9zdCB0dXJuIG9mZiBIX1JEWS5cbiIpOwogCi0JCWlmICghKGRldi0+bWVfaHdfc3RhdGUgJiBNRV9SRFlfSFJBKSAhPSBNRV9SRFlfSFJBKQorCQlpZiAoIShkZXYtPm1lX2h3X3N0YXRlICYgTUVfUkRZX0hSQSkpCiAJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIk1FIHR1cm4gb2ZmIE1FX1JEWS5cbiIpOwogCiAJCXByaW50ayhLRVJOX0VSUiAibWVpOiBsaW5rIGxheWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laS93ZC5jIGIvZHJpdmVycy9zdGFnaW5nL21laS93ZC5jCmluZGV4IDI1NjRiMDMuLmZmZjUzZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvd2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL3dkLmMKQEAgLTE2OSwxMCArMTY5LDE1IEBACiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53YWl0X3N0b3Bfd2QsCiAJCQkJCWRldi0+d2Rfc3RvcHBlZCwgMTAgKiBIWik7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0JaWYgKCFkZXYtPndkX3N0b3BwZWQpCi0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic3RvcCB3ZCBmYWlsZWQgdG8gY29tcGxldGUuXG4iKTsKLQllbHNlCi0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic3RvcCB3ZCBjb21wbGV0ZS5cbiIpOworCWlmIChkZXYtPndkX3N0b3BwZWQpIHsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJzdG9wIHdkIGNvbXBsZXRlIHJldD0lZC5cbiIsIHJldCk7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSAtRVRJTUVET1VUOworCQlkZXZfd2FybigmZGV2LT5wZGV2LT5kZXYsCisJCQkic3RvcCB3ZCBmYWlsZWQgdG8gY29tcGxldGUgcmV0PSVkLlxuIiwgcmV0KTsKKwl9CiAKIAlpZiAocHJlc2VydmUpCiAJCWRldi0+d2RfdGltZW91dCA9IHdkX3RpbWVvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWcKaW5kZXggYjA1MzA2Ny4uZmU0MGUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAl0cmlzdGF0ZSAiT25lIExhcHRvcCBQZXIgQ2hpbGQgRGlzcGxheSBDT050cm9sbGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBPTFBDICYmIEZCCiAJc2VsZWN0IEkyQworCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJLS0taGVscC0tLQogCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBPTFBDIFhPIERDT04gY29udHJvbGxlci4gIFRoaXMgY29udHJvbGxlciBpcwogCSAgb25seSBhdmFpbGFibGUgb24gT0xQQyBwbGF0Zm9ybXMuICAgVW5sZXNzIHlvdSBoYXZlIG9uZSBvZiB0aGVzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zZC5jCmluZGV4IGJkZGIwMzEuLmNkYWU0OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3Ivc2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NkLmMKQEAgLTIzMjgsNyArMjMyOCw3IEBACiAKIAkJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgSU9fU0VORF9PUF9DT05ELCAwLCBTRF9SU1BfVFlQRV9SNCwgcnNwLCA1KTsKIAkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlpbnQgZnVuY19udW0gPSAocnNwWzFdID4+IDQpICYmIDB4MDc7CisJCQkJaW50IGZ1bmNfbnVtID0gKHJzcFsxXSA+PiA0KSAmIDB4MDc7CiAJCQkJaWYgKGZ1bmNfbnVtKSB7CiAJCQkJCVJUU1hfREVCVUdQKCJTRF9JTyBjYXJkIChGdW5jdGlvbiBudW1iZXI6ICVkKSFcbiIsIGZ1bmNfbnVtKTsKIAkJCQkJY2hpcC0+c2RfaW8gPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYwppbmRleCA2ZTk5ZWM4Li44Y2JlYTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYwpAQCAtMjYsNiArMjYsOCBAQAogc3RhdGljIGludCBzdHViX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBzdGF0aWMgdm9pZCBzdHViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CitzdGF0aWMgaW50IHN0dWJfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworc3RhdGljIGludCBzdHViX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CiAKIC8qCiAgKiBEZWZpbmUgZGV2aWNlIElEcyBoZXJlIGlmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgbGltaXQgZXhwb3J0YWJsZSBkZXZpY2VzLgpAQCAtNTksNiArNjEsOCBAQAogCS5wcm9iZQkJPSBzdHViX3Byb2JlLAogCS5kaXNjb25uZWN0CT0gc3R1Yl9kaXNjb25uZWN0LAogCS5pZF90YWJsZQk9IHN0dWJfdGFibGUsCisJLnByZV9yZXNldAk9IHN0dWJfcHJlX3Jlc2V0LAorCS5wb3N0X3Jlc2V0CT0gc3R1Yl9wb3N0X3Jlc2V0LAogfTsKIAogLyoKQEAgLTU0MSwzICs1NDUsMjAgQEAKIAkJZGVsX21hdGNoX2J1c2lkKChjaGFyICopdWRldl9idXNpZCk7CiAJfQogfQorCisvKiAKKyAqIFByZXNlbmNlIG9mIHByZV9yZXNldCBhbmQgcG9zdF9yZXNldCBwcmV2ZW50cyB0aGUgZHJpdmVyIGZyb20gYmVpbmcgdW5ib3VuZAorICogd2hlbiB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlc2V0CisgKi8KKyAKK2ludCBzdHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAicHJlX3Jlc2V0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN0dWJfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAicG9zdF9yZXNldFxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwppbmRleCBhNWMxZmExLi5iYzU3ODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKQEAgLTE3NSwxNiArMTc1LDE4IEBACiAJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJ1c2JfcXVldWVfcmVzZXRfZGV2aWNlXG4iKTsKIAogCS8qCi0JICogdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCBjYXVzZWQgYSBkZWFkbG9jazogaXQgY2F1c2VzIHRoZSBkcml2ZXIKLQkgKiB0byB1bmJpbmQuIEluIHRoZSBzaHV0ZG93biB0aGUgcnggdGhyZWFkIGlzIHNpZ25hbGxlZCB0byBzaHV0IGRvd24KLQkgKiBidXQgdGhpcyB0aHJlYWQgaXMgcGVuZGluZyBpbiB0aGUgdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldC4KLQkgKgotCSAqIEluc3RlYWQgcXVldWUgdGhlIHJlc2V0LgotCSAqCi0JICogVW5mb3J0dW5hdGx5IGFuIGV4aXN0aW5nIHVzYmlwIGNvbm5lY3Rpb24gd2lsbCBiZSBkcm9wcGVkIGR1ZSB0bwotCSAqIGRyaXZlciB1bmJpbmRpbmcuCisJICogV2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgcHJlX3Jlc2V0IGFuZCBwb3N0X3Jlc2V0IHRoZSBkcml2ZXIgbm8gCisJICogbG9uZ2VyIHVuYmluZHMuIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2Ygc3luY2hyb25vdXMgcmVzZXQuCiAJICovCi0JdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShzZGV2LT5pbnRlcmZhY2UpOworCisJaWYgKHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoc2Rldi0+dWRldiwgc2Rldi0+aW50ZXJmYWNlKTwwKQorCXsKKwkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgImNvdWxkIG5vdCBvYnRhaW4gbG9jayB0byByZXNldCBkZXZpY2VcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJdXNiX3Jlc2V0X2RldmljZShzZGV2LT51ZGV2KTsKKwl1c2JfdW5sb2NrX2RldmljZShzZGV2LT51ZGV2KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwppbmRleCBkZWUyYTJjLi43MGMyZTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKQEAgLTM4Niw3ICszODYsNyBAQAogCSAqLwogCXNlX2NtZC0+c2VfdG1yX3JlcSA9IGNvcmVfdG1yX2FsbG9jX3JlcShzZV9jbWQsICh2b2lkICopdGxfdG1yLAogCQkJCVRNUl9MVU5fUkVTRVQpOwotCWlmICghc2VfY21kLT5zZV90bXJfcmVxKQorCWlmIChJU19FUlIoc2VfY21kLT5zZV90bXJfcmVxKSkKIAkJZ290byByZWxlYXNlOwogCS8qCiAJICogTG9jYXRlIHRoZSB1bmRlcmx5aW5nIFRDTSBzdHJ1Y3Qgc2VfbHVuIGZyb20gc2MtPmRldmljZS0+bHVuCkBAIC0xMDE3LDYgKzEwMTcsNyBAQAogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZzsKIAlzdHJ1Y3QgdGNtX2xvb3BfaGJhICp0bF9oYmEgPSB0bF90cGctPnRsX2hiYTsKIAlzdHJ1Y3QgdGNtX2xvb3BfbmV4dXMgKnRsX25leHVzOworCWludCByZXQgPSAtRU5PTUVNOwogCiAJaWYgKHRsX3RwZy0+dGxfaGJhLT50bF9uZXh1cykgewogCQlwcmludGsoS0VSTl9JTkZPICJ0bF90cGctPnRsX2hiYS0+dGxfbmV4dXMgYWxyZWFkeSBleGlzdHNcbiIpOwpAQCAtMTAzMyw4ICsxMDM0LDEwIEBACiAJICogSW5pdGlhbGl6ZSB0aGUgc3RydWN0IHNlX3Nlc3Npb24gcG9pbnRlcgogCSAqLwogCXRsX25leHVzLT5zZV9zZXNzID0gdHJhbnNwb3J0X2luaXRfc2Vzc2lvbigpOwotCWlmICghdGxfbmV4dXMtPnNlX3Nlc3MpCisJaWYgKElTX0VSUih0bF9uZXh1cy0+c2Vfc2VzcykpIHsKKwkJcmV0ID0gUFRSX0VSUih0bF9uZXh1cy0+c2Vfc2Vzcyk7CiAJCWdvdG8gb3V0OworCX0KIAkvKgogCSAqIFNpbmNlIHdlIGFyZSBydW5uaW5nIGluICdkZW1vIG1vZGUnIHRoaXMgY2FsbCB3aXRoIGdlbmVyYXRlIGEKIAkgKiBzdHJ1Y3Qgc2Vfbm9kZV9hY2wgZm9yIHRoZSB0Y21fbG9vcCBzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwIHdpdGggdGhlIFNDU0kKQEAgLTEwNjAsNyArMTA2Myw3IEBACiAKIG91dDoKIAlrZnJlZSh0bF9uZXh1cyk7Ci0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB0Y21fbG9vcF9kcm9wX25leHVzKApAQCAtMTE0MCw3ICsxMTQzLDcgQEAKIAkgKiB0aGUgZmFicmljIHByb3RvY29sX2lkIHNldCBpbiB0Y21fbG9vcF9tYWtlX3Njc2lfaGJhKCksIGFuZCBjYWxsCiAJICogdGNtX2xvb3BfbWFrZV9uZXh1cygpCiAJICovCi0JaWYgKHN0cmxlbihwYWdlKSA+IFRMX1dXTl9BRERSX0xFTikgeworCWlmIChzdHJsZW4ocGFnZSkgPj0gVExfV1dOX0FERFJfTEVOKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRW11bGF0ZWQgTkFBIFNhcyBBZGRyZXNzOiAlcywgZXhjZWVkcyIKIAkJCQkiIG1heDogJWRcbiIsIHBhZ2UsIFRMX1dXTl9BRERSX0xFTik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTMyMSw3ICsxMzI0LDcgQEAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogY2hlY2tfbGVuOgotCWlmIChzdHJsZW4obmFtZSkgPiBUTF9XV05fQUREUl9MRU4pIHsKKwlpZiAoc3RybGVuKG5hbWUpID49IFRMX1dXTl9BRERSX0xFTikgewogCQlwcmludGsoS0VSTl9FUlIgIkVtdWxhdGVkIE5BQSAlcyBBZGRyZXNzOiAlcywgZXhjZWVkcyIKIAkJCSIgbWF4OiAlZFxuIiwgbmFtZSwgdGNtX2xvb3BfZHVtcF9wcm90b19pZCh0bF9oYmEpLAogCQkJVExfV1dOX0FERFJfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jCmluZGV4IGVlNmZhZDkuLjI1YzFmNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBwYXNzZWQgZmFicmljIG5hbWVcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaWYgKHN0cmxlbihuYW1lKSA+IFRBUkdFVF9GQUJSSUNfTkFNRV9TSVpFKSB7CisJaWYgKHN0cmxlbihuYW1lKSA+PSBUQVJHRVRfRkFCUklDX05BTUVfU0laRSkgewogCQlwcmludGsoS0VSTl9FUlIgIlBhc3NlZCBuYW1lOiAlcyBleGNlZWRzIFRBUkdFVF9GQUJSSUMiCiAJCQkiX05BTUVfU0laRVxuIiwgbmFtZSk7CiAJCXJldHVybiBOVUxMOwpAQCAtMzEyLDcgKzMxMiw3IEBACiAKIAl0ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEodGYpKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dXJuIE5VTEw7CiAKIAlJTklUX0xJU1RfSEVBRCgmdGYtPnRmX2xpc3QpOwogCWF0b21pY19zZXQoJnRmLT50Zl9hY2Nlc3NfY250LCAwKTsKQEAgLTg1MSw3ICs4NTEsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JaWYgKChzdHJsZW4ocGFnZSkgKyAxKSA+IElOUVVJUllfVlBEX1NFUklBTF9MRU4pIHsKKwlpZiAoc3RybGVuKHBhZ2UpID49IElOUVVJUllfVlBEX1NFUklBTF9MRU4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFbXVsYXRlZCBWUEQgVW5pdCBTZXJpYWwgZXhjZWVkcyIKIAkJIiBJTlFVSVJZX1ZQRF9TRVJJQUxfTEVOOiAlZFxuIiwgSU5RVUlSWV9WUERfU0VSSUFMX0xFTik7CiAJCXJldHVybiAtRU9WRVJGTE9XOwpAQCAtOTE3LDcgKzkxNyw3IEBACiAKIAkJdHJhbnNwb3J0X2R1bXBfdnBkX3Byb3RvX2lkKHZwZCwgYnVmLCBWUERfVE1QX0JVRl9TSVpFKTsKIAotCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID4gUEFHRV9TSVpFKSkKKwkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+PSBQQUdFX1NJWkUpKQogCQkJYnJlYWs7CiAKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIGJ1Zik7CkBAIC05NjIsMTkgKzk2MiwxOSBAQAogCQkJCQkJCQkJXAogCQltZW1zZXQoYnVmLCAwLCBWUERfVE1QX0JVRl9TSVpFKTsJCQlcCiAJCXRyYW5zcG9ydF9kdW1wX3ZwZF9hc3NvYyh2cGQsIGJ1ZiwgVlBEX1RNUF9CVUZfU0laRSk7CVwKLQkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+IFBBR0VfU0laRSkpCQkJXAorCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID49IFBBR0VfU0laRSkpCQkJXAogCQkJYnJlYWs7CQkJCQkJXAogCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVzIiwgYnVmKTsJCQlcCiAJCQkJCQkJCQlcCiAJCW1lbXNldChidWYsIDAsIFZQRF9UTVBfQlVGX1NJWkUpOwkJCVwKIAkJdHJhbnNwb3J0X2R1bXBfdnBkX2lkZW50X3R5cGUodnBkLCBidWYsIFZQRF9UTVBfQlVGX1NJWkUpOyBcCi0JCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPiBQQUdFX1NJWkUpKQkJCVwKKwkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+PSBQQUdFX1NJWkUpKQkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIGJ1Zik7CQkJXAogCQkJCQkJCQkJXAogCQltZW1zZXQoYnVmLCAwLCBWUERfVE1QX0JVRl9TSVpFKTsJCQlcCiAJCXRyYW5zcG9ydF9kdW1wX3ZwZF9pZGVudCh2cGQsIGJ1ZiwgVlBEX1RNUF9CVUZfU0laRSk7IFwKLQkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+IFBBR0VfU0laRSkpCQkJXAorCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID49IFBBR0VfU0laRSkpCQkJXAogCQkJYnJlYWs7CQkJCQkJXAogCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVzIiwgYnVmKTsJCQlcCiAJfQkJCQkJCQkJXApAQCAtMTI5OSw3ICsxMjk5LDcgQEAKIAkJCSZpX2J1ZlswXSA6ICIiLCBwcl9yZWctPnByX3Jlc19rZXksCiAJCQlwcl9yZWctPnByX3Jlc19nZW5lcmF0aW9uKTsKIAotCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID4gUEFHRV9TSVpFKSkKKwkJaWYgKChsZW4gKyBzdHJsZW4oYnVmKSA+PSBQQUdFX1NJWkUpKQogCQkJYnJlYWs7CiAKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIGJ1Zik7CkBAIC0xNDk2LDcgKzE0OTYsNyBAQAogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAoc3RybGVuKGlfcG9ydCkgPiBQUl9BUFRQTF9NQVhfSVBPUlRfTEVOKSB7CisJCQlpZiAoc3RybGVuKGlfcG9ydCkgPj0gUFJfQVBUUExfTUFYX0lQT1JUX0xFTikgewogCQkJCXByaW50ayhLRVJOX0VSUiAiQVBUUEwgbWV0YWRhdGEgaW5pdGlhdG9yX25vZGU9IgogCQkJCQkiIGV4Y2VlZHMgUFJfQVBUUExfTUFYX0lQT1JUX0xFTjogJWRcbiIsCiAJCQkJCVBSX0FQVFBMX01BWF9JUE9SVF9MRU4pOwpAQCAtMTUxMCw3ICsxNTEwLDcgQEAKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJaWYgKHN0cmxlbihpc2lkKSA+IFBSX1JFR19JU0lEX0xFTikgeworCQkJaWYgKHN0cmxlbihpc2lkKSA+PSBQUl9SRUdfSVNJRF9MRU4pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkFQVFBMIG1ldGFkYXRhIGluaXRpYXRvcl9pc2lkIgogCQkJCQkiPSBleGNlZWRzIFBSX1JFR19JU0lEX0xFTjogJWRcbiIsCiAJCQkJCVBSX1JFR19JU0lEX0xFTik7CkBAIC0xNTcxLDcgKzE1NzEsNyBAQAogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAoc3RybGVuKHRfcG9ydCkgPiBQUl9BUFRQTF9NQVhfVFBPUlRfTEVOKSB7CisJCQlpZiAoc3RybGVuKHRfcG9ydCkgPj0gUFJfQVBUUExfTUFYX1RQT1JUX0xFTikgewogCQkJCXByaW50ayhLRVJOX0VSUiAiQVBUUEwgbWV0YWRhdGEgdGFyZ2V0X25vZGU9IgogCQkJCQkiIGV4Y2VlZHMgUFJfQVBUUExfTUFYX1RQT1JUX0xFTjogJWRcbiIsCiAJCQkJCVBSX0FQVFBMX01BWF9UUE9SVF9MRU4pOwpAQCAtMzA1Miw3ICszMDUyLDcgQEAKIAlpbnQgcmV0OwogCiAJbWVtc2V0KGJ1ZiwgMCwgVEFSR0VUX0NPUkVfTkFNRV9NQVhfTEVOKTsKLQlpZiAoc3RybGVuKG5hbWUpID4gVEFSR0VUX0NPUkVfTkFNRV9NQVhfTEVOKSB7CisJaWYgKHN0cmxlbihuYW1lKSA+PSBUQVJHRVRfQ09SRV9OQU1FX01BWF9MRU4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQYXNzZWQgKm5hbWUgc3RybGVuKCk6ICVkIGV4Y2VlZHMiCiAJCQkiIFRBUkdFVF9DT1JFX05BTUVfTUFYX0xFTjogJWRcbiIsIChpbnQpc3RybGVuKG5hbWUpLAogCQkJVEFSR0VUX0NPUkVfTkFNRV9NQVhfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMKaW5kZXggODQwN2Y5Yy4uYmE2OThlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQkJJlNFX05PREVfQUNMKHNlX3Nlc3MpLT5kZXZpY2VfbGlzdFt1bnBhY2tlZF9sdW5dOwogCWlmIChkZXZlLT5sdW5fZmxhZ3MgJiBUUkFOU1BPUlRfTFVORkxBR1NfSU5JVElBVE9SX0FDQ0VTUykgewogCQlzZV9sdW4gPSBzZV9jbWQtPnNlX2x1biA9IHNlX3Rtci0+dG1yX2x1biA9IGRldmUtPnNlX2x1bjsKLQkJZGV2ID0gc2VfdG1yLT50bXJfZGV2ID0gc2VfbHVuLT5sdW5fc2VfZGV2OworCQlkZXYgPSBzZV9sdW4tPmx1bl9zZV9kZXY7CiAJCXNlX2NtZC0+cHJfcmVzX2tleSA9IGRldmUtPnByX3Jlc19rZXk7CiAJCXNlX2NtZC0+b3JpZ19mZV9sdW4gPSB1bnBhY2tlZF9sdW47CiAJCXNlX2NtZC0+c2Vfb3JpZ19vYmpfcHRyID0gU0VfTFVOKHNlX2NtZCktPmx1bl9zZV9kZXY7CkBAIC0yMTYsNiArMjE2LDcgQEAKIAkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKIAkJcmV0dXJuIC0xOwogCX0KKwlzZV90bXItPnRtcl9kZXYgPSBkZXY7CiAKIAlzcGluX2xvY2soJmRldi0+c2VfdG1yX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJnNlX3Rtci0+dG1yX2xpc3QsICZkZXYtPmRldl90bXJfbGlzdCk7CkBAIC0xNDMwLDcgKzE0MzEsNyBAQAogCXN0cnVjdCBzZV9sdW5fYWNsICpsYWNsOwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbDsKIAotCWlmIChzdHJsZW4oaW5pdGlhdG9ybmFtZSkgPiBUUkFOU1BPUlRfSVFOX0xFTikgeworCWlmIChzdHJsZW4oaW5pdGlhdG9ybmFtZSkgPj0gVFJBTlNQT1JUX0lRTl9MRU4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcyBJbml0aWF0b3JOYW1lIGV4Y2VlZHMgbWF4aW11bSBzaXplLlxuIiwKIAkJCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCkpOwogCQkqcmV0ID0gLUVPVkVSRkxPVzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jCmluZGV4IGE3OWY1MTguLmI2NjJkYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuYwpAQCAtMTkxNiw3ICsxOTE2LDcgQEAKIAkJCQlwcl9yZWctPnByX3Jlc19tYXBwZWRfbHVuKTsKIAkJfQogCi0JCWlmICgobGVuICsgc3RybGVuKHRtcCkgPiBwcl9hcHRwbF9idWZfbGVuKSkgeworCQlpZiAoKGxlbiArIHN0cmxlbih0bXApID49IHByX2FwdHBsX2J1Zl9sZW4pKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byB1cGRhdGUgcmVuYW1pbmciCiAJCQkJIiBBUFRQTCBtZXRhZGF0YVxuIik7CiAJCQlzcGluX3VubG9jaygmVDEwX1JFUyhzdV9kZXYpLT5yZWdpc3RyYXRpb25fbG9jayk7CkBAIC0xOTM0LDcgKzE5MzQsNyBAQAogCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLAogCQkJbHVuLT5sdW5fc2VwLT5zZXBfcnRwaSwgbHVuLT51bnBhY2tlZF9sdW4sIHJlZ19jb3VudCk7CiAKLQkJaWYgKChsZW4gKyBzdHJsZW4odG1wKSA+IHByX2FwdHBsX2J1Zl9sZW4pKSB7CisJCWlmICgobGVuICsgc3RybGVuKHRtcCkgPj0gcHJfYXB0cGxfYnVmX2xlbikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHVwZGF0ZSByZW5hbWluZyIKIAkJCQkiIEFQVFBMIG1ldGFkYXRhXG4iKTsKIAkJCXNwaW5fdW5sb2NrKCZUMTBfUkVTKHN1X2RldiktPnJlZ2lzdHJhdGlvbl9sb2NrKTsKQEAgLTE5ODYsNyArMTk4Niw3IEBACiAJbWVtc2V0KGlvdiwgMCwgc2l6ZW9mKHN0cnVjdCBpb3ZlYykpOwogCW1lbXNldChwYXRoLCAwLCA1MTIpOwogCi0JaWYgKHN0cmxlbigmd3duLT51bml0X3NlcmlhbFswXSkgPiA1MTIpIHsKKwlpZiAoc3RybGVuKCZ3d24tPnVuaXRfc2VyaWFsWzBdKSA+PSA1MTIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJXV04gdmFsdWUgZm9yIHN0cnVjdCBzZV9kZXZpY2UgZG9lcyBub3QgZml0IgogCQkJIiBpbnRvIHBhdGggYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYwppbmRleCA1OWI4YjljLi4xNzkwNjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYwpAQCAtNzUsMTAgKzc1LDE2IEBACiB7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gdG1yLT50bXJfZGV2OwogCisJaWYgKCFkZXYpIHsKKwkJa21lbV9jYWNoZV9mcmVlKHNlX3Rtcl9yZXFfY2FjaGUsIHRtcik7CisJCXJldHVybjsKKwl9CisKIAlzcGluX2xvY2soJmRldi0+c2VfdG1yX2xvY2spOwogCWxpc3RfZGVsKCZ0bXItPnRtcl9saXN0KTsKLQlrbWVtX2NhY2hlX2ZyZWUoc2VfdG1yX3JlcV9jYWNoZSwgdG1yKTsKIAlzcGluX3VubG9jaygmZGV2LT5zZV90bXJfbG9jayk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoc2VfdG1yX3JlcV9jYWNoZSwgdG1yKTsKIH0KIAogc3RhdGljIHZvaWQgY29yZV90bXJfaGFuZGxlX3Rhc19hYm9ydCgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMKaW5kZXggNGRhZmViOC4uNGI5YjcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMKQEAgLTUzNiwxMyArNTM2LDEzIEBACiB2b2lkIHRyYW5zcG9ydF9kZXJlZ2lzdGVyX3Nlc3Npb25fY29uZmlnZnMoc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MpCiB7CiAJc3RydWN0IHNlX25vZGVfYWNsICpzZV9uYWNsOwotCisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkvKgogCSAqIFVzZWQgYnkgc3RydWN0IHNlX25vZGVfYWNsJ3MgdW5kZXIgQ29uZmlnRlMgdG8gbG9jYXRlIGFjdGl2ZSBzdHJ1Y3Qgc2Vfc2Vzc2lvbgogCSAqLwogCXNlX25hY2wgPSBzZV9zZXNzLT5zZV9ub2RlX2FjbDsKIAlpZiAoKHNlX25hY2wpKSB7Ci0JCXNwaW5fbG9ja19pcnEoJnNlX25hY2wtPm5hY2xfc2Vzc19sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlX25hY2wtPm5hY2xfc2Vzc19sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsKCZzZV9zZXNzLT5zZXNzX2FjbF9saXN0KTsKIAkJLyoKIAkJICogSWYgdGhlIHNlc3Npb24gbGlzdCBpcyBlbXB0eSwgdGhlbiBjbGVhciB0aGUgcG9pbnRlci4KQEAgLTU1Niw3ICs1NTYsNyBAQAogCQkJCQlzZV9uYWNsLT5hY2xfc2Vzc19saXN0LnByZXYsCiAJCQkJCXN0cnVjdCBzZV9zZXNzaW9uLCBzZXNzX2FjbF9saXN0KTsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJnNlX25hY2wtPm5hY2xfc2Vzc19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VfbmFjbC0+bmFjbF9zZXNzX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9kZXJlZ2lzdGVyX3Nlc3Npb25fY29uZmlnZnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCmluZGV4IGRlZmZmMzIuLjdiODJmMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaAorKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogICovCiBzdHJ1Y3QgZnRfY21kIHsKIAllbnVtIGZ0X2NtZF9zdGF0ZSBzdGF0ZTsKLQl1MTYgbHVuOwkJCS8qIExVTiBmcm9tIHJlcXVlc3QgKi8KKwl1MzIgbHVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExVTiBmcm9tIHJlcXVlc3QgKi8KIAlzdHJ1Y3QgZnRfc2VzcyAqc2VzczsJCS8qIHNlc3Npb24gaGVsZCBmb3IgY21kICovCiAJc3RydWN0IGZjX3NlcSAqc2VxOwkJLyogc2VxdWVuY2UgaW4gZXhjaGFuZ2UgbWdyICovCiAJc3RydWN0IHNlX2NtZCBzZV9jbWQ7CQkvKiBMb2NhbCBUQ00gSS9PIGRlc2NyaXB0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCmluZGV4IGMwNTZhMTEuLmIyYTEwNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwpAQCAtOTQsMjkgKzk0LDYgQEAKIAkJMTYsIDQsIGNtZC0+Y2RiLCBNQVhfQ09NTUFORF9TSVpFLCAwKTsKIH0KIAotLyoKLSAqIEdldCBMVU4gZnJvbSBDREIuCi0gKi8KLXN0YXRpYyBpbnQgZnRfZ2V0X2x1bl9mb3JfY21kKHN0cnVjdCBmdF9jbWQgKmNtZCwgdTggKmx1bnApCi17Ci0JdTY0IGx1bjsKLQotCWx1biA9IGx1bnBbMV07Ci0Jc3dpdGNoIChsdW5wWzBdID4+IDYpIHsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJbHVuIHw9IChsdW5wWzBdICYgMHgzZikgPDwgODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobHVuID49IFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHKQotCQlyZXR1cm4gLTE7Ci0JY21kLT5sdW4gPSBsdW47Ci0JcmV0dXJuIHRyYW5zcG9ydF9nZXRfbHVuX2Zvcl9jbWQoJmNtZC0+c2VfY21kLCBOVUxMLCBsdW4pOwotfQotCiBzdGF0aWMgdm9pZCBmdF9xdWV1ZV9jbWQoc3RydWN0IGZ0X3Nlc3MgKnNlc3MsIHN0cnVjdCBmdF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3Qgc2VfcXVldWVfb2JqICpxb2JqOwpAQCAtNDE4LDYgKzM5NSw3IEBACiB7CiAJc3RydWN0IHNlX3Rtcl9yZXEgKnRtcjsKIAlzdHJ1Y3QgZmNwX2NtbmQgKmZjcDsKKwlzdHJ1Y3QgZnRfc2VzcyAqc2VzczsKIAl1OCB0bV9mdW5jOwogCiAJZmNwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoY21kLT5yZXFfZnJhbWUsIHNpemVvZigqZmNwKSk7CkBAIC00MjUsMTMgKzQwMyw2IEBACiAJc3dpdGNoIChmY3AtPmZjX3RtX2ZsYWdzKSB7CiAJY2FzZSBGQ1BfVE1GX0xVTl9SRVNFVDoKIAkJdG1fZnVuYyA9IFRNUl9MVU5fUkVTRVQ7Ci0JCWlmIChmdF9nZXRfbHVuX2Zvcl9jbWQoY21kLCBmY3AtPmZjX2x1bikgPCAwKSB7Ci0JCQlmdF9kdW1wX2NtZChjbWQsIF9fZnVuY19fKTsKLQkJCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoJmNtZC0+c2VfY21kLAotCQkJCWNtZC0+c2VfY21kLnNjc2lfc2Vuc2VfcmVhc29uLCAwKTsKLQkJCWZ0X3Nlc3NfcHV0KGNtZC0+c2Vzcyk7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJYnJlYWs7CiAJY2FzZSBGQ1BfVE1GX1RHVF9SRVNFVDoKIAkJdG1fZnVuYyA9IFRNUl9UQVJHRVRfV0FSTV9SRVNFVDsKQEAgLTQ2Myw2ICs0MzQsMzYgQEAKIAkJcmV0dXJuOwogCX0KIAljbWQtPnNlX2NtZC5zZV90bXJfcmVxID0gdG1yOworCisJc3dpdGNoIChmY3AtPmZjX3RtX2ZsYWdzKSB7CisJY2FzZSBGQ1BfVE1GX0xVTl9SRVNFVDoKKwkJY21kLT5sdW4gPSBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopZmNwLT5mY19sdW4pOworCQlpZiAodHJhbnNwb3J0X2dldF9sdW5fZm9yX3RtcigmY21kLT5zZV9jbWQsIGNtZC0+bHVuKSA8IDApIHsKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgdG8gY2xlYW4gdXAgbmV3bHkgYWxsb2NhdGVkIFRNUiByZXF1ZXN0CisJCQkgKiBzaW5jZSAidW5hYmxlIHRvICBoYW5kbGUgVE1SIHJlcXVlc3QgYmVjYXVzZSBmYWlsZWQKKwkJCSAqIHRvIGdldCB0byBMVU4iCisJCQkgKi8KKwkJCUZUX1RNX0RCRygiRmFpbGVkIHRvIGdldCBMVU4gZm9yIFRNUiBmdW5jICVkLCAiCisJCQkJICAic2VfY21kICVwLCB1bnBhY2tlZF9sdW4gJWRcbiIsCisJCQkJICB0bV9mdW5jLCAmY21kLT5zZV9jbWQsIGNtZC0+bHVuKTsKKwkJCWZ0X2R1bXBfY21kKGNtZCwgX19mdW5jX18pOworCQkJc2VzcyA9IGNtZC0+c2VzczsKKwkJCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoJmNtZC0+c2VfY21kLAorCQkJCWNtZC0+c2VfY21kLnNjc2lfc2Vuc2VfcmVhc29uLCAwKTsKKwkJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKCZjbWQtPnNlX2NtZCwgMCwgMSwgMCk7CisJCQlmdF9zZXNzX3B1dChzZXNzKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIEZDUF9UTUZfVEdUX1JFU0VUOgorCWNhc2UgRkNQX1RNRl9DTFJfVEFTS19TRVQ6CisJY2FzZSBGQ1BfVE1GX0FCVF9UQVNLX1NFVDoKKwljYXNlIEZDUF9UTUZfQ0xSX0FDQToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KIAl0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfdG1yKCZjbWQtPnNlX2NtZCk7CiB9CiAKQEAgLTYzNSw3ICs2MzYsOCBAQAogCiAJZmNfc2VxX2V4Y2goY21kLT5zZXEpLT5scC0+dHQuc2VxX3NldF9yZXNwKGNtZC0+c2VxLCBmdF9yZWN2X3NlcSwgY21kKTsKIAotCXJldCA9IGZ0X2dldF9sdW5fZm9yX2NtZChjbWQsIGZjcC0+ZmNfbHVuKTsKKwljbWQtPmx1biA9IHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKilmY3AtPmZjX2x1bik7CisJcmV0ID0gdHJhbnNwb3J0X2dldF9sdW5fZm9yX2NtZCgmY21kLT5zZV9jbWQsIE5VTEwsIGNtZC0+bHVuKTsKIAlpZiAocmV0IDwgMCkgewogCQlmdF9kdW1wX2NtZChjbWQsIF9fZnVuY19fKTsKIAkJdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSgmY21kLT5zZV9jbWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKaW5kZXggNGMzYzBlZi4uOGM0YTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJCQkvKiBYWFggRm9yIG5vdywgaW5pdGlhdG9yIHdpbGwgcmV0cnkgKi8KIAkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHNlbmQgZnJhbWUgJXAsICIKLQkJCQkJCSJ4aWQgPDB4JXg+LCByZW1haW5pbmcgPDB4JXg+LCAiCisJCQkJCQkieGlkIDwweCV4PiwgcmVtYWluaW5nICV6dSwgIgogCQkJCQkJImxzb19tYXggPDB4JXg+XG4iLAogCQkJCQkJX19mdW5jX18sIGZwLCBlcC0+eGlkLAogCQkJCQkJcmVtYWluaW5nLCBscG9ydC0+bHNvX21heCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX3Nlc3MuYyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfc2Vzcy5jCmluZGV4IGEzYmQ1N2YuLjc0OTFlMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfc2Vzcy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfc2Vzcy5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzZXNzLT5zZV9zZXNzID0gdHJhbnNwb3J0X2luaXRfc2Vzc2lvbigpOwotCWlmICghc2Vzcy0+c2Vfc2VzcykgeworCWlmIChJU19FUlIoc2Vzcy0+c2Vfc2VzcykpIHsKIAkJa2ZyZWUoc2Vzcyk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTMzMiw3ICszMzIsNyBAQAogCWxwb3J0ID0gc2Vzcy0+dHBvcnQtPmxwb3J0OwogCXBvcnRfaWQgPSBzZXNzLT5wb3J0X2lkOwogCWlmIChwb3J0X2lkID09IC0xKSB7Ci0JCW11dGV4X2xvY2soJmZ0X2xwb3J0X2xvY2spOworCQltdXRleF91bmxvY2soJmZ0X2xwb3J0X2xvY2spOwogCQlyZXR1cm47CiAJfQogCUZUX1NFU1NfREJHKCJwb3J0X2lkICV4XG4iLCBwb3J0X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L25fZ3NtLmMgYi9kcml2ZXJzL3R0eS9uX2dzbS5jCmluZGV4IGE0YzQyYTcuLjE5YjRhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25fZ3NtLmMKKysrIGIvZHJpdmVycy90dHkvbl9nc20uYwpAQCAtODc1LDcgKzg3NSw4IEBACiAJCSpkcCsrID0gbGFzdCA8PCA3IHwgZmlyc3QgPDwgNiB8IDE7CS8qIEVBICovCiAJCWxlbi0tOwogCX0KLQltZW1jcHkoZHAsIHNrYl9wdWxsKGRsY2ktPnNrYiwgbGVuKSwgbGVuKTsKKwltZW1jcHkoZHAsIGRsY2ktPnNrYi0+ZGF0YSwgbGVuKTsKKwlza2JfcHVsbChkbGNpLT5za2IsIGxlbik7CiAJX19nc21fZGF0YV9xdWV1ZShkbGNpLCBtc2cpOwogCWlmIChsYXN0KQogCQlkbGNpLT5za2IgPSBOVUxMOwpAQCAtOTg0LDEwICs5ODUsMjIgQEAKICAqLwogCiBzdGF0aWMgdm9pZCBnc21fcHJvY2Vzc19tb2RlbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZ3NtX2RsY2kgKmRsY2ksCi0JCQkJCQkJdTMyIG1vZGVtKQorCQkJCQkJCXUzMiBtb2RlbSwgaW50IGNsZW4pCiB7CiAJaW50ICBtbGluZXMgPSAwOwotCXU4IGJyayA9IG1vZGVtID4+IDY7CisJdTggYnJrID0gMDsKKworCS8qIFRoZSBtb2RlbSBzdGF0dXMgY29tbWFuZCBjYW4gZWl0aGVyIGNvbnRhaW4gb25lIG9jdGV0ICh2LjI0IHNpZ25hbHMpCisJICAgb3IgdHdvIG9jdGV0cyAodi4yNCBzaWduYWxzICsgYnJlYWsgc2lnbmFscykuIFRoZSBsZW5ndGggZmllbGQgd2lsbAorCSAgIGVpdGhlciBiZSAyIG9yIDMgcmVzcGVjdGl2ZWx5LiBUaGlzIGlzIHNwZWNpZmllZCBpbiBzZWN0aW9uCisJICAgNS40LjYuMy43IG9mIHRoZSAgMjcuMDEwIG11eCBzcGVjLiAqLworCisJaWYgKGNsZW4gPT0gMikKKwkJbW9kZW0gPSBtb2RlbSAmIDB4N2Y7CisJZWxzZSB7CisJCWJyayA9IG1vZGVtICYgMHg3ZjsKKwkJbW9kZW0gPSAobW9kZW0gPj4gNykgJiAweDdmOworCX07CiAKIAkvKiBGbG93IGNvbnRyb2wvcmVhZHkgdG8gY29tbXVuaWNhdGUgKi8KIAlpZiAobW9kZW0gJiBNRE1fRkMpIHsKQEAgLTEwNjEsNyArMTA3NCw3IEBACiAJCQlyZXR1cm47CiAJfQogCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmRsY2ktPnBvcnQpOwotCWdzbV9wcm9jZXNzX21vZGVtKHR0eSwgZGxjaSwgbW9kZW0pOworCWdzbV9wcm9jZXNzX21vZGVtKHR0eSwgZGxjaSwgbW9kZW0sIGNsZW4pOwogCWlmICh0dHkpIHsKIAkJdHR5X3dha2V1cCh0dHkpOwogCQl0dHlfa3JlZl9wdXQodHR5KTsKQEAgLTE0ODIsMTIgKzE0OTUsMTMgQEAKICAqCW9wZW4gd2Ugc2hvdmVsIHRoZSBiaXRzIGRvd24gaXQsIGlmIG5vdCB3ZSBkcm9wIHRoZW0uCiAgKi8KIAotc3RhdGljIHZvaWQgZ3NtX2RsY2lfZGF0YShzdHJ1Y3QgZ3NtX2RsY2kgKmRsY2ksIHU4ICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgZ3NtX2RsY2lfZGF0YShzdHJ1Y3QgZ3NtX2RsY2kgKmRsY2ksIHU4ICpkYXRhLCBpbnQgY2xlbikKIHsKIAkvKiBrcmVmcyAuLiAqLwogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZkbGNpLT5wb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KHBvcnQpOwogCXVuc2lnbmVkIGludCBtb2RlbSA9IDA7CisJaW50IGxlbiA9IGNsZW47CiAKIAlpZiAoZGVidWcgJiAxNikKIAkJcHJfZGVidWcoIiVkIGJ5dGVzIGZvciB0dHkgJXBcbiIsIGxlbiwgdHR5KTsKQEAgLTE1MDcsNyArMTUyMSw3IEBACiAJCQkJaWYgKGxlbiA9PSAwKQogCQkJCQlyZXR1cm47CiAJCQl9Ci0JCQlnc21fcHJvY2Vzc19tb2RlbSh0dHksIGRsY2ksIG1vZGVtKTsKKwkJCWdzbV9wcm9jZXNzX21vZGVtKHR0eSwgZGxjaSwgbW9kZW0sIGNsZW4pOwogCQkvKiBMaW5lIHN0YXRlIHdpbGwgZ28gdmlhIERMQ0kgMCBjb250cm9scyBvbmx5ICovCiAJCWNhc2UgMToKIAkJZGVmYXVsdDoKQEAgLTIxMjgsOCArMjE0Miw4IEBACiAJZ3NtLT50dHkgPSBOVUxMOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGdzbWxkX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgZ3NtbGRfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBnc21fbXV4ICpnc20gPSB0dHktPmRpc2NfZGF0YTsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpkcDsKQEAgLTIxNjIsOCArMjE3Niw2IEBACiAJfQogCS8qIEZBU1lOQyBpZiBuZWVkZWQgPyAqLwogCS8qIElmIGNsb2dnZWQgY2FsbCB0dHlfdGhyb3R0bGUodHR5KTsgKi8KLQotCXJldHVybiBjb3VudDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9uX2hkbGMuYyBiL2RyaXZlcnMvdHR5L25faGRsYy5jCmluZGV4IGNhYzY2NjMuLmNlYTU2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25faGRsYy5jCisrKyBiL2RyaXZlcnMvdHR5L25faGRsYy5jCkBAIC0xODgsOCArMTg4LDggQEAKIAkJCQkgICAgcG9sbF90YWJsZSAqd2FpdCk7CiBzdGF0aWMgaW50IG5faGRsY190dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyB2b2lkIG5faGRsY190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5faGRsY190dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCBfX3U4ICpjcCwgY2hhciAqZnAsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgX191OCAqY3AsCisJCQkgICAgICAgY2hhciAqZnAsIGludCBjb3VudCk7CiBzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAogI2RlZmluZSBic2V0KHAsYikJKChwKVsoYikgPj4gNV0gfD0gKDEgPDwgKChiKSAmIDB4MWYpKSkKQEAgLTUwOSw4ICs1MDksOCBAQAogICogQ2FsbGVkIGJ5IHR0eSBsb3cgbGV2ZWwgZHJpdmVyIHdoZW4gcmVjZWl2ZSBkYXRhIGlzIGF2YWlsYWJsZS4gRGF0YSBpcwogICogaW50ZXJwcmV0ZWQgYXMgb25lIEhETEMgZnJhbWUuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbl9oZGxjX3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IF9fdTggKmRhdGEsIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgX191OCAqZGF0YSwKKwkJCSAgICAgICBjaGFyICpmbGFncywgaW50IGNvdW50KQogewogCXJlZ2lzdGVyIHN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CiAJcmVnaXN0ZXIgc3RydWN0IG5faGRsY19idWYgKmJ1ZjsKQEAgLTUyMSwyMCArNTIxLDIwIEBACiAJCQogCS8qIFRoaXMgY2FuIGhhcHBlbiBpZiBzdHVmZiBjb21lcyBpbiBvbiB0aGUgYmFja3VwIHR0eSAqLwogCWlmICghbl9oZGxjIHx8IHR0eSAhPSBuX2hkbGMtPnR0eSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybjsKIAkJCiAJLyogdmVyaWZ5IGxpbmUgaXMgdXNpbmcgSERMQyBkaXNjaXBsaW5lICovCiAJaWYgKG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQykgewogCQlwcmludGsoIiVzKCVkKSBsaW5lIG5vdCB1c2luZyBIRExDIGRpc2NpcGxpbmVcbiIsCiAJCQlfX0ZJTEVfXyxfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm47CiAJfQogCQogCWlmICggY291bnQ+bWF4ZnJhbWUgKSB7CiAJCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQogCQkJcHJpbnRrKCIlcyglZCkgcnggY291bnQ+bWF4ZnJhbWVzaXplLCBkYXRhIGRpc2NhcmRlZFxuIiwKIAkJCSAgICAgICBfX0ZJTEVfXyxfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm47CiAJfQogCiAJLyogZ2V0IGEgZnJlZSBIRExDIGJ1ZmZlciAqLwkKQEAgLTU1MCw3ICs1NTAsNyBAQAogCQlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKIAkJCXByaW50aygiJXMoJWQpIG5vIG1vcmUgcnggYnVmZmVycywgZGF0YSBkaXNjYXJkZWRcbiIsCiAJCQkgICAgICAgX19GSUxFX18sX19MSU5FX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCX0KIAkJCiAJLyogY29weSByZWNlaXZlZCBkYXRhIHRvIEhETEMgYnVmZmVyICovCkBAIC01NjUsOCArNTY1LDYgQEAKIAlpZiAobl9oZGxjLT50dHktPmZhc3luYyAhPSBOVUxMKQogCQlraWxsX2Zhc3luYyAoJm5faGRsYy0+dHR5LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKIAotCXJldHVybiBjb3VudDsKLQogfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9yZWNlaXZlKCkgKi8KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9uX3IzOTY0LmMgYi9kcml2ZXJzL3R0eS9uX3IzOTY0LmMKaW5kZXggYTRiYzM5Yy4uNWM2YzMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvbl9yMzk2NC5jCisrKyBiL2RyaXZlcnMvdHR5L25fcjM5NjQuYwpAQCAtMTM5LDggKzEzOSw4IEBACiBzdGF0aWMgdm9pZCByMzk2NF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHIzOTY0X3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHIzOTY0X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHIzOTY0X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQljaGFyICpmcCwgaW50IGNvdW50KTsKIAogc3RhdGljIHN0cnVjdCB0dHlfbGRpc2Nfb3BzIHR0eV9sZGlzY19OX1IzOTY0ID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtMTIzOSw4ICsxMjM5LDggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHIzOTY0X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgcjM5NjRfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQljaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCByMzk2NF9pbmZvICpwSW5mbyA9IHR0eS0+ZGlzY19kYXRhOwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CkBAIC0xMjU3LDggKzEyNTcsNiBAQAogCQl9CiAKIAl9Ci0KLQlyZXR1cm4gY291bnQ7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L25fdHR5LmMgYi9kcml2ZXJzL3R0eS9uX3R0eS5jCmluZGV4IDk1ZDBhOWMuLmMzOTU0ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25fdHR5LmMKKysrIGIvZHJpdmVycy90dHkvbl90dHkuYwpAQCAtODEsNiArODEsMzggQEAKIAlyZXR1cm4gcHV0X3VzZXIoeCwgcHRyKTsKIH0KIAorLyoqCisgKgluX3R0eV9zZXRfX3Jvb20JLQlyZWNlaXZlIHNwYWNlCisgKglAdHR5OiB0ZXJtaW5hbAorICoKKyAqCUNhbGxlZCBieSB0aGUgZHJpdmVyIHRvIGZpbmQgb3V0IGhvdyBtdWNoIGRhdGEgaXQgaXMKKyAqCXBlcm1pdHRlZCB0byBmZWVkIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2l0aG91dCBhbnkgYmVpbmcgbG9zdAorICoJYW5kIHRodXMgdG8gbWFuYWdlIGZsb3cgY29udHJvbC4gTm90IHNlcmlhbGl6ZWQuIEFuc3dlcnMgZm9yIHRoZQorICoJImluc3RhbnQiLgorICovCisKK3N0YXRpYyB2b2lkIG5fdHR5X3NldF9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLyogdHR5LT5yZWFkX2NudCBpcyBub3QgcmVhZCBsb2NrZWQgPyAqLworCWludAlsZWZ0ID0gTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250IC0gMTsKKwlpbnQgb2xkX2xlZnQ7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBpbnB1dCBjYW5vbmljYWxpemF0aW9uLCBhbmQgdGhlcmUgYXJlIG5vCisJICogcGVuZGluZyBuZXdsaW5lcywgbGV0IGNoYXJhY3RlcnMgdGhyb3VnaCB3aXRob3V0IGxpbWl0LCBzbworCSAqIHRoYXQgZXJhc2UgY2hhcmFjdGVycyB3aWxsIGJlIGhhbmRsZWQuICBPdGhlciBleGNlc3MKKwkgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgYmVlcGVkLgorCSAqLworCWlmIChsZWZ0IDw9IDApCisJCWxlZnQgPSB0dHktPmljYW5vbiAmJiAhdHR5LT5jYW5vbl9kYXRhOworCW9sZF9sZWZ0ID0gdHR5LT5yZWNlaXZlX3Jvb207CisJdHR5LT5yZWNlaXZlX3Jvb20gPSBsZWZ0OworCisJLyogRGlkIHRoaXMgb3BlbiB1cCB0aGUgcmVjZWl2ZSBidWZmZXI/IFdlIG1heSBuZWVkIHRvIGZsaXAgKi8KKwlpZiAobGVmdCAmJiAhb2xkX2xlZnQpCisJCXNjaGVkdWxlX3dvcmsoJnR0eS0+YnVmLndvcmspOworfQorCiBzdGF0aWMgdm9pZCBwdXRfdHR5X3F1ZXVlX25vbG9jayh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaWYgKHR0eS0+cmVhZF9jbnQgPCBOX1RUWV9CVUZfU0laRSkgewpAQCAtMTUyLDYgKzE4NCw3IEBACiAKIAl0dHktPmNhbm9uX2hlYWQgPSB0dHktPmNhbm9uX2RhdGEgPSB0dHktPmVyYXNpbmcgPSAwOwogCW1lbXNldCgmdHR5LT5yZWFkX2ZsYWdzLCAwLCBzaXplb2YgdHR5LT5yZWFkX2ZsYWdzKTsKKwluX3R0eV9zZXRfcm9vbSh0dHkpOwogCWNoZWNrX3VudGhyb3R0bGUodHR5KTsKIH0KIApAQCAtMTMyNywxOSArMTM2MCwxNyBAQAogICoJY2FsbHMgb25lIGF0IGEgdGltZSBhbmQgaW4gb3JkZXIgKG9yIHVzaW5nIGZsdXNoX3RvX2xkaXNjKQogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbl90dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBuX3R0eV9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKwkJCSAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKIAljaGFyICpmLCBmbGFncyA9IFRUWV9OT1JNQUw7CiAJaW50CWk7CiAJY2hhcglidWZbNjRdOwogCXVuc2lnbmVkIGxvbmcgY3B1ZmxhZ3M7Ci0JaW50IGxlZnQ7Ci0JaW50IHJldCA9IDA7CiAKIAlpZiAoIXR0eS0+cmVhZF9idWYpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlpZiAodHR5LT5yZWFsX3JhdykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKQEAgLTEzNDksNyArMTM4MCw2IEBACiAJCW1lbWNweSh0dHktPnJlYWRfYnVmICsgdHR5LT5yZWFkX2hlYWQsIGNwLCBpKTsKIAkJdHR5LT5yZWFkX2hlYWQgPSAodHR5LT5yZWFkX2hlYWQgKyBpKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKIAkJdHR5LT5yZWFkX2NudCArPSBpOwotCQlyZXQgKz0gaTsKIAkJY3AgKz0gaTsKIAkJY291bnQgLT0gaTsKIApAQCAtMTM1OSwxMCArMTM4OSw4IEBACiAJCW1lbWNweSh0dHktPnJlYWRfYnVmICsgdHR5LT5yZWFkX2hlYWQsIGNwLCBpKTsKIAkJdHR5LT5yZWFkX2hlYWQgPSAodHR5LT5yZWFkX2hlYWQgKyBpKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKIAkJdHR5LT5yZWFkX2NudCArPSBpOwotCQlyZXQgKz0gaTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKIAl9IGVsc2UgewotCQlyZXQgPSBjb3VudDsKIAkJZm9yIChpID0gY291bnQsIHAgPSBjcCwgZiA9IGZwOyBpOyBpLS0sIHArKykgewogCQkJaWYgKGYpCiAJCQkJZmxhZ3MgPSAqZisrOwpAQCAtMTM5MCw2ICsxNDE4LDggQEAKIAkJCXR0eS0+b3BzLT5mbHVzaF9jaGFycyh0dHkpOwogCX0KIAorCW5fdHR5X3NldF9yb29tKHR0eSk7CisKIAlpZiAoKCF0dHktPmljYW5vbiAmJiAodHR5LT5yZWFkX2NudCA+PSB0dHktPm1pbmltdW1fdG9fd2FrZSkpIHx8CiAJCUxfRVhUUFJPQyh0dHkpKSB7CiAJCWtpbGxfZmFzeW5jKCZ0dHktPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwpAQCAtMTQwMiwxMiArMTQzMiw4IEBACiAJICogbW9kZS4gIFdlIGRvbid0IHdhbnQgdG8gdGhyb3R0bGUgdGhlIGRyaXZlciBpZiB3ZSdyZSBpbgogCSAqIGNhbm9uaWNhbCBtb2RlIGFuZCBkb24ndCBoYXZlIGEgbmV3bGluZSB5ZXQhCiAJICovCi0JbGVmdCA9IE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2NudCAtIDE7Ci0KLQlpZiAobGVmdCA8IFRUWV9USFJFU0hPTERfVEhST1RUTEUpCisJaWYgKHR0eS0+cmVjZWl2ZV9yb29tIDwgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSkKIAkJdHR5X3Rocm90dGxlKHR0eSk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBpbnQgaXNfaWdub3JlZChpbnQgc2lnKQpAQCAtMTQ1MSw2ICsxNDc3LDcgQEAKIAlpZiAodGVzdF9iaXQoVFRZX0hXX0NPT0tfSU4sICZ0dHktPmZsYWdzKSkgewogCQl0dHktPnJhdyA9IDE7CiAJCXR0eS0+cmVhbF9yYXcgPSAxOworCQluX3R0eV9zZXRfcm9vbSh0dHkpOwogCQlyZXR1cm47CiAJfQogCWlmIChJX0lTVFJJUCh0dHkpIHx8IElfSVVDTEModHR5KSB8fCBJX0lHTkNSKHR0eSkgfHwKQEAgLTE1MDMsNiArMTUzMCw3IEBACiAJCWVsc2UKIAkJCXR0eS0+cmVhbF9yYXcgPSAwOwogCX0KKwluX3R0eV9zZXRfcm9vbSh0dHkpOwogCS8qIFRoZSB0ZXJtaW9zIGNoYW5nZSBtYWtlIHRoZSB0dHkgcmVhZHkgZm9yIEkvTyAqLwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKQEAgLTE3ODQsNyArMTgxMiwxMCBAQAogCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCQlicmVhazsKIAkJCX0KKwkJCS8qIEZJWE1FOiBkb2VzIG5fdHR5X3NldF9yb29tIG5lZWQgbG9ja2luZyA/ICovCisJCQluX3R0eV9zZXRfcm9vbSh0dHkpOwogCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCQlCVUdfT04oIXR0eS0+cmVhZF9idWYpOwogCQkJY29udGludWU7CiAJCX0KIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpAQCAtMTg1NSw4ICsxODg2LDEwIEBACiAJCSAqIGxvbmdlciB0aGFuIFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSBpbiBjYW5vbmljYWwgbW9kZSwKIAkJICogd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIGNoYXJhY3RlcnMuCiAJCSAqLwotCQlpZiAobl90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSkgPD0gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFKQorCQlpZiAobl90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSkgPD0gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFKSB7CisJCQluX3R0eV9zZXRfcm9vbSh0dHkpOwogCQkJY2hlY2tfdW50aHJvdHRsZSh0dHkpOworCQl9CiAKIAkJaWYgKGIgLSBidWYgPj0gbWluaW11bSkKIAkJCWJyZWFrOwpAQCAtMTg3OCw2ICsxOTExLDcgQEAKIAl9IGVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfUFVTSCwgJnR0eS0+ZmxhZ3MpKQogCQkgZ290byBkb19pdF9hZ2FpbjsKIAorCW5fdHR5X3NldF9yb29tKHR0eSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMKaW5kZXggYjQwZjdiOS4uYjQxMjlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jCkBAIC0zMzE4LDYgKzMzMTgsNyBAQAogCQl1YXJ0LT5wb3J0LmZsYWdzICY9IH5VUEZfQk9PVF9BVVRPQ09ORjsKIAkJdWFydC0+cG9ydC50eXBlID0gUE9SVF9VTktOT1dOOwogCQl1YXJ0LT5wb3J0LmRldiA9ICZzZXJpYWw4MjUwX2lzYV9kZXZzLT5kZXY7CisJCXVhcnQtPmNhcGFiaWxpdGllcyA9IHVhcnRfY29uZmlnW3VhcnQtPnBvcnQudHlwZV0uZmxhZ3M7CiAJCXVhcnRfYWRkX29uZV9wb3J0KCZzZXJpYWw4MjUwX3JlZywgJnVhcnQtPnBvcnQpOwogCX0gZWxzZSB7CiAJCXVhcnQtPnBvcnQuZGV2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwX3BjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTBfcGNpLmMKaW5kZXggNGI0OTY4YS4uZjQxYjQyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTBfcGNpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTBfcGNpLmMKQEAgLTk3Myw3ICs5NzMsNyBAQAogCiBzdGF0aWMgaW50CiBwY2lfb21lZ2FwY2lfc2V0dXAoc3RydWN0IHNlcmlhbF9wcml2YXRlICpwcml2LAotCQkgICAgICBzdHJ1Y3QgcGNpc2VyaWFsX2JvYXJkICpib2FyZCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHBjaXNlcmlhbF9ib2FyZCAqYm9hcmQsCiAJCSAgICAgIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBpZHgpCiB7CiAJcmV0dXJuIHNldHVwX3BvcnQocHJpdiwgcG9ydCwgMiwgaWR4ICogOCwgMCk7CkBAIC05OTQsNiArOTk0LDE1IEBACiAJcmV0dXJuIHBjaV9kZWZhdWx0X3NldHVwKHByaXYsIGJvYXJkLCBwb3J0LCBpZHgpOwogfQogCitzdGF0aWMgaW50IHBjaV9lZzIwdF9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1BDSF9VQVJUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfUENIX1VBUlRfTU9EVUxFKQorCXJldHVybiAtRU5PREVWOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiAvKiBUaGlzIHNob3VsZCBiZSBpbiBsaW51eC9wY2lfaWRzLmggKi8KICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TQlNNT0RVTEFSSU8JMHgxMjRCCiAjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfU0JTTU9EVUxBUklPCTB4MTI0QgpAQCAtMTQ0Niw2ICsxNDU1LDU2IEBACiAJCS5pbml0CQkJPSBwY2lfb3hzZW1pX3Rvcm5hZG9faW5pdCwKIAkJLnNldHVwCQk9IHBjaV9kZWZhdWx0X3NldHVwLAogCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTEsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTIsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTMsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTQsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSAweDEwREIsCisJCS5kZXZpY2UgICAgICAgICA9IDB4ODAyNywKKwkJLmluaXQJCT0gcGNpX2VnMjB0X2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICAgICA9IDB4MTBEQiwKKwkJLmRldmljZSAgICAgICAgID0gMHg4MDI4LAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gMHgxMERCLAorCQkuZGV2aWNlICAgICAgICAgPSAweDgwMjksCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSAweDEwREIsCisJCS5kZXZpY2UgICAgICAgICA9IDB4ODAwQywKKwkJLmluaXQJCT0gcGNpX2VnMjB0X2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICAgICA9IDB4MTBEQiwKKwkJLmRldmljZSAgICAgICAgID0gMHg4MDBELAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gMHgxMERCLAorCQkuZGV2aWNlICAgICAgICAgPSAweDgwMEQsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCiAJLyoKIAkgKiBDcm9ueXggT21lZ2EgUENJIChQTFgtY2hpcCBiYXNlZCkKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCmluZGV4IDhkYzA1NDEuLmY1ZjY4MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CkBAIC02NSw2ICs2NiwzMCBAQAogI2RlZmluZSBVQVJUX0RSX0VSUk9SCQkoVUFSVDAxMV9EUl9PRXxVQVJUMDExX0RSX0JFfFVBUlQwMTFfRFJfUEV8VUFSVDAxMV9EUl9GRSkKICNkZWZpbmUgVUFSVF9EVU1NWV9EUl9SWAkoMSA8PCAxNikKIAorCisjZGVmaW5lIFVBUlRfV0FfU0FWRV9OUiAxNAorCitzdGF0aWMgdm9pZCBwbDAxMV9sb2NrdXBfd2EodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyBjb25zdCB1MzIgdWFydF93YV9yZWdbVUFSVF9XQV9TQVZFX05SXSA9IHsKKwlTVF9VQVJUMDExX0RNQVdNLAorCVNUX1VBUlQwMTFfVElNRU9VVCwKKwlTVF9VQVJUMDExX0xDUkhfUlgsCisJVUFSVDAxMV9JQlJELAorCVVBUlQwMTFfRkJSRCwKKwlTVF9VQVJUMDExX0xDUkhfVFgsCisJVUFSVDAxMV9JRkxTLAorCVNUX1VBUlQwMTFfWEZDUiwKKwlTVF9VQVJUMDExX1hPTjEsCisJU1RfVUFSVDAxMV9YT04yLAorCVNUX1VBUlQwMTFfWE9GRjEsCisJU1RfVUFSVDAxMV9YT0ZGMiwKKwlVQVJUMDExX0NSLAorCVVBUlQwMTFfSU1TQworfTsKKworc3RhdGljIHUzMiB1YXJ0X3dhX3JlZ2RhdGFbVUFSVF9XQV9TQVZFX05SXTsKK3N0YXRpYyBERUNMQVJFX1RBU0tMRVQocGwwMTFfbG9ja3VwX3RsZXQsIHBsMDExX2xvY2t1cF93YSwgMCk7CisKIC8qIFRoZXJlIGlzIGJ5IG5vdyBhdCBsZWFzdCBvbmUgdmVuZG9yIHdpdGggZGlmZmVyaW5nIGRldGFpbHMsIHNvIGhhbmRsZSBpdCAqLwogc3RydWN0IHZlbmRvcl9kYXRhIHsKIAl1bnNpZ25lZCBpbnQJCWlmbHM7CkBAIC03Miw2ICs5Nyw3IEBACiAJdW5zaWduZWQgaW50CQlsY3JoX3R4OwogCXVuc2lnbmVkIGludAkJbGNyaF9yeDsKIAlib29sCQkJb3ZlcnNhbXBsaW5nOworCWJvb2wJCQlpbnRlcnJ1cHRfbWF5X2hhbmc7ICAgLyogdmVuZG9yLXNwZWNpZmljICovCiAJYm9vbAkJCWRtYV90aHJlc2hvbGQ7CiB9OwogCkBAIC05MCw5ICsxMTYsMTIgQEAKIAkubGNyaF90eAkJPSBTVF9VQVJUMDExX0xDUkhfVFgsCiAJLmxjcmhfcngJCT0gU1RfVUFSVDAxMV9MQ1JIX1JYLAogCS5vdmVyc2FtcGxpbmcJCT0gdHJ1ZSwKKwkuaW50ZXJydXB0X21heV9oYW5nCT0gdHJ1ZSwKIAkuZG1hX3RocmVzaG9sZAkJPSB0cnVlLAogfTsKIAorc3RhdGljIHN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqYW1iYV9wb3J0c1tVQVJUX05SXTsKKwogLyogRGVhbHMgd2l0aCBETUEgdHJhbnNhY3Rpb25zICovCiAKIHN0cnVjdCBwbDAxMV9zZ2J1ZiB7CkBAIC0xMzIsNiArMTYxLDcgQEAKIAl1bnNpZ25lZCBpbnQJCWxjcmhfcng7CS8qIHZlbmRvci1zcGVjaWZpYyAqLwogCWJvb2wJCQlhdXRvcnRzOwogCWNoYXIJCQl0eXBlWzEyXTsKKwlib29sCQkJaW50ZXJydXB0X21heV9oYW5nOyAvKiB2ZW5kb3Itc3BlY2lmaWMgKi8KICNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQogCS8qIERNQSBzdHVmZiAqLwogCWJvb2wJCQl1c2luZ190eF9kbWE7CkBAIC0xMDA4LDYgKzEwMzgsNjggQEAKICNlbmRpZgogCiAKKy8qCisgKiBwbDAxMV9sb2NrdXBfd2EKKyAqIFRoaXMgd29ya2Fyb3VuZCBhaW1zIHRvIGJyZWFrIHRoZSBkZWFkbG9jayBzaXR1YXRpb24KKyAqIHdoZW4gYWZ0ZXIgbG9uZyB0cmFuc2ZlciBvdmVyIHVhcnQgaW4gaGFyZHdhcmUgZmxvdworICogY29udHJvbCwgdWFydCBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGNhbm5vdCBiZSBjbGVhcmVkLgorICogSGVuY2UgdWFydCB0cmFuc2ZlciBnZXRzIGJsb2NrZWQuCisgKgorICogSXQgaXMgc2VlbiB0aGF0IGR1cmluZyBzdWNoIGRlYWRsb2NrIGNvbmRpdGlvbiBJQ1IKKyAqIGRvbid0IGdldCBjbGVhcmVkIGV2ZW4gb24gbXVsdGlwbGUgd3JpdGUuIFRoaXMgbGVhZHMKKyAqIHBhc3NfY291bnRlciB0byBkZWNyZWFzZSBhbmQgZmluYWxseSByZWFjaCB6ZXJvLiBUaGlzCisgKiBjYW4gYmUgdGFrZW4gYXMgdHJpZ2dlciBwb2ludCB0byBydW4gdGhpcyBVQVJUX0JUX1dBLgorICoKKyAqLworc3RhdGljIHZvaWQgcGwwMTFfbG9ja3VwX3dhKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKnVhcCA9IGFtYmFfcG9ydHNbMF07CisJdm9pZCBfX2lvbWVtICpiYXNlID0gdWFwLT5wb3J0Lm1lbWJhc2U7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnVhcC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdWFwLT5wb3J0LnN0YXRlLT5wb3J0LnR0eTsKKwlpbnQgYnVmX2VtcHR5X3JldHJpZXMgPSAyMDA7CisJaW50IGxvb3A7CisKKwkvKiBTdG9wIEhDSSBsYXllciBmcm9tIHN1Ym1pdHRpbmcgZGF0YSBmb3IgdHggKi8KKwl0dHktPmh3X3N0b3BwZWQgPSAxOworCXdoaWxlICghdWFydF9jaXJjX2VtcHR5KHhtaXQpKSB7CisJCWlmIChidWZfZW1wdHlfcmV0cmllcy0tID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJLyogQmFja3VwIHJlZ2lzdGVycyAqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBVQVJUX1dBX1NBVkVfTlI7IGxvb3ArKykKKwkJdWFydF93YV9yZWdkYXRhW2xvb3BdID0gcmVhZGwoYmFzZSArIHVhcnRfd2FfcmVnW2xvb3BdKTsKKworCS8qIERpc2FibGUgVUFSVCBzbyB0aGF0IEZJRk8gZGF0YSBpcyBmbHVzaGVkIG91dCAqLworCXdyaXRldygweDAwLCB1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfQ1IpOworCisJLyogU29mdCByZXNldCBVQVJUIG1vZHVsZSAqLworCWlmICh1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhKSB7CisJCXN0cnVjdCBhbWJhX3BsMDExX2RhdGEgKnBsYXQ7CisKKwkJcGxhdCA9IHVhcC0+cG9ydC5kZXYtPnBsYXRmb3JtX2RhdGE7CisJCWlmIChwbGF0LT5yZXNldCkKKwkJCXBsYXQtPnJlc2V0KCk7CisJfQorCisJLyogUmVzdG9yZSByZWdpc3RlcnMgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgVUFSVF9XQV9TQVZFX05SOyBsb29wKyspCisJCXdyaXRldyh1YXJ0X3dhX3JlZ2RhdGFbbG9vcF0gLAorCQkJCXVhcC0+cG9ydC5tZW1iYXNlICsgdWFydF93YV9yZWdbbG9vcF0pOworCisJLyogSW5pdGlhbGlzZSB0aGUgb2xkIHN0YXR1cyBvZiB0aGUgbW9kZW0gc2lnbmFscyAqLworCXVhcC0+b2xkX3N0YXR1cyA9IHJlYWR3KHVhcC0+cG9ydC5tZW1iYXNlICsgVUFSVDAxeF9GUikgJgorCQlVQVJUMDF4X0ZSX01PREVNX0FOWTsKKworCWlmIChyZWFkbChiYXNlICsgVUFSVDAxMV9NSVMpICYgMHgyKQorCQlwcmludGsoS0VSTl9FTUVSRyAiVUFSVF9CVF9XQTogKioqRkFJTEVEKioqXG4iKTsKKworCS8qIFN0YXJ0IFR4L1J4ICovCisJdHR5LT5od19zdG9wcGVkID0gMDsKK30KKwogc3RhdGljIHZvaWQgcGwwMTFfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqdWFwID0gKHN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqKXBvcnQ7CkBAIC0xMTU4LDggKzEyNTAsMTEgQEAKIAkJCWlmIChzdGF0dXMgJiBVQVJUMDExX1RYSVMpCiAJCQkJcGwwMTFfdHhfY2hhcnModWFwKTsKIAotCQkJaWYgKHBhc3NfY291bnRlci0tID09IDApCisJCQlpZiAocGFzc19jb3VudGVyLS0gPT0gMCkgeworCQkJCWlmICh1YXAtPmludGVycnVwdF9tYXlfaGFuZykKKwkJCQkJdGFza2xldF9zY2hlZHVsZSgmcGwwMTFfbG9ja3VwX3RsZXQpOwogCQkJCWJyZWFrOworCQkJfQogCiAJCQlzdGF0dXMgPSByZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfTUlTKTsKIAkJfSB3aGlsZSAoc3RhdHVzICE9IDApOwpAQCAtMTMzOSw2ICsxNDM0LDE0IEBACiAJd3JpdGV3KHVhcC0+aW0sIHVhcC0+cG9ydC5tZW1iYXNlICsgVUFSVDAxMV9JTVNDKTsKIAlzcGluX3VubG9ja19pcnEoJnVhcC0+cG9ydC5sb2NrKTsKIAorCWlmICh1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhKSB7CisJCXN0cnVjdCBhbWJhX3BsMDExX2RhdGEgKnBsYXQ7CisKKwkJcGxhdCA9IHVhcC0+cG9ydC5kZXYtPnBsYXRmb3JtX2RhdGE7CisJCWlmIChwbGF0LT5pbml0KQorCQkJcGxhdC0+aW5pdCgpOworCX0KKwogCXJldHVybiAwOwogCiAgY2xrX2RpczoKQEAgLTEzOTQsNiArMTQ5NywxNSBAQAogCSAqIFNodXQgZG93biB0aGUgY2xvY2sgcHJvZHVjZXIKIAkgKi8KIAljbGtfZGlzYWJsZSh1YXAtPmNsayk7CisKKwlpZiAodWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhICpwbGF0OworCisJCXBsYXQgPSB1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGxhdC0+ZXhpdCkKKwkJCXBsYXQtPmV4aXQoKTsKKwl9CisKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE3MDAsNiArMTgxMiwxNCBAQAogCWlmICghdWFwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICh1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhKSB7CisJCXN0cnVjdCBhbWJhX3BsMDExX2RhdGEgKnBsYXQ7CisKKwkJcGxhdCA9IHVhcC0+cG9ydC5kZXYtPnBsYXRmb3JtX2RhdGE7CisJCWlmIChwbGF0LT5pbml0KQorCQkJcGxhdC0+aW5pdCgpOworCX0KKwogCXVhcC0+cG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKHVhcC0+Y2xrKTsKIAogCWlmIChvcHRpb25zKQpAQCAtMTc3NCw2ICsxODk0LDcgQEAKIAl1YXAtPmxjcmhfcnggPSB2ZW5kb3ItPmxjcmhfcng7CiAJdWFwLT5sY3JoX3R4ID0gdmVuZG9yLT5sY3JoX3R4OwogCXVhcC0+Zmlmb3NpemUgPSB2ZW5kb3ItPmZpZm9zaXplOworCXVhcC0+aW50ZXJydXB0X21heV9oYW5nID0gdmVuZG9yLT5pbnRlcnJ1cHRfbWF5X2hhbmc7CiAJdWFwLT5wb3J0LmRldiA9ICZkZXYtPmRldjsKIAl1YXAtPnBvcnQubWFwYmFzZSA9IGRldi0+cmVzLnN0YXJ0OwogCXVhcC0+cG9ydC5tZW1iYXNlID0gYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwppbmRleCA2ZDVkNmU2Li5hZjliNzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC0xNzA5LDEyICsxNzA5LDEzIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdG1lbF9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICpwb3J0OworCXN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJdm9pZCAqZGF0YTsKIAlpbnQgcmV0OwogCiAJQlVJTERfQlVHX09OKEFUTUVMX1NFUklBTF9SSU5HU0laRSAmIChBVE1FTF9TRVJJQUxfUklOR1NJWkUgLSAxKSk7CiAKLQlwb3J0ID0gJmF0bWVsX3BvcnRzW3BkZXYtPmlkXTsKKwlwb3J0ID0gJmF0bWVsX3BvcnRzW3BkYXRhLT5udW1dOwogCXBvcnQtPmJhY2t1cF9pbXIgPSAwOwogCiAJYXRtZWxfaW5pdF9wb3J0KHBvcnQsIHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCmluZGV4IGExYTBlNTUuLmMwYjY4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKQEAgLTI1MCw2ICsyNTAsMjAgQEAKIAkJLyogZ2V0IG92ZXJydW4vZmlmbyBlbXB0eSBpbmZvcm1hdGlvbiBmcm9tIGllcgogCQkgKiByZWdpc3RlciAqLwogCQlpZXN0YXQgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0lSX1JFRyk7CisKKwkJaWYgKHVubGlrZWx5KGllc3RhdCAmIFVBUlRfSVJfU1RBVChVQVJUX0lSX1JYT1ZFUikpKSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCQkvKiBmaWZvIHJlc2V0IGlzIHJlcXVpcmVkIHRvIGNsZWFyCisJCQkgKiBpbnRlcnJ1cHQgKi8KKwkJCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfQ1RMX1JFRyk7CisJCQl2YWwgfD0gVUFSVF9DVExfUlNUUlhGSUZPX01BU0s7CisJCQliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX0NUTF9SRUcpOworCisJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisJCX0KKwogCQlpZiAoIShpZXN0YXQgJiBVQVJUX0lSX1NUQVQoVUFSVF9JUl9SWE5PVEVNUFRZKSkpCiAJCQlicmVhazsKIApAQCAtMjg0LDEwICsyOTgsNiBAQAogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcihwb3J0LCBjKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICh1bmxpa2VseShpZXN0YXQgJiBVQVJUX0lSX1NUQVQoVUFSVF9JUl9SWE9WRVIpKSkgewotCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwotCQl9CiAKIAkJaWYgKChjc3RhdCAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkKIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYywgZmxhZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX2RyaXZlci5jCmluZGV4IDE4ZjU0ODQuLjk2ZGExNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX2RyaXZlci5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlicmQtPmJkX3VhcnRfb2Zmc2V0ID0gMHgyMDA7CiAJYnJkLT5iZF9kaXZpZGVuZCA9IDkyMTYwMDsKIAotCWJyZC0+cmVfbWFwX21lbWJhc2UgPSBpb3JlbWFwKGJyZC0+bWVtYmFzZSwgMHgxMDAwKTsKKwlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOwogCWlmICghYnJkLT5yZV9tYXBfbWVtYmFzZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiY2FyZCBoYXMgbm8gUENJIE1lbW9yeSByZXNvdXJjZXMsICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tcnN0X21heDMxMTAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tcnN0X21heDMxMTAuYwppbmRleCAxYmQyODQ1Li5hNzY0YmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbXJzdF9tYXgzMTEwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21yc3RfbWF4MzExMC5jCkBAIC00MjEsNyArNDIxLDYgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmbWF4LT5jb25feG1pdDsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQod3EpOwogCXByX2luZm8oUFJfRk1UICJzdGFydCBtYWluIHRocmVhZFxuIik7CiAKIAlkbyB7CkBAIC04MjMsNyArODIyLDcgQEAKIAlyZXMgPSBSQ19UQUc7CiAJcmV0ID0gbWF4MzExMF93cml0ZV90aGVuX3JlYWQobWF4LCAodTggKikmcmVzLCAodTggKikmcmVzLCAyLCAwKTsKIAlpZiAocmV0IDwgMCB8fCByZXMgPT0gMCB8fCByZXMgPT0gMHhmZmZmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTUFYMzExMSBkZWVtZWQgbm90IHByZXNlbnQgKGNvbmYgcmVnICUwNHgpIiwKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJNQVgzMTExIGRlZW1lZCBub3QgcHJlc2VudCAoY29uZiByZWcgJTA0eCkiLAogCQkJCQkJCQkJcmVzKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfZ2V0X3BhZ2U7CkBAIC04MzgsNiArODM3LDggQEAKIAltYXgtPmNvbl94bWl0LmhlYWQgPSAwOwogCW1heC0+Y29uX3htaXQudGFpbCA9IDA7CiAKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtYXgtPndxKTsKKwogCW1heC0+bWFpbl90aHJlYWQgPSBrdGhyZWFkX3J1bihtYXgzMTEwX21haW5fdGhyZWFkLAogCQkJCQltYXgsICJtYXgzMTEwX21haW4iKTsKIAlpZiAoSVNfRVJSKG1heC0+bWFpbl90aHJlYWQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCmluZGV4IGYyY2I3NTAuLjQ2NTIxMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCkBAIC0xMzk3LDYgKzEzOTcsNyBAQAogCWludCBmaWZvc2l6ZSwgYmFzZV9iYXVkOwogCWludCBwb3J0X3R5cGU7CiAJc3RydWN0IHBjaF91YXJ0X2RyaXZlcl9kYXRhICpib2FyZDsKKwljb25zdCBjaGFyICpib2FyZF9uYW1lOwogCiAJYm9hcmQgPSAmZHJ2X2RhdFtpZC0+ZHJpdmVyX2RhdGFdOwogCXBvcnRfdHlwZSA9IGJvYXJkLT5wb3J0X3R5cGU7CkBAIC0xNDEyLDcgKzE0MTMsOCBAQAogCWJhc2VfYmF1ZCA9IDE4NDMyMDA7IC8qIDEuODQzMk1IeiAqLwogCiAJLyogcXVpcmsgZm9yIENNLWlUQyBib2FyZCAqLwotCWlmIChzdHJzdHIoZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfTkFNRSksICJDTS1pVEMiKSkKKwlib2FyZF9uYW1lID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfTkFNRSk7CisJaWYgKGJvYXJkX25hbWUgJiYgc3Ryc3RyKGJvYXJkX25hbWUsICJDTS1pVEMiKSkKIAkJYmFzZV9iYXVkID0gMTkyMDAwMDAwOyAvKiAxOTIuME1IeiAqLwogCiAJc3dpdGNoIChwb3J0X3R5cGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zNXB2MjEwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jCmluZGV4IGZiMjYxOWY5Li5kZDE5NGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zNXB2MjEwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcgPSBwb3J0LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwogCi0JaWYgKChjZmctPmNsb2Nrc19zaXplKSA9PSAxKQorCWlmIChjZmctPmZsYWdzICYgTk9fTkVFRF9DSEVDS19DTEtTUkMpCiAJCXJldHVybiAwOwogCiAJaWYgKHN0cmNtcChjbGstPm5hbWUsICJwY2xrIikgPT0gMCkKQEAgLTU1LDcgKzU1LDcgQEAKIAogCWNsay0+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+CiAgKgogICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KICAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA0IERhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCmluZGV4IGFmZWY3YjAuLjgwYmU1NDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCkBAIC0zMTIsOCArMzEyLDEwIEBACiAJCXJldHVybiBQVFJfRVJSKHVzYl9jbGspOwogCiAJaGNkID0gdXNiX2NyZWF0ZV9oY2QgKGRyaXZlciwgJnBkZXYtPmRldiwgInB4YTI3eCIpOwotCWlmICghaGNkKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWhjZCkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyKSB7CkBAIC0zNjgsNiArMzcwLDcgQEAKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKICBlcnIxOgogCXVzYl9wdXRfaGNkKGhjZCk7CisgZXJyMDoKIAljbGtfcHV0KHVzYl9jbGspOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwppbmRleCBkYjZmOGI5Li40NTg2MzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKQEAgLTI1MTcsNiArMjUxNyw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnI4YTY2NTk3LT5jaGlsZF9kZXZpY2UpOwogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKKwloY2QtPmhhc190dCA9IDE7CiAKIAlyZXQgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9ESVNBQkxFRCB8IGlycV90cmlnZ2VyKTsKIAlpZiAocmV0ICE9IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYwppbmRleCAyZTA0ODYxLi4xZjUwYjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jCkBAIC00MzgsMTMgKzQzOCwxMyBAQAogCXN0cnVjdCB4aGNpX3Nsb3RfY3R4ICpzbG90X2N0eCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIGN0eCk7CiAKIAlzd2l0Y2ggKEdFVF9TTE9UX1NUQVRFKGxlMzJfdG9fY3B1KHNsb3RfY3R4LT5kZXZfc3RhdGUpKSkgewotCWNhc2UgMDoKKwljYXNlIFNMT1RfU1RBVEVfRU5BQkxFRDoKIAkJcmV0dXJuICJlbmFibGVkL2Rpc2FibGVkIjsKLQljYXNlIDE6CisJY2FzZSBTTE9UX1NUQVRFX0RFRkFVTFQ6CiAJCXJldHVybiAiZGVmYXVsdCI7Ci0JY2FzZSAyOgorCWNhc2UgU0xPVF9TVEFURV9BRERSRVNTRUQ6CiAJCXJldHVybiAiYWRkcmVzc2VkIjsKLQljYXNlIDM6CisJY2FzZSBTTE9UX1NUQVRFX0NPTkZJR1VSRUQ6CiAJCXJldHVybiAiY29uZmlndXJlZCI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICJyZXNlcnZlZCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKaW5kZXggMjZjYWJhNC4uZmNiN2Y3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwpAQCAtOTg1LDkgKzk4NSwxOSBAQAogCWludGVydmFsID0gY2xhbXBfdmFsKGVwLT5kZXNjLmJJbnRlcnZhbCwgMSwgMTYpIC0gMTsKIAlpZiAoaW50ZXJ2YWwgIT0gZXAtPmRlc2MuYkludGVydmFsIC0gMSkKIAkJZGV2X3dhcm4oJnVkZXYtPmRldiwKLQkJCSAiZXAgJSN4IC0gcm91bmRpbmcgaW50ZXJ2YWwgdG8gJWQgbWljcm9mcmFtZXNcbiIsCisJCQkgImVwICUjeCAtIHJvdW5kaW5nIGludGVydmFsIHRvICVkICVzZnJhbWVzXG4iLAogCQkJIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MsCi0JCQkgMSA8PCBpbnRlcnZhbCk7CisJCQkgMSA8PCBpbnRlcnZhbCwKKwkJCSB1ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCA/ICIiIDogIm1pY3JvIik7CisKKwlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwpIHsKKwkJLyoKKwkJICogRnVsbCBzcGVlZCBpc29jIGVuZHBvaW50cyBzcGVjaWZ5IGludGVydmFsIGluIGZyYW1lcywKKwkJICogbm90IG1pY3JvZnJhbWVzLiBXZSBhcmUgdXNpbmcgbWljcm9mcmFtZXMgZXZlcnl3aGVyZSwKKwkJICogc28gYWRqdXN0IGFjY29yZGluZ2x5LgorCQkgKi8KKwkJaW50ZXJ2YWwgKz0gMzsJLyogMSBmcmFtZSA9IDJeMyB1ZnJhbWVzICovCisJfQogCiAJcmV0dXJuIGludGVydmFsOwogfQpAQCAtMTIwNSw4ICsxMjE1LDYgQEAKIAkJZXBfY3R4LT5lcF9pbmZvMiB8PSBjcHVfdG9fbGUzMihNQVhfUEFDS0VUKG1heF9wYWNrZXQpKTsKIAkJLyogZGlnIG91dCBtYXggYnVyc3QgZnJvbSBlcCBjb21wYW5pb24gZGVzYyAqLwogCQltYXhfcGFja2V0ID0gZXAtPnNzX2VwX2NvbXAuYk1heEJ1cnN0OwotCQlpZiAoIW1heF9wYWNrZXQpCi0JCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gbm8gU1MgZW5kcG9pbnQgYk1heEJ1cnN0XG4iKTsKIAkJZXBfY3R4LT5lcF9pbmZvMiB8PSBjcHVfdG9fbGUzMihNQVhfQlVSU1QobWF4X3BhY2tldCkpOwogCQlicmVhazsKIAljYXNlIFVTQl9TUEVFRF9ISUdIOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCmluZGV4IGM0MDhlOWYuLmNiMTZkZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKQEAgLTI5LDYgKzI5LDkgQEAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GUkVTQ09fTE9HSUMJMHgxYjczCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRlJFU0NPX0xPR0lDX1BESwkweDEwMDAKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VUUk9OCQkweDFiNmYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BU1JPQ0tfUDY3CTB4NzAyMworCiBzdGF0aWMgY29uc3QgY2hhciBoY2RfbmFtZVtdID0gInhoY2lfaGNkIjsKIAogLyogY2FsbGVkIGFmdGVyIHBvd2VydXAsIGJ5IHByb2JlIG9yIHN5c3RlbS1wbSAid2FrZXVwIiAqLwpAQCAtMTA2LDEyICsxMDksMjIgQEAKIAogCS8qIExvb2sgZm9yIHZlbmRvci1zcGVjaWZpYyBxdWlya3MgKi8KIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRlJFU0NPX0xPR0lDICYmCi0JCQlwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9GUkVTQ09fTE9HSUNfUERLICYmCi0JCQlwZGV2LT5yZXZpc2lvbiA9PSAweDApIHsKKwkJCXBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0ZSRVNDT19MT0dJQ19QREspIHsKKwkJaWYgKHBkZXYtPnJldmlzaW9uID09IDB4MCkgewogCQkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfUkVTRVRfRVBfUVVJUks7CiAJCQl4aGNpX2RiZyh4aGNpLCAiUVVJUks6IEZyZXNjbyBMb2dpYyB4SEMgbmVlZHMgY29uZmlndXJlIgogCQkJCQkiIGVuZHBvaW50IGNtZCBhZnRlciByZXNldCBlbmRwb2ludFxuIik7CisJCX0KKwkJLyogRnJlc2NvIExvZ2ljIGNvbmZpcm1zOiBhbGwgcmV2aXNpb25zIG9mIHRoaXMgY2hpcCBkbyBub3QKKwkJICogc3VwcG9ydCBNU0ksIGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhlbSBjbGFpbSB0byBpbiB0aGVpciBQQ0kKKwkJICogY2FwYWJpbGl0aWVzLgorCQkgKi8KKwkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfQlJPS0VOX01TSTsKKwkJeGhjaV9kYmcoeGhjaSwgIlFVSVJLOiBGcmVzY28gTG9naWMgcmV2aXNpb24gJXUgIgorCQkJCSJoYXMgYnJva2VuIE1TSSBpbXBsZW1lbnRhdGlvblxuIiwKKwkJCQlwZGV2LT5yZXZpc2lvbik7CiAJfQorCiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05FQykKIAkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfTkVDX0hPU1Q7CiAKQEAgLTEyNCw2ICsxMzcsMTEgQEAKIAkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfRVBfTElNSVRfUVVJUks7CiAJCXhoY2ktPmxpbWl0X2FjdGl2ZV9lcHMgPSA2NDsKIAl9CisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0VUUk9OICYmCisJCQlwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BU1JPQ0tfUDY3KSB7CisJCXhoY2ktPnF1aXJrcyB8PSBYSENJX1JFU0VUX09OX1JFU1VNRTsKKwkJeGhjaV9kYmcoeGhjaSwgIlFVSVJLOiBSZXNldHRpbmcgb24gcmVzdW1lXG4iKTsKKwl9CiAKIAkvKiBNYWtlIHN1cmUgdGhlIEhDIGlzIGhhbHRlZC4gKi8KIAlyZXR2YWwgPSB4aGNpX2hhbHQoeGhjaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwppbmRleCBjYzE0ODViLi43MGNhY2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKQEAgLTE3MzMsNiArMTczMyw3IEBACiAJCWZyYW1lLT5zdGF0dXMgPSAtRU9WRVJGTE9XOwogCQlza2lwX3RkID0gdHJ1ZTsKIAkJYnJlYWs7CisJY2FzZSBDT01QX0RFVl9FUlI6CiAJY2FzZSBDT01QX1NUQUxMOgogCQlmcmFtZS0+c3RhdHVzID0gLUVQUk9UTzsKIAkJc2tpcF90ZCA9IHRydWU7CkBAIC0xNzY3LDkgKzE3NjgsNiBAQAogCQl9CiAJfQogCi0JaWYgKChpZHggPT0gdXJiX3ByaXYtPmxlbmd0aCAtIDEpICYmICpzdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotCQkqc3RhdHVzID0gMDsKLQogCXJldHVybiBmaW5pc2hfdGQoeGhjaSwgdGQsIGV2ZW50X3RyYiwgZXZlbnQsIGVwLCBzdGF0dXMsIGZhbHNlKTsKIH0KIApAQCAtMTc4MiwxMyArMTc4MCwxMiBAQAogCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmcmFtZTsKIAlpbnQgaWR4OwogCi0JZXBfcmluZyA9IHhoY2lfZG1hX3RvX3RyYW5zZmVyX3JpbmcoZXAsIGV2ZW50LT5idWZmZXIpOworCWVwX3JpbmcgPSB4aGNpX2RtYV90b190cmFuc2Zlcl9yaW5nKGVwLCBsZTY0X3RvX2NwdShldmVudC0+YnVmZmVyKSk7CiAJdXJiX3ByaXYgPSB0ZC0+dXJiLT5oY3ByaXY7CiAJaWR4ID0gdXJiX3ByaXYtPnRkX2NudDsKIAlmcmFtZSA9ICZ0ZC0+dXJiLT5pc29fZnJhbWVfZGVzY1tpZHhdOwogCi0JLyogVGhlIHRyYW5zZmVyIGlzIHBhcnRseSBkb25lICovCi0JKnN0YXR1cyA9IC1FWERFVjsKKwkvKiBUaGUgdHJhbnNmZXIgaXMgcGFydGx5IGRvbmUuICovCiAJZnJhbWUtPnN0YXR1cyA9IC1FWERFVjsKIAogCS8qIGNhbGMgYWN0dWFsIGxlbmd0aCAqLwpAQCAtMjAxNiw2ICsyMDEzLDEwIEBACiAJCQkJIFRSQl9UT19TTE9UX0lEKGxlMzJfdG9fY3B1KGV2ZW50LT5mbGFncykpLAogCQkJCSBlcF9pbmRleCk7CiAJCWdvdG8gY2xlYW51cDsKKwljYXNlIENPTVBfREVWX0VSUjoKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBkZXRlY3QgYW4gaW5jb21wYXRpYmxlIGRldmljZSIpOworCQlzdGF0dXMgPSAtRVBST1RPOworCQlicmVhazsKIAljYXNlIENPTVBfTUlTU0VEX0lOVDoKIAkJLyoKIAkJICogV2hlbiBlbmNvdW50ZXIgbWlzc2VkIHNlcnZpY2UgZXJyb3IsIG9uZSBvciBtb3JlIGlzb2MgdGRzCkBAIC0yMDYzLDYgKzIwNjQsMjAgQEAKIAkJLyogSXMgdGhpcyBhIFRSQiBpbiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBURD8gKi8KIAkJZXZlbnRfc2VnID0gdHJiX2luX3RkKGVwX3JpbmctPmRlcV9zZWcsIGVwX3JpbmctPmRlcXVldWUsCiAJCQkJdGQtPmxhc3RfdHJiLCBldmVudF9kbWEpOworCisJCS8qCisJCSAqIFNraXAgdGhlIEZvcmNlIFN0b3BwZWQgRXZlbnQuIFRoZSBldmVudF90cmIoZXZlbnRfZG1hKSBvZiBGU0UKKwkJICogaXMgbm90IGluIHRoZSBjdXJyZW50IFREIHBvaW50ZWQgYnkgZXBfcmluZy0+ZGVxdWV1ZSBiZWNhdXNlCisJCSAqIHRoYXQgdGhlIGhhcmR3YXJlIGRlcXVldWUgcG9pbnRlciBzdGlsbCBhdCB0aGUgcHJldmlvdXMgVFJCCisJCSAqIG9mIHRoZSBjdXJyZW50IFRELiBUaGUgcHJldmlvdXMgVFJCIG1heWJlIGEgTGluayBURCBvciB0aGUKKwkJICogbGFzdCBUUkIgb2YgdGhlIHByZXZpb3VzIFRELiBUaGUgY29tbWFuZCBjb21wbGV0aW9uIGhhbmRsZQorCQkgKiB3aWxsIHRha2UgY2FyZSB0aGUgcmVzdC4KKwkJICovCisJCWlmICghZXZlbnRfc2VnICYmIHRyYl9jb21wX2NvZGUgPT0gQ09NUF9TVE9QX0lOVkFMKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBjbGVhbnVwOworCQl9CisKIAkJaWYgKCFldmVudF9zZWcpIHsKIAkJCWlmICghZXAtPnNraXAgfHwKIAkJCSAgICAhdXNiX2VuZHBvaW50X3hmZXJfaXNvYygmdGQtPnVyYi0+ZXAtPmRlc2MpKSB7CkBAIC0yMTU4LDYgKzIxNzMsMTEgQEAKIAkJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCQkJCXN0YXR1cyk7CiAJCQlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CisJCQkvKiBFSENJLCBVSENJLCBhbmQgT0hDSSBhbHdheXMgdW5jb25kaXRpb25hbGx5IHNldCB0aGUKKwkJCSAqIHVyYi0+c3RhdHVzIG9mIGFuIGlzb2Nocm9ub3VzIGVuZHBvaW50IHRvIDAuCisJCQkgKi8KKwkJCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKQorCQkJCXN0YXR1cyA9IDA7CiAJCQl1c2JfaGNkX2dpdmViYWNrX3VyYihidXNfdG9faGNkKHVyYi0+ZGV2LT5idXMpLCB1cmIsIHN0YXR1cyk7CiAJCQlzcGluX2xvY2soJnhoY2ktPmxvY2spOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCmluZGV4IGQ5NjYwZWIuLmY1ZmUxYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCkBAIC00MzAsMTIgKzQzMCwxOSBAQAogCQlmcmVlX2lycShoY2QtPmlycSwgaGNkKTsKIAloY2QtPmlycSA9IC0xOwogCisJLyogU29tZSBGcmVzY28gTG9naWMgaG9zdCBjb250cm9sbGVycyBhZHZlcnRpc2UgTVNJLCBidXQgZmFpbCB0bworCSAqIGdlbmVyYXRlIGludGVycnVwdHMuICBEb24ndCBldmVuIHRyeSB0byBlbmFibGUgTVNJLgorCSAqLworCWlmICh4aGNpLT5xdWlya3MgJiBYSENJX0JST0tFTl9NU0kpCisJCWdvdG8gbGVnYWN5X2lycTsKKwogCXJldCA9IHhoY2lfc2V0dXBfbXNpeCh4aGNpKTsKIAlpZiAocmV0KQogCQkvKiBmYWxsIGJhY2sgdG8gbXNpKi8KIAkJcmV0ID0geGhjaV9zZXR1cF9tc2koeGhjaSk7CiAKIAlpZiAocmV0KSB7CitsZWdhY3lfaXJxOgogCQkvKiBmYWxsIGJhY2sgdG8gbGVnYWN5IGludGVycnVwdCovCiAJCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgJnVzYl9oY2RfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCQkJaGNkLT5pcnFfZGVzY3IsIGhjZCk7CkBAIC03NTIsNiArNzU5LDggQEAKIAkJbXNsZWVwKDEwMCk7CiAKIAlzcGluX2xvY2tfaXJxKCZ4aGNpLT5sb2NrKTsKKwlpZiAoeGhjaS0+cXVpcmtzICYgWEhDSV9SRVNFVF9PTl9SRVNVTUUpCisJCWhpYmVybmF0ZWQgPSB0cnVlOwogCiAJaWYgKCFoaWJlcm5hdGVkKSB7CiAJCS8qIHN0ZXAgMTogcmVzdG9yZSByZWdpc3RlciAqLwpAQCAtMTM5NCw2ICsxNDAzLDcgQEAKIAl1MzIgYWRkZWRfY3R4czsKIAl1bnNpZ25lZCBpbnQgbGFzdF9jdHg7CiAJdTMyIG5ld19hZGRfZmxhZ3MsIG5ld19kcm9wX2ZsYWdzLCBuZXdfc2xvdF9pbmZvOworCXN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlICp2aXJ0X2RldjsKIAlpbnQgcmV0ID0gMDsKIAogCXJldCA9IHhoY2lfY2hlY2tfYXJncyhoY2QsIHVkZXYsIGVwLCAxLCB0cnVlLCBfX2Z1bmNfXyk7CkBAIC0xNDE4LDExICsxNDI4LDI1IEBACiAJCXJldHVybiAwOwogCX0KIAotCWluX2N0eCA9IHhoY2ktPmRldnNbdWRldi0+c2xvdF9pZF0tPmluX2N0eDsKLQlvdXRfY3R4ID0geGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXS0+b3V0X2N0eDsKKwl2aXJ0X2RldiA9IHhoY2ktPmRldnNbdWRldi0+c2xvdF9pZF07CisJaW5fY3R4ID0gdmlydF9kZXYtPmluX2N0eDsKKwlvdXRfY3R4ID0gdmlydF9kZXYtPm91dF9jdHg7CiAJY3RybF9jdHggPSB4aGNpX2dldF9pbnB1dF9jb250cm9sX2N0eCh4aGNpLCBpbl9jdHgpOwogCWVwX2luZGV4ID0geGhjaV9nZXRfZW5kcG9pbnRfaW5kZXgoJmVwLT5kZXNjKTsKIAllcF9jdHggPSB4aGNpX2dldF9lcF9jdHgoeGhjaSwgb3V0X2N0eCwgZXBfaW5kZXgpOworCisJLyogSWYgdGhpcyBlbmRwb2ludCBpcyBhbHJlYWR5IGluIHVzZSwgYW5kIHRoZSB1cHBlciBsYXllcnMgYXJlIHRyeWluZworCSAqIHRvIGFkZCBpdCBhZ2FpbiB3aXRob3V0IGRyb3BwaW5nIGl0LCByZWplY3QgdGhlIGFkZGl0aW9uLgorCSAqLworCWlmICh2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5yaW5nICYmCisJCQkhKGxlMzJfdG9fY3B1KGN0cmxfY3R4LT5kcm9wX2ZsYWdzKSAmCisJCQkJeGhjaV9nZXRfZW5kcG9pbnRfZmxhZygmZXAtPmRlc2MpKSkgeworCQl4aGNpX3dhcm4oeGhjaSwgIlRyeWluZyB0byBhZGQgZW5kcG9pbnQgMHgleCAiCisJCQkJIndpdGhvdXQgZHJvcHBpbmcgaXQuXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBJZiB0aGUgSENEIGhhcyBhbHJlYWR5IG5vdGVkIHRoZSBlbmRwb2ludCBpcyBlbmFibGVkLAogCSAqIGlnbm9yZSB0aGlzIHJlcXVlc3QuCiAJICovCkBAIC0xNDM4LDggKzE0NjIsNyBAQAogCSAqIHByb2Nlc3MgY29udGV4dCwgbm90IGludGVycnVwdCBjb250ZXh0IChvciBzbyBkb2N1bWVuYXRpb24KIAkgKiBmb3IgdXNiX3NldF9pbnRlcmZhY2UoKSBhbmQgdXNiX3NldF9jb25maWd1cmF0aW9uKCkgY2xhaW0pLgogCSAqLwotCWlmICh4aGNpX2VuZHBvaW50X2luaXQoeGhjaSwgeGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXSwKLQkJCQl1ZGV2LCBlcCwgR0ZQX05PSU8pIDwgMCkgeworCWlmICh4aGNpX2VuZHBvaW50X2luaXQoeGhjaSwgdmlydF9kZXYsIHVkZXYsIGVwLCBHRlBfTk9JTykgPCAwKSB7CiAJCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzIC0gY291bGQgbm90IGluaXRpYWxpemUgZXAgJSN4XG4iLAogCQkJCV9fZnVuY19fLCBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNTMwLDYgKzE1NTMsMTEgQEAKIAkJCQkiYW5kIGVuZHBvaW50IGlzIG5vdCBkaXNhYmxlZC5cbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKKwljYXNlIENPTVBfREVWX0VSUjoKKwkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIkVSUk9SOiBJbmNvbXBhdGlibGUgZGV2aWNlIGZvciBlbmRwb2ludCAiCisJCQkJImNvbmZpZ3VyZSBjb21tYW5kLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWJyZWFrOwogCWNhc2UgQ09NUF9TVUNDRVNTOgogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJTdWNjZXNzZnVsIEVuZHBvaW50IENvbmZpZ3VyZSBjb21tYW5kXG4iKTsKIAkJcmV0ID0gMDsKQEAgLTE1NjQsNiArMTU5MiwxMSBAQAogCQl4aGNpX2RiZ19jdHgoeGhjaSwgdmlydF9kZXYtPm91dF9jdHgsIDEpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKKwljYXNlIENPTVBfREVWX0VSUjoKKwkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIkVSUk9SOiBJbmNvbXBhdGlibGUgZGV2aWNlIGZvciBldmFsdWF0ZSAiCisJCQkJImNvbnRleHQgY29tbWFuZC5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKIAljYXNlIENPTVBfTUVMX0VSUjoKIAkJLyogTWF4IEV4aXQgTGF0ZW5jeSB0b28gbGFyZ2UgZXJyb3IgKi8KIAkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIldBUk46IE1heCBFeGl0IExhdGVuY3kgdG9vIGxhcmdlXG4iKTsKQEAgLTE4NDksOCArMTg4Miw4IEBACiAKIAkvKiBGcmVlIGFueSByaW5ncyB0aGF0IHdlcmUgZHJvcHBlZCwgYnV0IG5vdCBjaGFuZ2VkLiAqLwogCWZvciAoaSA9IDE7IGkgPCAzMTsgKytpKSB7Ci0JCWlmICgoY3RybF9jdHgtPmRyb3BfZmxhZ3MgJiAoMSA8PCAoaSArIDEpKSkgJiYKLQkJCQkhKGN0cmxfY3R4LT5hZGRfZmxhZ3MgJiAoMSA8PCAoaSArIDEpKSkpCisJCWlmICgobGUzMl90b19jcHUoY3RybF9jdHgtPmRyb3BfZmxhZ3MpICYgKDEgPDwgKGkgKyAxKSkpICYmCisJCSAgICAhKGxlMzJfdG9fY3B1KGN0cmxfY3R4LT5hZGRfZmxhZ3MpICYgKDEgPDwgKGkgKyAxKSkpKQogCQkJeGhjaV9mcmVlX29yX2NhY2hlX2VuZHBvaW50X3JpbmcoeGhjaSwgdmlydF9kZXYsIGkpOwogCX0KIAl4aGNpX3plcm9faW5fY3R4KHhoY2ksIHZpcnRfZGV2KTsKQEAgLTI0NjcsNiArMjUwMCw3IEBACiAJc3RydWN0IHhoY2lfY29tbWFuZCAqcmVzZXRfZGV2aWNlX2NtZDsKIAlpbnQgdGltZWxlZnQ7CiAJaW50IGxhc3RfZnJlZWRfZW5kcG9pbnQ7CisJc3RydWN0IHhoY2lfc2xvdF9jdHggKnNsb3RfY3R4OwogCiAJcmV0ID0geGhjaV9jaGVja19hcmdzKGhjZCwgdWRldiwgTlVMTCwgMCwgZmFsc2UsIF9fZnVuY19fKTsKIAlpZiAocmV0IDw9IDApCkBAIC0yNDk5LDYgKzI1MzMsMTIgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIElmIGRldmljZSBpcyBub3Qgc2V0dXAsIHRoZXJlIGlzIG5vIHBvaW50IGluIHJlc2V0dGluZyBpdCAqLworCXNsb3RfY3R4ID0geGhjaV9nZXRfc2xvdF9jdHgoeGhjaSwgdmlydF9kZXYtPm91dF9jdHgpOworCWlmIChHRVRfU0xPVF9TVEFURShsZTMyX3RvX2NwdShzbG90X2N0eC0+ZGV2X3N0YXRlKSkgPT0KKwkJCQkJCVNMT1RfU1RBVEVfRElTQUJMRUQpCisJCXJldHVybiAwOworCiAJeGhjaV9kYmcoeGhjaSwgIlJlc2V0dGluZyBkZXZpY2Ugd2l0aCBzbG90IElEICV1XG4iLCBzbG90X2lkKTsKIAkvKiBBbGxvY2F0ZSB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgc3RydWN0IGNvbXBsZXRpb24uCiAJICogQXNzdW1lIHdlJ3JlIGluIHByb2Nlc3MgY29udGV4dCwgc2luY2UgdGhlIG5vcm1hbCBkZXZpY2UgcmVzZXQKQEAgLTI4MzksNiArMjg3OSwxMSBAQAogCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiRGV2aWNlIG5vdCByZXNwb25kaW5nIHRvIHNldCBhZGRyZXNzLlxuIik7CiAJCXJldCA9IC1FUFJPVE87CiAJCWJyZWFrOworCWNhc2UgQ09NUF9ERVZfRVJSOgorCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiRVJST1I6IEluY29tcGF0aWJsZSBkZXZpY2UgZm9yIGFkZHJlc3MgIgorCQkJCSJkZXZpY2UgY29tbWFuZC5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKIAljYXNlIENPTVBfU1VDQ0VTUzoKIAkJeGhjaV9kYmcoeGhjaSwgIlN1Y2Nlc3NmdWwgQWRkcmVzcyBEZXZpY2UgY29tbWFuZFxuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAppbmRleCBhYzAxOTZlLi5kOGJiZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaApAQCAtNTYwLDYgKzU2MCwxMSBAQAogI2RlZmluZSBTTE9UX1NUQVRFCSgweDFmIDw8IDI3KQogI2RlZmluZSBHRVRfU0xPVF9TVEFURShwKQkoKChwKSAmICgweDFmIDw8IDI3KSkgPj4gMjcpCiAKKyNkZWZpbmUgU0xPVF9TVEFURV9ESVNBQkxFRAkwCisjZGVmaW5lIFNMT1RfU1RBVEVfRU5BQkxFRAlTTE9UX1NUQVRFX0RJU0FCTEVECisjZGVmaW5lIFNMT1RfU1RBVEVfREVGQVVMVAkxCisjZGVmaW5lIFNMT1RfU1RBVEVfQUREUkVTU0VECTIKKyNkZWZpbmUgU0xPVF9TVEFURV9DT05GSUdVUkVECTMKIAogLyoqCiAgKiBzdHJ1Y3QgeGhjaV9lcF9jdHgKQEAgLTg2OSw2ICs4NzQsOCBAQAogI2RlZmluZSBDT01QX1BJTkdfRVJSCTIwCiAvKiBFdmVudCBSaW5nIGlzIGZ1bGwgKi8KICNkZWZpbmUgQ09NUF9FUl9GVUxMCTIxCisvKiBJbmNvbXBhdGlibGUgRGV2aWNlIEVycm9yICovCisjZGVmaW5lIENPTVBfREVWX0VSUgkyMgogLyogTWlzc2VkIFNlcnZpY2UgRXJyb3IgLSBIQyBjb3VsZG4ndCBzZXJ2aWNlIGFuIGlzb2MgZXAgd2l0aGluIGludGVydmFsICovCiAjZGVmaW5lIENPTVBfTUlTU0VEX0lOVAkyMwogLyogU3VjY2Vzc2Z1bGx5IHN0b3BwZWQgY29tbWFuZCByaW5nICovCkBAIC0xMzAyLDYgKzEzMDksOCBAQAogICogY29tbWFuZHMuCiAgKi8KICNkZWZpbmUgWEhDSV9FUF9MSU1JVF9RVUlSSwkoMSA8PCA1KQorI2RlZmluZSBYSENJX0JST0tFTl9NU0kJCSgxIDw8IDYpCisjZGVmaW5lIFhIQ0lfUkVTRVRfT05fUkVTVU1FCSgxIDw8IDcpCiAJdW5zaWduZWQgaW50CQludW1fYWN0aXZlX2VwczsKIAl1bnNpZ25lZCBpbnQJCWxpbWl0X2FjdGl2ZV9lcHM7CiAJLyogVGhlcmUgYXJlIHR3byByb290aHVicyB0byBrZWVwIHRyYWNrIG9mIGJ1cyBzdXNwZW5kIGluZm8gZm9yICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwppbmRleCBhYjhlMTAwLi5jNzFiMDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKQEAgLTk2LDYgKzk2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwppbmRleCAwYTUwYTM1Li42YWViMzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCkBAIC0xNTI0LDYgKzE1MjQsMTIgQEAKIAkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKTsKIAkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKSB7CiAJCQljc3IgfD0gTVVTQl9UWENTUl9GTFVTSEZJRk8gfCBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7CisJCQkvKgorCQkJICogU2V0dGluZyBib3RoIFRYUEtUUkRZIGFuZCBGTFVTSEZJRk8gbWFrZXMgY29udHJvbGxlcgorCQkJICogdG8gaW50ZXJydXB0IGN1cnJlbnQgRklGTyBsb2FkaW5nLCBidXQgbm90IGZsdXNoaW5nCisJCQkgKiB0aGUgYWxyZWFkeSBsb2FkZWQgb25lcy4KKwkJCSAqLworCQkJY3NyICY9IH5NVVNCX1RYQ1NSX1RYUEtUUkRZOwogCQkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKIAkJCS8qIFJFVklTSVQgbWF5IGJlIGluYXBwcm9wcmlhdGUgdy9vIEZJRk9OT1RFTVBUWSAuLi4gKi8KIAkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwppbmRleCA3Mjk1ZTMxLi44YjI0NzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKQEAgLTE1NzUsNyArMTU3NSw3IEBACiAJCQkvKiBldmVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgd2UgZGlkIHRoZSBkbWEKIAkJCSAqIGZvciBpc29fZnJhbWVfZGVzYy0+bGVuZ3RoCiAJCQkgKi8KLQkJCWlmIChkLT5zdGF0dXMgIT0gRUlMU0VRICYmIGQtPnN0YXR1cyAhPSAtRU9WRVJGTE9XKQorCQkJaWYgKGQtPnN0YXR1cyAhPSAtRUlMU0VRICYmIGQtPnN0YXR1cyAhPSAtRU9WRVJGTE9XKQogCQkJCWQtPnN0YXR1cyA9IDA7CiAKIAkJCWlmICgrK3FoLT5pc29faWR4ID49IHVyYi0+bnVtYmVyX29mX3BhY2tldHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCmluZGV4IDIwNmNmYWIuLjU0NzQ4NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCkBAIC0xMzgwLDUgKzEzODAsNiBAQAogewogCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2ID0gdXNiaHNnX3ByaXZfdG9fZ3ByaXYocHJpdik7CiAKKwlrZnJlZShncHJpdi0+dWVwKTsKIAlrZnJlZShncHJpdik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGU4ZGJkZTUuLjJlMDZiOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC0xNzksNiArMTc5LDcgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfMjMyUkxfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIyMzJDX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNDIzMkhfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV8yMzJIX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUlDUk9fQ0hBTUVMRU9OX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUkVMQUlTX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfT1BFTkRDQ19QSUQpIH0sCkBAIC02NDcsNiArNjQ4LDcgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEVWRVJfRUNPX1BST19DRFMpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfM19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMl9QSUQpIH0sCkBAIC04NDcsNyArODQ5LDggQEAKIAlbRlQyMjMyQ10gPSAiRlQyMjMyQyIsCiAJW0ZUMjMyUkxdID0gIkZUMjMyUkwiLAogCVtGVDIyMzJIXSA9ICJGVDIyMzJIIiwKLQlbRlQ0MjMySF0gPSAiRlQ0MjMySCIKKwlbRlQ0MjMySF0gPSAiRlQ0MjMySCIsCisJW0ZUMjMySF0gID0gIkZUMjMySCIKIH07CiAKIApAQCAtMTE2Nyw2ICsxMTcwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBGVDIyMzJIOiAvKiBGVDIyMzJIIGNoaXAgKi8KIAljYXNlIEZUNDIzMkg6IC8qIEZUNDIzMkggY2hpcCAqLworCWNhc2UgRlQyMzJIOiAgLyogRlQyMzJIIGNoaXAgKi8KIAkJaWYgKChiYXVkIDw9IDEyMDAwMDAwKSAmIChiYXVkID49IDEyMDApKSB7CiAJCQlkaXZfdmFsdWUgPSBmdGRpXzIyMzJoX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKIAkJfSBlbHNlIGlmIChiYXVkIDwgMTIwMCkgewpAQCAtMTQyOCw5ICsxNDMyLDEyIEBACiAJfSBlbHNlIGlmICh2ZXJzaW9uIDwgMHg2MDApIHsKIAkJLyogQXNzdW1lIGl0J3MgYW4gRlQyMzJCTSAob3IgRlQyNDVCTSkgKi8KIAkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJCTTsKLQl9IGVsc2UgewotCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMlIgKi8KKwl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDkwMCkgeworCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMlJMICovCiAJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyUkw7CisJfSBlbHNlIHsKKwkJLyogQXNzdW1lIGl0J3MgYW4gRlQyMzJIICovCisJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMySDsKIAl9CiAJZGV2X2luZm8oJnVkZXYtPmRldiwgIkRldGVjdGVkICVzXG4iLCBmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKIH0KQEAgLTE1NTgsNyArMTU2NSw4IEBACiAJCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMgfHwKIAkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJSTCB8fAogCQkgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJIIHx8Ci0JCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkgpKSB7CisJCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkggfHwKKwkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJIKSkgewogCQkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwb3J0LT5kZXYsCiAJCQkJCQkgICAgJmRldl9hdHRyX2xhdGVuY3lfdGltZXIpOwogCQl9CkBAIC0xNTc5LDcgKzE1ODcsOCBAQAogCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMgfHwKIAkJICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMlJMIHx8CiAJCSAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMySCB8fAotCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkgpIHsKKwkJICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDQyMzJIIHx8CisgICAgICAgICAgICAgICAgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkgpIHsKIAkJCWRldmljZV9yZW1vdmVfZmlsZSgmcG9ydC0+ZGV2LCAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CiAJCX0KIAl9CkBAIC0yMjExLDYgKzIyMjAsNyBAQAogCWNhc2UgRlQyMzJSTDoKIAljYXNlIEZUMjIzMkg6CiAJY2FzZSBGVDQyMzJIOgorCWNhc2UgRlQyMzJIOgogCQlsZW4gPSAyOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAppbmRleCAyMTNmZTNkLi4xOTU4NGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaApAQCAtMTU2LDcgKzE1Niw4IEBACiAJRlQyMjMyQyA9IDQsCiAJRlQyMzJSTCA9IDUsCiAJRlQyMjMySCA9IDYsCi0JRlQ0MjMySCA9IDcKKwlGVDQyMzJIID0gNywKKwlGVDIzMkggID0gOAogfTsKIAogZW51bSBmdGRpX3Npb19iYXVkcmF0ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKaW5kZXggMWQ5NDZjZC4uMTkxNTZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaApAQCAtMjIsNiArMjIsNyBAQAogI2RlZmluZSBGVERJXzhVMjMyQU1fQUxUX1BJRCAweDYwMDYgLyogRlRESSdzIGFsdGVybmF0ZSBQSUQgZm9yIGFib3ZlICovCiAjZGVmaW5lIEZURElfOFUyMjMyQ19QSUQgMHg2MDEwIC8qIER1YWwgY2hhbm5lbCBkZXZpY2UgKi8KICNkZWZpbmUgRlRESV80MjMySF9QSUQgMHg2MDExIC8qIFF1YWQgY2hhbm5lbCBoaS1zcGVlZCBkZXZpY2UgKi8KKyNkZWZpbmUgRlRESV8yMzJIX1BJRCAgMHg2MDE0IC8qIFNpbmdsZSBjaGFubmVsIGhpLXNwZWVkIGRldmljZSAqLwogI2RlZmluZSBGVERJX1NJT19QSUQJMHg4MzcyCS8qIFByb2R1Y3QgSWQgU0lPIGFwcGxpY2F0aW9uIG9mIDhVMTAwQVggKi8KICNkZWZpbmUgRlRESV8yMzJSTF9QSUQgIDB4RkJGQSAgLyogUHJvZHVjdCBJRCBmb3IgRlQyMzJSTCAqLwogCkBAIC0zNTEsNiArMzUyLDcgQEAKICAqLwogI2RlZmluZSBGVERJXzROX0dBTEFYWV9ERV8xX1BJRAkweEYzQzAKICNkZWZpbmUgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQJMHhGM0MxCisjZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzNfUElECTB4RjNDMgogCiAvKgogICogTGlueCBUZWNobm9sb2dpZXMgcHJvZHVjdCBpZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCAzMThkZDAwLi42MGIyNWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0zMTEsMTAgKzMxMSw2IEBACiAjZGVmaW5lIFpURV9QUk9EVUNUX0FDMjcyNgkJCTB4ZmZmNQogI2RlZmluZSBaVEVfUFJPRFVDVF9BQzg3MTBUCQkJMHhmZmZmCiAKLS8qIFpURSBQUk9EVUNUUyAtLSBhbHRlcm5hdGUgdmVuZG9yIElEICovCi0jZGVmaW5lIFpURV9WRU5ET1JfSUQyCQkJCTB4MWQ2YgotI2RlZmluZSBaVEVfUFJPRFVDVF9NRl8zMzAJCQkweDAwMDIKLQogI2RlZmluZSBCRU5RX1ZFTkRPUl9JRAkJCQkweDA0YTUKICNkZWZpbmUgQkVOUV9QUk9EVUNUX0gxMAkJCTB4NDA2OAogCkBAIC0zNDAsMTEgKzMzNiwxMiBAQAogI2RlZmluZSBUT1NISUJBX1BST0RVQ1RfRzQ1MAkJCTB4MGQ0NQogCiAjZGVmaW5lIEFMSU5LX1ZFTkRPUl9JRAkJCQkweDFlMGUKKyNkZWZpbmUgQUxJTktfUFJPRFVDVF9QSDMwMAkJCTB4OTEwMAogI2RlZmluZSBBTElOS19QUk9EVUNUXzNHVQkJCTB4OTIwMAogCiAvKiBBTENBVEVMIFBST0RVQ1RTICovCiAjZGVmaW5lIEFMQ0FURUxfVkVORE9SX0lECQkJMHgxYmJiCi0jZGVmaW5lIEFMQ0FURUxfUFJPRFVDVF9YMDYwUwkJCTB4MDAwMAorI2RlZmluZSBBTENBVEVMX1BST0RVQ1RfWDA2MFNfWDIwMAkJMHgwMDAwCiAKICNkZWZpbmUgUElSRUxMSV9WRU5ET1JfSUQJCQkweDEyNjYKICNkZWZpbmUgUElSRUxMSV9QUk9EVUNUX0MxMDBfMQkJCTB4MTAwMgpAQCAtMzc5LDYgKzM3Niw5IEBACiAgKiBJdCBzZWVtcyB0byBjb250YWluIGEgUXVhbGNvbW0gUVNDNjI0MC82MjkwIGNoaXBzZXQgICAgICAgICAgICAqLwogI2RlZmluZSBGT1VSX0dfU1lTVEVNU19QUk9EVUNUX1cxNAkJMHg5NjAzCiAKKy8qIFpvb20gKi8KKyNkZWZpbmUgWk9PTV9QUk9EVUNUXzQ1OTcJCQkweDk2MDcKKwogLyogSGFpZXIgcHJvZHVjdHMgKi8KICNkZWZpbmUgSEFJRVJfVkVORE9SX0lECQkJCTB4MjAxZQogI2RlZmluZSBIQUlFUl9QUk9EVUNUX0NFMTAwCQkJMHgyMDA5CkBAIC00MzIsNiArNDMyLDIwIEBACiAJLnJlYXNvbiA9IE9QVElPTl9CTEFDS0xJU1RfU0VORFNFVFVQCiB9OwogCitzdGF0aWMgY29uc3QgdTggYWxjYXRlbF94MjAwX25vX3NlbmRzZXR1cFtdID0geyAwLCAxIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbl9ibGFja2xpc3RfaW5mbyBhbGNhdGVsX3gyMDBfYmxhY2tsaXN0ID0geworCS5pbmZvbGVuID0gQVJSQVlfU0laRShhbGNhdGVsX3gyMDBfbm9fc2VuZHNldHVwKSwKKwkuaWZhY2VpbmZvID0gYWxjYXRlbF94MjAwX25vX3NlbmRzZXR1cCwKKwkucmVhc29uID0gT1BUSU9OX0JMQUNLTElTVF9TRU5EU0VUVVAKK307CisKK3N0YXRpYyBjb25zdCB1OCB6dGVfazM3NjVfel9ub19zZW5kc2V0dXBbXSA9IHsgMCwgMSwgMiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb25fYmxhY2tsaXN0X2luZm8genRlX2szNzY1X3pfYmxhY2tsaXN0ID0geworCS5pbmZvbGVuID0gQVJSQVlfU0laRSh6dGVfazM3NjVfel9ub19zZW5kc2V0dXApLAorCS5pZmFjZWluZm8gPSB6dGVfazM3NjVfel9ub19zZW5kc2V0dXAsCisJLnJlYXNvbiA9IE9QVElPTl9CTEFDS0xJU1RfU0VORFNFVFVQCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgb3B0aW9uX2lkc1tdID0gewogCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9DT0xUKSB9LAogCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9SSUNPTEEpIH0sCkBAIC05MTYsMTMgKzkzMCwxMyBAQAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDczLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTMwLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQxLCAweGZmLCAweGZmLCAweGZmKSB9LAotCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgyMDAyLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgyMDAyLCAweGZmLAorCSAgMHhmZiwgMHhmZiksIC5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmenRlX2szNzY1X3pfYmxhY2tsaXN0IH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDMsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCBaVEVfUFJPRFVDVF9DRE1BX1RFQ0gsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCBaVEVfUFJPRFVDVF9BQzg3MTAsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCBaVEVfUFJPRFVDVF9BQzI3MjYsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCBaVEVfUFJPRFVDVF9BQzg3MTBULCAweGZmLCAweGZmLCAweGZmKSB9LAotCXsgVVNCX0RFVklDRShaVEVfVkVORE9SX0lEMiwgWlRFX1BST0RVQ1RfTUZfMzMwKSB9LAogCXsgVVNCX0RFVklDRShCRU5RX1ZFTkRPUl9JRCwgQkVOUV9QUk9EVUNUX0gxMCkgfSwKIAl7IFVTQl9ERVZJQ0UoRExJTktfVkVORE9SX0lELCBETElOS19QUk9EVUNUX0RXTV82NTIpIH0sCiAJeyBVU0JfREVWSUNFKEFMSU5LX1ZFTkRPUl9JRCwgRExJTktfUFJPRFVDVF9EV01fNjUyX1U1KSB9LCAvKiBZZXMsIEFMSU5LX1ZFTkRPUl9JRCAqLwpAQCAtOTM1LDEzICs5NDksMTcgQEAKIAl7IFVTQl9ERVZJQ0UoVE9TSElCQV9WRU5ET1JfSUQsIFRPU0hJQkFfUFJPRFVDVF9HNDUwKSB9LAogCXsgVVNCX0RFVklDRShUT1NISUJBX1ZFTkRPUl9JRCwgVE9TSElCQV9QUk9EVUNUX0hTRFBBX01JTklDQVJEICkgfSwgLyogVG9zaGliYSAzRyBIU0RQQSA9PSBOb3ZhdGVsIEV4cGVkaXRlIEVVODcwRCBNaW5pQ2FyZCAqLwogCXsgVVNCX0RFVklDRShBTElOS19WRU5ET1JfSUQsIDB4OTAwMCkgfSwKKwl7IFVTQl9ERVZJQ0UoQUxJTktfVkVORE9SX0lELCBBTElOS19QUk9EVUNUX1BIMzAwKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oQUxJTktfVkVORE9SX0lELCBBTElOS19QUk9EVUNUXzNHVSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKLQl7IFVTQl9ERVZJQ0UoQUxDQVRFTF9WRU5ET1JfSUQsIEFMQ0FURUxfUFJPRFVDVF9YMDYwUykgfSwKKwl7IFVTQl9ERVZJQ0UoQUxDQVRFTF9WRU5ET1JfSUQsIEFMQ0FURUxfUFJPRFVDVF9YMDYwU19YMjAwKSwKKwkgIC5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmYWxjYXRlbF94MjAwX2JsYWNrbGlzdAorCX0sCiAJeyBVU0JfREVWSUNFKEFJUlBMVVNfVkVORE9SX0lELCBBSVJQTFVTX1BST0RVQ1RfTUNENjUwKSB9LAogCXsgVVNCX0RFVklDRShUTEFZVEVDSF9WRU5ET1JfSUQsIFRMQVlURUNIX1BST0RVQ1RfVEVVODAwKSB9LAogCXsgVVNCX0RFVklDRShMT05HQ0hFRVJfVkVORE9SX0lELCBGT1VSX0dfU1lTVEVNU19QUk9EVUNUX1cxNCksCiAgIAkgIC5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmZm91cl9nX3cxNF9ibGFja2xpc3QKICAgCX0sCisJeyBVU0JfREVWSUNFKExPTkdDSEVFUl9WRU5ET1JfSUQsIFpPT01fUFJPRFVDVF80NTk3KSB9LAogCXsgVVNCX0RFVklDRShIQUlFUl9WRU5ET1JfSUQsIEhBSUVSX1BST0RVQ1RfQ0UxMDApIH0sCiAJLyogUGlyZWxsaSAgKi8KIAl7IFVTQl9ERVZJQ0UoUElSRUxMSV9WRU5ET1JfSUQsIFBJUkVMTElfUFJPRFVDVF9DMTAwXzEpfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCmluZGV4IGM2ZDkyYTUuLmVhODQ0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwpAQCAtMTc0NSw2ICsxNzQ1LDcgQEAKIAl9CiAJaWYgKGZ3X3AtPnNpemUgPiBUSV9GSVJNV0FSRV9CVUZfU0laRSkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gZmlybXdhcmUgdG9vIGxhcmdlICV6dVxuIiwgX19mdW5jX18sIGZ3X3AtPnNpemUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X3ApOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IDAwNDE4OTkuLmU4YWUyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtODE5LDYgKzgxOSwzNSBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBTb21lIGRldmljZXMgZG9uJ3Qgd29yayBvciByZXR1cm4gaW5jb3JyZWN0IGRhdGEgdGhlIGZpcnN0CisJICogdGltZSB0aGV5IGdldCBhIFJFQUQoMTApIGNvbW1hbmQsIG9yIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkKKwkgKiBhZnRlciBhIG1lZGlhIGNoYW5nZS4gIElmIHRoZSBJTklUSUFMX1JFQUQxMCBmbGFnIGlzIHNldCwKKwkgKiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgUkVBRCgxMCkgY29tbWFuZHMgc3VjY2VlZC4gIElmIHRoZQorCSAqIHByZXZpb3VzIG9uZSBzdWNjZWVkZWQgYW5kIHRoaXMgb25lIGZhaWxlZCwgc2V0IHRoZSBSRURPX1JFQUQxMAorCSAqIGZsYWcgdG8gZm9yY2UgYSByZXRyeS4KKwkgKi8KKwlpZiAodW5saWtlbHkoKHVzLT5mZmxhZ3MgJiBVU19GTF9JTklUSUFMX1JFQUQxMCkgJiYKKwkJCXNyYi0+Y21uZFswXSA9PSBSRUFEXzEwKSkgeworCQlpZiAoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCkgeworCQkJc2V0X2JpdChVU19GTElEWF9SRUFEMTBfV09SS0VELCAmdXMtPmRmbGFncyk7CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoVVNfRkxJRFhfUkVBRDEwX1dPUktFRCwgJnVzLT5kZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQoVVNfRkxJRFhfUkVBRDEwX1dPUktFRCwgJnVzLT5kZmxhZ3MpOworCQkJc2V0X2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpOworCQl9CisKKwkJLyoKKwkJICogTmV4dCwgaWYgdGhlIFJFRE9fUkVBRDEwIGZsYWcgaXMgc2V0LCByZXR1cm4gYSByZXN1bHQKKwkJICogY29kZSB0aGF0IHdpbGwgY2F1c2UgdGhlIFNDU0kgY29yZSB0byByZXRyeSB0aGUgUkVBRCgxMCkKKwkJICogY29tbWFuZCBpbW1lZGlhdGVseS4KKwkJICovCisJCWlmICh0ZXN0X2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQoVVNfRkxJRFhfUkVET19SRUFEMTAsICZ1cy0+ZGZsYWdzKTsKKwkJCXNyYi0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKKwkJCXNyYi0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKwkJfQorCX0KKwogCS8qIERpZCB3ZSB0cmFuc2ZlciBsZXNzIHRoYW4gdGhlIG1pbmltdW0gYW1vdW50IHJlcXVpcmVkPyAqLwogCWlmICgoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCB8fCBzcmItPnNlbnNlX2J1ZmZlclsyXSA9PSAwKSAmJgogCQkJc2NzaV9idWZmbGVuKHNyYikgLSBzY3NpX2dldF9yZXNpZChzcmIpIDwgc3JiLT51bmRlcmZsb3cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBjMTYwMmI4Li5jY2ZmMzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTExMTQsNiArMTExNCwxNiBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgUGF1bCBIYXJ0bWFuIDxwYXVsLmhhcnRtYW4rbGludXhAZ21haWwuY29tPgorICogVGhpcyBjYXJkIHJlYWRlciByZXR1cm5zICJJbGxlZ2FsIFJlcXVlc3QsIExvZ2ljYWwgQmxvY2sgQWRkcmVzcworICogT3V0IG9mIFJhbmdlIiBmb3IgdGhlIGZpcnN0IFJFQUQoMTApIGFmdGVyIGEgbmV3IGNhcmQgaXMgaW5zZXJ0ZWQuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgwOTBjLCAweDYwMDAsIDB4MDEwMCwgMHgwMTAwLAorCQkiRmVpeWEiLAorCQkiU0QvU0RIQyBDYXJkIFJlYWRlciIsCisJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0lOSVRJQUxfUkVBRDEwICksCisKIC8qIFRoaXMgUGVudGF4IHN0aWxsIGNhbWVyYSBpcyBub3QgY29uZm9ybWFudAogICogdG8gdGhlIFVTQiBzdG9yYWdlIHNwZWNpZmljYXRpb246IC0KICAqIC0gSXQgZG9lcyBub3QgbGlrZSB0aGUgSU5RVUlSWSBjb21tYW5kLiBTbyB3ZSBtdXN0IGhhbmRsZSB0aGlzIGNvbW1hbmQKQEAgLTE4ODgsNiArMTg5OCwxNSBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9OT19SRUFEX0RJU0NfSU5GTyApLAogCisvKiBSZXBvcnRlZCBieSBTdmVuIEdlZ2d1cyA8c3Zlbi11c2JzdEBnZWdndXMubmV0PgorICogVGhpcyBlbmNyeXB0ZWQgcGVuIGRyaXZlIHJldHVybnMgYm9ndXMgZGF0YSBmb3IgdGhlIGluaXRpYWwgUkVBRCgxMCkuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgxYjFjLCAweDFhYjUsIDB4MDIwMCwgMHgwMjAwLAorCQkiQ29yc2FpciIsCisJCSJQYWRsb2NrIHYyIiwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSU5JVElBTF9SRUFEMTAgKSwKKwogLyogUGF0Y2ggYnkgUmljaGFyZCBTY2j8dHogPHIuc2NodHpAdC1vbmxpbmUuZGU+CiAgKiBUaGlzIGV4dGVybmFsIGhhcmQgZHJpdmUgZW5jbG9zdXJlIHVzZXMgYSBKTWljcm9uIGNoaXAgd2hpY2gKICAqIG5lZWRzIHRoZSBVU19GTF9JR05PUkVfUkVTSURVRSBmbGFnIHRvIHdvcmsgcHJvcGVybHkuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCA1ZWU3YWM0Li4wY2EwOTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTQ0MCw3ICs0NDAsOCBAQAogCQkJVVNfRkxfTk9UX0xPQ0tBQkxFIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgfAogCQkJVVNfRkxfQ0FQQUNJVFlfT0sgfCBVU19GTF9JR05PUkVfUkVTSURVRSB8CiAJCQlVU19GTF9TSU5HTEVfTFVOIHwgVVNfRkxfTk9fV1BfREVURUNUIHwKLQkJCVVTX0ZMX05PX1JFQURfRElTQ19JTkZPIHwgVVNfRkxfTk9fUkVBRF9DQVBBQ0lUWV8xNik7CisJCQlVU19GTF9OT19SRUFEX0RJU0NfSU5GTyB8IFVTX0ZMX05PX1JFQURfQ0FQQUNJVFlfMTYgfAorCQkJVVNfRkxfSU5JVElBTF9SRUFEMTApOwogCiAJcCA9IHF1aXJrczsKIAl3aGlsZSAoKnApIHsKQEAgLTQ5MCw2ICs0OTEsOSBAQAogCQljYXNlICdtJzoKIAkJCWYgfD0gVVNfRkxfTUFYX1NFQ1RPUlNfNjQ7CiAJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlmIHw9IFVTX0ZMX0lOSVRJQUxfUkVBRDEwOworCQkJYnJlYWs7CiAJCWNhc2UgJ28nOgogCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9PSzsKIAkJCWJyZWFrOwpAQCAtOTUzLDYgKzk1NywxMyBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gQmFkRGV2aWNlOwogCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIHJldHVybnMgaW52YWxpZCBkYXRhIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkKKwkgKiBjb21tYW5kLCBpbmRpY2F0ZSB0aGUgY29tbWFuZCBzaG91bGQgYmUgcmV0cmllZC4KKwkgKi8KKwlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX0lOSVRJQUxfUkVBRDEwKQorCQlzZXRfYml0KFVTX0ZMSURYX1JFRE9fUkVBRDEwLCAmdXMtPmRmbGFncyk7CisKIAkvKiBBY3F1aXJlIGFsbCB0aGUgb3RoZXIgcmVzb3VyY2VzIGFuZCBhZGQgdGhlIGhvc3QgKi8KIAlyZXN1bHQgPSB1c2Jfc3Rvcl9hY3F1aXJlX3Jlc291cmNlcyh1cyk7CiAJaWYgKHJlc3VsdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDg5ZDNiZmYuLjdiMGYyMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtNzMsNiArNzMsOCBAQAogI2RlZmluZSBVU19GTElEWF9SRVNFVFRJTkcJNAkvKiBkZXZpY2UgcmVzZXQgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVVNfRkxJRFhfVElNRURfT1VUCTUJLyogU0NTSSBtaWRsYXllciB0aW1lZCBvdXQgICovCiAjZGVmaW5lIFVTX0ZMSURYX0RPTlRfU0NBTgk2CS8qIGRvbid0IHNjYW4gKGRpc2Nvbm5lY3QpICAqLworI2RlZmluZSBVU19GTElEWF9SRURPX1JFQUQxMAk3CS8qIHJlZG8gUkVBRCgxMCkgY29tbWFuZCAgICAqLworI2RlZmluZSBVU19GTElEWF9SRUFEMTBfV09SS0VECTgJLyogcHJldmlvdXMgUkVBRCgxMCkgc3VjY2VlZGVkICovCiAKICNkZWZpbmUgVVNCX1NUT1JfU1RSSU5HX0xFTiAzMgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCAyZjdjNzZhLi5lMjI0YTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCX0KIAogCW11dGV4X2xvY2soJnZxLT5tdXRleCk7Ci0Jdmhvc3RfZGlzYWJsZV9ub3RpZnkodnEpOworCXZob3N0X2Rpc2FibGVfbm90aWZ5KCZuZXQtPmRldiwgdnEpOwogCiAJaWYgKHdtZW0gPCBzb2NrLT5zay0+c2tfc25kYnVmIC8gMikKIAkJdHhfcG9sbF9zdG9wKG5ldCk7CkBAIC0xNjYsOCArMTY2LDggQEAKIAkJCQlzZXRfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNvY2stPmZsYWdzKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmICh1bmxpa2VseSh2aG9zdF9lbmFibGVfbm90aWZ5KHZxKSkpIHsKLQkJCQl2aG9zdF9kaXNhYmxlX25vdGlmeSh2cSk7CisJCQlpZiAodW5saWtlbHkodmhvc3RfZW5hYmxlX25vdGlmeSgmbmV0LT5kZXYsIHZxKSkpIHsKKwkJCQl2aG9zdF9kaXNhYmxlX25vdGlmeSgmbmV0LT5kZXYsIHZxKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJnZxLT5tdXRleCk7Ci0Jdmhvc3RfZGlzYWJsZV9ub3RpZnkodnEpOworCXZob3N0X2Rpc2FibGVfbm90aWZ5KCZuZXQtPmRldiwgdnEpOwogCXZob3N0X2hsZW4gPSB2cS0+dmhvc3RfaGxlbjsKIAlzb2NrX2hsZW4gPSB2cS0+c29ja19obGVuOwogCkBAIC0zMzQsMTAgKzMzNCwxMCBAQAogCQkJYnJlYWs7CiAJCS8qIE9LLCBub3cgd2UgbmVlZCB0byBrbm93IGFib3V0IGFkZGVkIGRlc2NyaXB0b3JzLiAqLwogCQlpZiAoIWhlYWRjb3VudCkgewotCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkodnEpKSkgeworCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSkpKSB7CiAJCQkJLyogVGhleSBoYXZlIHNsaXBwZWQgb25lIGluIGFzIHdlIHdlcmUKIAkJCQkgKiBkb2luZyB0aGF0OiBjaGVjayBhZ2Fpbi4gKi8KLQkJCQl2aG9zdF9kaXNhYmxlX25vdGlmeSh2cSk7CisJCQkJdmhvc3RfZGlzYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQkvKiBOb3RoaW5nIG5ldz8gIFdhaXQgZm9yIGV2ZW50ZmQgdG8gdGVsbCB1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC90ZXN0LmMgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwppbmRleCAwOTlmMzAyLi43MzRlMWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Rlc3QuYworKysgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwpAQCAtNDksNyArNDksNyBAQAogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZ2cS0+bXV0ZXgpOwotCXZob3N0X2Rpc2FibGVfbm90aWZ5KHZxKTsKKwl2aG9zdF9kaXNhYmxlX25vdGlmeSgmbi0+ZGV2LCB2cSk7CiAKIAlmb3IgKDs7KSB7CiAJCWhlYWQgPSB2aG9zdF9nZXRfdnFfZGVzYygmbi0+ZGV2LCB2cSwgdnEtPmlvdiwKQEAgLTYxLDggKzYxLDggQEAKIAkJCWJyZWFrOwogCQkvKiBOb3RoaW5nIG5ldz8gIFdhaXQgZm9yIGV2ZW50ZmQgdG8gdGVsbCB1cyB0aGV5IHJlZmlsbGVkLiAqLwogCQlpZiAoaGVhZCA9PSB2cS0+bnVtKSB7Ci0JCQlpZiAodW5saWtlbHkodmhvc3RfZW5hYmxlX25vdGlmeSh2cSkpKSB7Ci0JCQkJdmhvc3RfZGlzYWJsZV9ub3RpZnkodnEpOworCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkoJm4tPmRldiwgdnEpKSkgeworCQkJCXZob3N0X2Rpc2FibGVfbm90aWZ5KCZuLT5kZXYsIHZxKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5jIGIvZHJpdmVycy92aG9zdC92aG9zdC5jCmluZGV4IDdhYTRlZWEuLmVhOTY2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYworKysgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKQEAgLTM3LDYgKzM3LDkgQEAKIAlWSE9TVF9NRU1PUllfRl9MT0cgPSAweDEsCiB9OwogCisjZGVmaW5lIHZob3N0X3VzZWRfZXZlbnQodnEpICgodTE2IF9fdXNlciAqKSZ2cS0+YXZhaWwtPnJpbmdbdnEtPm51bV0pCisjZGVmaW5lIHZob3N0X2F2YWlsX2V2ZW50KHZxKSAoKHUxNiBfX3VzZXIgKikmdnEtPnVzZWQtPnJpbmdbdnEtPm51bV0pCisKIHN0YXRpYyB2b2lkIHZob3N0X3BvbGxfZnVuYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCwKIAkJCSAgICBwb2xsX3RhYmxlICpwdCkKIHsKQEAgLTE2MSw2ICsxNjQsOCBAQAogCXZxLT5sYXN0X2F2YWlsX2lkeCA9IDA7CiAJdnEtPmF2YWlsX2lkeCA9IDA7CiAJdnEtPmxhc3RfdXNlZF9pZHggPSAwOworCXZxLT5zaWduYWxsZWRfdXNlZCA9IDA7CisJdnEtPnNpZ25hbGxlZF91c2VkX3ZhbGlkID0gZmFsc2U7CiAJdnEtPnVzZWRfZmxhZ3MgPSAwOwogCXZxLT5sb2dfdXNlZCA9IGZhbHNlOwogCXZxLT5sb2dfYWRkciA9IC0xdWxsOwpAQCAtNDg5LDE2ICs0OTQsMTcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB2cV9hY2Nlc3Nfb2sodW5zaWduZWQgaW50IG51bSwKK3N0YXRpYyBpbnQgdnFfYWNjZXNzX29rKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBudW0sCiAJCQlzdHJ1Y3QgdnJpbmdfZGVzYyBfX3VzZXIgKmRlc2MsCiAJCQlzdHJ1Y3QgdnJpbmdfYXZhaWwgX191c2VyICphdmFpbCwKIAkJCXN0cnVjdCB2cmluZ191c2VkIF9fdXNlciAqdXNlZCkKIHsKKwlzaXplX3QgcyA9IHZob3N0X2hhc19mZWF0dXJlKGQsIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSA/IDIgOiAwOwogCXJldHVybiBhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRlc2MsIG51bSAqIHNpemVvZiAqZGVzYykgJiYKIAkgICAgICAgYWNjZXNzX29rKFZFUklGWV9SRUFELCBhdmFpbCwKLQkJCSBzaXplb2YgKmF2YWlsICsgbnVtICogc2l6ZW9mICphdmFpbC0+cmluZykgJiYKKwkJCSBzaXplb2YgKmF2YWlsICsgbnVtICogc2l6ZW9mICphdmFpbC0+cmluZyArIHMpICYmCiAJICAgICAgIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVzZWQsCi0JCQlzaXplb2YgKnVzZWQgKyBudW0gKiBzaXplb2YgKnVzZWQtPnJpbmcpOworCQkJc2l6ZW9mICp1c2VkICsgbnVtICogc2l6ZW9mICp1c2VkLT5yaW5nICsgcyk7CiB9CiAKIC8qIENhbiB3ZSBsb2cgd3JpdGVzPyAqLwpAQCAtNTE0LDkgKzUyMCwxMSBAQAogCiAvKiBWZXJpZnkgYWNjZXNzIGZvciB3cml0ZSBsb2dnaW5nLiAqLwogLyogQ2FsbGVyIHNob3VsZCBoYXZlIHZxIG11dGV4IGFuZCBkZXZpY2UgbXV0ZXggKi8KLXN0YXRpYyBpbnQgdnFfbG9nX2FjY2Vzc19vayhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwgdm9pZCBfX3VzZXIgKmxvZ19iYXNlKQorc3RhdGljIGludCB2cV9sb2dfYWNjZXNzX29rKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLAorCQkJICAgIHZvaWQgX191c2VyICpsb2dfYmFzZSkKIHsKIAlzdHJ1Y3Qgdmhvc3RfbWVtb3J5ICptcDsKKwlzaXplX3QgcyA9IHZob3N0X2hhc19mZWF0dXJlKGQsIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSA/IDIgOiAwOwogCiAJbXAgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHZxLT5kZXYtPm1lbW9yeSwKIAkJCQkgICAgICAgbG9ja2RlcF9pc19oZWxkKCZ2cS0+bXV0ZXgpKTsKQEAgLTUyNCwxNSArNTMyLDE1IEBACiAJCQkgICAgdmhvc3RfaGFzX2ZlYXR1cmUodnEtPmRldiwgVkhPU1RfRl9MT0dfQUxMKSkgJiYKIAkJKCF2cS0+bG9nX3VzZWQgfHwgbG9nX2FjY2Vzc19vayhsb2dfYmFzZSwgdnEtPmxvZ19hZGRyLAogCQkJCQlzaXplb2YgKnZxLT51c2VkICsKLQkJCQkJdnEtPm51bSAqIHNpemVvZiAqdnEtPnVzZWQtPnJpbmcpKTsKKwkJCQkJdnEtPm51bSAqIHNpemVvZiAqdnEtPnVzZWQtPnJpbmcgKyBzKSk7CiB9CiAKIC8qIENhbiB3ZSBzdGFydCB2cT8gKi8KIC8qIENhbGxlciBzaG91bGQgaGF2ZSB2cSBtdXRleCBhbmQgZGV2aWNlIG11dGV4ICovCiBpbnQgdmhvc3RfdnFfYWNjZXNzX29rKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewotCXJldHVybiB2cV9hY2Nlc3Nfb2sodnEtPm51bSwgdnEtPmRlc2MsIHZxLT5hdmFpbCwgdnEtPnVzZWQpICYmCi0JCXZxX2xvZ19hY2Nlc3Nfb2sodnEsIHZxLT5sb2dfYmFzZSk7CisJcmV0dXJuIHZxX2FjY2Vzc19vayh2cS0+ZGV2LCB2cS0+bnVtLCB2cS0+ZGVzYywgdnEtPmF2YWlsLCB2cS0+dXNlZCkgJiYKKwkJdnFfbG9nX2FjY2Vzc19vayh2cS0+ZGV2LCB2cSwgdnEtPmxvZ19iYXNlKTsKIH0KIAogc3RhdGljIGxvbmcgdmhvc3Rfc2V0X21lbW9yeShzdHJ1Y3Qgdmhvc3RfZGV2ICpkLCBzdHJ1Y3Qgdmhvc3RfbWVtb3J5IF9fdXNlciAqbSkKQEAgLTU3Nyw2ICs1ODUsNyBAQAogCiAJaWYgKHIpCiAJCXJldHVybiByOworCXZxLT5zaWduYWxsZWRfdXNlZF92YWxpZCA9IGZhbHNlOwogCXJldHVybiBnZXRfdXNlcih2cS0+bGFzdF91c2VkX2lkeCwgJnVzZWQtPmlkeCk7CiB9CiAKQEAgLTY3NCw3ICs2ODMsNyBAQAogCQkgKiBJZiBpdCBpcyBub3QsIHdlIGRvbid0IGFzIHNpemUgbWlnaHQgbm90IGhhdmUgYmVlbiBzZXR1cC4KIAkJICogV2Ugd2lsbCB2ZXJpZnkgd2hlbiBiYWNrZW5kIGlzIGNvbmZpZ3VyZWQuICovCiAJCWlmICh2cS0+cHJpdmF0ZV9kYXRhKSB7Ci0JCQlpZiAoIXZxX2FjY2Vzc19vayh2cS0+bnVtLAorCQkJaWYgKCF2cV9hY2Nlc3Nfb2soZCwgdnEtPm51bSwKIAkJCQkodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylhLmRlc2NfdXNlcl9hZGRyLAogCQkJCSh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWEuYXZhaWxfdXNlcl9hZGRyLAogCQkJCSh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWEudXNlZF91c2VyX2FkZHIpKSB7CkBAIC04MTgsNyArODI3LDcgQEAKIAkJCXZxID0gZC0+dnFzICsgaTsKIAkJCW11dGV4X2xvY2soJnZxLT5tdXRleCk7CiAJCQkvKiBJZiByaW5nIGlzIGluYWN0aXZlLCB3aWxsIGNoZWNrIHdoZW4gaXQncyBlbmFibGVkLiAqLwotCQkJaWYgKHZxLT5wcml2YXRlX2RhdGEgJiYgIXZxX2xvZ19hY2Nlc3Nfb2sodnEsIGJhc2UpKQorCQkJaWYgKHZxLT5wcml2YXRlX2RhdGEgJiYgIXZxX2xvZ19hY2Nlc3Nfb2soZCwgdnEsIGJhc2UpKQogCQkJCXIgPSAtRUZBVUxUOwogCQkJZWxzZQogCQkJCXZxLT5sb2dfYmFzZSA9IGJhc2U7CkBAIC0xMjE5LDYgKzEyMjgsMTAgQEAKIAogCS8qIE9uIHN1Y2Nlc3MsIGluY3JlbWVudCBhdmFpbCBpbmRleC4gKi8KIAl2cS0+bGFzdF9hdmFpbF9pZHgrKzsKKworCS8qIEFzc3VtZSBub3RpZmljYXRpb25zIGZyb20gZ3Vlc3QgYXJlIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQsCisJICogaWYgdGhleSBhcmVuJ3Qgd2Ugd291bGQgbmVlZCB0byB1cGRhdGUgYXZhaWxfZXZlbnQgaW5kZXguICovCisJQlVHX09OKCEodnEtPnVzZWRfZmxhZ3MgJiBWUklOR19VU0VEX0ZfTk9fTk9USUZZKSk7CiAJcmV0dXJuIGhlYWQ7CiB9CiAKQEAgLTEyNjcsNiArMTI4MCwxMiBAQAogCQkJZXZlbnRmZF9zaWduYWwodnEtPmxvZ19jdHgsIDEpOwogCX0KIAl2cS0+bGFzdF91c2VkX2lkeCsrOworCS8qIElmIHRoZSBkcml2ZXIgbmV2ZXIgYm90aGVycyB0byBzaWduYWwgaW4gYSB2ZXJ5IGxvbmcgd2hpbGUsCisJICogdXNlZCBpbmRleCBtaWdodCB3cmFwIGFyb3VuZC4gSWYgdGhhdCBoYXBwZW5zLCBpbnZhbGlkYXRlCisJICogc2lnbmFsbGVkX3VzZWQgaW5kZXggd2Ugc3RvcmVkLiBUT0RPOiBtYWtlIHN1cmUgZHJpdmVyCisJICogc2lnbmFscyBhdCBsZWFzdCBvbmNlIGluIDJeMTYgYW5kIHJlbW92ZSB0aGlzLiAqLworCWlmICh1bmxpa2VseSh2cS0+bGFzdF91c2VkX2lkeCA9PSB2cS0+c2lnbmFsbGVkX3VzZWQpKQorCQl2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI3NSw2ICsxMjk0LDcgQEAKIAkJCSAgICB1bnNpZ25lZCBjb3VudCkKIHsKIAlzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtIF9fdXNlciAqdXNlZDsKKwl1MTYgb2xkLCBuZXc7CiAJaW50IHN0YXJ0OwogCiAJc3RhcnQgPSB2cS0+bGFzdF91c2VkX2lkeCAlIHZxLT5udW07CkBAIC0xMjkyLDcgKzEzMTIsMTQgQEAKIAkJCSAgICgodm9pZCBfX3VzZXIgKil1c2VkIC0gKHZvaWQgX191c2VyICopdnEtPnVzZWQpLAogCQkJICBjb3VudCAqIHNpemVvZiAqdXNlZCk7CiAJfQotCXZxLT5sYXN0X3VzZWRfaWR4ICs9IGNvdW50OworCW9sZCA9IHZxLT5sYXN0X3VzZWRfaWR4OworCW5ldyA9ICh2cS0+bGFzdF91c2VkX2lkeCArPSBjb3VudCk7CisJLyogSWYgdGhlIGRyaXZlciBuZXZlciBib3RoZXJzIHRvIHNpZ25hbCBpbiBhIHZlcnkgbG9uZyB3aGlsZSwKKwkgKiB1c2VkIGluZGV4IG1pZ2h0IHdyYXAgYXJvdW5kLiBJZiB0aGF0IGhhcHBlbnMsIGludmFsaWRhdGUKKwkgKiBzaWduYWxsZWRfdXNlZCBpbmRleCB3ZSBzdG9yZWQuIFRPRE86IG1ha2Ugc3VyZSBkcml2ZXIKKwkgKiBzaWduYWxzIGF0IGxlYXN0IG9uY2UgaW4gMl4xNiBhbmQgcmVtb3ZlIHRoaXMuICovCisJaWYgKHVubGlrZWx5KCh1MTYpKG5ldyAtIHZxLT5zaWduYWxsZWRfdXNlZCkgPCAodTE2KShuZXcgLSBvbGQpKSkKKwkJdnEtPnNpZ25hbGxlZF91c2VkX3ZhbGlkID0gZmFsc2U7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMzEsMjkgKzEzNTgsNDcgQEAKIAlyZXR1cm4gcjsKIH0KIAotLyogVGhpcyBhY3R1YWxseSBzaWduYWxzIHRoZSBndWVzdCwgdXNpbmcgZXZlbnRmZC4gKi8KLXZvaWQgdmhvc3Rfc2lnbmFsKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCitzdGF0aWMgYm9vbCB2aG9zdF9ub3RpZnkoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKIHsKLQlfX3UxNiBmbGFnczsKLQorCV9fdTE2IG9sZCwgbmV3LCBldmVudDsKKwlib29sIHY7CiAJLyogRmx1c2ggb3V0IHVzZWQgaW5kZXggdXBkYXRlcy4gVGhpcyBpcyBwYWlyZWQKIAkgKiB3aXRoIHRoZSBiYXJyaWVyIHRoYXQgdGhlIEd1ZXN0IGV4ZWN1dGVzIHdoZW4gZW5hYmxpbmcKIAkgKiBpbnRlcnJ1cHRzLiAqLwogCXNtcF9tYigpOwogCi0JaWYgKF9fZ2V0X3VzZXIoZmxhZ3MsICZ2cS0+YXZhaWwtPmZsYWdzKSkgewotCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gZ2V0IGZsYWdzIik7Ci0JCXJldHVybjsKKwlpZiAodmhvc3RfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fRl9OT1RJRllfT05fRU1QVFkpICYmCisJICAgIHVubGlrZWx5KHZxLT5hdmFpbF9pZHggPT0gdnEtPmxhc3RfYXZhaWxfaWR4KSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIXZob3N0X2hhc19mZWF0dXJlKGRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpKSB7CisJCV9fdTE2IGZsYWdzOworCQlpZiAoX19nZXRfdXNlcihmbGFncywgJnZxLT5hdmFpbC0+ZmxhZ3MpKSB7CisJCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gZ2V0IGZsYWdzIik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gIShmbGFncyAmIFZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUKTsKIAl9CisJb2xkID0gdnEtPnNpZ25hbGxlZF91c2VkOworCXYgPSB2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQ7CisJbmV3ID0gdnEtPnNpZ25hbGxlZF91c2VkID0gdnEtPmxhc3RfdXNlZF9pZHg7CisJdnEtPnNpZ25hbGxlZF91c2VkX3ZhbGlkID0gdHJ1ZTsKIAotCS8qIElmIHRoZXkgZG9uJ3Qgd2FudCBhbiBpbnRlcnJ1cHQsIGRvbid0IHNpZ25hbCwgdW5sZXNzIGVtcHR5LiAqLwotCWlmICgoZmxhZ3MgJiBWUklOR19BVkFJTF9GX05PX0lOVEVSUlVQVCkgJiYKLQkgICAgKHZxLT5hdmFpbF9pZHggIT0gdnEtPmxhc3RfYXZhaWxfaWR4IHx8Ci0JICAgICAhdmhvc3RfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fRl9OT1RJRllfT05fRU1QVFkpKSkKLQkJcmV0dXJuOworCWlmICh1bmxpa2VseSghdikpCisJCXJldHVybiB0cnVlOwogCisJaWYgKGdldF91c2VyKGV2ZW50LCB2aG9zdF91c2VkX2V2ZW50KHZxKSkpIHsKKwkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIGdldCB1c2VkIGV2ZW50IGlkeCIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIHZyaW5nX25lZWRfZXZlbnQoZXZlbnQsIG5ldywgb2xkKTsKK30KKworLyogVGhpcyBhY3R1YWxseSBzaWduYWxzIHRoZSBndWVzdCwgdXNpbmcgZXZlbnRmZC4gKi8KK3ZvaWQgdmhvc3Rfc2lnbmFsKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCit7CiAJLyogU2lnbmFsIHRoZSBHdWVzdCB0ZWxsIHRoZW0gd2UgdXNlZCBzb21ldGhpbmcgdXAuICovCi0JaWYgKHZxLT5jYWxsX2N0eCkKKwlpZiAodnEtPmNhbGxfY3R4ICYmIHZob3N0X25vdGlmeShkZXYsIHZxKSkKIAkJZXZlbnRmZF9zaWduYWwodnEtPmNhbGxfY3R4LCAxKTsKIH0KIApAQCAtMTM3Niw3ICsxNDIxLDcgQEAKIH0KIAogLyogT0ssIG5vdyB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgYWRkZWQgZGVzY3JpcHRvcnMuICovCi1ib29sIHZob3N0X2VuYWJsZV9ub3RpZnkoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCitib29sIHZob3N0X2VuYWJsZV9ub3RpZnkoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKIHsKIAl1MTYgYXZhaWxfaWR4OwogCWludCByOwpAQCAtMTM4NCwxMSArMTQyOSwzNCBAQAogCWlmICghKHZxLT51c2VkX2ZsYWdzICYgVlJJTkdfVVNFRF9GX05PX05PVElGWSkpCiAJCXJldHVybiBmYWxzZTsKIAl2cS0+dXNlZF9mbGFncyAmPSB+VlJJTkdfVVNFRF9GX05PX05PVElGWTsKLQlyID0gcHV0X3VzZXIodnEtPnVzZWRfZmxhZ3MsICZ2cS0+dXNlZC0+ZmxhZ3MpOwotCWlmIChyKSB7Ci0JCXZxX2Vycih2cSwgIkZhaWxlZCB0byBlbmFibGUgbm90aWZpY2F0aW9uIGF0ICVwOiAlZFxuIiwKLQkJICAgICAgICZ2cS0+dXNlZC0+ZmxhZ3MsIHIpOwotCQlyZXR1cm4gZmFsc2U7CisJaWYgKCF2aG9zdF9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSkgeworCQlyID0gcHV0X3VzZXIodnEtPnVzZWRfZmxhZ3MsICZ2cS0+dXNlZC0+ZmxhZ3MpOworCQlpZiAocikgeworCQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIGVuYWJsZSBub3RpZmljYXRpb24gYXQgJXA6ICVkXG4iLAorCQkJICAgICAgICZ2cS0+dXNlZC0+ZmxhZ3MsIHIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJciA9IHB1dF91c2VyKHZxLT5hdmFpbF9pZHgsIHZob3N0X2F2YWlsX2V2ZW50KHZxKSk7CisJCWlmIChyKSB7CisJCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gdXBkYXRlIGF2YWlsIGV2ZW50IGluZGV4IGF0ICVwOiAlZFxuIiwKKwkJCSAgICAgICB2aG9zdF9hdmFpbF9ldmVudCh2cSksIHIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCWlmICh1bmxpa2VseSh2cS0+bG9nX3VzZWQpKSB7CisJCXZvaWQgX191c2VyICp1c2VkOworCQkvKiBNYWtlIHN1cmUgZGF0YSBpcyBzZWVuIGJlZm9yZSBsb2cuICovCisJCXNtcF93bWIoKTsKKwkJdXNlZCA9IHZob3N0X2hhc19mZWF0dXJlKGRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpID8KKwkJCSZ2cS0+dXNlZC0+ZmxhZ3MgOiB2aG9zdF9hdmFpbF9ldmVudCh2cSk7CisJCS8qIExvZyB1c2VkIGZsYWdzIG9yIGV2ZW50IGluZGV4IGVudHJ5IHdyaXRlLiBCb3RoIGFyZSAxNiBiaXQKKwkJICogZmllbGRzLiAqLworCQlsb2dfd3JpdGUodnEtPmxvZ19iYXNlLCB2cS0+bG9nX2FkZHIgKworCQkJICAgKHVzZWQgLSAodm9pZCBfX3VzZXIgKil2cS0+dXNlZCksCisJCQkgIHNpemVvZih1MTYpKTsKKwkJaWYgKHZxLT5sb2dfY3R4KQorCQkJZXZlbnRmZF9zaWduYWwodnEtPmxvZ19jdHgsIDEpOwogCX0KIAkvKiBUaGV5IGNvdWxkIGhhdmUgc2xpcHBlZCBvbmUgaW4gYXMgd2Ugd2VyZSBkb2luZyB0aGF0OiBtYWtlCiAJICogc3VyZSBpdCdzIHdyaXR0ZW4sIHRoZW4gY2hlY2sgYWdhaW4uICovCkBAIC0xNDA0LDE1ICsxNDcyLDE3IEBACiB9CiAKIC8qIFdlIGRvbid0IG5lZWQgdG8gYmUgbm90aWZpZWQgYWdhaW4uICovCi12b2lkIHZob3N0X2Rpc2FibGVfbm90aWZ5KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQordm9pZCB2aG9zdF9kaXNhYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewogCWludCByOwogCiAJaWYgKHZxLT51c2VkX2ZsYWdzICYgVlJJTkdfVVNFRF9GX05PX05PVElGWSkKIAkJcmV0dXJuOwogCXZxLT51c2VkX2ZsYWdzIHw9IFZSSU5HX1VTRURfRl9OT19OT1RJRlk7Ci0JciA9IHB1dF91c2VyKHZxLT51c2VkX2ZsYWdzLCAmdnEtPnVzZWQtPmZsYWdzKTsKLQlpZiAocikKLQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIGVuYWJsZSBub3RpZmljYXRpb24gYXQgJXA6ICVkXG4iLAotCQkgICAgICAgJnZxLT51c2VkLT5mbGFncywgcik7CisJaWYgKCF2aG9zdF9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSkgeworCQlyID0gcHV0X3VzZXIodnEtPnVzZWRfZmxhZ3MsICZ2cS0+dXNlZC0+ZmxhZ3MpOworCQlpZiAocikKKwkJCXZxX2Vycih2cSwgIkZhaWxlZCB0byBlbmFibGUgbm90aWZpY2F0aW9uIGF0ICVwOiAlZFxuIiwKKwkJCSAgICAgICAmdnEtPnVzZWQtPmZsYWdzLCByKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKaW5kZXggYjMzNjNhZS4uOGUwMzM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oCisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaApAQCAtODQsNiArODQsMTIgQEAKIAkvKiBVc2VkIGZsYWdzICovCiAJdTE2IHVzZWRfZmxhZ3M7CiAKKwkvKiBMYXN0IHVzZWQgaW5kZXggdmFsdWUgd2UgaGF2ZSBzaWduYWxsZWQgb24gKi8KKwl1MTYgc2lnbmFsbGVkX3VzZWQ7CisKKwkvKiBMYXN0IHVzZWQgaW5kZXggdmFsdWUgd2UgaGF2ZSBzaWduYWxsZWQgb24gKi8KKwlib29sIHNpZ25hbGxlZF91c2VkX3ZhbGlkOworCiAJLyogTG9nIHdyaXRlcyB0byB1c2VkIHN0cnVjdHVyZS4gKi8KIAlib29sIGxvZ191c2VkOwogCXU2NCBsb2dfYWRkcjsKQEAgLTE0OSw4ICsxNTUsOCBAQAogdm9pZCB2aG9zdF9hZGRfdXNlZF9hbmRfc2lnbmFsX24oc3RydWN0IHZob3N0X2RldiAqLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICosCiAJCQkgICAgICAgc3RydWN0IHZyaW5nX3VzZWRfZWxlbSAqaGVhZHMsIHVuc2lnbmVkIGNvdW50KTsKIHZvaWQgdmhvc3Rfc2lnbmFsKHN0cnVjdCB2aG9zdF9kZXYgKiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqKTsKLXZvaWQgdmhvc3RfZGlzYWJsZV9ub3RpZnkoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqKTsKLWJvb2wgdmhvc3RfZW5hYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOwordm9pZCB2aG9zdF9kaXNhYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfZGV2ICosIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKik7Citib29sIHZob3N0X2VuYWJsZV9ub3RpZnkoc3RydWN0IHZob3N0X2RldiAqLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOwogCiBpbnQgdmhvc3RfbG9nX3dyaXRlKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBzdHJ1Y3Qgdmhvc3RfbG9nICpsb2csCiAJCSAgICB1bnNpZ25lZCBpbnQgbG9nX251bSwgdTY0IGxlbik7CkBAIC0xNjIsMTEgKzE2OCwxMiBAQAogCX0gd2hpbGUgKDApCiAKIGVudW0gewotCVZIT1NUX0ZFQVRVUkVTID0gKDEgPDwgVklSVElPX0ZfTk9USUZZX09OX0VNUFRZKSB8Ci0JCQkgKDEgPDwgVklSVElPX1JJTkdfRl9JTkRJUkVDVF9ERVNDKSB8Ci0JCQkgKDEgPDwgVkhPU1RfRl9MT0dfQUxMKSB8Ci0JCQkgKDEgPDwgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpIHwKLQkJCSAoMSA8PCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSwKKwlWSE9TVF9GRUFUVVJFUyA9ICgxVUxMIDw8IFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSkgfAorCQkJICgxVUxMIDw8IFZJUlRJT19SSU5HX0ZfSU5ESVJFQ1RfREVTQykgfAorCQkJICgxVUxMIDw8IFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSB8CisJCQkgKDFVTEwgPDwgVkhPU1RfRl9MT0dfQUxMKSB8CisJCQkgKDFVTEwgPDwgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpIHwKKwkJCSAoMVVMTCA8PCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSwKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHZob3N0X2hhc19mZWF0dXJlKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgaW50IGJpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCmluZGV4IDVmYzk4M2MuLmNmMDNhZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwpAQCAtNDQ3LDYgKzQ0Nyw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWZiLT5mYi5kZXZpY2UJCT0gJmZiLT5kZXYtPmRldjsKKwogCWZiLT5mYi5maXgubW1pb19zdGFydAk9IGZiLT5kZXYtPnJlcy5zdGFydDsKIAlmYi0+ZmIuZml4Lm1taW9fbGVuCT0gcmVzb3VyY2Vfc2l6ZSgmZmItPmRldi0+cmVzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hcmNmYi5jIGIvZHJpdmVycy92aWRlby9hcmNmYi5jCmluZGV4IDNlYzQ5MjMuLmMyMmU4ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXJjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMKQEAgLTUxNSwxMSArNTE1LDEwIEBACiAKIAkvKiBXZSBuZWVkIGEgZmxhdCBiYWNraW5nIHN0b3JlIGZvciB0aGUgQXJjJ3MKIAkgICBsZXNzLWZsYXQgYWN0dWFsIHBhZ2VkIGZyYW1lYnVmZmVyICovCi0JaWYgKCEodmlkZW9tZW1vcnkgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZSkpKQorCXZpZGVvbWVtb3J5ID0gdnphbGxvYyh2aWRlb21lbW9yeXNpemUpOworCWlmICghdmlkZW9tZW1vcnkpCiAJCXJldHVybiByZXR2YWw7CiAKLQltZW1zZXQodmlkZW9tZW1vcnksIDAsIHZpZGVvbWVtb3J5c2l6ZSk7Ci0KIAlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmNmYl9wYXIpLCAmZGV2LT5kZXYpOwogCWlmICghaW5mbykKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKaW5kZXggZWJiODkzYy4uZDdhYWVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwpAQCAtMjQ4LDEwICsyNDgsNiBAQAogCiBzdGF0aWMgaW50IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAotI2lmZGVmIENPTkZJR19BVEFSSQotc3RhdGljIGludCBzdG9yZV92aWRlb19wYXIoY2hhciAqdmlkZW9wYXIsIHVuc2lnbmVkIGNoYXIgbTY0X251bSk7Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgYXR5X2dldF9jcnRjKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgc3RydWN0IGNydGMgKmNydGMpOwogCiBzdGF0aWMgdm9pZCBhdHlfc2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CkBAIC0yMjY4LDExICsyMjY0LDEzIEBACiAJcmV0dXJuOwogfQogCisjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIHZvaWQgYXR5X2JsX2V4aXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiZCk7CiAJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7CiB9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiAjZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQgKi8KIApAQCAtMjc4OSw3ICsyNzg3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jaWZkZWYgQ09ORklHX0FUQVJJCisjaWYgZGVmaW5lZChDT05GSUdfQVRBUkkpICYmICFkZWZpbmVkKE1PRFVMRSkKIHN0YXRpYyBpbnQgX19kZXZpbml0IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb19zdHIsIHVuc2lnbmVkIGNoYXIgbTY0X251bSkKIHsKIAljaGFyICpwOwpAQCAtMjgxOCw3ICsyODE2LDcgQEAKIAlwaHlzX3ZtZW1iYXNlW202NF9udW1dID0gMDsKIAlyZXR1cm4gLTE7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0FUQVJJICovCisjZW5kaWYgLyogQ09ORklHX0FUQVJJICYmICFNT0RVTEUgKi8KIAogLyoKICAqIEJsYW5rIHRoZSBkaXNwbGF5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggMGM5MzczYi4uMmQ5M2M4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC0zMDIsNiArMzAyLDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBhZHA4ODYwX2JsLgogCitjb25maWcgQkFDS0xJR0hUX0FEUDg4NzAKKwl0cmlzdGF0ZSAiQmFja2xpZ2h0IERyaXZlciBmb3IgQURQODg3MCB1c2luZyBXTEVEIgorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBJMkMKKwlzZWxlY3QgTkVXX0xFRFMKKwlzZWxlY3QgTEVEU19DTEFTUworCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgTENEIGJhY2tsaWdodCBjb25uZWN0ZWQgdG8gdGhlIEFEUDg4NzAsCisJICBzYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGlzIGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWRwODg3MF9ibC4KKwogY29uZmlnIEJBQ0tMSUdIVF84OFBNODYwWAogCXRyaXN0YXRlICJCYWNrbGlnaHQgRHJpdmVyIGZvciA4OFBNODYwNiB1c2luZyBXTEVEIgogCWRlcGVuZHMgb24gTUZEXzg4UE04NjBYCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCmluZGV4IGI5Y2E4NDkuLmVlNzJhZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCkBAIC0zNCw2ICszNCw3IEBACiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0FEWCkgICAgKz0gYWR4X2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQURQNTUyMCkJKz0gYWRwNTUyMF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0FEUDg4NjApCSs9IGFkcDg4NjBfYmwubworb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODcwKQkrPSBhZHA4ODcwX2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfODhQTTg2MFgpICs9IDg4cG04NjB4X2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfUENGNTA2MzMpCSs9IHBjZjUwNjMzLWJhY2tsaWdodC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE4ODMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jCkBAIC0wLDAgKzEsMTAxMiBAQAorLyoKKyAqIEJhY2tsaWdodCBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIEFEUDg4NzAgQmFja2xpZ2h0IERldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOS0yMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy9hZHA4ODcwLmg+CisjZGVmaW5lIEFEUDg4NzBfRVhUX0ZFQVRVUkVTCisjZGVmaW5lIEFEUDg4NzBfVVNFX0xFRFMKKworCisjZGVmaW5lIEFEUDg4NzBfTUZEVklECTB4MDAgIC8qIE1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIElEICovCisjZGVmaW5lIEFEUDg4NzBfTURDUgkweDAxICAvKiBEZXZpY2UgbW9kZSBhbmQgc3RhdHVzICovCisjZGVmaW5lIEFEUDg4NzBfSU5UX1NUQVQgMHgwMiAgLyogSW50ZXJydXB0cyBzdGF0dXMgKi8KKyNkZWZpbmUgQURQODg3MF9JTlRfRU4JMHgwMyAgLyogSW50ZXJydXB0cyBlbmFibGUgKi8KKyNkZWZpbmUgQURQODg3MF9DRkdSCTB4MDQgIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9CTFNFTAkweDA1ICAvKiBTaW5rIGVuYWJsZSBiYWNrbGlnaHQgb3IgaW5kZXBlbmRlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9QV01MRUQJMHgwNiAgLyogUFdNIEVuYWJsZSBTZWxlY3Rpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9CTE9GRgkweDA3ICAvKiBCYWNrbGlnaHQgb2ZmIHRpbWVvdXQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERJTQkweDA4ICAvKiBCYWNrbGlnaHQgZGltIHRpbWVvdXQgKi8KKyNkZWZpbmUgQURQODg3MF9CTEZSCTB4MDkgIC8qIEJhY2tsaWdodCBmYWRlIGluIGFuZCBvdXQgcmF0ZXMgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YMQkweDBBICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMS1kYXlsaWdodCkgbWF4aW11bSBjdXJyZW50ICovCisjZGVmaW5lIEFEUDg4NzBfQkxETTEJMHgwQiAgLyogQmFja2xpZ2h0IChCcmlnaHRuZXNzIExldmVsIDEtZGF5bGlnaHQpIGRpbSBjdXJyZW50ICovCisjZGVmaW5lIEFEUDg4NzBfQkxNWDIJMHgwQyAgLyogQmFja2xpZ2h0IChCcmlnaHRuZXNzIExldmVsIDItYnJpZ2h0KSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNMgkweDBEICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMi1icmlnaHQpIGRpbSBjdXJyZW50ICovCisjZGVmaW5lIEFEUDg4NzBfQkxNWDMJMHgwRSAgLyogQmFja2xpZ2h0IChCcmlnaHRuZXNzIExldmVsIDMtb2ZmaWNlKSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNMwkweDBGICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMy1vZmZpY2UpIGRpbSBjdXJyZW50ICovCisjZGVmaW5lIEFEUDg4NzBfQkxNWDQJMHgxMCAgLyogQmFja2xpZ2h0IChCcmlnaHRuZXNzIExldmVsIDQtaW5kb29yKSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNNAkweDExICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNC1pbmRvb3IpIGRpbSBjdXJyZW50ICovCisjZGVmaW5lIEFEUDg4NzBfQkxNWDUJMHgxMiAgLyogQmFja2xpZ2h0IChCcmlnaHRuZXNzIExldmVsIDUtZGFyaykgbWF4aW11bSBjdXJyZW50ICovCisjZGVmaW5lIEFEUDg4NzBfQkxETTUJMHgxMyAgLyogQmFja2xpZ2h0IChCcmlnaHRuZXNzIExldmVsIDUtZGFyaykgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9JU0NMQVcJMHgxQSAgLyogSW5kZXBlbmRlbnQgc2luayBjdXJyZW50IGZhZGUgbGF3IHJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfSVNDQwkweDFCICAvKiBJbmRlcGVuZGVudCBzaW5rIGN1cnJlbnQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0lTQ1QxCTB4MUMgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBUaW1lciBSZWdpc3RlciBMRURbNzo1XSAqLworI2RlZmluZSBBRFA4ODcwX0lTQ1QyCTB4MUQgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBUaW1lciBSZWdpc3RlciBMRURbNDoxXSAqLworI2RlZmluZSBBRFA4ODcwX0lTQ0YJMHgxRSAgLyogSW5kZXBlbmRlbnQgc2luayBjdXJyZW50IGZhZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9JU0MxCTB4MUYgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQxICovCisjZGVmaW5lIEFEUDg4NzBfSVNDMgkweDIwICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVEMiAqLworI2RlZmluZSBBRFA4ODcwX0lTQzMJMHgyMSAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDMgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M0CTB4MjIgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ0ICovCisjZGVmaW5lIEFEUDg4NzBfSVNDNQkweDIzICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENSAqLworI2RlZmluZSBBRFA4ODcwX0lTQzYJMHgyNCAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDYgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M3CTB4MjUgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ3IChCcmlnaHRuZXNzIExldmVsIDEtZGF5bGlnaHQpICovCisjZGVmaW5lIEFEUDg4NzBfSVNDN19MMgkweDI2ICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENyAoQnJpZ2h0bmVzcyBMZXZlbCAyLWJyaWdodCkgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M3X0wzCTB4MjcgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ3IChCcmlnaHRuZXNzIExldmVsIDMtb2ZmaWNlKSAqLworI2RlZmluZSBBRFA4ODcwX0lTQzdfTDQJMHgyOCAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDcgKEJyaWdodG5lc3MgTGV2ZWwgNC1pbmRvb3IpICovCisjZGVmaW5lIEFEUDg4NzBfSVNDN19MNQkweDI5ICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENyAoQnJpZ2h0bmVzcyBMZXZlbCA1LWRhcmspICovCisjZGVmaW5lIEFEUDg4NzBfQ01QX0NUTAkweDJEICAvKiBBTFMgQ29tcGFyYXRvciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMV9FTgkweDJFICAvKiBNYWluIEFMUyBjb21wYXJhdG9yIGxldmVsIGVuYWJsZSAqLworI2RlZmluZSBBRFA4ODcwX0FMUzJfRU4JMHgyRiAgLyogU2Vjb25kIEFMUyBjb21wYXJhdG9yIGxldmVsIGVuYWJsZSAqLworI2RlZmluZSBBRFA4ODcwX0FMUzFfU1RBVCAweDMwICAvKiBNYWluIEFMUyBDb21wYXJhdG9yIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0FMUzJfU1RBVCAweDMxICAvKiBTZWNvbmQgQUxTIENvbXBhcmF0b3IgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfTDJUUlAJMHgzMiAgLyogTDIgY29tcGFyYXRvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgQURQODg3MF9MMkhZUwkweDMzICAvKiBMMiBoeXN0ZXJlc2lzICovCisjZGVmaW5lIEFEUDg4NzBfTDNUUlAJMHgzNCAgLyogTDMgY29tcGFyYXRvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgQURQODg3MF9MM0hZUwkweDM1ICAvKiBMMyBoeXN0ZXJlc2lzICovCisjZGVmaW5lIEFEUDg4NzBfTDRUUlAJMHgzNiAgLyogTDQgY29tcGFyYXRvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgQURQODg3MF9MNEhZUwkweDM3ICAvKiBMNCBoeXN0ZXJlc2lzICovCisjZGVmaW5lIEFEUDg4NzBfTDVUUlAJMHgzOCAgLyogTDUgY29tcGFyYXRvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgQURQODg3MF9MNUhZUwkweDM5ICAvKiBMNSBoeXN0ZXJlc2lzICovCisjZGVmaW5lIEFEUDg4NzBfUEgxTEVWTAkweDQwICAvKiBGaXJzdCBwaG90b3RyYW5zaXN0b3IgYW1iaWVudCBsaWdodCBsZXZlbC1sb3cgYnl0ZSByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX1BIMUxFVkgJMHg0MSAgLyogRmlyc3QgcGhvdG90cmFuc2lzdG9yIGFtYmllbnQgbGlnaHQgbGV2ZWwtaGlnaCBieXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfUEgyTEVWTAkweDQyICAvKiBTZWNvbmQgcGhvdG90cmFuc2lzdG9yIGFtYmllbnQgbGlnaHQgbGV2ZWwtbG93IGJ5dGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9QSDJMRVZICTB4NDMgIC8qIFNlY29uZCBwaG90b3RyYW5zaXN0b3IgYW1iaWVudCBsaWdodCBsZXZlbC1oaWdoIGJ5dGUgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBBRFA4ODcwX01BTlVGSUQJCTB4MyAgLyogQW5hbG9nIERldmljZXMgQUQ4ODcwIE1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIElEICovCisjZGVmaW5lIEFEUDg4NzBfREVWSUQoeCkJKCh4KSAmIDB4RikKKyNkZWZpbmUgQURQODg3MF9NQU5JRCh4KQkoKHgpID4+IDQpCisKKy8qIE1EQ1IgRGV2aWNlIG1vZGUgYW5kIHN0YXR1cyAqLworI2RlZmluZSBEN0FMU0VOCQkJKDEgPDwgNykKKyNkZWZpbmUgSU5UX0NGRwkJCSgxIDw8IDYpCisjZGVmaW5lIE5TVEJZCQkJKDEgPDwgNSkKKyNkZWZpbmUgRElNX0VOCQkJKDEgPDwgNCkKKyNkZWZpbmUgR0RXTl9ESVMJCSgxIDw8IDMpCisjZGVmaW5lIFNJU19FTgkJCSgxIDw8IDIpCisjZGVmaW5lIENNUF9BVVRPRU4JCSgxIDw8IDEpCisjZGVmaW5lIEJMRU4JCQkoMSA8PCAwKQorCisvKiBBRFA4ODcwX0FMUzFfRU4gTWFpbiBBTFMgY29tcGFyYXRvciBsZXZlbCBlbmFibGUgKi8KKyNkZWZpbmUgTDVfRU4JCQkoMSA8PCAzKQorI2RlZmluZSBMNF9FTgkJCSgxIDw8IDIpCisjZGVmaW5lIEwzX0VOCQkJKDEgPDwgMSkKKyNkZWZpbmUgTDJfRU4JCQkoMSA8PCAwKQorCisjZGVmaW5lIENGR1JfQkxWX1NISUZUCQkzCisjZGVmaW5lIENGR1JfQkxWX01BU0sJCTB4NworI2RlZmluZSBBRFA4ODcwX0ZMQUdfTEVEX01BU0sJMHhGRgorCisjZGVmaW5lIEZBREVfVkFMKGluLCBvdXQpCSgoMHhGICYgKGluKSkgfCAoKDB4RiAmIChvdXQpKSA8PCA0KSkKKyNkZWZpbmUgQkxfQ0ZHUl9WQUwobGF3LCBibHYpCSgoKChibHYpICYgQ0ZHUl9CTFZfTUFTSykgPDwgQ0ZHUl9CTFZfU0hJRlQpIHwgKCgweDMgJiAobGF3KSkgPDwgMSkpCisjZGVmaW5lIEFMU19DTVBSX0NGR19WQUwoZmlsdCkJKCgweDcgJiAoZmlsdCkpIDw8IDEpCisKK3N0cnVjdCBhZHA4ODcwX2JsIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibDsKKwlzdHJ1Y3QgYWRwODg3MF9sZWQgKmxlZDsKKwlzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdW5zaWduZWQgbG9uZyBjYWNoZWRfZGF5bGlnaHRfbWF4OworCWludCBpZDsKKwlpbnQgcmV2aWQ7CisJaW50IGN1cnJlbnRfYnJpZ2h0bmVzczsKK307CisKK3N0cnVjdCBhZHA4ODcwX2xlZCB7CisJc3RydWN0IGxlZF9jbGFzc2RldgljZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJZW51bSBsZWRfYnJpZ2h0bmVzcwluZXdfYnJpZ2h0bmVzczsKKwlpbnQJCQlpZDsKKwlpbnQJCQlmbGFnczsKK307CisKK3N0YXRpYyBpbnQgYWRwODg3MF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcsIHVpbnQ4X3QgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCByZWFkaW5nIGF0IDB4JTAyeFxuIiwgcmVnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqdmFsID0gcmV0OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYWRwODg3MF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byB3cml0ZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkcDg4NzBfc2V0X2JpdHMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHJlZywgdWludDhfdCBiaXRfbWFzaykKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVpbnQ4X3QgcmVnX3ZhbDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXQgPSBhZHA4ODcwX3JlYWQoY2xpZW50LCByZWcsICZyZWdfdmFsKTsKKworCWlmICghcmV0ICYmICgocmVnX3ZhbCAmIGJpdF9tYXNrKSA9PSAwKSkgeworCQlyZWdfdmFsIHw9IGJpdF9tYXNrOworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgcmVnLCByZWdfdmFsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwODg3MF9jbHJfYml0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldCA9IGFkcDg4NzBfcmVhZChjbGllbnQsIHJlZywgJnJlZ192YWwpOworCisJaWYgKCFyZXQgJiYgKHJlZ192YWwgJiBiaXRfbWFzaykpIHsKKwkJcmVnX3ZhbCAmPSB+Yml0X21hc2s7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCByZWcsIHJlZ192YWwpOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluZGVwZW5kZW50IHNpbmsgLyBMRUQKKyAqLworI2lmIGRlZmluZWQoQURQODg3MF9VU0VfTEVEUykKK3N0YXRpYyB2b2lkIGFkcDg4NzBfbGVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZHA4ODcwX2xlZCwgd29yayk7CisJYWRwODg3MF93cml0ZShsZWQtPmNsaWVudCwgQURQODg3MF9JU0MxICsgbGVkLT5pZCAtIDEsCisJCQkgbGVkLT5uZXdfYnJpZ2h0bmVzcyA+PiAxKTsKK30KKworc3RhdGljIHZvaWQgYWRwODg3MF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9sZWQgKmxlZDsKKworCWxlZCA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGFkcDg4NzBfbGVkLCBjZGV2KTsKKwlsZWQtPm5ld19icmlnaHRuZXNzID0gdmFsdWU7CisJLyoKKwkgKiBVc2Ugd29ya3F1ZXVlIGZvciBJTyBzaW5jZSBJMkMgb3BlcmF0aW9ucyBjYW4gc2xlZXAuCisJICovCisJc2NoZWR1bGVfd29yaygmbGVkLT53b3JrKTsKK30KKworc3RhdGljIGludCBhZHA4ODcwX2xlZF9zZXR1cChzdHJ1Y3QgYWRwODg3MF9sZWQgKmxlZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gbGVkLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9JU0MxICsgbGVkLT5pZCAtIDEsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZHA4ODcwX3NldF9iaXRzKGNsaWVudCwgQURQODg3MF9JU0NDLCAxIDw8IChsZWQtPmlkIC0gMSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAobGVkLT5pZCA+IDQpCisJCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX0lTQ1QxLAorCQkJCShsZWQtPmZsYWdzICYgMHgzKSA8PCAoKGxlZC0+aWQgLSA1KSAqIDIpKTsKKwllbHNlCisJCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX0lTQ1QyLAorCQkJCShsZWQtPmZsYWdzICYgMHgzKSA8PCAoKGxlZC0+aWQgLSAxKSAqIDIpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDg4NzBfbGVkX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkcDg4NzBfYmFja2xpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkLCAqbGVkX2RhdDsKKwlzdHJ1Y3QgbGVkX2luZm8gKmN1cl9sZWQ7CisJaW50IHJldCwgaTsKKworCisJbGVkID0ga2NhbGxvYyhwZGF0YS0+bnVtX2xlZHMsIHNpemVvZigqbGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGxlZCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0lTQ0xBVywgcGRhdGEtPmxlZF9mYWRlX2xhdyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0lTQ1QxLAorCQkJKHBkYXRhLT5sZWRfb25fdGltZSAmIDB4MykgPDwgNik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0lTQ0YsCisJCQlGQURFX1ZBTChwZGF0YS0+bGVkX2ZhZGVfaW4sIHBkYXRhLT5sZWRfZmFkZV9vdXQpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgKytpKSB7CisJCWN1cl9sZWQgPSAmcGRhdGEtPmxlZHNbaV07CisJCWxlZF9kYXQgPSAmbGVkW2ldOworCisJCWxlZF9kYXQtPmlkID0gY3VyX2xlZC0+ZmxhZ3MgJiBBRFA4ODcwX0ZMQUdfTEVEX01BU0s7CisKKwkJaWYgKGxlZF9kYXQtPmlkID4gNyB8fCBsZWRfZGF0LT5pZCA8IDEpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSW52YWxpZCBMRUQgSUQgJWRcbiIsCisJCQkJbGVkX2RhdC0+aWQpOworCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAocGRhdGEtPmJsX2xlZF9hc3NpZ24gJiAoMSA8PCAobGVkX2RhdC0+aWQgLSAxKSkpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTEVEICVkIHVzZWQgYnkgQmFja2xpZ2h0XG4iLAorCQkJCWxlZF9kYXQtPmlkKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJbGVkX2RhdC0+Y2Rldi5uYW1lID0gY3VyX2xlZC0+bmFtZTsKKwkJbGVkX2RhdC0+Y2Rldi5kZWZhdWx0X3RyaWdnZXIgPSBjdXJfbGVkLT5kZWZhdWx0X3RyaWdnZXI7CisJCWxlZF9kYXQtPmNkZXYuYnJpZ2h0bmVzc19zZXQgPSBhZHA4ODcwX2xlZF9zZXQ7CisJCWxlZF9kYXQtPmNkZXYuYnJpZ2h0bmVzcyA9IExFRF9PRkY7CisJCWxlZF9kYXQtPmZsYWdzID0gY3VyX2xlZC0+ZmxhZ3MgPj4gRkxBR19PRkZUX1NISUZUOworCQlsZWRfZGF0LT5jbGllbnQgPSBjbGllbnQ7CisJCWxlZF9kYXQtPm5ld19icmlnaHRuZXNzID0gTEVEX09GRjsKKwkJSU5JVF9XT1JLKCZsZWRfZGF0LT53b3JrLCBhZHA4ODcwX2xlZF93b3JrKTsKKworCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmbGVkX2RhdC0+Y2Rldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIExFRCAlZFxuIiwKKwkJCQlsZWRfZGF0LT5pZCk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXJldCA9IGFkcDg4NzBfbGVkX3NldHVwKGxlZF9kYXQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byB3cml0ZVxuIik7CisJCQlpKys7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWRhdGEtPmxlZCA9IGxlZDsKKworCXJldHVybiAwOworCisgZXJyOgorCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IC0taSkgeworCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbGVkW2ldLmNkZXYpOworCQljYW5jZWxfd29ya19zeW5jKCZsZWRbaV0ud29yayk7CisJfQorCisgZXJyX2ZyZWU6CisJa2ZyZWUobGVkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkcDg4NzBfbGVkX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2xlZHM7IGkrKykgeworCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkW2ldLmNkZXYpOworCQljYW5jZWxfd29ya19zeW5jKCZkYXRhLT5sZWRbaV0ud29yayk7CisJfQorCisJa2ZyZWUoZGF0YS0+bGVkKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHA4ODcwX2xlZF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHA4ODcwX2xlZF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFkcDg4NzBfYmxfc2V0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCwgaW50IGJyaWdodG5lc3MpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkYXRhLT5wZGF0YS0+ZW5fYW1ibF9zZW5zKSB7CisJCWlmICgoYnJpZ2h0bmVzcyA+IDApICYmIChicmlnaHRuZXNzIDwgQURQODg3MF9NQVhfQlJJR0hUTkVTUykpIHsKKwkJCS8qIERpc2FibGUgQW1iaWVudCBMaWdodCBhdXRvIGFkanVzdCAqLworCQkJcmV0ID0gYWRwODg3MF9jbHJfYml0cyhjbGllbnQsIEFEUDg4NzBfTURDUiwKKwkJCQkJQ01QX0FVVE9FTik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMSwgYnJpZ2h0bmVzcyk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTUFYX0JSSUdIVE5FU1MgLT4gRW5hYmxlIEFtYmllbnQgTGlnaHQgYXV0byBhZGp1c3QKKwkJCSAqIHJlc3RvcmUgZGF5bGlnaHQgbDEgc3lzZnMgYnJpZ2h0bmVzcworCQkJICovCisJCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMSwKKwkJCQkJIGRhdGEtPmNhY2hlZF9kYXlsaWdodF9tYXgpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlyZXQgPSBhZHA4ODcwX3NldF9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLAorCQkJCQkgQ01QX0FVVE9FTik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMSwgYnJpZ2h0bmVzcyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgJiYgYnJpZ2h0bmVzcyA9PSAwKQorCQlyZXQgPSBhZHA4ODcwX3NldF9iaXRzKGNsaWVudCwKKwkJCQlBRFA4ODcwX01EQ1IsIERJTV9FTik7CisJZWxzZSBpZiAoZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzID09IDAgJiYgYnJpZ2h0bmVzcykKKwkJcmV0ID0gYWRwODg3MF9jbHJfYml0cyhjbGllbnQsCisJCQkJQURQODg3MF9NRENSLCBESU1fRU4pOworCisJaWYgKCFyZXQpCisJCWRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkcDg4NzBfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmwpCit7CisJaW50IGJyaWdodG5lc3MgPSBibC0+cHJvcHMuYnJpZ2h0bmVzczsKKwlpZiAoYmwtPnByb3BzLnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWJyaWdodG5lc3MgPSAwOworCisJaWYgKGJsLT5wcm9wcy5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlicmlnaHRuZXNzID0gMDsKKworCXJldHVybiBhZHA4ODcwX2JsX3NldChibCwgYnJpZ2h0bmVzcyk7Cit9CisKK3N0YXRpYyBpbnQgYWRwODg3MF9ibF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmwpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CisKKwlyZXR1cm4gZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgYWRwODg3MF9ibF9vcHMgPSB7CisJLnVwZGF0ZV9zdGF0dXMJPSBhZHA4ODcwX2JsX3VwZGF0ZV9zdGF0dXMsCisJLmdldF9icmlnaHRuZXNzCT0gYWRwODg3MF9ibF9nZXRfYnJpZ2h0bmVzcywKK307CisKK3N0YXRpYyBpbnQgYWRwODg3MF9ibF9zZXR1cChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmwpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMU0VMLCB+cGRhdGEtPmJsX2xlZF9hc3NpZ24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9QV01MRUQsIHBkYXRhLT5wd21fYXNzaWduKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxNWDEsIHBkYXRhLT5sMV9kYXlsaWdodF9tYXgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTERNMSwgcGRhdGEtPmwxX2RheWxpZ2h0X2RpbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwZGF0YS0+ZW5fYW1ibF9zZW5zKSB7CisJCWRhdGEtPmNhY2hlZF9kYXlsaWdodF9tYXggPSBwZGF0YS0+bDFfZGF5bGlnaHRfbWF4OworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMiwKKwkJCQkJCXBkYXRhLT5sMl9icmlnaHRfbWF4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRE0yLAorCQkJCQkJcGRhdGEtPmwyX2JyaWdodF9kaW0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMywKKwkJCQkJCXBkYXRhLT5sM19vZmZpY2VfbWF4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRE0zLAorCQkJCQkJcGRhdGEtPmwzX29mZmljZV9kaW0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YNCwKKwkJCQkJCXBkYXRhLT5sNF9pbmRvb3JfbWF4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxETTQsCisJCQkJCQlwZGF0YS0+bDRfaW5kb3JfZGltKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxNWDUsCisJCQkJCQlwZGF0YS0+bDVfZGFya19tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTERNNSwKKwkJCQkJCXBkYXRhLT5sNV9kYXJrX2RpbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0wyVFJQLCBwZGF0YS0+bDJfdHJpcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0wySFlTLCBwZGF0YS0+bDJfaHlzdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0wzVFJQLCBwZGF0YS0+bDNfdHJpcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0wzSFlTLCBwZGF0YS0+bDNfaHlzdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0w0VFJQLCBwZGF0YS0+bDRfdHJpcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0w0SFlTLCBwZGF0YS0+bDRfaHlzdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0w1VFJQLCBwZGF0YS0+bDVfdHJpcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0w1SFlTLCBwZGF0YS0+bDVfaHlzdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0FMUzFfRU4sIEw1X0VOIHwgTDRfRU4gfAorCQkJCQkJTDNfRU4gfCBMMl9FTik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0NNUF9DVEwsCisJCQlBTFNfQ01QUl9DRkdfVkFMKHBkYXRhLT5hYm1sX2ZpbHQpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQ0ZHUiwKKwkJCUJMX0NGR1JfVkFMKHBkYXRhLT5ibF9mYWRlX2xhdywgMCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTEZSLCBGQURFX1ZBTChwZGF0YS0+YmxfZmFkZV9pbiwKKwkJCXBkYXRhLT5ibF9mYWRlX291dCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJLyoKKwkgKiBBRFA4ODcwIFJldjAgcmVxdWlyZXMgR0RXTl9ESVMgYml0IHNldAorCSAqLworCisJcmV0ID0gYWRwODg3MF9zZXRfYml0cyhjbGllbnQsIEFEUDg4NzBfTURDUiwgQkxFTiB8IERJTV9FTiB8IE5TVEJZIHwKKwkJCShkYXRhLT5yZXZpZCA9PSAwID8gR0RXTl9ESVMgOiAwKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCByZWcpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyb3I7CisJdWludDhfdCByZWdfdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJZXJyb3IgPSBhZHA4ODcwX3JlYWQoZGF0YS0+Y2xpZW50LCByZWcsICZyZWdfdmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHJlZ192YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJYWRwODg3MF93cml0ZShkYXRhLT5jbGllbnQsIHJlZywgdmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w1X2RhcmtfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxNWDUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w1X2RhcmtfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YNSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDVfZGFya19tYXgsIDA2NjQsIGFkcDg4NzBfYmxfbDVfZGFya19tYXhfc2hvdywKKwkJCWFkcDg4NzBfYmxfbDVfZGFya19tYXhfc3RvcmUpOworCisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDRfaW5kb29yX21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMTVg0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sNF9pbmRvb3JfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YNCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDRfaW5kb29yX21heCwgMDY2NCwgYWRwODg3MF9ibF9sNF9pbmRvb3JfbWF4X3Nob3csCisJCQlhZHA4ODcwX2JsX2w0X2luZG9vcl9tYXhfc3RvcmUpOworCisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDNfb2ZmaWNlX21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTE1YMyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDNfb2ZmaWNlX21heF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxNWDMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobDNfb2ZmaWNlX21heCwgMDY2NCwgYWRwODg3MF9ibF9sM19vZmZpY2VfbWF4X3Nob3csCisJCQlhZHA4ODcwX2JsX2wzX29mZmljZV9tYXhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wyX2JyaWdodF9tYXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTE1YMik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDJfYnJpZ2h0X21heF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxNWDIpOworfQorc3RhdGljIERFVklDRV9BVFRSKGwyX2JyaWdodF9tYXgsIDA2NjQsIGFkcDg4NzBfYmxfbDJfYnJpZ2h0X21heF9zaG93LAorCQkJYWRwODg3MF9ibF9sMl9icmlnaHRfbWF4X3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMV9kYXlsaWdodF9tYXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxNWDEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X21heF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YMSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDFfZGF5bGlnaHRfbWF4LCAwNjY0LCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X21heF9zaG93LAorCQkJYWRwODg3MF9ibF9sMV9kYXlsaWdodF9tYXhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w1X2RhcmtfZGltX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMRE01KTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sNV9kYXJrX2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNNSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDVfZGFya19kaW0sIDA2NjQsIGFkcDg4NzBfYmxfbDVfZGFya19kaW1fc2hvdywKKwkJCWFkcDg4NzBfYmxfbDVfZGFya19kaW1fc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w0X2luZG9vcl9kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w0X2luZG9vcl9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxETTQpOworfQorc3RhdGljIERFVklDRV9BVFRSKGw0X2luZG9vcl9kaW0sIDA2NjQsIGFkcDg4NzBfYmxfbDRfaW5kb29yX2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sNF9pbmRvb3JfZGltX3N0b3JlKTsKKworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wzX29mZmljZV9kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTMpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wzX29mZmljZV9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxETTMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGwzX29mZmljZV9kaW0sIDA2NjQsIGFkcDg4NzBfYmxfbDNfb2ZmaWNlX2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sM19vZmZpY2VfZGltX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMl9icmlnaHRfZGltX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMRE0yKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMl9icmlnaHRfZGltX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMRE0yKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsMl9icmlnaHRfZGltLCAwNjY0LCBhZHA4ODcwX2JsX2wyX2JyaWdodF9kaW1fc2hvdywKKwkJCWFkcDg4NzBfYmxfbDJfYnJpZ2h0X2RpbV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDFfZGF5bGlnaHRfZGltX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMRE0xKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMV9kYXlsaWdodF9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxETTEpOworfQorc3RhdGljIERFVklDRV9BVFRSKGwxX2RheWxpZ2h0X2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sMV9kYXlsaWdodF9kaW1fc2hvdywKKwkJCWFkcDg4NzBfYmxfbDFfZGF5bGlnaHRfZGltX3N0b3JlKTsKKworI2lmZGVmIEFEUDg4NzBfRVhUX0ZFQVRVUkVTCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfbGV2ZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVycm9yOworCXVpbnQ4X3QgcmVnX3ZhbDsKKwl1aW50MTZfdCByZXRfdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJZXJyb3IgPSBhZHA4ODcwX3JlYWQoZGF0YS0+Y2xpZW50LCBBRFA4ODcwX1BIMUxFVkwsICZyZWdfdmFsKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcmV0X3ZhbCA9IHJlZ192YWw7CisJZXJyb3IgPSBhZHA4ODcwX3JlYWQoZGF0YS0+Y2xpZW50LCBBRFA4ODcwX1BIMUxFVkgsICZyZWdfdmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJLyogUmV0dXJuIDEzLWJpdCBjb252ZXJzaW9uIHZhbHVlIGZvciB0aGUgZmlyc3QgbGlnaHQgc2Vuc29yICovCisJcmV0X3ZhbCArPSAocmVnX3ZhbCAmIDB4MUYpIDw8IDg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmV0X3ZhbCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYW1iaWVudF9saWdodF9sZXZlbCwgMDQ0NCwKKwkJYWRwODg3MF9ibF9hbWJpZW50X2xpZ2h0X2xldmVsX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfem9uZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyb3I7CisJdWludDhfdCByZWdfdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJZXJyb3IgPSBhZHA4ODcwX3JlYWQoZGF0YS0+Y2xpZW50LCBBRFA4ODcwX0NGR1IsICZyZWdfdmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsCisJCSgocmVnX3ZhbCA+PiBDRkdSX0JMVl9TSElGVCkgJiBDRkdSX0JMVl9NQVNLKSArIDEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfem9uZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCA9PSAwKSB7CisJCS8qIEVuYWJsZSBhdXRvbWF0aWMgYW1iaWVudCBsaWdodCBzZW5zaW5nICovCisJCWFkcDg4NzBfc2V0X2JpdHMoZGF0YS0+Y2xpZW50LCBBRFA4ODcwX01EQ1IsIENNUF9BVVRPRU4pOworCX0gZWxzZSBpZiAoKHZhbCA+IDApICYmICh2YWwgPCA2KSkgeworCQkvKiBEaXNhYmxlIGF1dG9tYXRpYyBhbWJpZW50IGxpZ2h0IHNlbnNpbmcgKi8KKwkJYWRwODg3MF9jbHJfYml0cyhkYXRhLT5jbGllbnQsIEFEUDg4NzBfTURDUiwgQ01QX0FVVE9FTik7CisKKwkJLyogU2V0IHVzZXIgc3VwcGxpZWQgYW1iaWVudCBsaWdodCB6b25lICovCisJCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCQlhZHA4ODcwX3JlYWQoZGF0YS0+Y2xpZW50LCBBRFA4ODcwX0NGR1IsICZyZWdfdmFsKTsKKwkJcmVnX3ZhbCAmPSB+KENGR1JfQkxWX01BU0sgPDwgQ0ZHUl9CTFZfU0hJRlQpOworCQlyZWdfdmFsIHw9ICh2YWwgLSAxKSA8PCBDRkdSX0JMVl9TSElGVDsKKwkJYWRwODg3MF93cml0ZShkYXRhLT5jbGllbnQsIEFEUDg4NzBfQ0ZHUiwgcmVnX3ZhbCk7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGFtYmllbnRfbGlnaHRfem9uZSwgMDY2NCwKKwkJYWRwODg3MF9ibF9hbWJpZW50X2xpZ2h0X3pvbmVfc2hvdywKKwkJYWRwODg3MF9ibF9hbWJpZW50X2xpZ2h0X3pvbmVfc3RvcmUpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHA4ODcwX2JsX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfbDVfZGFya19tYXguYXR0ciwKKwkmZGV2X2F0dHJfbDVfZGFya19kaW0uYXR0ciwKKwkmZGV2X2F0dHJfbDRfaW5kb29yX21heC5hdHRyLAorCSZkZXZfYXR0cl9sNF9pbmRvb3JfZGltLmF0dHIsCisJJmRldl9hdHRyX2wzX29mZmljZV9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbDNfb2ZmaWNlX2RpbS5hdHRyLAorCSZkZXZfYXR0cl9sMl9icmlnaHRfbWF4LmF0dHIsCisJJmRldl9hdHRyX2wyX2JyaWdodF9kaW0uYXR0ciwKKwkmZGV2X2F0dHJfbDFfZGF5bGlnaHRfbWF4LmF0dHIsCisJJmRldl9hdHRyX2wxX2RheWxpZ2h0X2RpbS5hdHRyLAorI2lmZGVmIEFEUDg4NzBfRVhUX0ZFQVRVUkVTCisJJmRldl9hdHRyX2FtYmllbnRfbGlnaHRfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfYW1iaWVudF9saWdodF96b25lLmF0dHIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHA4ODcwX2JsX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRwODg3MF9ibF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRwODg3MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibDsKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YTsKKwlzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXVpbnQ4X3QgcmVnX3ZhbDsKKwlpbnQgcmV0OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJTTUJVUyBCeXRlIERhdGEgbm90IFN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFkcDg4NzBfcmVhZChjbGllbnQsIEFEUDg4NzBfTUZEVklELCAmcmVnX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKEFEUDg4NzBfTUFOSUQocmVnX3ZhbCkgIT0gQURQODg3MF9NQU5VRklEKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHByb2JlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhLT5yZXZpZCA9IEFEUDg4NzBfREVWSUQocmVnX3ZhbCk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWRhdGEtPnBkYXRhID0gcGRhdGE7CisJZGF0YS0+aWQgPSBpZC0+ZHJpdmVyX2RhdGE7CisJZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzID0gMDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHByb3BzKSk7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CisJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBwcm9wcy5icmlnaHRuZXNzID0gQURQODg3MF9NQVhfQlJJR0hUTkVTUzsKKwlibCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoZGV2X2RyaXZlcl9zdHJpbmcoJmNsaWVudC0+ZGV2KSwKKwkJCSZjbGllbnQtPmRldiwgZGF0YSwgJmFkcDg4NzBfYmxfb3BzLCAmcHJvcHMpOworCWlmIChJU19FUlIoYmwpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGJhY2tsaWdodFxuIik7CisJCXJldCA9IFBUUl9FUlIoYmwpOworCQlnb3RvIG91dDI7CisJfQorCisJZGF0YS0+YmwgPSBibDsKKworCWlmIChwZGF0YS0+ZW5fYW1ibF9zZW5zKQorCQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmJsLT5kZXYua29iaiwKKwkJCSZhZHA4ODcwX2JsX2F0dHJfZ3JvdXApOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBzeXNmc1xuIik7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlyZXQgPSBhZHA4ODcwX2JsX3NldHVwKGJsKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJsKTsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlJldi4lZCBCYWNrbGlnaHRcbiIsIGRhdGEtPnJldmlkKTsKKworCWlmIChwZGF0YS0+bnVtX2xlZHMpCisJCWFkcDg4NzBfbGVkX3Byb2JlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChkYXRhLT5wZGF0YS0+ZW5fYW1ibF9zZW5zKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRhdGEtPmJsLT5kZXYua29iaiwKKwkJCSZhZHA4ODcwX2JsX2F0dHJfZ3JvdXApOworb3V0MToKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmwpOworb3V0MjoKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkcDg4NzBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWFkcDg4NzBfY2xyX2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsIE5TVEJZKTsKKworCWlmIChkYXRhLT5sZWQpCisJCWFkcDg4NzBfbGVkX3JlbW92ZShjbGllbnQpOworCisJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGF0YS0+YmwtPmRldi5rb2JqLAorCQkJJmFkcDg4NzBfYmxfYXR0cl9ncm91cCk7CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+YmwpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWRwODg3MF9pMmNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlhZHA4ODcwX2Nscl9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLCBOU1RCWSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHA4ODcwX2kyY19yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlhZHA4ODcwX3NldF9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLCBOU1RCWSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFkcDg4NzBfaTJjX3N1c3BlbmQgTlVMTAorI2RlZmluZSBhZHA4ODcwX2kyY19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHA4ODcwX2lkW10gPSB7CisJeyAiYWRwODg3MCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRwODg3MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZHA4ODcwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCX0sCisJLnByb2JlICAgID0gYWRwODg3MF9wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhZHA4ODcwX3JlbW92ZSksCisJLnN1c3BlbmQgPSBhZHA4ODcwX2kyY19zdXNwZW5kLAorCS5yZXN1bWUgID0gYWRwODg3MF9pMmNfcmVzdW1lLAorCS5pZF90YWJsZSA9IGFkcDg4NzBfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZHA4ODcwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkcDg4NzBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkcDg4NzBfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZHA4ODcwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWRwODg3MF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRwODg3MF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURQODg3MCBCYWNrbGlnaHQgZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFkcDg4NzAtYmFja2xpZ2h0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JmNTM3LWxxMDM1LmMgYi9kcml2ZXJzL3ZpZGVvL2JmNTM3LWxxMDM1LmMKaW5kZXggNDdjMjFmYi4uYmVhNTNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iZjUzNy1scTAzNS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmY1MzctbHEwMzUuYwpAQCAtNzg5LDYgKzc4OSw3IEBACiAJaTJjX2FkZF9kcml2ZXIoJmFkNTI4MF9kcml2ZXIpOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHByb3BzKSk7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBNQVhfQlJJR0hFTkVTUzsKIAlibF9kZXYgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJiZjUzNy1ibCIsIE5VTEwsIE5VTEwsCiAJCQkJCSAgICZiZmluX2xxMDM1ZmJfYmxfb3BzLCAmcHJvcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9icm9hZHNoZWV0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYnJvYWRzaGVldGZiLmMKaW5kZXggZWJkYTY4Ny4uMzc3ZGRlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9icm9hZHNoZWV0ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Jyb2Fkc2hlZXRmYi5jCkBAIC0xMTAxLDEyICsxMTAxLDEwIEBACiAKIAl2aWRlb21lbW9yeXNpemUgPSByb3VuZHVwKChkcHl3KmRweWgpLCBQQUdFX1NJWkUpOwogCi0JdmlkZW9tZW1vcnkgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CisJdmlkZW9tZW1vcnkgPSB2emFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CiAJaWYgKCF2aWRlb21lbW9yeSkKIAkJZ290byBlcnJfZmJfcmVsOwogCi0JbWVtc2V0KHZpZGVvbWVtb3J5LCAwLCB2aWRlb21lbW9yeXNpemUpOwotCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSAoY2hhciAqKXZpZGVvbWVtb3J5OwogCWluZm8tPmZib3BzID0gJmJyb2Fkc2hlZXRmYl9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZWZpZmIuYyBiL2RyaXZlcnMvdmlkZW8vZWZpZmIuYwppbmRleCBmYjIwNTg0Li43ODQxMzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2VmaWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9lZmlmYi5jCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8dmlkZW8vdmdhLmg+CiAKK3N0YXRpYyBib29sIHJlcXVlc3RfbWVtX3N1Y2NlZWRlZCA9IGZhbHNlOworCiBzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGVmaWZiX2RlZmluZWQgX19kZXZpbml0ZGF0YSA9IHsKIAkuYWN0aXZhdGUJCT0gRkJfQUNUSVZBVEVfTk9XLAogCS5oZWlnaHQJCQk9IC0xLApAQCAtMjgxLDcgKzI4Myw5IEBACiB7CiAJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQogCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSwgaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSk7CisJaWYgKHJlcXVlc3RfbWVtX3N1Y2NlZWRlZCkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UsCisJCQkJICAgaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIApAQCAtMzI2LDE0ICszMzAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgZWZpZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgZWZpZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IHNpemVfdm1vZGU7CiAJdW5zaWduZWQgaW50IHNpemVfcmVtYXA7CiAJdW5zaWduZWQgaW50IHNpemVfdG90YWw7Ci0JaW50IHJlcXVlc3Rfc3VjY2VlZGVkID0gMDsKIAogCWlmICghc2NyZWVuX2luZm8ubGZiX2RlcHRoKQogCQlzY3JlZW5faW5mby5sZmJfZGVwdGggPSAzMjsKQEAgLTM4Nyw3ICszOTAsNyBAQAogCWVmaWZiX2ZpeC5zbWVtX2xlbiA9IHNpemVfcmVtYXA7CiAKIAlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGVmaWZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3JlbWFwLCAiZWZpZmIiKSkgewotCQlyZXF1ZXN0X3N1Y2NlZWRlZCA9IDE7CisJCXJlcXVlc3RfbWVtX3N1Y2NlZWRlZCA9IHRydWU7CiAJfSBlbHNlIHsKIAkJLyogV2UgY2Fubm90IG1ha2UgdGhpcyBmYXRhbC4gU29tZXRpbWVzIHRoaXMgY29tZXMgZnJvbSBtYWdpYwogCQkgICBzcGFjZXMgb3VyIHJlc291cmNlIGhhbmRsZXJzIHNpbXBseSBkb24ndCBrbm93IGFib3V0ICovCkBAIC00MTMsNyArNDE2LDcgQEAKIAlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlID0gZWZpZmJfZml4LnNtZW1fc3RhcnQ7CiAJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHNpemVfcmVtYXA7CiAKLQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoZWZpZmJfZml4LnNtZW1fc3RhcnQsIGVmaWZiX2ZpeC5zbWVtX2xlbik7CisJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwX3djKGVmaWZiX2ZpeC5zbWVtX3N0YXJ0LCBlZmlmYl9maXguc21lbV9sZW4pOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlZmlmYjogYWJvcnQsIGNhbm5vdCBpb3JlbWFwIHZpZGVvIG1lbW9yeSAiCiAJCQkJIjB4JXggQCAweCVseFxuIiwKQEAgLTQ5MSwxMyArNDk0LDEyIEBACiBlcnJfcmVsZWFzZV9mYjoKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX3JlbGVhc2VfbWVtOgotCWlmIChyZXF1ZXN0X3N1Y2NlZWRlZCkKKwlpZiAocmVxdWVzdF9tZW1fc3VjY2VlZGVkKQogCQlyZWxlYXNlX21lbV9yZWdpb24oZWZpZmJfZml4LnNtZW1fc3RhcnQsIHNpemVfdG90YWwpOwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVmaWZiX2RyaXZlciA9IHsKLQkucHJvYmUJPSBlZmlmYl9wcm9iZSwKIAkuZHJpdmVyCT0gewogCQkubmFtZQk9ICJlZmlmYiIsCiAJfSwKQEAgLTUyOCwxMyArNTMwLDIxIEBACiAJaWYgKCFzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmVmaWZiX2RyaXZlcik7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZmlmYl9kZXZpY2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlpZiAoIXJldCkgewotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVmaWZiX2RldmljZSk7Ci0JCWlmIChyZXQpCi0JCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZWZpZmJfZHJpdmVyKTsKKwkvKgorCSAqIFRoaXMgaXMgbm90IGp1c3QgYW4gb3B0aW1pemF0aW9uLiAgV2Ugd2lsbCBpbnRlcmZlcmUKKwkgKiB3aXRoIGEgcmVhbCBkcml2ZXIgaWYgd2UgZ2V0IHJlcHJvYmVkLCBzbyBkb24ndCBhbGxvdworCSAqIGl0LgorCSAqLworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZWZpZmJfZHJpdmVyLCBlZmlmYl9wcm9iZSk7CisJaWYgKHJldCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmZWZpZmJfZGV2aWNlKTsKKwkJcmV0dXJuIHJldDsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogbW9kdWxlX2luaXQoZWZpZmJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZzbC1kaXUtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jCmluZGV4IGJlZGY1YmUuLjBhY2M3ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jCkBAIC01NTUsOCArNTU1LDYgQEAKIHN0YXRpYyBpbnQgZnNsX2RpdV9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JdW5zaWduZWQgbG9uZyBodG90YWwsIHZ0b3RhbDsKLQogCXByX2RlYnVnKCJjaGVja192YXIgeHJlczogJWRcbiIsIHZhci0+eHJlcyk7CiAJcHJfZGVidWcoImNoZWNrX3ZhciB5cmVzOiAlZFxuIiwgdmFyLT55cmVzKTsKIApAQCAtNjM1LDIwICs2MzMsNiBAQAogCiAJCWJyZWFrOwogCX0KLQkvKiBJZiB0aGUgcGl4Y2xvY2sgaXMgYmVsb3cgdGhlIG1pbmltdW0gc3BlYydkIHZhbHVlIHRoZW4gc2V0IHRvCi0JICogcmVmcmVzaCByYXRlIGZvciA2MEh6IHNpbmNlIHRoaXMgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbW9uaXRvcnMuCi0JICogUmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9mYi8gZm9yIGNhbGN1bGF0aW9ucy4KLQkgKi8KLQlpZiAoKHZhci0+cGl4Y2xvY2sgPCBNSU5fUElYX0NMSykgfHwgKHZhci0+cGl4Y2xvY2sgPiBNQVhfUElYX0NMSykpIHsKLQkJaHRvdGFsID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbiArCi0JCSAgICB2YXItPmxlZnRfbWFyZ2luOwotCQl2dG90YWwgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuICsKLQkJICAgIHZhci0+dXBwZXJfbWFyZ2luOwotCQl2YXItPnBpeGNsb2NrID0gKHZ0b3RhbCAqIGh0b3RhbCAqIDZVTCkgLyAxMDBVTDsKLQkJdmFyLT5waXhjbG9jayA9IEtIWjJQSUNPUyh2YXItPnBpeGNsb2NrKTsKLQkJcHJfZGVidWcoInBpeGNsb2NrIHNldCBmb3IgNjBIeiByZWZyZXNoID0gJXUgcHNcbiIsCi0JCQl2YXItPnBpeGNsb2NrKTsKLQl9CiAKIAl2YXItPmhlaWdodCA9IC0xOwogCXZhci0+d2lkdGggPSAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggYzZiNTU0Zi4uNWE1ZDA5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIHN0YXRpYyBjaGFyIHBhbmVsX29wdGlvblszMl0gPSAiIjsKIAogLyogTW9kZXMgcmVsZXZhbnQgdG8gdGhlIEdYMSAodGFrZW4gZnJvbSBtb2RlZGIuYykgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9faW5pdGRhdGEgZ3gxX21vZGVkYltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgX19kZXZpbml0ZGF0YSBneDFfbW9kZWRiW10gPSB7CiAJLyogNjQweDQ4MC02MCBWRVNBICovCiAJeyBOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NjgyLCAgNDgsIDE2LCAzMywgMTAsIDk2LCAyLAogCSAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlyZXR1cm4gcGFyLT52aWRfb3BzLT5ibGFua19kaXNwbGF5KGluZm8sIGJsYW5rX21vZGUpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgZ3gxZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1bnNpZ25lZCBneF9iYXNlOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2luZm8gKiBfX2luaXQgZ3gxZmJfaW5pdF9mYmluZm8oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBmYl9pbmZvICogX19kZXZpbml0IGd4MWZiX2luaXRfZmJpbmZvKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTMxOCw3ICszMTgsNyBAQAogCXJldHVybiBpbmZvOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBneDFmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBfX2RldmluaXQgZ3gxZmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTM4Miw3ICszODIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGd4MWZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBneDFmYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGdlb2RlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CkBAIC00NDEsNyArNDQxLDcgQEAKIAkubmFtZQkJPSAiZ3gxZmIiLAogCS5pZF90YWJsZQk9IGd4MWZiX2lkX3RhYmxlLAogCS5wcm9iZQkJPSBneDFmYl9wcm9iZSwKLQkucmVtb3ZlCQk9IGd4MWZiX3JlbW92ZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGd4MWZiX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBneDFmYl9pbml0KHZvaWQpCkBAIC00NTYsNyArNDU2LDcgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZ3gxZmJfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGd4MWZiX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBneDFmYl9jbGVhbnVwKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZneDFmYl9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9oZWN1YmFmYi5jIGIvZHJpdmVycy92aWRlby9oZWN1YmFmYi5jCmluZGV4IDFiOTQ2NDMuLjYxNDI1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaGVjdWJhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2hlY3ViYWZiLmMKQEAgLTIzMSwxMCArMjMxLDkgQEAKIAogCXZpZGVvbWVtb3J5c2l6ZSA9IChEUFlfVypEUFlfSCkvODsKIAotCWlmICghKHZpZGVvbWVtb3J5ID0gdm1hbGxvYyh2aWRlb21lbW9yeXNpemUpKSkKLQkJcmV0dXJuIHJldHZhbDsKLQotCW1lbXNldCh2aWRlb21lbW9yeSwgMCwgdmlkZW9tZW1vcnlzaXplKTsKKwl2aWRlb21lbW9yeSA9IHZ6YWxsb2ModmlkZW9tZW1vcnlzaXplKTsKKwlpZiAoIXZpZGVvbWVtb3J5KQorCQlnb3RvIGVycl92aWRlb21lbV9hbGxvYzsKIAogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGhlY3ViYWZiX3BhciksICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQpAQCAtMjc2LDYgKzI3NSw3IEBACiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIGVycl9mYmFsbG9jOgogCXZmcmVlKHZpZGVvbWVtb3J5KTsKK2Vycl92aWRlb21lbV9hbGxvYzoKIAltb2R1bGVfcHV0KGJvYXJkLT5vd25lcik7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW14ZmIuYyBiL2RyaXZlcnMvdmlkZW8vaW14ZmIuYwppbmRleCBkMmNjZmQ2Li5mMTM1ZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pbXhmYi5jCkBAIC04NTYsMTAgKzg1NiwxMCBAQAogCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJnBkZXYtPmRldixmYmktPm1hcF9zaXplLGZiaS0+bWFwX2NwdSwKIAkJCWZiaS0+bWFwX2RtYSk7CiBmYWlsZWRfbWFwOgotCWNsa19wdXQoZmJpLT5jbGspOwotZmFpbGVkX2dldGNsb2NrOgogCWlvdW5tYXAoZmJpLT5yZWdzKTsKIGZhaWxlZF9pb3JlbWFwOgorCWNsa19wdXQoZmJpLT5jbGspOworZmFpbGVkX2dldGNsb2NrOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogZmFpbGVkX3JlcToKIAlrZnJlZShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMKaW5kZXggZWQ2NGVkZi4uOTdkNDVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWV0cm9ub21lZmIuYwpAQCAtNjI4LDEyICs2MjgsMTAgQEAKIAkvKiB3ZSBuZWVkIHRvIGFkZCBhIHNwYXJlIHBhZ2UgYmVjYXVzZSBvdXIgY3N1bSBjYWNoaW5nIHNjaGVtZSB3YWxrcwogCSAqIHRvIHRoZSBlbmQgb2YgdGhlIHBhZ2UgKi8KIAl2aWRlb21lbW9yeXNpemUgPSBQQUdFX1NJWkUgKyAoZncgKiBmaCk7Ci0JdmlkZW9tZW1vcnkgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CisJdmlkZW9tZW1vcnkgPSB2emFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CiAJaWYgKCF2aWRlb21lbW9yeSkKIAkJZ290byBlcnJfZmJfcmVsOwogCi0JbWVtc2V0KHZpZGVvbWVtb3J5LCAwLCB2aWRlb21lbW9yeXNpemUpOwotCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSAoY2hhciBfX2ZvcmNlIF9faW9tZW0gKil2aWRlb21lbW9yeTsKIAlpbmZvLT5mYm9wcyA9ICZtZXRyb25vbWVmYl9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IDQ4YzNlYTguLmNiMTc1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtMTEyOCwzICsxMTI4LDQgQEAKIEVYUE9SVF9TWU1CT0woZmJfZmluZF9uZWFyZXN0X21vZGUpOwogRVhQT1JUX1NZTUJPTChmYl92aWRlb21vZGVfdG9fbW9kZWxpc3QpOwogRVhQT1JUX1NZTUJPTChmYl9maW5kX21vZGUpOworRVhQT1JUX1NZTUJPTChmYl9maW5kX21vZGVfY3Z0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHhhMTY4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vcHhhMTY4ZmIuYwppbmRleCAzNWY2MWRkLi5iYjk1ZWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B4YTE2OGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9weGExNjhmYi5jCkBAIC02MjMsMTkgKzYyMywyMSBAQAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKHJlcyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElPIG1lbW9yeSBkZWZpbmVkXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZmFpbGVkX3B1dF9jbGs7CiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJUlEgZGVmaW5lZFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGZhaWxlZF9wdXRfY2xrOwogCX0KIAogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHB4YTE2OGZiX2luZm8pLCAmcGRldi0+ZGV2KTsKIAlpZiAoaW5mbyA9PSBOVUxMKSB7Ci0JCWNsa19wdXQoY2xrKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX3B1dF9jbGs7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KQEAgLTY3MSw3ICs2NzMsNyBAQAogCWZiaS0+cmVnX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoZmJpLT5yZWdfYmFzZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkOworCQlnb3RvIGZhaWxlZF9mcmVlX2luZm87CiAJfQogCiAJLyoKQEAgLTY4Myw3ICs2ODUsNyBAQAogCQkJCQkJJmZiaS0+ZmJfc3RhcnRfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBmYWlsZWRfZnJlZV9pbmZvOwogCX0KIAogCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpZmJpLT5mYl9zdGFydF9kbWE7CkBAIC03NzIsOCArNzc0LDkgQEAKIGZhaWxlZF9mcmVlX2ZibWVtOgogCWRtYV9mcmVlX2NvaGVyZW50KGZiaS0+ZGV2LCBpbmZvLT5maXguc21lbV9sZW4sCiAJCQlpbmZvLT5zY3JlZW5fYmFzZSwgZmJpLT5mYl9zdGFydF9kbWEpOwotZmFpbGVkOgorZmFpbGVkX2ZyZWVfaW5mbzoKIAlrZnJlZShpbmZvKTsKK2ZhaWxlZF9wdXRfY2xrOgogCWNsa19wdXQoY2xrKTsKIAogCWRldl9lcnIoJnBkZXYtPmRldiwgImZyYW1lIGJ1ZmZlciBkZXZpY2UgaW5pdCBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYy1mYi5jCmluZGV4IDAzNTJhZmEuLjRhZWNmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNjLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zM2MtZmIuYwpAQCAtMjM1LDEzICsyMzUsMTIgQEAKIAkJCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgczNjX2ZiX3dpbiAqd2luID0gaW5mby0+cGFyOwotCXN0cnVjdCBzM2NfZmJfcGRfd2luICp3aW5kYXRhID0gd2luLT53aW5kYXRhOwogCXN0cnVjdCBzM2NfZmIgKnNmYiA9IHdpbi0+cGFyZW50OwogCiAJZGV2X2RiZyhzZmItPmRldiwgImNoZWNraW5nIHBhcmFtZXRlcnNcbiIpOwogCi0JdmFyLT54cmVzX3ZpcnR1YWwgPSBtYXgoKHVuc2lnbmVkIGludCl3aW5kYXRhLT52aXJ0dWFsX3gsIHZhci0+eHJlcyk7Ci0JdmFyLT55cmVzX3ZpcnR1YWwgPSBtYXgoKHVuc2lnbmVkIGludCl3aW5kYXRhLT52aXJ0dWFsX3ksIHZhci0+eXJlcyk7CisJdmFyLT54cmVzX3ZpcnR1YWwgPSBtYXgodmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+eHJlcyk7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSBtYXgodmFyLT55cmVzX3ZpcnR1YWwsIHZhci0+eXJlcyk7CiAKIAlpZiAoIXMzY19mYl92YWxpZGF0ZV93aW5fYnBwKHdpbiwgdmFyLT5iaXRzX3Blcl9waXhlbCkpIHsKIAkJZGV2X2RiZyhzZmItPmRldiwgIndpbiAlZDogdW5zdXBwb3J0ZWQgYnBwICVkXG4iLApAQCAtNTU4LDYgKzU1NywxMyBAQAogCXZpZG9zZF9zZXRfYWxwaGEod2luLCBhbHBoYSk7CiAJdmlkb3NkX3NldF9zaXplKHdpbiwgZGF0YSk7CiAKKwkvKiBFbmFibGUgRE1BIGNoYW5uZWwgZm9yIHRoaXMgd2luZG93ICovCisJaWYgKHNmYi0+dmFyaWFudC5oYXNfc2hhZG93Y29uKSB7CisJCWRhdGEgPSByZWFkbChzZmItPnJlZ3MgKyBTSEFET1dDT04pOworCQlkYXRhIHw9IFNIQURPV0NPTl9DSHhfRU5BQkxFKHdpbl9ubyk7CisJCXdyaXRlbChkYXRhLCBzZmItPnJlZ3MgKyBTSEFET1dDT04pOworCX0KKwogCWRhdGEgPSBXSU5DT054X0VOV0lOOwogCiAJLyogbm90ZSwgc2luY2Ugd2UgaGF2ZSB0byByb3VuZCB1cCB0aGUgYml0cy1wZXItcGl4ZWwsIHdlIGVuZCB1cApAQCAtNjM3LDEzICs2NDMsNiBAQAogCXdyaXRlbChkYXRhLCByZWdzICsgc2ZiLT52YXJpYW50LndpbmNvbiArICh3aW5fbm8gKiA0KSk7CiAJd3JpdGVsKDB4MCwgcmVncyArIHNmYi0+dmFyaWFudC53aW5tYXAgKyAod2luX25vICogNCkpOwogCi0JLyogRW5hYmxlIERNQSBjaGFubmVsIGZvciB0aGlzIHdpbmRvdyAqLwotCWlmIChzZmItPnZhcmlhbnQuaGFzX3NoYWRvd2NvbikgewotCQlkYXRhID0gcmVhZGwoc2ZiLT5yZWdzICsgU0hBRE9XQ09OKTsKLQkJZGF0YSB8PSBTSEFET1dDT05fQ0h4X0VOQUJMRSh3aW5fbm8pOwotCQl3cml0ZWwoZGF0YSwgc2ZiLT5yZWdzICsgU0hBRE9XQ09OKTsKLQl9Ci0KIAlzaGFkb3dfcHJvdGVjdF93aW4od2luLCAwKTsKIAogCXJldHVybiAwOwpAQCAtMTQ4NywxMSArMTQ4NiwxMCBAQAogCiAJcmVsZWFzZV9tZW1fcmVnaW9uKHNmYi0+cmVnc19yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHNmYi0+cmVnc19yZXMpKTsKIAotCWtmcmVlKHNmYik7Ci0KIAlwbV9ydW50aW1lX3B1dF9zeW5jKHNmYi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoc2ZiLT5kZXYpOwogCisJa2ZyZWUoc2ZiKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwppbmRleCAzYjdmMmY1Li40ZGU1NDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwpAQCAtMjIzNyw2ICsyMjM3LDIyIEBACiAJCQkJICZpbmZvLT5tb2RlbGlzdCk7CiAjZW5kaWYKIAlpbmZvLT52YXIgPSBzYXZhZ2VmYl92YXI4MDB4NjAweDg7CisJLyogaWYgYSBwYW5lbCB3YXMgZGV0ZWN0ZWQsIGRlZmF1bHQgdG8gYSBDVlQgbW9kZSBpbnN0ZWFkICovCisJaWYgKHBhci0+U2F2YWdlUGFuZWxXaWR0aCkgeworCQlzdHJ1Y3QgZmJfdmlkZW9tb2RlIGN2dF9tb2RlOworCisJCW1lbXNldCgmY3Z0X21vZGUsIDAsIHNpemVvZihjdnRfbW9kZSkpOworCQljdnRfbW9kZS54cmVzID0gcGFyLT5TYXZhZ2VQYW5lbFdpZHRoOworCQljdnRfbW9kZS55cmVzID0gcGFyLT5TYXZhZ2VQYW5lbEhlaWdodDsKKwkJY3Z0X21vZGUucmVmcmVzaCA9IDYwOworCQkvKiBGSVhNRTogaWYgd2Uga25vdyB0aGVyZSBpcyBvbmx5IHRoZSBwYW5lbAorCQkgKiB3ZSBjYW4gZW5hYmxlIHJlZHVjZWQgYmxhbmtpbmcgYXMgd2VsbCAqLworCQlpZiAoZmJfZmluZF9tb2RlX2N2dCgmY3Z0X21vZGUsIDAsIDApKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gQ1ZUIG1vZGUgZm91bmQgZm9yIHBhbmVsXG4iKTsKKwkJZWxzZSBpZiAoZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIE5VTEwsIE5VTEwsIDAsCisJCQkJICAgICAgJmN2dF9tb2RlLCAwKSAhPSAzKQorCQkJaW5mby0+dmFyID0gc2F2YWdlZmJfdmFyODAweDYwMHg4OworCX0KIAogCWlmIChtb2RlX29wdGlvbikgewogCQlmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZV9vcHRpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMKaW5kZXggNmFlNDBiNi4uN2Q1NGUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYwpAQCAtMTEyNywyMyArMTEyNywxNiBAQAogCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGhkbWktPmluZm87CiAJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSAwLCBoZG1pX3JhdGU7CiAKLQkJLyogQSBkZXZpY2UgaGFzIGJlZW4gcGx1Z2dlZCBpbiAqLwotCQlwbV9ydW50aW1lX2dldF9zeW5jKGhkbWktPmRldik7Ci0KIAkJcmV0ID0gc2hfaGRtaV9yZWFkX2VkaWQoaGRtaSwgJmhkbWlfcmF0ZSwgJnBhcmVudF9yYXRlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXBtX3J1bnRpbWVfcHV0KGhkbWktPmRldik7CisJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0JCX0KIAogCQloZG1pLT5ocF9zdGF0ZSA9IEhETUlfSE9UUExVR19FRElEX0RPTkU7CiAKIAkJLyogUmVjb25maWd1cmUgdGhlIGNsb2NrICovCiAJCXJldCA9IHNoX2hkbWlfY2xrX2NvbmZpZ3VyZShoZG1pLCBoZG1pX3JhdGUsIHBhcmVudF9yYXRlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXBtX3J1bnRpbWVfcHV0KGhkbWktPmRldik7CisJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0JCX0KIAogCQltc2xlZXAoMTApOwogCQlzaF9oZG1pX2NvbmZpZ3VyZShoZG1pKTsKQEAgLTExOTEsNyArMTE4NCw2IEBACiAJCWZiX3NldF9zdXNwZW5kKGhkbWktPmluZm8sIDEpOwogCiAJCWNvbnNvbGVfdW5sb2NrKCk7Ci0JCXBtX3J1bnRpbWVfcHV0KGhkbWktPmRldik7CiAJfQogCiBvdXQ6CkBAIC0xMzEyLDcgKzEzMDQsNyBAQAogCUlOSVRfREVMQVlFRF9XT1JLKCZoZG1pLT5lZGlkX3dvcmssIHNoX2hkbWlfZWRpZF93b3JrX2ZuKTsKIAogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwotCXBtX3J1bnRpbWVfcmVzdW1lKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CiAKIAkvKiBQcm9kdWN0IGFuZCByZXZpc2lvbiBJRHMgYXJlIDAgaW4gc2gtbW9iaWxlIHZlcnNpb24gKi8KIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRGV0ZWN0ZWQgSERNSSBjb250cm9sbGVyIDB4JXg6MHgleFxuIiwKQEAgLTEzNDAsNyArMTMzMiw3IEBACiBlY29kZWM6CiAJZnJlZV9pcnEoaXJxLCBoZG1pKTsKIGVyZXFpcnE6Ci0JcG1fcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlpb3VubWFwKGhkbWktPmJhc2UpOwogZW1hcDoKQEAgLTEzNzcsNyArMTM2OSw3IEBACiAJZnJlZV9pcnEoaXJxLCBoZG1pKTsKIAkvKiBXYWl0IGZvciBhbHJlYWR5IHNjaGVkdWxlZCB3b3JrICovCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZG1pLT5lZGlkX3dvcmspOwotCXBtX3J1bnRpbWVfc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJY2xrX2Rpc2FibGUoaGRtaS0+aGRtaV9jbGspOwogCWNsa19wdXQoaGRtaS0+aGRtaV9jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbGNkY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYwppbmRleCA0MDRjMDNiLi4wMTlkYmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYwpAQCAtNDcwLDcgKzQ3MCw3IEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IGJwcCA9IDA7CiAJdW5zaWduZWQgbG9uZyBsZGRkc3I7Ci0JaW50IGssIG07CisJaW50IGssIG0sIHJldDsKIAogCS8qIGVuYWJsZSBjbG9ja3MgYmVmb3JlIGFjY2Vzc2luZyB0aGUgaGFyZHdhcmUgKi8KIAlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwcml2LT5jaCk7IGsrKykgewpAQCAtNTQwLDcgKzU0MCw3IEBACiAKIAkJYm9hcmRfY2ZnID0gJmNoLT5jZmcuYm9hcmRfY2ZnOwogCQlpZiAoYm9hcmRfY2ZnLT5zZXR1cF9zeXMpIHsKLQkJCWludCByZXQgPSBib2FyZF9jZmctPnNldHVwX3N5cyhib2FyZF9jZmctPmJvYXJkX2RhdGEsCisJCQlyZXQgPSBib2FyZF9jZmctPnNldHVwX3N5cyhib2FyZF9jZmctPmJvYXJkX2RhdGEsCiAJCQkJCQljaCwgJnNoX21vYmlsZV9sY2RjX3N5c19idXNfb3BzKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9tZXJhbS5jCmluZGV4IDkxNzBjODIuLmNjN2Q3MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCWljYl9vZmZzZXQgPSAweGMwMDAwMDAwIHwgKGNmZy0+Y3VycmVudF9yZWcgPDwgMjMpOwogCiAJKmljYl9hZGRyX3kgPSBpY2Jfb2Zmc2V0IHwgKGNmZy0+aWNiWzBdLm1hcmtlcl9pY2IgPDwgMjQpOwotCWlmICgoKmljYl9hZGRyX2MpICYmIGlzX252Y29sb3IoY2ZnLT5waXhlbGZvcm1hdCkpCisJaWYgKGlzX252Y29sb3IoY2ZnLT5waXhlbGZvcm1hdCkpCiAJCSppY2JfYWRkcl9jID0gaWNiX29mZnNldCB8IChjZmctPmljYlsxXS5tYXJrZXJfaWNiIDw8IDI0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zbTUwMWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYwppbmRleCA4N2YwYmUxLi42Mjk0ZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYwpAQCAtMTY2NCw3ICsxNjY0LDcgQEAKIAkJCSAgIHJlc291cmNlX3NpemUoaW5mby0+cmVnc19yZXMpKTsKIH0KIAotc3RhdGljIGludCBzbTUwMWZiX2luaXRfZmIoc3RydWN0IGZiX2luZm8gKmZiLAorc3RhdGljIGludCBfX2RldmluaXQgc201MDFmYl9pbml0X2ZiKHN0cnVjdCBmYl9pbmZvICpmYiwKIAkJCSAgIGVudW0gc201MDFfY29udHJvbGxlciBoZWFkLAogCQkJICAgY29uc3QgY2hhciAqZmJuYW1lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby91ZGxmYi5jIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCmluZGV4IDUyYjBmM2UuLjgxNmE0ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKQEAgLTEyMzMsOCArMTIzMywxMiBAQAogCQkJaWYgKGRsZmJfaXNfdmFsaWRfbW9kZSgmaW5mby0+bW9uc3BlY3MubW9kZWRiW2ldLCBpbmZvKSkKIAkJCQlmYl9hZGRfdmlkZW9tb2RlKCZpbmZvLT5tb25zcGVjcy5tb2RlZGJbaV0sCiAJCQkJCSZpbmZvLT5tb2RlbGlzdCk7Ci0JCQllbHNlIC8qIGlmIHdlJ3ZlIHJlbW92ZWQgdG9wL2Jlc3QgbW9kZSAqLwotCQkJCWluZm8tPm1vbnNwZWNzLm1pc2MgJj0gfkZCX01JU0NfMVNUX0RFVEFJTDsKKwkJCWVsc2UgeworCQkJCWlmIChpID09IDApCisJCQkJCS8qIGlmIHdlJ3ZlIHJlbW92ZWQgdG9wL2Jlc3QgbW9kZSAqLworCQkJCQlpbmZvLT5tb25zcGVjcy5taXNjCisJCQkJCQkmPSB+RkJfTUlTQ18xU1RfREVUQUlMOworCQkJfQogCQl9CiAKIAkJZGVmYXVsdF92bW9kZSA9IGZiX2ZpbmRfYmVzdF9kaXNwbGF5KCZpbmZvLT5tb25zcGVjcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCmluZGV4IGE5OWJiZTguLjUwMWIzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby92ZXNhZmIuYwpAQCAtMTc1LDYgKzE3NSw3IEBACiAKIHN0YXRpYyB2b2lkIHZlc2FmYl9kZXN0cm95KHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQogCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSwgaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCmluZGV4IDUzYjJjNWEuLjMwNWM5NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCkBAIC0xMjY1LDkgKzEyNjUsMTEgQEAKIAogc3RhdGljIHZvaWQgdmdhMTZmYl9kZXN0cm95KHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihpbmZvLT5kZXZpY2UsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAkvKiBYWFggdW5zaGFyZSBWR0EgcmVnaW9ucyAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCmluZGV4IGEyMDIxOGMuLmJlYWM1MmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKKysrIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCkBAIC0zOTUsMTAgKzM5NSw5IEBACiAJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmRpcnR5X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZpbmZvLT5yZXNpemVfbG9jayk7CiAKLQlpbmZvLT5mYiA9IHZtYWxsb2MoZmJfc2l6ZSk7CisJaW5mby0+ZmIgPSB2emFsbG9jKGZiX3NpemUpOwogCWlmIChpbmZvLT5mYiA9PSBOVUxMKQogCQlnb3RvIGVycm9yX25vbWVtOwotCW1lbXNldChpbmZvLT5mYiwgMCwgZmJfc2l6ZSk7CiAKIAlpbmZvLT5ucl9wYWdlcyA9IChmYl9zaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKaW5kZXggMGYxZGE0NS4uZTA1OGFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCkBAIC00MCw5ICs0MCw2IEBACiAJLyogV2FpdGluZyBmb3IgaG9zdCB0byBhY2sgdGhlIHBhZ2VzIHdlIHJlbGVhc2VkLiAqLwogCXN0cnVjdCBjb21wbGV0aW9uIGFja2VkOwogCi0JLyogRG8gd2UgaGF2ZSB0byB0ZWxsIEhvc3QgKmJlZm9yZSogd2UgcmV1c2UgcGFnZXM/ICovCi0JYm9vbCB0ZWxsX2hvc3RfZmlyc3Q7Ci0KIAkvKiBUaGUgcGFnZXMgd2UndmUgdG9sZCB0aGUgSG9zdCB3ZSdyZSBub3QgdXNpbmcuICovCiAJdW5zaWduZWQgaW50IG51bV9wYWdlczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBhZ2VzOwpAQCAtMTUxLDEzICsxNDgsMTQgQEAKIAkJdmItPm51bV9wYWdlcy0tOwogCX0KIAotCWlmICh2Yi0+dGVsbF9ob3N0X2ZpcnN0KSB7Ci0JCXRlbGxfaG9zdCh2YiwgdmItPmRlZmxhdGVfdnEpOwotCQlyZWxlYXNlX3BhZ2VzX2J5X3Bmbih2Yi0+cGZucywgdmItPm51bV9wZm5zKTsKLQl9IGVsc2UgewotCQlyZWxlYXNlX3BhZ2VzX2J5X3Bmbih2Yi0+cGZucywgdmItPm51bV9wZm5zKTsKLQkJdGVsbF9ob3N0KHZiLCB2Yi0+ZGVmbGF0ZV92cSk7Ci0JfQorCisJLyoKKwkgKiBOb3RlIHRoYXQgaWYKKwkgKiB2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX0JBTExPT05fRl9NVVNUX1RFTExfSE9TVCk7CisJICogaXMgdHJ1ZSwgd2UgKmhhdmUqIHRvIGRvIGl0IGluIHRoaXMgb3JkZXIKKwkgKi8KKwl0ZWxsX2hvc3QodmIsIHZiLT5kZWZsYXRlX3ZxKTsKKwlyZWxlYXNlX3BhZ2VzX2J5X3Bmbih2Yi0+cGZucywgdmItPm51bV9wZm5zKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9zdGF0KHN0cnVjdCB2aXJ0aW9fYmFsbG9vbiAqdmIsIGludCBpZHgsCkBAIC0zMjUsOSArMzIzLDYgQEAKIAkJZ290byBvdXRfZGVsX3ZxczsKIAl9CiAKLQl2Yi0+dGVsbF9ob3N0X2ZpcnN0Ci0JCT0gdmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19CQUxMT09OX0ZfTVVTVF9URUxMX0hPU1QpOwotCiAJcmV0dXJuIDA7CiAKIG91dF9kZWxfdnFzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKaW5kZXggYjAwNDNmYi4uNjhiOTEzNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYwpAQCAtODIsNiArODIsOSBAQAogCS8qIEhvc3Qgc3VwcG9ydHMgaW5kaXJlY3QgYnVmZmVycyAqLwogCWJvb2wgaW5kaXJlY3Q7CiAKKwkvKiBIb3N0IHB1Ymxpc2hlcyBhdmFpbCBldmVudCBpZHggKi8KKwlib29sIGV2ZW50OworCiAJLyogTnVtYmVyIG9mIGZyZWUgYnVmZmVycyAqLwogCXVuc2lnbmVkIGludCBudW1fZnJlZTsKIAkvKiBIZWFkIG9mIGZyZWUgYnVmZmVyIGxpc3QuICovCkBAIC0yMzcsMTggKzI0MCwyMiBAQAogdm9pZCB2aXJ0cXVldWVfa2ljayhzdHJ1Y3QgdmlydHF1ZXVlICpfdnEpCiB7CiAJc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEgPSB0b192dnEoX3ZxKTsKKwl1MTYgbmV3LCBvbGQ7CiAJU1RBUlRfVVNFKHZxKTsKIAkvKiBEZXNjcmlwdG9ycyBhbmQgYXZhaWxhYmxlIGFycmF5IG5lZWQgdG8gYmUgc2V0IGJlZm9yZSB3ZSBleHBvc2UgdGhlCiAJICogbmV3IGF2YWlsYWJsZSBhcnJheSBlbnRyaWVzLiAqLwogCXZpcnRpb193bWIoKTsKIAotCXZxLT52cmluZy5hdmFpbC0+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+YmRfd3JpdGVfaG9sZGVyID0gdHJ1ZTsKIAkJCWRpc2tfYmxvY2tfZXZlbnRzKGRpc2spOwogCQl9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9idHJmc19pbm9kZS5oIGIvZnMvYnRyZnMvYnRyZnNfaW5vZGUuaAppbmRleCA5M2IxYWE5Li41MmQ3ZWNhIDEwMDY0NAotLS0gYS9mcy9idHJmcy9idHJmc19pbm9kZS5oCisrKyBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKQEAgLTEyMSw5ICsxMjEsNiBAQAogCSAqLwogCXU2NCBpbmRleF9jbnQ7CiAKLQkvKiB0aGUgc3RhcnQgb2YgYmxvY2sgZ3JvdXAgcHJlZmVycmVkIGZvciBhbGxvY2F0aW9ucy4gKi8KLQl1NjQgYmxvY2tfZ3JvdXA7Ci0KIAkvKiB0aGUgZnN5bmMgbG9nIGhhcyBzb21lIGNvcm5lciBjYXNlcyB0aGF0IG1lYW4gd2UgaGF2ZSB0byBjaGVjawogCSAqIGRpcmVjdG9yaWVzIHRvIHNlZSBpZiBhbnkgdW5saW5rcyBoYXZlIGJlZW4gZG9uZSBiZWZvcmUKIAkgKiB0aGUgZGlyZWN0b3J5IHdhcyBsb2dnZWQuICBTZWUgdHJlZS1sb2cuYyBmb3IgYWxsIHRoZQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuYyBiL2ZzL2J0cmZzL2N0cmVlLmMKaW5kZXggYjBlMThkOS4uMmU2Njc4NiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuYworKysgYi9mcy9idHJmcy9jdHJlZS5jCkBAIC00Myw4ICs0Myw2IEBACiB7CiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJcGF0aCA9IGttZW1fY2FjaGVfemFsbG9jKGJ0cmZzX3BhdGhfY2FjaGVwLCBHRlBfTk9GUyk7Ci0JaWYgKHBhdGgpCi0JCXBhdGgtPnJlYWRhID0gMTsKIAlyZXR1cm4gcGF0aDsKIH0KIApAQCAtMTIyNCwxMSArMTIyMiwxMyBAQAogCXU2NCBzZWFyY2g7CiAJdTY0IHRhcmdldDsKIAl1NjQgbnJlYWQgPSAwOworCXU2NCBnZW47CiAJaW50IGRpcmVjdGlvbiA9IHBhdGgtPnJlYWRhOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKIAl1MzIgbnI7CiAJdTMyIGJsb2Nrc2l6ZTsKIAl1MzIgbnNjYW4gPSAwOworCWJvb2wgbWFwID0gdHJ1ZTsKIAogCWlmIChsZXZlbCAhPSAxKQogCQlyZXR1cm47CkBAIC0xMjUwLDcgKzEyNTAsMTkgQEAKIAogCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhub2RlKTsKIAluciA9IHNsb3Q7CisJaWYgKG5vZGUtPm1hcF90b2tlbiB8fCBwYXRoLT5za2lwX2xvY2tpbmcpCisJCW1hcCA9IGZhbHNlOworCiAJd2hpbGUgKDEpIHsKKwkJaWYgKG1hcCAmJiAhbm9kZS0+bWFwX3Rva2VuKSB7CisJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQobnIpOworCQkJbWFwX3ByaXZhdGVfZXh0ZW50X2J1ZmZlcihub2RlLCBvZmZzZXQsCisJCQkJCQkgIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0ciksCisJCQkJCQkgICZub2RlLT5tYXBfdG9rZW4sCisJCQkJCQkgICZub2RlLT5rYWRkciwKKwkJCQkJCSAgJm5vZGUtPm1hcF9zdGFydCwKKwkJCQkJCSAgJm5vZGUtPm1hcF9sZW4sIEtNX1VTRVIxKTsKKwkJfQogCQlpZiAoZGlyZWN0aW9uIDwgMCkgewogCQkJaWYgKG5yID09IDApCiAJCQkJYnJlYWs7CkBAIC0xMjY4LDE0ICsxMjgwLDIzIEBACiAJCXNlYXJjaCA9IGJ0cmZzX25vZGVfYmxvY2twdHIobm9kZSwgbnIpOwogCQlpZiAoKHNlYXJjaCA8PSB0YXJnZXQgJiYgdGFyZ2V0IC0gc2VhcmNoIDw9IDY1NTM2KSB8fAogCQkgICAgKHNlYXJjaCA+IHRhcmdldCAmJiBzZWFyY2ggLSB0YXJnZXQgPD0gNjU1MzYpKSB7Ci0JCQlyZWFkYWhlYWRfdHJlZV9ibG9jayhyb290LCBzZWFyY2gsIGJsb2Nrc2l6ZSwKLQkJCQkgICAgIGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24obm9kZSwgbnIpKTsKKwkJCWdlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24obm9kZSwgbnIpOworCQkJaWYgKG1hcCAmJiBub2RlLT5tYXBfdG9rZW4pIHsKKwkJCQl1bm1hcF9leHRlbnRfYnVmZmVyKG5vZGUsIG5vZGUtPm1hcF90b2tlbiwKKwkJCQkJCSAgICBLTV9VU0VSMSk7CisJCQkJbm9kZS0+bWFwX3Rva2VuID0gTlVMTDsKKwkJCX0KKwkJCXJlYWRhaGVhZF90cmVlX2Jsb2NrKHJvb3QsIHNlYXJjaCwgYmxvY2tzaXplLCBnZW4pOwogCQkJbnJlYWQgKz0gYmxvY2tzaXplOwogCQl9CiAJCW5zY2FuKys7CiAJCWlmICgobnJlYWQgPiA2NTUzNiB8fCBuc2NhbiA+IDMyKSkKIAkJCWJyZWFrOwogCX0KKwlpZiAobWFwICYmIG5vZGUtPm1hcF90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKG5vZGUsIG5vZGUtPm1hcF90b2tlbiwgS01fVVNFUjEpOworCQlub2RlLT5tYXBfdG9rZW4gPSBOVUxMOworCX0KIH0KIAogLyoKQEAgLTE2NDgsOSArMTY2OSw2IEBACiAJCX0KIGNvd19kb25lOgogCQlCVUdfT04oIWNvdyAmJiBpbnNfbGVuKTsKLQkJaWYgKGxldmVsICE9IGJ0cmZzX2hlYWRlcl9sZXZlbChiKSkKLQkJCVdBUk5fT04oMSk7Ci0JCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGIpOwogCiAJCXAtPm5vZGVzW2xldmVsXSA9IGI7CiAJCWlmICghcC0+c2tpcF9sb2NraW5nKQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuaCBiL2ZzL2J0cmZzL2N0cmVlLmgKaW5kZXggNmMwOTNmYTkuLjNiODU5YTMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmgKKysrIGIvZnMvYnRyZnMvY3RyZWUuaApAQCAtMTksNyArMTksNiBAQAogI2lmbmRlZiBfX0JUUkZTX0NUUkVFX18KICNkZWZpbmUgX19CVFJGU19DVFJFRV9fCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTkzMCw3ICs5MjksNiBAQAogCSAqIGlzIHJlcXVpcmVkIGluc3RlYWQgb2YgdGhlIGZhc3RlciBzaG9ydCBmc3luYyBsb2cgY29tbWl0cwogCSAqLwogCXU2NCBsYXN0X3RyYW5zX2xvZ19mdWxsX2NvbW1pdDsKLQl1NjQgb3Blbl9pb2N0bF90cmFuczsKIAl1bnNpZ25lZCBsb25nIG1vdW50X29wdDoyMDsKIAl1bnNpZ25lZCBsb25nIGNvbXByZXNzX3R5cGU6NDsKIAl1NjQgbWF4X2lubGluZTsKQEAgLTk0Nyw3ICs5NDUsNiBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJc3RydWN0IGlub2RlICpidHJlZV9pbm9kZTsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBiZGk7Ci0Jc3RydWN0IG11dGV4IHRyYW5zX211dGV4OwogCXN0cnVjdCBtdXRleCB0cmVlX2xvZ19tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggdHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggY2xlYW5lcl9tdXRleDsKQEAgLTk2OCw2ICs5NjUsMTMgQEAKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIHN1YnZvbF9zZW07CiAJc3RydWN0IHNyY3Vfc3RydWN0IHN1YnZvbF9zcmN1OwogCisJc3BpbmxvY2tfdCB0cmFuc19sb2NrOworCS8qCisJICogdGhlIHJlbG9jIG11dGV4IGdvZXMgd2l0aCB0aGUgdHJhbnMgbG9jaywgaXQgaXMgdGFrZW4KKwkgKiBkdXJpbmcgY29tbWl0IHRvIHByb3RlY3QgdXMgZnJvbSB0aGUgcmVsb2NhdGlvbiBjb2RlCisJICovCisJc3RydWN0IG11dGV4IHJlbG9jX211dGV4OworCiAJc3RydWN0IGxpc3RfaGVhZCB0cmFuc19saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgaGFzaGVyczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRlYWRfcm9vdHM7CkBAIC05ODAsNiArOTg0LDcgQEAKIAlhdG9taWNfdCBhc3luY19zdWJtaXRfZHJhaW5pbmc7CiAJYXRvbWljX3QgbnJfYXN5bmNfYmlvczsKIAlhdG9taWNfdCBhc3luY19kZWxhbGxvY19wYWdlczsKKwlhdG9taWNfdCBvcGVuX2lvY3RsX3RyYW5zOwogCiAJLyoKIAkgKiB0aGlzIGlzIHVzZWQgYnkgdGhlIGJhbGFuY2luZyBjb2RlIHRvIHdhaXQgZm9yIGFsbCB0aGUgcGVuZGluZwpAQCAtMTA0NCw2ICsxMDQ5LDcgQEAKIAlpbnQgY2xvc2luZzsKIAlpbnQgbG9nX3Jvb3RfcmVjb3ZlcmluZzsKIAlpbnQgZW5vc3BjX3VubGluazsKKwlpbnQgdHJhbnNfbm9fam9pbjsKIAogCXU2NCB0b3RhbF9waW5uZWQ7CiAKQEAgLTEwNjUsNyArMTA3MSw2IEBACiAJc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJlbG9jX2N0bDsKIAogCXNwaW5sb2NrX3QgZGVsYWxsb2NfbG9jazsKLQlzcGlubG9ja190IG5ld190cmFuc19sb2NrOwogCXU2NCBkZWxhbGxvY19ieXRlczsKIAogCS8qIGRhdGFfYWxsb2NfY2x1c3RlciBpcyBvbmx5IHVzZWQgaW4gc3NkIG1vZGUgKi8KQEAgLTExNzIsNiArMTE3NywxNCBAQAogCXUzMiB0eXBlOwogCiAJdTY0IGhpZ2hlc3Rfb2JqZWN0aWQ7CisKKwkvKiBidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyBpcyBhIG11bHRpLXN0ZXAgcHJvY2VzcywKKwkgKiBhbmQgaXQgY2FuIHJhY2Ugd2l0aCB0aGUgYmFsYW5jaW5nIGNvZGUuICAgQnV0IHRoZQorCSAqIHJhY2UgaXMgdmVyeSBzbWFsbCwgYW5kIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhlIHJvb3QKKwkgKiBpcyBhZGRlZCB0byBlYWNoIHRyYW5zYWN0aW9uLiAgU28gaW5fdHJhbnNfc2V0dXAKKwkgKiBpcyB1c2VkIHRvIHRlbGwgdXMgd2hlbiBtb3JlIGNoZWNrcyBhcmUgcmVxdWlyZWQKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGluX3RyYW5zX3NldHVwOwogCWludCByZWZfY293czsKIAlpbnQgdHJhY2tfZGlydHk7CiAJaW50IGluX3JhZGl4OwpAQCAtMTE4MSw3ICsxMTk0LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGRlZnJhZ19tYXg7CiAJaW50IGRlZnJhZ19ydW5uaW5nOwogCWNoYXIgKm5hbWU7Ci0JaW50IGluX3N5c2ZzOwogCiAJLyogdGhlIGRpcnR5IGxpc3QgaXMgb25seSB1c2VkIGJ5IG5vbi1yZWZlcmVuY2UgY291bnRlZCByb290cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZGlydHlfbGlzdDsKQEAgLTEzMjMsNiArMTMzNSwxMSBAQAogICovCiAjZGVmaW5lIEJUUkZTX1NUUklOR19JVEVNX0tFWQkyNTMKIAorLyoKKyAqIEZsYWdzIGZvciBtb3VudCBvcHRpb25zLgorICoKKyAqIE5vdGU6IGRvbid0IGZvcmdldCB0byBhZGQgbmV3IG9wdGlvbnMgdG8gYnRyZnNfc2hvd19vcHRpb25zKCkKKyAqLwogI2RlZmluZSBCVFJGU19NT1VOVF9OT0RBVEFTVU0JCSgxIDw8IDApCiAjZGVmaW5lIEJUUkZTX01PVU5UX05PREFUQUNPVwkJKDEgPDwgMSkKICNkZWZpbmUgQlRSRlNfTU9VTlRfTk9CQVJSSUVSCQkoMSA8PCAyKQpAQCAtMTM0MCw2ICsxMzU3LDcgQEAKICNkZWZpbmUgQlRSRlNfTU9VTlRfVVNFUl9TVUJWT0xfUk1fQUxMT1dFRCAoMSA8PCAxNCkKICNkZWZpbmUgQlRSRlNfTU9VTlRfRU5PU1BDX0RFQlVHCSAoMSA8PCAxNSkKICNkZWZpbmUgQlRSRlNfTU9VTlRfQVVUT19ERUZSQUcJCSgxIDw8IDE2KQorI2RlZmluZSBCVFJGU19NT1VOVF9JTk9ERV9NQVBfQ0FDSEUJKDEgPDwgMTcpCiAKICNkZWZpbmUgYnRyZnNfY2xlYXJfb3B0KG8sIG9wdCkJCSgobykgJj0gfkJUUkZTX01PVU5UXyMjb3B0KQogI2RlZmluZSBidHJmc19zZXRfb3B0KG8sIG9wdCkJCSgobykgfD0gQlRSRlNfTU9VTlRfIyNvcHQpCkBAIC0yMjM4LDYgKzIyNTYsOSBAQAogdm9pZCBidHJmc19ibG9ja19yc3ZfcmVsZWFzZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAogCQkJICAgICB1NjQgbnVtX2J5dGVzKTsKK2ludCBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2KTsKIGludCBidHJmc19zZXRfYmxvY2tfZ3JvdXBfcm8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkgICAgIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpOwogaW50IGJ0cmZzX3NldF9ibG9ja19ncm91cF9ydyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKQEAgLTIzNTAsNiArMjM3MSwxNSBAQAogCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSwKIAkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQpOworc3RhdGljIGlubGluZSBpbnQgYnRyZnNfZnNfY2xvc2luZyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbykKK3sKKwkvKgorCSAqIEdldCBzeW5jZWQgd2l0aCBjbG9zZV9jdHJlZSgpCisJICovCisJc21wX21iKCk7CisJcmV0dXJuIGZzX2luZm8tPmNsb3Npbmc7Cit9CisKIC8qIHJvb3QtaXRlbS5jICovCiBpbnQgYnRyZnNfZmluZF9yb290X3JlZihzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAogCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCkBAIC0yNTEyLDggKzI1NDIsNyBAQAogaW50IGJ0cmZzX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCSAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwogaW50IGJ0cmZzX2NyZWF0ZV9zdWJ2b2xfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290LAotCQkJICAgICB1NjQgbmV3X2RpcmlkLCB1NjQgYWxsb2NfaGludCk7CisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCwgdTY0IG5ld19kaXJpZCk7CiBpbnQgYnRyZnNfbWVyZ2VfYmlvX2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJIHNpemVfdCBzaXplLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCmluZGV4IDAxZTI5NTAuLjk4YzY4ZTYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYworKysgYi9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKQEAgLTgyLDYgKzgyLDM5IEBACiAJcmV0dXJuIHJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfcm9vdDsKIH0KIAorc3RhdGljIHN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmJ0cmZzX2dldF9kZWxheWVkX25vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfaW5vZGUgKmJ0cmZzX2lub2RlID0gQlRSRlNfSShpbm9kZSk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBidHJmc19pbm9kZS0+cm9vdDsKKwl1NjQgaW5vID0gYnRyZnNfaW5vKGlub2RlKTsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpub2RlOworCisJbm9kZSA9IEFDQ0VTU19PTkNFKGJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUpOworCWlmIChub2RlKSB7CisJCWF0b21pY19pbmMoJm5vZGUtPnJlZnMpOworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOworCW5vZGUgPSByYWRpeF90cmVlX2xvb2t1cCgmcm9vdC0+ZGVsYXllZF9ub2Rlc190cmVlLCBpbm8pOworCWlmIChub2RlKSB7CisJCWlmIChidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKSB7CisJCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCisJCQlCVUdfT04oYnRyZnNfaW5vZGUtPmRlbGF5ZWRfbm9kZSAhPSBub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKwkJCXJldHVybiBub2RlOworCQl9CisJCWJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUgPSBub2RlOworCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCisJCWF0b21pY19pbmMoJm5vZGUtPnJlZnMpOwkvKiBjYWNoZWQgaW4gdGhlIGlub2RlICovCisJCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKwkJcmV0dXJuIG5vZGU7CisJfQorCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqYnRyZnNfZ2V0X29yX2NyZWF0ZV9kZWxheWVkX25vZGUoCiAJCQkJCQkJc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTkyLDI2ICsxMjUsOSBAQAogCWludCByZXQ7CiAKIGFnYWluOgotCW5vZGUgPSBBQ0NFU1NfT05DRShidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKTsKLQlpZiAobm9kZSkgewotCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCisJbm9kZSA9IGJ0cmZzX2dldF9kZWxheWVkX25vZGUoaW5vZGUpOworCWlmIChub2RlKQogCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOwotCW5vZGUgPSByYWRpeF90cmVlX2xvb2t1cCgmcm9vdC0+ZGVsYXllZF9ub2Rlc190cmVlLCBpbm8pOwotCWlmIChub2RlKSB7Ci0JCWlmIChidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKSB7Ci0JCQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7Ci0JCQlnb3RvIGFnYWluOwotCQl9Ci0JCWJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUgPSBub2RlOwotCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCi0JCWF0b21pY19pbmMoJm5vZGUtPnJlZnMpOwkvKiBjYWNoZWQgaW4gdGhlIGlub2RlICovCi0JCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKIAogCW5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGRlbGF5ZWRfbm9kZV9jYWNoZSwgR0ZQX05PRlMpOwogCWlmICghbm9kZSkKQEAgLTI5Nyw3ICszMTMsNiBAQAogCQlpdGVtLT5kYXRhX2xlbiA9IGRhdGFfbGVuOwogCQlpdGVtLT5pbnNfb3JfZGVsID0gMDsKIAkJaXRlbS0+Ynl0ZXNfcmVzZXJ2ZWQgPSAwOwotCQlpdGVtLT5ibG9ja19yc3YgPSBOVUxMOwogCQlpdGVtLT5kZWxheWVkX25vZGUgPSBOVUxMOwogCQlhdG9taWNfc2V0KCZpdGVtLT5yZWZzLCAxKTsKIAl9CkBAIC01NDksMTkgKzU2NCw2IEBACiAJcmV0dXJuIG5leHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqYnRyZnNfZ2V0X2RlbGF5ZWRfbm9kZSgKLQkJCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBidHJmc19pbm9kZSAqYnRyZnNfaW5vZGUgPSBCVFJGU19JKGlub2RlKTsKLQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGU7Ci0KLQlkZWxheWVkX25vZGUgPSBidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlOwotCWlmIChkZWxheWVkX25vZGUpCi0JCWF0b21pY19pbmMoJmRlbGF5ZWRfbm9kZS0+cmVmcyk7Ci0KLQlyZXR1cm4gZGVsYXllZF9ub2RlOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc19yb290ICpidHJmc19nZXRfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJCSAgIHU2NCByb290X2lkKQogewpAQCAtNTkzLDEwICs1OTUsOCBAQAogCiAJbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKHNyY19yc3YsIGRzdF9yc3YsIG51bV9ieXRlcyk7Ci0JaWYgKCFyZXQpIHsKKwlpZiAoIXJldCkKIAkJaXRlbS0+Ynl0ZXNfcmVzZXJ2ZWQgPSBudW1fYnl0ZXM7Ci0JCWl0ZW0tPmJsb2NrX3JzdiA9IGRzdF9yc3Y7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTYwNCwxMCArNjA0LDEzIEBACiBzdGF0aWMgdm9pZCBidHJmc19kZWxheWVkX2l0ZW1fcmVsZWFzZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX2l0ZW0gKml0ZW0pCiB7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2OworCiAJaWYgKCFpdGVtLT5ieXRlc19yZXNlcnZlZCkKIAkJcmV0dXJuOwogCi0JYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgaXRlbS0+YmxvY2tfcnN2LAorCXJzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIHJzdiwKIAkJCQlpdGVtLT5ieXRlc19yZXNlcnZlZCk7CiB9CiAKQEAgLTY3OCw2ICs2ODEsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZoZWFkKTsKIAogCW5leHQgPSBpdGVtOworCW5pdGVtcyA9IDA7CiAKIAkvKgogCSAqIGNvdW50IHRoZSBudW1iZXIgb2YgdGhlIGNvbnRpbnVvdXMgaXRlbXMgdGhhdCB3ZSBjYW4gaW5zZXJ0IGluIGJhdGNoCkBAIC0xMDEzLDYgKzEwMTcsNyBAQAogCXN0cnVjdCBidHJmc19kZWxheWVkX3Jvb3QgKmRlbGF5ZWRfcm9vdDsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpjdXJyX25vZGUsICpwcmV2X25vZGU7CiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwogCWludCByZXQgPSAwOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKQEAgLTEwMjAsNiArMTAyNSw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIAorCWJsb2NrX3JzdiA9IHRyYW5zLT5ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCiAJZGVsYXllZF9yb290ID0gYnRyZnNfZ2V0X2RlbGF5ZWRfcm9vdChyb290KTsKIAogCWN1cnJfbm9kZSA9IGJ0cmZzX2ZpcnN0X2RlbGF5ZWRfbm9kZShkZWxheWVkX3Jvb3QpOwpAQCAtMTA0NCw2ICsxMDUyLDcgQEAKIAl9CiAKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJdHJhbnMtPmJsb2NrX3JzdiA9IGJsb2NrX3JzdjsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDUxLDYgKzEwNjAsNyBAQAogCQkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpub2RlKQogewogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKIAlpbnQgcmV0OwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKQEAgLTEwNTgsNiArMTA2OCw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIAorCWJsb2NrX3JzdiA9IHRyYW5zLT5ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZub2RlLT5yb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCiAJcmV0ID0gYnRyZnNfaW5zZXJ0X2RlbGF5ZWRfaXRlbXModHJhbnMsIHBhdGgsIG5vZGUtPnJvb3QsIG5vZGUpOwogCWlmICghcmV0KQogCQlyZXQgPSBidHJmc19kZWxldGVfZGVsYXllZF9pdGVtcyh0cmFucywgcGF0aCwgbm9kZS0+cm9vdCwgbm9kZSk7CkBAIC0xMDY1LDYgKzEwNzgsNyBAQAogCQlyZXQgPSBidHJmc191cGRhdGVfZGVsYXllZF9pbm9kZSh0cmFucywgbm9kZS0+cm9vdCwgcGF0aCwgbm9kZSk7CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCisJdHJhbnMtPmJsb2NrX3JzdiA9IGJsb2NrX3JzdjsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTE1LDYgKzExMjksNyBAQAogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmRlbGF5ZWRfbm9kZSA9IE5VTEw7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwogCXVuc2lnbmVkIGxvbmcgbnIgPSAwOwogCWludCBuZWVkX3JlcXVldWUgPSAwOwogCWludCByZXQ7CkBAIC0xMTI5LDEwICsxMTQ0LDEzIEBACiAJZGVsYXllZF9ub2RlID0gYXN5bmNfbm9kZS0+ZGVsYXllZF9ub2RlOwogCXJvb3QgPSBkZWxheWVkX25vZGUtPnJvb3Q7CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQlnb3RvIGZyZWVfcGF0aDsKIAorCWJsb2NrX3JzdiA9IHRyYW5zLT5ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCiAJcmV0ID0gYnRyZnNfaW5zZXJ0X2RlbGF5ZWRfaXRlbXModHJhbnMsIHBhdGgsIHJvb3QsIGRlbGF5ZWRfbm9kZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IGJ0cmZzX2RlbGV0ZV9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCByb290LApAQCAtMTE3NSw2ICsxMTkzLDcgQEAKIAogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCisJdHJhbnMtPmJsb2NrX3JzdiA9IGJsb2NrX3JzdjsKIAlidHJmc19lbmRfdHJhbnNhY3Rpb25fZG1ldGEodHJhbnMsIHJvb3QpOwogCV9fYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CiBmcmVlX3BhdGg6CkBAIC0xMjIxLDYgKzEyNDAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBidHJmc19hc3NlcnRfZGVsYXllZF9yb290X2VtcHR5KHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19kZWxheWVkX3Jvb3QgKmRlbGF5ZWRfcm9vdDsKKwlkZWxheWVkX3Jvb3QgPSBidHJmc19nZXRfZGVsYXllZF9yb290KHJvb3QpOworCVdBUk5fT04oYnRyZnNfZmlyc3RfZGVsYXllZF9ub2RlKGRlbGF5ZWRfcm9vdCkpOworfQorCiB2b2lkIGJ0cmZzX2JhbGFuY2VfZGVsYXllZF9pdGVtcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3Q7CkBAIC0xMzgxLDggKzE0MDcsNyBAQAogCiBpbnQgYnRyZnNfaW5vZGVfZGVsYXllZF9kaXJfaW5kZXhfY291bnQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGUgPSBCVFJGU19JKGlub2RlKS0+ZGVsYXllZF9ub2RlOwotCWludCByZXQgPSAwOworCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmRlbGF5ZWRfbm9kZSA9IGJ0cmZzX2dldF9kZWxheWVkX25vZGUoaW5vZGUpOwogCiAJaWYgKCFkZWxheWVkX25vZGUpCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTM5MiwxMSArMTQxNywxNCBAQAogCSAqIGEgbmV3IGRpcmVjdG9yeSBpbmRleCBpcyBhZGRlZCBpbnRvIHRoZSBkZWxheWVkIG5vZGUgYW5kIGluZGV4X2NudAogCSAqIGlzIHVwZGF0ZWQgbm93LiBTbyB3ZSBuZWVkbid0IGxvY2sgdGhlIGRlbGF5ZWQgbm9kZS4KIAkgKi8KLQlpZiAoIWRlbGF5ZWRfbm9kZS0+aW5kZXhfY250KQorCWlmICghZGVsYXllZF9ub2RlLT5pbmRleF9jbnQpIHsKKwkJYnRyZnNfcmVsZWFzZV9kZWxheWVkX25vZGUoZGVsYXllZF9ub2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJQlRSRlNfSShpbm9kZSktPmluZGV4X2NudCA9IGRlbGF5ZWRfbm9kZS0+aW5kZXhfY250OwotCXJldHVybiByZXQ7CisJYnRyZnNfcmVsZWFzZV9kZWxheWVkX25vZGUoZGVsYXllZF9ub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBidHJmc19nZXRfZGVsYXllZF9pdGVtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbGlzdF9oZWFkICppbnNfbGlzdCwKQEAgLTE1NzIsOCArMTYwMCw3IEBACiAJYnRyZnNfc2V0X3N0YWNrX2lub2RlX3RyYW5zaWQoaW5vZGVfaXRlbSwgdHJhbnMtPnRyYW5zaWQpOwogCWJ0cmZzX3NldF9zdGFja19pbm9kZV9yZGV2KGlub2RlX2l0ZW0sIGlub2RlLT5pX3JkZXYpOwogCWJ0cmZzX3NldF9zdGFja19pbm9kZV9mbGFncyhpbm9kZV9pdGVtLCBCVFJGU19JKGlub2RlKS0+ZmxhZ3MpOwotCWJ0cmZzX3NldF9zdGFja19pbm9kZV9ibG9ja19ncm91cChpbm9kZV9pdGVtLAotCQkJCQkgIEJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCk7CisJYnRyZnNfc2V0X3N0YWNrX2lub2RlX2Jsb2NrX2dyb3VwKGlub2RlX2l0ZW0sIDApOwogCiAJYnRyZnNfc2V0X3N0YWNrX3RpbWVzcGVjX3NlYyhidHJmc19pbm9kZV9hdGltZShpbm9kZV9pdGVtKSwKIAkJCQkgICAgIGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CkBAIC0xNTkxLDExICsxNjE4LDYyIEBACiAJCQkJICAgICAgaW5vZGUtPmlfY3RpbWUudHZfbnNlYyk7CiB9CiAKK2ludCBidHJmc19maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqcmRldikKK3sKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGU7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJc3RydWN0IGJ0cmZzX3RpbWVzcGVjICp0c3BlYzsKKworCWRlbGF5ZWRfbm9kZSA9IGJ0cmZzX2dldF9kZWxheWVkX25vZGUoaW5vZGUpOworCWlmICghZGVsYXllZF9ub2RlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW11dGV4X2xvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOworCWlmICghZGVsYXllZF9ub2RlLT5pbm9kZV9kaXJ0eSkgeworCQltdXRleF91bmxvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOworCQlidHJmc19yZWxlYXNlX2RlbGF5ZWRfbm9kZShkZWxheWVkX25vZGUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpbm9kZV9pdGVtID0gJmRlbGF5ZWRfbm9kZS0+aW5vZGVfaXRlbTsKKworCWlub2RlLT5pX3VpZCA9IGJ0cmZzX3N0YWNrX2lub2RlX3VpZChpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9naWQgPSBidHJmc19zdGFja19pbm9kZV9naWQoaW5vZGVfaXRlbSk7CisJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCBidHJmc19zdGFja19pbm9kZV9zaXplKGlub2RlX2l0ZW0pKTsKKwlpbm9kZS0+aV9tb2RlID0gYnRyZnNfc3RhY2tfaW5vZGVfbW9kZShpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9ubGluayA9IGJ0cmZzX3N0YWNrX2lub2RlX25saW5rKGlub2RlX2l0ZW0pOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfbmJ5dGVzKGlub2RlX2l0ZW0pKTsKKwlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IGJ0cmZzX3N0YWNrX2lub2RlX2dlbmVyYXRpb24oaW5vZGVfaXRlbSk7CisJQlRSRlNfSShpbm9kZSktPnNlcXVlbmNlID0gYnRyZnNfc3RhY2tfaW5vZGVfc2VxdWVuY2UoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfcmRldiA9IDA7CisJKnJkZXYgPSBidHJmc19zdGFja19pbm9kZV9yZGV2KGlub2RlX2l0ZW0pOworCUJUUkZTX0koaW5vZGUpLT5mbGFncyA9IGJ0cmZzX3N0YWNrX2lub2RlX2ZsYWdzKGlub2RlX2l0ZW0pOworCisJdHNwZWMgPSBidHJmc19pbm9kZV9hdGltZShpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBidHJmc19zdGFja190aW1lc3BlY19zZWModHNwZWMpOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBidHJmc19zdGFja190aW1lc3BlY19uc2VjKHRzcGVjKTsKKworCXRzcGVjID0gYnRyZnNfaW5vZGVfbXRpbWUoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gYnRyZnNfc3RhY2tfdGltZXNwZWNfc2VjKHRzcGVjKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gYnRyZnNfc3RhY2tfdGltZXNwZWNfbnNlYyh0c3BlYyk7CisKKwl0c3BlYyA9IGJ0cmZzX2lub2RlX2N0aW1lKGlub2RlX2l0ZW0pOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGJ0cmZzX3N0YWNrX3RpbWVzcGVjX3NlYyh0c3BlYyk7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGJ0cmZzX3N0YWNrX3RpbWVzcGVjX25zZWModHNwZWMpOworCisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IEJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uOworCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAodTY0KS0xOworCisJbXV0ZXhfdW5sb2NrKCZkZWxheWVkX25vZGUtPm11dGV4KTsKKwlidHJmc19yZWxlYXNlX2RlbGF5ZWRfbm9kZShkZWxheWVkX25vZGUpOworCXJldHVybiAwOworfQorCiBpbnQgYnRyZnNfZGVsYXllZF91cGRhdGVfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlkZWxheWVkX25vZGUgPSBidHJmc19nZXRfb3JfY3JlYXRlX2RlbGF5ZWRfbm9kZShpbm9kZSk7CiAJaWYgKElTX0VSUihkZWxheWVkX25vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5oIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5oCmluZGV4IGViN2QyNDAuLjhkMjdhZjQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuaAorKysgYi9mcy9idHJmcy9kZWxheWVkLWlub2RlLmgKQEAgLTc1LDcgKzc1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHRyZWVfbGlzdDsJLyogdXNlZCBmb3IgYmF0Y2ggaW5zZXJ0L2RlbGV0ZSBpdGVtcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcmVhZGRpcl9saXN0OwkvKiB1c2VkIGZvciByZWFkZGlyIGl0ZW1zICovCiAJdTY0IGJ5dGVzX3Jlc2VydmVkOwotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGU7CiAJYXRvbWljX3QgcmVmczsKIAlpbnQgaW5zX29yX2RlbDsKQEAgLTEyMCw2ICsxMTksNyBAQAogCiBpbnQgYnRyZnNfZGVsYXllZF91cGRhdGVfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IGJ0cmZzX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdTMyICpyZGV2KTsKIAogLyogVXNlZCBmb3IgZHJvcCBkZWFkIHJvb3QgKi8KIHZvaWQgYnRyZnNfa2lsbF9hbGxfZGVsYXllZF9ub2RlcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CkBAIC0xMzgsNCArMTM4LDggQEAKIC8qIGZvciBpbml0ICovCiBpbnQgX19pbml0IGJ0cmZzX2RlbGF5ZWRfaW5vZGVfaW5pdCh2b2lkKTsKIHZvaWQgYnRyZnNfZGVsYXllZF9pbm9kZV9leGl0KHZvaWQpOworCisvKiBmb3IgZGVidWdnaW5nICovCit2b2lkIGJ0cmZzX2Fzc2VydF9kZWxheWVkX3Jvb3RfZW1wdHkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uYyBiL2ZzL2J0cmZzL2Rpc2staW8uYwppbmRleCA5OGI2YTcxLi4xYWM4ZGI1ZCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlzay1pby5jCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uYwpAQCAtMTA0NCw3ICsxMDQ0LDYgQEAKIAlyb290LT5sYXN0X3RyYW5zID0gMDsKIAlyb290LT5oaWdoZXN0X29iamVjdGlkID0gMDsKIAlyb290LT5uYW1lID0gTlVMTDsKLQlyb290LT5pbl9zeXNmcyA9IDA7CiAJcm9vdC0+aW5vZGVfdHJlZSA9IFJCX1JPT1Q7CiAJSU5JVF9SQURJWF9UUkVFKCZyb290LT5kZWxheWVkX25vZGVzX3RyZWUsIEdGUF9BVE9NSUMpOwogCXJvb3QtPmJsb2NrX3JzdiA9IE5VTEw7CkBAIC0xMzAwLDE5ICsxMjk5LDIxIEBACiAJCXJldHVybiByb290OwogCiAJcm9vdC0+ZnJlZV9pbm9fY3RsID0ga3phbGxvYyhzaXplb2YoKnJvb3QtPmZyZWVfaW5vX2N0bCksIEdGUF9OT0ZTKTsKLQlpZiAoIXJvb3QtPmZyZWVfaW5vX2N0bCkKLQkJZ290byBmYWlsOwogCXJvb3QtPmZyZWVfaW5vX3Bpbm5lZCA9IGt6YWxsb2Moc2l6ZW9mKCpyb290LT5mcmVlX2lub19waW5uZWQpLAogCQkJCQlHRlBfTk9GUyk7Ci0JaWYgKCFyb290LT5mcmVlX2lub19waW5uZWQpCisJaWYgKCFyb290LT5mcmVlX2lub19waW5uZWQgfHwgIXJvb3QtPmZyZWVfaW5vX2N0bCkgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CisJfQogCiAJYnRyZnNfaW5pdF9mcmVlX2lub19jdGwocm9vdCk7CiAJbXV0ZXhfaW5pdCgmcm9vdC0+ZnNfY29tbWl0X211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmcm9vdC0+Y2FjaGVfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcm9vdC0+Y2FjaGVfd2FpdCk7CiAKLQlzZXRfYW5vbl9zdXBlcigmcm9vdC0+YW5vbl9zdXBlciwgTlVMTCk7CisJcmV0ID0gc2V0X2Fub25fc3VwZXIoJnJvb3QtPmFub25fc3VwZXIsIE5VTEwpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKIAogCWlmIChidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCkgewogCQlyZXQgPSAtRU5PRU5UOwpAQCAtMTUwNSwyNCArMTUwNiwyNCBAQAogCQl2ZnNfY2hlY2tfZnJvemVuKHJvb3QtPmZzX2luZm8tPnNiLCBTQl9GUkVFWkVfV1JJVEUpOwogCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkX211dGV4KTsKIAotCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJY3VyID0gcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbjsKIAkJaWYgKCFjdXIpIHsKLQkJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJCQlnb3RvIHNsZWVwOwogCQl9CiAKIAkJbm93ID0gZ2V0X3NlY29uZHMoKTsKIAkJaWYgKCFjdXItPmJsb2NrZWQgJiYKIAkJICAgIChub3cgPCBjdXItPnN0YXJ0X3RpbWUgfHwgbm93IC0gY3VyLT5zdGFydF90aW1lIDwgMzApKSB7Ci0JCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQkJZGVsYXkgPSBIWiAqIDU7CiAJCQlnb3RvIHNsZWVwOwogCQl9CiAJCXRyYW5zaWQgPSBjdXItPnRyYW5zaWQ7Ci0JCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJQlVHX09OKElTX0VSUih0cmFucykpOwogCQlpZiAodHJhbnNpZCA9PSB0cmFucy0+dHJhbnNpZCkgewogCQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKQEAgLTE2MTMsMTEgKzE2MTQsMTIgQEAKIAlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+b3JkZXJlZF9vcGVyYXRpb25zKTsKIAlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+Y2FjaGluZ19ibG9ja19ncm91cHMpOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT50cmFuc19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+cmVmX2NhY2hlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+ZGVsYXllZF9pcHV0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5kZWZyYWdfaW5vZGVzX2xvY2spOworCW11dGV4X2luaXQoJmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAogCWluaXRfY29tcGxldGlvbigmZnNfaW5mby0+a29ial91bnJlZ2lzdGVyKTsKIAlmc19pbmZvLT50cmVlX3Jvb3QgPSB0cmVlX3Jvb3Q7CkBAIC0xNjQ1LDYgKzE2NDcsNyBAQAogCWZzX2luZm8tPm1heF9pbmxpbmUgPSA4MTkyICogMTAyNDsKIAlmc19pbmZvLT5tZXRhZGF0YV9yYXRpbyA9IDA7CiAJZnNfaW5mby0+ZGVmcmFnX2lub2RlcyA9IFJCX1JPT1Q7CisJZnNfaW5mby0+dHJhbnNfbm9fam9pbiA9IDA7CiAKIAlmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplID0gbWluX3QodW5zaWduZWQgbG9uZywKIAkJCQkJICBudW1fb25saW5lX2NwdXMoKSArIDIsIDgpOwpAQCAtMTY2Nyw4ICsxNjcwLDYgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0KTsKIAlpbml0X3J3c2VtKCZmc19pbmZvLT5zY3J1Yl9zdXBlcl9sb2NrKTsKIAlmc19pbmZvLT5zY3J1Yl93b3JrZXJzX3JlZmNudCA9IDA7Ci0JYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5zY3J1Yl93b3JrZXJzLCAic2NydWIiLAotCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSwgJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAogCXNiLT5zX2Jsb2Nrc2l6ZSA9IDQwOTY7CiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBibGtzaXplX2JpdHMoNDA5Nik7CkBAIC0xNzA5LDcgKzE3MTAsNiBAQAogCWZzX2luZm8tPmRvX2JhcnJpZXJzID0gMTsKIAogCi0JbXV0ZXhfaW5pdCgmZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCW11dGV4X2luaXQoJmZzX2luZm8tPm9yZGVyZWRfb3BlcmF0aW9uc19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOwogCW11dGV4X2luaXQoJmZzX2luZm8tPmNodW5rX211dGV4KTsKQEAgLTI0NzksMTMgKzI0NzksMTMgQEAKIAlkb3duX3dyaXRlKCZyb290LT5mc19pbmZvLT5jbGVhbnVwX3dvcmtfc2VtKTsKIAl1cF93cml0ZSgmcm9vdC0+ZnNfaW5mby0+Y2xlYW51cF93b3JrX3NlbSk7CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAlCVUdfT04ocmV0KTsKIAkvKiBydW4gY29tbWl0IGFnYWluIHRvIGRyb3AgdGhlIG9yaWdpbmFsIHNuYXBzaG90ICovCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0yOTExLDkgKzI5MTEsOCBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnNwbGljZSk7CiAKLQlsaXN0X3NwbGljZV9pbml0KCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19pbm9kZXMsICZzcGxpY2UpOwotCiAJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKKwlsaXN0X3NwbGljZV9pbml0KCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19pbm9kZXMsICZzcGxpY2UpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZzcGxpY2UpKSB7CiAJCWJ0cmZzX2lub2RlID0gbGlzdF9lbnRyeShzcGxpY2UubmV4dCwgc3RydWN0IGJ0cmZzX2lub2RlLApAQCAtMzAyNCwxMCArMzAyMywxMyBAQAogCiAJV0FSTl9PTigxKTsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkX211dGV4KTsKIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCwgJmxpc3QpOworCXJvb3QtPmZzX2luZm8tPnRyYW5zX25vX2pvaW4gPSAxOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwogCXdoaWxlICghbGlzdF9lbXB0eSgmbGlzdCkpIHsKIAkJdCA9IGxpc3RfZW50cnkobGlzdC5uZXh0LCBzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24sIGxpc3QpOwogCQlpZiAoIXQpCkBAIC0zMDUyLDIzICszMDU0LDE4IEBACiAJCXQtPmJsb2NrZWQgPSAwOwogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCkpCiAJCQl3YWtlX3VwKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0KTsKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKLQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQl0LT5jb21taXRfZG9uZSA9IDE7CiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0LT5jb21taXRfd2FpdCkpCiAJCQl3YWtlX3VwKCZ0LT5jb21taXRfd2FpdCk7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCi0JCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAogCQlidHJmc19kZXN0cm95X3BlbmRpbmdfc25hcHNob3RzKHQpOwogCiAJCWJ0cmZzX2Rlc3Ryb3lfZGVsYWxsb2NfaW5vZGVzKHJvb3QpOwogCi0JCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQlyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCiAJCWJ0cmZzX2Rlc3Ryb3lfbWFya2VkX2V4dGVudHMocm9vdCwgJnQtPmRpcnR5X3BhZ2VzLAogCQkJCQkgICAgIEVYVEVOVF9ESVJUWSk7CkBAIC0zMDgyLDggKzMwNzksMTAgQEAKIAkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX3RyYW5zYWN0aW9uX2NhY2hlcCwgdCk7CiAJfQogCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwlyb290LT5mc19pbmZvLT50cmFuc19ub19qb2luID0gMDsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkX211dGV4KTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKaW5kZXggMTY5YmQ2Mi4uNzFjZDQ1NiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYworKysgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkgKi8KIAlwYXRoLT5za2lwX2xvY2tpbmcgPSAxOwogCXBhdGgtPnNlYXJjaF9jb21taXRfcm9vdCA9IDE7Ci0JcGF0aC0+cmVhZGEgPSAyOworCXBhdGgtPnJlYWRhID0gMTsKIAogCWtleS5vYmplY3RpZCA9IGxhc3Q7CiAJa2V5Lm9mZnNldCA9IDA7CkBAIC0zNjYsOCArMzY2LDcgQEAKIAlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CiAKIAl3aGlsZSAoMSkgewotCQlzbXBfbWIoKTsKLQkJaWYgKGZzX2luZm8tPmNsb3NpbmcgPiAxKSB7CisJCWlmIChidHJmc19mc19jbG9zaW5nKGZzX2luZm8pID4gMSkgewogCQkJbGFzdCA9ICh1NjQpLTE7CiAJCQlicmVhazsKIAkJfQpAQCAtMzc5LDE1ICszNzgsMTggQEAKIAkJCWlmIChyZXQpCiAJCQkJYnJlYWs7CiAKLQkJCWNhY2hpbmdfY3RsLT5wcm9ncmVzcyA9IGxhc3Q7Ci0JCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7Ci0JCQl1cF9yZWFkKCZmc19pbmZvLT5leHRlbnRfY29tbWl0X3NlbSk7Ci0JCQltdXRleF91bmxvY2soJmNhY2hpbmdfY3RsLT5tdXRleCk7Ci0JCQlpZiAoYnRyZnNfdHJhbnNhY3Rpb25faW5fY29tbWl0KGZzX2luZm8pKQotCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCQllbHNlCisJCQlpZiAobmVlZF9yZXNjaGVkKCkgfHwKKwkJCSAgICBidHJmc19uZXh0X2xlYWYoZXh0ZW50X3Jvb3QsIHBhdGgpKSB7CisJCQkJY2FjaGluZ19jdGwtPnByb2dyZXNzID0gbGFzdDsKKwkJCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisJCQkJdXBfcmVhZCgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOworCQkJCW11dGV4X3VubG9jaygmY2FjaGluZ19jdGwtPm11dGV4KTsKIAkJCQljb25kX3Jlc2NoZWQoKTsKLQkJCWdvdG8gYWdhaW47CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKGtleS5vYmplY3RpZCA8IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQpIHsKQEAgLTMwNjUsNyArMzA2Nyw3IEBACiAJCQlzcGluX3VubG9jaygmZGF0YV9zaW5mby0+bG9jayk7CiBhbGxvYzoKIAkJCWFsbG9jX3RhcmdldCA9IGJ0cmZzX2dldF9hbGxvY19wcm9maWxlKHJvb3QsIDEpOwotCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQkJaWYgKElTX0VSUih0cmFucykpCiAJCQkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCkBAIC0zMDg3LDEzICszMDg5LDIxIEBACiAJCQl9CiAJCQlnb3RvIGFnYWluOwogCQl9CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBsZXNzIHBpbm5lZCBieXRlcyB0aGFuIHdlIHdhbnQgdG8gYWxsb2NhdGUgdGhlbgorCQkgKiBkb24ndCBib3RoZXIgY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24sIGl0IHdvbid0IGhlbHAgdXMuCisJCSAqLworCQlpZiAoZGF0YV9zaW5mby0+Ynl0ZXNfcGlubmVkIDwgYnl0ZXMpCisJCQljb21taXR0ZWQgPSAxOwogCQlzcGluX3VubG9jaygmZGF0YV9zaW5mby0+bG9jayk7CiAKIAkJLyogY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCB0cnkgYWdhaW4gKi8KIGNvbW1pdF90cmFuczoKLQkJaWYgKCFjb21taXR0ZWQgJiYgIXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpIHsKKwkJaWYgKCFjb21taXR0ZWQgJiYKKwkJICAgICFhdG9taWNfcmVhZCgmcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucykpIHsKIAkJCWNvbW1pdHRlZCA9IDE7Ci0JCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCQlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAJCQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwpAQCAtMzMwNCwxMCArMzMxNCw2IEBACiAJaWYgKHJlc2VydmVkID09IDApCiAJCXJldHVybiAwOwogCi0JLyogbm90aGluZyB0byBzaHJpbmsgLSBub3RoaW5nIHRvIHJlY2xhaW0gKi8KLQlpZiAocm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KIAltYXhfcmVjbGFpbSA9IG1pbihyZXNlcnZlZCwgdG9fcmVjbGFpbSk7CiAKIAl3aGlsZSAobG9vcHMgPCAxMDI0KSB7CkBAIC0zNDcyLDcgKzM0NzgsNyBAQAogCQlnb3RvIG91dDsKIAogCXJldCA9IC1FTk9TUEM7Ci0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJZ290byBvdXQ7CiAJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKQEAgLTM2OTksNyArMzcwNSw3IEBACiAJCWlmICh0cmFucykKIAkJCXJldHVybiAtRUFHQUlOOwogCi0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCXJldHVybiAwOwpAQCAtMzgzNyw2ICszODQzLDM3IEBACiAJV0FSTl9PTihmc19pbmZvLT5jaHVua19ibG9ja19yc3YucmVzZXJ2ZWQgPiAwKTsKIH0KIAoraW50IGJ0cmZzX3RydW5jYXRlX3Jlc2VydmVfbWV0YWRhdGEoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpyc3YpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqdHJhbnNfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKKwl1NjQgbnVtX2J5dGVzOworCWludCByZXQ7CisKKwkvKgorCSAqIFRydW5jYXRlIHNob3VsZCBiZSBmcmVlaW5nIGRhdGEsIGJ1dCBnaXZlIHVzIDIgaXRlbXMganVzdCBpbiBjYXNlIGl0CisJICogbmVlZHMgdG8gdXNlIHNvbWUgc3BhY2UuICBXZSBtYXkgd2FudCB0byBiZSBzbWFydGVyIGFib3V0IHRoaXMgaW4gdGhlCisJICogZnV0dXJlLgorCSAqLworCW51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAyKTsKKworCS8qIFdlIGFscmVhZHkgaGF2ZSBlbm91Z2ggYnl0ZXMsIGp1c3QgcmV0dXJuICovCisJaWYgKHJzdi0+cmVzZXJ2ZWQgPj0gbnVtX2J5dGVzKQorCQlyZXR1cm4gMDsKKworCW51bV9ieXRlcyAtPSByc3YtPnJlc2VydmVkOworCisJLyoKKwkgKiBZb3Ugc2hvdWxkIGhhdmUgcmVzZXJ2ZWQgZW5vdWdoIHNwYWNlIGJlZm9yZSBoYW5kIHRvIGRvIHRoaXMsIHNvIHRoaXMKKwkgKiBzaG91bGQgbm90IGZhaWwuCisJICovCisJcmV0ID0gYmxvY2tfcnN2X21pZ3JhdGVfYnl0ZXModHJhbnNfcnN2LCByc3YsIG51bV9ieXRlcyk7CisJQlVHX09OKHJldCk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGJ0cmZzX3RyYW5zX3Jlc2VydmVfbWV0YWRhdGEoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCSBpbnQgbnVtX2l0ZW1zKQpAQCAtMzg3NywyMyArMzkxNCwxOCBAQAogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmRzdF9yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwogCiAJLyoKLQkgKiBvbmUgZm9yIGRlbGV0aW5nIG9ycGhhbiBpdGVtLCBvbmUgZm9yIHVwZGF0aW5nIGlub2RlIGFuZAotCSAqIHR3byBmb3IgY2FsbGluZyBidHJmc190cnVuY2F0ZV9pbm9kZV9pdGVtcy4KLQkgKgotCSAqIGJ0cmZzX3RydW5jYXRlX2lub2RlX2l0ZW1zIGlzIGEgZGVsZXRlIG9wZXJhdGlvbiwgaXQgZnJlZXMKLQkgKiBtb3JlIHNwYWNlIHRoYW4gaXQgdXNlcyBpbiBtb3N0IGNhc2VzLiBTbyB0d28gdW5pdHMgb2YKLQkgKiBtZXRhZGF0YSBzcGFjZSBzaG91bGQgYmUgZW5vdWdoIGZvciBjYWxsaW5nIGl0IG1hbnkgdGltZXMuCi0JICogSWYgYWxsIG9mIHRoZSBtZXRhZGF0YSBzcGFjZSBpcyB1c2VkLCB3ZSBjYW4gY29tbWl0Ci0JICogdHJhbnNhY3Rpb24gYW5kIHVzZSBzcGFjZSBpdCBmcmVlZC4KKwkgKiBXZSBuZWVkIHRvIGhvbGQgc3BhY2UgaW4gb3JkZXIgdG8gZGVsZXRlIG91ciBvcnBoYW4gaXRlbSBvbmNlIHdlJ3ZlCisJICogYWRkZWQgaXQsIHNvIHRoaXMgdGFrZXMgdGhlIHJlc2VydmF0aW9uIHNvIHdlIGNhbiByZWxlYXNlIGl0IGxhdGVyCisJICogd2hlbiB3ZSBhcmUgdHJ1bHkgZG9uZSB3aXRoIHRoZSBvcnBoYW4gaXRlbS4KIAkgKi8KLQl1NjQgbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDQpOworCXU2NCBudW1fYnl0ZXMgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgMSk7CiAJcmV0dXJuIGJsb2NrX3Jzdl9taWdyYXRlX2J5dGVzKHNyY19yc3YsIGRzdF9yc3YsIG51bV9ieXRlcyk7CiB9CiAKIHZvaWQgYnRyZnNfb3JwaGFuX3JlbGVhc2VfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwotCXU2NCBudW1fYnl0ZXMgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgNCk7CisJdTY0IG51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKIAlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCByb290LT5vcnBoYW5fYmxvY2tfcnN2LCBudW1fYnl0ZXMpOwogfQogCkBAIC00ODEwLDcgKzQ4NDIsNyBAQAogCQkJCSAgICAgdTY0IG51bV9ieXRlcywgdTY0IGVtcHR5X3NpemUsCiAJCQkJICAgICB1NjQgc2VhcmNoX3N0YXJ0LCB1NjQgc2VhcmNoX2VuZCwKIAkJCQkgICAgIHU2NCBoaW50X2J5dGUsIHN0cnVjdCBidHJmc19rZXkgKmlucywKLQkJCQkgICAgIGludCBkYXRhKQorCQkJCSAgICAgdTY0IGRhdGEpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBvcmlnX3Jvb3QtPmZzX2luZm8tPmV4dGVudF9yb290OwpAQCAtNDgzNyw3ICs0ODY5LDcgQEAKIAogCXNwYWNlX2luZm8gPSBfX2ZpbmRfc3BhY2VfaW5mbyhyb290LT5mc19pbmZvLCBkYXRhKTsKIAlpZiAoIXNwYWNlX2luZm8pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJObyBzcGFjZSBpbmZvIGZvciAlZFxuIiwgZGF0YSk7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gc3BhY2UgaW5mbyBmb3IgJWxsdVxuIiwgZGF0YSk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIApAQCAtNDk4Nyw2ICs1MDE5LDE1IEBACiAJCWlmICh1bmxpa2VseShibG9ja19ncm91cC0+cm8pKQogCQkJZ290byBsb29wOwogCisJCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsLT50cmVlX2xvY2spOworCQlpZiAoY2FjaGVkICYmCisJCSAgICBibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9jdGwtPmZyZWVfc3BhY2UgPAorCQkgICAgbnVtX2J5dGVzICsgZW1wdHlfc2l6ZSkgeworCQkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bC0+dHJlZV9sb2NrKTsKKwkJCWdvdG8gbG9vcDsKKwkJfQorCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsLT50cmVlX2xvY2spOworCiAJCS8qCiAJCSAqIE9rIHdlIHdhbnQgdG8gdHJ5IGFuZCB1c2UgdGhlIGNsdXN0ZXIgYWxsb2NhdG9yLCBzbyBsZXRzIGxvb2sKIAkJICogdGhlcmUsIHVubGVzcyB3ZSBhcmUgb24gTE9PUF9OT19FTVBUWV9TSVpFLCBzaW5jZSB3ZSB3aWxsCkBAIC01MTUwLDYgKzUxOTEsNyBAQAogCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwKIAkJCQkJICAgICBzZWFyY2hfc3RhcnQgLSBvZmZzZXQpOwogCQlCVUdfT04ob2Zmc2V0ID4gc2VhcmNoX3N0YXJ0KTsKKwkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAkJYnJlYWs7CiBsb29wOgogCQlmYWlsZWRfY2x1c3Rlcl9yZWZpbGwgPSBmYWxzZTsKQEAgLTUxNzIsOSArNTIxNCw3IEBACiAJICogTE9PUF9OT19FTVBUWV9TSVpFLCBzZXQgZW1wdHlfc2l6ZSBhbmQgZW1wdHlfY2x1c3RlciB0byAwIGFuZCB0cnkKIAkgKgkJCWFnYWluCiAJICovCi0JaWYgKCFpbnMtPm9iamVjdGlkICYmIGxvb3AgPCBMT09QX05PX0VNUFRZX1NJWkUgJiYKLQkgICAgKGZvdW5kX3VuY2FjaGVkX2JnIHx8IGVtcHR5X3NpemUgfHwgZW1wdHlfY2x1c3RlciB8fAotCSAgICAgYWxsb3dlZF9jaHVua19hbGxvYykpIHsKKwlpZiAoIWlucy0+b2JqZWN0aWQgJiYgbG9vcCA8IExPT1BfTk9fRU1QVFlfU0laRSkgewogCQlpbmRleCA9IDA7CiAJCWlmIChsb29wID09IExPT1BfRklORF9JREVBTCAmJiBmb3VuZF91bmNhY2hlZF9iZykgewogCQkJZm91bmRfdW5jYWNoZWRfYmcgPSBmYWxzZTsKQEAgLTUyMTQsNDIgKzUyNTQsMzkgQEAKIAkJCWdvdG8gc2VhcmNoOwogCQl9CiAKLQkJaWYgKGxvb3AgPCBMT09QX0NBQ0hJTkdfV0FJVCkgewotCQkJbG9vcCsrOwotCQkJZ290byBzZWFyY2g7Ci0JCX0KKwkJbG9vcCsrOwogCiAJCWlmIChsb29wID09IExPT1BfQUxMT0NfQ0hVTkspIHsKKwkJICAgICAgIGlmIChhbGxvd2VkX2NodW5rX2FsbG9jKSB7CisJCQkJcmV0ID0gZG9fY2h1bmtfYWxsb2ModHJhbnMsIHJvb3QsIG51bV9ieXRlcyArCisJCQkJCQkgICAgIDIgKiAxMDI0ICogMTAyNCwgZGF0YSwKKwkJCQkJCSAgICAgQ0hVTktfQUxMT0NfTElNSVRFRCk7CisJCQkJYWxsb3dlZF9jaHVua19hbGxvYyA9IDA7CisJCQkJaWYgKHJldCA9PSAxKQorCQkJCQlkb25lX2NodW5rX2FsbG9jID0gMTsKKwkJCX0gZWxzZSBpZiAoIWRvbmVfY2h1bmtfYWxsb2MgJiYKKwkJCQkgICBzcGFjZV9pbmZvLT5mb3JjZV9hbGxvYyA9PQorCQkJCSAgIENIVU5LX0FMTE9DX05PX0ZPUkNFKSB7CisJCQkJc3BhY2VfaW5mby0+Zm9yY2VfYWxsb2MgPSBDSFVOS19BTExPQ19MSU1JVEVEOworCQkJfQorCisJCSAgICAgICAvKgorCQkJKiBXZSBkaWRuJ3QgYWxsb2NhdGUgYSBjaHVuaywgZ28gYWhlYWQgYW5kIGRyb3AgdGhlCisJCQkqIGVtcHR5IHNpemUgYW5kIGxvb3AgYWdhaW4uCisJCQkqLworCQkgICAgICAgaWYgKCFkb25lX2NodW5rX2FsbG9jKQorCQkJICAgICAgIGxvb3AgPSBMT09QX05PX0VNUFRZX1NJWkU7CisJCX0KKworCQlpZiAobG9vcCA9PSBMT09QX05PX0VNUFRZX1NJWkUpIHsKIAkJCWVtcHR5X3NpemUgPSAwOwogCQkJZW1wdHlfY2x1c3RlciA9IDA7CiAJCX0KIAotCQlpZiAoYWxsb3dlZF9jaHVua19hbGxvYykgewotCQkJcmV0ID0gZG9fY2h1bmtfYWxsb2ModHJhbnMsIHJvb3QsIG51bV9ieXRlcyArCi0JCQkJCSAgICAgMiAqIDEwMjQgKiAxMDI0LCBkYXRhLAotCQkJCQkgICAgIENIVU5LX0FMTE9DX0xJTUlURUQpOwotCQkJYWxsb3dlZF9jaHVua19hbGxvYyA9IDA7Ci0JCQlkb25lX2NodW5rX2FsbG9jID0gMTsKLQkJfSBlbHNlIGlmICghZG9uZV9jaHVua19hbGxvYyAmJgotCQkJICAgc3BhY2VfaW5mby0+Zm9yY2VfYWxsb2MgPT0gQ0hVTktfQUxMT0NfTk9fRk9SQ0UpIHsKLQkJCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gQ0hVTktfQUxMT0NfTElNSVRFRDsKLQkJfQotCi0JCWlmIChsb29wIDwgTE9PUF9OT19FTVBUWV9TSVpFKSB7Ci0JCQlsb29wKys7Ci0JCQlnb3RvIHNlYXJjaDsKLQkJfQotCQlyZXQgPSAtRU5PU1BDOworCQlnb3RvIHNlYXJjaDsKIAl9IGVsc2UgaWYgKCFpbnMtPm9iamVjdGlkKSB7CiAJCXJldCA9IC1FTk9TUEM7Ci0JfQotCi0JLyogd2UgZm91bmQgd2hhdCB3ZSBuZWVkZWQgKi8KLQlpZiAoaW5zLT5vYmplY3RpZCkgewotCQlpZiAoIShkYXRhICYgQlRSRlNfQkxPQ0tfR1JPVVBfREFUQSkpCi0JCQl0cmFucy0+YmxvY2tfZ3JvdXAgPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkOwotCi0JCWJ0cmZzX3B1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CisJfSBlbHNlIGlmIChpbnMtPm9iamVjdGlkKSB7CiAJCXJldCA9IDA7CiAJfQogCkBAIC02NTI2LDcgKzY1NjMsNyBAQAogCiAJQlVHX09OKGNhY2hlLT5ybyk7CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKIAogCWFsbG9jX2ZsYWdzID0gdXBkYXRlX2Jsb2NrX2dyb3VwX2ZsYWdzKHJvb3QsIGNhY2hlLT5mbGFncyk7CkBAIC02ODgyLDYgKzY5MTksNyBAQAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKKwlwYXRoLT5yZWFkYSA9IDE7CiAKIAljYWNoZV9nZW4gPSBidHJmc19zdXBlcl9jYWNoZV9nZW5lcmF0aW9uKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlpZiAoY2FjaGVfZ2VuICE9IDAgJiYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5jIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKaW5kZXggYzVkOWZiYi4uNzA1NWQxMSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKQEAgLTE0NzYsNyArMTQ3Niw3IEBACiAJCQlpZiAodG90YWxfYnl0ZXMgPj0gbWF4X2J5dGVzKQogCQkJCWJyZWFrOwogCQkJaWYgKCFmb3VuZCkgewotCQkJCSpzdGFydCA9IHN0YXRlLT5zdGFydDsKKwkJCQkqc3RhcnQgPSBtYXgoY3VyX3N0YXJ0LCBzdGF0ZS0+c3RhcnQpOwogCQkJCWZvdW5kID0gMTsKIAkJCX0KIAkJCWxhc3QgPSBzdGF0ZS0+ZW5kOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmggYi9mcy9idHJmcy9leHRlbnRfaW8uaAppbmRleCA0ZTg0NDVhLi5hMTFhOTJlIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfaW8uaAorKysgYi9mcy9idHJmcy9leHRlbnRfaW8uaApAQCAtMTI2LDkgKzEyNiw5IEBACiAJdW5zaWduZWQgbG9uZyBtYXBfbGVuOwogCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlOwogCXVuc2lnbmVkIGxvbmcgYmZsYWdzOwotCWF0b21pY190IHJlZnM7CiAJc3RydWN0IGxpc3RfaGVhZCBsZWFrX2xpc3Q7CiAJc3RydWN0IHJjdV9oZWFkIHJjdV9oZWFkOworCWF0b21pY190IHJlZnM7CiAKIAkvKiB0aGUgc3BpbmxvY2sgaXMgdXNlZCB0byBwcm90ZWN0IG1vc3Qgb3BlcmF0aW9ucyAqLwogCXNwaW5sb2NrX3QgbG9jazsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCBjNmEyMmQ3Li5mYTRlZjE4IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIEFVVE9fREVGUkFHKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocm9vdC0+ZnNfaW5mby0+Y2xvc2luZykKKwlpZiAoYnRyZnNfZnNfY2xvc2luZyhyb290LT5mc19pbmZvKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoQlRSRlNfSShpbm9kZSktPmluX2RlZnJhZykKQEAgLTE0NCw3ICsxNDQsNyBAQAogCWlmICghZGVmcmFnKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRlZnJhZy0+aW5vID0gaW5vZGUtPmlfaW5vOworCWRlZnJhZy0+aW5vID0gYnRyZnNfaW5vKGlub2RlKTsKIAlkZWZyYWctPnRyYW5zaWQgPSB0cmFuc2lkOwogCWRlZnJhZy0+cm9vdCA9IHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkOwogCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJZmlyc3RfaW5vID0gZGVmcmFnLT5pbm8gKyAxOwogCQlyYl9lcmFzZSgmZGVmcmFnLT5yYl9ub2RlLCAmZnNfaW5mby0+ZGVmcmFnX2lub2Rlcyk7CiAKLQkJaWYgKGZzX2luZm8tPmNsb3NpbmcpCisJCWlmIChidHJmc19mc19jbG9zaW5nKGZzX2luZm8pKQogCQkJZ290byBuZXh0X2ZyZWU7CiAKIAkJc3Bpbl91bmxvY2soJmZzX2luZm8tPmRlZnJhZ19pbm9kZXNfbG9jayk7CkBAIC0xNDgwLDE0ICsxNDgwLDEyIEBACiAJICogdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHdlIGNhbiBiYWlsIG91dCBub3cgd2l0aG91dCBhbnkKIAkgKiBzeW5jaW5nCiAJICovCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXNtcF9tYigpOwogCWlmIChCVFJGU19JKGlub2RlKS0+bGFzdF90cmFucyA8PQogCSAgICByb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2NvbW1pdHRlZCkgewogCQlCVFJGU19JKGlub2RlKS0+bGFzdF90cmFucyA9IDA7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlnb3RvIG91dDsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAkvKgogCSAqIG9rIHdlIGhhdmVuJ3QgY29tbWl0dGVkIHRoZSB0cmFuc2FjdGlvbiB5ZXQsIGxldHMgZG8gYSBjb21taXQKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYyBiL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYwppbmRleCA3MGQ0NTc5Li5iZjBkNjE1IDEwMDY0NAotLS0gYS9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKKysrIGIvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCkBAIC05OCw3ICs5OCw3IEBACiAJCXJldHVybiBpbm9kZTsKIAogCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwotCWlmICghcm9vdC0+ZnNfaW5mby0+Y2xvc2luZykgeworCWlmICghYnRyZnNfZnNfY2xvc2luZyhyb290LT5mc19pbmZvKSkgewogCQlibG9ja19ncm91cC0+aW5vZGUgPSBpZ3JhYihpbm9kZSk7CiAJCWJsb2NrX2dyb3VwLT5pcmVmID0gMTsKIAl9CkBAIC0yNTAsNyArMjUwLDcgQEAKIAlwZ29mZl90IGluZGV4ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X3BhZ2Vfb2Zmc2V0OwogCWludCBudW1fY2hlY2tzdW1zOwotCWludCByZXQgPSAwLCByZXQyOworCWludCByZXQgPSAwOwogCiAJSU5JVF9MSVNUX0hFQUQoJmJpdG1hcHMpOwogCkBAIC00MDIsNyArNDAyLDE0IEBACiAJCQkJc3Bpbl9sb2NrKCZjdGwtPnRyZWVfbG9jayk7CiAJCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7CiAJCQkJc3Bpbl91bmxvY2soJmN0bC0+dHJlZV9sb2NrKTsKLQkJCQlCVUdfT04ocmV0KTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgorCQkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOworCQkJCQlrdW5tYXAocGFnZSk7CisJCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJCWdvdG8gZnJlZV9jYWNoZTsKKwkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWUtPmJpdG1hcCA9IGt6YWxsb2MoUEFHRV9DQUNIRV9TSVpFLCBHRlBfTk9GUyk7CiAJCQkJaWYgKCFlLT5iaXRtYXApIHsKQEAgLTQxNCwxMCArNDIxLDE4IEBACiAJCQkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJCQl9CiAJCQkJc3Bpbl9sb2NrKCZjdGwtPnRyZWVfbG9jayk7Ci0JCQkJcmV0MiA9IGxpbmtfZnJlZV9zcGFjZShjdGwsIGUpOworCQkJCXJldCA9IGxpbmtfZnJlZV9zcGFjZShjdGwsIGUpOwogCQkJCWN0bC0+dG90YWxfYml0bWFwcysrOwogCQkJCWN0bC0+b3AtPnJlY2FsY190aHJlc2hvbGRzKGN0bCk7CiAJCQkJc3Bpbl91bmxvY2soJmN0bC0+dHJlZV9sb2NrKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgorCQkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOworCQkJCQlrdW5tYXAocGFnZSk7CisJCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJCWdvdG8gZnJlZV9jYWNoZTsKKwkJCQl9CiAJCQkJbGlzdF9hZGRfdGFpbCgmZS0+bGlzdCwgJmJpdG1hcHMpOwogCQkJfQogCkBAIC00NzgsOCArNDkzLDcgQEAKIAkgKiBJZiB3ZSdyZSB1bm1vdW50aW5nIHRoZW4ganVzdCByZXR1cm4sIHNpbmNlIHRoaXMgZG9lcyBhIHNlYXJjaCBvbiB0aGUKIAkgKiBub3JtYWwgcm9vdCBhbmQgbm90IHRoZSBjb21taXQgcm9vdCBhbmQgd2UgY291bGQgZGVhZGxvY2suCiAJICovCi0Jc21wX21iKCk7Ci0JaWYgKGZzX2luZm8tPmNsb3NpbmcpCisJaWYgKGJ0cmZzX2ZzX2Nsb3NpbmcoZnNfaW5mbykpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTU3NSwxMCArNTg5LDI1IEBACiAKIAludW1fcGFnZXMgPSAoaV9zaXplX3JlYWQoaW5vZGUpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KIAkJUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIFNpbmNlIHRoZSBmaXJzdCBwYWdlIGhhcyBhbGwgb2Ygb3VyIGNoZWNrc3VtcyBhbmQgb3VyIGdlbmVyYXRpb24gd2UKKwkgKiBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGludG8gdGhlIHBhZ2UgdGhhdCB3ZSBjYW4gc3RhcnQgd3JpdGluZworCSAqIG91ciBlbnRyaWVzLgorCSAqLworCWZpcnN0X3BhZ2Vfb2Zmc2V0ID0gKHNpemVvZih1MzIpICogbnVtX3BhZ2VzKSArIHNpemVvZih1NjQpOworCiAJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKIAlidHJmc193YWl0X29yZGVyZWRfcmFuZ2UoaW5vZGUsIGlub2RlLT5pX3NpemUgJgogCQkJCSB+KHJvb3QtPnNlY3RvcnNpemUgLSAxKSwgKHU2NCktMSk7CiAKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhhdCBmaXJzdCBwYWdlICovCisJaWYgKGZpcnN0X3BhZ2Vfb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KSA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJLyogdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcnVubmluZyBvdXQgb2Ygc3BhY2UsIHdoZXJlIHdlIGFsc28gcmV0dXJuIDAgKi8KKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQnRyZnM6IGZyZWUgc3BhY2UgY2FjaGUgd2FzIHRvbyBiaWcgZm9yIHRoZSBjcmMgcGFnZVxuIik7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0X3VwZGF0ZTsKKwl9CisKIAkvKiBXZSBuZWVkIGEgY2hlY2tzdW0gcGVyIHBhZ2UuICovCiAJY3JjID0gY2hlY2tzdW1zID0ga3phbGxvYyhzaXplb2YodTMyKSAqIG51bV9wYWdlcywgR0ZQX05PRlMpOwogCWlmICghY3JjKQpAQCAtNTkwLDEyICs2MTksNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JLyogU2luY2UgdGhlIGZpcnN0IHBhZ2UgaGFzIGFsbCBvZiBvdXIgY2hlY2tzdW1zIGFuZCBvdXIgZ2VuZXJhdGlvbiB3ZQotCSAqIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgaW50byB0aGUgcGFnZSB0aGF0IHdlIGNhbiBzdGFydCB3cml0aW5nCi0JICogb3VyIGVudHJpZXMuCi0JICovCi0JZmlyc3RfcGFnZV9vZmZzZXQgPSAoc2l6ZW9mKHUzMikgKiBudW1fcGFnZXMpICsgc2l6ZW9mKHU2NCk7Ci0KIAkvKiBHZXQgdGhlIGNsdXN0ZXIgZm9yIHRoaXMgYmxvY2tfZ3JvdXAgaWYgaXQgZXhpc3RzICovCiAJaWYgKGJsb2NrX2dyb3VwICYmICFsaXN0X2VtcHR5KCZibG9ja19ncm91cC0+Y2x1c3Rlcl9saXN0KSkKIAkJY2x1c3RlciA9IGxpc3RfZW50cnkoYmxvY2tfZ3JvdXAtPmNsdXN0ZXJfbGlzdC5uZXh0LApAQCAtODU3LDEyICs4ODAsMTQgQEAKIAlyZXQgPSAxOwogCiBvdXRfZnJlZToKKwlrZnJlZShjaGVja3N1bXMpOworCWtmcmVlKHBhZ2VzKTsKKworb3V0X3VwZGF0ZToKIAlpZiAocmV0ICE9IDEpIHsKIAkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgMCwgaW5kZXgpOwogCQlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IDA7CiAJfQotCWtmcmVlKGNoZWNrc3Vtcyk7Ci0Ja2ZyZWUocGFnZXMpOwogCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCXJldHVybiByZXQ7CiB9CkBAIC05NjMsMTAgKzk4OCwxNiBAQAogCQkJICogbG9naWNhbGx5LgogCQkJICovCiAJCQlpZiAoYml0bWFwKSB7Ci0JCQkJV0FSTl9PTihpbmZvLT5iaXRtYXApOworCQkJCWlmIChpbmZvLT5iaXRtYXApIHsKKwkJCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCQl9CiAJCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKIAkJCX0gZWxzZSB7Ci0JCQkJV0FSTl9PTighaW5mby0+Yml0bWFwKTsKKwkJCQlpZiAoIWluZm8tPmJpdG1hcCkgeworCQkJCQlXQVJOX09OX09OQ0UoMSk7CisJCQkJCXJldHVybiAtRUVYSVNUOworCQkJCX0KIAkJCQlwID0gJigqcCktPnJiX2xlZnQ7CiAJCQl9CiAJCX0KQEAgLTEzODYsNiArMTQxNywyMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdTY0IGFkZF9ieXRlc190b19iaXRtYXAoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfY3RsICpjdGwsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm8sIHU2NCBvZmZzZXQsCisJCQkgICAgICAgdTY0IGJ5dGVzKQoreworCXU2NCBieXRlc190b19zZXQgPSAwOworCXU2NCBlbmQ7CisKKwllbmQgPSBpbmZvLT5vZmZzZXQgKyAodTY0KShCSVRTX1BFUl9CSVRNQVAgKiBjdGwtPnVuaXQpOworCisJYnl0ZXNfdG9fc2V0ID0gbWluKGVuZCAtIG9mZnNldCwgYnl0ZXMpOworCisJYml0bWFwX3NldF9iaXRzKGN0bCwgaW5mbywgb2Zmc2V0LCBieXRlc190b19zZXQpOworCisJcmV0dXJuIGJ5dGVzX3RvX3NldDsKKworfQorCiBzdGF0aWMgYm9vbCB1c2VfYml0bWFwKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsLAogCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbykKIHsKQEAgLTE0MjIsMTIgKzE0NzAsMTggQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX29wIGZyZWVfc3BhY2Vfb3AgPSB7CisJLnJlY2FsY190aHJlc2hvbGRzCT0gcmVjYWxjdWxhdGVfdGhyZXNob2xkcywKKwkudXNlX2JpdG1hcAkJPSB1c2VfYml0bWFwLAorfTsKKwogc3RhdGljIGludCBpbnNlcnRfaW50b19iaXRtYXAoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfY3RsICpjdGwsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbykKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqYml0bWFwX2luZm87CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCA9IE5VTEw7CiAJaW50IGFkZGVkID0gMDsKLQl1NjQgYnl0ZXMsIG9mZnNldCwgZW5kOworCXU2NCBieXRlcywgb2Zmc2V0LCBieXRlc19hZGRlZDsKIAlpbnQgcmV0OwogCiAJYnl0ZXMgPSBpbmZvLT5ieXRlczsKQEAgLTE0MzYsNyArMTQ5MCw0OSBAQAogCWlmICghY3RsLT5vcC0+dXNlX2JpdG1hcChjdGwsIGluZm8pKQogCQlyZXR1cm4gMDsKIAorCWlmIChjdGwtPm9wID09ICZmcmVlX3NwYWNlX29wKQorCQlibG9ja19ncm91cCA9IGN0bC0+cHJpdmF0ZTsKIGFnYWluOgorCS8qCisJICogU2luY2Ugd2UgbGluayBiaXRtYXBzIHJpZ2h0IGludG8gdGhlIGNsdXN0ZXIgd2UgbmVlZCB0byBzZWUgaWYgd2UKKwkgKiBoYXZlIGEgY2x1c3RlciBoZXJlLCBhbmQgaWYgc28gYW5kIGl0IGhhcyBvdXIgYml0bWFwIHdlIG5lZWQgdG8gYWRkCisJICogdGhlIGZyZWUgc3BhY2UgdG8gdGhhdCBiaXRtYXAuCisJICovCisJaWYgKGJsb2NrX2dyb3VwICYmICFsaXN0X2VtcHR5KCZibG9ja19ncm91cC0+Y2x1c3Rlcl9saXN0KSkgeworCQlzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyICpjbHVzdGVyOworCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmVudHJ5OworCisJCWNsdXN0ZXIgPSBsaXN0X2VudHJ5KGJsb2NrX2dyb3VwLT5jbHVzdGVyX2xpc3QubmV4dCwKKwkJCQkgICAgIHN0cnVjdCBidHJmc19mcmVlX2NsdXN0ZXIsCisJCQkJICAgICBibG9ja19ncm91cF9saXN0KTsKKwkJc3Bpbl9sb2NrKCZjbHVzdGVyLT5sb2NrKTsKKwkJbm9kZSA9IHJiX2ZpcnN0KCZjbHVzdGVyLT5yb290KTsKKwkJaWYgKCFub2RlKSB7CisJCQlzcGluX3VubG9jaygmY2x1c3Rlci0+bG9jayk7CisJCQlnb3RvIG5vX2NsdXN0ZXJfYml0bWFwOworCQl9CisKKwkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKKwkJaWYgKCFlbnRyeS0+Yml0bWFwKSB7CisJCQlzcGluX3VubG9jaygmY2x1c3Rlci0+bG9jayk7CisJCQlnb3RvIG5vX2NsdXN0ZXJfYml0bWFwOworCQl9CisKKwkJaWYgKGVudHJ5LT5vZmZzZXQgPT0gb2Zmc2V0X3RvX2JpdG1hcChjdGwsIG9mZnNldCkpIHsKKwkJCWJ5dGVzX2FkZGVkID0gYWRkX2J5dGVzX3RvX2JpdG1hcChjdGwsIGVudHJ5LAorCQkJCQkJCSAgb2Zmc2V0LCBieXRlcyk7CisJCQlieXRlcyAtPSBieXRlc19hZGRlZDsKKwkJCW9mZnNldCArPSBieXRlc19hZGRlZDsKKwkJfQorCQlzcGluX3VubG9jaygmY2x1c3Rlci0+bG9jayk7CisJCWlmICghYnl0ZXMpIHsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworbm9fY2x1c3Rlcl9iaXRtYXA6CiAJYml0bWFwX2luZm8gPSB0cmVlX3NlYXJjaF9vZmZzZXQoY3RsLCBvZmZzZXRfdG9fYml0bWFwKGN0bCwgb2Zmc2V0KSwKIAkJCQkJIDEsIDApOwogCWlmICghYml0bWFwX2luZm8pIHsKQEAgLTE0NDQsMTkgKzE1NDAsMTAgQEAKIAkJZ290byBuZXdfYml0bWFwOwogCX0KIAotCWVuZCA9IGJpdG1hcF9pbmZvLT5vZmZzZXQgKyAodTY0KShCSVRTX1BFUl9CSVRNQVAgKiBjdGwtPnVuaXQpOwotCi0JaWYgKG9mZnNldCA+PSBiaXRtYXBfaW5mby0+b2Zmc2V0ICYmIG9mZnNldCArIGJ5dGVzID4gZW5kKSB7Ci0JCWJpdG1hcF9zZXRfYml0cyhjdGwsIGJpdG1hcF9pbmZvLCBvZmZzZXQsIGVuZCAtIG9mZnNldCk7Ci0JCWJ5dGVzIC09IGVuZCAtIG9mZnNldDsKLQkJb2Zmc2V0ID0gZW5kOwotCQlhZGRlZCA9IDA7Ci0JfSBlbHNlIGlmIChvZmZzZXQgPj0gYml0bWFwX2luZm8tPm9mZnNldCAmJiBvZmZzZXQgKyBieXRlcyA8PSBlbmQpIHsKLQkJYml0bWFwX3NldF9iaXRzKGN0bCwgYml0bWFwX2luZm8sIG9mZnNldCwgYnl0ZXMpOwotCQlieXRlcyA9IDA7Ci0JfSBlbHNlIHsKLQkJQlVHKCk7Ci0JfQorCWJ5dGVzX2FkZGVkID0gYWRkX2J5dGVzX3RvX2JpdG1hcChjdGwsIGJpdG1hcF9pbmZvLCBvZmZzZXQsIGJ5dGVzKTsKKwlieXRlcyAtPSBieXRlc19hZGRlZDsKKwlvZmZzZXQgKz0gYnl0ZXNfYWRkZWQ7CisJYWRkZWQgPSAwOwogCiAJaWYgKCFieXRlcykgewogCQlyZXQgPSAxOwpAQCAtMTczNSwxMSArMTgyMiw2IEBACiAJICAgICAgICJcbiIsIGNvdW50KTsKIH0KIAotc3RhdGljIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX29wIGZyZWVfc3BhY2Vfb3AgPSB7Ci0JLnJlY2FsY190aHJlc2hvbGRzCT0gcmVjYWxjdWxhdGVfdGhyZXNob2xkcywKLQkudXNlX2JpdG1hcAkJPSB1c2VfYml0bWFwLAotfTsKLQogdm9pZCBidHJmc19pbml0X2ZyZWVfc3BhY2VfY3RsKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXApCiB7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfY3RsICpjdGwgPSBibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9jdGw7CkBAIC0xODExLDkgKzE4OTMsMTIgQEAKIAogCXdoaWxlICgobm9kZSA9IHJiX2xhc3QoJmN0bC0+ZnJlZV9zcGFjZV9vZmZzZXQpKSAhPSBOVUxMKSB7CiAJCWluZm8gPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKLQkJdW5saW5rX2ZyZWVfc3BhY2UoY3RsLCBpbmZvKTsKLQkJa2ZyZWUoaW5mby0+Yml0bWFwKTsKLQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBpbmZvKTsKKwkJaWYgKCFpbmZvLT5iaXRtYXApIHsKKwkJCXVubGlua19mcmVlX3NwYWNlKGN0bCwgaW5mbyk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfZnJlZV9zcGFjZV9jYWNoZXAsIGluZm8pOworCQl9IGVsc2UgeworCQkJZnJlZV9iaXRtYXAoY3RsLCBpbmZvKTsKKwkJfQogCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKIAkJCXNwaW5fdW5sb2NrKCZjdGwtPnRyZWVfbG9jayk7CiAJCQljb25kX3Jlc2NoZWQoKTsKQEAgLTIxMTEsOSArMjE5NiwxMSBAQAogLyoKICAqIFRoaXMgc2VhcmNoZXMgdGhlIGJsb2NrIGdyb3VwIGZvciBqdXN0IGV4dGVudHMgdG8gZmlsbCB0aGUgY2x1c3RlciB3aXRoLgogICovCi1zdGF0aWMgaW50IHNldHVwX2NsdXN0ZXJfbm9fYml0bWFwKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCi0JCQkJICAgc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqY2x1c3RlciwKLQkJCQkgICB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMsIHU2NCBtaW5fYnl0ZXMpCitzdGF0aWMgbm9pbmxpbmUgaW50CitzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAorCQkJc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqY2x1c3RlciwKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmJpdG1hcHMsIHU2NCBvZmZzZXQsIHU2NCBieXRlcywKKwkJCXU2NCBtaW5fYnl0ZXMpCiB7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfY3RsICpjdGwgPSBibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9jdGw7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmZpcnN0ID0gTlVMTDsKQEAgLTIxMzUsNiArMjIyMiw4IEBACiAJICogZXh0ZW50IGVudHJ5LgogCSAqLwogCXdoaWxlIChlbnRyeS0+Yml0bWFwKSB7CisJCWlmIChsaXN0X2VtcHR5KCZlbnRyeS0+bGlzdCkpCisJCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgYml0bWFwcyk7CiAJCW5vZGUgPSByYl9uZXh0KCZlbnRyeS0+b2Zmc2V0X2luZGV4KTsKIAkJaWYgKCFub2RlKQogCQkJcmV0dXJuIC1FTk9TUEM7CkBAIC0yMTU0LDggKzIyNDMsMTIgQEAKIAkJCXJldHVybiAtRU5PU1BDOwogCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBvZmZzZXRfaW5kZXgpOwogCi0JCWlmIChlbnRyeS0+Yml0bWFwKQorCQlpZiAoZW50cnktPmJpdG1hcCkgeworCQkJaWYgKGxpc3RfZW1wdHkoJmVudHJ5LT5saXN0KSkKKwkJCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgYml0bWFwcyk7CiAJCQljb250aW51ZTsKKwkJfQorCiAJCS8qCiAJCSAqIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBlbXB0eSBzaXplIGFuZCB0aGUgd2luZG93IGlzCiAJCSAqIHZlcnkgbGFyZ2UuICByZXNldCBhbmQgdHJ5IGFnYWluCkBAIC0yMjA3LDkgKzIzMDAsMTEgQEAKICAqIFRoaXMgc3BlY2lmaWNhbGx5IGxvb2tzIGZvciBiaXRtYXBzIHRoYXQgbWF5IHdvcmsgaW4gdGhlIGNsdXN0ZXIsIHdlIGFzc3VtZQogICogdGhhdCB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkIHRvIGZpbmQgZXh0ZW50cyB0aGF0IHdpbGwgd29yay4KICAqLwotc3RhdGljIGludCBzZXR1cF9jbHVzdGVyX2JpdG1hcChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAotCQkJCXN0cnVjdCBidHJmc19mcmVlX2NsdXN0ZXIgKmNsdXN0ZXIsCi0JCQkJdTY0IG9mZnNldCwgdTY0IGJ5dGVzLCB1NjQgbWluX2J5dGVzKQorc3RhdGljIG5vaW5saW5lIGludAorc2V0dXBfY2x1c3Rlcl9iaXRtYXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJICAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyICpjbHVzdGVyLAorCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmJpdG1hcHMsIHU2NCBvZmZzZXQsIHU2NCBieXRlcywKKwkJICAgICB1NjQgbWluX2J5dGVzKQogewogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsOwogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplbnRyeTsKQEAgLTIyMTksMTAgKzIzMTQsMzkgQEAKIAlpZiAoY3RsLT50b3RhbF9iaXRtYXBzID09IDApCiAJCXJldHVybiAtRU5PU1BDOwogCisJLyoKKwkgKiBGaXJzdCBjaGVjayBvdXIgY2FjaGVkIGxpc3Qgb2YgYml0bWFwcyBhbmQgc2VlIGlmIHRoZXJlIGlzIGFuIGVudHJ5CisJICogaGVyZSB0aGF0IHdpbGwgd29yay4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBiaXRtYXBzLCBsaXN0KSB7CisJCWlmIChlbnRyeS0+Ynl0ZXMgPCBtaW5fYnl0ZXMpCisJCQljb250aW51ZTsKKwkJcmV0ID0gYnRyZnNfYml0bWFwX2NsdXN0ZXIoYmxvY2tfZ3JvdXAsIGVudHJ5LCBjbHVzdGVyLCBvZmZzZXQsCisJCQkJCSAgIGJ5dGVzLCBtaW5fYnl0ZXMpOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgd2UgZG8gaGF2ZSBlbnRyaWVzIG9uIG91ciBsaXN0IGFuZCB3ZSBhcmUgaGVyZSB0aGVuIHdlIGRpZG4ndCBmaW5kCisJICogYW55dGhpbmcsIHNvIGdvIGFoZWFkIGFuZCBnZXQgdGhlIG5leHQgZW50cnkgYWZ0ZXIgdGhlIGxhc3QgZW50cnkgaW4KKwkgKiB0aGlzIGxpc3QgYW5kIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbSB0aGVyZS4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoYml0bWFwcykpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGJpdG1hcHMtPnByZXYsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLAorCQkJCSAgIGxpc3QpOworCQlub2RlID0gcmJfbmV4dCgmZW50cnktPm9mZnNldF9pbmRleCk7CisJCWlmICghbm9kZSkKKwkJCXJldHVybiAtRU5PU1BDOworCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBvZmZzZXRfaW5kZXgpOworCQlnb3RvIHNlYXJjaDsKKwl9CisKIAllbnRyeSA9IHRyZWVfc2VhcmNoX29mZnNldChjdGwsIG9mZnNldF90b19iaXRtYXAoY3RsLCBvZmZzZXQpLCAwLCAxKTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm4gLUVOT1NQQzsKIAorc2VhcmNoOgogCW5vZGUgPSAmZW50cnktPm9mZnNldF9pbmRleDsKIAlkbyB7CiAJCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CkBAIC0yMjUzLDYgKzIzNzcsOCBAQAogCQkJICAgICB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMsIHU2NCBlbXB0eV9zaXplKQogewogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsOworCXN0cnVjdCBsaXN0X2hlYWQgYml0bWFwczsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnksICp0bXA7CiAJdTY0IG1pbl9ieXRlczsKIAlpbnQgcmV0OwogCkBAIC0yMjkxLDExICsyNDE3LDE2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IHNldHVwX2NsdXN0ZXJfbm9fYml0bWFwKGJsb2NrX2dyb3VwLCBjbHVzdGVyLCBvZmZzZXQsIGJ5dGVzLAotCQkJCSAgICAgIG1pbl9ieXRlcyk7CisJSU5JVF9MSVNUX0hFQUQoJmJpdG1hcHMpOworCXJldCA9IHNldHVwX2NsdXN0ZXJfbm9fYml0bWFwKGJsb2NrX2dyb3VwLCBjbHVzdGVyLCAmYml0bWFwcywgb2Zmc2V0LAorCQkJCSAgICAgIGJ5dGVzLCBtaW5fYnl0ZXMpOwogCWlmIChyZXQpCi0JCXJldCA9IHNldHVwX2NsdXN0ZXJfYml0bWFwKGJsb2NrX2dyb3VwLCBjbHVzdGVyLCBvZmZzZXQsCi0JCQkJCSAgIGJ5dGVzLCBtaW5fYnl0ZXMpOworCQlyZXQgPSBzZXR1cF9jbHVzdGVyX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3RlciwgJmJpdG1hcHMsCisJCQkJCSAgIG9mZnNldCwgYnl0ZXMsIG1pbl9ieXRlcyk7CisKKwkvKiBDbGVhciBvdXIgdGVtcG9yYXJ5IGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRtcCwgJmJpdG1hcHMsIGxpc3QpCisJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKIAogCWlmICghcmV0KSB7CiAJCWF0b21pY19pbmMoJmJsb2NrX2dyb3VwLT5jb3VudCk7CkBAIC0yNDgxLDcgKzI2MTIsNyBAQAogCQlyZXR1cm4gaW5vZGU7CiAKIAlzcGluX2xvY2soJnJvb3QtPmNhY2hlX2xvY2spOwotCWlmICghcm9vdC0+ZnNfaW5mby0+Y2xvc2luZykKKwlpZiAoIWJ0cmZzX2ZzX2Nsb3Npbmcocm9vdC0+ZnNfaW5mbykpCiAJCXJvb3QtPmNhY2hlX2lub2RlID0gaWdyYWIoaW5vZGUpOwogCXNwaW5fdW5sb2NrKCZyb290LT5jYWNoZV9sb2NrKTsKIApAQCAtMjUwNCwxMiArMjYzNSwxNCBAQAogCWludCByZXQgPSAwOwogCXU2NCByb290X2dlbiA9IGJ0cmZzX3Jvb3RfZ2VuZXJhdGlvbigmcm9vdC0+cm9vdF9pdGVtKTsKIAorCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgSU5PREVfTUFQX0NBQ0hFKSkKKwkJcmV0dXJuIDA7CisKIAkvKgogCSAqIElmIHdlJ3JlIHVubW91bnRpbmcgdGhlbiBqdXN0IHJldHVybiwgc2luY2UgdGhpcyBkb2VzIGEgc2VhcmNoIG9uIHRoZQogCSAqIG5vcm1hbCByb290IGFuZCBub3QgdGhlIGNvbW1pdCByb290IGFuZCB3ZSBjb3VsZCBkZWFkbG9jay4KIAkgKi8KLQlzbXBfbWIoKTsKLQlpZiAoZnNfaW5mby0+Y2xvc2luZykKKwlpZiAoYnRyZnNfZnNfY2xvc2luZyhmc19pbmZvKSkKIAkJcmV0dXJuIDA7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwpAQCAtMjU0Myw2ICsyNjc2LDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCByZXQ7CiAKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybiAwOworCiAJaW5vZGUgPSBsb29rdXBfZnJlZV9pbm9faW5vZGUocm9vdCwgcGF0aCk7CiAJaWYgKElTX0VSUihpbm9kZSkpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUtbWFwLmMgYi9mcy9idHJmcy9pbm9kZS1tYXAuYwppbmRleCAzMjYyY2QxLi5iNDA4N2UwIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS1tYXAuYworKysgYi9mcy9idHJmcy9pbm9kZS1tYXAuYwpAQCAtMzgsNiArMzgsOSBAQAogCWludCBzbG90OwogCWludCByZXQ7CiAKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybiAwOworCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTksOCArNjIsNyBAQAogCQlnb3RvIG91dDsKIAogCXdoaWxlICgxKSB7Ci0JCXNtcF9tYigpOwotCQlpZiAoZnNfaW5mby0+Y2xvc2luZykKKwkJaWYgKGJ0cmZzX2ZzX2Nsb3NpbmcoZnNfaW5mbykpCiAJCQlnb3RvIG91dDsKIAogCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CkBAIC0xNDEsNiArMTQzLDkgQEAKIAlpbnQgcmV0OwogCXU2NCBvYmplY3RpZDsKIAorCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgSU5PREVfTUFQX0NBQ0hFKSkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrKCZyb290LT5jYWNoZV9sb2NrKTsKIAlpZiAocm9vdC0+Y2FjaGVkICE9IEJUUkZTX0NBQ0hFX05PKSB7CiAJCXNwaW5fdW5sb2NrKCZyb290LT5jYWNoZV9sb2NrKTsKQEAgLTE3OCw2ICsxODMsOSBAQAogCiBpbnQgYnRyZnNfZmluZF9mcmVlX2lubyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0ICpvYmplY3RpZCkKIHsKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybiBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQocm9vdCwgb2JqZWN0aWQpOworCiBhZ2FpbjoKIAkqb2JqZWN0aWQgPSBidHJmc19maW5kX2lub19mb3JfYWxsb2Mocm9vdCk7CiAKQEAgLTIwMSw2ICsyMDksMTAgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCA9IHJvb3QtPmZyZWVfaW5vX2N0bDsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKnBpbm5lZCA9IHJvb3QtPmZyZWVfaW5vX3Bpbm5lZDsKKworCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgSU5PREVfTUFQX0NBQ0hFKSkKKwkJcmV0dXJuOworCiBhZ2FpbjoKIAlpZiAocm9vdC0+Y2FjaGVkID09IEJUUkZTX0NBQ0hFX0ZJTklTSEVEKSB7CiAJCV9fYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY3RsLCBvYmplY3RpZCwgMSk7CkBAIC0yNTAsNiArMjYyLDkgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKIAl1NjQgY291bnQ7CiAKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybjsKKwogCXdoaWxlICgxKSB7CiAJCW4gPSByYl9maXJzdChyYnJvb3QpOwogCQlpZiAoIW4pCkBAIC0zODgsOSArNDAzLDI0IEBACiAJaW50IHByZWFsbG9jOwogCWJvb2wgcmV0cnkgPSBmYWxzZTsKIAorCS8qIG9ubHkgZnMgdHJlZSBhbmQgc3Vidm9sL3NuYXAgbmVlZHMgaW5vIGNhY2hlICovCisJaWYgKHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkICE9IEJUUkZTX0ZTX1RSRUVfT0JKRUNUSUQgJiYKKwkgICAgKHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkIDwgQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCB8fAorCSAgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPiBCVFJGU19MQVNUX0ZSRUVfT0JKRUNUSUQpKQorCQlyZXR1cm4gMDsKKworCS8qIERvbid0IHNhdmUgaW5vZGUgY2FjaGUgaWYgd2UgYXJlIGRlbGV0aW5nIHRoaXMgcm9vdCAqLworCWlmIChidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCAmJgorCSAgICByb290ICE9IHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXJldHVybiAwOworCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOworCiBhZ2FpbjoKIAlpbm9kZSA9IGxvb2t1cF9mcmVlX2lub19pbm9kZShyb290LCBwYXRoKTsKIAlpZiAoSVNfRVJSKGlub2RlKSAmJiBQVFJfRVJSKGlub2RlKSAhPSAtRU5PRU5UKSB7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCAzOWE5ZDU3Li4zNjAxZjBhIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTEzOCw3ICsxMzgsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAogCWtleS5vYmplY3RpZCA9IGJ0cmZzX2lubyhpbm9kZSk7CiAJa2V5Lm9mZnNldCA9IHN0YXJ0OwpAQCAtNDI2LDkgKzQyNSw4IEBACiAJCX0KIAl9CiAJaWYgKHN0YXJ0ID09IDApIHsKLQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYmxvY2tfcnN2OwogCiAJCS8qIGxldHMgdHJ5IHRvIG1ha2UgYW4gaW5saW5lIGV4dGVudCAqLwpAQCAtNjIzLDggKzYyMSw5IEBACiAJCQkgICAgYXN5bmNfZXh0ZW50LT5zdGFydCArIGFzeW5jX2V4dGVudC0+cmFtX3NpemUgLSAxLAogCQkJICAgIEdGUF9OT0ZTKTsKIAotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJQlVHX09OKElTX0VSUih0cmFucykpOworCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQodHJhbnMsIHJvb3QsCiAJCQkJCSAgIGFzeW5jX2V4dGVudC0+Y29tcHJlc3NlZF9zaXplLAogCQkJCQkgICBhc3luY19leHRlbnQtPmNvbXByZXNzZWRfc2l6ZSwKQEAgLTc5Myw5ICs3OTIsOCBAQAogCWludCByZXQgPSAwOwogCiAJQlVHX09OKGlzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpKTsKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAogCW51bV9ieXRlcyA9IChlbmQgLSBzdGFydCArIGJsb2Nrc2l6ZSkgJiB+KGJsb2Nrc2l6ZSAtIDEpOwpAQCAtMTA3NywxMCArMTA3NSwxMiBAQAogCW5vbG9jayA9IGlzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpOwogCiAJaWYgKG5vbG9jaykKLQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290LCAxKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290KTsKIAllbHNlCi0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOworCiAJQlVHX09OKElTX0VSUih0cmFucykpOworCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYmxvY2tfcnN2OwogCiAJY293X3N0YXJ0ID0gKHU2NCktMTsKIAljdXJfb2Zmc2V0ID0gc3RhcnQ7CkBAIC0xNTE5LDggKzE1MTksNiBAQAogewogCXN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtOwogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1bSwgbGlzdCwgbGlzdCkgewogCQlidHJmc19jc3VtX2ZpbGVfYmxvY2tzKHRyYW5zLAogCQkgICAgICAgQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdCwgc3VtKTsKQEAgLTE3MzUsMTEgKzE3MzMsMTAgQEAKIAkJcmV0ID0gYnRyZnNfb3JkZXJlZF91cGRhdGVfaV9zaXplKGlub2RlLCAwLCBvcmRlcmVkX2V4dGVudCk7CiAJCWlmICghcmV0KSB7CiAJCQlpZiAobm9sb2NrKQotCQkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2socm9vdCwgMSk7CisJCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290KTsKIAkJCWVsc2UKLQkJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQkJQlVHX09OKElTX0VSUih0cmFucykpOwotCQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAkJCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCQkJQlVHX09OKHJldCk7CkBAIC0xNzUyLDExICsxNzQ5LDEwIEBACiAJCQkgMCwgJmNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOwogCiAJaWYgKG5vbG9jaykKLQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290LCAxKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290KTsKIAllbHNlCi0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAogCWlmICh0ZXN0X2JpdChCVFJGU19PUkRFUkVEX0NPTVBSRVNTRUQsICZvcmRlcmVkX2V4dGVudC0+ZmxhZ3MpKQpAQCAtMTk5MCw3ICsxOTg2LDcgQEAKIAl9CiAKIAlpZiAoQlRSRlNfSShpbm9kZSktPmZsYWdzICYgQlRSRlNfSU5PREVfTk9EQVRBU1VNKQotCQlyZXR1cm4gMDsKKwkJZ290byBnb29kOwogCiAJaWYgKHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID09IEJUUkZTX0RBVEFfUkVMT0NfVFJFRV9PQkpFQ1RJRCAmJgogCSAgICB0ZXN0X3JhbmdlX2JpdChpb190cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTk9EQVRBU1VNLCAxLCBOVUxMKSkgewpAQCAtMjQzMSw3ICsyNDI3LDcgQEAKIAkJCQkJKHU2NCktMSk7CiAKIAlpZiAocm9vdC0+b3JwaGFuX2Jsb2NrX3JzdiB8fCByb290LT5vcnBoYW5faXRlbV9pbnNlcnRlZCkgewotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJaWYgKCFJU19FUlIodHJhbnMpKQogCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAl9CkBAIC0yNTExLDEyICsyNTA3LDE3IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOwogCWludCBtYXliZV9hY2xzOwotCXU2NCBhbGxvY19ncm91cF9ibG9jazsKIAl1MzIgcmRldjsKIAlpbnQgcmV0OworCWJvb2wgZmlsbGVkID0gZmFsc2U7CisKKwlyZXQgPSBidHJmc19maWxsX2lub2RlKGlub2RlLCAmcmRldik7CisJaWYgKCFyZXQpCisJCWZpbGxlZCA9IHRydWU7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCUJVR19PTighcGF0aCk7CisJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCW1lbWNweSgmbG9jYXRpb24sICZCVFJGU19JKGlub2RlKS0+bG9jYXRpb24sIHNpemVvZihsb2NhdGlvbikpOwogCiAJcmV0ID0gYnRyZnNfbG9va3VwX2lub2RlKE5VTEwsIHJvb3QsIHBhdGgsICZsb2NhdGlvbiwgMCk7CkBAIC0yNTI0LDggKzI1MjUsMTggQEAKIAkJZ290byBtYWtlX2JhZDsKIAogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKworCWlmIChmaWxsZWQpCisJCWdvdG8gY2FjaGVfYWNsOworCiAJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CisJaWYgKCFsZWFmLT5tYXBfdG9rZW4pCisJCW1hcF9wcml2YXRlX2V4dGVudF9idWZmZXIobGVhZiwgKHVuc2lnbmVkIGxvbmcpaW5vZGVfaXRlbSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pLAorCQkJCQkgICZsZWFmLT5tYXBfdG9rZW4sICZsZWFmLT5rYWRkciwKKwkJCQkJICAmbGVhZi0+bWFwX3N0YXJ0LCAmbGVhZi0+bWFwX2xlbiwKKwkJCQkJICBLTV9VU0VSMSk7CiAKIAlpbm9kZS0+aV9tb2RlID0gYnRyZnNfaW5vZGVfbW9kZShsZWFmLCBpbm9kZV9pdGVtKTsKIAlpbm9kZS0+aV9ubGluayA9IGJ0cmZzX2lub2RlX25saW5rKGxlYWYsIGlub2RlX2l0ZW0pOwpAQCAtMjU1NCw5ICsyNTY1LDcgQEAKIAogCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAodTY0KS0xOwogCUJUUkZTX0koaW5vZGUpLT5mbGFncyA9IGJ0cmZzX2lub2RlX2ZsYWdzKGxlYWYsIGlub2RlX2l0ZW0pOwotCi0JYWxsb2NfZ3JvdXBfYmxvY2sgPSBidHJmc19pbm9kZV9ibG9ja19ncm91cChsZWFmLCBpbm9kZV9pdGVtKTsKLQorY2FjaGVfYWNsOgogCS8qCiAJICogdHJ5IHRvIHByZWNhY2hlIGEgTlVMTCBhY2wgZW50cnkgZm9yIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZQogCSAqIGFueSB4YXR0cnMgb3IgYWNscwpAQCAtMjU2NiwxMCArMjU3NSwxMiBAQAogCWlmICghbWF5YmVfYWNscykKIAkJY2FjaGVfbm9fYWNsKGlub2RlKTsKIAotCUJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCA9IGJ0cmZzX2ZpbmRfYmxvY2tfZ3JvdXAocm9vdCwgMCwKLQkJCQkJCWFsbG9jX2dyb3VwX2Jsb2NrLCAwKTsKKwlpZiAobGVhZi0+bWFwX3Rva2VuKSB7CisJCXVubWFwX2V4dGVudF9idWZmZXIobGVhZiwgbGVhZi0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCWxlYWYtPm1hcF90b2tlbiA9IE5VTEw7CisJfQorCiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwotCWlub2RlX2l0ZW0gPSBOVUxMOwogCiAJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CiAJY2FzZSBTX0lGUkVHOgpAQCAtMjY0Nyw3ICsyNjU4LDcgQEAKIAlidHJmc19zZXRfaW5vZGVfdHJhbnNpZChsZWFmLCBpdGVtLCB0cmFucy0+dHJhbnNpZCk7CiAJYnRyZnNfc2V0X2lub2RlX3JkZXYobGVhZiwgaXRlbSwgaW5vZGUtPmlfcmRldik7CiAJYnRyZnNfc2V0X2lub2RlX2ZsYWdzKGxlYWYsIGl0ZW0sIEJUUkZTX0koaW5vZGUpLT5mbGFncyk7Ci0JYnRyZnNfc2V0X2lub2RlX2Jsb2NrX2dyb3VwKGxlYWYsIGl0ZW0sIEJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCk7CisJYnRyZnNfc2V0X2lub2RlX2Jsb2NrX2dyb3VwKGxlYWYsIGl0ZW0sIDApOwogCiAJaWYgKGxlYWYtPm1hcF90b2tlbikgewogCQl1bm1hcF9leHRlbnRfYnVmZmVyKGxlYWYsIGxlYWYtPm1hcF90b2tlbiwgS01fVVNFUjEpOwpAQCAtMjY2NywxMiArMjY3OCwxNCBAQAogCWludCByZXQ7CiAKIAkvKgotCSAqIElmIHJvb3QgaXMgdHJlZSByb290LCBpdCBtZWFucyB0aGlzIGlub2RlIGlzIHVzZWQgdG8KLQkgKiBzdG9yZSBmcmVlIHNwYWNlIGluZm9ybWF0aW9uLiBBbmQgdGhlc2UgaW5vZGVzIGFyZSB1cGRhdGVkCi0JICogd2hlbiBjb21taXR0aW5nIHRoZSB0cmFuc2FjdGlvbiwgc28gdGhleSBuZWVkbid0IGRlbGF5ZSB0bwotCSAqIGJlIHVwZGF0ZWQsIG9yIGRlYWRsb2NrIHdpbGwgb2NjdXJlZC4KKwkgKiBJZiB0aGUgaW5vZGUgaXMgYSBmcmVlIHNwYWNlIGlub2RlLCB3ZSBjYW4gZGVhZGxvY2sgZHVyaW5nIGNvbW1pdAorCSAqIGlmIHdlIHB1dCBpdCBpbnRvIHRoZSBkZWxheWVkIGNvZGUuCisJICoKKwkgKiBUaGUgZGF0YSByZWxvY2F0aW9uIGlub2RlIHNob3VsZCBhbHNvIGJlIGRpcmVjdGx5IHVwZGF0ZWQKKwkgKiB3aXRob3V0IGRlbGF5CiAJICovCi0JaWYgKCFpc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKSkgeworCWlmICghaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkKKwkgICAgJiYgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEKSB7CiAJCXJldCA9IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCWlmICghcmV0KQogCQkJYnRyZnNfc2V0X2lub2RlX2xhc3RfdHJhbnModHJhbnMsIGlub2RlKTsKQEAgLTMwMDQsOCArMzAxNyw2IEBACiAJaWYgKElTX0VSUih0cmFucykpCiAJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKLQogCWJ0cmZzX3JlY29yZF91bmxpbmtfZGlyKHRyYW5zLCBkaXIsIGRlbnRyeS0+ZF9pbm9kZSwgMCk7CiAKIAlyZXQgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX2lub2RlLApAQCAtMzA3NSw2ICszMDg2LDcgQEAKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGRpcik7CiAJQlVHX09OKHJldCk7CiAKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwOTQsOCArMzEwNiw2IEBACiAJaWYgKElTX0VSUih0cmFucykpCiAJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKLQogCWlmICh1bmxpa2VseShidHJmc19pbm8oaW5vZGUpID09IEJUUkZTX0VNUFRZX1NVQlZPTF9ESVJfT0JKRUNUSUQpKSB7CiAJCWVyciA9IGJ0cmZzX3VubGlua19zdWJ2b2wodHJhbnMsIHJvb3QsIGRpciwKIAkJCQkJICBCVFJGU19JKGlub2RlKS0+bG9jYXRpb24ub2JqZWN0aWQsCkBAIC0zNTE0LDcgKzM1MjQsNiBAQAogCQkJCWVyciA9IFBUUl9FUlIodHJhbnMpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAKIAkJCWVyciA9IGJ0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgaW5vZGUsIGN1cl9vZmZzZXQsCiAJCQkJCQkgY3VyX29mZnNldCArIGhvbGVfc2l6ZSwKQEAgLTM2NDgsOSArMzY1Nyw4IEBACiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKIAogCXdoaWxlICgxKSB7Ci0JCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAkJQlVHX09OKElTX0VSUih0cmFucykpOwotCQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAkJdHJhbnMtPmJsb2NrX3JzdiA9IHJvb3QtPm9ycGhhbl9ibG9ja19yc3Y7CiAKIAkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHRyYW5zLCByb290LApAQCAtNDEzMyw3ICs0MTQxLDggQEAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcGF0aC0+cmVhZGEgPSAyOworCisJcGF0aC0+cmVhZGEgPSAxOwogCiAJaWYgKGtleV90eXBlID09IEJUUkZTX0RJUl9JTkRFWF9LRVkpIHsKIAkJSU5JVF9MSVNUX0hFQUQoJmluc19saXN0KTsKQEAgLTQyNjgsMTggKzQyNzcsMTYgQEAKIAlpZiAoQlRSRlNfSShpbm9kZSktPmR1bW15X2lub2RlKQogCQlyZXR1cm4gMDsKIAotCXNtcF9tYigpOwotCWlmIChyb290LT5mc19pbmZvLT5jbG9zaW5nICYmIGlzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpKQorCWlmIChidHJmc19mc19jbG9zaW5nKHJvb3QtPmZzX2luZm8pICYmIGlzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpKQogCQlub2xvY2sgPSB0cnVlOwogCiAJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKSB7CiAJCWlmIChub2xvY2spCi0JCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb25fbm9sb2NrKHJvb3QsIDEpOworCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhyb290KTsKIAkJZWxzZQotCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKLQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJCWlmIChub2xvY2spCiAJCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb25fbm9sb2NrKHRyYW5zLCByb290KTsKIAkJZWxzZQpAQCAtNDMwMyw5ICs0MzEwLDggQEAKIAlpZiAoQlRSRlNfSShpbm9kZSktPmR1bW15X2lub2RlKQogCQlyZXR1cm47CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCWlmIChyZXQgJiYgcmV0ID09IC1FTk9TUEMpIHsKQEAgLTQzMTksNyArNDMyNSw2IEBACiAJCQkJICAgICAgIFBUUl9FUlIodHJhbnMpKTsKIAkJCXJldHVybjsKIAkJfQotCQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKIAogCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAkJaWYgKHJldCkgewpAQCAtNDQxOCw4ICs0NDIzLDggQEAKIAkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCSAgICAgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCi0JCQkJICAgICB1NjQgcmVmX29iamVjdGlkLCB1NjQgb2JqZWN0aWQsCi0JCQkJICAgICB1NjQgYWxsb2NfaGludCwgaW50IG1vZGUsIHU2NCAqaW5kZXgpCisJCQkJICAgICB1NjQgcmVmX29iamVjdGlkLCB1NjQgb2JqZWN0aWQsIGludCBtb2RlLAorCQkJCSAgICAgdTY0ICppbmRleCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOwpAQCAtNDQ3Miw4ICs0NDc3LDYgQEAKIAkJb3duZXIgPSAwOwogCWVsc2UKIAkJb3duZXIgPSAxOwotCUJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCA9Ci0JCQlidHJmc19maW5kX2Jsb2NrX2dyb3VwKHJvb3QsIDAsIGFsbG9jX2hpbnQsIG93bmVyKTsKIAogCWtleVswXS5vYmplY3RpZCA9IG9iamVjdGlkOwogCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5WzBdLCBCVFJGU19JTk9ERV9JVEVNX0tFWSk7CkBAIC00NTI3LDYgKzQ1MzAsNyBAQAogCWlub2RlX3RyZWVfYWRkKGlub2RlKTsKIAogCXRyYWNlX2J0cmZzX2lub2RlX25ldyhpbm9kZSk7CisJYnRyZnNfc2V0X2lub2RlX2xhc3RfdHJhbnModHJhbnMsIGlub2RlKTsKIAogCXJldHVybiBpbm9kZTsKIGZhaWw6CkBAIC00NjI5LDE1ICs0NjMzLDEzIEBACiAJaWYgKElTX0VSUih0cmFucykpCiAJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKLQogCWVyciA9IGJ0cmZzX2ZpbmRfZnJlZV9pbm8ocm9vdCwgJm9iamVjdGlkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlpbm9kZSA9IGJ0cmZzX25ld19pbm9kZSh0cmFucywgcm9vdCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCWRlbnRyeS0+ZF9uYW1lLmxlbiwgYnRyZnNfaW5vKGRpciksIG9iamVjdGlkLAotCQkJCUJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXAsIG1vZGUsICZpbmRleCk7CisJCQkJbW9kZSwgJmluZGV4KTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNDY0OSw3ICs0NjUxLDYgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCWVyciA9IGJ0cmZzX2FkZF9ub25kaXIodHJhbnMsIGRpciwgZGVudHJ5LCBpbm9kZSwgMCwgaW5kZXgpOwogCWlmIChlcnIpCiAJCWRyb3BfaW5vZGUgPSAxOwpAQCAtNDY1OCw4ICs0NjU5LDYgQEAKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKIAkJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJfQotCWJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwotCWJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCh0cmFucywgZGlyKTsKIG91dF91bmxvY2s6CiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCByb290KTsKQEAgLTQ2OTIsMTUgKzQ2OTEsMTMgQEAKIAlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwotCiAJZXJyID0gYnRyZnNfZmluZF9mcmVlX2lubyhyb290LCAmb2JqZWN0aWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWlub2RlID0gYnRyZnNfbmV3X2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJZGVudHJ5LT5kX25hbWUubGVuLCBidHJmc19pbm8oZGlyKSwgb2JqZWN0aWQsCi0JCQkJQlRSRlNfSShkaXIpLT5ibG9ja19ncm91cCwgbW9kZSwgJmluZGV4KTsKKwkJCQltb2RlLCAmaW5kZXgpOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC00NzEyLDcgKzQ3MDksNiBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJZXJyID0gYnRyZnNfYWRkX25vbmRpcih0cmFucywgZGlyLCBkZW50cnksIGlub2RlLCAwLCBpbmRleCk7CiAJaWYgKGVycikKIAkJZHJvcF9pbm9kZSA9IDE7CkBAIC00NzIzLDggKzQ3MTksNiBAQAogCQlpbm9kZS0+aV9vcCA9ICZidHJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCUJUUkZTX0koaW5vZGUpLT5pb190cmVlLm9wcyA9ICZidHJmc19leHRlbnRfaW9fb3BzOwogCX0KLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiBvdXRfdW5sb2NrOgogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CkBAIC00NzcxLDggKzQ3NjUsNiBAQAogCiAJYnRyZnNfaW5jX25saW5rKGlub2RlKTsKIAlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKIAlpaG9sZChpbm9kZSk7CiAKIAllcnIgPSBidHJmc19hZGRfbm9uZGlyKHRyYW5zLCBkaXIsIGRlbnRyeSwgaW5vZGUsIDEsIGluZGV4KTsKQEAgLTQ3ODEsNyArNDc3Myw2IEBACiAJCWRyb3BfaW5vZGUgPSAxOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7Ci0JCWJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCh0cmFucywgZGlyKTsKIAkJZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCUJVR19PTihlcnIpOwogCQlidHJmc19sb2dfbmV3X25hbWUodHJhbnMsIGlub2RlLCBOVUxMLCBwYXJlbnQpOwpAQCAtNDgxOCw3ICs0ODA5LDYgQEAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDUpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7Ci0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwogCiAJZXJyID0gYnRyZnNfZmluZF9mcmVlX2lubyhyb290LCAmb2JqZWN0aWQpOwogCWlmIChlcnIpCkBAIC00ODI2LDggKzQ4MTYsNyBAQAogCiAJaW5vZGUgPSBidHJmc19uZXdfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQlkZW50cnktPmRfbmFtZS5sZW4sIGJ0cmZzX2lubyhkaXIpLCBvYmplY3RpZCwKLQkJCQlCVFJGU19JKGRpciktPmJsb2NrX2dyb3VwLCBTX0lGRElSIHwgbW9kZSwKLQkJCQkmaW5kZXgpOworCQkJCVNfSUZESVIgfCBtb2RlLCAmaW5kZXgpOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQlnb3RvIG91dF9mYWlsOwpAQCAtNDg0MSw3ICs0ODMwLDYgQEAKIAogCWlub2RlLT5pX29wID0gJmJ0cmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZidHJmc19kaXJfZmlsZV9vcGVyYXRpb25zOwotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwogCiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKIAllcnIgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKQEAgLTQ4NTUsOCArNDg0Myw2IEBACiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCWRyb3Bfb25fZXJyID0gMDsKLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiAKIG91dF9mYWlsOgogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwpAQCAtNDk4OSw3ICs0OTc1LDE1IEBACiAKIAlpZiAoIXBhdGgpIHsKIAkJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQkJQlVHX09OKCFwYXRoKTsKKwkJaWYgKCFwYXRoKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyoKKwkJICogQ2hhbmNlcyBhcmUgd2UnbGwgYmUgY2FsbGVkIGFnYWluLCBzbyBnbyBhaGVhZCBhbmQgZG8KKwkJICogcmVhZGFoZWFkCisJCSAqLworCQlwYXRoLT5yZWFkYSA9IDE7CiAJfQogCiAJcmV0ID0gYnRyZnNfbG9va3VwX2ZpbGVfZXh0ZW50KHRyYW5zLCByb290LCBwYXRoLApAQCAtNTEzMCw4ICs1MTI0LDEwIEBACiAJCQkJa3VubWFwKHBhZ2UpOwogCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCQkJZW0gPSBOVUxMOworCiAJCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwotCQkJCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CisKIAkJCQlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJCQkJcmV0dXJuIEVSUl9DQVNUKHRyYW5zKTsKIAkJCQlnb3RvIGFnYWluOwpAQCAtNTM3NSw3ICs1MzcxLDcgQEAKIAkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBzdGFydCArIGxlbiAtIDEsIDApOwogCX0KIAotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAwKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpCiAJCXJldHVybiBFUlJfQ0FTVCh0cmFucyk7CiAKQEAgLTU2MTEsNyArNTYwNyw3IEBACiAJCSAqIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzdGF5cyBvcGVuCiAJCSAqIHdoaWxlIHdlIGxvb2sgZm9yIG5vY293IGNyb3NzIHJlZnMKIAkJICovCi0JCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAwKTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCQlpZiAoSVNfRVJSKHRyYW5zKSkKIAkJCWdvdG8gbXVzdF9jb3c7CiAKQEAgLTU3NTAsNyArNTc0Niw3IEBACiAKIAlCVUdfT04oIW9yZGVyZWQpOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTY1MDAsNiArNjQ5Niw3IEBACiBzdGF0aWMgaW50IGJ0cmZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpyc3Y7CiAJaW50IHJldDsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKQEAgLTY1MTMsMjggKzY1MTAsODAgQEAKIAlidHJmc193YWl0X29yZGVyZWRfcmFuZ2UoaW5vZGUsIGlub2RlLT5pX3NpemUgJiAofm1hc2spLCAodTY0KS0xKTsKIAlidHJmc19vcmRlcmVkX3VwZGF0ZV9pX3NpemUoaW5vZGUsIGlub2RlLT5pX3NpemUsIE5VTEwpOwogCi0JdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCA1KTsKLQlpZiAoSVNfRVJSKHRyYW5zKSkKLQkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOworCS8qCisJICogWWVzIGxhZGllcyBhbmQgZ2VudGVsbWVudCwgdGhpcyBpcyBpbmRlZWQgdWdseS4gIFRoZSBmYWN0IGlzIHdlIGhhdmUKKwkgKiAzIHRoaW5ncyBnb2luZyBvbiBoZXJlCisJICoKKwkgKiAxKSBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIG91ciBvcnBoYW4gaXRlbSBhbmQgdGhlIHNwYWNlIHRvCisJICogZGVsZXRlIG91ciBvcnBoYW4gaXRlbS4gIExvcmQga25vd3Mgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIGEgZGFuZ2xpbmcKKwkgKiBvcnBoYW4gaXRlbSBiZWNhdXNlIHdlIGRpZG4ndCByZXNlcnZlIHNwYWNlIHRvIHJlbW92ZSBpdC4KKwkgKgorCSAqIDIpIFdlIG5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSB0byB1cGRhdGUgb3VyIGlub2RlLgorCSAqCisJICogMykgV2UgbmVlZCB0byBoYXZlIHNvbWV0aGluZyB0byBjYWNoZSBhbGwgdGhlIHNwYWNlIHRoYXQgaXMgZ29pbmcgdG8KKwkgKiBiZSBmcmVlJ2QgdXAgYnkgdGhlIHRydW5jYXRlIG9wZXJhdGlvbiwgYnV0IGFsc28gaGF2ZSBzb21lIHNsYWNrCisJICogc3BhY2UgcmVzZXJ2ZWQgaW4gY2FzZSBpdCB1c2VzIHNwYWNlIGR1cmluZyB0aGUgdHJ1bmNhdGUgKHRoYW5rIHlvdQorCSAqIHZlcnkgbXVjaCBzbmFwc2hvdHRpbmcpLgorCSAqCisJICogQW5kIHdlIG5lZWQgdGhlc2UgdG8gYWxsIGJlIHNlcGVyYXRlLiAgVGhlIGZhY3QgaXMgd2UgY2FuIHVzZSBhbG90IG9mCisJICogc3BhY2UgZG9pbmcgdGhlIHRydW5jYXRlLCBhbmQgd2UgaGF2ZSBubyBlYXJ0aGx5IGlkZWEgaG93IG11Y2ggc3BhY2UKKwkgKiB3ZSB3aWxsIHVzZSwgc28gd2UgbmVlZCB0aGUgdHJ1bmNhdGUgcmVzZXJ2YXRpb24gdG8gYmUgc2VwZXJhdGUgc28gaXQKKwkgKiBkb2Vzbid0IGVuZCB1cCB1c2luZyBzcGFjZSByZXNlcnZlZCBmb3IgdXBkYXRpbmcgdGhlIGlub2RlIG9yCisJICogcmVtb3ZpbmcgdGhlIG9ycGhhbiBpdGVtLiAgV2UgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8gc3RvcCB0aGUKKwkgKiB0cmFuc2FjdGlvbiBhbmQgc3RhcnQgYSBuZXcgb25lLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8KKwkgKiB1cGRhdGUgdGhlIGlub2RlIHNldmVyYWwgdGltZXMsIGFuZCB3ZSBoYXZlIG5vIGlkZWEgb2Yga25vd2luZyBob3cKKwkgKiBtYW55IHRpbWVzIHRoYXQgd2lsbCBiZSwgc28gd2UgY2FuJ3QganVzdCByZXNlcnZlIDEgaXRlbSBmb3IgdGhlCisJICogZW50aXJldHkgb2YgdGhlIG9wcmF0aW9uLCBzbyB0aGF0IGhhcyB0byBiZSBkb25lIHNlcGVyYXRlbHkgYXMgd2VsbC4KKwkgKiBUaGVuIHRoZXJlIGlzIHRoZSBvcnBoYW4gaXRlbSwgd2hpY2ggZG9lcyBpbmRlZWQgbmVlZCB0byBiZSBoZWxkIG9uCisJICogdG8gZm9yIHRoZSB3aG9sZSBvcGVyYXRpb24sIGFuZCB3ZSBuZWVkIG5vYm9keSB0byB0b3VjaCB0aGlzIHJlc2VydmVkCisJICogc3BhY2UgZXhjZXB0IHRoZSBvcnBoYW4gY29kZS4KKwkgKgorCSAqIFNvIHRoYXQgbGVhdmVzIHVzIHdpdGgKKwkgKgorCSAqIDEpIHJvb3QtPm9ycGhhbl9ibG9ja19yc3YgLSBmb3IgdGhlIG9ycGhhbiBkZWxldGlvbi4KKwkgKiAyKSByc3YgLSBmb3IgdGhlIHRydW5jYXRlIHJlc2VydmF0aW9uLCB3aGljaCB3ZSB3aWxsIHN0ZWFsIGZyb20gdGhlCisJICogdHJhbnNhY3Rpb24gcmVzZXJ2YXRpb24uCisJICogMykgZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2IC0gdGhpcyB3aWxsIGhhdmUgMSBpdGVtcyB3b3J0aCBsZWZ0IGZvcgorCSAqIHVwZGF0aW5nIHRoZSBpbm9kZS4KKwkgKi8KKwlyc3YgPSBidHJmc19hbGxvY19ibG9ja19yc3Yocm9vdCk7CisJaWYgKCFyc3YpCisJCXJldHVybiAtRU5PTUVNOworCWJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3Jzdihyb290LT5mc19pbmZvLCByc3YpOwogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCA0KTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgdHJ1bmNhdGUgcHJvY2Vzcy4gIFRydW5jYXRlIHNob3VsZCBiZSBhZGRpbmcKKwkgKiBzcGFjZSwgYnV0IGlmIHRoZXJlIGFyZSBzbmFwc2hvdHMgaXQgbWF5IGVuZCB1cCB1c2luZyBzcGFjZS4KKwkgKi8KKwlyZXQgPSBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LCByc3YpOworCUJVR19PTihyZXQpOwogCiAJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwogCWlmIChyZXQpIHsKIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAJfQogCiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKIAotCS8qIE5vdyBzdGFydCBhIHRyYW5zYWN0aW9uIGZvciB0aGUgdHJ1bmNhdGUgKi8KLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwotCWlmIChJU19FUlIodHJhbnMpKQotCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7Ci0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0JdHJhbnMtPmJsb2NrX3JzdiA9IHJvb3QtPm9ycGhhbl9ibG9ja19yc3Y7CisJLyoKKwkgKiBPayBzbyB3ZSd2ZSBhbHJlYWR5IG1pZ3JhdGVkIG91ciBieXRlcyBvdmVyIGZvciB0aGUgdHJ1bmNhdGUsIHNvIGhlcmUKKwkgKiBqdXN0IHJlc2VydmUgdGhlIG9uZSBzbG90IHdlIG5lZWQgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZS4KKwkgKi8KKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWlmIChJU19FUlIodHJhbnMpKSB7CisJCWVyciA9IFBUUl9FUlIodHJhbnMpOworCQlnb3RvIG91dDsKKwl9CisJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKIAogCS8qCiAJICogc2V0YXR0ciBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGUgb3JkZXJlZF9kYXRhX2Nsb3NlIGZsYWcsCkBAIC02NTU4LDI0ICs2NjA3LDE3IEBACiAKIAl3aGlsZSAoMSkgewogCQlpZiAoIXRyYW5zKSB7Ci0JCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwotCQkJaWYgKElTX0VSUih0cmFucykpCi0JCQkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwotCQkJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7Ci0JCQl0cmFucy0+YmxvY2tfcnN2ID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdjsKLQkJfQorCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAzKTsKKwkJCWlmIChJU19FUlIodHJhbnMpKSB7CisJCQkJZXJyID0gUFRSX0VSUih0cmFucyk7CisJCQkJZ290byBvdXQ7CisJCQl9CiAKLQkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHRyYW5zLCByb290LAotCQkJCQkgICAgcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdiwgMCwgNSk7Ci0JCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJCXRyYW5zID0gTlVMTDsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHJldCkgewotCQkJZXJyID0gcmV0OwotCQkJYnJlYWs7CisJCQlyZXQgPSBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LAorCQkJCQkJCSAgICAgIHJzdik7CisJCQlCVUdfT04ocmV0KTsKKworCQkJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKIAkJfQogCiAJCXJldCA9IGJ0cmZzX3RydW5jYXRlX2lub2RlX2l0ZW1zKHRyYW5zLCByb290LCBpbm9kZSwKQEAgLTY1ODYsNiArNjYyOCw3IEBACiAJCQlicmVhazsKIAkJfQogCisJCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwogCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAkJaWYgKHJldCkgewogCQkJZXJyID0gcmV0OwpAQCAtNjU5OSw2ICs2NjQyLDcgQEAKIAl9CiAKIAlpZiAocmV0ID09IDAgJiYgaW5vZGUtPmlfbmxpbmsgPiAwKSB7CisJCXRyYW5zLT5ibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwogCQlyZXQgPSBidHJmc19vcnBoYW5fZGVsKHRyYW5zLCBpbm9kZSk7CiAJCWlmIChyZXQpCiAJCQllcnIgPSByZXQ7CkBAIC02NjEwLDE1ICs2NjU0LDIwIEBACiAJCXJldCA9IGJ0cmZzX29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpOwogCX0KIAorCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCWlmIChyZXQgJiYgIWVycikKIAkJZXJyID0gcmV0OwogCiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAJcmV0ID0gYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCByb290KTsKKwlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKKworb3V0OgorCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJvb3QsIHJzdik7CisKIAlpZiAocmV0ICYmICFlcnIpCiAJCWVyciA9IHJldDsKLQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02NjI3LDE1ICs2Njc2LDE0IEBACiAgKiBjcmVhdGUgYSBuZXcgc3Vidm9sdW1lIGRpcmVjdG9yeS9pbm9kZSAoaGVscGVyIGZvciB0aGUgaW9jdGwpLgogICovCiBpbnQgYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3QsCi0JCQkgICAgIHU2NCBuZXdfZGlyaWQsIHU2NCBhbGxvY19oaW50KQorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3QsIHU2NCBuZXdfZGlyaWQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyOwogCXU2NCBpbmRleCA9IDA7CiAKIAlpbm9kZSA9IGJ0cmZzX25ld19pbm9kZSh0cmFucywgbmV3X3Jvb3QsIE5VTEwsICIuLiIsIDIsIG5ld19kaXJpZCwKLQkJCQluZXdfZGlyaWQsIGFsbG9jX2hpbnQsIFNfSUZESVIgfCAwNzAwLCAmaW5kZXgpOworCQkJCW5ld19kaXJpZCwgU19JRkRJUiB8IDA3MDAsICZpbmRleCk7CiAJaWYgKElTX0VSUihpbm9kZSkpCiAJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKIAlpbm9kZS0+aV9vcCA9ICZidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTY3NDgsMjEgKzY3OTYsNiBAQAogCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+b3JkZXJlZF9leHRlbnRfbG9jayk7CiAJfQogCi0JaWYgKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KSB7Ci0JCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXA7Ci0KLQkJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywKLQkJCQkJCUJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCk7Ci0JCWlmIChibG9ja19ncm91cCAmJiBibG9ja19ncm91cC0+aW5vZGUgPT0gaW5vZGUpIHsKLQkJCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwotCQkJYmxvY2tfZ3JvdXAtPmlub2RlID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+bG9jayk7Ci0JCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwotCQl9IGVsc2UgaWYgKGJsb2NrX2dyb3VwKSB7Ci0JCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwotCQl9Ci0JfQotCiAJc3Bpbl9sb2NrKCZyb290LT5vcnBoYW5fbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZCVFJGU19JKGlub2RlKS0+aV9vcnBoYW4pKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkJUUkZTOiBpbm9kZSAlbGx1IHN0aWxsIG9uIHRoZSBvcnBoYW4gbGlzdFxuIiwKQEAgLTY5NDgsOCArNjk4MSw2IEBACiAgICAgICAgICAgICAgICAgZ290byBvdXRfbm90cmFuczsKICAgICAgICAgfQogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBuZXdfZGlyKTsKLQogCWlmIChkZXN0ICE9IHJvb3QpCiAJCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCBkZXN0KTsKIApAQCAtNzEzMSwxNiArNzE2MiwxMyBAQAogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7Ci0KIAllcnIgPSBidHJmc19maW5kX2ZyZWVfaW5vKHJvb3QsICZvYmplY3RpZCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJaW5vZGUgPSBidHJmc19uZXdfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQlkZW50cnktPmRfbmFtZS5sZW4sIGJ0cmZzX2lubyhkaXIpLCBvYmplY3RpZCwKLQkJCQlCVFJGU19JKGRpciktPmJsb2NrX2dyb3VwLCBTX0lGTE5LfFNfSVJXWFVHTywKLQkJCQkmaW5kZXgpOworCQkJCVNfSUZMTkt8U19JUldYVUdPLCAmaW5kZXgpOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC03MTUyLDcgKzcxODAsNiBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CiAJZXJyID0gYnRyZnNfYWRkX25vbmRpcih0cmFucywgZGlyLCBkZW50cnksIGlub2RlLCAwLCBpbmRleCk7CiAJaWYgKGVycikKIAkJZHJvcF9pbm9kZSA9IDE7CkBAIC03MTYzLDggKzcxOTAsNiBAQAogCQlpbm9kZS0+aV9vcCA9ICZidHJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCUJUUkZTX0koaW5vZGUpLT5pb190cmVlLm9wcyA9ICZidHJmc19leHRlbnRfaW9fb3BzOwogCX0KLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiAJaWYgKGRyb3BfaW5vZGUpCiAJCWdvdG8gb3V0X3VubG9jazsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW9jdGwuYyBiL2ZzL2J0cmZzL2lvY3RsLmMKaW5kZXggODVlODE4Yy4uYTNjNDc1MSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW9jdGwuYworKysgYi9mcy9idHJmcy9pb2N0bC5jCkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJaXAtPmZsYWdzICY9IH4oQlRSRlNfSU5PREVfQ09NUFJFU1MgfCBCVFJGU19JTk9ERV9OT0NPTVBSRVNTKTsKIAl9CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKIAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwpAQCAtNDE0LDggKzQxNCw3IEBACiAKIAlidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyh0cmFucywgbmV3X3Jvb3QpOwogCi0JcmV0ID0gYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHRyYW5zLCBuZXdfcm9vdCwgbmV3X2RpcmlkLAotCQkJCSAgICAgICBCVFJGU19JKGRpciktPmJsb2NrX2dyb3VwKTsKKwlyZXQgPSBidHJmc19jcmVhdGVfc3Vidm9sX3Jvb3QodHJhbnMsIG5ld19yb290LCBuZXdfZGlyaWQpOwogCS8qCiAJICogaW5zZXJ0IHRoZSBkaXJlY3RvcnkgaXRlbQogCSAqLwpAQCAtNDgzLDggKzQ4MiwxMCBAQAogCXJldCA9IGJ0cmZzX3NuYXBfcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgcGVuZGluZ19zbmFwc2hvdCk7CiAJQlVHX09OKHJldCk7CiAKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCWxpc3RfYWRkKCZwZW5kaW5nX3NuYXBzaG90LT5saXN0LAogCQkgJnRyYW5zLT50cmFuc2FjdGlvbi0+cGVuZGluZ19zbmFwc2hvdHMpOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAlpZiAoYXN5bmNfdHJhbnNpZCkgewogCQkqYXN5bmNfdHJhbnNpZCA9IHRyYW5zLT50cmFuc2lkOwogCQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb25fYXN5bmModHJhbnMsCkBAIC03MDcsMTYgKzcwOCwxNyBAQAogCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpleHRlbnQ7CiAJaW50IHR5cGU7CiAJaW50IHJldDsKKwl1NjQgaW5vID0gYnRyZnNfaW5vKGlub2RlKTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1pbl9rZXkub2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisJbWluX2tleS5vYmplY3RpZCA9IGlubzsKIAltaW5fa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfREFUQV9LRVk7CiAJbWluX2tleS5vZmZzZXQgPSAqb2ZmOwogCi0JbWF4X2tleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwltYXhfa2V5Lm9iamVjdGlkID0gaW5vOwogCW1heF9rZXkudHlwZSA9ICh1OCktMTsKIAltYXhfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAKQEAgLTcyNyw3ICs3MjksNyBAQAogCQkJCQkgICBwYXRoLCAwLCBuZXdlcl90aGFuKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBub25lOwotCQlpZiAobWluX2tleS5vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pCisJCWlmIChtaW5fa2V5Lm9iamVjdGlkICE9IGlubykKIAkJCWdvdG8gbm9uZTsKIAkJaWYgKG1pbl9rZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCiAJCQlnb3RvIG5vbmU7CkBAIC0yMDU0LDI5ICsyMDU2LDM0IEBACiAKIHN0YXRpYyBsb25nIGJ0cmZzX2lvY3RsX2ZzX2luZm8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHZvaWQgX191c2VyICphcmcpCiB7Ci0Jc3RydWN0IGJ0cmZzX2lvY3RsX2ZzX2luZm9fYXJncyBmaV9hcmdzOworCXN0cnVjdCBidHJmc19pb2N0bF9mc19pbmZvX2FyZ3MgKmZpX2FyZ3M7CiAJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBidHJmc19kZXZpY2UgKm5leHQ7CiAJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzOworCWludCByZXQgPSAwOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JZmlfYXJncy5udW1fZGV2aWNlcyA9IGZzX2RldmljZXMtPm51bV9kZXZpY2VzOwotCWZpX2FyZ3MubWF4X2lkID0gMDsKLQltZW1jcHkoJmZpX2FyZ3MuZnNpZCwgcm9vdC0+ZnNfaW5mby0+ZnNpZCwgc2l6ZW9mKGZpX2FyZ3MuZnNpZCkpOworCWZpX2FyZ3MgPSBremFsbG9jKHNpemVvZigqZmlfYXJncyksIEdGUF9LRVJORUwpOworCWlmICghZmlfYXJncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaV9hcmdzLT5udW1fZGV2aWNlcyA9IGZzX2RldmljZXMtPm51bV9kZXZpY2VzOworCW1lbWNweSgmZmlfYXJncy0+ZnNpZCwgcm9vdC0+ZnNfaW5mby0+ZnNpZCwgc2l6ZW9mKGZpX2FyZ3MtPmZzaWQpKTsKIAogCW11dGV4X2xvY2soJmZzX2RldmljZXMtPmRldmljZV9saXN0X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2aWNlLCBuZXh0LCAmZnNfZGV2aWNlcy0+ZGV2aWNlcywgZGV2X2xpc3QpIHsKLQkJaWYgKGRldmljZS0+ZGV2aWQgPiBmaV9hcmdzLm1heF9pZCkKLQkJCWZpX2FyZ3MubWF4X2lkID0gZGV2aWNlLT5kZXZpZDsKKwkJaWYgKGRldmljZS0+ZGV2aWQgPiBmaV9hcmdzLT5tYXhfaWQpCisJCQlmaV9hcmdzLT5tYXhfaWQgPSBkZXZpY2UtPmRldmlkOwogCX0KIAltdXRleF91bmxvY2soJmZzX2RldmljZXMtPmRldmljZV9saXN0X211dGV4KTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZmlfYXJncywgc2l6ZW9mKGZpX2FyZ3MpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihhcmcsIGZpX2FyZ3MsIHNpemVvZigqZmlfYXJncykpKQorCQlyZXQgPSAtRUZBVUxUOwogCi0JcmV0dXJuIDA7CisJa2ZyZWUoZmlfYXJncyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfZGV2X2luZm8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHZvaWQgX191c2VyICphcmcpCkBAIC0yNDg5LDEyICsyNDk2LDEwIEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0Jcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucysrOwotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpOwogCiAJcmV0ID0gLUVOT01FTTsKLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X2lvY3RsX3RyYW5zYWN0aW9uKHJvb3QsIDApOworCXRyYW5zID0gYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24ocm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpCiAJCWdvdG8gb3V0X2Ryb3A7CiAKQEAgLTI1MDIsOSArMjUwNyw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF9kcm9wOgotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQlyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zLS07Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJYXRvbWljX2RlYygmcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucyk7CiAJbW50X2Ryb3Bfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTI3MzgsOSArMjc0MSw3IEBACiAKIAlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMtLTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlhdG9taWNfZGVjKCZyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKTsKIAogCW1udF9kcm9wX3dyaXRlKGZpbGUtPmZfcGF0aC5tbnQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jIGIvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCmluZGV4IGNhMzhlY2EuLjVlMGEzZGMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3JlbG9jYXRpb24uYworKysgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKQEAgLTY3Nyw2ICs2NzcsOCBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CisJcGF0aDEtPnJlYWRhID0gMTsKKwlwYXRoMi0+cmVhZGEgPSAyOwogCiAJbm9kZSA9IGFsbG9jX2JhY2tyZWZfbm9kZShjYWNoZSk7CiAJaWYgKCFub2RlKSB7CkBAIC0xMzY2LDcgKzEzNjgsNyBAQAogCWludCByZXQ7CiAKIAlpZiAoIXJvb3QtPnJlbG9jX3Jvb3QpCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCXJlbG9jX3Jvb3QgPSByb290LT5yZWxvY19yb290OwogCXJvb3RfaXRlbSA9ICZyZWxvY19yb290LT5yb290X2l0ZW07CkBAIC0xMzg4LDYgKzEzOTAsOCBAQAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9yb290KHRyYW5zLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCiAJCQkJJnJlbG9jX3Jvb3QtPnJvb3Rfa2V5LCByb290X2l0ZW0pOwogCUJVR19PTihyZXQpOworCitvdXQ6CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OTksNiArMjAwMyw3IEBACiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gMTsKIAogCXJlbG9jX3Jvb3QgPSByb290LT5yZWxvY19yb290OwogCXJvb3RfaXRlbSA9ICZyZWxvY19yb290LT5yb290X2l0ZW07CkBAIC0yMTM5LDEwICsyMTQ0LDExIEBACiAJdTY0IG51bV9ieXRlcyA9IDA7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CiAJcmMtPm1lcmdpbmdfcnN2X3NpemUgKz0gcm9vdC0+bm9kZXNpemUgKiAoQlRSRlNfTUFYX0xFVkVMIC0gMSkgKiAyOwogCXJjLT5tZXJnaW5nX3Jzdl9zaXplICs9IHJjLT5ub2Rlc19yZWxvY2F0ZWQgKiAyOwotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOworCiBhZ2FpbjoKIAlpZiAoIWVycikgewogCQludW1fYnl0ZXMgPSByYy0+bWVyZ2luZ19yc3Zfc2l6ZTsKQEAgLTIxNTIsNyArMjE1OCw3IEBACiAJCQllcnIgPSByZXQ7CiAJfQogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpIHsKIAkJaWYgKCFlcnIpCiAJCQlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyYy0+ZXh0ZW50X3Jvb3QsCkBAIC0yMjExLDkgKzIyMTcsMTYgQEAKIAlpbnQgcmV0OwogYWdhaW46CiAJcm9vdCA9IHJjLT5leHRlbnRfcm9vdDsKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisKKwkvKgorCSAqIHRoaXMgc2VyaWFsaXplcyB1cyB3aXRoIGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zYWN0aW9uLAorCSAqIHdlIGhhdmUgdG8gbWFrZSBzdXJlIG5vYm9keSBpcyBpbiB0aGUgbWlkZGxlIG9mCisJICogYWRkaW5nIHRoZWlyIHJvb3RzIHRvIHRoZSBsaXN0IHdoaWxlIHdlIGFyZQorCSAqIGRvaW5nIHRoaXMgc3BsaWNlCisJICovCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCWxpc3Rfc3BsaWNlX2luaXQoJnJjLT5yZWxvY19yb290cywgJnJlbG9jX3Jvb3RzKTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmVsb2Nfcm9vdHMpKSB7CiAJCWZvdW5kID0gMTsKQEAgLTMyMzYsNyArMzI0OSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAwKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpIHsKIAkJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKQEAgLTMzMDAsNiArMzMxMyw3IEBACiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gMTsKIAogCXJvb3QgPSByZWFkX2ZzX3Jvb3QocmMtPmV4dGVudF9yb290LT5mc19pbmZvLCByZWZfcm9vdCk7CiAJaWYgKElTX0VSUihyb290KSkgewpAQCAtMzU4NiwxNyArMzYwMCwxOSBAQAogc3RhdGljIHZvaWQgc2V0X3JlbG9jX2NvbnRyb2woc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJjKQogewogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcmMtPmV4dGVudF9yb290LT5mc19pbmZvOwotCW11dGV4X2xvY2soJmZzX2luZm8tPnRyYW5zX211dGV4KTsKKworCW11dGV4X2xvY2soJmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAlmc19pbmZvLT5yZWxvY19jdGwgPSByYzsKLQltdXRleF91bmxvY2soJmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwltdXRleF91bmxvY2soJmZzX2luZm8tPnJlbG9jX211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgdW5zZXRfcmVsb2NfY29udHJvbChzdHJ1Y3QgcmVsb2NfY29udHJvbCAqcmMpCiB7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByYy0+ZXh0ZW50X3Jvb3QtPmZzX2luZm87Ci0JbXV0ZXhfbG9jaygmZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCisJbXV0ZXhfbG9jaygmZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCWZzX2luZm8tPnJlbG9jX2N0bCA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT50cmFuc19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfZXh0ZW50X2ZsYWdzKHU2NCBmbGFncykKQEAgLTM2NDUsNyArMzY2MSw3IEBACiAJcmMtPmNyZWF0ZV9yZWxvY190cmVlID0gMTsKIAlzZXRfcmVsb2NfY29udHJvbChyYyk7CiAKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocmMtPmV4dGVudF9yb290LCAxKTsKKwl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocmMtPmV4dGVudF9yb290KTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAJYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByYy0+ZXh0ZW50X3Jvb3QpOwogCXJldHVybiAwOwpAQCAtMzY2OCw2ICszNjg0LDcgQEAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CisJcGF0aC0+cmVhZGEgPSAxOwogCiAJcmV0ID0gcHJlcGFyZV90b19yZWxvY2F0ZShyYyk7CiAJaWYgKHJldCkgewpAQCAtMzgzNCw3ICszODUxLDcgQEAKIAlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyYy0+ZXh0ZW50X3Jvb3QsIHJjLT5ibG9ja19yc3YsICh1NjQpLTEpOwogCiAJLyogZ2V0IHJpZCBvZiBwaW5uZWQgZXh0ZW50cyAqLwotCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QsIDEpOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QpOwogCWlmIChJU19FUlIodHJhbnMpKQogCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKIAllbHNlCkBAIC00MDkzLDYgKzQxMTAsNyBAQAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKKwlwYXRoLT5yZWFkYSA9IC0xOwogCiAJa2V5Lm9iamVjdGlkID0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRDsKIAlrZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7CkBAIC00MTU5LDcgKzQxNzcsNyBAQAogCiAJc2V0X3JlbG9jX2NvbnRyb2wocmMpOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpIHsKIAkJdW5zZXRfcmVsb2NfY29udHJvbChyYyk7CiAJCWVyciA9IFBUUl9FUlIodHJhbnMpOwpAQCAtNDE5Myw3ICs0MjExLDcgQEAKIAogCXVuc2V0X3JlbG9jX2NvbnRyb2wocmMpOwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCwgMSk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCk7CiAJaWYgKElTX0VSUih0cmFucykpCiAJCWVyciA9IFBUUl9FUlIodHJhbnMpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3NjcnViLmMgYi9mcy9idHJmcy9zY3J1Yi5jCmluZGV4IDZkZmVkMGMuLmE4ZDAzZDUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3NjcnViLmMKKysrIGIvZnMvYnRyZnMvc2NydWIuYwpAQCAtMTYsMTMgKzE2LDcgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgImN0cmVlLmgiCiAjaW5jbHVkZSAidm9sdW1lcy5oIgogI2luY2x1ZGUgImRpc2staW8uaCIKQEAgLTExNywzMyArMTExLDM3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzY3J1Yl9mcmVlX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IGk7CisJc3RydWN0IHBhZ2UgKmxhc3RfcGFnZSA9IE5VTEw7CisKKwlpZiAoIWJpbykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudDsgKytpKSB7CisJCWlmIChiaW8tPmJpX2lvX3ZlY1tpXS5idl9wYWdlID09IGxhc3RfcGFnZSkKKwkJCWNvbnRpbnVlOworCQlsYXN0X3BhZ2UgPSBiaW8tPmJpX2lvX3ZlY1tpXS5idl9wYWdlOworCQlfX2ZyZWVfcGFnZShsYXN0X3BhZ2UpOworCX0KKwliaW9fcHV0KGJpbyk7Cit9CisKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgdm9pZCBzY3J1Yl9mcmVlX2RldihzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2KQogewogCWludCBpOwotCWludCBqOwotCXN0cnVjdCBwYWdlICpsYXN0X3BhZ2U7CiAKIAlpZiAoIXNkZXYpCiAJCXJldHVybjsKIAogCWZvciAoaSA9IDA7IGkgPCBTQ1JVQl9CSU9TX1BFUl9ERVY7ICsraSkgewogCQlzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvID0gc2Rldi0+Ymlvc1tpXTsKLQkJc3RydWN0IGJpbyAqYmlvOwogCiAJCWlmICghc2JpbykKIAkJCWJyZWFrOwogCi0JCWJpbyA9IHNiaW8tPmJpbzsKLQkJaWYgKGJpbykgewotCQkJbGFzdF9wYWdlID0gTlVMTDsKLQkJCWZvciAoaiA9IDA7IGogPCBiaW8tPmJpX3ZjbnQ7ICsraikgewotCQkJCWlmIChiaW8tPmJpX2lvX3ZlY1tqXS5idl9wYWdlID09IGxhc3RfcGFnZSkKLQkJCQkJY29udGludWU7Ci0JCQkJbGFzdF9wYWdlID0gYmlvLT5iaV9pb192ZWNbal0uYnZfcGFnZTsKLQkJCQlfX2ZyZWVfcGFnZShsYXN0X3BhZ2UpOwotCQkJfQotCQkJYmlvX3B1dChiaW8pOwotCQl9CisJCXNjcnViX2ZyZWVfYmlvKHNiaW8tPmJpbyk7CiAJCWtmcmVlKHNiaW8pOwogCX0KIApAQCAtMTU2LDggKzE1NCw2IEBACiB7CiAJc3RydWN0IHNjcnViX2RldiAqc2RldjsKIAlpbnQJCWk7Ci0JaW50CQlqOwotCWludAkJcmV0OwogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gZGV2LT5kZXZfcm9vdC0+ZnNfaW5mbzsKIAogCXNkZXYgPSBremFsbG9jKHNpemVvZigqc2RldiksIEdGUF9OT0ZTKTsKQEAgLTE2NSw3ICsxNjEsNiBAQAogCQlnb3RvIG5vbWVtOwogCXNkZXYtPmRldiA9IGRldjsKIAlmb3IgKGkgPSAwOyBpIDwgU0NSVUJfQklPU19QRVJfREVWOyArK2kpIHsKLQkJc3RydWN0IGJpbyAqYmlvOwogCQlzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvOwogCiAJCXNiaW8gPSBremFsbG9jKHNpemVvZigqc2JpbyksIEdGUF9OT0ZTKTsKQEAgLTE3MywzMiArMTY4LDEwIEBACiAJCQlnb3RvIG5vbWVtOwogCQlzZGV2LT5iaW9zW2ldID0gc2JpbzsKIAotCQliaW8gPSBiaW9fa21hbGxvYyhHRlBfTk9GUywgU0NSVUJfUEFHRVNfUEVSX0JJTyk7Ci0JCWlmICghYmlvKQotCQkJZ290byBub21lbTsKLQogCQlzYmlvLT5pbmRleCA9IGk7CiAJCXNiaW8tPnNkZXYgPSBzZGV2OwotCQlzYmlvLT5iaW8gPSBiaW87CiAJCXNiaW8tPmNvdW50ID0gMDsKIAkJc2Jpby0+d29yay5mdW5jID0gc2NydWJfY2hlY2tzdW07Ci0JCWJpby0+YmlfcHJpdmF0ZSA9IHNkZXYtPmJpb3NbaV07Ci0JCWJpby0+YmlfZW5kX2lvID0gc2NydWJfYmlvX2VuZF9pbzsKLQkJYmlvLT5iaV9zZWN0b3IgPSAwOwotCQliaW8tPmJpX2JkZXYgPSBkZXYtPmJkZXY7Ci0JCWJpby0+Ymlfc2l6ZSA9IDA7Ci0KLQkJZm9yIChqID0gMDsgaiA8IFNDUlVCX1BBR0VTX1BFUl9CSU87ICsraikgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9GUyk7Ci0JCQlpZiAoIXBhZ2UpCi0JCQkJZ290byBub21lbTsKLQotCQkJcmV0ID0gYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgUEFHRV9TSVpFLCAwKTsKLQkJCWlmICghcmV0KQotCQkJCWdvdG8gbm9tZW07Ci0JCX0KLQkJV0FSTl9PTihiaW8tPmJpX3ZjbnQgIT0gU0NSVUJfUEFHRVNfUEVSX0JJTyk7CiAKIAkJaWYgKGkgIT0gU0NSVUJfQklPU19QRVJfREVWLTEpCiAJCQlzZGV2LT5iaW9zW2ldLT5uZXh0X2ZyZWUgPSBpICsgMTsKQEAgLTM2OSw5ICszNDIsNiBAQAogCWludCByZXQ7CiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGxldGUpOwogCi0JLyogd2UgYXJlIGdvaW5nIHRvIHdhaXQgb24gdGhpcyBJTyAqLwotCXJ3IHw9IFJFUV9TWU5DOwotCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0ZTLCAxKTsKIAliaW8tPmJpX2JkZXYgPSBiZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOwpAQCAtMzgwLDYgKzM1MCw3IEBACiAJYmlvLT5iaV9wcml2YXRlID0gJmNvbXBsZXRlOwogCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAKKwkvKiB0aGlzIHdpbGwgYWxzbyB1bnBsdWcgdGhlIHF1ZXVlICovCiAJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGUpOwogCiAJcmV0ID0gIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwpAQCAtMzk0LDYgKzM2NSw3IEBACiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSBzZGV2LT5kZXYtPmRldl9yb290LT5mc19pbmZvOwogCiAJc2Jpby0+ZXJyID0gZXJyOworCXNiaW8tPmJpbyA9IGJpbzsKIAogCWJ0cmZzX3F1ZXVlX3dvcmtlcigmZnNfaW5mby0+c2NydWJfd29ya2VycywgJnNiaW8tPndvcmspOwogfQpAQCAtNDUzLDYgKzQyNSw4IEBACiAJfQogCiBvdXQ6CisJc2NydWJfZnJlZV9iaW8oc2Jpby0+YmlvKTsKKwlzYmlvLT5iaW8gPSBOVUxMOwogCXNwaW5fbG9jaygmc2Rldi0+bGlzdF9sb2NrKTsKIAlzYmlvLT5uZXh0X2ZyZWUgPSBzZGV2LT5maXJzdF9mcmVlOwogCXNkZXYtPmZpcnN0X2ZyZWUgPSBzYmlvLT5pbmRleDsKQEAgLTU4MywyNSArNTU3LDUwIEBACiBzdGF0aWMgaW50IHNjcnViX3N1Ym1pdChzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2KQogewogCXN0cnVjdCBzY3J1Yl9iaW8gKnNiaW87CisJc3RydWN0IGJpbyAqYmlvOworCWludCBpOwogCiAJaWYgKHNkZXYtPmN1cnIgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJc2JpbyA9IHNkZXYtPmJpb3Nbc2Rldi0+Y3Vycl07CiAKLQlzYmlvLT5iaW8tPmJpX3NlY3RvciA9IHNiaW8tPnBoeXNpY2FsID4+IDk7Ci0Jc2Jpby0+YmlvLT5iaV9zaXplID0gc2Jpby0+Y291bnQgKiBQQUdFX1NJWkU7Ci0Jc2Jpby0+YmlvLT5iaV9uZXh0ID0gTlVMTDsKLQlzYmlvLT5iaW8tPmJpX2ZsYWdzIHw9IDEgPDwgQklPX1VQVE9EQVRFOwotCXNiaW8tPmJpby0+YmlfY29tcF9jcHUgPSAtMTsKLQlzYmlvLT5iaW8tPmJpX2JkZXYgPSBzZGV2LT5kZXYtPmJkZXY7CisJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0ZTLCBzYmlvLT5jb3VudCk7CisJaWYgKCFiaW8pCisJCWdvdG8gbm9tZW07CisKKwliaW8tPmJpX3ByaXZhdGUgPSBzYmlvOworCWJpby0+YmlfZW5kX2lvID0gc2NydWJfYmlvX2VuZF9pbzsKKwliaW8tPmJpX2JkZXYgPSBzZGV2LT5kZXYtPmJkZXY7CisJYmlvLT5iaV9zZWN0b3IgPSBzYmlvLT5waHlzaWNhbCA+PiA5OworCisJZm9yIChpID0gMDsgaSA8IHNiaW8tPmNvdW50OyArK2kpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWludCByZXQ7CisKKwkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOworCQlpZiAoIXBhZ2UpCisJCQlnb3RvIG5vbWVtOworCisJCXJldCA9IGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7CisJCWlmICghcmV0KSB7CisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJCWdvdG8gbm9tZW07CisJCX0KKwl9CisKIAlzYmlvLT5lcnIgPSAwOwogCXNkZXYtPmN1cnIgPSAtMTsKIAlhdG9taWNfaW5jKCZzZGV2LT5pbl9mbGlnaHQpOwogCi0Jc3VibWl0X2JpbygwLCBzYmlvLT5iaW8pOworCXN1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKIAogCXJldHVybiAwOworCitub21lbToKKwlzY3J1Yl9mcmVlX2JpbyhiaW8pOworCisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyBpbnQgc2NydWJfcGFnZShzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2LCB1NjQgbG9naWNhbCwgdTY0IGxlbiwKQEAgLTYzMyw3ICs2MzIsMTEgQEAKIAkJc2Jpby0+bG9naWNhbCA9IGxvZ2ljYWw7CiAJfSBlbHNlIGlmIChzYmlvLT5waHlzaWNhbCArIHNiaW8tPmNvdW50ICogUEFHRV9TSVpFICE9IHBoeXNpY2FsIHx8CiAJCSAgIHNiaW8tPmxvZ2ljYWwgKyBzYmlvLT5jb3VudCAqIFBBR0VfU0laRSAhPSBsb2dpY2FsKSB7Ci0JCXNjcnViX3N1Ym1pdChzZGV2KTsKKwkJaW50IHJldDsKKworCQlyZXQgPSBzY3J1Yl9zdWJtaXQoc2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCQlnb3RvIGFnYWluOwogCX0KIAlzYmlvLT5zcGFnW3NiaW8tPmNvdW50XS5mbGFncyA9IGZsYWdzOwpAQCAtNjQ1LDggKzY0OCwxMyBAQAogCQltZW1jcHkoc2Jpby0+c3BhZ1tzYmlvLT5jb3VudF0uY3N1bSwgY3N1bSwgc2Rldi0+Y3N1bV9zaXplKTsKIAl9CiAJKytzYmlvLT5jb3VudDsKLQlpZiAoc2Jpby0+Y291bnQgPT0gU0NSVUJfUEFHRVNfUEVSX0JJTyB8fCBmb3JjZSkKLQkJc2NydWJfc3VibWl0KHNkZXYpOworCWlmIChzYmlvLT5jb3VudCA9PSBTQ1JVQl9QQUdFU19QRVJfQklPIHx8IGZvcmNlKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gc2NydWJfc3VibWl0KHNkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcyNyw2ICs3MzUsNyBAQAogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKmNzdW1fcm9vdCA9IGZzX2luZm8tPmNzdW1fcm9vdDsKIAlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmV4dGVudDsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAl1NjQgZmxhZ3M7CiAJaW50IHJldDsKIAlpbnQgc2xvdDsKQEAgLTc4OSwxOCArNzk4LDEyIEBACiAKIAkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9ub3BsdWc7CiAKLQkJbCA9IHBhdGgtPm5vZGVzWzBdOwotCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBzbG90KTsKLQkJaWYgKGtleS5vYmplY3RpZCAhPSBsb2dpY2FsKSB7Ci0JCQlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKHJvb3QsIHBhdGgsIDAsCi0JCQkJCQkgIEJUUkZTX0VYVEVOVF9JVEVNX0tFWSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKLQkJfQotCisJCS8qCisJCSAqIHdlIG1pZ2h0IG1pc3MgaGFsZiBhbiBleHRlbnQgaGVyZSwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsCisJCSAqIGFzIGl0J3Mgb25seSB0aGUgcHJlZmV0Y2gKKwkJICovCiAJCXdoaWxlICgxKSB7CiAJCQlsID0gcGF0aC0+bm9kZXNbMF07CiAJCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CkBAIC04MDksNyArODEyLDcgQEAKIAkJCQlpZiAocmV0ID09IDApCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dDsKKwkJCQkJZ290byBvdXRfbm9wbHVnOwogCiAJCQkJYnJlYWs7CiAJCQl9CkBAIC04MzEsNiArODM0LDcgQEAKIAkgKiB0aGUgc2NydWIuIFRoaXMgbWlnaHQgY3VycmVudGx5IChjcmMzMikgZW5kIHVwIHRvIGJlIGFib3V0IDFNQgogCSAqLwogCXN0YXJ0X3N0cmlwZSA9IDA7CisJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogYWdhaW46CiAJbG9naWNhbCA9IGJhc2UgKyBvZmZzZXQgKyBzdGFydF9zdHJpcGUgKiBpbmNyZW1lbnQ7CiAJZm9yIChpID0gc3RhcnRfc3RyaXBlOyBpIDwgbnN0cmlwZXM7ICsraSkgewpAQCAtODkwLDE1ICs4OTQsMjAgQEAKIAkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0KLQkJbCA9IHBhdGgtPm5vZGVzWzBdOwotCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBzbG90KTsKLQkJaWYgKGtleS5vYmplY3RpZCAhPSBsb2dpY2FsKSB7CisJCWlmIChyZXQgPiAwKSB7CiAJCQlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKHJvb3QsIHBhdGgsIDAsCiAJCQkJCQkgIEJUUkZTX0VYVEVOVF9JVEVNX0tFWSk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKKwkJCWlmIChyZXQgPiAwKSB7CisJCQkJLyogdGhlcmUncyBubyBzbWFsbGVyIGl0ZW0sIHNvIHN0aWNrIHdpdGggdGhlCisJCQkJICogbGFyZ2VyIG9uZSAqLworCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKKwkJCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LAorCQkJCQkJCXBhdGgsIDAsIDApOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCiAJCXdoaWxlICgxKSB7CkBAIC05NzIsNiArOTgxLDggQEAKIAlzY3J1Yl9zdWJtaXQoc2Rldik7CiAKIG91dDoKKwlibGtfZmluaXNoX3BsdWcoJnBsdWcpOworb3V0X25vcGx1ZzoKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQpAQCAtMTA0Nyw4ICsxMDU4LDE1IEBACiAJd2hpbGUgKDEpIHsKIAkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JCXJldCA9IDA7CisJCQlicmVhazsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA+PQorCQkJICAgIGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzWzBdKSkgeworCQkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQogCiAJCWwgPSBwYXRoLT5ub2Rlc1swXTsKIAkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwpAQCAtMTA1OCw3ICsxMDc2LDcgQEAKIAkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBzZGV2LT5kZXYtPmRldmlkKQogCQkJYnJlYWs7CiAKLQkJaWYgKGJ0cmZzX2tleV90eXBlKCZrZXkpICE9IEJUUkZTX0RFVl9FWFRFTlRfS0VZKQorCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfREVWX0VYVEVOVF9LRVkpCiAJCQlicmVhazsKIAogCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA+PSBlbmQpCkBAIC0xMDg3LDcgKzExMDUsNyBAQAogCQljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChmc19pbmZvLCBjaHVua19vZmZzZXQpOwogCQlpZiAoIWNhY2hlKSB7CiAJCQlyZXQgPSAtRU5PRU5UOwotCQkJZ290byBvdXQ7CisJCQlicmVhazsKIAkJfQogCQlyZXQgPSBzY3J1Yl9jaHVuayhzZGV2LCBjaHVua190cmVlLCBjaHVua19vYmplY3RpZCwKIAkJCQkgIGNodW5rX29mZnNldCwgbGVuZ3RoKTsKQEAgLTEwOTksOSArMTExNywxMyBAQAogCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJfQogCi1vdXQ6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwotCXJldHVybiByZXQ7CisKKwkvKgorCSAqIHJldCBjYW4gc3RpbGwgYmUgMSBmcm9tIHNlYXJjaF9zbG90IG9yIG5leHRfbGVhZiwKKwkgKiB0aGF0J3Mgbm90IGFuIGVycm9yCisJICovCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludCBzY3J1Yl9zdXBlcnMoc3RydWN0IHNjcnViX2RldiAqc2RldikKQEAgLTExMzgsOCArMTE2MCwxMiBAQAogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcm9vdC0+ZnNfaW5mbzsKIAogCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwotCWlmIChmc19pbmZvLT5zY3J1Yl93b3JrZXJzX3JlZmNudCA9PSAwKQorCWlmIChmc19pbmZvLT5zY3J1Yl93b3JrZXJzX3JlZmNudCA9PSAwKSB7CisJCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+c2NydWJfd29ya2VycywgInNjcnViIiwKKwkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CisJCWZzX2luZm8tPnNjcnViX3dvcmtlcnMuaWRsZV90aHJlc2ggPSA0OwogCQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5zY3J1Yl93b3JrZXJzLCAxKTsKKwl9CiAJKytmc19pbmZvLT5zY3J1Yl93b3JrZXJzX3JlZmNudDsKIAltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwogCkBAIC0xMTY2LDcgKzExOTIsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2OwogCi0JaWYgKHJvb3QtPmZzX2luZm8tPmNsb3NpbmcpCisJaWYgKGJ0cmZzX2ZzX2Nsb3Npbmcocm9vdC0+ZnNfaW5mbykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3N1cGVyLmMgYi9mcy9idHJmcy9zdXBlci5jCmluZGV4IDliMmU3ZTUuLjE1NjM0ZDQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3N1cGVyLmMKKysrIGIvZnMvYnRyZnMvc3VwZXIuYwpAQCAtMTYxLDcgKzE2MSw4IEBACiAJT3B0X2NvbXByZXNzX3R5cGUsIE9wdF9jb21wcmVzc19mb3JjZSwgT3B0X2NvbXByZXNzX2ZvcmNlX3R5cGUsCiAJT3B0X25vdHJlZWxvZywgT3B0X3JhdGlvLCBPcHRfZmx1c2hvbmNvbW1pdCwgT3B0X2Rpc2NhcmQsCiAJT3B0X3NwYWNlX2NhY2hlLCBPcHRfY2xlYXJfY2FjaGUsIE9wdF91c2VyX3N1YnZvbF9ybV9hbGxvd2VkLAotCU9wdF9lbm9zcGNfZGVidWcsIE9wdF9zdWJ2b2xyb290aWQsIE9wdF9kZWZyYWcsIE9wdF9lcnIsCisJT3B0X2Vub3NwY19kZWJ1ZywgT3B0X3N1YnZvbHJvb3RpZCwgT3B0X2RlZnJhZywKKwlPcHRfaW5vZGVfY2FjaGUsIE9wdF9lcnIsCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC0xOTMsNiArMTk0LDcgQEAKIAl7T3B0X2Vub3NwY19kZWJ1ZywgImVub3NwY19kZWJ1ZyJ9LAogCXtPcHRfc3Vidm9scm9vdGlkLCAic3Vidm9scm9vdGlkPSVkIn0sCiAJe09wdF9kZWZyYWcsICJhdXRvZGVmcmFnIn0sCisJe09wdF9pbm9kZV9jYWNoZSwgImlub2RlX2NhY2hlIn0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtMzYxLDYgKzM2MywxMCBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGRpc2sgc3BhY2UgY2FjaGluZ1xuIik7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgU1BBQ0VfQ0FDSEUpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2lub2RlX2NhY2hlOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGlub2RlIG1hcCBjYWNoaW5nXG4iKTsKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBJTk9ERV9NQVBfQ0FDSEUpOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2NsZWFyX2NhY2hlOgogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGZvcmNlIGNsZWFyaW5nIG9mIGRpc2sgY2FjaGVcbiIpOwogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIENMRUFSX0NBQ0hFKTsKQEAgLTcxNyw2ICs3MjMsMTIgQEAKIAkJc2VxX3B1dHMoc2VxLCAiLGNsZWFyX2NhY2hlIik7CiAJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFVTRVJfU1VCVk9MX1JNX0FMTE9XRUQpKQogCQlzZXFfcHV0cyhzZXEsICIsdXNlcl9zdWJ2b2xfcm1fYWxsb3dlZCIpOworCWlmIChidHJmc190ZXN0X29wdChyb290LCBFTk9TUENfREVCVUcpKQorCQlzZXFfcHV0cyhzZXEsICIsZW5vc3BjX2RlYnVnIik7CisJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIEFVVE9fREVGUkFHKSkKKwkJc2VxX3B1dHMoc2VxLCAiLGF1dG9kZWZyYWciKTsKKwlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgSU5PREVfTUFQX0NBQ0hFKSkKKwkJc2VxX3B1dHMoc2VxLCAiLGlub2RlX2NhY2hlIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxOSw3ICs4MzEsNyBAQAogCX0gZWxzZSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotCQlzLT5zX2ZsYWdzID0gZmxhZ3M7CisJCXMtPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PU0VDOwogCQlzdHJsY3B5KHMtPnNfaWQsIGJkZXZuYW1lKGJkZXYsIGIpLCBzaXplb2Yocy0+c19pZCkpOwogCQllcnJvciA9IGJ0cmZzX2ZpbGxfc3VwZXIocywgZnNfZGV2aWNlcywgZGF0YSwKIAkJCQkJIGZsYWdzICYgTVNfU0lMRU5UID8gMSA6IDApOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3lzZnMuYyBiL2ZzL2J0cmZzL3N5c2ZzLmMKaW5kZXggYzNjMjIzYS4uZGFhYzlhZSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3lzZnMuYworKysgYi9mcy9idHJmcy9zeXNmcy5jCkBAIC0yOCwxNTIgKzI4LDYgQEAKICNpbmNsdWRlICJkaXNrLWlvLmgiCiAjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKIAotc3RhdGljIHNzaXplX3Qgcm9vdF9ibG9ja3NfdXNlZF9zaG93KHN0cnVjdCBidHJmc19yb290ICpyb290LCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19yb290X3VzZWQoJnJvb3QtPnJvb3RfaXRlbSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCByb290X2Jsb2NrX2xpbWl0X3Nob3coc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX3Jvb3RfbGltaXQoJnJvb3QtPnJvb3RfaXRlbSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdXBlcl9ibG9ja3NfdXNlZF9zaG93KHN0cnVjdCBidHJmc19mc19pbmZvICpmcywgY2hhciAqYnVmKQotewotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19zdXBlcl9ieXRlc191c2VkKCZmcy0+c3VwZXJfY29weSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdXBlcl90b3RhbF9ibG9ja3Nfc2hvdyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZmcy0+c3VwZXJfY29weSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdXBlcl9ibG9ja3NpemVfc2hvdyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX3N1cGVyX3NlY3RvcnNpemUoJmZzLT5zdXBlcl9jb3B5KSk7Ci19Ci0KLS8qIHRoaXMgaXMgZm9yIHJvb3QgYXR0cnMgKHN1YnZvbHMvc25hcHNob3RzKSAqLwotc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYnRyZnNfcm9vdCAqLCBjaGFyICopOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGJ0cmZzX3Jvb3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotfTsKLQotI2RlZmluZSBST09UX0FUVFIobmFtZSwgbW9kZSwgc2hvdywgc3RvcmUpIFwKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyIGJ0cmZzX3Jvb3RfYXR0cl8jI25hbWUgPSBfX0FUVFIobmFtZSwgbW9kZSwgXAotCQkJCQkJCSAgICAgIHNob3csIHN0b3JlKQotCi1ST09UX0FUVFIoYmxvY2tzX3VzZWQsCTA0NDQsCXJvb3RfYmxvY2tzX3VzZWRfc2hvdywJTlVMTCk7Ci1ST09UX0FUVFIoYmxvY2tfbGltaXQsCTA2NDQsCXJvb3RfYmxvY2tfbGltaXRfc2hvdywJTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpidHJmc19yb290X2F0dHJzW10gPSB7Ci0JJmJ0cmZzX3Jvb3RfYXR0cl9ibG9ja3NfdXNlZC5hdHRyLAotCSZidHJmc19yb290X2F0dHJfYmxvY2tfbGltaXQuYXR0ciwKLQlOVUxMLAotfTsKLQotLyogdGhpcyBpcyBmb3Igc3VwZXIgYXR0cnMgKGFjdHVhbCBmdWxsIGZzKSAqLwotc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBidHJmc19mc19pbmZvICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLSNkZWZpbmUgU1VQRVJfQVRUUihuYW1lLCBtb2RlLCBzaG93LCBzdG9yZSkgXAotc3RhdGljIHN0cnVjdCBidHJmc19zdXBlcl9hdHRyIGJ0cmZzX3N1cGVyX2F0dHJfIyNuYW1lID0gX19BVFRSKG5hbWUsIG1vZGUsIFwKLQkJCQkJCQkJc2hvdywgc3RvcmUpCi0KLVNVUEVSX0FUVFIoYmxvY2tzX3VzZWQsCQkwNDQ0LAlzdXBlcl9ibG9ja3NfdXNlZF9zaG93LAkJTlVMTCk7Ci1TVVBFUl9BVFRSKHRvdGFsX2Jsb2NrcywJMDQ0NCwJc3VwZXJfdG90YWxfYmxvY2tzX3Nob3csCU5VTEwpOwotU1VQRVJfQVRUUihibG9ja3NpemUsCQkwNDQ0LAlzdXBlcl9ibG9ja3NpemVfc2hvdywJCU5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYnRyZnNfc3VwZXJfYXR0cnNbXSA9IHsKLQkmYnRyZnNfc3VwZXJfYXR0cl9ibG9ja3NfdXNlZC5hdHRyLAotCSZidHJmc19zdXBlcl9hdHRyX3RvdGFsX2Jsb2Nrcy5hdHRyLAotCSZidHJmc19zdXBlcl9hdHRyX2Jsb2Nrc2l6ZS5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3NpemVfdCBidHJmc19zdXBlcl9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX2ZzX2luZm8sCi0JCQkJCQlzdXBlcl9rb2JqKTsKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciAqYSA9IGNvbnRhaW5lcl9vZihhdHRyLAotCQkJCQkJICBzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciwKLQkJCQkJCSAgYXR0cik7Ci0KLQlyZXR1cm4gYS0+c2hvdyA/IGEtPnNob3coZnMsIGJ1ZikgOiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBidHJmc19zdXBlcl9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX2ZzX2luZm8sCi0JCQkJCQlzdXBlcl9rb2JqKTsKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciAqYSA9IGNvbnRhaW5lcl9vZihhdHRyLAotCQkJCQkJICBzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciwKLQkJCQkJCSAgYXR0cik7Ci0KLQlyZXR1cm4gYS0+c3RvcmUgPyBhLT5zdG9yZShmcywgYnVmLCBsZW4pIDogMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYnRyZnNfcm9vdF9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfcm9vdCwKLQkJCQkJCXJvb3Rfa29iaik7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciAqYSA9IGNvbnRhaW5lcl9vZihhdHRyLAotCQkJCQkJIHN0cnVjdCBidHJmc19yb290X2F0dHIsCi0JCQkJCQkgYXR0cik7Ci0KLQlyZXR1cm4gYS0+c2hvdyA/IGEtPnNob3cocm9vdCwgYnVmKSA6IDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJ0cmZzX3Jvb3RfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX3Jvb3QsCi0JCQkJCQlyb290X2tvYmopOwotCXN0cnVjdCBidHJmc19yb290X2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyLAotCQkJCQkJIGF0dHIpOwotCXJldHVybiBhLT5zdG9yZSA/IGEtPnN0b3JlKHJvb3QsIGJ1ZiwgbGVuKSA6IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0cmZzX3N1cGVyX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19mc19pbmZvLAotCQkJCQkJc3VwZXJfa29iaik7Ci0JY29tcGxldGUoJmZzLT5rb2JqX3VucmVnaXN0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBidHJmc19yb290X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX3Jvb3QsCi0JCQkJCQlyb290X2tvYmopOwotCWNvbXBsZXRlKCZyb290LT5rb2JqX3VucmVnaXN0ZXIpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBidHJmc19zdXBlcl9hdHRyX29wcyA9IHsKLQkuc2hvdwk9IGJ0cmZzX3N1cGVyX2F0dHJfc2hvdywKLQkuc3RvcmUJPSBidHJmc19zdXBlcl9hdHRyX3N0b3JlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgYnRyZnNfcm9vdF9hdHRyX29wcyA9IHsKLQkuc2hvdwk9IGJ0cmZzX3Jvb3RfYXR0cl9zaG93LAotCS5zdG9yZQk9IGJ0cmZzX3Jvb3RfYXR0cl9zdG9yZSwKLX07Ci0KIC8qIC9zeXMvZnMvYnRyZnMvIGVudHJ5ICovCiBzdGF0aWMgc3RydWN0IGtzZXQgKmJ0cmZzX2tzZXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCmluZGV4IGRjODBmNzEuLjUxZGNlYzggMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwpAQCAtMzUsNiArMzUsNyBAQAogewogCVdBUk5fT04oYXRvbWljX3JlYWQoJnRyYW5zYWN0aW9uLT51c2VfY291bnQpID09IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmFuc2FjdGlvbi0+dXNlX2NvdW50KSkgeworCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRyYW5zYWN0aW9uLT5saXN0KSk7CiAJCW1lbXNldCh0cmFuc2FjdGlvbiwgMCwgc2l6ZW9mKCp0cmFuc2FjdGlvbikpOwogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwLCB0cmFuc2FjdGlvbik7CiAJfQpAQCAtNDksNDYgKzUwLDcyIEBACiAvKgogICogZWl0aGVyIGFsbG9jYXRlIGEgbmV3IHRyYW5zYWN0aW9uIG9yIGhvcCBpbnRvIHRoZSBleGlzdGluZyBvbmUKICAqLwotc3RhdGljIG5vaW5saW5lIGludCBqb2luX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290KQorc3RhdGljIG5vaW5saW5lIGludCBqb2luX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgbm9mYWlsKQogewogCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zOworCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwlpZiAocm9vdC0+ZnNfaW5mby0+dHJhbnNfbm9fam9pbikgeworCQlpZiAoIW5vZmFpbCkgeworCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwogCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247Ci0JaWYgKCFjdXJfdHJhbnMpIHsKLQkJY3VyX3RyYW5zID0ga21lbV9jYWNoZV9hbGxvYyhidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsCi0JCQkJCSAgICAgR0ZQX05PRlMpOwotCQlpZiAoIWN1cl90cmFucykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlyb290LT5mc19pbmZvLT5nZW5lcmF0aW9uKys7Ci0JCWF0b21pY19zZXQoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMsIDEpOwotCQljdXJfdHJhbnMtPm51bV9qb2luZWQgPSAwOwotCQljdXJfdHJhbnMtPnRyYW5zaWQgPSByb290LT5mc19pbmZvLT5nZW5lcmF0aW9uOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdXJfdHJhbnMtPndyaXRlcl93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY3VyX3RyYW5zLT5jb21taXRfd2FpdCk7Ci0JCWN1cl90cmFucy0+aW5fY29tbWl0ID0gMDsKLQkJY3VyX3RyYW5zLT5ibG9ja2VkID0gMDsKLQkJYXRvbWljX3NldCgmY3VyX3RyYW5zLT51c2VfY291bnQsIDEpOwotCQljdXJfdHJhbnMtPmNvbW1pdF9kb25lID0gMDsKLQkJY3VyX3RyYW5zLT5zdGFydF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLQotCQljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5yb290ID0gUkJfUk9PVDsKLQkJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2VudHJpZXMgPSAwOwotCQljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5udW1faGVhZHNfcmVhZHkgPSAwOwotCQljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5udW1faGVhZHMgPSAwOwotCQljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5mbHVzaGluZyA9IDA7Ci0JCWN1cl90cmFucy0+ZGVsYXllZF9yZWZzLnJ1bl9kZWxheWVkX3N0YXJ0ID0gMDsKLQkJc3Bpbl9sb2NrX2luaXQoJmN1cl90cmFucy0+ZGVsYXllZF9yZWZzLmxvY2spOwotCi0JCUlOSVRfTElTVF9IRUFEKCZjdXJfdHJhbnMtPnBlbmRpbmdfc25hcHNob3RzKTsKLQkJbGlzdF9hZGRfdGFpbCgmY3VyX3RyYW5zLT5saXN0LCAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCk7Ci0JCWV4dGVudF9pb190cmVlX2luaXQoJmN1cl90cmFucy0+ZGlydHlfcGFnZXMsCi0JCQkJICAgICByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nKTsKLQkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7Ci0JCXJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24gPSBjdXJfdHJhbnM7Ci0JCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7Ci0JfSBlbHNlIHsKKwlpZiAoY3VyX3RyYW5zKSB7CisJCWF0b21pY19pbmMoJmN1cl90cmFucy0+dXNlX2NvdW50KTsKIAkJYXRvbWljX2luYygmY3VyX3RyYW5zLT5udW1fd3JpdGVycyk7CiAJCWN1cl90cmFucy0+bnVtX2pvaW5lZCsrOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJCXJldHVybiAwOwogCX0KKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisKKwljdXJfdHJhbnMgPSBrbWVtX2NhY2hlX2FsbG9jKGJ0cmZzX3RyYW5zYWN0aW9uX2NhY2hlcCwgR0ZQX05PRlMpOworCWlmICghY3VyX3RyYW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCWlmIChyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCWttZW1fY2FjaGVfZnJlZShidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsIGN1cl90cmFucyk7CisJCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247CisJCWF0b21pY19pbmMoJmN1cl90cmFucy0+dXNlX2NvdW50KTsKKwkJYXRvbWljX2luYygmY3VyX3RyYW5zLT5udW1fd3JpdGVycyk7CisJCWN1cl90cmFucy0+bnVtX2pvaW5lZCsrOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJCXJldHVybiAwOworCX0KKwlhdG9taWNfc2V0KCZjdXJfdHJhbnMtPm51bV93cml0ZXJzLCAxKTsKKwljdXJfdHJhbnMtPm51bV9qb2luZWQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN1cl90cmFucy0+d3JpdGVyX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN1cl90cmFucy0+Y29tbWl0X3dhaXQpOworCWN1cl90cmFucy0+aW5fY29tbWl0ID0gMDsKKwljdXJfdHJhbnMtPmJsb2NrZWQgPSAwOworCS8qCisJICogT25lIGZvciB0aGlzIHRyYW5zIGhhbmRsZSwgb25lIHNvIGl0IHdpbGwgbGl2ZSBvbiB1bnRpbCB3ZQorCSAqIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJYXRvbWljX3NldCgmY3VyX3RyYW5zLT51c2VfY291bnQsIDIpOworCWN1cl90cmFucy0+Y29tbWl0X2RvbmUgPSAwOworCWN1cl90cmFucy0+c3RhcnRfdGltZSA9IGdldF9zZWNvbmRzKCk7CisKKwljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5yb290ID0gUkJfUk9PVDsKKwljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5udW1fZW50cmllcyA9IDA7CisJY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMubnVtX2hlYWRzX3JlYWR5ID0gMDsKKwljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5udW1faGVhZHMgPSAwOworCWN1cl90cmFucy0+ZGVsYXllZF9yZWZzLmZsdXNoaW5nID0gMDsKKwljdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5ydW5fZGVsYXllZF9zdGFydCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmN1cl90cmFucy0+Y29tbWl0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5sb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZjdXJfdHJhbnMtPnBlbmRpbmdfc25hcHNob3RzKTsKKwlsaXN0X2FkZF90YWlsKCZjdXJfdHJhbnMtPmxpc3QsICZyb290LT5mc19pbmZvLT50cmFuc19saXN0KTsKKwlleHRlbnRfaW9fdHJlZV9pbml0KCZjdXJfdHJhbnMtPmRpcnR5X3BhZ2VzLAorCQkJICAgICByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nKTsKKwlyb290LT5mc19pbmZvLT5nZW5lcmF0aW9uKys7CisJY3VyX3RyYW5zLT50cmFuc2lkID0gcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbjsKKwlyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uID0gY3VyX3RyYW5zOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTksMzYgKzEyNiw4MiBAQAogICogdG8gbWFrZSBzdXJlIHRoZSBvbGQgcm9vdCBmcm9tIGJlZm9yZSB3ZSBqb2luZWQgdGhlIHRyYW5zYWN0aW9uIGlzIGRlbGV0ZWQKICAqIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMKICAqLwotc3RhdGljIG5vaW5saW5lIGludCByZWNvcmRfcm9vdF9pbl90cmFucyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290KQorc3RhdGljIGludCByZWNvcmRfcm9vdF9pbl90cmFucyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlpZiAocm9vdC0+cmVmX2Nvd3MgJiYgcm9vdC0+bGFzdF90cmFucyA8IHRyYW5zLT50cmFuc2lkKSB7CiAJCVdBUk5fT04ocm9vdCA9PSByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCk7CiAJCVdBUk5fT04ocm9vdC0+Y29tbWl0X3Jvb3QgIT0gcm9vdC0+bm9kZSk7CiAKKwkJLyoKKwkJICogc2VlIGJlbG93IGZvciBpbl90cmFuc19zZXR1cCB1c2FnZSBydWxlcworCQkgKiB3ZSBoYXZlIHRoZSByZWxvYyBtdXRleCBoZWxkIG5vdywgc28gdGhlcmUKKwkJICogaXMgb25seSBvbmUgd3JpdGVyIGluIHRoaXMgZnVuY3Rpb24KKwkJICovCisJCXJvb3QtPmluX3RyYW5zX3NldHVwID0gMTsKKworCQkvKiBtYWtlIHN1cmUgcmVhZGVycyBmaW5kIGluX3RyYW5zX3NldHVwIGJlZm9yZQorCQkgKiB0aGV5IGZpbmQgb3VyIHJvb3QtPmxhc3RfdHJhbnMgdXBkYXRlCisJCSAqLworCQlzbXBfd21iKCk7CisKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKKwkJaWYgKHJvb3QtPmxhc3RfdHJhbnMgPT0gdHJhbnMtPnRyYW5zaWQpIHsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CiAJCXJhZGl4X3RyZWVfdGFnX3NldCgmcm9vdC0+ZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCiAJCQkgICAodW5zaWduZWQgbG9uZylyb290LT5yb290X2tleS5vYmplY3RpZCwKIAkJCSAgIEJUUkZTX1JPT1RfVFJBTlNfVEFHKTsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCQlyb290LT5sYXN0X3RyYW5zID0gdHJhbnMtPnRyYW5zaWQ7CisKKwkJLyogdGhpcyBpcyBwcmV0dHkgdHJpY2t5LiAgV2UgZG9uJ3Qgd2FudCB0bworCQkgKiB0YWtlIHRoZSByZWxvY2F0aW9uIGxvY2sgaW4gYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMKKwkJICogdW5sZXNzIHdlJ3JlIHJlYWxseSBkb2luZyB0aGUgZmlyc3Qgc2V0dXAgZm9yIHRoaXMgcm9vdCBpbgorCQkgKiB0aGlzIHRyYW5zYWN0aW9uLgorCQkgKgorCQkgKiBOb3JtYWxseSB3ZSdkIHVzZSByb290LT5sYXN0X3RyYW5zIGFzIGEgZmxhZyB0byBkZWNpZGUKKwkJICogaWYgd2Ugd2FudCB0byB0YWtlIHRoZSBleHBlbnNpdmUgbXV0ZXguCisJCSAqCisJCSAqIEJ1dCwgd2UgaGF2ZSB0byBzZXQgcm9vdC0+bGFzdF90cmFucyBiZWZvcmUgd2UKKwkJICogaW5pdCB0aGUgcmVsb2NhdGlvbiByb290LCBvdGhlcndpc2UsIHdlIHRyaXAgb3ZlciB3YXJuaW5ncworCQkgKiBpbiBjdHJlZS5jLiAgVGhlIHNvbHV0aW9uIHVzZWQgaGVyZSBpcyB0byBmbGFnIG91cnNlbHZlcworCQkgKiB3aXRoIHJvb3QtPmluX3RyYW5zX3NldHVwLiAgV2hlbiB0aGlzIGlzIDEsIHdlJ3JlIHN0aWxsCisJCSAqIGZpeGluZyB1cCB0aGUgcmVsb2MgdHJlZXMgYW5kIGV2ZXJ5b25lIG11c3Qgd2FpdC4KKwkJICoKKwkJICogV2hlbiB0aGlzIGlzIHplcm8sIHRoZXkgY2FuIHRydXN0IHJvb3QtPmxhc3RfdHJhbnMgYW5kIGZseQorCQkgKiB0aHJvdWdoIGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zIHdpdGhvdXQgaGF2aW5nIHRvIHRha2UgdGhlCisJCSAqIGxvY2suICBzbXBfd21iKCkgbWFrZXMgc3VyZSB0aGF0IGFsbCB0aGUgd3JpdGVzIGFib3ZlIGFyZQorCQkgKiBkb25lIGJlZm9yZSB3ZSBwb3AgaW4gdGhlIHplcm8gYmVsb3cKKwkJICovCiAJCWJ0cmZzX2luaXRfcmVsb2Nfcm9vdCh0cmFucywgcm9vdCk7CisJCXNtcF93bWIoKTsKKwkJcm9vdC0+aW5fdHJhbnNfc2V0dXAgPSAwOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorCiBpbnQgYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJaWYgKCFyb290LT5yZWZfY293cykKIAkJcmV0dXJuIDA7CiAKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0JaWYgKHJvb3QtPmxhc3RfdHJhbnMgPT0gdHJhbnMtPnRyYW5zaWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJLyoKKwkgKiBzZWUgcmVjb3JkX3Jvb3RfaW5fdHJhbnMgZm9yIGNvbW1lbnRzIGFib3V0IGluX3RyYW5zX3NldHVwIHVzYWdlCisJICogYW5kIGJhcnJpZXJzCisJICovCisJc21wX3JtYigpOworCWlmIChyb290LT5sYXN0X3RyYW5zID09IHRyYW5zLT50cmFuc2lkICYmCisJICAgICFyb290LT5pbl90cmFuc19zZXR1cCkKIAkJcmV0dXJuIDA7Ci0JfQogCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCXJlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCByb290KTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDAsMjEgKzIxMywyMyBAQAogewogCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zOwogCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOwogCWlmIChjdXJfdHJhbnMgJiYgY3VyX3RyYW5zLT5ibG9ja2VkKSB7CiAJCURFRklORV9XQUlUKHdhaXQpOwogCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAkJd2hpbGUgKDEpIHsKIAkJCXByZXBhcmVfdG9fd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwgJndhaXQsCiAJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWlmICghY3VyX3RyYW5zLT5ibG9ja2VkKQogCQkJCWJyZWFrOwotCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJCQlzY2hlZHVsZSgpOwotCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQl9CiAJCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LCAmd2FpdCk7CiAJCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAl9CiB9CiAKQEAgLTE2NywxMCArMjQyLDE2IEBACiAKIHN0YXRpYyBpbnQgbWF5X3dhaXRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCB0eXBlKQogewotCWlmICghcm9vdC0+ZnNfaW5mby0+bG9nX3Jvb3RfcmVjb3ZlcmluZyAmJgotCSAgICAoKHR5cGUgPT0gVFJBTlNfU1RBUlQgJiYgIXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpIHx8Ci0JICAgICB0eXBlID09IFRSQU5TX1VTRVJTUEFDRSkpCisJaWYgKHJvb3QtPmZzX2luZm8tPmxvZ19yb290X3JlY292ZXJpbmcpCisJCXJldHVybiAwOworCisJaWYgKHR5cGUgPT0gVFJBTlNfVVNFUlNQQUNFKQogCQlyZXR1cm4gMTsKKworCWlmICh0eXBlID09IFRSQU5TX1NUQVJUICYmCisJICAgICFhdG9taWNfcmVhZCgmcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucykpCisJCXJldHVybiAxOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NCwzNiArMjY1LDQ0IEBACiAKIAlpZiAocm9vdC0+ZnNfaW5mby0+ZnNfc3RhdGUgJiBCVFJGU19TVVBFUl9GTEFHX0VSUk9SKQogCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbykgeworCQlXQVJOX09OKHR5cGUgIT0gVFJBTlNfSk9JTiAmJiB0eXBlICE9IFRSQU5TX0pPSU5fTk9MT0NLKTsKKwkJaCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJaC0+dXNlX2NvdW50Kys7CisJCWgtPm9yaWdfcnN2ID0gaC0+YmxvY2tfcnN2OworCQloLT5ibG9ja19yc3YgPSBOVUxMOworCQlnb3RvIGdvdF9pdDsKKwl9CiBhZ2FpbjoKIAloID0ga21lbV9jYWNoZV9hbGxvYyhidHJmc190cmFuc19oYW5kbGVfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKCFoKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlmICh0eXBlICE9IFRSQU5TX0pPSU5fTk9MT0NLKQotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJaWYgKG1heV93YWl0X3RyYW5zYWN0aW9uKHJvb3QsIHR5cGUpKQogCQl3YWl0X2N1cnJlbnRfdHJhbnMocm9vdCk7CiAKLQlyZXQgPSBqb2luX3RyYW5zYWN0aW9uKHJvb3QpOworCWRvIHsKKwkJcmV0ID0gam9pbl90cmFuc2FjdGlvbihyb290LCB0eXBlID09IFRSQU5TX0pPSU5fTk9MT0NLKTsKKwkJaWYgKHJldCA9PSAtRUJVU1kpCisJCQl3YWl0X2N1cnJlbnRfdHJhbnMocm9vdCk7CisJfSB3aGlsZSAocmV0ID09IC1FQlVTWSk7CisKIAlpZiAocmV0IDwgMCkgewogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCwgaCk7Ci0JCWlmICh0eXBlICE9IFRSQU5TX0pPSU5fTk9MT0NLKQotCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCiAJY3VyX3RyYW5zID0gcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbjsKLQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7Ci0JaWYgKHR5cGUgIT0gVFJBTlNfSk9JTl9OT0xPQ0spCi0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCiAJaC0+dHJhbnNpZCA9IGN1cl90cmFucy0+dHJhbnNpZDsKIAloLT50cmFuc2FjdGlvbiA9IGN1cl90cmFuczsKIAloLT5ibG9ja3NfdXNlZCA9IDA7Ci0JaC0+YmxvY2tfZ3JvdXAgPSAwOwogCWgtPmJ5dGVzX3Jlc2VydmVkID0gMDsKIAloLT5kZWxheWVkX3JlZl91cGRhdGVzID0gMDsKKwloLT51c2VfY291bnQgPSAxOwogCWgtPmJsb2NrX3JzdiA9IE5VTEw7CisJaC0+b3JpZ19yc3YgPSBOVUxMOwogCiAJc21wX21iKCk7CiAJaWYgKGN1cl90cmFucy0+YmxvY2tlZCAmJiBtYXlfd2FpdF90cmFuc2FjdGlvbihyb290LCB0eXBlKSkgewpAQCAtMjQxLDExICszMzAsOCBAQAogCQl9CiAJfQogCi0JaWYgKHR5cGUgIT0gVFJBTlNfSk9JTl9OT0xPQ0spCi0JCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQlyZWNvcmRfcm9vdF9pbl90cmFucyhoLCByb290KTsKLQlpZiAodHlwZSAhPSBUUkFOU19KT0lOX05PTE9DSykKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Citnb3RfaXQ6CisJYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMoaCwgcm9vdCk7CiAKIAlpZiAoIWN1cnJlbnQtPmpvdXJuYWxfaW5mbyAmJiB0eXBlICE9IFRSQU5TX1VTRVJTUEFDRSkKIAkJY3VycmVudC0+am91cm5hbF9pbmZvID0gaDsKQEAgLTI1NywyMiArMzQzLDE5IEBACiB7CiAJcmV0dXJuIHN0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIG51bV9pdGVtcywgVFJBTlNfU1RBUlQpOwogfQotc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfam9pbl90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJCQkJCSAgIGludCBudW1fYmxvY2tzKQorc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfam9pbl90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlyZXR1cm4gc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMCwgVFJBTlNfSk9JTik7CiB9CiAKLXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb25fbm9sb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCQkJCSAgaW50IG51bV9ibG9ja3MpCitzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19qb2luX3RyYW5zYWN0aW9uX25vbG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlyZXR1cm4gc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMCwgVFJBTlNfSk9JTl9OT0xPQ0spOwogfQogCi1zdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19zdGFydF9pb2N0bF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqciwKLQkJCQkJCQkgaW50IG51bV9ibG9ja3MpCitzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19zdGFydF9pb2N0bF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKLQlyZXR1cm4gc3RhcnRfdHJhbnNhY3Rpb24ociwgMCwgVFJBTlNfVVNFUlNQQUNFKTsKKwlyZXR1cm4gc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMCwgVFJBTlNfVVNFUlNQQUNFKTsKIH0KIAogLyogd2FpdCBmb3IgYSB0cmFuc2FjdGlvbiBjb21taXQgdG8gYmUgZnVsbHkgY29tcGxldGUgKi8KQEAgLTI4MCwxNyArMzYzLDEzIEBACiAJCQkJICAgIHN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY29tbWl0KQogewogCURFRklORV9XQUlUKHdhaXQpOwotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAl3aGlsZSAoIWNvbW1pdC0+Y29tbWl0X2RvbmUpIHsKIAkJcHJlcGFyZV90b193YWl0KCZjb21taXQtPmNvbW1pdF93YWl0LCAmd2FpdCwKIAkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCWlmIChjb21taXQtPmNvbW1pdF9kb25lKQogCQkJYnJlYWs7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlzY2hlZHVsZSgpOwotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJfQotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCWZpbmlzaF93YWl0KCZjb21taXQtPmNvbW1pdF93YWl0LCAmd2FpdCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMDAsNTkgKzM3OSw1NiBAQAogCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zID0gTlVMTCwgKnQ7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQogCXJldCA9IDA7CiAJaWYgKHRyYW5zaWQpIHsKIAkJaWYgKHRyYW5zaWQgPD0gcm9vdC0+ZnNfaW5mby0+bGFzdF90cmFuc19jb21taXR0ZWQpCi0JCQlnb3RvIG91dF91bmxvY2s7CisJCQlnb3RvIG91dDsKIAogCQkvKiBmaW5kIHNwZWNpZmllZCB0cmFuc2FjdGlvbiAqLworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZyb290LT5mc19pbmZvLT50cmFuc19saXN0LCBsaXN0KSB7CiAJCQlpZiAodC0+dHJhbnNpZCA9PSB0cmFuc2lkKSB7CiAJCQkJY3VyX3RyYW5zID0gdDsKKwkJCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAodC0+dHJhbnNpZCA+IHRyYW5zaWQpCiAJCQkJYnJlYWs7CiAJCX0KKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQlyZXQgPSAtRUlOVkFMOwogCQlpZiAoIWN1cl90cmFucykKLQkJCWdvdG8gb3V0X3VubG9jazsgIC8qIGJhZCB0cmFuc2lkICovCisJCQlnb3RvIG91dDsgIC8qIGJhZCB0cmFuc2lkICovCiAJfSBlbHNlIHsKIAkJLyogZmluZCBuZXdlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBjb21taXR0aW5nIHwgY29tbWl0dGVkICovCisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSh0LCAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCwKIAkJCQkJICAgIGxpc3QpIHsKIAkJCWlmICh0LT5pbl9jb21taXQpIHsKIAkJCQlpZiAodC0+Y29tbWl0X2RvbmUpCi0JCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCQkJYnJlYWs7CiAJCQkJY3VyX3RyYW5zID0gdDsKKwkJCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQlpZiAoIWN1cl90cmFucykKLQkJCWdvdG8gb3V0X3VubG9jazsgIC8qIG5vdGhpbmcgY29tbWl0dGluZ3xjb21taXR0ZWQgKi8KKwkJCWdvdG8gb3V0OyAgLyogbm90aGluZyBjb21taXR0aW5nfGNvbW1pdHRlZCAqLwogCX0KIAotCWF0b21pY19pbmMoJmN1cl90cmFucy0+dXNlX2NvdW50KTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKLQogCXdhaXRfZm9yX2NvbW1pdChyb290LCBjdXJfdHJhbnMpOwogCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwogCXJldCA9IDA7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgYnRyZnNfdGhyb3R0bGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7Ci0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCWlmICghcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucykKKwlpZiAoIWF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKSkKIAkJd2FpdF9jdXJyZW50X3RyYW5zKHJvb3QpOwotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IHNob3VsZF9lbmRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0zNzAsNiArNDQ2LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cl90cmFucyA9IHRyYW5zLT50cmFuc2FjdGlvbjsKIAlpbnQgdXBkYXRlczsKIAorCXNtcF9tYigpOwogCWlmIChjdXJfdHJhbnMtPmJsb2NrZWQgfHwgY3VyX3RyYW5zLT5kZWxheWVkX3JlZnMuZmx1c2hpbmcpCiAJCXJldHVybiAxOwogCkBAIC0zODgsNiArNDY1LDExIEBACiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSByb290LT5mc19pbmZvOwogCWludCBjb3VudCA9IDA7CiAKKwlpZiAoLS10cmFucy0+dXNlX2NvdW50KSB7CisJCXRyYW5zLT5ibG9ja19yc3YgPSB0cmFucy0+b3JpZ19yc3Y7CisJCXJldHVybiAwOworCX0KKwogCXdoaWxlIChjb3VudCA8IDQpIHsKIAkJdW5zaWduZWQgbG9uZyBjdXIgPSB0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlczsKIAkJdHJhbnMtPmRlbGF5ZWRfcmVmX3VwZGF0ZXMgPSAwOwpAQCAtNDEwLDkgKzQ5MiwxMSBAQAogCiAJYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7CiAKLQlpZiAobG9jayAmJiAhcm9vdC0+ZnNfaW5mby0+b3Blbl9pb2N0bF90cmFucyAmJgotCSAgICBzaG91bGRfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KSkKKwlpZiAobG9jayAmJiAhYXRvbWljX3JlYWQoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpICYmCisJICAgIHNob3VsZF9lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpKSB7CiAJCXRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCA9IDE7CisJCXNtcF93bWIoKTsKKwl9CiAKIAlpZiAobG9jayAmJiBjdXJfdHJhbnMtPmJsb2NrZWQgJiYgIWN1cl90cmFucy0+aW5fY29tbWl0KSB7CiAJCWlmICh0aHJvdHRsZSkKQEAgLTcwMyw5ICs3ODcsOSBAQAogICovCiBpbnQgYnRyZnNfYWRkX2RlYWRfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAlsaXN0X2FkZCgmcm9vdC0+cm9vdF9saXN0LCAmcm9vdC0+ZnNfaW5mby0+ZGVhZF9yb290cyk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC03MjEsNiArODA1LDcgQEAKIAlpbnQgcmV0OwogCWludCBlcnIgPSAwOwogCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAl3aGlsZSAoMSkgewogCQlyZXQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCiAJCQkJCQkgKHZvaWQgKiopZ2FuZywgMCwKQEAgLTczMyw2ICs4MTgsNyBAQAogCQkJcmFkaXhfdHJlZV90YWdfY2xlYXIoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAogCQkJCQkodW5zaWduZWQgbG9uZylyb290LT5yb290X2tleS5vYmplY3RpZCwKIAkJCQkJQlRSRlNfUk9PVF9UUkFOU19UQUcpOworCQkJc3Bpbl91bmxvY2soJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCiAJCQlidHJmc19mcmVlX2xvZyh0cmFucywgcm9vdCk7CiAJCQlidHJmc191cGRhdGVfcmVsb2Nfcm9vdCh0cmFucywgcm9vdCk7CkBAIC03NTMsMTAgKzgzOSwxMiBAQAogCQkJZXJyID0gYnRyZnNfdXBkYXRlX3Jvb3QodHJhbnMsIGZzX2luZm8tPnRyZWVfcm9vdCwKIAkJCQkJCSZyb290LT5yb290X2tleSwKIAkJCQkJCSZyb290LT5yb290X2l0ZW0pOworCQkJc3Bpbl9sb2NrKCZmc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CiAJCX0KIAl9CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTc4Niw3ICs4NzQsNyBAQAogCQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KGluZm8tPnRyZWVfcm9vdCwgbnIpOwogCQljb25kX3Jlc2NoZWQoKTsKIAotCQlpZiAocm9vdC0+ZnNfaW5mby0+Y2xvc2luZyB8fCByZXQgIT0gLUVBR0FJTikKKwkJaWYgKGJ0cmZzX2ZzX2Nsb3Npbmcocm9vdC0+ZnNfaW5mbykgfHwgcmV0ICE9IC1FQUdBSU4pCiAJCQlicmVhazsKIAl9CiAJcm9vdC0+ZGVmcmFnX3J1bm5pbmcgPSAwOwpAQCAtODY5LDYgKzk1NywxNSBAQAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcGFyZW50X3Jvb3QsIHBhcmVudF9pbm9kZSk7CiAJQlVHX09OKHJldCk7CiAKKwkvKgorCSAqIHB1bGwgaW4gdGhlIGRlbGF5ZWQgZGlyZWN0b3J5IHVwZGF0ZQorCSAqIGFuZCB0aGUgZGVsYXllZCBpbm9kZSBpdGVtCisJICogb3RoZXJ3aXNlIHdlIGNvcnJ1cHQgdGhlIEZTIGR1cmluZworCSAqIHNuYXBzaG90CisJICovCisJcmV0ID0gYnRyZnNfcnVuX2RlbGF5ZWRfaXRlbXModHJhbnMsIHJvb3QpOworCUJVR19PTihyZXQpOworCiAJcmVjb3JkX3Jvb3RfaW5fdHJhbnModHJhbnMsIHJvb3QpOwogCWJ0cmZzX3NldF9yb290X2xhc3Rfc25hcHNob3QoJnJvb3QtPnJvb3RfaXRlbSwgdHJhbnMtPnRyYW5zaWQpOwogCW1lbWNweShuZXdfcm9vdF9pdGVtLCAmcm9vdC0+cm9vdF9pdGVtLCBzaXplb2YoKm5ld19yb290X2l0ZW0pKTsKQEAgLTkzMCwxNCArMTAyNyw2IEBACiAJaW50IHJldDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGVuZGluZywgaGVhZCwgbGlzdCkgewotCQkvKgotCQkgKiBXZSBtdXN0IGRlYWwgd2l0aCB0aGUgZGVsYXllZCBpdGVtcyBiZWZvcmUgY3JlYXRpbmcKLQkJICogc25hcHNob3RzLCBvciB3ZSB3aWxsIGNyZWF0ZSBhIHNuYXB0aG90IHdpdGggaW5jb25zaXN0ZW50Ci0JCSAqIGluZm9ybWF0aW9uLgotCQkqLwotCQlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9pdGVtcyh0cmFucywgZnNfaW5mby0+ZnNfcm9vdCk7Ci0JCUJVR19PTihyZXQpOwotCiAJCXJldCA9IGNyZWF0ZV9wZW5kaW5nX3NuYXBzaG90KHRyYW5zLCBmc19pbmZvLCBwZW5kaW5nKTsKIAkJQlVHX09OKHJldCk7CiAJfQpAQCAtOTY3LDIwICsxMDU2LDIwIEBACiBpbnQgYnRyZnNfdHJhbnNhY3Rpb25faW5fY29tbWl0KHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvKQogewogCWludCByZXQgPSAwOwotCXNwaW5fbG9jaygmaW5mby0+bmV3X3RyYW5zX2xvY2spOworCXNwaW5fbG9jaygmaW5mby0+dHJhbnNfbG9jayk7CiAJaWYgKGluZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24pCiAJCXJldCA9IGluZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24tPmluX2NvbW1pdDsKLQlzcGluX3VubG9jaygmaW5mby0+bmV3X3RyYW5zX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbmZvLT50cmFuc19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgYnRyZnNfdHJhbnNhY3Rpb25fYmxvY2tlZChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0ID0gMDsKLQlzcGluX2xvY2soJmluZm8tPm5ld190cmFuc19sb2NrKTsKKwlzcGluX2xvY2soJmluZm8tPnRyYW5zX2xvY2spOwogCWlmIChpbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uKQogCQlyZXQgPSBpbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uLT5ibG9ja2VkOwotCXNwaW5fdW5sb2NrKCZpbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJc3Bpbl91bmxvY2soJmluZm8tPnRyYW5zX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMDQsOSArMTA5Myw3IEBACiAJCQkJICAgICZ3YWl0KTsKIAkJCWJyZWFrOwogCQl9Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlzY2hlZHVsZSgpOwotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9ibG9ja2VkX3dhaXQsICZ3YWl0KTsKIAl9CiB9CkBAIC0xMDMyLDkgKzExMTksNyBAQAogCQkJCSAgICAmd2FpdCk7CiAJCQlicmVhazsKIAkJfQotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJc2NoZWR1bGUoKTsKLQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwKIAkJCSAgICAmd2FpdCk7CiAJfQpAQCAtMTA3Miw3ICsxMTU3LDcgQEAKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZhYy0+d29yaywgZG9fYXN5bmNfY29tbWl0KTsKIAlhYy0+cm9vdCA9IHJvb3Q7Ci0JYWMtPm5ld3RyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAwKTsKKwlhYy0+bmV3dHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCWlmIChJU19FUlIoYWMtPm5ld3RyYW5zKSkgewogCQlpbnQgZXJyID0gUFRSX0VSUihhYy0+bmV3dHJhbnMpOwogCQlrZnJlZShhYyk7CkBAIC0xMDgwLDIzICsxMTY1LDIyIEBACiAJfQogCiAJLyogdGFrZSB0cmFuc2FjdGlvbiByZWZlcmVuY2UgKi8KLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJY3VyX3RyYW5zID0gdHJhbnMtPnRyYW5zYWN0aW9uOwogCWF0b21pY19pbmMoJmN1cl90cmFucy0+dXNlX2NvdW50KTsKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhYy0+d29yaywgMCk7CiAKIAkvKiB3YWl0IGZvciB0cmFuc2FjdGlvbiB0byBzdGFydCBhbmQgdW5ibG9jayAqLwotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAlpZiAod2FpdF9mb3JfdW5ibG9jaykKIAkJd2FpdF9jdXJyZW50X3RyYW5zX2NvbW1pdF9zdGFydF9hbmRfdW5ibG9jayhyb290LCBjdXJfdHJhbnMpOwogCWVsc2UKIAkJd2FpdF9jdXJyZW50X3RyYW5zX2NvbW1pdF9zdGFydChyb290LCBjdXJfdHJhbnMpOwotCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwotCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9PSB0cmFucykKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKworCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTM5LDM4ICsxMjIzLDQxIEBACiAJcmV0ID0gYnRyZnNfcnVuX2RlbGF5ZWRfcmVmcyh0cmFucywgcm9vdCwgMCk7CiAJQlVHX09OKHJldCk7CiAKLQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJc3Bpbl9sb2NrKCZjdXJfdHJhbnMtPmNvbW1pdF9sb2NrKTsKIAlpZiAoY3VyX3RyYW5zLT5pbl9jb21taXQpIHsKKwkJc3Bpbl91bmxvY2soJmN1cl90cmFucy0+Y29tbWl0X2xvY2spOwogCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCiAJCXJldCA9IHdhaXRfZm9yX2NvbW1pdChyb290LCBjdXJfdHJhbnMpOwogCQlCVUdfT04ocmV0KTsKIAotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAogCQlyZXR1cm4gMDsKIAl9CiAKIAl0cmFucy0+dHJhbnNhY3Rpb24tPmluX2NvbW1pdCA9IDE7CiAJdHJhbnMtPnRyYW5zYWN0aW9uLT5ibG9ja2VkID0gMTsKKwlzcGluX3VubG9jaygmY3VyX3RyYW5zLT5jb21taXRfbG9jayk7CiAJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fYmxvY2tlZF93YWl0KTsKIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJaWYgKGN1cl90cmFucy0+bGlzdC5wcmV2ICE9ICZyb290LT5mc19pbmZvLT50cmFuc19saXN0KSB7CiAJCXByZXZfdHJhbnMgPSBsaXN0X2VudHJ5KGN1cl90cmFucy0+bGlzdC5wcmV2LAogCQkJCQlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24sIGxpc3QpOwogCQlpZiAoIXByZXZfdHJhbnMtPmNvbW1pdF9kb25lKSB7CiAJCQlhdG9taWNfaW5jKCZwcmV2X3RyYW5zLT51c2VfY291bnQpOwotCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAKIAkJCXdhaXRfZm9yX2NvbW1pdChyb290LCBwcmV2X3RyYW5zKTsKIAotCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwogCQkJcHV0X3RyYW5zYWN0aW9uKHByZXZfdHJhbnMpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCX0KIAogCWlmIChub3cgPCBjdXJfdHJhbnMtPnN0YXJ0X3RpbWUgfHwgbm93IC0gY3VyX3RyYW5zLT5zdGFydF90aW1lIDwgMSkKQEAgLTExNzgsMTIgKzEyNjUsMTIgQEAKIAogCWRvIHsKIAkJaW50IHNuYXBfcGVuZGluZyA9IDA7CisKIAkJam9pbmVkID0gY3VyX3RyYW5zLT5udW1fam9pbmVkOwogCQlpZiAoIWxpc3RfZW1wdHkoJnRyYW5zLT50cmFuc2FjdGlvbi0+cGVuZGluZ19zbmFwc2hvdHMpKQogCQkJc25hcF9wZW5kaW5nID0gMTsKIAogCQlXQVJOX09OKGN1cl90cmFucyAhPSB0cmFucy0+dHJhbnNhY3Rpb24pOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAogCQlpZiAoZmx1c2hfb25fY29tbWl0IHx8IHNuYXBfcGVuZGluZykgewogCQkJYnRyZnNfc3RhcnRfZGVsYWxsb2NfaW5vZGVzKHJvb3QsIDEpOwpAQCAtMTIwNiwyNiArMTI5Myw0OCBAQAogCQlwcmVwYXJlX3RvX3dhaXQoJmN1cl90cmFucy0+d3JpdGVyX3dhaXQsICZ3YWl0LAogCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAotCQlzbXBfbWIoKTsKIAkJaWYgKGF0b21pY19yZWFkKCZjdXJfdHJhbnMtPm51bV93cml0ZXJzKSA+IDEpCiAJCQlzY2hlZHVsZV90aW1lb3V0KE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKIAkJZWxzZSBpZiAoc2hvdWxkX2dyb3cpCiAJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCi0JCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAkJZmluaXNoX3dhaXQoJmN1cl90cmFucy0+d3JpdGVyX3dhaXQsICZ3YWl0KTsKIAl9IHdoaWxlIChhdG9taWNfcmVhZCgmY3VyX3RyYW5zLT5udW1fd3JpdGVycykgPiAxIHx8CiAJCSAoc2hvdWxkX2dyb3cgJiYgY3VyX3RyYW5zLT5udW1fam9pbmVkICE9IGpvaW5lZCkpOwogCi0JcmV0ID0gY3JlYXRlX3BlbmRpbmdfc25hcHNob3RzKHRyYW5zLCByb290LT5mc19pbmZvKTsKLQlCVUdfT04ocmV0KTsKKwkvKgorCSAqIE9rIG5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0byBibG9jayBvdXQgYW55IG90aGVyIGpvaW5zIHdoaWxlIHdlCisJICogY29tbWl0IHRoZSB0cmFuc2FjdGlvbi4gIFdlIGNvdWxkIGhhdmUgc3RhcnRlZCBhIGpvaW4gYmVmb3JlIHNldHRpbmcKKwkgKiBub19qb2luIHNvIG1ha2Ugc3VyZSB0byB3YWl0IGZvciBudW1fd3JpdGVycyB0byA9PSAxIGFnYWluLgorCSAqLworCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJcm9vdC0+ZnNfaW5mby0+dHJhbnNfbm9fam9pbiA9IDE7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCXdhaXRfZXZlbnQoY3VyX3RyYW5zLT53cml0ZXJfd2FpdCwKKwkJICAgYXRvbWljX3JlYWQoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMpID09IDEpOworCisJLyoKKwkgKiB0aGUgcmVsb2MgbXV0ZXggbWFrZXMgc3VyZSB0aGF0IHdlIHN0b3AKKwkgKiB0aGUgYmFsYW5jaW5nIGNvZGUgZnJvbSBjb21pbmcgaW4gYW5kIG1vdmluZworCSAqIGV4dGVudHMgYXJvdW5kIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNvbW1pdAorCSAqLworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAogCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX2l0ZW1zKHRyYW5zLCByb290KTsKIAlCVUdfT04ocmV0KTsKIAorCXJldCA9IGNyZWF0ZV9wZW5kaW5nX3NuYXBzaG90cyh0cmFucywgcm9vdC0+ZnNfaW5mbyk7CisJQlVHX09OKHJldCk7CisKIAlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9yZWZzKHRyYW5zLCByb290LCAodW5zaWduZWQgbG9uZyktMSk7CiAJQlVHX09OKHJldCk7CiAKKwkvKgorCSAqIG1ha2Ugc3VyZSBub25lIG9mIHRoZSBjb2RlIGFib3ZlIG1hbmFnZWQgdG8gc2xpcCBpbiBhCisJICogZGVsYXllZCBpdGVtCisJICovCisJYnRyZnNfYXNzZXJ0X2RlbGF5ZWRfcm9vdF9lbXB0eShyb290KTsKKwogCVdBUk5fT04oY3VyX3RyYW5zICE9IHRyYW5zLT50cmFuc2FjdGlvbik7CiAKIAlidHJmc19zY3J1Yl9wYXVzZShyb290KTsKQEAgLTEyNTgsOSArMTM2Nyw2IEBACiAJYnRyZnNfcHJlcGFyZV9leHRlbnRfY29tbWl0KHRyYW5zLCByb290KTsKIAogCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247Ci0Jc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7Ci0Jcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKIAogCWJ0cmZzX3NldF9yb290X25vZGUoJnJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdC0+cm9vdF9pdGVtLAogCQkJICAgIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdC0+bm9kZSk7CkBAIC0xMjgxLDEwICsxMzg3LDE0IEBACiAJICAgICAgIHNpemVvZihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSk7CiAKIAl0cmFucy0+dHJhbnNhY3Rpb24tPmJsb2NrZWQgPSAwOworCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJcm9vdC0+ZnNfaW5mby0+dHJhbnNfbm9fam9pbiA9IDA7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCiAJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCk7CiAKLQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAlyZXQgPSBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJQlVHX09OKHJldCk7CiAJd3JpdGVfY3RyZWVfc3VwZXIodHJhbnMsIHJvb3QsIDApOwpAQCAtMTI5NywyMiArMTQwNywyMSBAQAogCiAJYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQodHJhbnMsIHJvb3QpOwogCi0JbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOwotCiAJY3VyX3RyYW5zLT5jb21taXRfZG9uZSA9IDE7CiAKIAlyb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2NvbW1pdHRlZCA9IGN1cl90cmFucy0+dHJhbnNpZDsKIAogCXdha2VfdXAoJmN1cl90cmFucy0+Y29tbWl0X3dhaXQpOwogCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAlsaXN0X2RlbF9pbml0KCZjdXJfdHJhbnMtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwogCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwogCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwogCiAJdHJhY2VfYnRyZnNfdHJhbnNhY3Rpb25fY29tbWl0KHJvb3QpOwogCi0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7Ci0KIAlidHJmc19zY3J1Yl9jb250aW51ZShyb290KTsKIAogCWlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gPT0gdHJhbnMpCkBAIC0xMzM0LDkgKzE0NDMsOSBAQAogCUxJU1RfSEVBRChsaXN0KTsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CiAKLQltdXRleF9sb2NrKCZmc19pbmZvLT50cmFuc19tdXRleCk7CisJc3Bpbl9sb2NrKCZmc19pbmZvLT50cmFuc19sb2NrKTsKIAlsaXN0X3NwbGljZV9pbml0KCZmc19pbmZvLT5kZWFkX3Jvb3RzLCAmbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT50cmFuc19tdXRleCk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnRyYW5zX2xvY2spOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgewogCQlyb290ID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBidHJmc19yb290LCByb290X2xpc3QpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uaCBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmgKaW5kZXggODA0Yzg4Ni4uMDI1NjRlNiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uaAorKysgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5oCkBAIC0yOCwxMCArMjgsMTIgQEAKIAkgKiB0cmFuc2FjdGlvbiBjYW4gZW5kCiAJICovCiAJYXRvbWljX3QgbnVtX3dyaXRlcnM7CisJYXRvbWljX3QgdXNlX2NvdW50OwogCiAJdW5zaWduZWQgbG9uZyBudW1fam9pbmVkOworCisJc3BpbmxvY2tfdCBjb21taXRfbG9jazsKIAlpbnQgaW5fY29tbWl0OwotCWF0b21pY190IHVzZV9jb3VudDsKIAlpbnQgY29tbWl0X2RvbmU7CiAJaW50IGJsb2NrZWQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtNDUsMTMgKzQ3LDE0IEBACiAKIHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgewogCXU2NCB0cmFuc2lkOwotCXU2NCBibG9ja19ncm91cDsKIAl1NjQgYnl0ZXNfcmVzZXJ2ZWQ7CisJdW5zaWduZWQgbG9uZyB1c2VfY291bnQ7CiAJdW5zaWduZWQgbG9uZyBibG9ja3NfcmVzZXJ2ZWQ7CiAJdW5zaWduZWQgbG9uZyBibG9ja3NfdXNlZDsKIAl1bnNpZ25lZCBsb25nIGRlbGF5ZWRfcmVmX3VwZGF0ZXM7CiAJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqb3JpZ19yc3Y7CiB9OwogCiBzdHJ1Y3QgYnRyZnNfcGVuZGluZ19zbmFwc2hvdCB7CkBAIC02NiwxOSArNjksNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXRyYW5zLT5ibG9ja19ncm91cCA9IEJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCgKLQkJCQkJICBzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCUJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCA9IHRyYW5zLT5ibG9ja19ncm91cDsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX3NldF9pbm9kZV9sYXN0X3RyYW5zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtOTIsMTIgKzgyLDkgQEAKIAkJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJCQkgICBpbnQgbnVtX2l0ZW1zKTsKLXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJCQkgIGludCBudW1fYmxvY2tzKTsKLXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb25fbm9sb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCQkJCSAgaW50IG51bV9ibG9ja3MpOwotc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnIsCi0JCQkJCQkJIGludCBudW1fYmxvY2tzKTsKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfam9pbl90cmFuc2FjdGlvbl9ub2xvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogaW50IGJ0cmZzX3dhaXRfZm9yX2NvbW1pdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHRyYW5zaWQpOwogaW50IGJ0cmZzX3dyaXRlX2FuZF93YWl0X3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggNTkyMzk2Yy4uNGNlOGE5ZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0zMTc3LDcgKzMxNzcsNyBAQAogCQl0bXBfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAKIAkJd2MucmVwbGF5X2Rlc3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCAmdG1wX2tleSk7Ci0JCUJVR19PTighd2MucmVwbGF5X2Rlc3QpOworCQlCVUdfT04oSVNfRVJSX09SX05VTEwod2MucmVwbGF5X2Rlc3QpKTsKIAogCQl3Yy5yZXBsYXlfZGVzdC0+bG9nX3Jvb3QgPSBsb2c7CiAJCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCB3Yy5yZXBsYXlfZGVzdCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy92b2x1bWVzLmMgYi9mcy9idHJmcy92b2x1bWVzLmMKaW5kZXggYzQ4MjE0ZS4uMTk0NTBiYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJCUJVR19PTighbmV3X2RldmljZSk7CiAJCW1lbWNweShuZXdfZGV2aWNlLCBkZXZpY2UsIHNpemVvZigqbmV3X2RldmljZSkpOwogCQluZXdfZGV2aWNlLT5uYW1lID0ga3N0cmR1cChkZXZpY2UtPm5hbWUsIEdGUF9OT0ZTKTsKLQkJQlVHX09OKCFuZXdfZGV2aWNlLT5uYW1lKTsKKwkJQlVHX09OKGRldmljZS0+bmFtZSAmJiAhbmV3X2RldmljZS0+bmFtZSk7CiAJCW5ld19kZXZpY2UtPmJkZXYgPSBOVUxMOwogCQluZXdfZGV2aWNlLT53cml0ZWFibGUgPSAwOwogCQluZXdfZGV2aWNlLT5pbl9mc19tZXRhZGF0YSA9IDA7CkBAIC02ODksMTIgKzY4OSw4IEBACiAJdHJhbnNpZCA9IGJ0cmZzX3N1cGVyX2dlbmVyYXRpb24oZGlza19zdXBlcik7CiAJaWYgKGRpc2tfc3VwZXItPmxhYmVsWzBdKQogCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgbGFiZWwgJXMgIiwgZGlza19zdXBlci0+bGFiZWwpOwotCWVsc2UgewotCQkvKiBGSVhNRSwgbWFrZSBhIHJlYWRsIHV1aWQgcGFyc2VyICovCi0JCXByaW50ayhLRVJOX0lORk8gImRldmljZSBmc2lkICVsbHgtJWxseCAiLAotCQkgICAgICAgKih1bnNpZ25lZCBsb25nIGxvbmcgKilkaXNrX3N1cGVyLT5mc2lkLAotCQkgICAgICAgKih1bnNpZ25lZCBsb25nIGxvbmcgKikoZGlza19zdXBlci0+ZnNpZCArIDgpKTsKLQl9CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgZnNpZCAlcFUgIiwgZGlza19zdXBlci0+ZnNpZCk7CiAJcHJpbnRrKEtFUk5fQ09OVCAiZGV2aWQgJWxsdSB0cmFuc2lkICVsbHUgJXNcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWQsICh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNpZCwgcGF0aCk7CiAJcmV0ID0gZGV2aWNlX2xpc3RfYWRkKHBhdGgsIGRpc2tfc3VwZXIsIGRldmlkLCBmc19kZXZpY2VzX3JldCk7CkBAIC0yMTAyLDcgKzIwOTgsOCBAQAogCQkJCQkgICBjaHVua19yb290LT5yb290X2tleS5vYmplY3RpZCwKIAkJCQkJICAgZm91bmRfa2V5Lm9iamVjdGlkLAogCQkJCQkgICBmb3VuZF9rZXkub2Zmc2V0KTsKLQkJQlVHX09OKHJldCAmJiByZXQgIT0gLUVOT1NQQyk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9TUEMpCisJCQlnb3RvIGVycm9yOwogCQlrZXkub2Zmc2V0ID0gZm91bmRfa2V5Lm9mZnNldCAtIDE7CiAJfQogCXJldCA9IDA7CmRpZmYgLS1naXQgYS9mcy9idHJmcy94YXR0ci5jIGIvZnMvYnRyZnMveGF0dHIuYwppbmRleCBmMzEwN2U0Li41MzY2ZmU0IDEwMDY0NAotLS0gYS9mcy9idHJmcy94YXR0ci5jCisrKyBiL2ZzL2J0cmZzL3hhdHRyLmMKQEAgLTE1OCw4ICsxNTgsNiBAQAogCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CiAKLQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKLQogCXJldCA9IGRvX3NldHhhdHRyKHRyYW5zLCBpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggNDljOWFhZC4uMWE4MGIwNCAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTE5MDIsMTAgKzE5MDIsOCBAQAogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSgqd2FpdF9iaCkpCiAJCQllcnIgPSAtRUlPOwogCX0KLQlpZiAodW5saWtlbHkoZXJyKSkgeworCWlmICh1bmxpa2VseShlcnIpKQogCQlwYWdlX3plcm9fbmV3X2J1ZmZlcnMocGFnZSwgZnJvbSwgdG8pOwotCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQl9CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woX19ibG9ja193cml0ZV9iZWdpbik7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2FkZHIuYyBiL2ZzL2NlcGgvYWRkci5jCmluZGV4IDMzZGE0OWQuLjVhMzk1M2QgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvYWRkci5jCisrKyBiL2ZzL2NlcGgvYWRkci5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCUJVR19PTighaW5vZGUpOwotCWlncmFiKGlub2RlKTsKKwlpaG9sZChpbm9kZSk7CiAJZXJyID0gd3JpdGVwYWdlX25vdW5sb2NrKHBhZ2UsIHdiYyk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2NhcHMuYyBiL2ZzL2NlcGgvY2Fwcy5jCmluZGV4IDFmNzJiMDAuLmY2MDU3NTMgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvY2Fwcy5jCisrKyBiL2ZzL2NlcGgvY2Fwcy5jCkBAIC0yOTQwLDE0ICsyOTQwLDEyIEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZtZHNjLT5jYXBfZGlydHkpKSB7CiAJCWNpID0gbGlzdF9maXJzdF9lbnRyeSgmbWRzYy0+Y2FwX2RpcnR5LCBzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvLAogCQkJCSAgICAgIGlfZGlydHlfaXRlbSk7Ci0JCWlub2RlID0gaWdyYWIoJmNpLT52ZnNfaW5vZGUpOworCQlpbm9kZSA9ICZjaS0+dmZzX2lub2RlOworCQlpaG9sZChpbm9kZSk7CiAJCWRvdXQoImZsdXNoX2RpcnR5X2NhcHMgJXBcbiIsIGlub2RlKTsKIAkJc3Bpbl91bmxvY2soJm1kc2MtPmNhcF9kaXJ0eV9sb2NrKTsKLQkJaWYgKGlub2RlKSB7Ci0JCQljZXBoX2NoZWNrX2NhcHMoY2ksIENIRUNLX0NBUFNfTk9ERUxBWXxDSEVDS19DQVBTX0ZMVVNILAotCQkJCQlOVUxMKTsKLQkJCWlwdXQoaW5vZGUpOwotCQl9CisJCWNlcGhfY2hlY2tfY2FwcyhjaSwgQ0hFQ0tfQ0FQU19OT0RFTEFZfENIRUNLX0NBUFNfRkxVU0gsIE5VTEwpOworCQlpcHV0KGlub2RlKTsKIAkJc3Bpbl9sb2NrKCZtZHNjLT5jYXBfZGlydHlfbG9jayk7CiAJfQogCXNwaW5fdW5sb2NrKCZtZHNjLT5jYXBfZGlydHlfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2Rpci5jIGIvZnMvY2VwaC9kaXIuYwppbmRleCAzMzcyOWU4Li5lZjhmMDhjIDEwMDY0NAotLS0gYS9mcy9jZXBoL2Rpci5jCisrKyBiL2ZzL2NlcGgvZGlyLmMKQEAgLTMwOCw3ICszMDgsOCBAQAogCQlyZXEgPSBjZXBoX21kc2NfY3JlYXRlX3JlcXVlc3QobWRzYywgb3AsIFVTRV9BVVRIX01EUyk7CiAJCWlmIChJU19FUlIocmVxKSkKIAkJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwkJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJCWlob2xkKGlub2RlKTsKIAkJcmVxLT5yX2RlbnRyeSA9IGRnZXQoZmlscC0+Zl9kZW50cnkpOwogCQkvKiBoaW50cyB0byByZXF1ZXN0IC0+IG1kcyBzZWxlY3Rpb24gY29kZSAqLwogCQlyZXEtPnJfZGlyZWN0X21vZGUgPSBVU0VfQVVUSF9NRFM7CkBAIC03ODcsMTAgKzc4OCwxMiBAQAogCXJlcS0+cl9kZW50cnlfZHJvcCA9IENFUEhfQ0FQX0ZJTEVfU0hBUkVEOwogCXJlcS0+cl9kZW50cnlfdW5sZXNzID0gQ0VQSF9DQVBfRklMRV9FWENMOwogCWVyciA9IGNlcGhfbWRzY19kb19yZXF1ZXN0KG1kc2MsIGRpciwgcmVxKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJZF9kcm9wKGRlbnRyeSk7Ci0JZWxzZSBpZiAoIXJlcS0+cl9yZXBseV9pbmZvLmhlYWQtPmlzX2RlbnRyeSkKLQkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlncmFiKG9sZF9kZW50cnktPmRfaW5vZGUpKTsKKwl9IGVsc2UgaWYgKCFyZXEtPnJfcmVwbHlfaW5mby5oZWFkLT5pc19kZW50cnkpIHsKKwkJaWhvbGQob2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBvbGRfZGVudHJ5LT5kX2lub2RlKTsKKwl9CiAJY2VwaF9tZHNjX3B1dF9yZXF1ZXN0KHJlcSk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NlcGgvZXhwb3J0LmMgYi9mcy9jZXBoL2V4cG9ydC5jCmluZGV4IGE2MTBkM2QuLmY2N2I2ODcgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvZXhwb3J0LmMKKysrIGIvZnMvY2VwaC9leHBvcnQuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCWVyciA9IGNlcGhfbWRzY19kb19yZXF1ZXN0KG1kc2MsIE5VTEwsIHJlcSk7CiAJCWlub2RlID0gcmVxLT5yX3RhcmdldF9pbm9kZTsKIAkJaWYgKGlub2RlKQotCQkJaWdyYWIoaW5vZGUpOworCQkJaWhvbGQoaW5vZGUpOwogCQljZXBoX21kc2NfcHV0X3JlcXVlc3QocmVxKTsKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCWVyciA9IGNlcGhfbWRzY19kb19yZXF1ZXN0KG1kc2MsIE5VTEwsIHJlcSk7CiAJCWlub2RlID0gcmVxLT5yX3RhcmdldF9pbm9kZTsKIAkJaWYgKGlub2RlKQotCQkJaWdyYWIoaW5vZGUpOworCQkJaWhvbGQoaW5vZGUpOwogCQljZXBoX21kc2NfcHV0X3JlcXVlc3QocmVxKTsKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKGVyciA/IGVyciA6IC1FU1RBTEUpOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9maWxlLmMgYi9mcy9jZXBoL2ZpbGUuYwppbmRleCAyMDMyNTJkLi40Njk4YTVjIDEwMDY0NAotLS0gYS9mcy9jZXBoL2ZpbGUuYworKysgYi9mcy9jZXBoL2ZpbGUuYwpAQCAtMTkxLDcgKzE5MSw4IEBACiAJCWVyciA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBvdXQ7CiAJfQotCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwlpaG9sZChpbm9kZSk7CiAJcmVxLT5yX251bV9jYXBzID0gMTsKIAllcnIgPSBjZXBoX21kc2NfZG9fcmVxdWVzdChtZHNjLCBwYXJlbnRfaW5vZGUsIHJlcSk7CiAJaWYgKCFlcnIpCkBAIC0yODIsMTQgKzI4MywxMyBAQAogc3RhdGljIGludCBzdHJpcGVkX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCXU2NCBvZmYsIHU2NCBsZW4sCiAJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtX3BhZ2VzLAotCQkJaW50ICpjaGVja2VvZiwgYm9vbCBhbGlnbl90b19wYWdlcywKKwkJCWludCAqY2hlY2tlb2YsIGJvb2wgb19kaXJlY3QsCiAJCQl1bnNpZ25lZCBsb25nIGJ1Zl9hbGlnbikKIHsKIAlzdHJ1Y3QgY2VwaF9mc19jbGllbnQgKmZzYyA9IGNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKTsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwogCXU2NCBwb3MsIHRoaXNfbGVuOwogCWludCBpb19hbGlnbiwgcGFnZV9hbGlnbjsKLQlpbnQgcGFnZV9vZmYgPSBvZmYgJiB+UEFHRV9DQUNIRV9NQVNLOyAvKiBmaXJzdCBieXRlJ3Mgb2Zmc2V0IGluIHBhZ2UgKi8KIAlpbnQgbGVmdCwgcGFnZXNfbGVmdDsKIAlpbnQgcmVhZDsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VfcG9zOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJaW9fYWxpZ24gPSBvZmYgJiB+UEFHRV9NQVNLOwogCiBtb3JlOgotCWlmIChhbGlnbl90b19wYWdlcykKKwlpZiAob19kaXJlY3QpCiAJCXBhZ2VfYWxpZ24gPSAocG9zIC0gaW9fYWxpZ24gKyBidWZfYWxpZ24pICYgflBBR0VfTUFTSzsKIAllbHNlCiAJCXBhZ2VfYWxpZ24gPSBwb3MgJiB+UEFHRV9NQVNLOwpAQCAtMzE3LDIwICszMTcsMTkgQEAKIAkJCQkgIGNpLT5pX3RydW5jYXRlX3NlcSwKIAkJCQkgIGNpLT5pX3RydW5jYXRlX3NpemUsCiAJCQkJICBwYWdlX3BvcywgcGFnZXNfbGVmdCwgcGFnZV9hbGlnbik7Ci0JaGl0X3N0cmlwZSA9IHRoaXNfbGVuIDwgbGVmdDsKLQl3YXNfc2hvcnQgPSByZXQgPj0gMCAmJiByZXQgPCB0aGlzX2xlbjsKIAlpZiAocmV0ID09IC1FTk9FTlQpCiAJCXJldCA9IDA7CisJaGl0X3N0cmlwZSA9IHRoaXNfbGVuIDwgbGVmdDsKKwl3YXNfc2hvcnQgPSByZXQgPj0gMCAmJiByZXQgPCB0aGlzX2xlbjsKIAlkb3V0KCJzdHJpcGVkX3JlYWQgJWxsdX4ldSAocmVhZCAldSkgZ290ICVkJXMlc1xuIiwgcG9zLCBsZWZ0LCByZWFkLAogCSAgICAgcmV0LCBoaXRfc3RyaXBlID8gIiBISVRTVFJJUEUiIDogIiIsIHdhc19zaG9ydCA/ICIgU0hPUlQiIDogIiIpOwogCiAJaWYgKHJldCA+IDApIHsKLQkJaW50IGRpZHBhZ2VzID0KLQkJCSgocG9zICYgflBBR0VfQ0FDSEVfTUFTSykgKyByZXQpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWludCBkaWRwYWdlcyA9IChwYWdlX2FsaWduICsgcmV0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCiAJCWlmIChyZWFkIDwgcG9zIC0gb2ZmKSB7CiAJCQlkb3V0KCIgemVybyBnYXAgJWxsdSB0byAlbGx1XG4iLCBvZmYgKyByZWFkLCBwb3MpOwotCQkJY2VwaF96ZXJvX3BhZ2VfdmVjdG9yX3JhbmdlKHBhZ2Vfb2ZmICsgcmVhZCwKKwkJCWNlcGhfemVyb19wYWdlX3ZlY3Rvcl9yYW5nZShwYWdlX2FsaWduICsgcmVhZCwKIAkJCQkJCSAgICBwb3MgLSBvZmYgLSByZWFkLCBwYWdlcyk7CiAJCX0KIAkJcG9zICs9IHJldDsKQEAgLTM0NSwyMCArMzQ0LDIyIEBACiAJfQogCiAJaWYgKHdhc19zaG9ydCkgewotCQkvKiB3YXMgb3JpZ2luYWwgZXh0ZW50IGZ1bGx5IGluc2lkZSBpX3NpemU/ICovCi0JCWlmIChwb3MgKyBsZWZ0IDw9IGlub2RlLT5pX3NpemUpIHsKLQkJCWRvdXQoInplcm8gdGFpbFxuIik7Ci0JCQljZXBoX3plcm9fcGFnZV92ZWN0b3JfcmFuZ2UocGFnZV9vZmYgKyByZWFkLCBsZW4gLSByZWFkLAotCQkJCQkJICAgIHBhZ2VzKTsKLQkJCXJlYWQgPSBsZW47Ci0JCQlnb3RvIG91dDsKLQkJfQorCQkvKiBkaWQgd2UgYm91bmNlIG9mZiBlb2Y/ICovCisJCWlmIChwb3MgKyBsZWZ0ID4gaW5vZGUtPmlfc2l6ZSkKKwkJCSpjaGVja2VvZiA9IDE7CiAKLQkJLyogY2hlY2sgaV9zaXplICovCi0JCSpjaGVja2VvZiA9IDE7CisJCS8qIHplcm8gdHJhaWxpbmcgYnl0ZXMgKGluc2lkZSBpX3NpemUpICovCisJCWlmIChsZWZ0ID4gMCAmJiBwb3MgPCBpbm9kZS0+aV9zaXplKSB7CisJCQlpZiAocG9zICsgbGVmdCA+IGlub2RlLT5pX3NpemUpCisJCQkJbGVmdCA9IGlub2RlLT5pX3NpemUgLSBwb3M7CisKKwkJCWRvdXQoInplcm8gdGFpbCAlZFxuIiwgbGVmdCk7CisJCQljZXBoX3plcm9fcGFnZV92ZWN0b3JfcmFuZ2UocGFnZV9hbGlnbiArIHJlYWQsIGxlZnQsCisJCQkJCQkgICAgcGFnZXMpOworCQkJcmVhZCArPSBsZWZ0OworCQl9CiAJfQogCi1vdXQ6CiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSByZWFkOwogCWRvdXQoInN0cmlwZWRfcmVhZCByZXR1cm5zICVkXG4iLCByZXQpOwpAQCAtNDc1LDkgKzQ3Niw2IEBACiAJZWxzZQogCQlwb3MgPSAqb2Zmc2V0OwogCi0JaW9fYWxpZ24gPSBwb3MgJiB+UEFHRV9NQVNLOwotCWJ1Zl9hbGlnbiA9ICh1bnNpZ25lZCBsb25nKWRhdGEgJiB+UEFHRV9NQVNLOwotCiAJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBwb3MsIHBvcyArIGxlZnQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNTAxLDYgKzQ5OSw4IEBACiAJICogYm91bmRhcnkuICB0aGlzIGlzbid0IGF0b21pYywgdW5mb3J0dW5hdGVseS4gIDooCiAJICovCiBtb3JlOgorCWlvX2FsaWduID0gcG9zICYgflBBR0VfTUFTSzsKKwlidWZfYWxpZ24gPSAodW5zaWduZWQgbG9uZylkYXRhICYgflBBR0VfTUFTSzsKIAlsZW4gPSBsZWZ0OwogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsKIAkJLyogd3JpdGUgZnJvbSBiZWdpbm5pbmcgb2YgZmlyc3QgcGFnZSwgcmVnYXJkbGVzcyBvZgpAQCAtNTkwLDYgKzU5MCw3IEBACiAJCXBvcyArPSBsZW47CiAJCXdyaXR0ZW4gKz0gbGVuOwogCQlsZWZ0IC09IGxlbjsKKwkJZGF0YSArPSB3cml0dGVuOwogCQlpZiAobGVmdCkKIAkJCWdvdG8gbW9yZTsKIApAQCAtNjU4LDcgKzY1OSw3IEBACiAKIAkJLyogaGl0IEVPRiBvciBob2xlPyAqLwogCQlpZiAoc3RhdHJldCA9PSAwICYmICpwcG9zIDwgaW5vZGUtPmlfc2l6ZSkgewotCQkJZG91dCgiYWlvX3JlYWQgc3luY19yZWFkIGhpdCBob2xlLCByZWFkaW5nIG1vcmVcbiIpOworCQkJZG91dCgiYWlvX3JlYWQgc3luY19yZWFkIGhpdCBob2xlLCBwcG9zICVsbGQgPCBzaXplICVsbGQsIHJlYWRpbmcgbW9yZVxuIiwgKnBwb3MsIGlub2RlLT5pX3NpemUpOwogCQkJcmVhZCArPSByZXQ7CiAJCQliYXNlICs9IHJldDsKIAkJCWxlbiAtPSByZXQ7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2lub2RlLmMgYi9mcy9jZXBoL2lub2RlLmMKaW5kZXggNzBiNmE0OC4uZDg4NThlOSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pbm9kZS5jCisrKyBiL2ZzL2NlcGgvaW5vZGUuYwpAQCAtMTEwMSwxMCArMTEwMSwxMCBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAkJCXJlcS0+cl9kZW50cnkgPSBkbjsgIC8qIG1heSBoYXZlIHNwbGljZWQgKi8KLQkJCWlncmFiKGluKTsKKwkJCWlob2xkKGluKTsKIAkJfSBlbHNlIGlmIChjZXBoX2lubyhpbikgPT0gdmluby5pbm8gJiYKIAkJCSAgIGNlcGhfc25hcChpbikgPT0gdmluby5zbmFwKSB7Ci0JCQlpZ3JhYihpbik7CisJCQlpaG9sZChpbik7CiAJCX0gZWxzZSB7CiAJCQlkb3V0KCIgJXAgbGlua3MgdG8gJXAgJWxseC4lbGx4LCBub3QgJWxseC4lbGx4XG4iLAogCQkJICAgICBkbiwgaW4sIGNlcGhfaW5vKGluKSwgY2VwaF9zbmFwKGluKSwKQEAgLTExNDQsNyArMTE0NCw3IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJcmVxLT5yX2RlbnRyeSA9IGRuOyAgLyogbWF5IGhhdmUgc3BsaWNlZCAqLwotCQlpZ3JhYihpbik7CisJCWlob2xkKGluKTsKIAkJcmluZm8tPmhlYWQtPmlzX2RlbnRyeSA9IDE7ICAvKiBmb29sIG5vdHJhY2UgaGFuZGxlcnMgKi8KIAl9CiAKQEAgLTEzMjgsNyArMTMyOCw3IEBACiAJaWYgKHF1ZXVlX3dvcmsoY2VwaF9pbm9kZV90b19jbGllbnQoaW5vZGUpLT53Yl93cSwKIAkJICAgICAgICZjZXBoX2lub2RlKGlub2RlKS0+aV93Yl93b3JrKSkgewogCQlkb3V0KCJjZXBoX3F1ZXVlX3dyaXRlYmFjayAlcFxuIiwgaW5vZGUpOwotCQlpZ3JhYihpbm9kZSk7CisJCWlob2xkKGlub2RlKTsKIAl9IGVsc2UgewogCQlkb3V0KCJjZXBoX3F1ZXVlX3dyaXRlYmFjayAlcCBmYWlsZWRcbiIsIGlub2RlKTsKIAl9CkBAIC0xMzUzLDcgKzEzNTMsNyBAQAogCWlmIChxdWV1ZV93b3JrKGNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+cGdfaW52X3dxLAogCQkgICAgICAgJmNlcGhfaW5vZGUoaW5vZGUpLT5pX3BnX2ludl93b3JrKSkgewogCQlkb3V0KCJjZXBoX3F1ZXVlX2ludmFsaWRhdGUgJXBcbiIsIGlub2RlKTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJfSBlbHNlIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV9pbnZhbGlkYXRlICVwIGZhaWxlZFxuIiwgaW5vZGUpOwogCX0KQEAgLTE0NzcsNyArMTQ3Nyw3IEBACiAJaWYgKHF1ZXVlX3dvcmsoY2VwaF9zYl90b19jbGllbnQoaW5vZGUtPmlfc2IpLT50cnVuY193cSwKIAkJICAgICAgICZjaS0+aV92bXRydW5jYXRlX3dvcmspKSB7CiAJCWRvdXQoImNlcGhfcXVldWVfdm10cnVuY2F0ZSAlcFxuIiwgaW5vZGUpOwotCQlpZ3JhYihpbm9kZSk7CisJCWlob2xkKGlub2RlKTsKIAl9IGVsc2UgewogCQlkb3V0KCJjZXBoX3F1ZXVlX3ZtdHJ1bmNhdGUgJXAgZmFpbGVkLCBwZW5kaW5nPSVkXG4iLAogCQkgICAgIGlub2RlLCBjaS0+aV90cnVuY2F0ZV9wZW5kaW5nKTsKQEAgLTE3MzgsNyArMTczOCw4IEBACiAJCV9fbWFya19pbm9kZV9kaXJ0eShpbm9kZSwgaW5vZGVfZGlydHlfZmxhZ3MpOwogCiAJaWYgKG1hc2spIHsKLQkJcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCQlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwkJaWhvbGQoaW5vZGUpOwogCQlyZXEtPnJfaW5vZGVfZHJvcCA9IHJlbGVhc2U7CiAJCXJlcS0+cl9hcmdzLnNldGF0dHIubWFzayA9IGNwdV90b19sZTMyKG1hc2spOwogCQlyZXEtPnJfbnVtX2NhcHMgPSAxOwpAQCAtMTc3OSw3ICsxNzgwLDggQEAKIAlyZXEgPSBjZXBoX21kc2NfY3JlYXRlX3JlcXVlc3QobWRzYywgQ0VQSF9NRFNfT1BfR0VUQVRUUiwgVVNFX0FOWV9NRFMpOwogCWlmIChJU19FUlIocmVxKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVxKTsKLQlyZXEtPnJfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJaWhvbGQoaW5vZGUpOwogCXJlcS0+cl9udW1fY2FwcyA9IDE7CiAJcmVxLT5yX2FyZ3MuZ2V0YXR0ci5tYXNrID0gY3B1X3RvX2xlMzIobWFzayk7CiAJZXJyID0gY2VwaF9tZHNjX2RvX3JlcXVlc3QobWRzYywgTlVMTCwgcmVxKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvaW9jdGwuYyBiL2ZzL2NlcGgvaW9jdGwuYwppbmRleCA4ODg4YzliYS4uZWYwYjVmNCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pb2N0bC5jCisrKyBiL2ZzL2NlcGgvaW9jdGwuYwpAQCAtNzMsNyArNzMsOCBAQAogCQkJCSAgICAgICBVU0VfQVVUSF9NRFMpOwogCWlmIChJU19FUlIocmVxKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVxKTsKLQlyZXEtPnJfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJaWhvbGQoaW5vZGUpOwogCXJlcS0+cl9pbm9kZV9kcm9wID0gQ0VQSF9DQVBfRklMRV9TSEFSRUQgfCBDRVBIX0NBUF9GSUxFX0VYQ0w7CiAKIAlyZXEtPnJfYXJncy5zZXRsYXlvdXQubGF5b3V0LmZsX3N0cmlwZV91bml0ID0KQEAgLTEzNSw3ICsxMzYsOCBAQAogCiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwotCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwlpaG9sZChpbm9kZSk7CiAKIAlyZXEtPnJfYXJncy5zZXRsYXlvdXQubGF5b3V0LmZsX3N0cmlwZV91bml0ID0KIAkJCWNwdV90b19sZTMyKGwuc3RyaXBlX3VuaXQpOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9sb2Nrcy5jIGIvZnMvY2VwaC9sb2Nrcy5jCmluZGV4IDQ3NmIzMjkuLjgwNTc2ZDA1IDEwMDY0NAotLS0gYS9mcy9jZXBoL2xvY2tzLmMKKysrIGIvZnMvY2VwaC9sb2Nrcy5jCkBAIC0yMyw3ICsyMyw4IEBACiAJcmVxID0gY2VwaF9tZHNjX2NyZWF0ZV9yZXF1ZXN0KG1kc2MsIG9wZXJhdGlvbiwgVVNFX0FVVEhfTURTKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAogCS8qIG1kcyByZXF1aXJlcyBzdGFydCBhbmQgbGVuZ3RoIHJhdGhlciB0aGFuIHN0YXJ0IGFuZCBlbmQgKi8KIAlpZiAoTExPTkdfTUFYID09IGZsLT5mbF9lbmQpCkBAIC0zMiwxMSArMzMsMTAgQEAKIAkJbGVuZ3RoID0gZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDE7CiAKIAlkb3V0KCJjZXBoX2xvY2tfbWVzc2FnZTogcnVsZTogJWQsIG9wOiAlZCwgcGlkOiAlbGx1LCBzdGFydDogJWxsdSwgIgotCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGVgOiAlZCIsIChpbnQpbG9ja190eXBlLAorCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGU6ICVkIiwgKGludClsb2NrX3R5cGUsCiAJICAgICAoaW50KW9wZXJhdGlvbiwgKHU2NClmbC0+ZmxfcGlkLCBmbC0+Zmxfc3RhcnQsCiAJICAgICBsZW5ndGgsIHdhaXQsIGZsLT5mbF90eXBlKTsKIAotCiAJcmVxLT5yX2FyZ3MuZmlsZWxvY2tfY2hhbmdlLnJ1bGUgPSBsb2NrX3R5cGU7CiAJcmVxLT5yX2FyZ3MuZmlsZWxvY2tfY2hhbmdlLnR5cGUgPSBjbWQ7CiAJcmVxLT5yX2FyZ3MuZmlsZWxvY2tfY2hhbmdlLnBpZCA9IGNwdV90b19sZTY0KCh1NjQpZmwtPmZsX3BpZCk7CkBAIC03MCw3ICs3MCw3IEBACiAJfQogCWNlcGhfbWRzY19wdXRfcmVxdWVzdChyZXEpOwogCWRvdXQoImNlcGhfbG9ja19tZXNzYWdlOiBydWxlOiAlZCwgb3A6ICVkLCBwaWQ6ICVsbHUsIHN0YXJ0OiAlbGx1LCAiCi0JICAgICAibGVuZ3RoOiAlbGx1LCB3YWl0OiAlZCwgdHlwZWA6ICVkLCBlcnIgY29kZSAlZCIsIChpbnQpbG9ja190eXBlLAorCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGU6ICVkLCBlcnIgY29kZSAlZCIsIChpbnQpbG9ja190eXBlLAogCSAgICAgKGludClvcGVyYXRpb24sICh1NjQpZmwtPmZsX3BpZCwgZmwtPmZsX3N0YXJ0LAogCSAgICAgbGVuZ3RoLCB3YWl0LCBmbC0+ZmxfdHlwZSwgZXJyKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTA5LDE2ICsxMDksMjAgQEAKIAkJCWRvdXQoIm1kcyBsb2NrZWQsIGxvY2tpbmcgbG9jYWxseSIpOwogCQkJZXJyID0gcG9zaXhfbG9ja19maWxlKGZpbGUsIGZsLCBOVUxMKTsKIAkJCWlmIChlcnIgJiYgKENFUEhfTURTX09QX1NFVEZJTEVMT0NLID09IG9wKSkgewotCQkJCS8qIHVuZG8hIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBrZXJuZWwgZGV0ZWN0cwotCQkJCSAqIGxvY2FsIGRlYWRsb2NrLiAqLworCQkJCS8qIHVuZG8hIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmCisJCQkJICogdGhlIGtlcm5lbCBkZXRlY3RzIGxvY2FsCisJCQkJICogZGVhZGxvY2suICovCiAJCQkJY2VwaF9sb2NrX21lc3NhZ2UoQ0VQSF9MT0NLX0ZDTlRMLCBvcCwgZmlsZSwKIAkJCQkJCSAgQ0VQSF9MT0NLX1VOTE9DSywgMCwgZmwpOwotCQkJCWRvdXQoImdvdCAlZCBvbiBwb3NpeF9sb2NrX2ZpbGUsIHVuZGlkIGxvY2siLCBlcnIpOworCQkJCWRvdXQoImdvdCAlZCBvbiBwb3NpeF9sb2NrX2ZpbGUsIHVuZGlkIGxvY2siLAorCQkJCSAgICAgZXJyKTsKIAkJCX0KIAkJfQogCi0JfSBlbHNlIHsKLQkJZG91dCgibWRzIHJldHVybmVkIGVycm9yIGNvZGUgJWQiLCBlcnIpOworCX0gZWxzZSBpZiAoZXJyID09IC1FUkVTVEFSVFNZUykgeworCQlkb3V0KCJ1bmRvaW5nIGxvY2tcbiIpOworCQljZXBoX2xvY2tfbWVzc2FnZShDRVBIX0xPQ0tfRkNOVEwsIG9wLCBmaWxlLAorCQkJCSAgQ0VQSF9MT0NLX1VOTE9DSywgMCwgZmwpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMTU1LDggKzE1OSwxMSBAQAogCQkJCQkgIGZpbGUsIENFUEhfTE9DS19VTkxPQ0ssIDAsIGZsKTsKIAkJCWRvdXQoImdvdCAlZCBvbiBmbG9ja19sb2NrX2ZpbGVfd2FpdCwgdW5kaWQgbG9jayIsIGVycik7CiAJCX0KLQl9IGVsc2UgewotCQlkb3V0KCJtZHMgZXJyb3IgY29kZSAlZCIsIGVycik7CisJfSBlbHNlIGlmIChlcnIgPT0gLUVSRVNUQVJUU1lTKSB7CisJCWRvdXQoInVuZG9pbmcgbG9ja1xuIik7CisJCWNlcGhfbG9ja19tZXNzYWdlKENFUEhfTE9DS19GTE9DSywKKwkJCQkgIENFUEhfTURTX09QX1NFVEZJTEVMT0NLLAorCQkJCSAgZmlsZSwgQ0VQSF9MT0NLX1VOTE9DSywgMCwgZmwpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9tZHNfY2xpZW50LmMgYi9mcy9jZXBoL21kc19jbGllbnQuYwppbmRleCA3OTc0M2QxLi4wYzFkOTE3IDEwMDY0NAotLS0gYS9mcy9jZXBoL21kc19jbGllbnQuYworKysgYi9mcy9jZXBoL21kc19jbGllbnQuYwpAQCAtMTQzOCwxMiArMTQzOCwxNSBAQAogCXN0cnVjdCBkZW50cnkgKnRlbXA7CiAJY2hhciAqcGF0aDsKIAlpbnQgbGVuLCBwb3M7CisJdW5zaWduZWQgc2VxOwogCiAJaWYgKGRlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogcmV0cnk6CiAJbGVuID0gMDsKKwlzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAodGVtcCA9IGRlbnRyeTsgIUlTX1JPT1QodGVtcCk7KSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB0ZW1wLT5kX2lub2RlOwogCQlpZiAoaW5vZGUgJiYgY2VwaF9zbmFwKGlub2RlKSA9PSBDRVBIX1NOQVBESVIpCkBAIC0xNDU1LDEwICsxNDU4LDEyIEBACiAJCQlsZW4gKz0gMSArIHRlbXAtPmRfbmFtZS5sZW47CiAJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKIAkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlwcl9lcnIoImJ1aWxkX3BhdGggY29ycnVwdCBkZW50cnkgJXBcbiIsIGRlbnRyeSk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAobGVuKQogCQlsZW4tLTsgIC8qIG5vIGxlYWRpbmcgJy8nICovCiAKQEAgLTE0NjcsOSArMTQ3MiwxMiBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlwb3MgPSBsZW47CiAJcGF0aFtwb3NdID0gMDsJLyogdHJhaWxpbmcgbnVsbCAqLworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKHRlbXAgPSBkZW50cnk7ICFJU19ST09UKHRlbXApICYmIHBvcyAhPSAwOyApIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IHRlbXAtPmRfaW5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKKwkJc3Bpbl9sb2NrKCZ0ZW1wLT5kX2xvY2spOworCQlpbm9kZSA9IHRlbXAtPmRfaW5vZGU7CiAJCWlmIChpbm9kZSAmJiBjZXBoX3NuYXAoaW5vZGUpID09IENFUEhfU05BUERJUikgewogCQkJZG91dCgiYnVpbGRfcGF0aCBwYXRoKyVkOiAlcCBTTkFQRElSXG4iLAogCQkJICAgICBwb3MsIHRlbXApOwpAQCAtMTQ3OCwyMSArMTQ4NiwyNiBAQAogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlwb3MgLT0gdGVtcC0+ZF9uYW1lLmxlbjsKLQkJCWlmIChwb3MgPCAwKQorCQkJaWYgKHBvcyA8IDApIHsKKwkJCQlzcGluX3VubG9jaygmdGVtcC0+ZF9sb2NrKTsKIAkJCQlicmVhazsKKwkJCX0KIAkJCXN0cm5jcHkocGF0aCArIHBvcywgdGVtcC0+ZF9uYW1lLm5hbWUsCiAJCQkJdGVtcC0+ZF9uYW1lLmxlbik7CiAJCX0KKwkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCWlmIChwb3MpCiAJCQlwYXRoWy0tcG9zXSA9ICcvJzsKIAkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OwogCQlpZiAodGVtcCA9PSBOVUxMKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXByX2VycigiYnVpbGRfcGF0aCBjb3JydXB0IGRlbnRyeVxuIik7CiAJCQlrZnJlZShwYXRoKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCQl9CiAJfQotCWlmIChwb3MgIT0gMCkgeworCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChwb3MgIT0gMCB8fCByZWFkX3NlcXJldHJ5KCZyZW5hbWVfbG9jaywgc2VxKSkgewogCQlwcl9lcnIoImJ1aWxkX3BhdGggZGlkIG5vdCBlbmQgcGF0aCBsb29rdXAgd2hlcmUgIgogCQkgICAgICAgImV4cGVjdGVkLCBuYW1lbGVuIGlzICVkLCBwb3MgaXMgJWRcbiIsIGxlbiwgcG9zKTsKIAkJLyogcHJlc3VtYWJseSB0aGlzIGlzIG9ubHkgcG9zc2libGUgaWYgcmFjaW5nIHdpdGggYQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zbmFwLmMgYi9mcy9jZXBoL3NuYXAuYwppbmRleCAyNDA2N2Q2Li41NGIxNGRlIDEwMDY0NAotLS0gYS9mcy9jZXBoL3NuYXAuYworKysgYi9mcy9jZXBoL3NuYXAuYwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJCWNpID0gbGlzdF9maXJzdF9lbnRyeSgmbWRzYy0+c25hcF9mbHVzaF9saXN0LAogCQkJCXN0cnVjdCBjZXBoX2lub2RlX2luZm8sIGlfc25hcF9mbHVzaF9pdGVtKTsKIAkJaW5vZGUgPSAmY2ktPnZmc19pbm9kZTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZtZHNjLT5zbmFwX2ZsdXNoX2xvY2spOwogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQlfX2NlcGhfZmx1c2hfc25hcHMoY2ksICZzZXNzaW9uLCAwKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgveGF0dHIuYyBiL2ZzL2NlcGgveGF0dHIuYwppbmRleCBmMmI2Mjg2Li5mNDJkNzMwIDEwMDY0NAotLS0gYS9mcy9jZXBoL3hhdHRyLmMKKysrIGIvZnMvY2VwaC94YXR0ci5jCkBAIC02NjUsNyArNjY1LDggQEAKIAkJZXJyID0gUFRSX0VSUihyZXEpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfaW5vZGVfZHJvcCA9IENFUEhfQ0FQX1hBVFRSX1NIQVJFRDsKIAlyZXEtPnJfbnVtX2NhcHMgPSAxOwogCXJlcS0+cl9hcmdzLnNldHhhdHRyLmZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwpAQCAtNzk1LDcgKzc5Niw4IEBACiAJCQkJICAgICAgIFVTRV9BVVRIX01EUyk7CiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwotCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwlpaG9sZChpbm9kZSk7CiAJcmVxLT5yX2lub2RlX2Ryb3AgPSBDRVBIX0NBUF9YQVRUUl9TSEFSRUQ7CiAJcmVxLT5yX251bV9jYXBzID0gMTsKIAlyZXEtPnJfcGF0aDIgPSBrc3RyZHVwKG5hbWUsIEdGUF9OT0ZTKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvS2NvbmZpZyBiL2ZzL2NpZnMvS2NvbmZpZwppbmRleCAxY2Q0YzNhLi5mNjZjYzE2IDEwMDY0NAotLS0gYS9mcy9jaWZzL0tjb25maWcKKysrIGIvZnMvY2lmcy9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCXNlbGVjdCBDUllQVE9fTUQ1CiAJc2VsZWN0IENSWVBUT19ITUFDCiAJc2VsZWN0IENSWVBUT19BUkM0CisJc2VsZWN0IENSWVBUT19FQ0IKIAlzZWxlY3QgQ1JZUFRPX0RFUwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGNsaWVudCBWRlMgbW9kdWxlIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtCkBAIC0xNDgsMTMgKzE0OSwxMyBAQAogCiBjb25maWcgQ0lGU19BQ0wKIAkgIGJvb2wgIlByb3ZpZGUgQ0lGUyBBQ0wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQkgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIENJRlNfWEFUVFIKKwkgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIENJRlNfWEFUVFIgJiYgS0VZUwogCSAgaGVscAogCSAgICBBbGxvd3MgdG8gZmV0Y2ggQ0lGUy9OVEZTIEFDTCBmcm9tIHRoZSBzZXJ2ZXIuICBUaGUgREFDTCBibG9iCiAJICAgIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBhcHBsaWNhdGlvbi9jYWxsZXIuCiAKIGNvbmZpZyBDSUZTX05GU0RfRVhQT1JUCiAJICBib29sICJBbGxvdyBuZnNkIHRvIGV4cG9ydCBDSUZTIGZpbGUgc3lzdGVtIChFWFBFUklNRU5UQUwpIgotCSAgZGVwZW5kcyBvbiBDSUZTICYmIEVYUEVSSU1FTlRBTAorCSAgZGVwZW5kcyBvbiBDSUZTICYmIEVYUEVSSU1FTlRBTCAmJiBCUk9LRU4KIAkgIGhlbHAKIAkgICBBbGxvd3MgTkZTIHNlcnZlciB0byBleHBvcnQgYSBDSUZTIG1vdW50ZWQgc2hhcmUgKG5mc2Qgb3ZlciBjaWZzKQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jYWNoZS5jIGIvZnMvY2lmcy9jYWNoZS5jCmluZGV4IGRkODU4NGQuLjU0NTUwOWMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2FjaGUuYworKysgYi9mcy9jaWZzL2NhY2hlLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQljRVJST1IoMSwgIkNJRlM6IFVua25vd24gbmV0d29yayBmYW1pbHkgJyVkJyIsIHNhLT5zYV9mYW1pbHkpOworCQljRVJST1IoMSwgIlVua25vd24gbmV0d29yayBmYW1pbHkgJyVkJyIsIHNhLT5zYV9mYW1pbHkpOwogCQlrZXlfbGVuID0gMDsKIAkJYnJlYWs7CiAJfQpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIAlzaGFyZW5hbWUgPSBleHRyYWN0X3NoYXJlbmFtZSh0Y29uLT50cmVlTmFtZSk7CiAJaWYgKElTX0VSUihzaGFyZW5hbWUpKSB7Ci0JCWNGWUkoMSwgIkNJRlM6IGNvdWxkbid0IGV4dHJhY3Qgc2hhcmVuYW1lXG4iKTsKKwkJY0ZZSSgxLCAiJXM6IGNvdWxkbid0IGV4dHJhY3Qgc2hhcmVuYW1lXG4iLCBfX2Z1bmNfXyk7CiAJCXNoYXJlbmFtZSA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KQEAgLTMwMiw3ICszMDIsNyBAQAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJZmlyc3QgPSAwOwogCi0JY0ZZSSgxLCAiY2lmcyBpbm9kZSAweCVwIG5vdyB1bmNhY2hlZCIsIGNpZnNpKTsKKwljRllJKDEsICIlczogY2lmcyBpbm9kZSAweCVwIG5vdyB1bmNhY2hlZCIsIF9fZnVuY19fLCBjaWZzaSk7CiAKIAlmb3IgKDs7KSB7CiAJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXAoJnB2ZWMsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNfZnNfc2IuaCBiL2ZzL2NpZnMvY2lmc19mc19zYi5oCmluZGV4IGZmYjE0NTkuLjcyNjBlMTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc19mc19zYi5oCisrKyBiL2ZzL2NpZnMvY2lmc19mc19zYi5oCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIENJRlNfTU9VTlRfTVVMVElVU0VSCTB4MjAwMDAgLyogbXVsdGl1c2VyIG1vdW50ICovCiAjZGVmaW5lIENJRlNfTU9VTlRfU1RSSUNUX0lPCTB4NDAwMDAgLyogc3RyaWN0IGNhY2hlIG1vZGUgKi8KICNkZWZpbmUgQ0lGU19NT1VOVF9SV1BJREZPUldBUkQJMHg4MDAwMCAvKiB1c2UgcGlkIGZvcndhcmRpbmcgZm9yIHJ3ICovCisjZGVmaW5lIENJRlNfTU9VTlRfUE9TSVhBQ0wJMHgxMDAwMDAgLyogbWlycm9yIG9mIE1TX1BPU0lYQUNMIGluIG1udF9jaWZzX2ZsYWdzICovCiAKIHN0cnVjdCBjaWZzX3NiX2luZm8gewogCXN0cnVjdCByYl9yb290IHRsaW5rX3RyZWU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMgYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKaW5kZXggZGZiZDlmMS4uNWEwZWU3ZiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJaWYgKGNpZnNfcGR1ID09IE5VTEwgfHwgc2VydmVyID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNpZnNfcGR1LT5Db21tYW5kID09IFNNQl9DT01fTkVHT1RJQVRFKQorCWlmICghc2VydmVyLT5zZXNzaW9uX2VzdGFiKQogCQlyZXR1cm4gMDsKIAogCWlmIChjaWZzX3BkdS0+Q29tbWFuZCA9PSBTTUJfQ09NX0xPQ0tJTkdfQU5EWCkgewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggOTg5NDQyZC4uYmM0YjEyYyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlICJjaWZzZnMuaCIKICNpbmNsdWRlICJjaWZzcGR1LmgiCkBAIC0xMDQsOCArMTA1LDcgQEAKIH0KIAogc3RhdGljIGludAotY2lmc19yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbywKLQkJY29uc3QgY2hhciAqZGV2bmFtZSwgaW50IHNpbGVudCkKK2NpZnNfcmVhZF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKQEAgLTExMywyMiArMTEzLDE2IEBACiAKIAljaWZzX3NiID0gQ0lGU19TQihzYik7CiAKLQlzcGluX2xvY2tfaW5pdCgmY2lmc19zYi0+dGxpbmtfdHJlZV9sb2NrKTsKLQljaWZzX3NiLT50bGlua190cmVlID0gUkJfUk9PVDsKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1BPU0lYQUNMKQorCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotCXJjID0gYmRpX3NldHVwX2FuZF9yZWdpc3RlcigmY2lmc19zYi0+YmRpLCAiY2lmcyIsIEJESV9DQVBfTUFQX0NPUFkpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOworCWlmIChjaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9GSUxFUykKKwkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCWVsc2UKKwkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTk9OX0xGUzsKIAotCWNpZnNfc2ItPmJkaS5yYV9wYWdlcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKLQotCXJjID0gY2lmc19tb3VudChzYiwgY2lmc19zYiwgdm9sdW1lX2luZm8sIGRldm5hbWUpOwotCi0JaWYgKHJjKSB7Ci0JCWlmICghc2lsZW50KQotCQkJY0VSUk9SKDEsICJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWQiLCByYyk7Ci0JCWdvdG8gb3V0X21vdW50X2ZhaWxlZDsKLQl9CisJLyogQkIgRklYTUUgZml4IHRpbWVfZ3JhbiB0byBiZSBsYXJnZXIgZm9yIExBTk1BTiBzZXNzaW9ucyAqLworCXNiLT5zX3RpbWVfZ3JhbiA9IDEwMDsKIAogCXNiLT5zX21hZ2ljID0gQ0lGU19NQUdJQ19OVU1CRVI7CiAJc2ItPnNfb3AgPSAmY2lmc19zdXBlcl9vcHM7CkBAIC0xNzAsMzcgKzE2NCwxNCBAQAogCWlmIChpbm9kZSkKIAkJaXB1dChpbm9kZSk7CiAKLQljaWZzX3Vtb3VudChzYiwgY2lmc19zYik7Ci0KLW91dF9tb3VudF9mYWlsZWQ6Ci0JYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZAotY2lmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIGNpZnNfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKLQotCWNGWUkoMSwgIkluIGNpZnNfcHV0X3N1cGVyIik7Ci0JY2lmc19zYiA9IENJRlNfU0Ioc2IpOwotCWlmIChjaWZzX3NiID09IE5VTEwpIHsKLQkJY0ZZSSgxLCAiRW1wdHkgY2lmcyBzdXBlcmJsb2NrIGluZm8gcGFzc2VkIHRvIHVubW91bnQiKTsKLQkJcmV0dXJuOwotCX0KLQotCXJjID0gY2lmc191bW91bnQoc2IsIGNpZnNfc2IpOwotCWlmIChyYykKLQkJY0VSUk9SKDEsICJjaWZzX3Vtb3VudCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAlZCIsIHJjKTsKLQlpZiAoY2lmc19zYi0+bW91bnRkYXRhKSB7Ci0JCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7Ci0JCWNpZnNfc2ItPm1vdW50ZGF0YSA9IE5VTEw7Ci0JfQotCi0JdW5sb2FkX25scyhjaWZzX3NiLT5sb2NhbF9ubHMpOwotCWJkaV9kZXN0cm95KCZjaWZzX3NiLT5iZGkpOwotCWtmcmVlKGNpZnNfc2IpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlraWxsX2Fub25fc3VwZXIoc2IpOworCWNpZnNfdW1vdW50KGNpZnNfc2IpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yNTcsOSArMjI4LDYgQEAKIHsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCiAJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19QRVJNKSB7CkBAIC0zNTIsNiArMzIwLDM3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorY2lmc19zaG93X3NlY3VyaXR5KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCXNlcV9wcmludGYocywgIixzZWM9Iik7CisKKwlzd2l0Y2ggKHNlcnZlci0+c2VjVHlwZSkgeworCWNhc2UgTEFOTUFOOgorCQlzZXFfcHJpbnRmKHMsICJsYW5tYW4iKTsKKwkJYnJlYWs7CisJY2FzZSBOVExNdjI6CisJCXNlcV9wcmludGYocywgIm50bG12MiIpOworCQlicmVhazsKKwljYXNlIE5UTE06CisJCXNlcV9wcmludGYocywgIm50bG0iKTsKKwkJYnJlYWs7CisJY2FzZSBLZXJiZXJvczoKKwkJc2VxX3ByaW50ZihzLCAia3JiNSIpOworCQlicmVhazsKKwljYXNlIFJhd05UTE1TU1A6CisJCXNlcV9wcmludGYocywgIm50bG1zc3AiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogc2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisJCXNlcV9wcmludGYocywgInVua25vd24iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNlcnZlci0+c2VjX21vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQlzZXFfcHJpbnRmKHMsICJpIik7Cit9CisKIC8qCiAgKiBjaWZzX3Nob3dfb3B0aW9ucygpIGlzIGZvciBkaXNwbGF5aW5nIG1vdW50IG9wdGlvbnMgaW4gL3Byb2MvbW91bnRzLgogICogTm90IGFsbCBzZXR0YWJsZSBvcHRpb25zIGFyZSBkaXNwbGF5ZWQgYnV0IG1vc3Qgb2YgdGhlIGltcG9ydGFudApAQCAtMzY1LDYgKzM2NCw4IEBACiAJc3RydWN0IHNvY2thZGRyICpzcmNhZGRyOwogCXNyY2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnRjb24tPnNlcy0+c2VydmVyLT5zcmNhZGRyOwogCisJY2lmc19zaG93X3NlY3VyaXR5KHMsIHRjb24tPnNlcy0+c2VydmVyKTsKKwogCXNlcV9wcmludGYocywgIix1bmM9JXMiLCB0Y29uLT50cmVlTmFtZSk7CiAKIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01VTFRJVVNFUikKQEAgLTUxOCw3ICs1MTksNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHMgPSB7Ci0JLnB1dF9zdXBlciA9IGNpZnNfcHV0X3N1cGVyLAogCS5zdGF0ZnMgPSBjaWZzX3N0YXRmcywKIAkuYWxsb2NfaW5vZGUgPSBjaWZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlID0gY2lmc19kZXN0cm95X2lub2RlLApAQCAtNTQzLDkxICs1NDMsNTUgQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKIGNpZnNfZ2V0X3Jvb3Qoc3RydWN0IHNtYl92b2wgKnZvbCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlpbnQgeGlkLCByYzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBxc3RyIG5hbWU7Ci0Jc3RydWN0IGRlbnRyeSAqZHBhcmVudCA9IE5VTEwsICpkY2hpbGQgPSBOVUxMLCAqYWxpYXM7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKLQl1bnNpZ25lZCBpbnQgaSwgZnVsbF9sZW4sIGxlbjsKLQljaGFyICpmdWxsX3BhdGggPSBOVUxMLCAqcHN0YXJ0OworCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CisJY2hhciAqcywgKnA7CiAJY2hhciBzZXA7CisJaW50IHhpZDsKIAogCWZ1bGxfcGF0aCA9IGNpZnNfYnVpbGRfcGF0aF90b19yb290KHZvbCwgY2lmc19zYiwKIAkJCQkJICAgIGNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYikpOwogCWlmIChmdWxsX3BhdGggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJY0ZZSSgxLCAiR2V0IHJvb3QgZGVudHJ5IGZvciAlcyIsIGZ1bGxfcGF0aCk7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIAlzZXAgPSBDSUZTX0RJUl9TRVAoY2lmc19zYik7Ci0JZHBhcmVudCA9IGRnZXQoc2ItPnNfcm9vdCk7Ci0JZnVsbF9sZW4gPSBzdHJsZW4oZnVsbF9wYXRoKTsKLQlmdWxsX3BhdGhbZnVsbF9sZW5dID0gc2VwOwotCXBzdGFydCA9IGZ1bGxfcGF0aCArIDE7CisJZGVudHJ5ID0gZGdldChzYi0+c19yb290KTsKKwlwID0gcyA9IGZ1bGxfcGF0aDsKIAotCWZvciAoaSA9IDEsIGxlbiA9IDA7IGkgPD0gZnVsbF9sZW47IGkrKykgewotCQlpZiAoZnVsbF9wYXRoW2ldICE9IHNlcCB8fCAhbGVuKSB7Ci0JCQlsZW4rKzsKLQkJCWNvbnRpbnVlOwotCQl9CisJZG8geworCQlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJc3RydWN0IGRlbnRyeSAqY2hpbGQ7CiAKLQkJZnVsbF9wYXRoW2ldID0gMDsKLQkJY0ZZSSgxLCAiZ2V0IGRlbnRyeSBmb3IgJXMiLCBwc3RhcnQpOworCQkvKiBza2lwIHNlcGFyYXRvcnMgKi8KKwkJd2hpbGUgKCpzID09IHNlcCkKKwkJCXMrKzsKKwkJaWYgKCEqcykKKwkJCWJyZWFrOworCQlwID0gcysrOworCQkvKiBuZXh0IHNlcGFyYXRvciAqLworCQl3aGlsZSAoKnMgJiYgKnMgIT0gc2VwKQorCQkJcysrOwogCi0JCW5hbWUubmFtZSA9IHBzdGFydDsKLQkJbmFtZS5sZW4gPSBsZW47Ci0JCW5hbWUuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHBzdGFydCwgbGVuKTsKLQkJZGNoaWxkID0gZF9sb29rdXAoZHBhcmVudCwgJm5hbWUpOwotCQlpZiAoZGNoaWxkID09IE5VTEwpIHsKLQkJCWNGWUkoMSwgIm5vdCBleGlzdHMiKTsKLQkJCWRjaGlsZCA9IGRfYWxsb2MoZHBhcmVudCwgJm5hbWUpOwotCQkJaWYgKGRjaGlsZCA9PSBOVUxMKSB7Ci0JCQkJZHB1dChkcGFyZW50KTsKLQkJCQlkcGFyZW50ID0gTlVMTDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCi0JCWNGWUkoMSwgImdldCBpbm9kZSIpOwotCQlpZiAoZGNoaWxkLT5kX2lub2RlID09IE5VTEwpIHsKLQkJCWNGWUkoMSwgIm5vdCBleGlzdHMiKTsKLQkJCWlub2RlID0gTlVMTDsKLQkJCWlmIChjaWZzX3NiX21hc3Rlcl90Y29uKENJRlNfU0Ioc2IpKS0+dW5peF9leHQpCi0JCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoJmlub2RlLCBmdWxsX3BhdGgsCi0JCQkJCQkJICAgICAgc2IsIHhpZCk7Ci0JCQllbHNlCi0JCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZpbm9kZSwgZnVsbF9wYXRoLAotCQkJCQkJCSBOVUxMLCBzYiwgeGlkLCBOVUxMKTsKLQkJCWlmIChyYykgewotCQkJCWRwdXQoZGNoaWxkKTsKLQkJCQlkcHV0KGRwYXJlbnQpOwotCQkJCWRwYXJlbnQgPSBOVUxMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYWxpYXMgPSBkX21hdGVyaWFsaXNlX3VuaXF1ZShkY2hpbGQsIGlub2RlKTsKLQkJCWlmIChhbGlhcyAhPSBOVUxMKSB7Ci0JCQkJZHB1dChkY2hpbGQpOwotCQkJCWlmIChJU19FUlIoYWxpYXMpKSB7Ci0JCQkJCWRwdXQoZHBhcmVudCk7Ci0JCQkJCWRwYXJlbnQgPSBOVUxMOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQkJZGNoaWxkID0gYWxpYXM7Ci0JCQl9Ci0JCX0KLQkJY0ZZSSgxLCAicGFyZW50ICVwLCBjaGlsZCAlcCIsIGRwYXJlbnQsIGRjaGlsZCk7Ci0KLQkJZHB1dChkcGFyZW50KTsKLQkJZHBhcmVudCA9IGRjaGlsZDsKLQkJbGVuID0gMDsKLQkJcHN0YXJ0ID0gZnVsbF9wYXRoICsgaSArIDE7Ci0JCWZ1bGxfcGF0aFtpXSA9IHNlcDsKLQl9Ci1vdXQ6CisJCW11dGV4X2xvY2soJmRpci0+aV9tdXRleCk7CisJCWNoaWxkID0gbG9va3VwX29uZV9sZW4ocCwgZGVudHJ5LCBzIC0gcCk7CisJCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBjaGlsZDsKKwl9IHdoaWxlICghSVNfRVJSKGRlbnRyeSkpOwogCV9GcmVlWGlkKHhpZCk7CiAJa2ZyZWUoZnVsbF9wYXRoKTsKLQlyZXR1cm4gZHBhcmVudDsKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdGF0aWMgaW50IGNpZnNfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNpZnNfbW50X2RhdGEgKm1udF9kYXRhID0gZGF0YTsKKwlzYi0+c19mc19pbmZvID0gbW50X2RhdGEtPmNpZnNfc2I7CisJcmV0dXJuIHNldF9hbm9uX3N1cGVyKHNiLCBOVUxMKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKgpAQCAtNjQzLDgyICs2MDcsODAgQEAKIAogCWNGWUkoMSwgIkRldm5hbWU6ICVzIGZsYWdzOiAlZCAiLCBkZXZfbmFtZSwgZmxhZ3MpOwogCi0JcmMgPSBjaWZzX3NldHVwX3ZvbHVtZV9pbmZvKCZ2b2x1bWVfaW5mbywgKGNoYXIgKilkYXRhLCBkZXZfbmFtZSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJdm9sdW1lX2luZm8gPSBjaWZzX2dldF92b2x1bWVfaW5mbygoY2hhciAqKWRhdGEsIGRldl9uYW1lKTsKKwlpZiAoSVNfRVJSKHZvbHVtZV9pbmZvKSkKKwkJcmV0dXJuIEVSUl9DQVNUKHZvbHVtZV9pbmZvKTsKIAogCWNpZnNfc2IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2lmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNpZnNfc2IgPT0gTlVMTCkgewogCQlyb290ID0gRVJSX1BUUigtRU5PTUVNKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X25sczsKKwl9CisKKwljaWZzX3NiLT5tb3VudGRhdGEgPSBrc3RybmR1cChkYXRhLCBQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChjaWZzX3NiLT5tb3VudGRhdGEgPT0gTlVMTCkgeworCQlyb290ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXRfY2lmc19zYjsKIAl9CiAKIAljaWZzX3NldHVwX2NpZnNfc2Iodm9sdW1lX2luZm8sIGNpZnNfc2IpOwogCisJcmMgPSBjaWZzX21vdW50KGNpZnNfc2IsIHZvbHVtZV9pbmZvKTsKKwlpZiAocmMpIHsKKwkJaWYgKCEoZmxhZ3MgJiBNU19TSUxFTlQpKQorCQkJY0VSUk9SKDEsICJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWQiLCByYyk7CisJCXJvb3QgPSBFUlJfUFRSKHJjKTsKKwkJZ290byBvdXRfbW91bnRkYXRhOworCX0KKwogCW1udF9kYXRhLnZvbCA9IHZvbHVtZV9pbmZvOwogCW1udF9kYXRhLmNpZnNfc2IgPSBjaWZzX3NiOwogCW1udF9kYXRhLmZsYWdzID0gZmxhZ3M7CiAKLQlzYiA9IHNnZXQoZnNfdHlwZSwgY2lmc19tYXRjaF9zdXBlciwgc2V0X2Fub25fc3VwZXIsICZtbnRfZGF0YSk7CisJc2IgPSBzZ2V0KGZzX3R5cGUsIGNpZnNfbWF0Y2hfc3VwZXIsIGNpZnNfc2V0X3N1cGVyLCAmbW50X2RhdGEpOwogCWlmIChJU19FUlIoc2IpKSB7CiAJCXJvb3QgPSBFUlJfQ0FTVChzYik7Ci0JCWdvdG8gb3V0X2NpZnNfc2I7CisJCWNpZnNfdW1vdW50KGNpZnNfc2IpOworCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoc2ItPnNfZnNfaW5mbykgeworCWlmIChzYi0+c19yb290KSB7CiAJCWNGWUkoMSwgIlVzZSBleGlzdGluZyBzdXBlcmJsb2NrIik7Ci0JCWdvdG8gb3V0X3NoYXJlZDsKKwkJY2lmc191bW91bnQoY2lmc19zYik7CisJfSBlbHNlIHsKKwkJc2ItPnNfZmxhZ3MgPSBmbGFnczsKKwkJLyogQkIgc2hvdWxkIHdlIG1ha2UgdGhpcyBjb250aW5nZW50IG9uIG1vdW50IHBhcm0/ICovCisJCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUUgfCBNU19OT0FUSU1FOworCisJCXJjID0gY2lmc19yZWFkX3N1cGVyKHNiKTsKKwkJaWYgKHJjKSB7CisJCQlyb290ID0gRVJSX1BUUihyYyk7CisJCQlnb3RvIG91dF9zdXBlcjsKKwkJfQorCisJCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKIAl9CiAKLQkvKgotCSAqIENvcHkgbW91bnQgcGFyYW1zIGZvciB1c2UgaW4gc3VibW91bnRzLiBCZXR0ZXIgdG8gZG8KLQkgKiB0aGUgY29weSBoZXJlIGFuZCBkZWFsIHdpdGggdGhlIGVycm9yIGJlZm9yZSBjbGVhbnVwIGdldHMKLQkgKiBjb21wbGljYXRlZCBwb3N0LW1vdW50LgotCSAqLwotCWNpZnNfc2ItPm1vdW50ZGF0YSA9IGtzdHJuZHVwKGRhdGEsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNpZnNfc2ItPm1vdW50ZGF0YSA9PSBOVUxMKSB7Ci0JCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQlnb3RvIG91dF9zdXBlcjsKLQl9Ci0KLQlzYi0+c19mbGFncyA9IGZsYWdzOwotCS8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgY29udGluZ2VudCBvbiBtb3VudCBwYXJtPyAqLwotCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUUgfCBNU19OT0FUSU1FOwotCXNiLT5zX2ZzX2luZm8gPSBjaWZzX3NiOwotCi0JcmMgPSBjaWZzX3JlYWRfc3VwZXIoc2IsIHZvbHVtZV9pbmZvLCBkZXZfbmFtZSwKLQkJCSAgICAgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7Ci0JaWYgKHJjKSB7Ci0JCXJvb3QgPSBFUlJfUFRSKHJjKTsKLQkJZ290byBvdXRfc3VwZXI7Ci0JfQotCi0Jc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCiAJcm9vdCA9IGNpZnNfZ2V0X3Jvb3Qodm9sdW1lX2luZm8sIHNiKTsKLQlpZiAocm9vdCA9PSBOVUxMKQorCWlmIChJU19FUlIocm9vdCkpCiAJCWdvdG8gb3V0X3N1cGVyOwogCiAJY0ZZSSgxLCAiZGVudHJ5IHJvb3QgaXM6ICVwIiwgcm9vdCk7CiAJZ290byBvdXQ7CiAKLW91dF9zaGFyZWQ6Ci0Jcm9vdCA9IGNpZnNfZ2V0X3Jvb3Qodm9sdW1lX2luZm8sIHNiKTsKLQlpZiAocm9vdCkKLQkJY0ZZSSgxLCAiZGVudHJ5IHJvb3QgaXM6ICVwIiwgcm9vdCk7Ci0JZ290byBvdXQ7Ci0KIG91dF9zdXBlcjoKLQlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOwogCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHNiKTsKLQotb3V0X2NpZnNfc2I6Ci0JdW5sb2FkX25scyhjaWZzX3NiLT5sb2NhbF9ubHMpOwotCWtmcmVlKGNpZnNfc2IpOwotCiBvdXQ6Ci0JY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKCZ2b2x1bWVfaW5mbyk7CisJY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHZvbHVtZV9pbmZvKTsKIAlyZXR1cm4gcm9vdDsKKworb3V0X21vdW50ZGF0YToKKwlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOworb3V0X2NpZnNfc2I6CisJa2ZyZWUoY2lmc19zYik7CitvdXRfbmxzOgorCXVubG9hZF9ubHModm9sdW1lX2luZm8tPmxvY2FsX25scyk7CisJZ290byBvdXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGNpZnNfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKQEAgLTgwNyw3ICs3NjksNyBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5uYW1lID0gImNpZnMiLAogCS5tb3VudCA9IGNpZnNfZG9fbW91bnQsCi0JLmtpbGxfc2IgPSBraWxsX2Fub25fc3VwZXIsCisJLmtpbGxfc2IgPSBjaWZzX2tpbGxfc2IsCiAJLyogIC5mc19mbGFncyAqLwogfTsKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNpZnNfZGlyX2lub2RlX29wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmggYi9mcy9jaWZzL2NpZnNmcy5oCmluZGV4IDY0MzEzZjcuLjAzNmNhODMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmgKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtMTI5LDUgKzEyOSw1IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGNpZnNfZXhwb3J0X29wczsKICNlbmRpZiAvKiBDSUZTX05GU0RfRVhQT1JUICovCiAKLSNkZWZpbmUgQ0lGU19WRVJTSU9OICAgIjEuNzIiCisjZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjc0IgogI2VuZGlmCQkJCS8qIF9DSUZTRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcHJvdG8uaCBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKaW5kZXggOTUzZjg0NC4uOGRmMjhlOSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzcHJvdG8uaAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC0xNTQsMTIgKzE1NCwxMSBAQAogZXh0ZXJuIHZvaWQgY2lmc19zZXR1cF9jaWZzX3NiKHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8sCiAJCQkgICAgICAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYik7CiBleHRlcm4gaW50IGNpZnNfbWF0Y2hfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBjaWZzX2NsZWFudXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKipwdm9sdW1lX2luZm8pOwotZXh0ZXJuIGludCBjaWZzX3NldHVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICoqcHZvbHVtZV9pbmZvLAotCQkJCSAgY2hhciAqbW91bnRfZGF0YSwgY29uc3QgY2hhciAqZGV2bmFtZSk7Ci1leHRlcm4gaW50IGNpZnNfbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBjaWZzX3NiX2luZm8gKiwKLQkJICAgICAgc3RydWN0IHNtYl92b2wgKiwgY29uc3QgY2hhciAqKTsKLWV4dGVybiBpbnQgY2lmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBjaWZzX3NiX2luZm8gKik7CitleHRlcm4gdm9pZCBjaWZzX2NsZWFudXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbyk7CitleHRlcm4gc3RydWN0IHNtYl92b2wgKmNpZnNfZ2V0X3ZvbHVtZV9pbmZvKGNoYXIgKm1vdW50X2RhdGEsCisJCQkJCSAgICBjb25zdCBjaGFyICpkZXZuYW1lKTsKK2V4dGVybiBpbnQgY2lmc19tb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICosIHN0cnVjdCBzbWJfdm9sICopOworZXh0ZXJuIHZvaWQgY2lmc191bW91bnQoc3RydWN0IGNpZnNfc2JfaW5mbyAqKTsKIGV4dGVybiB2b2lkIGNpZnNfZGZzX3JlbGVhc2VfYXV0b21vdW50X3RpbWVyKHZvaWQpOwogdm9pZCBjaWZzX3Byb2NfaW5pdCh2b2lkKTsKIHZvaWQgY2lmc19wcm9jX2NsZWFuKHZvaWQpOwpAQCAtMjE4LDcgKzIxNyw4IEBACiAJCQlzdHJ1Y3QgZGZzX2luZm8zX3BhcmFtICoqcHJlZmVycmFscywKIAkJCWludCByZW1hcCk7CiBleHRlcm4gdm9pZCByZXNldF9jaWZzX3VuaXhfY2FwcyhpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQkJCSBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sKTsKKwkJCQkgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwKKwkJCQkgc3RydWN0IHNtYl92b2wgKnZvbCk7CiBleHRlcm4gaW50IENJRlNTTUJRRlNJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCiAJCQlzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhKTsKIGV4dGVybiBpbnQgU01CT2xkUUZTSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwppbmRleCA2ZDg4YjgyLi5jY2MxYWZhIDEwMDY0NAotLS0gYS9mcy9jaWZzL2Nvbm5lY3QuYworKysgYi9mcy9jaWZzL2Nvbm5lY3QuYwpAQCAtNjUsNiArNjUsOCBAQAogc3RhdGljIGludCBnZW5lcmljX2lwX2Nvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKIHN0YXRpYyB2b2lkIHRsaW5rX3JiX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgc3RydWN0IHRjb25fbGluayAqbmV3X3RsaW5rKTsKIHN0YXRpYyB2b2lkIGNpZnNfcHJ1bmVfdGxpbmtzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgaW50IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvLCBjaGFyICptb3VudF9kYXRhLAorCQkJCQljb25zdCBjaGFyICpkZXZuYW1lKTsKIAogLyoKICAqIGNpZnMgdGNwIHNlc3Npb24gcmVjb25uZWN0aW9uCkBAIC0xNTIsNyArMTU0LDcgQEAKIAkJbWlkX2VudHJ5LT5jYWxsYmFjayhtaWRfZW50cnkpOwogCX0KIAotCXdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCWRvIHsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCiAJCS8qIHdlIHNob3VsZCB0cnkgb25seSB0aGUgcG9ydCB3ZSBjb25uZWN0ZWQgdG8gYmVmb3JlICovCkBAIC0xNjcsNyArMTY5LDcgQEAKIAkJCQlzZXJ2ZXItPnRjcFN0YXR1cyA9IENpZnNOZWVkTmVnb3RpYXRlOwogCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAkJfQotCX0KKwl9IHdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC03ODQsNyArNzg2LDcgQEAKIAkJCSBzdHJ1Y3Qgc21iX3ZvbCAqdm9sKQogewogCWNoYXIgKnZhbHVlLCAqZGF0YSwgKmVuZDsKLQljaGFyICptb3VudGRhdGFfY29weSwgKm9wdGlvbnM7CisJY2hhciAqbW91bnRkYXRhX2NvcHkgPSBOVUxMLCAqb3B0aW9uczsKIAl1bnNpZ25lZCBpbnQgIHRlbXBfbGVuLCBpLCBqOwogCWNoYXIgc2VwYXJhdG9yWzJdOwogCXNob3J0IGludCBvdmVycmlkZV91aWQgPSAtMTsKQEAgLTEzOTEsNyArMTM5Myw3IEBACiAJCQkJIi9wcm9jL2ZzL2NpZnMvTG9va3VwQ2FjaGVFbmFibGVkIHRvIDBcbiIpOwogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJmc2MiLCAzKSA9PSAwKSB7CiAjaWZuZGVmIENPTkZJR19DSUZTX0ZTQ0FDSEUKLQkJCWNFUlJPUigxLCAiRlMtQ2FjaGUgc3VwcG9ydCBuZWVkcyBDT05GSUdfQ0lGU19GU0NBQ0hFIgorCQkJY0VSUk9SKDEsICJGUy1DYWNoZSBzdXBwb3J0IG5lZWRzIENPTkZJR19DSUZTX0ZTQ0FDSEUgIgogCQkJCSAgImtlcm5lbCBjb25maWcgb3B0aW9uIHNldCIpOwogCQkJZ290byBjaWZzX3BhcnNlX21vdW50X2VycjsKICNlbmRpZgpAQCAtMTk3Niw3ICsxOTc4LDcgQEAKIAkJd2FybmVkX29uX250bG0gPSB0cnVlOwogCQljRVJST1IoMSwgImRlZmF1bHQgc2VjdXJpdHkgbWVjaGFuaXNtIHJlcXVlc3RlZC4gIFRoZSBkZWZhdWx0ICIKIAkJCSJzZWN1cml0eSBtZWNoYW5pc20gd2lsbCBiZSB1cGdyYWRlZCBmcm9tIG50bG0gdG8gIgotCQkJIm50bG12MiBpbiBrZXJuZWwgcmVsZWFzZSAyLjYuNDEiKTsKKwkJCSJudGxtdjIgaW4ga2VybmVsIHJlbGVhc2UgMy4xIik7CiAJfQogCXNlcy0+b3ZlcnJpZGVTZWNGbGcgPSB2b2x1bWVfaW5mby0+c2VjRmxnOwogCkBAIC0yMTQ5LDcgKzIxNTEsMTAgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNvbl9saW5rICoKLWNpZnNfc2JfbWFzdGVyX3RsaW5rKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpOworY2lmc19zYl9tYXN0ZXJfdGxpbmsoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKK3sKKwlyZXR1cm4gY2lmc19zYi0+bWFzdGVyX3RsaW5rOworfQogCiBzdGF0aWMgaW50CiBjb21wYXJlX21vdW50X29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGNpZnNfbW50X2RhdGEgKm1udF9kYXRhKQpAQCAtMjIzNyw4ICsyMjQyLDggQEAKIAogCXJjID0gY29tcGFyZV9tb3VudF9vcHRpb25zKHNiLCBtbnRfZGF0YSk7CiBvdXQ6Ci0JY2lmc19wdXRfdGxpbmsodGxpbmspOwogCXNwaW5fdW5sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CisJY2lmc19wdXRfdGxpbmsodGxpbmspOwogCXJldHVybiByYzsKIH0KIApAQCAtMjQ3MSwxNCArMjQ3Niw2IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIHNhZGRyLCBzbGVuLCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWNGWUkoMSwgIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc2VydmVyIiwgcmMpOwotCQlzb2NrX3JlbGVhc2Uoc29ja2V0KTsKLQkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKLQkJcmV0dXJuIHJjOwotCX0KLQogCS8qCiAJICogRXZlbnR1YWxseSBjaGVjayBmb3Igb3RoZXIgc29ja2V0IG9wdGlvbnMgdG8gY2hhbmdlIGZyb20KIAkgKiB0aGUgZGVmYXVsdC4gc29ja19zZXRzb2Nrb3B0IG5vdCB1c2VkIGJlY2F1c2UgaXQgZXhwZWN0cwpAQCAtMjUwNyw2ICsyNTA0LDE0IEBACiAJCSBzb2NrZXQtPnNrLT5za19zbmRidWYsCiAJCSBzb2NrZXQtPnNrLT5za19yY3ZidWYsIHNvY2tldC0+c2stPnNrX3JjdnRpbWVvKTsKIAorCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LCBzYWRkciwgc2xlbiwgMCk7CisJaWYgKHJjIDwgMCkgeworCQljRllJKDEsICJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciIsIHJjKTsKKwkJc29ja19yZWxlYXNlKHNvY2tldCk7CisJCXNlcnZlci0+c3NvY2tldCA9IE5VTEw7CisJCXJldHVybiByYzsKKwl9CisKIAlpZiAoc3BvcnQgPT0gaHRvbnMoUkZDMTAwMV9QT1JUKSkKIAkJcmMgPSBpcF9yZmMxMDAxX2Nvbm5lY3Qoc2VydmVyKTsKIApAQCAtMjU0Myw3ICsyNTQ4LDcgQEAKIH0KIAogdm9pZCByZXNldF9jaWZzX3VuaXhfY2FwcyhpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sX2luZm8pCisJCQkgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIHN0cnVjdCBzbWJfdm9sICp2b2xfaW5mbykKIHsKIAkvKiBpZiB3ZSBhcmUgcmVjb25uZWN0aW5nIHRoZW4gc2hvdWxkIHdlIGNoZWNrIHRvIHNlZSBpZgogCSAqIGFueSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzIGNoYW5nZWQgbG9jYWxseSBlLmcuIHZpYQpAQCAtMjU5NywyMiArMjYwMiwyMyBAQAogCQkJY2FwICY9IH5DSUZTX1VOSVhfUE9TSVhfQUNMX0NBUDsKIAkJZWxzZSBpZiAoQ0lGU19VTklYX1BPU0lYX0FDTF9DQVAgJiBjYXApIHsKIAkJCWNGWUkoMSwgIm5lZ290aWF0ZWQgcG9zaXggYWNsIHN1cHBvcnQiKTsKLQkJCWlmIChzYikKLQkJCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkJCWlmIChjaWZzX3NiKQorCQkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9CisJCQkJCUNJRlNfTU9VTlRfUE9TSVhBQ0w7CiAJCX0KIAogCQlpZiAodm9sX2luZm8gJiYgdm9sX2luZm8tPnBvc2l4X3BhdGhzID09IDApCiAJCQljYXAgJj0gfkNJRlNfVU5JWF9QT1NJWF9QQVRITkFNRVNfQ0FQOwogCQllbHNlIGlmIChjYXAgJiBDSUZTX1VOSVhfUE9TSVhfUEFUSE5BTUVTX0NBUCkgewogCQkJY0ZZSSgxLCAibmVnb3RpYXRlIHBvc2l4IHBhdGhuYW1lcyIpOwotCQkJaWYgKHNiKQotCQkJCUNJRlNfU0Ioc2IpLT5tbnRfY2lmc19mbGFncyB8PQorCQkJaWYgKGNpZnNfc2IpCisJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0KIAkJCQkJQ0lGU19NT1VOVF9QT1NJWF9QQVRIUzsKIAkJfQogCi0JCWlmIChzYiAmJiAoQ0lGU19TQihzYiktPnJzaXplID4gMTI3ICogMTAyNCkpIHsKKwkJaWYgKGNpZnNfc2IgJiYgKGNpZnNfc2ItPnJzaXplID4gMTI3ICogMTAyNCkpIHsKIAkJCWlmICgoY2FwICYgQ0lGU19VTklYX0xBUkdFX1JFQURfQ0FQKSA9PSAwKSB7Ci0JCQkJQ0lGU19TQihzYiktPnJzaXplID0gMTI3ICogMTAyNDsKKwkJCQljaWZzX3NiLT5yc2l6ZSA9IDEyNyAqIDEwMjQ7CiAJCQkJY0ZZSShEQkcyLCAibGFyZ2VyIHJlYWRzIG5vdCBzdXBwb3J0ZWQgYnkgc3J2Iik7CiAJCQl9CiAJCX0KQEAgLTI2NTksNiArMjY2NSw5IEBACiB7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmNpZnNfc2ItPnBydW5lX3RsaW5rcywgY2lmc19wcnVuZV90bGlua3MpOwogCisJc3Bpbl9sb2NrX2luaXQoJmNpZnNfc2ItPnRsaW5rX3RyZWVfbG9jayk7CisJY2lmc19zYi0+dGxpbmtfdHJlZSA9IFJCX1JPT1Q7CisKIAlpZiAocHZvbHVtZV9pbmZvLT5yc2l6ZSA+IENJRlNNYXhCdWZTaXplKSB7CiAJCWNFUlJPUigxLCAicnNpemUgJWQgdG9vIGxhcmdlLCB1c2luZyBNYXhCdWZTaXplIiwKIAkJCXB2b2x1bWVfaW5mby0+cnNpemUpOwpAQCAtMjc0NywyMSArMjc1NiwyMSBAQAogCiAvKgogICogV2hlbiB0aGUgc2VydmVyIHN1cHBvcnRzIHZlcnkgbGFyZ2Ugd3JpdGVzIHZpYSBQT1NJWCBleHRlbnNpb25zLCB3ZSBjYW4KLSAqIGFsbG93IHVwIHRvIDJeMjQgLSBQQUdFX0NBQ0hFX1NJWkUuCisgKiBhbGxvdyB1cCB0byAyXjI0LTEsIG1pbnVzIHRoZSBzaXplIG9mIGEgV1JJVEVfQU5EX1ggaGVhZGVyLCBub3QgaW5jbHVkaW5nCisgKiB0aGUgUkZDMTAwMSBsZW5ndGguCiAgKgogICogTm90ZSB0aGF0IHRoaXMgbWlnaHQgbWFrZSBmb3IgImludGVyZXN0aW5nIiBhbGxvY2F0aW9uIHByb2JsZW1zIGR1cmluZwotICogd3JpdGViYWNrIGhvd2V2ZXIgKGFzIHdlIGhhdmUgdG8gYWxsb2NhdGUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgZm9yIHRoZQotICogcGFnZXMpLiBBIDE2TSB3cml0ZSBtZWFucyB+MzJrYiBwYWdlIGFycmF5IHdpdGggUEFHRV9DQUNIRV9TSVpFID09IDQwOTYuCisgKiB3cml0ZWJhY2sgaG93ZXZlciBhcyB3ZSBoYXZlIHRvIGFsbG9jYXRlIGFuIGFycmF5IG9mIHBvaW50ZXJzIGZvciB0aGUKKyAqIHBhZ2VzLiBBIDE2TSB3cml0ZSBtZWFucyB+MzJrYiBwYWdlIGFycmF5IHdpdGggUEFHRV9DQUNIRV9TSVpFID09IDQwOTYuCiAgKi8KLSNkZWZpbmUgQ0lGU19NQVhfV1NJWkUgKCgxPDwyNCkgLSBQQUdFX0NBQ0hFX1NJWkUpCisjZGVmaW5lIENJRlNfTUFYX1dTSVpFICgoMTw8MjQpIC0gMSAtIHNpemVvZihXUklURV9SRVEpICsgNCkKIAogLyoKLSAqIFdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IGFsbG93IGxhcmdlIHBvc2l4IHdyaXRlcywgZGVmYXVsdCB0byBhIHdzaXplIG9mCi0gKiAxMjhrIC0gUEFHRV9DQUNIRV9TSVpFIC0tIG9uZSBwYWdlIGxlc3MgdGhhbiB0aGUgbGFyZ2VzdCBmcmFtZSBzaXplCi0gKiBkZXNjcmliZWQgaW4gUkZDMTAwMS4gVGhpcyBhbGxvd3Mgc3BhY2UgZm9yIHRoZSBoZWFkZXIgd2l0aG91dCBnb2luZyBvdmVyCi0gKiB0aGF0IGJ5IGRlZmF1bHQuCisgKiBXaGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBhbGxvdyBsYXJnZSBwb3NpeCB3cml0ZXMsIG9ubHkgYWxsb3cgYSB3c2l6ZSBvZgorICogMTI4ayBtaW51cyB0aGUgc2l6ZSBvZiB0aGUgV1JJVEVfQU5EX1ggaGVhZGVyLiBUaGF0IGFsbG93cyBmb3IgYSB3cml0ZSB1cAorICogdG8gdGhlIG1heGltdW0gc2l6ZSBkZXNjcmliZWQgYnkgUkZDMTAwMi4KICAqLwotI2RlZmluZSBDSUZTX01BWF9SRkMxMDAxX1dTSVpFICgxMjggKiAxMDI0IC0gUEFHRV9DQUNIRV9TSVpFKQorI2RlZmluZSBDSUZTX01BWF9SRkMxMDAyX1dTSVpFICgxMjggKiAxMDI0IC0gc2l6ZW9mKFdSSVRFX1JFUSkgKyA0KQogCiAvKgogICogVGhlIGRlZmF1bHQgd3NpemUgaXMgMU0uIGZpbmRfZ2V0X3BhZ2VzIHNlZW1zIHRvIHJldHVybiBhIG1heGltdW0gb2YgMjU2CkBAIC0yNzgwLDExICsyNzg5LDE4IEBACiAKIAkvKiBjYW4gc2VydmVyIHN1cHBvcnQgMjQtYml0IHdyaXRlIHNpemVzPyAodmlhIFVOSVggZXh0ZW5zaW9ucykgKi8KIAlpZiAoIXRjb24tPnVuaXhfZXh0IHx8ICEodW5peF9jYXAgJiBDSUZTX1VOSVhfTEFSR0VfV1JJVEVfQ0FQKSkKLQkJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLCBDSUZTX01BWF9SRkMxMDAxX1dTSVpFKTsKKwkJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLCBDSUZTX01BWF9SRkMxMDAyX1dTSVpFKTsKIAotCS8qIG5vIENBUF9MQVJHRV9XUklURV9YPyBMaW1pdCBpdCB0byAxNiBiaXRzICovCi0JaWYgKCEoc2VydmVyLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfV1JJVEVfWCkpCi0JCXdzaXplID0gbWluX3QodW5zaWduZWQgaW50LCB3c2l6ZSwgVVNIUlRfTUFYKTsKKwkvKgorCSAqIG5vIENBUF9MQVJHRV9XUklURV9YIG9yIGlzIHNpZ25pbmcgZW5hYmxlZCB3aXRob3V0IENBUF9VTklYIHNldD8KKwkgKiBMaW1pdCBpdCB0byBtYXggYnVmZmVyIG9mZmVyZWQgYnkgdGhlIHNlcnZlciwgbWludXMgdGhlIHNpemUgb2YgdGhlCisJICogV1JJVEVYIGhlYWRlciwgbm90IGluY2x1ZGluZyB0aGUgNCBieXRlIFJGQzEwMDEgbGVuZ3RoLgorCSAqLworCWlmICghKHNlcnZlci0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX1dSSVRFX1gpIHx8CisJICAgICghKHNlcnZlci0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpICYmCisJICAgICAoc2VydmVyLT5zZWNfbW9kZSAmIChTRUNNT0RFX1NJR05fRU5BQkxFRHxTRUNNT0RFX1NJR05fUkVRVUlSRUQpKSkpCisJCXdzaXplID0gbWluX3QodW5zaWduZWQgaW50LCB3c2l6ZSwKKwkJCQlzZXJ2ZXItPm1heEJ1ZiAtIHNpemVvZihXUklURV9SRVEpICsgNCk7CiAKIAkvKiBoYXJkIGxpbWl0IG9mIENJRlNfTUFYX1dTSVpFICovCiAJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLCBDSUZTX01BWF9XU0laRSk7CkBAIC0yODE2LDE1ICsyODMyLDkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQKLWNpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqKnB2b2x1bWVfaW5mbykKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3ZvbHVtZV9pbmZvX2NvbnRlbnRzKHN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbykKIHsKLQlzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm87Ci0KLQlpZiAoIXB2b2x1bWVfaW5mbyB8fCAhKnB2b2x1bWVfaW5mbykKLQkJcmV0dXJuOwotCi0Jdm9sdW1lX2luZm8gPSAqcHZvbHVtZV9pbmZvOwogCWtmcmVlKHZvbHVtZV9pbmZvLT51c2VybmFtZSk7CiAJa3pmcmVlKHZvbHVtZV9pbmZvLT5wYXNzd29yZCk7CiAJa2ZyZWUodm9sdW1lX2luZm8tPlVOQyk7CkBAIC0yODMyLDI4ICsyODQyLDQ0IEBACiAJa2ZyZWUodm9sdW1lX2luZm8tPmRvbWFpbm5hbWUpOwogCWtmcmVlKHZvbHVtZV9pbmZvLT5pb2NoYXJzZXQpOwogCWtmcmVlKHZvbHVtZV9pbmZvLT5wcmVwYXRoKTsKLQlrZnJlZSh2b2x1bWVfaW5mbyk7Ci0JKnB2b2x1bWVfaW5mbyA9IE5VTEw7Ci0JcmV0dXJuOwogfQogCit2b2lkCitjaWZzX2NsZWFudXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvKQoreworCWlmICghdm9sdW1lX2luZm8pCisJCXJldHVybjsKKwljbGVhbnVwX3ZvbHVtZV9pbmZvX2NvbnRlbnRzKHZvbHVtZV9pbmZvKTsKKwlrZnJlZSh2b2x1bWVfaW5mbyk7Cit9CisKKwogI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKIC8qIGJ1aWxkX3BhdGhfdG9fcm9vdCByZXR1cm5zIGZ1bGwgcGF0aCB0byByb290IHdoZW4KICAqIHdlIGRvIG5vdCBoYXZlIGFuIGV4aXRpbmcgY29ubmVjdGlvbiAodGNvbikgKi8KIHN0YXRpYyBjaGFyICoKLWJ1aWxkX3VuY19wYXRoX3RvX3Jvb3QoY29uc3Qgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvLAorYnVpbGRfdW5jX3BhdGhfdG9fcm9vdChjb25zdCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sLAogCQljb25zdCBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQogewotCWNoYXIgKmZ1bGxfcGF0aDsKKwljaGFyICpmdWxsX3BhdGgsICpwb3M7CisJdW5zaWduZWQgaW50IHBwbGVuID0gdm9sLT5wcmVwYXRoID8gc3RybGVuKHZvbC0+cHJlcGF0aCkgOiAwOworCXVuc2lnbmVkIGludCB1bmNfbGVuID0gc3Rybmxlbih2b2wtPlVOQywgTUFYX1RSRUVfU0laRSArIDEpOwogCi0JaW50IHVuY19sZW4gPSBzdHJubGVuKHZvbHVtZV9pbmZvLT5VTkMsIE1BWF9UUkVFX1NJWkUgKyAxKTsKLQlmdWxsX3BhdGggPSBrbWFsbG9jKHVuY19sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlmdWxsX3BhdGggPSBrbWFsbG9jKHVuY19sZW4gKyBwcGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmIChmdWxsX3BhdGggPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlzdHJuY3B5KGZ1bGxfcGF0aCwgdm9sdW1lX2luZm8tPlVOQywgdW5jX2xlbik7Ci0JZnVsbF9wYXRoW3VuY19sZW5dID0gMDsgLyogYWRkIHRyYWlsaW5nIG51bGwgKi8KKwlzdHJuY3B5KGZ1bGxfcGF0aCwgdm9sLT5VTkMsIHVuY19sZW4pOworCXBvcyA9IGZ1bGxfcGF0aCArIHVuY19sZW47CisKKwlpZiAocHBsZW4pIHsKKwkJc3RybmNweShwb3MsIHZvbC0+cHJlcGF0aCwgcHBsZW4pOworCQlwb3MgKz0gcHBsZW47CisJfQorCisJKnBvcyA9ICdcMCc7IC8qIGFkZCB0cmFpbGluZyBudWxsICovCiAJY29udmVydF9kZWxpbWl0ZXIoZnVsbF9wYXRoLCBDSUZTX0RJUl9TRVAoY2lmc19zYikpOworCWNGWUkoMSwgIiVzOiBmdWxsX3BhdGg9JXMiLCBfX2Z1bmNfXywgZnVsbF9wYXRoKTsKIAlyZXR1cm4gZnVsbF9wYXRoOwogfQogCkBAIC0yODk2LDE1ICsyOTIyLDE4IEBACiAJCQkJCQkgICAmZmFrZV9kZXZuYW1lKTsKIAogCQlmcmVlX2Rmc19pbmZvX2FycmF5KHJlZmVycmFscywgbnVtX3JlZmVycmFscyk7Ci0JCWtmcmVlKGZha2VfZGV2bmFtZSk7Ci0KLQkJaWYgKGNpZnNfc2ItPm1vdW50ZGF0YSAhPSBOVUxMKQotCQkJa2ZyZWUoY2lmc19zYi0+bW91bnRkYXRhKTsKIAogCQlpZiAoSVNfRVJSKG1kYXRhKSkgewogCQkJcmMgPSBQVFJfRVJSKG1kYXRhKTsKIAkJCW1kYXRhID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWNsZWFudXBfdm9sdW1lX2luZm9fY29udGVudHModm9sdW1lX2luZm8pOworCQkJbWVtc2V0KHZvbHVtZV9pbmZvLCAnXDAnLCBzaXplb2YoKnZvbHVtZV9pbmZvKSk7CisJCQlyYyA9IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8sIG1kYXRhLAorCQkJCQkJCWZha2VfZGV2bmFtZSk7CiAJCX0KKwkJa2ZyZWUoZmFrZV9kZXZuYW1lKTsKKwkJa2ZyZWUoY2lmc19zYi0+bW91bnRkYXRhKTsKIAkJY2lmc19zYi0+bW91bnRkYXRhID0gbWRhdGE7CiAJfQogCWtmcmVlKGZ1bGxfcGF0aCk7CkBAIC0yOTEyLDI5ICsyOTQxLDIwIEBACiB9CiAjZW5kaWYKIAotaW50IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKipwdm9sdW1lX2luZm8sIGNoYXIgKm1vdW50X2RhdGEsCi0JCQkgICBjb25zdCBjaGFyICpkZXZuYW1lKQorc3RhdGljIGludAorY2lmc19zZXR1cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8sIGNoYXIgKm1vdW50X2RhdGEsCisJCQljb25zdCBjaGFyICpkZXZuYW1lKQogewotCXN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbzsKIAlpbnQgcmMgPSAwOwogCi0JKnB2b2x1bWVfaW5mbyA9IE5VTEw7Ci0KLQl2b2x1bWVfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWJfdm9sKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2b2x1bWVfaW5mbykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChjaWZzX3BhcnNlX21vdW50X29wdGlvbnMobW91bnRfZGF0YSwgZGV2bmFtZSwKLQkJCQkgICAgIHZvbHVtZV9pbmZvKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoY2lmc19wYXJzZV9tb3VudF9vcHRpb25zKG1vdW50X2RhdGEsIGRldm5hbWUsIHZvbHVtZV9pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodm9sdW1lX2luZm8tPm51bGxhdXRoKSB7CiAJCWNGWUkoMSwgIm51bGwgdXNlciIpOwotCQl2b2x1bWVfaW5mby0+dXNlcm5hbWUgPSAiIjsKKwkJdm9sdW1lX2luZm8tPnVzZXJuYW1lID0ga3phbGxvYygxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHZvbHVtZV9pbmZvLT51c2VybmFtZSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CiAJfSBlbHNlIGlmICh2b2x1bWVfaW5mby0+dXNlcm5hbWUpIHsKIAkJLyogQkIgZml4bWUgcGFyc2UgZm9yIGRvbWFpbiBuYW1lIGhlcmUgKi8KIAkJY0ZZSSgxLCAiVXNlcm5hbWU6ICVzIiwgdm9sdW1lX2luZm8tPnVzZXJuYW1lKTsKQEAgLTI5NDIsOCArMjk2Miw3IEBACiAJCWNpZnNlcnJvcigiTm8gdXNlcm5hbWUgc3BlY2lmaWVkIik7CiAJLyogSW4gdXNlcnNwYWNlIG1vdW50IGhlbHBlciB3ZSBjYW4gZ2V0IHVzZXIgbmFtZSBmcm9tIGFsdGVybmF0ZQogCSAgIGxvY2F0aW9ucyBzdWNoIGFzIGVudiB2YXJpYWJsZXMgYW5kIGZpbGVzIG9uIGRpc2sgKi8KLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogdGhpcyBpcyBuZWVkZWQgZm9yIEFTQ0lJIGNwIHRvIFVuaWNvZGUgY29udmVydHMgKi8KQEAgLTI5NTUsMjEgKzI5NzQsMzQgQEAKIAkJaWYgKHZvbHVtZV9pbmZvLT5sb2NhbF9ubHMgPT0gTlVMTCkgewogCQkJY0VSUk9SKDEsICJDSUZTIG1vdW50IGVycm9yOiBpb2NoYXJzZXQgJXMgbm90IGZvdW5kIiwKIAkJCQkgdm9sdW1lX2luZm8tPmlvY2hhcnNldCk7Ci0JCQlyYyA9IC1FTElCQUNDOwotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gLUVMSUJBQ0M7CiAJCX0KIAl9CiAKLQkqcHZvbHVtZV9pbmZvID0gdm9sdW1lX2luZm87Ci0JcmV0dXJuIHJjOwotb3V0OgotCWNpZnNfY2xlYW51cF92b2x1bWVfaW5mbygmdm9sdW1lX2luZm8pOwogCXJldHVybiByYzsKIH0KIAorc3RydWN0IHNtYl92b2wgKgorY2lmc19nZXRfdm9sdW1lX2luZm8oY2hhciAqbW91bnRfZGF0YSwgY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvOworCisJdm9sdW1lX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc21iX3ZvbCksIEdGUF9LRVJORUwpOworCWlmICghdm9sdW1lX2luZm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmMgPSBjaWZzX3NldHVwX3ZvbHVtZV9pbmZvKHZvbHVtZV9pbmZvLCBtb3VudF9kYXRhLCBkZXZuYW1lKTsKKwlpZiAocmMpIHsKKwkJY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHZvbHVtZV9pbmZvKTsKKwkJdm9sdW1lX2luZm8gPSBFUlJfUFRSKHJjKTsKKwl9CisKKwlyZXR1cm4gdm9sdW1lX2luZm87Cit9CisKIGludAotY2lmc19tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAotCSAgIHN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbywgY29uc3QgY2hhciAqZGV2bmFtZSkKK2NpZnNfbW91bnQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvKQogewogCWludCByYyA9IDA7CiAJaW50IHhpZDsKQEAgLTI5ODAsNiArMzAxMiwxNSBAQAogCXN0cnVjdCB0Y29uX2xpbmsgKnRsaW5rOwogI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKIAlpbnQgcmVmZXJyYWxfd2Fsa3NfY291bnQgPSAwOworI2VuZGlmCisKKwlyYyA9IGJkaV9zZXR1cF9hbmRfcmVnaXN0ZXIoJmNpZnNfc2ItPmJkaSwgImNpZnMiLCBCRElfQ0FQX01BUF9DT1BZKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWNpZnNfc2ItPmJkaS5yYV9wYWdlcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKKworI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKIHRyeV9tb3VudF9hZ2FpbjoKIAkvKiBjbGVhbnVwIGFjdGl2aXRpZXMgaWYgd2UncmUgY2hhc2luZyBhIHJlZmVycmFsICovCiAJaWYgKHJlZmVycmFsX3dhbGtzX2NvdW50KSB7CkBAIC0yOTg4LDcgKzMwMjksNiBAQAogCQllbHNlIGlmIChwU2VzSW5mbykKIAkJCWNpZnNfcHV0X3NtYl9zZXMocFNlc0luZm8pOwogCi0JCWNpZnNfY2xlYW51cF92b2x1bWVfaW5mbygmdm9sdW1lX2luZm8pOwogCQlGcmVlWGlkKHhpZCk7CiAJfQogI2VuZGlmCkBAIC0zMDA0LDYgKzMwNDQsNyBAQAogCXNydlRjcCA9IGNpZnNfZ2V0X3RjcF9zZXNzaW9uKHZvbHVtZV9pbmZvKTsKIAlpZiAoSVNfRVJSKHNydlRjcCkpIHsKIAkJcmMgPSBQVFJfRVJSKHNydlRjcCk7CisJCWJkaV9kZXN0cm95KCZjaWZzX3NiLT5iZGkpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTMwMTUsMTQgKzMwNTYsNiBAQAogCQlnb3RvIG1vdW50X2ZhaWxfY2hlY2s7CiAJfQogCi0JaWYgKHBTZXNJbmZvLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfRklMRVMpCi0JCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKLQllbHNlCi0JCXNiLT5zX21heGJ5dGVzID0gTUFYX05PTl9MRlM7Ci0KLQkvKiBCQiBGSVhNRSBmaXggdGltZV9ncmFuIHRvIGJlIGxhcmdlciBmb3IgTEFOTUFOIHNlc3Npb25zICovCi0Jc2ItPnNfdGltZV9ncmFuID0gMTAwOwotCiAJLyogc2VhcmNoIGZvciBleGlzdGluZyB0Y29uIHRvIHRoaXMgc2VydmVyIHNoYXJlICovCiAJdGNvbiA9IGNpZnNfZ2V0X3Rjb24ocFNlc0luZm8sIHZvbHVtZV9pbmZvKTsKIAlpZiAoSVNfRVJSKHRjb24pKSB7CkBAIC0zMDM1LDcgKzMwNjgsNyBAQAogCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSB7CiAJCS8qIHJlc2V0IG9mIGNhcHMgY2hlY2tzIG1vdW50IHRvIHNlZSBpZiB1bml4IGV4dGVuc2lvbnMKIAkJICAgZGlzYWJsZWQgZm9yIGp1c3QgdGhpcyBtb3VudCAqLwotCQlyZXNldF9jaWZzX3VuaXhfY2Fwcyh4aWQsIHRjb24sIHNiLCB2b2x1bWVfaW5mbyk7CisJCXJlc2V0X2NpZnNfdW5peF9jYXBzKHhpZCwgdGNvbiwgY2lmc19zYiwgdm9sdW1lX2luZm8pOwogCQlpZiAoKHRjb24tPnNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpICYmCiAJCSAgICAobGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KSAmCiAJCSAgICAgQ0lGU19VTklYX1RSQU5TUE9SVF9FTkNSWVBUSU9OX01BTkRBVE9SWV9DQVApKSB7CkBAIC0zMTU4LDYgKzMxOTEsNyBAQAogCQkJY2lmc19wdXRfc21iX3NlcyhwU2VzSW5mbyk7CiAJCWVsc2UKIAkJCWNpZnNfcHV0X3RjcF9zZXNzaW9uKHNydlRjcCk7CisJCWJkaV9kZXN0cm95KCZjaWZzX3NiLT5iZGkpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTMxNzEsNiArMzIwNSwxMCBAQAogCXJldHVybiByYzsKIH0KIAorLyoKKyAqIElzc3VlIGEgVFJFRV9DT05ORUNUIHJlcXVlc3QuIE5vdGUgdGhhdCBmb3IgSVBDJCBzaGFyZXMsIHRoYXQgdGhlIHRjb24KKyAqIHBvaW50ZXIgbWF5IGJlIE5VTEwuCisgKi8KIGludAogQ0lGU1RDb24odW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNfc2VzICpzZXMsCiAJIGNvbnN0IGNoYXIgKnRyZWUsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCkBAIC0zMjA1LDcgKzMyNDMsNyBAQAogCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsKIAlwU01CLT5GbGFncyA9IGNwdV90b19sZTE2KFRDT05fRVhURU5ERURfU0VDSU5GTyk7CiAJYmNjX3B0ciA9ICZwU01CLT5QYXNzd29yZFswXTsKLQlpZiAoKHNlcy0+c2VydmVyLT5zZWNfbW9kZSkgJiBTRUNNT0RFX1VTRVIpIHsKKwlpZiAoIXRjb24gfHwgKHNlcy0+c2VydmVyLT5zZWNfbW9kZSAmIFNFQ01PREVfVVNFUikpIHsKIAkJcFNNQi0+UGFzc3dvcmRMZW5ndGggPSBjcHVfdG9fbGUxNigxKTsJLyogbWluaW11bSAqLwogCQkqYmNjX3B0ciA9IDA7IC8qIHBhc3N3b3JkIGlzIG51bGwgYnl0ZSAqLwogCQliY2NfcHRyKys7ICAgICAgICAgICAgICAvKiBza2lwIHBhc3N3b3JkICovCkBAIC0zMzI4LDggKzMzNjYsOCBAQAogCXJldHVybiByYzsKIH0KIAotaW50Ci1jaWZzX3Vtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQordm9pZAorY2lmc191bW91bnQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKIHsKIAlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZjaWZzX3NiLT50bGlua190cmVlOwogCXN0cnVjdCByYl9ub2RlICpub2RlOwpAQCAtMzM1MCw3ICszMzg4LDEwIEBACiAJfQogCXNwaW5fdW5sb2NrKCZjaWZzX3NiLT50bGlua190cmVlX2xvY2spOwogCi0JcmV0dXJuIDA7CisJYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CisJa2ZyZWUoY2lmc19zYi0+bW91bnRkYXRhKTsKKwl1bmxvYWRfbmxzKGNpZnNfc2ItPmxvY2FsX25scyk7CisJa2ZyZWUoY2lmc19zYik7CiB9CiAKIGludCBjaWZzX25lZ290aWF0ZV9wcm90b2NvbCh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19zZXMgKnNlcykKQEAgLTMzNzEsNyArMzQxMiw3IEBACiAJfQogCWlmIChyYyA9PSAwKSB7CiAJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOwotCQlpZiAoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0V4aXRpbmcpCisJCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZE5lZ290aWF0ZSkKIAkJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc0dvb2Q7CiAJCWVsc2UKIAkJCXJjID0gLUVIT1NURE9XTjsKQEAgLTM0NDQsNyArMzQ4NSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXNucHJpbnRmKHVzZXJuYW1lLCBNQVhfVVNFUk5BTUVfU0laRSwgImtyYjUweCV4IiwgZnN1aWQpOworCXNucHJpbnRmKHVzZXJuYW1lLCBzaXplb2YodXNlcm5hbWUpLCAia3JiNTB4JXgiLCBmc3VpZCk7CiAJdm9sX2luZm8tPnVzZXJuYW1lID0gdXNlcm5hbWU7CiAJdm9sX2luZm8tPmxvY2FsX25scyA9IGNpZnNfc2ItPmxvY2FsX25sczsKIAl2b2xfaW5mby0+bGludXhfdWlkID0gZnN1aWQ7CkBAIC0zNDg0LDEyICszNTI1LDYgQEAKIAlyZXR1cm4gdGNvbjsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNvbl9saW5rICoKLWNpZnNfc2JfbWFzdGVyX3RsaW5rKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCi17Ci0JcmV0dXJuIGNpZnNfc2ItPm1hc3Rlcl90bGluazsKLX0KLQogc3RydWN0IGNpZnNfdGNvbiAqCiBjaWZzX3NiX21hc3Rlcl90Y29uKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwppbmRleCA4MTkxNGRmLi5mYThjMjFkOSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9kaXIuYworKysgYi9mcy9jaWZzL2Rpci5jCkBAIC01NSw2ICs1NSw3IEBACiAJY2hhciBkaXJzZXA7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZGlyZW50cnktPmRfc2IpOwogCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSBjaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpOworCXVuc2lnbmVkIHNlcTsKIAogCWlmIChkaXJlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsgIC8qIG5vdCBtdWNoIHdlIGNhbiBkbyBpZiBkZW50cnkgaXMgZnJlZWQgYW5kCkBAIC02OCwyMiArNjksMjkgQEAKIAkJZGZzcGxlbiA9IDA7CiBjaWZzX2JwX3JlbmFtZV9yZXRyeToKIAluYW1lbGVuID0gZGZzcGxlbjsKKwlzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAodGVtcCA9IGRpcmVudHJ5OyAhSVNfUk9PVCh0ZW1wKTspIHsKIAkJbmFtZWxlbiArPSAoMSArIHRlbXAtPmRfbmFtZS5sZW4pOwogCQl0ZW1wID0gdGVtcC0+ZF9wYXJlbnQ7CiAJCWlmICh0ZW1wID09IE5VTEwpIHsKIAkJCWNFUlJPUigxLCAiY29ycnVwdCBkZW50cnkiKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlmdWxsX3BhdGggPSBrbWFsbG9jKG5hbWVsZW4rMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKQogCQlyZXR1cm4gZnVsbF9wYXRoOwogCWZ1bGxfcGF0aFtuYW1lbGVuXSA9IDA7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQlzcGluX2xvY2soJnRlbXAtPmRfbG9jayk7CiAJCW5hbWVsZW4gLT0gMSArIHRlbXAtPmRfbmFtZS5sZW47CiAJCWlmIChuYW1lbGVuIDwgMCkgeworCQkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWZ1bGxfcGF0aFtuYW1lbGVuXSA9IGRpcnNlcDsKQEAgLTkxLDE0ICs5OSwxNyBAQAogCQkJCXRlbXAtPmRfbmFtZS5sZW4pOwogCQkJY0ZZSSgwLCAibmFtZTogJXMiLCBmdWxsX3BhdGggKyBuYW1lbGVuKTsKIAkJfQorCQlzcGluX3VubG9jaygmdGVtcC0+ZF9sb2NrKTsKIAkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OwogCQlpZiAodGVtcCA9PSBOVUxMKSB7CiAJCQljRVJST1IoMSwgImNvcnJ1cHQgZGVudHJ5Iik7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWtmcmVlKGZ1bGxfcGF0aCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KLQlpZiAobmFtZWxlbiAhPSBkZnNwbGVuKSB7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKG5hbWVsZW4gIT0gZGZzcGxlbiB8fCByZWFkX3NlcXJldHJ5KCZyZW5hbWVfbG9jaywgc2VxKSkgewogCQljRVJST1IoMSwgImRpZCBub3QgZW5kIHBhdGggbG9va3VwIHdoZXJlIGV4cGVjdGVkIG5hbWVsZW4gaXMgJWQiLAogCQkJbmFtZWxlbik7CiAJCS8qIHByZXN1bWFibHkgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHJhY2luZyB3aXRoIGEgcmVuYW1lCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IGJiNzE0NzEuLmE5YjRhMjQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogCQkJaW9fcGFybXMucGlkID0gcGlkOwogCQkJaW9fcGFybXMudGNvbiA9IHBUY29uOwogCQkJaW9fcGFybXMub2Zmc2V0ID0gKnBvZmZzZXQ7Ci0JCQlpb19wYXJtcy5sZW5ndGggPSBsZW47CisJCQlpb19wYXJtcy5sZW5ndGggPSBjdXJfbGVuOwogCQkJcmMgPSBDSUZTU01CUmVhZCh4aWQsICZpb19wYXJtcywgJmJ5dGVzX3JlYWQsCiAJCQkJCSAmcmVhZF9kYXRhLCAmYnVmX3R5cGUpOwogCQkJcFNNQnIgPSAoc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKilyZWFkX2RhdGE7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZzY2FjaGUuYyBiL2ZzL2NpZnMvZnNjYWNoZS5jCmluZGV4IGQzNjhhNDcuLjQyZTUzNjMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZnNjYWNoZS5jCisrKyBiL2ZzL2NpZnMvZnNjYWNoZS5jCkBAIC0yOCwxNCArMjgsMTQgQEAKIAlzZXJ2ZXItPmZzY2FjaGUgPQogCQlmc2NhY2hlX2FjcXVpcmVfY29va2llKGNpZnNfZnNjYWNoZV9uZXRmcy5wcmltYXJ5X2luZGV4LAogCQkJCSZjaWZzX2ZzY2FjaGVfc2VydmVyX2luZGV4X2RlZiwgc2VydmVyKTsKLQljRllJKDEsICJDSUZTOiBnZXQgY2xpZW50IGNvb2tpZSAoMHglcC8weCVwKSIsIHNlcnZlciwKLQkJCQlzZXJ2ZXItPmZzY2FjaGUpOworCWNGWUkoMSwgIiVzOiAoMHglcC8weCVwKSIsIF9fZnVuY19fLCBzZXJ2ZXIsCisJCQlzZXJ2ZXItPmZzY2FjaGUpOwogfQogCiB2b2lkIGNpZnNfZnNjYWNoZV9yZWxlYXNlX2NsaWVudF9jb29raWUoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQogewotCWNGWUkoMSwgIkNJRlM6IHJlbGVhc2UgY2xpZW50IGNvb2tpZSAoMHglcC8weCVwKSIsIHNlcnZlciwKLQkJCQlzZXJ2ZXItPmZzY2FjaGUpOworCWNGWUkoMSwgIiVzOiAoMHglcC8weCVwKSIsIF9fZnVuY19fLCBzZXJ2ZXIsCisJCQlzZXJ2ZXItPmZzY2FjaGUpOwogCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUoc2VydmVyLT5mc2NhY2hlLCAwKTsKIAlzZXJ2ZXItPmZzY2FjaGUgPSBOVUxMOwogfQpAQCAtNDcsMTMgKzQ3LDEzIEBACiAJdGNvbi0+ZnNjYWNoZSA9CiAJCWZzY2FjaGVfYWNxdWlyZV9jb29raWUoc2VydmVyLT5mc2NhY2hlLAogCQkJCSZjaWZzX2ZzY2FjaGVfc3VwZXJfaW5kZXhfZGVmLCB0Y29uKTsKLQljRllJKDEsICJDSUZTOiBnZXQgc3VwZXJibG9jayBjb29raWUgKDB4JXAvMHglcCkiLAotCQkJCXNlcnZlci0+ZnNjYWNoZSwgdGNvbi0+ZnNjYWNoZSk7CisJY0ZZSSgxLCAiJXM6ICgweCVwLzB4JXApIiwgX19mdW5jX18sIHNlcnZlci0+ZnNjYWNoZSwKKwkJCXRjb24tPmZzY2FjaGUpOwogfQogCiB2b2lkIGNpZnNfZnNjYWNoZV9yZWxlYXNlX3N1cGVyX2Nvb2tpZShzdHJ1Y3QgY2lmc190Y29uICp0Y29uKQogewotCWNGWUkoMSwgIkNJRlM6IHJlbGVhc2luZyBzdXBlcmJsb2NrIGNvb2tpZSAoMHglcCkiLCB0Y29uLT5mc2NhY2hlKTsKKwljRllJKDEsICIlczogKDB4JXApIiwgX19mdW5jX18sIHRjb24tPmZzY2FjaGUpOwogCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUodGNvbi0+ZnNjYWNoZSwgMCk7CiAJdGNvbi0+ZnNjYWNoZSA9IE5VTEw7CiB9CkBAIC03MCw4ICs3MCw4IEBACiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9GU0NBQ0hFKSB7CiAJCWNpZnNpLT5mc2NhY2hlID0gZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZSh0Y29uLT5mc2NhY2hlLAogCQkJCSZjaWZzX2ZzY2FjaGVfaW5vZGVfb2JqZWN0X2RlZiwgY2lmc2kpOwotCQljRllJKDEsICJDSUZTOiBnb3QgRkggY29va2llICgweCVwLzB4JXApIiwgdGNvbi0+ZnNjYWNoZSwKLQkJCQljaWZzaS0+ZnNjYWNoZSk7CisJCWNGWUkoMSwgIiVzOiBnb3QgRkggY29va2llICgweCVwLzB4JXApIiwgX19mdW5jX18sCisJCQkJdGNvbi0+ZnNjYWNoZSwgY2lmc2ktPmZzY2FjaGUpOwogCX0KIH0KIApAQCAtODAsOCArODAsNyBAQAogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IENJRlNfSShpbm9kZSk7CiAKIAlpZiAoY2lmc2ktPmZzY2FjaGUpIHsKLQkJY0ZZSSgxLCAiQ0lGUyByZWxlYXNpbmcgaW5vZGUgY29va2llICgweCVwKSIsCi0JCQkJY2lmc2ktPmZzY2FjaGUpOworCQljRllJKDEsICIlczogKDB4JXApIiwgX19mdW5jX18sIGNpZnNpLT5mc2NhY2hlKTsKIAkJZnNjYWNoZV9yZWxpbnF1aXNoX2Nvb2tpZShjaWZzaS0+ZnNjYWNoZSwgMCk7CiAJCWNpZnNpLT5mc2NhY2hlID0gTlVMTDsKIAl9CkBAIC05Miw4ICs5MSw4IEBACiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKGlub2RlKTsKIAogCWlmIChjaWZzaS0+ZnNjYWNoZSkgewotCQljRllJKDEsICJDSUZTIGRpc2FibGluZyBpbm9kZSBjb29raWUgKDB4JXApIiwKLQkJCQljaWZzaS0+ZnNjYWNoZSk7CisJCWNGWUkoMSwgIiVzOiAoMHglcCkiLCBfX2Z1bmNfXywgY2lmc2ktPmZzY2FjaGUpOworCQlmc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKGNpZnNpLT5mc2NhY2hlLCBpbm9kZSk7CiAJCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUoY2lmc2ktPmZzY2FjaGUsIDEpOwogCQljaWZzaS0+ZnNjYWNoZSA9IE5VTEw7CiAJfQpAQCAtMTIxLDggKzEyMCw4IEBACiAJCQkJCWNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYiktPmZzY2FjaGUsCiAJCQkJCSZjaWZzX2ZzY2FjaGVfaW5vZGVfb2JqZWN0X2RlZiwKIAkJCQkJY2lmc2kpOwotCQljRllJKDEsICJDSUZTOiBuZXcgY29va2llIDB4JXAgb2xkY29va2llIDB4JXAiLAotCQkJCWNpZnNpLT5mc2NhY2hlLCBvbGQpOworCQljRllJKDEsICIlczogbmV3IGNvb2tpZSAweCVwIG9sZGNvb2tpZSAweCVwIiwKKwkJCQlfX2Z1bmNfXywgY2lmc2ktPmZzY2FjaGUsIG9sZCk7CiAJfQogfQogCkBAIC0xMzIsOCArMTMxLDggQEAKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAJCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IENJRlNfSShpbm9kZSk7CiAKLQkJY0ZZSSgxLCAiQ0lGUzogZnNjYWNoZSByZWxlYXNlIHBhZ2UgKDB4JXAvMHglcCkiLAotCQkJCXBhZ2UsIGNpZnNpLT5mc2NhY2hlKTsKKwkJY0ZZSSgxLCAiJXM6ICgweCVwLzB4JXApIiwgX19mdW5jX18sIHBhZ2UsCisJCQkJY2lmc2ktPmZzY2FjaGUpOwogCQlpZiAoIWZzY2FjaGVfbWF5YmVfcmVsZWFzZV9wYWdlKGNpZnNpLT5mc2NhY2hlLCBwYWdlLCBnZnApKQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtMTQ0LDggKzE0Myw3IEBACiBzdGF0aWMgdm9pZCBjaWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZV9jb21wbGV0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqY3R4LAogCQkJCQkJaW50IGVycm9yKQogewotCWNGWUkoMSwgIkNGUzogcmVhZHBhZ2VfZnJvbV9mc2NhY2hlX2NvbXBsZXRlICgweCVwLyVkKSIsCi0JCQlwYWdlLCBlcnJvcik7CisJY0ZZSSgxLCAiJXM6ICgweCVwLyVkKSIsIF9fZnVuY19fLCBwYWdlLCBlcnJvcik7CiAJaWYgKCFlcnJvcikKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMTU4LDcgKzE1Niw3IEBACiB7CiAJaW50IHJldDsKIAotCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZShmc2M6JXAsIHA6JXAsIGk6MHglcCIsCisJY0ZZSSgxLCAiJXM6IChmc2M6JXAsIHA6JXAsIGk6MHglcCIsIF9fZnVuY19fLAogCQkJQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgcGFnZSwgaW5vZGUpOwogCXJldCA9IGZzY2FjaGVfcmVhZF9vcl9hbGxvY19wYWdlKENJRlNfSShpbm9kZSktPmZzY2FjaGUsIHBhZ2UsCiAJCQkJCSBjaWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZV9jb21wbGV0ZSwKQEAgLTE2NywxMSArMTY1LDExIEBACiAJc3dpdGNoIChyZXQpIHsKIAogCWNhc2UgMDogLyogcGFnZSBmb3VuZCBpbiBmc2NhY2hlLCByZWFkIHN1Ym1pdHRlZCAqLwotCQljRllJKDEsICJDSUZTOiByZWFkcGFnZV9mcm9tX2ZzY2FjaGU6IHN1Ym1pdHRlZCIpOworCQljRllJKDEsICIlczogc3VibWl0dGVkIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0OwogCWNhc2UgLUVOT0JVRlM6CS8qIHBhZ2Ugd29uJ3QgYmUgY2FjaGVkICovCiAJY2FzZSAtRU5PREFUQToJLyogcGFnZSBub3QgaW4gY2FjaGUgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VfZnJvbV9mc2NhY2hlICVkIiwgcmV0KTsKKwkJY0ZZSSgxLCAiJXM6ICVkIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiAxOwogCiAJZGVmYXVsdDoKQEAgLTE5MCw3ICsxODgsNyBAQAogewogCWludCByZXQ7CiAKLQljRllJKDEsICJDSUZTOiBfX2NpZnNfcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZSAoMHglcC8ldS8weCVwKSIsCisJY0ZZSSgxLCAiJXM6ICgweCVwLyV1LzB4JXApIiwgX19mdW5jX18sCiAJCQlDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCAqbnJfcGFnZXMsIGlub2RlKTsKIAlyZXQgPSBmc2NhY2hlX3JlYWRfb3JfYWxsb2NfcGFnZXMoQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgbWFwcGluZywKIAkJCQkJICBwYWdlcywgbnJfcGFnZXMsCkBAIC0xOTksMTIgKzE5NywxMiBAQAogCQkJCQkgIG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpOwogCXN3aXRjaCAocmV0KSB7CiAJY2FzZSAwOgkvKiByZWFkIHN1Ym1pdHRlZCB0byB0aGUgY2FjaGUgZm9yIGFsbCBwYWdlcyAqLwotCQljRllJKDEsICJDSUZTOiByZWFkcGFnZXNfZnJvbV9mc2NhY2hlOiBzdWJtaXR0ZWQiKTsKKwkJY0ZZSSgxLCAiJXM6IHN1Ym1pdHRlZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldDsKIAogCWNhc2UgLUVOT0JVRlM6CS8qIHNvbWUgcGFnZXMgYXJlIG5vdCBjYWNoZWQgYW5kIGNhbid0IGJlICovCiAJY2FzZSAtRU5PREFUQToJLyogc29tZSBwYWdlcyBhcmUgbm90IGNhY2hlZCAqLwotCQljRllJKDEsICJDSUZTOiByZWFkcGFnZXNfZnJvbV9mc2NhY2hlOiBubyBwYWdlIik7CisJCWNGWUkoMSwgIiVzOiBubyBwYWdlIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMTsKIAogCWRlZmF1bHQ6CkBAIC0yMTgsNyArMjE2LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VfdG9fZnNjYWNoZShmc2M6ICVwLCBwOiAlcCwgaTogJXAiLAorCWNGWUkoMSwgIiVzOiAoZnNjOiAlcCwgcDogJXAsIGk6ICVwKSIsIF9fZnVuY19fLAogCQkJQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgcGFnZSwgaW5vZGUpOwogCXJldCA9IGZzY2FjaGVfd3JpdGVfcGFnZShDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCBwYWdlLCBHRlBfS0VSTkVMKTsKIAlpZiAocmV0ICE9IDApCkBAIC0yMzAsNyArMjI4LDcgQEAKIAlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBDSUZTX0koaW5vZGUpOwogCXN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqY29va2llID0gY2lmc2ktPmZzY2FjaGU7CiAKLQljRllJKDEsICJDSUZTOiBmc2NhY2hlIGludmFsaWRhdGVwYWdlICgweCVwLzB4JXApIiwgcGFnZSwgY29va2llKTsKKwljRllJKDEsICIlczogKDB4JXAvMHglcCkiLCBfX2Z1bmNfXywgcGFnZSwgY29va2llKTsKIAlmc2NhY2hlX3dhaXRfb25fcGFnZV93cml0ZShjb29raWUsIHBhZ2UpOwogCWZzY2FjaGVfdW5jYWNoZV9wYWdlKGNvb2tpZSwgcGFnZSk7CiB9CmRpZmYgLS1naXQgYS9mcy9jaWZzL3Nlc3MuYyBiL2ZzL2NpZnMvc2Vzcy5jCmluZGV4IDM4OTJhYjguLmQzZTYxOTYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc2Vzcy5jCisrKyBiL2ZzL2NpZnMvc2Vzcy5jCkBAIC00MjgsOCArNDI4LDcgQEAKIAkJCShTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpIHsKIAkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfU0lHTjsKIAkJaWYgKCFzZXMtPnNlcnZlci0+c2Vzc2lvbl9lc3RhYikKLQkJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX0tFWV9YQ0ggfAotCQkJCU5UTE1TU1BfTkVHT1RJQVRFX0VYVEVOREVEX1NFQzsKKwkJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX0tFWV9YQ0g7CiAJfQogCiAJc2VjX2Jsb2ItPk5lZ290aWF0ZUZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwpAQCAtNDY1LDEwICs0NjQsMTEgQEAKIAkJTlRMTVNTUF9ORUdPVElBVEVfMTI4IHwgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSB8CiAJCU5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCBOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CiAJaWYgKHNlcy0+c2VydmVyLT5zZWNfbW9kZSAmCi0JICAgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkKKwkgICAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKSB7CiAJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX1NJR047Ci0JaWYgKHNlcy0+c2VydmVyLT5zZWNfbW9kZSAmIFNFQ01PREVfU0lHTl9SRVFVSVJFRCkKLQkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfQUxXQVlTX1NJR047CisJCWlmICghc2VzLT5zZXJ2ZXItPnNlc3Npb25fZXN0YWIpCisJCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9LRVlfWENIOworCX0KIAogCXRtcCA9IHBidWZmZXIgKyBzaXplb2YoQVVUSEVOVElDQVRFX01FU1NBR0UpOwogCXNlY19ibG9iLT5OZWdvdGlhdGVGbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iZW5jcnlwdC5jIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKaW5kZXggMTUyNWQ1ZS4uMWM1Yjc3MCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWJlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKQEAgLTkwLDEyICs5MCwxMCBAQAogCXNnX2luaXRfb25lKCZzZ291dCwgb3V0LCA4KTsKIAogCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2dvdXQsICZzZ2luLCA4KTsKLQlpZiAocmMpIHsKKwlpZiAocmMpCiAJCWNFUlJPUigxLCAiY291bGQgbm90IGVuY3J5cHQgY3J5cHQga2V5IHJjOiAlZFxuIiwgcmMpOwotCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtX2Rlcyk7Ci0JCWdvdG8gc21iaGFzaF9lcnI7Ci0JfQogCisJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbV9kZXMpOwogc21iaGFzaF9lcnI6CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvY29kYS9waW9jdGwuYyBiL2ZzL2NvZGEvcGlvY3RsLmMKaW5kZXggNmNiYjNhZi4uY2IxNDBlZiAxMDA2NDQKLS0tIGEvZnMvY29kYS9waW9jdGwuYworKysgYi9mcy9jb2RhL3Bpb2N0bC5jCkBAIC00Myw4ICs0Myw2IEBACiAvKiB0aGUgY29kYSBwaW9jdGwgaW5vZGUgb3BzICovCiBzdGF0aWMgaW50IGNvZGFfaW9jdGxfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKIAlyZXR1cm4gKG1hc2sgJiBNQVlfRVhFQykgPyAtRUFDQ0VTIDogMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2lub2RlLmMgYi9mcy9jcmFtZnMvaW5vZGUuYwppbmRleCBlMTQxOTM5Li43MzlmYjU5IDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvaW5vZGUuYworKysgYi9mcy9jcmFtZnMvaW5vZGUuYwpAQCAtMzcsNyArMzcsNyBAQAogLyogVGhlc2UgbWFjcm9zIG1heSBjaGFuZ2UgaW4gZnV0dXJlLCB0byBwcm92aWRlIGJldHRlciBzdF9pbm8gc2VtYW50aWNzLiAqLwogI2RlZmluZSBPRkZTRVQoeCkJKCh4KS0+aV9pbm8pCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNyYW1pbm8oc3RydWN0IGNyYW1mc19pbm9kZSAqY2lubywgdW5zaWduZWQgaW50IG9mZnNldCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNyYW1pbm8oY29uc3Qgc3RydWN0IGNyYW1mc19pbm9kZSAqY2lubywgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlpZiAoIWNpbm8tPm9mZnNldCkKIAkJcmV0dXJuIG9mZnNldCArIDE7CkBAIC02MSw3ICs2MSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmdldF9jcmFtZnNfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQlzdHJ1Y3QgY3JhbWZzX2lub2RlICpjcmFtZnNfaW5vZGUsIHVuc2lnbmVkIGludCBvZmZzZXQpCisJY29uc3Qgc3RydWN0IGNyYW1mc19pbm9kZSAqY3JhbWZzX2lub2RlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB6ZXJvdGltZTsKQEAgLTMxNyw3ICszMTcsNyBAQAogCS8qIFNldCBpdCBhbGwgdXAuLiAqLwogCXNiLT5zX29wID0gJmNyYW1mc19vcHM7CiAJcm9vdCA9IGdldF9jcmFtZnNfaW5vZGUoc2IsICZzdXBlci5yb290LCAwKTsKLQlpZiAoIXJvb3QpCisJaWYgKElTX0VSUihyb290KSkKIAkJZ290byBvdXQ7CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKQEAgLTQyMyw2ICs0MjMsNyBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKiBjcmFtZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWludCBzb3J0ZWQ7CiAKIAltdXRleF9sb2NrKCZyZWFkX211dGV4KTsKQEAgLTQ0OSw4ICs0NTAsOCBAQAogCiAJCWZvciAoOzspIHsKIAkJCWlmICghbmFtZWxlbikgewotCQkJCW11dGV4X3VubG9jaygmcmVhZF9tdXRleCk7Ci0JCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJCQkJaW5vZGUgPSBFUlJfUFRSKC1FSU8pOworCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJaWYgKG5hbWVbbmFtZWxlbi0xXSkKIAkJCQlicmVhazsKQEAgLTQ2MiwxNyArNDYzLDE4IEBACiAJCWlmIChyZXR2YWwgPiAwKQogCQkJY29udGludWU7CiAJCWlmICghcmV0dmFsKSB7Ci0JCQlzdHJ1Y3QgY3JhbWZzX2lub2RlIGVudHJ5ID0gKmRlOwotCQkJbXV0ZXhfdW5sb2NrKCZyZWFkX211dGV4KTsKLQkJCWRfYWRkKGRlbnRyeSwgZ2V0X2NyYW1mc19pbm9kZShkaXItPmlfc2IsICZlbnRyeSwgZGlyX29mZikpOwotCQkJcmV0dXJuIE5VTEw7CisJCQlpbm9kZSA9IGdldF9jcmFtZnNfaW5vZGUoZGlyLT5pX3NiLCBkZSwgZGlyX29mZik7CisJCQlicmVhazsKIAkJfQogCQkvKiBlbHNlIChyZXR2YWwgPCAwKSAqLwogCQlpZiAoc29ydGVkKQogCQkJYnJlYWs7CiAJfQorb3V0OgogCW11dGV4X3VubG9jaygmcmVhZF9tdXRleCk7Ci0JZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCAzN2Y3MmVlLi5mYmRjYmNhIDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtMTgxMyw4ICsxODEzLDYgQEAKIAkJdG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwogCQlpID0gZGVudHJ5LT5kX2lub2RlOwogCQlwcmVmZXRjaCh0bmFtZSk7Ci0JCWlmIChpKQotCQkJcHJlZmV0Y2goaSk7CiAJCS8qCiAJCSAqIFRoaXMgc2VxY291bnQgY2hlY2sgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIG5hbWUgYW5kCiAJCSAqIGxlbiBhcmUgbG9hZGVkIGF0b21pY2FsbHksIHNvIGFzIG5vdCB0byB3YWxrIG9mZiB0aGUKQEAgLTIyMTMsMTQgKzIyMTEsMTUgQEAKICAqIFRoZSBoYXNoIHZhbHVlIGhhcyB0byBtYXRjaCB0aGUgaGFzaCBxdWV1ZSB0aGF0IHRoZSBkZW50cnkgaXMgb24uLgogICovCiAvKgotICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogX19kX21vdmUgLSBtb3ZlIGEgZGVudHJ5CiAgKiBAZGVudHJ5OiBlbnRyeSB0byBtb3ZlCiAgKiBAdGFyZ2V0OiBuZXcgZGVudHJ5CiAgKgogICogVXBkYXRlIHRoZSBkY2FjaGUgdG8gcmVmbGVjdCB0aGUgbW92ZSBvZiBhIGZpbGUgbmFtZS4gTmVnYXRpdmUKLSAqIGRjYWNoZSBlbnRyaWVzIHNob3VsZCBub3QgYmUgbW92ZWQgaW4gdGhpcyB3YXkuCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LiAgQ2FsbGVyIGhvbGQKKyAqIHJlbmFtZV9sb2NrLgogICovCi12b2lkIGRfbW92ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICogdGFyZ2V0KQorc3RhdGljIHZvaWQgX19kX21vdmUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGRlbnRyeSAqIHRhcmdldCkKIHsKIAlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBtb3ZpbmcgbmVnYXRpdmUgZGNhY2hlIGVudHJ5XG4iKTsKQEAgLTIyMjgsOCArMjIyNyw2IEBACiAJQlVHX09OKGRfYW5jZXN0b3IoZGVudHJ5LCB0YXJnZXQpKTsKIAlCVUdfT04oZF9hbmNlc3Rvcih0YXJnZXQsIGRlbnRyeSkpOwogCi0Jd3JpdGVfc2VxbG9jaygmcmVuYW1lX2xvY2spOwotCiAJZGVudHJ5X2xvY2tfZm9yX21vdmUoZGVudHJ5LCB0YXJnZXQpOwogCiAJd3JpdGVfc2VxY291bnRfYmVnaW4oJmRlbnRyeS0+ZF9zZXEpOwpAQCAtMjI3NSw2ICsyMjcyLDIwIEBACiAJc3Bpbl91bmxvY2soJnRhcmdldC0+ZF9sb2NrKTsKIAlmc25vdGlmeV9kX21vdmUoZGVudHJ5KTsKIAlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworfQorCisvKgorICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogQGRlbnRyeTogZW50cnkgdG8gbW92ZQorICogQHRhcmdldDogbmV3IGRlbnRyeQorICoKKyAqIFVwZGF0ZSB0aGUgZGNhY2hlIHRvIHJlZmxlY3QgdGhlIG1vdmUgb2YgYSBmaWxlIG5hbWUuIE5lZ2F0aXZlCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LgorICovCit2b2lkIGRfbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnRhcmdldCkKK3sKKwl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7CisJX19kX21vdmUoZGVudHJ5LCB0YXJnZXQpOwogCXdyaXRlX3NlcXVubG9jaygmcmVuYW1lX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTChkX21vdmUpOwpAQCAtMjMwMiw3ICsyMzEzLDcgQEAKICAqIFRoaXMgaGVscGVyIGF0dGVtcHRzIHRvIGNvcGUgd2l0aCByZW1vdGVseSByZW5hbWVkIGRpcmVjdG9yaWVzCiAgKgogICogSXQgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBob2xkaW5nCi0gKiBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4IGFuZCB0aGUgaW5vZGUtPmlfbG9jaworICogZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCwgaW5vZGUtPmlfbG9jayBhbmQgcmVuYW1lX2xvY2sKICAqCiAgKiBOb3RlOiBJZiBldmVyIHRoZSBsb2NraW5nIGluIGxvY2tfcmVuYW1lKCkgY2hhbmdlcywgdGhlbiBwbGVhc2UKICAqIHJlbWVtYmVyIHRvIHVwZGF0ZSB0aGlzIHRvby4uLgpAQCAtMjMxNywxMSArMjMyOCw2IEBACiAJaWYgKGFsaWFzLT5kX3BhcmVudCA9PSBkZW50cnktPmRfcGFyZW50KQogCQlnb3RvIG91dF91bmFsaWFzOwogCi0JLyogQ2hlY2sgZm9yIGxvb3BzICovCi0JcmV0ID0gRVJSX1BUUigtRUxPT1ApOwotCWlmIChkX2FuY2VzdG9yKGFsaWFzLCBkZW50cnkpKQotCQlnb3RvIG91dF9lcnI7Ci0KIAkvKiBTZWUgbG9ja19yZW5hbWUoKSAqLwogCXJldCA9IEVSUl9QVFIoLUVCVVNZKTsKIAlpZiAoIW11dGV4X3RyeWxvY2soJmRlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX211dGV4KSkKQEAgLTIzMzEsNyArMjMzNyw3IEBACiAJCWdvdG8gb3V0X2VycjsKIAltMiA9ICZhbGlhcy0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXg7CiBvdXRfdW5hbGlhczoKLQlkX21vdmUoYWxpYXMsIGRlbnRyeSk7CisJX19kX21vdmUoYWxpYXMsIGRlbnRyeSk7CiAJcmV0ID0gYWxpYXM7CiBvdXRfZXJyOgogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKQEAgLTI0MTYsMTUgKzI0MjIsMjQgQEAKIAkJYWxpYXMgPSBfX2RfZmluZF9hbGlhcyhpbm9kZSwgMCk7CiAJCWlmIChhbGlhcykgewogCQkJYWN0dWFsID0gYWxpYXM7Ci0JCQkvKiBJcyB0aGlzIGFuIGFub255bW91cyBtb3VudHBvaW50IHRoYXQgd2UgY291bGQgc3BsaWNlCi0JCQkgKiBpbnRvIG91ciB0cmVlPyAqLwotCQkJaWYgKElTX1JPT1QoYWxpYXMpKSB7CisJCQl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7CisKKwkJCWlmIChkX2FuY2VzdG9yKGFsaWFzLCBkZW50cnkpKSB7CisJCQkJLyogQ2hlY2sgZm9yIGxvb3BzICovCisJCQkJYWN0dWFsID0gRVJSX1BUUigtRUxPT1ApOworCQkJfSBlbHNlIGlmIChJU19ST09UKGFsaWFzKSkgeworCQkJCS8qIElzIHRoaXMgYW4gYW5vbnltb3VzIG1vdW50cG9pbnQgdGhhdCB3ZQorCQkJCSAqIGNvdWxkIHNwbGljZSBpbnRvIG91ciB0cmVlPyAqLwogCQkJCV9fZF9tYXRlcmlhbGlzZV9kZW50cnkoZGVudHJ5LCBhbGlhcyk7CisJCQkJd3JpdGVfc2VxdW5sb2NrKCZyZW5hbWVfbG9jayk7CiAJCQkJX19kX2Ryb3AoYWxpYXMpOwogCQkJCWdvdG8gZm91bmQ7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vcGUsIGJ1dCB3ZSBtdXN0KCEpIGF2b2lkIGRpcmVjdG9yeQorCQkJCSAqIGFsaWFzaW5nICovCisJCQkJYWN0dWFsID0gX19kX3VuYWxpYXMoaW5vZGUsIGRlbnRyeSwgYWxpYXMpOwogCQkJfQotCQkJLyogTm9wZSwgYnV0IHdlIG11c3QoISkgYXZvaWQgZGlyZWN0b3J5IGFsaWFzaW5nICovCi0JCQlhY3R1YWwgPSBfX2RfdW5hbGlhcyhpbm9kZSwgZGVudHJ5LCBhbGlhcyk7CisJCQl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKIAkJCWlmIChJU19FUlIoYWN0dWFsKSkKIAkJCQlkcHV0KGFsaWFzKTsKIAkJCWdvdG8gb3V0X25vbG9jazsKZGlmZiAtLWdpdCBhL2ZzL2Rjb29raWVzLmMgYi9mcy9kY29va2llcy5jCmluZGV4IGEyMWNhYmQuLmRkYTBkYzcgMTAwNjQ0Ci0tLSBhL2ZzL2Rjb29raWVzLmMKKysrIGIvZnMvZGNvb2tpZXMuYwpAQCAtMTc4LDYgKzE3OCw4IEBACiAJLyogRklYTUU6IChkZWxldGVkKSA/ICovCiAJcGF0aCA9IGRfcGF0aCgmZGNzLT5wYXRoLCBrYnVmLCBQQUdFX1NJWkUpOwogCisJbXV0ZXhfdW5sb2NrKCZkY29va2llX211dGV4KTsKKwogCWlmIChJU19FUlIocGF0aCkpIHsKIAkJZXJyID0gUFRSX0VSUihwYXRoKTsKIAkJZ290byBvdXRfZnJlZTsKQEAgLTE5NCw2ICsxOTYsNyBAQAogCiBvdXRfZnJlZToKIAlrZnJlZShrYnVmKTsKKwlyZXR1cm4gZXJyOwogb3V0OgogCW11dGV4X3VubG9jaygmZGNvb2tpZV9tdXRleCk7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCBlYTVmNzQ4Li42MDc1YTFlIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC0xMDkzLDYgKzEwOTMsNyBAQAogCiAJYnBybS0+bW0gPSBOVUxMOwkJLyogV2UncmUgdXNpbmcgaXQgbm93ICovCiAKKwlzZXRfZnMoVVNFUl9EUyk7CiAJY3VycmVudC0+ZmxhZ3MgJj0gfihQRl9SQU5ET01JWkUgfCBQRl9LVEhSRUFEKTsKIAlmbHVzaF90aHJlYWQoKTsKIAljdXJyZW50LT5wZXJzb25hbGl0eSAmPSB+YnBybS0+cGVyX2NsZWFyOwpAQCAtMTM1NywxMCArMTM1OCw2IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCS8qIGtlcm5lbCBtb2R1bGUgbG9hZGVyIGZpeHVwICovCi0JLyogc28gd2UgZG9uJ3QgdHJ5IHRvIGxvYWQgcnVuIG1vZHByb2JlIGluIGtlcm5lbCBzcGFjZS4gKi8KLQlzZXRfZnMoVVNFUl9EUyk7Ci0KIAlyZXR2YWwgPSBhdWRpdF9icHJtKGJwcm0pOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC0xOTk5LDcgKzE5OTYsNyBAQAogICogaXMgYSBzcGVjaWFsIHZhbHVlIHRoYXQgd2UgdXNlIHRvIHRyYXAgcmVjdXJzaXZlCiAgKiBjb3JlIGR1bXBzCiAgKi8KLXN0YXRpYyBpbnQgdW1oX3BpcGVfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdW1oX3BpcGVfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldykKIHsKIAlzdHJ1Y3QgZmlsZSAqcnAsICp3cDsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvc3VwZXIuYyBiL2ZzL2V4b2ZzL3N1cGVyLmMKaW5kZXggMDYwNjViZC4uYzU3YmVkZCAxMDA2NDQKLS0tIGEvZnMvZXhvZnMvc3VwZXIuYworKysgYi9mcy9leG9mcy9zdXBlci5jCkBAIC05MTMsNyArOTEzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGlubyA9IGV4b2ZzX3BhcmVudF9pbm8oY2hpbGQpOwogCiAJaWYgKCFpbm8pCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAogCXJldHVybiBkX29idGFpbl9hbGlhcyhleG9mc19pZ2V0KGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmggYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCmluZGV4IDJlMjlhYmIuLjA5NWMzNmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKKysrIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaApAQCAtMTI1LDcgKzEyNSw3IEBACiAgKiBwb3NpdGl2ZSByZXRjb2RlIC0gc2lnbmFsIGZvciBleHQ0X2V4dF93YWxrX3NwYWNlKCksIHNlZSBiZWxvdwogICogY2FsbGJhY2sgbXVzdCByZXR1cm4gdmFsaWQgZXh0ZW50IChwYXNzZWQgb3IgbmV3bHkgY3JlYXRlZCkKICAqLwotdHlwZWRlZiBpbnQgKCpleHRfcHJlcGFyZV9jYWxsYmFjaykoc3RydWN0IGlub2RlICosIHN0cnVjdCBleHQ0X2V4dF9wYXRoICosCit0eXBlZGVmIGludCAoKmV4dF9wcmVwYXJlX2NhbGxiYWNrKShzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsCiAJCQkJCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqLAogCQkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKiwgdm9pZCAqKTsKIApAQCAtMTMzLDggKzEzMywxMSBAQAogI2RlZmluZSBFWFRfQlJFQUsgICAgICAxCiAjZGVmaW5lIEVYVF9SRVBFQVQgICAgIDIKIAotLyogTWF4aW11bSBsb2dpY2FsIGJsb2NrIGluIGEgZmlsZTsgZXh0NF9leHRlbnQncyBlZV9ibG9jayBpcyBfX2xlMzIgKi8KLSNkZWZpbmUgRVhUX01BWF9CTE9DSwkweGZmZmZmZmZmCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbG9naWNhbCBibG9ja3MgaW4gYSBmaWxlOyBleHQ0X2V4dGVudCdzIGVlX2Jsb2NrIGlzCisgKiBfX2xlMzIuCisgKi8KKyNkZWZpbmUgRVhUX01BWF9CTE9DS1MJMHhmZmZmZmZmZgogCiAvKgogICogRVhUX0lOSVRfTUFYX0xFTiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHdlIGNhbiBoYXZlIGluIGFuCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IDUxOTliYWMuLmY4MTVjYzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogCiAvKgogICogZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2s6Ci0gKiByZXR1cm5zIGFsbG9jYXRlZCBibG9jayBpbiBzdWJzZXF1ZW50IGV4dGVudCBvciBFWFRfTUFYX0JMT0NLLgorICogcmV0dXJucyBhbGxvY2F0ZWQgYmxvY2sgaW4gc3Vic2VxdWVudCBleHRlbnQgb3IgRVhUX01BWF9CTE9DS1MuCiAgKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXMKICAqIGFsbG9jYXRlZCBibG9jay4gVGh1cywgaW5kZXggZW50cmllcyBoYXZlIHRvIGJlIGNvbnNpc3RlbnQKICAqIHdpdGggbGVhdmVzLgpAQCAtMTQyMiw3ICsxNDIyLDcgQEAKIAlkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CiAKIAlpZiAoZGVwdGggPT0gMCAmJiBwYXRoLT5wX2V4dCA9PSBOVUxMKQotCQlyZXR1cm4gRVhUX01BWF9CTE9DSzsKKwkJcmV0dXJuIEVYVF9NQVhfQkxPQ0tTOwogCiAJd2hpbGUgKGRlcHRoID49IDApIHsKIAkJaWYgKGRlcHRoID09IHBhdGgtPnBfZGVwdGgpIHsKQEAgLTE0MzksMTIgKzE0MzksMTIgQEAKIAkJZGVwdGgtLTsKIAl9CiAKLQlyZXR1cm4gRVhUX01BWF9CTE9DSzsKKwlyZXR1cm4gRVhUX01BWF9CTE9DS1M7CiB9CiAKIC8qCiAgKiBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2s6Ci0gKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLCisgKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLUwogICovCiBzdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIAogCS8qIHplcm8tdHJlZSBoYXMgbm8gbGVhZiBibG9ja3MgYXQgYWxsICovCiAJaWYgKGRlcHRoID09IDApCi0JCXJldHVybiBFWFRfTUFYX0JMT0NLOworCQlyZXR1cm4gRVhUX01BWF9CTE9DS1M7CiAKIAkvKiBnbyB0byBpbmRleCBibG9jayAqLwogCWRlcHRoLS07CkBAIC0xNDY5LDcgKzE0NjksNyBAQAogCQlkZXB0aC0tOwogCX0KIAotCXJldHVybiBFWFRfTUFYX0JMT0NLOworCXJldHVybiBFWFRfTUFYX0JMT0NLUzsKIH0KIAogLyoKQEAgLTE2NzcsMTMgKzE2NzcsMTMgQEAKIAkgKi8KIAlpZiAoYjIgPCBiMSkgewogCQliMiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpOwotCQlpZiAoYjIgPT0gRVhUX01BWF9CTE9DSykKKwkJaWYgKGIyID09IEVYVF9NQVhfQkxPQ0tTKQogCQkJZ290byBvdXQ7CiAJfQogCiAJLyogY2hlY2sgZm9yIHdyYXAgdGhyb3VnaCB6ZXJvIG9uIGV4dGVudCBsb2dpY2FsIHN0YXJ0IGJsb2NrKi8KIAlpZiAoYjEgKyBsZW4xIDwgYjEpIHsKLQkJbGVuMSA9IEVYVF9NQVhfQkxPQ0sgLSBiMTsKKwkJbGVuMSA9IEVYVF9NQVhfQkxPQ0tTIC0gYjE7CiAJCW5ld2V4dC0+ZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuMSk7CiAJCXJldCA9IDE7CiAJfQpAQCAtMTc2Nyw3ICsxNzY3LDcgQEAKIAlmZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpOwogCW5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soaW5vZGUsIHBhdGgpOwogCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSA+IGxlMzJfdG9fY3B1KGZleC0+ZWVfYmxvY2spCi0JICAgICYmIG5leHQgIT0gRVhUX01BWF9CTE9DSykgeworCSAgICAmJiBuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7CiAJCWV4dF9kZWJ1ZygibmV4dCBsZWFmIGJsb2NrIC0gJWRcbiIsIG5leHQpOwogCQlCVUdfT04obnBhdGggIT0gTlVMTCk7CiAJCW5wYXRoID0gZXh0NF9leHRfZmluZF9leHRlbnQoaW5vZGUsIG5leHQsIE5VTEwpOwpAQCAtMTg4Nyw3ICsxODg3LDcgQEAKIAlCVUdfT04oZnVuYyA9PSBOVUxMKTsKIAlCVUdfT04oaW5vZGUgPT0gTlVMTCk7CiAKLQl3aGlsZSAoYmxvY2sgPCBsYXN0ICYmIGJsb2NrICE9IEVYVF9NQVhfQkxPQ0spIHsKKwl3aGlsZSAoYmxvY2sgPCBsYXN0ICYmIGJsb2NrICE9IEVYVF9NQVhfQkxPQ0tTKSB7CiAJCW51bSA9IGxhc3QgLSBibG9jazsKIAkJLyogZmluZCBleHRlbnQgZm9yIHRoaXMgYmxvY2sgKi8KIAkJZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKQEAgLTE5NTgsNyArMTk1OCw3IEBACiAJCQllcnIgPSAtRUlPOwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gZnVuYyhpbm9kZSwgcGF0aCwgJmNiZXgsIGV4LCBjYmRhdGEpOworCQllcnIgPSBmdW5jKGlub2RlLCBuZXh0LCAmY2JleCwgZXgsIGNiZGF0YSk7CiAJCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKIAogCQlpZiAoZXJyIDwgMCkKQEAgLTIwMjAsNyArMjAyMCw3IEBACiAJaWYgKGV4ID09IE5VTEwpIHsKIAkJLyogdGhlcmUgaXMgbm8gZXh0ZW50IHlldCwgc28gZ2FwIGlzIFswOy1dICovCiAJCWxibG9jayA9IDA7Ci0JCWxlbiA9IEVYVF9NQVhfQkxPQ0s7CisJCWxlbiA9IEVYVF9NQVhfQkxPQ0tTOwogCQlleHRfZGVidWcoImNhY2hlIGdhcCh3aG9sZSBmaWxlKToiKTsKIAl9IGVsc2UgaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSkgewogCQlsYmxvY2sgPSBibG9jazsKQEAgLTIzNTAsNyArMjM1MCw3IEBACiAJCQkgKiBuZXZlciBoYXBwZW4gYmVjYXVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGVuZCBwb2ludHMKIAkJCSAqIG5lZWRzIHRvIGJlIG9uIHRoZSBlZGdlIG9mIHRoZSBleHRlbnQuCiAJCQkgKi8KLQkJCWlmIChlbmQgPT0gRVhUX01BWF9CTE9DSykgeworCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKIAkJCQlleHRfZGVidWcoIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAogCQkJCQkJc3RhcnQsIGVuZCk7CiAJCQkJYmxvY2sgPSAwOwpAQCAtMjM5OCw3ICsyMzk4LDcgQEAKIAkJCSAqIElmIHRoaXMgaXMgYSB0cnVuY2F0ZSwgdGhpcyBjb25kaXRpb24KIAkJCSAqIHNob3VsZCBuZXZlciBoYXBwZW4KIAkJCSAqLwotCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLKSB7CisJCQlpZiAoZW5kID09IEVYVF9NQVhfQkxPQ0tTIC0gMSkgewogCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCiAJCQkJCXN0YXJ0LCBlbmQpOwogCQkJCWVyciA9IC1FSU87CkBAIC0yNDc4LDcgKzI0NzgsNyBAQAogCQkgKiB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsZWFmCiAJCSAqLwogCQlpZiAobnVtID09IDApIHsKLQkJCWlmIChlbmQgIT0gRVhUX01BWF9CTE9DSykgeworCQkJaWYgKGVuZCAhPSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKIAkJCQkvKgogCQkJCSAqIEZvciBob2xlIHB1bmNoaW5nLCB3ZSBuZWVkIHRvIHNjb290IGFsbCB0aGUKIAkJCQkgKiBleHRlbnRzIHVwIHdoZW4gYW4gZXh0ZW50IGlzIHJlbW92ZWQgc28gdGhhdApAQCAtMzY5OSw3ICszNjk5LDcgQEAKIAogCWxhc3RfYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpCiAJCQk+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7Ci0JZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLKTsKKwllcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CiAKIAkvKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsCiAJICogdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCkBAIC0zOTE0LDE0ICszOTE0LDEzIEBACiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIGV4dGVudCB0byBnYXRoZXIgRklFTUFQIGluZm9ybWF0aW9uLgogICovCi1zdGF0aWMgaW50IGV4dDRfZXh0X2ZpZW1hcF9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKK3N0YXRpYyBpbnQgZXh0NF9leHRfZmllbWFwX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IG5leHQsCiAJCSAgICAgICBzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgKm5ld2V4LCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAogCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKIAlfX3U2NAlsb2dpY2FsOwogCV9fdTY0CXBoeXNpY2FsOwogCV9fdTY0CWxlbmd0aDsKLQlsb2ZmX3QJc2l6ZTsKIAlfX3UzMglmbGFncyA9IDA7CiAJaW50CQlyZXQgPSAwOwogCXN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8gPSBkYXRhOwpAQCAtNDEwMyw4ICs0MTAyLDcgQEAKIAlpZiAoZXggJiYgZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpCiAJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOOwogCi0Jc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlpZiAobG9naWNhbCArIGxlbmd0aCA+PSBzaXplKQorCWlmIChuZXh0ID09IEVYVF9NQVhfQkxPQ0tTKQogCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX0xBU1Q7CiAKIAlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChmaWVpbmZvLCBsb2dpY2FsLCBwaHlzaWNhbCwKQEAgLTQzNDcsOCArNDM0NSw4IEBACiAKIAkJc3RhcnRfYmxrID0gc3RhcnQgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJCWxhc3RfYmxrID0gKHN0YXJ0ICsgbGVuIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCWlmIChsYXN0X2JsayA+PSBFWFRfTUFYX0JMT0NLKQotCQkJbGFzdF9ibGsgPSBFWFRfTUFYX0JMT0NLLTE7CisJCWlmIChsYXN0X2JsayA+PSBFWFRfTUFYX0JMT0NLUykKKwkJCWxhc3RfYmxrID0gRVhUX01BWF9CTE9DS1MtMTsKIAkJbGVuX2Jsa3MgPSAoKGV4dDRfbGJsa190KSBsYXN0X2JsaykgLSBzdGFydF9ibGsgKyAxOwogCiAJCS8qCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggYTU3NjNlMy4uZTMxMjZjMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMjYzNCw3ICsyNjM0LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhZ2VfYnVmcyA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAKLQl0cmFjZV9leHQ0X3dyaXRlcGFnZShpbm9kZSwgcGFnZSk7CisJdHJhY2VfZXh0NF93cml0ZXBhZ2UocGFnZSk7CiAJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlpZiAocGFnZS0+aW5kZXggPT0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggODU5ZjJhZS4uNmVkODU5ZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM1NzgsOCArMzU3OCw4IEBACiAJCWZyZWUgKz0gbmV4dCAtIGJpdDsKIAogCQl0cmFjZV9leHQ0X21iYWxsb2NfZGlzY2FyZChzYiwgTlVMTCwgZ3JvdXAsIGJpdCwgbmV4dCAtIGJpdCk7Ci0JCXRyYWNlX2V4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYShzYiwgcGEtPnBhX2lub2RlLCBwYSwKLQkJCQkJICAgICAgIGdycF9ibGtfc3RhcnQgKyBiaXQsIG5leHQgLSBiaXQpOworCQl0cmFjZV9leHQ0X21iX3JlbGVhc2VfaW5vZGVfcGEocGEsIGdycF9ibGtfc3RhcnQgKyBiaXQsCisJCQkJCSAgICAgICBuZXh0IC0gYml0KTsKIAkJbWJfZnJlZV9ibG9ja3MocGEtPnBhX2lub2RlLCBlNGIsIGJpdCwgbmV4dCAtIGJpdCk7CiAJCWJpdCA9IG5leHQgKyAxOwogCX0KQEAgLTM2MDgsNyArMzYwOCw3IEBACiAJZXh0NF9ncm91cF90IGdyb3VwOwogCWV4dDRfZ3JwYmxrX3QgYml0OwogCi0JdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2dyb3VwX3BhKHNiLCBwYSk7CisJdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2dyb3VwX3BhKHBhKTsKIAlCVUdfT04ocGEtPnBhX2RlbGV0ZWQgPT0gMCk7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgcGEtPnBhX3BzdGFydCwgJmdyb3VwLCAmYml0KTsKIAlCVUdfT04oZ3JvdXAgIT0gZTRiLT5iZF9ncm91cCAmJiBwYS0+cGFfbGVuICE9IDApOwpAQCAtNDQ0OCw3ICs0NDQ4LDcgQEAKICAqIEBpbm9kZToJCWlub2RlCiAgKiBAYmxvY2s6CQlzdGFydCBwaHlzaWNhbCBibG9jayB0byBmcmVlCiAgKiBAY291bnQ6CQludW1iZXIgb2YgYmxvY2tzIHRvIGNvdW50Ci0gKiBAbWV0YWRhdGE6IAkJQXJlIHRoZXNlIG1ldGFkYXRhIGJsb2NrcworICogQGZsYWdzOgkJZmxhZ3MgdXNlZCBieSBleHQ0X2ZyZWVfYmxvY2tzCiAgKi8KIHZvaWQgZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2ssCmRpZmYgLS1naXQgYS9mcy9leHQ0L21vdmVfZXh0ZW50LmMgYi9mcy9leHQ0L21vdmVfZXh0ZW50LmMKaW5kZXggMmI4MzA0Yi4uZjU3NDU1YSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCisrKyBiL2ZzL2V4dDQvbW92ZV9leHRlbnQuYwpAQCAtMTAwMiwxMiArMTAwMiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoKG9yaWdfc3RhcnQgPiBFWFRfTUFYX0JMT0NLKSB8fAotCSAgICAoZG9ub3Jfc3RhcnQgPiBFWFRfTUFYX0JMT0NLKSB8fAotCSAgICAoKmxlbiA+IEVYVF9NQVhfQkxPQ0spIHx8Ci0JICAgIChvcmlnX3N0YXJ0ICsgKmxlbiA+IEVYVF9NQVhfQkxPQ0spKSAgeworCWlmICgob3JpZ19zdGFydCA+PSBFWFRfTUFYX0JMT0NLUykgfHwKKwkgICAgKGRvbm9yX3N0YXJ0ID49IEVYVF9NQVhfQkxPQ0tTKSB8fAorCSAgICAoKmxlbiA+IEVYVF9NQVhfQkxPQ0tTKSB8fAorCSAgICAob3JpZ19zdGFydCArICpsZW4gPj0gRVhUX01BWF9CTE9DS1MpKSAgewogCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBDYW4ndCBoYW5kbGUgb3ZlciBbJXVdIGJsb2NrcyAiCi0JCQkiW2lubzpvcmlnICVsdSwgZG9ub3IgJWx1XVxuIiwgRVhUX01BWF9CTE9DSywKKwkJCSJbaW5vOm9yaWcgJWx1LCBkb25vciAlbHVdXG4iLCBFWFRfTUFYX0JMT0NLUywKIAkJCW9yaWdfaW5vZGUtPmlfaW5vLCBkb25vcl9pbm9kZS0+aV9pbm8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggY2M1YzE1Ny4uOWVhNzFhYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMjI0Myw2ICsyMjQzLDEyIEBACiAgKiBpbiB0aGUgdmZzLiAgZXh0NCBpbm9kZSBoYXMgNDggYml0cyBvZiBpX2Jsb2NrIGluIGZzYmxvY2sgdW5pdHMsCiAgKiBzbyB0aGF0IHdvbid0IGJlIGEgbGltaXRpbmcgZmFjdG9yLgogICoKKyAqIEhvd2V2ZXIgdGhlcmUgaXMgb3RoZXIgbGltaXRpbmcgZmFjdG9yLiBXZSBkbyBzdG9yZSBleHRlbnRzIGluIHRoZSBmb3JtCisgKiBvZiBzdGFydGluZyBibG9jayBhbmQgbGVuZ3RoLCBoZW5jZSB0aGUgcmVzdWx0aW5nIGxlbmd0aCBvZiB0aGUgZXh0ZW50CisgKiBjb3ZlcmluZyBtYXhpbXVtIGZpbGUgc2l6ZSBtdXN0IGZpdCBpbnRvIG9uLWRpc2sgZm9ybWF0IGNvbnRhaW5lcnMgYXMKKyAqIHdlbGwuIEdpdmVuIHRoYXQgbGVuZ3RoIGlzIGFsd2F5cyBieSAxIHVuaXQgYmlnZ2VyIHRoYW4gbWF4IHVuaXQgKGJlY2F1c2UKKyAqIHdlIGNvdW50IDAgYXMgd2VsbCkgd2UgaGF2ZSB0byBsb3dlciB0aGUgc19tYXhieXRlcyBieSBvbmUgZnMgYmxvY2suCisgKgogICogTm90ZSwgdGhpcyBkb2VzICpub3QqIGNvbnNpZGVyIGFueSBtZXRhZGF0YSBvdmVyaGVhZCBmb3IgdmZzIGlfYmxvY2tzLgogICovCiBzdGF0aWMgbG9mZl90IGV4dDRfbWF4X3NpemUoaW50IGJsa2JpdHMsIGludCBoYXNfaHVnZV9maWxlcykKQEAgLTIyNjQsMTAgKzIyNzAsMTMgQEAKIAkJdXBwZXJfbGltaXQgPDw9IGJsa2JpdHM7CiAJfQogCi0JLyogMzItYml0IGV4dGVudC1zdGFydCBjb250YWluZXIsIGVlX2Jsb2NrICovCi0JcmVzID0gMUxMIDw8IDMyOworCS8qCisJICogMzItYml0IGV4dGVudC1zdGFydCBjb250YWluZXIsIGVlX2Jsb2NrLiBXZSBsb3dlciB0aGUgbWF4Ynl0ZXMKKwkgKiBieSBvbmUgZnMgYmxvY2ssIHNvIGVlX2xlbiBjYW4gY292ZXIgdGhlIGV4dGVudCBvZiBtYXhpbXVtIGZpbGUKKwkgKiBzaXplCisJICovCisJcmVzID0gKDFMTCA8PCAzMikgLSAxOwogCXJlcyA8PD0gYmxrYml0czsKLQlyZXMgLT0gMTsKIAogCS8qIFNhbml0eSBjaGVjayBhZ2FpbnN0IHZtLSAmIHZmcy0gaW1wb3NlZCBsaW1pdHMgKi8KIAlpZiAocmVzID4gdXBwZXJfbGltaXQpCmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCA3MjU3NzUyLi43MDE4ZTFkIDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQlpZiAoYXR0ciAmIEFUVFJfU1lTKQogCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJCWVsc2UKLQkJCWlub2RlLT5pX2ZsYWdzICY9IFNfSU1NVVRBQkxFOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOwogCX0KIAogCWZhdF9zYXZlX2F0dHJzKGlub2RlLCBhdHRyKTsKZGlmZiAtLWdpdCBhL2ZzL2ZzY2FjaGUvcGFnZS5jIGIvZnMvZnNjYWNoZS9wYWdlLmMKaW5kZXggYTJhNWQxOS4uM2Y3YTU5YiAxMDA2NDQKLS0tIGEvZnMvZnNjYWNoZS9wYWdlLmMKKysrIGIvZnMvZnNjYWNoZS9wYWdlLmMKQEAgLTk1NCwzICs5NTQsNDMgQEAKIAlwYWdldmVjX3JlaW5pdChwYWdldmVjKTsKIH0KIEVYUE9SVF9TWU1CT0woZnNjYWNoZV9tYXJrX3BhZ2VzX2NhY2hlZCk7CisKKy8qCisgKiBVbmNhY2hlIGFsbCB0aGUgcGFnZXMgaW4gYW4gaW5vZGUgdGhhdCBhcmUgbWFya2VkIFBHX2ZzY2FjaGUsIGFzc3VtaW5nIHRoZW0KKyAqIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29va2llLgorICovCit2b2lkIF9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IG5leHQ7CisJaW50IGk7CisKKwlfZW50ZXIoIiVwLCVwIiwgY29va2llLCBpbm9kZSk7CisKKwlpZiAoIW1hcHBpbmcgfHwgbWFwcGluZy0+bnJwYWdlcyA9PSAwKSB7CisJCV9sZWF2ZSgiIFtubyBwYWdlc10iKTsKKwkJcmV0dXJuOworCX0KKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJbmV4dCA9IDA7CisJZG8geworCQlpZiAoIXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBuZXh0LCBQQUdFVkVDX1NJWkUpKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisJCQluZXh0ID0gcGFnZS0+aW5kZXg7CisJCQlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpIHsKKwkJCQlfX2ZzY2FjaGVfd2FpdF9vbl9wYWdlX3dyaXRlKGNvb2tpZSwgcGFnZSk7CisJCQkJX19mc2NhY2hlX3VuY2FjaGVfcGFnZShjb29raWUsIHBhZ2UpOworCQkJfQorCQl9CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUgKCsrbmV4dCk7CisKKwlfbGVhdmUoIiIpOworfQorRVhQT1JUX1NZTUJPTChfX2ZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IGNjNmVjNGIuLjM4Zjg0Y2QgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTkyMSw2ICs5MjEsOCBAQAogCWlmIChzYi0+c19mbGFncyAmIE1TX01BTkRMT0NLKQogCQlnb3RvIGVycjsKIAorCXNiLT5zX2ZsYWdzICY9IH5NU19OT1NFQzsKKwogCWlmICghcGFyc2VfZnVzZV9vcHQoKGNoYXIgKikgZGF0YSwgJmQsIGlzX2JkZXYpKQogCQlnb3RvIGVycjsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hb3BzLmMgYi9mcy9nZnMyL2FvcHMuYwppbmRleCA4MDJhYzVlLi5mOWZiYmU5IDEwMDY0NAotLS0gYS9mcy9nZnMyL2FvcHMuYworKysgYi9mcy9nZnMyL2FvcHMuYwpAQCAtMTA2OSw2ICsxMDY5LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlnZnMyX2xvZ19sb2NrKHNkcCk7CisJc3Bpbl9sb2NrKCZzZHAtPnNkX2FpbF9sb2NrKTsKIAloZWFkID0gYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJZG8gewogCQlpZiAoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSkKQEAgLTEwODAsNiArMTA4MSw3IEBACiAJCQlnb3RvIG5vdF9wb3NzaWJsZTsKIAkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAJfSB3aGlsZShiaCAhPSBoZWFkKTsKKwlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CiAJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7CiAKIAloZWFkID0gYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CkBAIC0xMTEyLDYgKzExMTQsNyBAQAogCVdBUk5fT04oYnVmZmVyX2RpcnR5KGJoKSk7CiAJV0FSTl9PTihidWZmZXJfcGlubmVkKGJoKSk7CiBjYW5ub3RfcmVsZWFzZToKKwlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CiAJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmMgYi9mcy9nZnMyL2dsb2NrLmMKaW5kZXggMjc5MmE3OS4uMWMxMzM2ZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5jCisrKyBiL2ZzL2dmczIvZ2xvY2suYwpAQCAtNjYzLDE0ICs2NjMsMTkgQEAKIAkJZHJvcF9yZWYgPSAxOwogCX0KIAlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEdMRl9QRU5ESU5HX0RFTU9URSwgJmdsLT5nbF9mbGFncykgJiYKKwlpZiAodGVzdF9iaXQoR0xGX1BFTkRJTkdfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKSAmJgogCSAgICBnbC0+Z2xfc3RhdGUgIT0gTE1fU1RfVU5MT0NLRUQgJiYKIAkgICAgZ2wtPmdsX2RlbW90ZV9zdGF0ZSAhPSBMTV9TVF9FWENMVVNJVkUpIHsKIAkJdW5zaWduZWQgbG9uZyBob2xkdGltZSwgbm93ID0gamlmZmllczsKKwogCQlob2xkdGltZSA9IGdsLT5nbF90Y2hhbmdlICsgZ2wtPmdsX29wcy0+Z29fbWluX2hvbGRfdGltZTsKIAkJaWYgKHRpbWVfYmVmb3JlKG5vdywgaG9sZHRpbWUpKQogCQkJZGVsYXkgPSBob2xkdGltZSAtIG5vdzsKLQkJc2V0X2JpdChkZWxheSA/IEdMRl9QRU5ESU5HX0RFTU9URSA6IEdMRl9ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpOworCisJCWlmICghZGVsYXkpIHsKKwkJCWNsZWFyX2JpdChHTEZfUEVORElOR19ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpOworCQkJc2V0X2JpdChHTEZfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKTsKKwkJfQogCX0KIAlydW5fcXVldWUoZ2wsIDApOwogCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb3BzLmMgYi9mcy9nZnMyL2dsb3BzLmMKaW5kZXggOGVmNzBmNC4uMmNjYTI5MzEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZ2xvcHMuYworKysgYi9mcy9nZnMyL2dsb3BzLmMKQEAgLTQ3LDEwICs0NywxMCBAQAogCQkJCWJkX2FpbF9nbF9saXN0KTsKIAkJYmggPSBiZC0+YmRfYmg7CiAJCWdmczJfcmVtb3ZlX2Zyb21fYWlsKGJkKTsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOwotCiAJCWJkLT5iZF9iaCA9IE5VTEw7CiAJCWJoLT5iX3ByaXZhdGUgPSBOVUxMOworCQlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CisKIAkJYmQtPmJkX2Jsa25vID0gYmgtPmJfYmxvY2tucjsKIAkJZ2ZzMl9sb2dfbG9jayhzZHApOwogCQlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsICFidWZmZXJfYnVzeShiaCkpOwpAQCAtMjIxLDggKzIyMSwxMCBAQAogCQl9CiAJfQogCi0JaWYgKGlwID09IEdGUzJfSShnbC0+Z2xfc2JkLT5zZF9yaW5kZXgpKQorCWlmIChpcCA9PSBHRlMyX0koZ2wtPmdsX3NiZC0+c2RfcmluZGV4KSkgeworCQlnZnMyX2xvZ19mbHVzaChnbC0+Z2xfc2JkLCBOVUxMKTsKIAkJZ2wtPmdsX3NiZC0+c2RfcmluZGV4X3VwdG9kYXRlID0gMDsKKwl9CiAJaWYgKGlwICYmIFNfSVNSRUcoaXAtPmlfaW5vZGUuaV9tb2RlKSkKIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaXAtPmlfaW5vZGUuaV9tYXBwaW5nLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5jb3JlLmggYi9mcy9nZnMyL2luY29yZS5oCmluZGV4IDBhMDY0ZTkuLjgxMjA2ZTcgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5jb3JlLmgKKysrIGIvZnMvZ2ZzMi9pbmNvcmUuaApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0X2JsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCiAjZGVmaW5lIERJT19XQUlUCTB4MDAwMDAwMTAKICNkZWZpbmUgRElPX01FVEFEQVRBCTB4MDAwMDAwMjAKQEAgLTU0Niw2ICs1NDcsNyBAQAogCXN0cnVjdCBnZnMyX2dsb2NrICpzZF90cmFuc19nbDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBzZF9nbG9ja193YWl0OwogCWF0b21pY190IHNkX2dsb2NrX2Rpc3Bvc2FsOworCXN0cnVjdCBjb21wbGV0aW9uIHNkX2xvY2tpbmdfaW5pdDsKIAogCS8qIElub2RlIFN0dWZmICovCiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbG9nLmMgYi9mcy9nZnMyL2xvZy5jCmluZGV4IDkwMzExNWYuLjg1YzYyOTIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9nLmMKKysrIGIvZnMvZ2ZzMi9sb2cuYwpAQCAtOTAzLDYgKzkwMyw3IEBACiAJCWlmIChnZnMyX2FpbDFfZW1wdHkoc2RwKSkKIAkJCWJyZWFrOwogCX0KKwlnZnMyX2xvZ19mbHVzaChzZHAsIE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX2pybmxfZmx1c2hfcmVxZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggOGFjOWFlMS4uMmE3NzA3MSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTcyLDYgKzcyLDcgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkcC0+c2RfZ2xvY2tfd2FpdCk7CiAJYXRvbWljX3NldCgmc2RwLT5zZF9nbG9ja19kaXNwb3NhbCwgMCk7CisJaW5pdF9jb21wbGV0aW9uKCZzZHAtPnNkX2xvY2tpbmdfaW5pdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfcmluZGV4X3NwaW4pOwpAQCAtMTAxNywxMSArMTAxOCwxMyBAQAogCQlmc25hbWUrKzsKIAlpZiAobG0tPmxtX21vdW50ID09IE5VTEwpIHsKIAkJZnNfaW5mbyhzZHAsICJOb3cgbW91bnRpbmcgRlMuLi5cbiIpOworCQljb21wbGV0ZSgmc2RwLT5zZF9sb2NraW5nX2luaXQpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0ID0gbG0tPmxtX21vdW50KHNkcCwgZnNuYW1lKTsKIAlpZiAocmV0ID09IDApCiAJCWZzX2luZm8oc2RwLCAiSm9pbmVkIGNsdXN0ZXIuIE5vdyBtb3VudGluZyBGUy4uLlxuIik7CisJY29tcGxldGUoJnNkcC0+c2RfbG9ja2luZ19pbml0KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3N1cGVyLmMgYi9mcy9nZnMyL3N1cGVyLmMKaW5kZXggZWQ1NDBlNy4uZmIwZWRmNyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zdXBlci5jCisrKyBiL2ZzL2dmczIvc3VwZXIuYwpAQCAtNzU3LDEzICs3NTcsMTcgQEAKIAlzdHJ1Y3QgdGltZXNwZWMgYXRpbWU7CiAJc3RydWN0IGdmczJfZGlub2RlICpkaTsKIAlpbnQgcmV0ID0gLUVBR0FJTjsKKwlpbnQgdW5sb2NrX3JlcXVpcmVkID0gMDsKIAogCS8qIFNraXAgdGltZXN0YW1wIHVwZGF0ZSwgaWYgdGhpcyBpcyBmcm9tIGEgbWVtYWxsb2MgKi8KIAlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKIAkJZ290byBkb19mbHVzaDsKLQlyZXQgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKLQlpZiAocmV0KQotCQlnb3RvIGRvX2ZsdXNoOworCWlmICghZ2ZzMl9nbG9ja19pc19sb2NrZWRfYnlfbWUoaXAtPmlfZ2wpKSB7CisJCXJldCA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmZ2gpOworCQlpZiAocmV0KQorCQkJZ290byBkb19mbHVzaDsKKwkJdW5sb2NrX3JlcXVpcmVkID0gMTsKKwl9CiAJcmV0ID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19ESU5PREUsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gZG9fdW5sb2NrOwpAQCAtNzgwLDcgKzc4NCw4IEBACiAJfQogCWdmczJfdHJhbnNfZW5kKHNkcCk7CiBkb191bmxvY2s6Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKKwlpZiAodW5sb2NrX3JlcXVpcmVkKQorCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOwogZG9fZmx1c2g6CiAJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKQogCQlnZnMyX2xvZ19mbHVzaChHRlMyX1NCKGlub2RlKSwgaXAtPmlfZ2wpOwpAQCAtMTQyNyw3ICsxNDMyLDIwIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgorLyoqCisgKiBnZnMyX2V2aWN0X2lub2RlIC0gUmVtb3ZlIGFuIGlub2RlIGZyb20gY2FjaGUKKyAqIEBpbm9kZTogVGhlIGlub2RlIHRvIGV2aWN0CisgKgorICogVGhlcmUgYXJlIHRocmVlIGNhc2VzIHRvIGNvbnNpZGVyOgorICogMS4gaV9ubGluayA9PSAwLCB3ZSBhcmUgZmluYWwgb3BlbmVyIChhbmQgbXVzdCBkZWFsbG9jYXRlKQorICogMi4gaV9ubGluayA9PSAwLCB3ZSBhcmUgbm90IHRoZSBmaW5hbCBvcGVuZXIgKGFuZCBjYW5ub3QgZGVhbGxvY2F0ZSkKKyAqIDMuIGlfbmxpbmsgPiAwCisgKgorICogSWYgdGhlIGZzIGlzIHJlYWQgb25seSwgdGhlbiB3ZSBoYXZlIHRvIHRyZWF0IGFsbCBjYXNlcyBhcyBwZXIgIzMKKyAqIHNpbmNlIHdlIGFyZSB1bmFibGUgdG8gZG8gYW55IGRlYWxsb2NhdGlvbi4gVGhlIGlub2RlIHdpbGwgYmUKKyAqIGRlYWxsb2NhdGVkIGJ5IHRoZSBuZXh0IHJlYWQvd3JpdGUgbm9kZSB0byBhdHRlbXB0IGFuIGFsbG9jYXRpb24KKyAqIGluIHRoZSBzYW1lIHJlc291cmNlIGdyb3VwCisgKgogICogV2UgaGF2ZSB0byAoYXQgdGhlIG1vbWVudCkgaG9sZCB0aGUgaW5vZGVzIG1haW4gbG9jayB0byBjb3ZlcgogICogdGhlIGdhcCBiZXR3ZWVuIHVubG9ja2luZyB0aGUgc2hhcmVkIGxvY2sgb24gdGhlIGlvcGVuIGxvY2sgYW5kCiAgKiB0YWtpbmcgdGhlIGV4Y2x1c2l2ZSBsb2NrLiBJJ2QgcmF0aGVyIGRvIGEgc2hhcmVkIC0+IGV4Y2x1c2l2ZQpAQCAtMTQ3MCw2ICsxNDg4LDggQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3RydW5jYXRlOwogCisJLyogQ2FzZSAxIHN0YXJ0cyBoZXJlICovCisKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgogCSAgICAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSkgewogCQllcnJvciA9IGdmczJfZGlyX2V4aGFzaF9kZWFsbG9jKGlwKTsKQEAgLTE0OTMsMTMgKzE1MTMsMTYgQEAKIAlnb3RvIG91dF91bmxvY2s7CiAKIG91dF90cnVuY2F0ZToKKwkvKiBDYXNlIDIgc3RhcnRzIGhlcmUgKi8KIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCAwLCBzZHAtPnNkX2pkZXNjLT5qZF9ibG9ja3MpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfdW5sb2NrOwotCWdmczJfZmluYWxfcmVsZWFzZV9wYWdlcyhpcCk7CisJLyogTmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgZ2xvY2sgcmVsZWFzZSAmIGFsc28gaW4gYSB0cmFuc2FjdGlvbiAqLworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAlnZnMyX3RyYW5zX2VuZChzZHApOwogCiBvdXRfdW5sb2NrOgorCS8qIEVycm9yIHBhdGggZm9yIGNhc2UgMSAqLwogCWlmICh0ZXN0X2JpdChISUZfSE9MREVSLCAmaXAtPmlfaW9wZW5fZ2guZ2hfaWZsYWdzKSkKIAkJZ2ZzMl9nbG9ja19kcSgmaXAtPmlfaW9wZW5fZ2gpOwogCWdmczJfaG9sZGVyX3VuaW5pdCgmaXAtPmlfaW9wZW5fZ2gpOwpAQCAtMTUwNyw2ICsxNTMwLDcgQEAKIAlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gR0xSX1RSWUZBSUxFRCAmJiBlcnJvciAhPSAtRVJPRlMpCiAJCWZzX3dhcm4oc2RwLCAiZ2ZzMl9ldmljdF9pbm9kZTogJWRcbiIsIGVycm9yKTsKIG91dDoKKwkvKiBDYXNlIDMgc3RhcnRzIGhlcmUgKi8KIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJZW5kX3dyaXRlYmFjayhpbm9kZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3lzLmMgYi9mcy9nZnMyL3N5cy5jCmluZGV4IGUyMGVhYjMuLjQ0M2NhYmMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3lzLmMKKysrIGIvZnMvZ2ZzMi9zeXMuYwpAQCAtMzM4LDYgKzMzOCw5IEBACiAJcnYgPSBzc2NhbmYoYnVmLCAiJXUiLCAmZmlyc3QpOwogCWlmIChydiAhPSAxIHx8IGZpcnN0ID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJcnYgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2tpbGxhYmxlKCZzZHAtPnNkX2xvY2tpbmdfaW5pdCk7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CiAJc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKIAlydiA9IC1FQlVTWTsKIAlpZiAodGVzdF9iaXQoU0RGX05PSk9VUk5BTElELCAmc2RwLT5zZF9mbGFncykgPT0gMCkKQEAgLTQxNCw3ICs0MTcsOSBAQAogCXJ2ID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJmppZCk7CiAJaWYgKHJ2ICE9IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCisJcnYgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2tpbGxhYmxlKCZzZHAtPnNkX2xvY2tpbmdfaW5pdCk7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CiAJc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKIAlydiA9IC1FSU5WQUw7CiAJaWYgKHNkcC0+c2RfbG9ja3N0cnVjdC5sc19vcHMtPmxtX21vdW50ID09IE5VTEwpCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggYjQ5YjU1NS4uODRhNDdiNyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtNTAwLDcgKzUwMCw3IEBACiBvdXRfcHV0X2hpZGRlbl9kaXI6CiAJaXB1dChzYmktPmhpZGRlbl9kaXIpOwogb3V0X3B1dF9yb290OgotCWlwdXQoc2JpLT5hbGxvY19maWxlKTsKKwlpcHV0KHJvb3QpOwogb3V0X3B1dF9hbGxvY19maWxlOgogCWlwdXQoc2JpLT5hbGxvY19maWxlKTsKIG91dF9jbG9zZV9jYXRfdHJlZToKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvd3JhcHBlci5jIGIvZnMvaGZzcGx1cy93cmFwcGVyLmMKaW5kZXggMzAzMWQ4MS4uNGFjODhmZiAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy93cmFwcGVyLmMKKysrIGIvZnMvaGZzcGx1cy93cmFwcGVyLmMKQEAgLTM2LDYgKzM2LDcgQEAKIHsKIAlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3YWl0KTsKIAlzdHJ1Y3QgYmlvICpiaW87CisJaW50IHJldCA9IDA7CiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIDEpOwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOwpAQCAtNTQsOCArNTUsMTAgQEAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKIAogCWlmICghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gMDsKKwkJcmV0ID0gLUVJTzsKKworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGhmc3BsdXNfcmVhZF9tZGIodm9pZCAqYnVmcHRyLCBzdHJ1Y3QgaGZzcGx1c193ZCAqd2QpCmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmcy5jIGIvZnMvaHBwZnMvaHBwZnMuYwppbmRleCA4N2VkNDhlLi44NWMwOThhIDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmcy5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzLmMKQEAgLTEzOSw3ICsxMzksOCBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmhwcGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5LCAqbmV3LCAqcGFyZW50OworCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5LCAqcGFyZW50OworCXN0cnVjdCBxc3RyICpuYW1lID0gJmRlbnRyeS0+ZF9uYW1lOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVyciwgZGVsZXRlZDsKIApAQCAtMTQ5LDIzICsxNTAsOSBAQAogCWVsc2UgaWYgKGRlbGV0ZWQpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCi0JZXJyID0gLUVOT01FTTsKIAlwYXJlbnQgPSBIUFBGU19JKGlubyktPnByb2NfZGVudHJ5OwogCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JcHJvY19kZW50cnkgPSBkX2xvb2t1cChwYXJlbnQsICZkZW50cnktPmRfbmFtZSk7Ci0JaWYgKHByb2NfZGVudHJ5ID09IE5VTEwpIHsKLQkJcHJvY19kZW50cnkgPSBkX2FsbG9jKHBhcmVudCwgJmRlbnRyeS0+ZF9uYW1lKTsKLQkJaWYgKHByb2NfZGVudHJ5ID09IE5VTEwpIHsKLQkJCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCW5ldyA9ICgqcGFyZW50LT5kX2lub2RlLT5pX29wLT5sb29rdXApKHBhcmVudC0+ZF9pbm9kZSwKLQkJCQkJCSAgICAgICBwcm9jX2RlbnRyeSwgTlVMTCk7Ci0JCWlmIChuZXcpIHsKLQkJCWRwdXQocHJvY19kZW50cnkpOwotCQkJcHJvY19kZW50cnkgPSBuZXc7Ci0JCX0KLQl9CisJcHJvY19kZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLT5uYW1lLCBwYXJlbnQsIG5hbWUtPmxlbik7CiAJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJaWYgKElTX0VSUihwcm9jX2RlbnRyeSkpCkBAIC0xNzQsMTMgKzE2MSwxMSBAQAogCWVyciA9IC1FTk9NRU07CiAJaW5vZGUgPSBnZXRfaW5vZGUoaW5vLT5pX3NiLCBwcm9jX2RlbnRyeSk7CiAJaWYgKCFpbm9kZSkKLQkJZ290byBvdXRfZHB1dDsKKwkJZ290byBvdXQ7CiAKICAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIE5VTEw7CiAKLSBvdXRfZHB1dDoKLQlkcHV0KHByb2NfZGVudHJ5KTsKICBvdXQ6CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KQEAgLTY5MCw4ICs2NzUsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKnByb2NfaW5vID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOwogCi0JaWYgKCFpbm9kZSkKKwlpZiAoIWlub2RlKSB7CisJCWRwdXQoZGVudHJ5KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCiAJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CiAJCWlub2RlLT5pX29wID0gJmhwcGZzX2Rpcl9pb3BzOwpAQCAtNzA0LDcgKzY5MSw3IEBACiAJCWlub2RlLT5pX2ZvcCA9ICZocHBmc19maWxlX2ZvcHM7CiAJfQogCi0JSFBQRlNfSShpbm9kZSktPnByb2NfZGVudHJ5ID0gZGdldChkZW50cnkpOworCUhQUEZTX0koaW5vZGUpLT5wcm9jX2RlbnRyeSA9IGRlbnRyeTsKIAogCWlub2RlLT5pX3VpZCA9IHByb2NfaW5vLT5pX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBwcm9jX2luby0+aV9naWQ7CkBAIC03MzcsNyArNzI0LDcgQEAKIAlzYi0+c19mc19pbmZvID0gcHJvY19tbnQ7CiAKIAllcnIgPSAtRU5PTUVNOwotCXJvb3RfaW5vZGUgPSBnZXRfaW5vZGUoc2IsIHByb2NfbW50LT5tbnRfc2ItPnNfcm9vdCk7CisJcm9vdF9pbm9kZSA9IGdldF9pbm9kZShzYiwgZGdldChwcm9jX21udC0+bW50X3NiLT5zX3Jvb3QpKTsKIAlpZiAoIXJvb3RfaW5vZGUpCiAJCWdvdG8gb3V0X21udHB1dDsKIApkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggMGY3ZTg4YS4uNDM1NjZkMSAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC00MjMsNyArNDIzLDE0IEBACiB2b2lkIGVuZF93cml0ZWJhY2soc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAltaWdodF9zbGVlcCgpOworCS8qCisJICogV2UgaGF2ZSB0byBjeWNsZSB0cmVlX2xvY2sgaGVyZSBiZWNhdXNlIHJlY2xhaW0gY2FuIGJlIHN0aWxsIGluIHRoZQorCSAqIHByb2Nlc3Mgb2YgcmVtb3ZpbmcgdGhlIGxhc3QgcGFnZSAoaW4gX19kZWxldGVfZnJvbV9wYWdlX2NhY2hlKCkpCisJICogYW5kIHdlIG11c3Qgbm90IGZyZWUgbWFwcGluZyB1bmRlciBpdC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayk7CiAJQlVHX09OKGlub2RlLT5pX2RhdGEubnJwYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxKCZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZpbm9kZS0+aV9kYXRhLnByaXZhdGVfbGlzdCkpOwogCUJVR19PTighKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKSk7CiAJQlVHX09OKGlub2RlLT5pX3N0YXRlICYgSV9DTEVBUik7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCAzZGI1YmE0Li5iM2NjODU4IDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTk3NCw3ICs5NzQsNyBAQAogb3V0X25vX3JlYWQ6CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJyZWFkIGZhaWxlZCwgZGV2PSVzLCBpc29fYmxrbnVtPSVkLCBibG9jaz0lZFxuIiwKIAkJX19mdW5jX18sIHMtPnNfaWQsIGlzb19ibGtudW0sIGJsb2NrKTsKLQlnb3RvIG91dF9mcmVlc2JpOworCWdvdG8gb3V0X2ZyZWViaDsKIG91dF9iYWRfem9uZV9zaXplOgogCXByaW50ayhLRVJOX1dBUk5JTkcgIklTT0ZTOiBCYWQgbG9naWNhbCB6b25lIHNpemUgJWxkXG4iLAogCQlzYmktPnNfbG9nX3pvbmVfc2l6ZSk7CkBAIC05ODksNiArOTg5LDcgQEAKIAogb3V0X2ZyZWViaDoKIAlicmVsc2UoYmgpOworCWJyZWxzZShwcmlfYmgpOwogb3V0X2ZyZWVzYmk6CiAJa2ZyZWUob3B0LmlvY2hhcnNldCk7CiAJa2ZyZWUoc2JpKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY2hlY2twb2ludC5jIGIvZnMvamJkMi9jaGVja3BvaW50LmMKaW5kZXggNmE3OWZkMC4uMmM2MmM1YSAxMDA2NDQKLS0tIGEvZnMvamJkMi9jaGVja3BvaW50LmMKKysrIGIvZnMvamJkMi9jaGVja3BvaW50LmMKQEAgLTk3LDEwICs5NywxNCBAQAogCiAJaWYgKGpoLT5iX2psaXN0ID09IEJKX05vbmUgJiYgIWJ1ZmZlcl9sb2NrZWQoYmgpICYmCiAJICAgICFidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKSB7CisJCS8qCisJCSAqIEdldCBvdXIgcmVmZXJlbmNlIHNvIHRoYXQgYmggY2Fubm90IGJlIGZyZWVkIGJlZm9yZQorCQkgKiB3ZSB1bmxvY2sgaXQKKwkJICovCisJCWdldF9iaChiaCk7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50IGxpc3QiKTsKIAkJcmV0ID0gX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpICsgMTsKIAkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKIAkJQlVGRkVSX1RSQUNFKGJoLCAicmVsZWFzZSIpOwogCQlfX2JyZWxzZShiaCk7CiAJfSBlbHNlIHsKQEAgLTIyMyw4ICsyMjcsOCBAQAogCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KKwkJZ2V0X2JoKGJoKTsKIAkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CiAJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CiAJCQl3YWl0X29uX2J1ZmZlcihiaCk7CkBAIC0yNDMsNyArMjQ3LDYgQEAKIAkJICovCiAJCXJlbGVhc2VkID0gX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOwogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKLQkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOwogCQlfX2JyZWxzZShiaCk7CiAJfQogCkBAIC0yODQsNyArMjg3LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgewotCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisJCWdldF9iaChiaCk7CiAJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQl3YWl0X29uX2J1ZmZlcihiaCk7CkBAIC0zMTYsMTIgKzMxOSwxMiBAQAogCQlyZXQgPSAxOwogCQlpZiAodW5saWtlbHkoYnVmZmVyX3dyaXRlX2lvX2Vycm9yKGJoKSkpCiAJCQlyZXQgPSAtRUlPOworCQlnZXRfYmgoYmgpOwogCQlKX0FTU0VSVF9KSChqaCwgIWJ1ZmZlcl9qYmRkaXJ0eShiaCkpOwogCQlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50Iik7CiAJCV9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKIAkJX19icmVsc2UoYmgpOwogCX0gZWxzZSB7CiAJCS8qCkBAIC01NTQsNyArNTU3LDggQEAKIC8qCiAgKiBqb3VybmFsX2NsZWFuX29uZV9jcF9saXN0CiAgKgotICogRmluZCBhbGwgdGhlIHdyaXR0ZW4tYmFjayBjaGVja3BvaW50IGJ1ZmZlcnMgaW4gdGhlIGdpdmVuIGxpc3QgYW5kIHJlbGVhc2UgdGhlbS4KKyAqIEZpbmQgYWxsIHRoZSB3cml0dGVuLWJhY2sgY2hlY2twb2ludCBidWZmZXJzIGluIHRoZSBnaXZlbiBsaXN0IGFuZAorICogcmVsZWFzZSB0aGVtLgogICoKICAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KICAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCkBAIC02NjMsOCArNjY3LDggQEAKICAqIGNoZWNrcG9pbnQgbGlzdHMuCiAgKgogICogVGhlIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBpdCBmcmVlcyB0aGUgdHJhbnNhY3Rpb24sIDAgb3RoZXJ3aXNlLgorICogVGhlIGZ1bmN0aW9uIGNhbiBmcmVlIGpoIGFuZCBiaC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKQogICovCkBAIC02ODQsMTMgKzY4OCwxNCBAQAogCX0KIAlqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKIAorCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmluZyBmcm9tIHRyYW5zYWN0aW9uIik7CiAJX19idWZmZXJfdW5saW5rKGpoKTsKIAlqaC0+Yl9jcF90cmFuc2FjdGlvbiA9IE5VTEw7CisJamJkMl9qb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoamgpOwogCiAJaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCAhPSBOVUxMIHx8CiAJICAgIHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCAhPSBOVUxMKQogCQlnb3RvIG91dDsKLQlKQlVGRkVSX1RSQUNFKGpoLCAidHJhbnNhY3Rpb24gaGFzIG5vIG1vcmUgYnVmZmVycyIpOwogCiAJLyoKIAkgKiBUaGVyZSBpcyBvbmUgc3BlY2lhbCBjYXNlIHRvIHdvcnJ5IGFib3V0OiBpZiB3ZSBoYXZlIGp1c3QgcHVsbGVkIHRoZQpAQCAtNzAxLDEwICs3MDYsOCBAQAogCSAqIFRoZSBsb2NraW5nIGhlcmUgYXJvdW5kIHRfc3RhdGUgaXMgYSBiaXQgc2xlYXp5LgogCSAqIFNlZSB0aGUgY29tbWVudCBhdCB0aGUgZW5kIG9mIGpiZDJfam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24oKS4KIAkgKi8KLQlpZiAodHJhbnNhY3Rpb24tPnRfc3RhdGUgIT0gVF9GSU5JU0hFRCkgewotCQlKQlVGRkVSX1RSQUNFKGpoLCAiYmVsb25ncyB0byBydW5uaW5nL2NvbW1pdHRpbmcgdHJhbnNhY3Rpb24iKTsKKwlpZiAodHJhbnNhY3Rpb24tPnRfc3RhdGUgIT0gVF9GSU5JU0hFRCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogT0ssIHRoYXQgd2FzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uOiB3ZSBjYW4gbm93CiAJICAgc2FmZWx5IHJlbW92ZSB0aGlzIHRyYW5zYWN0aW9uIGZyb20gdGhlIGxvZyAqLwpAQCAtNzIzLDcgKzcyNiw2IEBACiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2xvZ3NwYWNlKTsKIAlyZXQgPSAxOwogb3V0OgotCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzQyLDYgKzc0NCw4IEBACiAJSl9BU1NFUlRfSkgoamgsIGJ1ZmZlcl9kaXJ0eShqaDJiaChqaCkpIHx8IGJ1ZmZlcl9qYmRkaXJ0eShqaDJiaChqaCkpKTsKIAlKX0FTU0VSVF9KSChqaCwgamgtPmJfY3BfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CiAKKwkvKiBHZXQgcmVmZXJlbmNlIGZvciBjaGVja3BvaW50aW5nIHRyYW5zYWN0aW9uICovCisJamJkMl9qb3VybmFsX2dyYWJfam91cm5hbF9oZWFkKGpoMmJoKGpoKSk7CiAJamgtPmJfY3BfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKIAogCWlmICghdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0KSB7CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NvbW1pdC5jIGIvZnMvamJkMi9jb21taXQuYwppbmRleCA3ZjIxY2YzLi5lZWY2OTc5IDEwMDY0NAotLS0gYS9mcy9qYmQyL2NvbW1pdC5jCisrKyBiL2ZzL2piZDIvY29tbWl0LmMKQEAgLTg0OCwxMCArODQ4LDE2IEBACiAJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQpIHsKIAkJdHJhbnNhY3Rpb25fdCAqY3BfdHJhbnNhY3Rpb247CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCWludCB0cnlfdG9fZnJlZSA9IDA7CiAKIAkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OwogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQliaCA9IGpoMmJoKGpoKTsKKwkJLyoKKwkJICogR2V0IGEgcmVmZXJlbmNlIHNvIHRoYXQgYmggY2Fubm90IGJlIGZyZWVkIGJlZm9yZSB3ZSBhcmUKKwkJICogZG9uZSB3aXRoIGl0LgorCQkgKi8KKwkJZ2V0X2JoKGJoKTsKIAkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOwogCQlKX0FTU0VSVF9KSChqaCwJamgtPmJfdHJhbnNhY3Rpb24gPT0gY29tbWl0X3RyYW5zYWN0aW9uKTsKIApAQCAtOTE0LDI4ICs5MjAsMjcgQEAKIAkJCV9famJkMl9qb3VybmFsX2luc2VydF9jaGVja3BvaW50KGpoLCBjb21taXRfdHJhbnNhY3Rpb24pOwogCQkJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKIAkJCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOwotCQkJSkJVRkZFUl9UUkFDRShqaCwgInJlZmlsZSBmb3IgY2hlY2twb2ludCB3cml0ZWJhY2siKTsKLQkJCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOwotCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CiAJCX0gZWxzZSB7CiAJCQlKX0FTU0VSVF9CSChiaCwgIWJ1ZmZlcl9kaXJ0eShiaCkpOwotCQkJLyogVGhlIGJ1ZmZlciBvbiBCSl9Gb3JnZXQgbGlzdCBhbmQgbm90IGpiZGRpcnR5IG1lYW5zCisJCQkvKgorCQkJICogVGhlIGJ1ZmZlciBvbiBCSl9Gb3JnZXQgbGlzdCBhbmQgbm90IGpiZGRpcnR5IG1lYW5zCiAJCQkgKiBpdCBoYXMgYmVlbiBmcmVlZCBieSB0aGlzIHRyYW5zYWN0aW9uIGFuZCBoZW5jZSBpdAogCQkJICogY291bGQgbm90IGhhdmUgYmVlbiByZWFsbG9jYXRlZCB1bnRpbCB0aGlzCiAJCQkgKiB0cmFuc2FjdGlvbiBoYXMgY29tbWl0dGVkLiAqQlVUKiBpdCBjb3VsZCBiZQogCQkJICogcmVhbGxvY2F0ZWQgb25jZSB3ZSBoYXZlIHdyaXR0ZW4gYWxsIHRoZSBkYXRhIHRvCiAJCQkgKiBkaXNrIGFuZCBiZWZvcmUgd2UgcHJvY2VzcyB0aGUgYnVmZmVyIG9uIEJKX0ZvcmdldAotCQkJICogbGlzdC4gKi8KLQkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgb3IgdW5maWxlIGZyZWVkIGJ1ZmZlciIpOwotCQkJX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7Ci0JCQlpZiAoIWpoLT5iX3RyYW5zYWN0aW9uKSB7Ci0JCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCQkJIC8qIG5lZWRzIGEgYnJlbHNlICovCi0JCQkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOwotCQkJCXJlbGVhc2VfYnVmZmVyX3BhZ2UoYmgpOwotCQkJfSBlbHNlCi0JCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQkgKiBsaXN0LgorCQkJICovCisJCQlpZiAoIWpoLT5iX25leHRfdHJhbnNhY3Rpb24pCisJCQkJdHJ5X3RvX2ZyZWUgPSAxOwogCQl9CisJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgb3IgdW5maWxlIGJ1ZmZlciIpOworCQlfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpoKTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCWlmICh0cnlfdG9fZnJlZSkKKwkJCXJlbGVhc2VfYnVmZmVyX3BhZ2UoYmgpOwkvKiBEcm9wcyBiaCByZWZlcmVuY2UgKi8KKwkJZWxzZQorCQkJX19icmVsc2UoYmgpOwogCQljb25kX3Jlc2NoZWRfbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9qb3VybmFsLmMgYi9mcy9qYmQyL2pvdXJuYWwuYwppbmRleCA5YTc4MjY5Li4wZGZhNWI1OSAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTIwNzgsMTAgKzIwNzgsOSBAQAogICogV2hlbiBhIGJ1ZmZlciBoYXMgaXRzIEJIX0pCRCBiaXQgc2V0IGl0IGlzIGltbXVuZSBmcm9tIGJlaW5nIHJlbGVhc2VkIGJ5CiAgKiBjb3JlIGtlcm5lbCBjb2RlLCBtYWlubHkgdmlhIC0+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/CSovCi0JdW5jaGFyCWFnbm87CQkvKiBhZyBudW1iZXIJCQkqLworCXVuY2hhcglwYWQ7CiAJc2lnbmVkIGNoYXIgYWN0aXZlX2FnOwkvKiBhZyBjdXJyZW50bHkgYWxsb2NhdGluZyBmcm9tCSovCiAJbGlkX3QJYmxpZDsJCS8qIGxpZCBvZiBwc2V1ZG8gYnVmZmVyPwkqLwogCWxpZF90CWF0bGhlYWQ7CS8qIGFub255bW91cyB0bG9jayBsaXN0IGhlYWQJKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IDI3OGUzZmIuLjU4MzYzNmYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKIAliZGV2ID0gYmxrZGV2X2dldF9ieV9kZXYoc2JpLT5sb2dkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCwKIAkJCQkgbG9nKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7Ci0JCXJjID0gLVBUUl9FUlIoYmRldik7CisJCXJjID0gUFRSX0VSUihiZGV2KTsKIAkJZ290byBmcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvamZzL3Jlc2l6ZS5jIGIvZnMvamZzL3Jlc2l6ZS5jCmluZGV4IDhlYTVlZmIuLjhkMGMxYzcgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9yZXNpemUuYworKysgYi9mcy9qZnMvcmVzaXplLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAlpbnQgbG9nX2Zvcm1hdHRlZCA9IDA7CiAJc3RydWN0IGlub2RlICppcGxpc3RbMV07CiAJc3RydWN0IGpmc19zdXBlcmJsb2NrICpqX3NiLCAqal9zYjI7Ci0JdWludCBvbGRfYWdzaXplOworCXM2NCBvbGRfYWdzaXplOwogCWludCBhZ3NpemVjaGFuZ2VkID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmgyOwogCmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwppbmRleCBjODhlYWI1Li4yNzVjYTQ3NCAxMDA2NDQKLS0tIGEvZnMvbGliZnMuYworKysgYi9mcy9saWJmcy5jCkBAIC04MjIsNyArODIyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlhdHRyLT5zZXRfYnVmW3NpemVdID0gJ1wwJzsKLQl2YWwgPSBzaW1wbGVfc3RydG9sKGF0dHItPnNldF9idWYsIE5VTEwsIDApOworCXZhbCA9IHNpbXBsZV9zdHJ0b2xsKGF0dHItPnNldF9idWYsIE5VTEwsIDApOwogCXJldCA9IGF0dHItPnNldChhdHRyLT5kYXRhLCB2YWwpOwogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gbGVuOyAvKiBvbiBzdWNjZXNzLCBjbGFpbSB3ZSBnb3QgdGhlIHdob2xlIGlucHV0ICovCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50cHJvYy5jIGIvZnMvbG9ja2QvY2xudHByb2MuYwppbmRleCBhZGI0NWVjLi5lMzc0MDUwIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9jbG50cHJvYy5jCisrKyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKQEAgLTcwOCw3ICs3MDgsMTMgQEAKIAogCWlmICh0YXNrLT50a19zdGF0dXMgPCAwKSB7CiAJCWRwcmludGsoImxvY2tkOiB1bmxvY2sgZmFpbGVkIChlcnIgPSAlZClcbiIsIC10YXNrLT50a19zdGF0dXMpOwotCQlnb3RvIHJldHJ5X3JlYmluZDsKKwkJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKKwkJY2FzZSAtRUFDQ0VTOgorCQljYXNlIC1FSU86CisJCQlnb3RvIGRpZTsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcmV0cnlfcmViaW5kOworCQl9CiAJfQogCWlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CiAJCXJwY19kZWxheSh0YXNrLCBOTE1DTE5UX0dSQUNFX1dBSVQpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggMGE0ZjUwZC4uYjI4NjUzOSAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0xNjAsMTAgKzE2MCwyOCBAQAogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZpbGVsb2NrX2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKK3N0YXRpYyB2b2lkIGxvY2tzX2luaXRfbG9ja19hbHdheXMoc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJZmwtPmZsX25leHQgPSBOVUxMOworCWZsLT5mbF9mYXN5bmMgPSBOVUxMOworCWZsLT5mbF9vd25lciA9IE5VTEw7CisJZmwtPmZsX3BpZCA9IDA7CisJZmwtPmZsX25zcGlkID0gTlVMTDsKKwlmbC0+ZmxfZmlsZSA9IE5VTEw7CisJZmwtPmZsX2ZsYWdzID0gMDsKKwlmbC0+ZmxfdHlwZSA9IDA7CisJZmwtPmZsX3N0YXJ0ID0gZmwtPmZsX2VuZCA9IDA7Cit9CisKIC8qIEFsbG9jYXRlIGFuIGVtcHR5IGxvY2sgc3RydWN0dXJlLiAqLwogc3RydWN0IGZpbGVfbG9jayAqbG9ja3NfYWxsb2NfbG9jayh2b2lkKQogewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZpbGVsb2NrX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZWxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOworCisJaWYgKGZsKQorCQlsb2Nrc19pbml0X2xvY2tfYWx3YXlzKGZsKTsKKworCXJldHVybiBmbDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tzX2FsbG9jX2xvY2spOwogCkBAIC0yMDAsMTcgKzIxOCw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF9saW5rKTsKIAlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2Jsb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmbC0+Zmxfd2FpdCk7Ci0JZmwtPmZsX25leHQgPSBOVUxMOwotCWZsLT5mbF9mYXN5bmMgPSBOVUxMOwotCWZsLT5mbF9vd25lciA9IE5VTEw7Ci0JZmwtPmZsX3BpZCA9IDA7Ci0JZmwtPmZsX25zcGlkID0gTlVMTDsKLQlmbC0+ZmxfZmlsZSA9IE5VTEw7Ci0JZmwtPmZsX2ZsYWdzID0gMDsKLQlmbC0+ZmxfdHlwZSA9IDA7Ci0JZmwtPmZsX3N0YXJ0ID0gZmwtPmZsX2VuZCA9IDA7CiAJZmwtPmZsX29wcyA9IE5VTEw7CiAJZmwtPmZsX2xtb3BzID0gTlVMTDsKKwlsb2Nrc19pbml0X2xvY2tfYWx3YXlzKGZsKTsKIH0KIAogRVhQT1JUX1NZTUJPTChsb2Nrc19pbml0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvZGlyLmMgYi9mcy9sb2dmcy9kaXIuYwppbmRleCA5ZWQ4OWQxLi4xYWZhZTI2IDEwMDY0NAotLS0gYS9mcy9sb2dmcy9kaXIuYworKysgYi9mcy9sb2dmcy9kaXIuYwpAQCAtNTU1LDEzICs1NTUsNiBAQAogCXJldHVybiBfX2xvZ2ZzX2NyZWF0ZShkaXIsIGRlbnRyeSwgaW5vZGUsIHRhcmdldCwgZGVzdGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgbG9nZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7Ci19Ci0KIHN0YXRpYyBpbnQgbG9nZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtODIwLDcgKzgxMyw2IEBACiAJLm1rbm9kCQk9IGxvZ2ZzX21rbm9kLAogCS5yZW5hbWUJCT0gbG9nZnNfcmVuYW1lLAogCS5ybWRpcgkJPSBsb2dmc19ybWRpciwKLQkucGVybWlzc2lvbgk9IGxvZ2ZzX3Blcm1pc3Npb24sCiAJLnN5bWxpbmsJPSBsb2dmc19zeW1saW5rLAogCS51bmxpbmsJCT0gbG9nZnNfdW5saW5rLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDFhYjY0MWYuLjE0YWI4ZDMgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMjM4LDcgKzIzOCw4IEBACiAKIAkvKgogCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgotCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KKwkgKiBFeGVjdXRhYmxlIERBQ3MgYXJlIG92ZXJyaWRhYmxlIGZvciBhbGwgZGlyZWN0b3JpZXMgYW5kCisJICogZm9yIG5vbi1kaXJlY3RvcmllcyB0aGF0IGhhdmUgbGVhc3Qgb25lIGV4ZWMgYml0IHNldC4KIAkgKi8KIAlpZiAoIShtYXNrICYgTUFZX0VYRUMpIHx8IGV4ZWN1dGVfb2soaW5vZGUpKQogCQlpZiAobnNfY2FwYWJsZShpbm9kZV91c2VybnMoaW5vZGUpLCBDQVBfREFDX09WRVJSSURFKSkKQEAgLTQzMiw2ICs0MzMsOCBAQAogCQkJZ290byBlcnJfcGFyZW50OwogCQlCVUdfT04obmQtPmlub2RlICE9IHBhcmVudC0+ZF9pbm9kZSk7CiAJfSBlbHNlIHsKKwkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQorCQkJZ290byBlcnJfcGFyZW50OwogCQlzcGluX2xvY2tfbmVzdGVkKCZkZW50cnktPmRfbG9jaywgREVOVFJZX0RfTE9DS19ORVNURUQpOwogCQlpZiAoIV9fZF9yY3VfdG9fcmVmY291bnQoZGVudHJ5LCBuZC0+c2VxKSkKIAkJCWdvdG8gZXJyX2NoaWxkOwpAQCAtODEyLDYgKzgxNSwxMSBAQAogCWlmICghbW50KSAvKiBtb3VudCBjb2xsaXNpb24gKi8KIAkJcmV0dXJuIDA7CiAKKwlpZiAoISpuZWVkX21udHB1dCkgeworCQkvKiBsb2NrX21vdW50KCkgbWF5IHJlbGVhc2UgcGF0aC0+bW50IG9uIGVycm9yICovCisJCW1udGdldChwYXRoLT5tbnQpOworCQkqbmVlZF9tbnRwdXQgPSB0cnVlOworCX0KIAllcnIgPSBmaW5pc2hfYXV0b21vdW50KG1udCwgcGF0aCk7CiAKIAlzd2l0Y2ggKGVycikgewpAQCAtODE5LDEyICs4MjcsOSBAQAogCQkvKiBTb21lb25lIGVsc2UgbWFkZSBhIG1vdW50IGhlcmUgd2hpbHN0IHdlIHdlcmUgYnVzeSAqLwogCQlyZXR1cm4gMDsKIAljYXNlIDA6Ci0JCWRwdXQocGF0aC0+ZGVudHJ5KTsKLQkJaWYgKCpuZWVkX21udHB1dCkKLQkJCW1udHB1dChwYXRoLT5tbnQpOworCQlwYXRoX3B1dChwYXRoKTsKIAkJcGF0aC0+bW50ID0gbW50OwogCQlwYXRoLT5kZW50cnkgPSBkZ2V0KG1udC0+bW50X3Jvb3QpOwotCQkqbmVlZF9tbnRwdXQgPSB0cnVlOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZXJyOwpAQCAtODQ0LDkgKzg0OSwxMCBAQAogICovCiBzdGF0aWMgaW50IGZvbGxvd19tYW5hZ2VkKHN0cnVjdCBwYXRoICpwYXRoLCB1bnNpZ25lZCBmbGFncykKIHsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHBhdGgtPm1udDsgLyogaGVsZCBieSBjYWxsZXIsIG11c3QgYmUgbGVmdCBhbG9uZSAqLwogCXVuc2lnbmVkIG1hbmFnZWQ7CiAJYm9vbCBuZWVkX21udHB1dCA9IGZhbHNlOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAkvKiBHaXZlbiB0aGF0IHdlJ3JlIG5vdCBob2xkaW5nIGEgbG9jayBoZXJlLCB3ZSByZXRhaW4gdGhlIHZhbHVlIGluIGEKIAkgKiBsb2NhbCB2YXJpYWJsZSBmb3IgZWFjaCBkZW50cnkgYXMgd2UgbG9vayBhdCBpdCBzbyB0aGF0IHdlIGRvbid0IHNlZQpAQCAtODYxLDcgKzg2Nyw3IEBACiAJCQlCVUdfT04oIXBhdGgtPmRlbnRyeS0+ZF9vcC0+ZF9tYW5hZ2UpOwogCQkJcmV0ID0gcGF0aC0+ZGVudHJ5LT5kX29wLT5kX21hbmFnZShwYXRoLT5kZW50cnksIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQgPT0gLUVJU0RJUiA/IDAgOiByZXQ7CisJCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBUcmFuc2l0IHRvIGEgbW91bnRlZCBmaWxlc3lzdGVtLiAqLwpAQCAtODg3LDE0ICs4OTMsMTkgQEAKIAkJaWYgKG1hbmFnZWQgJiBEQ0FDSEVfTkVFRF9BVVRPTU9VTlQpIHsKIAkJCXJldCA9IGZvbGxvd19hdXRvbW91bnQocGF0aCwgZmxhZ3MsICZuZWVkX21udHB1dCk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0ID09IC1FSVNESVIgPyAwIDogcmV0OworCQkJCWJyZWFrOwogCQkJY29udGludWU7CiAJCX0KIAogCQkvKiBXZSBkaWRuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHBhdGggcG9pbnQgKi8KIAkJYnJlYWs7CiAJfQotCXJldHVybiAwOworCisJaWYgKG5lZWRfbW50cHV0ICYmIHBhdGgtPm1udCA9PSBtbnQpCisJCW1udHB1dChwYXRoLT5tbnQpOworCWlmIChyZXQgPT0gLUVJU0RJUikKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgZm9sbG93X2Rvd25fb25lKHN0cnVjdCBwYXRoICpwYXRoKQpAQCAtOTMxLDcgKzk0Miw2IEBACiAJCSAqIERvbid0IGZvcmdldCB3ZSBtaWdodCBoYXZlIGEgbm9uLW1vdW50cG9pbnQgbWFuYWdlZCBkZW50cnkKIAkJICogdGhhdCB3YW50cyB0byBibG9jayB0cmFuc2l0LgogCQkgKi8KLQkJKmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCQlpZiAodW5saWtlbHkobWFuYWdlZF9kZW50cnlfbWlnaHRfYmxvY2socGF0aC0+ZGVudHJ5KSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTk0NCw2ICs5NTQsMTIgQEAKIAkJcGF0aC0+bW50ID0gbW91bnRlZDsKIAkJcGF0aC0+ZGVudHJ5ID0gbW91bnRlZC0+bW50X3Jvb3Q7CiAJCW5kLT5zZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZwYXRoLT5kZW50cnktPmRfc2VxKTsKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBpbm9kZSB0b28uIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgdGhlCisJCSAqIGRlbnRyeSBzZXF1ZW5jZSBudW1iZXIgaGVyZSBhZnRlciB0aGlzIGRfaW5vZGUgcmVhZCwKKwkJICogYmVjYXVzZSBhIG1vdW50LXBvaW50IGlzIGFsd2F5cyBwaW5uZWQuCisJCSAqLworCQkqaW5vZGUgPSBwYXRoLT5kZW50cnktPmRfaW5vZGU7CiAJfQogCXJldHVybiB0cnVlOwogfQpAQCAtMTAwMyw5ICsxMDE5LDYgQEAKICAqIEZvbGxvdyBkb3duIHRvIHRoZSBjb3ZlcmluZyBtb3VudCBjdXJyZW50bHkgdmlzaWJsZSB0byB1c2Vyc3BhY2UuICBBdCBlYWNoCiAgKiBwb2ludCwgdGhlIGZpbGVzeXN0ZW0gb3duaW5nIHRoYXQgZGVudHJ5IG1heSBiZSBxdWVyaWVkIGFzIHRvIHdoZXRoZXIgdGhlCiAgKiBjYWxsZXIgaXMgcGVybWl0dGVkIHRvIHByb2NlZWQgb3Igbm90LgotICoKLSAqIENhcmUgbXVzdCBiZSB0YWtlbiBhcyBuYW1lc3BhY2Vfc2VtIG1heSBiZSBoZWxkIChpbmRpY2F0ZWQgYnkgbW91bnRpbmdfaGVyZQotICogYmVpbmcgdHJ1ZSkuCiAgKi8KIGludCBmb2xsb3dfZG93bihzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKQEAgLTI1NzksNiArMjU5Miw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAorCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CiAJZXJyb3IgPSBkaXItPmlfb3AtPnJtZGlyKGRpciwgZGVudHJ5KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwpAQCAtMjYyMyw2ICsyNjM3LDEwIEBACiAJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CiAJaWYgKElTX0VSUihkZW50cnkpKQogCQlnb3RvIGV4aXQyOworCWlmICghZGVudHJ5LT5kX2lub2RlKSB7CisJCWVycm9yID0gLUVOT0VOVDsKKwkJZ290byBleGl0MzsKKwl9CiAJZXJyb3IgPSBtbnRfd2FudF93cml0ZShuZC5wYXRoLm1udCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGV4aXQzOwpAQCAtMjcxMSw4ICsyNzI5LDkgQEAKIAkJaWYgKG5kLmxhc3QubmFtZVtuZC5sYXN0Lmxlbl0pCiAJCQlnb3RvIHNsYXNoZXM7CiAJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCQlpZiAoaW5vZGUpCi0JCQlpaG9sZChpbm9kZSk7CisJCWlmICghaW5vZGUpCisJCQlnb3RvIHNsYXNoZXM7CisJCWlob2xkKGlub2RlKTsKIAkJZXJyb3IgPSBtbnRfd2FudF93cml0ZShuZC5wYXRoLm1udCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXhpdDI7CkBAIC0yOTkzLDYgKzMwMTIsOCBAQAogCWlmIChkX21vdW50cG9pbnQob2xkX2RlbnRyeSkgfHwgZF9tb3VudHBvaW50KG5ld19kZW50cnkpKQogCQlnb3RvIG91dDsKIAorCWlmICh0YXJnZXQpCisJCXNocmlua19kY2FjaGVfcGFyZW50KG5ld19kZW50cnkpOwogCWVycm9yID0gb2xkX2Rpci0+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+cGdfYnNpemU7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZnNfZ2VuZXJpY19wZ190ZXN0KTsKIAogLyoqCiAgKiBuZnNfcGFnZWlvX2luaXQgLSBpbml0aWFsaXNlIGEgcGFnZSBpbyBkZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5jIGIvZnMvbmZzL3BuZnMuYwppbmRleCA4YzEzMDlkLi4yOWMwY2E3ZiAxMDA2NDQKLS0tIGEvZnMvbmZzL3BuZnMuYworKysgYi9mcy9uZnMvcG5mcy5jCkBAIC02MzQsMTQgKzYzNCwxNiBAQAogCiAJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CiAJbG8gPSBuZnNpLT5sYXlvdXQ7Ci0JaWYgKCFsbyB8fCAhbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmdG1wX2xpc3QsIE5VTEwpKSB7CisJaWYgKCFsbykgewogCQlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOwotCQlkcHJpbnRrKCIlczogbm8gbGF5b3V0IHNlZ21lbnRzIHRvIHJldHVyblxuIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKKwkJZHByaW50aygiJXM6IG5vIGxheW91dCB0byByZXR1cm5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAJc3RhdGVpZCA9IG5mc2ktPmxheW91dC0+cGxoX3N0YXRlaWQ7CiAJLyogUmVmZXJlbmNlIG1hdGNoZWQgaW4gbmZzNF9sYXlvdXRyZXR1cm5fcmVsZWFzZSAqLwogCWdldF9sYXlvdXRfaGRyKGxvKTsKKwltYXJrX21hdGNoaW5nX2xzZWdzX2ludmFsaWQobG8sICZ0bXBfbGlzdCwgTlVMTCk7CisJbG8tPnBsaF9ibG9ja19sZ2V0cysrOwogCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CiAJcG5mc19mcmVlX2xzZWdfbGlzdCgmdG1wX2xpc3QpOwogCkBAIC02NTAsNiArNjUyLDkgQEAKIAlscnAgPSBremFsbG9jKHNpemVvZigqbHJwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KGxycCA9PSBOVUxMKSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOworCQlzZXRfYml0KE5GU19MQVlPVVRfUldfRkFJTEVELCAmbG8tPnBsaF9mbGFncyk7CisJCXNldF9iaXQoTkZTX0xBWU9VVF9ST19GQUlMRUQsICZsby0+cGxoX2ZsYWdzKTsKKwkJcHV0X2xheW91dF9oZHIobG8pOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg4Nyw3ICs4OTIsNyBAQAogCQkJcmV0ID0gZ2V0X2xzZWcobHNlZyk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoY21wX2xheW91dChyYW5nZSwgJmxzZWctPnBsc19yYW5nZSkgPiAwKQorCQlpZiAobHNlZy0+cGxzX3JhbmdlLm9mZnNldCA+IHJhbmdlLT5vZmZzZXQpCiAJCQlicmVhazsKIAl9CiAKQEAgLTEwNTksMjMgKzEwNjQsMzYgQEAKIAkJZ2ZwX2ZsYWdzID0gR0ZQX05PRlM7CiAJfQogCi0JaWYgKHBnaW8tPnBnX2NvdW50ID09IHByZXYtPndiX2J5dGVzKSB7CisJaWYgKHBnaW8tPnBnX2xzZWcgPT0gTlVMTCkgeworCQlpZiAocGdpby0+cGdfY291bnQgIT0gcHJldi0+d2JfYnl0ZXMpCisJCQlyZXR1cm4gdHJ1ZTsKIAkJLyogVGhpcyBpcyBmaXJzdCBjb2VsZXNjZSBjYWxsIGZvciBhIHNlcmllcyBvZiBuZnNfcGFnZXMgKi8KIAkJcGdpby0+cGdfbHNlZyA9IHBuZnNfdXBkYXRlX2xheW91dChwZ2lvLT5wZ19pbm9kZSwKIAkJCQkJCSAgIHByZXYtPndiX2NvbnRleHQsCi0JCQkJCQkgICByZXFfb2Zmc2V0KHJlcSksCisJCQkJCQkgICByZXFfb2Zmc2V0KHByZXYpLAogCQkJCQkJICAgcGdpby0+cGdfY291bnQsCiAJCQkJCQkgICBhY2Nlc3NfdHlwZSwKIAkJCQkJCSAgIGdmcF9mbGFncyk7Ci0JCXJldHVybiB0cnVlOworCQlpZiAocGdpby0+cGdfbHNlZyA9PSBOVUxMKQorCQkJcmV0dXJuIHRydWU7CiAJfQogCi0JaWYgKHBnaW8tPnBnX2xzZWcgJiYKLQkgICAgcmVxX29mZnNldChyZXEpID4gZW5kX29mZnNldChwZ2lvLT5wZ19sc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAotCQkJCQkgcGdpby0+cGdfbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOworCS8qCisJICogVGVzdCBpZiBhIG5mc19wYWdlIGlzIGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgcG5mc19sYXlvdXRfcmFuZ2UuCisJICogTm90ZSB0aGF0IHRoaXMgdGVzdCBtYWtlcyBzZXZlcmFsIGFzc3VtcHRpb25zOgorCSAqIC0gdGhhdCB0aGUgcHJldmlvdXMgbmZzX3BhZ2UgaW4gdGhlIHN0cnVjdCBuZnNfcGFnZWlvX2Rlc2NyaXB0b3IKKwkgKiAgIGlzIGtub3duIHRvIGxpZSB3aXRoaW4gdGhlIHJhbmdlLgorCSAqICAgLSB0aGF0IHRoZSBuZnNfcGFnZSBiZWluZyB0ZXN0ZWQgaXMga25vd24gdG8gYmUgY29udGlndW91cyB3aXRoIHRoZQorCSAqICAgcHJldmlvdXMgbmZzX3BhZ2UuCisJICogICAtIExheW91dCByYW5nZXMgYXJlIHBhZ2UgYWxpZ25lZCwgc28gd2Ugb25seSBoYXZlIHRvIHRlc3QgdGhlCisJICogICBzdGFydCBvZmZzZXQgb2YgdGhlIHJlcXVlc3QuCisJICoKKwkgKiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgJ2VuZF9vZmZzZXQnIGlzIGFjdHVhbGx5IHRoZSBvZmZzZXQgb2YgdGhlCisJICogZmlyc3QgYnl0ZSB0aGF0IGxpZXMgb3V0c2lkZSB0aGUgcG5mc19sYXlvdXRfcmFuZ2UuIEZJWE1FPworCSAqCisJICovCisJcmV0dXJuIHJlcV9vZmZzZXQocmVxKSA8IGVuZF9vZmZzZXQocGdpby0+cGdfbHNlZy0+cGxzX3JhbmdlLm9mZnNldCwKKwkJCQkJIHBnaW8tPnBnX2xzZWctPnBsc19yYW5nZS5sZW5ndGgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG5mc19nZW5lcmljX3BnX3Rlc3QpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5oIGIvZnMvbmZzL3BuZnMuaAppbmRleCA0OGQwYThlLi45NmJmNGU2IDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5oCisrKyBiL2ZzL25mcy9wbmZzLmgKQEAgLTE4Niw2ICsxODYsNyBAQAogLyogcG5mc19kZXYuYyAqLwogc3RydWN0IG5mczRfZGV2aWNlaWRfbm9kZSB7CiAJc3RydWN0IGhsaXN0X25vZGUJCW5vZGU7CisJc3RydWN0IGhsaXN0X25vZGUJCXRtcG5vZGU7CiAJY29uc3Qgc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgKmxkOwogCWNvbnN0IHN0cnVjdCBuZnNfY2xpZW50CQkqbmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzNF9kZXZpY2VpZAkJZGV2aWNlaWQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mc19kZXYuYyBiL2ZzL25mcy9wbmZzX2Rldi5jCmluZGV4IGM2NWUxMzMuLmYwZjhlMWUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzX2Rldi5jCisrKyBiL2ZzL25mcy9wbmZzX2Rldi5jCkBAIC0xNzQsNiArMTc0LDcgQEAKIAkJCWNvbnN0IHN0cnVjdCBuZnM0X2RldmljZWlkICppZCkKIHsKIAlJTklUX0hMSVNUX05PREUoJmQtPm5vZGUpOworCUlOSVRfSExJU1RfTk9ERSgmZC0+dG1wbm9kZSk7CiAJZC0+bGQgPSBsZDsKIAlkLT5uZnNfY2xpZW50ID0gbmZzX2NsaWVudDsKIAlkLT5kZXZpY2VpZCA9ICppZDsKQEAgLTIwOCw2ICsyMDksNyBAQAogCiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZuZXctPm5vZGUsICZuZnM0X2RldmljZWlkX2NhY2hlW2hhc2hdKTsKIAlzcGluX3VubG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKKwlhdG9taWNfaW5jKCZuZXctPnJlZik7CiAKIAlyZXR1cm4gbmV3OwogfQpAQCAtMjM4LDI0ICsyNDAsMjkgQEAKIF9kZXZpY2VpZF9wdXJnZV9jbGllbnQoY29uc3Qgc3RydWN0IG5mc19jbGllbnQgKmNscCwgbG9uZyBoYXNoKQogewogCXN0cnVjdCBuZnM0X2RldmljZWlkX25vZGUgKmQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm4sICpuZXh0OworCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCUhMSVNUX0hFQUQodG1wKTsKIAorCXNwaW5fbG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGQsIG4sICZuZnM0X2RldmljZWlkX2NhY2hlW2hhc2hdLCBub2RlKQogCQlpZiAoZC0+bmZzX2NsaWVudCA9PSBjbHAgJiYgYXRvbWljX3JlYWQoJmQtPnJlZikpIHsKIAkJCWhsaXN0X2RlbF9pbml0X3JjdSgmZC0+bm9kZSk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmZC0+bm9kZSwgJnRtcCk7CisJCQlobGlzdF9hZGRfaGVhZCgmZC0+dG1wbm9kZSwgJnRtcCk7CiAJCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX3VubG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKIAogCWlmIChobGlzdF9lbXB0eSgmdG1wKSkKIAkJcmV0dXJuOwogCiAJc3luY2hyb25pemVfcmN1KCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkLCBuLCBuZXh0LCAmdG1wLCBub2RlKQorCXdoaWxlICghaGxpc3RfZW1wdHkoJnRtcCkpIHsKKwkJZCA9IGhsaXN0X2VudHJ5KHRtcC5maXJzdCwgc3RydWN0IG5mczRfZGV2aWNlaWRfbm9kZSwgdG1wbm9kZSk7CisJCWhsaXN0X2RlbCgmZC0+dG1wbm9kZSk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkLT5yZWYpKQogCQkJZC0+bGQtPmZyZWVfZGV2aWNlaWRfbm9kZShkKTsKKwl9CiB9CiAKIHZvaWQKQEAgLTI2Myw4ICsyNzAsOCBAQAogewogCWxvbmcgaDsKIAotCXNwaW5fbG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKKwlpZiAoIShjbHAtPmNsX2V4Y2hhbmdlX2ZsYWdzICYgRVhDSEdJRDRfRkxBR19VU0VfUE5GU19NRFMpKQorCQlyZXR1cm47CiAJZm9yIChoID0gMDsgaCA8IE5GUzRfREVWSUNFX0lEX0hBU0hfU0laRTsgaCsrKQogCQlfZGV2aWNlaWRfcHVyZ2VfY2xpZW50KGNscCwgaCk7Ci0Jc3Bpbl91bmxvY2soJm5mczRfZGV2aWNlaWRfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jCmluZGV4IGUyNjhlM2IuLjcyNzE2ODAgMTAwNjQ0Ci0tLSBhL2ZzL25mcy93cml0ZS5jCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC04NjQsNiArODY0LDggQEAKIAogCWRhdGEtPmFyZ3MuZmggICAgID0gTkZTX0ZIKGlub2RlKTsKIAlkYXRhLT5hcmdzLm9mZnNldCA9IHJlcV9vZmZzZXQocmVxKSArIG9mZnNldDsKKwkvKiBwbmZzX3NldF9sYXlvdXRjb21taXQgbmVlZHMgdGhpcyAqLworCWRhdGEtPm1kc19vZmZzZXQgPSBkYXRhLT5hcmdzLm9mZnNldDsKIAlkYXRhLT5hcmdzLnBnYmFzZSA9IHJlcS0+d2JfcGdiYXNlICsgb2Zmc2V0OwogCWRhdGEtPmFyZ3MucGFnZXMgID0gZGF0YS0+cGFnZXZlYzsKIAlkYXRhLT5hcmdzLmNvdW50ICA9IGNvdW50OwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9LY29uZmlnIGIvZnMvbmZzZC9LY29uZmlnCmluZGV4IDE4YjNlODkuLmZiYjJhNWUgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvS2NvbmZpZworKysgYi9mcy9uZnNkL0tjb25maWcKQEAgLTgyLDYgKzgyLDcgQEAKIAlzZWxlY3QgTkZTRF9WMwogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAlzZWxlY3QgU1VOUlBDX0dTUworCXNlbGVjdCBDUllQVE8KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4geW91ciBzeXN0ZW0ncyBORlMgc2VydmVyIGZvcgogCSAgdmVyc2lvbiA0IG9mIHRoZSBORlMgcHJvdG9jb2wgKFJGQyAzNTMwKS4KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDFmNWVhZTQuLjJiMTQ0OWQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oPgogCiAjaW5jbHVkZSAiaWRtYXAuaCIKICNpbmNsdWRlICJuZnNkLmgiCkBAIC0xODksMTggKzE5MCwxMCBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi0jaWZkZWYgQ09ORklHX1NVTlJQQ19HU1MKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTKSB8fCBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTX01PRFVMRSkKIHN0YXRpYyBpbnQgc3VwcG9ydGVkX2VuY3R5cGVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCBnc3NfYXBpX21lY2ggKms1bWVjaDsKLQotCWs1bWVjaCA9IGdzc19tZWNoX2dldF9ieV9uYW1lKCJrcmI1Iik7Ci0JaWYgKGs1bWVjaCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQlpZiAoazVtZWNoLT5nbV91cGNhbGxfZW5jdHlwZXMgIT0gTlVMTCkKLQkJc2VxX3ByaW50ZihtLCBrNW1lY2gtPmdtX3VwY2FsbF9lbmN0eXBlcyk7Ci0JZ3NzX21lY2hfcHV0KGs1bWVjaCk7Ci1vdXQ6CisJc2VxX3ByaW50ZihtLCBLUkI1X1NVUFBPUlRFRF9FTkNUWVBFUyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNSw3ICsyMDgsNyBAQAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwotI2VuZGlmIC8qIENPTkZJR19TVU5SUENfR1NTICovCisjZW5kaWYgLyogQ09ORklHX1NVTlJQQ19HU1Mgb3IgQ09ORklHX1NVTlJQQ19HU1NfTU9EVUxFICovCiAKIGV4dGVybiBpbnQgbmZzZF9wb29sX3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogZXh0ZXJuIGludCBuZnNkX3Bvb2xfc3RhdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0xNDI3LDkgKzE0MjAsOSBAQAogCQlbTkZTRF9WZXJzaW9uc10gPSB7InZlcnNpb25zIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKIAkJW05GU0RfUG9ydHNdID0geyJwb3J0bGlzdCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVHT30sCiAJCVtORlNEX01heEJsa1NpemVdID0geyJtYXhfYmxvY2tfc2l6ZSIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVHT30sCi0jaWZkZWYgQ09ORklHX1NVTlJQQ19HU1MKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTKSB8fCBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTX01PRFVMRSkKIAkJW05GU0RfU3VwcG9ydGVkRW5jdHlwZXNdID0geyJzdXBwb3J0ZWRfa3JiNV9lbmN0eXBlcyIsICZzdXBwb3J0ZWRfZW5jdHlwZXNfb3BzLCBTX0lSVUdPfSwKLSNlbmRpZiAvKiBDT05GSUdfU1VOUlBDX0dTUyAqLworI2VuZGlmIC8qIENPTkZJR19TVU5SUENfR1NTIG9yIENPTkZJR19TVU5SUENfR1NTX01PRFVMRSAqLwogI2lmZGVmIENPTkZJR19ORlNEX1Y0CiAJCVtORlNEX0xlYXNldGltZV0gPSB7Im5mc3Y0bGVhc2V0aW1lIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKIAkJW05GU0RfR3JhY2V0aW1lXSA9IHsibmZzdjRncmFjZXRpbWUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LApkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggZDU3MTgyNy4uZmQwYWNjYSAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC02OTYsNyArNjk2LDE1IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KIAorc3RhdGljIGludCBuZnNkX29wZW5fYnJlYWtfbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGFjY2VzcykKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZTsKIAorCWlmIChhY2Nlc3MgJiBORlNEX01BWV9OT1RfQlJFQUtfTEVBU0UpCisJCXJldHVybiAwOworCW1vZGUgPSAoYWNjZXNzICYgTkZTRF9NQVlfV1JJVEUpID8gT19XUk9OTFkgOiBPX1JET05MWTsKKwlyZXR1cm4gYnJlYWtfbGVhc2UoaW5vZGUsIG1vZGUgfCBPX05PTkJMT0NLKTsKK30KIAogLyoKICAqIE9wZW4gYW4gZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkuCkBAIC03NDQsMTIgKzc1Miw3IEBACiAJaWYgKCFpbm9kZS0+aV9mb3ApCiAJCWdvdG8gb3V0OwogCi0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWFzZXMgb24gdGhpcyBmaWxlLgotCSAqIFRoaXMgbWF5IGJsb2NrIHdoaWxlIGxlYXNlcyBhcmUgYnJva2VuLgotCSAqLwotCWlmICghKGFjY2VzcyAmIE5GU0RfTUFZX05PVF9CUkVBS19MRUFTRSkpCi0JCWhvc3RfZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIE9fTk9OQkxPQ0sgfCAoKGFjY2VzcyAmIE5GU0RfTUFZX1dSSVRFKSA/IE9fV1JPTkxZIDogMCkpOworCWhvc3RfZXJyID0gbmZzZF9vcGVuX2JyZWFrX2xlYXNlKGlub2RlLCBhY2Nlc3MpOwogCWlmIChob3N0X2VycikgLyogTk9NRU0gb3IgV09VTERCTE9DSyAqLwogCQlnb3RvIG91dF9uZnNlcnI7CiAKQEAgLTE2NjAsOCArMTY2MywxMCBAQAogCWlmICghZG9sZC0+ZF9pbm9kZSkKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKIAlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2UoZG9sZC0+ZF9pbm9kZSk7Ci0JaWYgKGhvc3RfZXJyKQorCWlmIChob3N0X2VycikgeworCQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CisJfQogCWhvc3RfZXJyID0gdmZzX2xpbmsoZG9sZCwgZGlycCwgZG5ldyk7CiAJaWYgKCFob3N0X2VycikgewogCQllcnIgPSBuZnNlcnJubyhjb21taXRfbWV0YWRhdGEoZmZocCkpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2J0cmVlLmMgYi9mcy9uaWxmczIvYnRyZWUuYwppbmRleCA3ZWFmZTQ2Li5iMmUzZmYzIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvYnRyZWUuYworKysgYi9mcy9uaWxmczIvYnRyZWUuYwpAQCAtMTM0Niw2ICsxMzQ2LDExIEBACiAJcGF0aFtsZXZlbF0uYnBfYmggPSBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBuaWxmc19idHJlZV9ub3Aoc3RydWN0IG5pbGZzX2JtYXAgKmJ0cmVlLAorCQkJICAgIHN0cnVjdCBuaWxmc19idHJlZV9wYXRoICpwYXRoLAorCQkJICAgIGludCBsZXZlbCwgX191NjQgKmtleXAsIF9fdTY0ICpwdHJwKQoreworfQogCiBzdGF0aWMgaW50IG5pbGZzX2J0cmVlX3ByZXBhcmVfZGVsZXRlKHN0cnVjdCBuaWxmc19ibWFwICpidHJlZSwKIAkJCQkgICAgICBzdHJ1Y3QgbmlsZnNfYnRyZWVfcGF0aCAqcGF0aCwKQEAgLTEzNTYsMjAgKzEzNjEsMTkgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBuaWxmc19idHJlZV9ub2RlICpub2RlLCAqcGFyZW50LCAqc2liOwogCV9fdTY0IHNpYnB0cjsKLQlpbnQgcGluZGV4LCBsZXZlbCwgbmNtaW4sIG5jbWF4LCBuY2JsaywgcmV0OworCWludCBwaW5kZXgsIGRpbmRleCwgbGV2ZWwsIG5jbWluLCBuY21heCwgbmNibGssIHJldDsKIAogCXJldCA9IDA7CiAJc3RhdHMtPmJzX25ibG9ja3MgPSAwOwogCW5jbWluID0gTklMRlNfQlRSRUVfTk9ERV9OQ0hJTERSRU5fTUlOKG5pbGZzX2J0cmVlX25vZGVfc2l6ZShidHJlZSkpOwogCW5jYmxrID0gbmlsZnNfYnRyZWVfbmNoaWxkcmVuX3Blcl9ibG9jayhidHJlZSk7CiAKLQlmb3IgKGxldmVsID0gTklMRlNfQlRSRUVfTEVWRUxfTk9ERV9NSU47CisJZm9yIChsZXZlbCA9IE5JTEZTX0JUUkVFX0xFVkVMX05PREVfTUlOLCBkaW5kZXggPSBwYXRoW2xldmVsXS5icF9pbmRleDsKIAkgICAgIGxldmVsIDwgbmlsZnNfYnRyZWVfaGVpZ2h0KGJ0cmVlKSAtIDE7CiAJICAgICBsZXZlbCsrKSB7CiAJCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAkJcGF0aFtsZXZlbF0uYnBfb2xkcmVxLmJwcl9wdHIgPQotCQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKG5vZGUsIHBhdGhbbGV2ZWxdLmJwX2luZGV4LAotCQkJCQkJIG5jYmxrKTsKKwkJCW5pbGZzX2J0cmVlX25vZGVfZ2V0X3B0cihub2RlLCBkaW5kZXgsIG5jYmxrKTsKIAkJcmV0ID0gbmlsZnNfYm1hcF9wcmVwYXJlX2VuZF9wdHIoYnRyZWUsCiAJCQkJCQkgJnBhdGhbbGV2ZWxdLmJwX29sZHJlcSwgZGF0KTsKIAkJaWYgKHJldCA8IDApCkBAIC0xMzgzLDYgKzEzODcsNyBAQAogCiAJCXBhcmVudCA9IG5pbGZzX2J0cmVlX2dldF9ub2RlKGJ0cmVlLCBwYXRoLCBsZXZlbCArIDEsICZuY21heCk7CiAJCXBpbmRleCA9IHBhdGhbbGV2ZWwgKyAxXS5icF9pbmRleDsKKwkJZGluZGV4ID0gcGluZGV4OwogCiAJCWlmIChwaW5kZXggPiAwKSB7CiAJCQkvKiBsZWZ0IHNpYmxpbmcgKi8KQEAgLTE0MjEsNiArMTQyNiwxNCBAQAogCQkJCXBhdGhbbGV2ZWxdLmJwX3NpYl9iaCA9IGJoOwogCQkJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfY29uY2F0X3JpZ2h0OwogCQkJCXN0YXRzLT5ic19uYmxvY2tzKys7CisJCQkJLyoKKwkJCQkgKiBXaGVuIG1lcmdpbmcgcmlnaHQgc2libGluZyBub2RlCisJCQkJICogaW50byB0aGUgY3VycmVudCBub2RlLCBwb2ludGVyIHRvCisJCQkJICogdGhlIHJpZ2h0IHNpYmxpbmcgbm9kZSBtdXN0IGJlCisJCQkJICogdGVybWluYXRlZCBpbnN0ZWFkLiAgVGhlIGFkanVzdG1lbnQKKwkJCQkgKiBiZWxvdyBpcyByZXF1aXJlZCBmb3IgdGhhdC4KKwkJCQkgKi8KKwkJCQlkaW5kZXggPSBwaW5kZXggKyAxOwogCQkJCS8qIGNvbnRpbnVlOyAqLwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTQzMSwyOSArMTQ0NCwzMSBAQAogCQkJICAgIE5JTEZTX0JUUkVFX1JPT1RfTkNISUxEUkVOX01BWCkgewogCQkJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfc2hyaW5rOwogCQkJCXN0YXRzLT5ic19uYmxvY2tzICs9IDI7CisJCQkJbGV2ZWwrKzsKKwkJCQlwYXRoW2xldmVsXS5icF9vcCA9IG5pbGZzX2J0cmVlX25vcDsKKwkJCQlnb3RvIHNocmlua19yb290X2NoaWxkOwogCQkJfSBlbHNlIHsKIAkJCQlwYXRoW2xldmVsXS5icF9vcCA9IG5pbGZzX2J0cmVlX2RvX2RlbGV0ZTsKIAkJCQlzdGF0cy0+YnNfbmJsb2NrcysrOworCQkJCWdvdG8gb3V0OwogCQkJfQotCi0JCQlnb3RvIG91dDsKLQogCQl9CiAJfQogCisJLyogY2hpbGQgb2YgdGhlIHJvb3Qgbm9kZSBpcyBkZWxldGVkICovCisJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9kb19kZWxldGU7CisJc3RhdHMtPmJzX25ibG9ja3MrKzsKKworc2hyaW5rX3Jvb3RfY2hpbGQ6CiAJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9yb290KGJ0cmVlKTsKIAlwYXRoW2xldmVsXS5icF9vbGRyZXEuYnByX3B0ciA9Ci0JCW5pbGZzX2J0cmVlX25vZGVfZ2V0X3B0cihub2RlLCBwYXRoW2xldmVsXS5icF9pbmRleCwKKwkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKG5vZGUsIGRpbmRleCwKIAkJCQkJIE5JTEZTX0JUUkVFX1JPT1RfTkNISUxEUkVOX01BWCk7CiAKIAlyZXQgPSBuaWxmc19ibWFwX3ByZXBhcmVfZW5kX3B0cihidHJlZSwgJnBhdGhbbGV2ZWxdLmJwX29sZHJlcSwgZGF0KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfb3V0X2NoaWxkX25vZGU7CiAKLQkvKiBjaGlsZCBvZiB0aGUgcm9vdCBub2RlIGlzIGRlbGV0ZWQgKi8KLQlwYXRoW2xldmVsXS5icF9vcCA9IG5pbGZzX2J0cmVlX2RvX2RlbGV0ZTsKLQlzdGF0cy0+YnNfbmJsb2NrcysrOwotCiAJLyogc3VjY2VzcyAqLwogIG91dDoKIAkqbGV2ZWxwID0gbGV2ZWw7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaW5vZGUuYyBiL2ZzL25pbGZzMi9pbm9kZS5jCmluZGV4IGI5NTQ4NzguLmI5YjQ1ZmMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pbm9kZS5jCisrKyBiL2ZzL25pbGZzMi9pbm9kZS5jCkBAIC04MDEsMTIgKzgwMSw3IEBACiAKIGludCBuaWxmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IG5pbGZzX3Jvb3QgKnJvb3Q7Ci0KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7Ci0KLQlyb290ID0gTklMRlNfSShpbm9kZSktPmlfcm9vdDsKKwlzdHJ1Y3QgbmlsZnNfcm9vdCAqcm9vdCA9IE5JTEZTX0koaW5vZGUpLT5pX3Jvb3Q7CiAJaWYgKChtYXNrICYgTUFZX1dSSVRFKSAmJiByb290ICYmCiAJICAgIHJvb3QtPmNubyAhPSBOSUxGU19DUFRSRUVfQ1VSUkVOVF9DTk8pCiAJCXJldHVybiAtRVJPRlM7IC8qIHNuYXBzaG90IGlzIG5vdCB3cml0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ21lbnQuYyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKaW5kZXggMTQxNjQ2ZS4uYmIyNGFiNiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ21lbnQuYworKysgYi9mcy9uaWxmczIvc2VnbWVudC5jCkBAIC0yNTczLDcgKzI1NzMsNyBAQAogCXNjaS0+c2Nfd2F0ZXJtYXJrID0gTklMRlNfU0NfREVGQVVMVF9XQVRFUk1BUks7CiAKIAlpZiAobmlsZnMtPm5zX2ludGVydmFsKQotCQlzY2ktPnNjX2ludGVydmFsID0gbmlsZnMtPm5zX2ludGVydmFsOworCQlzY2ktPnNjX2ludGVydmFsID0gSFogKiBuaWxmcy0+bnNfaW50ZXJ2YWw7CiAJaWYgKG5pbGZzLT5uc193YXRlcm1hcmspCiAJCXNjaS0+c2Nfd2F0ZXJtYXJrID0gbmlsZnMtPm5zX3dhdGVybWFyazsKIAlyZXR1cm4gc2NpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggY2RiYWY1ZS4uNTZmNjEwMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogCiAJc2ItPnNfbWFnaWMgPSBPQ0ZTMl9TVVBFUl9NQUdJQzsKIAotCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CisJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+KE1TX1BPU0lYQUNMIHwgTVNfTk9TRUMpKSB8CiAJCSgob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOwogCiAJLyogSGFyZCByZWFkb25seSBtb2RlIG9ubHkgaWY6IGJkZXZfcmVhZF9vbmx5LCBNU19SRE9OTFksCmRpZmYgLS1naXQgYS9mcy9vbWZzL2ZpbGUuYyBiL2ZzL29tZnMvZmlsZS5jCmluZGV4IGQ3MzhhN2UuLjJjNmQ5NTIgMTAwNjQ0Ci0tLSBhL2ZzL29tZnMvZmlsZS5jCisrKyBiL2ZzL29tZnMvZmlsZS5jCkBAIC00LDcgKzQsNiBAQAogICogUmVsZWFzZWQgdW5kZXIgR1BMIHYyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IGY4MmU3NjIuLmQ1NDVlOTcgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTI1NSwxMyArMjU1LDcgQEAKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkZXZfdG9fcGFydChkZXYpOwotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKLQl1bnNpZ25lZCBpbnQgYWxpZ25tZW50ID0gMDsKLQotCWlmIChkaXNrLT5xdWV1ZSkKLQkJYWxpZ25tZW50ID0gcXVldWVfbGltaXRfZGlzY2FyZF9hbGlnbm1lbnQoJmRpc2stPnF1ZXVlLT5saW1pdHMsCi0JCQkJCQkJCXAtPnN0YXJ0X3NlY3QpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhbGlnbm1lbnQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwLT5kaXNjYXJkX2FsaWdubWVudCk7CiB9CiAKIHNzaXplX3QgcGFydF9zdGF0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtNDU1LDYgKzQ0OSw4IEBACiAJcC0+c3RhcnRfc2VjdCA9IHN0YXJ0OwogCXAtPmFsaWdubWVudF9vZmZzZXQgPQogCQlxdWV1ZV9saW1pdF9hbGlnbm1lbnRfb2Zmc2V0KCZkaXNrLT5xdWV1ZS0+bGltaXRzLCBzdGFydCk7CisJcC0+ZGlzY2FyZF9hbGlnbm1lbnQgPQorCQlxdWV1ZV9saW1pdF9kaXNjYXJkX2FsaWdubWVudCgmZGlzay0+cXVldWUtPmxpbWl0cywgc3RhcnQpOwogCXAtPm5yX3NlY3RzID0gbGVuOwogCXAtPnBhcnRubyA9IHBhcnRubzsKIAlwLT5wb2xpY3kgPSBnZXRfZGlza19ybyhkaXNrKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggMTRkZWY5OS4uZmM1YmMyNyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTIxNjksMTEgKzIxNjksNyBAQAogICovCiBzdGF0aWMgaW50IHByb2NfZmRfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWludCBydjsKLQotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQlydiA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIE5VTEwpOworCWludCBydiA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIE5VTEwpOwogCWlmIChydiA9PSAwKQogCQlyZXR1cm4gMDsKIAlpZiAodGFza19waWQoY3VycmVudCkgPT0gcHJvY19waWQoaW5vZGUpKQpAQCAtMjcxMiw2ICsyNzA4LDkgQEAKIAlzdHJ1Y3QgdGFza19pb19hY2NvdW50aW5nIGFjY3QgPSB0YXNrLT5pb2FjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQUQpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwogCWlmICh3aG9sZSAmJiBsb2NrX3Rhc2tfc2lnaGFuZCh0YXNrLCAmZmxhZ3MpKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IHRhc2s7CiAKQEAgLTI4NDMsNyArMjg0Miw3IEBACiAJUkVHKCJjb3JlZHVtcF9maWx0ZXIiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfY29yZWR1bXBfZmlsdGVyX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RnaWRfaW9fYWNjb3VudGluZyksCisJSU5GKCJpbyIsCVNfSVJVU1IsIHByb2NfdGdpZF9pb19hY2NvdW50aW5nKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVJEV0FMTAogCUlORigiaGFyZHdhbGwiLCAgIFNfSVJVR08sIHByb2NfcGlkX2hhcmR3YWxsKSwKQEAgLTMxODUsNyArMzE4NCw3IEBACiAJUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfZmF1bHRfaW5qZWN0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RpZF9pb19hY2NvdW50aW5nKSwKKwlJTkYoImlvIiwJU19JUlVTUiwgcHJvY190aWRfaW9fYWNjb3VudGluZyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFSRFdBTEwKIAlJTkYoImhhcmR3YWxsIiwgICBTX0lSVUdPLCBwcm9jX3BpZF9oYXJkd2FsbCksCmRpZmYgLS1naXQgYS9mcy9wcm9jL25hbWVzcGFjZXMuYyBiL2ZzL3Byb2MvbmFtZXNwYWNlcy5jCmluZGV4IDc4MWRlYzUuLmJlMTc3ZjcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbmFtZXNwYWNlcy5jCisrKyBiL2ZzL3Byb2MvbmFtZXNwYWNlcy5jCkBAIC0zOCwxOCArMzgsMjEgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBwcm9jX2lub2RlICplaTsKIAlzdHJ1Y3QgZGVudHJ5ICplcnJvciA9IEVSUl9QVFIoLUVOT0VOVCk7CisJdm9pZCAqbnM7CiAKIAlpbm9kZSA9IHByb2NfcGlkX21ha2VfaW5vZGUoZGlyLT5pX3NiLCB0YXNrKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKIAorCW5zID0gbnNfb3BzLT5nZXQodGFzayk7CisJaWYgKCFucykKKwkJZ290byBvdXRfaXB1dDsKKwogCWVpID0gUFJPQ19JKGlub2RlKTsKIAlpbm9kZS0+aV9tb2RlID0gU19JRlJFR3xTX0lSVVNSOwogCWlub2RlLT5pX2ZvcCAgPSAmbnNfZmlsZV9vcGVyYXRpb25zOwogCWVpLT5uc19vcHMgICAgPSBuc19vcHM7Ci0JZWktPm5zCSAgICAgID0gbnNfb3BzLT5nZXQodGFzayk7Ci0JaWYgKCFlaS0+bnMpCi0JCWdvdG8gb3V0X2lwdXQ7CisJZWktPm5zCSAgICAgID0gbnM7CiAKIAlkZW50cnktPmRfb3AgPSAmcGlkX2RlbnRyeV9vcGVyYXRpb25zOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCmluZGV4IGY1MDEzM2MuLmQxNjdkZTMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYworKysgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKQEAgLTMwNCw5ICszMDQsNiBAQAogCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOwogCWludCBlcnJvcjsKIAotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQogCS8qIEV4ZWN1dGFibGUgZmlsZXMgYXJlIG5vdCBhbGxvd2VkIHVuZGVyIC9wcm9jL3N5cy8gKi8KIAlpZiAoKG1hc2sgJiBNQVlfRVhFQykgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIC1FQUNDRVM7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Jvb3QuYyBiL2ZzL3Byb2Mvcm9vdC5jCmluZGV4IGE5MDAwZTkuLmQ2YzNiNDEgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvcm9vdC5jCisrKyBiL2ZzL3Byb2Mvcm9vdC5jCkBAIC0yOCwxMSArMjgsMTIgQEAKIAogc3RhdGljIGludCBwcm9jX3NldF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKLQotCW5zID0gKHN0cnVjdCBwaWRfbmFtZXNwYWNlICopZGF0YTsKLQlzYi0+c19mc19pbmZvID0gZ2V0X3BpZF9ucyhucyk7Ci0JcmV0dXJuIHNldF9hbm9uX3N1cGVyKHNiLCBOVUxMKTsKKwlpbnQgZXJyID0gc2V0X2Fub25fc3VwZXIoc2IsIE5VTEwpOworCWlmICghZXJyKSB7CisJCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpucyA9IChzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqKWRhdGE7CisJCXNiLT5zX2ZzX2luZm8gPSBnZXRfcGlkX25zKG5zKTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0ci5jIGIvZnMvcmVpc2VyZnMveGF0dHIuYwppbmRleCBlOGE2MmY0Li5kNzgwODk2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0ci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKQEAgLTk1NCw4ICs5NTQsNiBAQAogCiBpbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKIAkvKgogCSAqIFdlIGRvbid0IGRvIHBlcm1pc3Npb24gY2hlY2tzIG9uIHRoZSBpbnRlcm5hbCBvYmplY3RzLgogCSAqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuCmRpZmYgLS1naXQgYS9mcy9yb21mcy9tbWFwLW5vbW11LmMgYi9mcy9yb21mcy9tbWFwLW5vbW11LmMKaW5kZXggZjA1MTFlOC4uZWVkOTk0MiAxMDA2NDQKLS0tIGEvZnMvcm9tZnMvbW1hcC1ub21tdS5jCisrKyBiL2ZzL3JvbWZzL21tYXAtbm9tbXUuYwpAQCAtMjcsMTQgKzI3LDE4IEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGlub2RlLT5pX3NiLT5zX210ZDsKLQl1bnNpZ25lZCBsb25nIGlzaXplLCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBpc2l6ZSwgb2Zmc2V0LCBtYXhwYWdlcywgbHBhZ2VzOwogCiAJaWYgKCFtdGQpCiAJCWdvdG8gY2FudF9tYXBfZGlyZWN0bHk7CiAKKwkvKiB0aGUgbWFwcGluZyBtdXN0bid0IGV4dGVuZCBiZXlvbmQgdGhlIEVPRiAqLworCWxwYWdlcyA9IChsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwogCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCW9mZnNldCA9IHBnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0JaWYgKG9mZnNldCA+IGlzaXplIHx8IGxlbiA+IGlzaXplIHx8IG9mZnNldCA+IGlzaXplIC0gbGVuKQorCisJbWF4cGFnZXMgPSAoaXNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCWlmICgocGdvZmYgPj0gbWF4cGFnZXMpIHx8IChtYXhwYWdlcyAtIHBnb2ZmIDwgbHBhZ2VzKSkKIAkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtRUlOVkFMOwogCiAJLyogd2UgbmVlZCB0byBjYWxsIGRvd24gdG8gdGhlIE1URCBsYXllciB0byBkbyB0aGUgYWN0dWFsIG1hcHBpbmcgKi8KZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IGM3NTU5MzkuLmFiM2Q2NzIgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtODIyLDcgKzgyMiw3IEBACiAJfSBlbHNlIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0JCXMtPnNfZmxhZ3MgPSBmbGFnczsKKwkJcy0+c19mbGFncyA9IGZsYWdzIHwgTVNfTk9TRUM7CiAJCXMtPnNfbW9kZSA9IG1vZGU7CiAJCXN0cmxjcHkocy0+c19pZCwgYmRldm5hbWUoYmRldiwgYiksIHNpemVvZihzLT5zX2lkKSk7CiAJCXNiX3NldF9ibG9ja3NpemUocywgYmxvY2tfc2l6ZShiZGV2KSk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9tb3VudC5jIGIvZnMvc3lzZnMvbW91bnQuYwppbmRleCAyNjY4OTU3Li5lMzRmMGQ5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9tb3VudC5jCisrKyBiL2ZzL3N5c2ZzL21vdW50LmMKQEAgLTk1LDYgKzk1LDE0IEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX3N5c2ZzX3N1cGVyX2luZm8oc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gKmluZm8pCit7CisJaW50IHR5cGU7CisJZm9yICh0eXBlID0gS09CSl9OU19UWVBFX05PTkU7IHR5cGUgPCBLT0JKX05TX1RZUEVTOyB0eXBlKyspCisJCWtvYmpfbnNfZHJvcCh0eXBlLCBpbmZvLT5uc1t0eXBlXSk7CisJa2ZyZWUoaW5mbyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzeXNmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewpAQCAtMTA4LDExICsxMTYsMTEgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlmb3IgKHR5cGUgPSBLT0JKX05TX1RZUEVfTk9ORTsgdHlwZSA8IEtPQkpfTlNfVFlQRVM7IHR5cGUrKykKLQkJaW5mby0+bnNbdHlwZV0gPSBrb2JqX25zX2N1cnJlbnQodHlwZSk7CisJCWluZm8tPm5zW3R5cGVdID0ga29ial9uc19ncmFiX2N1cnJlbnQodHlwZSk7CiAKIAlzYiA9IHNnZXQoZnNfdHlwZSwgc3lzZnNfdGVzdF9zdXBlciwgc3lzZnNfc2V0X3N1cGVyLCBpbmZvKTsKIAlpZiAoSVNfRVJSKHNiKSB8fCBzYi0+c19mc19pbmZvICE9IGluZm8pCi0JCWtmcmVlKGluZm8pOworCQlmcmVlX3N5c2ZzX3N1cGVyX2luZm8oaW5mbyk7CiAJaWYgKElTX0VSUihzYikpCiAJCXJldHVybiBFUlJfQ0FTVChzYik7CiAJaWYgKCFzYi0+c19yb290KSB7CkBAIC0xMzEsMTIgKzEzOSwxMSBAQAogc3RhdGljIHZvaWQgc3lzZnNfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBzeXNmc19zdXBlcl9pbmZvICppbmZvID0gc3lzZnNfaW5mbyhzYik7Ci0KIAkvKiBSZW1vdmUgdGhlIHN1cGVyYmxvY2sgZnJvbSBmc19zdXBlcnMvc19pbnN0YW5jZXMKIAkgKiBzbyB3ZSBjYW4ndCBmaW5kIGl0LCBiZWZvcmUgZnJlZWluZyBzeXNmc19zdXBlcl9pbmZvLgogCSAqLwogCWtpbGxfYW5vbl9zdXBlcihzYik7Ci0Ja2ZyZWUoaW5mbyk7CisJZnJlZV9zeXNmc19zdXBlcl9pbmZvKGluZm8pOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3lzZnNfZnNfdHlwZSA9IHsKQEAgLTE0NSwyOCArMTUyLDYgQEAKIAkua2lsbF9zYgk9IHN5c2ZzX2tpbGxfc2IsCiB9OwogCi12b2lkIHN5c2ZzX2V4aXRfbnMoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgY29uc3Qgdm9pZCAqbnMpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQotCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKLQlzcGluX2xvY2soJnNiX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzeXNmc19mc190eXBlLmZzX3N1cGVycywgc19pbnN0YW5jZXMpIHsKLQkJc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gKmluZm8gPSBzeXNmc19pbmZvKHNiKTsKLQkJLyoKLQkJICogSWYgd2Ugc2VlIGEgc3VwZXJibG9jayBvbiB0aGUgZnNfc3VwZXJzL3NfaW5zdGFuY2VzCi0JCSAqIGxpc3QgdGhlIHVubW91bnQgaGFzIG5vdCBjb21wbGV0ZWQgYW5kIHNiLT5zX2ZzX2luZm8KLQkJICogcG9pbnRzIHRvIGEgdmFsaWQgc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8uCi0JCSAqLwotCQkvKiBJZ25vcmUgc3VwZXJibG9ja3Mgd2l0aCB0aGUgd3JvbmcgbnMgKi8KLQkJaWYgKGluZm8tPm5zW3R5cGVdICE9IG5zKQotCQkJY29udGludWU7Ci0JCWluZm8tPm5zW3R5cGVdID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2soJnNiX2xvY2spOwotCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOwotfQotCiBpbnQgX19pbml0IHN5c2ZzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5c2ZzLmggYi9mcy9zeXNmcy9zeXNmcy5oCmluZGV4IDNkMjhhZjMxLi4yZWQyNDA0IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeXNmcy5oCisrKyBiL2ZzL3N5c2ZzL3N5c2ZzLmgKQEAgLTEzNiw3ICsxMzYsNyBAQAogICogaW5zdGFuY2UpLgogICovCiBzdHJ1Y3Qgc3lzZnNfc3VwZXJfaW5mbyB7Ci0JY29uc3Qgdm9pZCAqbnNbS09CSl9OU19UWVBFU107CisJdm9pZCAqbnNbS09CSl9OU19UWVBFU107CiB9OwogI2RlZmluZSBzeXNmc19pbmZvKFNCKSAoKHN0cnVjdCBzeXNmc19zdXBlcl9pbmZvICopKFNCLT5zX2ZzX2luZm8pKQogZXh0ZXJuIHN0cnVjdCBzeXNmc19kaXJlbnQgc3lzZnNfcm9vdDsKZGlmZiAtLWdpdCBhL2ZzL3RpbWVyZmQuYyBiL2ZzL3RpbWVyZmQuYwppbmRleCBmNjdhY2JkLi5kZmZlYjM3IDEwMDY0NAotLS0gYS9mcy90aW1lcmZkLmMKKysrIGIvZnMvdGltZXJmZC5jCkBAIC02MSw3ICs2MSw5IEBACiAKIC8qCiAgKiBDYWxsZWQgd2hlbiB0aGUgY2xvY2sgd2FzIHNldCB0byBjYW5jZWwgdGhlIHRpbWVycyBpbiB0aGUgY2FuY2VsCi0gKiBsaXN0LgorICogbGlzdC4gVGhpcyB3aWxsIHdha2UgdXAgcHJvY2Vzc2VzIHdhaXRpbmcgb24gdGhlc2UgdGltZXJzLiBUaGUKKyAqIHdha2UtdXAgcmVxdWlyZXMgY3R4LT50aWNrcyB0byBiZSBub24gemVybywgdGhlcmVmb3JlIHdlIGluY3JlbWVudAorICogaXQgYmVmb3JlIGNhbGxpbmcgd2FrZV91cF9sb2NrZWQoKS4KICAqLwogdm9pZCB0aW1lcmZkX2Nsb2NrX3dhc19zZXQodm9pZCkKIHsKQEAgLTc2LDYgKzc4LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+d3FoLmxvY2ssIGZsYWdzKTsKIAkJaWYgKGN0eC0+bW9mZnMudHY2NCAhPSBtb2Zmcy50djY0KSB7CiAJCQljdHgtPm1vZmZzLnR2NjQgPSBLVElNRV9NQVg7CisJCQljdHgtPnRpY2tzKys7CiAJCQl3YWtlX3VwX2xvY2tlZCgmY3R4LT53cWgpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+d3FoLmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2NvbW1pdC5jIGIvZnMvdWJpZnMvY29tbWl0LmMKaW5kZXggODdjZDBlYS4uZmIzYjVjOCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvY29tbWl0LmMKKysrIGIvZnMvdWJpZnMvY29tbWl0LmMKQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiBJZiB0aGUgcm9vdCBUTkMgbm9kZSBpcyBkaXJ0eSwgd2UgZGVmaW5pdGVseSBoYXZlIHNvbWV0aGluZyB0bwogCSAqIGNvbW1pdC4KIAkgKi8KLQlpZiAoYy0+enJvb3Quem5vZGUgJiYgdGVzdF9iaXQoRElSVFlfWk5PREUsICZjLT56cm9vdC56bm9kZS0+ZmxhZ3MpKQorCWlmIChjLT56cm9vdC56bm9kZSAmJiB1Ymlmc196bl9kaXJ0eShjLT56cm9vdC56bm9kZSkpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTQxOCw3ICs0MTgsNyBAQAogCiAJc3Bpbl9sb2NrKCZjLT5jc19sb2NrKTsKIAlpZiAoYy0+Y210X3N0YXRlID09IENPTU1JVF9CUk9LRU4pIHsKLQkJZXJyID0gLUVJTlZBTDsKKwkJZXJyID0gLUVST0ZTOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCSAqIHJlLWNoZWNrIGl0LgogCSAqLwogCWlmIChjLT5jbXRfc3RhdGUgPT0gQ09NTUlUX0JST0tFTikgewotCQllcnIgPSAtRUlOVkFMOworCQllcnIgPSAtRVJPRlM7CiAJCWdvdG8gb3V0X2NtdF91bmxvY2s7CiAJfQogCkBAIC01NzYsNyArNTc2LDcgQEAKIAlzdHJ1Y3QgaWR4X25vZGUgKmk7CiAJc2l6ZV90IHN6OwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX09MRF9JRFgpKQorCWlmICghZGJnX2lzX2Noa19pbmRleChjKSkKIAkJcmV0dXJuIDA7CiAKIAlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9kZWJ1Zy5jIGIvZnMvdWJpZnMvZGVidWcuYwppbmRleCAwYmIyYmNlLi5lZWYxMDlhIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9kZWJ1Zy5jCisrKyBiL2ZzL3ViaWZzL2RlYnVnLmMKQEAgLTI3LDEzICsyNywxMiBAQAogICogdmFyaW91cyBsb2NhbCBmdW5jdGlvbnMgb2YgdGhvc2Ugc3Vic3lzdGVtcy4KICAqLwogCi0jZGVmaW5lIFVCSUZTX0RCR19QUkVTRVJWRV9VQkkKLQotI2luY2x1ZGUgInViaWZzLmgiCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgInViaWZzLmgiCiAKICNpZmRlZiBDT05GSUdfVUJJRlNfRlNfREVCVUcKIApAQCAtNDIsMTUgKzQxLDYgQEAKIHN0YXRpYyBjaGFyIGRiZ19rZXlfYnVmMFsxMjhdOwogc3RhdGljIGNoYXIgZGJnX2tleV9idWYxWzEyOF07CiAKLXVuc2lnbmVkIGludCB1Ymlmc19jaGtfZmxhZ3M7Ci11bnNpZ25lZCBpbnQgdWJpZnNfdHN0X2ZsYWdzOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfY2hrcywgdWJpZnNfY2hrX2ZsYWdzLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfdHN0cywgdWJpZnNfdHN0X2ZsYWdzLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci0KLU1PRFVMRV9QQVJNX0RFU0MoZGVidWdfY2hrcywgIkRlYnVnIGNoZWNrIGZsYWdzIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnX3RzdHMsICJEZWJ1ZyBzcGVjaWFsIHRlc3QgZmxhZ3MiKTsKLQogc3RhdGljIGNvbnN0IGNoYXIgKmdldF9rZXlfZm10KGludCBmbXQpCiB7CiAJc3dpdGNoIChmbXQpIHsKQEAgLTkxLDYgKzgxLDI4IEBACiAJfQogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2RlbnRfdHlwZShpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFVCSUZTX0lUWVBFX1JFRzoKKwkJcmV0dXJuICJmaWxlIjsKKwljYXNlIFVCSUZTX0lUWVBFX0RJUjoKKwkJcmV0dXJuICJkaXIiOworCWNhc2UgVUJJRlNfSVRZUEVfTE5LOgorCQlyZXR1cm4gInN5bWxpbmsiOworCWNhc2UgVUJJRlNfSVRZUEVfQkxLOgorCQlyZXR1cm4gImJsa2RldiI7CisJY2FzZSBVQklGU19JVFlQRV9DSFI6CisJCXJldHVybiAiY2hhciBkZXYiOworCWNhc2UgVUJJRlNfSVRZUEVfRklGTzoKKwkJcmV0dXJuICJmaWZvIjsKKwljYXNlIFVCSUZTX0lUWVBFX1NPQ0s6CisJCXJldHVybiAic29ja2V0IjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24vaW52YWxpZCB0eXBlIjsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHNwcmludGZfa2V5KGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCB1bmlvbiB1Ymlmc19rZXkgKmtleSwKIAkJCWNoYXIgKmJ1ZmZlcikKIHsKQEAgLTIzNCw5ICsyNDYsMTMgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiXHRsZW4gICAgICAgICAgICAldVxuIiwgbGUzMl90b19jcHUoY2gtPmxlbikpOwogfQogCi12b2lkIGRiZ19kdW1wX2lub2RlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQordm9pZCBkYmdfZHVtcF9pbm9kZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAljb25zdCBzdHJ1Y3QgdWJpZnNfaW5vZGUgKnVpID0gdWJpZnNfaW5vZGUoaW5vZGUpOworCXN0cnVjdCBxc3RyIG5tID0geyAubmFtZSA9IE5VTEwgfTsKKwl1bmlvbiB1Ymlmc19rZXkga2V5OworCXN0cnVjdCB1Ymlmc19kZW50X25vZGUgKmRlbnQsICpwZGVudCA9IE5VTEw7CisJaW50IGNvdW50ID0gMjsKIAogCXByaW50ayhLRVJOX0RFQlVHICJEdW1wIGluLW1lbW9yeSBpbm9kZToiKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiXHRpbm9kZSAgICAgICAgICAlbHVcbiIsIGlub2RlLT5pX2lubyk7CkBAIC0yNzAsNiArMjg2LDMyIEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIlx0bGFzdF9wYWdlX3JlYWQgJWx1XG4iLCB1aS0+bGFzdF9wYWdlX3JlYWQpOwogCXByaW50ayhLRVJOX0RFQlVHICJcdHJlYWRfaW5fYV9yb3cgICVsdVxuIiwgdWktPnJlYWRfaW5fYV9yb3cpOwogCXByaW50ayhLRVJOX0RFQlVHICJcdGRhdGFfbGVuICAgICAgICVkXG4iLCB1aS0+ZGF0YV9sZW4pOworCisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9ERUJVRyAiTGlzdCBvZiBkaXJlY3RvcnkgZW50cmllczpcbiIpOworCXViaWZzX2Fzc2VydCghbXV0ZXhfaXNfbG9ja2VkKCZjLT50bmNfbXV0ZXgpKTsKKworCWxvd2VzdF9kZW50X2tleShjLCAma2V5LCBpbm9kZS0+aV9pbm8pOworCXdoaWxlICgxKSB7CisJCWRlbnQgPSB1Ymlmc190bmNfbmV4dF9lbnQoYywgJmtleSwgJm5tKTsKKwkJaWYgKElTX0VSUihkZW50KSkgeworCQkJaWYgKFBUUl9FUlIoZGVudCkgIT0gLUVOT0VOVCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgJWxkXG4iLCBQVFJfRVJSKGRlbnQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlx0JWQ6ICVzICglcylcbiIsCisJCSAgICAgICBjb3VudCsrLCBkZW50LT5uYW1lLCBnZXRfZGVudF90eXBlKGRlbnQtPnR5cGUpKTsKKworCQlubS5uYW1lID0gZGVudC0+bmFtZTsKKwkJbm0ubGVuID0gbGUxNl90b19jcHUoZGVudC0+bmxlbik7CisJCWtmcmVlKHBkZW50KTsKKwkJcGRlbnQgPSBkZW50OworCQlrZXlfcmVhZChjLCAmZGVudC0+a2V5LCAma2V5KTsKKwl9CisJa2ZyZWUocGRlbnQpOwogfQogCiB2b2lkIGRiZ19kdW1wX25vZGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHZvaWQgKm5vZGUpCkBAIC0yNzgsNyArMzIwLDcgQEAKIAl1bmlvbiB1Ymlmc19rZXkga2V5OwogCWNvbnN0IHN0cnVjdCB1Ymlmc19jaCAqY2ggPSBub2RlOwogCi0JaWYgKGRiZ19mYWlsdXJlX21vZGUpCisJaWYgKGRiZ19pc190c3RfcmN2cnkoYykpCiAJCXJldHVybjsKIAogCS8qIElmIHRoZSBtYWdpYyBpcyBpbmNvcnJlY3QsIGp1c3QgaGV4ZHVtcCB0aGUgZmlyc3QgYnl0ZXMgKi8KQEAgLTgzNCw3ICs4NzYsNyBAQAogCXN0cnVjdCB1Ymlmc19zY2FuX25vZGUgKnNub2Q7CiAJdm9pZCAqYnVmOwogCi0JaWYgKGRiZ19mYWlsdXJlX21vZGUpCisJaWYgKGRiZ19pc190c3RfcmN2cnkoYykpCiAJCXJldHVybjsKIAogCXByaW50ayhLRVJOX0RFQlVHICIocGlkICVkKSBzdGFydCBkdW1waW5nIExFQiAlZFxuIiwKQEAgLTEwODAsNiArMTEyMiw3IEBACiAKIC8qKgogICogZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUgLSBjaGVjayBzeW5jaHJvbml6ZWQgaW5vZGUgc2l6ZS4KKyAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBpbm9kZTogaW5vZGUgdG8gY2hlY2sKICAqCiAgKiBJZiBpbm9kZSBpcyBjbGVhbiwgc3luY2hyb25pemVkIGlub2RlIHNpemUgaGFzIHRvIGJlIGVxdWl2YWxlbnQgdG8gY3VycmVudApAQCAtMTA4NywxMiArMTEzMCwxMiBAQAogICogaGFzIHRvIGJlIGxvY2tlZCkuIFJldHVybnMgJTAgaWYgc3luY2hyb25pemVkIGlub2RlIHNpemUgaWYgY29ycmVjdCwgYW5kCiAgKiAlLUVJTlZBTCBpZiBub3QuCiAgKi8KLWludCBkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoraW50IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCBlcnIgPSAwOwogCXN0cnVjdCB1Ymlmc19pbm9kZSAqdWkgPSB1Ymlmc19pbm9kZShpbm9kZSk7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpKQogCQlyZXR1cm4gMDsKIAlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAwOwpAQCAtMTEyNSw3ICsxMTY4LDcgQEAKICAqIE5vdGUsIGl0IGlzIGdvb2QgaWRlYSB0byBtYWtlIHN1cmUgdGhlIEBkaXItPmlfbXV0ZXggaXMgbG9ja2VkIGJlZm9yZQogICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCi1pbnQgZGJnX2NoZWNrX2Rpcl9zaXplKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcikKK2ludCBkYmdfY2hlY2tfZGlyKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKIAl1bnNpZ25lZCBpbnQgbmxpbmsgPSAyOwogCXVuaW9uIHViaWZzX2tleSBrZXk7CkBAIC0xMTMzLDcgKzExNzYsNyBAQAogCXN0cnVjdCBxc3RyIG5tID0geyAubmFtZSA9IE5VTEwgfTsKIAlsb2ZmX3Qgc2l6ZSA9IFVCSUZTX0lOT19OT0RFX1NaOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0dFTikpCisJaWYgKCFkYmdfaXNfY2hrX2dlbihjKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQpAQCAtMTE2NywxMiArMTIxMCwxNCBAQAogCQkJICAiYnV0IGNhbGN1bGF0ZWQgc2l6ZSBpcyAlbGx1IiwgZGlyLT5pX2lubywKIAkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpX3NpemVfcmVhZChkaXIpLAogCQkJICAodW5zaWduZWQgbG9uZyBsb25nKXNpemUpOworCQlkYmdfZHVtcF9pbm9kZShjLCBkaXIpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoZGlyLT5pX25saW5rICE9IG5saW5rKSB7CiAJCXViaWZzX2VycigiZGlyZWN0b3J5IGlub2RlICVsdSBoYXMgbmxpbmsgJXUsIGJ1dCBjYWxjdWxhdGVkICIKIAkJCSAgIm5saW5rIGlzICV1IiwgZGlyLT5pX2lubywgZGlyLT5pX25saW5rLCBubGluayk7CisJCWRiZ19kdW1wX2lub2RlKGMsIGRpcik7CiAJCWR1bXBfc3RhY2soKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTQ4OSw3ICsxNTM0LDcgQEAKIAlsb25nIGNsZWFuX2NudCA9IDAsIGRpcnR5X2NudCA9IDA7CiAJaW50IGVyciwgbGFzdDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19UTkMpKQorCWlmICghZGJnX2lzX2Noa19pbmRleChjKSkKIAkJcmV0dXJuIDA7CiAKIAl1Ymlmc19hc3NlcnQobXV0ZXhfaXNfbG9ja2VkKCZjLT50bmNfbXV0ZXgpKTsKQEAgLTE3MzYsNyArMTc4MSw3IEBACiAJaW50IGVycjsKIAlsb25nIGxvbmcgY2FsYyA9IDA7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfSURYX1NaKSkKKwlpZiAoIWRiZ19pc19jaGtfaW5kZXgoYykpCiAJCXJldHVybiAwOwogCiAJZXJyID0gZGJnX3dhbGtfaW5kZXgoYywgTlVMTCwgYWRkX3NpemUsICZjYWxjKTsKQEAgLTIzMTIsNyArMjM1Nyw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgZnNja19kYXRhIGZzY2tkOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0ZTKSkKKwlpZiAoIWRiZ19pc19jaGtfZnMoYykpCiAJCXJldHVybiAwOwogCiAJZnNja2QuaW5vZGVzID0gUkJfUk9PVDsKQEAgLTIzNDcsNyArMjM5Miw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqY3VyOwogCXN0cnVjdCB1Ymlmc19zY2FuX25vZGUgKnNhLCAqc2I7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpKQogCQlyZXR1cm4gMDsKIAogCWZvciAoY3VyID0gaGVhZC0+bmV4dDsgY3VyLT5uZXh0ICE9IGhlYWQ7IGN1ciA9IGN1ci0+bmV4dCkgewpAQCAtMjQxNCw3ICsyNDU5LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CiAJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc2EsICpzYjsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykpCiAJCXJldHVybiAwOwogCiAJZm9yIChjdXIgPSBoZWFkLT5uZXh0OyBjdXItPm5leHQgIT0gaGVhZDsgY3VyID0gY3VyLT5uZXh0KSB7CkBAIC0yNDkxLDIxNCArMjUzNiwxNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRiZ19mb3JjZV9pbl90aGVfZ2Fwcyh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgY2hhbmNlKHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgb3V0X29mKQogewotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQotCQlyZXR1cm4gMDsKKwlyZXR1cm4gISEoKHJhbmRvbTMyKCkgJSBvdXRfb2YpICsgMSA8PSBuKTsKIAotCXJldHVybiAhKHJhbmRvbTMyKCkgJiA3KTsKIH0KIAotLyogRmFpbHVyZSBtb2RlIGZvciByZWNvdmVyeSB0ZXN0aW5nICovCi0KLSNkZWZpbmUgY2hhbmNlKG4sIGQpIChzaW1wbGVfcmFuZCgpIDw9IChuKSAqIDMyNzY4TEwgLyAoZCkpCi0KLXN0cnVjdCBmYWlsdXJlX21vZGVfaW5mbyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCB1Ymlmc19pbmZvICpjOwotfTsKLQotc3RhdGljIExJU1RfSEVBRChmbWlfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZtaV9sb2NrKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBuZXh0OwotCi1zdGF0aWMgaW50IHNpbXBsZV9yYW5kKHZvaWQpCitzdGF0aWMgaW50IHBvd2VyX2N1dF9lbXVsYXRlZChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGludCB3cml0ZSkKIHsKLQlpZiAobmV4dCA9PSAwKQotCQluZXh0ID0gY3VycmVudC0+cGlkOwotCW5leHQgPSBuZXh0ICogMTEwMzUxNTI0NSArIDEyMzQ1OwotCXJldHVybiAobmV4dCA+PiAxNikgJiAzMjc2NzsKLX0KKwlzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyAqZCA9IGMtPmRiZzsKIAotc3RhdGljIHZvaWQgZmFpbHVyZV9tb2RlX2luaXQoc3RydWN0IHViaWZzX2luZm8gKmMpCi17Ci0Jc3RydWN0IGZhaWx1cmVfbW9kZV9pbmZvICpmbWk7CisJdWJpZnNfYXNzZXJ0KGRiZ19pc190c3RfcmN2cnkoYykpOwogCi0JZm1pID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZhaWx1cmVfbW9kZV9pbmZvKSwgR0ZQX05PRlMpOwotCWlmICghZm1pKSB7Ci0JCXViaWZzX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIGZhaWx1cmUgbW9kZSAtIG5vIG1lbW9yeSIpOwotCQlyZXR1cm47Ci0JfQotCWZtaS0+YyA9IGM7Ci0Jc3Bpbl9sb2NrKCZmbWlfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmZm1pLT5saXN0LCAmZm1pX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZmbWlfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZhaWx1cmVfbW9kZV9leGl0KHN0cnVjdCB1Ymlmc19pbmZvICpjKQotewotCXN0cnVjdCBmYWlsdXJlX21vZGVfaW5mbyAqZm1pLCAqdG1wOwotCi0Jc3Bpbl9sb2NrKCZmbWlfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZtaSwgdG1wLCAmZm1pX2xpc3QsIGxpc3QpCi0JCWlmIChmbWktPmMgPT0gYykgewotCQkJbGlzdF9kZWwoJmZtaS0+bGlzdCk7Ci0JCQlrZnJlZShmbWkpOwotCQl9Ci0Jc3Bpbl91bmxvY2soJmZtaV9sb2NrKTsKLX0KLQotc3RhdGljIHN0cnVjdCB1Ymlmc19pbmZvICpkYmdfZmluZF9pbmZvKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGZhaWx1cmVfbW9kZV9pbmZvICpmbWk7Ci0KLQlzcGluX2xvY2soJmZtaV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZtaSwgJmZtaV9saXN0LCBsaXN0KQotCQlpZiAoZm1pLT5jLT51YmkgPT0gZGVzYykgewotCQkJc3RydWN0IHViaWZzX2luZm8gKmMgPSBmbWktPmM7Ci0KLQkJCXNwaW5fdW5sb2NrKCZmbWlfbG9jayk7Ci0JCQlyZXR1cm4gYzsKLQkJfQotCXNwaW5fdW5sb2NrKCZmbWlfbG9jayk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fZmFpbHVyZV9tb2RlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IHViaWZzX2luZm8gKmMgPSBkYmdfZmluZF9pbmZvKGRlc2MpOwotCi0JaWYgKGMgJiYgZGJnX2ZhaWx1cmVfbW9kZSkKLQkJcmV0dXJuIGMtPmRiZy0+ZmFpbHVyZV9tb2RlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRvX2ZhaWwoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGludCB3cml0ZSkKLXsKLQlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGRiZ19maW5kX2luZm8oZGVzYyk7Ci0Jc3RydWN0IHViaWZzX2RlYnVnX2luZm8gKmQ7Ci0KLQlpZiAoIWMgfHwgIWRiZ19mYWlsdXJlX21vZGUpCi0JCXJldHVybiAwOwotCWQgPSBjLT5kYmc7Ci0JaWYgKGQtPmZhaWx1cmVfbW9kZSkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFkLT5mYWlsX2NudCkgewotCQkvKiBGaXJzdCBjYWxsIC0gZGVjaWRlIGRlbGF5IHRvIGZhaWx1cmUgKi8KKwlpZiAoIWQtPnBjX2NudCkgeworCQkvKiBGaXJzdCBjYWxsIC0gZGVjaWRlIGRlbGF5IHRvIHRoZSBwb3dlciBjdXQgKi8KIAkJaWYgKGNoYW5jZSgxLCAyKSkgewotCQkJdW5zaWduZWQgaW50IGRlbGF5ID0gMSA8PCAoc2ltcGxlX3JhbmQoKSA+PiAxMSk7CisJCQl1bnNpZ25lZCBsb25nIGRlbGF5OwogCiAJCQlpZiAoY2hhbmNlKDEsIDIpKSB7Ci0JCQkJZC0+ZmFpbF9kZWxheSA9IDE7Ci0JCQkJZC0+ZmFpbF90aW1lb3V0ID0gamlmZmllcyArCi0JCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpOwotCQkJCWRiZ19yY3ZyeSgiZmFpbGluZyBhZnRlciAldW1zIiwgZGVsYXkpOworCQkJCWQtPnBjX2RlbGF5ID0gMTsKKwkJCQkvKiBGYWlsIHdpdGhpbmcgMSBtaW51dGUgKi8KKwkJCQlkZWxheSA9IHJhbmRvbTMyKCkgJSA2MDAwMDsKKwkJCQlkLT5wY190aW1lb3V0ID0gamlmZmllczsKKwkJCQlkLT5wY190aW1lb3V0ICs9IG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpOworCQkJCXViaWZzX3dhcm4oImZhaWxpbmcgYWZ0ZXIgJWx1bXMiLCBkZWxheSk7CiAJCQl9IGVsc2UgewotCQkJCWQtPmZhaWxfZGVsYXkgPSAyOwotCQkJCWQtPmZhaWxfY250X21heCA9IGRlbGF5OwotCQkJCWRiZ19yY3ZyeSgiZmFpbGluZyBhZnRlciAldSBjYWxscyIsIGRlbGF5KTsKKwkJCQlkLT5wY19kZWxheSA9IDI7CisJCQkJZGVsYXkgPSByYW5kb20zMigpICUgMTAwMDA7CisJCQkJLyogRmFpbCB3aXRoaW4gMTAwMDAgb3BlcmF0aW9ucyAqLworCQkJCWQtPnBjX2NudF9tYXggPSBkZWxheTsKKwkJCQl1Ymlmc193YXJuKCJmYWlsaW5nIGFmdGVyICVsdSBjYWxscyIsIGRlbGF5KTsKIAkJCX0KIAkJfQotCQlkLT5mYWlsX2NudCArPSAxOworCisJCWQtPnBjX2NudCArPSAxOwogCX0KKwogCS8qIERldGVybWluZSBpZiBmYWlsdXJlIGRlbGF5IGhhcyBleHBpcmVkICovCi0JaWYgKGQtPmZhaWxfZGVsYXkgPT0gMSkgewotCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZC0+ZmFpbF90aW1lb3V0KSkKKwlpZiAoZC0+cGNfZGVsYXkgPT0gMSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBkLT5wY190aW1lb3V0KSkKIAkJCXJldHVybiAwOwotCX0gZWxzZSBpZiAoZC0+ZmFpbF9kZWxheSA9PSAyKQotCQlpZiAoZC0+ZmFpbF9jbnQrKyA8IGQtPmZhaWxfY250X21heCkKKwlpZiAoZC0+cGNfZGVsYXkgPT0gMiAmJiBkLT5wY19jbnQrKyA8IGQtPnBjX2NudF9tYXgpCiAJCQlyZXR1cm4gMDsKKwogCWlmIChsbnVtID09IFVCSUZTX1NCX0xOVU0pIHsKLQkJaWYgKHdyaXRlKSB7Ci0JCQlpZiAoY2hhbmNlKDEsIDIpKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKGNoYW5jZSgxOSwgMjApKQorCQlpZiAod3JpdGUgJiYgY2hhbmNlKDEsIDIpKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBzdXBlciBibG9jayBMRUIgJWQiLCBsbnVtKTsKKwkJaWYgKGNoYW5jZSgxOSwgMjApKQorCQkJcmV0dXJuIDA7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gc3VwZXIgYmxvY2sgTEVCICVkIiwgbG51bSk7CiAJfSBlbHNlIGlmIChsbnVtID09IFVCSUZTX01TVF9MTlVNIHx8IGxudW0gPT0gVUJJRlNfTVNUX0xOVU0gKyAxKSB7CiAJCWlmIChjaGFuY2UoMTksIDIwKSkKIAkJCXJldHVybiAwOwotCQlkYmdfcmN2cnkoImZhaWxpbmcgaW4gbWFzdGVyIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIG1hc3RlciBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPj0gVUJJRlNfTE9HX0xOVU0gJiYgbG51bSA8PSBjLT5sb2dfbGFzdCkgewotCQlpZiAod3JpdGUpIHsKLQkJCWlmIChjaGFuY2UoOTksIDEwMCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoY2hhbmNlKDM5OSwgNDAwKSkKKwkJaWYgKHdyaXRlICYmIGNoYW5jZSg5OSwgMTAwKSkKIAkJCXJldHVybiAwOwotCQlkYmdfcmN2cnkoImZhaWxpbmcgaW4gbG9nIExFQiAlZCIsIGxudW0pOworCQlpZiAoY2hhbmNlKDM5OSwgNDAwKSkKKwkJCXJldHVybiAwOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIGxvZyBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPj0gYy0+bHB0X2ZpcnN0ICYmIGxudW0gPD0gYy0+bHB0X2xhc3QpIHsKLQkJaWYgKHdyaXRlKSB7Ci0JCQlpZiAoY2hhbmNlKDcsIDgpKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKGNoYW5jZSgxOSwgMjApKQorCQlpZiAod3JpdGUgJiYgY2hhbmNlKDcsIDgpKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBMUFQgTEVCICVkIiwgbG51bSk7CisJCWlmIChjaGFuY2UoMTksIDIwKSkKKwkJCXJldHVybiAwOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIExQVCBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPj0gYy0+b3JwaF9maXJzdCAmJiBsbnVtIDw9IGMtPm9ycGhfbGFzdCkgewotCQlpZiAod3JpdGUpIHsKLQkJCWlmIChjaGFuY2UoMSwgMikpCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoY2hhbmNlKDksIDEwKSkKKwkJaWYgKHdyaXRlICYmIGNoYW5jZSgxLCAyKSkKIAkJCXJldHVybiAwOwotCQlkYmdfcmN2cnkoImZhaWxpbmcgaW4gb3JwaGFuIExFQiAlZCIsIGxudW0pOworCQlpZiAoY2hhbmNlKDksIDEwKSkKKwkJCXJldHVybiAwOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIG9ycGhhbiBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPT0gYy0+aWhlYWRfbG51bSkgewogCQlpZiAoY2hhbmNlKDk5LCAxMDApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBpbmRleCBoZWFkIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIGluZGV4IGhlYWQgTEVCICVkIiwgbG51bSk7CiAJfSBlbHNlIGlmIChjLT5qaGVhZHMgJiYgbG51bSA9PSBjLT5qaGVhZHNbR0NIRF0ud2J1Zi5sbnVtKSB7CiAJCWlmIChjaGFuY2UoOSwgMTApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBHQyBoZWFkIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIEdDIGhlYWQgTEVCICVkIiwgbG51bSk7CiAJfSBlbHNlIGlmICh3cml0ZSAmJiAhUkJfRU1QVFlfUk9PVCgmYy0+YnVkcykgJiYKIAkJICAgIXViaWZzX3NlYXJjaF9idWQoYywgbG51bSkpIHsKIAkJaWYgKGNoYW5jZSgxOSwgMjApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBub24tYnVkIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIG5vbi1idWQgTEVCICVkIiwgbG51bSk7CiAJfSBlbHNlIGlmIChjLT5jbXRfc3RhdGUgPT0gQ09NTUlUX1JVTk5JTkdfQkFDS0dST1VORCB8fAogCQkgICBjLT5jbXRfc3RhdGUgPT0gQ09NTUlUX1JVTk5JTkdfUkVRVUlSRUQpIHsKIAkJaWYgKGNoYW5jZSg5OTksIDEwMDApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBidWQgTEVCICVkIGNvbW1pdCBydW5uaW5nIiwgbG51bSk7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gYnVkIExFQiAlZCBjb21taXQgcnVubmluZyIsIGxudW0pOwogCX0gZWxzZSB7CiAJCWlmIChjaGFuY2UoOTk5OSwgMTAwMDApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBidWQgTEVCICVkIGNvbW1pdCBub3QgcnVubmluZyIsIGxudW0pOworCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIGJ1ZCBMRUIgJWQgY29tbWl0IG5vdCBydW5uaW5nIiwgbG51bSk7CiAJfQotCXViaWZzX2VycigiKioqIFNFVFRJTkcgRkFJTFVSRSBNT0RFIE9OIChMRUIgJWQpICoqKiIsIGxudW0pOwotCWQtPmZhaWx1cmVfbW9kZSA9IDE7CisKKwlkLT5wY19oYXBwZW5lZCA9IDE7CisJdWJpZnNfd2FybigiPT09PT09PT09PSBQb3dlciBjdXQgZW11bGF0ZWQgPT09PT09PT09PSIpOwogCWR1bXBfc3RhY2soKTsKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgY3V0X2RhdGEoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgY3V0X2RhdGEoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCWludCBmbGVuLCBpOworCXVuc2lnbmVkIGludCBmcm9tLCB0bywgaSwgZmZzID0gY2hhbmNlKDEsIDIpOwogCXVuc2lnbmVkIGNoYXIgKnAgPSAodm9pZCAqKWJ1ZjsKIAotCWZsZW4gPSAobGVuICogKGxvbmcgbG9uZylzaW1wbGVfcmFuZCgpKSA+PiAxNTsKLQlmb3IgKGkgPSBmbGVuOyBpIDwgbGVuOyBpKyspCi0JCXBbaV0gPSAweGZmOworCWZyb20gPSByYW5kb20zMigpICUgKGxlbiArIDEpOworCWlmIChjaGFuY2UoMSwgMikpCisJCXRvID0gcmFuZG9tMzIoKSAlIChsZW4gLSBmcm9tICsgMSk7CisJZWxzZQorCQl0byA9IGxlbjsKKworCWlmIChmcm9tIDwgdG8pCisJCXViaWZzX3dhcm4oImZpbGxlZCBieXRlcyAldS0ldSB3aXRoICVzIiwgZnJvbSwgdG8gLSAxLAorCQkJICAgZmZzID8gIjB4RkZzIiA6ICJyYW5kb20gZGF0YSIpOworCisJaWYgKGZmcykKKwkJZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyspCisJCQlwW2ldID0gMHhGRjsKKwllbHNlCisJCWZvciAoaSA9IGZyb207IGkgPCB0bzsgaSsrKQorCQkJcFtpXSA9IHJhbmRvbTMyKCkgJSAweDEwMDsKIH0KIAotaW50IGRiZ19sZWJfcmVhZChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY2hhciAqYnVmLCBpbnQgb2Zmc2V0LAotCQkgaW50IGxlbiwgaW50IGNoZWNrKQotewotCWlmIChpbl9mYWlsdXJlX21vZGUoZGVzYykpCi0JCXJldHVybiAtRVJPRlM7Ci0JcmV0dXJuIHViaV9sZWJfcmVhZChkZXNjLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCBjaGVjayk7Ci19Ci0KLWludCBkYmdfbGViX3dyaXRlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsCi0JCSAgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IGR0eXBlKQoraW50IGRiZ19sZWJfd3JpdGUoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsCisJCSAgaW50IG9mZnMsIGludCBsZW4sIGludCBkdHlwZSkKIHsKIAlpbnQgZXJyLCBmYWlsaW5nOwogCi0JaWYgKGluX2ZhaWx1cmVfbW9kZShkZXNjKSkKKwlpZiAoYy0+ZGJnLT5wY19oYXBwZW5lZCkKIAkJcmV0dXJuIC1FUk9GUzsKLQlmYWlsaW5nID0gZG9fZmFpbChkZXNjLCBsbnVtLCAxKTsKKworCWZhaWxpbmcgPSBwb3dlcl9jdXRfZW11bGF0ZWQoYywgbG51bSwgMSk7CiAJaWYgKGZhaWxpbmcpCiAJCWN1dF9kYXRhKGJ1ZiwgbGVuKTsKLQllcnIgPSB1YmlfbGViX3dyaXRlKGRlc2MsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIGR0eXBlKTsKKwllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4sIGR0eXBlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWlmIChmYWlsaW5nKQpAQCAtMjcwNiwxNjIgKzI2NzgsMjA3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkYmdfbGViX2NoYW5nZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLAoraW50IGRiZ19sZWJfY2hhbmdlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLAogCQkgICBpbnQgbGVuLCBpbnQgZHR5cGUpCiB7CiAJaW50IGVycjsKIAotCWlmIChkb19mYWlsKGRlc2MsIGxudW0sIDEpKQorCWlmIChjLT5kYmctPnBjX2hhcHBlbmVkKQogCQlyZXR1cm4gLUVST0ZTOwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGRlc2MsIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7CisJaWYgKHBvd2VyX2N1dF9lbXVsYXRlZChjLCBsbnVtLCAxKSkKKwkJcmV0dXJuIC1FUk9GUzsKKwllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlpZiAoZG9fZmFpbChkZXNjLCBsbnVtLCAxKSkKKwlpZiAocG93ZXJfY3V0X2VtdWxhdGVkKGMsIGxudW0sIDEpKQogCQlyZXR1cm4gLUVST0ZTOwogCXJldHVybiAwOwogfQogCi1pbnQgZGJnX2xlYl9lcmFzZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSkKK2ludCBkYmdfbGViX3VubWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSkKIHsKIAlpbnQgZXJyOwogCi0JaWYgKGRvX2ZhaWwoZGVzYywgbG51bSwgMCkpCisJaWYgKGMtPmRiZy0+cGNfaGFwcGVuZWQpCiAJCXJldHVybiAtRVJPRlM7Ci0JZXJyID0gdWJpX2xlYl9lcmFzZShkZXNjLCBsbnVtKTsKKwlpZiAocG93ZXJfY3V0X2VtdWxhdGVkKGMsIGxudW0sIDApKQorCQlyZXR1cm4gLUVST0ZTOworCWVyciA9IHViaV9sZWJfdW5tYXAoYy0+dWJpLCBsbnVtKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWlmIChkb19mYWlsKGRlc2MsIGxudW0sIDApKQorCWlmIChwb3dlcl9jdXRfZW11bGF0ZWQoYywgbG51bSwgMCkpCiAJCXJldHVybiAtRVJPRlM7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBkYmdfbGViX3VubWFwKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKQoraW50IGRiZ19sZWJfbWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IGR0eXBlKQogewogCWludCBlcnI7CiAKLQlpZiAoZG9fZmFpbChkZXNjLCBsbnVtLCAwKSkKKwlpZiAoYy0+ZGJnLT5wY19oYXBwZW5lZCkKIAkJcmV0dXJuIC1FUk9GUzsKLQllcnIgPSB1YmlfbGViX3VubWFwKGRlc2MsIGxudW0pOworCWlmIChwb3dlcl9jdXRfZW11bGF0ZWQoYywgbG51bSwgMCkpCisJCXJldHVybiAtRVJPRlM7CisJZXJyID0gdWJpX2xlYl9tYXAoYy0+dWJpLCBsbnVtLCBkdHlwZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlpZiAoZG9fZmFpbChkZXNjLCBsbnVtLCAwKSkKKwlpZiAocG93ZXJfY3V0X2VtdWxhdGVkKGMsIGxudW0sIDApKQogCQlyZXR1cm4gLUVST0ZTOwogCXJldHVybiAwOwogfQogCi1pbnQgZGJnX2lzX21hcHBlZChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSkKLXsKLQlpZiAoaW5fZmFpbHVyZV9tb2RlKGRlc2MpKQotCQlyZXR1cm4gLUVST0ZTOwotCXJldHVybiB1YmlfaXNfbWFwcGVkKGRlc2MsIGxudW0pOwotfQotCi1pbnQgZGJnX2xlYl9tYXAoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGludCBkdHlwZSkKLXsKLQlpbnQgZXJyOwotCi0JaWYgKGRvX2ZhaWwoZGVzYywgbG51bSwgMCkpCi0JCXJldHVybiAtRVJPRlM7Ci0JZXJyID0gdWJpX2xlYl9tYXAoZGVzYywgbG51bSwgZHR5cGUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JaWYgKGRvX2ZhaWwoZGVzYywgbG51bSwgMCkpCi0JCXJldHVybiAtRVJPRlM7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdWJpZnNfZGVidWdnaW5nX2luaXQgLSBpbml0aWFsaXplIFVCSUZTIGRlYnVnZ2luZy4KLSAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGRlYnVnZ2luZy1yZWxhdGVkIGRhdGEgZm9yIHRoZSBmaWxlIHN5c3RlbS4KLSAqIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCi0gKiBmYWlsdXJlLgotICovCi1pbnQgdWJpZnNfZGVidWdnaW5nX2luaXQoc3RydWN0IHViaWZzX2luZm8gKmMpCi17Ci0JYy0+ZGJnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHViaWZzX2RlYnVnX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWMtPmRiZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmYWlsdXJlX21vZGVfaW5pdChjKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB1Ymlmc19kZWJ1Z2dpbmdfZXhpdCAtIGZyZWUgZGVidWdnaW5nIGRhdGEuCi0gKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0Ci0gKi8KLXZvaWQgdWJpZnNfZGVidWdnaW5nX2V4aXQoc3RydWN0IHViaWZzX2luZm8gKmMpCi17Ci0JZmFpbHVyZV9tb2RlX2V4aXQoYyk7Ci0Ja2ZyZWUoYy0+ZGJnKTsKLX0KLQogLyoKICAqIFJvb3QgZGlyZWN0b3J5IGZvciBVQklGUyBzdHVmZiBpbiBkZWJ1Z2ZzLiBDb250YWlucyBzdWItZGlyZWN0b3JpZXMgd2hpY2gKICAqIGNvbnRhaW4gdGhlIHN0dWZmIHNwZWNpZmljIHRvIHBhcnRpY3VsYXIgZmlsZS1zeXN0ZW0gbW91bnRzLgogICovCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGZzX3Jvb3RkaXI7CiAKLS8qKgotICogZGJnX2RlYnVnZnNfaW5pdCAtIGluaXRpYWxpemUgZGVidWdmcyBmaWxlLXN5c3RlbS4KLSAqCi0gKiBVQklGUyB1c2VzIGRlYnVnZnMgZmlsZS1zeXN0ZW0gdG8gZXhwb3NlIHZhcmlvdXMgZGVidWdnaW5nIGtub2JzIHRvCi0gKiB1c2VyLXNwYWNlLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgInViaWZzIiBkaXJlY3RvcnkgaW4gdGhlIGRlYnVnZnMKLSAqIGZpbGUtc3lzdGVtLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KLSAqIGNhc2Ugb2YgZmFpbHVyZS4KLSAqLwotaW50IGRiZ19kZWJ1Z2ZzX2luaXQodm9pZCkKLXsKLQlkZnNfcm9vdGRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigidWJpZnMiLCBOVUxMKTsKLQlpZiAoSVNfRVJSKGRmc19yb290ZGlyKSkgewotCQlpbnQgZXJyID0gUFRSX0VSUihkZnNfcm9vdGRpcik7Ci0JCXViaWZzX2VycigiY2Fubm90IGNyZWF0ZSBcInViaWZzXCIgZGVidWdmcyBkaXJlY3RvcnksICIKLQkJCSAgImVycm9yICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGRiZ19kZWJ1Z2ZzX2V4aXQgLSByZW1vdmUgdGhlICJ1YmlmcyIgZGlyZWN0b3J5IGZyb20gZGVidWdmcyBmaWxlLXN5c3RlbS4KLSAqLwotdm9pZCBkYmdfZGVidWdmc19leGl0KHZvaWQpCi17Ci0JZGVidWdmc19yZW1vdmUoZGZzX3Jvb3RkaXIpOwotfQotCi1zdGF0aWMgaW50IG9wZW5fZGVidWdmc19maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBkZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQogCi1zdGF0aWMgc3NpemVfdCB3cml0ZV9kZWJ1Z2ZzX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKKy8qKgorICogcHJvdmlkZV91c2VyX291dHB1dCAtIHByb3ZpZGUgb3V0cHV0IHRvIHRoZSB1c2VyIHJlYWRpbmcgYSBkZWJ1Z2ZzIGZpbGUuCisgKiBAdmFsOiBib29sZWFuIHZhbHVlIGZvciB0aGUgYW5zd2VyCisgKiBAdTogdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgYW5zd2VyIGF0CisgKiBAY291bnQ6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHBwb3M6IHBvc2l0aW9uIGluIHRoZSBAdSBvdXRwdXQgYnVmZmVyCisgKgorICogVGhpcyBpcyBhIHNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggc3RvcmVzIEB2YWwgYm9vbGVhbiB2YWx1ZSBpbiB0aGUgdXNlcgorICogYnVmZmVyIHdoZW4gdGhlIHVzZXIgcmVhZHMgb25lIG9mIFVCSUZTIGRlYnVnZnMgZmlsZXMuIFJldHVybnMgYW1vdW50IG9mCisgKiBieXRlcyB3cml0dGVuIHRvIEB1IGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YKKyAqIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgcHJvdmlkZV91c2VyX291dHB1dChpbnQgdmFsLCBjaGFyIF9fdXNlciAqdSwgc2l6ZV90IGNvdW50LAorCQkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlszXTsKKworCWlmICh2YWwpCisJCWJ1ZlswXSA9ICcxJzsKKwllbHNlCisJCWJ1ZlswXSA9ICcwJzsKKwlidWZbMV0gPSAnXG4nOworCWJ1ZlsyXSA9IDB4MDA7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodSwgY291bnQsIHBwb3MsIGJ1ZiwgMik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRmc19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1LCBzaXplX3QgY291bnQsCisJCQkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyAqZCA9IGMtPmRiZzsKKwlpbnQgdmFsOworCisJaWYgKGRlbnQgPT0gZC0+ZGZzX2Noa19nZW4pCisJCXZhbCA9IGQtPmNoa19nZW47CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2luZGV4KQorCQl2YWwgPSBkLT5jaGtfaW5kZXg7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX29ycGgpCisJCXZhbCA9IGQtPmNoa19vcnBoOworCWVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX2Noa19scHJvcHMpCisJCXZhbCA9IGQtPmNoa19scHJvcHM7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2ZzKQorCQl2YWwgPSBkLT5jaGtfZnM7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfdHN0X3JjdnJ5KQorCQl2YWwgPSBkLT50c3RfcmN2cnk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBwcm92aWRlX3VzZXJfb3V0cHV0KHZhbCwgdSwgY291bnQsIHBwb3MpOworfQorCisvKioKKyAqIGludGVycHJldF91c2VyX2lucHV0IC0gaW50ZXJwcmV0IHVzZXIgZGVidWdmcyBmaWxlIGlucHV0LgorICogQHU6IHVzZXItcHJvdmlkZWQgYnVmZmVyIHdpdGggdGhlIGlucHV0CisgKiBAY291bnQ6IGJ1ZmZlciBzaXplCisgKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCBpbnRlcnByZXQgdXNlciBpbnB1dCB0byBhIGJvb2xlYW4gVUJJRlMKKyAqIGRlYnVnZnMgZmlsZS4gUmV0dXJucyAlMCBvciAlMSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICogaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGludGVycHJldF91c2VyX2lucHV0KGNvbnN0IGNoYXIgX191c2VyICp1LCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGJ1Zl9zaXplOworCWNoYXIgYnVmWzhdOworCisJYnVmX3NpemUgPSBtaW5fdChzaXplX3QsIGNvdW50LCAoc2l6ZW9mKGJ1ZikgLSAxKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdSwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChidWZbMF0gPT0gJzEnKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChidWZbMF0gPT0gJzAnKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdCBkZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnUsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyAqZCA9IGMtPmRiZzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKKwlpbnQgdmFsOwogCi0JaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gZC0+ZGZzX2R1bXBfbHByb3BzKQorCS8qCisJICogVE9ETzogdGhpcyBpcyByYWN5IC0gdGhlIGZpbGUtc3lzdGVtIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuCisJICogdW5tb3VudGVkIGFuZCB3ZSdkIG9vcHMgaW4gdGhpcyBjYXNlLiBUaGUgcGxhbiBpcyB0byBmaXggaXQgd2l0aAorCSAqIGhlbHAgb2YgJ2l0ZXJhdGVfc3VwZXJzX3R5cGUoKScgd2hpY2ggd2Ugc2hvdWxkIGhhdmUgaW4gdjMuMDogd2hlbgorCSAqIGEgZGVidWdmcyBvcGVuZWQsIHdlIHJlbWJlciBGUydzIFVVSUQgaW4gZmlsZS0+cHJpdmF0ZV9kYXRhLiBUaGVuCisJICogd2hlbmV2ZXIgd2UgYWNjZXNzIHRoZSBGUyB2aWEgYSBkZWJ1Z2ZzIGZpbGUsIHdlIGl0ZXJhdGUgYWxsIFVCSUZTCisJICogc3VwZXJibG9ja3MgYW5kIGZpbmUgdGhlIG9uZSB3aXRoIHRoZSBzYW1lIFVVSUQsIGFuZCB0YWtlIHRoZQorCSAqIGxvY2tpbmcgcmlnaHQuCisJICoKKwkgKiBUaGUgb3RoZXIgd2F5IHRvIGdvIHN1Z2dlc3RlZCBieSBBbCBWaXJvIGlzIHRvIGNyZWF0ZSBhIHNlcGFyYXRlCisJICogJ3ViaWZzLWRlYnVnJyBmaWxlLXN5c3RlbSBpbnN0ZWFkLgorCSAqLworCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5ID09IGQtPmRmc19kdW1wX2xwcm9wcykgewogCQlkYmdfZHVtcF9scHJvcHMoYyk7Ci0JZWxzZSBpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBkLT5kZnNfZHVtcF9idWRnKQorCQlyZXR1cm4gY291bnQ7CisJfQorCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5ID09IGQtPmRmc19kdW1wX2J1ZGcpIHsKIAkJZGJnX2R1bXBfYnVkZyhjLCAmYy0+YmkpOwotCWVsc2UgaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gZC0+ZGZzX2R1bXBfdG5jKSB7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gZC0+ZGZzX2R1bXBfdG5jKSB7CiAJCW11dGV4X2xvY2soJmMtPnRuY19tdXRleCk7CiAJCWRiZ19kdW1wX3RuYyhjKTsKIAkJbXV0ZXhfdW5sb2NrKCZjLT50bmNfbXV0ZXgpOwotCX0gZWxzZQorCQlyZXR1cm4gY291bnQ7CisJfQorCisJdmFsID0gaW50ZXJwcmV0X3VzZXJfaW5wdXQodSwgY291bnQpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOworCisJaWYgKGRlbnQgPT0gZC0+ZGZzX2Noa19nZW4pCisJCWQtPmNoa19nZW4gPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2luZGV4KQorCQlkLT5jaGtfaW5kZXggPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX29ycGgpCisJCWQtPmNoa19vcnBoID0gdmFsOworCWVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX2Noa19scHJvcHMpCisJCWQtPmNoa19scHJvcHMgPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2ZzKQorCQlkLT5jaGtfZnMgPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfdHN0X3JjdnJ5KQorCQlkLT50c3RfcmN2cnkgPSB2YWw7CisJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGZzX2ZvcHMgPSB7Ci0JLm9wZW4gPSBvcGVuX2RlYnVnZnNfZmlsZSwKLQkud3JpdGUgPSB3cml0ZV9kZWJ1Z2ZzX2ZpbGUsCisJLm9wZW4gPSBkZnNfZmlsZV9vcGVuLAorCS5yZWFkID0gZGZzX2ZpbGVfcmVhZCwKKwkud3JpdGUgPSBkZnNfZmlsZV93cml0ZSwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkubGxzZWVrID0gbm9fbGxzZWVrLAogfTsKQEAgLTI4ODAsMTIgKzI4OTcsMjAgQEAKICAqLwogaW50IGRiZ19kZWJ1Z2ZzX2luaXRfZnMoc3RydWN0IHViaWZzX2luZm8gKmMpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBuOwogCWNvbnN0IGNoYXIgKmZuYW1lOwogCXN0cnVjdCBkZW50cnkgKmRlbnQ7CiAJc3RydWN0IHViaWZzX2RlYnVnX2luZm8gKmQgPSBjLT5kYmc7CiAKLQlzcHJpbnRmKGQtPmRmc19kaXJfbmFtZSwgInViaSVkXyVkIiwgYy0+dmkudWJpX251bSwgYy0+dmkudm9sX2lkKTsKKwluID0gc25wcmludGYoZC0+ZGZzX2Rpcl9uYW1lLCBVQklGU19ERlNfRElSX0xFTiArIDEsIFVCSUZTX0RGU19ESVJfTkFNRSwKKwkJICAgICBjLT52aS51YmlfbnVtLCBjLT52aS52b2xfaWQpOworCWlmIChuID09IFVCSUZTX0RGU19ESVJfTEVOKSB7CisJCS8qIFRoZSBhcnJheSBzaXplIGlzIHRvbyBzbWFsbCAqLworCQlmbmFtZSA9IFVCSUZTX0RGU19ESVJfTkFNRTsKKwkJZGVudCA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKwogCWZuYW1lID0gZC0+ZGZzX2Rpcl9uYW1lOwogCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZm5hbWUsIGRmc19yb290ZGlyKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCkBAIC0yOTEwLDEzICsyOTM1LDU1IEBACiAJCWdvdG8gb3V0X3JlbW92ZTsKIAlkLT5kZnNfZHVtcF90bmMgPSBkZW50OwogCisJZm5hbWUgPSAiY2hrX2dlbmVyYWwiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZC0+ZGZzX2RpciwgYywKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19jaGtfZ2VuID0gZGVudDsKKworCWZuYW1lID0gImNoa19pbmRleCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkLT5kZnNfZGlyLCBjLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2Noa19pbmRleCA9IGRlbnQ7CisKKwlmbmFtZSA9ICJjaGtfb3JwaGFucyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkLT5kZnNfZGlyLCBjLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2Noa19vcnBoID0gZGVudDsKKworCWZuYW1lID0gImNoa19scHJvcHMiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZC0+ZGZzX2RpciwgYywKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19jaGtfbHByb3BzID0gZGVudDsKKworCWZuYW1lID0gImNoa19mcyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkLT5kZnNfZGlyLCBjLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2Noa19mcyA9IGRlbnQ7CisKKwlmbmFtZSA9ICJ0c3RfcmVjb3ZlcnkiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZC0+ZGZzX2RpciwgYywKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc190c3RfcmN2cnkgPSBkZW50OworCiAJcmV0dXJuIDA7CiAKIG91dF9yZW1vdmU6CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGQtPmRmc19kaXIpOwogb3V0OgogCWVyciA9IGRlbnQgPyBQVFJfRVJSKGRlbnQpIDogLUVOT0RFVjsKLQl1Ymlmc19lcnIoImNhbm5vdCBjcmVhdGUgXCIlc1wiIGRlYnVnZnMgZGlyZWN0b3J5LCBlcnJvciAlZFxuIiwKKwl1Ymlmc19lcnIoImNhbm5vdCBjcmVhdGUgXCIlc1wiIGRlYnVnZnMgZmlsZSBvciBkaXJlY3RvcnksIGVycm9yICVkXG4iLAogCQkgIGZuYW1lLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yOTMwLDQgKzI5OTcsMTc5IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGMtPmRiZy0+ZGZzX2Rpcik7CiB9CiAKK3N0cnVjdCB1Ymlmc19nbG9iYWxfZGVidWdfaW5mbyB1Ymlmc19kYmc7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2dlbjsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2luZGV4Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc19jaGtfb3JwaDsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2xwcm9wczsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2ZzOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc190c3RfcmN2cnk7CisKK3N0YXRpYyBzc2l6ZV90IGRmc19nbG9iYWxfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdSwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudCA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CisJaW50IHZhbDsKKworCWlmIChkZW50ID09IGRmc19jaGtfZ2VuKQorCQl2YWwgPSB1Ymlmc19kYmcuY2hrX2dlbjsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfaW5kZXgpCisJCXZhbCA9IHViaWZzX2RiZy5jaGtfaW5kZXg7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfY2hrX29ycGgpCisJCXZhbCA9IHViaWZzX2RiZy5jaGtfb3JwaDsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfbHByb3BzKQorCQl2YWwgPSB1Ymlmc19kYmcuY2hrX2xwcm9wczsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfZnMpCisJCXZhbCA9IHViaWZzX2RiZy5jaGtfZnM7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfdHN0X3JjdnJ5KQorCQl2YWwgPSB1Ymlmc19kYmcudHN0X3JjdnJ5OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcHJvdmlkZV91c2VyX291dHB1dCh2YWwsIHUsIGNvdW50LCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QgZGZzX2dsb2JhbF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdSwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCB2YWw7CisKKwl2YWwgPSBpbnRlcnByZXRfdXNlcl9pbnB1dCh1LCBjb3VudCk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisKKwlpZiAoZGVudCA9PSBkZnNfY2hrX2dlbikKKwkJdWJpZnNfZGJnLmNoa19nZW4gPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfY2hrX2luZGV4KQorCQl1Ymlmc19kYmcuY2hrX2luZGV4ID0gdmFsOworCWVsc2UgaWYgKGRlbnQgPT0gZGZzX2Noa19vcnBoKQorCQl1Ymlmc19kYmcuY2hrX29ycGggPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfY2hrX2xwcm9wcykKKwkJdWJpZnNfZGJnLmNoa19scHJvcHMgPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfY2hrX2ZzKQorCQl1Ymlmc19kYmcuY2hrX2ZzID0gdmFsOworCWVsc2UgaWYgKGRlbnQgPT0gZGZzX3RzdF9yY3ZyeSkKKwkJdWJpZnNfZGJnLnRzdF9yY3ZyeSA9IHZhbDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZnNfZ2xvYmFsX2ZvcHMgPSB7CisJLnJlYWQgPSBkZnNfZ2xvYmFsX2ZpbGVfcmVhZCwKKwkud3JpdGUgPSBkZnNfZ2xvYmFsX2ZpbGVfd3JpdGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKK307CisKKy8qKgorICogZGJnX2RlYnVnZnNfaW5pdCAtIGluaXRpYWxpemUgZGVidWdmcyBmaWxlLXN5c3RlbS4KKyAqCisgKiBVQklGUyB1c2VzIGRlYnVnZnMgZmlsZS1zeXN0ZW0gdG8gZXhwb3NlIHZhcmlvdXMgZGVidWdnaW5nIGtub2JzIHRvCisgKiB1c2VyLXNwYWNlLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgInViaWZzIiBkaXJlY3RvcnkgaW4gdGhlIGRlYnVnZnMKKyAqIGZpbGUtc3lzdGVtLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IGRiZ19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWNvbnN0IGNoYXIgKmZuYW1lOworCXN0cnVjdCBkZW50cnkgKmRlbnQ7CisKKwlmbmFtZSA9ICJ1YmlmcyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcihmbmFtZSwgTlVMTCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dDsKKwlkZnNfcm9vdGRpciA9IGRlbnQ7CisKKwlmbmFtZSA9ICJjaGtfZ2VuZXJhbCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkZnNfcm9vdGRpciwgTlVMTCwKKwkJCQkgICAmZGZzX2dsb2JhbF9mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkZnNfY2hrX2dlbiA9IGRlbnQ7CisKKwlmbmFtZSA9ICJjaGtfaW5kZXgiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZGZzX3Jvb3RkaXIsIE5VTEwsCisJCQkJICAgJmRmc19nbG9iYWxfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZGZzX2Noa19pbmRleCA9IGRlbnQ7CisKKwlmbmFtZSA9ICJjaGtfb3JwaGFucyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkZnNfcm9vdGRpciwgTlVMTCwKKwkJCQkgICAmZGZzX2dsb2JhbF9mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkZnNfY2hrX29ycGggPSBkZW50OworCisJZm5hbWUgPSAiY2hrX2xwcm9wcyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkZnNfcm9vdGRpciwgTlVMTCwKKwkJCQkgICAmZGZzX2dsb2JhbF9mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkZnNfY2hrX2xwcm9wcyA9IGRlbnQ7CisKKwlmbmFtZSA9ICJjaGtfZnMiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZGZzX3Jvb3RkaXIsIE5VTEwsCisJCQkJICAgJmRmc19nbG9iYWxfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZGZzX2Noa19mcyA9IGRlbnQ7CisKKwlmbmFtZSA9ICJ0c3RfcmVjb3ZlcnkiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZGZzX3Jvb3RkaXIsIE5VTEwsCisJCQkJICAgJmRmc19nbG9iYWxfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZGZzX3RzdF9yY3ZyeSA9IGRlbnQ7CisKKwlyZXR1cm4gMDsKKworb3V0X3JlbW92ZToKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGZzX3Jvb3RkaXIpOworb3V0OgorCWVyciA9IGRlbnQgPyBQVFJfRVJSKGRlbnQpIDogLUVOT0RFVjsKKwl1Ymlmc19lcnIoImNhbm5vdCBjcmVhdGUgXCIlc1wiIGRlYnVnZnMgZmlsZSBvciBkaXJlY3RvcnksIGVycm9yICVkXG4iLAorCQkgIGZuYW1lLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZGJnX2RlYnVnZnNfZXhpdCAtIHJlbW92ZSB0aGUgInViaWZzIiBkaXJlY3RvcnkgZnJvbSBkZWJ1Z2ZzIGZpbGUtc3lzdGVtLgorICovCit2b2lkIGRiZ19kZWJ1Z2ZzX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGZzX3Jvb3RkaXIpOworfQorCisvKioKKyAqIHViaWZzX2RlYnVnZ2luZ19pbml0IC0gaW5pdGlhbGl6ZSBVQklGUyBkZWJ1Z2dpbmcuCisgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBkZWJ1Z2dpbmctcmVsYXRlZCBkYXRhIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisgKiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZgorICogZmFpbHVyZS4KKyAqLworaW50IHViaWZzX2RlYnVnZ2luZ19pbml0KHN0cnVjdCB1Ymlmc19pbmZvICpjKQoreworCWMtPmRiZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlmc19kZWJ1Z19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjLT5kYmcpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdWJpZnNfZGVidWdnaW5nX2V4aXQgLSBmcmVlIGRlYnVnZ2luZyBkYXRhLgorICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaWZzX2RlYnVnZ2luZ19leGl0KHN0cnVjdCB1Ymlmc19pbmZvICpjKQoreworCWtmcmVlKGMtPmRiZyk7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfVUJJRlNfRlNfREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2RlYnVnLmggYi9mcy91Ymlmcy9kZWJ1Zy5oCmluZGV4IGE4MTFhYzQuLjQ1MTc0YjUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2RlYnVnLmgKKysrIGIvZnMvdWJpZnMvZGVidWcuaApAQCAtMzEsMTggKzMxLDI1IEBACiAKICNpZmRlZiBDT05GSUdfVUJJRlNfRlNfREVCVUcKIAotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorLyoKKyAqIFRoZSBVQklGUyBkZWJ1Z2ZzIGRpcmVjdG9yeSBuYW1lIHBhdHRlcm4gYW5kIG1heGltdW0gbmFtZSBsZW5ndGggKDMgZm9yICJ1YmkiCisgKiArIDEgZm9yICJfIiBhbmQgcGx1cyAyeDIgZm9yIDIgVUJJIG51bWJlcnMgYW5kIDEgZm9yIHRoZSB0cmFpbGluZyB6ZXJvIGJ5dGUuCisgKi8KKyNkZWZpbmUgVUJJRlNfREZTX0RJUl9OQU1FICJ1YmklZF8lZCIKKyNkZWZpbmUgVUJJRlNfREZTX0RJUl9MRU4gICgzICsgMSArIDIqMiArIDEpCiAKIC8qKgogICogdWJpZnNfZGVidWdfaW5mbyAtIHBlci1GUyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCiAgKiBAb2xkX3pyb290OiBvbGQgaW5kZXggcm9vdCAtIHVzZWQgYnkgJ2RiZ19jaGVja19vbGRfaW5kZXgoKScKICAqIEBvbGRfenJvb3RfbGV2ZWw6IG9sZCBpbmRleCByb290IGxldmVsIC0gdXNlZCBieSAnZGJnX2NoZWNrX29sZF9pbmRleCgpJwogICogQG9sZF96cm9vdF9zcW51bTogb2xkIGluZGV4IHJvb3Qgc3FudW0gLSB1c2VkIGJ5ICdkYmdfY2hlY2tfb2xkX2luZGV4KCknCi0gKiBAZmFpbHVyZV9tb2RlOiBmYWlsdXJlIG1vZGUgZm9yIHJlY292ZXJ5IHRlc3RpbmcKLSAqIEBmYWlsX2RlbGF5OiAwPT5kb24ndCBkZWxheSwgMT0+ZGVsYXkgYSB0aW1lLCAyPT5kZWxheSBhIG51bWJlciBvZiBjYWxscwotICogQGZhaWxfdGltZW91dDogdGltZSBpbiBqaWZmaWVzIHdoZW4gZGVsYXkgb2YgZmFpbHVyZSBtb2RlIGV4cGlyZXMKLSAqIEBmYWlsX2NudDogY3VycmVudCBudW1iZXIgb2YgY2FsbHMgdG8gZmFpbHVyZSBtb2RlIEkvTyBmdW5jdGlvbnMKLSAqIEBmYWlsX2NudF9tYXg6IG51bWJlciBvZiBjYWxscyBieSB3aGljaCB0byBkZWxheSBmYWlsdXJlIG1vZGUKKyAqCisgKiBAcGNfaGFwcGVuZWQ6IG5vbi16ZXJvIGlmIGFuIGVtdWxhdGVkIHBvd2VyIGN1dCBoYXBwZW5lZAorICogQHBjX2RlbGF5OiAwPT5kb24ndCBkZWxheSwgMT0+ZGVsYXkgYSB0aW1lLCAyPT5kZWxheSBhIG51bWJlciBvZiBjYWxscworICogQHBjX3RpbWVvdXQ6IHRpbWUgaW4gamlmZmllcyB3aGVuIGRlbGF5IG9mIGZhaWx1cmUgbW9kZSBleHBpcmVzCisgKiBAcGNfY250OiBjdXJyZW50IG51bWJlciBvZiBjYWxscyB0byBmYWlsdXJlIG1vZGUgSS9PIGZ1bmN0aW9ucworICogQHBjX2NudF9tYXg6IG51bWJlciBvZiBjYWxscyBieSB3aGljaCB0byBkZWxheSBmYWlsdXJlIG1vZGUKKyAqCiAgKiBAY2hrX2xwdF9zejogdXNlZCBieSBMUFQgdHJlZSBzaXplIGNoZWNrZXIKICAqIEBjaGtfbHB0X3N6MjogdXNlZCBieSBMUFQgdHJlZSBzaXplIGNoZWNrZXIKICAqIEBjaGtfbHB0X3dhc3RhZ2U6IHVzZWQgYnkgTFBUIHRyZWUgc2l6ZSBjaGVja2VyCkBAIC01NiwyMSArNjMsMzYgQEAKICAqIEBzYXZlZF9mcmVlOiBzYXZlZCBhbW91bnQgb2YgZnJlZSBzcGFjZQogICogQHNhdmVkX2lkeF9nY19jbnQ6IHNhdmVkIHZhbHVlIG9mIEBjLT5pZHhfZ2NfY250CiAgKgorICogQGNoa19nZW46IGlmIGdlbmVyYWwgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX2luZGV4OiBpZiBpbmRleCB4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGNoa19vcnBoOiBpZiBvcnBoYW5zIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGNoa19scHJvcHM6IGlmIGxwcm9wcyBleHRyYSBjaGVja3MgYXJlIGVuYWJsZWQKKyAqIEBjaGtfZnM6IGlmIFVCSUZTIGNvbnRlbnRzIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQHRzdF9yY3ZyeTogaWYgVUJJRlMgcmVjb3ZlcnkgdGVzdGluZyBtb2RlIGVuYWJsZWQKKyAqCiAgKiBAZGZzX2Rpcl9uYW1lOiBuYW1lIG9mIGRlYnVnZnMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBmaWxlLXN5c3RlbSdzIGZpbGVzCiAgKiBAZGZzX2RpcjogZGlyZW50cnkgb2JqZWN0IG9mIHRoZSBmaWxlLXN5c3RlbSBkZWJ1Z2ZzIGRpcmVjdG9yeQogICogQGRmc19kdW1wX2xwcm9wczogImR1bXAgbHByb3BzIiBkZWJ1Z2ZzIGtub2IKICAqIEBkZnNfZHVtcF9idWRnOiAiZHVtcCBidWRnZXRpbmcgaW5mb3JtYXRpb24iIGRlYnVnZnMga25vYgogICogQGRmc19kdW1wX3RuYzogImR1bXAgVE5DIiBkZWJ1Z2ZzIGtub2IKKyAqIEBkZnNfY2hrX2dlbjogZGVidWdmcyBrbm9iIHRvIGVuYWJsZSBVQklGUyBnZW5lcmFsIGV4dHJhIGNoZWNrcworICogQGRmc19jaGtfaW5kZXg6IGRlYnVnZnMga25vYiB0byBlbmFibGUgVUJJRlMgaW5kZXggZXh0cmEgY2hlY2tzCisgKiBAZGZzX2Noa19vcnBoOiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSUZTIG9ycGhhbnMgZXh0cmEgY2hlY2tzCisgKiBAZGZzX2Noa19scHJvcHM6IGRlYnVnZnMga25vYiB0byBlbmFibGUgVUJJRlMgTEVQIHByb3BlcnRpZXMgZXh0cmEgY2hlY2tzCisgKiBAZGZzX2Noa19mczogZGVidWdmcyBrbm9iIHRvIGVuYWJsZSBVQklGUyBjb250ZW50cyBleHRyYSBjaGVja3MKKyAqIEBkZnNfdHN0X3JjdnJ5OiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSUZTIHJlY292ZXJ5IHRlc3RpbmcKICAqLwogc3RydWN0IHViaWZzX2RlYnVnX2luZm8gewogCXN0cnVjdCB1Ymlmc196YnJhbmNoIG9sZF96cm9vdDsKIAlpbnQgb2xkX3pyb290X2xldmVsOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBvbGRfenJvb3Rfc3FudW07Ci0JaW50IGZhaWx1cmVfbW9kZTsKLQlpbnQgZmFpbF9kZWxheTsKLQl1bnNpZ25lZCBsb25nIGZhaWxfdGltZW91dDsKLQl1bnNpZ25lZCBpbnQgZmFpbF9jbnQ7Ci0JdW5zaWduZWQgaW50IGZhaWxfY250X21heDsKKworCWludCBwY19oYXBwZW5lZDsKKwlpbnQgcGNfZGVsYXk7CisJdW5zaWduZWQgbG9uZyBwY190aW1lb3V0OworCXVuc2lnbmVkIGludCBwY19jbnQ7CisJdW5zaWduZWQgaW50IHBjX2NudF9tYXg7CisKIAlsb25nIGxvbmcgY2hrX2xwdF9zejsKIAlsb25nIGxvbmcgY2hrX2xwdF9zejI7CiAJbG9uZyBsb25nIGNoa19scHRfd2FzdGFnZTsKQEAgLTg0LDExICsxMDYsNDMgQEAKIAlsb25nIGxvbmcgc2F2ZWRfZnJlZTsKIAlpbnQgc2F2ZWRfaWR4X2djX2NudDsKIAotCWNoYXIgZGZzX2Rpcl9uYW1lWzEwMF07CisJdW5zaWduZWQgaW50IGNoa19nZW46MTsKKwl1bnNpZ25lZCBpbnQgY2hrX2luZGV4OjE7CisJdW5zaWduZWQgaW50IGNoa19vcnBoOjE7CisJdW5zaWduZWQgaW50IGNoa19scHJvcHM6MTsKKwl1bnNpZ25lZCBpbnQgY2hrX2ZzOjE7CisJdW5zaWduZWQgaW50IHRzdF9yY3ZyeToxOworCisJY2hhciBkZnNfZGlyX25hbWVbVUJJRlNfREZTX0RJUl9MRU4gKyAxXTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZGlyOwogCXN0cnVjdCBkZW50cnkgKmRmc19kdW1wX2xwcm9wczsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZHVtcF9idWRnOwogCXN0cnVjdCBkZW50cnkgKmRmc19kdW1wX3RuYzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2dlbjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2luZGV4OworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfb3JwaDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2xwcm9wczsKKwlzdHJ1Y3QgZGVudHJ5ICpkZnNfY2hrX2ZzOworCXN0cnVjdCBkZW50cnkgKmRmc190c3RfcmN2cnk7Cit9OworCisvKioKKyAqIHViaWZzX2dsb2JhbF9kZWJ1Z19pbmZvIC0gZ2xvYmFsIChub3QgcGVyLUZTKSBVQklGUyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgKgorICogQGNoa19nZW46IGlmIGdlbmVyYWwgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX2luZGV4OiBpZiBpbmRleCB4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGNoa19vcnBoOiBpZiBvcnBoYW5zIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGNoa19scHJvcHM6IGlmIGxwcm9wcyBleHRyYSBjaGVja3MgYXJlIGVuYWJsZWQKKyAqIEBjaGtfZnM6IGlmIFVCSUZTIGNvbnRlbnRzIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQHRzdF9yY3ZyeTogaWYgVUJJRlMgcmVjb3ZlcnkgdGVzdGluZyBtb2RlIGVuYWJsZWQKKyAqLworc3RydWN0IHViaWZzX2dsb2JhbF9kZWJ1Z19pbmZvIHsKKwl1bnNpZ25lZCBpbnQgY2hrX2dlbjoxOworCXVuc2lnbmVkIGludCBjaGtfaW5kZXg6MTsKKwl1bnNpZ25lZCBpbnQgY2hrX29ycGg6MTsKKwl1bnNpZ25lZCBpbnQgY2hrX2xwcm9wczoxOworCXVuc2lnbmVkIGludCBjaGtfZnM6MTsKKwl1bnNpZ25lZCBpbnQgdHN0X3JjdnJ5OjE7CiB9OwogCiAjZGVmaW5lIHViaWZzX2Fzc2VydChleHByKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTI3LDYgKzE4MSw4IEBACiAjZGVmaW5lIERCR0tFWShrZXkpIGRiZ19rZXlfc3RyMChjLCAoa2V5KSkKICNkZWZpbmUgREJHS0VZMShrZXkpIGRiZ19rZXlfc3RyMShjLCAoa2V5KSkKIAorZXh0ZXJuIHNwaW5sb2NrX3QgZGJnX2xvY2s7CisKICNkZWZpbmUgdWJpZnNfZGJnX21zZyh0eXBlLCBmbXQsIC4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlzcGluX2xvY2soJmRiZ19sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXByX2RlYnVnKCJVQklGUyBEQkcgIiB0eXBlICI6ICIgZm10ICJcbiIsICMjX19WQV9BUkdTX18pOyBcCkBAIC0xNjIsNDEgKzIxOCwzNiBAQAogLyogQWRkaXRpb25hbCByZWNvdmVyeSBtZXNzYWdlcyAqLwogI2RlZmluZSBkYmdfcmN2cnkoZm10LCAuLi4pIHViaWZzX2RiZ19tc2coInJjdnJ5IiwgZm10LCAjI19fVkFfQVJHU19fKQogCi0vKgotICogRGVidWdnaW5nIGNoZWNrIGZsYWdzLgotICoKLSAqIFVCSUZTX0NIS19HRU46IGdlbmVyYWwgY2hlY2tzCi0gKiBVQklGU19DSEtfVE5DOiBjaGVjayBUTkMKLSAqIFVCSUZTX0NIS19JRFhfU1o6IGNoZWNrIGluZGV4IHNpemUKLSAqIFVCSUZTX0NIS19PUlBIOiBjaGVjayBvcnBoYW5zCi0gKiBVQklGU19DSEtfT0xEX0lEWDogY2hlY2sgdGhlIG9sZCBpbmRleAotICogVUJJRlNfQ0hLX0xQUk9QUzogY2hlY2sgbHByb3BzCi0gKiBVQklGU19DSEtfRlM6IGNoZWNrIHRoZSBmaWxlLXN5c3RlbQotICovCi1lbnVtIHsKLQlVQklGU19DSEtfR0VOICAgICA9IDB4MSwKLQlVQklGU19DSEtfVE5DICAgICA9IDB4MiwKLQlVQklGU19DSEtfSURYX1NaICA9IDB4NCwKLQlVQklGU19DSEtfT1JQSCAgICA9IDB4OCwKLQlVQklGU19DSEtfT0xEX0lEWCA9IDB4MTAsCi0JVUJJRlNfQ0hLX0xQUk9QUyAgPSAweDIwLAotCVVCSUZTX0NIS19GUyAgICAgID0gMHg0MCwKLX07CitleHRlcm4gc3RydWN0IHViaWZzX2dsb2JhbF9kZWJ1Z19pbmZvIHViaWZzX2RiZzsKIAotLyoKLSAqIFNwZWNpYWwgdGVzdGluZyBmbGFncy4KLSAqCi0gKiBVQklGU19UU1RfUkNWUlk6IGZhaWx1cmUgbW9kZSBmb3IgcmVjb3ZlcnkgdGVzdGluZwotICovCi1lbnVtIHsKLQlVQklGU19UU1RfUkNWUlkgICAgICAgICAgICAgPSAweDQsCi19OwotCi1leHRlcm4gc3BpbmxvY2tfdCBkYmdfbG9jazsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCB1Ymlmc19tc2dfZmxhZ3M7Ci1leHRlcm4gdW5zaWduZWQgaW50IHViaWZzX2Noa19mbGFnczsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdWJpZnNfdHN0X2ZsYWdzOworc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19nZW4oY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJcmV0dXJuICEhKHViaWZzX2RiZy5jaGtfZ2VuIHx8IGMtPmRiZy0+Y2hrX2dlbik7Cit9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2luZGV4KGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKQoreworCXJldHVybiAhISh1Ymlmc19kYmcuY2hrX2luZGV4IHx8IGMtPmRiZy0+Y2hrX2luZGV4KTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19pc19jaGtfb3JwaChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKK3sKKwlyZXR1cm4gISEodWJpZnNfZGJnLmNoa19vcnBoIHx8IGMtPmRiZy0+Y2hrX29ycGgpOworfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19scHJvcHMoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJcmV0dXJuICEhKHViaWZzX2RiZy5jaGtfbHByb3BzIHx8IGMtPmRiZy0+Y2hrX2xwcm9wcyk7Cit9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2ZzKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKQoreworCXJldHVybiAhISh1Ymlmc19kYmcuY2hrX2ZzIHx8IGMtPmRiZy0+Y2hrX2ZzKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19pc190c3RfcmN2cnkoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJcmV0dXJuICEhKHViaWZzX2RiZy50c3RfcmN2cnkgfHwgYy0+ZGJnLT50c3RfcmN2cnkpOworfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX3Bvd2VyX2N1dChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKK3sKKwlyZXR1cm4gISFjLT5kYmctPnBjX2hhcHBlbmVkOworfQogCiBpbnQgdWJpZnNfZGVidWdnaW5nX2luaXQoc3RydWN0IHViaWZzX2luZm8gKmMpOwogdm9pZCB1Ymlmc19kZWJ1Z2dpbmdfZXhpdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CkBAIC0yMDcsNyArMjU4LDcgQEAKIGNvbnN0IGNoYXIgKmRiZ19qaGVhZChpbnQgamhlYWQpOwogY29uc3QgY2hhciAqZGJnX2dldF9rZXlfZHVtcChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJCSAgICAgY29uc3QgdW5pb24gdWJpZnNfa2V5ICprZXkpOwotdm9pZCBkYmdfZHVtcF9pbm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIGRiZ19kdW1wX2lub2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgZGJnX2R1bXBfbm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgdm9pZCAqbm9kZSk7CiB2b2lkIGRiZ19kdW1wX2xwdF9ub2RlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCB2b2lkICpub2RlLCBpbnQgbG51bSwKIAkJICAgICAgIGludCBvZmZzKTsKQEAgLTI0MCw4ICsyOTEsOCBAQAogaW50IGRiZ19jaGVja19sdGFiKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKIGludCBkYmdfY2hrX2xwdF9mcmVlX3NwYyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiBpbnQgZGJnX2Noa19scHRfc3ooc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBhY3Rpb24sIGludCBsZW4pOwotaW50IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IGRiZ19jaGVja19kaXJfc2l6ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgc3RydWN0IGlub2RlICpkaXIpOworaW50IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCBkYmdfY2hlY2tfZGlyKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcik7CiBpbnQgZGJnX2NoZWNrX3RuYyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGV4dHJhKTsKIGludCBkYmdfY2hlY2tfaWR4X3NpemUoc3RydWN0IHViaWZzX2luZm8gKmMsIGxvbmcgbG9uZyBpZHhfc2l6ZSk7CiBpbnQgZGJnX2NoZWNrX2ZpbGVzeXN0ZW0oc3RydWN0IHViaWZzX2luZm8gKmMpOwpAQCAtMjU0LDU0ICszMDUsMTIgQEAKIGludCBkYmdfY2hlY2tfZGF0YV9ub2Rlc19vcmRlcihzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CiBpbnQgZGJnX2NoZWNrX25vbmRhdGFfbm9kZXNfb3JkZXIoc3RydWN0IHViaWZzX2luZm8gKmMsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwogCi0vKiBGb3JjZSB0aGUgdXNlIG9mIGluLXRoZS1nYXBzIG1ldGhvZCBmb3IgdGVzdGluZyAqLwotc3RhdGljIGlubGluZSBpbnQgZGJnX2ZvcmNlX2luX3RoZV9nYXBzX2VuYWJsZWQodm9pZCkKLXsKLQlyZXR1cm4gdWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0dFTjsKLX0KLWludCBkYmdfZm9yY2VfaW5fdGhlX2dhcHModm9pZCk7Ci0KLS8qIEZhaWx1cmUgbW9kZSBmb3IgcmVjb3ZlcnkgdGVzdGluZyAqLwotI2RlZmluZSBkYmdfZmFpbHVyZV9tb2RlICh1Ymlmc190c3RfZmxhZ3MgJiBVQklGU19UU1RfUkNWUlkpCi0KLSNpZm5kZWYgVUJJRlNfREJHX1BSRVNFUlZFX1VCSQotI2RlZmluZSB1YmlfbGViX3JlYWQgICBkYmdfbGViX3JlYWQKLSNkZWZpbmUgdWJpX2xlYl93cml0ZSAgZGJnX2xlYl93cml0ZQotI2RlZmluZSB1YmlfbGViX2NoYW5nZSBkYmdfbGViX2NoYW5nZQotI2RlZmluZSB1YmlfbGViX2VyYXNlICBkYmdfbGViX2VyYXNlCi0jZGVmaW5lIHViaV9sZWJfdW5tYXAgIGRiZ19sZWJfdW5tYXAKLSNkZWZpbmUgdWJpX2lzX21hcHBlZCAgZGJnX2lzX21hcHBlZAotI2RlZmluZSB1YmlfbGViX21hcCAgICBkYmdfbGViX21hcAotI2VuZGlmCi0KLWludCBkYmdfbGViX3JlYWQoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNoYXIgKmJ1ZiwgaW50IG9mZnNldCwKLQkJIGludCBsZW4sIGludCBjaGVjayk7Ci1pbnQgZGJnX2xlYl93cml0ZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLAotCQkgIGludCBvZmZzZXQsIGludCBsZW4sIGludCBkdHlwZSk7Ci1pbnQgZGJnX2xlYl9jaGFuZ2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJICAgaW50IGxlbiwgaW50IGR0eXBlKTsKLWludCBkYmdfbGViX2VyYXNlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKLWludCBkYmdfbGViX3VubWFwKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKLWludCBkYmdfaXNfbWFwcGVkKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKLWludCBkYmdfbGViX21hcChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgaW50IGR0eXBlKTsKLQotc3RhdGljIGlubGluZSBpbnQgZGJnX3JlYWQoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNoYXIgKmJ1ZiwKLQkJCSAgIGludCBvZmZzZXQsIGludCBsZW4pCi17Ci0JcmV0dXJuIGRiZ19sZWJfcmVhZChkZXNjLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGJnX3dyaXRlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtLAotCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbikKLXsKLQlyZXR1cm4gZGJnX2xlYl93cml0ZShkZXNjLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCBVQklfVU5LTk9XTik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRiZ19jaGFuZ2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sCi0JCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKLXsKLQlyZXR1cm4gZGJnX2xlYl9jaGFuZ2UoZGVzYywgbG51bSwgYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKLX0KK2ludCBkYmdfbGViX3dyaXRlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgb2ZmcywKKwkJICBpbnQgbGVuLCBpbnQgZHR5cGUpOworaW50IGRiZ19sZWJfY2hhbmdlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLAorCQkgICBpbnQgZHR5cGUpOworaW50IGRiZ19sZWJfdW5tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKTsKK2ludCBkYmdfbGViX21hcChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGludCBkdHlwZSk7CiAKIC8qIERlYnVnZnMtcmVsYXRlZCBzdHVmZiAqLwogaW50IGRiZ19kZWJ1Z2ZzX2luaXQodm9pZCk7CkBAIC0zMTMsNyArMzIyLDcgQEAKIAogLyogVXNlICJpZiAoMCkiIHRvIG1ha2UgY29tcGlsZXIgY2hlY2sgYXJndW1lbnRzIGV2ZW4gaWYgZGVidWdnaW5nIGlzIG9mZiAqLwogI2RlZmluZSB1Ymlmc19hc3NlcnQoZXhwcikgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoMCAmJiAoZXhwcikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiVUJJRlMgYXNzZXJ0IGZhaWxlZCBpbiAlcyBhdCAldSAocGlkICVkKVxuIiwgXAogCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBjdXJyZW50LT5waWQpOyAgICAgICAgICAgICAgICAgICAgICBcCiB9IHdoaWxlICgwKQpAQCAtMzIzLDYgKzMzMiw5IEBACiAJCXViaWZzX2VycihmbXQsICMjX19WQV9BUkdTX18pOyAgICAgXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBEQkdLRVkoa2V5KSAgKChjaGFyICopKGtleSkpCisjZGVmaW5lIERCR0tFWTEoa2V5KSAoKGNoYXIgKikoa2V5KSkKKwogI2RlZmluZSB1Ymlmc19kYmdfbXNnKGZtdCwgLi4uKSBkbyB7ICAgICAgICAgICAgICAgXAogCWlmICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCXByX2RlYnVnKGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsgXApAQCAtMzQ2LDkgKzM1OCw2IEBACiAjZGVmaW5lIGRiZ19zY2FuKGZtdCwgLi4uKSAgdWJpZnNfZGJnX21zZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIGRiZ19yY3ZyeShmbXQsIC4uLikgdWJpZnNfZGJnX21zZyhmbXQsICMjX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgREJHS0VZKGtleSkgICgoY2hhciAqKShrZXkpKQotI2RlZmluZSBEQkdLRVkxKGtleSkgKChjaGFyICopKGtleSkpCi0KIHN0YXRpYyBpbmxpbmUgaW50IHViaWZzX2RlYnVnZ2luZ19pbml0KHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICAgIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB1Ymlmc19kZWJ1Z2dpbmdfZXhpdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgIHsgcmV0dXJuOyB9CiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmRiZ19udHlwZShpbnQgdHlwZSkgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAiIjsgfQpAQCAtMzU3LDcgKzM2Niw3IEBACiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgogZGJnX2dldF9rZXlfZHVtcChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJIGNvbnN0IHVuaW9uIHViaWZzX2tleSAqa2V5KSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAiIjsgfQotc3RhdGljIGlubGluZSB2b2lkIGRiZ19kdW1wX2lub2RlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAorc3RhdGljIGlubGluZSB2b2lkIGRiZ19kdW1wX2lub2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkJCSAgY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkgICAgICB7IHJldHVybjsgfQogc3RhdGljIGlubGluZSB2b2lkIGRiZ19kdW1wX25vZGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCiAJCQkJIGNvbnN0IHZvaWQgKm5vZGUpICAgICAgICAgICAgICAgIHsgcmV0dXJuOyB9CkBAIC00MDksOSArNDE4LDExIEBACiBzdGF0aWMgaW5saW5lIGludCBkYmdfY2hrX2xwdF9mcmVlX3NwYyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgICB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBkYmdfY2hrX2xwdF9zeihzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJCQkgaW50IGFjdGlvbiwgaW50IGxlbikgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoc3RydWN0IGlub2RlICppbm9kZSkgICAgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgZGJnX2NoZWNrX2Rpcl9zaXplKHN0cnVjdCB1Ymlmc19pbmZvICpjLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGlub2RlICpkaXIpICAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludAorZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfY2hlY2tfZGlyKHN0cnVjdCB1Ymlmc19pbmZvICpjLAorCQkJCWNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKSAgICAgICAgICB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBkYmdfY2hlY2tfdG5jKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgZXh0cmEpICB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBkYmdfY2hlY2tfaWR4X3NpemUoc3RydWN0IHViaWZzX2luZm8gKmMsCiAJCQkJICAgICBsb25nIGxvbmcgaWR4X3NpemUpICAgICAgICAgIHsgcmV0dXJuIDA7IH0KQEAgLTQzMSw5ICs0NDIsMjMgQEAKIGRiZ19jaGVja19ub25kYXRhX25vZGVzX29yZGVyKHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQogCi1zdGF0aWMgaW5saW5lIGludCBkYmdfZm9yY2VfaW5fdGhlX2dhcHModm9pZCkgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9Ci0jZGVmaW5lIGRiZ19mb3JjZV9pbl90aGVfZ2Fwc19lbmFibGVkKCkgMAotI2RlZmluZSBkYmdfZmFpbHVyZV9tb2RlICAgICAgICAgICAgICAgIDAKK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19sZWJfd3JpdGUoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAorCQkJCWNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnNldCwKKwkJCQlpbnQgbGVuLCBpbnQgZHR5cGUpICAgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2xlYl9jaGFuZ2Uoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAorCQkJCSBjb25zdCB2b2lkICpidWYsIGludCBsZW4sCisJCQkJIGludCBkdHlwZSkgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19sZWJfdW5tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKSAgIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19sZWJfbWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwKKwkJCSAgICAgIGludCBkdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19nZW4oY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19pbmRleChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19vcnBoKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19scHJvcHMoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19mcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX3RzdF9yY3ZyeShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX3Bvd2VyX2N1dChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgeyByZXR1cm4gMDsgfQogCiBzdGF0aWMgaW5saW5lIGludCBkYmdfZGVidWdmc19pbml0KHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGJnX2RlYnVnZnNfZXhpdCh2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybjsgfQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZGlyLmMgYi9mcy91Ymlmcy9kaXIuYwppbmRleCBlZjVhYmQzLi42ODM0OTIwIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9kaXIuYworKysgYi9mcy91Ymlmcy9kaXIuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJICogVUJJRlMgaGFzIHRvIGZ1bGx5IGNvbnRyb2wgImNsZWFuIDwtPiBkaXJ0eSIgdHJhbnNpdGlvbnMgb2YgaW5vZGVzCiAJICogdG8gbWFrZSBidWRnZXRpbmcgd29yay4KIAkgKi8KLQlpbm9kZS0+aV9mbGFncyB8PSAoU19OT0NNVElNRSk7CisJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0NNVElNRTsKIAogCWlub2RlX2luaXRfb3duZXIoaW5vZGUsIGRpciwgbW9kZSk7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0KQEAgLTE3Miw5ICsxNzIsMTEgQEAKIAogI2lmZGVmIENPTkZJR19VQklGU19GU19ERUJVRwogCi1zdGF0aWMgaW50IGRiZ19jaGVja19uYW1lKHN0cnVjdCB1Ymlmc19kZW50X25vZGUgKmRlbnQsIHN0cnVjdCBxc3RyICpubSkKK3N0YXRpYyBpbnQgZGJnX2NoZWNrX25hbWUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCisJCQkgIGNvbnN0IHN0cnVjdCB1Ymlmc19kZW50X25vZGUgKmRlbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBxc3RyICpubSkKIHsKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpKQogCQlyZXR1cm4gMDsKIAlpZiAobGUxNl90b19jcHUoZGVudC0+bmxlbikgIT0gbm0tPmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODUsNyArMTg3LDcgQEAKIAogI2Vsc2UKIAotI2RlZmluZSBkYmdfY2hlY2tfbmFtZShkZW50LCBubSkgMAorI2RlZmluZSBkYmdfY2hlY2tfbmFtZShjLCBkZW50LCBubSkgMAogCiAjZW5kaWYKIApAQCAtMjE5LDcgKzIyMSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChkYmdfY2hlY2tfbmFtZShkZW50LCAmZGVudHJ5LT5kX25hbWUpKSB7CisJaWYgKGRiZ19jaGVja19uYW1lKGMsIGRlbnQsICZkZW50cnktPmRfbmFtZSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTIyLDcgKzUyNCw3IEBACiAJdWJpZnNfYXNzZXJ0KG11dGV4X2lzX2xvY2tlZCgmZGlyLT5pX211dGV4KSk7CiAJdWJpZnNfYXNzZXJ0KG11dGV4X2lzX2xvY2tlZCgmaW5vZGUtPmlfbXV0ZXgpKTsKIAotCWVyciA9IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGlub2RlKTsKKwllcnIgPSBkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZShjLCBpbm9kZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtNTc3LDcgKzU3OSw3IEBACiAJCWlub2RlLT5pX25saW5rLCBkaXItPmlfaW5vKTsKIAl1Ymlmc19hc3NlcnQobXV0ZXhfaXNfbG9ja2VkKCZkaXItPmlfbXV0ZXgpKTsKIAl1Ymlmc19hc3NlcnQobXV0ZXhfaXNfbG9ja2VkKCZpbm9kZS0+aV9tdXRleCkpOwotCWVyciA9IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGlub2RlKTsKKwllcnIgPSBkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZShjLCBpbm9kZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZmlsZS5jIGIvZnMvdWJpZnMvZmlsZS5jCmluZGV4IDVlN2ZjY2YuLjdjZjczOGEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2ZpbGUuYworKysgYi9mcy91Ymlmcy9maWxlLmMKQEAgLTEyNjMsNyArMTI2Myw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGlub2RlKTsKKwllcnIgPSBkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZShjLCBpbm9kZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvaW8uYyBiL2ZzL3ViaWZzL2lvLmMKaW5kZXggMTY2OTUxZS4uOTIyODk1MCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvaW8uYworKysgYi9mcy91Ymlmcy9pby5jCkBAIC04Niw4ICs4NiwxMjUgQEAKIAkJYy0+bm9fY2hrX2RhdGFfY3JjID0gMDsKIAkJYy0+dmZzX3NiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJdWJpZnNfd2Fybigic3dpdGNoZWQgdG8gcmVhZC1vbmx5IG1vZGUsIGVycm9yICVkIiwgZXJyKTsKKwkJZHVtcF9zdGFjaygpOworCX0KK30KKworLyoKKyAqIEJlbG93IGFyZSBzaW1wbGUgd3JhcHBlcnMgb3ZlciBVQkkgSS9PIGZ1bmN0aW9ucyB3aGljaCBpbmNsdWRlIHNvbWUKKyAqIGFkZGl0aW9uYWwgY2hlY2tzIGFuZCBVQklGUyBkZWJ1Z2dpbmcgc3R1ZmYuIFNlZSBjb3JyZXNwb25kaW5nIFVCSSBmdW5jdGlvbgorICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworaW50IHViaWZzX2xlYl9yZWFkKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgdm9pZCAqYnVmLCBpbnQgb2ZmcywKKwkJICAgaW50IGxlbiwgaW50IGV2ZW5fZWJhZG1zZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIGxlbik7CisJLyoKKwkgKiBJbiBjYXNlIG9mICUtRUJBRE1TRyBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBvbmx5IGlmIHRoZQorCSAqIEBldmVuX2ViYWRtc2cgaXMgdHJ1ZS4KKwkgKi8KKwlpZiAoZXJyICYmIChlcnIgIT0gLUVCQURNU0cgfHwgZXZlbl9lYmFkbXNnKSkgeworCQl1Ymlmc19lcnIoInJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBMRUIgJWQ6JWQgZmFpbGVkLCBlcnJvciAlZCIsCisJCQkgIGxlbiwgbG51bSwgb2ZmcywgZXJyKTsKIAkJZGJnX2R1bXBfc3RhY2soKTsKIAl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHViaWZzX2xlYl93cml0ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnMsCisJCSAgICBpbnQgbGVuLCBpbnQgZHR5cGUpCit7CisJaW50IGVycjsKKworCXViaWZzX2Fzc2VydCghYy0+cm9fbWVkaWEgJiYgIWMtPnJvX21vdW50KTsKKwlpZiAoYy0+cm9fZXJyb3IpCisJCXJldHVybiAtRVJPRlM7CisJaWYgKCFkYmdfaXNfdHN0X3JjdnJ5KGMpKQorCQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4sIGR0eXBlKTsKKwllbHNlCisJCWVyciA9IGRiZ19sZWJfd3JpdGUoYywgbG51bSwgYnVmLCBvZmZzLCBsZW4sIGR0eXBlKTsKKwlpZiAoZXJyKSB7CisJCXViaWZzX2Vycigid3JpdGluZyAlZCBieXRlcyB0byBMRUIgJWQ6JWQgZmFpbGVkLCBlcnJvciAlZCIsCisJCQkgIGxlbiwgbG51bSwgb2ZmcywgZXJyKTsKKwkJdWJpZnNfcm9fbW9kZShjLCBlcnIpOworCQlkYmdfZHVtcF9zdGFjaygpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgdWJpZnNfbGViX2NoYW5nZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwKKwkJICAgICBpbnQgZHR5cGUpCit7CisJaW50IGVycjsKKworCXViaWZzX2Fzc2VydCghYy0+cm9fbWVkaWEgJiYgIWMtPnJvX21vdW50KTsKKwlpZiAoYy0+cm9fZXJyb3IpCisJCXJldHVybiAtRVJPRlM7CisJaWYgKCFkYmdfaXNfdHN0X3JjdnJ5KGMpKQorCQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7CisJZWxzZQorCQllcnIgPSBkYmdfbGViX2NoYW5nZShjLCBsbnVtLCBidWYsIGxlbiwgZHR5cGUpOworCWlmIChlcnIpIHsKKwkJdWJpZnNfZXJyKCJjaGFuZ2luZyAlZCBieXRlcyBpbiBMRUIgJWQgZmFpbGVkLCBlcnJvciAlZCIsCisJCQkgIGxlbiwgbG51bSwgZXJyKTsKKwkJdWJpZnNfcm9fbW9kZShjLCBlcnIpOworCQlkYmdfZHVtcF9zdGFjaygpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgdWJpZnNfbGViX3VubWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSkKK3sKKwlpbnQgZXJyOworCisJdWJpZnNfYXNzZXJ0KCFjLT5yb19tZWRpYSAmJiAhYy0+cm9fbW91bnQpOworCWlmIChjLT5yb19lcnJvcikKKwkJcmV0dXJuIC1FUk9GUzsKKwlpZiAoIWRiZ19pc190c3RfcmN2cnkoYykpCisJCWVyciA9IHViaV9sZWJfdW5tYXAoYy0+dWJpLCBsbnVtKTsKKwllbHNlCisJCWVyciA9IGRiZ19sZWJfdW5tYXAoYywgbG51bSk7CisJaWYgKGVycikgeworCQl1Ymlmc19lcnIoInVubWFwIExFQiAlZCBmYWlsZWQsIGVycm9yICVkIiwgbG51bSwgZXJyKTsKKwkJdWJpZnNfcm9fbW9kZShjLCBlcnIpOworCQlkYmdfZHVtcF9zdGFjaygpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgdWJpZnNfbGViX21hcChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGludCBkdHlwZSkKK3sKKwlpbnQgZXJyOworCisJdWJpZnNfYXNzZXJ0KCFjLT5yb19tZWRpYSAmJiAhYy0+cm9fbW91bnQpOworCWlmIChjLT5yb19lcnJvcikKKwkJcmV0dXJuIC1FUk9GUzsKKwlpZiAoIWRiZ19pc190c3RfcmN2cnkoYykpCisJCWVyciA9IHViaV9sZWJfbWFwKGMtPnViaSwgbG51bSwgZHR5cGUpOworCWVsc2UKKwkJZXJyID0gZGJnX2xlYl9tYXAoYywgbG51bSwgZHR5cGUpOworCWlmIChlcnIpIHsKKwkJdWJpZnNfZXJyKCJtYXBwaW5nIExFQiAlZCBmYWlsZWQsIGVycm9yICVkIiwgbG51bSwgZXJyKTsKKwkJdWJpZnNfcm9fbW9kZShjLCBlcnIpOworCQlkYmdfZHVtcF9zdGFjaygpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgdWJpZnNfaXNfbWFwcGVkKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdWJpX2lzX21hcHBlZChjLT51YmksIGxudW0pOworCWlmIChlcnIgPCAwKSB7CisJCXViaWZzX2VycigidWJpX2lzX21hcHBlZCBmYWlsZWQgZm9yIExFQiAlZCwgZXJyb3IgJWQiLAorCQkJICBsbnVtLCBlcnIpOworCQlkYmdfZHVtcF9zdGFjaygpOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiAvKioKQEAgLTQwNiwxNCArNTIzLDEwIEBACiAJZGlydCA9IHN5bmNfbGVuIC0gd2J1Zi0+dXNlZDsKIAlpZiAoZGlydCkKIAkJdWJpZnNfcGFkKGMsIHdidWYtPmJ1ZiArIHdidWYtPnVzZWQsIGRpcnQpOwotCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCB3YnVmLT5sbnVtLCB3YnVmLT5idWYsIHdidWYtPm9mZnMsCi0JCQkgICAgc3luY19sZW4sIHdidWYtPmR0eXBlKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHdyaXRlICVkIGJ5dGVzIHRvIExFQiAlZDolZCIsCi0JCQkgIHN5bmNfbGVuLCB3YnVmLT5sbnVtLCB3YnVmLT5vZmZzKTsKLQkJZGJnX2R1bXBfc3RhY2soKTsKKwllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgd2J1Zi0+bG51bSwgd2J1Zi0+YnVmLCB3YnVmLT5vZmZzLCBzeW5jX2xlbiwKKwkJCSAgICAgIHdidWYtPmR0eXBlKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXNwaW5fbG9jaygmd2J1Zi0+bG9jayk7CiAJd2J1Zi0+b2ZmcyArPSBzeW5jX2xlbjsKQEAgLTU4MSw2ICs2OTQsNyBAQAogCXViaWZzX2Fzc2VydCh3YnVmLT5zaXplICUgYy0+bWluX2lvX3NpemUgPT0gMCk7CiAJdWJpZnNfYXNzZXJ0KG11dGV4X2lzX2xvY2tlZCgmd2J1Zi0+aW9fbXV0ZXgpKTsKIAl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7CisJdWJpZnNfYXNzZXJ0KCFjLT5zcGFjZV9maXh1cCk7CiAJaWYgKGMtPmxlYl9zaXplIC0gd2J1Zi0+b2ZmcyA+PSBjLT5tYXhfd3JpdGVfc2l6ZSkKIAkJdWJpZnNfYXNzZXJ0KCEoKHdidWYtPm9mZnMgKyB3YnVmLT5zaXplKSAlIGMtPm1heF93cml0ZV9zaXplKSk7CiAKQEAgLTYwNCw5ICs3MTgsOSBAQAogCQlpZiAoYWxpZ25lZF9sZW4gPT0gd2J1Zi0+YXZhaWwpIHsKIAkJCWRiZ19pbygiZmx1c2ggamhlYWQgJXMgd2J1ZiB0byBMRUIgJWQ6JWQiLAogCQkJICAgICAgIGRiZ19qaGVhZCh3YnVmLT5qaGVhZCksIHdidWYtPmxudW0sIHdidWYtPm9mZnMpOwotCQkJZXJyID0gdWJpX2xlYl93cml0ZShjLT51YmksIHdidWYtPmxudW0sIHdidWYtPmJ1ZiwKLQkJCQkJICAgIHdidWYtPm9mZnMsIHdidWYtPnNpemUsCi0JCQkJCSAgICB3YnVmLT5kdHlwZSk7CisJCQllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgd2J1Zi0+bG51bSwgd2J1Zi0+YnVmLAorCQkJCQkgICAgICB3YnVmLT5vZmZzLCB3YnVmLT5zaXplLAorCQkJCQkgICAgICB3YnVmLT5kdHlwZSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCkBAIC02NDEsOCArNzU1LDggQEAKIAkJZGJnX2lvKCJmbHVzaCBqaGVhZCAlcyB3YnVmIHRvIExFQiAlZDolZCIsCiAJCSAgICAgICBkYmdfamhlYWQod2J1Zi0+amhlYWQpLCB3YnVmLT5sbnVtLCB3YnVmLT5vZmZzKTsKIAkJbWVtY3B5KHdidWYtPmJ1ZiArIHdidWYtPnVzZWQsIGJ1Ziwgd2J1Zi0+YXZhaWwpOwotCQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgd2J1Zi0+bG51bSwgd2J1Zi0+YnVmLCB3YnVmLT5vZmZzLAotCQkJCSAgICB3YnVmLT5zaXplLCB3YnVmLT5kdHlwZSk7CisJCWVyciA9IHViaWZzX2xlYl93cml0ZShjLCB3YnVmLT5sbnVtLCB3YnVmLT5idWYsIHdidWYtPm9mZnMsCisJCQkJICAgICAgd2J1Zi0+c2l6ZSwgd2J1Zi0+ZHR5cGUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKQEAgLTY2MCw4ICs3NzQsOCBAQAogCQkgKi8KIAkJZGJnX2lvKCJ3cml0ZSAlZCBieXRlcyB0byBMRUIgJWQ6JWQiLAogCQkgICAgICAgd2J1Zi0+c2l6ZSwgd2J1Zi0+bG51bSwgd2J1Zi0+b2Zmcyk7Ci0JCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCB3YnVmLT5sbnVtLCBidWYsIHdidWYtPm9mZnMsCi0JCQkJICAgIHdidWYtPnNpemUsIHdidWYtPmR0eXBlKTsKKwkJZXJyID0gdWJpZnNfbGViX3dyaXRlKGMsIHdidWYtPmxudW0sIGJ1Ziwgd2J1Zi0+b2ZmcywKKwkJCQkgICAgICB3YnVmLT5zaXplLCB3YnVmLT5kdHlwZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIApAQCAtNjgyLDggKzc5Niw4IEBACiAJCW4gPDw9IGMtPm1heF93cml0ZV9zaGlmdDsKIAkJZGJnX2lvKCJ3cml0ZSAlZCBieXRlcyB0byBMRUIgJWQ6JWQiLCBuLCB3YnVmLT5sbnVtLAogCQkgICAgICAgd2J1Zi0+b2Zmcyk7Ci0JCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCB3YnVmLT5sbnVtLCBidWYgKyB3cml0dGVuLAotCQkJCSAgICB3YnVmLT5vZmZzLCBuLCB3YnVmLT5kdHlwZSk7CisJCWVyciA9IHViaWZzX2xlYl93cml0ZShjLCB3YnVmLT5sbnVtLCBidWYgKyB3cml0dGVuLAorCQkJCSAgICAgIHdidWYtPm9mZnMsIG4sIHdidWYtPmR0eXBlKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQl3YnVmLT5vZmZzICs9IG47CkBAIC03NTksMTggKzg3MywxNSBAQAogCXViaWZzX2Fzc2VydChsbnVtID49IDAgJiYgbG51bSA8IGMtPmxlYl9jbnQgJiYgb2ZmcyA+PSAwKTsKIAl1Ymlmc19hc3NlcnQob2ZmcyAlIGMtPm1pbl9pb19zaXplID09IDAgJiYgb2ZmcyA8IGMtPmxlYl9zaXplKTsKIAl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7CisJdWJpZnNfYXNzZXJ0KCFjLT5zcGFjZV9maXh1cCk7CiAKIAlpZiAoYy0+cm9fZXJyb3IpCiAJCXJldHVybiAtRVJPRlM7CiAKIAl1Ymlmc19wcmVwYXJlX25vZGUoYywgYnVmLCBsZW4sIDEpOwotCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIGJ1Zl9sZW4sIGR0eXBlKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHdyaXRlICVkIGJ5dGVzIHRvIExFQiAlZDolZCwgZXJyb3IgJWQiLAotCQkJICBidWZfbGVuLCBsbnVtLCBvZmZzLCBlcnIpOworCWVyciA9IHViaWZzX2xlYl93cml0ZShjLCBsbnVtLCBidWYsIG9mZnMsIGJ1Zl9sZW4sIGR0eXBlKTsKKwlpZiAoZXJyKQogCQlkYmdfZHVtcF9ub2RlKGMsIGJ1Zik7Ci0JCWRiZ19kdW1wX3N0YWNrKCk7Ci0JfQogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTgyMiwxMyArOTMzLDkgQEAKIAogCWlmIChybGVuID4gMCkgewogCQkvKiBSZWFkIGV2ZXJ5dGhpbmcgdGhhdCBnb2VzIGJlZm9yZSB3cml0ZS1idWZmZXIgKi8KLQkJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIHJsZW4pOwotCQlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykgewotCQkJdWJpZnNfZXJyKCJmYWlsZWQgdG8gcmVhZCBub2RlICVkIGZyb20gTEVCICVkOiVkLCAiCi0JCQkJICAiZXJyb3IgJWQiLCB0eXBlLCBsbnVtLCBvZmZzLCBlcnIpOwotCQkJZGJnX2R1bXBfc3RhY2soKTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCBvZmZzLCBybGVuLCAwKTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCiAJCQlyZXR1cm4gZXJyOwotCQl9CiAJfQogCiAJaWYgKHR5cGUgIT0gY2gtPm5vZGVfdHlwZSkgewpAQCAtODgzLDEyICs5OTAsOSBAQAogCXViaWZzX2Fzc2VydCghKG9mZnMgJiA3KSAmJiBvZmZzIDwgYy0+bGViX3NpemUpOwogCXViaWZzX2Fzc2VydCh0eXBlID49IDAgJiYgdHlwZSA8IFVCSUZTX05PREVfVFlQRVNfQ05UKTsKIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOwotCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHJlYWQgbm9kZSAlZCBmcm9tIExFQiAlZDolZCwgZXJyb3IgJWQiLAotCQkJICB0eXBlLCBsbnVtLCBvZmZzLCBlcnIpOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1Ziwgb2ZmcywgbGVuLCAwKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlpZiAodHlwZSAhPSBjaC0+bm9kZV90eXBlKSB7CiAJCXViaWZzX2VycigiYmFkIG5vZGUgdHlwZSAoJWQgYnV0IGV4cGVjdGVkICVkKSIsCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9qb3VybmFsLmMgYi9mcy91Ymlmcy9qb3VybmFsLmMKaW5kZXggMzRiMTY3OS4uY2VmMDQ2MCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvam91cm5hbC5jCisrKyBiL2ZzL3ViaWZzL2pvdXJuYWwuYwpAQCAtNjY5LDYgKzY2OSw3IEBACiAKIG91dF9yZWxlYXNlOgogCXJlbGVhc2VfaGVhZChjLCBCQVNFSEQpOworCWtmcmVlKGRlbnQpOwogb3V0X3JvOgogCXViaWZzX3JvX21vZGUoYywgZXJyKTsKIAlpZiAobGFzdF9yZWZlcmVuY2UpCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9sb2cuYyBiL2ZzL3ViaWZzL2xvZy5jCmluZGV4IGFmZmVhOTQuLmY5ZmQwNjggMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xvZy5jCisrKyBiL2ZzL3ViaWZzL2xvZy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkJICogYW4gdW5jbGVhbiByZWJvb3QsIGJlY2F1c2UgdGhlIHRhcmdldCBMRUIgbWlnaHQgaGF2ZSBiZWVuCiAJCSAqIHVubWFwcGVkLCBidXQgbm90IHlldCBwaHlzaWNhbGx5IGVyYXNlZC4KIAkJICovCi0JCWVyciA9IHViaV9sZWJfbWFwKGMtPnViaSwgYnVkLT5sbnVtLCBVQklfU0hPUlRURVJNKTsKKwkJZXJyID0gdWJpZnNfbGViX21hcChjLCBidWQtPmxudW0sIFVCSV9TSE9SVFRFUk0pOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfdW5sb2NrOwogCX0KQEAgLTI4Myw4ICsyODMsNiBAQAogCXJldHVybiAwOwogCiBvdXRfdW5sb2NrOgotCWlmIChlcnIgIT0gLUVBR0FJTikKLQkJdWJpZnNfcm9fbW9kZShjLCBlcnIpOwogCW11dGV4X3VubG9jaygmYy0+bG9nX211dGV4KTsKIAlrZnJlZShyZWYpOwogCWtmcmVlKGJ1ZCk7CkBAIC03NTIsNyArNzUwLDcgQEAKIAlzdHJ1Y3QgdWJpZnNfYnVkICpidWQ7CiAJbG9uZyBsb25nIGJ1ZF9ieXRlcyA9IDA7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpKQogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9jaygmYy0+YnVkc19sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2xwcm9wcy5jIGIvZnMvdWJpZnMvbHByb3BzLmMKaW5kZXggNjY3ODg0Zi4uZjhhMTgxZSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvbHByb3BzLmMKKysrIGIvZnMvdWJpZnMvbHByb3BzLmMKQEAgLTUwNCw3ICs1MDQsNyBAQAogCXBub2RlID0gKHN0cnVjdCB1Ymlmc19wbm9kZSAqKWNvbnRhaW5lcl9vZihscHJvcHMgLSBwb3MsCiAJCQkJCQkgICBzdHJ1Y3QgdWJpZnNfcG5vZGUsCiAJCQkJCQkgICBscHJvcHNbMF0pOwotCXJldHVybiAhdGVzdF9iaXQoQ09XX1pOT0RFLCAmcG5vZGUtPmZsYWdzKSAmJgorCXJldHVybiAhdGVzdF9iaXQoQ09XX0NOT0RFLCAmcG5vZGUtPmZsYWdzKSAmJgogCSAgICAgICB0ZXN0X2JpdChESVJUWV9DTk9ERSwgJnBub2RlLT5mbGFncyk7CiB9CiAKQEAgLTg2MCw3ICs4NjAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlpbnQgaSwgY2F0OwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgKFVCSUZTX0NIS19HRU4gfCBVQklGU19DSEtfTFBST1BTKSkpCisJaWYgKCFkYmdfaXNfY2hrX2dlbihjKSAmJiAhZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShscHJvcHMsICZjLT5lbXB0eV9saXN0LCBsaXN0KSB7CkBAIC05NTgsNyArOTU4LDcgQEAKIHsKIAlpbnQgaSA9IDAsIGosIGVyciA9IDA7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiAoVUJJRlNfQ0hLX0dFTiB8IFVCSUZTX0NIS19MUFJPUFMpKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpICYmICFkYmdfaXNfY2hrX2xwcm9wcyhjKSkKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IGhlYXAtPmNudDsgaSsrKSB7CkBAIC0xMjYyLDcgKzEyNjIsNyBAQAogCWludCBpLCBlcnI7CiAJc3RydWN0IHViaWZzX2xwX3N0YXRzIGxzdDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19MUFJPUFMpKQorCWlmICghZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2xwdC5jIGIvZnMvdWJpZnMvbHB0LmMKaW5kZXggZWY1MTU1ZS4uNjE4OWM3NCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvbHB0LmMKKysrIGIvZnMvdWJpZnMvbHB0LmMKQEAgLTcwMSw4ICs3MDEsOCBAQAogCQkJYWxlbiA9IEFMSUdOKGxlbiwgYy0+bWluX2lvX3NpemUpOwogCQkJc2V0X2x0YWIoYywgbG51bSwgYy0+bGViX3NpemUgLSBhbGVuLCBhbGVuIC0gbGVuKTsKIAkJCW1lbXNldChwLCAweGZmLCBhbGVuIC0gbGVuKTsKLQkJCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSsrLCBidWYsIGFsZW4sCi0JCQkJCSAgICAgVUJJX1NIT1JUVEVSTSk7CisJCQllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0rKywgYnVmLCBhbGVuLAorCQkJCQkgICAgICAgVUJJX1NIT1JUVEVSTSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCQkJcCA9IGJ1ZjsKQEAgLTczMiw4ICs3MzIsOCBAQAogCQkJCXNldF9sdGFiKGMsIGxudW0sIGMtPmxlYl9zaXplIC0gYWxlbiwKIAkJCQkJICAgIGFsZW4gLSBsZW4pOwogCQkJCW1lbXNldChwLCAweGZmLCBhbGVuIC0gbGVuKTsKLQkJCQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0rKywgYnVmLCBhbGVuLAotCQkJCQkJICAgICBVQklfU0hPUlRURVJNKTsKKwkJCQllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0rKywgYnVmLCBhbGVuLAorCQkJCQkJICAgICAgIFVCSV9TSE9SVFRFUk0pOwogCQkJCWlmIChlcnIpCiAJCQkJCWdvdG8gb3V0OwogCQkJCXAgPSBidWY7CkBAIC03ODAsOCArNzgwLDggQEAKIAkJCWFsZW4gPSBBTElHTihsZW4sIGMtPm1pbl9pb19zaXplKTsKIAkJCXNldF9sdGFiKGMsIGxudW0sIGMtPmxlYl9zaXplIC0gYWxlbiwgYWxlbiAtIGxlbik7CiAJCQltZW1zZXQocCwgMHhmZiwgYWxlbiAtIGxlbik7Ci0JCQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0rKywgYnVmLCBhbGVuLAotCQkJCQkgICAgIFVCSV9TSE9SVFRFUk0pOworCQkJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtKyssIGJ1ZiwgYWxlbiwKKwkJCQkJICAgICAgIFVCSV9TSE9SVFRFUk0pOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIAkJCXAgPSBidWY7CkBAIC04MDYsNyArODA2LDcgQEAKIAkJYWxlbiA9IEFMSUdOKGxlbiwgYy0+bWluX2lvX3NpemUpOwogCQlzZXRfbHRhYihjLCBsbnVtLCBjLT5sZWJfc2l6ZSAtIGFsZW4sIGFsZW4gLSBsZW4pOwogCQltZW1zZXQocCwgMHhmZiwgYWxlbiAtIGxlbik7Ci0JCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSsrLCBidWYsIGFsZW4sIFVCSV9TSE9SVFRFUk0pOworCQllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0rKywgYnVmLCBhbGVuLCBVQklfU0hPUlRURVJNKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlwID0gYnVmOwpAQCAtODI2LDcgKzgyNiw3IEBACiAKIAkvKiBXcml0ZSByZW1haW5pbmcgYnVmZmVyICovCiAJbWVtc2V0KHAsIDB4ZmYsIGFsZW4gLSBsZW4pOwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSwgYnVmLCBhbGVuLCBVQklfU0hPUlRURVJNKTsKKwllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0sIGJ1ZiwgYWxlbiwgVUJJX1NIT1JUVEVSTSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTEyMjIsNyArMTIyMiw3IEBACiAJCWlmIChjLT5iaWdfbHB0KQogCQkJbm5vZGUtPm51bSA9IGNhbGNfbm5vZGVfbnVtX2Zyb21fcGFyZW50KGMsIHBhcmVudCwgaWlwKTsKIAl9IGVsc2UgewotCQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIGJ1Ziwgb2ZmcywgYy0+bm5vZGVfc3opOworCQllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIG9mZnMsIGMtPm5ub2RlX3N6LCAxKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQllcnIgPSB1Ymlmc191bnBhY2tfbm5vZGUoYywgYnVmLCBubm9kZSk7CkBAIC0xMjQ3LDYgKzEyNDcsNyBAQAogCiBvdXQ6CiAJdWJpZnNfZXJyKCJlcnJvciAlZCByZWFkaW5nIG5ub2RlIGF0ICVkOiVkIiwgZXJyLCBsbnVtLCBvZmZzKTsKKwlkYmdfZHVtcF9zdGFjaygpOwogCWtmcmVlKG5ub2RlKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTI5MCw3ICsxMjkxLDcgQEAKIAkJCWxwcm9wcy0+ZmxhZ3MgPSB1Ymlmc19jYXRlZ29yaXplX2xwcm9wcyhjLCBscHJvcHMpOwogCQl9CiAJfSBlbHNlIHsKLQkJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIGMtPnBub2RlX3N6KTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCBvZmZzLCBjLT5wbm9kZV9zeiwgMSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJZXJyID0gdW5wYWNrX3Bub2RlKGMsIGJ1ZiwgcG5vZGUpOwpAQCAtMTMxMiw2ICsxMzEzLDcgQEAKIG91dDoKIAl1Ymlmc19lcnIoImVycm9yICVkIHJlYWRpbmcgcG5vZGUgYXQgJWQ6JWQiLCBlcnIsIGxudW0sIG9mZnMpOwogCWRiZ19kdW1wX3Bub2RlKGMsIHBub2RlLCBwYXJlbnQsIGlpcCk7CisJZGJnX2R1bXBfc3RhY2soKTsKIAlkYmdfbXNnKCJjYWxjIG51bTogJWQiLCBjYWxjX3Bub2RlX251bV9mcm9tX3BhcmVudChjLCBwYXJlbnQsIGlpcCkpOwogCWtmcmVlKHBub2RlKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTMzMSw3ICsxMzMzLDcgQEAKIAlidWYgPSB2bWFsbG9jKGMtPmx0YWJfc3opOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGMtPmx0YWJfbG51bSwgYnVmLCBjLT5sdGFiX29mZnMsIGMtPmx0YWJfc3opOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGMtPmx0YWJfbG51bSwgYnVmLCBjLT5sdGFiX29mZnMsIGMtPmx0YWJfc3osIDEpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWVyciA9IHVucGFja19sdGFiKGMsIGJ1Zik7CkBAIC0xMzU0LDcgKzEzNTYsOCBAQAogCWJ1ZiA9IHZtYWxsb2MoYy0+bHNhdmVfc3opOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGMtPmxzYXZlX2xudW0sIGJ1ZiwgYy0+bHNhdmVfb2ZmcywgYy0+bHNhdmVfc3opOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGMtPmxzYXZlX2xudW0sIGJ1ZiwgYy0+bHNhdmVfb2ZmcywKKwkJCSAgICAgYy0+bHNhdmVfc3osIDEpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWVyciA9IHVucGFja19sc2F2ZShjLCBidWYpOwpAQCAtMTgxNCw4ICsxODE3LDggQEAKIAkJaWYgKGMtPmJpZ19scHQpCiAJCQlubm9kZS0+bnVtID0gY2FsY19ubm9kZV9udW1fZnJvbV9wYXJlbnQoYywgcGFyZW50LCBpaXApOwogCX0gZWxzZSB7Ci0JCWVyciA9IHViaV9yZWFkKGMtPnViaSwgYnJhbmNoLT5sbnVtLCBidWYsIGJyYW5jaC0+b2ZmcywKLQkJCSAgICAgICBjLT5ubm9kZV9zeik7CisJCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGJyYW5jaC0+bG51bSwgYnVmLCBicmFuY2gtPm9mZnMsCisJCQkJICAgICBjLT5ubm9kZV9zeiwgMSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCQllcnIgPSB1Ymlmc191bnBhY2tfbm5vZGUoYywgYnVmLCBubm9kZSk7CkBAIC0xODgzLDggKzE4ODYsOCBAQAogCQl1Ymlmc19hc3NlcnQoYnJhbmNoLT5sbnVtID49IGMtPmxwdF9maXJzdCAmJgogCQkJICAgICBicmFuY2gtPmxudW0gPD0gYy0+bHB0X2xhc3QpOwogCQl1Ymlmc19hc3NlcnQoYnJhbmNoLT5vZmZzID49IDAgJiYgYnJhbmNoLT5vZmZzIDwgYy0+bGViX3NpemUpOwotCQllcnIgPSB1YmlfcmVhZChjLT51YmksIGJyYW5jaC0+bG51bSwgYnVmLCBicmFuY2gtPm9mZnMsCi0JCQkgICAgICAgYy0+cG5vZGVfc3opOworCQllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBicmFuY2gtPmxudW0sIGJ1ZiwgYnJhbmNoLT5vZmZzLAorCQkJCSAgICAgYy0+cG5vZGVfc3osIDEpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAkJZXJyID0gdW5wYWNrX3Bub2RlKGMsIGJ1ZiwgcG5vZGUpOwpAQCAtMjIyNCw3ICsyMjI3LDcgQEAKIAlzdHJ1Y3QgdWJpZnNfY25vZGUgKmNuOwogCWludCBudW0sIGlpcCA9IDAsIGVycjsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19MUFJPUFMpKQorCWlmICghZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJd2hpbGUgKGNub2RlKSB7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9scHRfY29tbWl0LmMgYi9mcy91Ymlmcy9scHRfY29tbWl0LmMKaW5kZXggZGZjYjU3NC4uY2RkZDZiZCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvbHB0X2NvbW1pdC5jCisrKyBiL2ZzL3ViaWZzL2xwdF9jb21taXQuYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3JjMTYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSAidWJpZnMuaCIKIAogI2lmZGVmIENPTkZJR19VQklGU19GU19ERUJVRwpAQCAtMTE2LDggKzExNyw4IEBACiAJCXJldHVybiAwOwogCWNudCArPSAxOwogCXdoaWxlICgxKSB7Ci0JCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoQ09XX1pOT0RFLCAmY25vZGUtPmZsYWdzKSk7Ci0JCV9fc2V0X2JpdChDT1dfWk5PREUsICZjbm9kZS0+ZmxhZ3MpOworCQl1Ymlmc19hc3NlcnQoIXRlc3RfYml0KENPV19DTk9ERSwgJmNub2RlLT5mbGFncykpOworCQlfX3NldF9iaXQoQ09XX0NOT0RFLCAmY25vZGUtPmZsYWdzKTsKIAkJY25leHQgPSBuZXh0X2RpcnR5X2Nub2RlKGNub2RlKTsKIAkJaWYgKCFjbmV4dCkgewogCQkJY25vZGUtPmNuZXh0ID0gYy0+bHB0X2NuZXh0OwpAQCAtNDY1LDcgKzQ2Niw3IEBACiAJCSAqLwogCQljbGVhcl9iaXQoRElSVFlfQ05PREUsICZjbm9kZS0+ZmxhZ3MpOwogCQlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKLQkJY2xlYXJfYml0KENPV19aTk9ERSwgJmNub2RlLT5mbGFncyk7CisJCWNsZWFyX2JpdChDT1dfQ05PREUsICZjbm9kZS0+ZmxhZ3MpOwogCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCQlvZmZzICs9IGxlbjsKIAkJZGJnX2Noa19scHRfc3ooYywgMSwgbGVuKTsKQEAgLTExNjAsMTEgKzExNjEsMTEgQEAKIAl2b2lkICpidWYgPSBjLT5scHRfYnVmOwogCiAJZGJnX2xwKCJMRUIgJWQiLCBsbnVtKTsKLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIGJ1ZiwgMCwgYy0+bGViX3NpemUpOwotCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgcmVhZCBMRUIgJWQsIGVycm9yICVkIiwgbG51bSwgZXJyKTsKKworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1ZiwgMCwgYy0+bGViX3NpemUsIDEpOworCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JfQorCiAJd2hpbGUgKDEpIHsKIAkJaWYgKCFpc19hX25vZGUoYywgYnVmLCBsZW4pKSB7CiAJCQlpbnQgcGFkX2xlbjsKQEAgLTE2NDAsNyArMTY0MSw3IEBACiAJaW50IHJldDsKIAl2b2lkICpidWYsICpwOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0xQUk9QUykpCisJaWYgKCFkYmdfaXNfY2hrX2xwcm9wcyhjKSkKIAkJcmV0dXJuIDA7CiAKIAlidWYgPSBwID0gX192bWFsbG9jKGMtPmxlYl9zaXplLCBHRlBfTk9GUywgUEFHRV9LRVJORUwpOwpAQCAtMTY1MCwxMSArMTY1MSwxMSBAQAogCX0KIAogCWRiZ19scCgiTEVCICVkIiwgbG51bSk7Ci0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIDAsIGMtPmxlYl9zaXplKTsKLQlpZiAoZXJyKSB7Ci0JCWRiZ19tc2coInViaV9yZWFkIGZhaWxlZCwgTEVCICVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7CisKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIDAsIGMtPmxlYl9zaXplLCAxKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQl9CisKIAl3aGlsZSAoMSkgewogCQlpZiAoIWlzX2Ffbm9kZShjLCBwLCBsZW4pKSB7CiAJCQlpbnQgaSwgcGFkX2xlbjsKQEAgLTE3MTEsNyArMTcxMiw3IEBACiB7CiAJaW50IGxudW0sIGVyciwgaSwgY250OwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0xQUk9QUykpCisJaWYgKCFkYmdfaXNfY2hrX2xwcm9wcyhjKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBCcmluZyB0aGUgZW50aXJlIHRyZWUgaW50byBtZW1vcnkgKi8KQEAgLTE3NTQsNyArMTc1NSw3IEBACiAJbG9uZyBsb25nIGZyZWUgPSAwOwogCWludCBpOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0xQUk9QUykpCisJaWYgKCFkYmdfaXNfY2hrX2xwcm9wcyhjKSkKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYy0+bHB0X2xlYnM7IGkrKykgewpAQCAtMTc5Niw3ICsxNzk3LDcgQEAKIAlsb25nIGxvbmcgY2hrX2xwdF9zeiwgbHB0X3N6OwogCWludCBlcnIgPSAwOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0xQUk9QUykpCisJaWYgKCFkYmdfaXNfY2hrX2xwcm9wcyhjKSkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewpAQCAtMTkwMSwxMSArMTkwMiwxMCBAQAogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIDAsIGMtPmxlYl9zaXplKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHJlYWQgTEVCICVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7CisJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCAwLCBjLT5sZWJfc2l6ZSwgMSk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JfQorCiAJd2hpbGUgKDEpIHsKIAkJb2ZmcyA9IGMtPmxlYl9zaXplIC0gbGVuOwogCQlpZiAoIWlzX2Ffbm9kZShjLCBwLCBsZW4pKSB7CkBAIC0yMDE5LDcgKzIwMTksNyBAQAogCXN0cnVjdCB1Ymlmc19scHRfaGVhcCAqaGVhcDsKIAlpbnQgaTsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykpCiAJCXJldHVybiAwOwogCWlmIChyYW5kb20zMigpICYgMykKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9taXNjLmggYi9mcy91Ymlmcy9taXNjLmgKaW5kZXggMGI1Mjk2YS4uZWU3Y2I1ZSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvbWlzYy5oCisrKyBiL2ZzL3ViaWZzL21pc2MuaApAQCAtMzksNiArMzksMjkgQEAKIH0KIAogLyoqCisgKiB1Ymlmc196bl9vYnNvbGV0ZSAtIGNoZWNrIGlmIHpub2RlIGlzIG9ic29sZXRlLgorICogQHpub2RlOiB6bm9kZSB0byBjaGVjaworICoKKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJldHVybnMgJTEgaWYgQHpub2RlIGlzIG9ic29sZXRlIGFuZCAlMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHViaWZzX3puX29ic29sZXRlKGNvbnN0IHN0cnVjdCB1Ymlmc196bm9kZSAqem5vZGUpCit7CisJcmV0dXJuICEhdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpOworfQorCisvKioKKyAqIHViaWZzX3puX2NvdyAtIGNoZWNrIGlmIHpub2RlIGhhcyB0byBiZSBjb3BpZWQgb24gd3JpdGUuCisgKiBAem5vZGU6IHpub2RlIHRvIGNoZWNrCisgKgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmV0dXJucyAlMSBpZiBAem5vZGUgaXMgaGFzIENPVyBmbGFnIHNldCBhbmQgJTAKKyAqIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdWJpZnNfem5fY293KGNvbnN0IHN0cnVjdCB1Ymlmc196bm9kZSAqem5vZGUpCit7CisJcmV0dXJuICEhdGVzdF9iaXQoQ09XX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKK30KKworLyoqCiAgKiB1Ymlmc193YWtlX3VwX2JndCAtIHdha2UgdXAgYmFja2dyb3VuZCB0aHJlYWQuCiAgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CiAgKi8KQEAgLTEyMiw4NiArMTQ1LDYgQEAKIH0KIAogLyoqCi0gKiB1Ymlmc19sZWJfdW5tYXAgLSB1bm1hcCBhbiBMRUIuCi0gKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAbG51bTogTEVCIG51bWJlciB0byB1bm1hcAotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgdWJpZnNfbGViX3VubWFwKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSkKLXsKLQlpbnQgZXJyOwotCi0JdWJpZnNfYXNzZXJ0KCFjLT5yb19tZWRpYSAmJiAhYy0+cm9fbW91bnQpOwotCWlmIChjLT5yb19lcnJvcikKLQkJcmV0dXJuIC1FUk9GUzsKLQllcnIgPSB1YmlfbGViX3VubWFwKGMtPnViaSwgbG51bSk7Ci0JaWYgKGVycikgewotCQl1Ymlmc19lcnIoInVubWFwIExFQiAlZCBmYWlsZWQsIGVycm9yICVkIiwgbG51bSwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB1Ymlmc19sZWJfd3JpdGUgLSB3cml0ZSB0byBhIExFQi4KLSAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqIEBsbnVtOiBMRUIgbnVtYmVyIHRvIHdyaXRlCi0gKiBAYnVmOiBidWZmZXIgdG8gd3JpdGUgZnJvbQotICogQG9mZnM6IG9mZnNldCB3aXRoaW4gTEVCIHRvIHdyaXRlIHRvCi0gKiBAbGVuOiBsZW5ndGggdG8gd3JpdGUKLSAqIEBkdHlwZTogZGF0YSB0eXBlCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludCB1Ymlmc19sZWJfd3JpdGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAotCQkJCSAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgb2ZmcywgaW50IGxlbiwgaW50IGR0eXBlKQotewotCWludCBlcnI7Ci0KLQl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7Ci0JaWYgKGMtPnJvX2Vycm9yKQotCQlyZXR1cm4gLUVST0ZTOwotCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIGxlbiwgZHR5cGUpOwotCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJ3cml0aW5nICVkIGJ5dGVzIGF0ICVkOiVkLCBlcnJvciAlZCIsCi0JCQkgIGxlbiwgbG51bSwgb2ZmcywgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB1Ymlmc19sZWJfY2hhbmdlIC0gYXRvbWljIExFQiBjaGFuZ2UuCi0gKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAbG51bTogTEVCIG51bWJlciB0byB3cml0ZQotICogQGJ1ZjogYnVmZmVyIHRvIHdyaXRlIGZyb20KLSAqIEBsZW46IGxlbmd0aCB0byB3cml0ZQotICogQGR0eXBlOiBkYXRhIHR5cGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHViaWZzX2xlYl9jaGFuZ2UoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAotCQkJCSAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IGR0eXBlKQotewotCWludCBlcnI7Ci0KLQl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7Ci0JaWYgKGMtPnJvX2Vycm9yKQotCQlyZXR1cm4gLUVST0ZTOwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSwgYnVmLCBsZW4sIGR0eXBlKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2hhbmdpbmcgJWQgYnl0ZXMgaW4gTEVCICVkLCBlcnJvciAlZCIsCi0JCQkgIGxlbiwgbG51bSwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiB1Ymlmc19lbmNvZGVfZGV2IC0gZW5jb2RlIGRldmljZSBub2RlIElEcy4KICAqIEBkZXY6IFVCSUZTIGRldmljZSBub2RlIGluZm9ybWF0aW9uCiAgKiBAcmRldjogZGV2aWNlIElEcyB0byBlbmNvZGUKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL29ycGhhbi5jIGIvZnMvdWJpZnMvb3JwaGFuLmMKaW5kZXggYmQ2NDRiZi4uYzU0MmM3MyAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvb3JwaGFuLmMKKysrIGIvZnMvdWJpZnMvb3JwaGFuLmMKQEAgLTY3NCw3ICs2NzQsNyBAQAogCQlpZiAoSVNfRVJSKHNsZWIpKSB7CiAJCQlpZiAoUFRSX0VSUihzbGViKSA9PSAtRVVDTEVBTikKIAkJCQlzbGViID0gdWJpZnNfcmVjb3Zlcl9sZWIoYywgbG51bSwgMCwKLQkJCQkJCQkgYy0+c2J1ZiwgMCk7CisJCQkJCQkJIGMtPnNidWYsIC0xKTsKIAkJCWlmIChJU19FUlIoc2xlYikpIHsKIAkJCQllcnIgPSBQVFJfRVJSKHNsZWIpOwogCQkJCWJyZWFrOwpAQCAtOTI5LDcgKzkyOSw3IEBACiAJc3RydWN0IGNoZWNrX2luZm8gY2k7CiAJaW50IGVycjsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19PUlBIKSkKKwlpZiAoIWRiZ19pc19jaGtfb3JwaChjKSkKIAkJcmV0dXJuIDA7CiAKIAljaS5sYXN0X2lubyA9IDA7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9yZWNvdmVyeS5jIGIvZnMvdWJpZnMvcmVjb3ZlcnkuYwppbmRleCA3MzFkOWUyLi5hZjAyNzkwIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9yZWNvdmVyeS5jCisrKyBiL2ZzL3ViaWZzL3JlY292ZXJ5LmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCWlmICghc2J1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIHNidWYsIDAsIGMtPmxlYl9zaXplKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBzYnVmLCAwLCBjLT5sZWJfc2l6ZSwgMCk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKQEAgLTIxMywxMCArMjEzLDEwIEBACiAJbXN0LT5mbGFncyB8PSBjcHVfdG9fbGUzMihVQklGU19NU1RfUkNWUlkpOwogCiAJdWJpZnNfcHJlcGFyZV9ub2RlKGMsIG1zdCwgVUJJRlNfTVNUX05PREVfU1osIDEpOwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSwgbXN0LCBzeiwgVUJJX1NIT1JUVEVSTSk7CisJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtLCBtc3QsIHN6LCBVQklfU0hPUlRURVJNKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0gKyAxLCBtc3QsIHN6LCBVQklfU0hPUlRURVJNKTsKKwllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0gKyAxLCBtc3QsIHN6LCBVQklfU0hPUlRURVJNKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIG91dDoKQEAgLTI3NCw3ICsyNzQsOCBAQAogCQkJCWlmIChjb3IxKQogCQkJCQlnb3RvIG91dF9lcnI7CiAJCQkJbXN0ID0gbXN0MTsKLQkJCX0gZWxzZSBpZiAob2ZmczEgPT0gMCAmJiBvZmZzMiArIHN6ID49IGMtPmxlYl9zaXplKSB7CisJCQl9IGVsc2UgaWYgKG9mZnMxID09IDAgJiYKKwkJCQkgICBjLT5sZWJfc2l6ZSAtIG9mZnMyIC0gc3ogPCBzeikgewogCQkJCS8qIDFzdCBMRUIgd2FzIHVubWFwcGVkIGFuZCB3cml0dGVuLCAybmQgbm90ICovCiAJCQkJaWYgKGNvcjEpCiAJCQkJCWdvdG8gb3V0X2VycjsKQEAgLTUzOSw4ICs1NDAsOCBAQAogCQkJaW50IGxlbiA9IEFMSUdOKGVuZHB0LCBjLT5taW5faW9fc2l6ZSk7CiAKIAkJCWlmIChzdGFydCkgewotCQkJCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgc2xlYi0+YnVmLCAwLAotCQkJCQkgICAgICAgc3RhcnQpOworCQkJCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIHNsZWItPmJ1ZiwgMCwKKwkJCQkJCSAgICAgc3RhcnQsIDEpOwogCQkJCWlmIChlcnIpCiAJCQkJCXJldHVybiBlcnI7CiAJCQl9CkBAIC01NTQsOCArNTU1LDggQEAKIAkJCQkJdWJpZnNfcGFkKGMsIGJ1ZiwgcGFkX2xlbik7CiAJCQkJfQogCQkJfQotCQkJZXJyID0gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBzbGViLT5idWYsIGxlbiwKLQkJCQkJICAgICBVQklfVU5LTk9XTik7CisJCQllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0sIHNsZWItPmJ1ZiwgbGVuLAorCQkJCQkgICAgICAgVUJJX1VOS05PV04pOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC01NjQsMTkgKzU2NSwxNSBAQAogfQogCiAvKioKLSAqIGRyb3BfbGFzdF9ub2RlIC0gZHJvcCB0aGUgbGFzdCBub2RlIG9yIGdyb3VwIG9mIG5vZGVzLgorICogZHJvcF9sYXN0X2dyb3VwIC0gZHJvcCB0aGUgbGFzdCBncm91cCBvZiBub2Rlcy4KICAqIEBzbGViOiBzY2FubmVkIExFQiBpbmZvcm1hdGlvbgogICogQG9mZnM6IG9mZnNldCBvZiBkcm9wcGVkIG5vZGVzIGlzIHJldHVybmVkIGhlcmUKLSAqIEBncm91cGVkOiBub24temVybyBpZiB3aG9sZSBncm91cCBvZiBub2RlcyBoYXZlIHRvIGJlIGRyb3BwZWQKICAqCiAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciAndWJpZnNfcmVjb3Zlcl9sZWIoKScgd2hpY2ggZHJvcHMgdGhlIGxhc3QKLSAqIG5vZGUgb2YgdGhlIHNjYW5uZWQgTEVCIG9yIHRoZSBsYXN0IGdyb3VwIG9mIG5vZGVzIGlmIEBncm91cGVkIGlzIG5vdCB6ZXJvLgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUxIGlmIGEgbm9kZSB3YXMgZHJvcHBlZCBhbmQgJTAgb3RoZXJ3aXNlLgorICogZ3JvdXAgb2Ygbm9kZXMgb2YgdGhlIHNjYW5uZWQgTEVCLgogICovCi1zdGF0aWMgaW50IGRyb3BfbGFzdF9ub2RlKHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50ICpvZmZzLCBpbnQgZ3JvdXBlZCkKK3N0YXRpYyB2b2lkIGRyb3BfbGFzdF9ncm91cChzdHJ1Y3QgdWJpZnNfc2Nhbl9sZWIgKnNsZWIsIGludCAqb2ZmcykKIHsKLQlpbnQgZHJvcHBlZCA9IDA7Ci0KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnNsZWItPm5vZGVzKSkgewogCQlzdHJ1Y3QgdWJpZnNfc2Nhbl9ub2RlICpzbm9kOwogCQlzdHJ1Y3QgdWJpZnNfY2ggKmNoOwpAQCAtNTg1LDE3ICs1ODIsNDAgQEAKIAkJCQkgIGxpc3QpOwogCQljaCA9IHNub2QtPm5vZGU7CiAJCWlmIChjaC0+Z3JvdXBfdHlwZSAhPSBVQklGU19JTl9OT0RFX0dST1VQKQotCQkJcmV0dXJuIGRyb3BwZWQ7Ci0JCWRiZ19yY3ZyeSgiZHJvcHBpbmcgbm9kZSBhdCAlZDolZCIsIHNsZWItPmxudW0sIHNub2QtPm9mZnMpOworCQkJYnJlYWs7CisKKwkJZGJnX3JjdnJ5KCJkcm9wcGluZyBncm91cGVkIG5vZGUgYXQgJWQ6JWQiLAorCQkJICBzbGViLT5sbnVtLCBzbm9kLT5vZmZzKTsKIAkJKm9mZnMgPSBzbm9kLT5vZmZzOwogCQlsaXN0X2RlbCgmc25vZC0+bGlzdCk7CiAJCWtmcmVlKHNub2QpOwogCQlzbGViLT5ub2Rlc19jbnQgLT0gMTsKLQkJZHJvcHBlZCA9IDE7Ci0JCWlmICghZ3JvdXBlZCkKLQkJCWJyZWFrOwogCX0KLQlyZXR1cm4gZHJvcHBlZDsKK30KKworLyoqCisgKiBkcm9wX2xhc3Rfbm9kZSAtIGRyb3AgdGhlIGxhc3Qgbm9kZS4KKyAqIEBzbGViOiBzY2FubmVkIExFQiBpbmZvcm1hdGlvbgorICogQG9mZnM6IG9mZnNldCBvZiBkcm9wcGVkIG5vZGVzIGlzIHJldHVybmVkIGhlcmUKKyAqIEBncm91cGVkOiBub24temVybyBpZiB3aG9sZSBncm91cCBvZiBub2RlcyBoYXZlIHRvIGJlIGRyb3BwZWQKKyAqCisgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciAndWJpZnNfcmVjb3Zlcl9sZWIoKScgd2hpY2ggZHJvcHMgdGhlIGxhc3QKKyAqIG5vZGUgb2YgdGhlIHNjYW5uZWQgTEVCLgorICovCitzdGF0aWMgdm9pZCBkcm9wX2xhc3Rfbm9kZShzdHJ1Y3QgdWJpZnNfc2Nhbl9sZWIgKnNsZWIsIGludCAqb2ZmcykKK3sKKwlzdHJ1Y3QgdWJpZnNfc2Nhbl9ub2RlICpzbm9kOworCisJaWYgKCFsaXN0X2VtcHR5KCZzbGViLT5ub2RlcykpIHsKKwkJc25vZCA9IGxpc3RfZW50cnkoc2xlYi0+bm9kZXMucHJldiwgc3RydWN0IHViaWZzX3NjYW5fbm9kZSwKKwkJCQkgIGxpc3QpOworCisJCWRiZ19yY3ZyeSgiZHJvcHBpbmcgbGFzdCBub2RlIGF0ICVkOiVkIiwgc2xlYi0+bG51bSwgc25vZC0+b2Zmcyk7CisJCSpvZmZzID0gc25vZC0+b2ZmczsKKwkJbGlzdF9kZWwoJnNub2QtPmxpc3QpOworCQlrZnJlZShzbm9kKTsKKwkJc2xlYi0+bm9kZXNfY250IC09IDE7CisJfQogfQogCiAvKioKQEAgLTYwNCw3ICs2MjQsOCBAQAogICogQGxudW06IExFQiBudW1iZXIKICAqIEBvZmZzOiBvZmZzZXQKICAqIEBzYnVmOiBMRUItc2l6ZWQgYnVmZmVyIHRvIHVzZQotICogQGdyb3VwZWQ6IG5vZGVzIG1heSBiZSBncm91cGVkIGZvciByZWNvdmVyeQorICogQGpoZWFkOiBqb3VybmFsIGhlYWQgbnVtYmVyIHRoaXMgTEVCIGJlbG9uZ3MgdG8gKCUtMSBpZiB0aGUgTEVCIGRvZXMgbm90CisgKiAgICAgICAgIGJlbG9uZyB0byBhbnkgam91cm5hbCBoZWFkKQogICoKICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhIHNjYW4gb2YgYSBMRUIsIGJ1dCBjYXRlcnMgZm9yIGVycm9ycyB0aGF0IG1pZ2h0IGhhdmUKICAqIGJlZW4gY2F1c2VkIGJ5IHRoZSB1bmNsZWFuIHVubW91bnQgZnJvbSB3aGljaCB3ZSBhcmUgYXR0ZW1wdGluZyB0byByZWNvdmVyLgpAQCAtNjEyLDEzICs2MzMsMTQgQEAKICAqIGZvdW5kLCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwogc3RydWN0IHViaWZzX3NjYW5fbGViICp1Ymlmc19yZWNvdmVyX2xlYihzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sCi0JCQkJCSBpbnQgb2Zmcywgdm9pZCAqc2J1ZiwgaW50IGdyb3VwZWQpCisJCQkJCSBpbnQgb2Zmcywgdm9pZCAqc2J1ZiwgaW50IGpoZWFkKQogewogCWludCByZXQgPSAwLCBlcnIsIGxlbiA9IGMtPmxlYl9zaXplIC0gb2Zmcywgc3RhcnQgPSBvZmZzLCBtaW5faW9fdW5pdDsKKwlpbnQgZ3JvdXBlZCA9IGpoZWFkID09IC0xID8gMCA6IGMtPmpoZWFkc1tqaGVhZF0uZ3JvdXBlZDsKIAlzdHJ1Y3QgdWJpZnNfc2Nhbl9sZWIgKnNsZWI7CiAJdm9pZCAqYnVmID0gc2J1ZiArIG9mZnM7CiAKLQlkYmdfcmN2cnkoIiVkOiVkIiwgbG51bSwgb2Zmcyk7CisJZGJnX3JjdnJ5KCIlZDolZCwgamhlYWQgJWQsIGdyb3VwZWQgJWQiLCBsbnVtLCBvZmZzLCBqaGVhZCwgZ3JvdXBlZCk7CiAKIAlzbGViID0gdWJpZnNfc3RhcnRfc2NhbihjLCBsbnVtLCBvZmZzLCBzYnVmKTsKIAlpZiAoSVNfRVJSKHNsZWIpKQpAQCAtNjM1LDcgKzY1Nyw3IEBACiAJCSAqIFNjYW4gcXVpZXRseSB1bnRpbCB0aGVyZSBpcyBhbiBlcnJvciBmcm9tIHdoaWNoIHdlIGNhbm5vdAogCQkgKiByZWNvdmVyCiAJCSAqLwotCQlyZXQgPSB1Ymlmc19zY2FuX2Ffbm9kZShjLCBidWYsIGxlbiwgbG51bSwgb2ZmcywgMCk7CisJCXJldCA9IHViaWZzX3NjYW5fYV9ub2RlKGMsIGJ1ZiwgbGVuLCBsbnVtLCBvZmZzLCAxKTsKIAkJaWYgKHJldCA9PSBTQ0FOTkVEX0FfTk9ERSkgewogCQkJLyogQSB2YWxpZCBub2RlLCBhbmQgbm90IGEgcGFkZGluZyBub2RlICovCiAJCQlzdHJ1Y3QgdWJpZnNfY2ggKmNoID0gYnVmOwpAQCAtNjk1LDU5ICs3MTcsNjIgQEAKIAkJICogSWYgbm9kZXMgYXJlIGdyb3VwZWQsIGFsd2F5cyBkcm9wIHRoZSBpbmNvbXBsZXRlIGdyb3VwIGF0CiAJCSAqIHRoZSBlbmQuCiAJCSAqLwotCQlkcm9wX2xhc3Rfbm9kZShzbGViLCAmb2ZmcywgMSk7CisJCWRyb3BfbGFzdF9ncm91cChzbGViLCAmb2Zmcyk7CiAKLQkvKgotCSAqIFdoaWxlIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzYW1lIG1pbi4gSS9PIHVuaXQga2VlcCBkcm9wcGluZwotCSAqIG5vZGVzLiBTbyBiYXNpY2FsbHksIHdoYXQgd2Ugd2FudCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGFzdCBtaW4uCi0JICogSS9PIHVuaXQgd2hlcmUgd2Ugc2F3IHRoZSBjb3JydXB0aW9uIGlzIGRyb3BwZWQgY29tcGxldGVseSB3aXRoIGFsbAotCSAqIHRoZSB1bmNvcnJ1cHRlZCBub2RlIHdoaWNoIG1heSBwb3NzaWJseSBzaXQgdGhlcmUuCi0JICoKLQkgKiBJbiBvdGhlciB3b3JkcywgbGV0J3MgbmFtZSB0aGUgbWluLiBJL08gdW5pdCB3aGVyZSB0aGUgY29ycnVwdGlvbgotCSAqIHN0YXJ0cyBCLCBhbmQgdGhlIHByZXZpb3VzIG1pbi4gSS9PIHVuaXQgQS4gVGhlIGJlbG93IGNvZGUgdHJpZXMgdG8KLQkgKiBkZWFsIHdpdGggYSBzaXR1YXRpb24gd2hlbiBoYWxmIG9mIEIgY29udGFpbnMgdmFsaWQgbm9kZXMgb3IgdGhlIGVuZAotCSAqIG9mIGEgdmFsaWQgbm9kZSwgYW5kIHRoZSBzZWNvbmQgaGFsZiBvZiBCIGNvbnRhaW5zIGNvcnJ1cHRlZCBkYXRhIG9yCi0JICogZ2FyYmFnZS4gVGhpcyBtZWFucyB0aGF0IFVCSUZTIGhhZCBiZWVuIHdyaXRpbmcgdG8gQiBqdXN0IGJlZm9yZSB0aGUKLQkgKiBwb3dlciBjdXQgaGFwcGVuZWQuIEkgZG8gbm90IGtub3cgaG93IHJlYWxpc3RpYyBpcyB0aGlzIHNjZW5hcmlvCi0JICogdGhhdCBoYWxmIG9mIHRoZSBtaW4uIEkvTyB1bml0IGhhZCBiZWVuIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IGFuZCB0aGUKLQkgKiBvdGhlciBoYWxmIG5vdCwgYnV0IHRoaXMgaXMgcG9zc2libGUgaW4gb3VyICdmYWlsdXJlIG1vZGUgZW11bGF0aW9uJwotCSAqIGluZnJhc3RydWN0dXJlIGF0IGxlYXN0LgotCSAqCi0JICogU28gd2hhdCBpcyB0aGUgcHJvYmxlbSwgd2h5IHdlIG5lZWQgdG8gZHJvcCB0aG9zZSBub2Rlcz8gV2hleSBjYW4ndAotCSAqIHdlIGp1c3QgY2xlYW4tdXAgdGhlIHNlY29uZCBoYWxmIG9mIEIgYnkgcHV0dGluZyBhIHBhZGRpbmcgbm9kZQotCSAqIHRoZXJlPyBXZSBjYW4sIGFuZCB0aGlzIHdvcmtzIGZpbmUgd2l0aCBvbmUgZXhjZXB0aW9uIHdoaWNoIHdhcwotCSAqIHJlcHJvZHVjZWQgd2l0aCBwb3dlciBjdXQgZW11bGF0aW9uIHRlc3RpbmcgYW5kIGhhcHBlbnMgZXh0cmVtZWx5Ci0JICogcmFyZWx5LiBUaGUgZGVzY3JpcHRpb24gZm9sbG93cywgYnV0IGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoYXQgaXMKLQkgKiBvbmx5IGFib3V0IHRoZSBHQyBoZWFkLCBzbyB3ZSBjb3VsZCBkbyB0aGlzIHRyaWNrIG9ubHkgaWYgdGhlIGJ1ZAotCSAqIGJlbG9uZ3MgdG8gdGhlIEdDIGhlYWQsIGJ1dCBpdCBkb2VzIG5vdCBzZWVtIHRvIGJlIHdvcnRoIGFuCi0JICogYWRkaXRpb25hbCAiaWYiIHN0YXRlbWVudC4KLQkgKgotCSAqIFNvLCBpbWFnaW5lIHRoZSBmaWxlLXN5c3RlbSBpcyBmdWxsLCB3ZSBydW4gR0Mgd2hpY2ggaXMgbW92aW5nIHZhbGlkCi0JICogbm9kZXMgZnJvbSBMRUIgWCB0byBMRUIgWSAob2J2aW91c2x5LCBMRUIgWSBpcyB0aGUgY3VycmVudCBHQyBoZWFkCi0JICogTEVCKS4gVGhlIEBjLT5nY19sbnVtIGlzIC0xLCB3aGljaCBtZWFucyB0aGF0IEdDIHdpbGwgcmV0YWluIExFQiBYCi0JICogYW5kIHdpbGwgdHJ5IHRvIGNvbnRpbnVlLiBJbWFnaW5lIHRoYXQgTEVCIFggaXMgY3VycmVudGx5IHRoZQotCSAqIGRpcnRpZXN0IExFQiwgYW5kIHRoZSBhbW91bnQgb2YgdXNlZCBzcGFjZSBpbiBMRUIgWSBpcyBleGFjdGx5IHRoZQotCSAqIHNhbWUgYXMgYW1vdW50IG9mIGZyZWUgc3BhY2UgaW4gTEVCIFguCi0JICoKLQkgKiBBbmQgYSBwb3dlciBjdXQgaGFwcGVucyB3aGVuIG5vZGVzIGFyZSBtb3ZlZCBmcm9tIExFQiBYIHRvIExFQiBZLiBXZQotCSAqIGFyZSBoZXJlIHRyeWluZyB0byByZWNvdmVyIExFQiBZIHdoaWNoIGlzIHRoZSBHQyBoZWFkIExFQi4gV2UgZmluZAotCSAqIHRoZSBtaW4uIEkvTyB1bml0IEIgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGVuIHdlIGNsZWFuLXVwIExFQiBZIGJ5Ci0JICogcGFkZGluZyBtaW4uIEkvTyB1bml0LiBBbmQgbGF0ZXIgJ3ViaWZzX3JjdnJ5X2djX2NvbW1pdCgpJyBmdW5jdGlvbgotCSAqIGZhaWxzLCBiZWNhdXNlIGl0IGNhbm5vdCBmaW5kIGEgZGlydHkgTEVCIHdoaWNoIGNvdWxkIGJlIEdDJ2QgaW50bwotCSAqIExFQiBZISBFdmVuIExFQiBYIGRvZXMgbm90IG1hdGNoIGJlY2F1c2UgdGhlIGFtb3VudCBvZiB2YWxpZCBub2RlcwotCSAqIHRoZXJlIGRvZXMgbm90IGZpdCB0aGUgZnJlZSBzcGFjZSBpbiBMRUIgWSBhbnkgbW9yZSEgQW5kIHRoaXMgaXMKLQkgKiBiZWNhdXNlIG9mIHRoZSBwYWRkaW5nIG5vZGUgd2hpY2ggd2UgYWRkZWQgdG8gTEVCIFkuIFRoZQotCSAqIHVzZXItdmlzaWJsZSBlZmZlY3Qgb2YgdGhpcyB3aGljaCBJIG9uY2Ugb2JzZXJ2ZWQgYW5kIGFuYWx5c2VkIGlzCi0JICogdGhhdCB3ZSBjYW5ub3QgbW91bnQgdGhlIGZpbGUtc3lzdGVtIHdpdGggLUVOT1NQQyBlcnJvci4KLQkgKgotCSAqIFNvIG9idmlvdXNseSwgdG8gbWFrZSBzdXJlIHRoYXQgc2l0dWF0aW9uIGRvZXMgbm90IGhhcHBlbiB3ZSBzaG91bGQKLQkgKiBmcmVlIG1pbi4gSS9PIHVuaXQgQiBpbiBMRUIgWSBjb21wbGV0ZWx5IGFuZCB0aGUgbGFzdCB1c2VkIG1pbi4gSS9PCi0JICogdW5pdCBpbiBMRUIgWSBzaG91bGQgYmUgQS4gVGhpcyBpcyBiYXNpY2FsbHkgd2hhdCB0aGUgYmVsb3cgY29kZQotCSAqIHRyaWVzIHRvIGRvLgotCSAqLwotCXdoaWxlIChtaW5faW9fdW5pdCA9PSByb3VuZF9kb3duKG9mZnMsIGMtPm1pbl9pb19zaXplKSAmJgotCSAgICAgICBtaW5faW9fdW5pdCAhPSBvZmZzICYmCi0JICAgICAgIGRyb3BfbGFzdF9ub2RlKHNsZWIsICZvZmZzLCBncm91cGVkKSk7CisJaWYgKGpoZWFkID09IEdDSEQpIHsKKwkJLyoKKwkJICogSWYgdGhpcyBMRUIgYmVsb25ncyB0byB0aGUgR0MgaGVhZCB0aGVuIHdoaWxlIHdlIGFyZSBpbiB0aGUKKwkJICogbWlkZGxlIG9mIHRoZSBzYW1lIG1pbi4gSS9PIHVuaXQga2VlcCBkcm9wcGluZyBub2Rlcy4gU28KKwkJICogYmFzaWNhbGx5LCB3aGF0IHdlIHdhbnQgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxhc3QgbWluLgorCQkgKiBJL08gdW5pdCB3aGVyZSB3ZSBzYXcgdGhlIGNvcnJ1cHRpb24gaXMgZHJvcHBlZCBjb21wbGV0ZWx5CisJCSAqIHdpdGggYWxsIHRoZSB1bmNvcnJ1cHRlZCBub2RlcyB3aGljaCBtYXkgcG9zc2libHkgc2l0IHRoZXJlLgorCQkgKgorCQkgKiBJbiBvdGhlciB3b3JkcywgbGV0J3MgbmFtZSB0aGUgbWluLiBJL08gdW5pdCB3aGVyZSB0aGUKKwkJICogY29ycnVwdGlvbiBzdGFydHMgQiwgYW5kIHRoZSBwcmV2aW91cyBtaW4uIEkvTyB1bml0IEEuIFRoZQorCQkgKiBiZWxvdyBjb2RlIHRyaWVzIHRvIGRlYWwgd2l0aCBhIHNpdHVhdGlvbiB3aGVuIGhhbGYgb2YgQgorCQkgKiBjb250YWlucyB2YWxpZCBub2RlcyBvciB0aGUgZW5kIG9mIGEgdmFsaWQgbm9kZSwgYW5kIHRoZQorCQkgKiBzZWNvbmQgaGFsZiBvZiBCIGNvbnRhaW5zIGNvcnJ1cHRlZCBkYXRhIG9yIGdhcmJhZ2UuIFRoaXMKKwkJICogbWVhbnMgdGhhdCBVQklGUyBoYWQgYmVlbiB3cml0aW5nIHRvIEIganVzdCBiZWZvcmUgdGhlIHBvd2VyCisJCSAqIGN1dCBoYXBwZW5lZC4gSSBkbyBub3Qga25vdyBob3cgcmVhbGlzdGljIGlzIHRoaXMgc2NlbmFyaW8KKwkJICogdGhhdCBoYWxmIG9mIHRoZSBtaW4uIEkvTyB1bml0IGhhZCBiZWVuIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CisJCSAqIGFuZCB0aGUgb3RoZXIgaGFsZiBub3QsIGJ1dCB0aGlzIGlzIHBvc3NpYmxlIGluIG91ciAnZmFpbHVyZQorCQkgKiBtb2RlIGVtdWxhdGlvbicgaW5mcmFzdHJ1Y3R1cmUgYXQgbGVhc3QuCisJCSAqCisJCSAqIFNvIHdoYXQgaXMgdGhlIHByb2JsZW0sIHdoeSB3ZSBuZWVkIHRvIGRyb3AgdGhvc2Ugbm9kZXM/IFdoeQorCQkgKiBjYW4ndCB3ZSBqdXN0IGNsZWFuLXVwIHRoZSBzZWNvbmQgaGFsZiBvZiBCIGJ5IHB1dHRpbmcgYQorCQkgKiBwYWRkaW5nIG5vZGUgdGhlcmU/IFdlIGNhbiwgYW5kIHRoaXMgd29ya3MgZmluZSB3aXRoIG9uZQorCQkgKiBleGNlcHRpb24gd2hpY2ggd2FzIHJlcHJvZHVjZWQgd2l0aCBwb3dlciBjdXQgZW11bGF0aW9uCisJCSAqIHRlc3RpbmcgYW5kIGhhcHBlbnMgZXh0cmVtZWx5IHJhcmVseS4KKwkJICoKKwkJICogSW1hZ2luZSB0aGUgZmlsZS1zeXN0ZW0gaXMgZnVsbCwgd2UgcnVuIEdDIHdoaWNoIHN0YXJ0cworCQkgKiBtb3ZpbmcgdmFsaWQgbm9kZXMgZnJvbSBMRUIgWCB0byBMRUIgWSAob2J2aW91c2x5LCBMRUIgWSBpcworCQkgKiB0aGUgY3VycmVudCBHQyBoZWFkIExFQikuIFRoZSBAYy0+Z2NfbG51bSBpcyAtMSwgd2hpY2ggbWVhbnMKKwkJICogdGhhdCBHQyB3aWxsIHJldGFpbiBMRUIgWCBhbmQgd2lsbCB0cnkgdG8gY29udGludWUuIEltYWdpbmUKKwkJICogdGhhdCBMRUIgWCBpcyBjdXJyZW50bHkgdGhlIGRpcnRpZXN0IExFQiwgYW5kIHRoZSBhbW91bnQgb2YKKwkJICogdXNlZCBzcGFjZSBpbiBMRUIgWSBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGFtb3VudCBvZiBmcmVlCisJCSAqIHNwYWNlIGluIExFQiBYLgorCQkgKgorCQkgKiBBbmQgYSBwb3dlciBjdXQgaGFwcGVucyB3aGVuIG5vZGVzIGFyZSBtb3ZlZCBmcm9tIExFQiBYIHRvCisJCSAqIExFQiBZLiBXZSBhcmUgaGVyZSB0cnlpbmcgdG8gcmVjb3ZlciBMRUIgWSB3aGljaCBpcyB0aGUgR0MKKwkJICogaGVhZCBMRUIuIFdlIGZpbmQgdGhlIG1pbi4gSS9PIHVuaXQgQiBhcyBkZXNjcmliZWQgYWJvdmUuCisJCSAqIFRoZW4gd2UgY2xlYW4tdXAgTEVCIFkgYnkgcGFkZGluZyBtaW4uIEkvTyB1bml0LiBBbmQgbGF0ZXIKKwkJICogJ3ViaWZzX3JjdnJ5X2djX2NvbW1pdCgpJyBmdW5jdGlvbiBmYWlscywgYmVjYXVzZSBpdCBjYW5ub3QKKwkJICogZmluZCBhIGRpcnR5IExFQiB3aGljaCBjb3VsZCBiZSBHQydkIGludG8gTEVCIFkhIEV2ZW4gTEVCIFgKKwkJICogZG9lcyBub3QgbWF0Y2ggYmVjYXVzZSB0aGUgYW1vdW50IG9mIHZhbGlkIG5vZGVzIHRoZXJlIGRvZXMKKwkJICogbm90IGZpdCB0aGUgZnJlZSBzcGFjZSBpbiBMRUIgWSBhbnkgbW9yZSEgQW5kIHRoaXMgaXMKKwkJICogYmVjYXVzZSBvZiB0aGUgcGFkZGluZyBub2RlIHdoaWNoIHdlIGFkZGVkIHRvIExFQiBZLiBUaGUKKwkJICogdXNlci12aXNpYmxlIGVmZmVjdCBvZiB0aGlzIHdoaWNoIEkgb25jZSBvYnNlcnZlZCBhbmQKKwkJICogYW5hbHlzZWQgaXMgdGhhdCB3ZSBjYW5ub3QgbW91bnQgdGhlIGZpbGUtc3lzdGVtIHdpdGgKKwkJICogLUVOT1NQQyBlcnJvci4KKwkJICoKKwkJICogU28gb2J2aW91c2x5LCB0byBtYWtlIHN1cmUgdGhhdCBzaXR1YXRpb24gZG9lcyBub3QgaGFwcGVuIHdlCisJCSAqIHNob3VsZCBmcmVlIG1pbi4gSS9PIHVuaXQgQiBpbiBMRUIgWSBjb21wbGV0ZWx5IGFuZCB0aGUgbGFzdAorCQkgKiB1c2VkIG1pbi4gSS9PIHVuaXQgaW4gTEVCIFkgc2hvdWxkIGJlIEEuIFRoaXMgaXMgYmFzaWNhbGx5CisJCSAqIHdoYXQgdGhlIGJlbG93IGNvZGUgdHJpZXMgdG8gZG8uCisJCSAqLworCQl3aGlsZSAob2ZmcyA+IG1pbl9pb191bml0KQorCQkJZHJvcF9sYXN0X25vZGUoc2xlYiwgJm9mZnMpOworCX0KIAogCWJ1ZiA9IHNidWYgKyBvZmZzOwogCWxlbiA9IGMtPmxlYl9zaXplIC0gb2ZmczsKQEAgLTc5NSw3ICs4MjAsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAoYy0+bGViX3NpemUgLSBvZmZzIDwgVUJJRlNfQ1NfTk9ERV9TWikKIAkJZ290byBvdXRfZXJyOwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgKHZvaWQgKiljc19ub2RlLCBvZmZzLCBVQklGU19DU19OT0RFX1NaKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCAodm9pZCAqKWNzX25vZGUsIG9mZnMsCisJCQkgICAgIFVCSUZTX0NTX05PREVfU1osIDApOwogCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQogCQlnb3RvIG91dF9mcmVlOwogCXJldCA9IHViaWZzX3NjYW5fYV9ub2RlKGMsIGNzX25vZGUsIFVCSUZTX0NTX05PREVfU1osIGxudW0sIG9mZnMsIDApOwpAQCAtODgxLDcgKzkwNyw3IEBACiAJCX0KIAkJdWJpZnNfc2Nhbl9kZXN0cm95KHNsZWIpOwogCX0KLQlyZXR1cm4gdWJpZnNfcmVjb3Zlcl9sZWIoYywgbG51bSwgb2Zmcywgc2J1ZiwgMCk7CisJcmV0dXJuIHViaWZzX3JlY292ZXJfbGViKGMsIGxudW0sIG9mZnMsIHNidWYsIC0xKTsKIH0KIAogLyoqCkBAIC04OTUsOCArOTIxLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgcmVjb3Zlcl9oZWFkKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IG9mZnMsCi0JCQl2b2lkICpzYnVmKQorc3RhdGljIGludCByZWNvdmVyX2hlYWQoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBpbnQgb2Zmcywgdm9pZCAqc2J1ZikKIHsKIAlpbnQgbGVuID0gYy0+bWF4X3dyaXRlX3NpemUsIGVycjsKIApAQCAtOTA3LDE1ICs5MzIsMTUgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBSZWFkIGF0IHRoZSBoZWFkIGxvY2F0aW9uIGFuZCBjaGVjayBpdCBpcyBlbXB0eSBmbGFzaCAqLwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgc2J1Ziwgb2ZmcywgbGVuKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBzYnVmLCBvZmZzLCBsZW4sIDEpOwogCWlmIChlcnIgfHwgIWlzX2VtcHR5KHNidWYsIGxlbikpIHsKIAkJZGJnX3JjdnJ5KCJjbGVhbmluZyBoZWFkIGF0ICVkOiVkIiwgbG51bSwgb2Zmcyk7CiAJCWlmIChvZmZzID09IDApCiAJCQlyZXR1cm4gdWJpZnNfbGViX3VubWFwKGMsIGxudW0pOwotCQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIHNidWYsIDAsIG9mZnMpOworCQllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBzYnVmLCAwLCBvZmZzLCAxKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCXJldHVybiB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIHNidWYsIG9mZnMsIFVCSV9VTktOT1dOKTsKKwkJcmV0dXJuIHViaWZzX2xlYl9jaGFuZ2UoYywgbG51bSwgc2J1Ziwgb2ZmcywgVUJJX1VOS05PV04pOwogCX0KIAogCXJldHVybiAwOwpAQCAtOTM4LDcgKzk2Myw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1pbnQgdWJpZnNfcmVjb3Zlcl9pbmxfaGVhZHMoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpCitpbnQgdWJpZnNfcmVjb3Zlcl9pbmxfaGVhZHMoc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpCiB7CiAJaW50IGVycjsKIApAQCAtOTY5LDcgKzk5NCw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IGNsZWFuX2FuX3VuY2xlYW5fbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAorc3RhdGljIGludCBjbGVhbl9hbl91bmNsZWFuX2xlYihzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJCQlzdHJ1Y3QgdWJpZnNfdW5jbGVhbl9sZWIgKnVjbGViLCB2b2lkICpzYnVmKQogewogCWludCBlcnIsIGxudW0gPSB1Y2xlYi0+bG51bSwgb2ZmcyA9IDAsIGxlbiA9IHVjbGViLT5lbmRwdCwgcXVpZXQgPSAxOwpAQCAtOTg1LDcgKzEwMTAsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIGJ1Ziwgb2ZmcywgbGVuKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIG9mZnMsIGxlbiwgMCk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCiAJCXJldHVybiBlcnI7CiAKQEAgLTEwNDUsNyArMTA3MCw3IEBACiAJfQogCiAJLyogV3JpdGUgYmFjayB0aGUgTEVCIGF0b21pY2FsbHkgKi8KLQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIHNidWYsIGxlbiwgVUJJX1VOS05PV04pOworCWVyciA9IHViaWZzX2xlYl9jaGFuZ2UoYywgbG51bSwgc2J1ZiwgbGVuLCBVQklfVU5LTk9XTik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMTA2NSw3ICsxMDkwLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCB1Ymlmc19jbGVhbl9sZWJzKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCB2b2lkICpzYnVmKQoraW50IHViaWZzX2NsZWFuX2xlYnMoc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpCiB7CiAJZGJnX3JjdnJ5KCJyZWNvdmVyeSIpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+dW5jbGVhbl9sZWJfbGlzdCkpIHsKQEAgLTE0MzAsNyArMTQ1NSw3IEBACiAJaWYgKGlfc2l6ZSA+PSBlLT5kX3NpemUpCiAJCXJldHVybiAwOwogCS8qIFJlYWQgdGhlIExFQiAqLwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYy0+c2J1ZiwgMCwgYy0+bGViX3NpemUpOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGMtPnNidWYsIDAsIGMtPmxlYl9zaXplLCAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAkvKiBDaGFuZ2UgdGhlIHNpemUgZmllbGQgYW5kIHJlY2FsY3VsYXRlIHRoZSBDUkMgKi8KQEAgLTE0NDYsNyArMTQ3MSw3IEBACiAJCWxlbiAtPSAxOwogCWxlbiA9IEFMSUdOKGxlbiArIDEsIGMtPm1pbl9pb19zaXplKTsKIAkvKiBBdG9taWNhbGx5IHdyaXRlIHRoZSBmaXhlZCBMRUIgYmFjayBhZ2FpbiAqLwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSwgYy0+c2J1ZiwgbGVuLCBVQklfVU5LTk9XTik7CisJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtLCBjLT5zYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAlkYmdfcmN2cnkoImlub2RlICVsdSBhdCAlZDolZCBzaXplICVsbGQgLT4gJWxsZCIsCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9yZXBsYXkuYyBiL2ZzL3ViaWZzL3JlcGxheS5jCmluZGV4IDY2MTcyODAuLmNjYWJhZjEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3JlcGxheS5jCisrKyBiL2ZzL3ViaWZzL3JlcGxheS5jCkBAIC01MjMsOCArNTIzLDcgQEAKIAlpZiAoIWxpc3RfaXNfbGFzdCgmbmV4dC0+bGlzdCwgJmpoLT5idWRzX2xpc3QpKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbmV4dC0+bG51bSwgKGNoYXIgKikmZGF0YSwKLQkJICAgICAgIG5leHQtPnN0YXJ0LCA0KTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBuZXh0LT5sbnVtLCAoY2hhciAqKSZkYXRhLCBuZXh0LT5zdGFydCwgNCwgMSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIDA7CiAKQEAgLTU1Nyw4ICs1NTYsNyBAQAogCQkgKiB0aGVzZSBMRUJzIGNvdWxkIHBvc3NpYmx5IGJlIHdyaXR0ZW4gdG8gYXQgdGhlIHBvd2VyIGN1dAogCQkgKiB0aW1lLgogCQkgKi8KLQkJc2xlYiA9IHViaWZzX3JlY292ZXJfbGViKGMsIGxudW0sIG9mZnMsIGMtPnNidWYsCi0JCQkJCSBiLT5idWQtPmpoZWFkICE9IEdDSEQpOworCQlzbGViID0gdWJpZnNfcmVjb3Zlcl9sZWIoYywgbG51bSwgb2ZmcywgYy0+c2J1ZiwgYi0+YnVkLT5qaGVhZCk7CiAJZWxzZQogCQlzbGViID0gdWJpZnNfc2NhbihjLCBsbnVtLCBvZmZzLCBjLT5zYnVmLCAwKTsKIAlpZiAoSVNfRVJSKHNsZWIpKQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvc2IuYyBiL2ZzL3ViaWZzL3NiLmMKaW5kZXggYzYwNmYwMS4uOTNkOTM4YSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvc2IuYworKysgYi9mcy91Ymlmcy9zYi5jCkBAIC02NzQsMTUgKzY3NCwxNSBAQAogCiAJaWYgKGxlbiA9PSAwKSB7CiAJCWRiZ19tbnQoInVubWFwIGVtcHR5IExFQiAlZCIsIGxudW0pOwotCQlyZXR1cm4gdWJpX2xlYl91bm1hcChjLT51YmksIGxudW0pOworCQlyZXR1cm4gdWJpZnNfbGViX3VubWFwKGMsIGxudW0pOwogCX0KIAogCWRiZ19tbnQoImZpeHVwIExFQiAlZCwgZGF0YSBsZW4gJWQiLCBsbnVtLCBsZW4pOwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYy0+c2J1ZiwgMCwgbGVuKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBjLT5zYnVmLCAwLCBsZW4sIDEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBjLT5zYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKKwlyZXR1cm4gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtLCBjLT5zYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zY2FuLmMgYi9mcy91Ymlmcy9zY2FuLmMKaW5kZXggMzYyMTZiNC4uMzczODNlOCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvc2Nhbi5jCisrKyBiL2ZzL3ViaWZzL3NjYW4uYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnNsZWItPm5vZGVzKTsKIAlzbGViLT5idWYgPSBzYnVmOwogCi0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBzYnVmICsgb2Zmcywgb2ZmcywgYy0+bGViX3NpemUgLSBvZmZzKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBzYnVmICsgb2Zmcywgb2ZmcywgYy0+bGViX3NpemUgLSBvZmZzLCAwKTsKIAlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykgewogCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkLCIKIAkJCSAgIiBlcnJvciAlZCIsIGMtPmxlYl9zaXplIC0gb2ZmcywgbG51bSwgb2ZmcywgZXJyKTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogCWludCBsZW47CiAKIAl1Ymlmc19lcnIoImNvcnJ1cHRpb24gYXQgTEVCICVkOiVkIiwgbG51bSwgb2Zmcyk7Ci0JaWYgKGRiZ19mYWlsdXJlX21vZGUpCisJaWYgKGRiZ19pc190c3RfcmN2cnkoYykpCiAJCXJldHVybjsKIAlsZW4gPSBjLT5sZWJfc2l6ZSAtIG9mZnM7CiAJaWYgKGxlbiA+IDgxOTIpCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zaHJpbmtlci5jIGIvZnMvdWJpZnMvc2hyaW5rZXIuYwppbmRleCBjYTk1M2E5Li45ZTFkMDU2IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zaHJpbmtlci5jCisrKyBiL2ZzL3ViaWZzL3Nocmlua2VyLmMKQEAgLTI4NCw3ICsyODQsMTEgQEAKIAlsb25nIGNsZWFuX3puX2NudCA9IGF0b21pY19sb25nX3JlYWQoJnViaWZzX2NsZWFuX3puX2NudCk7CiAKIAlpZiAobnIgPT0gMCkKLQkJcmV0dXJuIGNsZWFuX3puX2NudDsKKwkJLyoKKwkJICogRHVlIHRvIHRoZSB3YXkgVUJJRlMgdXBkYXRlcyB0aGUgY2xlYW4gem5vZGUgY291bnRlciBpdCBtYXkKKwkJICogdGVtcG9yYXJpbHkgYmUgbmVnYXRpdmUuCisJCSAqLworCQlyZXR1cm4gY2xlYW5fem5fY250ID49IDAgPyBjbGVhbl96bl9jbnQgOiAxOwogCiAJaWYgKCFjbGVhbl96bl9jbnQpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IDFhYjBkMjIuLmIyODEyMTIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtODUsNyArODUsNyBAQAogCWlmICh1aS0+ZGF0YV9sZW4gPCAwIHx8IHVpLT5kYXRhX2xlbiA+IFVCSUZTX01BWF9JTk9fREFUQSkKIAkJcmV0dXJuIDQ7CiAKLQlpZiAodWktPnhhdHRyICYmIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSAhPSBTX0lGUkVHKQorCWlmICh1aS0+eGF0dHIgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiA1OwogCiAJaWYgKCF1Ymlmc19jb21wcl9wcmVzZW50KHVpLT5jb21wcl90eXBlKSkgewpAQCAtOTQsNyArOTQsNyBAQAogCQkJICAgdWJpZnNfY29tcHJfbmFtZSh1aS0+Y29tcHJfdHlwZSkpOwogCX0KIAotCWVyciA9IGRiZ19jaGVja19kaXJfc2l6ZShjLCBpbm9kZSk7CisJZXJyID0gZGJnX2NoZWNrX2RpcihjLCBpbm9kZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODExLDE1ICs4MTEsMTggQEAKIAogCQljLT5qaGVhZHNbaV0ud2J1Zi5zeW5jX2NhbGxiYWNrID0gJmJ1ZF93YnVmX2NhbGxiYWNrOwogCQljLT5qaGVhZHNbaV0ud2J1Zi5qaGVhZCA9IGk7CisJCWMtPmpoZWFkc1tpXS5ncm91cGVkID0gMTsKIAl9CiAKIAljLT5qaGVhZHNbQkFTRUhEXS53YnVmLmR0eXBlID0gVUJJX1NIT1JUVEVSTTsKIAkvKgogCSAqIEdhcmJhZ2UgQ29sbGVjdG9yIGhlYWQgbGlrZWx5IGNvbnRhaW5zIGxvbmctdGVybSBkYXRhIGFuZAotCSAqIGRvZXMgbm90IG5lZWQgdG8gYmUgc3luY2hyb25pemVkIGJ5IHRpbWVyLgorCSAqIGRvZXMgbm90IG5lZWQgdG8gYmUgc3luY2hyb25pemVkIGJ5IHRpbWVyLiBBbHNvIEdDIGhlYWQgbm9kZXMgYXJlCisJICogbm90IGdyb3VwZWQuCiAJICovCiAJYy0+amhlYWRzW0dDSERdLndidWYuZHR5cGUgPSBVQklfTE9OR1RFUk07CiAJYy0+amhlYWRzW0dDSERdLndidWYubm9fdGltZXIgPSAxOworCWMtPmpoZWFkc1tHQ0hEXS5ncm91cGVkID0gMDsKIAogCXJldHVybiAwOwogfQpAQCAtOTExLDcgKzkxNCw3IEBACiAKIAljLT5lbXB0eSA9IDE7CiAJZm9yIChsbnVtID0gMDsgbG51bSA8IGMtPmxlYl9jbnQ7IGxudW0rKykgewotCQllcnIgPSB1YmlfaXNfbWFwcGVkKGMtPnViaSwgbG51bSk7CisJCWVyciA9IHViaWZzX2lzX21hcHBlZChjLCBsbnVtKTsKIAkJaWYgKHVubGlrZWx5KGVyciA8IDApKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKGVyciA9PSAxKSB7CkBAIC0xMjg0LDEyICsxMjg3LDI1IEBACiAJaWYgKChjLT5tc3Rfbm9kZS0+ZmxhZ3MgJiBjcHVfdG9fbGUzMihVQklGU19NU1RfRElSVFkpKSAhPSAwKSB7CiAJCXViaWZzX21zZygicmVjb3ZlcnkgbmVlZGVkIik7CiAJCWMtPm5lZWRfcmVjb3ZlcnkgPSAxOwotCQlpZiAoIWMtPnJvX21vdW50KSB7Ci0JCQllcnIgPSB1Ymlmc19yZWNvdmVyX2lubF9oZWFkcyhjLCBjLT5zYnVmKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXRfbWFzdGVyOwotCQl9Ci0JfSBlbHNlIGlmICghYy0+cm9fbW91bnQpIHsKKwl9CisKKwlpZiAoYy0+bmVlZF9yZWNvdmVyeSAmJiAhYy0+cm9fbW91bnQpIHsKKwkJZXJyID0gdWJpZnNfcmVjb3Zlcl9pbmxfaGVhZHMoYywgYy0+c2J1Zik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9tYXN0ZXI7CisJfQorCisJZXJyID0gdWJpZnNfbHB0X2luaXQoYywgMSwgIWMtPnJvX21vdW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9tYXN0ZXI7CisKKwlpZiAoIWMtPnJvX21vdW50ICYmIGMtPnNwYWNlX2ZpeHVwKSB7CisJCWVyciA9IHViaWZzX2ZpeHVwX2ZyZWVfc3BhY2UoYyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9tYXN0ZXI7CisJfQorCisJaWYgKCFjLT5yb19tb3VudCkgewogCQkvKgogCQkgKiBTZXQgdGhlICJkaXJ0eSIgZmxhZyBzbyB0aGF0IGlmIHdlIHJlYm9vdCB1bmNsZWFubHkgd2UKIAkJICogd2lsbCBub3RpY2UgdGhpcyBpbW1lZGlhdGVseSBvbiB0aGUgbmV4dCBtb3VudC4KQEAgLTEyOTcsMTMgKzEzMTMsOSBAQAogCQljLT5tc3Rfbm9kZS0+ZmxhZ3MgfD0gY3B1X3RvX2xlMzIoVUJJRlNfTVNUX0RJUlRZKTsKIAkJZXJyID0gdWJpZnNfd3JpdGVfbWFzdGVyKGMpOwogCQlpZiAoZXJyKQotCQkJZ290byBvdXRfbWFzdGVyOworCQkJZ290byBvdXRfbHB0OwogCX0KIAotCWVyciA9IHViaWZzX2xwdF9pbml0KGMsIDEsICFjLT5yb19tb3VudCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfbHB0OwotCiAJZXJyID0gZGJnX2NoZWNrX2lkeF9zaXplKGMsIGMtPmJpLm9sZF9pZHhfc3opOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2xwdDsKQEAgLTEzOTYsMTIgKzE0MDgsNiBAQAogCX0gZWxzZQogCQl1Ymlmc19hc3NlcnQoYy0+bHN0LnRha2VuX2VtcHR5X2xlYnMgPiAwKTsKIAotCWlmICghYy0+cm9fbW91bnQgJiYgYy0+c3BhY2VfZml4dXApIHsKLQkJZXJyID0gdWJpZnNfZml4dXBfZnJlZV9zcGFjZShjKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2luZm9zOwotCX0KLQogCWVyciA9IGRiZ19jaGVja19maWxlc3lzdGVtKGMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2luZm9zOwpAQCAtMTg0Miw3ICsxODQ4LDYgQEAKIAliZGlfZGVzdHJveSgmYy0+YmRpKTsKIAl1YmlfY2xvc2Vfdm9sdW1lKGMtPnViaSk7CiAJbXV0ZXhfdW5sb2NrKCZjLT51bW91bnRfbXV0ZXgpOwotCWtmcmVlKGMpOwogfQogCiBzdGF0aWMgaW50IHViaWZzX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKQEAgLTE5NjUsNjEgKzE5NzAsNjUgQEAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KIAorc3RhdGljIHN0cnVjdCB1Ymlmc19pbmZvICphbGxvY191Ymlmc19pbmZvKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnViaSkKK3sKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYzsKKworCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpZnNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChjKSB7CisJCXNwaW5fbG9ja19pbml0KCZjLT5jbnRfbG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZjLT5jc19sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPmJ1ZHNfbG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZjLT5zcGFjZV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPm9ycGhhbl9sb2NrKTsKKwkJaW5pdF9yd3NlbSgmYy0+Y29tbWl0X3NlbSk7CisJCW11dGV4X2luaXQoJmMtPmxwX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+dG5jX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+bG9nX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+bXN0X211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+dW1vdW50X211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+YnVfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT53cml0ZV9yZXNlcnZlX211dGV4KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+Y210X3dxKTsKKwkJYy0+YnVkcyA9IFJCX1JPT1Q7CisJCWMtPm9sZF9pZHggPSBSQl9ST09UOworCQljLT5zaXplX3RyZWUgPSBSQl9ST09UOworCQljLT5vcnBoX3RyZWUgPSBSQl9ST09UOworCQlJTklUX0xJU1RfSEVBRCgmYy0+aW5mb3NfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5pZHhfZ2MpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+cmVwbGF5X2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+cmVwbGF5X2J1ZHMpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+dW5jYXRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5lbXB0eV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPmZyZWVhYmxlX2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+ZnJkaV9pZHhfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT51bmNsZWFuX2xlYl9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPm9sZF9idWRzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5vcnBoX25ldyk7CisJCWMtPm5vX2Noa19kYXRhX2NyYyA9IDE7CisKKwkJYy0+aGlnaGVzdF9pbnVtID0gVUJJRlNfRklSU1RfSU5POworCQljLT5saGVhZF9sbnVtID0gYy0+bHRhaWxfbG51bSA9IFVCSUZTX0xPR19MTlVNOworCisJCXViaV9nZXRfdm9sdW1lX2luZm8odWJpLCAmYy0+dmkpOworCQl1YmlfZ2V0X2RldmljZV9pbmZvKGMtPnZpLnViaV9udW0sICZjLT5kaSk7CisJfQorCXJldHVybiBjOworfQorCiBzdGF0aWMgaW50IHViaWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1YmkgPSBzYi0+c19mc19pbmZvOwotCXN0cnVjdCB1Ymlmc19pbmZvICpjOworCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CiAJaW50IGVycjsKIAotCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpZnNfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaW5pdCgmYy0+Y250X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjLT5jc19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+YnVkc19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+c3BhY2VfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmMtPm9ycGhhbl9sb2NrKTsKLQlpbml0X3J3c2VtKCZjLT5jb21taXRfc2VtKTsKLQltdXRleF9pbml0KCZjLT5scF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+dG5jX211dGV4KTsKLQltdXRleF9pbml0KCZjLT5sb2dfbXV0ZXgpOwotCW11dGV4X2luaXQoJmMtPm1zdF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+dW1vdW50X211dGV4KTsKLQltdXRleF9pbml0KCZjLT5idV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+d3JpdGVfcmVzZXJ2ZV9tdXRleCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+Y210X3dxKTsKLQljLT5idWRzID0gUkJfUk9PVDsKLQljLT5vbGRfaWR4ID0gUkJfUk9PVDsKLQljLT5zaXplX3RyZWUgPSBSQl9ST09UOwotCWMtPm9ycGhfdHJlZSA9IFJCX1JPT1Q7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPmluZm9zX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5pZHhfZ2MpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5yZXBsYXlfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPnJlcGxheV9idWRzKTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+dW5jYXRfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPmVtcHR5X2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5mcmVlYWJsZV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+ZnJkaV9pZHhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPnVuY2xlYW5fbGViX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5vbGRfYnVkcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbmV3KTsKLQljLT5ub19jaGtfZGF0YV9jcmMgPSAxOwotCiAJYy0+dmZzX3NiID0gc2I7Ci0JYy0+aGlnaGVzdF9pbnVtID0gVUJJRlNfRklSU1RfSU5POwotCWMtPmxoZWFkX2xudW0gPSBjLT5sdGFpbF9sbnVtID0gVUJJRlNfTE9HX0xOVU07Ci0KLQl1YmlfZ2V0X3ZvbHVtZV9pbmZvKHViaSwgJmMtPnZpKTsKLQl1YmlfZ2V0X2RldmljZV9pbmZvKGMtPnZpLnViaV9udW0sICZjLT5kaSk7Ci0KIAkvKiBSZS1vcGVuIHRoZSBVQkkgZGV2aWNlIGluIHJlYWQtd3JpdGUgbW9kZSAqLwogCWMtPnViaSA9IHViaV9vcGVuX3ZvbHVtZShjLT52aS51YmlfbnVtLCBjLT52aS52b2xfaWQsIFVCSV9SRUFEV1JJVEUpOwogCWlmIChJU19FUlIoYy0+dWJpKSkgewogCQllcnIgPSBQVFJfRVJSKGMtPnViaSk7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0yMDg1LDI0ICsyMDk0LDI5IEBACiAJYmRpX2Rlc3Ryb3koJmMtPmJkaSk7CiBvdXRfY2xvc2U6CiAJdWJpX2Nsb3NlX3ZvbHVtZShjLT51YmkpOwotb3V0X2ZyZWU6Ci0Ja2ZyZWUoYyk7CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzYl90ZXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7Ci0JZGV2X3QgKmRldiA9IGRhdGE7CisJc3RydWN0IHViaWZzX2luZm8gKmMxID0gZGF0YTsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IHNiLT5zX2ZzX2luZm87CiAKLQlyZXR1cm4gYy0+dmkuY2RldiA9PSAqZGV2OworCXJldHVybiBjLT52aS5jZGV2ID09IGMxLT52aS5jZGV2OworfQorCitzdGF0aWMgaW50IHNiX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXNiLT5zX2ZzX2luZm8gPSBkYXRhOworCXJldHVybiBzZXRfYW5vbl9zdXBlcihzYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp1Ymlmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAogCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1Ymk7Ci0Jc3RydWN0IHViaV92b2x1bWVfaW5mbyB2aTsKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCWludCBlcnI7CiAKQEAgLTIxMTksMTkgKzIxMzMsMjUgQEAKIAkJCW5hbWUsIChpbnQpUFRSX0VSUih1YmkpKTsKIAkJcmV0dXJuIEVSUl9DQVNUKHViaSk7CiAJfQotCXViaV9nZXRfdm9sdW1lX2luZm8odWJpLCAmdmkpOwogCi0JZGJnX2dlbigib3BlbmVkIHViaSVkXyVkIiwgdmkudWJpX251bSwgdmkudm9sX2lkKTsKKwljID0gYWxsb2NfdWJpZnNfaW5mbyh1YmkpOworCWlmICghYykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CiAKLQlzYiA9IHNnZXQoZnNfdHlwZSwgJnNiX3Rlc3QsICZzZXRfYW5vbl9zdXBlciwgJnZpLmNkZXYpOworCWRiZ19nZW4oIm9wZW5lZCB1YmklZF8lZCIsIGMtPnZpLnViaV9udW0sIGMtPnZpLnZvbF9pZCk7CisKKwlzYiA9IHNnZXQoZnNfdHlwZSwgc2JfdGVzdCwgc2Jfc2V0LCBjKTsKIAlpZiAoSVNfRVJSKHNiKSkgewogCQllcnIgPSBQVFJfRVJSKHNiKTsKKwkJa2ZyZWUoYyk7CiAJCWdvdG8gb3V0X2Nsb3NlOwogCX0KIAogCWlmIChzYi0+c19yb290KSB7CiAJCXN0cnVjdCB1Ymlmc19pbmZvICpjMSA9IHNiLT5zX2ZzX2luZm87Ci0KKwkJa2ZyZWUoYyk7CiAJCS8qIEEgbmV3IG1vdW50IHBvaW50IGZvciBhbHJlYWR5IG1vdW50ZWQgVUJJRlMgKi8KIAkJZGJnX2dlbigidGhpcyB1Ymkgdm9sdW1lIGlzIGFscmVhZHkgbW91bnRlZCIpOwogCQlpZiAoISEoZmxhZ3MgJiBNU19SRE9OTFkpICE9IGMxLT5yb19tb3VudCkgewpAQCAtMjE0MCwxMSArMjE2MCw2IEBACiAJCX0KIAl9IGVsc2UgewogCQlzYi0+c19mbGFncyA9IGZsYWdzOwotCQkvKgotCQkgKiBQYXNzICd1YmknIHRvICdmaWxsX3N1cGVyKCknIGluIHNiLT5zX2ZzX2luZm8gd2hlcmUgaXQgaXMKLQkJICogcmVwbGFjZWQgYnkgJ2MnLgotCQkgKi8KLQkJc2ItPnNfZnNfaW5mbyA9IHViaTsKIAkJZXJyID0gdWJpZnNfZmlsbF9zdXBlcihzYiwgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9kZWFjdDsKQEAgLTIxNjQsMTEgKzIxNzksMTggQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCitzdGF0aWMgdm9pZCBraWxsX3ViaWZzX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IHMtPnNfZnNfaW5mbzsKKwlraWxsX2Fub25fc3VwZXIocyk7CisJa2ZyZWUoYyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1Ymlmc19mc190eXBlID0gewogCS5uYW1lICAgID0gInViaWZzIiwKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogCS5tb3VudCAgID0gdWJpZnNfbW91bnQsCi0JLmtpbGxfc2IgPSBraWxsX2Fub25fc3VwZXIsCisJLmtpbGxfc2IgPSBraWxsX3ViaWZzX3N1cGVyLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3RuYy5jIGIvZnMvdWJpZnMvdG5jLmMKaW5kZXggODExOWIxZi4uMDY2NzM4NiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvdG5jLmMKKysrIGIvZnMvdWJpZnMvdG5jLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCV9fc2V0X2JpdChESVJUWV9aTk9ERSwgJnpuLT5mbGFncyk7CiAJX19jbGVhcl9iaXQoQ09XX1pOT0RFLCAmem4tPmZsYWdzKTsKIAotCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKTsKKwl1Ymlmc19hc3NlcnQoIXViaWZzX3puX29ic29sZXRlKHpub2RlKSk7CiAJX19zZXRfYml0KE9CU09MRVRFX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKIAogCWlmICh6bm9kZS0+bGV2ZWwgIT0gMCkgewpAQCAtMjcxLDcgKzI3MSw3IEBACiAJc3RydWN0IHViaWZzX3pub2RlICp6bjsKIAlpbnQgZXJyOwogCi0JaWYgKCF0ZXN0X2JpdChDT1dfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKSB7CisJaWYgKCF1Ymlmc196bl9jb3coem5vZGUpKSB7CiAJCS8qIHpub2RlIGlzIG5vdCBiZWluZyBjb21taXR0ZWQgKi8KIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KERJUlRZX1pOT0RFLCAmem5vZGUtPmZsYWdzKSkgewogCQkJYXRvbWljX2xvbmdfaW5jKCZjLT5kaXJ0eV96bl9jbnQpOwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAKIAlkYmdfaW8oIkxFQiAlZDolZCwgJXMsIGxlbmd0aCAlZCIsIGxudW0sIG9mZnMsIGRiZ19udHlwZSh0eXBlKSwgbGVuKTsKIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1Ziwgb2ZmcywgbGVuLCAxKTsKIAlpZiAoZXJyKSB7CiAJCXViaWZzX2VycigiY2Fubm90IHJlYWQgbm9kZSB0eXBlICVkIGZyb20gTEVCICVkOiVkLCBlcnJvciAlZCIsCiAJCQkgIHR5cGUsIGxudW0sIG9mZnMsIGVycik7CkBAIC0xNjY2LDcgKzE2NjYsNyBAQAogCWlmICghb3ZlcmxhcCkgewogCQkvKiBXZSBtYXkgc2FmZWx5IHVubG9jayB0aGUgd3JpdGUtYnVmZmVyIGFuZCByZWFkIHRoZSBkYXRhICovCiAJCXNwaW5fdW5sb2NrKCZ3YnVmLT5sb2NrKTsKLQkJcmV0dXJuIHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOworCQlyZXR1cm4gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCBvZmZzLCBsZW4sIDApOwogCX0KIAogCS8qIERvbid0IHJlYWQgdW5kZXIgd2J1ZiAqLwpAQCAtMTY4MCw3ICsxNjgwLDcgQEAKIAogCWlmIChybGVuID4gMCkKIAkJLyogUmVhZCBldmVyeXRoaW5nIHRoYXQgZ29lcyBiZWZvcmUgd3JpdGUtYnVmZmVyICovCi0JCXJldHVybiB1YmlfcmVhZChjLT51YmksIGxudW0sIGJ1Ziwgb2Zmcywgcmxlbik7CisJCXJldHVybiB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIG9mZnMsIHJsZW4sIDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzY3LDcgKzE3NjcsNyBAQAogCWlmICh3YnVmKQogCQllcnIgPSByZWFkX3didWYod2J1ZiwgYnUtPmJ1ZiwgbGVuLCBsbnVtLCBvZmZzKTsKIAllbHNlCi0JCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnUtPmJ1Ziwgb2ZmcywgbGVuKTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnUtPmJ1Ziwgb2ZmcywgbGVuLCAwKTsKIAogCS8qIENoZWNrIGZvciBhIHJhY2Ugd2l0aCBHQyAqLwogCWlmIChtYXliZV9sZWJfZ2NlZChjLCBsbnVtLCBidS0+Z2Nfc2VxKSkKQEAgLTI0MjMsNyArMjQyMyw3IEBACiAJICovCiAKIAlkbyB7Ci0JCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKTsKKwkJdWJpZnNfYXNzZXJ0KCF1Ymlmc196bl9vYnNvbGV0ZSh6bm9kZSkpOwogCQl1Ymlmc19hc3NlcnQodWJpZnNfem5fZGlydHkoem5vZGUpKTsKIAogCQl6cCA9IHpub2RlLT5wYXJlbnQ7CkBAIC0yNDc5LDkgKzI0NzksOCBAQAogCQkJYy0+enJvb3Qub2ZmcyA9IHpici0+b2ZmczsKIAkJCWMtPnpyb290LmxlbiA9IHpici0+bGVuOwogCQkJYy0+enJvb3Quem5vZGUgPSB6bm9kZTsKLQkJCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsCi0JCQkJICAgICAmenAtPmZsYWdzKSk7Ci0JCQl1Ymlmc19hc3NlcnQodGVzdF9iaXQoRElSVFlfWk5PREUsICZ6cC0+ZmxhZ3MpKTsKKwkJCXViaWZzX2Fzc2VydCghdWJpZnNfem5fb2Jzb2xldGUoenApKTsKKwkJCXViaWZzX2Fzc2VydCh1Ymlmc196bl9kaXJ0eSh6cCkpOwogCQkJYXRvbWljX2xvbmdfZGVjKCZjLT5kaXJ0eV96bl9jbnQpOwogCiAJCQlpZiAoenAtPmNuZXh0KSB7CkBAIC0yODY1LDcgKzI4NjQsNyBAQAogCQlzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlID0gY25leHQ7CiAKIAkJY25leHQgPSBjbmV4dC0+Y25leHQ7Ci0JCWlmICh0ZXN0X2JpdChPQlNPTEVURV9aTk9ERSwgJnpub2RlLT5mbGFncykpCisJCWlmICh1Ymlmc196bl9vYnNvbGV0ZSh6bm9kZSkpCiAJCQlrZnJlZSh6bm9kZSk7CiAJfSB3aGlsZSAoY25leHQgJiYgY25leHQgIT0gYy0+Y25leHQpOwogfQpAQCAtMjg3NiwxMiArMjg3NSwxMyBAQAogICovCiB2b2lkIHViaWZzX3RuY19jbG9zZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKIHsKLQlsb25nIGNsZWFuX2ZyZWVkOwotCiAJdG5jX2Rlc3Ryb3lfY25leHQoYyk7CiAJaWYgKGMtPnpyb290Lnpub2RlKSB7Ci0JCWNsZWFuX2ZyZWVkID0gdWJpZnNfZGVzdHJveV90bmNfc3VidHJlZShjLT56cm9vdC56bm9kZSk7Ci0JCWF0b21pY19sb25nX3N1YihjbGVhbl9mcmVlZCwgJnViaWZzX2NsZWFuX3puX2NudCk7CisJCWxvbmcgbjsKKworCQl1Ymlmc19kZXN0cm95X3RuY19zdWJ0cmVlKGMtPnpyb290Lnpub2RlKTsKKwkJbiA9IGF0b21pY19sb25nX3JlYWQoJmMtPmNsZWFuX3puX2NudCk7CisJCWF0b21pY19sb25nX3N1YihuLCAmdWJpZnNfY2xlYW5fem5fY250KTsKIAl9CiAJa2ZyZWUoYy0+Z2FwX2xlYnMpOwogCWtmcmVlKGMtPmlsZWJzKTsKQEAgLTMzMDAsNyArMzMwMCw3IEBACiAKIAlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAwOwotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykpCiAJCXJldHVybiAwOwogCiAJYmxvY2sgPSAoc2l6ZSArIFVCSUZTX0JMT0NLX1NJWkUgLSAxKSA+PiBVQklGU19CTE9DS19TSElGVDsKQEAgLTMzMzYsOSArMzMzNiwxMCBAQAogCXViaWZzX2VycigiaW5vZGUgJWx1IGhhcyBzaXplICVsbGQsIGJ1dCB0aGVyZSBhcmUgZGF0YSBhdCBvZmZzZXQgJWxsZCAiCiAJCSAgIihkYXRhIGtleSAlcykiLCAodW5zaWduZWQgbG9uZylpbm9kZS0+aV9pbm8sIHNpemUsCiAJCSAgKChsb2ZmX3QpYmxvY2spIDw8IFVCSUZTX0JMT0NLX1NISUZULCBEQkdLRVkoa2V5KSk7CisJbXV0ZXhfdW5sb2NrKCZjLT50bmNfbXV0ZXgpOwogCWRiZ19kdW1wX2lub2RlKGMsIGlub2RlKTsKIAlkYmdfZHVtcF9zdGFjaygpOwotCWVyciA9IC1FSU5WQUw7CisJcmV0dXJuIC1FSU5WQUw7CiAKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZjLT50bmNfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvdG5jX2NvbW1pdC5jIGIvZnMvdWJpZnMvdG5jX2NvbW1pdC5jCmluZGV4IDQxOTIwZjMuLjRjMTVmMDcgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3RuY19jb21taXQuYworKysgYi9mcy91Ymlmcy90bmNfY29tbWl0LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogLyogVGhpcyBmaWxlIGltcGxlbWVudHMgVE5DIGZ1bmN0aW9ucyBmb3IgY29tbWl0dGluZyAqLwogCisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSAidWJpZnMuaCIKIAogLyoqCkBAIC04Nyw4ICs4OCwxMiBAQAogCWF0b21pY19sb25nX2RlYygmYy0+ZGlydHlfem5fY250KTsKIAogCXViaWZzX2Fzc2VydCh1Ymlmc196bl9kaXJ0eSh6bm9kZSkpOwotCXViaWZzX2Fzc2VydCh0ZXN0X2JpdChDT1dfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKTsKKwl1Ymlmc19hc3NlcnQodWJpZnNfem5fY293KHpub2RlKSk7CiAKKwkvKgorCSAqIE5vdGUsIHVubGlrZSAnd3JpdGVfaW5kZXgoKScgd2UgZG8gbm90IGFkZCBtZW1vcnkgYmFycmllcnMgaGVyZQorCSAqIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBAYy0+dG5jX211dGV4IGxvY2tlZC4KKwkgKi8KIAlfX2NsZWFyX2JpdChESVJUWV9aTk9ERSwgJnpub2RlLT5mbGFncyk7CiAJX19jbGVhcl9iaXQoQ09XX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKIApAQCAtMzc3LDcgKzM4Miw3IEBACiAJCQkJYy0+Z2FwX2xlYnMgPSBOVUxMOwogCQkJCXJldHVybiBlcnI7CiAJCQl9Ci0JCQlpZiAoZGJnX2ZvcmNlX2luX3RoZV9nYXBzX2VuYWJsZWQoKSkgeworCQkJaWYgKCFkYmdfaXNfY2hrX2luZGV4KGMpKSB7CiAJCQkJLyoKIAkJCQkgKiBEbyBub3QgcHJpbnQgc2Nhcnkgd2FybmluZ3MgaWYgdGhlIGRlYnVnZ2luZwogCQkJCSAqIG9wdGlvbiB3aGljaCBmb3JjZXMgaW4tdGhlLWdhcHMgaXMgZW5hYmxlZC4KQEAgLTQ5MSwyNSArNDk2LDYgQEAKIAkJZWxzZQogCQkJbmV4dF9sZW4gPSB1Ymlmc19pZHhfbm9kZV9zeihjLCBjbmV4dC0+Y2hpbGRfY250KTsKIAotCQlpZiAoYy0+bWluX2lvX3NpemUgPT0gMSkgewotCQkJYnVmX29mZnMgKz0gQUxJR04obGVuLCA4KTsKLQkJCWlmIChuZXh0X2xlbikgewotCQkJCWlmIChidWZfb2ZmcyArIG5leHRfbGVuIDw9IGMtPmxlYl9zaXplKQotCQkJCQljb250aW51ZTsKLQkJCQllcnIgPSB1Ymlmc191cGRhdGVfb25lX2xwKGMsIGxudW0sIDAsCi0JCQkJCQljLT5sZWJfc2l6ZSAtIGJ1Zl9vZmZzLCAwLCAwKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJCWxudW0gPSAtMTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVyciA9IHViaWZzX3VwZGF0ZV9vbmVfbHAoYywgbG51bSwKLQkJCQkJYy0+bGViX3NpemUgLSBidWZfb2ZmcywgMCwgMCwgMCk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCQlicmVhazsKLQkJfQotCiAJCS8qIFVwZGF0ZSBidWZmZXIgcG9zaXRpb25zICovCiAJCXdsZW4gPSB1c2VkICsgbGVuOwogCQl1c2VkICs9IEFMSUdOKGxlbiwgOCk7CkBAIC02NTgsNyArNjQ0LDcgQEAKIAl9CiAJY250ICs9IDE7CiAJd2hpbGUgKDEpIHsKLQkJdWJpZnNfYXNzZXJ0KCF0ZXN0X2JpdChDT1dfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKTsKKwkJdWJpZnNfYXNzZXJ0KCF1Ymlmc196bl9jb3coem5vZGUpKTsKIAkJX19zZXRfYml0KENPV19aTk9ERSwgJnpub2RlLT5mbGFncyk7CiAJCXpub2RlLT5hbHQgPSAwOwogCQljbmV4dCA9IGZpbmRfbmV4dF9kaXJ0eSh6bm9kZSk7CkBAIC03MDQsNyArNjkwLDcgQEAKIAkJYy0+aWxlYnNbYy0+aWxlYl9jbnQrK10gPSBsbnVtOwogCQlkYmdfY210KCJMRUIgJWQiLCBsbnVtKTsKIAl9Ci0JaWYgKGRiZ19mb3JjZV9pbl90aGVfZ2FwcygpKQorCWlmIChkYmdfaXNfY2hrX2luZGV4KGMpICYmICEocmFuZG9tMzIoKSAmIDcpKQogCQlyZXR1cm4gLUVOT1NQQzsKIAlyZXR1cm4gMDsKIH0KQEAgLTgzMCw3ICs4MTYsNyBAQAogCXN0cnVjdCB1Ymlmc19pZHhfbm9kZSAqaWR4OwogCXN0cnVjdCB1Ymlmc196bm9kZSAqem5vZGUsICpjbmV4dDsKIAlpbnQgaSwgbG51bSwgb2ZmcywgbGVuLCBuZXh0X2xlbiwgYnVmX2xlbiwgYnVmX29mZnMsIHVzZWQ7Ci0JaW50IGF2YWlsLCB3bGVuLCBlcnIsIGxudW1fcG9zID0gMDsKKwlpbnQgYXZhaWwsIHdsZW4sIGVyciwgbG51bV9wb3MgPSAwLCBibGVuLCBueHRfb2ZmczsKIAogCWNuZXh0ID0gYy0+ZW5leHQ7CiAJaWYgKCFjbmV4dCkKQEAgLTkwNyw3ICs4OTMsNyBAQAogCQljbmV4dCA9IHpub2RlLT5jbmV4dDsKIAogCQl1Ymlmc19hc3NlcnQodWJpZnNfem5fZGlydHkoem5vZGUpKTsKLQkJdWJpZnNfYXNzZXJ0KHRlc3RfYml0KENPV19aTk9ERSwgJnpub2RlLT5mbGFncykpOworCQl1Ymlmc19hc3NlcnQodWJpZnNfem5fY293KHpub2RlKSk7CiAKIAkJLyoKIAkJICogSXQgaXMgaW1wb3J0YW50IHRoYXQgb3RoZXIgdGhyZWFkcyBzaG91bGQgc2VlICVESVJUWV9aTk9ERQpAQCAtOTIyLDYgKzkwOCwyOCBAQAogCQljbGVhcl9iaXQoQ09XX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKIAkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAorCQkvKgorCQkgKiBXZSBoYXZlIG1hcmtlZCB0aGUgem5vZGUgYXMgY2xlYW4gYnV0IGhhdmUgbm90IHVwZGF0ZWQgdGhlCisJCSAqIEBjLT5jbGVhbl96bl9jbnQgY291bnRlci4gSWYgdGhpcyB6bm9kZSBiZWNvbWVzIGRpcnR5IGFnYWluCisJCSAqIGJlZm9yZSAnZnJlZV9vYnNvbGV0ZV96bm9kZXMoKScgaXMgY2FsbGVkLCB0aGVuCisJCSAqIEBjLT5jbGVhbl96bl9jbnQgd2lsbCBiZSBkZWNyZW1lbnRlZCBiZWZvcmUgaXQgZ2V0cworCQkgKiBpbmNyZW1lbnRlZCAocmVzdWx0aW5nIGluIDIgZGVjcmVtZW50cyBmb3IgdGhlIHNhbWUgem5vZGUpLgorCQkgKiBUaGlzIG1lYW5zIHRoYXQgQGMtPmNsZWFuX3puX2NudCBtYXkgYmVjb21lIG5lZ2F0aXZlIGZvciBhCisJCSAqIHdoaWxlLgorCQkgKgorCQkgKiBROiB3aHkgd2UgY2Fubm90IGluY3JlbWVudCBAYy0+Y2xlYW5fem5fY250PworCQkgKiBBOiBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIHRoZSBAYy0+dG5jX211dGV4IGxvY2tlZCwgYW5kIHRoZQorCQkgKiAgICBmb2xsb3dpbmcgY29kZSB3b3VsZCBiZSByYWN5IGFuZCBidWdneToKKwkJICoKKwkJICogICAgaWYgKCF1Ymlmc196bl9vYnNvbGV0ZSh6bm9kZSkpIHsKKwkJICogICAgICAgICAgICBhdG9taWNfbG9uZ19pbmMoJmMtPmNsZWFuX3puX2NudCk7CisJCSAqICAgICAgICAgICAgYXRvbWljX2xvbmdfaW5jKCZ1Ymlmc19jbGVhbl96bl9jbnQpOworCQkgKiAgICB9CisJCSAqCisJCSAqICAgIFRodXMsIHdlIGp1c3QgZGVsYXkgdGhlIEBjLT5jbGVhbl96bl9jbnQgdXBkYXRlIHVudGlsIHdlCisJCSAqICAgIGhhdmUgdGhlIG11dGV4IGxvY2tlZC4KKwkJICovCisKIAkJLyogRG8gbm90IGFjY2VzcyB6bm9kZSBmcm9tIHRoaXMgcG9pbnQgb24gKi8KIAogCQkvKiBVcGRhdGUgYnVmZmVyIHBvc2l0aW9ucyAqLwpAQCAtOTM4LDY1ICs5NDYsMzggQEAKIAkJZWxzZQogCQkJbmV4dF9sZW4gPSB1Ymlmc19pZHhfbm9kZV9zeihjLCBjbmV4dC0+Y2hpbGRfY250KTsKIAotCQlpZiAoYy0+bWluX2lvX3NpemUgPT0gMSkgewotCQkJLyoKLQkJCSAqIFdyaXRlIHRoZSBwcmVwYXJlZCBpbmRleCBub2RlIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGlzCi0JCQkgKiBubyBtaW5pbXVtIElPIHNpemUKLQkJCSAqLwotCQkJZXJyID0gdWJpZnNfbGViX3dyaXRlKGMsIGxudW0sIGMtPmNidWYsIGJ1Zl9vZmZzLAotCQkJCQkgICAgICB3bGVuLCBVQklfU0hPUlRURVJNKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJCWJ1Zl9vZmZzICs9IEFMSUdOKHdsZW4sIDgpOwotCQkJaWYgKG5leHRfbGVuKSB7Ci0JCQkJdXNlZCA9IDA7Ci0JCQkJYXZhaWwgPSBidWZfbGVuOwotCQkJCWlmIChidWZfb2ZmcyArIG5leHRfbGVuID4gYy0+bGViX3NpemUpIHsKLQkJCQkJZXJyID0gdWJpZnNfdXBkYXRlX29uZV9scChjLCBsbnVtLAotCQkJCQkJTFBST1BTX05DLCAwLCAwLCBMUFJPUFNfVEFLRU4pOwotCQkJCQlpZiAoZXJyKQotCQkJCQkJcmV0dXJuIGVycjsKLQkJCQkJbG51bSA9IC0xOwotCQkJCX0KKwkJbnh0X29mZnMgPSBidWZfb2ZmcyArIHVzZWQgKyBuZXh0X2xlbjsKKwkJaWYgKG5leHRfbGVuICYmIG54dF9vZmZzIDw9IGMtPmxlYl9zaXplKSB7CisJCQlpZiAoYXZhaWwgPiAwKQogCQkJCWNvbnRpbnVlOwotCQkJfQorCQkJZWxzZQorCQkJCWJsZW4gPSBidWZfbGVuOwogCQl9IGVsc2UgewotCQkJaW50IGJsZW4sIG54dF9vZmZzID0gYnVmX29mZnMgKyB1c2VkICsgbmV4dF9sZW47CisJCQl3bGVuID0gQUxJR04od2xlbiwgOCk7CisJCQlibGVuID0gQUxJR04od2xlbiwgYy0+bWluX2lvX3NpemUpOworCQkJdWJpZnNfcGFkKGMsIGMtPmNidWYgKyB3bGVuLCBibGVuIC0gd2xlbik7CisJCX0KIAotCQkJaWYgKG5leHRfbGVuICYmIG54dF9vZmZzIDw9IGMtPmxlYl9zaXplKSB7Ci0JCQkJaWYgKGF2YWlsID4gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxzZQotCQkJCQlibGVuID0gYnVmX2xlbjsKLQkJCX0gZWxzZSB7Ci0JCQkJd2xlbiA9IEFMSUdOKHdsZW4sIDgpOwotCQkJCWJsZW4gPSBBTElHTih3bGVuLCBjLT5taW5faW9fc2l6ZSk7Ci0JCQkJdWJpZnNfcGFkKGMsIGMtPmNidWYgKyB3bGVuLCBibGVuIC0gd2xlbik7CisJCS8qIFRoZSBidWZmZXIgaXMgZnVsbCBvciB0aGVyZSBhcmUgbm8gbW9yZSB6bm9kZXMgdG8gZG8gKi8KKwkJZXJyID0gdWJpZnNfbGViX3dyaXRlKGMsIGxudW0sIGMtPmNidWYsIGJ1Zl9vZmZzLCBibGVuLAorCQkJCSAgICAgIFVCSV9TSE9SVFRFUk0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnVmX29mZnMgKz0gYmxlbjsKKwkJaWYgKG5leHRfbGVuKSB7CisJCQlpZiAobnh0X29mZnMgPiBjLT5sZWJfc2l6ZSkgeworCQkJCWVyciA9IHViaWZzX3VwZGF0ZV9vbmVfbHAoYywgbG51bSwgTFBST1BTX05DLCAwLAorCQkJCQkJCSAgMCwgTFBST1BTX1RBS0VOKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWxudW0gPSAtMTsKIAkJCX0KLQkJCS8qCi0JCQkgKiBUaGUgYnVmZmVyIGlzIGZ1bGwgb3IgdGhlcmUgYXJlIG5vIG1vcmUgem5vZGVzCi0JCQkgKiB0byBkbwotCQkJICovCi0JCQllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgbG51bSwgYy0+Y2J1ZiwgYnVmX29mZnMsCi0JCQkJCSAgICAgIGJsZW4sIFVCSV9TSE9SVFRFUk0pOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCQkJYnVmX29mZnMgKz0gYmxlbjsKLQkJCWlmIChuZXh0X2xlbikgewotCQkJCWlmIChueHRfb2ZmcyA+IGMtPmxlYl9zaXplKSB7Ci0JCQkJCWVyciA9IHViaWZzX3VwZGF0ZV9vbmVfbHAoYywgbG51bSwKLQkJCQkJCUxQUk9QU19OQywgMCwgMCwgTFBST1BTX1RBS0VOKTsKLQkJCQkJaWYgKGVycikKLQkJCQkJCXJldHVybiBlcnI7Ci0JCQkJCWxudW0gPSAtMTsKLQkJCQl9Ci0JCQkJdXNlZCAtPSBibGVuOwotCQkJCWlmICh1c2VkIDwgMCkKLQkJCQkJdXNlZCA9IDA7Ci0JCQkJYXZhaWwgPSBidWZfbGVuIC0gdXNlZDsKLQkJCQltZW1tb3ZlKGMtPmNidWYsIGMtPmNidWYgKyBibGVuLCB1c2VkKTsKLQkJCQljb250aW51ZTsKLQkJCX0KKwkJCXVzZWQgLT0gYmxlbjsKKwkJCWlmICh1c2VkIDwgMCkKKwkJCQl1c2VkID0gMDsKKwkJCWF2YWlsID0gYnVmX2xlbiAtIHVzZWQ7CisJCQltZW1tb3ZlKGMtPmNidWYsIGMtPmNidWYgKyBibGVuLCB1c2VkKTsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTEwMjksNyArMTAxMCw3IEBACiAJZG8gewogCQl6bm9kZSA9IGNuZXh0OwogCQljbmV4dCA9IHpub2RlLT5jbmV4dDsKLQkJaWYgKHRlc3RfYml0KE9CU09MRVRFX1pOT0RFLCAmem5vZGUtPmZsYWdzKSkKKwkJaWYgKHViaWZzX3puX29ic29sZXRlKHpub2RlKSkKIAkJCWtmcmVlKHpub2RlKTsKIAkJZWxzZSB7CiAJCQl6bm9kZS0+Y25leHQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvdWJpZnMuaCBiL2ZzL3ViaWZzL3ViaWZzLmgKaW5kZXggYTcwZDdiNC4uNzAyYjc5MiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvdWJpZnMuaAorKysgYi9mcy91Ymlmcy91Ymlmcy5oCkBAIC0yMzAsMTQgKzIzMCwxNCBAQAogICogTFBUIGNub2RlIGZsYWcgYml0cy4KICAqCiAgKiBESVJUWV9DTk9ERTogY25vZGUgaXMgZGlydHkKLSAqIENPV19DTk9ERTogY25vZGUgaXMgYmVpbmcgY29tbWl0dGVkIGFuZCBtdXN0IGJlIGNvcGllZCBiZWZvcmUgd3JpdGluZwogICogT0JTT0xFVEVfQ05PREU6IGNub2RlIGlzIGJlaW5nIGNvbW1pdHRlZCBhbmQgaGFzIGJlZW4gY29waWVkIChvciBkZWxldGVkKSwKLSAqIHNvIGl0IGNhbiAoYW5kIG11c3QpIGJlIGZyZWVkIHdoZW4gdGhlIGNvbW1pdCBpcyBmaW5pc2hlZAorICogICAgICAgICAgICAgICAgIHNvIGl0IGNhbiAoYW5kIG11c3QpIGJlIGZyZWVkIHdoZW4gdGhlIGNvbW1pdCBpcyBmaW5pc2hlZAorICogQ09XX0NOT0RFOiBjbm9kZSBpcyBiZWluZyBjb21taXR0ZWQgYW5kIG11c3QgYmUgY29waWVkIGJlZm9yZSB3cml0aW5nCiAgKi8KIGVudW0gewogCURJUlRZX0NOT0RFICAgID0gMCwKLQlDT1dfQ05PREUgICAgICA9IDEsCi0JT0JTT0xFVEVfQ05PREUgPSAyLAorCU9CU09MRVRFX0NOT0RFID0gMSwKKwlDT1dfQ05PREUgICAgICA9IDIsCiB9OwogCiAvKgpAQCAtNzIyLDEyICs3MjIsMTQgQEAKICAqIHN0cnVjdCB1Ymlmc19qaGVhZCAtIGpvdXJuYWwgaGVhZC4KICAqIEB3YnVmOiBoZWFkJ3Mgd3JpdGUtYnVmZmVyCiAgKiBAYnVkc19saXN0OiBsaXN0IG9mIGJ1ZCBMRUJzIGJlbG9uZ2luZyB0byB0aGlzIGpvdXJuYWwgaGVhZAorICogQGdyb3VwZWQ6IG5vbi16ZXJvIGlmIFVCSUZTIGdyb3VwcyBub2RlcyB3aGVuIHdyaXRpbmcgdG8gdGhpcyBqb3VybmFsIGhlYWQKICAqCiAgKiBOb3RlLCB0aGUgQGJ1ZHMgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgdGhlIEBjLT5idWRzX2xvY2suCiAgKi8KIHN0cnVjdCB1Ymlmc19qaGVhZCB7CiAJc3RydWN0IHViaWZzX3didWYgd2J1ZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZHNfbGlzdDsKKwl1bnNpZ25lZCBpbnQgZ3JvdXBlZDoxOwogfTsKIAogLyoqCkBAIC0xNDY2LDYgKzE0NjgsMTUgQEAKIAogLyogaW8uYyAqLwogdm9pZCB1Ymlmc19yb19tb2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgZXJyKTsKK2ludCB1Ymlmc19sZWJfcmVhZChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIHZvaWQgKmJ1ZiwgaW50IG9mZnMsCisJCSAgIGludCBsZW4sIGludCBldmVuX2ViYWRtc2cpOworaW50IHViaWZzX2xlYl93cml0ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnMsCisJCSAgICBpbnQgbGVuLCBpbnQgZHR5cGUpOworaW50IHViaWZzX2xlYl9jaGFuZ2Uoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sCisJCSAgICAgaW50IGR0eXBlKTsKK2ludCB1Ymlmc19sZWJfdW5tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKTsKK2ludCB1Ymlmc19sZWJfbWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IGR0eXBlKTsKK2ludCB1Ymlmc19pc19tYXBwZWQoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKTsKIGludCB1Ymlmc193YnVmX3dyaXRlX25vbG9jayhzdHJ1Y3QgdWJpZnNfd2J1ZiAqd2J1Ziwgdm9pZCAqYnVmLCBpbnQgbGVuKTsKIGludCB1Ymlmc193YnVmX3NlZWtfbm9sb2NrKHN0cnVjdCB1Ymlmc193YnVmICp3YnVmLCBpbnQgbG51bSwgaW50IG9mZnMsCiAJCQkgICBpbnQgZHR5cGUpOwpAQCAtMTc0MiwxMSArMTc1MywxMSBAQAogaW50IHViaWZzX3JlY292ZXJfbWFzdGVyX25vZGUoc3RydWN0IHViaWZzX2luZm8gKmMpOwogaW50IHViaWZzX3dyaXRlX3JjdnJkX21zdF9ub2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKIHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqdWJpZnNfcmVjb3Zlcl9sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAotCQkJCQkgaW50IG9mZnMsIHZvaWQgKnNidWYsIGludCBncm91cGVkKTsKKwkJCQkJIGludCBvZmZzLCB2b2lkICpzYnVmLCBpbnQgamhlYWQpOwogc3RydWN0IHViaWZzX3NjYW5fbGViICp1Ymlmc19yZWNvdmVyX2xvZ19sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAogCQkJCQkgICAgIGludCBvZmZzLCB2b2lkICpzYnVmKTsKLWludCB1Ymlmc19yZWNvdmVyX2lubF9oZWFkcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdm9pZCAqc2J1Zik7Ci1pbnQgdWJpZnNfY2xlYW5fbGVicyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdm9pZCAqc2J1Zik7CitpbnQgdWJpZnNfcmVjb3Zlcl9pbmxfaGVhZHMoc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpOworaW50IHViaWZzX2NsZWFuX2xlYnMoc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpOwogaW50IHViaWZzX3JjdnJ5X2djX2NvbW1pdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiBpbnQgdWJpZnNfcmVjb3Zlcl9zaXplX2FjY3VtKHN0cnVjdCB1Ymlmc19pbmZvICpjLCB1bmlvbiB1Ymlmc19rZXkgKmtleSwKIAkJCSAgICAgaW50IGRlbGV0aW9uLCBsb2ZmX3QgbmV3X3NpemUpOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL25hbWVpLmMgYi9mcy91ZnMvbmFtZWkuYwppbmRleCAyOTMwOWUyLi5iNTdhYWI5IDEwMDY0NAotLS0gYS9mcy91ZnMvbmFtZWkuYworKysgYi9mcy91ZnMvbmFtZWkuYwpAQCAtNTYsMTYgKzU2LDEyIEBACiAKIAlsb2NrX3VmcyhkaXItPmlfc2IpOwogCWlubyA9IHVmc19pbm9kZV9ieV9uYW1lKGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKLQlpZiAoaW5vKSB7CisJaWYgKGlubykKIAkJaW5vZGUgPSB1ZnNfaWdldChkaXItPmlfc2IsIGlubyk7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQl1bmxvY2tfdWZzKGRpci0+aV9zYik7Ci0JCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCQl9Ci0JfQogCXVubG9ja191ZnMoZGlyLT5pX3NiKTsKLQlkX2FkZChkZW50cnksIGlub2RlKTsKLQlyZXR1cm4gTlVMTDsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKaW5kZXggZjQyMTNiYS4uN2Y3ODJhZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwpAQCAtMTMxLDE5ICsxMzEsMzQgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwOwogCWludAkJCWVycm9yID0gMDsKIAlpbnQJCQlsb2dfZmx1c2hlZCA9IDA7CiAKIAl0cmFjZV94ZnNfZmlsZV9mc3luYyhpcCk7CiAKLQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwogCiAJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lUUlVOQ0FURUQpOwogCiAJeGZzX2lvZW5kX3dhaXQoaXApOwogCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhbiBSVCBhbmQvb3IgbG9nIHN1YnZvbHVtZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorCQkgKiB0byBmbHVzaCB0aGUgd3JpdGUgY2FjaGUgdGhlIGRldmljZSB1c2VkIGZvciBmaWxlIGRhdGEKKwkJICogZmlyc3QuICBUaGlzIGlzIHRvIGVuc3VyZSBuZXdseSB3cml0dGVuIGZpbGUgZGF0YSBtYWtlCisJCSAqIGl0IHRvIGRpc2sgYmVmb3JlIGxvZ2dpbmcgdGhlIG5ldyBpbm9kZSBzaXplIGluIGNhc2Ugb2YKKwkJICogYW4gZXh0ZW5kaW5nIHdyaXRlLgorCQkgKi8KKwkJaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpCisJCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKwkJZWxzZSBpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApCisJCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCX0KKwogCS8qCiAJICogV2UgYWx3YXlzIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGlub2RlIHN0YXRlIGlzIHNhZmUgb24KIAkgKiBkaXNrLiAgVGhlIGlub2RlIG1pZ2h0IGJlIGNsZWFuIGJ1dCB3ZSBzdGlsbCBtaWdodCBuZWVkIHRvIGZvcmNlIHRoZQpAQCAtMTc1LDkgKzE5MCw5IEBACiAJCSAqIHVwZGF0ZXMuICBUaGUgc3luYyB0cmFuc2FjdGlvbiB3aWxsIGFsc28gZm9yY2UgdGhlIGxvZy4KIAkJICovCiAJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MoaXAtPmlfbW91bnQsIFhGU19UUkFOU19GU1lOQ19UUyk7CisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRlNZTkNfVFMpOwogCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAotCQkJCVhGU19GU1lOQ19UU19MT0dfUkVTKGlwLT5pX21vdW50KSwgMCwgMCwgMCk7CisJCQkJWEZTX0ZTWU5DX1RTX0xPR19SRVMobXApLCAwLCAwLCAwKTsKIAkJaWYgKGVycm9yKSB7CiAJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKIAkJCXJldHVybiAtZXJyb3I7CkBAIC0yMDksMjggKzIyNCwyNSBAQAogCQkgKiBmb3JjZSB0aGUgbG9nLgogCQkgKi8KIAkJaWYgKHhmc19pcGluY291bnQoaXApKSB7Ci0JCQllcnJvciA9IF94ZnNfbG9nX2ZvcmNlX2xzbihpcC0+aV9tb3VudCwKKwkJCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKG1wLAogCQkJCQlpcC0+aV9pdGVtcC0+aWxpX2xhc3RfbHNuLAogCQkJCQlYRlNfTE9HX1NZTkMsICZsb2dfZmx1c2hlZCk7CiAJCX0KIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCX0KIAotCWlmIChpcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBsb2cgd3JpdGUgZGlkbid0IGlzc3VlIGFuIG9yZGVyZWQgdGFnIHdlIG5lZWQKLQkJICogdG8gZmx1c2ggdGhlIGRpc2sgY2FjaGUgZm9yIHRoZSBkYXRhIGRldmljZSBub3cuCi0JCSAqLwotCQlpZiAoIWxvZ19mbHVzaGVkKQotCQkJeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChpcC0+aV9tb3VudC0+bV9kZGV2X3RhcmdwKTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGlub2RlIGlzIG9uIHRoZSBSVCBkZXYgd2UgbmVlZCB0byBmbHVzaCB0aGF0Ci0JCSAqIGNhY2hlIGFzIHdlbGwuCi0JCSAqLwotCQlpZiAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkKLQkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2goaXAtPmlfbW91bnQtPm1fcnRkZXZfdGFyZ3ApOwotCX0KKwkvKgorCSAqIElmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBkZXZpY2UsIGFuZCB0aGUgbG9nIGZvcmNlIGFib3V0IHdhcworCSAqIGEgbm8tb3Agd2UgbWlnaHQgaGF2ZSB0byBmbHVzaCB0aGUgZGF0YSBkZXZpY2UgY2FjaGUgaGVyZS4KKwkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IgZmRhdGFzeW5jL09fRFNZTkMgaWYgd2Ugd2VyZSBvdmVyd3JpdGluZworCSAqIGFuIGFscmVhZHkgYWxsb2NhdGVkIGZpbGUgYW5kIHRodXMgZG8gbm90IGhhdmUgYW55IG1ldGFkYXRhIHRvCisJICogY29tbWl0LgorCSAqLworCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgJiYKKwkgICAgbXAtPm1fbG9nZGV2X3RhcmdwID09IG1wLT5tX2RkZXZfdGFyZ3AgJiYKKwkgICAgIVhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgJiYKKwkgICAgIWxvZ19mbHVzaGVkKQorCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOwogCiAJcmV0dXJuIC1lcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwppbmRleCBkZDIxNzg0Li5kNDRkOTJjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAlpZiAoSVNfUE9TSVhBQ0woZGlyKSkgewogCQlkZWZhdWx0X2FjbCA9IHhmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CiAJCWlmIChJU19FUlIoZGVmYXVsdF9hY2wpKQotCQkJcmV0dXJuIC1QVFJfRVJSKGRlZmF1bHRfYWNsKTsKKwkJCXJldHVybiBQVFJfRVJSKGRlZmF1bHRfYWNsKTsKIAogCQlpZiAoIWRlZmF1bHRfYWNsKQogCQkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggMWUzYTdjZS4uYTFhODgxZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC02MjcsNjggKzYyNyw2IEBACiAJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURXxGTU9ERV9FWENMKTsKIH0KIAotLyoKLSAqIFRyeSB0byB3cml0ZSBvdXQgdGhlIHN1cGVyYmxvY2sgdXNpbmcgYmFycmllcnMuCi0gKi8KLVNUQVRJQyBpbnQKLXhmc19iYXJyaWVyX3Rlc3QoCi0JeGZzX21vdW50X3QJKm1wKQotewotCXhmc19idWZfdAkqc2JwID0geGZzX2dldHNiKG1wLCAwKTsKLQlpbnQJCWVycm9yOwotCi0JWEZTX0JVRl9VTkRPTkUoc2JwKTsKLQlYRlNfQlVGX1VOUkVBRChzYnApOwotCVhGU19CVUZfVU5ERUxBWVdSSVRFKHNicCk7Ci0JWEZTX0JVRl9XUklURShzYnApOwotCVhGU19CVUZfVU5BU1lOQyhzYnApOwotCVhGU19CVUZfT1JERVJFRChzYnApOwotCi0JeGZzYmRzdHJhdChtcCwgc2JwKTsKLQllcnJvciA9IHhmc19idWZfaW93YWl0KHNicCk7Ci0KLQkvKgotCSAqIENsZWFyIGFsbCB0aGUgZmxhZ3Mgd2Ugc2V0IGFuZCBwb3NzaWJsZSBlcnJvciBzdGF0ZSBpbiB0aGUKLQkgKiBidWZmZXIuICBXZSBvbmx5IGRpZCB0aGUgd3JpdGUgdG8gdHJ5IG91dCB3aGV0aGVyIGJhcnJpZXJzCi0JICogd29ya2VkIGFuZCBzaG91bGRuJ3QgbGVhdmUgYW55IHRyYWNlcyBpbiB0aGUgc3VwZXJibG9jawotCSAqIGJ1ZmZlci4KLQkgKi8KLQlYRlNfQlVGX0RPTkUoc2JwKTsKLQlYRlNfQlVGX0VSUk9SKHNicCwgMCk7Ci0JWEZTX0JVRl9VTk9SREVSRUQoc2JwKTsKLQotCXhmc19idWZfcmVsc2Uoc2JwKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLVNUQVRJQyB2b2lkCi14ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyh4ZnNfbW91bnRfdCAqbXApCi17Ci0JaW50IGVycm9yOwotCi0JaWYgKG1wLT5tX2xvZ2Rldl90YXJncCAhPSBtcC0+bV9kZGV2X3RhcmdwKSB7Ci0JCXhmc19ub3RpY2UobXAsCi0JCSAgIkRpc2FibGluZyBiYXJyaWVycywgbm90IHN1cHBvcnRlZCB3aXRoIGV4dGVybmFsIGxvZyBkZXZpY2UiKTsKLQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHhmc19yZWFkb25seV9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApKSB7Ci0JCXhmc19ub3RpY2UobXAsCi0JCQkiRGlzYWJsaW5nIGJhcnJpZXJzLCB1bmRlcmx5aW5nIGRldmljZSBpcyByZWFkb25seSIpOwotCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7Ci0JCXJldHVybjsKLQl9Ci0KLQllcnJvciA9IHhmc19iYXJyaWVyX3Rlc3QobXApOwotCWlmIChlcnJvcikgewotCQl4ZnNfbm90aWNlKG1wLAotCQkJIkRpc2FibGluZyBiYXJyaWVycywgdHJpYWwgYmFycmllciB3cml0ZSBmYWlsZWQiKTsKLQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwotCQlyZXR1cm47Ci0JfQotfQotCiB2b2lkCiB4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKAogCXhmc19idWZ0YXJnX3QJCSpidWZ0YXJnKQpAQCAtMTI0MCwxNCArMTE3OCw2IEBACiAJCXN3aXRjaCAodG9rZW4pIHsKIAkJY2FzZSBPcHRfYmFycmllcjoKIAkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9CQVJSSUVSOwotCi0JCQkvKgotCQkJICogVGVzdCBpZiBiYXJyaWVycyBhcmUgYWN0dWFsbHkgd29ya2luZyBpZiB3ZSBjYW4sCi0JCQkgKiBlbHNlIGRlbGF5IHRoaXMgY2hlY2sgdW50aWwgdGhlIGZpbGVzeXN0ZW0gaXMKLQkJCSAqIG1hcmtlZCB3cml0ZWFibGUuCi0JCQkgKi8KLQkJCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkpCi0JCQkJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMobXApOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vYmFycmllcjoKIAkJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKQEAgLTEyODIsOCArMTIxMiw2IEBACiAJLyogcm8gLT4gcncgKi8KIAlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkgJiYgISgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfUkRPTkxZOwotCQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikKLQkJCXhmc19tb3VudGZzX2NoZWNrX2JhcnJpZXJzKG1wKTsKIAogCQkvKgogCQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZW1vdW50IHRvIHdyaXRlYWJsZSBzdGF0ZSB3ZQpAQCAtMTQ2NSw5ICsxMzkzLDYgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfc2I7CiAKLQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikKLQkJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMobXApOwotCiAJZXJyb3IgPSB4ZnNfZmlsZXN0cmVhbV9tb3VudChtcCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlX3NiOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyLmMgYi9mcy94ZnMveGZzX2F0dHIuYwppbmRleCBjODYzNzUzLi4wMWQyMDcyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHIuYworKysgYi9mcy94ZnMveGZzX2F0dHIuYwpAQCAtNDkwLDYgKzQ5MCwxMyBAQAogCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKIAogCS8qCisJICogd2UgaGF2ZSBubyBjb250cm9sIG92ZXIgdGhlIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IHVzZXJzcGFjZSBwYXNzZXMgdXMKKwkgKiB0byByZW1vdmUsIHNvIHdlIGhhdmUgdG8gYWxsb3cgdGhlIG5hbWUgbG9va3VwIHByaW9yIHRvIGF0dHJpYnV0ZQorCSAqIHJlbW92YWwgdG8gZmFpbC4KKwkgKi8KKwlhcmdzLm9wX2ZsYWdzID0gWEZTX0RBX09QX09LTk9FTlQ7CisKKwkvKgogCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZS4KIAkgKi8KIAllcnJvciA9IHhmc19xbV9kcWF0dGFjaChkcCwgMCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IGNiOWI2ZDEuLjM2MzE3ODMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC0yNTMsMTYgKzI1MywyMSBAQAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAotCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JTkVXOwotCQkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNQUJMRTsKLQkJCV9feGZzX2lub2RlX3NldF9yZWNsYWltX3RhZyhwYWcsIGlwKTsKKwkJCWlwLT5pX2ZsYWdzICY9IH4oWEZTX0lORVcgfCBYRlNfSVJFQ0xBSU0pOworCQkJQVNTRVJUKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNQUJMRSk7CiAJCQl0cmFjZV94ZnNfaWdldF9yZWNsYWltX2ZhaWwoaXApOwogCQkJZ290byBvdXRfZXJyb3I7CiAJCX0KIAogCQlzcGluX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJaXAtPmlfZmxhZ3MgJj0gfihYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNKTsKKworCQkvKgorCQkgKiBDbGVhciB0aGUgcGVyLWxpZmV0aW1lIHN0YXRlIGluIHRoZSBpbm9kZSBhcyB3ZSBhcmUgbm93CisJCSAqIGVmZmVjdGl2ZWx5IGEgbmV3IGlub2RlIGFuZCBuZWVkIHRvIHJldHVybiB0byB0aGUgaW5pdGlhbAorCQkgKiBzdGF0ZSBiZWZvcmUgcmV1c2Ugb2NjdXJzLgorCQkgKi8KKwkJaXAtPmlfZmxhZ3MgJj0gflhGU19JUkVDTEFJTV9SRVNFVF9GTEFHUzsKIAkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lORVc7CiAJCV9feGZzX2lub2RlX2NsZWFyX3JlY2xhaW1fdGFnKG1wLCBwYWcsIGlwKTsKIAkJaW5vZGUtPmlfc3RhdGUgPSBJX05FVzsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuaCBiL2ZzL3hmcy94ZnNfaW5vZGUuaAppbmRleCAzYWU2ZDU4Li45NjRjZmVhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmgKKysrIGIvZnMveGZzL3hmc19pbm9kZS5oCkBAIC0zODQsNiArMzg0LDE2IEBACiAjZGVmaW5lIFhGU19JRElSVFlfUkVMRUFTRQkweDAwNDAJLyogZGlydHkgcmVsZWFzZSBhbHJlYWR5IHNlZW4gKi8KIAogLyoKKyAqIFBlci1saWZldGltZSBmbGFncyBuZWVkIHRvIGJlIHJlc2V0IHdoZW4gcmUtdXNpbmcgYSByZWNsYWltYWJsZSBpbm9kZSBkdXJpbmcKKyAqIGlub2RlIGxvb2t1cC4gVGhpIHByZXZlbnRzIHVuaW50ZW5kZWQgYmVoYXZpb3VyIG9uIHRoZSBuZXcgaW5vZGUgZnJvbQorICogb2N1cnJpbmcuCisgKi8KKyNkZWZpbmUgWEZTX0lSRUNMQUlNX1JFU0VUX0ZMQUdTCVwKKwkoWEZTX0lSRUNMQUlNQUJMRSB8IFhGU19JUkVDTEFJTSB8IFwKKwkgWEZTX0lESVJUWV9SRUxFQVNFIHwgWEZTX0lUUlVOQ0FURUQgfCBcCisJIFhGU19JRklMRVNUUkVBTSk7CisKKy8qCiAgKiBGbGFncyBmb3IgaW5vZGUgbG9ja2luZy4KICAqIEJpdCByYW5nZXM6CTE8PDEgIC0gMTw8MTYtMSAtLSBpb2xvY2svaWxvY2sgbW9kZXMgKGJpdGZpZWxkKQogICoJCTE8PDE2IC0gMTw8MzItMSAtLSBsb2NrZGVwIGFubm90YXRpb24gKGludGVnZXJzKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwppbmRleCAwOTk4M2EzLi5iMWU4OGQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwpAQCAtNjgxLDE1ICs2ODEsMTUgQEAKICAqIHdoZXJlIHRoZSBjbHVzdGVyIGJ1ZmZlciBtYXkgYmUgdW5waW5uZWQgYmVmb3JlIHRoZSBpbm9kZSBpcyBpbnNlcnRlZCBpbnRvCiAgKiB0aGUgQUlMIGR1cmluZyB0cmFuc2FjdGlvbiBjb21taXR0ZWQgcHJvY2Vzc2luZy4gSWYgdGhlIGJ1ZmZlciBpcyB1bnBpbm5lZAogICogYmVmb3JlIHRoZSBpbm9kZSBpdGVtIGhhcyBiZWVuIGNvbW1pdHRlZCBhbmQgaW5zZXJ0ZWQsIHRoZW4gaXQgaXMgcG9zc2libGUKLSAqIGZvciB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gYW5kIElPIGNvbXBsZXRpb25zIGJlZm9yZSB0aGUgaW5vZGUgaXMgaW5zZXJ0ZWQKKyAqIGZvciB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gYW5kIElPIGNvbXBsZXRlcyBiZWZvcmUgdGhlIGlub2RlIGlzIGluc2VydGVkCiAgKiBpbnRvIHRoZSBBSUwuIEluIHRoYXQgY2FzZSwgd2UnZCBiZSBpbnNlcnRpbmcgYSBjbGVhbiwgc3RhbGUgaW5vZGUgaW50byB0aGUKICAqIEFJTCB3aGljaCB3aWxsIG5ldmVyIGdldCByZW1vdmVkLiBJdCB3aWxsLCBob3dldmVyLCBnZXQgcmVjbGFpbWVkIHdoaWNoCiAgKiB0cmlnZ2VycyBhbiBhc3NlcnQgaW4geGZzX2lub2RlX2ZyZWUoKSBjb21wbGFpbmluZyBhYm91dCBmcmVlaW4gYW4gaW5vZGUKICAqIHN0aWxsIGluIHRoZSBBSUwuCiAgKgotICogVG8gYXZvaWQgdGhpcywgcmV0dXJuIGEgbG93ZXIgTFNOIHRoYW4gdGhlIG9uZSBwYXNzZWQgaW4gc28gdGhhdCB0aGUKLSAqIHRyYW5zYWN0aW9uIGNvbW1pdHRlZCBjb2RlIHdpbGwgbm90IG1vdmUgdGhlIGlub2RlIGZvcndhcmQgaW4gdGhlIEFJTCBidXQKLSAqIHdpbGwgc3RpbGwgdW5waW4gaXQgcHJvcGVybHkuCisgKiBUbyBhdm9pZCB0aGlzLCBqdXN0IHVucGluIHRoZSBpbm9kZSBkaXJlY3RseSBhbmQgcmV0dXJuIGEgTFNOIG9mIC0xIHNvIHRoZQorICogdHJhbnNhY3Rpb24gY29tbWl0dGVkIGNvZGUga25vd3MgdGhhdCBpdCBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueSBmdXJ0aGVyCisgKiBwcm9jZXNzaW5nIG9uIHRoZSBpdGVtLgogICovCiBTVEFUSUMgeGZzX2xzbl90CiB4ZnNfaW5vZGVfaXRlbV9jb21taXR0ZWQoCkBAIC02OTksOCArNjk5LDEwIEBACiAJc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaWlwID0gSU5PREVfSVRFTShsaXApOwogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gaWlwLT5pbGlfaW5vZGU7CiAKLQlpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVNUQUxFKSkKLQkJcmV0dXJuIGxzbiAtIDE7CisJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lTVEFMRSkpIHsKKwkJeGZzX2lub2RlX2l0ZW1fdW5waW4obGlwLCAwKTsKKwkJcmV0dXJuIC0xOworCX0KIAlyZXR1cm4gbHNuOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCAyMTE5MzAyLi40MWQ1YjhmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTEzNzIsOCArMTM3MiwxNyBAQAogCVhGU19CVUZfQVNZTkMoYnApOwogCWJwLT5iX2ZsYWdzIHw9IFhCRl9MT0dfQlVGRkVSOwogCi0JaWYgKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQorCWlmIChsb2ctPmxfbXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsIGxvZyBkZXZpY2UsIGZsdXNoIHRoZSBkYXRhIGRldmljZQorCQkgKiBiZWZvcmUgZmx1c2hpbmcgdGhlIGxvZyB0byBtYWtlIHN1cmUgYWxsIG1ldGEgZGF0YQorCQkgKiB3cml0dGVuIGJhY2sgZnJvbSB0aGUgQUlMIGFjdHVhbGx5IG1hZGUgaXQgdG8gZGlzaworCQkgKiBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIG5ldyBsb2cgdGFpbCBMU04gaW4gdGhlIGxvZyBidWZmZXIuCisJCSAqLworCQlpZiAobG9nLT5sX21wLT5tX2xvZ2Rldl90YXJncCAhPSBsb2ctPmxfbXAtPm1fZGRldl90YXJncCkKKwkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2gobG9nLT5sX21wLT5tX2RkZXZfdGFyZ3ApOwogCQlYRlNfQlVGX09SREVSRUQoYnApOworCX0KIAogCUFTU0VSVChYRlNfQlVGX0FERFIoYnApIDw9IGxvZy0+bF9sb2dCQnNpemUtMSk7CiAJQVNTRVJUKFhGU19CVUZfQUREUihicCkgKyBCVE9CQihjb3VudCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmMgYi9mcy94ZnMveGZzX3RyYW5zLmMKaW5kZXggN2M3YmMyYi4uYzgzZjYzYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwpAQCAtMTM2MSw3ICsxMzYxLDcgQEAKIAkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKIAlpdGVtX2xzbiA9IElPUF9DT01NSVRURUQobGlwLCBjb21taXRfbHNuKTsKIAotCS8qIElmIHRoZSBjb21taXR0ZWQgcm91dGluZSByZXR1cm5zIC0xLCBpdGVtIGhhcyBiZWVuIGZyZWVkLiAqLworCS8qIGl0ZW1fbHNuIG9mIC0xIG1lYW5zIHRoZSBpdGVtIG5lZWRzIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLwogCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgKHhmc19sc25fdCktMSkgPT0gMCkKIAkJcmV0dXJuOwogCkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKIAkJaXRlbV9sc24gPSBJT1BfQ09NTUlUVEVEKGxpcCwgY29tbWl0X2xzbik7CiAKLQkJLyogaXRlbV9sc24gb2YgLTEgbWVhbnMgdGhlIGl0ZW0gd2FzIGZyZWVkICovCisJCS8qIGl0ZW1fbHNuIG9mIC0xIG1lYW5zIHRoZSBpdGVtIG5lZWRzIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLwogCQlpZiAoWEZTX0xTTl9DTVAoaXRlbV9sc24sICh4ZnNfbHNuX3QpLTEpID09IDApCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IGI3YTVmZTcuLjYxOTcyMDcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTk2MCw4ICs5NjAsMTEgQEAKIAkJICogYmUgZXhwb3NlZCB0byB0aGF0IHByb2JsZW0uCiAJCSAqLwogCQl0cnVuY2F0ZWQgPSB4ZnNfaWZsYWdzX3Rlc3RfYW5kX2NsZWFyKGlwLCBYRlNfSVRSVU5DQVRFRCk7Ci0JCWlmICh0cnVuY2F0ZWQgJiYgVk5fRElSVFkoVkZTX0koaXApKSAmJiBpcC0+aV9kZWxheWVkX2Jsa3MgPiAwKQotCQkJeGZzX2ZsdXNoX3BhZ2VzKGlwLCAwLCAtMSwgWEJGX0FTWU5DLCBGSV9OT05FKTsKKwkJaWYgKHRydW5jYXRlZCkgeworCQkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lESVJUWV9SRUxFQVNFKTsKKwkJCWlmIChWTl9ESVJUWShWRlNfSShpcCkpICYmIGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApCisJCQkJeGZzX2ZsdXNoX3BhZ2VzKGlwLCAwLCAtMSwgWEJGX0FTWU5DLCBGSV9OT05FKTsKKwkJfQogCX0KIAogCWlmIChpcC0+aV9kLmRpX25saW5rID09IDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCmluZGV4IDNhMTBlZjUuLjZjZDViNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCkBAIC0yMTAsNyArMjEwLDcgQEAKIHN0cnVjdCBhY3BpX2RldmljZV9wb3dlciB7CiAJaW50IHN0YXRlOwkJLyogQ3VycmVudCBzdGF0ZSAqLwogCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9mbGFncyBmbGFnczsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfcG93ZXJfc3RhdGUgc3RhdGVzWzRdOwkvKiBQb3dlciBzdGF0ZXMgKEQwLUQzKSAqLworCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSBzdGF0ZXNbQUNQSV9EX1NUQVRFX0NPVU5UXTsJLyogUG93ZXIgc3RhdGVzIChEMC1EM0NvbGQpICovCiB9OwogCiAvKiBQZXJmb3JtYW5jZSBNYW5hZ2VtZW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IGE3NTZiYzguLjQ1NDNiNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC05OCw4ICs5OCwxMSBAQAogLyoKICAqIFNwaW5sb2NrIHByaW1pdGl2ZXMKICAqLworCisjaWZuZGVmIGFjcGlfb3NfY3JlYXRlX2xvY2sKIGFjcGlfc3RhdHVzCiBhY3BpX29zX2NyZWF0ZV9sb2NrKGFjcGlfc3BpbmxvY2sgKm91dF9oYW5kbGUpOworI2VuZGlmCiAKIHZvaWQgYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX3NwaW5sb2NrIGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCmluZGV4IDVkMmE1ZTkuLjJjZTFiZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaApAQCAtMTU5LDYgKzE1OSwyNCBAQAogCX0gd2hpbGUgKDApCiAjZW5kaWYKIAorLyoKKyAqIFdoZW4gbG9ja2RlcCBpcyBlbmFibGVkLCB0aGUgc3Bpbl9sb2NrX2luaXQoKSBtYWNybyBzdHJpbmdpZmllcyBpdCdzCisgKiBhcmd1bWVudCBhbmQgdXNlcyB0aGF0IGFzIGEgbmFtZSBmb3IgdGhlIGxvY2sgaW4gZGVidWdnaW5nLgorICogQnkgZXhlY3V0aW5nIHNwaW5fbG9ja19pbml0KCkgaW4gYSBtYWNybyB0aGUga2V5IGNoYW5nZXMgZnJvbSAibG9jayIgZm9yCisgKiBhbGwgbG9ja3MgdG8gdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IG9mIGFjcGlfb3NfY3JlYXRlX2xvY2soKSwgd2hpY2gKKyAqIHByZXZlbnRzIGxvY2tkZXAgZnJvbSByZXBvcnRpbmcgZmFsc2UgcG9zaXRpdmVzIGZvciBBQ1BJQ0EgbG9ja3MuCisgKi8KKyNkZWZpbmUgYWNwaV9vc19jcmVhdGVfbG9jayhfX2hhbmRsZSkJCQkJXAorKHsJCQkJCQkJCVwKKwlzcGlubG9ja190ICpsb2NrID0gQUNQSV9BTExPQ0FURShzaXplb2YoKmxvY2spKTsJXAorCQkJCQkJCQlcCisJaWYgKGxvY2spIHsJCQkJCQlcCisJCSooX19oYW5kbGUpID0gbG9jazsJCQkJXAorCQlzcGluX2xvY2tfaW5pdCgqKF9faGFuZGxlKSk7CQkJXAorCX0JCQkJCQkJXAorCWxvY2sgPyBBRV9PSyA6IEFFX05PX01FTU9SWTsJCQkJXAorfSkKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9fQUNMSU5VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmgKaW5kZXggZmNkY2I1ZC4uZDQ5NDAwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmgKQEAgLTE3MCwxNiArMTcwLDYgQEAKIAogZXh0ZXJuIGludCBfX2dwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pOwogCi0jZGVmaW5lIEdQSU9GX0RJUl9PVVQJKDAgPDwgMCkKLSNkZWZpbmUgR1BJT0ZfRElSX0lOCSgxIDw8IDApCi0KLSNkZWZpbmUgR1BJT0ZfSU5JVF9MT1cJKDAgPDwgMSkKLSNkZWZpbmUgR1BJT0ZfSU5JVF9ISUdICSgxIDw8IDEpCi0KLSNkZWZpbmUgR1BJT0ZfSU4JCShHUElPRl9ESVJfSU4pCi0jZGVmaW5lIEdQSU9GX09VVF9JTklUX0xPVwkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfTE9XKQotI2RlZmluZSBHUElPRl9PVVRfSU5JVF9ISUdICShHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9ISUdIKQotCiAvKioKICAqIHN0cnVjdCBncGlvIC0gYSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8gd2l0aCBjb25maWd1cmF0aW9uCiAgKiBAZ3BpbzoJdGhlIEdQSU8gbnVtYmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCmluZGV4IGU5YjhlNTkuLjc2YmZmMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCkBAIC04OCw3ICs4OCw3IEBACiAJcG1kX3QgcG1kID0gKnBtZHA7CiAJcG1kX2NsZWFyKG1tLCBhZGRyZXNzLCBwbWRwKTsKIAlyZXR1cm4gcG1kOwotfSkKK30KICNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAppbmRleCBhZTkwZTBmLi40Zjc2OTU5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCkBAIC02ODMsOSArNjgzLDExIEBACiBfX1NZU0NBTEwoX19OUl9zeW5jZnMsIHN5c19zeW5jZnMpCiAjZGVmaW5lIF9fTlJfc2V0bnMgMjY4CiBfX1NZU0NBTEwoX19OUl9zZXRucywgc3lzX3NldG5zKQorI2RlZmluZSBfX05SX3NlbmRtbXNnIDI2OQorX19TQ19DT01QKF9fTlJfc2VuZG1tc2csIHN5c19zZW5kbW1zZywgY29tcGF0X3N5c19zZW5kbW1zZykKIAogI3VuZGVmIF9fTlJfc3lzY2FsbHMKLSNkZWZpbmUgX19OUl9zeXNjYWxscyAyNjkKKyNkZWZpbmUgX19OUl9zeXNjYWxscyAyNzAKIAogLyoKICAqIEFsbCBzeXNjYWxscyBiZWxvdyBoZXJlIHNob3VsZCBnbyBhd2F5IHJlYWxseSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCmluZGV4IDk1NzNlMGMuLjMzZDEyZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaApAQCAtNTIwLDYgKzUyMCw4IEBACiAJdWludDMyX3QgZW5jb2Rlcl9pZHNbRFJNX0NPTk5FQ1RPUl9NQVhfRU5DT0RFUl07CiAJdWludDMyX3QgZm9yY2VfZW5jb2Rlcl9pZDsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7IC8qIGN1cnJlbnRseSBhY3RpdmUgZW5jb2RlciAqLworCisJaW50IG51bGxfZWRpZF9jb3VudGVyOyAvKiBuZWVkZWQgdG8gd29ya2Fyb3VuZCBzb21lIEhXIGJ1Z3Mgd2hlcmUgd2UgZ2V0IGFsbCAwcyAqLwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmggYi9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggZjA0YjJhMy4uM2Q1M2VmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaApAQCAtMTgyLDYgKzE4Miw3IEBACiAJezB4MTAwMiwgMHg2NzUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzVGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC0xOTIsNiArMTkzLDcgQEAKIAl7MHgxMDAyLCAweDY3NjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc3OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njg4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DWVBSRVNTfFJBREVPTl9ORVdfTUVNTUFQfSwgXApAQCAtNDY3LDYgKzQ2OSwxNyBAQAogCXsweDEwMDIsIDB4OTYxNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzc4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTYxNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzc4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTYxNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzc4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU8yfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU8yfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PMnxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PMnxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sXAorCXsweDEwMDIsIDB4OTY0OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCisJezB4MTAwMiwgMHg5NjRhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sXAorCXsweDEwMDIsIDB4OTY0ZiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCiAJezB4MTAwMiwgMHg5NzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NzExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oCmluZGV4IDU0NzlmZGMuLjUxNGVkNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmgKQEAgLTIwMSw2ICsyMDEsOSBAQAogCWJvb2wgKCpkbWFfZmlsdGVyKShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmZpbHRlcl9wYXJhbSk7CiAJdm9pZCAqZG1hX3J4X3BhcmFtOwogCXZvaWQgKmRtYV90eF9wYXJhbTsKKyAgICAgICAgdm9pZCAoKmluaXQpICh2b2lkKTsKKwl2b2lkICgqZXhpdCkgKHZvaWQpOworCXZvaWQgKCpyZXNldCkgKHZvaWQpOwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jhc2ljX21taW9fZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9iYXNpY19tbWlvX2dwaW8uaAppbmRleCAxYWUxMjcxLi45ODk5OWNmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYXNpY19tbWlvX2dwaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jhc2ljX21taW9fZ3Bpby5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgogCiBzdHJ1Y3QgYmdwaW9fcGRhdGEgewogCWludCBiYXNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKaW5kZXggMmE3Y2VhNTMuLjYzOTU2OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJKFJFUV9GQUlMRkFTVF9ERVYgfCBSRVFfRkFJTEZBU1RfVFJBTlNQT1JUIHwgUkVRX0ZBSUxGQVNUX0RSSVZFUikKICNkZWZpbmUgUkVRX0NPTU1PTl9NQVNLIFwKIAkoUkVRX1dSSVRFIHwgUkVRX0ZBSUxGQVNUX01BU0sgfCBSRVFfU1lOQyB8IFJFUV9NRVRBIHwgUkVRX0RJU0NBUkQgfCBcCi0JIFJFUV9OT0lETEUgfCBSRVFfRkxVU0ggfCBSRVFfRlVBKQorCSBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSB8IFJFUV9TRUNVUkUpCiAjZGVmaW5lIFJFUV9DTE9ORV9NQVNLCQlSRVFfQ09NTU9OX01BU0sKIAogI2RlZmluZSBSRVFfUkFIRUFECQkoMSA8PCBfX1JFUV9SQUhFQUQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBhZTkwOTFhLi4xYTIzNzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTEyODIsOCArMTI4Miw4IEBACiAjZGVmaW5lIGJsa19nZXRfaW50ZWdyaXR5KGEpCQkJKDApCiAjZGVmaW5lIGJsa19pbnRlZ3JpdHlfY29tcGFyZShhLCBiKQkJKDApCiAjZGVmaW5lIGJsa19pbnRlZ3JpdHlfcmVnaXN0ZXIoYSwgYikJCSgwKQotI2RlZmluZSBibGtfaW50ZWdyaXR5X3VucmVnaXN0ZXIoYSkJCWRvIHsgfSB3aGlsZSAoMCk7Ci0jZGVmaW5lIGJsa19xdWV1ZV9tYXhfaW50ZWdyaXR5X3NlZ21lbnRzKGEsIGIpCWRvIHsgfSB3aGlsZSAoMCk7CisjZGVmaW5lIGJsa19pbnRlZ3JpdHlfdW5yZWdpc3RlcihhKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBibGtfcXVldWVfbWF4X2ludGVncml0eV9zZWdtZW50cyhhLCBiKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHF1ZXVlX21heF9pbnRlZ3JpdHlfc2VnbWVudHMoYSkJCSgwKQogI2RlZmluZSBibGtfaW50ZWdyaXR5X21lcmdlX3JxKGEsIGIsIGMpCQkoMCkKICNkZWZpbmUgYmxrX2ludGVncml0eV9tZXJnZV9iaW8oYSwgYiwgYykJKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAppbmRleCBiMjJmYjBkLi44YzdjMmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTE2OSw3ICsxNjksOCBAQAogZXh0ZXJuIGludCBkb19ibGtfdHJhY2Vfc2V0dXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUsCiAJCQkgICAgICBkZXZfdCBkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgKmJ1dHMpOwotZXh0ZXJuIHZvaWQgX190cmFjZV9ub3RlX21lc3NhZ2Uoc3RydWN0IGJsa190cmFjZSAqLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQordm9pZCBfX3RyYWNlX25vdGVfbWVzc2FnZShzdHJ1Y3QgYmxrX3RyYWNlICosIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogLyoqCiAgKiBibGtfYWRkX3RyYWNlX21zZyAtIEFkZCBhIChzaW1wbGUpIG1lc3NhZ2UgdG8gdGhlIGJsa3RyYWNlIHN0cmVhbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCmluZGV4IGQ0NjQ2YjQuLjE4YTFiYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKQEAgLTE4OCw2ICsxODgsNyBAQAogI2lmZGVmIENPTkZJR19DTE9DS1NPVVJDRV9XQVRDSERPRwogCS8qIFdhdGNoZG9nIHJlbGF0ZWQgZGF0YSwgdXNlZCBieSB0aGUgZnJhbWV3b3JrICovCiAJc3RydWN0IGxpc3RfaGVhZCB3ZF9saXN0OworCWN5Y2xlX3QgY3NfbGFzdDsKIAljeWNsZV90IHdkX2xhc3Q7CiAjZW5kaWYKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggZGRjYjdkYi4uODQ2YmIxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC00NjcsNiArNDY3LDggQEAKIAkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbmRtc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywKIAkJCQkgICB1bnNpZ25lZCBmbGFncyk7Cithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbW1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKm1tc2csCisJCQkJICAgIHVuc2lnbmVkIHZsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2bXNnKGludCBmZCwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2csCiAJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3YoaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaCBiL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKaW5kZXggN2M2MGQwOS4uZjY5NmJjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIENOX1ZBTF9EUkJECQkJMHgxCiAjZGVmaW5lIENOX0tWUF9JRFgJCQkweDkJLyogSHlwZXJWIEtWUCAqLwogCi0jZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTkKKyNkZWZpbmUgQ05fTkVUTElOS19VU0VSUwkJMTAJLyogSGlnaGVzdCBpbmRleCArIDEgKi8KIAogLyoKICAqIE1heGltdW0gY29ubmVjdG9yJ3MgbWVzc2FnZSBzaXplLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggYzY2MTExYS4uZTRmNjJkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC01MzAsNyArNTMwLDYgQEAKICAqIEBkbWFfbWVtOglJbnRlcm5hbCBmb3IgY29oZXJlbnQgbWVtIG92ZXJyaWRlLgogICogQGFyY2hkYXRhOglGb3IgYXJjaC1zcGVjaWZpYyBhZGRpdGlvbnMuCiAgKiBAb2Zfbm9kZToJQXNzb2NpYXRlZCBkZXZpY2UgdHJlZSBub2RlLgotICogQG9mX21hdGNoOglNYXRjaGluZyBvZl9kZXZpY2VfaWQgZnJvbSBkcml2ZXIuCiAgKiBAZGV2dDoJRm9yIGNyZWF0aW5nIHRoZSBzeXNmcyAiZGV2Ii4KICAqIEBkZXZyZXNfbG9jazogU3BpbmxvY2sgdG8gcHJvdGVjdCB0aGUgcmVzb3VyY2Ugb2YgdGhlIGRldmljZS4KICAqIEBkZXZyZXNfaGVhZDogVGhlIHJlc291cmNlcyBsaXN0IG9mIHRoZSBkZXZpY2UuCkBAIC02NTQsMTMgKzY1MywxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoIWRldi0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IHRydWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2VfZGlzYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoIWRldi0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oCmluZGV4IDBiMGQ5YzMuLjdhYWQxZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oCkBAIC0yLDggKzIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9ERVZJQ0UKLWV4dGVybiBpbnQgZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOworZXh0ZXJuIGludCBfX2RldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIGV4dGVybiBpbnQgZGV2Y2dyb3VwX2lub2RlX21rbm9kKGludCBtb2RlLCBkZXZfdCBkZXYpOworc3RhdGljIGlubGluZSBpbnQgZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJaWYgKGxpa2VseSghaW5vZGUtPmlfcmRldikpCisJCXJldHVybiAwOworCWlmICghU19JU0JMSyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF9fZGV2Y2dyb3VwX2lub2RlX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOworfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGRldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFfcmVtYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaAppbmRleCA1NjE5Zjg1Li5iYmQ4NjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaApAQCAtOSw4ICs5LDEyIEBACiAjZGVmaW5lIFZURF9QQUdFX01BU0sJCSgoKHU2NCktMSkgPDwgVlREX1BBR0VfU0hJRlQpCiAjZGVmaW5lIFZURF9QQUdFX0FMSUdOKGFkZHIpCSgoKGFkZHIpICsgVlREX1BBR0VfU0laRSAtIDEpICYgVlREX1BBR0VfTUFTSykKIAorI2RlZmluZSBWVERfU1RSSURFX1NISUZUICAgICAgICAoOSkKKyNkZWZpbmUgVlREX1NUUklERV9NQVNLICAgICAgICAgKCgodTY0KS0xKSA8PCBWVERfU1RSSURFX1NISUZUKQorCiAjZGVmaW5lIERNQV9QVEVfUkVBRCAoMSkKICNkZWZpbmUgRE1BX1BURV9XUklURSAoMikKKyNkZWZpbmUgRE1BX1BURV9MQVJHRV9QQUdFICgxIDw8IDcpCiAjZGVmaW5lIERNQV9QVEVfU05QICgxIDw8IDExKQogCiAjZGVmaW5lIENPTlRFWFRfVFRfTVVMVElfTEVWRUwJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcmJkX2xpbWl0cy5oIGIvaW5jbHVkZS9saW51eC9kcmJkX2xpbWl0cy5oCmluZGV4IDI0NmY1NzYuLjQ0N2MzNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHJiZF9saW1pdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RyYmRfbGltaXRzLmgKQEAgLTExNywxMCArMTE3LDEwIEBACiAvKiBkcmJkc2V0dXAgWFkgcmVzaXplIC1kIFoKICAqIHlvdSBhcmUgZnJlZSB0byByZWR1Y2UgdGhlIGRldmljZSBzaXplIHRvIG5vdGhpbmcsIGlmIHlvdSB3YW50IHRvLgogICogdGhlIHVwcGVyIGxpbWl0IHdpdGggNjRiaXQga2VybmVsLCBlbm91Z2ggcmFtIGFuZCBmbGV4aWJsZSBtZXRhIGRhdGEKLSAqIGlzIDE2IFRCLCBjdXJyZW50bHkuICovCisgKiBpcyAxIFBpQiwgY3VycmVudGx5LiAqLwogLyogRFJCRF9NQVhfU0VDVE9SUyAqLwogI2RlZmluZSBEUkJEX0RJU0tfU0laRV9TRUNUX01JTiAgMAotI2RlZmluZSBEUkJEX0RJU0tfU0laRV9TRUNUX01BWCAgKDE2ICogKDJMTFUgPDwgMzApKQorI2RlZmluZSBEUkJEX0RJU0tfU0laRV9TRUNUX01BWCAgKDEgKiAoMkxMVSA8PCA0MCkpCiAjZGVmaW5lIERSQkRfRElTS19TSVpFX1NFQ1RfREVGICAwIC8qID0gZGlzYWJsZWQgPSBubyB1c2VyIHNpemUuLi4gKi8KIAogI2RlZmluZSBEUkJEX09OX0lPX0VSUk9SX0RFRiBFUF9QQVNTX09OCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaCBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCmluZGV4IGM2YTg1MGEuLjQzOWIxNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlfX3UzMgljbWQ7CS8qIEVUSFRPT0xfe0csU31QQVVTRVBBUkFNICovCiAKIAkvKiBJZiB0aGUgbGluayBpcyBiZWluZyBhdXRvLW5lZ290aWF0ZWQgKHZpYSBldGh0b29sX2NtZC5hdXRvbmVnCi0JICogYmVpbmcgdHJ1ZSkgdGhlIHVzZXIgbWF5IHNldCAnYXV0b25ldCcgaGVyZSBub24temVybyB0byBoYXZlIHRoZQorCSAqIGJlaW5nIHRydWUpIHRoZSB1c2VyIG1heSBzZXQgJ2F1dG9uZWcnIGhlcmUgbm9uLXplcm8gdG8gaGF2ZSB0aGUKIAkgKiBwYXVzZSBwYXJhbWV0ZXJzIGJlIGF1dG8tbmVnb3RpYXRlZCB0b28uICBJbiBzdWNoIGEgY2FzZSwgdGhlCiAJICoge3J4LHR4fV9wYXVzZSB2YWx1ZXMgYmVsb3cgZGV0ZXJtaW5lIHdoYXQgY2FwYWJpbGl0aWVzIGFyZQogCSAqIGFkdmVydGlzZWQuCkBAIC04MTEsNyArODExLDcgQEAKICAqIEBnZXRfdHhfY3N1bTogRGVwcmVjYXRlZCBhcyByZWR1bmRhbnQuIFJlcG9ydCB3aGV0aGVyIHRyYW5zbWl0IGNoZWNrc3VtcwogICoJYXJlIHR1cm5lZCBvbiBvciBvZmYuCiAgKiBAc2V0X3R4X2NzdW06IERlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGdlbmVyaWMgbmV0ZGV2IGZlYXR1cmVzLiAgVHVybgotICoJdHJhbnNtaXQgY2hlY2tzdW1zIG9uIG9yIG9mZi4gIFJldHVybnMgYSBlZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KKyAqCXRyYW5zbWl0IGNoZWNrc3VtcyBvbiBvciBvZmYuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvLgogICogQGdldF9zZzogRGVwcmVjYXRlZCBhcyByZWR1bmRhbnQuICBSZXBvcnQgd2hldGhlciBzY2F0dGVyLWdhdGhlciBpcwogICoJZW5hYmxlZC4gIAogICogQHNldF9zZzogRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2VuZXJpYyBuZXRkZXYgZmVhdHVyZXMuICBUdXJuCkBAIC0xMDg3LDcgKzEwODcsNyBAQAogLyogVGhlIGZvbGxvd2luZyBhcmUgYWxsIGludm9sdmVkIGluIGZvcmNpbmcgYSBwYXJ0aWN1bGFyIGxpbmsKICAqIG1vZGUgZm9yIHRoZSBkZXZpY2UgZm9yIHNldHRpbmcgdGhpbmdzLiAgV2hlbiBnZXR0aW5nIHRoZQogICogZGV2aWNlcyBzZXR0aW5ncywgdGhlc2UgaW5kaWNhdGUgdGhlIGN1cnJlbnQgbW9kZSBhbmQgd2hldGhlcgotICogaXQgd2FzIGZvY2VkIHVwIGludG8gdGhpcyBtb2RlIG9yIGF1dG9uZWdvdGlhdGVkLgorICogaXQgd2FzIGZvcmNlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KICAqLwogCiAvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdCwgMi41R2IsIDEwR2JFLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGM1NWQ2YjcuLmI1Yjk3OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTIwOCw2ICsyMDgsNyBAQAogI2RlZmluZSBNU19LRVJOTU9VTlQJKDE8PDIyKSAvKiB0aGlzIGlzIGEga2Vybl9tb3VudCBjYWxsICovCiAjZGVmaW5lIE1TX0lfVkVSU0lPTgkoMTw8MjMpIC8qIFVwZGF0ZSBpbm9kZSBJX3ZlcnNpb24gZmllbGQgKi8KICNkZWZpbmUgTVNfU1RSSUNUQVRJTUUJKDE8PDI0KSAvKiBBbHdheXMgcGVyZm9ybSBhdGltZSB1cGRhdGVzICovCisjZGVmaW5lIE1TX05PU0VDCSgxPDwyOCkKICNkZWZpbmUgTVNfQk9STgkJKDE8PDI5KQogI2RlZmluZSBNU19BQ1RJVkUJKDE8PDMwKQogI2RlZmluZSBNU19OT1VTRVIJKDE8PDMxKQpAQCAtNjM4LDYgKzYzOSw3IEBACiAJc3RydWN0IHByaW9fdHJlZV9yb290CWlfbW1hcDsJCS8qIHRyZWUgb2YgcHJpdmF0ZSBhbmQgc2hhcmVkIG1hcHBpbmdzICovCiAJc3RydWN0IGxpc3RfaGVhZAlpX21tYXBfbm9ubGluZWFyOy8qbGlzdCBWTV9OT05MSU5FQVIgbWFwcGluZ3MgKi8KIAlzdHJ1Y3QgbXV0ZXgJCWlfbW1hcF9tdXRleDsJLyogcHJvdGVjdCB0cmVlLCBjb3VudCwgbGlzdCAqLworCS8qIFByb3RlY3RlZCBieSB0cmVlX2xvY2sgdG9nZXRoZXIgd2l0aCB0aGUgcmFkaXggdHJlZSAqLwogCXVuc2lnbmVkIGxvbmcJCW5ycGFnZXM7CS8qIG51bWJlciBvZiB0b3RhbCBwYWdlcyAqLwogCXBnb2ZmX3QJCQl3cml0ZWJhY2tfaW5kZXg7Lyogd3JpdGViYWNrIHN0YXJ0cyBoZXJlICovCiAJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYV9vcHM7CS8qIG1ldGhvZHMgKi8KQEAgLTc0Myw5ICs3NDUsMTMgQEAKIAogCXNwaW5sb2NrX3QJCWlfbG9jazsJLyogaV9ibG9ja3MsIGlfYnl0ZXMsIG1heWJlIGlfc2l6ZSAqLwogCXVuc2lnbmVkIGludAkJaV9mbGFnczsKKwl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOworI2lmZGVmIENPTkZJR19TRUNVUklUWQorCXZvaWQJCQkqaV9zZWN1cml0eTsKKyNlbmRpZgogCXN0cnVjdCBtdXRleAkJaV9tdXRleDsKIAotCXVuc2lnbmVkIGxvbmcJCWlfc3RhdGU7CisKIAl1bnNpZ25lZCBsb25nCQlkaXJ0aWVkX3doZW47CS8qIGppZmZpZXMgb2YgZmlyc3QgZGlydHlpbmcgKi8KIAogCXN0cnVjdCBobGlzdF9ub2RlCWlfaGFzaDsKQEAgLTc5Nyw5ICs4MDMsNiBAQAogCWF0b21pY190CQlpX3JlYWRjb3VudDsgLyogc3RydWN0IGZpbGVzIG9wZW4gUk8gKi8KICNlbmRpZgogCWF0b21pY190CQlpX3dyaXRlY291bnQ7Ci0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZCi0Jdm9pZAkJCSppX3NlY3VyaXR5OwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOwogCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7CkBAIC0yNTkxLDcgKzI1OTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5vZGVfaGFzX25vX3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaWYgKCFpc19zeGlkKGlub2RlLT5pX21vZGUpKQorCWlmICghaXNfc3hpZChpbm9kZS0+aV9tb2RlKSAmJiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT1NFQykpCiAJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9TRUM7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKaW5kZXggN2M0ZDcyZi4uOWVjMjBkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKQEAgLTIwNCw2ICsyMDQsOCBAQAogZXh0ZXJuIHZvaWQgX19mc2NhY2hlX3dhaXRfb25fcGFnZV93cml0ZShzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKiwgc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gYm9vbCBfX2ZzY2FjaGVfbWF5YmVfcmVsZWFzZV9wYWdlKHN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqLCBzdHJ1Y3QgcGFnZSAqLAogCQkJCQkgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgX19mc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKHN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqLAorCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qKgogICogZnNjYWNoZV9yZWdpc3Rlcl9uZXRmcyAtIFJlZ2lzdGVyIGEgZmlsZXN5c3RlbSBhcyBkZXNpcmluZyBjYWNoaW5nIHNlcnZpY2VzCkBAIC02NDMsNCArNjQ1LDIzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisvKioKKyAqIGZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMgLSBVbmNhY2hlIGFsbCBhbiBpbm9kZSdzIHBhZ2VzCisgKiBAY29va2llOiBUaGUgY29va2llIHJlcHJlc2VudGluZyB0aGUgaW5vZGUncyBjYWNoZSBvYmplY3QuCisgKiBAaW5vZGU6IFRoZSBpbm9kZSB0byB1bmNhY2hlIHBhZ2VzIGZyb20uCisgKgorICogVW5jYWNoZSBhbGwgdGhlIHBhZ2VzIGluIGFuIGlub2RlIHRoYXQgYXJlIG1hcmtlZCBQR19mc2NhY2hlLCBhc3N1bWluZyB0aGVtCisgKiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvb2tpZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4gIEl0IHdpbGwgd2FpdCBmb3IgcGFnZXMgdGhhdCBhcmUgYmVpbmcgd3JpdHRlbiBvdXQKKyAqIGFuZCB3aWxsIHdhaXQgd2hpbHN0IHRoZSBQR19mc2NhY2hlIG1hcmsgaXMgcmVtb3ZlZCBieSB0aGUgY2FjaGUuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSwKKwkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGZzY2FjaGVfY29va2llX3ZhbGlkKGNvb2tpZSkpCisJCV9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhjb29raWUsIGlub2RlKTsKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9GU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNsLWRpdS1mYi5oIGIvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKaW5kZXggNzgxZDQ2Ny4uZGFhOTk1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKQEAgLTI0LDEyICsyNCw2IEBACiAgKiBTZWUgbXBjODYxMGZiX3NldF9wYXIoKSwgbWFwX3ZpZGVvX21lbW9yeSgpLCBhbmQgdW5tYXBfdmlkZW9fbWVtb3J5KCkKICAqLwogI2RlZmluZSBNRU1fQUxMT0NfVEhSRVNIT0xEICgxMDI0Kjc2OCo0KzMyKQotLyogTWluaW11bSB2YWx1ZSB0aGF0IHRoZSBwaXhlbCBjbG9jayBjYW4gYmUgc2V0IHRvIGluIHBpY28gc2Vjb25kcwotICogVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHBsYXRmb3JtIGNsb2NrLzMgd2hlcmUgdGhlIG1pbmltdW0gcGxhdGZvcm0KLSAqIGNsb2NrIGlzIDUzM01Iei4gVGhpcyBnaXZlcyA1NjI5IHBpY28gc2Vjb25kcy4KLSAqLwotI2RlZmluZSBNSU5fUElYX0NMSyA1NjI5Ci0jZGVmaW5lIE1BWF9QSVhfQ0xLIDk2MDk2CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggYjc4OTU2Yi4uMzAwZDc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAJc2VjdG9yX3Qgc3RhcnRfc2VjdDsKIAlzZWN0b3JfdCBucl9zZWN0czsKIAlzZWN0b3JfdCBhbGlnbm1lbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkaXNjYXJkX2FsaWdubWVudDsKIAlzdHJ1Y3QgZGV2aWNlIF9fZGV2OwogCXN0cnVjdCBrb2JqZWN0ICpob2xkZXJfZGlyOwogCWludCBwb2xpY3ksIHBhcnRubzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKaW5kZXggMzJkNDdlNy4uMTdiNWEwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKQEAgLTMsNiArMywxNyBAQAogCiAvKiBzZWUgRG9jdW1lbnRhdGlvbi9ncGlvLnR4dCAqLwogCisvKiBtYWtlIHRoZXNlIGZsYWcgdmFsdWVzIGF2YWlsYWJsZSByZWdhcmRsZXNzIG9mIEdQSU8ga2NvbmZpZyBvcHRpb25zICovCisjZGVmaW5lIEdQSU9GX0RJUl9PVVQJKDAgPDwgMCkKKyNkZWZpbmUgR1BJT0ZfRElSX0lOCSgxIDw8IDApCisKKyNkZWZpbmUgR1BJT0ZfSU5JVF9MT1cJKDAgPDwgMSkKKyNkZWZpbmUgR1BJT0ZfSU5JVF9ISUdICSgxIDw8IDEpCisKKyNkZWZpbmUgR1BJT0ZfSU4JCShHUElPRl9ESVJfSU4pCisjZGVmaW5lIEdQSU9GX09VVF9JTklUX0xPVwkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfTE9XKQorI2RlZmluZSBHUElPRl9PVVRfSU5JVF9ISUdICShHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9ISUdIKQorCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfR1BJTwogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggNTE5MzJlNS4uZmQwZGMzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTEzNSw2ICsxMzUsNyBAQAogICogQGNwdV9iYXNlOgkJcGVyIGNwdSBjbG9jayBiYXNlCiAgKiBAaW5kZXg6CQljbG9jayB0eXBlIGluZGV4IGZvciBwZXJfY3B1IHN1cHBvcnQgd2hlbiBtb3ZpbmcgYQogICoJCQl0aW1lciB0byBhIGJhc2Ugb24gYW5vdGhlciBjcHUuCisgKiBAY2xvY2tpZDoJCWNsb2NrIGlkIGZvciBwZXJfY3B1IHN1cHBvcnQKICAqIEBhY3RpdmU6CQlyZWQgYmxhY2sgdHJlZSByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgdGltZXJzCiAgKiBAcmVzb2x1dGlvbjoJCXRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jaywgaW4gbmFub3NlY29uZHMKICAqIEBnZXRfdGltZToJCWZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIGNsb2NrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9hZHA4ODcwLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9hZHA4ODcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ZGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2FkcDg4NzAuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIERlZmluaXRpb25zIGFuZCBwbGF0Zm9ybSBkYXRhIGZvciBBbmFsb2cgRGV2aWNlcworICogQmFja2xpZ2h0IGRyaXZlcnMgQURQODg3MAorICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSTJDX0FEUDg4NzBfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19BRFA4ODcwX0gKKworI2RlZmluZSBJRF9BRFA4ODcwCQk4ODcwCisKKyNkZWZpbmUgQURQODg3MF9NQVhfQlJJR0hUTkVTUwkweDdGCisjZGVmaW5lIEZMQUdfT0ZGVF9TSElGVCA4CisKKy8qCisgKiBMRURzIHN1YmRldmljZSBwbGF0Zm9ybSBkYXRhCisgKi8KKworI2RlZmluZSBBRFA4ODcwX0xFRF9ESVNfQkxJTksJKDAgPDwgRkxBR19PRkZUX1NISUZUKQorI2RlZmluZSBBRFA4ODcwX0xFRF9PRkZUXzYwMG1zCSgxIDw8IEZMQUdfT0ZGVF9TSElGVCkKKyNkZWZpbmUgQURQODg3MF9MRURfT0ZGVF8xMjAwbXMJKDIgPDwgRkxBR19PRkZUX1NISUZUKQorI2RlZmluZSBBRFA4ODcwX0xFRF9PRkZUXzE4MDBtcwkoMyA8PCBGTEFHX09GRlRfU0hJRlQpCisKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzIwMG1zCTAKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzYwMG1zCTEKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzgwMG1zCTIKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzEyMDBtcwkzCisKKyNkZWZpbmUgQURQODg3MF9MRURfRDcJCSg3KQorI2RlZmluZSBBRFA4ODcwX0xFRF9ENgkJKDYpCisjZGVmaW5lIEFEUDg4NzBfTEVEX0Q1CQkoNSkKKyNkZWZpbmUgQURQODg3MF9MRURfRDQJCSg0KQorI2RlZmluZSBBRFA4ODcwX0xFRF9EMwkJKDMpCisjZGVmaW5lIEFEUDg4NzBfTEVEX0QyCQkoMikKKyNkZWZpbmUgQURQODg3MF9MRURfRDEJCSgxKQorCisvKgorICogQmFja2xpZ2h0IHN1YmRldmljZSBwbGF0Zm9ybSBkYXRhCisgKi8KKworI2RlZmluZSBBRFA4ODcwX0JMX0Q3CQkoMSA8PCA2KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q2CQkoMSA8PCA1KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q1CQkoMSA8PCA0KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q0CQkoMSA8PCAzKQorI2RlZmluZSBBRFA4ODcwX0JMX0QzCQkoMSA8PCAyKQorI2RlZmluZSBBRFA4ODcwX0JMX0QyCQkoMSA8PCAxKQorI2RlZmluZSBBRFA4ODcwX0JMX0QxCQkoMSA8PCAwKQorCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UX0RJUwkwCS8qIEZhZGUgVGltZXIgRGlzYWJsZWQgKi8KKyNkZWZpbmUgQURQODg3MF9GQURFX1RfMzAwbXMJMQkvKiAwLjMgU2VjICovCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzYwMG1zCTIKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfOTAwbXMJMworI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xMjAwbXMJNAorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xNTAwbXMJNQorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xODAwbXMJNgorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yMTAwbXMJNworI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yNDAwbXMJOAorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yNzAwbXMJOQorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8zMDAwbXMJMTAKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfMzUwMG1zCTExCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzQwMDBtcwkxMgorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF80NTAwbXMJMTMKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfNTAwMG1zCTE0CisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzU1MDBtcwkxNQkvKiA1LjUgU2VjICovCisKKyNkZWZpbmUgQURQODg3MF9GQURFX0xBV19MSU5FQVIJMAorI2RlZmluZSBBRFA4ODcwX0ZBREVfTEFXX1NRVUFSRQkxCisjZGVmaW5lIEFEUDg4NzBfRkFERV9MQVdfQ1VCSUMxCTIKKyNkZWZpbmUgQURQODg3MF9GQURFX0xBV19DVUJJQzIJMworCisjZGVmaW5lIEFEUDg4NzBfQkxfQU1CTF9GSUxUXzgwbXMJMAkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTYwbXMJMQorI2RlZmluZSBBRFA4ODcwX0JMX0FNQkxfRklMVF8zMjBtcwkyCisjZGVmaW5lIEFEUDg4NzBfQkxfQU1CTF9GSUxUXzY0MG1zCTMKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTI4MG1zCTQKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMjU2MG1zCTUKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfNTEyMG1zCTYKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTAyNDBtcwk3CS8qIDEwLjI0IHNlYyAqLworCisvKgorICogQmxhY2tsaWdodCBjdXJyZW50IDAuLjMwbUEKKyAqLworI2RlZmluZSBBRFA4ODcwX0JMX0NVUl9tQShJKQkJKChJICogMTI3KSAvIDMwKQorCisvKgorICogTDIgY29tcGFyYXRvciBjdXJyZW50IDAuLjExMDZ1QQorICovCisjZGVmaW5lIEFEUDg4NzBfTDJfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAxMTA2KQorCisvKgorICogTDMgY29tcGFyYXRvciBjdXJyZW50IDAuLjU1MXVBCisgKi8KKyNkZWZpbmUgQURQODg3MF9MM19DT01QX0NVUlJfdUEoSSkJKChJICogMjU1KSAvIDU1MSkKKworLyoKKyAqIEw0IGNvbXBhcmF0b3IgY3VycmVudCAwLi4yNzV1QQorICovCisjZGVmaW5lIEFEUDg4NzBfTDRfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAyNzUpCisKKy8qCisgKiBMNSBjb21wYXJhdG9yIGN1cnJlbnQgMC4uMTM4dUEKKyAqLworI2RlZmluZSBBRFA4ODcwX0w1X0NPTVBfQ1VSUl91QShJKQkoKEkgKiAyNTUpIC8gMTM4KQorCitzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSB7CisJdTggYmxfbGVkX2Fzc2lnbjsJLyogMSA9IEJhY2tsaWdodCAwID0gSW5kaXZpZHVhbCBMRUQgKi8KKwl1OCBwd21fYXNzaWduOwkJLyogMSA9IEVuYWJsZXMgUFdNIG1vZGUgKi8KKworCXU4IGJsX2ZhZGVfaW47CQkvKiBCYWNrbGlnaHQgRmFkZS1JbiBUaW1lciAqLworCXU4IGJsX2ZhZGVfb3V0OwkJLyogQmFja2xpZ2h0IEZhZGUtT3V0IFRpbWVyICovCisJdTggYmxfZmFkZV9sYXc7CQkvKiBmYWRlLW9uL2ZhZGUtb2ZmIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICovCisKKwl1OCBlbl9hbWJsX3NlbnM7CS8qIDEgPSBlbmFibGUgYW1iaWVudCBsaWdodCBzZW5zb3IgKi8KKwl1OCBhYm1sX2ZpbHQ7CQkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKworCXU4IGwxX2RheWxpZ2h0X21heDsJLyogdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsMV9kYXlsaWdodF9kaW07CS8qIHR5cCA9IDAsIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDJfYnJpZ2h0X21heDsJLyogdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsMl9icmlnaHRfZGltOwkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGwzX29mZmljZV9tYXg7CS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDNfb2ZmaWNlX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsNF9pbmRvb3JfbWF4OwkvKiB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGw0X2luZG9yX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsNV9kYXJrX21heDsJCS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDVfZGFya19kaW07CQkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCisJdTggbDJfdHJpcDsJCS8qIHVzZSBMMl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDExMDYgdUEgKi8KKwl1OCBsMl9oeXN0OwkJLyogdXNlIEwyX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTEwNiB1QSAqLworCXU4IGwzX3RyaXA7CQkvKiB1c2UgTDNfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSA1NTEgdUEgKi8KKwl1OCBsM19oeXN0OwkJLyogdXNlIEwzX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gNTUxIHVBICovCisJdTggbDRfdHJpcDsJCS8qIHVzZSBMNF9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDI3NSB1QSAqLworCXU4IGw0X2h5c3Q7CQkvKiB1c2UgTDRfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSAyNzUgdUEgKi8KKwl1OCBsNV90cmlwOwkJLyogdXNlIEw1X0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTM4IHVBICovCisJdTggbDVfaHlzdDsJCS8qIHVzZSBMNl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDEzOCB1QSAqLworCisJLyoqCisJICogSW5kZXBlbmRlbnQgQ3VycmVudCBTaW5rcyAvIExFRFMKKwkgKiBTaW5rcyBub3QgYXNzaWduZWQgdG8gdGhlIEJhY2tsaWdodCBjYW4gYmUgZXhwb3NlZCB0bworCSAqIHVzZXIgc3BhY2UgdXNpbmcgdGhlIExFRFMgQ0xBU1MgaW50ZXJmYWNlCisJICovCisKKwlpbnQgbnVtX2xlZHM7CisJc3RydWN0IGxlZF9pbmZvCSpsZWRzOworCXU4IGxlZF9mYWRlX2luOwkJLyogTEVEIEZhZGUtSW4gVGltZXIgKi8KKwl1OCBsZWRfZmFkZV9vdXQ7CS8qIExFRCBGYWRlLU91dCBUaW1lciAqLworCXU4IGxlZF9mYWRlX2xhdzsJLyogZmFkZS1vbi9mYWRlLW9mZiB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAqLworCXU4IGxlZF9vbl90aW1lOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfSTJDX0FEUDg4NzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKaW5kZXggYjJlZWU1OC4uYmY1NmI2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCkBAIC0xMDAzLDggKzEwMDMsMTIgQEAKICNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0VTUwkJKDE8PDApCiAjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTCQkoMTw8MSkKIAotLyogQSBtZXNoIFNUQSBzZXRzIHRoZSBFU1MgYW5kIElCU1MgY2FwYWJpbGl0eSBiaXRzIHRvIHplcm8gKi8KLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lTX01CU1MoY2FwKQlcCisvKgorICogQSBtZXNoIFNUQSBzZXRzIHRoZSBFU1MgYW5kIElCU1MgY2FwYWJpbGl0eSBiaXRzIHRvIHplcm8uCisgKiBob3dldmVyLCB0aGlzIGhvbGRzIHRydWUgZm9yIHAycCBwcm9iZSByZXNwb25zZXMgKGluIHRoZSBwMnBfZmluZAorICogcGhhc2UpIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lTX1NUQV9CU1MoY2FwKQlcCiAJKCEoKGNhcCkgJiAoV0xBTl9DQVBBQklMSVRZX0VTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkpCiAKICNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFCSgxPDwyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaCBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKaW5kZXggNzJiZmE1YS4uN2IzMTg2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCkBAIC02Miw2ICs2Miw3IEBACiAJX191MTYJCXRwX21hYzsKIAlfX3UxNgkJdHBfbmV0OwogCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKIH07CiAKIC8qIFJ4IHJpbmcgLSBoZWFkZXIgc3RhdHVzICovCkBAIC03MCw2ICs3MSw3IEBACiAjZGVmaW5lIFRQX1NUQVRVU19DT1BZCQkweDIKICNkZWZpbmUgVFBfU1RBVFVTX0xPU0lORwkweDQKICNkZWZpbmUgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWQkweDgKKyNkZWZpbmUgVFBfU1RBVFVTX1ZMQU5fVkFMSUQgICAweDEwIC8qIGF1eGRhdGEgaGFzIHZhbGlkIHRwX3ZsYW5fdGNpICovCiAKIC8qIFR4IHJpbmcgLSBoZWFkZXIgc3RhdHVzICovCiAjZGVmaW5lIFRQX1NUQVRVU19BVkFJTEFCTEUJMHgwCkBAIC0xMDAsNiArMTAyLDcgQEAKIAlfX3UzMgkJdHBfc2VjOwogCV9fdTMyCQl0cF9uc2VjOwogCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKIH07CiAKICNkZWZpbmUgVFBBQ0tFVDJfSERSTEVOCQkoVFBBQ0tFVF9BTElHTihzaXplb2Yoc3RydWN0IHRwYWNrZXQyX2hkcikpICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaCBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCmluZGV4IGRjMDE2ODEuLmFmZmEyNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCkBAIC0yMjUsNyArMjI1LDcgQEAKIH0KIAogLyoqCi0gKiBfX3ZsYW5fcHV0X3RhZyAtIHJlZ3VsYXIgVkxBTiB0YWcgaW5zZXJ0aW5nCisgKiB2bGFuX2luc2VydF90YWcgLSByZWd1bGFyIFZMQU4gdGFnIGluc2VydGluZwogICogQHNrYjogc2tidWZmIHRvIHRhZwogICogQHZsYW5fdGNpOiBWTEFOIFRDSSB0byBpbnNlcnQKICAqCkBAIC0yMzQsOCArMjM0LDEwIEBACiAgKgogICogRm9sbG93aW5nIHRoZSBza2JfdW5zaGFyZSgpIGV4YW1wbGUsIGluIGNhc2Ugb2YgZXJyb3IsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCiAgKiBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZnJlZWluZyB0aGUgb3JpZ2luYWwgc2tiLgorICoKKyAqIERvZXMgbm90IGNoYW5nZSBza2ItPnByb3RvY29sIHNvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZHVyaW5nIHJlY2VpdmUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fdmxhbl9wdXRfdGFnKHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RjaSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnZsYW5faW5zZXJ0X3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgdmxhbl90Y2kpCiB7CiAJc3RydWN0IHZsYW5fZXRoaGRyICp2ZXRoOwogCkBAIC0yNTUsOCArMjU3LDI1IEBACiAJLyogbm93LCB0aGUgVENJICovCiAJdmV0aC0+aF92bGFuX1RDSSA9IGh0b25zKHZsYW5fdGNpKTsKIAotCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDIxUSk7CisJcmV0dXJuIHNrYjsKK30KIAorLyoqCisgKiBfX3ZsYW5fcHV0X3RhZyAtIHJlZ3VsYXIgVkxBTiB0YWcgaW5zZXJ0aW5nCisgKiBAc2tiOiBza2J1ZmYgdG8gdGFnCisgKiBAdmxhbl90Y2k6IFZMQU4gVENJIHRvIGluc2VydAorICoKKyAqIEluc2VydHMgdGhlIFZMQU4gdGFnIGludG8gQHNrYiBhcyBwYXJ0IG9mIHRoZSBwYXlsb2FkCisgKiBSZXR1cm5zIGEgVkxBTiB0YWdnZWQgc2tiLiBJZiBhIG5ldyBza2IgaXMgY3JlYXRlZCwgQHNrYiBpcyBmcmVlZC4KKyAqCisgKiBGb2xsb3dpbmcgdGhlIHNrYl91bnNoYXJlKCkgZXhhbXBsZSwgaW4gY2FzZSBvZiBlcnJvciwgdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyAqIGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBmcmVlaW5nIHRoZSBvcmlnaW5hbCBza2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fdmxhbl9wdXRfdGFnKHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RjaSkKK3sKKwlza2IgPSB2bGFuX2luc2VydF90YWcoc2tiLCB2bGFuX3RjaSk7CisJaWYgKHNrYikKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAlyZXR1cm4gc2tiOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmggYi9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmgKaW5kZXggNjQ5ZGM3Zi4uNWQyNTNjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC9zaF9rZXlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvc2hfa2V5c2MuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19TSF9LRVlTQ19IX18KICNkZWZpbmUgX19TSF9LRVlTQ19IX18KIAotI2RlZmluZSBTSF9LRVlTQ19NQVhLRVlTIDQ5CisjZGVmaW5lIFNIX0tFWVNDX01BWEtFWVMgNjQKIAogc3RydWN0IHNoX2tleXNjX2luZm8gewogCWVudW0geyBTSF9LRVlTQ19NT0RFXzEsIFNIX0tFWVNDX01PREVfMiwgU0hfS0VZU0NfTU9ERV8zLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNmMxMjk4OS4uZjZlZmVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC00MTQsNiArNDE0LDcgQEAKIAlUQVNLTEVUX1NPRlRJUlEsCiAJU0NIRURfU09GVElSUSwKIAlIUlRJTUVSX1NPRlRJUlEsCisJUkNVX1NPRlRJUlEsICAgIC8qIFByZWZlcmFibGUgUkNVIHNob3VsZCBhbHdheXMgYmUgdGhlIGxhc3Qgc29mdGlycSAqLwogCiAJTlJfU09GVElSUVMKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA4YjQ1Mzg0Li5iYWEzOTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTY3Niw3ICs2NzYsOCBAQAogdm9pZCBpcnFfZ2NfbWFza19zZXRfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7CiB2b2lkIGlycV9nY19tYXNrX2Nscl9iaXQoc3RydWN0IGlycV9kYXRhICpkKTsKIHZvaWQgaXJxX2djX3VubWFza19lbmFibGVfcmVnKHN0cnVjdCBpcnFfZGF0YSAqZCk7Ci12b2lkIGlycV9nY19hY2soc3RydWN0IGlycV9kYXRhICpkKTsKK3ZvaWQgaXJxX2djX2Fja19zZXRfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7Cit2b2lkIGlycV9nY19hY2tfY2xyX2JpdChzdHJ1Y3QgaXJxX2RhdGEgKmQpOwogdm9pZCBpcnFfZ2NfbWFza19kaXNhYmxlX3JlZ19hbmRfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCk7CiB2b2lkIGlycV9nY19lb2koc3RydWN0IGlycV9kYXRhICpkKTsKIGludCBpcnFfZ2Nfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFyZXR1cm4uaCBiL2luY2x1ZGUvbGludXgvaXJxcmV0dXJuLmgKaW5kZXggODE5YWNhYS4uNzE0YmEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFyZXR1cm4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycXJldHVybi5oCkBAIC04LDkgKzgsOSBAQAogICogQElSUV9XQUtFX1RIUkVBRAloYW5kbGVyIHJlcXVlc3RzIHRvIHdha2UgdGhlIGhhbmRsZXIgdGhyZWFkCiAgKi8KIGVudW0gaXJxcmV0dXJuIHsKLQlJUlFfTk9ORSwKLQlJUlFfSEFORExFRCwKLQlJUlFfV0FLRV9USFJFQUQsCisJSVJRX05PTkUJCT0gKDAgPDwgMCksCisJSVJRX0hBTkRMRUQJCT0gKDEgPDwgMCksCisJSVJRX1dBS0VfVEhSRUFECQk9ICgxIDw8IDEpLAogfTsKIAogdHlwZWRlZiBlbnVtIGlycXJldHVybiBpcnFyZXR1cm5fdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggNGVjYjdiMS4uZDA4N2MyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTEwMjQsNyArMTAyNCw2IEBACiAKIC8qIEZpbGluZyBidWZmZXJzICovCiBleHRlcm4gdm9pZCBqYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqb3VybmFsX3QgKiwgc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKLWV4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIGV4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIGV4dGVybiB2b2lkIGpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICopOwogZXh0ZXJuIHZvaWQgX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqLCB0cmFuc2FjdGlvbl90ICosIGludCk7CkBAIC0xMTY1LDcgKzExNjQsNiBAQAogICovCiBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLXZvaWQgamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiB2b2lkIGpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGZiMGU3MzIuLjk1MzM1MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNjcxLDggKzY3MSw4IEBACiAKICNpZmRlZiBfX0NIRUNLRVJfXwogI2RlZmluZSBCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIobikKLSNkZWZpbmUgQlVJTERfQlVHX09OX1pFUk8oZSkKLSNkZWZpbmUgQlVJTERfQlVHX09OX05VTEwoZSkKKyNkZWZpbmUgQlVJTERfQlVHX09OX1pFUk8oZSkgKDApCisjZGVmaW5lIEJVSUxEX0JVR19PTl9OVUxMKGUpICgodm9pZCopMCkKICNkZWZpbmUgQlVJTERfQlVHX09OKGNvbmRpdGlvbikKICNlbHNlIC8qIF9fQ0hFQ0tFUl9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva21vZC5oIGIvaW5jbHVkZS9saW51eC9rbW9kLmgKaW5kZXggZDRhNWM4NC4uMGRhMzhjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbW9kLmgKKysrIGIvaW5jbHVkZS9saW51eC9rbW9kLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNlbmRpZgogCiAKLXN0cnVjdCBrZXk7CitzdHJ1Y3QgY3JlZDsKIHN0cnVjdCBmaWxlOwogCiBlbnVtIHVtaF93YWl0IHsKQEAgLTYyLDcgKzYyLDcgQEAKIAljaGFyICoqZW52cDsKIAllbnVtIHVtaF93YWl0IHdhaXQ7CiAJaW50IHJldHZhbDsKLQlpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKTsKKwlpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqbmV3KTsKIAl2b2lkICgqY2xlYW51cCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbyk7CiAJdm9pZCAqZGF0YTsKIH07CkBAIC03Myw3ICs3Myw3IEBACiAKIC8qIFNldCB2YXJpb3VzIHBpZWNlcyBvZiBzdGF0ZSBpbnRvIHRoZSBzdWJwcm9jZXNzX2luZm8gc3RydWN0dXJlICovCiB2b2lkIGNhbGxfdXNlcm1vZGVoZWxwZXJfc2V0Zm5zKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sCi0JCSAgICBpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKSwKKwkJICAgIGludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpLAogCQkgICAgdm9pZCAoKmNsZWFudXApKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pLAogCQkgICAgdm9pZCAqZGF0YSk7CiAKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjYWxsX3VzZXJtb2RlaGVscGVyX2ZucyhjaGFyICpwYXRoLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnAsCiAJCQllbnVtIHVtaF93YWl0IHdhaXQsCi0JCQlpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKSwKKwkJCWludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpLAogCQkJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKiksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva21zZ19kdW1wLmggYi9pbmNsdWRlL2xpbnV4L2ttc2dfZHVtcC5oCmluZGV4IDJhMGQ3ZDYuLmVlMGM5NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva21zZ19kdW1wLmgKKysrIGIvaW5jbHVkZS9saW51eC9rbXNnX2R1bXAuaApAQCAtMTIsNiArMTIsNyBAQAogI2lmbmRlZiBfTElOVVhfS01TR19EVU1QX0gKICNkZWZpbmUgX0xJTlVYX0tNU0dfRFVNUF9ICiAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogZW51bSBrbXNnX2R1bXBfcmVhc29uIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva29iamVjdF9ucy5oIGIvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmgKaW5kZXggODJjYjViZi4uZjY2YjA2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmgKKysrIGIvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmgKQEAgLTMyLDE1ICszMiwxNyBAQAogCiAvKgogICogQ2FsbGJhY2tzIHNvIHN5c2ZzIGNhbiBkZXRlcm1pbmUgbmFtZXNwYWNlcwotICogICBAY3VycmVudF9uczogcmV0dXJuIGNhbGxpbmcgdGFzaydzIG5hbWVzcGFjZQorICogICBAZ3JhYl9jdXJyZW50X25zOiByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIGNhbGxpbmcgdGFzaydzIG5hbWVzcGFjZQogICogICBAbmV0bGlua19uczogcmV0dXJuIG5hbWVzcGFjZSB0byB3aGljaCBhIHNvY2sgYmVsb25ncyAocmlnaHQ/KQogICogICBAaW5pdGlhbF9uczogcmV0dXJuIHRoZSBpbml0aWFsIG5hbWVzcGFjZSAoaS5lLiBpbml0X25ldF9ucykKKyAqICAgQGRyb3BfbnM6IGRyb3BzIGEgcmVmZXJlbmNlIHRvIG5hbWVzcGFjZQogICovCiBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgewogCWVudW0ga29ial9uc190eXBlIHR5cGU7Ci0JY29uc3Qgdm9pZCAqKCpjdXJyZW50X25zKSh2b2lkKTsKKwl2b2lkICooKmdyYWJfY3VycmVudF9ucykodm9pZCk7CiAJY29uc3Qgdm9pZCAqKCpuZXRsaW5rX25zKShzdHJ1Y3Qgc29jayAqc2spOwogCWNvbnN0IHZvaWQgKigqaW5pdGlhbF9ucykodm9pZCk7CisJdm9pZCAoKmRyb3BfbnMpKHZvaWQgKik7CiB9OwogCiBpbnQga29ial9uc190eXBlX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqb3BzKTsKQEAgLTQ4LDkgKzUwLDkgQEAKIGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqa29ial9jaGlsZF9uc19vcHMoc3RydWN0IGtvYmplY3QgKnBhcmVudCk7CiBjb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKmtvYmpfbnNfb3BzKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKIAotY29uc3Qgdm9pZCAqa29ial9uc19jdXJyZW50KGVudW0ga29ial9uc190eXBlIHR5cGUpOwordm9pZCAqa29ial9uc19ncmFiX2N1cnJlbnQoZW51bSBrb2JqX25zX3R5cGUgdHlwZSk7CiBjb25zdCB2b2lkICprb2JqX25zX25ldGxpbmsoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgc3RydWN0IHNvY2sgKnNrKTsKIGNvbnN0IHZvaWQgKmtvYmpfbnNfaW5pdGlhbChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKTsKLXZvaWQga29ial9uc19leGl0KGVudW0ga29ial9uc190eXBlIHR5cGUsIGNvbnN0IHZvaWQgKm5zKTsKK3ZvaWQga29ial9uc19kcm9wKGVudW0ga29ial9uc190eXBlIHR5cGUsIHZvaWQgKm5zKTsKIAogI2VuZGlmIC8qIF9MSU5VWF9LT0JKRUNUX05TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKaW5kZXggOTcyNGEzOC4uNTA5NDBkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKQEAgLTg0LDYgKzg0LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICp0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogCiBzdGF0aWMgaW5saW5lCiBpbnQgbW1fbWF0Y2hfY2dyb3VwKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqY2dyb3VwKQpAQCAtMjQ2LDYgKzI0NywxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1fY2dyb3VwICp0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgbW1fbWF0Y2hfY2dyb3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQogewogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKaW5kZXggZTFlM2IyYi4uOTM1Njk5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCisjZGVmaW5lIE1JTl9NRU1PUllfQkxPQ0tfU0laRSAgICAgKDEgPDwgU0VDVElPTl9TSVpFX0JJVFMpCisKIHN0cnVjdCBtZW1vcnlfYmxvY2sgewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfc2VjdGlvbl9ucjsKIAl1bnNpZ25lZCBsb25nIGVuZF9zZWN0aW9uX25yOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvZHMxd20uaCBiL2luY2x1ZGUvbGludXgvbWZkL2RzMXdtLmgKaW5kZXggYmU0NjlhMy4uMzhhMzcyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZHMxd20uaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kczF3bS5oCkBAIC0zLDQgKzMsMTEgQEAKIHN0cnVjdCBkczF3bV9kcml2ZXJfZGF0YSB7CiAJaW50IGFjdGl2ZV9oaWdoOwogCWludCBjbG9ja19yYXRlOworCS8qIGluIG1pbGxpc2Vjb25kcywgdGhlIGFtb3VudCBvZiB0aW1lIHRvICovCisJLyogc2xlZXAgZm9sbG93aW5nIGEgcmVzZXQgcHVsc2UuIFplcm8gICAgKi8KKwkvKiBzaG91bGQgd29yayBpZiB5b3VyIGJ1cyBkZXZpY2VzIHJlY292ZXIqLworCS8qIHRpbWUgcmVzcGVjdHMgdGhlIDEtd2lyZSBzcGVjIHNpbmNlIHRoZSovCisJLyogZHMxd20gaW1wbGVtZW50cyB0aGUgcHJlY2lzZSB0aW1pbmdzIG9mKi8KKwkvKiBhIHJlc2V0IHB1bHNlL3ByZXNlbmNlIGRldGVjdCBzZXF1ZW5jZS4qLworCXVuc2lnbmVkIGludCByZXNldF9yZWNvdmVyX2RlbGF5OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCBjNjkyN2E0Li42YWQ0MzU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC02NCw2ICs2NCwxOSBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZwllbmhhbmNlZF9hcmVhX29mZnNldDsJLyogVW5pdHM6IEJ5dGUgKi8KIAl1bnNpZ25lZCBpbnQJCWVuaGFuY2VkX2FyZWFfc2l6ZTsJLyogVW5pdHM6IEtCICovCiAJdW5zaWduZWQgaW50CQlib290X3NpemU7CQkvKiBpbiBieXRlcyAqLworCXU4CQkJcmF3X3BhcnRpdGlvbl9zdXBwb3J0OwkvKiAxNjAgKi8KKwl1OAkJCXJhd19lcmFzZWRfbWVtX2NvdW50OwkvKiAxODEgKi8KKwl1OAkJCXJhd19leHRfY3NkX3N0cnVjdHVyZTsJLyogMTk0ICovCisJdTgJCQlyYXdfY2FyZF90eXBlOwkJLyogMTk2ICovCisJdTgJCQlyYXdfc19hX3RpbWVvdXQ7CQkvKiAyMTcgKi8KKwl1OAkJCXJhd19oY19lcmFzZV9nYXBfc2l6ZTsJLyogMjIxICovCisJdTgJCQlyYXdfZXJhc2VfdGltZW91dF9tdWx0OwkvKiAyMjMgKi8KKwl1OAkJCXJhd19oY19lcmFzZV9ncnBfc2l6ZTsJLyogMjI0ICovCisJdTgJCQlyYXdfc2VjX3RyaW1fbXVsdDsJLyogMjI5ICovCisJdTgJCQlyYXdfc2VjX2VyYXNlX211bHQ7CS8qIDIzMCAqLworCXU4CQkJcmF3X3NlY19mZWF0dXJlX3N1cHBvcnQ7LyogMjMxICovCisJdTgJCQlyYXdfdHJpbV9tdWx0OwkJLyogMjMyICovCisJdTgJCQlyYXdfc2VjdG9yc1s0XTsJCS8qIDIxMiAtIDQgYnl0ZXMgKi8KIH07CiAKIHN0cnVjdCBzZF9zY3IgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggYzkyOGRhYy4uOWY3YzNlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC02NDcsNiArNjQ3LDEzIEBACiAjZW5kaWYKICNkZWZpbmUgbmlkX3BhZ2VfbnIobmlkLCBwYWdlbnIpIAlwZ2RhdF9wYWdlX25yKE5PREVfREFUQShuaWQpLChwYWdlbnIpKQogCisjZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKKworI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKSAoe1wKKwlwZ19kYXRhX3QgKl9fcGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcCisJX19wZ2RhdC0+bm9kZV9zdGFydF9wZm4gKyBfX3BnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXM7XAorfSkKKwogI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggem9uZWxpc3RzX211dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCmluZGV4IGQ0MGJmYTEuLmU1ZjIxZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9waHlzbWFwLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCiBzdHJ1Y3QgbWFwX2luZm87CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogCiBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHsKIAl1bnNpZ25lZCBpbnQJCXdpZHRoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggY2EzMzNlNy4uOWUxOTQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0xMDk3LDEyICsxMDk3LDYgQEAKICNkZWZpbmUgTkVUSUZfRl9BTExfRkNPRQkoTkVUSUZfRl9GQ09FX0NSQyB8IE5FVElGX0ZfRkNPRV9NVFUgfCBcCiAJCQkJIE5FVElGX0ZfRlNPKQogCi0jZGVmaW5lIE5FVElGX0ZfQUxMX1RYX09GRkxPQURTCShORVRJRl9GX0FMTF9DU1VNIHwgTkVUSUZfRl9TRyB8IFwKLQkJCQkgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfQUxMX1RTTyB8IFwKLQkJCQkgTkVUSUZfRl9ISUdIRE1BIHwgXAotCQkJCSBORVRJRl9GX1NDVFBfQ1NVTSB8IFwKLQkJCQkgTkVUSUZfRl9BTExfRkNPRSkKLQogCS8qCiAJICogSWYgb25lIGRldmljZSBzdXBwb3J0cyBvbmUgb2YgdGhlc2UgZmVhdHVyZXMsIHRoZW4gZW5hYmxlIHRoZW0KIAkgKiBmb3IgYWxsIGluIG5ldGRldl9pbmNyZW1lbnRfZmVhdHVyZXMuCkBAIC0yNTU1LDcgKzI1NDksNyBAQAogCiBleHRlcm4gc3RydWN0IGtvYmpfbnNfdHlwZV9vcGVyYXRpb25zIG5ldF9uc190eXBlX29wZXJhdGlvbnM7CiAKLWV4dGVybiBjaGFyICpuZXRkZXZfZHJpdmVybmFtZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pOworZXh0ZXJuIGNvbnN0IGNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBleHRlcm4gdm9pZCBsaW5rd2F0Y2hfcnVuX3F1ZXVlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKaW5kZXggNTBjZGMyNS4uMGQzZGQ2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApAQCAtMTgsNiArMTgsOSBAQAogCS8qID49IHRoaXMgaW5kaWNhdGVzIHJlcGx5IGRpcmVjdGlvbiAqLwogCUlQX0NUX0lTX1JFUExZLAogCisJSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkgPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZLAorCUlQX0NUX1JFTEFURURfUkVQTFkgPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFksCisJSVBfQ1RfTkVXX1JFUExZID0gSVBfQ1RfTkVXICsgSVBfQ1RfSVNfUkVQTFksCQogCS8qIE51bWJlciBvZiBkaXN0aW5jdCBJUF9DVCB0eXBlcyAobm8gTkVXIGluIHJlcGx5IGRpcm4pLiAqLwogCUlQX0NUX05VTUJFUiA9IElQX0NUX0lTX1JFUExZICogMiAtIDEKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmggYi9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgKaW5kZXggM2EzNGU4MC4uMjUzMTFiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaApAQCAtOTIsNiArOTIsOSBAQAogCQkJCSAgIHN0cnVjdCBuZnNfcGFnZSAqKTsKIGV4dGVybgl2b2lkIG5mc19wYWdlaW9fY29tcGxldGUoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqZGVzYyk7CiBleHRlcm4Jdm9pZCBuZnNfcGFnZWlvX2NvbmRfY29tcGxldGUoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqLCBwZ29mZl90KTsKK2V4dGVybiBib29sIG5mc19nZW5lcmljX3BnX3Rlc3Qoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqZGVzYywKKwkJCQlzdHJ1Y3QgbmZzX3BhZ2UgKnByZXYsCisJCQkJc3RydWN0IG5mc19wYWdlICpyZXEpOwogZXh0ZXJuICBpbnQgbmZzX3dhaXRfb25fcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKik7CiBleHRlcm4Jdm9pZCBuZnNfdW5sb2NrX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpOwogZXh0ZXJuCWludCBuZnNfc2V0X3BhZ2VfdGFnX2xvY2tlZChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaCBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCmluZGV4IDVlODQ0NGEuLjAwODQ4ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCkBAIC0xNTgsNyArMTU4LDYgQEAKIAogLyogbmZzNDEgc2Vzc2lvbnMgY2hhbm5lbCBhdHRyaWJ1dGVzICovCiBzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzIHsKLQl1MzIJCQloZWFkZXJwYWRzejsKIAl1MzIJCQltYXhfcnFzdF9zejsKIAl1MzIJCQltYXhfcmVzcF9zejsKIAl1MzIJCQltYXhfcmVzcF9zel9jYWNoZWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGEzMTEwMDguLmY4OTEwZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0xNTM3LDYgKzE1MzcsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NzYJMHgwNDc2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3OAkweDA0NzgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MjIJMHgwODIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDRTgyMwkweGU4MjMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MzIJMHgwODMyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODQzCTB4MDg0MwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaAppbmRleCA4Yjk3MzA4Li45Y2EwMDhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKQEAgLTI1OSw2ICsyNTksOSBAQAogICogU3BlY2lhbCBoYW5kbGluZyBmb3IgY21weGNoZ19kb3VibGUuICBjbXB4Y2hnX2RvdWJsZSBpcyBwYXNzZWQgdHdvCiAgKiBwZXJjcHUgdmFyaWFibGVzLiAgVGhlIGZpcnN0IGhhcyB0byBiZSBhbGlnbmVkIHRvIGEgZG91YmxlIHdvcmQKICAqIGJvdW5kYXJ5IGFuZCB0aGUgc2Vjb25kIGhhcyB0byBmb2xsb3cgZGlyZWN0bHkgdGhlcmVhZnRlci4KKyAqIFdlIGVuZm9yY2UgdGhpcyBvbiBhbGwgYXJjaGl0ZWN0dXJlcyBldmVuIGlmIHRoZXkgZG9uJ3Qgc3VwcG9ydAorICogYSBkb3VibGUgY21weGNoZyBpbnN0cnVjdGlvbiwgc2luY2UgaXQncyBhIGNoZWFwIHJlcXVpcmVtZW50LCBhbmQgaXQKKyAqIGF2b2lkcyBicmVha2luZyB0aGUgcmVxdWlyZW1lbnQgZm9yIGFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24uCiAgKi8KICNkZWZpbmUgX19wY3B1X2RvdWJsZV9jYWxsX3JldHVybl9ib29sKHN0ZW0sIHBjcDEsIHBjcDIsIC4uLikJCVwKICh7CQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCAzNDEyNjg0Li5lMDc4NmUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtMTM3LDE0ICsxMzcsMTQgQEAKICAqCiAgKiBzdHJ1Y3QgcmVhZF9mb3JtYXQgewogICoJeyB1NjQJCXZhbHVlOwotICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX0VOQUJMRUQKLSAqCSAgeyB1NjQJCXRpbWVfcnVubmluZzsgfSAmJiBQRVJGX0ZPUk1BVF9SVU5OSU5HCisgKgkgIHsgdTY0CQl0aW1lX2VuYWJsZWQ7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECisgKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCiAgKgkgIHsgdTY0CQlpZDsgICAgICAgICAgIH0gJiYgUEVSRl9GT1JNQVRfSUQKICAqCX0gJiYgIVBFUkZfRk9STUFUX0dST1VQCiAgKgogICoJeyB1NjQJCW5yOwotICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX0VOQUJMRUQKLSAqCSAgeyB1NjQJCXRpbWVfcnVubmluZzsgfSAmJiBQRVJGX0ZPUk1BVF9SVU5OSU5HCisgKgkgIHsgdTY0CQl0aW1lX2VuYWJsZWQ7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECisgKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCiAgKgkgIHsgdTY0CQl2YWx1ZTsKICAqCSAgICB7IHU2NAlpZDsgICAgICAgICAgIH0gJiYgUEVSRl9GT1JNQVRfSUQKICAqCSAgfQkJY250cltucl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggMzE2MDY0OC4uNDExZTRmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDI1LDcgKzQyNSw4IEBACiAJcG1fbWVzc2FnZV90CQlwb3dlcl9zdGF0ZTsKIAl1bnNpZ25lZCBpbnQJCWNhbl93YWtldXA6MTsKIAl1bnNpZ25lZCBpbnQJCWFzeW5jX3N1c3BlbmQ6MTsKLQl1bnNpZ25lZCBpbnQJCWluX3N1c3BlbmQ6MTsJLyogT3duZWQgYnkgdGhlIFBNIGNvcmUgKi8KKwlib29sCQkJaXNfcHJlcGFyZWQ6MTsJLyogT3duZWQgYnkgdGhlIFBNIGNvcmUgKi8KKwlib29sCQkJaXNfc3VzcGVuZGVkOjE7CS8qIERpdHRvICovCiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDJhODYyMWMuLjE0YTZjN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTgwOCw3ICs4MDgsNyBAQAogICogd2hlbiBCSVRTX1BFUl9MT05HIDw9IDMyIGFyZSBwcmV0dHkgaGlnaCBhbmQgdGhlIHJldHVybnMgZG8gbm90IGp1c3RpZnkgdGhlCiAgKiBpbmNyZWFzZWQgY29zdHMuCiAgKi8KLSNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyNpZiAwIC8qIEJJVFNfUEVSX0xPTkcgPiAzMiAtLSBjdXJyZW50bHkgYnJva2VuOiBpdCBpbmNyZWFzZXMgcG93ZXIgdXNhZ2UgdW5kZXIgbGlnaHQgbG9hZCAgKi8KICMgZGVmaW5lIFNDSEVEX0xPQURfUkVTT0xVVElPTgkxMAogIyBkZWZpbmUgc2NhbGVfbG9hZCh3KQkJKCh3KSA8PCBTQ0hFRF9MT0FEX1JFU09MVVRJT04pCiAjIGRlZmluZSBzY2FsZV9sb2FkX2Rvd24odykJKCh3KSA+PiBTQ0hFRF9MT0FEX1JFU09MVVRJT04pCkBAIC04NDQsNiArODQ0LDcgQEAKICNkZWZpbmUgU0RfU0VSSUFMSVpFCQkweDA0MDAJLyogT25seSBhIHNpbmdsZSBsb2FkIGJhbGFuY2luZyBpbnN0YW5jZSAqLwogI2RlZmluZSBTRF9BU1lNX1BBQ0tJTkcJCTB4MDgwMCAgLyogUGxhY2UgYnVzeSBncm91cHMgZWFybGllciBpbiB0aGUgZG9tYWluICovCiAjZGVmaW5lIFNEX1BSRUZFUl9TSUJMSU5HCTB4MTAwMAkvKiBQcmVmZXIgdG8gcGxhY2UgdGFza3MgaW4gYSBzaWJsaW5nIGRvbWFpbiAqLworI2RlZmluZSBTRF9PVkVSTEFQCQkweDIwMDAJLyogc2NoZWRfZG9tYWlucyBvZiB0aGlzIGxldmVsIG92ZXJsYXAgKi8KIAogZW51bSBwb3dlcnNhdmluZ3NfYmFsYW5jZV9sZXZlbCB7CiAJUE9XRVJTQVZJTkdTX0JBTEFOQ0VfTk9ORSA9IDAsICAvKiBObyBwb3dlciBzYXZpbmcgbG9hZCBiYWxhbmNlICovCkBAIC04OTMsMTYgKzg5NCwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc2NoZWRfZ3JvdXAgewotCXN0cnVjdCBzY2hlZF9ncm91cCAqbmV4dDsJLyogTXVzdCBiZSBhIGNpcmN1bGFyIGxpc3QgKi8KK3N0cnVjdCBzY2hlZF9ncm91cF9wb3dlciB7CiAJYXRvbWljX3QgcmVmOwotCiAJLyoKIAkgKiBDUFUgcG93ZXIgb2YgdGhpcyBncm91cCwgU0NIRURfTE9BRF9TQ0FMRSBiZWluZyBtYXggcG93ZXIgZm9yIGEKIAkgKiBzaW5nbGUgQ1BVLgogCSAqLwotCXVuc2lnbmVkIGludCBjcHVfcG93ZXIsIGNwdV9wb3dlcl9vcmlnOworCXVuc2lnbmVkIGludCBwb3dlciwgcG93ZXJfb3JpZzsKK307CisKK3N0cnVjdCBzY2hlZF9ncm91cCB7CisJc3RydWN0IHNjaGVkX2dyb3VwICpuZXh0OwkvKiBNdXN0IGJlIGEgY2lyY3VsYXIgbGlzdCAqLworCWF0b21pY190IHJlZjsKKwogCXVuc2lnbmVkIGludCBncm91cF93ZWlnaHQ7CisJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICpzZ3A7CiAKIAkvKgogCSAqIFRoZSBDUFVzIHRoaXMgZ3JvdXAgY292ZXJzLgpAQCAtMTA2Myw2ICsxMDY5LDcgQEAKICAqLwogI2RlZmluZSBXRl9TWU5DCQkweDAxCQkvKiB3YWtlciBnb2VzIHRvIHNsZWVwIGFmdGVyIHdha3VwICovCiAjZGVmaW5lIFdGX0ZPUksJCTB4MDIJCS8qIGNoaWxkIHdha2V1cCBhZnRlciBmb3JrICovCisjZGVmaW5lIFdGX01JR1JBVEVECTB4MDQJCS8qIGludGVybmFsIHVzZSwgdGFzayBnb3QgbWlncmF0ZWQgKi8KIAogI2RlZmluZSBFTlFVRVVFX1dBS0VVUAkJMQogI2RlZmluZSBFTlFVRVVFX0hFQUQJCTIKQEAgLTEyNTMsNiArMTI2MCw5IEBACiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfUkNVCiAJaW50IHJjdV9yZWFkX2xvY2tfbmVzdGluZzsKIAljaGFyIHJjdV9yZWFkX3VubG9ja19zcGVjaWFsOworI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgZGVmaW5lZChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkKKwlpbnQgcmN1X2Jvb3N0ZWQ7CisjZW5kaWYgLyogI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgZGVmaW5lZChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJjdV9ub2RlX2VudHJ5OwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUFJFRU1QVF9SQ1UgKi8KICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZGxhLmggYi9pbmNsdWRlL2xpbnV4L3NkbGEuaAppbmRleCA1NjRhY2QzLi45OTk1YzdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NkbGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NkbGEuaApAQCAtMTEyLDExICsxMTIsNyBAQAogICAgc2hvcnQgVGJfbWF4OwogfTsKIAotI2lmbmRlZiBfX0tFUk5FTF9fCi0KLXZvaWQgc2RsYSh2b2lkICpjZmdfaW5mbywgY2hhciAqZGV2LCBzdHJ1Y3QgZnJhZF9jb25mICpjb25mLCBpbnQgcXVpZXQpOwotCi0jZWxzZQorI2lmZGVmIF9fS0VSTkVMX18KIAogLyogaW1wb3J0YW50IFo4MCB3aW5kb3cgYWRkcmVzc2VzICovCiAjZGVmaW5lIFNETEFfQ09OVFJPTF9XTkQJCTB4RTAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAppbmRleCBlOTgxMTg5Li5jNmRiOWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaApAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgc2VxdWVuY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKaW5kZXggMmI3ZmVjOC4uYWEwOGZhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KIAogLyogaW5vZGUgaW4ta2VybmVsIGRhdGEgKi8KQEAgLTQ1LDcgKzQ2LDI3IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHNobWVtX2lub2RlX2luZm8sIHZmc19pbm9kZSk7CiB9CiAKKy8qCisgKiBGdW5jdGlvbnMgaW4gbW0vc2htZW0uYyBjYWxsZWQgZGlyZWN0bHkgZnJvbSBlbHNld2hlcmU6CisgKi8KIGV4dGVybiBpbnQgaW5pdF90bXBmcyh2b2lkKTsKIGV4dGVybiBpbnQgc2htZW1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KTsKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqc2htZW1fZmlsZV9zZXR1cChjb25zdCBjaGFyICpuYW1lLAorCQkJCQlsb2ZmX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IHNobWVtX3plcm9fc2V0dXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworZXh0ZXJuIGludCBzaG1lbV9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbG9jaywgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyKTsKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2VfZ2ZwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCQlwZ29mZl90IGluZGV4LCBnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gdm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpOworZXh0ZXJuIGludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgcGdvZmYsCisJCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHN3cF9lbnRyeV90ICplbnQpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9yZWFkX21hcHBpbmdfcGFnZSgKKwkJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBpbmRleCkKK3sKKwlyZXR1cm4gc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2VfZ2ZwKG1hcHBpbmcsIGluZGV4LAorCQkJCQltYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKK30KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCBlOGI3OGNlLi5jMGE0ZjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTEyNTYsNiArMTI1NiwxMSBAQAogCXNrYi0+dGFpbCArPSBsZW47CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfbWFjX2xlbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bWFjX2xlbiA9IHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXI7Cit9CisKICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX3RyYW5zcG9ydF9oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggYWQ0ZGQxYy4uNTczYzgwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTEzNCw2ICsxMzQsMjYgQEAKICNkZWZpbmUgS01BTExPQ19NQVhfT1JERVIJKEtNQUxMT0NfU0hJRlRfSElHSCAtIFBBR0VfU0hJRlQpCiAKIC8qCisgKiBTb21lIGFyY2hzIHdhbnQgdG8gcGVyZm9ybSBETUEgaW50byBrbWFsbG9jIGNhY2hlcyBhbmQgbmVlZCBhIGd1YXJhbnRlZWQKKyAqIGFsaWdubWVudCBsYXJnZXIgdGhhbiB0aGUgYWxpZ25tZW50IG9mIGEgNjQtYml0IGludGVnZXIuCisgKiBTZXR0aW5nIEFSQ0hfS01BTExPQ19NSU5BTElHTiBpbiBhcmNoIGhlYWRlcnMgYWxsb3dzIHRoYXQuCisgKi8KKyNpZmRlZiBBUkNIX0RNQV9NSU5BTElHTgorI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gQVJDSF9ETUFfTUlOQUxJR04KKyNlbHNlCisjZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCisjZW5kaWYKKworLyoKKyAqIFNldHRpbmcgQVJDSF9TTEFCX01JTkFMSUdOIGluIGFyY2ggaGVhZGVycyBhbGxvd3MgYSBkaWZmZXJlbnQgYWxpZ25tZW50LgorICogSW50ZW5kZWQgZm9yIGFyY2hlcyB0aGF0IGdldCBtaXNhbGlnbm1lbnQgZmF1bHRzIGV2ZW4gZm9yIDY0IGJpdCBpbnRlZ2VyCisgKiBhbGlnbmVkIGJ1ZmZlcnMuCisgKi8KKyNpZm5kZWYgQVJDSF9TTEFCX01JTkFMSUdOCisjZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCisjZW5kaWYKKworLyoKICAqIENvbW1vbiBrbWFsbG9jIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBhbGwgYWxsb2NhdG9ycwogICovCiB2b2lkICogX19tdXN0X2NoZWNrIF9fa3JlYWxsb2MoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGdmcF90KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAppbmRleCA4MzIwM2FlLi5kMDBlMGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCkBAIC0xOCw1MyArMTgsMjUgQEAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgogCiAvKgotICogRW5mb3JjZSBhIG1pbmltdW0gYWxpZ25tZW50IGZvciB0aGUga21hbGxvYyBjYWNoZXMuCi0gKiBVc3VhbGx5LCB0aGUga21hbGxvYyBjYWNoZXMgYXJlIGNhY2hlX2xpbmVfc2l6ZSgpIGFsaWduZWQsIGV4Y2VwdCB3aGVuCi0gKiBERUJVRyBhbmQgRk9SQ0VEX0RFQlVHIGFyZSBlbmFibGVkLCB0aGVuIHRoZXkgYXJlIEJZVEVTX1BFUl9XT1JEIGFsaWduZWQuCi0gKiBTb21lIGFyY2hzIHdhbnQgdG8gcGVyZm9ybSBETUEgaW50byBrbWFsbG9jIGNhY2hlcyBhbmQgbmVlZCBhIGd1YXJhbnRlZWQKLSAqIGFsaWdubWVudCBsYXJnZXIgdGhhbiB0aGUgYWxpZ25tZW50IG9mIGEgNjQtYml0IGludGVnZXIuCi0gKiBBUkNIX0tNQUxMT0NfTUlOQUxJR04gYWxsb3dzIHRoYXQuCi0gKiBOb3RlIHRoYXQgaW5jcmVhc2luZyB0aGlzIHZhbHVlIG1heSBkaXNhYmxlIHNvbWUgZGVidWcgZmVhdHVyZXMuCi0gKi8KLSNpZmRlZiBBUkNIX0RNQV9NSU5BTElHTgotI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gQVJDSF9ETUFfTUlOQUxJR04KLSNlbHNlCi0jZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCi0jZW5kaWYKLQotI2lmbmRlZiBBUkNIX1NMQUJfTUlOQUxJR04KLS8qCi0gKiBFbmZvcmNlIGEgbWluaW11bSBhbGlnbm1lbnQgZm9yIGFsbCBjYWNoZXMuCi0gKiBJbnRlbmRlZCBmb3IgYXJjaHMgdGhhdCBnZXQgbWlzYWxpZ25tZW50IGZhdWx0cyBldmVuIGZvciBCWVRFU19QRVJfV09SRAotICogYWxpZ25lZCBidWZmZXJzLiBJbmNsdWRlcyBBUkNIX0tNQUxMT0NfTUlOQUxJR04uCi0gKiBJZiBwb3NzaWJsZTogRG8gbm90IGVuYWJsZSB0aGlzIGZsYWcgZm9yIENPTkZJR19ERUJVR19TTEFCLCBpdCBkaXNhYmxlcwotICogc29tZSBkZWJ1ZyBmZWF0dXJlcy4KLSAqLwotI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gMAotI2VuZGlmCi0KLS8qCiAgKiBzdHJ1Y3Qga21lbV9jYWNoZQogICoKICAqIG1hbmFnZXMgYSBjYWNoZS4KICAqLwogCiBzdHJ1Y3Qga21lbV9jYWNoZSB7Ci0vKiAxKSBwZXItY3B1IGRhdGEsIHRvdWNoZWQgZHVyaW5nIGV2ZXJ5IGFsbG9jL2ZyZWUgKi8KLQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFycmF5W05SX0NQVVNdOwotLyogMikgQ2FjaGUgdHVuYWJsZXMuIFByb3RlY3RlZCBieSBjYWNoZV9jaGFpbl9tdXRleCAqLworLyogMSkgQ2FjaGUgdHVuYWJsZXMuIFByb3RlY3RlZCBieSBjYWNoZV9jaGFpbl9tdXRleCAqLwogCXVuc2lnbmVkIGludCBiYXRjaGNvdW50OwogCXVuc2lnbmVkIGludCBsaW1pdDsKIAl1bnNpZ25lZCBpbnQgc2hhcmVkOwogCiAJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOwogCXUzMiByZWNpcHJvY2FsX2J1ZmZlcl9zaXplOwotLyogMykgdG91Y2hlZCBieSBldmVyeSBhbGxvYyAmIGZyZWUgZnJvbSB0aGUgYmFja2VuZCAqLworLyogMikgdG91Y2hlZCBieSBldmVyeSBhbGxvYyAmIGZyZWUgZnJvbSB0aGUgYmFja2VuZCAqLwogCiAJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogY29uc3RhbnQgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgbnVtOwkJLyogIyBvZiBvYmpzIHBlciBzbGFiICovCiAKLS8qIDQpIGNhY2hlX2dyb3cvc2hyaW5rICovCisvKiAzKSBjYWNoZV9ncm93L3NocmluayAqLwogCS8qIG9yZGVyIG9mIHBncyBwZXIgc2xhYiAoMl5uKSAqLwogCXVuc2lnbmVkIGludCBnZnBvcmRlcjsKIApAQCAtODAsMTEgKzUyLDExIEBACiAJLyogY29uc3RydWN0b3IgZnVuYyAqLwogCXZvaWQgKCpjdG9yKSh2b2lkICpvYmopOwogCi0vKiA1KSBjYWNoZSBjcmVhdGlvbi9yZW1vdmFsICovCisvKiA0KSBjYWNoZSBjcmVhdGlvbi9yZW1vdmFsICovCiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CiAKLS8qIDYpIHN0YXRpc3RpY3MgKi8KKy8qIDUpIHN0YXRpc3RpY3MgKi8KICNpZmRlZiBDT05GSUdfREVCVUdfU0xBQgogCXVuc2lnbmVkIGxvbmcgbnVtX2FjdGl2ZTsKIAl1bnNpZ25lZCBsb25nIG51bV9hbGxvY2F0aW9uczsKQEAgLTExMSwxNiArODMsMTggQEAKIAlpbnQgb2JqX3NpemU7CiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX1NMQUIgKi8KIAorLyogNikgcGVyLWNwdS9wZXItbm9kZSBkYXRhLCB0b3VjaGVkIGR1cmluZyBldmVyeSBhbGxvYy9mcmVlICovCiAJLyoKLQkgKiBXZSBwdXQgbm9kZWxpc3RzW10gYXQgdGhlIGVuZCBvZiBrbWVtX2NhY2hlLCBiZWNhdXNlIHdlIHdhbnQgdG8gc2l6ZQotCSAqIHRoaXMgYXJyYXkgdG8gbnJfbm9kZV9pZHMgc2xvdHMgaW5zdGVhZCBvZiBNQVhfTlVNTk9ERVMKKwkgKiBXZSBwdXQgYXJyYXlbXSBhdCB0aGUgZW5kIG9mIGttZW1fY2FjaGUsIGJlY2F1c2Ugd2Ugd2FudCB0byBzaXplCisJICogdGhpcyBhcnJheSB0byBucl9jcHVfaWRzIHNsb3RzIGluc3RlYWQgb2YgTlJfQ1BVUwogCSAqIChzZWUga21lbV9jYWNoZV9pbml0KCkpCi0JICogV2Ugc3RpbGwgdXNlIFtNQVhfTlVNTk9ERVNdIGFuZCBub3QgWzFdIG9yIFswXSBiZWNhdXNlIGNhY2hlX2NhY2hlCi0JICogaXMgc3RhdGljYWxseSBkZWZpbmVkLCBzbyB3ZSByZXNlcnZlIHRoZSBtYXggbnVtYmVyIG9mIG5vZGVzLgorCSAqIFdlIHN0aWxsIHVzZSBbTlJfQ1BVU10gYW5kIG5vdCBbMV0gb3IgWzBdIGJlY2F1c2UgY2FjaGVfY2FjaGUKKwkgKiBpcyBzdGF0aWNhbGx5IGRlZmluZWQsIHNvIHdlIHJlc2VydmUgdGhlIG1heCBudW1iZXIgb2YgY3B1cy4KIAkgKi8KLQlzdHJ1Y3Qga21lbV9saXN0MyAqbm9kZWxpc3RzW01BWF9OVU1OT0RFU107CisJc3RydWN0IGttZW1fbGlzdDMgKipub2RlbGlzdHM7CisJc3RydWN0IGFycmF5X2NhY2hlICphcnJheVtOUl9DUFVTXTsKIAkvKgotCSAqIERvIG5vdCBhZGQgZmllbGRzIGFmdGVyIG5vZGVsaXN0c1tdCisJICogRG8gbm90IGFkZCBmaWVsZHMgYWZ0ZXIgYXJyYXlbXQogCSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oCmluZGV4IDQzODJkYjAuLjBlYzAwYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xvYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmgKQEAgLTEsMTYgKzEsNiBAQAogI2lmbmRlZiBfX0xJTlVYX1NMT0JfREVGX0gKICNkZWZpbmUgX19MSU5VWF9TTE9CX0RFRl9ICiAKLSNpZmRlZiBBUkNIX0RNQV9NSU5BTElHTgotI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gQVJDSF9ETUFfTUlOQUxJR04KLSNlbHNlCi0jZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKQotI2VuZGlmCi0KLSNpZm5kZWYgQVJDSF9TTEFCX01JTkFMSUdOCi0jZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKQotI2VuZGlmCi0KIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCBjODY2OGQxLi40YjM1YzA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMTMsMTYgKzExMyw2IEBACiAKICNkZWZpbmUgS01BTExPQ19TSElGVF9MT1cgaWxvZzIoS01BTExPQ19NSU5fU0laRSkKIAotI2lmZGVmIEFSQ0hfRE1BX01JTkFMSUdOCi0jZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBBUkNIX0RNQV9NSU5BTElHTgotI2Vsc2UKLSNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcgbG9uZykKLSNlbmRpZgotCi0jaWZuZGVmIEFSQ0hfU0xBQl9NSU5BTElHTgotI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gX19hbGlnbm9mX18odW5zaWduZWQgbG9uZyBsb25nKQotI2VuZGlmCi0KIC8qCiAgKiBNYXhpbXVtIGttYWxsb2Mgb2JqZWN0IHNpemUgaGFuZGxlZCBieSBTTFVCLiBMYXJnZXIgb2JqZWN0IGFsbG9jYXRpb25zCiAgKiBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLiBUaGUgcGFnZSBhbGxvY2F0b3IgImZhc3RwYXRoIgpAQCAtMjI4LDYgKzIxOCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogQ2FsbGluZyB0aGlzIG9uIGFsbG9jYXRlZCBtZW1vcnkgd2lsbCBjaGVjayB0aGF0IHRoZSBtZW1vcnkKKyAqIGlzIGV4cGVjdGVkIHRvIGJlIGluIHVzZSwgYW5kIHByaW50IHdhcm5pbmdzIGlmIG5vdC4KKyAqLworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCitleHRlcm4gYm9vbCB2ZXJpZnlfbWVtX25vdF9kZWxldGVkKGNvbnN0IHZvaWQgKngpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCB2ZXJpZnlfbWVtX25vdF9kZWxldGVkKGNvbnN0IHZvaWQgKngpCit7CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19UUkFDSU5HCiBleHRlcm4gdm9pZCAqCiBrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncywgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXAuaCBiL2luY2x1ZGUvbGludXgvc21wLmgKaW5kZXggN2FkODI0ZC4uOGNjMzhkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcC5oCkBAIC04NSwxMiArODUsMTUgQEAKICAqIEdlbmVyaWMgYW5kIGFyY2ggaGVscGVycwogICovCiAjaWZkZWYgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTCit2b2lkIF9faW5pdCBjYWxsX2Z1bmN0aW9uX2luaXQodm9pZCk7CiB2b2lkIGdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCh2b2lkKTsKIHZvaWQgZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQodm9pZCk7CiB2b2lkIGlwaV9jYWxsX2xvY2sodm9pZCk7CiB2b2lkIGlwaV9jYWxsX3VubG9jayh2b2lkKTsKIHZvaWQgaXBpX2NhbGxfbG9ja19pcnEodm9pZCk7CiB2b2lkIGlwaV9jYWxsX3VubG9ja19pcnEodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNhbGxfZnVuY3Rpb25faW5pdCh2b2lkKSB7IH0KICNlbmRpZgogCiAvKgpAQCAtMTM0LDcgKzEzNyw3IEBACiAjZGVmaW5lIHNtcF9wcmVwYXJlX2Jvb3RfY3B1KCkJCQlkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBmdW5jLCBpbmZvLCB3YWl0KSBcCiAJCQkodXBfc21wX2NhbGxfZnVuY3Rpb24oZnVuYywgaW5mbykpCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9jYWxsX3NpbmdsZV9kYXRhKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGNhbGxfZnVuY3Rpb25faW5pdCh2b2lkKSB7IH0KIAogc3RhdGljIGlubGluZSBpbnQKIHNtcF9jYWxsX2Z1bmN0aW9uX2FueShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgc21wX2NhbGxfZnVuY190IGZ1bmMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzYyMzRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaApAQCAtMCwwICsxLDQgQEAKKy8qCisgKiBEdW1iIHdheSB0byBzaGFyZSB0aGlzIHN0YXRpYyBwaWVjZSBvZiBpbmZvcm1hdGlvbiB3aXRoIG5mc2QKKyAqLworI2RlZmluZSBLUkI1X1NVUFBPUlRFRF9FTkNUWVBFUyAiMTgsMTcsMTYsMjMsMywxLDIiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaAppbmRleCBmNzNjNDgyLi5mZTJkOGU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgKQEAgLTg0LDcgKzg0LDggQEAKICNlbmRpZgogCXVuc2lnbmVkIGNoYXIJCXRrX3ByaW9yaXR5IDogMiwvKiBUYXNrIHByaW9yaXR5ICovCiAJCQkJdGtfZ2FyYl9yZXRyeSA6IDIsCi0JCQkJdGtfY3JlZF9yZXRyeSA6IDI7CisJCQkJdGtfY3JlZF9yZXRyeSA6IDIsCisJCQkJdGtfcmViaW5kX3JldHJ5IDogMjsKIH07CiAjZGVmaW5lIHRrX3hwcnQJCQl0a19jbGllbnQtPmNsX3hwcnQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCAzODRlYjVmLi5hMjczNDY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMzAwLDE2ICszMDAsNiBAQAogZXh0ZXJuIGludCBrc3dhcGRfcnVuKGludCBuaWQpOwogZXh0ZXJuIHZvaWQga3N3YXBkX3N0b3AoaW50IG5pZCk7CiAKLSNpZmRlZiBDT05GSUdfTU1VCi0vKiBsaW51eC9tbS9zaG1lbS5jICovCi1leHRlcm4gaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci0jZW5kaWYgLyogQ09ORklHX01NVSAqLwotCi0jaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKLWV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IHBnb2ZmLAotCQkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCBzd3BfZW50cnlfdCAqZW50KTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1NXQVAKIC8qIGxpbnV4L21tL3BhZ2VfaW8uYyAqLwogZXh0ZXJuIGludCBzd2FwX3JlYWRwYWdlKHN0cnVjdCBwYWdlICopOwpAQCAtMzU4LDYgKzM0OCw3IEBACiBleHRlcm4gc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbTsKIGV4dGVybiB2b2lkIGdyYWJfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgX19wdXRfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICopOworZXh0ZXJuIHZvaWQgZGlzYWJsZV9zd2FwX3Rva2VuKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGhhc19zd2FwX3Rva2VuKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewpAQCAtMzcwLDExICszNjEsNiBAQAogCQlfX3B1dF9zd2FwX3Rva2VuKG1tKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfc3dhcF90b2tlbih2b2lkKQotewotCXB1dF9zd2FwX3Rva2VuKHN3YXBfdG9rZW5fbW0pOwotfQotCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKIGV4dGVybiB2b2lkCiBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3dwX2VudHJ5X3QgZW50LCBib29sIHN3YXBvdXQpOwpAQCAtNTAwLDcgKzQ4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX3N3YXBfdG9rZW4odm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX3N3YXBfdG9rZW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaCBiL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCmluZGV4IDhjMGUzNDkuLjQ0NTcwMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCkBAIC0yNCw2ICsyNCw3IEBACiAKIGV4dGVybiB2b2lkIHN3aW90bGJfaW5pdChpbnQgdmVyYm9zZSk7CiBleHRlcm4gdm9pZCBzd2lvdGxiX2luaXRfd2l0aF90YmwoY2hhciAqdGxiLCB1bnNpZ25lZCBsb25nIG5zbGFicywgaW50IHZlcmJvc2UpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3dpb2x0Yl9ucl90Ymwodm9pZCk7CiAKIC8qCiAgKiBFbnVtZXJhdGlvbiBmb3Igc3luYyB0YXJnZXRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggYzNhY2RhNi4uZTI2OTZkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtMTc3LDkgKzE3Nyw2IEBACiBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzeXNmc19nZXQoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpOwogdm9pZCBzeXNmc19wdXQoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpOwogCi0vKiBDYWxsZWQgdG8gY2xlYXIgYSBucyB0YWcgd2hlbiBpdCBpcyBubyBsb25nZXIgdmFsaWQgKi8KLXZvaWQgc3lzZnNfZXhpdF9ucyhlbnVtIGtvYmpfbnNfdHlwZSB0eXBlLCBjb25zdCB2b2lkICp0YWcpOwotCiBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2luaXQodm9pZCk7CiAKICNlbHNlIC8qIENPTkZJR19TWVNGUyAqLwpAQCAtMzM4LDEwICszMzUsNiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfZXhpdF9ucyhpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdGFnKQotewotfQotCiBzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgc3lzZnNfaW5pdCh2b2lkKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCmluZGV4IGI5MWE0MGUuLmZjODM5YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKQEAgLTYwLDcgKzYwLDcgQEAKICAqIChpbiB3aGF0ZXZlciBhcmNoIHNwZWNpZmljIG1lYXN1cmVtZW50IHVuaXRzIHJldHVybmVkIGJ5IG5vZGVfZGlzdGFuY2UoKSkKICAqIHRoZW4gc3dpdGNoIG9uIHpvbmUgcmVjbGFpbSBvbiBib290LgogICovCi0jZGVmaW5lIFJFQ0xBSU1fRElTVEFOQ0UgMjAKKyNkZWZpbmUgUkVDTEFJTV9ESVNUQU5DRSAzMAogI2VuZGlmCiAjaWZuZGVmIFBFTkFMVFlfRk9SX05PREVfV0lUSF9DUFVTCiAjZGVmaW5lIFBFTkFMVFlfRk9SX05PREVfV0lUSF9DUFVTCSgxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaCBiL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKaW5kZXggNWIwNzc5Mi4uZmY3ZGMwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCkBAIC03Niw3ICs3Niw3IEBACiAgKiAJdHR5IGRldmljZS4gIEl0IGlzIHNvbGVseSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGxpbmUKICAqIAlkaXNjaXBsaW5lIHRvIGhhbmRsZSBwb2xsIHJlcXVlc3RzLgogICoKLSAqIHVuc2lnbmVkIGludCAoKnJlY2VpdmVfYnVmKShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKyAqIHZvaWQJKCpyZWNlaXZlX2J1Zikoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCiAgKiAJCSAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KTsKICAqCiAgKiAJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGxvdy1sZXZlbCB0dHkgZHJpdmVyIHRvIHNlbmQKQEAgLTg0LDggKzg0LDcgQEAKICAqIAlwcm9jZXNzaW5nLiAgPGNwPiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBpbnB1dAogICogCWNoYXJhY3RlciByZWNlaXZlZCBieSB0aGUgZGV2aWNlLiAgPGZwPiBpcyBhIHBvaW50ZXIgdG8gYQogICogCXBvaW50ZXIgb2YgZmxhZyBieXRlcyB3aGljaCBpbmRpY2F0ZSB3aGV0aGVyIGEgY2hhcmFjdGVyIHdhcwotICogCXJlY2VpdmVkIHdpdGggYSBwYXJpdHkgZXJyb3IsIGV0Yy4gUmV0dXJucyB0aGUgYW1vdW50IG9mIGJ5dGVzCi0gKiAJcmVjZWl2ZWQuCisgKiAJcmVjZWl2ZWQgd2l0aCBhIHBhcml0eSBlcnJvciwgZXRjLgogICogCiAgKiB2b2lkCSgqd3JpdGVfd2FrZXVwKShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKICAqCkBAIC0xNDEsOCArMTQwLDggQEAKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIGNhbGxlZCBmcm9tIGJlbG93LgogCSAqLwotCXVuc2lnbmVkIGludCAoKnJlY2VpdmVfYnVmKShzdHJ1Y3QgdHR5X3N0cnVjdCAqLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpOworCXZvaWQJKCpyZWNlaXZlX2J1Zikoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICAgY2hhciAqZnAsIGludCBjb3VudCk7CiAJdm9pZAkoKndyaXRlX3dha2V1cCkoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiAJdm9pZAkoKmRjZF9jaGFuZ2UpKHN0cnVjdCB0dHlfc3RydWN0ICosIHVuc2lnbmVkIGludCwKIAkJCQlzdHJ1Y3QgcHBzX2V2ZW50X3RpbWUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCA3MTY5M2Q0Li4xN2RmMzYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTYyLDcgKzYyLDkgQEAKIAlVU19GTEFHKE5PX1JFQURfRElTQ19JTkZPLAkweDAwMDQwMDAwKQkJXAogCQkvKiBjYW5ub3QgaGFuZGxlIFJFQURfRElTQ19JTkZPICovCQlcCiAJVVNfRkxBRyhOT19SRUFEX0NBUEFDSVRZXzE2LAkweDAwMDgwMDAwKQkJXAotCQkvKiBjYW5ub3QgaGFuZGxlIFJFQURfQ0FQQUNJVFlfMTYgKi8KKwkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzE2ICovCQlcCisJVVNfRkxBRyhJTklUSUFMX1JFQUQxMCwJMHgwMDEwMDAwMCkJCQlcCisJCS8qIEluaXRpYWwgUkVBRCgxMCkgKGFuZCBvdGhlcnMpIG11c3QgYmUgcmV0cmllZCAqLwogCiAjZGVmaW5lIFVTX0ZMQUcobmFtZSwgdmFsdWUpCVVTX0ZMXyMjbmFtZSA9IHZhbHVlICwKIGVudW0geyBVU19ET19BTExfRkxBR1MgfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXRzLmggYi9pbmNsdWRlL2xpbnV4L3V0cy5oCmluZGV4IDczZWIxZWQuLjZkZGJkODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC91dHMuaApAQCAtOSw3ICs5LDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIFVUU19OT0RFTkFNRQotI2RlZmluZSBVVFNfTk9ERU5BTUUgIihub25lKSIJLyogc2V0IGJ5IHNldGhvc3RuYW1lKCkgKi8KKyNkZWZpbmUgVVRTX05PREVOQU1FIENPTkZJR19ERUZBVUxUX0hPU1ROQU1FIC8qIHNldCBieSBzZXRob3N0bmFtZSgpICovCiAjZW5kaWYKIAogI2lmbmRlZiBVVFNfRE9NQUlOTkFNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW8uaCBiL2luY2x1ZGUvbGludXgvdmlydGlvLmgKaW5kZXggYWZmNWI0Zi4uNzEwODg1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpby5oCkBAIC01MSw2ICs1MSwxMyBAQAogICoJVGhpcyByZS1lbmFibGVzIGNhbGxiYWNrczsgaXQgcmV0dXJucyAiZmFsc2UiIGlmIHRoZXJlIGFyZSBwZW5kaW5nCiAgKglidWZmZXJzIGluIHRoZSBxdWV1ZSwgdG8gZGV0ZWN0IGEgcG9zc2libGUgcmFjZSBiZXR3ZWVuIHRoZSBkcml2ZXIKICAqCWNoZWNraW5nIGZvciBtb3JlIHdvcmssIGFuZCBlbmFibGluZyBjYWxsYmFja3MuCisgKiB2aXJ0cXVldWVfZW5hYmxlX2NiX2RlbGF5ZWQ6IHJlc3RhcnQgY2FsbGJhY2tzIGFmdGVyIGRpc2FibGVfY2IuCisgKgl2cTogdGhlIHN0cnVjdCB2aXJ0cXVldWUgd2UncmUgdGFsa2luZyBhYm91dC4KKyAqCVRoaXMgcmUtZW5hYmxlcyBjYWxsYmFja3MgYnV0IGhpbnRzIHRvIHRoZSBvdGhlciBzaWRlIHRvIGRlbGF5CisgKglpbnRlcnJ1cHRzIHVudGlsIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBidWZmZXJzIGhhdmUgYmVlbiBwcm9jZXNzZWQ7CisgKglpdCByZXR1cm5zICJmYWxzZSIgaWYgdGhlcmUgYXJlIG1hbnkgcGVuZGluZyBidWZmZXJzIGluIHRoZSBxdWV1ZSwKKyAqCXRvIGRldGVjdCBhIHBvc3NpYmxlIHJhY2UgYmV0d2VlbiB0aGUgZHJpdmVyIGNoZWNraW5nIGZvciBtb3JlIHdvcmssCisgKglhbmQgZW5hYmxpbmcgY2FsbGJhY2tzLgogICogdmlydHF1ZXVlX2RldGFjaF91bnVzZWRfYnVmOiBkZXRhY2ggZmlyc3QgdW51c2VkIGJ1ZmZlcgogICogCXZxOiB0aGUgc3RydWN0IHZpcnRxdWV1ZSB3ZSdyZSB0YWxraW5nIGFib3V0LgogICogCVJldHVybnMgTlVMTCBvciB0aGUgImRhdGEiIHRva2VuIGhhbmRlZCB0byBhZGRfYnVmCkBAIC04Niw2ICs5Myw4IEBACiAKIGJvb2wgdmlydHF1ZXVlX2VuYWJsZV9jYihzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7CiAKK2Jvb2wgdmlydHF1ZXVlX2VuYWJsZV9jYl9kZWxheWVkKHN0cnVjdCB2aXJ0cXVldWUgKnZxKTsKKwogdm9pZCAqdmlydHF1ZXVlX2RldGFjaF91bnVzZWRfYnVmKHN0cnVjdCB2aXJ0cXVldWUgKnZxKTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaAppbmRleCBlNjhiNDM5Li4yNzdjNGFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmgKQEAgLTEsNyArMSwzMCBAQAogI2lmbmRlZiBfTElOVVhfVklSVElPXzlQX0gKICNkZWZpbmUgX0xJTlVYX1ZJUlRJT185UF9ICiAvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAotICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuICovCisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmgKaW5kZXggYTUwZWNkMS4uNjUyZGM4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX2JhbGxvb24uaApAQCAtMSw3ICsxLDMwIEBACiAjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQkFMTE9PTl9ICiAjZGVmaW5lIF9MSU5VWF9WSVJUSU9fQkFMTE9PTl9ICiAvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAotICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuICovCisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCmluZGV4IDE2NzcyMGQuLmUwZWRiNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCkBAIC0xLDcgKzEsMzAgQEAKICNpZm5kZWYgX0xJTlVYX1ZJUlRJT19CTEtfSAogI2RlZmluZSBfTElOVVhfVklSVElPX0JMS19ICiAvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAotICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuICovCisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oCmluZGV4IDgwMDYxN2IuLjM5Yzg4YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oCkBAIC0xLDcgKzEsMzAgQEAKICNpZm5kZWYgX0xJTlVYX1ZJUlRJT19DT05GSUdfSAogI2RlZmluZSBfTElOVVhfVklSVElPX0NPTkZJR19ICiAvKiBUaGlzIGhlYWRlciwgZXhjbHVkaW5nIHRoZSAjaWZkZWYgX19LRVJORUxfXyBwYXJ0LCBpcyBCU0QgbGljZW5zZWQgc28KLSAqIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuICovCisgKiBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLwogCiAvKiBWaXJ0aW8gZGV2aWNlcyB1c2UgYSBzdGFuZGFyZGl6ZWQgY29uZmlndXJhdGlvbiBzcGFjZSB0byBkZWZpbmUgdGhlaXIKICAqIGZlYXR1cmVzIGFuZCBwYXNzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBlYWNoIGltcGxlbWVudGF0aW9uIGNhbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oCmluZGV4IGU0ZDMzMzUuLmJkZjRiMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmgKQEAgLTUsNyArNSwzMSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KIC8qCiAgKiBUaGlzIGhlYWRlciwgZXhjbHVkaW5nIHRoZSAjaWZkZWYgX19LRVJORUxfXyBwYXJ0LCBpcyBCU0QgbGljZW5zZWQgc28KLSAqIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKiBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzOgorICoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIFJlZCBIYXQsIEluYy4sIDIwMDksIDIwMTAsIDIwMTEKICAqIENvcHlyaWdodCAoQykgQW1pdCBTaGFoIDxhbWl0LnNoYWhAcmVkaGF0LmNvbT4sIDIwMDksIDIwMTAsIDIwMTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX2lkcy5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9faWRzLmgKaW5kZXggMDY2NjBjMC4uODViYjBiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9faWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9faWRzLmgKQEAgLTUsNyArNSwyOSBAQAogICoKICAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KLSAqLworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLwogCiAjZGVmaW5lIFZJUlRJT19JRF9ORVQJCTEgLyogdmlydGlvIG5ldCAqLwogI2RlZmluZSBWSVJUSU9fSURfQkxPQ0sJCTIgLyogdmlydGlvIGJsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oCmluZGV4IDA4NWU0MjIuLjEzNjA0MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oCkBAIC0xLDcgKzEsMzAgQEAKICNpZm5kZWYgX0xJTlVYX1ZJUlRJT19ORVRfSAogI2RlZmluZSBfTElOVVhfVklSVElPX05FVF9ICiAvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAotICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuICovCisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX3BjaS5oCmluZGV4IDlhM2Q3YzQuLmVhNjZmM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX3BjaS5oCkBAIC0xMSw2ICsxMSwyOSBAQAogICoKICAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KICAqLwogCiAjaWZuZGVmIF9MSU5VWF9WSVJUSU9fUENJX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaAppbmRleCBlNGQxNDRiLi40YTMyY2I2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCkBAIC03LDYgKzcsMjkgQEAKICAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KICAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCiAgKiBDb3B5cmlnaHQgUnVzdHkgUnVzc2VsbCBJQk0gQ29ycG9yYXRpb24gMjAwNy4gKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCkBAIC0yOSw2ICs1MiwxMiBAQAogLyogV2Ugc3VwcG9ydCBpbmRpcmVjdCBidWZmZXIgZGVzY3JpcHRvcnMgKi8KICNkZWZpbmUgVklSVElPX1JJTkdfRl9JTkRJUkVDVF9ERVNDCTI4CiAKKy8qIFRoZSBHdWVzdCBwdWJsaXNoZXMgdGhlIHVzZWQgaW5kZXggZm9yIHdoaWNoIGl0IGV4cGVjdHMgYW4gaW50ZXJydXB0CisgKiBhdCB0aGUgZW5kIG9mIHRoZSBhdmFpbCByaW5nLiBIb3N0IHNob3VsZCBpZ25vcmUgdGhlIGF2YWlsLT5mbGFncyBmaWVsZC4gKi8KKy8qIFRoZSBIb3N0IHB1Ymxpc2hlcyB0aGUgYXZhaWwgaW5kZXggZm9yIHdoaWNoIGl0IGV4cGVjdHMgYSBraWNrCisgKiBhdCB0aGUgZW5kIG9mIHRoZSB1c2VkIHJpbmcuIEd1ZXN0IHNob3VsZCBpZ25vcmUgdGhlIHVzZWQtPmZsYWdzIGZpZWxkLiAqLworI2RlZmluZSBWSVJUSU9fUklOR19GX0VWRU5UX0lEWAkJMjkKKwogLyogVmlydGlvIHJpbmcgZGVzY3JpcHRvcnM6IDE2IGJ5dGVzLiAgVGhlc2UgY2FuIGNoYWluIHRvZ2V0aGVyIHZpYSAibmV4dCIuICovCiBzdHJ1Y3QgdnJpbmdfZGVzYyB7CiAJLyogQWRkcmVzcyAoZ3Vlc3QtcGh5c2ljYWwpLiAqLwpAQCAtODMsNiArMTEyLDcgQEAKICAqCV9fdTE2IGF2YWlsX2ZsYWdzOwogICoJX191MTYgYXZhaWxfaWR4OwogICoJX191MTYgYXZhaWxhYmxlW251bV07CisgKglfX3UxNiB1c2VkX2V2ZW50X2lkeDsKICAqCiAgKgkvLyBQYWRkaW5nIHRvIHRoZSBuZXh0IGFsaWduIGJvdW5kYXJ5LgogICoJY2hhciBwYWRbXTsKQEAgLTkxLDggKzEyMSwxNCBAQAogICoJX191MTYgdXNlZF9mbGFnczsKICAqCV9fdTE2IHVzZWRfaWR4OwogICoJc3RydWN0IHZyaW5nX3VzZWRfZWxlbSB1c2VkW251bV07CisgKglfX3UxNiBhdmFpbF9ldmVudF9pZHg7CiAgKiB9OwogICovCisvKiBXZSBwdWJsaXNoIHRoZSB1c2VkIGV2ZW50IGluZGV4IGF0IHRoZSBlbmQgb2YgdGhlIGF2YWlsYWJsZSByaW5nLCBhbmQgdmljZQorICogdmVyc2EuIFRoZXkgYXJlIGF0IHRoZSBlbmQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLworI2RlZmluZSB2cmluZ191c2VkX2V2ZW50KHZyKSAoKHZyKS0+YXZhaWwtPnJpbmdbKHZyKS0+bnVtXSkKKyNkZWZpbmUgdnJpbmdfYXZhaWxfZXZlbnQodnIpICgqKF9fdTE2ICopJih2ciktPnVzZWQtPnJpbmdbKHZyKS0+bnVtXSkKKwogc3RhdGljIGlubGluZSB2b2lkIHZyaW5nX2luaXQoc3RydWN0IHZyaW5nICp2ciwgdW5zaWduZWQgaW50IG51bSwgdm9pZCAqcCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCiB7CkBAIC0xMDcsNyArMTQzLDIxIEBACiB7CiAJcmV0dXJuICgoc2l6ZW9mKHN0cnVjdCB2cmluZ19kZXNjKSAqIG51bSArIHNpemVvZihfX3UxNikgKiAoMiArIG51bSkKIAkJICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKSkKLQkJKyBzaXplb2YoX191MTYpICogMiArIHNpemVvZihzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtKSAqIG51bTsKKwkJKyBzaXplb2YoX191MTYpICogMyArIHNpemVvZihzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtKSAqIG51bTsKK30KKworLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIHdpdGggVVNFRF9FVkVOVF9JRFggYW5kIEFWQUlMX0VWRU5UX0lEWCAqLworLyogQXNzdW1pbmcgYSBnaXZlbiBldmVudF9pZHggdmFsdWUgZnJvbSB0aGUgb3RoZXIgc2l6ZSwgaWYKKyAqIHdlIGhhdmUganVzdCBpbmNyZW1lbnRlZCBpbmRleCBmcm9tIG9sZCB0byBuZXdfaWR4LAorICogc2hvdWxkIHdlIHRyaWdnZXIgYW4gZXZlbnQ/ICovCitzdGF0aWMgaW5saW5lIGludCB2cmluZ19uZWVkX2V2ZW50KF9fdTE2IGV2ZW50X2lkeCwgX191MTYgbmV3X2lkeCwgX191MTYgb2xkKQoreworCS8qIE5vdGU6IFhlbiBoYXMgc2ltaWxhciBsb2dpYyBmb3Igbm90aWZpY2F0aW9uIGhvbGQtb2ZmCisJICogaW4gaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL3JpbmcuaCB3aXRoIHJlcV9ldmVudCBhbmQgcmVxX3Byb2QKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGV2ZW50X2lkeCArIDEgYW5kIG5ld19pZHggcmVzcGVjdGl2ZWx5LgorCSAqIE5vdGUgYWxzbyB0aGF0IHJlcV9ldmVudCBhbmQgcmVxX3Byb2QgaW4gWGVuIHN0YXJ0IGF0IDEsCisJICogZXZlbnQgaW5kZXhlcyBpbiB2aXJ0aW8gc3RhcnQgYXQgMC4gKi8KKwlyZXR1cm4gKF9fdTE2KShuZXdfaWR4IC0gZXZlbnRfaWR4IC0gMSkgPCAoX191MTYpKG5ld19pZHggLSBvbGQpOwogfQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9saXJjX2Rldi5oIGIvaW5jbHVkZS9tZWRpYS9saXJjX2Rldi5oCmluZGV4IDYzMGU3MDIuLjE2OGRkMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbGlyY19kZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL2xpcmNfZGV2LmgKQEAgLTksNyArOSw3IEBACiAjaWZuZGVmIF9MSU5VWF9MSVJDX0RFVl9ICiAjZGVmaW5lIF9MSU5VWF9MSVJDX0RFVl9ICiAKLSNkZWZpbmUgTUFYX0lSQ1RMX0RFVklDRVMgNAorI2RlZmluZSBNQVhfSVJDVExfREVWSUNFUyA4CiAjZGVmaW5lIEJVRkxFTiAgICAgICAgICAgIDE2CiAKICNkZWZpbmUgbW9kKG4sIGRpdikgKChuKSAlIChkaXYpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tNW1vbHMuaCBiL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmgKaW5kZXggMmQ3ZTdjYS4uYWFjMmMwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tNW1vbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL201bW9scy5oCkBAIC0yLDEwICsyLDEwIEBACiAgKiBEcml2ZXIgaGVhZGVyIGZvciBNLTVNT0xTIDhNIFBpeGVsIGNhbWVyYSBzZW5zb3Igd2l0aCBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKaW5kZXggOTNlOTZmYi4uYzdjNDBmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaApAQCAtMTI4LDggKzEyOCw4IEBACiAJc3RydWN0IG11dGV4ICpsb2NrOwogfTsKIAotI2RlZmluZSBtZWRpYV9lbnRpdHlfdG9fdmlkZW9fZGV2aWNlKGVudGl0eSkgXAotCWNvbnRhaW5lcl9vZihlbnRpdHksIHN0cnVjdCB2aWRlb19kZXZpY2UsIGVudGl0eSkKKyNkZWZpbmUgbWVkaWFfZW50aXR5X3RvX3ZpZGVvX2RldmljZShfX2UpIFwKKwljb250YWluZXJfb2YoX19lLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBlbnRpdHkpCiAvKiBkZXYgdG8gdmlkZW8tZGV2aWNlICovCiAjZGVmaW5lIHRvX3ZpZGVvX2RldmljZShjZCkgY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBkZXYpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaAppbmRleCAxNTYyYzRmLi4yODg0ZTNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCkBAIC0xNzMsMTYgKzE3MywyMCBAQAogCQkJCSBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1Yik7CiB9OwogCi0vKiBzX21vZGU6IHN3aXRjaCB0aGUgdHVuZXIgdG8gYSBzcGVjaWZpYyB0dW5lciBtb2RlLiBSZXBsYWNlbWVudCBvZiBzX3JhZGlvLgorLyogc19yYWRpbzogdjRsIGRldmljZSB3YXMgb3BlbmVkIGluIHJhZGlvIG1vZGUuCiAKLSAgIHNfcmFkaW86IHY0bCBkZXZpY2Ugd2FzIG9wZW5lZCBpbiBSYWRpbyBtb2RlLCB0byBiZSByZXBsYWNlZCBieSBzX21vZGUuCisgICBnX2ZyZXF1ZW5jeTogZnJlcS0+dHlwZSBtdXN0IGJlIGZpbGxlZCBpbi4gTm9ybWFsbHkgZG9uZSBieSB2aWRlb19pb2N0bDIKKwlvciB0aGUgYnJpZGdlIGRyaXZlci4KKworICAgZ190dW5lcjoKKyAgIHNfdHVuZXI6IHZ0LT50eXBlIG11c3QgYmUgZmlsbGVkIGluLiBOb3JtYWxseSBkb25lIGJ5IHZpZGVvX2lvY3RsMiBvciB0aGUKKwlicmlkZ2UgZHJpdmVyLgogCiAgICBzX3R5cGVfYWRkcjogc2V0cyB0dW5lciB0eXBlIGFuZCBpdHMgSTJDIGFkZHIuCiAKICAgIHNfY29uZmlnOiBzZXRzIHRkYTk4ODcgc3BlY2lmaWMgc3R1ZmYsIGxpa2UgcG9ydDEsIHBvcnQyIGFuZCBxc3MKICAqLwogc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB7Ci0JaW50ICgqc19tb2RlKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBlbnVtIHY0bDJfdHVuZXJfdHlwZSk7CiAJaW50ICgqc19yYWRpbykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCk7CiAJaW50ICgqc19mcmVxdWVuY3kpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSk7CiAJaW50ICgqZ19mcmVxdWVuY3kpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCAwNTg5ZjU1Li4zOTZlOGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTI2ODgsNyArMjY4OCw3IEBACiAgKiBAZGV2OiBuZXR3b3JrIGRldmljZQogICogQGFkZHI6IFRoZSBzb3VyY2UgTUFDIGFkZHJlc3Mgb2YgdGhlIGZyYW1lCiAgKiBAa2V5X3R5cGU6IFRoZSBrZXkgdHlwZSB0aGF0IHRoZSByZWNlaXZlZCBmcmFtZSB1c2VkCi0gKiBAa2V5X2lkOiBLZXkgaWRlbnRpZmllciAoMC4uMykKKyAqIEBrZXlfaWQ6IEtleSBpZGVudGlmaWVyICgwLi4zKS4gQ2FuIGJlIC0xIGlmIG1pc3NpbmcuCiAgKiBAdHNjOiBUaGUgVFNDIHZhbHVlIG9mIHRoZSBmcmFtZSB0aGF0IGdlbmVyYXRlZCB0aGUgTUlDIGZhaWx1cmUgKDYgb2N0ZXRzKQogICogQGdmcDogYWxsb2NhdGlvbiBmbGFncwogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzdC5oIGIvaW5jbHVkZS9uZXQvZHN0LmgKaW5kZXggN2QxNWQyMy4uZTEyZGRmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHN0LmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0LmgKQEAgLTc3LDYgKzc3LDcgQEAKICNkZWZpbmUgRFNUX05PUE9MSUNZCQkweDAwMDQKICNkZWZpbmUgRFNUX05PSEFTSAkJMHgwMDA4CiAjZGVmaW5lIERTVF9OT0NBQ0hFCQkweDAwMTAKKyNkZWZpbmUgRFNUX05PQ09VTlQJCTB4MDAyMAogCXVuaW9uIHsKIAkJc3RydWN0IGRzdF9lbnRyeQkqbmV4dDsKIAkJc3RydWN0IHJ0YWJsZSBfX3JjdQkqcnRfbmV4dDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaAppbmRleCAyYmY5ZWQ5Li5hZWY0MzBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCkBAIC0zNSw4ICszNSwxMSBAQAogI2RlZmluZSBORVRERVZfSEFTSEVOVFJJRVMgKDEgPDwgTkVUREVWX0hBU0hCSVRTKQogCiBzdHJ1Y3QgbmV0IHsKKwlhdG9taWNfdAkJcGFzc2l2ZTsJLyogVG8gZGVjaWRlZCB3aGVuIHRoZSBuZXR3b3JrCisJCQkJCQkgKiBuYW1lc3BhY2Ugc2hvdWxkIGJlIGZyZWVkLgorCQkJCQkJICovCiAJYXRvbWljX3QJCWNvdW50OwkJLyogVG8gZGVjaWRlZCB3aGVuIHRoZSBuZXR3b3JrCi0JCQkJCQkgKiAgbmFtZXNwYWNlIHNob3VsZCBiZSBmcmVlZC4KKwkJCQkJCSAqICBuYW1lc3BhY2Ugc2hvdWxkIGJlIHNodXQgZG93bi4KIAkJCQkJCSAqLwogI2lmZGVmIE5FVE5TX1JFRkNOVF9ERUJVRwogCWF0b21pY190CQl1c2VfY291bnQ7CS8qIFRvIHRyYWNrIHJlZmVyZW5jZXMgd2UKQEAgLTE1NCw2ICsxNTcsOSBAQAogewogCXJldHVybiBuZXQxID09IG5ldDI7CiB9CisKK2V4dGVybiB2b2lkIG5ldF9kcm9wX25zKHZvaWQgKik7CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqZ2V0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCkBAIC0xNzUsNiArMTgxLDggQEAKIHsKIAlyZXR1cm4gMTsKIH0KKworI2RlZmluZSBuZXRfZHJvcF9ucyBOVUxMCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggYzdjNDJlNy4uNWQ0ZjhlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMzA3LDYgKzMwNywxMiBAQAogCXJldHVybiB0ZXN0X2JpdChJUFNfVU5UUkFDS0VEX0JJVCwgJmN0LT5zdGF0dXMpOwogfQogCisvKiBQYWNrZXQgaXMgcmVjZWl2ZWQgZnJvbSBsb29wYmFjayAqLworc3RhdGljIGlubGluZSBib29sIG5mX2lzX2xvb3BiYWNrX3BhY2tldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmRldiAmJiBza2ItPnNrYl9paWYgJiYgc2tiLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLOworfQorCiBleHRlcm4gaW50IG5mX2Nvbm50cmFja19zZXRfaGFzaHNpemUoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX21heDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvY29tbWFuZC5oIGIvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmgKaW5kZXggMmI0NDc2NC4uNjUwNjQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmgKQEAgLTYzLDYgKzYzLDcgQEAKIAlTQ1RQX0NNRF9FQ05fRUNORSwJLyogRG8gZGVsYXllZCBFQ05FIHByb2Nlc3NpbmcuICovCiAJU0NUUF9DTURfRUNOX0NXUiwJLyogRG8gZGVsYXllZCBDV1IgcHJvY2Vzc2luZy4gICovCiAJU0NUUF9DTURfVElNRVJfU1RBUlQsCS8qIFN0YXJ0IGEgdGltZXIuICAqLworCVNDVFBfQ01EX1RJTUVSX1NUQVJUX09OQ0UsIC8qIFN0YXJ0IGEgdGltZXIgb25jZSAqLwogCVNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCS8qIFJlc3RhcnQgYSB0aW1lci4gKi8KIAlTQ1RQX0NNRF9USU1FUl9TVE9QLAkvKiBTdG9wIGEgdGltZXIuICovCiAJU0NUUF9DTURfSU5JVF9DSE9PU0VfVFJBTlNQT1JULCAvKiBDaG9vc2UgdHJhbnNwb3J0IGZvciBhbiBJTklULiAqLwpAQCAtMTA3LDYgKzEwOCw3IEBACiAJU0NUUF9DTURfVVBEQVRFX0lOSVRUQUcsIC8qIFVwZGF0ZSBwZWVyIGluaXR0YWcgKi8KIAlTQ1RQX0NNRF9TRU5EX01TRywJIC8qIFNlbmQgdGhlIHdob2xlIHVzZSBtZXNzYWdlICovCiAJU0NUUF9DTURfU0VORF9ORVhUX0FTQ09ORiwgLyogU2VuZCB0aGUgbmV4dCBBU0NPTkYgYWZ0ZXIgQUNLICovCisJU0NUUF9DTURfUFVSR0VfQVNDT05GX1FVRVVFLCAvKiBQdXJnZSBhbGwgYXNjb25mIHF1ZXVlcy4qLwogCVNDVFBfQ01EX0xBU1QKIH0gc2N0cF92ZXJiX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggNzk1ZjQ4OC4uN2RmMzI3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTE5OTMsNyArMTk5Myw3IEBACiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9hc3NvY19sb29rdXBfYXNjb25mX2FjaygKIAkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJCV9fYmUzMiBzZXJpYWwpOwotCit2b2lkIHNjdHBfYXNjb25mX3F1ZXVlX3RlYXJkb3duKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKTsKIAogaW50IHNjdHBfY21wX2FkZHJfZXhhY3QoY29uc3QgdW5pb24gc2N0cF9hZGRyICpzczEsCiAJCQljb25zdCB1bmlvbiBzY3RwX2FkZHIgKnNzMik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmggYi9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKaW5kZXggOTliMDI3Yi4uY2E0NjkzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaApAQCAtODAsNyArODAsNyBAQAogCiB2b2lkIHNjdHBfdWxwZXZlbnRfZnJlZShzdHJ1Y3Qgc2N0cF91bHBldmVudCAqKTsKIGludCBzY3RwX3VscGV2ZW50X2lzX25vdGlmaWNhdGlvbihjb25zdCBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqKTsKLXZvaWQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7Cit1bnNpZ25lZCBpbnQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IGYyMDQ2ZTQuLmMwYjkzOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTE3OCw3ICsxNzgsNiBAQAogICAqCUBza19kc3RfY2FjaGU6IGRlc3RpbmF0aW9uIGNhY2hlCiAgICoJQHNrX2RzdF9sb2NrOiBkZXN0aW5hdGlvbiBjYWNoZSBsb2NrCiAgICoJQHNrX3BvbGljeTogZmxvdyBwb2xpY3kKLSAgKglAc2tfcm1lbV9hbGxvYzogcmVjZWl2ZSBxdWV1ZSBieXRlcyBjb21taXR0ZWQKICAgKglAc2tfcmVjZWl2ZV9xdWV1ZTogaW5jb21pbmcgcGFja2V0cwogICAqCUBza193bWVtX2FsbG9jOiB0cmFuc21pdCBxdWV1ZSBieXRlcyBjb21taXR0ZWQKICAgKglAc2tfd3JpdGVfcXVldWU6IFBhY2tldCBzZW5kaW5nIHF1ZXVlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmggYi9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKaW5kZXggNzM2ZWFjNy4uYWYxYjQ5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oCisrKyBiL2luY2x1ZGUvc291bmQvc2IxNl9jc3AuaApAQCAtOTksNyArOTksMTQgQEAKIC8qIGdldCBDU1AgaW5mb3JtYXRpb24gKi8KICNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0lORk8JCV9JT1IoJ0gnLCAweDEwLCBzdHJ1Y3Qgc25kX3NiX2NzcF9pbmZvKQogLyogbG9hZCBtaWNyb2NvZGUgdG8gQ1NQICovCi0jZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9MT0FEX0NPREUJX0lPVygnSCcsIDB4MTEsIHN0cnVjdCBzbmRfc2JfY3NwX21pY3JvY29kZSkKKy8qIE5PVEU6IHN0cnVjdCBzbmRfc2JfY3NwX21pY3JvY29kZSBvdmVyZmxvd3MgdGhlIG1heCBzaXplICgxMyBiaXRzKQorICogZGVmaW5lZCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIGxpa2UgTUlQUywgYW5kIGl0IGxlYWRzIHRvIGJ1aWxkIGVycm9ycy4KKyAqICh4ODYgYW5kIGNvIGhhdmUgMTQtYml0IHNpemUsIHRodXMgaXQncyB2YWxpZCwgdGhvdWdoLikKKyAqIEFzIGEgd29ya2Fyb3VuZCBmb3Igc2tpcHBpbmcgdGhlIHNpemUtbGltaXQgY2hlY2ssIGhlcmUgd2UgZG9uJ3QgdXNlIHRoZQorICogbm9ybWFsIF9JT1coKSBtYWNybyBidXQgX0lPQygpIHdpdGggdGhlIG1hbnVhbCBhcmd1bWVudC4KKyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfTE9BRF9DT0RFCVwKKwlfSU9DKF9JT0NfV1JJVEUsICdIJywgMHgxMSwgc2l6ZW9mKHN0cnVjdCBzbmRfc2JfY3NwX21pY3JvY29kZSkpCiAvKiB1bmxvYWQgbWljcm9jb2RlIGZyb20gQ1NQICovCiAjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9VTkxPQURfQ09ERQlfSU8oJ0gnLCAweDEyKQogLyogc3RhcnQgQ1NQICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy5oIGIvaW5jbHVkZS9zb3VuZC9zb2MuaAppbmRleCBmMWRlM2UwLi4zYTRiZDNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLmgKQEAgLTI0OCw4ICsyNDgsNyBAQAogZXh0ZXJuIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIHNvY19hYzk3X29wczsKIAogZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSB7Ci0JU05EX1NPQ19DVVNUT00gPSAxLAotCVNORF9TT0NfSTJDLAorCVNORF9TT0NfSTJDID0gMSwKIAlTTkRfU09DX1NQSSwKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAppbmRleCBlMDk1OTJkLi41Y2UyYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCkBAIC0yNiw3ICsyNiw3IEBACiAJCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCiAJCV9fZmllbGQoCXVpZF90LAl1aWQJCQkpCiAJCV9fZmllbGQoCWdpZF90LAlnaWQJCQkpCi0JCV9fZmllbGQoCWJsa2NudF90LCBibG9ja3MJCSkKKwkJX19maWVsZCgJX191NjQsIGJsb2NrcwkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC00MCw5ICs0MCw4IEBACiAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IG1vZGUgMCVvIHVpZCAldSBnaWQgJXUgYmxvY2tzICVsbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT51aWQsIF9fZW50cnktPmdpZCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5ibG9ja3MpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+bW9kZSwKKwkJICBfX2VudHJ5LT51aWQsIF9fZW50cnktPmdpZCwgX19lbnRyeS0+YmxvY2tzKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9yZXF1ZXN0X2lub2RlLApAQCAtMTc4LDcgKzE3Nyw3IEBACiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBuZXdfc2l6ZSAlbGxkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKGxvbmcgbG9uZykgX19lbnRyeS0+bmV3X3NpemUpCisJCSAgX19lbnRyeS0+bmV3X3NpemUpCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGV4dDRfX3dyaXRlX2JlZ2luLApAQCAtMjA0LDcgKzIwMyw3IEBACiAJCV9fZW50cnktPmZsYWdzCT0gZmxhZ3M7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGZsYWdzICV1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGxlbiAldSBmbGFncyAldSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5mbGFncykKQEAgLTI0OCw3ICsyNDcsNyBAQAogCQlfX2VudHJ5LT5jb3BpZWQJPSBjb3BpZWQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGNvcGllZCAldSIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJXUgY29waWVkICV1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmNvcGllZCkKQEAgLTI4NiwyOSArMjg1LDYgQEAKIAlUUF9BUkdTKGlub2RlLCBwb3MsIGxlbiwgY29waWVkKQogKTsKIAotVFJBQ0VfRVZFTlQoZXh0NF93cml0ZXBhZ2UsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UpLAotCi0JVFBfQVJHUyhpbm9kZSwgcGFnZSksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQotCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAlwZ29mZl90LCBpbmRleAkJCSkKLQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+ZGV2CT0gaW5vZGUtPmlfc2ItPnNfZGV2OwotCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87Ci0JCV9fZW50cnktPmluZGV4CT0gcGFnZS0+aW5kZXg7Ci0JKSwKLQotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcGFnZV9pbmRleCAlbHUiLAotCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+aW5kZXgpCi0pOwotCiBUUkFDRV9FVkVOVChleHQ0X2RhX3dyaXRlcGFnZXMsCiAJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpLAogCkBAIC0zNDEsNyArMzE3LDcgQEAKIAkpLAogCiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBucl90b193cml0ZSAlbGQgcGFnZXNfc2tpcHBlZCAlbGQgIgotCQkgICJyYW5nZV9zdGFydCAlbGx1IHJhbmdlX2VuZCAlbGx1IHN5bmNfbW9kZSAlZCIKKwkJICAicmFuZ2Vfc3RhcnQgJWxsZCByYW5nZV9lbmQgJWxsZCBzeW5jX21vZGUgJWQiCiAJCSAgImZvcl9rdXBkYXRlICVkIHJhbmdlX2N5Y2xpYyAlZCB3cml0ZWJhY2tfaW5kZXggJWx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sIF9fZW50cnktPm5yX3RvX3dyaXRlLApAQCAtNDQ5LDcgKzQyNSwxNCBAQAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcGFnZV9pbmRleCAlbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5pbmRleCkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5kZXgpCispOworCitERUZJTkVfRVZFTlQoZXh0NF9fcGFnZV9vcCwgZXh0NF93cml0ZXBhZ2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcGFnZSAqcGFnZSksCisKKwlUUF9BUkdTKHBhZ2UpCiApOwogCiBERUZJTkVfRVZFTlQoZXh0NF9fcGFnZV9vcCwgZXh0NF9yZWFkcGFnZSwKQEAgLTQ4OSw3ICs0NzIsNyBAQAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcGFnZV9pbmRleCAlbHUgb2Zmc2V0ICVsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPmluZGV4LCBfX2VudHJ5LT5vZmZzZXQpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LCBfX2VudHJ5LT5vZmZzZXQpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2Rpc2NhcmRfYmxvY2tzLApAQCAtNTYyLDEyICs1NDUsMTAgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYSwKLQlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgc3RydWN0IGlub2RlICppbm9kZSwKLQkJIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSwKKwlUUF9QUk9UTyhzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSAqcGEsCiAJCSB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2ssIHVuc2lnbmVkIGludCBjb3VudCksCiAKLQlUUF9BUkdTKHNiLCBpbm9kZSwgcGEsIGJsb2NrLCBjb3VudCksCisJVFBfQVJHUyhwYSwgYmxvY2ssIGNvdW50KSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCkBAIC01NzgsOCArNTU5LDggQEAKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmRldgkJPSBzYi0+c19kZXY7Ci0JCV9fZW50cnktPmlubwkJPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgkJPSBwYS0+cGFfaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5pbm8JCT0gcGEtPnBhX2lub2RlLT5pX2lubzsKIAkJX19lbnRyeS0+YmxvY2sJCT0gYmxvY2s7CiAJCV9fZW50cnktPmNvdW50CQk9IGNvdW50OwogCSksCkBAIC01OTEsMTAgKzU3Miw5IEBACiApOwogCiBUUkFDRV9FVkVOVChleHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEsCi0JVFBfUFJPVE8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSksCisJVFBfUFJPVE8oc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKSwKIAotCVRQX0FSR1Moc2IsIHBhKSwKKwlUUF9BUkdTKHBhKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCkBAIC02MDQsNyArNTg0LDcgQEAKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmRldgkJPSBzYi0+c19kZXY7CisJCV9fZW50cnktPmRldgkJPSBwYS0+cGFfaW5vZGUtPmlfc2ItPnNfZGV2OwogCQlfX2VudHJ5LT5wYV9wc3RhcnQJPSBwYS0+cGFfcHN0YXJ0OwogCQlfX2VudHJ5LT5wYV9sZW4JCT0gcGEtPnBhX2xlbjsKIAkpLApAQCAtNjY2LDEwICs2NDYsMTAgQEAKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgaW50LCBmbGFncwkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsIGxlbgkJKQotCQlfX2ZpZWxkKAlfX3U2NCwgIGxvZ2ljYWwJCQkpCisJCV9fZmllbGQoCV9fdTMyLCAgbG9naWNhbAkJCSkKKwkJX19maWVsZCgJX191MzIsCWxsZWZ0CQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwJbHJpZ2h0CQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJZ29hbAkJCSkKLQkJX19maWVsZCgJX191NjQsCWxsZWZ0CQkJKQotCQlfX2ZpZWxkKAlfX3U2NCwJbHJpZ2h0CQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJcGxlZnQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlwcmlnaHQJCQkpCiAJKSwKQEAgLTY4NywxNyArNjY3LDEzIEBACiAJCV9fZW50cnktPnByaWdodAk9IGFyLT5wcmlnaHQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgZmxhZ3MgJXUgbGVuICV1IGxibGsgJWxsdSBnb2FsICVsbHUgIgotCQkgICJsbGVmdCAlbGx1IGxyaWdodCAlbGx1IHBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUgIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGZsYWdzICV1IGxlbiAldSBsYmxrICV1IGdvYWwgJWxsdSAiCisJCSAgImxsZWZ0ICV1IGxyaWdodCAldSBwbGVmdCAlbGx1IHByaWdodCAlbGx1ICIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPmZsYWdzLCBfX2VudHJ5LT5sZW4sCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bG9naWNhbCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5nb2FsLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmxsZWZ0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmxyaWdodCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wbGVmdCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wcmlnaHQpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+ZmxhZ3MsCisJCSAgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5sb2dpY2FsLCBfX2VudHJ5LT5nb2FsLAorCQkgIF9fZW50cnktPmxsZWZ0LCBfX2VudHJ5LT5scmlnaHQsIF9fZW50cnktPnBsZWZ0LAorCQkgIF9fZW50cnktPnByaWdodCkKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfYWxsb2NhdGVfYmxvY2tzLApAQCAtNzExLDEwICs2ODcsMTAgQEAKIAkJX19maWVsZCgJX191NjQsCWJsb2NrCQkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsIGZsYWdzCQkpCiAJCV9fZmllbGQoCXVuc2lnbmVkIGludCwgbGVuCQkpCi0JCV9fZmllbGQoCV9fdTY0LCAgbG9naWNhbAkJCSkKKwkJX19maWVsZCgJX191MzIsICBsb2dpY2FsCQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwJbGxlZnQJCQkpCisJCV9fZmllbGQoCV9fdTMyLAlscmlnaHQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlnb2FsCQkJKQotCQlfX2ZpZWxkKAlfX3U2NCwJbGxlZnQJCQkpCi0JCV9fZmllbGQoCV9fdTY0LAlscmlnaHQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlwbGVmdAkJCSkKIAkJX19maWVsZCgJX191NjQsCXByaWdodAkJCSkKIAkpLApAQCAtNzMzLDE3ICs3MDksMTMgQEAKIAkJX19lbnRyeS0+cHJpZ2h0CT0gYXItPnByaWdodDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBmbGFncyAldSBsZW4gJXUgYmxvY2sgJWxsdSBsYmxrICVsbHUgIgotCQkgICJnb2FsICVsbHUgbGxlZnQgJWxsdSBscmlnaHQgJWxsdSBwbGVmdCAlbGx1IHByaWdodCAlbGx1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGZsYWdzICV1IGxlbiAldSBibG9jayAlbGx1IGxibGsgJXUgIgorCQkgICJnb2FsICVsbHUgbGxlZnQgJXUgbHJpZ2h0ICV1IHBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5mbGFncywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5ibG9jaywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5sb2dpY2FsLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmdvYWwsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bGxlZnQsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bHJpZ2h0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBsZWZ0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnByaWdodCkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5mbGFncywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmJsb2NrLCBfX2VudHJ5LT5sb2dpY2FsLAorCQkgIF9fZW50cnktPmdvYWwsICBfX2VudHJ5LT5sbGVmdCwgX19lbnRyeS0+bHJpZ2h0LAorCQkgIF9fZW50cnktPnBsZWZ0LCBfX2VudHJ5LT5wcmlnaHQpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2ZyZWVfYmxvY2tzLApAQCAtNzU1LDEwICs3MjcsMTAgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKCAgICAgIHVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlibG9jawkJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY291bnQJCSkKLQkJX19maWVsZCgJIGludCwJZmxhZ3MJCQkpCisJCV9fZmllbGQoCWludCwJZmxhZ3MJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtNzk4LDcgKzc3MCw3IEBACiAJCV9fZW50cnktPnBhcmVudAkJPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX2lubzsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCBwYXJlbnQgJWxkIGRhdGFzeW5jICVkICIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwYXJlbnQgJWx1IGRhdGFzeW5jICVkICIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5wYXJlbnQsIF9fZW50cnktPmRhdGFzeW5jKQpAQCAtODIxLDcgKzc5Myw3IEBACiAJCV9fZW50cnktPmRldgkJPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbGQgcmV0ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgIF9fZW50cnktPnJldCkKQEAgLTEwMDUsNyArOTc3LDcgQEAKIAkJX19lbnRyeS0+cmVzdWx0X2xlbgk9IGxlbjsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vZGUgJWx1IGV4dGVudCAldS8lZC8ldSAiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlub2RlICVsdSBleHRlbnQgJXUvJWQvJWQgIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgX19lbnRyeS0+cmVzdWx0X2dyb3VwLCBfX2VudHJ5LT5yZXN1bHRfc3RhcnQsCkBAIC0xMDkzLDcgKzEwNjUsNyBAQAogCQkgICJhbGxvY2F0ZWRfbWV0YV9ibG9ja3MgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5tb2RlLCAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+aV9ibG9ja3MsCisJCSAgX19lbnRyeS0+bW9kZSwgX19lbnRyeS0+aV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+dXNlZF9ibG9ja3MsIF9fZW50cnktPnJlc2VydmVkX2RhdGFfYmxvY2tzLAogCQkgIF9fZW50cnktPnJlc2VydmVkX21ldGFfYmxvY2tzLCBfX2VudHJ5LT5hbGxvY2F0ZWRfbWV0YV9ibG9ja3MpCiApOwpAQCAtMTEyNyw3ICsxMDk5LDcgQEAKIAkJICAicmVzZXJ2ZWRfZGF0YV9ibG9ja3MgJWQgcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5tb2RlLCAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5pX2Jsb2NrcywKKwkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5pX2Jsb2NrcywKIAkJICBfX2VudHJ5LT5tZF9uZWVkZWQsIF9fZW50cnktPnJlc2VydmVkX2RhdGFfYmxvY2tzLAogCQkgIF9fZW50cnktPnJlc2VydmVkX21ldGFfYmxvY2tzKQogKTsKQEAgLTExNjQsNyArMTEzNiw3IEBACiAJCSAgImFsbG9jYXRlZF9tZXRhX2Jsb2NrcyAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPm1vZGUsICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmlfYmxvY2tzLAorCQkgIF9fZW50cnktPm1vZGUsIF9fZW50cnktPmlfYmxvY2tzLAogCQkgIF9fZW50cnktPmZyZWVkX2Jsb2NrcywgX19lbnRyeS0+cmVzZXJ2ZWRfZGF0YV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+cmVzZXJ2ZWRfbWV0YV9ibG9ja3MsIF9fZW50cnktPmFsbG9jYXRlZF9tZXRhX2Jsb2NrcykKICk7CkBAIC0xMjM5LDE0ICsxMjExLDE1IEBACiAJCV9fZW50cnktPnJ3CT0gcnc7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbHUgbGVuICVsdSBydyAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJWx1IHJ3ICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPnJ3KQorCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5ydykKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZGlyZWN0X0lPX2V4aXQsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBydywgaW50IHJldCksCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4sCisJCSBpbnQgcncsIGludCByZXQpLAogCiAJVFBfQVJHUyhpbm9kZSwgb2Zmc2V0LCBsZW4sIHJ3LCByZXQpLAogCkBAIC0xMjY4LDEwICsxMjQxLDEwIEBACiAJCV9fZW50cnktPnJldAk9IHJldDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsdSBsZW4gJWx1IHJ3ICVkIHJldCAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJWx1IHJ3ICVkIHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLAorCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLAogCQkgIF9fZW50cnktPnJ3LCBfX2VudHJ5LT5yZXQpCiApOwogCkBAIC0xMjk2LDE1ICsxMjY5LDE1IEBACiAJCV9fZW50cnktPm1vZGUJPSBtb2RlOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHBvcyAlbGx1IGxlbiAlbGx1IG1vZGUgJWQiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbGQgbGVuICVsbGQgbW9kZSAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBvcywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5sZW4sIF9fZW50cnktPm1vZGUpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+cG9zLAorCQkgIF9fZW50cnktPmxlbiwgX19lbnRyeS0+bW9kZSkKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZmFsbG9jYXRlX2V4aXQsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgaW50IG1heF9ibG9ja3MsIGludCByZXQpLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCSB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywgaW50IHJldCksCiAKIAlUUF9BUkdTKGlub2RlLCBvZmZzZXQsIG1heF9ibG9ja3MsIHJldCksCiAKQEAgLTEzMTIsNyArMTI4NSw3IEBACiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWxvZmZfdCwJcG9zCQkJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCwJYmxvY2tzCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwgCXJldAkJCSkKIAkpLAogCkBAIC0xMzI0LDEwICsxMjk3LDEwIEBACiAJCV9fZW50cnktPnJldAk9IHJldDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCBwb3MgJWxsdSBibG9ja3MgJWQgcmV0ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGJsb2NrcyAldSByZXQgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wb3MsIF9fZW50cnktPmJsb2NrcywKKwkJICBfX2VudHJ5LT5wb3MsIF9fZW50cnktPmJsb2NrcywKIAkJICBfX2VudHJ5LT5yZXQpCiApOwogCkBAIC0xMzUwLDcgKzEzMjMsNyBAQAogCQlfX2VudHJ5LT5kZXYJCT0gZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2RldjsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCBzaXplICVsbGQgcGFyZW50ICVsZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBzaXplICVsbGQgcGFyZW50ICVsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5zaXplLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5wYXJlbnQpCkBAIC0xMzczLDcgKzEzNDYsNyBAQAogCQlfX2VudHJ5LT5yZXQJCT0gcmV0OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHJldCAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSByZXQgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5yZXQpCkBAIC0xMzg3LDcgKzEzNjAsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWlub190LCAgCWlubwkJKQogCQlfX2ZpZWxkKAlkZXZfdCwgIAlkZXYJCSkKLQkJX19maWVsZCgJYmxrY250X3QsCWJsb2NrcwkJKQorCQlfX2ZpZWxkKAlfX3U2NCwJCWJsb2NrcwkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTEzOTYsOSArMTM2OSw5IEBACiAJCV9fZW50cnktPmJsb2Nrcwk9IGlub2RlLT5pX2Jsb2NrczsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBibG9ja3MgJWx1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGJsb2NrcyAlbGx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAotCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5ibG9ja3MpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+YmxvY2tzKQogKTsKIAogREVGSU5FX0VWRU5UKGV4dDRfX3RydW5jYXRlLCBleHQ0X3RydW5jYXRlX2VudGVyLApAQCAtMTQxNyw3ICsxMzkwLDcgQEAKIAogREVDTEFSRV9FVkVOVF9DTEFTUyhleHQ0X19tYXBfYmxvY2tzX2VudGVyLAogCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibGssCi0JCSB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzKSwKKwkJIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBmbGFncyksCiAKIAlUUF9BUkdTKGlub2RlLCBsYmxrLCBsZW4sIGZsYWdzKSwKIApAQCAtMTQyNSw4ICsxMzk4LDggQEAKIAkJX19maWVsZCgJaW5vX3QsICAJaW5vCQkpCiAJCV9fZmllbGQoCWRldl90LCAgCWRldgkJKQogCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCwJbGVuCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkLAlmbGFncwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWxlbgkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWZsYWdzCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtMTQ0MCw3ICsxNDEzLDcgQEAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgbGVuICV1IGZsYWdzICV1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5sYmxrLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzKQorCQkgIF9fZW50cnktPmxibGssIF9fZW50cnktPmxlbiwgX19lbnRyeS0+ZmxhZ3MpCiApOwogCiBERUZJTkVfRVZFTlQoZXh0NF9fbWFwX2Jsb2Nrc19lbnRlciwgZXh0NF9leHRfbWFwX2Jsb2Nrc19lbnRlciwKQEAgLTE0NTksNyArMTQzMiw3IEBACiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoZXh0NF9fbWFwX2Jsb2Nrc19leGl0LAogCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibGssCi0JCSBleHQ0X2ZzYmxrX3QgcGJsaywgdW5zaWduZWQgbGVuLCBpbnQgcmV0KSwKKwkJIGV4dDRfZnNibGtfdCBwYmxrLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgcmV0KSwKIAogCVRQX0FSR1MoaW5vZGUsIGxibGssIHBibGssIGxlbiwgcmV0KSwKIApAQCAtMTQ2OCw3ICsxNDQxLDcgQEAKIAkJX19maWVsZCgJZGV2X3QsCQlkZXYJCSkKIAkJX19maWVsZCgJZXh0NF9sYmxrX3QsCWxibGsJCSkKIAkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlwYmxrCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkLAlsZW4JCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JCSkKIAkJX19maWVsZCgJaW50LAkJcmV0CQkpCiAJKSwKIApAQCAtMTQ4NCw3ICsxNDU3LDcgQEAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgcGJsayAlbGx1IGxlbiAldSByZXQgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAodW5zaWduZWQpIF9fZW50cnktPmxibGssICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBibGssCisJCSAgX19lbnRyeS0+bGJsaywgX19lbnRyeS0+cGJsaywKIAkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPnJldCkKICk7CiAKQEAgLTE1MjQsNyArMTQ5Nyw3IEBACiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBsYmxrICV1IHBibGsgJWxsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaykKKwkJICBfX2VudHJ5LT5sYmxrLCBfX2VudHJ5LT5wYmxrKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9sb2FkX2lub2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaAppbmRleCBhZTA0NWNhLi4xYzA5ODIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaApAQCAtMjAsNyArMjAsOCBAQAogCQkJIHNvZnRpcnFfbmFtZShCTE9DS19JT1BPTEwpLAlcCiAJCQkgc29mdGlycV9uYW1lKFRBU0tMRVQpLAkJXAogCQkJIHNvZnRpcnFfbmFtZShTQ0hFRCksCQlcCi0JCQkgc29mdGlycV9uYW1lKEhSVElNRVIpKQorCQkJIHNvZnRpcnFfbmFtZShIUlRJTUVSKSwJCVwKKwkJCSBzb2Z0aXJxX25hbWUoUkNVKSkKIAogLyoqCiAgKiBpcnFfaGFuZGxlcl9lbnRyeSAtIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGlycSBhY3Rpb24gaGFuZGxlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbmV0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9uZXQuaAppbmRleCA1ZjI0N2Y1Li5mOTk2NDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9uZXQuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9uZXQuaApAQCAtMTIsMjIgKzEyLDI0IEBACiBUUkFDRV9FVkVOVChuZXRfZGV2X3htaXQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgaW50IHJjKSwKKwkJIGludCByYywKKwkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSB1bnNpZ25lZCBpbnQgc2tiX2xlbiksCiAKLQlUUF9BUkdTKHNrYiwgcmMpLAorCVRQX0FSR1Moc2tiLCByYywgZGV2LCBza2JfbGVuKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCXZvaWQgKiwJCXNrYmFkZHIJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JCSkKIAkJX19maWVsZCgJaW50LAkJcmMJCSkKLQkJX19zdHJpbmcoCW5hbWUsCQlza2ItPmRldi0+bmFtZQkpCisJCV9fc3RyaW5nKAluYW1lLAkJZGV2LT5uYW1lCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPnNrYmFkZHIgPSBza2I7Ci0JCV9fZW50cnktPmxlbiA9IHNrYi0+bGVuOworCQlfX2VudHJ5LT5sZW4gPSBza2JfbGVuOwogCQlfX2VudHJ5LT5yYyA9IHJjOwotCQlfX2Fzc2lnbl9zdHIobmFtZSwgc2tiLT5kZXYtPm5hbWUpOworCQlfX2Fzc2lnbl9zdHIobmFtZSwgZGV2LT5uYW1lKTsKIAkpLAogCiAJVFBfcHJpbnRrKCJkZXY9JXMgc2tiYWRkcj0lcCBsZW49JXUgcmM9JWQiLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdm1zY2FuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAppbmRleCBlYTQyMmFhLi5iMmMzM2JkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaApAQCAtNiw2ICs2LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgImdmcGZsYWdzLmgiCiAKICNkZWZpbmUgUkVDTEFJTV9XQl9BTk9OCQkweDAwMDF1CkBAIC0zMTAsNiArMzEyLDg3IEBACiAJCXNob3dfcmVjbGFpbV9mbGFncyhfX2VudHJ5LT5yZWNsYWltX2ZsYWdzKSkKICk7CiAKK1RSQUNFX0VWRU5UKHJlcGxhY2Vfc3dhcF90b2tlbiwKKwlUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICpvbGRfbW0sCisJCSBzdHJ1Y3QgbW1fc3RydWN0ICpuZXdfbW0pLAorCisJVFBfQVJHUyhvbGRfbW0sIG5ld19tbSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QqLAlvbGRfbW0pCisJCV9fZmllbGQodW5zaWduZWQgaW50LAkJb2xkX3ByaW8pCisJCV9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCosCW5ld19tbSkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsCQluZXdfcHJpbykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm9sZF9tbSAgID0gb2xkX21tOworCQlfX2VudHJ5LT5vbGRfcHJpbyA9IG9sZF9tbSA/IG9sZF9tbS0+dG9rZW5fcHJpb3JpdHkgOiAwOworCQlfX2VudHJ5LT5uZXdfbW0gICA9IG5ld19tbTsKKwkJX19lbnRyeS0+bmV3X3ByaW8gPSBuZXdfbW0tPnRva2VuX3ByaW9yaXR5OworCSksCisKKwlUUF9wcmludGsoIm9sZF90b2tlbl9tbT0lcCBvbGRfcHJpbz0ldSBuZXdfdG9rZW5fbW09JXAgbmV3X3ByaW89JXUiLAorCQkgIF9fZW50cnktPm9sZF9tbSwgX19lbnRyeS0+b2xkX3ByaW8sCisJCSAgX19lbnRyeS0+bmV3X21tLCBfX2VudHJ5LT5uZXdfcHJpbykKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MocHV0X3N3YXBfdG9rZW5fdGVtcGxhdGUsCisJVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbSksCisKKwlUUF9BUkdTKHN3YXBfdG9rZW5fbW0pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChzdHJ1Y3QgbW1fc3RydWN0Kiwgc3dhcF90b2tlbl9tbSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnN3YXBfdG9rZW5fbW0gPSBzd2FwX3Rva2VuX21tOworCSksCisKKwlUUF9wcmludGsoInRva2VuX21tPSVwIiwgX19lbnRyeS0+c3dhcF90b2tlbl9tbSkKKyk7CisKK0RFRklORV9FVkVOVChwdXRfc3dhcF90b2tlbl90ZW1wbGF0ZSwgcHV0X3N3YXBfdG9rZW4sCisJVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbSksCisJVFBfQVJHUyhzd2FwX3Rva2VuX21tKQorKTsKKworREVGSU5FX0VWRU5UX0NPTkRJVElPTihwdXRfc3dhcF90b2tlbl90ZW1wbGF0ZSwgZGlzYWJsZV9zd2FwX3Rva2VuLAorCVRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW0pLAorCVRQX0FSR1Moc3dhcF90b2tlbl9tbSksCisJVFBfQ09ORElUSU9OKHN3YXBfdG9rZW5fbW0gIT0gTlVMTCkKKyk7CisKK1RSQUNFX0VWRU5UX0NPTkRJVElPTih1cGRhdGVfc3dhcF90b2tlbl9wcmlvcml0eSwKKwlUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJIHVuc2lnbmVkIGludCBvbGRfcHJpbywKKwkJIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW0pLAorCisJVFBfQVJHUyhtbSwgb2xkX3ByaW8sIHN3YXBfdG9rZW5fbW0pLAorCisJVFBfQ09ORElUSU9OKG1tLT50b2tlbl9wcmlvcml0eSAhPSBvbGRfcHJpbyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QqLCBtbSkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsIG9sZF9wcmlvKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwgbmV3X3ByaW8pCisJCV9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCosIHN3YXBfdG9rZW5fbW0pCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBzd2FwX3Rva2VuX3ByaW8pCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5tbQkJPSBtbTsKKwkJX19lbnRyeS0+b2xkX3ByaW8JPSBvbGRfcHJpbzsKKwkJX19lbnRyeS0+bmV3X3ByaW8JPSBtbS0+dG9rZW5fcHJpb3JpdHk7CisJCV9fZW50cnktPnN3YXBfdG9rZW5fbW0JPSBzd2FwX3Rva2VuX21tOworCQlfX2VudHJ5LT5zd2FwX3Rva2VuX3ByaW8gPSBzd2FwX3Rva2VuX21tID8gc3dhcF90b2tlbl9tbS0+dG9rZW5fcHJpb3JpdHkgOiAwOworCSksCisKKwlUUF9wcmludGsoIm1tPSVwIG9sZF9wcmlvPSV1IG5ld19wcmlvPSV1IHN3YXBfdG9rZW5fbW09JXAgdG9rZW5fcHJpbz0ldSIsCisJCSAgX19lbnRyeS0+bW0sIF9fZW50cnktPm9sZF9wcmlvLCBfX2VudHJ5LT5uZXdfcHJpbywKKwkJICBfX2VudHJ5LT5zd2FwX3Rva2VuX21tLCBfX2VudHJ5LT5zd2FwX3Rva2VuX3ByaW8pCispOwogCiAjZW5kaWYgLyogX1RSQUNFX1ZNU0NBTl9IICovCiAKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBlYmFmYWM0Li40MTJjMjFiIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0xOSw3ICsxOSw2IEBACiBjb25maWcgQ09OU1RSVUNUT1JTCiAJYm9vbAogCWRlcGVuZHMgb24gIVVNTAotCWRlZmF1bHQgeQogCiBjb25maWcgSEFWRV9JUlFfV09SSwogCWJvb2wKQEAgLTIwNCw2ICsyMDMsMTUgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBERUZBVUxUX0hPU1ROQU1FCisJc3RyaW5nICJEZWZhdWx0IGhvc3RuYW1lIgorCWRlZmF1bHQgIihub25lKSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IHN5c3RlbSBob3N0bmFtZSBiZWZvcmUgdXNlcnNwYWNlCisJICBjYWxscyBzZXRob3N0bmFtZSgyKS4gVGhlIGtlcm5lbCB0cmFkaXRpb25hbGx5IHVzZXMgIihub25lKSIgaGVyZSwKKwkgIGJ1dCB5b3UgbWF5IHdpc2ggdG8gdXNlIGEgZGlmZmVyZW50IGRlZmF1bHQgaGVyZSB0byBtYWtlIGEgbWluaW1hbAorCSAgc3lzdGVtIG1vcmUgdXNhYmxlIHdpdGggbGVzcyBjb25maWd1cmF0aW9uLgorCiBjb25maWcgU1dBUAogCWJvb2wgIlN1cHBvcnQgZm9yIHBhZ2luZyBvZiBhbm9ueW1vdXMgbWVtb3J5IChzd2FwKSIKIAlkZXBlbmRzIG9uIE1NVSAmJiBCTE9DSwpkaWZmIC0tZ2l0IGEvaW5pdC9jYWxpYnJhdGUuYyBiL2luaXQvY2FsaWJyYXRlLmMKaW5kZXggY2ZkNzAwMC4uYWFlMmY0MCAxMDA2NDQKLS0tIGEvaW5pdC9jYWxpYnJhdGUuYworKysgYi9pbml0L2NhbGlicmF0ZS5jCkBAIC05Myw5ICs5Myw2IEBACiAJCSAqIElmIHRoZSB1cHBlciBsaW1pdCBhbmQgbG93ZXIgbGltaXQgb2YgdGhlIHRpbWVyX3JhdGUgaXMKIAkJICogPj0gMTIuNSUgYXBhcnQsIHJlZG8gY2FsaWJyYXRpb24uCiAJCSAqLwotCQlwcmludGsoS0VSTl9ERUJVRyAiY2FsaWJyYXRlX2RlbGF5X2RpcmVjdCgpIHRpbWVyX3JhdGVfbWF4PSVsdSAiCi0JCQkgICAgInRpbWVyX3JhdGVfbWluPSVsdSBwcmVfc3RhcnQ9JWx1IHByZV9lbmQ9JWx1XG4iLAotCQkJICB0aW1lcl9yYXRlX21heCwgdGltZXJfcmF0ZV9taW4sIHByZV9zdGFydCwgcHJlX2VuZCk7CiAJCWlmIChzdGFydCA+PSBwb3N0X2VuZCkKIAkJCXByaW50ayhLRVJOX05PVElDRSAiY2FsaWJyYXRlX2RlbGF5X2RpcmVjdCgpIGlnbm9yaW5nICIKIAkJCQkJInRpbWVyX3JhdGUgYXMgd2UgaGFkIGEgVFNDIHdyYXAgYXJvdW5kIgpAQCAtMjQ4LDMwICsyNDUsMzIgQEAKIAogdm9pZCBfX2NwdWluaXQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBscGo7CiAJc3RhdGljIGJvb2wgcHJpbnRlZDsKIAogCWlmIChwcmVzZXRfbHBqKSB7Ci0JCWxvb3BzX3Blcl9qaWZmeSA9IHByZXNldF9scGo7CisJCWxwaiA9IHByZXNldF9scGo7CiAJCWlmICghcHJpbnRlZCkKIAkJCXByX2luZm8oIkNhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpICIKIAkJCQkicHJlc2V0IHZhbHVlLi4gIik7CiAJfSBlbHNlIGlmICgoIXByaW50ZWQpICYmIGxwal9maW5lKSB7Ci0JCWxvb3BzX3Blcl9qaWZmeSA9IGxwal9maW5lOworCQlscGogPSBscGpfZmluZTsKIAkJcHJfaW5mbygiQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCksICIKIAkJCSJ2YWx1ZSBjYWxjdWxhdGVkIHVzaW5nIHRpbWVyIGZyZXF1ZW5jeS4uICIpOwotCX0gZWxzZSBpZiAoKGxvb3BzX3Blcl9qaWZmeSA9IGNhbGlicmF0ZV9kZWxheV9kaXJlY3QoKSkgIT0gMCkgeworCX0gZWxzZSBpZiAoKGxwaiA9IGNhbGlicmF0ZV9kZWxheV9kaXJlY3QoKSkgIT0gMCkgewogCQlpZiAoIXByaW50ZWQpCiAJCQlwcl9pbmZvKCJDYWxpYnJhdGluZyBkZWxheSB1c2luZyB0aW1lciAiCiAJCQkJInNwZWNpZmljIHJvdXRpbmUuLiAiKTsKIAl9IGVsc2UgewogCQlpZiAoIXByaW50ZWQpCiAJCQlwcl9pbmZvKCJDYWxpYnJhdGluZyBkZWxheSBsb29wLi4uICIpOwotCQlsb29wc19wZXJfamlmZnkgPSBjYWxpYnJhdGVfZGVsYXlfY29udmVyZ2UoKTsKKwkJbHBqID0gY2FsaWJyYXRlX2RlbGF5X2NvbnZlcmdlKCk7CiAJfQogCWlmICghcHJpbnRlZCkKIAkJcHJfY29udCgiJWx1LiUwMmx1IEJvZ29NSVBTIChscGo9JWx1KVxuIiwKLQkJCWxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKLQkJCShsb29wc19wZXJfamlmZnkvKDUwMDAvSFopKSAlIDEwMCwgbG9vcHNfcGVyX2ppZmZ5KTsKKwkJCWxwai8oNTAwMDAwL0haKSwKKwkJCShscGovKDUwMDAvSFopKSAlIDEwMCwgbHBqKTsKIAorCWxvb3BzX3Blcl9qaWZmeSA9IGxwajsKIAlwcmludGVkID0gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggY2FmYmE2Ny4uZDcyMTFmYSAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTU0Miw2ICs1NDIsNyBAQAogCXRpbWVrZWVwaW5nX2luaXQoKTsKIAl0aW1lX2luaXQoKTsKIAlwcm9maWxlX2luaXQoKTsKKwljYWxsX2Z1bmN0aW9uX2luaXQoKTsKIAlpZiAoIWlycXNfZGlzYWJsZWQoKSkKIAkJcHJpbnRrKEtFUk5fQ1JJVCAic3RhcnRfa2VybmVsKCk6IGJ1ZzogaW50ZXJydXB0cyB3ZXJlICIKIAkJCQkgImVuYWJsZWQgZWFybHlcbiIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9jb3JlLmMgYi9rZXJuZWwvZXZlbnRzL2NvcmUuYwppbmRleCBkODYzYjNjLi45ZWZlNzEwIDEwMDY0NAotLS0gYS9rZXJuZWwvZXZlbnRzL2NvcmUuYworKysgYi9rZXJuZWwvZXZlbnRzL2NvcmUuYwpAQCAtNzQwMiwyNiArNzQwMiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX2Nncm91cF9tb3ZlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyB2b2lkCitwZXJmX2Nncm91cF9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJdGFza19mdW5jdGlvbl9jYWxsKHRhc2ssIF9fcGVyZl9jZ3JvdXBfbW92ZSwgdGFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfY2dyb3VwX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JCXN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCWJvb2wgdGhyZWFkZ3JvdXApCi17Ci0JcGVyZl9jZ3JvdXBfbW92ZSh0YXNrKTsKLQlpZiAodGhyZWFkZ3JvdXApIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICpjOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZ0YXNrLT50aHJlYWRfZ3JvdXAsIHRocmVhZF9ncm91cCkgewotCQkJcGVyZl9jZ3JvdXBfbW92ZShjKTsKLQkJfQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHBlcmZfY2dyb3VwX2V4aXQoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwLAogCQlzdHJ1Y3QgY2dyb3VwICpvbGRfY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewpAQCAtNzQzMyw3ICs3NDE5LDcgQEAKIAlpZiAoISh0YXNrLT5mbGFncyAmIFBGX0VYSVRJTkcpKQogCQlyZXR1cm47CiAKLQlwZXJmX2Nncm91cF9tb3ZlKHRhc2spOworCXBlcmZfY2dyb3VwX2F0dGFjaF90YXNrKGNncnAsIHRhc2spOwogfQogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBwZXJmX3N1YnN5cyA9IHsKQEAgLTc0NDIsNiArNzQyOCw2IEBACiAJLmNyZWF0ZQkJPSBwZXJmX2Nncm91cF9jcmVhdGUsCiAJLmRlc3Ryb3kJPSBwZXJmX2Nncm91cF9kZXN0cm95LAogCS5leGl0CQk9IHBlcmZfY2dyb3VwX2V4aXQsCi0JLmF0dGFjaAkJPSBwZXJmX2Nncm91cF9hdHRhY2gsCisJLmF0dGFjaF90YXNrCT0gcGVyZl9jZ3JvdXBfYXR0YWNoX3Rhc2ssCiB9OwogI2VuZGlmIC8qIENPTkZJR19DR1JPVVBfUEVSRiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggMjBhNDA2NC4uZjJiMzIxYiAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC01NjEsMjkgKzU2MSwyOCBAQAogCiAjaWZkZWYgQ09ORklHX01NX09XTkVSCiAvKgotICogVGFzayBwIGlzIGV4aXRpbmcgYW5kIGl0IG93bmVkIG1tLCBsZXRzIGZpbmQgYSBuZXcgb3duZXIgZm9yIGl0CisgKiBBIHRhc2sgaXMgZXhpdGluZy4gICBJZiBpdCBvd25lZCB0aGlzIG1tLCBmaW5kIGEgbmV3IG93bmVyIGZvciB0aGUgbW0uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1tbV9uZWVkX25ld19vd25lcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCS8qCi0JICogSWYgdGhlcmUgYXJlIG90aGVyIHVzZXJzIG9mIHRoZSBtbSBhbmQgdGhlIG93bmVyICh1cykgaXMgZXhpdGluZwotCSAqIHdlIG5lZWQgdG8gZmluZCBhIG5ldyBvd25lciB0byB0YWtlIG9uIHRoZSByZXNwb25zaWJpbGl0eS4KLQkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPD0gMSkKLQkJcmV0dXJuIDA7Ci0JaWYgKG1tLT5vd25lciAhPSBwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQogdm9pZCBtbV91cGRhdGVfbmV4dF9vd25lcihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmMsICpnLCAqcCA9IGN1cnJlbnQ7CiAKIHJldHJ5OgotCWlmICghbW1fbmVlZF9uZXdfb3duZXIobW0sIHApKQorCS8qCisJICogSWYgdGhlIGV4aXRpbmcgb3IgZXhlY2luZyB0YXNrIGlzIG5vdCB0aGUgb3duZXIsIGl0J3MKKwkgKiBzb21lb25lIGVsc2UncyBwcm9ibGVtLgorCSAqLworCWlmIChtbS0+b3duZXIgIT0gcCkKIAkJcmV0dXJuOworCS8qCisJICogVGhlIGN1cnJlbnQgb3duZXIgaXMgZXhpdGluZy9leGVjaW5nIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIKKwkgKiBjYW5kaWRhdGVzLiAgRG8gbm90IGxlYXZlIHRoZSBtbSBwb2ludGluZyB0byBhIHBvc3NpYmx5CisJICogZnJlZWQgdGFzayBzdHJ1Y3R1cmUuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpIDw9IDEpIHsKKwkJbW0tPm93bmVyID0gTlVMTDsKKwkJcmV0dXJuOworCX0KIAogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9nY292L0tjb25maWcgYi9rZXJuZWwvZ2Nvdi9LY29uZmlnCmluZGV4IGI4Y2FkZjcuLjViZjkyNGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9nY292L0tjb25maWcKKysrIGIva2VybmVsL2djb3YvS2NvbmZpZwpAQCAtMiw3ICsyLDggQEAKIAogY29uZmlnIEdDT1ZfS0VSTkVMCiAJYm9vbCAiRW5hYmxlIGdjb3YtYmFzZWQga2VybmVsIHByb2ZpbGluZyIKLQlkZXBlbmRzIG9uIERFQlVHX0ZTICYmIENPTlNUUlVDVE9SUworCWRlcGVuZHMgb24gREVCVUdfRlMKKwlzZWxlY3QgQ09OU1RSVUNUT1JTCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCVRoaXMgb3B0aW9uIGVuYWJsZXMgZ2Nvdi1iYXNlZCBjb2RlIHByb2ZpbGluZyAoZS5nLiBmb3IgY29kZSBjb3ZlcmFnZQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKaW5kZXggMzFhOWRiNy4uM2EyY2FiNCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYworKysgYi9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCkBAIC0xMDEsMTAgKzEwMSwxMCBAQAogfQogCiAvKioKLSAqIGlycV9nY19hY2sgLSBBY2sgcGVuZGluZyBpbnRlcnJ1cHQKKyAqIGlycV9nY19hY2tfc2V0X2JpdCAtIEFjayBwZW5kaW5nIGludGVycnVwdCB2aWEgc2V0dGluZyBiaXQKICAqIEBkOiBpcnFfZGF0YQogICovCi12b2lkIGlycV9nY19hY2soc3RydWN0IGlycV9kYXRhICpkKQordm9pZCBpcnFfZ2NfYWNrX3NldF9iaXQoc3RydWN0IGlycV9kYXRhICpkKQogewogCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXUzMiBtYXNrID0gMSA8PCAoZC0+aXJxIC0gZ2MtPmlycV9iYXNlKTsKQEAgLTExNSw2ICsxMTUsMjAgQEAKIH0KIAogLyoqCisgKiBpcnFfZ2NfYWNrX2Nscl9iaXQgLSBBY2sgcGVuZGluZyBpbnRlcnJ1cHQgdmlhIGNsZWFyaW5nIGJpdAorICogQGQ6IGlycV9kYXRhCisgKi8KK3ZvaWQgaXJxX2djX2Fja19jbHJfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1MzIgbWFzayA9IH4oMSA8PCAoZC0+aXJxIC0gZ2MtPmlycV9iYXNlKSk7CisKKwlpcnFfZ2NfbG9jayhnYyk7CisJaXJxX3JlZ193cml0ZWwobWFzaywgZ2MtPnJlZ19iYXNlICsgY3VyX3JlZ3MoZCktPmFjayk7CisJaXJxX2djX3VubG9jayhnYyk7Cit9CisKKy8qKgogICogaXJxX2djX21hc2tfZGlzYWJsZV9yZWdfYW5kX2Fjay0gTWFzayBhbmQgYWNrIHBlbmRpbmcgaW50ZXJydXB0CiAgKiBAZDogaXJxX2RhdGEKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggOTBjYjU1Zi4uNDcwZDA4YyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC0xMzMsMTIgKzEzMyw2IEBACiAJCXN3aXRjaCAocmVzKSB7CiAJCWNhc2UgSVJRX1dBS0VfVEhSRUFEOgogCQkJLyoKLQkJCSAqIFNldCByZXN1bHQgdG8gaGFuZGxlZCBzbyB0aGUgc3B1cmlvdXMgY2hlY2sKLQkJCSAqIGRvZXMgbm90IHRyaWdnZXIuCi0JCQkgKi8KLQkJCXJlcyA9IElSUV9IQU5ETEVEOwotCi0JCQkvKgogCQkJICogQ2F0Y2ggZHJpdmVycyB3aGljaCByZXR1cm4gV0FLRV9USFJFQUQgYnV0CiAJCQkgKiBkaWQgbm90IHNldCB1cCBhIHRocmVhZCBmdW5jdGlvbgogCQkJICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2lycWRlc2MuYyBiL2tlcm5lbC9pcnEvaXJxZGVzYy5jCmluZGV4IDg4NmU4MDMuLjRjNjBhNTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXJxZGVzYy5jCisrKyBiL2tlcm5lbC9pcnEvaXJxZGVzYy5jCkBAIC0yNTcsMTMgKzI1NywxMSBAQAogCWNvdW50ID0gQVJSQVlfU0laRShpcnFfZGVzYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlkZXNjW2ldLmlycV9kYXRhLmlycSA9IGk7Ci0JCWRlc2NbaV0uaXJxX2RhdGEuY2hpcCA9ICZub19pcnFfY2hpcDsKIAkJZGVzY1tpXS5rc3RhdF9pcnFzID0gYWxsb2NfcGVyY3B1KHVuc2lnbmVkIGludCk7Ci0JCWlycV9zZXR0aW5nc19jbHJfYW5kX3NldChkZXNjLCB+MCwgX0lSUV9ERUZBVUxUX0lOSVRfRkxBR1MpOwotCQlhbGxvY19tYXNrcyhkZXNjICsgaSwgR0ZQX0tFUk5FTCwgbm9kZSk7Ci0JCWRlc2Nfc21wX2luaXQoZGVzYyArIGksIG5vZGUpOworCQlhbGxvY19tYXNrcygmZGVzY1tpXSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJCXJhd19zcGluX2xvY2tfaW5pdCgmZGVzY1tpXS5sb2NrKTsKIAkJbG9ja2RlcF9zZXRfY2xhc3MoJmRlc2NbaV0ubG9jaywgJmlycV9kZXNjX2xvY2tfY2xhc3MpOworCQlkZXNjX3NldF9kZWZhdWx0cyhpLCAmZGVzY1tpXSwgbm9kZSk7CiAJfQogCXJldHVybiBhcmNoX2Vhcmx5X2lycV9pbml0KCk7CiB9CkBAIC0zNDYsNiArMzQ0LDEyIEBACiAJaWYgKCFjbnQpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKGlycSA+PSAwKSB7CisJCWlmIChmcm9tID4gaXJxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZyb20gPSBpcnE7CisJfQorCiAJbXV0ZXhfbG9jaygmc3BhcnNlX2lycV9sb2NrKTsKIAogCXN0YXJ0ID0gYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWEoYWxsb2NhdGVkX2lycXMsIElSUV9CSVRNQVBfQklUUywKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IGY3Y2UwMDIuLjBhNzg0MGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTQ5MSw2ICs0OTEsOSBAQAogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9nZXRfZGVzY19idXNsb2NrKGlycSwgJmZsYWdzKTsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghZGVzYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiB3YWtldXAtY2FwYWJsZSBpcnFzIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBkcml2ZXJzIHRoYXQKIAkgKiBkb24ndCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgc2xlZXAgbW9kZSBiZWhhdmlvcnMuCiAJICovCkBAIC03MjMsMTMgKzcyNiwxNiBAQAogICogY29udGV4dC4gU28gd2UgbmVlZCB0byBkaXNhYmxlIGJoIGhlcmUgdG8gYXZvaWQgZGVhZGxvY2tzIGFuZCBvdGhlcgogICogc2lkZSBlZmZlY3RzLgogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGlycXJldHVybl90CiBpcnFfZm9yY2VkX3RocmVhZF9mbihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKIHsKKwlpcnFyZXR1cm5fdCByZXQ7CisKIAlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JYWN0aW9uLT50aHJlYWRfZm4oYWN0aW9uLT5pcnEsIGFjdGlvbi0+ZGV2X2lkKTsKKwlyZXQgPSBhY3Rpb24tPnRocmVhZF9mbihhY3Rpb24tPmlycSwgYWN0aW9uLT5kZXZfaWQpOwogCWlycV9maW5hbGl6ZV9vbmVzaG90KGRlc2MsIGFjdGlvbiwgZmFsc2UpOwogCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC03MzcsMTAgKzc0MywxNCBAQAogICogcHJlZW10aWJsZSAtIG1hbnkgb2YgdGhlbSBuZWVkIHRvIHNsZWVwIGFuZCB3YWl0IGZvciBzbG93IGJ1c3NlcyB0bwogICogY29tcGxldGUuCiAgKi8KLXN0YXRpYyB2b2lkIGlycV90aHJlYWRfZm4oc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pCitzdGF0aWMgaXJxcmV0dXJuX3QgaXJxX3RocmVhZF9mbihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsCisJCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKIHsKLQlhY3Rpb24tPnRocmVhZF9mbihhY3Rpb24tPmlycSwgYWN0aW9uLT5kZXZfaWQpOworCWlycXJldHVybl90IHJldDsKKworCXJldCA9IGFjdGlvbi0+dGhyZWFkX2ZuKGFjdGlvbi0+aXJxLCBhY3Rpb24tPmRldl9pZCk7CiAJaXJxX2ZpbmFsaXplX29uZXNob3QoZGVzYywgYWN0aW9uLCBmYWxzZSk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTc1Myw3ICs3NjMsOCBAQAogCX07CiAJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uID0gZGF0YTsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhhY3Rpb24tPmlycSk7Ci0Jdm9pZCAoKmhhbmRsZXJfZm4pKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKKwlpcnFyZXR1cm5fdCAoKmhhbmRsZXJfZm4pKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKKwkJCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbik7CiAJaW50IHdha2U7CiAKIAlpZiAoZm9yY2VfaXJxdGhyZWFkcyAmIHRlc3RfYml0KElSUVRGX0ZPUkNFRF9USFJFQUQsCkBAIC03ODMsOCArNzk0LDEyIEBACiAJCQlkZXNjLT5pc3RhdGUgfD0gSVJRU19QRU5ESU5HOwogCQkJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CiAJCX0gZWxzZSB7CisJCQlpcnFyZXR1cm5fdCBhY3Rpb25fcmV0OworCiAJCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKLQkJCWhhbmRsZXJfZm4oZGVzYywgYWN0aW9uKTsKKwkJCWFjdGlvbl9yZXQgPSBoYW5kbGVyX2ZuKGRlc2MsIGFjdGlvbik7CisJCQlpZiAoIW5vaXJxZGVidWcpCisJCQkJbm90ZV9pbnRlcnJ1cHQoYWN0aW9uLT5pcnEsIGRlc2MsIGFjdGlvbl9yZXQpOwogCQl9CiAKIAkJd2FrZSA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJmRlc2MtPnRocmVhZHNfYWN0aXZlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwppbmRleCBkZmJkNTUwLi5hYTU3ZDVkIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKKysrIGIva2VybmVsL2lycS9zcHVyaW91cy5jCkBAIC0xNjcsNiArMTY3LDEzIEBACiAJCSAgamlmZmllcyArIFBPTExfU1BVUklPVVNfSVJRX0lOVEVSVkFMKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYmFkX2FjdGlvbl9yZXQoaXJxcmV0dXJuX3QgYWN0aW9uX3JldCkKK3sKKwlpZiAobGlrZWx5KGFjdGlvbl9yZXQgPD0gKElSUV9IQU5ETEVEIHwgSVJRX1dBS0VfVEhSRUFEKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCiAvKgogICogSWYgOTksOTAwIG9mIHRoZSBwcmV2aW91cyAxMDAsMDAwIGludGVycnVwdHMgaGF2ZSBub3QgYmVlbiBoYW5kbGVkCiAgKiB0aGVuIGFzc3VtZSB0aGF0IHRoZSBJUlEgaXMgc3R1Y2sgaW4gc29tZSBtYW5uZXIuIERyb3AgYSBkaWFnbm9zdGljCkBAIC0xODIsNyArMTg5LDcgQEAKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChhY3Rpb25fcmV0ICE9IElSUV9IQU5ETEVEICYmIGFjdGlvbl9yZXQgIT0gSVJRX05PTkUpIHsKKwlpZiAoYmFkX2FjdGlvbl9yZXQoYWN0aW9uX3JldCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcnEgZXZlbnQgJWQ6IGJvZ3VzIHJldHVybiB2YWx1ZSAleFxuIiwKIAkJCQlpcnEsIGFjdGlvbl9yZXQpOwogCX0gZWxzZSB7CkBAIC0yMDEsMTAgKzIwOCwxMSBAQAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCWFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKIAl3aGlsZSAoYWN0aW9uKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWzwlcD5dIiwgYWN0aW9uLT5oYW5kbGVyKTsKLQkJcHJpbnRfc3ltYm9sKCIgKCVzKSIsCi0JCQkodW5zaWduZWQgbG9uZylhY3Rpb24tPmhhbmRsZXIpOwotCQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiWzwlcD5dICVwZiIsIGFjdGlvbi0+aGFuZGxlciwgYWN0aW9uLT5oYW5kbGVyKTsKKwkJaWYgKGFjdGlvbi0+dGhyZWFkX2ZuKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiIHRocmVhZGVkIFs8JXA+XSAlcGYiLAorCQkJCQlhY3Rpb24tPnRocmVhZF9mbiwgYWN0aW9uLT50aHJlYWRfZm4pOworCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCQlhY3Rpb24gPSBhY3Rpb24tPm5leHQ7CiAJfQogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CkBAIC0yNjIsNyArMjcwLDE2IEBACiAJaWYgKGRlc2MtPmlzdGF0ZSAmIElSUVNfUE9MTF9JTlBST0dSRVNTKQogCQlyZXR1cm47CiAKLQlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfSEFORExFRCkpIHsKKwkvKiB3ZSBnZXQgaGVyZSBhZ2FpbiB2aWEgdGhlIHRocmVhZGVkIGhhbmRsZXIgKi8KKwlpZiAoYWN0aW9uX3JldCA9PSBJUlFfV0FLRV9USFJFQUQpCisJCXJldHVybjsKKworCWlmIChiYWRfYWN0aW9uX3JldChhY3Rpb25fcmV0KSkgeworCQlyZXBvcnRfYmFkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KGFjdGlvbl9yZXQgPT0gSVJRX05PTkUpKSB7CiAJCS8qCiAJCSAqIElmIHdlIGFyZSBzZWVpbmcgb25seSB0aGUgb2RkIHNwdXJpb3VzIElSUSBjYXVzZWQgYnkKIAkJICogYnVzIGFzeW5jaHJvbmljaXR5IHRoZW4gZG9uJ3QgZXZlbnR1YWxseSB0cmlnZ2VyIGFuIGVycm9yLApAQCAtMjc0LDggKzI5MSw2IEBACiAJCWVsc2UKIAkJCWRlc2MtPmlycXNfdW5oYW5kbGVkKys7CiAJCWRlc2MtPmxhc3RfdW5oYW5kbGVkID0gamlmZmllczsKLQkJaWYgKHVubGlrZWx5KGFjdGlvbl9yZXQgIT0gSVJRX05PTkUpKQotCQkJcmVwb3J0X2JhZF9pcnEoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAl9CiAKIAlpZiAodW5saWtlbHkodHJ5X21pc3JvdXRlZF9pcnEoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KSkpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9qdW1wX2xhYmVsLmMgYi9rZXJuZWwvanVtcF9sYWJlbC5jCmluZGV4IGZhMjdlNzUuLmE4Y2U0NTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMzc1LDE1ICszNzUsMTkgQEAKIAogc3RhdGljIHZvaWQganVtcF9sYWJlbF91cGRhdGUoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXksIGludCBlbmFibGUpCiB7Ci0Jc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5ID0ga2V5LT5lbnRyaWVzOwotCi0JLyogaWYgdGhlcmUgYXJlIG5vIHVzZXJzLCBlbnRyeSBjYW4gYmUgTlVMTCAqLwotCWlmIChlbnRyeSkKLQkJX19qdW1wX2xhYmVsX3VwZGF0ZShrZXksIGVudHJ5LCBfX3N0b3BfX19qdW1wX3RhYmxlLCBlbmFibGUpOworCXN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSA9IGtleS0+ZW50cmllcywgKnN0b3AgPSBfX3N0b3BfX19qdW1wX3RhYmxlOwogCiAjaWZkZWYgQ09ORklHX01PRFVMRVMKKwlzdHJ1Y3QgbW9kdWxlICptb2QgPSBfX21vZHVsZV9hZGRyZXNzKChqdW1wX2xhYmVsX3Qpa2V5KTsKKwogCV9fanVtcF9sYWJlbF9tb2RfdXBkYXRlKGtleSwgZW5hYmxlKTsKKworCWlmIChtb2QpCisJCXN0b3AgPSBtb2QtPmp1bXBfZW50cmllcyArIG1vZC0+bnVtX2p1bXBfZW50cmllczsKICNlbmRpZgorCS8qIGlmIHRoZXJlIGFyZSBubyB1c2VycywgZW50cnkgY2FuIGJlIE5VTEwgKi8KKwlpZiAoZW50cnkpCisJCV9fanVtcF9sYWJlbF91cGRhdGUoa2V5LCBlbnRyeSwgc3RvcCwgZW5hYmxlKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCBhZDZhODFjLi40NzYxM2RmIDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTE1NiwxMiArMTU2LDYgQEAKIAkgKi8KIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDApOwogCi0JaWYgKHN1Yl9pbmZvLT5pbml0KSB7Ci0JCXJldHZhbCA9IHN1Yl9pbmZvLT5pbml0KHN1Yl9pbmZvKTsKLQkJaWYgKHJldHZhbCkKLQkJCWdvdG8gZmFpbDsKLQl9Ci0KIAlyZXR2YWwgPSAtRU5PTUVNOwogCW5ldyA9IHByZXBhcmVfa2VybmVsX2NyZWQoY3VycmVudCk7CiAJaWYgKCFuZXcpCkBAIC0xNzMsNiArMTY3LDE0IEBACiAJCQkJCSAgICAgbmV3LT5jYXBfaW5oZXJpdGFibGUpOwogCXNwaW5fdW5sb2NrKCZ1bWhfc3lzY3RsX2xvY2spOwogCisJaWYgKHN1Yl9pbmZvLT5pbml0KSB7CisJCXJldHZhbCA9IHN1Yl9pbmZvLT5pbml0KHN1Yl9pbmZvLCBuZXcpOworCQlpZiAocmV0dmFsKSB7CisJCQlhYm9ydF9jcmVkcyhuZXcpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCiAJY29tbWl0X2NyZWRzKG5ldyk7CiAKIAlyZXR2YWwgPSBrZXJuZWxfZXhlY3ZlKHN1Yl9pbmZvLT5wYXRoLApAQCAtMzg4LDcgKzM5MCw3IEBACiAgKiBjb250ZXh0IGluIHdoaWNoIGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlYyBpcyBjYWxsZWQuCiAgKi8KIHZvaWQgY2FsbF91c2VybW9kZWhlbHBlcl9zZXRmbnMoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywKLQkJICAgIGludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pLAorCQkgICAgaW50ICgqaW5pdCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldyksCiAJCSAgICB2b2lkICgqY2xlYW51cCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbyksCiAJCSAgICB2b2lkICpkYXRhKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggNjM0MzdkMC4uMjk4YzkyNyAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0zNDI2LDcgKzM0MjYsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uKSkKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIDE7IC8qIGF2b2lkIGZhbHNlIG5lZ2F0aXZlIGxvY2tkZXBfYXNzZXJ0X2hlbGQoKSAqLwogCiAJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAljaGVja19mbGFncyhmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCmluZGV4IGFjZTU1ODguLjA2ZWZhNTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCkBAIC0xMjExLDcgKzEyMTEsMTEgQEAKIAkJdG9fZnJlZV9oaWdobWVtID0gYWxsb2NfaGlnaG1lbSAtIHNhdmU7CiAJfSBlbHNlIHsKIAkJdG9fZnJlZV9oaWdobWVtID0gMDsKLQkJdG9fZnJlZV9ub3JtYWwgLT0gc2F2ZSAtIGFsbG9jX2hpZ2htZW07CisJCXNhdmUgLT0gYWxsb2NfaGlnaG1lbTsKKwkJaWYgKHRvX2ZyZWVfbm9ybWFsID4gc2F2ZSkKKwkJCXRvX2ZyZWVfbm9ybWFsIC09IHNhdmU7CisJCWVsc2UKKwkJCXRvX2ZyZWVfbm9ybWFsID0gMDsKIAl9CiAKIAltZW1vcnlfYm1fcG9zaXRpb25fcmVzZXQoJmNvcHlfYm0pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmMKaW5kZXggN2QwMmQzMy4uNDJkZGJjNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3VzZXIuYworKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jCkBAIC0xMTMsOCArMTEzLDEwIEBACiAJCWlmIChlcnJvcikKIAkJCXBtX25vdGlmaWVyX2NhbGxfY2hhaW4oUE1fUE9TVF9SRVNUT1JFKTsKIAl9Ci0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKCk7CiAJCWF0b21pY19pbmMoJnNuYXBzaG90X2RldmljZV9hdmFpbGFibGUpOworCX0KIAlkYXRhLT5mcm96ZW4gPSAwOwogCWRhdGEtPnJlYWR5ID0gMDsKIAlkYXRhLT5wbGF0Zm9ybV9zdXBwb3J0ID0gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IDc3YTc2NzEuLmJhMDYyMDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtODQsMTAgKzg0LDM1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmN1X3N0YXRlICpyY3Vfc3RhdGU7CiAKKy8qCisgKiBUaGUgcmN1X3NjaGVkdWxlcl9hY3RpdmUgdmFyaWFibGUgdHJhbnNpdGlvbnMgZnJvbSB6ZXJvIHRvIG9uZSBqdXN0CisgKiBiZWZvcmUgdGhlIGZpcnN0IHRhc2sgaXMgc3Bhd25lZC4gIFNvIHdoZW4gdGhpcyB2YXJpYWJsZSBpcyB6ZXJvLCBSQ1UKKyAqIGNhbiBhc3N1bWUgdGhhdCB0aGVyZSBpcyBidXQgb25lIHRhc2ssIGFsbG93aW5nIFJDVSB0byAoZm9yIGV4YW1wbGUpCisgKiBvcHRpbWl6ZWQgc3luY2hyb25pemVfc2NoZWQoKSB0byBhIHNpbXBsZSBiYXJyaWVyKCkuICBXaGVuIHRoaXMgdmFyaWFibGUKKyAqIGlzIG9uZSwgUkNVIG11c3QgYWN0dWFsbHkgZG8gYWxsIHRoZSBoYXJkIHdvcmsgcmVxdWlyZWQgdG8gZGV0ZWN0IHJlYWwKKyAqIGdyYWNlIHBlcmlvZHMuICBUaGlzIHZhcmlhYmxlIGlzIGFsc28gdXNlZCB0byBzdXBwcmVzcyBib290LXRpbWUgZmFsc2UKKyAqIHBvc2l0aXZlcyBmcm9tIGxvY2tkZXAtUkNVIGVycm9yIGNoZWNraW5nLgorICovCiBpbnQgcmN1X3NjaGVkdWxlcl9hY3RpdmUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJjdV9zY2hlZHVsZXJfYWN0aXZlKTsKIAogLyoKKyAqIFRoZSByY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSB2YXJpYWJsZSB0cmFuc2l0aW9ucyBmcm9tIHplcm8gdG8gb25lCisgKiBkdXJpbmcgdGhlIGVhcmx5X2luaXRjYWxsKCkgcHJvY2Vzc2luZywgd2hpY2ggaXMgYWZ0ZXIgdGhlIHNjaGVkdWxlcgorICogaXMgY2FwYWJsZSBvZiBjcmVhdGluZyBuZXcgdGFza3MuICBTbyBSQ1UgcHJvY2Vzc2luZyAoZm9yIGV4YW1wbGUsCisgKiBjcmVhdGluZyB0YXNrcyBmb3IgUkNVIHByaW9yaXR5IGJvb3N0aW5nKSBtdXN0IGJlIGRlbGF5ZWQgdW50aWwgYWZ0ZXIKKyAqIHJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlIHRyYW5zaXRpb25zIGZyb20gemVybyB0byBvbmUuICBXZSBhbHNvCisgKiBjdXJyZW50bHkgZGVsYXkgaW52b2NhdGlvbiBvZiBhbnkgUkNVIGNhbGxiYWNrcyB1bnRpbCBhZnRlciB0aGlzIHBvaW50LgorICoKKyAqIEl0IG1pZ2h0IGxhdGVyIHByb3ZlIGJldHRlciBmb3IgcGVvcGxlIHJlZ2lzdGVyaW5nIFJDVSBjYWxsYmFja3MgZHVyaW5nCisgKiBlYXJseSBib290IHRvIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZXNlIGNhbGxiYWNrcywgYnV0IG9uZSBzdGVwIGF0CisgKiBhIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgX19yZWFkX21vc3RseTsKKworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKworLyoKICAqIENvbnRyb2wgdmFyaWFibGVzIGZvciBwZXItQ1BVIGFuZCBwZXItcmN1X25vZGUga3RocmVhZHMuICBUaGVzZQogICogaGFuZGxlIGFsbCBmbGF2b3JzIG9mIFJDVS4KICAqLwpAQCAtOTYsMTAgKzEyMSwxMiBAQAogREVGSU5FX1BFUl9DUFUoaW50LCByY3VfY3B1X2t0aHJlYWRfY3B1KTsKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX2xvb3BzKTsKIERFRklORV9QRVJfQ1BVKGNoYXIsIHJjdV9jcHVfaGFzX3dvcmspOwotc3RhdGljIGNoYXIgcmN1X2t0aHJlYWRzX3NwYXduYWJsZTsKKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCiAKIHN0YXRpYyB2b2lkIHJjdV9ub2RlX2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSk7Ci1zdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NwdV9rdGhyZWFkKHZvaWQpOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jb3JlKHZvaWQpOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Moc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCk7CiAKICNkZWZpbmUgUkNVX0tUSFJFQURfUFJJTyAxCS8qIFJUIHByaW9yaXR5IGZvciBwZXItQ1BVIGt0aHJlYWRzLiAqLwogCkBAIC0xMDg4LDE0ICsxMTE1LDggQEAKIAlpbnQgbmVlZF9yZXBvcnQgPSAwOwogCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocnNwLT5yZGEsIGNwdSk7CiAJc3RydWN0IHJjdV9ub2RlICpybnA7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCi0JLyogU3RvcCB0aGUgQ1BVJ3Mga3RocmVhZC4gKi8KLQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKLQlpZiAodCAhPSBOVUxMKSB7Ci0JCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgPSBOVUxMOwotCQlrdGhyZWFkX3N0b3AodCk7Ci0JfQorCXJjdV9zdG9wX2NwdV9rdGhyZWFkKGNwdSk7CiAKIAkvKiBFeGNsdWRlIGFueSBhdHRlbXB0cyB0byBzdGFydCBhIG5ldyBncmFjZSBwZXJpb2QuICovCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZyc3AtPm9ub2ZmbG9jaywgZmxhZ3MpOwpAQCAtMTIzMSw3ICsxMjUyLDcgQEAKIAogCS8qIFJlLXJhaXNlIHRoZSBSQ1Ugc29mdGlycSBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlbWFpbmluZy4gKi8KIAlpZiAoY3B1X2hhc19jYWxsYmFja3NfcmVhZHlfdG9faW52b2tlKHJkcCkpCi0JCWludm9rZV9yY3VfY3B1X2t0aHJlYWQoKTsKKwkJaW52b2tlX3JjdV9jb3JlKCk7CiB9CiAKIC8qCkBAIC0xMjc3LDcgKzEyOTgsNyBAQAogCX0KIAlyY3VfcHJlZW1wdF9jaGVja19jYWxsYmFja3MoY3B1KTsKIAlpZiAocmN1X3BlbmRpbmcoY3B1KSkKLQkJaW52b2tlX3JjdV9jcHVfa3RocmVhZCgpOworCQlpbnZva2VfcmN1X2NvcmUoKTsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTE0NDIsMTMgKzE0NjMsMTQgQEAKIAl9CiAKIAkvKiBJZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlYWR5LCBpbnZva2UgdGhlbS4gKi8KLQlyY3VfZG9fYmF0Y2gocnNwLCByZHApOworCWlmIChjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2UocmRwKSkKKwkJaW52b2tlX3JjdV9jYWxsYmFja3MocnNwLCByZHApOwogfQogCiAvKgogICogRG8gc29mdGlycSBwcm9jZXNzaW5nIGZvciB0aGUgY3VycmVudCBDUFUuCiAgKi8KLXN0YXRpYyB2b2lkIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyh2b2lkKQorc3RhdGljIHZvaWQgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqdW51c2VkKQogewogCV9fcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCZyY3Vfc2NoZWRfc3RhdGUsCiAJCQkJJl9fZ2V0X2NwdV92YXIocmN1X3NjaGVkX2RhdGEpKTsKQEAgLTE0NjUsMzMwICsxNDg3LDIyIEBACiAgKiB0aGUgY3VycmVudCBDUFUgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCB0aGUgcmN1X2NwdV9rdGhyZWFkX3Rhc2sKICAqIGNhbm5vdCBkaXNhcHBlYXIgb3V0IGZyb20gdW5kZXIgdXMuCiAgKi8KLXN0YXRpYyB2b2lkIGludm9rZV9yY3VfY3B1X2t0aHJlYWQodm9pZCkKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY2FsbGJhY2tzKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfX3RoaXNfY3B1X3dyaXRlKHJjdV9jcHVfaGFzX3dvcmssIDEpOwotCWlmIChfX3RoaXNfY3B1X3JlYWQocmN1X2NwdV9rdGhyZWFkX3Rhc2spID09IE5VTEwpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWlmICh1bmxpa2VseSghQUNDRVNTX09OQ0UocmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUpKSkKKwkJcmV0dXJuOworCWlmIChsaWtlbHkoIXJzcC0+Ym9vc3QpKSB7CisJCXJjdV9kb19iYXRjaChyc3AsIHJkcCk7CiAJCXJldHVybjsKIAl9Ci0Jd2FrZV91cF9wcm9jZXNzKF9fdGhpc19jcHVfcmVhZChyY3VfY3B1X2t0aHJlYWRfdGFzaykpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlpbnZva2VfcmN1X2NhbGxiYWNrc19rdGhyZWFkKCk7CiB9CiAKLS8qCi0gKiBXYWtlIHVwIHRoZSBzcGVjaWZpZWQgcGVyLXJjdV9ub2RlLXN0cnVjdHVyZSBrdGhyZWFkLgotICogQmVjYXVzZSB0aGUgcGVyLXJjdV9ub2RlIGt0aHJlYWRzIGFyZSBpbW1vcnRhbCwgd2UgZG9uJ3QgbmVlZAotICogdG8gZG8gYW55dGhpbmcgdG8ga2VlcCB0aGVtIGFsaXZlLgotICovCi1zdGF0aWMgdm9pZCBpbnZva2VfcmN1X25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY29yZSh2b2lkKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCXQgPSBybnAtPm5vZGVfa3RocmVhZF90YXNrOwotCWlmICh0ICE9IE5VTEwpCi0JCXdha2VfdXBfcHJvY2Vzcyh0KTsKKwlyYWlzZV9zb2Z0aXJxKFJDVV9TT0ZUSVJRKTsKIH0KIAotLyoKLSAqIFNldCB0aGUgc3BlY2lmaWVkIENQVSdzIGt0aHJlYWQgdG8gcnVuIFJUIG9yIG5vdCwgYXMgc3BlY2lmaWVkIGJ5Ci0gKiB0aGUgdG9fcnQgYXJndW1lbnQuICBUaGUgQ1BVLWhvdHBsdWcgbG9ja3MgYXJlIGhlbGQsIHNvIHRoZSB0YXNrCi0gKiBpcyBub3QgZ29pbmcgYXdheS4KLSAqLwotc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3NldHJ0KGludCBjcHUsIGludCB0b19ydCkKLXsKLQlpbnQgcG9saWN5OwotCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7Ci0KLQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKLQlpZiAodCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKHRvX3J0KSB7Ci0JCXBvbGljeSA9IFNDSEVEX0ZJRk87Ci0JCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKLQl9IGVsc2UgewotCQlwb2xpY3kgPSBTQ0hFRF9OT1JNQUw7Ci0JCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKLQl9Ci0Jc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgcG9saWN5LCAmc3ApOwotfQotCi0vKgotICogVGltZXIgaGFuZGxlciB0byBpbml0aWF0ZSB0aGUgd2FraW5nIHVwIG9mIHBlci1DUFUga3RocmVhZHMgdGhhdAotICogaGF2ZSB5aWVsZGVkIHRoZSBDUFUgZHVlIHRvIGV4Y2VzcyBudW1iZXJzIG9mIFJDVSBjYWxsYmFja3MuCi0gKiBXZSB3YWtlIHVwIHRoZSBwZXItcmN1X25vZGUga3RocmVhZCwgd2hpY2ggaW4gdHVybiB3aWxsIHdha2UgdXAKLSAqIHRoZSBib29zdGVyIGt0aHJlYWQuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV9jcHVfa3RocmVhZF90aW1lcih1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBhcmcpOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7Ci0KLQlhdG9taWNfb3IocmRwLT5ncnBtYXNrLCAmcm5wLT53YWtlbWFzayk7Ci0JaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQocm5wKTsKLX0KLQotLyoKLSAqIERyb3AgdG8gbm9uLXJlYWwtdGltZSBwcmlvcml0eSBhbmQgeWllbGQsIGJ1dCBvbmx5IGFmdGVyIHBvc3RpbmcgYQotICogdGltZXIgdGhhdCB3aWxsIGNhdXNlIHVzIHRvIHJlZ2FpbiBvdXIgcmVhbC10aW1lIHByaW9yaXR5IGlmIHdlCi0gKiByZW1haW4gcHJlZW1wdGVkLiAgRWl0aGVyIHdheSwgd2UgcmVzdG9yZSBvdXIgcmVhbC10aW1lIHByaW9yaXR5Ci0gKiBiZWZvcmUgcmV0dXJuaW5nLgotICovCi1zdGF0aWMgdm9pZCByY3VfeWllbGQodm9pZCAoKmYpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgeWllbGRfdGltZXI7Ci0KLQlzZXR1cF90aW1lcl9vbl9zdGFjaygmeWllbGRfdGltZXIsIGYsIGFyZyk7Ci0JbW9kX3RpbWVyKCZ5aWVsZF90aW1lciwgamlmZmllcyArIDIpOwotCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKLQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LCBTQ0hFRF9OT1JNQUwsICZzcCk7Ci0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0Jc2NoZWR1bGUoKTsKLQlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87Ci0Jc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soY3VycmVudCwgU0NIRURfRklGTywgJnNwKTsKLQlkZWxfdGltZXIoJnlpZWxkX3RpbWVyKTsKLX0KLQotLyoKLSAqIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgcmN1X2NwdV9rdGhyZWFkKCkgZW5kcyB1cCBvbiB0aGUgd3JvbmcgQ1BVLgotICogVGhpcyBjYW4gaGFwcGVuIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIENQVSBpcyBlaXRoZXIgY29taW5nIG9ubGluZQotICogb3IgZ29pbmcgb2ZmbGluZS4gIFdlIGNhbm5vdCB3YWl0IHVudGlsIHRoZSBDUFUgaXMgZnVsbHkgb25saW5lCi0gKiBiZWZvcmUgc3RhcnRpbmcgdGhlIGt0aHJlYWQsIGJlY2F1c2UgdGhlIHZhcmlvdXMgbm90aWZpZXIgZnVuY3Rpb25zCi0gKiBjYW4gd2FpdCBmb3IgUkNVIGdyYWNlIHBlcmlvZHMuICBTbyB3ZSBwYXJrIHJjdV9jcHVfa3RocmVhZCgpIHVudGlsCi0gKiB0aGUgY29ycmVzcG9uZGluZyBDUFUgaXMgb25saW5lLgotICoKLSAqIFJldHVybiAxIGlmIHRoZSBrdGhyZWFkIG5lZWRzIHRvIHN0b3AsIDAgb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBtdXN0IGRpc2FibGUgYmguICBUaGlzIGZ1bmN0aW9uIGNhbiBtb21lbnRhcmlseSBlbmFibGUgaXQuCi0gKi8KLXN0YXRpYyBpbnQgcmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGludCBjcHUpCi17Ci0Jd2hpbGUgKGNwdV9pc19vZmZsaW5lKGNwdSkgfHwKLQkgICAgICAgIWNwdW1hc2tfZXF1YWwoJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCwgY3B1bWFza19vZihjcHUpKSB8fAotCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7Ci0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlyZXR1cm4gMTsKLQkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpID0gUkNVX0tUSFJFQURfT0ZGQ1BVOwotCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCWlmICghY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpKQotCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihjcHUpKTsKLQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCX0KLQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSBjcHU7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXItQ1BVIGtlcm5lbCB0aHJlYWQgdGhhdCBpbnZva2VzIFJDVSBjYWxsYmFja3MuICBUaGlzIHJlcGxhY2VzIHRoZQotICogZWFybGllciBSQ1Ugc29mdGlycS4KLSAqLwotc3RhdGljIGludCByY3VfY3B1X2t0aHJlYWQodm9pZCAqYXJnKQotewotCWludCBjcHUgPSAoaW50KShsb25nKWFyZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzcGluY250ID0gMDsKLQl1bnNpZ25lZCBpbnQgKnN0YXR1c3AgPSAmcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpOwotCWNoYXIgd29yazsKLQljaGFyICp3b3JrcCA9ICZwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSk7Ci0KLQlmb3IgKDs7KSB7Ci0JCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfV0FJVElORzsKLQkJcmN1X3dhaXQoKndvcmtwICE9IDAgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKLQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQlpZiAocmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGNwdSkpIHsKLQkJCWxvY2FsX2JoX2VuYWJsZSgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9SVU5OSU5HOwotCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9sb29wcywgY3B1KSsrOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCXdvcmsgPSAqd29ya3A7Ci0JCSp3b3JrcCA9IDA7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJaWYgKHdvcmspCi0JCQlyY3VfcHJvY2Vzc19jYWxsYmFja3MoKTsKLQkJbG9jYWxfYmhfZW5hYmxlKCk7Ci0JCWlmICgqd29ya3AgIT0gMCkKLQkJCXNwaW5jbnQrKzsKLQkJZWxzZQotCQkJc3BpbmNudCA9IDA7Ci0JCWlmIChzcGluY250ID4gMTApIHsKLQkJCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfWUlFTERJTkc7Ci0JCQlyY3VfeWllbGQocmN1X2NwdV9rdGhyZWFkX3RpbWVyLCAodW5zaWduZWQgbG9uZyljcHUpOwotCQkJc3BpbmNudCA9IDA7Ci0JCX0KLQl9Ci0JKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9TVE9QUEVEOwotCXJldHVybiAwOwotfQotCi0vKgotICogU3Bhd24gYSBwZXItQ1BVIGt0aHJlYWQsIHNldHRpbmcgdXAgYWZmaW5pdHkgYW5kIHByaW9yaXR5LgotICogQmVjYXVzZSB0aGUgQ1BVIGhvdHBsdWcgbG9jayBpcyBoZWxkLCBubyBvdGhlciBDUFUgd2lsbCBiZSBhdHRlbXB0aW5nCi0gKiB0byBtYW5pcHVsYXRlIHJjdV9jcHVfa3RocmVhZF90YXNrLiAgVGhlcmUgbWlnaHQgYmUgYW5vdGhlciBDUFUKLSAqIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGl0IGR1cmluZyBib290LCBidXQgdGhlIGxvY2tpbmcgaW4ga3RocmVhZF9iaW5kKCkKLSAqIHdpbGwgZW5mb3JjZSBzdWZmaWNpZW50IG9yZGVyaW5nLgotICovCi1zdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX2NwdV9rdGhyZWFkKGludCBjcHUpCi17Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCWlmICghcmN1X2t0aHJlYWRzX3NwYXduYWJsZSB8fAotCSAgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpICE9IE5VTEwpCi0JCXJldHVybiAwOwotCXQgPSBrdGhyZWFkX2NyZWF0ZShyY3VfY3B1X2t0aHJlYWQsICh2b2lkICopKGxvbmcpY3B1LCAicmN1YyVkIiwgY3B1KTsKLQlpZiAoSVNfRVJSKHQpKQotCQlyZXR1cm4gUFRSX0VSUih0KTsKLQlrdGhyZWFkX2JpbmQodCwgY3B1KTsKLQlzZXRfdGFza19zdGF0ZSh0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IGNwdTsKLQlXQVJOX09OX09OQ0UocGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSAhPSBOVUxMKTsKLQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpID0gdDsKLQlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87Ci0Jc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFBlci1yY3Vfbm9kZSBrdGhyZWFkLCB3aGljaCBpcyBpbiBjaGFyZ2Ugb2Ygd2FraW5nIHVwIHRoZSBwZXItQ1BVCi0gKiBrdGhyZWFkcyB3aGVuIG5lZWRlZC4gIFdlIGlnbm9yZSByZXF1ZXN0cyB0byB3YWtlIHVwIGt0aHJlYWRzCi0gKiBmb3Igb2ZmbGluZSBDUFVzLCB3aGljaCBpcyBPSyBiZWNhdXNlIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpCi0gKiB0YWtlcyBjYXJlIG9mIHRoaXMgY2FzZS4KLSAqLwotc3RhdGljIGludCByY3Vfbm9kZV9rdGhyZWFkKHZvaWQgKmFyZykKLXsKLQlpbnQgY3B1OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gKHN0cnVjdCByY3Vfbm9kZSAqKWFyZzsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0OwotCi0JZm9yICg7OykgewotCQlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9XQUlUSU5HOwotCQlyY3Vfd2FpdChhdG9taWNfcmVhZCgmcm5wLT53YWtlbWFzaykgIT0gMCk7Ci0JCXJucC0+bm9kZV9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1JVTk5JTkc7Ci0JCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7Ci0JCW1hc2sgPSBhdG9taWNfeGNoZygmcm5wLT53YWtlbWFzaywgMCk7Ci0JCXJjdV9pbml0aWF0ZV9ib29zdChybnAsIGZsYWdzKTsgLyogcmVsZWFzZXMgcm5wLT5sb2NrLiAqLwotCQlmb3IgKGNwdSA9IHJucC0+Z3JwbG87IGNwdSA8PSBybnAtPmdycGhpOyBjcHUrKywgbWFzayA+Pj0gMSkgewotCQkJaWYgKChtYXNrICYgMHgxKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKLQkJCWlmICghY3B1X29ubGluZShjcHUpIHx8IHQgPT0gTlVMTCkgewotCQkJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSkgPSAxOwotCQkJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOwotCQkJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKLQkJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCX0KLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotCXJucC0+bm9kZV9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1NUT1BQRUQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkJ3MgYWZmaW5pdHkgdG8gY292ZXIgYWxsIENQVXMgdGhhdCBhcmUKLSAqIHNlcnZlZCBieSB0aGUgcmN1X25vZGUgaW4gcXVlc3Rpb24uICBUaGUgQ1BVIGhvdHBsdWcgbG9jayBpcyBzdGlsbAotICogaGVsZCwgc28gdGhlIHZhbHVlIG9mIHJucC0+cXNtYXNraW5pdCB3aWxsIGJlIHN0YWJsZS4KLSAqCi0gKiBXZSBkb24ndCBpbmNsdWRlIG91dGdvaW5nY3B1IGluIHRoZSBhZmZpbml0eSBzZXQsIHVzZSAtMSBpZiB0aGVyZSBpcwotICogbm8gb3V0Z29pbmcgQ1BVLiAgSWYgdGhlcmUgYXJlIG5vIENQVXMgbGVmdCBpbiB0aGUgYWZmaW5pdHkgc2V0LAotICogdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGt0aHJlYWQgdG8gZXhlY3V0ZSBvbiBhbnkgQ1BVLgotICovCi1zdGF0aWMgdm9pZCByY3Vfbm9kZV9rdGhyZWFkX3NldGFmZmluaXR5KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCBpbnQgb3V0Z29pbmdjcHUpCi17Ci0JY3B1bWFza192YXJfdCBjbTsKLQlpbnQgY3B1OwotCXVuc2lnbmVkIGxvbmcgbWFzayA9IHJucC0+cXNtYXNraW5pdDsKLQotCWlmIChybnAtPm5vZGVfa3RocmVhZF90YXNrID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjbSwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybjsKLQljcHVtYXNrX2NsZWFyKGNtKTsKLQlmb3IgKGNwdSA9IHJucC0+Z3JwbG87IGNwdSA8PSBybnAtPmdycGhpOyBjcHUrKywgbWFzayA+Pj0gMSkKLQkJaWYgKChtYXNrICYgMHgxKSAmJiBjcHUgIT0gb3V0Z29pbmdjcHUpCi0JCQljcHVtYXNrX3NldF9jcHUoY3B1LCBjbSk7Ci0JaWYgKGNwdW1hc2tfd2VpZ2h0KGNtKSA9PSAwKSB7Ci0JCWNwdW1hc2tfc2V0YWxsKGNtKTsKLQkJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyspCi0JCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNtKTsKLQkJV0FSTl9PTl9PTkNFKGNwdW1hc2tfd2VpZ2h0KGNtKSA9PSAwKTsKLQl9Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIocm5wLT5ub2RlX2t0aHJlYWRfdGFzaywgY20pOwotCXJjdV9ib29zdF9rdGhyZWFkX3NldGFmZmluaXR5KHJucCwgY20pOwotCWZyZWVfY3B1bWFza192YXIoY20pOwotfQotCi0vKgotICogU3Bhd24gYSBwZXItcmN1X25vZGUga3RocmVhZCwgc2V0dGluZyBwcmlvcml0eSBhbmQgYWZmaW5pdHkuCi0gKiBDYWxsZWQgZHVyaW5nIGJvb3QgYmVmb3JlIG9ubGluZS9vZmZsaW5lIGNhbiBoYXBwZW4sIG9yLCBpZgotICogZHVyaW5nIHJ1bnRpbWUsIHdpdGggdGhlIG1haW4gQ1BVLWhvdHBsdWcgbG9ja3MgaGVsZC4gIFNvIG9ubHkKLSAqIG9uZSBvZiB0aGVzZSBjYW4gYmUgZXhlY3V0aW5nIGF0IGEgdGltZS4KLSAqLwotc3RhdGljIGludCBfX2NwdWluaXQgcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAotCQkJCQkJc3RydWN0IHJjdV9ub2RlICpybnApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcm5wX2luZGV4ID0gcm5wIC0gJnJzcC0+bm9kZVswXTsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0OwotCi0JaWYgKCFyY3Vfa3RocmVhZHNfc3Bhd25hYmxlIHx8Ci0JICAgIHJucC0+cXNtYXNraW5pdCA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKSB7Ci0JCXQgPSBrdGhyZWFkX2NyZWF0ZShyY3Vfbm9kZV9rdGhyZWFkLCAodm9pZCAqKXJucCwKLQkJCQkgICAicmN1biVkIiwgcm5wX2luZGV4KTsKLQkJaWYgKElTX0VSUih0KSkKLQkJCXJldHVybiBQVFJfRVJSKHQpOwotCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCQlzZXRfdGFza19zdGF0ZSh0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlybnAtPm5vZGVfa3RocmVhZF90YXNrID0gdDsKLQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCQlzcC5zY2hlZF9wcmlvcml0eSA9IDk5OwotCQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh0LCBTQ0hFRF9GSUZPLCAmc3ApOwotCX0KLQlyZXR1cm4gcmN1X3NwYXduX29uZV9ib29zdF9rdGhyZWFkKHJzcCwgcm5wLCBybnBfaW5kZXgpOwotfQotCi0vKgotICogU3Bhd24gYWxsIGt0aHJlYWRzIC0tIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBzY2hlZHVsZXIgaXMgcnVubmluZy4KLSAqLwotc3RhdGljIGludCBfX2luaXQgcmN1X3NwYXduX2t0aHJlYWRzKHZvaWQpCi17Ci0JaW50IGNwdTsKLQlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKLQotCXJjdV9rdGhyZWFkc19zcGF3bmFibGUgPSAxOwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpID0gMDsKLQkJaWYgKGNwdV9vbmxpbmUoY3B1KSkKLQkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoY3B1KTsKLQl9Ci0Jcm5wID0gcmN1X2dldF9yb290KHJjdV9zdGF0ZSk7Ci0JKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOwotCWlmIChOVU1fUkNVX05PREVTID4gMSkgewotCQlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJjdV9zdGF0ZSwgcm5wKQotCQkJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOwotCX0KLQlyZXR1cm4gMDsKLX0KLWVhcmx5X2luaXRjYWxsKHJjdV9zcGF3bl9rdGhyZWFkcyk7Ci0KIHN0YXRpYyB2b2lkCiBfX2NhbGxfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCwgdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqcmN1KSwKIAkgICBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCkBAIC0yMTg4LDI2ICsxOTAyLDEzIEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzcC0+b25vZmZsb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3Vfb25saW5lX2NwdShpbnQgY3B1KQorc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9wcmVwYXJlX2NwdShpbnQgY3B1KQogewogCXJjdV9pbml0X3BlcmNwdV9kYXRhKGNwdSwgJnJjdV9zY2hlZF9zdGF0ZSwgMCk7CiAJcmN1X2luaXRfcGVyY3B1X2RhdGEoY3B1LCAmcmN1X2JoX3N0YXRlLCAwKTsKIAlyY3VfcHJlZW1wdF9pbml0X3BlcmNwdV9kYXRhKGNwdSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3Vfb25saW5lX2t0aHJlYWRzKGludCBjcHUpCi17Ci0Jc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyY3Vfc3RhdGUtPnJkYSwgY3B1KTsKLQlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJkcC0+bXlub2RlOwotCi0JLyogRmlyZSB1cCB0aGUgaW5jb21pbmcgQ1BVJ3Mga3RocmVhZCBhbmQgbGVhZiByY3Vfbm9kZSBrdGhyZWFkLiAqLwotCWlmIChyY3Vfa3RocmVhZHNfc3Bhd25hYmxlKSB7Ci0JCSh2b2lkKXJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoY3B1KTsKLQkJaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkKLQkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHJjdV9zdGF0ZSwgcm5wKTsKLQl9Ci19Ci0KIC8qCiAgKiBIYW5kbGUgQ1BVIG9ubGluZS9vZmZsaW5lIG5vdGlmaWNhdGlvbiBldmVudHMuCiAgKi8KQEAgLTIyMjEsOCArMTkyMiw4IEBACiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgotCQlyY3Vfb25saW5lX2NwdShjcHUpOwotCQlyY3Vfb25saW5lX2t0aHJlYWRzKGNwdSk7CisJCXJjdV9wcmVwYXJlX2NwdShjcHUpOworCQlyY3VfcHJlcGFyZV9rdGhyZWFkcyhjcHUpOwogCQlicmVhazsKIAljYXNlIENQVV9PTkxJTkU6CiAJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CkBAIC0yMzcyLDYgKzIwNzMsNyBAQAogCXJjdV9pbml0X29uZSgmcmN1X3NjaGVkX3N0YXRlLCAmcmN1X3NjaGVkX2RhdGEpOwogCXJjdV9pbml0X29uZSgmcmN1X2JoX3N0YXRlLCAmcmN1X2JoX2RhdGEpOwogCV9fcmN1X2luaXRfcHJlZW1wdCgpOworCSBvcGVuX3NvZnRpcnEoUkNVX1NPRlRJUlEsIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyk7CiAKIAkvKgogCSAqIFdlIGRvbid0IG5lZWQgcHJvdGVjdGlvbiBhZ2FpbnN0IENQVS1ob3RwbHVnIGhlcmUgYmVjYXVzZQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuaCBiL2tlcm5lbC9yY3V0cmVlLmgKaW5kZXggN2I5YTA4Yi4uMDFiMmNjZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWUuaAorKysgYi9rZXJuZWwvcmN1dHJlZS5oCkBAIC0zNjksNiArMzY5LDcgQEAKIAkJCQkJCS8qICBwZXJpb2QgYmVjYXVzZSAqLwogCQkJCQkJLyogIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpICovCiAJCQkJCQkvKiAgd2FzIHJ1bm5pbmcuICovCisJdTgJYm9vc3Q7CQkJCS8qIFN1YmplY3QgdG8gcHJpb3JpdHkgYm9vc3QuICovCiAJdW5zaWduZWQgbG9uZyBncG51bTsJCQkvKiBDdXJyZW50IGdwIG51bWJlci4gKi8KIAl1bnNpZ25lZCBsb25nIGNvbXBsZXRlZDsJCS8qICMgb2YgbGFzdCBjb21wbGV0ZWQgZ3AuICovCiAKQEAgLTQyNiw2ICs0MjcsNyBAQAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIHZvaWQgcmN1X3JlcG9ydF91bmJsb2NrX3FzX3JucChzdHJ1Y3QgcmN1X25vZGUgKnJucCwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3N0YXRpYyB2b2lkIHJjdV9zdG9wX2NwdV9rdGhyZWFkKGludCBjcHUpOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmludF9kZXRhaWxfdGFza19zdGFsbChzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApOwogc3RhdGljIHZvaWQgcmN1X3ByaW50X3Rhc2tfc3RhbGwoc3RydWN0IHJjdV9ub2RlICpybnApOwpAQCAtNDUwLDExICs0NTIsMTkgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBfX3JjdV9pbml0X3ByZWVtcHQodm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfbmVlZHNfY3B1X2ZsdXNoKHZvaWQpOwogc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2Jvb3N0KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3N0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2Jvb3N0X3N0YXJ0X2dwKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY2FsbGJhY2tzX2t0aHJlYWQodm9pZCk7CisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfZG9fY2FsbGJhY2tzKHZvaWQpOwogc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsCiAJCQkJCSAgY3B1bWFza192YXJfdCBjbSk7Ci1zdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9ib29zdF9zdGFydF9ncChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CiBzdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX2Jvb3N0X2t0aHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAogCQkJCQkJIHN0cnVjdCByY3Vfbm9kZSAqcm5wLAogCQkJCQkJIGludCBybnBfaW5kZXgpOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQoc3RydWN0IHJjdV9ub2RlICpybnApOworc3RhdGljIHZvaWQgcmN1X3lpZWxkKHZvaWQgKCpmKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCitzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KTsKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlcGFyZV9rdGhyZWFkcyhpbnQgY3B1KTsKIAogI2VuZGlmIC8qICNpZm5kZWYgUkNVX1RSRUVfTk9OQ09SRSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaAppbmRleCBhNzY3YjdkLi44YWFmYmI4IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaApAQCAtNjgsNiArNjgsNyBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9kYXRhLCByY3VfcHJlZW1wdF9kYXRhKTsKIHN0YXRpYyBzdHJ1Y3QgcmN1X3N0YXRlICpyY3Vfc3RhdGUgPSAmcmN1X3ByZWVtcHRfc3RhdGU7CiAKK3N0YXRpYyB2b2lkIHJjdV9yZWFkX3VubG9ja19zcGVjaWFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7CiBzdGF0aWMgaW50IHJjdV9wcmVlbXB0ZWRfcmVhZGVyc19leHAoc3RydWN0IHJjdV9ub2RlICpybnApOwogCiAvKgpAQCAtMTQ3LDcgKzE0OCw3IEBACiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CiAJc3RydWN0IHJjdV9ub2RlICpybnA7CiAKLQlpZiAodC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nICYmCisJaWYgKHQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyA+IDAgJiYKIAkgICAgKHQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsICYgUkNVX1JFQURfVU5MT0NLX0JMT0NLRUQpID09IDApIHsKIAogCQkvKiBQb3NzaWJseSBibG9ja2luZyBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uICovCkBAIC0xOTAsNiArMTkxLDE0IEBACiAJCQkJcm5wLT5ncF90YXNrcyA9ICZ0LT5yY3Vfbm9kZV9lbnRyeTsKIAkJfQogCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIGlmICh0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPCAwICYmCisJCSAgIHQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsKSB7CisKKwkJLyoKKwkJICogQ29tcGxldGUgZXhpdCBmcm9tIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiBvbgorCQkgKiBiZWhhbGYgb2YgcHJlZW1wdGVkIGluc3RhbmNlIG9mIF9fcmN1X3JlYWRfdW5sb2NrKCkuCisJCSAqLworCQlyY3VfcmVhZF91bmxvY2tfc3BlY2lhbCh0KTsKIAl9CiAKIAkvKgpAQCAtMjg0LDcgKzI5Myw3IEBACiAgKiBub3RpZnkgUkNVIGNvcmUgcHJvY2Vzc2luZyBvciB0YXNrIGhhdmluZyBibG9ja2VkIGR1cmluZyB0aGUgUkNVCiAgKiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KICAqLwotc3RhdGljIHZvaWQgcmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0KQorc3RhdGljIG5vaW5saW5lIHZvaWQgcmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0KQogewogCWludCBlbXB0eTsKIAlpbnQgZW1wdHlfZXhwOwpAQCAtMzA5LDcgKzMxOCw3IEBACiAJfQogCiAJLyogSGFyZHdhcmUgSVJRIGhhbmRsZXJzIGNhbm5vdCBibG9jay4gKi8KLQlpZiAoaW5faXJxKCkpIHsKKwlpZiAoaW5faXJxKCkgfHwgaW5fc2VydmluZ19zb2Z0aXJxKCkpIHsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtMzQyLDYgKzM1MSwxMSBAQAogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKIAkJaWYgKCZ0LT5yY3Vfbm9kZV9lbnRyeSA9PSBybnAtPmJvb3N0X3Rhc2tzKQogCQkJcm5wLT5ib29zdF90YXNrcyA9IG5wOworCQkvKiBTbmFwc2hvdCBhbmQgY2xlYXIgLT5yY3VfYm9vc3RlZCB3aXRoIHJjdV9ub2RlIGxvY2sgaGVsZC4gKi8KKwkJaWYgKHQtPnJjdV9ib29zdGVkKSB7CisJCQlzcGVjaWFsIHw9IFJDVV9SRUFEX1VOTE9DS19CT09TVEVEOworCQkJdC0+cmN1X2Jvb3N0ZWQgPSAwOworCQl9CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIAkJdC0+cmN1X2Jsb2NrZWRfbm9kZSA9IE5VTEw7CiAKQEAgLTM1OCw3ICszNzIsNiBAQAogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKIAkJLyogVW5ib29zdCBpZiB3ZSB3ZXJlIGJvb3N0ZWQuICovCiAJCWlmIChzcGVjaWFsICYgUkNVX1JFQURfVU5MT0NLX0JPT1NURUQpIHsKLQkJCXQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsICY9IH5SQ1VfUkVBRF9VTkxPQ0tfQk9PU1RFRDsKIAkJCXJ0X211dGV4X3VubG9jayh0LT5yY3VfYm9vc3RfbXV0ZXgpOwogCQkJdC0+cmN1X2Jvb3N0X211dGV4ID0gTlVMTDsKIAkJfQpAQCAtMzg3LDEzICs0MDAsMjIgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQgPSBjdXJyZW50OwogCiAJYmFycmllcigpOyAgLyogbmVlZGVkIGlmIHdlIGV2ZXIgaW52b2tlIHJjdV9yZWFkX3VubG9jayBpbiByY3V0cmVlLmMgKi8KLQktLXQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZzsKLQliYXJyaWVyKCk7ICAvKiBkZWNyZW1lbnQgYmVmb3JlIGxvYWQgb2YgLT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCAqLwotCWlmICh0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPT0gMCAmJgotCSAgICB1bmxpa2VseShBQ0NFU1NfT05DRSh0LT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCkpKQotCQlyY3VfcmVhZF91bmxvY2tfc3BlY2lhbCh0KTsKKwlpZiAodC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nICE9IDEpCisJCS0tdC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nOworCWVsc2UgeworCQl0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPSBJTlRfTUlOOworCQliYXJyaWVyKCk7ICAvKiBhc3NpZ24gYmVmb3JlIC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgbG9hZCAqLworCQlpZiAodW5saWtlbHkoQUNDRVNTX09OQ0UodC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwpKSkKKwkJCXJjdV9yZWFkX3VubG9ja19zcGVjaWFsKHQpOworCQliYXJyaWVyKCk7ICAvKiAtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsIGxvYWQgYmVmb3JlIGFzc2lnbiAqLworCQl0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPSAwOworCX0KICNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORwotCVdBUk5fT05fT05DRShBQ0NFU1NfT05DRSh0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcpIDwgMCk7CisJeworCQlpbnQgcnJsbiA9IEFDQ0VTU19PTkNFKHQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyk7CisKKwkJV0FSTl9PTl9PTkNFKHJybG4gPCAwICYmIHJybG4gPiBJTlRfTUlOIC8gMik7CisJfQogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORyAqLwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19yY3VfcmVhZF91bmxvY2spOwpAQCAtNTg5LDcgKzYxMSw4IEBACiAJCXJjdV9wcmVlbXB0X3FzKGNwdSk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHBlcl9jcHUocmN1X3ByZWVtcHRfZGF0YSwgY3B1KS5xc19wZW5kaW5nKQorCWlmICh0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPiAwICYmCisJICAgIHBlcl9jcHUocmN1X3ByZWVtcHRfZGF0YSwgY3B1KS5xc19wZW5kaW5nKQogCQl0LT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCB8PSBSQ1VfUkVBRF9VTkxPQ0tfTkVFRF9RUzsKIH0KIApAQCAtNjAyLDYgKzYyNSwxNSBAQAogCQkJCSZfX2dldF9jcHVfdmFyKHJjdV9wcmVlbXB0X2RhdGEpKTsKIH0KIAorI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfZG9fY2FsbGJhY2tzKHZvaWQpCit7CisJcmN1X2RvX2JhdGNoKCZyY3VfcHJlZW1wdF9zdGF0ZSwgJl9fZ2V0X2NwdV92YXIocmN1X3ByZWVtcHRfZGF0YSkpOworfQorCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKwogLyoKICAqIFF1ZXVlIGEgcHJlZW1wdGlibGUtUkNVIGNhbGxiYWNrIGZvciBpbnZvY2F0aW9uIGFmdGVyIGEgZ3JhY2UgcGVyaW9kLgogICovCkBAIC02ODYsOSArNzE4LDEyIEBACiAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCWZvciAoOzspIHsKLQkJaWYgKCFzeW5jX3JjdV9wcmVlbXB0X2V4cF9kb25lKHJucCkpCisJCWlmICghc3luY19yY3VfcHJlZW1wdF9leHBfZG9uZShybnApKSB7CisJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKKwkJfQogCQlpZiAocm5wLT5wYXJlbnQgPT0gTlVMTCkgeworCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCQkJd2FrZV91cCgmc3luY19yY3VfcHJlZW1wdF9leHBfd3EpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTY5OCw3ICs3MzMsNiBAQAogCQlyYXdfc3Bpbl9sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQgKi8KIAkJcm5wLT5leHBtYXNrICY9IH5tYXNrOwogCX0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0xMTY1LDcgKzExOTksNyBAQAogCXQgPSBjb250YWluZXJfb2YodGIsIHN0cnVjdCB0YXNrX3N0cnVjdCwgcmN1X25vZGVfZW50cnkpOwogCXJ0X211dGV4X2luaXRfcHJveHlfbG9ja2VkKCZtdHgsIHQpOwogCXQtPnJjdV9ib29zdF9tdXRleCA9ICZtdHg7Ci0JdC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgfD0gUkNVX1JFQURfVU5MT0NLX0JPT1NURUQ7CisJdC0+cmN1X2Jvb3N0ZWQgPSAxOwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAlydF9tdXRleF9sb2NrKCZtdHgpOyAgLyogU2lkZSBlZmZlY3Q6IGJvb3N0cyB0YXNrIHQncyBwcmlvcml0eS4gKi8KIAlydF9tdXRleF91bmxvY2soJm10eCk7ICAvKiBLZWVwIGxvY2tkZXAgaGFwcHkuICovCkBAIC0xMjQ5LDYgKzEyODMsMjMgQEAKIH0KIAogLyoKKyAqIFdha2UgdXAgdGhlIHBlci1DUFUga3RocmVhZCB0byBpbnZva2UgUkNVIGNhbGxiYWNrcy4KKyAqLworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Nfa3RocmVhZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX190aGlzX2NwdV93cml0ZShyY3VfY3B1X2hhc193b3JrLCAxKTsKKwlpZiAoX190aGlzX2NwdV9yZWFkKHJjdV9jcHVfa3RocmVhZF90YXNrKSA9PSBOVUxMKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwl3YWtlX3VwX3Byb2Nlc3MoX190aGlzX2NwdV9yZWFkKHJjdV9jcHVfa3RocmVhZF90YXNrKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgogICogU2V0IHRoZSBhZmZpbml0eSBvZiB0aGUgYm9vc3Qga3RocmVhZC4gIFRoZSBDUFUtaG90cGx1ZyBsb2NrcyBhcmUKICAqIGhlbGQsIHNvIG5vIG9uZSBzaG91bGQgYmUgbWVzc2luZyB3aXRoIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGJvb3N0CiAgKiBrdGhyZWFkLgpAQCAtMTI4OCw2ICsxMzM5LDcgQEAKIAogCWlmICgmcmN1X3ByZWVtcHRfc3RhdGUgIT0gcnNwKQogCQlyZXR1cm4gMDsKKwlyc3AtPmJvb3N0ID0gMTsKIAlpZiAocm5wLT5ib29zdF9rdGhyZWFkX3Rhc2sgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJdCA9IGt0aHJlYWRfY3JlYXRlKHJjdV9ib29zdF9rdGhyZWFkLCAodm9pZCAqKXJucCwKQEAgLTEyOTUsMTQgKzEzNDcsMzc4IEBACiAJaWYgKElTX0VSUih0KSkKIAkJcmV0dXJuIFBUUl9FUlIodCk7CiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKLQlzZXRfdGFza19zdGF0ZSh0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCXJucC0+Ym9vc3Rfa3RocmVhZF90YXNrID0gdDsKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOwogCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJd2FrZV91cF9wcm9jZXNzKHQpOyAvKiBnZXQgdG8gVEFTS19JTlRFUlJVUFRJQkxFIHF1aWNrbHkuICovCiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworLyoKKyAqIFN0b3AgdGhlIFJDVSdzIHBlci1DUFUga3RocmVhZCB3aGVuIGl0cyBDUFUgZ29lcyBvZmZsaW5lLC4KKyAqLworc3RhdGljIHZvaWQgcmN1X3N0b3BfY3B1X2t0aHJlYWQoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwkvKiBTdG9wIHRoZSBDUFUncyBrdGhyZWFkLiAqLworCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOworCWlmICh0ICE9IE5VTEwpIHsKKwkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSA9IE5VTEw7CisJCWt0aHJlYWRfc3RvcCh0KTsKKwl9Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3N0YXRpYyB2b2lkIHJjdV9rdGhyZWFkX2RvX3dvcmsodm9pZCkKK3sKKwlyY3VfZG9fYmF0Y2goJnJjdV9zY2hlZF9zdGF0ZSwgJl9fZ2V0X2NwdV92YXIocmN1X3NjaGVkX2RhdGEpKTsKKwlyY3VfZG9fYmF0Y2goJnJjdV9iaF9zdGF0ZSwgJl9fZ2V0X2NwdV92YXIocmN1X2JoX2RhdGEpKTsKKwlyY3VfcHJlZW1wdF9kb19jYWxsYmFja3MoKTsKK30KKworLyoKKyAqIFdha2UgdXAgdGhlIHNwZWNpZmllZCBwZXItcmN1X25vZGUtc3RydWN0dXJlIGt0aHJlYWQuCisgKiBCZWNhdXNlIHRoZSBwZXItcmN1X25vZGUga3RocmVhZHMgYXJlIGltbW9ydGFsLCB3ZSBkb24ndCBuZWVkCisgKiB0byBkbyBhbnl0aGluZyB0byBrZWVwIHRoZW0gYWxpdmUuCisgKi8KK3N0YXRpYyB2b2lkIGludm9rZV9yY3Vfbm9kZV9rdGhyZWFkKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCXQgPSBybnAtPm5vZGVfa3RocmVhZF90YXNrOworCWlmICh0ICE9IE5VTEwpCisJCXdha2VfdXBfcHJvY2Vzcyh0KTsKK30KKworLyoKKyAqIFNldCB0aGUgc3BlY2lmaWVkIENQVSdzIGt0aHJlYWQgdG8gcnVuIFJUIG9yIG5vdCwgYXMgc3BlY2lmaWVkIGJ5CisgKiB0aGUgdG9fcnQgYXJndW1lbnQuICBUaGUgQ1BVLWhvdHBsdWcgbG9ja3MgYXJlIGhlbGQsIHNvIHRoZSB0YXNrCisgKiBpcyBub3QgZ29pbmcgYXdheS4KKyAqLworc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3NldHJ0KGludCBjcHUsIGludCB0b19ydCkKK3sKKwlpbnQgcG9saWN5OworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHRvX3J0KSB7CisJCXBvbGljeSA9IFNDSEVEX0ZJRk87CisJCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKKwl9IGVsc2UgeworCQlwb2xpY3kgPSBTQ0hFRF9OT1JNQUw7CisJCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKKwl9CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgcG9saWN5LCAmc3ApOworfQorCisvKgorICogVGltZXIgaGFuZGxlciB0byBpbml0aWF0ZSB0aGUgd2FraW5nIHVwIG9mIHBlci1DUFUga3RocmVhZHMgdGhhdAorICogaGF2ZSB5aWVsZGVkIHRoZSBDUFUgZHVlIHRvIGV4Y2VzcyBudW1iZXJzIG9mIFJDVSBjYWxsYmFja3MuCisgKiBXZSB3YWtlIHVwIHRoZSBwZXItcmN1X25vZGUga3RocmVhZCwgd2hpY2ggaW4gdHVybiB3aWxsIHdha2UgdXAKKyAqIHRoZSBib29zdGVyIGt0aHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9jcHVfa3RocmVhZF90aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBhcmcpOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7CisKKwlhdG9taWNfb3IocmRwLT5ncnBtYXNrLCAmcm5wLT53YWtlbWFzayk7CisJaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQocm5wKTsKK30KKworLyoKKyAqIERyb3AgdG8gbm9uLXJlYWwtdGltZSBwcmlvcml0eSBhbmQgeWllbGQsIGJ1dCBvbmx5IGFmdGVyIHBvc3RpbmcgYQorICogdGltZXIgdGhhdCB3aWxsIGNhdXNlIHVzIHRvIHJlZ2FpbiBvdXIgcmVhbC10aW1lIHByaW9yaXR5IGlmIHdlCisgKiByZW1haW4gcHJlZW1wdGVkLiAgRWl0aGVyIHdheSwgd2UgcmVzdG9yZSBvdXIgcmVhbC10aW1lIHByaW9yaXR5CisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICovCitzdGF0aWMgdm9pZCByY3VfeWllbGQodm9pZCAoKmYpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRpbWVyX2xpc3QgeWllbGRfdGltZXI7CisKKwlzZXR1cF90aW1lcl9vbl9zdGFjaygmeWllbGRfdGltZXIsIGYsIGFyZyk7CisJbW9kX3RpbWVyKCZ5aWVsZF90aW1lciwgamlmZmllcyArIDIpOworCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LCBTQ0hFRF9OT1JNQUwsICZzcCk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7CisJc2NoZWR1bGUoKTsKKwlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soY3VycmVudCwgU0NIRURfRklGTywgJnNwKTsKKwlkZWxfdGltZXIoJnlpZWxkX3RpbWVyKTsKK30KKworLyoKKyAqIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgcmN1X2NwdV9rdGhyZWFkKCkgZW5kcyB1cCBvbiB0aGUgd3JvbmcgQ1BVLgorICogVGhpcyBjYW4gaGFwcGVuIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIENQVSBpcyBlaXRoZXIgY29taW5nIG9ubGluZQorICogb3IgZ29pbmcgb2ZmbGluZS4gIFdlIGNhbm5vdCB3YWl0IHVudGlsIHRoZSBDUFUgaXMgZnVsbHkgb25saW5lCisgKiBiZWZvcmUgc3RhcnRpbmcgdGhlIGt0aHJlYWQsIGJlY2F1c2UgdGhlIHZhcmlvdXMgbm90aWZpZXIgZnVuY3Rpb25zCisgKiBjYW4gd2FpdCBmb3IgUkNVIGdyYWNlIHBlcmlvZHMuICBTbyB3ZSBwYXJrIHJjdV9jcHVfa3RocmVhZCgpIHVudGlsCisgKiB0aGUgY29ycmVzcG9uZGluZyBDUFUgaXMgb25saW5lLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBrdGhyZWFkIG5lZWRzIHRvIHN0b3AsIDAgb3RoZXJ3aXNlLgorICoKKyAqIENhbGxlciBtdXN0IGRpc2FibGUgYmguICBUaGlzIGZ1bmN0aW9uIGNhbiBtb21lbnRhcmlseSBlbmFibGUgaXQuCisgKi8KK3N0YXRpYyBpbnQgcmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGludCBjcHUpCit7CisJd2hpbGUgKGNwdV9pc19vZmZsaW5lKGNwdSkgfHwKKwkgICAgICAgIWNwdW1hc2tfZXF1YWwoJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCwgY3B1bWFza19vZihjcHUpKSB8fAorCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlyZXR1cm4gMTsKKwkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpID0gUkNVX0tUSFJFQURfT0ZGQ1BVOworCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCWlmICghY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpKQorCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihjcHUpKTsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCX0KKwlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSBjcHU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXItQ1BVIGtlcm5lbCB0aHJlYWQgdGhhdCBpbnZva2VzIFJDVSBjYWxsYmFja3MuICBUaGlzIHJlcGxhY2VzIHRoZQorICogZWFybGllciBSQ1Ugc29mdGlycS4KKyAqLworc3RhdGljIGludCByY3VfY3B1X2t0aHJlYWQodm9pZCAqYXJnKQoreworCWludCBjcHUgPSAoaW50KShsb25nKWFyZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzcGluY250ID0gMDsKKwl1bnNpZ25lZCBpbnQgKnN0YXR1c3AgPSAmcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpOworCWNoYXIgd29yazsKKwljaGFyICp3b3JrcCA9ICZwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSk7CisKKwlmb3IgKDs7KSB7CisJCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfV0FJVElORzsKKwkJcmN1X3dhaXQoKndvcmtwICE9IDAgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQlpZiAocmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGNwdSkpIHsKKwkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQkJYnJlYWs7CisJCX0KKwkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9SVU5OSU5HOworCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9sb29wcywgY3B1KSsrOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXdvcmsgPSAqd29ya3A7CisJCSp3b3JrcCA9IDA7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJaWYgKHdvcmspCisJCQlyY3Vfa3RocmVhZF9kb193b3JrKCk7CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlpZiAoKndvcmtwICE9IDApCisJCQlzcGluY250Kys7CisJCWVsc2UKKwkJCXNwaW5jbnQgPSAwOworCQlpZiAoc3BpbmNudCA+IDEwKSB7CisJCQkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1lJRUxESU5HOworCQkJcmN1X3lpZWxkKHJjdV9jcHVfa3RocmVhZF90aW1lciwgKHVuc2lnbmVkIGxvbmcpY3B1KTsKKwkJCXNwaW5jbnQgPSAwOworCQl9CisJfQorCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfU1RPUFBFRDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNwYXduIGEgcGVyLUNQVSBrdGhyZWFkLCBzZXR0aW5nIHVwIGFmZmluaXR5IGFuZCBwcmlvcml0eS4KKyAqIEJlY2F1c2UgdGhlIENQVSBob3RwbHVnIGxvY2sgaXMgaGVsZCwgbm8gb3RoZXIgQ1BVIHdpbGwgYmUgYXR0ZW1wdGluZworICogdG8gbWFuaXB1bGF0ZSByY3VfY3B1X2t0aHJlYWRfdGFzay4gIFRoZXJlIG1pZ2h0IGJlIGFub3RoZXIgQ1BVCisgKiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpdCBkdXJpbmcgYm9vdCwgYnV0IHRoZSBsb2NraW5nIGluIGt0aHJlYWRfYmluZCgpCisgKiB3aWxsIGVuZm9yY2Ugc3VmZmljaWVudCBvcmRlcmluZy4KKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHdlIGNhbm5vdCBzaW1wbHkgcmVmdXNlIHRvIHdha2UgdXAgdGhlIHBlci1DUFUKKyAqIGt0aHJlYWQgYmVjYXVzZSBrdGhyZWFkcyBhcmUgY3JlYXRlZCBpbiBUQVNLX1VOSU5URVJSVVBUSUJMRSBzdGF0ZSwKKyAqIHdoaWNoIGNhbiByZXN1bHQgaW4gc29mdGxvY2t1cCBjb21wbGFpbnRzIGlmIHRoZSB0YXNrIGVuZHMgdXAgYmVpbmcKKyAqIGlkbGUgZm9yIG1vcmUgdGhhbiBhIGNvdXBsZSBvZiBtaW51dGVzLgorICoKKyAqIEhvd2V2ZXIsIHBsZWFzZSBub3RlIGFsc28gdGhhdCB3ZSBjYW5ub3QgYmluZCB0aGUgcGVyLUNQVSBrdGhyZWFkIHRvIGl0cworICogQ1BVIHVudGlsIHRoYXQgQ1BVIGlzIGZ1bGx5IG9ubGluZS4gIFdlIGFsc28gY2Fubm90IHdhaXQgdW50aWwgdGhlCisgKiBDUFUgaXMgZnVsbHkgb25saW5lIGJlZm9yZSB3ZSBjcmVhdGUgaXRzIHBlci1DUFUga3RocmVhZCwgYXMgdGhpcyB3b3VsZAorICogZGVhZGxvY2sgdGhlIHN5c3RlbSB3aGVuIENQVSBub3RpZmllcnMgdHJpZWQgd2FpdGluZyBmb3IgZ3JhY2UKKyAqIHBlcmlvZHMuICBTbyB3ZSBiaW5kIHRoZSBwZXItQ1BVIGt0aHJlYWQgdG8gaXRzIENQVSBvbmx5IGlmIHRoZSBDUFUKKyAqIGlzIG9ubGluZS4gIElmIGl0cyBDUFUgaXMgbm90IHlldCBmdWxseSBvbmxpbmUsIHRoZW4gdGhlIGNvZGUgaW4KKyAqIHJjdV9jcHVfa3RocmVhZCgpIHdpbGwgd2FpdCB1bnRpbCBpdCBpcyBmdWxseSBvbmxpbmUsIGFuZCB0aGVuIGRvCisgKiB0aGUgYmluZGluZy4KKyAqLworc3RhdGljIGludCBfX2NwdWluaXQgcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChpbnQgY3B1KQoreworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwlpZiAoIXJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlIHx8CisJICAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJdCA9IGt0aHJlYWRfY3JlYXRlKHJjdV9jcHVfa3RocmVhZCwgKHZvaWQgKikobG9uZyljcHUsICJyY3VjJWQiLCBjcHUpOworCWlmIChJU19FUlIodCkpCisJCXJldHVybiBQVFJfRVJSKHQpOworCWlmIChjcHVfb25saW5lKGNwdSkpCisJCWt0aHJlYWRfYmluZCh0LCBjcHUpOworCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2NwdSwgY3B1KSA9IGNwdTsKKwlXQVJOX09OX09OQ0UocGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSAhPSBOVUxMKTsKKwlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKKwlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpID0gdDsKKwl3YWtlX3VwX3Byb2Nlc3ModCk7IC8qIEdldCB0byBUQVNLX0lOVEVSUlVQVElCTEUgcXVpY2tseS4gKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlci1yY3Vfbm9kZSBrdGhyZWFkLCB3aGljaCBpcyBpbiBjaGFyZ2Ugb2Ygd2FraW5nIHVwIHRoZSBwZXItQ1BVCisgKiBrdGhyZWFkcyB3aGVuIG5lZWRlZC4gIFdlIGlnbm9yZSByZXF1ZXN0cyB0byB3YWtlIHVwIGt0aHJlYWRzCisgKiBmb3Igb2ZmbGluZSBDUFVzLCB3aGljaCBpcyBPSyBiZWNhdXNlIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpCisgKiB0YWtlcyBjYXJlIG9mIHRoaXMgY2FzZS4KKyAqLworc3RhdGljIGludCByY3Vfbm9kZV9rdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gKHN0cnVjdCByY3Vfbm9kZSAqKWFyZzsKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJZm9yICg7OykgeworCQlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9XQUlUSU5HOworCQlyY3Vfd2FpdChhdG9taWNfcmVhZCgmcm5wLT53YWtlbWFzaykgIT0gMCk7CisJCXJucC0+bm9kZV9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1JVTk5JTkc7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCW1hc2sgPSBhdG9taWNfeGNoZygmcm5wLT53YWtlbWFzaywgMCk7CisJCXJjdV9pbml0aWF0ZV9ib29zdChybnAsIGZsYWdzKTsgLyogcmVsZWFzZXMgcm5wLT5sb2NrLiAqLworCQlmb3IgKGNwdSA9IHJucC0+Z3JwbG87IGNwdSA8PSBybnAtPmdycGhpOyBjcHUrKywgbWFzayA+Pj0gMSkgeworCQkJaWYgKChtYXNrICYgMHgxKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKKwkJCWlmICghY3B1X29ubGluZShjcHUpIHx8IHQgPT0gTlVMTCkgeworCQkJCXByZWVtcHRfZW5hYmxlKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSkgPSAxOworCQkJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOworCQkJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKKwkJCXByZWVtcHRfZW5hYmxlKCk7CisJCX0KKwl9CisJLyogTk9UUkVBQ0hFRCAqLworCXJucC0+bm9kZV9rdGhyZWFkX3N0YXR1cyA9IFJDVV9LVEhSRUFEX1NUT1BQRUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdGhlIHBlci1yY3Vfbm9kZSBrdGhyZWFkJ3MgYWZmaW5pdHkgdG8gY292ZXIgYWxsIENQVXMgdGhhdCBhcmUKKyAqIHNlcnZlZCBieSB0aGUgcmN1X25vZGUgaW4gcXVlc3Rpb24uICBUaGUgQ1BVIGhvdHBsdWcgbG9jayBpcyBzdGlsbAorICogaGVsZCwgc28gdGhlIHZhbHVlIG9mIHJucC0+cXNtYXNraW5pdCB3aWxsIGJlIHN0YWJsZS4KKyAqCisgKiBXZSBkb24ndCBpbmNsdWRlIG91dGdvaW5nY3B1IGluIHRoZSBhZmZpbml0eSBzZXQsIHVzZSAtMSBpZiB0aGVyZSBpcworICogbm8gb3V0Z29pbmcgQ1BVLiAgSWYgdGhlcmUgYXJlIG5vIENQVXMgbGVmdCBpbiB0aGUgYWZmaW5pdHkgc2V0LAorICogdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGt0aHJlYWQgdG8gZXhlY3V0ZSBvbiBhbnkgQ1BVLgorICovCitzdGF0aWMgdm9pZCByY3Vfbm9kZV9rdGhyZWFkX3NldGFmZmluaXR5KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCBpbnQgb3V0Z29pbmdjcHUpCit7CisJY3B1bWFza192YXJfdCBjbTsKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgbWFzayA9IHJucC0+cXNtYXNraW5pdDsKKworCWlmIChybnAtPm5vZGVfa3RocmVhZF90YXNrID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjbSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybjsKKwljcHVtYXNrX2NsZWFyKGNtKTsKKwlmb3IgKGNwdSA9IHJucC0+Z3JwbG87IGNwdSA8PSBybnAtPmdycGhpOyBjcHUrKywgbWFzayA+Pj0gMSkKKwkJaWYgKChtYXNrICYgMHgxKSAmJiBjcHUgIT0gb3V0Z29pbmdjcHUpCisJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBjbSk7CisJaWYgKGNwdW1hc2tfd2VpZ2h0KGNtKSA9PSAwKSB7CisJCWNwdW1hc2tfc2V0YWxsKGNtKTsKKwkJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyspCisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNtKTsKKwkJV0FSTl9PTl9PTkNFKGNwdW1hc2tfd2VpZ2h0KGNtKSA9PSAwKTsKKwl9CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIocm5wLT5ub2RlX2t0aHJlYWRfdGFzaywgY20pOworCXJjdV9ib29zdF9rdGhyZWFkX3NldGFmZmluaXR5KHJucCwgY20pOworCWZyZWVfY3B1bWFza192YXIoY20pOworfQorCisvKgorICogU3Bhd24gYSBwZXItcmN1X25vZGUga3RocmVhZCwgc2V0dGluZyBwcmlvcml0eSBhbmQgYWZmaW5pdHkuCisgKiBDYWxsZWQgZHVyaW5nIGJvb3QgYmVmb3JlIG9ubGluZS9vZmZsaW5lIGNhbiBoYXBwZW4sIG9yLCBpZgorICogZHVyaW5nIHJ1bnRpbWUsIHdpdGggdGhlIG1haW4gQ1BVLWhvdHBsdWcgbG9ja3MgaGVsZC4gIFNvIG9ubHkKKyAqIG9uZSBvZiB0aGVzZSBjYW4gYmUgZXhlY3V0aW5nIGF0IGEgdGltZS4KKyAqLworc3RhdGljIGludCBfX2NwdWluaXQgcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAorCQkJCQkJc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcm5wX2luZGV4ID0gcm5wIC0gJnJzcC0+bm9kZVswXTsKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJaWYgKCFyY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSB8fAorCSAgICBybnAtPnFzbWFza2luaXQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkgeworCQl0ID0ga3RocmVhZF9jcmVhdGUocmN1X25vZGVfa3RocmVhZCwgKHZvaWQgKilybnAsCisJCQkJICAgInJjdW4lZCIsIHJucF9pbmRleCk7CisJCWlmIChJU19FUlIodCkpCisJCQlyZXR1cm4gUFRSX0VSUih0KTsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJcm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9IHQ7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJc3Auc2NoZWRfcHJpb3JpdHkgPSA5OTsKKwkJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKKwkJd2FrZV91cF9wcm9jZXNzKHQpOyAvKiBnZXQgdG8gVEFTS19JTlRFUlJVUFRJQkxFIHF1aWNrbHkuICovCisJfQorCXJldHVybiByY3Vfc3Bhd25fb25lX2Jvb3N0X2t0aHJlYWQocnNwLCBybnAsIHJucF9pbmRleCk7Cit9CisKKy8qCisgKiBTcGF3biBhbGwga3RocmVhZHMgLS0gY2FsbGVkIGFzIHNvb24gYXMgdGhlIHNjaGVkdWxlciBpcyBydW5uaW5nLgorICovCitzdGF0aWMgaW50IF9faW5pdCByY3Vfc3Bhd25fa3RocmVhZHModm9pZCkKK3sKKwlpbnQgY3B1OworCXN0cnVjdCByY3Vfbm9kZSAqcm5wOworCisJcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgPSAxOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpID0gMDsKKwkJaWYgKGNwdV9vbmxpbmUoY3B1KSkKKwkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoY3B1KTsKKwl9CisJcm5wID0gcmN1X2dldF9yb290KHJjdV9zdGF0ZSk7CisJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOworCWlmIChOVU1fUkNVX05PREVTID4gMSkgeworCQlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJjdV9zdGF0ZSwgcm5wKQorCQkJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOworCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X2luaXRjYWxsKHJjdV9zcGF3bl9rdGhyZWFkcyk7CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlcGFyZV9rdGhyZWFkcyhpbnQgY3B1KQoreworCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocmN1X3N0YXRlLT5yZGEsIGNwdSk7CisJc3RydWN0IHJjdV9ub2RlICpybnAgPSByZHAtPm15bm9kZTsKKworCS8qIEZpcmUgdXAgdGhlIGluY29taW5nIENQVSdzIGt0aHJlYWQgYW5kIGxlYWYgcmN1X25vZGUga3RocmVhZC4gKi8KKwlpZiAocmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUpIHsKKwkJKHZvaWQpcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChjcHUpOworCQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQorCQkJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOworCX0KK30KKwogI2Vsc2UgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIAogc3RhdGljIHZvaWQgcmN1X2luaXRpYXRlX2Jvb3N0KHN0cnVjdCByY3Vfbm9kZSAqcm5wLCB1bnNpZ25lZCBsb25nIGZsYWdzKQpAQCAtMTMxMCwyMSArMTcyNiw0MSBAQAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsCi0JCQkJCSAgY3B1bWFza192YXJfdCBjbSkKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY2FsbGJhY2tzX2t0aHJlYWQodm9pZCkKIHsKKwlXQVJOX09OX09OQ0UoMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2Jvb3N0X3N0YXJ0X2dwKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQogewogfQogCi1zdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX2Jvb3N0X2t0aHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAotCQkJCQkJIHN0cnVjdCByY3Vfbm9kZSAqcm5wLAotCQkJCQkJIGludCBybnBfaW5kZXgpCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisKK3N0YXRpYyB2b2lkIHJjdV9zdG9wX2NwdV9rdGhyZWFkKGludCBjcHUpCiB7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3N0YXRpYyB2b2lkIHJjdV9ub2RlX2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSkKK3sKK30KKworc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3NldHJ0KGludCBjcHUsIGludCB0b19ydCkKK3sKK30KKworc3RhdGljIGludCBfX2luaXQgcmN1X3NjaGVkdWxlcl9yZWFsbHlfc3RhcnRlZCh2b2lkKQoreworCXJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlID0gMTsKIAlyZXR1cm4gMDsKIH0KK2Vhcmx5X2luaXRjYWxsKHJjdV9zY2hlZHVsZXJfcmVhbGx5X3N0YXJ0ZWQpOworCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X3ByZXBhcmVfa3RocmVhZHMoaW50IGNwdSkKK3sKK30KIAogI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCiAKQEAgLTE1MDAsNyArMTkzNiw3IEBACiAgKgogICogQmVjYXVzZSBpdCBpcyBub3QgbGVnYWwgdG8gaW52b2tlIHJjdV9wcm9jZXNzX2NhbGxiYWNrcygpIHdpdGggaXJxcwogICogZGlzYWJsZWQsIHdlIGRvIG9uZSBwYXNzIG9mIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpLCB0aGVuIGRvIGEKLSAqIGludm9rZV9yY3VfY3B1X2t0aHJlYWQoKSB0byBjYXVzZSByY3VfcHJvY2Vzc19jYWxsYmFja3MoKSB0byBiZSBpbnZva2VkCisgKiBpbnZva2VfcmN1X2NvcmUoKSB0byBjYXVzZSByY3VfcHJvY2Vzc19jYWxsYmFja3MoKSB0byBiZSBpbnZva2VkCiAgKiBsYXRlci4gIFRoZSBwZXItY3B1IHJjdV9keW50aWNrX2RyYWluIHZhcmlhYmxlIGNvbnRyb2xzIHRoZSBzZXF1ZW5jaW5nLgogICovCiBpbnQgcmN1X25lZWRzX2NwdShpbnQgY3B1KQpAQCAtMTU1MSw3ICsxOTg3LDcgQEAKIAogCS8qIElmIFJDVSBjYWxsYmFja3MgYXJlIHN0aWxsIHBlbmRpbmcsIFJDVSBzdGlsbCBuZWVkcyB0aGlzIENQVS4gKi8KIAlpZiAoYykKLQkJaW52b2tlX3JjdV9jcHVfa3RocmVhZCgpOworCQlpbnZva2VfcmN1X2NvcmUoKTsKIAlyZXR1cm4gYzsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYyBiL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKaW5kZXggOTY3OGNjMy4uNGUxNDQ4NyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYworKysgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCkBAIC00Niw2ICs0Niw4IEBACiAjZGVmaW5lIFJDVV9UUkVFX05PTkNPUkUKICNpbmNsdWRlICJyY3V0cmVlLmgiCiAKKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisKIERFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHJjdV9jcHVfa3RocmVhZF9zdGF0dXMpOwogREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX2NwdSk7CiBERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgaW50LCByY3VfY3B1X2t0aHJlYWRfbG9vcHMpOwpAQCAtNTgsNiArNjAsOCBAQAogCXJldHVybiAiU1JXT1kiW2t0aHJlYWRfc3RhdHVzXTsKIH0KIAorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisKIHN0YXRpYyB2b2lkIHByaW50X29uZV9yY3VfZGF0YShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCByY3VfZGF0YSAqcmRwKQogewogCWlmICghcmRwLT5iZWVub25saW5lKQpAQCAtNzYsNyArODAsNyBAQAogCQkgICByZHAtPmR5bnRpY2tzX2Zxcyk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCXNlcV9wcmludGYobSwgIiBvZj0lbHUgcmk9JWx1IiwgcmRwLT5vZmZsaW5lX2ZxcywgcmRwLT5yZXNjaGVkX2lwaSk7Ci0Jc2VxX3ByaW50ZihtLCAiIHFsPSVsZCBxcz0lYyVjJWMlYyBrdD0lZC8lYy8lZCBrdGw9JXggYj0lbGQiLAorCXNlcV9wcmludGYobSwgIiBxbD0lbGQgcXM9JWMlYyVjJWMiLAogCQkgICByZHAtPnFsZW4sCiAJCSAgICIuTiJbcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdICE9CiAJCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF1dLApAQCAtODQsMTMgKzg4LDE2IEBACiAJCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF1dLAogCQkgICAiLlciW3JkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSAhPQogCQkJcmRwLT5ueHR0YWlsW1JDVV9XQUlUX1RBSUxdXSwKLQkJICAgIi5EIlsmcmRwLT5ueHRsaXN0ICE9IHJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXV0sCisJCSAgICIuRCJbJnJkcC0+bnh0bGlzdCAhPSByZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF1dKTsKKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisJc2VxX3ByaW50ZihtLCAiIGt0PSVkLyVjLyVkIGt0bD0leCIsCiAJCSAgIHBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgcmRwLT5jcHUpLAogCQkgICBjb252ZXJ0X2t0aHJlYWRfc3RhdHVzKHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3N0YXR1cywKIAkJCQkJICByZHAtPmNwdSkpLAogCQkgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIHJkcC0+Y3B1KSwKLQkJICAgcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfbG9vcHMsIHJkcC0+Y3B1KSAmIDB4ZmZmZiwKLQkJICAgcmRwLT5ibGltaXQpOworCQkgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9sb29wcywgcmRwLT5jcHUpICYgMHhmZmZmKTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCXNlcV9wcmludGYobSwgIiBiPSVsZCIsIHJkcC0+YmxpbWl0KTsKIAlzZXFfcHJpbnRmKG0sICIgY2k9JWx1IGNvPSVsdSBjYT0lbHVcbiIsCiAJCSAgIHJkcC0+bl9jYnNfaW52b2tlZCwgcmRwLT5uX2Nic19vcnBoYW5lZCwgcmRwLT5uX2Nic19hZG9wdGVkKTsKIH0KQEAgLTE0NywxOCArMTU0LDIxIEBACiAJCSAgIHJkcC0+ZHludGlja3NfZnFzKTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAJc2VxX3ByaW50ZihtLCAiLCVsdSwlbHUiLCByZHAtPm9mZmxpbmVfZnFzLCByZHAtPnJlc2NoZWRfaXBpKTsKLQlzZXFfcHJpbnRmKG0sICIsJWxkLFwiJWMlYyVjJWNcIiwlZCxcIiVjXCIsJWxkIiwgcmRwLT5xbGVuLAorCXNlcV9wcmludGYobSwgIiwlbGQsXCIlYyVjJWMlY1wiIiwgcmRwLT5xbGVuLAogCQkgICAiLk4iW3JkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSAhPQogCQkJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdXSwKIAkJICAgIi5SIltyZHAtPm54dHRhaWxbUkNVX1dBSVRfVEFJTF0gIT0KIAkJCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXV0sCiAJCSAgICIuVyJbcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdICE9CiAJCQlyZHAtPm54dHRhaWxbUkNVX1dBSVRfVEFJTF1dLAotCQkgICAiLkQiWyZyZHAtPm54dGxpc3QgIT0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdXSwKKwkJICAgIi5EIlsmcmRwLT5ueHRsaXN0ICE9IHJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXV0pOworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKwlzZXFfcHJpbnRmKG0sICIsJWQsXCIlY1wiIiwKIAkJICAgcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCByZHAtPmNwdSksCiAJCSAgIGNvbnZlcnRfa3RocmVhZF9zdGF0dXMocGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLAotCQkJCQkgIHJkcC0+Y3B1KSksCi0JCSAgIHJkcC0+YmxpbWl0KTsKKwkJCQkJICByZHAtPmNwdSkpKTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCXNlcV9wcmludGYobSwgIiwlbGQiLCByZHAtPmJsaW1pdCk7CiAJc2VxX3ByaW50ZihtLCAiLCVsdSwlbHUsJWx1XG4iLAogCQkgICByZHAtPm5fY2JzX2ludm9rZWQsIHJkcC0+bl9jYnNfb3JwaGFuZWQsIHJkcC0+bl9jYnNfYWRvcHRlZCk7CiB9CkBAIC0xNjksNyArMTc5LDExIEBACiAjaWZkZWYgQ09ORklHX05PX0haCiAJc2VxX3B1dHMobSwgIlwiZHRcIixcImR0IG5lc3RpbmdcIixcImR0IE5NSSBuZXN0aW5nXCIsXCJkZlwiLCIpOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KLQlzZXFfcHV0cyhtLCAiXCJvZlwiLFwicmlcIixcInFsXCIsXCJiXCIsXCJjaVwiLFwiY29cIixcImNhXCJcbiIpOworCXNlcV9wdXRzKG0sICJcIm9mXCIsXCJyaVwiLFwicWxcIixcInFzXCIiKTsKKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisJc2VxX3B1dHMobSwgIlwia3RcIixcImt0bFwiIik7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKwlzZXFfcHV0cyhtLCAiLFwiYlwiLFwiY2lcIixcImNvXCIsXCJjYVwiXG4iKTsKICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVQogCXNlcV9wdXRzKG0sICJcInJjdV9wcmVlbXB0OlwiXG4iKTsKIAlQUklOVF9SQ1VfREFUQShyY3VfcHJlZW1wdF9kYXRhLCBwcmludF9vbmVfcmN1X2RhdGFfY3N2LCBtKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNvdXJjZS5jIGIva2VybmVsL3Jlc291cmNlLmMKaW5kZXggNzk4ZTJmYS4uM2ZmNDAxNyAxMDA2NDQKLS0tIGEva2VybmVsL3Jlc291cmNlLmMKKysrIGIva2VybmVsL3Jlc291cmNlLmMKQEAgLTM4LDYgKzM4LDE0IEBACiB9OwogRVhQT1JUX1NZTUJPTChpb21lbV9yZXNvdXJjZSk7CiAKKy8qIGNvbnN0cmFpbnRzIHRvIGJlIG1ldCB3aGlsZSBhbGxvY2F0aW5nIHJlc291cmNlcyAqLworc3RydWN0IHJlc291cmNlX2NvbnN0cmFpbnQgeworCXJlc291cmNlX3NpemVfdCBtaW4sIG1heCwgYWxpZ247CisJcmVzb3VyY2Vfc2l6ZV90ICgqYWxpZ25mKSh2b2lkICosIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqLAorCQkJcmVzb3VyY2Vfc2l6ZV90LCByZXNvdXJjZV9zaXplX3QpOworCXZvaWQgKmFsaWduZl9kYXRhOworfTsKKwogc3RhdGljIERFRklORV9SV0xPQ0socmVzb3VyY2VfbG9jayk7CiAKIHN0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKQEAgLTM4NCwxNiArMzkyLDEzIEBACiB9CiAKIC8qCi0gKiBGaW5kIGVtcHR5IHNsb3QgaW4gdGhlIHJlc291cmNlIHRyZWUgZ2l2ZW4gcmFuZ2UgYW5kIGFsaWdubWVudC4KKyAqIEZpbmQgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSB3aXRoIHRoZSBnaXZlbiByYW5nZSBhbmQKKyAqIGFsaWdubWVudCBjb25zdHJhaW50cwogICovCi1zdGF0aWMgaW50IGZpbmRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldywKLQkJCSByZXNvdXJjZV9zaXplX3Qgc2l6ZSwgcmVzb3VyY2Vfc2l6ZV90IG1pbiwKLQkJCSByZXNvdXJjZV9zaXplX3QgbWF4LCByZXNvdXJjZV9zaXplX3QgYWxpZ24sCi0JCQkgcmVzb3VyY2Vfc2l6ZV90ICgqYWxpZ25mKSh2b2lkICosCi0JCQkJCQkgICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiwKLQkJCQkJCSAgIHJlc291cmNlX3NpemVfdCwKLQkJCQkJCSAgIHJlc291cmNlX3NpemVfdCksCi0JCQkgdm9pZCAqYWxpZ25mX2RhdGEpCitzdGF0aWMgaW50IF9fZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXJjZSAqb2xkLAorCQkJIHN0cnVjdCByZXNvdXJjZSAqbmV3LAorCQkJIHJlc291cmNlX3NpemVfdCAgc2l6ZSwKKwkJCSBzdHJ1Y3QgcmVzb3VyY2VfY29uc3RyYWludCAqY29uc3RyYWludCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnRoaXMgPSByb290LT5jaGlsZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgdG1wID0gKm5ldywgYXZhaWwsIGFsbG9jOwpAQCAtNDA0LDI1ICs0MDksMjYgQEAKIAkgKiBTa2lwIHBhc3QgYW4gYWxsb2NhdGVkIHJlc291cmNlIHRoYXQgc3RhcnRzIGF0IDAsIHNpbmNlIHRoZSBhc3NpZ25tZW50CiAJICogb2YgdGhpcy0+c3RhcnQgLSAxIHRvIHRtcC0+ZW5kIGJlbG93IHdvdWxkIGNhdXNlIGFuIHVuZGVyZmxvdy4KIAkgKi8KLQlpZiAodGhpcyAmJiB0aGlzLT5zdGFydCA9PSAwKSB7Ci0JCXRtcC5zdGFydCA9IHRoaXMtPmVuZCArIDE7CisJaWYgKHRoaXMgJiYgdGhpcy0+c3RhcnQgPT0gcm9vdC0+c3RhcnQpIHsKKwkJdG1wLnN0YXJ0ID0gKHRoaXMgPT0gb2xkKSA/IG9sZC0+c3RhcnQgOiB0aGlzLT5lbmQgKyAxOwogCQl0aGlzID0gdGhpcy0+c2libGluZzsKIAl9CiAJZm9yKDs7KSB7CiAJCWlmICh0aGlzKQotCQkJdG1wLmVuZCA9IHRoaXMtPnN0YXJ0IC0gMTsKKwkJCXRtcC5lbmQgPSAodGhpcyA9PSBvbGQpID8gIHRoaXMtPmVuZCA6IHRoaXMtPnN0YXJ0IC0gMTsKIAkJZWxzZQogCQkJdG1wLmVuZCA9IHJvb3QtPmVuZDsKIAotCQlyZXNvdXJjZV9jbGlwKCZ0bXAsIG1pbiwgbWF4KTsKKwkJcmVzb3VyY2VfY2xpcCgmdG1wLCBjb25zdHJhaW50LT5taW4sIGNvbnN0cmFpbnQtPm1heCk7CiAJCWFyY2hfcmVtb3ZlX3Jlc2VydmF0aW9ucygmdG1wKTsKIAogCQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgYWZ0ZXIgQUxJR04oKSAqLwogCQlhdmFpbCA9ICpuZXc7Ci0JCWF2YWlsLnN0YXJ0ID0gQUxJR04odG1wLnN0YXJ0LCBhbGlnbik7CisJCWF2YWlsLnN0YXJ0ID0gQUxJR04odG1wLnN0YXJ0LCBjb25zdHJhaW50LT5hbGlnbik7CiAJCWF2YWlsLmVuZCA9IHRtcC5lbmQ7CiAJCWlmIChhdmFpbC5zdGFydCA+PSB0bXAuc3RhcnQpIHsKLQkJCWFsbG9jLnN0YXJ0ID0gYWxpZ25mKGFsaWduZl9kYXRhLCAmYXZhaWwsIHNpemUsIGFsaWduKTsKKwkJCWFsbG9jLnN0YXJ0ID0gY29uc3RyYWludC0+YWxpZ25mKGNvbnN0cmFpbnQtPmFsaWduZl9kYXRhLCAmYXZhaWwsCisJCQkJCXNpemUsIGNvbnN0cmFpbnQtPmFsaWduKTsKIAkJCWFsbG9jLmVuZCA9IGFsbG9jLnN0YXJ0ICsgc2l6ZSAtIDE7CiAJCQlpZiAocmVzb3VyY2VfY29udGFpbnMoJmF2YWlsLCAmYWxsb2MpKSB7CiAJCQkJbmV3LT5zdGFydCA9IGFsbG9jLnN0YXJ0OwpAQCAtNDMyLDE0ICs0MzgsNzUgQEAKIAkJfQogCQlpZiAoIXRoaXMpCiAJCQlicmVhazsKLQkJdG1wLnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKKwkJaWYgKHRoaXMgIT0gb2xkKQorCQkJdG1wLnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKIAkJdGhpcyA9IHRoaXMtPnNpYmxpbmc7CiAJfQogCXJldHVybiAtRUJVU1k7CiB9CiAKKy8qCisgKiBGaW5kIGVtcHR5IHNsb3QgaW4gdGhlIHJlc291cmNlIHRyZWUgZ2l2ZW4gcmFuZ2UgYW5kIGFsaWdubWVudC4KKyAqLworc3RhdGljIGludCBmaW5kX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpuZXcsCisJCQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSwKKwkJCXN0cnVjdCByZXNvdXJjZV9jb25zdHJhaW50ICAqY29uc3RyYWludCkKK3sKKwlyZXR1cm4gIF9fZmluZF9yZXNvdXJjZShyb290LCBOVUxMLCBuZXcsIHNpemUsIGNvbnN0cmFpbnQpOworfQorCiAvKioKLSAqIGFsbG9jYXRlX3Jlc291cmNlIC0gYWxsb2NhdGUgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSBnaXZlbiByYW5nZSAmIGFsaWdubWVudAorICogcmVhbGxvY2F0ZV9yZXNvdXJjZSAtIGFsbG9jYXRlIGEgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSBnaXZlbiByYW5nZSAmIGFsaWdubWVudC4KKyAqCVRoZSByZXNvdXJjZSB3aWxsIGJlIHJlbG9jYXRlZCBpZiB0aGUgbmV3IHNpemUgY2Fubm90IGJlIHJlYWxsb2NhdGVkIGluIHRoZQorICoJY3VycmVudCBsb2NhdGlvbi4KKyAqCisgKiBAcm9vdDogcm9vdCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBAb2xkOiAgcmVzb3VyY2UgZGVzY3JpcHRvciBkZXNpcmVkIGJ5IGNhbGxlcgorICogQG5ld3NpemU6IG5ldyBzaXplIG9mIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBAY29uc3RyYWludDogdGhlIHNpemUgYW5kIGFsaWdubWVudCBjb25zdHJhaW50cyB0byBiZSBtZXQuCisgKi8KK2ludCByZWFsbG9jYXRlX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpvbGQsCisJCQlyZXNvdXJjZV9zaXplX3QgbmV3c2l6ZSwKKwkJCXN0cnVjdCByZXNvdXJjZV9jb25zdHJhaW50ICAqY29uc3RyYWludCkKK3sKKwlpbnQgZXJyPTA7CisJc3RydWN0IHJlc291cmNlIG5ldyA9ICpvbGQ7CisJc3RydWN0IHJlc291cmNlICpjb25mbGljdDsKKworCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOworCisJaWYgKChlcnIgPSBfX2ZpbmRfcmVzb3VyY2Uocm9vdCwgb2xkLCAmbmV3LCBuZXdzaXplLCBjb25zdHJhaW50KSkpCisJCWdvdG8gb3V0OworCisJaWYgKHJlc291cmNlX2NvbnRhaW5zKCZuZXcsIG9sZCkpIHsKKwkJb2xkLT5zdGFydCA9IG5ldy5zdGFydDsKKwkJb2xkLT5lbmQgPSBuZXcuZW5kOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAob2xkLT5jaGlsZCkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyZXNvdXJjZV9jb250YWlucyhvbGQsICZuZXcpKSB7CisJCW9sZC0+c3RhcnQgPSBuZXcuc3RhcnQ7CisJCW9sZC0+ZW5kID0gbmV3LmVuZDsKKwl9IGVsc2UgeworCQlfX3JlbGVhc2VfcmVzb3VyY2Uob2xkKTsKKwkJKm9sZCA9IG5ldzsKKwkJY29uZmxpY3QgPSBfX3JlcXVlc3RfcmVzb3VyY2Uocm9vdCwgb2xkKTsKKwkJQlVHX09OKGNvbmZsaWN0KTsKKwl9CitvdXQ6CisJd3JpdGVfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qKgorICogYWxsb2NhdGVfcmVzb3VyY2UgLSBhbGxvY2F0ZSBlbXB0eSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIGdpdmVuIHJhbmdlICYgYWxpZ25tZW50LgorICogCVRoZSByZXNvdXJjZSB3aWxsIGJlIHJlYWxsb2NhdGVkIHdpdGggYSBuZXcgc2l6ZSBpZiBpdCB3YXMgYWxyZWFkeSBhbGxvY2F0ZWQKICAqIEByb290OiByb290IHJlc291cmNlIGRlc2NyaXB0b3IKICAqIEBuZXc6IHJlc291cmNlIGRlc2NyaXB0b3IgZGVzaXJlZCBieSBjYWxsZXIKICAqIEBzaXplOiByZXF1ZXN0ZWQgcmVzb3VyY2UgcmVnaW9uIHNpemUKQEAgLTQ1OSwxMiArNTI2LDI1IEBACiAJCSAgICAgIHZvaWQgKmFsaWduZl9kYXRhKQogewogCWludCBlcnI7CisJc3RydWN0IHJlc291cmNlX2NvbnN0cmFpbnQgY29uc3RyYWludDsKIAogCWlmICghYWxpZ25mKQogCQlhbGlnbmYgPSBzaW1wbGVfYWxpZ25fcmVzb3VyY2U7CiAKKwljb25zdHJhaW50Lm1pbiA9IG1pbjsKKwljb25zdHJhaW50Lm1heCA9IG1heDsKKwljb25zdHJhaW50LmFsaWduID0gYWxpZ247CisJY29uc3RyYWludC5hbGlnbmYgPSBhbGlnbmY7CisJY29uc3RyYWludC5hbGlnbmZfZGF0YSA9IGFsaWduZl9kYXRhOworCisJaWYgKCBuZXctPnBhcmVudCApIHsKKwkJLyogcmVzb3VyY2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIHRyeSByZWFsbG9jYXRpbmcgd2l0aAorCQkgICB0aGUgbmV3IGNvbnN0cmFpbnRzICovCisJCXJldHVybiByZWFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIG5ldywgc2l6ZSwgJmNvbnN0cmFpbnQpOworCX0KKwogCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwotCWVyciA9IGZpbmRfcmVzb3VyY2Uocm9vdCwgbmV3LCBzaXplLCBtaW4sIG1heCwgYWxpZ24sIGFsaWduZiwgYWxpZ25mX2RhdGEpOworCWVyciA9IGZpbmRfcmVzb3VyY2Uocm9vdCwgbmV3LCBzaXplLCAmY29uc3RyYWludCk7CiAJaWYgKGVyciA+PSAwICYmIF9fcmVxdWVzdF9yZXNvdXJjZShyb290LCBuZXcpKQogCQllcnIgPSAtRUJVU1k7CiAJd3JpdGVfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggY2JiM2EwZS4uZmRlNmZmOSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTI5Miw4ICsyOTIsOCBAQAogICogKFRoZSBkZWZhdWx0IHdlaWdodCBpcyAxMDI0IC0gc28gdGhlcmUncyBubyBwcmFjdGljYWwKICAqICBsaW1pdGF0aW9uIGZyb20gdGhpcy4pCiAgKi8KLSNkZWZpbmUgTUlOX1NIQVJFUwkyCi0jZGVmaW5lIE1BWF9TSEFSRVMJKDFVTCA8PCAoMTggKyBTQ0hFRF9MT0FEX1JFU09MVVRJT04pKQorI2RlZmluZSBNSU5fU0hBUkVTCSgxVUwgPDwgIDEpCisjZGVmaW5lIE1BWF9TSEFSRVMJKDFVTCA8PCAxOCkKIAogc3RhdGljIGludCByb290X3Rhc2tfZ3JvdXBfbG9hZCA9IFJPT1RfVEFTS19HUk9VUF9MT0FEOwogI2VuZGlmCkBAIC02MDUsMTAgKzYwNSwxMCBAQAogLyoKICAqIFJldHVybiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhpcyB0YXNrcyBiZWxvbmdzLgogICoKLSAqIFdlIHVzZSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjaygpIGFuZCBleHRlbmQgdGhlIFJDVSB2ZXJpZmljYXRpb24KLSAqIHdpdGggbG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSBiZWNhdXNlIGNwdV9jZ3JvdXBfYXR0YWNoKCkKLSAqIGhvbGRzIHRoYXQgbG9jayBmb3IgZWFjaCB0YXNrIGl0IG1vdmVzIGludG8gdGhlIGNncm91cC4gVGhlcmVmb3JlCi0gKiBieSBob2xkaW5nIHRoYXQgbG9jaywgd2UgcGluIHRoZSB0YXNrIHRvIHRoZSBjdXJyZW50IGNncm91cC4KKyAqIFdlIHVzZSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjaygpIGFuZCBleHRlbmQgdGhlIFJDVSB2ZXJpZmljYXRpb24gd2l0aAorICogcGktPmxvY2sgYW5kIHJxLT5sb2NrIGJlY2F1c2UgY3B1X2Nncm91cF9hdHRhY2goKSBob2xkcyB0aG9zZSBsb2NrcyBmb3IgZWFjaAorICogdGFzayBpdCBtb3ZlcyBpbnRvIHRoZSBjZ3JvdXAuIFRoZXJlZm9yZSBieSBob2xkaW5nIGVpdGhlciBvZiB0aG9zZSBsb2NrcywKKyAqIHdlIHBpbiB0aGUgdGFzayB0byB0aGUgY3VycmVudCBjZ3JvdXAuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKnRhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewpAQCAtNjE2LDcgKzYxNiw4IEBACiAJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKIAogCWNzcyA9IHRhc2tfc3Vic3lzX3N0YXRlX2NoZWNrKHAsIGNwdV9jZ3JvdXBfc3Vic3lzX2lkLAotCQkJbG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSk7CisJCQlsb2NrZGVwX2lzX2hlbGQoJnAtPnBpX2xvY2spIHx8CisJCQlsb2NrZGVwX2lzX2hlbGQoJnRhc2tfcnEocCktPmxvY2spKTsKIAl0ZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCB0YXNrX2dyb3VwLCBjc3MpOwogCiAJcmV0dXJuIGF1dG9ncm91cF90YXNrX2dyb3VwKHAsIHRnKTsKQEAgLTIyMDAsNiArMjIwMSwxNiBAQAogCQkJISh0YXNrX3RocmVhZF9pbmZvKHApLT5wcmVlbXB0X2NvdW50ICYgUFJFRU1QVF9BQ1RJVkUpKTsKIAogI2lmZGVmIENPTkZJR19MT0NLREVQCisJLyoKKwkgKiBUaGUgY2FsbGVyIHNob3VsZCBob2xkIGVpdGhlciBwLT5waV9sb2NrIG9yIHJxLT5sb2NrLCB3aGVuIGNoYW5naW5nCisJICogYSB0YXNrJ3MgQ1BVLiAtPnBpX2xvY2sgZm9yIHdha2luZyB0YXNrcywgcnEtPmxvY2sgZm9yIHJ1bm5hYmxlIHRhc2tzLgorCSAqCisJICogc2NoZWRfbW92ZV90YXNrKCkgaG9sZHMgYm90aCBhbmQgdGh1cyBob2xkaW5nIGVpdGhlciBwaW5zIHRoZSBjZ3JvdXAsCisJICogc2VlIHNldF90YXNrX3JxKCkuCisJICoKKwkgKiBGdXJ0aGVybW9yZSwgYWxsIHRhc2tfcnEgdXNlcnMgc2hvdWxkIGFjcXVpcmUgYm90aCBsb2Nrcywgc2VlCisJICogdGFza19ycV9sb2NrKCkuCisJICovCiAJV0FSTl9PTl9PTkNFKGRlYnVnX2xvY2tzICYmICEobG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSB8fAogCQkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykpKTsKICNlbmRpZgpAQCAtMjQ0Nyw2ICsyNDU4LDEwIEBACiAJCX0KIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQorCisJaWYgKHdha2VfZmxhZ3MgJiBXRl9NSUdSQVRFRCkKKwkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSk7CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIAlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2NvdW50KTsKQEAgLTI0NTUsOSArMjQ3MCw2IEBACiAJaWYgKHdha2VfZmxhZ3MgJiBXRl9TWU5DKQogCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jKTsKIAotCWlmIChjcHUgIT0gdGFza19jcHUocCkpCi0JCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX21pZ3JhdGUpOwotCiAjZW5kaWYgLyogQ09ORklHX1NDSEVEU1RBVFMgKi8KIH0KIApAQCAtMjUzMiwxMyArMjU0NCw5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBzY2hlZF90dHd1X3BlbmRpbmcodm9pZCkKK3N0YXRpYyB2b2lkIHNjaGVkX3R0d3VfZG9fcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxpc3QpCiB7CiAJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxpc3QgPSB4Y2hnKCZycS0+d2FrZV9saXN0LCBOVUxMKTsKLQotCWlmICghbGlzdCkKLQkJcmV0dXJuOwogCiAJcmF3X3NwaW5fbG9jaygmcnEtPmxvY2spOwogCkBAIC0yNTUxLDkgKzI1NTksNDUgQEAKIAlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCitzdGF0aWMgdm9pZCBzY2hlZF90dHd1X3BlbmRpbmcodm9pZCkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gdGhpc19ycSgpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGlzdCA9IHhjaGcoJnJxLT53YWtlX2xpc3QsIE5VTEwpOworCisJaWYgKCFsaXN0KQorCQlyZXR1cm47CisKKwlzY2hlZF90dHd1X2RvX3BlbmRpbmcobGlzdCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwogdm9pZCBzY2hlZHVsZXJfaXBpKHZvaWQpCiB7Ci0Jc2NoZWRfdHR3dV9wZW5kaW5nKCk7CisJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxpc3QgPSB4Y2hnKCZycS0+d2FrZV9saXN0LCBOVUxMKTsKKworCWlmICghbGlzdCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBOb3QgYWxsIHJlc2NoZWR1bGUgSVBJIGhhbmRsZXJzIGNhbGwgaXJxX2VudGVyL2lycV9leGl0LCBzaW5jZQorCSAqIHRyYWRpdGlvbmFsbHkgYWxsIHRoZWlyIHdvcmsgd2FzIGRvbmUgZnJvbSB0aGUgaW50ZXJydXB0IHJldHVybgorCSAqIHBhdGguIE5vdyB0aGF0IHdlIGFjdHVhbGx5IGRvIHNvbWUgd29yaywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkgKiB3ZSBkbyBjYWxsIHRoZW0uCisJICoKKwkgKiBTb21lIGFyY2hzIGFscmVhZHkgZG8gY2FsbCB0aGVtLCBsdWNraWx5IGlycV9lbnRlci9leGl0IG5lc3QKKwkgKiBwcm9wZXJseS4KKwkgKgorCSAqIEFyZ3VhYmx5IHdlIHNob3VsZCB2aXNpdCBhbGwgYXJjaHMgYW5kIHVwZGF0ZSBhbGwgaGFuZGxlcnMsCisJICogaG93ZXZlciBhIGZhaXIgc2hhcmUgb2YgSVBJcyBhcmUgc3RpbGwgcmVzY2hlZCBvbmx5IHNvIHRoaXMgd291bGQKKwkgKiBzb21ld2hhdCBwZXNzaW1pemUgdGhlIHNpbXBsZSByZXNjaGVkIGNhc2UuCisJICovCisJaXJxX2VudGVyKCk7CisJc2NoZWRfdHR3dV9kb19wZW5kaW5nKGxpc3QpOworCWlycV9leGl0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIHR0d3VfcXVldWVfcmVtb3RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGNwdSkKQEAgLTI2MDAsNiArMjY0NCw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVApCiAJaWYgKHNjaGVkX2ZlYXQoVFRXVV9RVUVVRSkgJiYgY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQlzY2hlZF9jbG9ja19jcHUoY3B1KTsgLyogc3luYyBjbG9ja3MgeC1jcHUgKi8KIAkJdHR3dV9xdWV1ZV9yZW1vdGUocCwgY3B1KTsKIAkJcmV0dXJuOwogCX0KQEAgLTI2NzQsOCArMjcxOSwxMCBAQAogCQlwLT5zY2hlZF9jbGFzcy0+dGFza193YWtpbmcocCk7CiAKIAljcHUgPSBzZWxlY3RfdGFza19ycShwLCBTRF9CQUxBTkNFX1dBS0UsIHdha2VfZmxhZ3MpOwotCWlmICh0YXNrX2NwdShwKSAhPSBjcHUpCisJaWYgKHRhc2tfY3B1KHApICE9IGNwdSkgeworCQl3YWtlX2ZsYWdzIHw9IFdGX01JR1JBVEVEOwogCQlzZXRfdGFza19jcHUocCwgY3B1KTsKKwl9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAJdHR3dV9xdWV1ZShwLCBjcHUpOwpAQCAtNjU0Miw3ICs2NTg5LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKCFncm91cC0+Y3B1X3Bvd2VyKSB7CisJCWlmICghZ3JvdXAtPnNncC0+cG93ZXIpIHsKIAkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBkb21haW4tPmNwdV9wb3dlciBub3QgIgogCQkJCQkic2V0XG4iKTsKQEAgLTY1NjYsOSArNjYxMyw5IEBACiAJCWNwdWxpc3Rfc2NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksIHNjaGVkX2dyb3VwX2NwdXMoZ3JvdXApKTsKIAogCQlwcmludGsoS0VSTl9DT05UICIgJXMiLCBzdHIpOwotCQlpZiAoZ3JvdXAtPmNwdV9wb3dlciAhPSBTQ0hFRF9QT1dFUl9TQ0FMRSkgeworCQlpZiAoZ3JvdXAtPnNncC0+cG93ZXIgIT0gU0NIRURfUE9XRVJfU0NBTEUpIHsKIAkJCXByaW50ayhLRVJOX0NPTlQgIiAoY3B1X3Bvd2VyID0gJWQpIiwKLQkJCQlncm91cC0+Y3B1X3Bvd2VyKTsKKwkJCQlncm91cC0+c2dwLT5wb3dlcik7CiAJCX0KIAogCQlncm91cCA9IGdyb3VwLT5uZXh0OwpAQCAtNjc1OSwxMSArNjgwNiwzOSBAQAogCXJldHVybiByZDsKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9zY2hlZF9ncm91cHMoc3RydWN0IHNjaGVkX2dyb3VwICpzZywgaW50IGZyZWVfc2dwKQoreworCXN0cnVjdCBzY2hlZF9ncm91cCAqdG1wLCAqZmlyc3Q7CisKKwlpZiAoIXNnKQorCQlyZXR1cm47CisKKwlmaXJzdCA9IHNnOworCWRvIHsKKwkJdG1wID0gc2ctPm5leHQ7CisKKwkJaWYgKGZyZWVfc2dwICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnNnLT5zZ3AtPnJlZikpCisJCQlrZnJlZShzZy0+c2dwKTsKKworCQlrZnJlZShzZyk7CisJCXNnID0gdG1wOworCX0gd2hpbGUgKHNnICE9IGZpcnN0KTsKK30KKwogc3RhdGljIHZvaWQgZnJlZV9zY2hlZF9kb21haW4oc3RydWN0IHJjdV9oZWFkICpyY3UpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluLCByY3UpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZC0+Z3JvdXBzLT5yZWYpKQorCisJLyoKKwkgKiBJZiBpdHMgYW4gb3ZlcmxhcHBpbmcgZG9tYWluIGl0IGhhcyBwcml2YXRlIGdyb3VwcywgaXRlcmF0ZSBhbmQKKwkgKiBudWtlIHRoZW0gYWxsLgorCSAqLworCWlmIChzZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSB7CisJCWZyZWVfc2NoZWRfZ3JvdXBzKHNkLT5ncm91cHMsIDEpOworCX0gZWxzZSBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2QtPmdyb3Vwcy0+cmVmKSkgeworCQlrZnJlZShzZC0+Z3JvdXBzLT5zZ3ApOwogCQlrZnJlZShzZC0+Z3JvdXBzKTsKKwl9CiAJa2ZyZWUoc2QpOwogfQogCkBAIC02OTMwLDYgKzcwMDUsNyBAQAogc3RydWN0IHNkX2RhdGEgewogCXN0cnVjdCBzY2hlZF9kb21haW4gKipfX3BlcmNwdSBzZDsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipfX3BlcmNwdSBzZzsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIgKipfX3BlcmNwdSBzZ3A7CiB9OwogCiBzdHJ1Y3Qgc19kYXRhIHsKQEAgLTY5NDksMTUgKzcwMjUsNzMgQEAKIHR5cGVkZWYgc3RydWN0IHNjaGVkX2RvbWFpbiAqKCpzY2hlZF9kb21haW5faW5pdF9mKShzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bCwgaW50IGNwdSk7CiB0eXBlZGVmIGNvbnN0IHN0cnVjdCBjcHVtYXNrICooKnNjaGVkX2RvbWFpbl9tYXNrX2YpKGludCBjcHUpOwogCisjZGVmaW5lIFNEVExfT1ZFUkxBUAkweDAxCisKIHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgewogCXNjaGVkX2RvbWFpbl9pbml0X2YgaW5pdDsKIAlzY2hlZF9kb21haW5fbWFza19mIG1hc2s7CisJaW50CQkgICAgZmxhZ3M7CiAJc3RydWN0IHNkX2RhdGEgICAgICBkYXRhOwogfTsKIAotLyoKLSAqIEFzc3VtZXMgdGhlIHNjaGVkX2RvbWFpbiB0cmVlIGlzIGZ1bGx5IGNvbnN0cnVjdGVkCi0gKi8KK3N0YXRpYyBpbnQKK2J1aWxkX292ZXJsYXBfc2NoZWRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQoreworCXN0cnVjdCBzY2hlZF9ncm91cCAqZmlyc3QgPSBOVUxMLCAqbGFzdCA9IE5VTEwsICpncm91cHMgPSBOVUxMLCAqc2c7CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNwYW4gPSBzY2hlZF9kb21haW5fc3BhbihzZCk7CisJc3RydWN0IGNwdW1hc2sgKmNvdmVyZWQgPSBzY2hlZF9kb21haW5zX3RtcG1hc2s7CisJc3RydWN0IHNkX2RhdGEgKnNkZCA9IHNkLT5wcml2YXRlOworCXN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkOworCWludCBpOworCisJY3B1bWFza19jbGVhcihjb3ZlcmVkKTsKKworCWZvcl9lYWNoX2NwdShpLCBzcGFuKSB7CisJCXN0cnVjdCBjcHVtYXNrICpzZ19zcGFuOworCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGksIGNvdmVyZWQpKQorCQkJY29udGludWU7CisKKwkJc2cgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCkgKyBjcHVtYXNrX3NpemUoKSwKKwkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7CisKKwkJaWYgKCFzZykKKwkJCWdvdG8gZmFpbDsKKworCQlzZ19zcGFuID0gc2NoZWRfZ3JvdXBfY3B1cyhzZyk7CisKKwkJY2hpbGQgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaSk7CisJCWlmIChjaGlsZC0+Y2hpbGQpIHsKKwkJCWNoaWxkID0gY2hpbGQtPmNoaWxkOworCQkJY3B1bWFza19jb3B5KHNnX3NwYW4sIHNjaGVkX2RvbWFpbl9zcGFuKGNoaWxkKSk7CisJCX0gZWxzZQorCQkJY3B1bWFza19zZXRfY3B1KGksIHNnX3NwYW4pOworCisJCWNwdW1hc2tfb3IoY292ZXJlZCwgY292ZXJlZCwgc2dfc3Bhbik7CisKKwkJc2ctPnNncCA9ICpwZXJfY3B1X3B0cihzZGQtPnNncCwgY3B1bWFza19maXJzdChzZ19zcGFuKSk7CisJCWF0b21pY19pbmMoJnNnLT5zZ3AtPnJlZik7CisKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBzZ19zcGFuKSkKKwkJCWdyb3VwcyA9IHNnOworCisJCWlmICghZmlyc3QpCisJCQlmaXJzdCA9IHNnOworCQlpZiAobGFzdCkKKwkJCWxhc3QtPm5leHQgPSBzZzsKKwkJbGFzdCA9IHNnOworCQlsYXN0LT5uZXh0ID0gZmlyc3Q7CisJfQorCXNkLT5ncm91cHMgPSBncm91cHM7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlmcmVlX3NjaGVkX2dyb3VwcyhmaXJzdCwgMCk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogc3RhdGljIGludCBnZXRfZ3JvdXAoaW50IGNwdSwgc3RydWN0IHNkX2RhdGEgKnNkZCwgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KTsKQEAgLTY5NjYsMjQgKzcxMDAsMjQgQEAKIAlpZiAoY2hpbGQpCiAJCWNwdSA9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oY2hpbGQpKTsKIAotCWlmIChzZykKKwlpZiAoc2cpIHsKIAkJKnNnID0gKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSk7CisJCSgqc2cpLT5zZ3AgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSk7CisJCWF0b21pY19zZXQoJigqc2cpLT5zZ3AtPnJlZiwgMSk7IC8qIGZvciBjbGFpbV9hbGxvY2F0aW9ucyAqLworCX0KIAogCXJldHVybiBjcHU7CiB9CiAKIC8qCi0gKiBidWlsZF9zY2hlZF9ncm91cHMgdGFrZXMgdGhlIGNwdW1hc2sgd2Ugd2lzaCB0byBzcGFuLCBhbmQgYSBwb2ludGVyCi0gKiB0byBhIGZ1bmN0aW9uIHdoaWNoIGlkZW50aWZpZXMgd2hhdCBncm91cChhbG9uZyB3aXRoIHNjaGVkIGdyb3VwKSBhIENQVQotICogYmVsb25ncyB0by4gVGhlIHJldHVybiB2YWx1ZSBvZiBncm91cF9mbiBtdXN0IGJlIGEgPj0gMCBhbmQgPCBucl9jcHVfaWRzCi0gKiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2Uga2VlcCB0cmFjayBvZiBncm91cHMgY292ZXJlZCB3aXRoIGEgc3RydWN0IGNwdW1hc2spLgotICoKICAqIGJ1aWxkX3NjaGVkX2dyb3VwcyB3aWxsIGJ1aWxkIGEgY2lyY3VsYXIgbGlua2VkIGxpc3Qgb2YgdGhlIGdyb3VwcwogICogY292ZXJlZCBieSB0aGUgZ2l2ZW4gc3BhbiwgYW5kIHdpbGwgc2V0IGVhY2ggZ3JvdXAncyAtPmNwdW1hc2sgY29ycmVjdGx5LAogICogYW5kIC0+Y3B1X3Bvd2VyIHRvIDAuCisgKgorICogQXNzdW1lcyB0aGUgc2NoZWRfZG9tYWluIHRyZWUgaXMgZnVsbHkgY29uc3RydWN0ZWQKICAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX3NjaGVkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKK3N0YXRpYyBpbnQKK2J1aWxkX3NjaGVkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmZpcnN0ID0gTlVMTCwgKmxhc3QgPSBOVUxMOwogCXN0cnVjdCBzZF9kYXRhICpzZGQgPSBzZC0+cHJpdmF0ZTsKQEAgLTY5OTEsNiArNzEyNSwxMiBAQAogCXN0cnVjdCBjcHVtYXNrICpjb3ZlcmVkOwogCWludCBpOwogCisJZ2V0X2dyb3VwKGNwdSwgc2RkLCAmc2QtPmdyb3Vwcyk7CisJYXRvbWljX2luYygmc2QtPmdyb3Vwcy0+cmVmKTsKKworCWlmIChjcHUgIT0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihzZCkpKQorCQlyZXR1cm4gMDsKKwogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOwogCWNvdmVyZWQgPSBzY2hlZF9kb21haW5zX3RtcG1hc2s7CiAKQEAgLTcwMDUsNyArNzE0NSw3IEBACiAJCQljb250aW51ZTsKIAogCQljcHVtYXNrX2NsZWFyKHNjaGVkX2dyb3VwX2NwdXMoc2cpKTsKLQkJc2ctPmNwdV9wb3dlciA9IDA7CisJCXNnLT5zZ3AtPnBvd2VyID0gMDsKIAogCQlmb3JfZWFjaF9jcHUoaiwgc3BhbikgewogCQkJaWYgKGdldF9ncm91cChqLCBzZGQsIE5VTEwpICE9IGdyb3VwKQpAQCAtNzAyMiw2ICs3MTYyLDggQEAKIAkJbGFzdCA9IHNnOwogCX0KIAlsYXN0LT5uZXh0ID0gZmlyc3Q7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTcwMzYsMTMgKzcxNzgsMTggQEAKICAqLwogc3RhdGljIHZvaWQgaW5pdF9zY2hlZF9ncm91cHNfcG93ZXIoaW50IGNwdSwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCiB7Ci0JV0FSTl9PTighc2QgfHwgIXNkLT5ncm91cHMpOworCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSBzZC0+Z3JvdXBzOwogCi0JaWYgKGNwdSAhPSBncm91cF9maXJzdF9jcHUoc2QtPmdyb3VwcykpCisJV0FSTl9PTighc2QgfHwgIXNnKTsKKworCWRvIHsKKwkJc2ctPmdyb3VwX3dlaWdodCA9IGNwdW1hc2tfd2VpZ2h0KHNjaGVkX2dyb3VwX2NwdXMoc2cpKTsKKwkJc2cgPSBzZy0+bmV4dDsKKwl9IHdoaWxlIChzZyAhPSBzZC0+Z3JvdXBzKTsKKworCWlmIChjcHUgIT0gZ3JvdXBfZmlyc3RfY3B1KHNnKSkKIAkJcmV0dXJuOwogCi0Jc2QtPmdyb3Vwcy0+Z3JvdXBfd2VpZ2h0ID0gY3B1bWFza193ZWlnaHQoc2NoZWRfZ3JvdXBfY3B1cyhzZC0+Z3JvdXBzKSk7Ci0KIAl1cGRhdGVfZ3JvdXBfcG93ZXIoc2QsIGNwdSk7CiB9CiAKQEAgLTcxNjIsMTUgKzczMDksMTUgQEAKIHN0YXRpYyB2b2lkIGNsYWltX2FsbG9jYXRpb25zKGludCBjcHUsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQogewogCXN0cnVjdCBzZF9kYXRhICpzZGQgPSBzZC0+cHJpdmF0ZTsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnID0gc2QtPmdyb3VwczsKIAogCVdBUk5fT05fT05DRSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KSAhPSBzZCk7CiAJKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSkgPSBOVUxMOwogCi0JaWYgKGNwdSA9PSBjcHVtYXNrX2ZpcnN0KHNjaGVkX2dyb3VwX2NwdXMoc2cpKSkgewotCQlXQVJOX09OX09OQ0UoKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSkgIT0gc2cpOworCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpKS0+cmVmKSkKIAkJKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSkgPSBOVUxMOwotCX0KKworCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihzZGQtPnNncCwgY3B1KSktPnJlZikpCisJCSpwZXJfY3B1X3B0cihzZGQtPnNncCwgY3B1KSA9IE5VTEw7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCkBAIC03MTk1LDcgKzczNDIsNyBAQAogI2VuZGlmCiAJeyBzZF9pbml0X0NQVSwgY3B1X2NwdV9tYXNrLCB9LAogI2lmZGVmIENPTkZJR19OVU1BCi0JeyBzZF9pbml0X05PREUsIGNwdV9ub2RlX21hc2ssIH0sCisJeyBzZF9pbml0X05PREUsIGNwdV9ub2RlX21hc2ssIFNEVExfT1ZFUkxBUCwgfSwKIAl7IHNkX2luaXRfQUxMTk9ERVMsIGNwdV9hbGxub2Rlc19tYXNrLCB9LAogI2VuZGlmCiAJeyBOVUxMLCB9LApAQCAtNzIxOSw5ICs3MzY2LDE0IEBACiAJCWlmICghc2RkLT5zZykKIAkJCXJldHVybiAtRU5PTUVNOwogCisJCXNkZC0+c2dwID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY2hlZF9ncm91cF9wb3dlciAqKTsKKwkJaWYgKCFzZGQtPnNncCkKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCWZvcl9lYWNoX2NwdShqLCBjcHVfbWFwKSB7CiAJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAkJCXN0cnVjdCBzY2hlZF9ncm91cCAqc2c7CisJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIgKnNncDsKIAogCQkgICAgICAgCXNkID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZG9tYWluKSArIGNwdW1hc2tfc2l6ZSgpLAogCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShqKSk7CkBAIC03MjM2LDYgKzczODgsMTMgQEAKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAogCQkJKnBlcl9jcHVfcHRyKHNkZC0+c2csIGopID0gc2c7CisKKwkJCXNncCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyKSwKKwkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikpOworCQkJaWYgKCFzZ3ApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCSpwZXJfY3B1X3B0cihzZGQtPnNncCwgaikgPSBzZ3A7CiAJCX0KIAl9CiAKQEAgLTcyNTEsMTEgKzc0MTAsMTUgQEAKIAkJc3RydWN0IHNkX2RhdGEgKnNkZCA9ICZ0bC0+ZGF0YTsKIAogCQlmb3JfZWFjaF9jcHUoaiwgY3B1X21hcCkgewotCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGopKTsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGopOworCQkJaWYgKHNkICYmIChzZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSkKKwkJCQlmcmVlX3NjaGVkX2dyb3VwcyhzZC0+Z3JvdXBzLCAwKTsKIAkJCWtmcmVlKCpwZXJfY3B1X3B0cihzZGQtPnNnLCBqKSk7CisJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGopKTsKIAkJfQogCQlmcmVlX3BlcmNwdShzZGQtPnNkKTsKIAkJZnJlZV9wZXJjcHUoc2RkLT5zZyk7CisJCWZyZWVfcGVyY3B1KHNkZC0+c2dwKTsKIAl9CiB9CiAKQEAgLTczMDEsOCArNzQ2NCwxMyBAQAogCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bDsKIAogCQlzZCA9IE5VTEw7Ci0JCWZvciAodGwgPSBzY2hlZF9kb21haW5fdG9wb2xvZ3k7IHRsLT5pbml0OyB0bCsrKQorCQlmb3IgKHRsID0gc2NoZWRfZG9tYWluX3RvcG9sb2d5OyB0bC0+aW5pdDsgdGwrKykgewogCQkJc2QgPSBidWlsZF9zY2hlZF9kb21haW4odGwsICZkLCBjcHVfbWFwLCBhdHRyLCBzZCwgaSk7CisJCQlpZiAodGwtPmZsYWdzICYgU0RUTF9PVkVSTEFQIHx8IHNjaGVkX2ZlYXQoRk9SQ0VfU0RfT1ZFUkxBUCkpCisJCQkJc2QtPmZsYWdzIHw9IFNEX09WRVJMQVA7CisJCQlpZiAoY3B1bWFza19lcXVhbChjcHVfbWFwLCBzY2hlZF9kb21haW5fc3BhbihzZCkpKQorCQkJCWJyZWFrOworCQl9CiAKIAkJd2hpbGUgKHNkLT5jaGlsZCkKIAkJCXNkID0gc2QtPmNoaWxkOwpAQCAtNzMxNCwxMyArNzQ4MiwxMyBAQAogCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7CiAJCWZvciAoc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7IHNkOyBzZCA9IHNkLT5wYXJlbnQpIHsKIAkJCXNkLT5zcGFuX3dlaWdodCA9IGNwdW1hc2tfd2VpZ2h0KHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7Ci0JCQlnZXRfZ3JvdXAoaSwgc2QtPnByaXZhdGUsICZzZC0+Z3JvdXBzKTsKLQkJCWF0b21pY19pbmMoJnNkLT5ncm91cHMtPnJlZik7Ci0KLQkJCWlmIChpICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkKLQkJCQljb250aW51ZTsKLQotCQkJYnVpbGRfc2NoZWRfZ3JvdXBzKHNkKTsKKwkJCWlmIChzZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSB7CisJCQkJaWYgKGJ1aWxkX292ZXJsYXBfc2NoZWRfZ3JvdXBzKHNkLCBpKSkKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJ1aWxkX3NjaGVkX2dyb3VwcyhzZCwgaSkpCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTc3NDIsNiArNzkxMCw5IEBACiAjZW5kaWYKICNlbmRpZgogCWNmc19ycS0+bWluX3ZydW50aW1lID0gKHU2NCkoLSgxTEwgPDwgMjApKTsKKyNpZm5kZWYgQ09ORklHXzY0QklUCisJY2ZzX3JxLT5taW5fdnJ1bnRpbWVfY29weSA9IGNmc19ycS0+bWluX3ZydW50aW1lOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSwgc3RydWN0IHJxICpycSkKQEAgLTg0MzUsMTAgKzg2MDYsNyBAQAogCWlmICghdGctPnNlWzBdKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzaGFyZXMgPCBNSU5fU0hBUkVTKQotCQlzaGFyZXMgPSBNSU5fU0hBUkVTOwotCWVsc2UgaWYgKHNoYXJlcyA+IE1BWF9TSEFSRVMpCi0JCXNoYXJlcyA9IE1BWF9TSEFSRVM7CisJc2hhcmVzID0gY2xhbXAoc2hhcmVzLCBzY2FsZV9sb2FkKE1JTl9TSEFSRVMpLCBzY2FsZV9sb2FkKE1BWF9TSEFSRVMpKTsKIAogCW11dGV4X2xvY2soJnNoYXJlc19tdXRleCk7CiAJaWYgKHRnLT5zaGFyZXMgPT0gc2hhcmVzKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZhaXIuYyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKaW5kZXggNDMzNDkxYzIuLmM3Njg1ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkX2ZhaXIuYwpAQCAtMTU4NSw3ICsxNTg1LDcgQEAKIAkJfQogCiAJCS8qIEFkanVzdCBieSByZWxhdGl2ZSBDUFUgcG93ZXIgb2YgdGhlIGdyb3VwICovCi0JCWF2Z19sb2FkID0gKGF2Z19sb2FkICogU0NIRURfUE9XRVJfU0NBTEUpIC8gZ3JvdXAtPmNwdV9wb3dlcjsKKwkJYXZnX2xvYWQgPSAoYXZnX2xvYWQgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkgLyBncm91cC0+c2dwLT5wb3dlcjsKIAogCQlpZiAobG9jYWxfZ3JvdXApIHsKIAkJCXRoaXNfbG9hZCA9IGF2Z19sb2FkOwpAQCAtMjYzMSw3ICsyNjMxLDcgQEAKIAkJcG93ZXIgPj49IFNDSEVEX1BPV0VSX1NISUZUOwogCX0KIAotCXNkZy0+Y3B1X3Bvd2VyX29yaWcgPSBwb3dlcjsKKwlzZGctPnNncC0+cG93ZXJfb3JpZyA9IHBvd2VyOwogCiAJaWYgKHNjaGVkX2ZlYXQoQVJDSF9QT1dFUikpCiAJCXBvd2VyICo9IGFyY2hfc2NhbGVfZnJlcV9wb3dlcihzZCwgY3B1KTsKQEAgLTI2NDcsNyArMjY0Nyw3IEBACiAJCXBvd2VyID0gMTsKIAogCWNwdV9ycShjcHUpLT5jcHVfcG93ZXIgPSBwb3dlcjsKLQlzZGctPmNwdV9wb3dlciA9IHBvd2VyOworCXNkZy0+c2dwLT5wb3dlciA9IHBvd2VyOwogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfZ3JvdXBfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCkBAIC0yNjY1LDExICsyNjY1LDExIEBACiAKIAlncm91cCA9IGNoaWxkLT5ncm91cHM7CiAJZG8gewotCQlwb3dlciArPSBncm91cC0+Y3B1X3Bvd2VyOworCQlwb3dlciArPSBncm91cC0+c2dwLT5wb3dlcjsKIAkJZ3JvdXAgPSBncm91cC0+bmV4dDsKIAl9IHdoaWxlIChncm91cCAhPSBjaGlsZC0+Z3JvdXBzKTsKIAotCXNkZy0+Y3B1X3Bvd2VyID0gcG93ZXI7CisJc2RnLT5zZ3AtPnBvd2VyID0gcG93ZXI7CiB9CiAKIC8qCkBAIC0yNjkxLDcgKzI2OTEsNyBAQAogCS8qCiAJICogSWYgfjkwJSBvZiB0aGUgY3B1X3Bvd2VyIGlzIHN0aWxsIHRoZXJlLCB3ZSdyZSBnb29kLgogCSAqLwotCWlmIChncm91cC0+Y3B1X3Bvd2VyICogMzIgPiBncm91cC0+Y3B1X3Bvd2VyX29yaWcgKiAyOSkKKwlpZiAoZ3JvdXAtPnNncC0+cG93ZXIgKiAzMiA+IGdyb3VwLT5zZ3AtPnBvd2VyX29yaWcgKiAyOSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTI3NzEsNyArMjc3MSw3IEBACiAJfQogCiAJLyogQWRqdXN0IGJ5IHJlbGF0aXZlIENQVSBwb3dlciBvZiB0aGUgZ3JvdXAgKi8KLQlzZ3MtPmF2Z19sb2FkID0gKHNncy0+Z3JvdXBfbG9hZCpTQ0hFRF9QT1dFUl9TQ0FMRSkgLyBncm91cC0+Y3B1X3Bvd2VyOworCXNncy0+YXZnX2xvYWQgPSAoc2dzLT5ncm91cF9sb2FkKlNDSEVEX1BPV0VSX1NDQUxFKSAvIGdyb3VwLT5zZ3AtPnBvd2VyOwogCiAJLyoKIAkgKiBDb25zaWRlciB0aGUgZ3JvdXAgdW5iYWxhbmNlZCB3aGVuIHRoZSBpbWJhbGFuY2UgaXMgbGFyZ2VyCkBAIC0yNzg4LDcgKzI3ODgsNyBAQAogCWlmICgobWF4X2NwdV9sb2FkIC0gbWluX2NwdV9sb2FkKSA+PSBhdmdfbG9hZF9wZXJfdGFzayAmJiBtYXhfbnJfcnVubmluZyA+IDEpCiAJCXNncy0+Z3JvdXBfaW1iID0gMTsKIAotCXNncy0+Z3JvdXBfY2FwYWNpdHkgPSBESVZfUk9VTkRfQ0xPU0VTVChncm91cC0+Y3B1X3Bvd2VyLAorCXNncy0+Z3JvdXBfY2FwYWNpdHkgPSBESVZfUk9VTkRfQ0xPU0VTVChncm91cC0+c2dwLT5wb3dlciwKIAkJCQkJCVNDSEVEX1BPV0VSX1NDQUxFKTsKIAlpZiAoIXNncy0+Z3JvdXBfY2FwYWNpdHkpCiAJCXNncy0+Z3JvdXBfY2FwYWNpdHkgPSBmaXhfc21hbGxfY2FwYWNpdHkoc2QsIGdyb3VwKTsKQEAgLTI4NzcsNyArMjg3Nyw3IEBACiAJCQlyZXR1cm47CiAKIAkJc2RzLT50b3RhbF9sb2FkICs9IHNncy5ncm91cF9sb2FkOwotCQlzZHMtPnRvdGFsX3B3ciArPSBzZy0+Y3B1X3Bvd2VyOworCQlzZHMtPnRvdGFsX3B3ciArPSBzZy0+c2dwLT5wb3dlcjsKIAogCQkvKgogCQkgKiBJbiBjYXNlIHRoZSBjaGlsZCBkb21haW4gcHJlZmVycyB0YXNrcyBnbyB0byBzaWJsaW5ncwpAQCAtMjk2Miw3ICsyOTYyLDcgQEAKIAlpZiAodGhpc19jcHUgPiBidXNpZXN0X2NwdSkKIAkJcmV0dXJuIDA7CiAKLQkqaW1iYWxhbmNlID0gRElWX1JPVU5EX0NMT1NFU1Qoc2RzLT5tYXhfbG9hZCAqIHNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyLAorCSppbWJhbGFuY2UgPSBESVZfUk9VTkRfQ0xPU0VTVChzZHMtPm1heF9sb2FkICogc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyLAogCQkJCSAgICAgICBTQ0hFRF9QT1dFUl9TQ0FMRSk7CiAJcmV0dXJuIDE7CiB9CkBAIC0yOTkzLDcgKzI5OTMsNyBAQAogCiAJc2NhbGVkX2J1c3lfbG9hZF9wZXJfdGFzayA9IHNkcy0+YnVzaWVzdF9sb2FkX3Blcl90YXNrCiAJCQkJCSAqIFNDSEVEX1BPV0VSX1NDQUxFOwotCXNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2sgLz0gc2RzLT5idXNpZXN0LT5jcHVfcG93ZXI7CisJc2NhbGVkX2J1c3lfbG9hZF9wZXJfdGFzayAvPSBzZHMtPmJ1c2llc3QtPnNncC0+cG93ZXI7CiAKIAlpZiAoc2RzLT5tYXhfbG9hZCAtIHNkcy0+dGhpc19sb2FkICsgc2NhbGVkX2J1c3lfbG9hZF9wZXJfdGFzayA+PQogCQkJKHNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2sgKiBpbWJuKSkgewpAQCAtMzAwNywyOCArMzAwNywyOCBAQAogCSAqIG1vdmluZyB0aGVtLgogCSAqLwogCi0JcHdyX25vdyArPSBzZHMtPmJ1c2llc3QtPmNwdV9wb3dlciAqCisJcHdyX25vdyArPSBzZHMtPmJ1c2llc3QtPnNncC0+cG93ZXIgKgogCQkJbWluKHNkcy0+YnVzaWVzdF9sb2FkX3Blcl90YXNrLCBzZHMtPm1heF9sb2FkKTsKLQlwd3Jfbm93ICs9IHNkcy0+dGhpcy0+Y3B1X3Bvd2VyICoKKwlwd3Jfbm93ICs9IHNkcy0+dGhpcy0+c2dwLT5wb3dlciAqCiAJCQltaW4oc2RzLT50aGlzX2xvYWRfcGVyX3Rhc2ssIHNkcy0+dGhpc19sb2FkKTsKIAlwd3Jfbm93IC89IFNDSEVEX1BPV0VSX1NDQUxFOwogCiAJLyogQW1vdW50IG9mIGxvYWQgd2UnZCBzdWJ0cmFjdCAqLwogCXRtcCA9IChzZHMtPmJ1c2llc3RfbG9hZF9wZXJfdGFzayAqIFNDSEVEX1BPV0VSX1NDQUxFKSAvCi0JCXNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyOworCQlzZHMtPmJ1c2llc3QtPnNncC0+cG93ZXI7CiAJaWYgKHNkcy0+bWF4X2xvYWQgPiB0bXApCi0JCXB3cl9tb3ZlICs9IHNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyICoKKwkJcHdyX21vdmUgKz0gc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyICoKIAkJCW1pbihzZHMtPmJ1c2llc3RfbG9hZF9wZXJfdGFzaywgc2RzLT5tYXhfbG9hZCAtIHRtcCk7CiAKIAkvKiBBbW91bnQgb2YgbG9hZCB3ZSdkIGFkZCAqLwotCWlmIChzZHMtPm1heF9sb2FkICogc2RzLT5idXNpZXN0LT5jcHVfcG93ZXIgPAorCWlmIChzZHMtPm1heF9sb2FkICogc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyIDwKIAkJc2RzLT5idXNpZXN0X2xvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkKLQkJdG1wID0gKHNkcy0+bWF4X2xvYWQgKiBzZHMtPmJ1c2llc3QtPmNwdV9wb3dlcikgLwotCQkJc2RzLT50aGlzLT5jcHVfcG93ZXI7CisJCXRtcCA9IChzZHMtPm1heF9sb2FkICogc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyKSAvCisJCQlzZHMtPnRoaXMtPnNncC0+cG93ZXI7CiAJZWxzZQogCQl0bXAgPSAoc2RzLT5idXNpZXN0X2xvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkgLwotCQkJc2RzLT50aGlzLT5jcHVfcG93ZXI7Ci0JcHdyX21vdmUgKz0gc2RzLT50aGlzLT5jcHVfcG93ZXIgKgorCQkJc2RzLT50aGlzLT5zZ3AtPnBvd2VyOworCXB3cl9tb3ZlICs9IHNkcy0+dGhpcy0+c2dwLT5wb3dlciAqCiAJCQltaW4oc2RzLT50aGlzX2xvYWRfcGVyX3Rhc2ssIHNkcy0+dGhpc19sb2FkICsgdG1wKTsKIAlwd3JfbW92ZSAvPSBTQ0hFRF9QT1dFUl9TQ0FMRTsKIApAQCAtMzA3NCw3ICszMDc0LDcgQEAKIAogCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ICo9IChTQ0hFRF9MT0FEX1NDQUxFICogU0NIRURfUE9XRVJfU0NBTEUpOwogCi0JCWxvYWRfYWJvdmVfY2FwYWNpdHkgLz0gc2RzLT5idXNpZXN0LT5jcHVfcG93ZXI7CisJCWxvYWRfYWJvdmVfY2FwYWNpdHkgLz0gc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyOwogCX0KIAogCS8qCkBAIC0zMDkwLDggKzMwOTAsOCBAQAogCW1heF9wdWxsID0gbWluKHNkcy0+bWF4X2xvYWQgLSBzZHMtPmF2Z19sb2FkLCBsb2FkX2Fib3ZlX2NhcGFjaXR5KTsKIAogCS8qIEhvdyBtdWNoIGxvYWQgdG8gYWN0dWFsbHkgbW92ZSB0byBlcXVhbGlzZSB0aGUgaW1iYWxhbmNlICovCi0JKmltYmFsYW5jZSA9IG1pbihtYXhfcHVsbCAqIHNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyLAotCQkoc2RzLT5hdmdfbG9hZCAtIHNkcy0+dGhpc19sb2FkKSAqIHNkcy0+dGhpcy0+Y3B1X3Bvd2VyKQorCSppbWJhbGFuY2UgPSBtaW4obWF4X3B1bGwgKiBzZHMtPmJ1c2llc3QtPnNncC0+cG93ZXIsCisJCShzZHMtPmF2Z19sb2FkIC0gc2RzLT50aGlzX2xvYWQpICogc2RzLT50aGlzLT5zZ3AtPnBvd2VyKQogCQkJLyBTQ0hFRF9QT1dFUl9TQ0FMRTsKIAogCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaCBiL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oCmluZGV4IGJlNDBmNzMuLjFlNzA2NmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oCisrKyBiL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oCkBAIC03MCwzICs3MCw1IEBACiAgKiB1c2luZyB0aGUgc2NoZWR1bGVyIElQSS4gUmVkdWNlcyBycS0+bG9jayBjb250ZW50aW9uL2JvdW5jZXMuCiAgKi8KIFNDSEVEX0ZFQVQoVFRXVV9RVUVVRSwgMSkKKworU0NIRURfRkVBVChGT1JDRV9TRF9PVkVSTEFQLCAwKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX3J0LmMgYi9rZXJuZWwvc2NoZWRfcnQuYwppbmRleCA4ODcyNWM5Li4xMGQwMTgyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfcnQuYworKysgYi9rZXJuZWwvc2NoZWRfcnQuYwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAkgKiB0byBtb3ZlIGN1cnJlbnQgc29tZXdoZXJlIGVsc2UsIG1ha2luZyByb29tIGZvciBvdXIgbm9uLW1pZ3JhdGFibGUKIAkgKiB0YXNrLgogCSAqLwotCWlmIChwLT5wcmlvID09IHJxLT5jdXJyLT5wcmlvICYmICFuZWVkX3Jlc2NoZWQoKSkKKwlpZiAocC0+cHJpbyA9PSBycS0+Y3Vyci0+cHJpbyAmJiAhdGVzdF90c2tfbmVlZF9yZXNjaGVkKHJxLT5jdXJyKSkKIAkJY2hlY2tfcHJlZW1wdF9lcXVhbF9wcmlvKHJxLCBwKTsKICNlbmRpZgogfQpAQCAtMTIzOSw2ICsxMjM5LDEwIEBACiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBjcHUgICAgICA9IHRhc2tfY3B1KHRhc2spOwogCisJLyogTWFrZSBzdXJlIHRoZSBtYXNrIGlzIGluaXRpYWxpemVkIGZpcnN0ICovCisJaWYgKHVubGlrZWx5KCFsb3dlc3RfbWFzaykpCisJCXJldHVybiAtMTsKKwogCWlmICh0YXNrLT5ydC5ucl9jcHVzX2FsbG93ZWQgPT0gMSkKIAkJcmV0dXJuIC0xOyAvKiBObyBvdGhlciB0YXJnZXRzIHBvc3NpYmxlICovCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4NmMzMmI4Li40MTVkODVkIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0xMTc4LDE4ICsxMTc4LDI1IEBACiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWZvciAoOzspIHsKKwkJbG9jYWxfaXJxX3NhdmUoKmZsYWdzKTsKKwkJcmN1X3JlYWRfbG9jaygpOwogCQlzaWdoYW5kID0gcmN1X2RlcmVmZXJlbmNlKHRzay0+c2lnaGFuZCk7Ci0JCWlmICh1bmxpa2VseShzaWdoYW5kID09IE5VTEwpKQorCQlpZiAodW5saWtlbHkoc2lnaGFuZCA9PSBOVUxMKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZSgqZmxhZ3MpOwogCQkJYnJlYWs7CisJCX0KIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2lnaGFuZC0+c2lnbG9jaywgKmZsYWdzKTsKLQkJaWYgKGxpa2VseShzaWdoYW5kID09IHRzay0+c2lnaGFuZCkpCisJCXNwaW5fbG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CisJCWlmIChsaWtlbHkoc2lnaGFuZCA9PSB0c2stPnNpZ2hhbmQpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWJyZWFrOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaWdoYW5kLT5zaWdsb2NrLCAqZmxhZ3MpOworCQl9CisJCXNwaW5fdW5sb2NrKCZzaWdoYW5kLT5zaWdsb2NrKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKCpmbGFncyk7CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHNpZ2hhbmQ7CiB9CkBAIC0yMzY1LDcgKzIzNzIsNyBAQAogLyoqCiAgKiAgc3lzX3J0X3NpZ3Byb2NtYXNrIC0gY2hhbmdlIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBibG9ja2VkIHNpZ25hbHMKICAqICBAaG93OiB3aGV0aGVyIHRvIGFkZCwgcmVtb3ZlLCBvciBzZXQgc2lnbmFscwotICogIEBzZXQ6IHN0b3JlcyBwZW5kaW5nIHNpZ25hbHMKKyAqICBAbnNldDogc3RvcmVzIHBlbmRpbmcgc2lnbmFscwogICogIEBvc2V0OiBwcmV2aW91cyB2YWx1ZSBvZiBzaWduYWwgbWFzayBpZiBub24tbnVsbAogICogIEBzaWdzZXRzaXplOiBzaXplIG9mIHNpZ3NldF90IHR5cGUKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IDczYTE5NTEuLmZiNjdkZmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAkubm90aWZpZXJfY2FsbAkJPSBob3RwbHVnX2NmZCwKIH07CiAKLXN0YXRpYyBpbnQgX19jcHVpbml0IGluaXRfY2FsbF9zaW5nbGVfZGF0YSh2b2lkKQordm9pZCBfX2luaXQgY2FsbF9mdW5jdGlvbl9pbml0KHZvaWQpCiB7CiAJdm9pZCAqY3B1ID0gKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IGk7CkBAIC04OCwxMCArODgsNyBAQAogCiAJaG90cGx1Z19jZmQoJmhvdHBsdWdfY2ZkX25vdGlmaWVyLCBDUFVfVVBfUFJFUEFSRSwgY3B1KTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmhvdHBsdWdfY2ZkX25vdGlmaWVyKTsKLQotCXJldHVybiAwOwogfQotZWFybHlfaW5pdGNhbGwoaW5pdF9jYWxsX3NpbmdsZV9kYXRhKTsKIAogLyoKICAqIGNzZF9sb2NrL2NzZF91bmxvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHBlci1jcHUgY3NkIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMTM5NjAxNy4uZmNhODJjMyAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC01OCw3ICs1OCw3IEBACiAKIGNoYXIgKnNvZnRpcnFfdG9fbmFtZVtOUl9TT0ZUSVJRU10gPSB7CiAJIkhJIiwgIlRJTUVSIiwgIk5FVF9UWCIsICJORVRfUlgiLCAiQkxPQ0siLCAiQkxPQ0tfSU9QT0xMIiwKLQkiVEFTS0xFVCIsICJTQ0hFRCIsICJIUlRJTUVSIgorCSJUQVNLTEVUIiwgIlNDSEVEIiwgIkhSVElNRVIiLCAiUkNVIgogfTsKIAogLyoKQEAgLTMxNSwxNiArMzE1LDI0IEBACiB7CiAJaWYgKCFmb3JjZV9pcnF0aHJlYWRzKQogCQlfX2RvX3NvZnRpcnEoKTsKLQllbHNlCisJZWxzZSB7CisJCV9fbG9jYWxfYmhfZGlzYWJsZSgodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksCisJCQkJU09GVElSUV9PRkZTRVQpOwogCQl3YWtldXBfc29mdGlycWQoKTsKKwkJX19sb2NhbF9iaF9lbmFibGUoU09GVElSUV9PRkZTRVQpOworCX0KIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgaW52b2tlX3NvZnRpcnEodm9pZCkKIHsKIAlpZiAoIWZvcmNlX2lycXRocmVhZHMpCiAJCWRvX3NvZnRpcnEoKTsKLQllbHNlCisJZWxzZSB7CisJCV9fbG9jYWxfYmhfZGlzYWJsZSgodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksCisJCQkJU09GVElSUV9PRkZTRVQpOwogCQl3YWtldXBfc29mdGlycWQoKTsKKwkJX19sb2NhbF9iaF9lbmFibGUoU09GVElSUV9PRkZTRVQpOworCX0KIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggNGZjOTI0NC4uZjE3NWQ5OCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtOTM4LDYgKzkzOCwxMiBAQAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKKwkvKgorCSAqIFVzZXItc3BhY2Ugc2NyaXB0cyByZWx5IG9uIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBmaWxlCisJICogYXMgYSBmZWF0dXJlIGNoZWNrIGZvciBwZXJmX2V2ZW50cyBiZWluZyBlbmFibGVkLgorCSAqCisJICogU28gaXQncyBhbiBBQkksIGRvIG5vdCByZW1vdmUhCisJICovCiAJewogCQkucHJvY25hbWUJPSAicGVyZl9ldmVudF9wYXJhbm9pZCIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfcGVyZl9ldmVudF9wYXJhbm9pZCwKZGlmZiAtLWdpdCBhL2tlcm5lbC90YXNrc3RhdHMuYyBiL2tlcm5lbC90YXNrc3RhdHMuYwppbmRleCA5ZmZlYTM2Li5mYzBmMjIwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGFza3N0YXRzLmMKKysrIGIva2VybmVsL3Rhc2tzdGF0cy5jCkBAIC0yODUsMTYgKzI4NSwxOCBAQAogc3RhdGljIGludCBhZGRfZGVsX2xpc3RlbmVyKHBpZF90IHBpZCwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCBpc2FkZCkKIHsKIAlzdHJ1Y3QgbGlzdGVuZXJfbGlzdCAqbGlzdGVuZXJzOwotCXN0cnVjdCBsaXN0ZW5lciAqcywgKnRtcDsKKwlzdHJ1Y3QgbGlzdGVuZXIgKnMsICp0bXAsICpzMjsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCiAJaWYgKCFjcHVtYXNrX3N1YnNldChtYXNrLCBjcHVfcG9zc2libGVfbWFzaykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJcyA9IE5VTEw7CiAJaWYgKGlzYWRkID09IFJFR0lTVEVSKSB7CiAJCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKLQkJCXMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBsaXN0ZW5lciksIEdGUF9LRVJORUwsCi0JCQkJCSBjcHVfdG9fbm9kZShjcHUpKTsKKwkJCWlmICghcykKKwkJCQlzID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbGlzdGVuZXIpLAorCQkJCQkJIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOwogCQkJaWYgKCFzKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJCXMtPnBpZCA9IHBpZDsKQEAgLTMwMyw5ICszMDUsMTYgQEAKIAogCQkJbGlzdGVuZXJzID0gJnBlcl9jcHUobGlzdGVuZXJfYXJyYXksIGNwdSk7CiAJCQlkb3duX3dyaXRlKCZsaXN0ZW5lcnMtPnNlbSk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoczIsIHRtcCwgJmxpc3RlbmVycy0+bGlzdCwgbGlzdCkgeworCQkJCWlmIChzMi0+cGlkID09IHBpZCkKKwkJCQkJZ290byBuZXh0X2NwdTsKKwkJCX0KIAkJCWxpc3RfYWRkKCZzLT5saXN0LCAmbGlzdGVuZXJzLT5saXN0KTsKKwkJCXMgPSBOVUxMOworbmV4dF9jcHU6CiAJCQl1cF93cml0ZSgmbGlzdGVuZXJzLT5zZW0pOwogCQl9CisJCWtmcmVlKHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYyBiL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYwppbmRleCAyZDk2NjI0Li41OWYzNjlmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMKKysrIGIva2VybmVsL3RpbWUvYWxhcm10aW1lci5jCkBAIC00MiwxNSArNDIsNzUgQEAKIAljbG9ja2lkX3QJCWJhc2VfY2xvY2tpZDsKIH0gYWxhcm1fYmFzZXNbQUxBUk1fTlVNVFlQRV07CiAKKy8qIGZyZWV6ZXIgZGVsdGEgJiBsb2NrIHVzZWQgdG8gaGFuZGxlIGNsb2NrX25hbm9zbGVlcCB0cmlnZ2VyZWQgd2FrZXVwcyAqLworc3RhdGljIGt0aW1lX3QgZnJlZXplcl9kZWx0YTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnJlZXplcl9kZWx0YV9sb2NrKTsKKwogI2lmZGVmIENPTkZJR19SVENfQ0xBU1MKIC8qIHJ0YyB0aW1lciBhbmQgZGV2aWNlIGZvciBzZXR0aW5nIGFsYXJtIHdha2V1cHMgYXQgc3VzcGVuZCAqLwogc3RhdGljIHN0cnVjdCBydGNfdGltZXIJCXJ0Y3RpbWVyOwogc3RhdGljIHN0cnVjdCBydGNfZGV2aWNlCSpydGNkZXY7Ci0jZW5kaWYKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRjZGV2X2xvY2spOwogCi0vKiBmcmVlemVyIGRlbHRhICYgbG9jayB1c2VkIHRvIGhhbmRsZSBjbG9ja19uYW5vc2xlZXAgdHJpZ2dlcmVkIHdha2V1cHMgKi8KLXN0YXRpYyBrdGltZV90IGZyZWV6ZXJfZGVsdGE7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZyZWV6ZXJfZGVsdGFfbG9jayk7CisvKioKKyAqIGhhc193YWtlYWxhcm0gLSBjaGVjayBydGMgZGV2aWNlIGhhcyB3YWtlYWxhcm0gYWJpbGl0eQorICogQGRldjogY3VycmVudCBkZXZpY2UKKyAqIEBuYW1lX3B0cjogbmFtZSB0byBiZSByZXR1cm5lZAorICoKKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHJ0YyBkZXZpY2UgY2FuIHdha2UKKyAqIGZyb20gc3VzcGVuZC4KKyAqLworc3RhdGljIGludCBoYXNfd2FrZWFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqbmFtZV9wdHIpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKmNhbmRpZGF0ZSA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKKworCWlmICghY2FuZGlkYXRlLT5vcHMtPnNldF9hbGFybSkKKwkJcmV0dXJuIDA7CisJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChjYW5kaWRhdGUtPmRldi5wYXJlbnQpKQorCQlyZXR1cm4gMDsKKworCSooY29uc3QgY2hhciAqKiluYW1lX3B0ciA9IGRldl9uYW1lKGRldik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogYWxhcm10aW1lcl9nZXRfcnRjZGV2IC0gUmV0dXJuIHNlbGVjdGVkIHJ0Y2RldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcnRjIGRldmljZSB0byB1c2UgZm9yIHdha2VhbGFybXMuCisgKiBJZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2hvc2VuLCBpdCBjaGVja3MgdG8gc2VlIGlmIGEKKyAqIGZ1bmN0aW9uYWwgcnRjIGRldmljZSBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRjX2RldmljZSAqYWxhcm10aW1lcl9nZXRfcnRjZGV2KHZvaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNoYXIgKnN0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydGNfZGV2aWNlICpyZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjZGV2X2xvY2ssIGZsYWdzKTsKKwlpZiAoIXJ0Y2RldikgeworCQkvKiBGaW5kIGFuIHJ0YyBkZXZpY2UgYW5kIGluaXQgdGhlIHJ0Y190aW1lciAqLworCQlkZXYgPSBjbGFzc19maW5kX2RldmljZShydGNfY2xhc3MsIE5VTEwsICZzdHIsIGhhc193YWtlYWxhcm0pOworCQkvKiBJZiB3ZSBoYXZlIGEgZGV2aWNlIHRoZW4gc3RyIGlzIHZhbGlkLiBTZWUgaGFzX3dha2VhbGFybSgpICovCisJCWlmIChkZXYpIHsKKwkJCXJ0Y2RldiA9IHJ0Y19jbGFzc19vcGVuKHN0cik7CisJCQkvKgorCQkJICogRHJvcCB0aGUgcmVmZXJlbmNlIHdlIGdvdCBpbiBjbGFzc19maW5kX2RldmljZSwKKwkJCSAqIHJ0Y19vcGVuIHRha2VzIGl0cyBvd24uCisJCQkgKi8KKwkJCXB1dF9kZXZpY2UoZGV2KTsKKwkJCXJ0Y190aW1lcl9pbml0KCZydGN0aW1lciwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJcmV0ID0gcnRjZGV2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y2Rldl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKKyNkZWZpbmUgYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkgKDApCisjZGVmaW5lIHJ0Y2RldiAoMCkKKyNlbmRpZgogCiAKIC8qKgpAQCAtMTY2LDYgKzIyNiw3IEBACiAJc3RydWN0IHJ0Y190aW1lIHRtOwogCWt0aW1lX3QgbWluLCBub3c7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZyZWV6ZXJfZGVsdGFfbG9jaywgZmxhZ3MpOwpAQCAtMTczLDggKzIzNCw5IEBACiAJZnJlZXplcl9kZWx0YSA9IGt0aW1lX3NldCgwLCAwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlemVyX2RlbHRhX2xvY2ssIGZsYWdzKTsKIAorCXJ0YyA9IHJ0Y2RldjsKIAkvKiBJZiB3ZSBoYXZlIG5vIHJ0Y2RldiwganVzdCByZXR1cm4gKi8KLQlpZiAoIXJ0Y2RldikKKwlpZiAoIXJ0YykKIAkJcmV0dXJuIDA7CiAKIAkvKiBGaW5kIHRoZSBzb29uZXN0IHRpbWVyIHRvIGV4cGlyZSovCkBAIC0xOTksMTIgKzI2MSwxMiBAQAogCVdBUk5fT04obWluLnR2NjQgPCBOU0VDX1BFUl9TRUMpOwogCiAJLyogU2V0dXAgYW4gcnRjIHRpbWVyIHRvIGZpcmUgdGhhdCBmYXIgaW4gdGhlIGZ1dHVyZSAqLwotCXJ0Y190aW1lcl9jYW5jZWwocnRjZGV2LCAmcnRjdGltZXIpOwotCXJ0Y19yZWFkX3RpbWUocnRjZGV2LCAmdG0pOworCXJ0Y190aW1lcl9jYW5jZWwocnRjLCAmcnRjdGltZXIpOworCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwogCW5vdyA9IHJ0Y190bV90b19rdGltZSh0bSk7CiAJbm93ID0ga3RpbWVfYWRkKG5vdywgbWluKTsKIAotCXJ0Y190aW1lcl9zdGFydChydGNkZXYsICZydGN0aW1lciwgbm93LCBrdGltZV9zZXQoMCwgMCkpOworCXJ0Y190aW1lcl9zdGFydChydGMsICZydGN0aW1lciwgbm93LCBrdGltZV9zZXQoMCwgMCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjIsNiArMzg0LDkgQEAKIHsKIAljbG9ja2lkX3QgYmFzZWlkID0gYWxhcm1fYmFzZXNbY2xvY2syYWxhcm0od2hpY2hfY2xvY2spXS5iYXNlX2Nsb2NraWQ7CiAKKwlpZiAoIWFsYXJtdGltZXJfZ2V0X3J0Y2RldigpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJcmV0dXJuIGhydGltZXJfZ2V0X3JlcyhiYXNlaWQsIHRwKTsKIH0KIApAQCAtMzM2LDYgKzQwMSw5IEBACiB7CiAJc3RydWN0IGFsYXJtX2Jhc2UgKmJhc2UgPSAmYWxhcm1fYmFzZXNbY2xvY2syYWxhcm0od2hpY2hfY2xvY2spXTsKIAorCWlmICghYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAkqdHAgPSBrdGltZV90b190aW1lc3BlYyhiYXNlLT5nZXR0aW1lKCkpOwogCXJldHVybiAwOwogfQpAQCAtMzUxLDYgKzQxOSw5IEBACiAJZW51bSAgYWxhcm10aW1lcl90eXBlIHR5cGU7CiAJc3RydWN0IGFsYXJtX2Jhc2UgKmJhc2U7CiAKKwlpZiAoIWFsYXJtdGltZXJfZ2V0X3J0Y2RldigpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJaWYgKCFjYXBhYmxlKENBUF9XQUtFX0FMQVJNKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtMzg1LDYgKzQ1Niw5IEBACiAgKi8KIHN0YXRpYyBpbnQgYWxhcm1fdGltZXJfZGVsKHN0cnVjdCBrX2l0aW1lciAqdGltcikKIHsKKwlpZiAoIXJ0Y2RldikKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCWFsYXJtX2NhbmNlbCgmdGltci0+aXQuYWxhcm10aW1lcik7CiAJcmV0dXJuIDA7CiB9CkBAIC00MDIsNiArNDc2LDkgQEAKIAkJCQlzdHJ1Y3QgaXRpbWVyc3BlYyAqbmV3X3NldHRpbmcsCiAJCQkJc3RydWN0IGl0aW1lcnNwZWMgKm9sZF9zZXR0aW5nKQogeworCWlmICghcnRjZGV2KQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJLyogU2F2ZSBvbGQgdmFsdWVzICovCiAJb2xkX3NldHRpbmctPml0X2ludGVydmFsID0KIAkJCWt0aW1lX3RvX3RpbWVzcGVjKHRpbXItPml0LmFsYXJtdGltZXIucGVyaW9kKTsKQEAgLTU0MSw2ICs2MTgsOSBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0OwogCisJaWYgKCFhbGFybXRpbWVyX2dldF9ydGNkZXYoKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCWlmICghY2FwYWJsZShDQVBfV0FLRV9BTEFSTSkpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTYzOCw2NSArNzE4LDMgQEAKIH0KIGRldmljZV9pbml0Y2FsbChhbGFybXRpbWVyX2luaXQpOwogCi0jaWZkZWYgQ09ORklHX1JUQ19DTEFTUwotLyoqCi0gKiBoYXNfd2FrZWFsYXJtIC0gY2hlY2sgcnRjIGRldmljZSBoYXMgd2FrZWFsYXJtIGFiaWxpdHkKLSAqIEBkZXY6IGN1cnJlbnQgZGV2aWNlCi0gKiBAbmFtZV9wdHI6IG5hbWUgdG8gYmUgcmV0dXJuZWQKLSAqCi0gKiBUaGlzIGhlbHBlciBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSBydGMgZGV2aWNlIGNhbiB3YWtlCi0gKiBmcm9tIHN1c3BlbmQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGhhc193YWtlYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpuYW1lX3B0cikKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqY2FuZGlkYXRlID0gdG9fcnRjX2RldmljZShkZXYpOwotCi0JaWYgKCFjYW5kaWRhdGUtPm9wcy0+c2V0X2FsYXJtKQotCQlyZXR1cm4gMDsKLQlpZiAoIWRldmljZV9tYXlfd2FrZXVwKGNhbmRpZGF0ZS0+ZGV2LnBhcmVudCkpCi0JCXJldHVybiAwOwotCi0JKihjb25zdCBjaGFyICoqKW5hbWVfcHRyID0gZGV2X25hbWUoZGV2KTsKLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBhbGFybXRpbWVyX2luaXRfbGF0ZSAtIExhdGUgaW5pdGlhbGl6aW5nIG9mIGFsYXJtdGltZXIgY29kZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gbG9jYXRlcyBhIHJ0YyBkZXZpY2UgdG8gdXNlIGZvciB3YWtlYWxhcm1zLgotICogUnVuIGFzIGxhdGVfaW5pdGNhbGwgdG8gbWFrZSBzdXJlIHJ0YyBkZXZpY2VzIGhhdmUgYmVlbgotICogcmVnaXN0ZXJlZC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgYWxhcm10aW1lcl9pbml0X2xhdGUodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JY2hhciAqc3RyOwotCi0JLyogRmluZCBhbiBydGMgZGV2aWNlIGFuZCBpbml0IHRoZSBydGNfdGltZXIgKi8KLQlkZXYgPSBjbGFzc19maW5kX2RldmljZShydGNfY2xhc3MsIE5VTEwsICZzdHIsIGhhc193YWtlYWxhcm0pOwotCS8qIElmIHdlIGhhdmUgYSBkZXZpY2UgdGhlbiBzdHIgaXMgdmFsaWQuIFNlZSBoYXNfd2FrZWFsYXJtKCkgKi8KLQlpZiAoZGV2KSB7Ci0JCXJ0Y2RldiA9IHJ0Y19jbGFzc19vcGVuKHN0cik7Ci0JCS8qCi0JCSAqIERyb3AgdGhlIHJlZmVyZW5jZSB3ZSBnb3QgaW4gY2xhc3NfZmluZF9kZXZpY2UsCi0JCSAqIHJ0Y19vcGVuIHRha2VzIGl0cyBvd24uCi0JCSAqLwotCQlwdXRfZGV2aWNlKGRldik7Ci0JfQotCWlmICghcnRjZGV2KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIFJUQyBkZXZpY2UgZm91bmQsIEFMQVJNIHRpbWVycyB3aWxsIgotCQkJIiBub3Qgd2FrZSBmcm9tIHN1c3BlbmQiKTsKLQl9Ci0JcnRjX3RpbWVyX2luaXQoJnJ0Y3RpbWVyLCBOVUxMLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLXN0YXRpYyBpbnQgX19pbml0IGFsYXJtdGltZXJfaW5pdF9sYXRlKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiS2VybmVsIG5vdCBidWlsdCB3aXRoIFJUQyBzdXBwb3J0LCBBTEFSTSB0aW1lcnMiCi0JCSIgd2lsbCBub3Qgd2FrZSBmcm9tIHN1c3BlbmQiKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotbGF0ZV9pbml0Y2FsbChhbGFybXRpbWVyX2luaXRfbGF0ZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwppbmRleCBjMDI3ZDRmLi5lNGM2OTlkIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTE4Miw3ICsxODIsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJQlVHX09OKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9VTlVTRUQpOwotCUJVR19PTighZGV2LT5jcHVtYXNrKTsKKwlpZiAoIWRldi0+Y3B1bWFzaykgeworCQlXQVJOX09OKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKTsKKwkJZGV2LT5jcHVtYXNrID0gY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tldmVudHNfbG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCAxYzk1ZmQ2Li5lMDk4MGYwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTE4NSw3ICsxODUsNiBAQAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOwogc3RhdGljIERFQ0xBUkVfV09SSyh3YXRjaGRvZ193b3JrLCBjbG9ja3NvdXJjZV93YXRjaGRvZ193b3JrKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2F0Y2hkb2dfbG9jayk7Ci1zdGF0aWMgY3ljbGVfdCB3YXRjaGRvZ19sYXN0Owogc3RhdGljIGludCB3YXRjaGRvZ19ydW5uaW5nOwogCiBzdGF0aWMgaW50IGNsb2Nrc291cmNlX3dhdGNoZG9nX2t0aHJlYWQodm9pZCAqZGF0YSk7CkBAIC0yNTQsMTEgKzI1Myw2IEBACiAJaWYgKCF3YXRjaGRvZ19ydW5uaW5nKQogCQlnb3RvIG91dDsKIAotCXdkbm93ID0gd2F0Y2hkb2ctPnJlYWQod2F0Y2hkb2cpOwotCXdkX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKHdkbm93IC0gd2F0Y2hkb2dfbGFzdCkgJiB3YXRjaGRvZy0+bWFzaywKLQkJCQkgICAgIHdhdGNoZG9nLT5tdWx0LCB3YXRjaGRvZy0+c2hpZnQpOwotCXdhdGNoZG9nX2xhc3QgPSB3ZG5vdzsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3MsICZ3YXRjaGRvZ19saXN0LCB3ZF9saXN0KSB7CiAKIAkJLyogQ2xvY2tzb3VyY2UgYWxyZWFkeSBtYXJrZWQgdW5zdGFibGU/ICovCkBAIC0yNjgsMTkgKzI2MiwyOCBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQljc25vdyA9IGNzLT5yZWFkKGNzKTsKKwkJd2Rub3cgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCQkvKiBDbG9ja3NvdXJjZSBpbml0aWFsaXplZCA/ICovCiAJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9XQVRDSERPRykpIHsKIAkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfV0FUQ0hET0c7Ci0JCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQkJY3MtPndkX2xhc3QgPSB3ZG5vdzsKKwkJCWNzLT5jc19sYXN0ID0gY3Nub3c7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCi0JCWNzX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKGNzbm93IC0gY3MtPndkX2xhc3QpICYKKwkJd2RfbnNlYyA9IGNsb2Nrc291cmNlX2N5YzJucygod2Rub3cgLSBjcy0+d2RfbGFzdCkgJiB3YXRjaGRvZy0+bWFzaywKKwkJCQkJICAgICB3YXRjaGRvZy0+bXVsdCwgd2F0Y2hkb2ctPnNoaWZ0KTsKKworCQljc19uc2VjID0gY2xvY2tzb3VyY2VfY3ljMm5zKChjc25vdyAtIGNzLT5jc19sYXN0KSAmCiAJCQkJCSAgICAgY3MtPm1hc2ssIGNzLT5tdWx0LCBjcy0+c2hpZnQpOwotCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQljcy0+Y3NfbGFzdCA9IGNzbm93OworCQljcy0+d2RfbGFzdCA9IHdkbm93OworCisJCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCiAJCWlmIChhYnMoY3NfbnNlYyAtIHdkX25zZWMpID4gV0FUQ0hET0dfVEhSRVNIT0xEKSB7CiAJCQljbG9ja3NvdXJjZV91bnN0YWJsZShjcywgY3NfbnNlYyAtIHdkX25zZWMpOwogCQkJY29udGludWU7CkBAIC0zMTgsNyArMzIxLDYgQEAKIAkJcmV0dXJuOwogCWluaXRfdGltZXIoJndhdGNoZG9nX3RpbWVyKTsKIAl3YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGNsb2Nrc291cmNlX3dhdGNoZG9nOwotCXdhdGNoZG9nX2xhc3QgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7CiAJd2F0Y2hkb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXQVRDSERPR19JTlRFUlZBTDsKIAlhZGRfdGltZXJfb24oJndhdGNoZG9nX3RpbWVyLCBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzaykpOwogCXdhdGNoZG9nX3J1bm5pbmcgPSAxOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCBmZDYxOTg2Li44Y2ZmMzYxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtNzQ5LDE2ICs3NDksMTUgQEAKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXNfbGltaXQsIG1hc2s7CiAJaW50IGJpdDsKIAotCWV4cGlyZXNfbGltaXQgPSBleHBpcmVzOwotCiAJaWYgKHRpbWVyLT5zbGFjayA+PSAwKSB7CiAJCWV4cGlyZXNfbGltaXQgPSBleHBpcmVzICsgdGltZXItPnNsYWNrOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwkJbG9uZyBkZWx0YSA9IGV4cGlyZXMgLSBqaWZmaWVzOwogCi0JCS8qIE5vIHNsYWNrLCBpZiBhbHJlYWR5IGV4cGlyZWQgZWxzZSBhdXRvIHNsYWNrIDAuNCUgKi8KLQkJaWYgKHRpbWVfYWZ0ZXIoZXhwaXJlcywgbm93KSkKLQkJCWV4cGlyZXNfbGltaXQgPSBleHBpcmVzICsgKGV4cGlyZXMgLSBub3cpLzI1NjsKKwkJaWYgKGRlbHRhIDwgMjU2KQorCQkJcmV0dXJuIGV4cGlyZXM7CisKKwkJZXhwaXJlc19saW1pdCA9IGV4cGlyZXMgKyBkZWx0YSAvIDI1NjsKIAl9CiAJbWFzayA9IGV4cGlyZXMgXiBleHBpcmVzX2xpbWl0OwogCWlmIChtYXNrID09IDApCkBAIC03OTUsNiArNzk0LDggQEAKICAqLwogaW50IG1vZF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVuc2lnbmVkIGxvbmcgZXhwaXJlcykKIHsKKwlleHBpcmVzID0gYXBwbHlfc2xhY2sodGltZXIsIGV4cGlyZXMpOworCiAJLyoKIAkgKiBUaGlzIGlzIGEgY29tbW9uIG9wdGltaXphdGlvbiB0cmlnZ2VyZWQgYnkgdGhlCiAJICogbmV0d29ya2luZyBjb2RlIC0gaWYgdGhlIHRpbWVyIGlzIHJlLW1vZGlmaWVkCkBAIC04MDMsOCArODA0LDYgQEAKIAlpZiAodGltZXJfcGVuZGluZyh0aW1lcikgJiYgdGltZXItPmV4cGlyZXMgPT0gZXhwaXJlcykKIAkJcmV0dXJuIDE7CiAKLQlleHBpcmVzID0gYXBwbHlfc2xhY2sodGltZXIsIGV4cGlyZXMpOwotCiAJcmV0dXJuIF9fbW9kX3RpbWVyKHRpbWVyLCBleHBpcmVzLCBmYWxzZSwgVElNRVJfTk9UX1BJTk5FRCk7CiB9CiBFWFBPUlRfU1lNQk9MKG1vZF90aW1lcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKaW5kZXggMWVlNDE3Zi4uOTA4MDM4ZiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwpAQCAtMjc0MCw3ICsyNzQwLDcgQEAKIHsKIAljaGFyICpmdW5jLCAqY29tbWFuZCwgKm5leHQgPSBidWZmOwogCXN0cnVjdCBmdHJhY2VfZnVuY19jb21tYW5kICpwOwotCWludCByZXQ7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlmdW5jID0gc3Ryc2VwKCZuZXh0LCAiOiIpOwogCkBAIC0zMzMwLDYgKzMzMzAsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgKnA7CiAJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7CiAJcCA9IHN0YXJ0OwpAQCAtMzM0Niw3ICszMzQ3LDEzIEBACiAJCWZ0cmFjZV9yZWNvcmRfaXAoYWRkcik7CiAJfQogCisJLyoKKwkgKiBEaXNhYmxlIGludGVycnVwdHMgdG8gcHJldmVudCBpbnRlcnJ1cHRzIGZyb20gZXhlY3V0aW5nCisJICogY29kZSB0aGF0IGlzIGJlaW5nIG1vZGlmaWVkLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlmdHJhY2VfdXBkYXRlX2NvZGUobW9kKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwppbmRleCBmOTI1YzQ1Li4yN2QxM2IzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCkBAIC0xODcwLDggKzE4NzAsMTIgQEAKIAogI2lmZGVmIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUCiAKLXN0YXRpYyBpbnQga3Byb2JlX3RyYWNlX3NlbGZ0ZXN0X3RhcmdldChpbnQgYTEsIGludCBhMiwgaW50IGEzLAotCQkJCQlpbnQgYTQsIGludCBhNSwgaW50IGE2KQorLyoKKyAqIFRoZSAiX191c2VkIiBrZWVwcyBnY2MgZnJvbSByZW1vdmluZyB0aGUgZnVuY3Rpb24gc3ltYm9sCisgKiBmcm9tIHRoZSBrYWxsc3ltcyB0YWJsZS4KKyAqLworc3RhdGljIF9fdXNlZCBpbnQga3Byb2JlX3RyYWNlX3NlbGZ0ZXN0X3RhcmdldChpbnQgYTEsIGludCBhMiwgaW50IGEzLAorCQkJCQkgICAgICAgaW50IGE0LCBpbnQgYTUsIGludCBhNikKIHsKIAlyZXR1cm4gYTEgKyBhMiArIGEzICsgYTQgKyBhNSArIGE2OwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jCmluZGV4IGRmZjc2M2IuLjFmMDY0NjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMKQEAgLTI0MCwxMyArMjQwLDEwIEBACiAJY29uc3QgY2hhciAqKmZtdCA9IHY7CiAJaW50IHN0YXJ0X2luZGV4OwogCi0JaWYgKCFmbXQpCi0JCWZtdCA9IF9fc3RhcnRfX190cmFjZV9icHJpbnRrX2ZtdCArICpwb3M7Ci0KIAlzdGFydF9pbmRleCA9IF9fc3RvcF9fX3RyYWNlX2JwcmludGtfZm10IC0gX19zdGFydF9fX3RyYWNlX2JwcmludGtfZm10OwogCiAJaWYgKCpwb3MgPCBzdGFydF9pbmRleCkKLQkJcmV0dXJuIGZtdDsKKwkJcmV0dXJuIF9fc3RhcnRfX190cmFjZV9icHJpbnRrX2ZtdCArICpwb3M7CiAKIAlyZXR1cm4gZmluZF9uZXh0X21vZF9mb3JtYXQoc3RhcnRfaW5kZXgsIHYsIGZtdCwgcG9zKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggMjhhZmE0Yy4uZGQzNzNjOCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCWJvb2wgIlZlcmJvc2UgQlVHKCkgcmVwb3J0aW5nIChhZGRzIDcwSykiIGlmIERFQlVHX0tFUk5FTCAmJiBFWFBFUlQKIAlkZXBlbmRzIG9uIEJVRwogCWRlcGVuZHMgb24gQVJNIHx8IEFWUjMyIHx8IE0zMlIgfHwgTTY4SyB8fCBTUEFSQzMyIHx8IFNQQVJDNjQgfHwgXAotCQkgICBGUlYgfHwgU1VQRVJIIHx8IEdFTkVSSUNfQlVHIHx8IEJMQUNLRklOIHx8IE1OMTAzMDAKKwkJICAgRlJWIHx8IFNVUEVSSCB8fCBHRU5FUklDX0JVRyB8fCBCTEFDS0ZJTiB8fCBNTjEwMzAwIHx8IFRJTEUKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIG1ha2UgQlVHKCkgcGFuaWNzIG91dHB1dCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgpkaWZmIC0tZ2l0IGEvbGliL2JpdG1hcC5jIGIvbGliL2JpdG1hcC5jCmluZGV4IDQxYmFmMDIuLjNmM2I2ODEgMTAwNjQ0Ci0tLSBhL2xpYi9iaXRtYXAuYworKysgYi9saWIvYml0bWFwLmMKQEAgLTU3Miw3ICs1NzIsNyBAQAogCiAvKioKICAqIF9fYml0bWFwX3BhcnNlbGlzdCAtIGNvbnZlcnQgbGlzdCBmb3JtYXQgQVNDSUkgc3RyaW5nIHRvIGJpdG1hcAotICogQGJwOiByZWFkIG51bC10ZXJtaW5hdGVkIHVzZXIgc3RyaW5nIGZyb20gdGhpcyBidWZmZXIKKyAqIEBidWY6IHJlYWQgbnVsLXRlcm1pbmF0ZWQgdXNlciBzdHJpbmcgZnJvbSB0aGlzIGJ1ZmZlcgogICogQGJ1ZmxlbjogYnVmZmVyIHNpemUgaW4gYnl0ZXMuICBJZiBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoaXMKICAqICAgIHRoZW4gaXQgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSBcMC4KICAqIEBpc191c2VyOiBsb2NhdGlvbiBvZiBidWZmZXIsIDAgaW5kaWNhdGVzIGtlcm5lbCBzcGFjZQpkaWZmIC0tZ2l0IGEvbGliL2RlYnVnb2JqZWN0cy5jIGIvbGliL2RlYnVnb2JqZWN0cy5jCmluZGV4IDlkODZlNDUuLmE3OGI3YzYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWJ1Z29iamVjdHMuYworKysgYi9saWIvZGVidWdvYmplY3RzLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCSAqIGluaXRpYWxpemVkOgogCSAqLwogCWlmIChvYmpfcG9vbF9mcmVlID4gT0RFQlVHX1BPT0xfU0laRSAmJiBvYmpfY2FjaGUpCi0JCXNjaGVkID0gIXdvcmtfcGVuZGluZygmZGVidWdfb2JqX3dvcmspOworCQlzY2hlZCA9IGtldmVudGRfdXAoKSAmJiAhd29ya19wZW5kaW5nKCZkZWJ1Z19vYmpfd29yayk7CiAJaGxpc3RfYWRkX2hlYWQoJm9iai0+bm9kZSwgJm9ial9wb29sKTsKIAlvYmpfcG9vbF9mcmVlKys7CiAJb2JqX3Bvb2xfdXNlZC0tOwpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggODJkYzM0Yy4uNjQwYmQ5OCAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC05NDgsMTQgKzk0OCwxNCBAQAogfQogCiAKLWNvbnN0IHZvaWQgKmtvYmpfbnNfY3VycmVudChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKQordm9pZCAqa29ial9uc19ncmFiX2N1cnJlbnQoZW51bSBrb2JqX25zX3R5cGUgdHlwZSkKIHsKLQljb25zdCB2b2lkICpucyA9IE5VTEw7CisJdm9pZCAqbnMgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CiAJaWYgKCh0eXBlID4gS09CSl9OU19UWVBFX05PTkUpICYmICh0eXBlIDwgS09CSl9OU19UWVBFUykgJiYKIAkgICAga29ial9uc19vcHNfdGJsW3R5cGVdKQotCQlucyA9IGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+Y3VycmVudF9ucygpOworCQlucyA9IGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+Z3JhYl9jdXJyZW50X25zKCk7CiAJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKIAogCXJldHVybiBuczsKQEAgLTk4NywyMyArOTg3LDE1IEBACiAJcmV0dXJuIG5zOwogfQogCi0vKgotICoga29ial9uc19leGl0IC0gaW52YWxpZGF0ZSBhIG5hbWVzcGFjZSB0YWcKLSAqCi0gKiBAdHlwZTogdGhlIG5hbWVzcGFjZSB0eXBlIChpLmUuIEtPQkpfTlNfVFlQRV9ORVQpCi0gKiBAbnM6IHRoZSBhY3R1YWwgbmFtZXNwYWNlIGJlaW5nIGludmFsaWRhdGVkCi0gKgotICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHRhZyBpcyBubyBsb25nZXIgdmFsaWQuICBGb3IgaW5zdGFuY2UsCi0gKiB3aGVuIGEgbmV0d29yayBuYW1lc3BhY2UgZXhpdHMsIGl0IHVzZXMgdGhpcyBoZWxwZXIgdG8KLSAqIG1ha2Ugc3VyZSBubyBzYidzIHN5c2ZzX2luZm8gcG9pbnRzIHRvIHRoZSBub3ctaW52YWxpZGF0ZWQKLSAqIG5ldG5zLgotICovCi12b2lkIGtvYmpfbnNfZXhpdChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlLCBjb25zdCB2b2lkICpucykKK3ZvaWQga29ial9uc19kcm9wKGVudW0ga29ial9uc190eXBlIHR5cGUsIHZvaWQgKm5zKQogewotCXN5c2ZzX2V4aXRfbnModHlwZSwgbnMpOworCXNwaW5fbG9jaygma29ial9uc190eXBlX2xvY2spOworCWlmICgodHlwZSA+IEtPQkpfTlNfVFlQRV9OT05FKSAmJiAodHlwZSA8IEtPQkpfTlNfVFlQRVMpICYmCisJICAgIGtvYmpfbnNfb3BzX3RibFt0eXBlXSAmJiBrb2JqX25zX29wc190YmxbdHlwZV0tPmRyb3BfbnMpCisJCWtvYmpfbnNfb3BzX3RibFt0eXBlXS0+ZHJvcF9ucyhucyk7CisJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKIH0KIAotCiBFWFBPUlRfU1lNQk9MKGtvYmplY3RfZ2V0KTsKIEVYUE9SVF9TWU1CT0woa29iamVjdF9wdXQpOwogRVhQT1JUX1NZTUJPTChrb2JqZWN0X2RlbCk7CmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCA5M2NhMDhiLi45OTA5M2IzIDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTExMCw2ICsxMTAsMTEgQEAKIF9fc2V0dXAoInN3aW90bGI9Iiwgc2V0dXBfaW9fdGxiX25wYWdlcyk7CiAvKiBtYWtlIGlvX3RsYl9vdmVyZmxvdyB0dW5hYmxlIHRvbz8gKi8KIAordW5zaWduZWQgbG9uZyBzd2lvbHRiX25yX3RibCh2b2lkKQoreworCXJldHVybiBpb190bGJfbnNsYWJzOworfQorCiAvKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBoaWdobWVtIHBhZ2UgKi8KIHN0YXRpYyBkbWFfYWRkcl90IHN3aW90bGJfdmlydF90b19idXMoc3RydWN0IGRldmljZSAqaHdkZXYsCiAJCQkJICAgICAgdm9sYXRpbGUgdm9pZCAqYWRkcmVzcykKZGlmZiAtLWdpdCBhL2xpYi92c3ByaW50Zi5jIGIvbGliL3ZzcHJpbnRmLmMKaW5kZXggYzExMjA1Ni4uNDM2NWRmMyAxMDA2NDQKLS0tIGEvbGliL3ZzcHJpbnRmLmMKKysrIGIvbGliL3ZzcHJpbnRmLmMKQEAgLTY2Niw2ICs2NjYsOCBAQAogCQkJY29sb25wb3MgPSBpOwogCQl9CiAJfQorCWlmIChsb25nZXN0ID09IDEpCQkvKiBkb24ndCBjb21wcmVzcyBhIHNpbmdsZSAwICovCisJCWNvbG9ucG9zID0gLTE7CiAKIAkvKiBlbWl0IGFkZHJlc3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcmFuZ2U7IGkrKykgewpAQCAtODI2LDcgKzgyOCw3IEBACiAgKiAgICAgICBJUHY0IHVzZXMgZG90LXNlcGFyYXRlZCBkZWNpbWFsIHdpdGggbGVhZGluZyAwJ3MgKDAxMC4xMjMuMDQ1LjAwNikKICAqIC0gJ1tJaV00W2huYmxdJyBJUHY0IGFkZHJlc3NlcyBpbiBob3N0LCBuZXR3b3JrLCBiaWcgb3IgbGl0dGxlIGVuZGlhbiBvcmRlcgogICogLSAnSTZjJyBmb3IgSVB2NiBhZGRyZXNzZXMgcHJpbnRlZCBhcyBzcGVjaWZpZWQgYnkKLSAqICAgICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtNm1hbi10ZXh0LWFkZHItcmVwcmVzZW50YXRpb24tMDAKKyAqICAgICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU5NTIKICAqIC0gJ1UnIEZvciBhIDE2IGJ5dGUgVVVJRC9HVUlELCBpdCBwcmludHMgdGhlIFVVSUQvR1VJRCBpbiB0aGUgZm9ybQogICogICAgICAgInh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCIKICAqICAgICAgIE9wdGlvbnMgZm9yICVwVSBhcmU6CmRpZmYgLS1naXQgYS9tbS9jb21wYWN0aW9uLmMgYi9tbS9jb21wYWN0aW9uLmMKaW5kZXggMDIxYTI5Ni4uNmNjNjA0YiAxMDA2NDQKLS0tIGEvbW0vY29tcGFjdGlvbi5jCisrKyBiL21tL2NvbXBhY3Rpb24uYwpAQCAtMTQ0LDkgKzE0NCwyMCBAQAogCWludCBucl9mcmVlcGFnZXMgPSBjYy0+bnJfZnJlZXBhZ2VzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmZyZWVsaXN0ID0gJmNjLT5mcmVlcGFnZXM7CiAKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIGZyZWUgc2Nhbm5lci4gVGhlIHN0YXJ0aW5nIHBvaW50IGlzIHdoZXJlIHdlIGxhc3QKKwkgKiBzY2FubmVkIGZyb20gKG9yIHRoZSBlbmQgb2YgdGhlIHpvbmUgaWYgc3RhcnRpbmcpLiBUaGUgbG93IHBvaW50CisJICogaXMgdGhlIGVuZCBvZiB0aGUgcGFnZWJsb2NrIHRoZSBtaWdyYXRpb24gc2Nhbm5lciBpcyB1c2luZy4KKwkgKi8KIAlwZm4gPSBjYy0+ZnJlZV9wZm47CiAJbG93X3BmbiA9IGNjLT5taWdyYXRlX3BmbiArIHBhZ2VibG9ja19ucl9wYWdlczsKLQloaWdoX3BmbiA9IGxvd19wZm47CisKKwkvKgorCSAqIFRha2UgY2FyZSB0aGF0IGlmIHRoZSBtaWdyYXRpb24gc2Nhbm5lciBpcyBhdCB0aGUgZW5kIG9mIHRoZSB6b25lCisJICogdGhhdCB0aGUgZnJlZSBzY2FubmVyIGRvZXMgbm90IGFjY2lkZW50YWxseSBtb3ZlIHRvIHRoZSBuZXh0IHpvbmUKKwkgKiBpbiB0aGUgbmV4dCBpc29sYXRpb24gY3ljbGUuCisJICovCisJaGlnaF9wZm4gPSBtaW4obG93X3BmbiwgcGZuKTsKIAogCS8qCiAJICogSXNvbGF0ZSBmcmVlIHBhZ2VzIHVudGlsIGVub3VnaCBhcmUgYXZhaWxhYmxlIHRvIG1pZ3JhdGUgdGhlCkBAIC0yNDAsMTEgKzI1MSwxOCBAQAogCXJldHVybiBpc29sYXRlZCA+IChpbmFjdGl2ZSArIGFjdGl2ZSkgLyAyOwogfQogCisvKiBwb3NzaWJsZSBvdXRjb21lIG9mIGlzb2xhdGVfbWlncmF0ZXBhZ2VzICovCit0eXBlZGVmIGVudW0geworCUlTT0xBVEVfQUJPUlQsCQkvKiBBYm9ydCBjb21wYWN0aW9uIG5vdyAqLworCUlTT0xBVEVfTk9ORSwJCS8qIE5vIHBhZ2VzIGlzb2xhdGVkLCBjb250aW51ZSBzY2FubmluZyAqLworCUlTT0xBVEVfU1VDQ0VTUywJLyogUGFnZXMgaXNvbGF0ZWQsIG1pZ3JhdGUgKi8KK30gaXNvbGF0ZV9taWdyYXRlX3Q7CisKIC8qCiAgKiBJc29sYXRlIGFsbCBwYWdlcyB0aGF0IGNhbiBiZSBtaWdyYXRlZCBmcm9tIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5CiAgKiB0aGUgbWlncmF0ZSBzY2FubmVyIHdpdGhpbiBjb21wYWN0X2NvbnRyb2wuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCB6b25lICp6b25lLAorc3RhdGljIGlzb2xhdGVfbWlncmF0ZV90IGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCB6b25lICp6b25lLAogCQkJCQlzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKIHsKIAl1bnNpZ25lZCBsb25nIGxvd19wZm4sIGVuZF9wZm47CkBAIC0yNjEsNyArMjc5LDcgQEAKIAkvKiBEbyBub3QgY3Jvc3MgdGhlIGZyZWUgc2Nhbm5lciBvciBzY2FuIHdpdGhpbiBhIG1lbW9yeSBob2xlICovCiAJaWYgKGVuZF9wZm4gPiBjYy0+ZnJlZV9wZm4gfHwgIXBmbl92YWxpZChsb3dfcGZuKSkgewogCQljYy0+bWlncmF0ZV9wZm4gPSBlbmRfcGZuOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIElTT0xBVEVfTk9ORTsKIAl9CiAKIAkvKgpAQCAtMjcwLDEwICsyODgsMTQgQEAKIAkgKiBkZWxheSBmb3Igc29tZSB0aW1lIHVudGlsIGZld2VyIHBhZ2VzIGFyZSBpc29sYXRlZAogCSAqLwogCXdoaWxlICh1bmxpa2VseSh0b29fbWFueV9pc29sYXRlZCh6b25lKSkpIHsKKwkJLyogYXN5bmMgbWlncmF0aW9uIHNob3VsZCBqdXN0IGFib3J0ICovCisJCWlmICghY2MtPnN5bmMpCisJCQlyZXR1cm4gSVNPTEFURV9BQk9SVDsKKwogCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi8xMCk7CiAKIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gSVNPTEFURV9BQk9SVDsKIAl9CiAKIAkvKiBUaW1lIHRvIGlzb2xhdGUgc29tZSBwYWdlcyBmb3IgbWlncmF0aW9uICovCkBAIC0zNTgsNyArMzgwLDcgQEAKIAogCXRyYWNlX21tX2NvbXBhY3Rpb25faXNvbGF0ZV9taWdyYXRlcGFnZXMobnJfc2Nhbm5lZCwgbnJfaXNvbGF0ZWQpOwogCi0JcmV0dXJuIGNjLT5ucl9taWdyYXRlcGFnZXM7CisJcmV0dXJuIElTT0xBVEVfU1VDQ0VTUzsKIH0KIAogLyoKQEAgLTQyMCwxMyArNDQyLDYgQEAKIAlpZiAoY2MtPmZyZWVfcGZuIDw9IGNjLT5taWdyYXRlX3BmbikKIAkJcmV0dXJuIENPTVBBQ1RfQ09NUExFVEU7CiAKLQkvKiBDb21wYWN0aW9uIHJ1biBpcyBub3QgZmluaXNoZWQgaWYgdGhlIHdhdGVybWFyayBpcyBub3QgbWV0ICovCi0Jd2F0ZXJtYXJrID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpOwotCXdhdGVybWFyayArPSAoMSA8PCBjYy0+b3JkZXIpOwotCi0JaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBjYy0+b3JkZXIsIHdhdGVybWFyaywgMCwgMCkpCi0JCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOwotCiAJLyoKIAkgKiBvcmRlciA9PSAtMSBpcyBleHBlY3RlZCB3aGVuIGNvbXBhY3RpbmcgdmlhCiAJICogL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5CkBAIC00MzQsNiArNDQ5LDEzIEBACiAJaWYgKGNjLT5vcmRlciA9PSAtMSkKIAkJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7CiAKKwkvKiBDb21wYWN0aW9uIHJ1biBpcyBub3QgZmluaXNoZWQgaWYgdGhlIHdhdGVybWFyayBpcyBub3QgbWV0ICovCisJd2F0ZXJtYXJrID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpOworCXdhdGVybWFyayArPSAoMSA8PCBjYy0+b3JkZXIpOworCisJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBjYy0+b3JkZXIsIHdhdGVybWFyaywgMCwgMCkpCisJCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOworCiAJLyogRGlyZWN0IGNvbXBhY3RvcjogSXMgYSBzdWl0YWJsZSBwYWdlIGZyZWU/ICovCiAJZm9yIChvcmRlciA9IGNjLT5vcmRlcjsgb3JkZXIgPCBNQVhfT1JERVI7IG9yZGVyKyspIHsKIAkJLyogSm9iIGRvbmUgaWYgcGFnZSBpcyBmcmVlIG9mIHRoZSByaWdodCBtaWdyYXRldHlwZSAqLwpAQCAtNDYxLDYgKzQ4MywxMyBAQAogCXVuc2lnbmVkIGxvbmcgd2F0ZXJtYXJrOwogCiAJLyoKKwkgKiBvcmRlciA9PSAtMSBpcyBleHBlY3RlZCB3aGVuIGNvbXBhY3RpbmcgdmlhCisJICogL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5CisJICovCisJaWYgKG9yZGVyID09IC0xKQorCQlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKKworCS8qCiAJICogV2F0ZXJtYXJrcyBmb3Igb3JkZXItMCBtdXN0IGJlIG1ldCBmb3IgY29tcGFjdGlvbi4gTm90ZSB0aGUgMlVMLgogCSAqIFRoaXMgaXMgYmVjYXVzZSBkdXJpbmcgbWlncmF0aW9uLCBjb3BpZXMgb2YgcGFnZXMgbmVlZCB0byBiZQogCSAqIGFsbG9jYXRlZCBhbmQgZm9yIGEgc2hvcnQgdGltZSwgdGhlIGZvb3RwcmludCBpcyBoaWdoZXIKQEAgLTQ3MCwxNyArNDk5LDExIEBACiAJCXJldHVybiBDT01QQUNUX1NLSVBQRUQ7CiAKIAkvKgotCSAqIG9yZGVyID09IC0xIGlzIGV4cGVjdGVkIHdoZW4gY29tcGFjdGluZyB2aWEKLQkgKiAvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnkKLQkgKi8KLQlpZiAob3JkZXIgPT0gLTEpCi0JCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOwotCi0JLyoKIAkgKiBmcmFnbWVudGF0aW9uIGluZGV4IGRldGVybWluZXMgaWYgYWxsb2NhdGlvbiBmYWlsdXJlcyBhcmUgZHVlIHRvCiAJICogbG93IG1lbW9yeSBvciBleHRlcm5hbCBmcmFnbWVudGF0aW9uCiAJICoKLQkgKiBpbmRleCBvZiAtMSBpbXBsaWVzIGFsbG9jYXRpb25zIG1pZ2h0IHN1Y2NlZWQgZGVwZW5kaW5nb24gd2F0ZXJtYXJrcworCSAqIGluZGV4IG9mIC0xMDAwIGltcGxpZXMgYWxsb2NhdGlvbnMgbWlnaHQgc3VjY2VlZCBkZXBlbmRpbmcgb24KKwkgKiB3YXRlcm1hcmtzCiAJICogaW5kZXggdG93YXJkcyAwIGltcGxpZXMgZmFpbHVyZSBpcyBkdWUgdG8gbGFjayBvZiBtZW1vcnkKIAkgKiBpbmRleCB0b3dhcmRzIDEwMDAgaW1wbGllcyBmYWlsdXJlIGlzIGR1ZSB0byBmcmFnbWVudGF0aW9uCiAJICoKQEAgLTQ5MCw3ICs1MTMsOCBAQAogCWlmIChmcmFnaW5kZXggPj0gMCAmJiBmcmFnaW5kZXggPD0gc3lzY3RsX2V4dGZyYWdfdGhyZXNob2xkKQogCQlyZXR1cm4gQ09NUEFDVF9TS0lQUEVEOwogCi0JaWYgKGZyYWdpbmRleCA9PSAtMSAmJiB6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgd2F0ZXJtYXJrLCAwLCAwKSkKKwlpZiAoZnJhZ2luZGV4ID09IC0xMDAwICYmIHpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCB3YXRlcm1hcmssCisJICAgIDAsIDApKQogCQlyZXR1cm4gQ09NUEFDVF9QQVJUSUFMOwogCiAJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7CkBAIC01MjIsOCArNTQ2LDE1IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfbWlncmF0ZSwgbnJfcmVtYWluaW5nOwogCQlpbnQgZXJyOwogCi0JCWlmICghaXNvbGF0ZV9taWdyYXRlcGFnZXMoem9uZSwgY2MpKQorCQlzd2l0Y2ggKGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHpvbmUsIGNjKSkgeworCQljYXNlIElTT0xBVEVfQUJPUlQ6CisJCQlyZXQgPSBDT01QQUNUX1BBUlRJQUw7CisJCQlnb3RvIG91dDsKKwkJY2FzZSBJU09MQVRFX05PTkU6CiAJCQljb250aW51ZTsKKwkJY2FzZSBJU09MQVRFX1NVQ0NFU1M6CisJCQk7CisJCX0KIAogCQlucl9taWdyYXRlID0gY2MtPm5yX21pZ3JhdGVwYWdlczsKIAkJZXJyID0gbWlncmF0ZV9wYWdlcygmY2MtPm1pZ3JhdGVwYWdlcywgY29tcGFjdGlvbl9hbGxvYywKQEAgLTU0Nyw2ICs1NzgsNyBAQAogCiAJfQogCitvdXQ6CiAJLyogUmVsZWFzZSBmcmVlIHBhZ2VzIGFuZCBjaGVjayBhY2NvdW50aW5nICovCiAJY2MtPm5yX2ZyZWVwYWdlcyAtPSByZWxlYXNlX2ZyZWVwYWdlcygmY2MtPmZyZWVwYWdlcyk7CiAJVk1fQlVHX09OKGNjLT5ucl9mcmVlcGFnZXMgIT0gMCk7CmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggZDdiMTA1Ny4uYTgyNTFhOCAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMjAwMCw3ICsyMDAwLDcgQEAKIAkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9raWxscHJpdihkZW50cnkpOwogCWlmICghZXJyb3IgJiYga2lsbHN1aWQpCiAJCWVycm9yID0gX19yZW1vdmVfc3VpZChkZW50cnksIGtpbGxzdWlkKTsKLQlpZiAoIWVycm9yKQorCWlmICghZXJyb3IgJiYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfTk9TRUMpKQogCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PU0VDOwogCiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggNjE1ZDk3NC4uODE1MzJmMjkgMTAwNjQ0Ci0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKKysrIGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMjIzNCwxMSArMjIzNCw4IEBACiAJd2hpbGUgKGxpa2VseShraHVnZXBhZ2VkX2VuYWJsZWQoKSkpIHsKICNpZm5kZWYgQ09ORklHX05VTUEKIAkJaHBhZ2UgPSBraHVnZXBhZ2VkX2FsbG9jX2h1Z2VwYWdlKCk7Ci0JCWlmICh1bmxpa2VseSghaHBhZ2UpKSB7Ci0JCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTsKKwkJaWYgKHVubGlrZWx5KCFocGFnZSkpCiAJCQlicmVhazsKLQkJfQotCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpOwogI2Vsc2UKIAkJaWYgKElTX0VSUihocGFnZSkpIHsKIAkJCWtodWdlcGFnZWRfYWxsb2Nfc2xlZXAoKTsKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBmMzNiYjMxLi5iZmNmMTUzIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0xMDMzLDEwICsxMDMzLDEwIEBACiAJICovCiAJY2hnID0gdm1hX25lZWRzX3Jlc2VydmF0aW9uKGgsIHZtYSwgYWRkcik7CiAJaWYgKGNoZyA8IDApCi0JCXJldHVybiBFUlJfUFRSKGNoZyk7CisJCXJldHVybiBFUlJfUFRSKC1WTV9GQVVMVF9PT00pOwogCWlmIChjaGcpCiAJCWlmIChodWdldGxiX2dldF9xdW90YShpbm9kZS0+aV9tYXBwaW5nLCBjaGcpKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJCQlyZXR1cm4gRVJSX1BUUigtVk1fRkFVTFRfU0lHQlVTKTsKIAogCXNwaW5fbG9jaygmaHVnZXRsYl9sb2NrKTsKIAlwYWdlID0gZGVxdWV1ZV9odWdlX3BhZ2Vfdm1hKGgsIHZtYSwgYWRkciwgYXZvaWRfcmVzZXJ2ZSk7CkBAIC0xMTExLDYgKzExMTEsMTQgQEAKIAkJV0FSTl9PTihwYWdlX2NvdW50KHBhZ2UpICE9IDEpOwogCQlwcmVwX2NvbXBvdW5kX2h1Z2VfcGFnZShwYWdlLCBoLT5vcmRlcik7CiAJCXByZXBfbmV3X2h1Z2VfcGFnZShoLCBwYWdlLCBwYWdlX3RvX25pZChwYWdlKSk7CisJCS8qCisJCSAqIElmIHdlIGhhZCBnaWdhbnRpYyBodWdlcGFnZXMgYWxsb2NhdGVkIGF0IGJvb3QgdGltZSwgd2UgbmVlZAorCQkgKiB0byByZXN0b3JlIHRoZSAnc3RvbGVuJyBwYWdlcyB0byB0b3RhbHJhbV9wYWdlcyBpbiBvcmRlciB0bworCQkgKiBmaXggY29uZnVzaW5nIG1lbW9yeSByZXBvcnRzIGZyb20gZnJlZSgxKSBhbmQgYW5vdGhlcgorCQkgKiBzaWRlLWVmZmVjdHMsIGxpa2UgQ29tbWl0TGltaXQgZ29pbmcgbmVnYXRpdmUuCisJCSAqLworCQlpZiAoaC0+b3JkZXIgPiAoTUFYX09SREVSIC0gMSkpCisJCQl0b3RhbHJhbV9wYWdlcyArPSAxIDw8IGgtPm9yZGVyOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvbW0va3NtLmMgYi9tbS9rc20uYwppbmRleCBkNzA4YjNlLi45YTY4YjBjIDEwMDY0NAotLS0gYS9tbS9rc20uYworKysgYi9tbS9rc20uYwpAQCAtMTMwMiw2ICsxMzAyLDEyIEBACiAJCXNsb3QgPSBsaXN0X2VudHJ5KHNsb3QtPm1tX2xpc3QubmV4dCwgc3RydWN0IG1tX3Nsb3QsIG1tX2xpc3QpOwogCQlrc21fc2Nhbi5tbV9zbG90ID0gc2xvdDsKIAkJc3Bpbl91bmxvY2soJmtzbV9tbWxpc3RfbG9jayk7CisJCS8qCisJCSAqIEFsdGhvdWdoIHdlIHRlc3RlZCBsaXN0X2VtcHR5KCkgYWJvdmUsIGEgcmFjaW5nIF9fa3NtX2V4aXQKKwkJICogb2YgdGhlIGxhc3QgbW0gb24gdGhlIGxpc3QgbWF5IGhhdmUgcmVtb3ZlZCBpdCBzaW5jZSB0aGVuLgorCQkgKi8KKwkJaWYgKHNsb3QgPT0gJmtzbV9tbV9oZWFkKQorCQkJcmV0dXJuIE5VTEw7CiBuZXh0X21tOgogCQlrc21fc2Nhbi5hZGRyZXNzID0gMDsKIAkJa3NtX3NjYW4ucm1hcF9saXN0ID0gJnNsb3QtPnJtYXBfbGlzdDsKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCBiZDkwNTJhLi5lMDEzYjhlIDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgpAQCAtMTA3LDEwICsxMDgsMTIgQEAKIGVudW0gbWVtX2Nncm91cF9ldmVudHNfdGFyZ2V0IHsKIAlNRU1fQ0dST1VQX1RBUkdFVF9USFJFU0gsCiAJTUVNX0NHUk9VUF9UQVJHRVRfU09GVExJTUlULAorCU1FTV9DR1JPVVBfVEFSR0VUX05VTUFJTkZPLAogCU1FTV9DR1JPVVBfTlRBUkdFVFMsCiB9OwogI2RlZmluZSBUSFJFU0hPTERTX0VWRU5UU19UQVJHRVQgKDEyOCkKICNkZWZpbmUgU09GVExJTUlUX0VWRU5UU19UQVJHRVQgKDEwMjQpCisjZGVmaW5lIE5VTUFJTkZPX0VWRU5UU19UQVJHRVQJKDEwMjQpCiAKIHN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfY3B1IHsKIAlsb25nIGNvdW50W01FTV9DR1JPVVBfU1RBVF9OU1RBVFNdOwpAQCAtMjM2LDcgKzIzOSw4IEBACiAJaW50IGxhc3Rfc2Nhbm5lZF9ub2RlOwogI2lmIE1BWF9OVU1OT0RFUyA+IDEKIAlub2RlbWFza190CXNjYW5fbm9kZXM7Ci0JdW5zaWduZWQgbG9uZyAgIG5leHRfc2Nhbl9ub2RlX3VwZGF0ZTsKKwlhdG9taWNfdAludW1haW5mb19ldmVudHM7CisJYXRvbWljX3QJbnVtYWluZm9fdXBkYXRpbmc7CiAjZW5kaWYKIAkvKgogCSAqIFNob3VsZCB0aGUgYWNjb3VudGluZyBhbmQgY29udHJvbCBiZSBoaWVyYXJjaGljYWwsIHBlciBzdWJ0cmVlPwpAQCAtMzU5LDcgKzM2Myw3IEBACiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2dldChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnRfbWVtX2Nncm91cChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKLXN0YXRpYyB2b2lkIGRyYWluX2FsbF9zdG9ja19hc3luYyh2b2lkKTsKK3N0YXRpYyB2b2lkIGRyYWluX2FsbF9zdG9ja19hc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKIAogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKIG1lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5pZCwgaW50IHppZCkKQEAgLTU3NiwxNSArNTgwLDYgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgbG9uZyBtZW1fY2dyb3VwX2xvY2FsX3VzYWdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCi17Ci0JbG9uZyByZXQ7Ci0KLQlyZXQgPSBtZW1fY2dyb3VwX3JlYWRfc3RhdChtZW0sIE1FTV9DR1JPVVBfU1RBVF9SU1MpOwotCXJldCArPSBtZW1fY2dyb3VwX3JlYWRfc3RhdChtZW0sIE1FTV9DR1JPVVBfU1RBVF9DQUNIRSk7Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKIAkJCQkJIGJvb2wgY2hhcmdlKQogewpAQCAtNjg4LDYgKzY4Myw5IEBACiAJY2FzZSBNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQ6CiAJCW5leHQgPSB2YWwgKyBTT0ZUTElNSVRfRVZFTlRTX1RBUkdFVDsKIAkJYnJlYWs7CisJY2FzZSBNRU1fQ0dST1VQX1RBUkdFVF9OVU1BSU5GTzoKKwkJbmV4dCA9IHZhbCArIE5VTUFJTkZPX0VWRU5UU19UQVJHRVQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAl9CkBAIC03MDYsMTEgKzcwNCwxOSBAQAogCQltZW1fY2dyb3VwX3RocmVzaG9sZChtZW0pOwogCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW0sIE1FTV9DR1JPVVBfVEFSR0VUX1RIUkVTSCk7CiAJCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbSwKLQkJCU1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCkpKXsKKwkJCSAgICAgTUVNX0NHUk9VUF9UQVJHRVRfU09GVExJTUlUKSkpIHsKIAkJCW1lbV9jZ3JvdXBfdXBkYXRlX3RyZWUobWVtLCBwYWdlKTsKIAkJCV9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKG1lbSwKLQkJCQlNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQpOworCQkJCQkJICAgTUVNX0NHUk9VUF9UQVJHRVRfU09GVExJTUlUKTsKIAkJfQorI2lmIE1BWF9OVU1OT0RFUyA+IDEKKwkJaWYgKHVubGlrZWx5KF9fbWVtY2dfZXZlbnRfY2hlY2sobWVtLAorCQkJTUVNX0NHUk9VUF9UQVJHRVRfTlVNQUlORk8pKSkgeworCQkJYXRvbWljX2luYygmbWVtLT5udW1haW5mb19ldmVudHMpOworCQkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLAorCQkJCU1FTV9DR1JPVVBfVEFSR0VUX05VTUFJTkZPKTsKKwkJfQorI2VuZGlmCiAJfQogfQogCkBAIC03MzUsNyArNzQxLDcgQEAKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICp0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0cnVjdCBtZW1fY2dyb3VwICp0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKIApAQCAtMTEyOCw3ICsxMTM0LDYgQEAKIAlyZXR1cm4gTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KTsKIH0KIAotI2lmZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX25vZGVfbnJfZmlsZV9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCQkJCWludCBuaWQpCiB7CkBAIC0xMTQwLDYgKzExNDUsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX25vZGVfbnJfYW5vbl9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCQkJCWludCBuaWQpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQgPSBtZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbWNnLCBuaWQsIExSVV9JTkFDVElWRV9BTk9OKSArCisJCW1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtY2csIG5pZCwgTFJVX0FDVElWRV9BTk9OKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWYgTUFYX05VTU5PREVTID4gMQogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ucl9maWxlX2xydV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJdTY0IHRvdGFsID0gMDsKQEAgLTExNTEsMTcgKzExNjcsNiBAQAogCXJldHVybiB0b3RhbDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ub2RlX25yX2Fub25fbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKLQkJCQkJCQlpbnQgbmlkKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCi0JcmV0ID0gbWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW1jZywgbmlkLCBMUlVfSU5BQ1RJVkVfQU5PTikgKwotCQltZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbWNnLCBuaWQsIExSVV9BQ1RJVkVfQU5PTik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX25yX2Fub25fbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAl1NjQgdG90YWwgPSAwOwpAQCAtMTU1OCw2ICsxNTYzLDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiB0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZQorICogQG1lbTogdGhlIHRhcmdldCBtZW1jZworICogQG5pZDogdGhlIG5vZGUgSUQgdG8gYmUgY2hlY2tlZC4KKyAqIEBub3N3YXAgOiBzcGVjaWZ5IHRydWUgaGVyZSBpZiB0aGUgdXNlciB3YW50cyBmbGxlIG9ubHkgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZW1jZyBjb250YWlucyBhbnkKKyAqIHJlY2xhaW1hYmxlIHBhZ2VzIG9uIGEgbm9kZS4gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVjbGFpbWFibGUKKyAqIHBhZ2VzIGluIHRoZSBub2RlLgorICovCitzdGF0aWMgYm9vbCB0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQlpbnQgbmlkLCBib29sIG5vc3dhcCkKK3sKKwlpZiAobWVtX2Nncm91cF9ub2RlX25yX2ZpbGVfbHJ1X3BhZ2VzKG1lbSwgbmlkKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKG5vc3dhcCB8fCAhdG90YWxfc3dhcF9wYWdlcykKKwkJcmV0dXJuIGZhbHNlOworCWlmIChtZW1fY2dyb3VwX25vZGVfbnJfYW5vbl9scnVfcGFnZXMobWVtLCBuaWQpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisKK30KICNpZiBNQVhfTlVNTk9ERVMgPiAxCiAKIC8qCkBAIC0xNTY5LDI2ICsxNTk2LDI2IEBACiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX21heV91cGRhdGVfbm9kZW1hc2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKIAlpbnQgbmlkOwotCi0JaWYgKHRpbWVfYWZ0ZXIobWVtLT5uZXh0X3NjYW5fbm9kZV91cGRhdGUsIGppZmZpZXMpKQorCS8qCisJICogbnVtYWluZm9fZXZlbnRzID4gMCBtZWFucyB0aGVyZSB3YXMgYXQgbGVhc3QgTlVNQUlORk9fRVZFTlRTX1RBUkdFVAorCSAqIHBhZ2Vpbi9wYWdlb3V0IGNoYW5nZXMgc2luY2UgdGhlIGxhc3QgdXBkYXRlLgorCSAqLworCWlmICghYXRvbWljX3JlYWQoJm1lbS0+bnVtYWluZm9fZXZlbnRzKSkKKwkJcmV0dXJuOworCWlmIChhdG9taWNfaW5jX3JldHVybigmbWVtLT5udW1haW5mb191cGRhdGluZykgPiAxKQogCQlyZXR1cm47CiAKLQltZW0tPm5leHRfc2Nhbl9ub2RlX3VwZGF0ZSA9IGppZmZpZXMgKyAxMCpIWjsKIAkvKiBtYWtlIGEgbm9kZW1hc2sgd2hlcmUgdGhpcyBtZW1jZyB1c2VzIG1lbW9yeSBmcm9tICovCiAJbWVtLT5zY2FuX25vZGVzID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07CiAKIAlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkgewogCi0JCWlmIChtZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbSwgbmlkLCBMUlVfSU5BQ1RJVkVfRklMRSkgfHwKLQkJICAgIG1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtLCBuaWQsIExSVV9BQ1RJVkVfRklMRSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAodG90YWxfc3dhcF9wYWdlcyAmJgotCQkgICAgKG1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtLCBuaWQsIExSVV9JTkFDVElWRV9BTk9OKSB8fAotCQkgICAgIG1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtLCBuaWQsIExSVV9BQ1RJVkVfQU5PTikpKQotCQkJY29udGludWU7Ci0JCW5vZGVfY2xlYXIobmlkLCBtZW0tPnNjYW5fbm9kZXMpOworCQlpZiAoIXRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbSwgbmlkLCBmYWxzZSkpCisJCQlub2RlX2NsZWFyKG5pZCwgbWVtLT5zY2FuX25vZGVzKTsKIAl9CisKKwlhdG9taWNfc2V0KCZtZW0tPm51bWFpbmZvX2V2ZW50cywgMCk7CisJYXRvbWljX3NldCgmbWVtLT5udW1haW5mb191cGRhdGluZywgMCk7CiB9CiAKIC8qCkBAIC0xNjI2LDExICsxNjUzLDUxIEBACiAJcmV0dXJuIG5vZGU7CiB9CiAKKy8qCisgKiBDaGVjayBhbGwgbm9kZXMgd2hldGhlciBpdCBjb250YWlucyByZWNsYWltYWJsZSBwYWdlcyBvciBub3QuCisgKiBGb3IgcXVpY2sgc2Nhbiwgd2UgbWFrZSB1c2Ugb2Ygc2Nhbl9ub2Rlcy4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIHNraXAKKyAqIHVudXNlZCBub2Rlcy4gQnV0IHNjYW5fbm9kZXMgaXMgbGF6aWx5IHVwZGF0ZWQgYW5kIG1heSBub3QgY290YWluCisgKiBlbm91Z2ggbmV3IGluZm9ybWF0aW9uLiBXZSBuZWVkIHRvIGRvIGRvdWJsZSBjaGVjay4KKyAqLworYm9vbCBtZW1fY2dyb3VwX3JlY2xhaW1hYmxlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgbm9zd2FwKQoreworCWludCBuaWQ7CisKKwkvKgorCSAqIHF1aWNrIGNoZWNrLi4ubWFraW5nIHVzZSBvZiBzY2FuX25vZGUuCisJICogV2UgY2FuIHNraXAgdW51c2VkIG5vZGVzLgorCSAqLworCWlmICghbm9kZXNfZW1wdHkobWVtLT5zY2FuX25vZGVzKSkgeworCQlmb3IgKG5pZCA9IGZpcnN0X25vZGUobWVtLT5zY2FuX25vZGVzKTsKKwkJICAgICBuaWQgPCBNQVhfTlVNTk9ERVM7CisJCSAgICAgbmlkID0gbmV4dF9ub2RlKG5pZCwgbWVtLT5zY2FuX25vZGVzKSkgeworCisJCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIG5vc3dhcCkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJLyoKKwkgKiBDaGVjayByZXN0IG9mIG5vZGVzLgorCSAqLworCWZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX0hJR0hfTUVNT1JZKSB7CisJCWlmIChub2RlX2lzc2V0KG5pZCwgbWVtLT5zY2FuX25vZGVzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIG5vc3dhcCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiAjZWxzZQogaW50IG1lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbV9ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCiB7CiAJcmV0dXJuIDA7CiB9CisKK2Jvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIG5vc3dhcCkKK3sKKwlyZXR1cm4gdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCAwLCBub3N3YXApOworfQogI2VuZGlmCiAKIC8qCkBAIC0xNjYzLDE1ICsxNzMwLDIxIEBACiAJZXhjZXNzID0gcmVzX2NvdW50ZXJfc29mdF9saW1pdF9leGNlc3MoJnJvb3RfbWVtLT5yZXMpID4+IFBBR0VfU0hJRlQ7CiAKIAkvKiBJZiBtZW1zd19pc19taW5pbXVtPT0xLCBzd2FwLW91dCBpcyBvZi1uby11c2UuICovCi0JaWYgKHJvb3RfbWVtLT5tZW1zd19pc19taW5pbXVtKQorCWlmICghY2hlY2tfc29mdCAmJiByb290X21lbS0+bWVtc3dfaXNfbWluaW11bSkKIAkJbm9zd2FwID0gdHJ1ZTsKIAogCXdoaWxlICgxKSB7CiAJCXZpY3RpbSA9IG1lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbShyb290X21lbSk7CiAJCWlmICh2aWN0aW0gPT0gcm9vdF9tZW0pIHsKIAkJCWxvb3ArKzsKLQkJCWlmIChsb29wID49IDEpCi0JCQkJZHJhaW5fYWxsX3N0b2NrX2FzeW5jKCk7CisJCQkvKgorCQkJICogV2UgYXJlIG5vdCBkcmFpbmluZyBwZXIgY3B1IGNhY2hlZCBjaGFyZ2VzIGR1cmluZworCQkJICogc29mdCBsaW1pdCByZWNsYWltICBiZWNhdXNlIGdsb2JhbCByZWNsYWltIGRvZXNuJ3QKKwkJCSAqIGNhcmUgYWJvdXQgY2hhcmdlcy4gSXQgdHJpZXMgdG8gZnJlZSBzb21lIG1lbW9yeSBhbmQKKwkJCSAqIGNoYXJnZXMgd2lsbCBub3QgZ2l2ZSBhbnkuCisJCQkgKi8KKwkJCWlmICghY2hlY2tfc29mdCAmJiBsb29wID49IDEpCisJCQkJZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHJvb3RfbWVtKTsKIAkJCWlmIChsb29wID49IDIpIHsKIAkJCQkvKgogCQkJCSAqIElmIHdlIGhhdmUgbm90IGJlZW4gYWJsZSB0byByZWNsYWltCkBAIC0xNjk1LDcgKzE3NjgsNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlpZiAoIW1lbV9jZ3JvdXBfbG9jYWxfdXNhZ2UodmljdGltKSkgeworCQlpZiAoIW1lbV9jZ3JvdXBfcmVjbGFpbWFibGUodmljdGltLCBub3N3YXApKSB7CiAJCQkvKiB0aGlzIGNncm91cCdzIGxvY2FsIHVzYWdlID09IDAgKi8KIAkJCWNzc19wdXQoJnZpY3RpbS0+Y3NzKTsKIAkJCWNvbnRpbnVlOwpAQCAtMTkzNCw5ICsyMDA3LDExIEBACiAJc3RydWN0IG1lbV9jZ3JvdXAgKmNhY2hlZDsgLyogdGhpcyBuZXZlciBiZSByb290IGNncm91cCAqLwogCXVuc2lnbmVkIGludCBucl9wYWdlczsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2RlZmluZSBGTFVTSElOR19DQUNIRURfQ0hBUkdFCSgwKQogfTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwLCBtZW1jZ19zdG9jayk7Ci1zdGF0aWMgYXRvbWljX3QgbWVtY2dfZHJhaW5fY291bnQ7CitzdGF0aWMgREVGSU5FX01VVEVYKHBlcmNwdV9jaGFyZ2VfbXV0ZXgpOwogCiAvKgogICogVHJ5IHRvIGNvbnN1bWUgc3RvY2tlZCBjaGFyZ2Ugb24gdGhpcyBjcHUuIElmIHN1Y2Nlc3MsIG9uZSBwYWdlIGlzIGNvbnN1bWVkCkBAIC0xOTg0LDYgKzIwNTksNyBAQAogewogCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrID0gJl9fZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOwogCWRyYWluX3N0b2NrKHN0b2NrKTsKKwljbGVhcl9iaXQoRkxVU0hJTkdfQ0FDSEVEX0NIQVJHRSwgJnN0b2NrLT5mbGFncyk7CiB9CiAKIC8qCkBAIC0yMDA4LDI2ICsyMDg0LDQ1IEBACiAgKiBleHBlY3RzIHNvbWUgY2hhcmdlcyB3aWxsIGJlIGJhY2sgdG8gcmVzX2NvdW50ZXIgbGF0ZXIgYnV0IGNhbm5vdCB3YWl0IGZvcgogICogaXQuCiAgKi8KLXN0YXRpYyB2b2lkIGRyYWluX2FsbF9zdG9ja19hc3luYyh2b2lkKQorc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSkKIHsKLQlpbnQgY3B1OwotCS8qIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHNjaGVkdWxpbmcgImRyYWluIiBpbiBhc3luY2hyb25vdXMgd2F5LgotCSAqIFRoZSByZXN1bHQgb2YgImRyYWluIiBpcyBub3QgZGlyZWN0bHkgaGFuZGxlZCBieSBjYWxsZXJzLiBUaGVuLAotCSAqIGlmIHNvbWVvbmUgaXMgY2FsbGluZyBkcmFpbiwgd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIGRyYWluIG1vcmUuCi0JICogQW55d2F5LCBXT1JLX1NUUlVDVF9QRU5ESU5HIGNoZWNrIGluIHF1ZXVlX3dvcmtfb24oKSB3aWxsIGNhdGNoIGlmCi0JICogdGhlcmUgaXMgYSByYWNlLiBXZSBqdXN0IGRvIGxvb3NlIGNoZWNrIGhlcmUuCisJaW50IGNwdSwgY3VyY3B1OworCS8qCisJICogSWYgc29tZW9uZSBjYWxscyBkcmFpbmluZywgYXZvaWQgYWRkaW5nIG1vcmUga3dvcmtlciBydW5zLgogCSAqLwotCWlmIChhdG9taWNfcmVhZCgmbWVtY2dfZHJhaW5fY291bnQpKQorCWlmICghbXV0ZXhfdHJ5bG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCkpCiAJCXJldHVybjsKIAkvKiBOb3RpZnkgb3RoZXIgY3B1cyB0aGF0IHN5c3RlbS13aWRlICJkcmFpbiIgaXMgcnVubmluZyAqLwotCWF0b21pY19pbmMoJm1lbWNnX2RyYWluX2NvdW50KTsKIAlnZXRfb25saW5lX2NwdXMoKTsKKwkvKgorCSAqIEdldCBhIGhpbnQgZm9yIGF2b2lkaW5nIGRyYWluaW5nIGNoYXJnZXMgb24gdGhlIGN1cnJlbnQgY3B1LAorCSAqIHdoaWNoIG11c3QgYmUgZXhoYXVzdGVkIGJ5IG91ciBjaGFyZ2luZy4gIEl0IGlzIG5vdCByZXF1aXJlZCB0aGF0CisJICogdGhpcyBiZSBhIHByZWNpc2UgY2hlY2ssIHNvIHdlIHVzZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIGluc3RlYWQgb2YKKwkgKiBnZXRjcHUoKS9wdXRjcHUoKS4KKwkgKi8KKwljdXJjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrID0gJnBlcl9jcHUobWVtY2dfc3RvY2ssIGNwdSk7Ci0JCXNjaGVkdWxlX3dvcmtfb24oY3B1LCAmc3RvY2stPndvcmspOworCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCisJCWlmIChjcHUgPT0gY3VyY3B1KQorCQkJY29udGludWU7CisKKwkJbWVtID0gc3RvY2stPmNhY2hlZDsKKwkJaWYgKCFtZW0pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbSAhPSByb290X21lbSkgeworCQkJaWYgKCFyb290X21lbS0+dXNlX2hpZXJhcmNoeSkKKwkJCQljb250aW51ZTsKKwkJCS8qIGNoZWNrIHdoZXRoZXIgIm1lbSIgaXMgdW5kZXIgdHJlZSBvZiAicm9vdF9tZW0iICovCisJCQlpZiAoIWNzc19pc19hbmNlc3RvcigmbWVtLT5jc3MsICZyb290X21lbS0+Y3NzKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxVU0hJTkdfQ0FDSEVEX0NIQVJHRSwgJnN0b2NrLT5mbGFncykpCisJCQlzY2hlZHVsZV93b3JrX29uKGNwdSwgJnN0b2NrLT53b3JrKTsKIAl9CiAgCXB1dF9vbmxpbmVfY3B1cygpOwotCWF0b21pY19kZWMoJm1lbWNnX2RyYWluX2NvdW50KTsKKwltdXRleF91bmxvY2soJnBlcmNwdV9jaGFyZ2VfbXV0ZXgpOwogCS8qIFdlIGRvbid0IHdhaXQgZm9yIGZsdXNoX3dvcmsgKi8KIH0KIApAQCAtMjAzNSw5ICsyMTMwLDkgQEAKIHN0YXRpYyB2b2lkIGRyYWluX2FsbF9zdG9ja19zeW5jKHZvaWQpCiB7CiAJLyogY2FsbGVkIHdoZW4gZm9yY2VfZW1wdHkgaXMgY2FsbGVkICovCi0JYXRvbWljX2luYygmbWVtY2dfZHJhaW5fY291bnQpOworCW11dGV4X2xvY2soJnBlcmNwdV9jaGFyZ2VfbXV0ZXgpOwogCXNjaGVkdWxlX29uX2VhY2hfY3B1KGRyYWluX2xvY2FsX3N0b2NrKTsKLQlhdG9taWNfZGVjKCZtZW1jZ19kcmFpbl9jb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZwZXJjcHVfY2hhcmdlX211dGV4KTsKIH0KIAogLyoKQEAgLTQ2NDAsNiArNDczNSw3IEBACiAJewogCQkubmFtZSA9ICJudW1hX3N0YXQiLAogCQkub3BlbiA9IG1lbV9jb250cm9sX251bWFfc3RhdF9vcGVuLAorCQkubW9kZSA9IFNfSVJVR08sCiAJfSwKICNlbmRpZgogfTsKQEAgLTU0MTQsMTggKzU1MTAsMTYgQEAKIAkJCQlzdHJ1Y3QgY2dyb3VwICpvbGRfY29udCwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbShwKTsKIAotCWlmICghbWMudG8pCi0JCS8qIG5vIG5lZWQgdG8gbW92ZSBjaGFyZ2UgKi8KLQkJcmV0dXJuOwotCi0JbW0gPSBnZXRfdGFza19tbShwKTsKIAlpZiAobW0pIHsKLQkJbWVtX2Nncm91cF9tb3ZlX2NoYXJnZShtbSk7CisJCWlmIChtYy50bykKKwkJCW1lbV9jZ3JvdXBfbW92ZV9jaGFyZ2UobW0pOworCQlwdXRfc3dhcF90b2tlbihtbSk7CiAJCW1tcHV0KG1tKTsKIAl9Ci0JbWVtX2Nncm91cF9jbGVhcl9tYygpOworCWlmIChtYy50bykKKwkJbWVtX2Nncm91cF9jbGVhcl9tYygpOwogfQogI2Vsc2UJLyogIUNPTkZJR19NTVUgKi8KIHN0YXRpYyBpbnQgbWVtX2Nncm91cF9jYW5fYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKZGlmZiAtLWdpdCBhL21tL21lbW9yeS1mYWlsdXJlLmMgYi9tbS9tZW1vcnktZmFpbHVyZS5jCmluZGV4IDVjOGY3ZTAuLjc0MGM0ZjUgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS1mYWlsdXJlLmMKKysrIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBpbnQgc3lzY3RsX21lbW9yeV9mYWlsdXJlX2Vhcmx5X2tpbGwgX19yZWFkX21vc3RseSA9IDA7CkBAIC0zOTAsMTAgKzM5MSwxMSBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBhbm9uX3ZtYSAqYXY7CiAKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWF2ID0gcGFnZV9sb2NrX2Fub25fdm1hKHBhZ2UpOwogCWlmIChhdiA9PSBOVUxMKQkvKiBOb3QgYWN0dWFsbHkgbWFwcGVkIGFueW1vcmUgKi8KLQkJZ290byBvdXQ7CisJCXJldHVybjsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJZm9yX2VhY2hfcHJvY2VzcyAodHNrKSB7CiAJCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqdm1hYzsKIApAQCAtNDA3LDkgKzQwOSw4IEBACiAJCQkJYWRkX3RvX2tpbGwodHNrLCBwYWdlLCB2bWEsIHRvX2tpbGwsIHRrYyk7CiAJCX0KIAl9Ci0JcGFnZV91bmxvY2tfYW5vbl92bWEoYXYpOwotb3V0OgogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlwYWdlX3VubG9ja19hbm9uX3ZtYShhdik7CiB9CiAKIC8qCkBAIC00MjMsMTcgKzQyNCw4IEBACiAJc3RydWN0IHByaW9fdHJlZV9pdGVyIGl0ZXI7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCi0JLyoKLQkgKiBBIG5vdGUgb24gdGhlIGxvY2tpbmcgb3JkZXIgYmV0d2VlbiB0aGUgdHdvIGxvY2tzLgotCSAqIFdlIGRvbid0IHJlbHkgb24gdGhpcyBwYXJ0aWN1bGFyIG9yZGVyLgotCSAqIElmIHlvdSBoYXZlIHNvbWUgb3RoZXIgY29kZSB0aGF0IG5lZWRzIGEgZGlmZmVyZW50IG9yZGVyCi0JICogZmVlbCBmcmVlIHRvIHN3aXRjaCB0aGVtIGFyb3VuZC4gT3IgYWRkIGEgcmV2ZXJzZSBsaW5rCi0JICogZnJvbSBtbV9zdHJ1Y3QgdG8gdGFza19zdHJ1Y3QsIHRoZW4gdGhpcyBjb3VsZCBiZSBhbGwKLQkgKiBkb25lIHdpdGhvdXQgdGFraW5nIHRhc2tsaXN0X2xvY2sgYW5kIGxvb3Bpbmcgb3ZlciBhbGwgdGFza3MuCi0JICovCi0KLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCW11dGV4X2xvY2soJm1hcHBpbmctPmlfbW1hcF9tdXRleCk7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlmb3JfZWFjaF9wcm9jZXNzKHRzaykgewogCQlwZ29mZl90IHBnb2ZmID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBQQUdFX1NISUZUKTsKIApAQCAtNDUzLDggKzQ0NSw4IEBACiAJCQkJYWRkX3RvX2tpbGwodHNrLCBwYWdlLCB2bWEsIHRvX2tpbGwsIHRrYyk7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZtYXBwaW5nLT5pX21tYXBfbXV0ZXgpOwogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwltdXRleF91bmxvY2soJm1hcHBpbmctPmlfbW1hcF9tdXRleCk7CiB9CiAKIC8qCkBAIC0xNDY4LDcgKzE0NjAsOCBAQAogCXB1dF9wYWdlKHBhZ2UpOwogCWlmICghcmV0KSB7CiAJCUxJU1RfSEVBRChwYWdlbGlzdCk7Ci0KKwkJaW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9JU09MQVRFRF9BTk9OICsKKwkJCQkJICAgIHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSk7CiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZwYWdlbGlzdCk7CiAJCXJldCA9IG1pZ3JhdGVfcGFnZXMoJnBhZ2VsaXN0LCBuZXdfcGFnZSwgTVBPTF9NRl9NT1ZFX0FMTCwKIAkJCQkJCQkJMCwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDY5NTNkMzkuLjliOGEwMWQgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0zMDUsNiArMzA1LDcgQEAKIAlpZiAoYmF0Y2gtPm5yID09IGJhdGNoLT5tYXgpIHsKIAkJaWYgKCF0bGJfbmV4dF9iYXRjaCh0bGIpKQogCQkJcmV0dXJuIDA7CisJCWJhdGNoID0gdGxiLT5hY3RpdmU7CiAJfQogCVZNX0JVR19PTihiYXRjaC0+bnIgPiBiYXRjaC0+bWF4KTsKIApAQCAtMTExMiwxMSArMTExMywxMyBAQAogCWludCBmb3JjZV9mbHVzaCA9IDA7CiAJaW50IHJzc1tOUl9NTV9DT1VOVEVSU107CiAJc3BpbmxvY2tfdCAqcHRsOworCXB0ZV90ICpzdGFydF9wdGU7CiAJcHRlX3QgKnB0ZTsKIAogYWdhaW46CiAJaW5pdF9yc3NfdmVjKHJzcyk7Ci0JcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKKwlzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsICZwdGwpOworCXB0ZSA9IHN0YXJ0X3B0ZTsKIAlhcmNoX2VudGVyX2xhenlfbW11X21vZGUoKTsKIAlkbyB7CiAJCXB0ZV90IHB0ZW50ID0gKnB0ZTsKQEAgLTExOTYsNyArMTE5OSw3IEBACiAKIAlhZGRfbW1fcnNzX3ZlYyhtbSwgcnNzKTsKIAlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKLQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSAtIDEsIHB0bCk7CisJcHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0bCk7CiAKIAkvKgogCSAqIG1tdV9nYXRoZXIgcmFuIG91dCBvZiByb29tIHRvIGJhdGNoIHBhZ2VzLCB3ZSBicmVhayBvdXQgb2YKQEAgLTEyOTYsNyArMTI5OSw3IEBACiAKIC8qKgogICogdW5tYXBfdm1hcyAtIHVubWFwIGEgcmFuZ2Ugb2YgbWVtb3J5IGNvdmVyZWQgYnkgYSBsaXN0IG9mIHZtYSdzCi0gKiBAdGxicDogYWRkcmVzcyBvZiB0aGUgY2FsbGVyJ3Mgc3RydWN0IG1tdV9nYXRoZXIKKyAqIEB0bGI6IGFkZHJlc3Mgb2YgdGhlIGNhbGxlcidzIHN0cnVjdCBtbXVfZ2F0aGVyCiAgKiBAdm1hOiB0aGUgc3RhcnRpbmcgdm1hCiAgKiBAc3RhcnRfYWRkcjogdmlydHVhbCBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0YXJ0IHVubWFwcGluZwogICogQGVuZF9hZGRyOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gZW5kIHVubWFwcGluZwpAQCAtMjc5NiwzMCArMjc5OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHVubWFwX21hcHBpbmdfcmFuZ2UpOwogCi1pbnQgdm10cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgZW5kKQotewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQotCS8qCi0JICogSWYgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBpcyBub3QgZ29pbmcgdG8gcHJvdmlkZQotCSAqIGEgd2F5IHRvIHRydW5jYXRlIGEgcmFuZ2Ugb2YgYmxvY2tzIChwdW5jaCBhIGhvbGUpIC0KLQkgKiB3ZSBzaG91bGQgcmV0dXJuIGZhaWx1cmUgcmlnaHQgbm93LgotCSAqLwotCWlmICghaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQotCQlyZXR1cm4gLUVOT1NZUzsKLQotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlkb3duX3dyaXRlKCZpbm9kZS0+aV9hbGxvY19zZW0pOwotCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCAoZW5kIC0gb2Zmc2V0KSwgMSk7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCBlbmQpOwotCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCAoZW5kIC0gb2Zmc2V0KSwgMSk7Ci0JaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKGlub2RlLCBvZmZzZXQsIGVuZCk7Ci0JdXBfd3JpdGUoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIFdlIGVudGVyIHdpdGggbm9uLWV4Y2x1c2l2ZSBtbWFwX3NlbSAodG8gZXhjbHVkZSB2bWEgY2hhbmdlcywKICAqIGJ1dCBhbGxvdyBjb25jdXJyZW50IGZhdWx0cyksIGFuZCBwdGUgbWFwcGVkIGJ1dCBub3QgeWV0IGxvY2tlZC4KZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDlmNjQ2MzcuLmM0Njg4N2IgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtNDk0LDYgKzQ5NCwxNCBAQAogCS8qIGluaXQgbm9kZSdzIHpvbmVzIGFzIGVtcHR5IHpvbmVzLCB3ZSBkb24ndCBoYXZlIGFueSBwcmVzZW50IHBhZ2VzLiovCiAJZnJlZV9hcmVhX2luaXRfbm9kZShuaWQsIHpvbmVzX3NpemUsIHN0YXJ0X3BmbiwgemhvbGVzX3NpemUpOwogCisJLyoKKwkgKiBUaGUgbm9kZSB3ZSBhbGxvY2F0ZWQgaGFzIG5vIHpvbmUgZmFsbGJhY2sgbGlzdHMuIEZvciBhdm9pZGluZworCSAqIHRvIGFjY2VzcyBub3QtaW5pdGlhbGl6ZWQgem9uZWxpc3QsIGJ1aWxkIGhlcmUuCisJICovCisJbXV0ZXhfbG9jaygmem9uZWxpc3RzX211dGV4KTsKKwlidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpOworCW11dGV4X3VubG9jaygmem9uZWxpc3RzX211dGV4KTsKKwogCXJldHVybiBwZ2RhdDsKIH0KIApAQCAtNTE1LDcgKzUyMyw3IEBACiAKIAlsb2NrX21lbW9yeV9ob3RwbHVnKCk7CiAJcGdkYXQgPSBob3RhZGRfbmV3X3BnZGF0KG5pZCwgMCk7Ci0JaWYgKHBnZGF0KSB7CisJaWYgKCFwZ2RhdCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggZTRhNWM5MS4uNjY2ZTRlNiAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtMjg4LDcgKzI4OCw3IEBACiAJICovCiAJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfUEFHRVMpOwogCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShuZXdwYWdlLCBOUl9GSUxFX1BBR0VTKTsKLQlpZiAoUGFnZVN3YXBCYWNrZWQocGFnZSkpIHsKKwlpZiAoIVBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgUGFnZVN3YXBCYWNrZWQocGFnZSkpIHsKIAkJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1NITUVNKTsKIAkJX19pbmNfem9uZV9wYWdlX3N0YXRlKG5ld3BhZ2UsIE5SX1NITUVNKTsKIAl9CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggYmJkYzlhZi4uZDQ5NzM2ZiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtOTA2LDE0ICs5MDYsNyBAQAogCWlmIChhbm9uX3ZtYSkKIAkJcmV0dXJuIGFub25fdm1hOwogdHJ5X3ByZXY6Ci0JLyoKLQkgKiBJdCBpcyBwb3RlbnRpYWxseSBzbG93IHRvIGhhdmUgdG8gY2FsbCBmaW5kX3ZtYV9wcmV2IGhlcmUuCi0JICogQnV0IGl0J3Mgb25seSBvbiB0aGUgZmlyc3Qgd3JpdGUgZmF1bHQgb24gdGhlIHZtYSwgbm90Ci0JICogZXZlcnkgdGltZSwgYW5kIHdlIGNvdWxkIGRldmlzZSBhIHdheSB0byBhdm9pZCBpdCBsYXRlcgotCSAqIChlLmcuIHN0YXNoIGluZm8gaW4gbmV4dCdzIGFub25fdm1hX25vZGUgd2hlbiBhc3NpZ25pbmcKLQkgKiBhbiBhbm9uX3ZtYSwgb3Igd2hlbiB0cnlpbmcgdm1hX21lcmdlKS4gIEFub3RoZXIgdGltZS4KLQkgKi8KLQlCVUdfT04oZmluZF92bWFfcHJldih2bWEtPnZtX21tLCB2bWEtPnZtX3N0YXJ0LCAmbmVhcikgIT0gdm1hKTsKKwluZWFyID0gdm1hLT52bV9wcmV2OwogCWlmICghbmVhcikKIAkJZ290byBub25lOwogCkBAIC0yMDQ0LDkgKzIwMzcsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBGaW5kIHRoZSBmaXJzdCBvdmVybGFwcGluZyBWTUEgKi8KLQl2bWEgPSBmaW5kX3ZtYV9wcmV2KG1tLCBzdGFydCwgJnByZXYpOworCXZtYSA9IGZpbmRfdm1hKG1tLCBzdGFydCk7CiAJaWYgKCF2bWEpCiAJCXJldHVybiAwOworCXByZXYgPSB2bWEtPnZtX3ByZXY7CiAJLyogd2UgaGF2ZSAgc3RhcnQgPCB2bWEtPnZtX2VuZCAgKi8KIAogCS8qIGlmIGl0IGRvZXNuJ3Qgb3ZlcmxhcCwgd2UgaGF2ZSBub3RoaW5nLi4gKi8KZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IDFmZDBjNTEuLjllZGM4OTcgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMTgxMywxMCArMTgxMywxMyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCi0JCXVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKK2ludCByZW1hcF9wZm5fcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKIHsKLQl2bWEtPnZtX3N0YXJ0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWlmIChhZGRyICE9IChwZm4gPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChyZW1hcF9wZm5fcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IGE0ZTFkYjMuLjRlODk4NWEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTIyNDcsMTAgKzIyNDcsNiBAQAogCiAJaWYgKHNob3VsZF9mYWlsX2FsbG9jX3BhZ2UoZ2ZwX21hc2ssIG9yZGVyKSkKIAkJcmV0dXJuIE5VTEw7Ci0jaWZuZGVmIENPTkZJR19aT05FX0RNQQotCWlmIChXQVJOX09OX09OQ0UoZ2ZwX21hc2sgJiBfX0dGUF9ETUEpKQotCQlyZXR1cm4gTlVMTDsKLSNlbmRpZgogCiAJLyoKIAkgKiBDaGVjayB0aGUgem9uZXMgc3VpdGFibGUgZm9yIHRoZSBnZnBfbWFzayBjb250YWluIGF0IGxlYXN0IG9uZQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9jZ3JvdXAuYyBiL21tL3BhZ2VfY2dyb3VwLmMKaW5kZXggNzRjY2ZmNi4uNTNiZmZjNiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9jZ3JvdXAuYworKysgYi9tbS9wYWdlX2Nncm91cC5jCkBAIC0xNjIsMTMgKzE2MiwxMyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19tZW1pbml0IGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cCh1bnNpZ25lZCBsb25nIHBmbikKK3N0YXRpYyBpbnQgX19tZW1pbml0IGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZCkKIHsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKmJhc2UsICpwYzsKIAlzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb247CiAJdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplOwogCXVuc2lnbmVkIGxvbmcgbnI7Ci0JaW50IG5pZCwgaW5kZXg7CisJaW50IGluZGV4OwogCiAJbnIgPSBwZm5fdG9fc2VjdGlvbl9ucihwZm4pOwogCXNlY3Rpb24gPSBfX25yX3RvX3NlY3Rpb24obnIpOwpAQCAtMTc2LDcgKzE3Niw2IEBACiAJaWYgKHNlY3Rpb24tPnBhZ2VfY2dyb3VwKQogCQlyZXR1cm4gMDsKIAotCW5pZCA9IHBhZ2VfdG9fbmlkKHBmbl90b19wYWdlKHBmbikpOwogCXRhYmxlX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhZ2VfY2dyb3VwKSAqIFBBR0VTX1BFUl9TRUNUSU9OOwogCWJhc2UgPSBhbGxvY19wYWdlX2Nncm91cCh0YWJsZV9zaXplLCBuaWQpOwogCkBAIC0xOTYsNyArMTk1LDExIEBACiAJCXBjID0gYmFzZSArIGluZGV4OwogCQlpbml0X3BhZ2VfY2dyb3VwKHBjLCBucik7CiAJfQotCisJLyoKKwkgKiBUaGUgcGFzc2VkICJwZm4iIG1heSBub3QgYmUgYWxpZ25lZCB0byBTRUNUSU9OLiAgRm9yIHRoZSBjYWxjdWxhdGlvbgorCSAqIHdlIG5lZWQgdG8gYXBwbHkgYSBtYXNrLgorCSAqLworCXBmbiAmPSBQQUdFX1NFQ1RJT05fTUFTSzsKIAlzZWN0aW9uLT5wYWdlX2Nncm91cCA9IGJhc2UgLSBwZm47CiAJdG90YWxfdXNhZ2UgKz0gdGFibGVfc2l6ZTsKIAlyZXR1cm4gMDsKQEAgLTIyNSwxMCArMjI4LDIwIEBACiAJc3RhcnQgPSBzdGFydF9wZm4gJiB+KFBBR0VTX1BFUl9TRUNUSU9OIC0gMSk7CiAJZW5kID0gQUxJR04oc3RhcnRfcGZuICsgbnJfcGFnZXMsIFBBR0VTX1BFUl9TRUNUSU9OKTsKIAorCWlmIChuaWQgPT0gLTEpIHsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlLCAibmlkIiBhbHJlYWR5IGV4aXN0cyBhbmQgY29udGFpbnMgdmFsaWQgbWVtb3J5LgorCQkgKiAic3RhcnRfcGZuIiBwYXNzZWQgdG8gdXMgaXMgYSBwZm4gd2hpY2ggaXMgYW4gYXJnIGZvcgorCQkgKiBvbmxpbmVfX3BhZ2VzKCksIGFuZCBzdGFydF9wZm4gc2hvdWxkIGV4aXN0LgorCQkgKi8KKwkJbmlkID0gcGZuX3RvX25pZChzdGFydF9wZm4pOworCQlWTV9CVUdfT04oIW5vZGVfc3RhdGUobmlkLCBOX09OTElORSkpOworCX0KKwogCWZvciAocGZuID0gc3RhcnQ7ICFmYWlsICYmIHBmbiA8IGVuZDsgcGZuICs9IFBBR0VTX1BFUl9TRUNUSU9OKSB7CiAJCWlmICghcGZuX3ByZXNlbnQocGZuKSkKIAkJCWNvbnRpbnVlOwotCQlmYWlsID0gaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHBmbik7CisJCWZhaWwgPSBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAocGZuLCBuaWQpOwogCX0KIAlpZiAoIWZhaWwpCiAJCXJldHVybiAwOwpAQCAtMjg0LDI1ICsyOTcsNDcgQEAKIHZvaWQgX19pbml0IHBhZ2VfY2dyb3VwX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBmbjsKLQlpbnQgZmFpbCA9IDA7CisJaW50IG5pZDsKIAogCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCiAJCXJldHVybjsKIAotCWZvciAocGZuID0gMDsgIWZhaWwgJiYgcGZuIDwgbWF4X3BmbjsgcGZuICs9IFBBR0VTX1BFUl9TRUNUSU9OKSB7Ci0JCWlmICghcGZuX3ByZXNlbnQocGZuKSkKLQkJCWNvbnRpbnVlOwotCQlmYWlsID0gaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHBmbik7CisJZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fSElHSF9NRU1PUlkpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisKKwkJc3RhcnRfcGZuID0gbm9kZV9zdGFydF9wZm4obmlkKTsKKwkJZW5kX3BmbiA9IG5vZGVfZW5kX3BmbihuaWQpOworCQkvKgorCQkgKiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gbWF5IG5vdCBiZSBhbGlnbmVkIHRvIFNFQ1RJT04gYW5kIHRoZQorCQkgKiBwYWdlLT5mbGFncyBvZiBvdXQgb2Ygbm9kZSBwYWdlcyBhcmUgbm90IGluaXRpYWxpemVkLiAgU28gd2UKKwkJICogc2NhbiBbc3RhcnRfcGZuLCB0aGUgYmlnZ2VzdCBzZWN0aW9uJ3MgcGZuIDwgZW5kX3BmbikgaGVyZS4KKwkJICovCisJCWZvciAocGZuID0gc3RhcnRfcGZuOworCQkgICAgIHBmbiA8IGVuZF9wZm47CisgICAgICAgICAgICAgICAgICAgICBwZm4gPSBBTElHTihwZm4gKyAxLCBQQUdFU19QRVJfU0VDVElPTikpIHsKKworCQkJaWYgKCFwZm5fdmFsaWQocGZuKSkKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBOb2RlcydzIHBmbnMgY2FuIGJlIG92ZXJsYXBwaW5nLgorCQkJICogV2Uga25vdyBzb21lIGFyY2ggY2FuIGhhdmUgYSBub2RlcyBsYXlvdXQgc3VjaCBhcworCQkJICogLS0tLS0tLS0tLS0tLXBmbi0tLS0tLS0tLS0tLS0tPgorCQkJICogTjAgfCBOMSB8IE4yIHwgTjAgfCBOMSB8IE4yfC4uLi4KKwkJCSAqLworCQkJaWYgKHBmbl90b19uaWQocGZuKSAhPSBuaWQpCisJCQkJY29udGludWU7CisJCQlpZiAoaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHBmbiwgbmlkKSkKKwkJCQlnb3RvIG9vbTsKKwkJfQogCX0KLQlpZiAoZmFpbCkgewotCQlwcmludGsoS0VSTl9DUklUICJ0cnkgJ2Nncm91cF9kaXNhYmxlPW1lbW9yeScgYm9vdCBvcHRpb25cbiIpOwotCQlwYW5pYygiT3V0IG9mIG1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCWhvdHBsdWdfbWVtb3J5X25vdGlmaWVyKHBhZ2VfY2dyb3VwX2NhbGxiYWNrLCAwKTsKLQl9CisJaG90cGx1Z19tZW1vcnlfbm90aWZpZXIocGFnZV9jZ3JvdXBfY2FsbGJhY2ssIDApOwogCXByaW50ayhLRVJOX0lORk8gImFsbG9jYXRlZCAlbGQgYnl0ZXMgb2YgcGFnZV9jZ3JvdXBcbiIsIHRvdGFsX3VzYWdlKTsKLQlwcmludGsoS0VSTl9JTkZPICJwbGVhc2UgdHJ5ICdjZ3JvdXBfZGlzYWJsZT1tZW1vcnknIG9wdGlvbiBpZiB5b3UgZG9uJ3QiCi0JIiB3YW50IG1lbW9yeSBjZ3JvdXBzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJwbGVhc2UgdHJ5ICdjZ3JvdXBfZGlzYWJsZT1tZW1vcnknIG9wdGlvbiBpZiB5b3UgIgorCQkJICJkb24ndCB3YW50IG1lbW9yeSBjZ3JvdXBzXG4iKTsKKwlyZXR1cm47Citvb206CisJcHJpbnRrKEtFUk5fQ1JJVCAidHJ5ICdjZ3JvdXBfZGlzYWJsZT1tZW1vcnknIGJvb3Qgb3B0aW9uXG4iKTsKKwlwYW5pYygiT3V0IG9mIG1lbW9yeSIpOwogfQogCiB2b2lkIF9fbWVtaW5pdCBwZ2RhdF9wYWdlX2Nncm91cF9pbml0KHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMGViNDYzZS4uMjMyOTVmNjUgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTM4LDkgKzM4LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXJjaC1kZXBlbmRlbnQgZmx1c2hfZGNhY2hlX21tYXBfbG9jaywKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGlub2RlX3diX2xpc3RfbG9jayBpbiBfX3N5bmNfc2luZ2xlX2lub2RlKQogICoKLSAqIChjb2RlIGRvZXNuJ3QgcmVseSBvbiB0aGF0IG9yZGVyIHNvIGl0IGNvdWxkIGJlIHN3aXRjaGVkIGFyb3VuZCkKLSAqIC0+dGFza2xpc3RfbG9jawotICogICBhbm9uX3ZtYS0+bXV0ZXggICAgICAobWVtb3J5X2ZhaWx1cmUsIGNvbGxlY3RfcHJvY3NfYW5vbikKKyAqIGFub25fdm1hLT5tdXRleCxtYXBwaW5nLT5pX211dGV4ICAgICAgKG1lbW9yeV9mYWlsdXJlLCBjb2xsZWN0X3Byb2NzX2Fub24pCisgKiAgIC0+dGFza2xpc3RfbG9jawogICogICAgIHB0ZSBtYXAgbG9jawogICovCiAKQEAgLTExMiw5ICsxMTEsOSBAQAogCWttZW1fY2FjaGVfZnJlZShhbm9uX3ZtYV9jYWNoZXAsIGFub25fdm1hKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmFub25fdm1hX2NoYWluX2FsbG9jKHZvaWQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYW5vbl92bWFfY2hhaW5fYWxsb2MoZ2ZwX3QgZ2ZwKQogewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGFub25fdm1hX2NoYWluX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoYW5vbl92bWFfY2hhaW5fY2FjaGVwLCBnZnApOwogfQogCiBzdGF0aWMgdm9pZCBhbm9uX3ZtYV9jaGFpbl9mcmVlKHN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYW5vbl92bWFfY2hhaW4pCkBAIC0xNTksNyArMTU4LDcgQEAKIAkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCQlzdHJ1Y3QgYW5vbl92bWEgKmFsbG9jYXRlZDsKIAotCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYygpOworCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfS0VSTkVMKTsKIAkJaWYgKCFhdmMpCiAJCQlnb3RvIG91dF9lbm9tZW07CiAKQEAgLTIwMCw2ICsxOTksMzIgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAorLyoKKyAqIFRoaXMgaXMgYSB1c2VmdWwgaGVscGVyIGZ1bmN0aW9uIGZvciBsb2NraW5nIHRoZSBhbm9uX3ZtYSByb290IGFzCisgKiB3ZSB0cmF2ZXJzZSB0aGUgdm1hLT5hbm9uX3ZtYV9jaGFpbiwgbG9vcGluZyBvdmVyIGFub25fdm1hJ3MgdGhhdAorICogaGF2ZSB0aGUgc2FtZSB2bWEuCisgKgorICogU3VjaCBhbm9uX3ZtYSdzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHlvdSdkIGV4cGVjdCB0byBzZWUKKyAqIGp1c3QgYSBzaW5nbGUgbXV0ZXhfbG9jayBmb3IgdGhlIHdob2xlIHRyYXZlcnNhbC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYW5vbl92bWEgKmxvY2tfYW5vbl92bWFfcm9vdChzdHJ1Y3QgYW5vbl92bWEgKnJvb3QsIHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCit7CisJc3RydWN0IGFub25fdm1hICpuZXdfcm9vdCA9IGFub25fdm1hLT5yb290OworCWlmIChuZXdfcm9vdCAhPSByb290KSB7CisJCWlmIChXQVJOX09OX09OQ0Uocm9vdCkpCisJCQltdXRleF91bmxvY2soJnJvb3QtPm11dGV4KTsKKwkJcm9vdCA9IG5ld19yb290OworCQltdXRleF9sb2NrKCZyb290LT5tdXRleCk7CisJfQorCXJldHVybiByb290OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX2Fub25fdm1hX3Jvb3Qoc3RydWN0IGFub25fdm1hICpyb290KQoreworCWlmIChyb290KQorCQltdXRleF91bmxvY2soJnJvb3QtPm11dGV4KTsKK30KKwogc3RhdGljIHZvaWQgYW5vbl92bWFfY2hhaW5fbGluayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQlzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmF2YywKIAkJCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQpAQCAtMjA4LDEzICsyMzMsMTEgQEAKIAlhdmMtPmFub25fdm1hID0gYW5vbl92bWE7CiAJbGlzdF9hZGQoJmF2Yy0+c2FtZV92bWEsICZ2bWEtPmFub25fdm1hX2NoYWluKTsKIAotCWFub25fdm1hX2xvY2soYW5vbl92bWEpOwogCS8qCiAJICogSXQncyBjcml0aWNhbCB0byBhZGQgbmV3IHZtYXMgdG8gdGhlIHRhaWwgb2YgdGhlIGFub25fdm1hLAogCSAqIHNlZSBjb21tZW50IGluIGh1Z2VfbWVtb3J5LmM6X19zcGxpdF9odWdlX3BhZ2UoKS4KIAkgKi8KIAlsaXN0X2FkZF90YWlsKCZhdmMtPnNhbWVfYW5vbl92bWEsICZhbm9uX3ZtYS0+aGVhZCk7Ci0JYW5vbl92bWFfdW5sb2NrKGFub25fdm1hKTsKIH0KIAogLyoKQEAgLTIyNCwxMyArMjQ3LDI0IEBACiBpbnQgYW5vbl92bWFfY2xvbmUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjKQogewogCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYXZjLCAqcGF2YzsKKwlzdHJ1Y3QgYW5vbl92bWEgKnJvb3QgPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBhdmMsICZzcmMtPmFub25fdm1hX2NoYWluLCBzYW1lX3ZtYSkgewotCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYygpOwotCQlpZiAoIWF2YykKLQkJCWdvdG8gZW5vbWVtX2ZhaWx1cmU7Ci0JCWFub25fdm1hX2NoYWluX2xpbmsoZHN0LCBhdmMsIHBhdmMtPmFub25fdm1hKTsKKwkJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKKworCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOKTsKKwkJaWYgKHVubGlrZWx5KCFhdmMpKSB7CisJCQl1bmxvY2tfYW5vbl92bWFfcm9vdChyb290KTsKKwkJCXJvb3QgPSBOVUxMOworCQkJYXZjID0gYW5vbl92bWFfY2hhaW5fYWxsb2MoR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWF2YykKKwkJCQlnb3RvIGVub21lbV9mYWlsdXJlOworCQl9CisJCWFub25fdm1hID0gcGF2Yy0+YW5vbl92bWE7CisJCXJvb3QgPSBsb2NrX2Fub25fdm1hX3Jvb3Qocm9vdCwgYW5vbl92bWEpOworCQlhbm9uX3ZtYV9jaGFpbl9saW5rKGRzdCwgYXZjLCBhbm9uX3ZtYSk7CiAJfQorCXVubG9ja19hbm9uX3ZtYV9yb290KHJvb3QpOwogCXJldHVybiAwOwogCiAgZW5vbWVtX2ZhaWx1cmU6CkBAIC0yNjMsNyArMjk3LDcgQEAKIAlhbm9uX3ZtYSA9IGFub25fdm1hX2FsbG9jKCk7CiAJaWYgKCFhbm9uX3ZtYSkKIAkJZ290byBvdXRfZXJyb3I7Ci0JYXZjID0gYW5vbl92bWFfY2hhaW5fYWxsb2MoKTsKKwlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfS0VSTkVMKTsKIAlpZiAoIWF2YykKIAkJZ290byBvdXRfZXJyb3JfZnJlZV9hbm9uX3ZtYTsKIApAQCAtMjgwLDcgKzMxNCw5IEBACiAJZ2V0X2Fub25fdm1hKGFub25fdm1hLT5yb290KTsKIAkvKiBNYXJrIHRoaXMgYW5vbl92bWEgYXMgdGhlIG9uZSB3aGVyZSBvdXIgbmV3IChDT1dlZCkgcGFnZXMgZ28uICovCiAJdm1hLT5hbm9uX3ZtYSA9IGFub25fdm1hOworCWFub25fdm1hX2xvY2soYW5vbl92bWEpOwogCWFub25fdm1hX2NoYWluX2xpbmsodm1hLCBhdmMsIGFub25fdm1hKTsKKwlhbm9uX3ZtYV91bmxvY2soYW5vbl92bWEpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI5MSwzNiArMzI3LDQzIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyB2b2lkIGFub25fdm1hX3VubGluayhzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmFub25fdm1hX2NoYWluKQotewotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBhbm9uX3ZtYV9jaGFpbi0+YW5vbl92bWE7Ci0JaW50IGVtcHR5OwotCi0JLyogSWYgYW5vbl92bWFfZm9yayBmYWlscywgd2UgY2FuIGdldCBhbiBlbXB0eSBhbm9uX3ZtYV9jaGFpbi4gKi8KLQlpZiAoIWFub25fdm1hKQotCQlyZXR1cm47Ci0KLQlhbm9uX3ZtYV9sb2NrKGFub25fdm1hKTsKLQlsaXN0X2RlbCgmYW5vbl92bWFfY2hhaW4tPnNhbWVfYW5vbl92bWEpOwotCi0JLyogV2UgbXVzdCBnYXJiYWdlIGNvbGxlY3QgdGhlIGFub25fdm1hIGlmIGl0J3MgZW1wdHkgKi8KLQllbXB0eSA9IGxpc3RfZW1wdHkoJmFub25fdm1hLT5oZWFkKTsKLQlhbm9uX3ZtYV91bmxvY2soYW5vbl92bWEpOwotCi0JaWYgKGVtcHR5KQotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotfQotCiB2b2lkIHVubGlua19hbm9uX3ZtYXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGFub25fdm1hX2NoYWluICphdmMsICpuZXh0OworCXN0cnVjdCBhbm9uX3ZtYSAqcm9vdCA9IE5VTEw7CiAKIAkvKgogCSAqIFVubGluayBlYWNoIGFub25fdm1hIGNoYWluZWQgdG8gdGhlIFZNQS4gIFRoaXMgbGlzdCBpcyBvcmRlcmVkCiAJICogZnJvbSBuZXdlc3QgdG8gb2xkZXN0LCBlbnN1cmluZyB0aGUgcm9vdCBhbm9uX3ZtYSBnZXRzIGZyZWVkIGxhc3QuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGF2YywgbmV4dCwgJnZtYS0+YW5vbl92bWFfY2hhaW4sIHNhbWVfdm1hKSB7Ci0JCWFub25fdm1hX3VubGluayhhdmMpOworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gYXZjLT5hbm9uX3ZtYTsKKworCQlyb290ID0gbG9ja19hbm9uX3ZtYV9yb290KHJvb3QsIGFub25fdm1hKTsKKwkJbGlzdF9kZWwoJmF2Yy0+c2FtZV9hbm9uX3ZtYSk7CisKKwkJLyoKKwkJICogTGVhdmUgZW1wdHkgYW5vbl92bWFzIG9uIHRoZSBsaXN0IC0gd2UnbGwgbmVlZAorCQkgKiB0byBmcmVlIHRoZW0gb3V0c2lkZSB0aGUgbG9jay4KKwkJICovCisJCWlmIChsaXN0X2VtcHR5KCZhbm9uX3ZtYS0+aGVhZCkpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbCgmYXZjLT5zYW1lX3ZtYSk7CisJCWFub25fdm1hX2NoYWluX2ZyZWUoYXZjKTsKKwl9CisJdW5sb2NrX2Fub25fdm1hX3Jvb3Qocm9vdCk7CisKKwkvKgorCSAqIEl0ZXJhdGUgdGhlIGxpc3Qgb25jZSBtb3JlLCBpdCBub3cgb25seSBjb250YWlucyBlbXB0eSBhbmQgdW5saW5rZWQKKwkgKiBhbm9uX3ZtYXMsIGRlc3Ryb3kgdGhlbS4gQ291bGQgbm90IGRvIGJlZm9yZSBkdWUgdG8gX19wdXRfYW5vbl92bWEoKQorCSAqIG5lZWRpbmcgdG8gYWNxdWlyZSB0aGUgYW5vbl92bWEtPnJvb3QtPm11dGV4LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdmMsIG5leHQsICZ2bWEtPmFub25fdm1hX2NoYWluLCBzYW1lX3ZtYSkgeworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gYXZjLT5hbm9uX3ZtYTsKKworCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOworCiAJCWxpc3RfZGVsKCZhdmMtPnNhbWVfdm1hKTsKIAkJYW5vbl92bWFfY2hhaW5fZnJlZShhdmMpOwogCX0KZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGQyMjFhMWMuLmZjZWRmNTQgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJfSB3aGlsZSAobmV4dCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKK3ZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQogewogCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7CiAJdW5zaWduZWQgbG9uZyBpZHg7CkBAIC01NjIsNiArNTYyLDggQEAKIAlzcGlubG9ja190ICpwdW5jaF9sb2NrOwogCXVuc2lnbmVkIGxvbmcgdXBwZXJfbGltaXQ7CiAKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwogCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJaWR4ID0gKHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlpZiAoaWR4ID49IGluZm8tPm5leHRfaW5kZXgpCkBAIC03MzgsMTYgKzc0MCw4IEBACiAJCSAqIGxvd2VyZWQgbmV4dF9pbmRleC4gIEFsc28sIHRob3VnaCBzaG1lbV9nZXRwYWdlIGNoZWNrcwogCQkgKiBpX3NpemUgYmVmb3JlIGFkZGluZyB0byBjYWNoZSwgbm8gcmVjaGVjayBhZnRlcjogc28gZml4IHRoZQogCQkgKiBuYXJyb3cgd2luZG93IHRoZXJlIHRvby4KLQkJICoKLQkJICogUmVjYWxsaW5nIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlIGFuZCB1bm1hcF9tYXBwaW5nX3JhbmdlCi0JCSAqIGV2ZXJ5IHRpbWUgZm9yIHB1bmNoX2hvbGUgKHdoaWNoIG5ldmVyIGdvdCBhIGNoYW5jZSB0byBjbGVhcgotCQkgKiBTSE1FTV9QQUdFSU4gYXQgdGhlIHN0YXJ0IG9mIHZtdHJ1bmNhdGVfcmFuZ2UpIGlzIGV4cGVuc2l2ZSwKLQkJICogeWV0IGhhcmRseSBldmVyIG5lY2Vzc2FyeTogdHJ5IHRvIG9wdGltaXplIHRoZW0gb3V0IGxhdGVyLgogCQkgKi8KIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7Ci0JCWlmIChwdW5jaF9ob2xlKQotCQkJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwKLQkJCQkJCQllbmQgLSBzdGFydCwgMSk7CiAJfQogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKQEAgLTc2NiwyMiArNzYwLDIzIEBACiAJCXNobWVtX2ZyZWVfcGFnZXMocGFnZXNfdG9fZnJlZS5uZXh0KTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzaG1lbV90cnVuY2F0ZV9yYW5nZSk7CiAKLXN0YXRpYyBpbnQgc2htZW1fbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3N0YXRpYyBpbnQgc2htZW1fc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCWxvZmZfdCBuZXdzaXplID0gYXR0ci0+aWFfc2l6ZTsKIAlpbnQgZXJyb3I7CiAKIAllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCi0JCQkJCSYmIG5ld3NpemUgIT0gaW5vZGUtPmlfc2l6ZSkgeworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkpIHsKKwkJbG9mZl90IG9sZHNpemUgPSBpbm9kZS0+aV9zaXplOworCQlsb2ZmX3QgbmV3c2l6ZSA9IGF0dHItPmlhX3NpemU7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAotCQlpZiAobmV3c2l6ZSA8IGlub2RlLT5pX3NpemUpIHsKKwkJaWYgKG5ld3NpemUgPCBvbGRzaXplKSB7CiAJCQkvKgogCQkJICogSWYgdHJ1bmNhdGluZyBkb3duIHRvIGEgcGFydGlhbCBwYWdlLCB0aGVuCiAJCQkgKiBpZiB0aGF0IHBhZ2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGhvbGQgaXQKQEAgLTgxMCwxMiArODA1LDE5IEBACiAJCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCQkJfQogCQl9Ci0KLQkJLyogWFhYKHRydW5jYXRlKTogdHJ1bmNhdGVfc2V0c2l6ZSBzaG91bGQgYmUgY2FsbGVkIGxhc3QgKi8KLQkJdHJ1bmNhdGVfc2V0c2l6ZShpbm9kZSwgbmV3c2l6ZSk7CisJCWlmIChuZXdzaXplICE9IG9sZHNpemUpIHsKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgbmV3c2l6ZSk7CisJCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCQl9CisJCWlmIChuZXdzaXplIDwgb2xkc2l6ZSkgeworCQkJbG9mZl90IGhvbGViZWdpbiA9IHJvdW5kX3VwKG5ld3NpemUsIFBBR0VfU0laRSk7CisJCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIGhvbGViZWdpbiwgMCwgMSk7CisJCQlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgbmV3c2l6ZSwgKGxvZmZfdCktMSk7CisJCQkvKiB1bm1hcCBhZ2FpbiB0byByZW1vdmUgcmFjaWx5IENPV2VkIHByaXZhdGUgcGFnZXMgKi8KKwkJCXVubWFwX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgaG9sZWJlZ2luLCAwLCAxKTsKKwkJfQogCQlpZiAocGFnZSkKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJc2htZW1fdHJ1bmNhdGVfcmFuZ2UoaW5vZGUsIG5ld3NpemUsIChsb2ZmX3QpLTEpOwogCX0KIAogCXNldGF0dHJfY29weShpbm9kZSwgYXR0cik7CkBAIC04MzIsNyArODM0LDYgQEAKIAlzdHJ1Y3Qgc2htZW1feGF0dHIgKnhhdHRyLCAqbnhhdHRyOwogCiAJaWYgKGlub2RlLT5pX21hcHBpbmctPmFfb3BzID09ICZzaG1lbV9hb3BzKSB7Ci0JCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwogCQlzaG1lbV91bmFjY3Rfc2l6ZShpbmZvLT5mbGFncywgaW5vZGUtPmlfc2l6ZSk7CiAJCWlub2RlLT5pX3NpemUgPSAwOwogCQlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgMCwgKGxvZmZfdCktMSk7CkBAIC0yNzA2LDcgKzI3MDcsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAorCS5zZXRhdHRyCT0gc2htZW1fc2V0YXR0ciwKIAkudHJ1bmNhdGVfcmFuZ2UJPSBzaG1lbV90cnVuY2F0ZV9yYW5nZSwKICNpZmRlZiBDT05GSUdfVE1QRlNfWEFUVFIKIAkuc2V0eGF0dHIJPSBzaG1lbV9zZXR4YXR0ciwKQEAgLTI3MzksNyArMjc0MCw3IEBACiAJLnJlbW92ZXhhdHRyCT0gc2htZW1fcmVtb3ZleGF0dHIsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMCi0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAorCS5zZXRhdHRyCT0gc2htZW1fc2V0YXR0ciwKIAkuY2hlY2tfYWNsCT0gZ2VuZXJpY19jaGVja19hY2wsCiAjZW5kaWYKIH07CkBAIC0yNzUyLDcgKzI3NTMsNyBAQAogCS5yZW1vdmV4YXR0cgk9IHNobWVtX3JlbW92ZXhhdHRyLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RNUEZTX1BPU0lYX0FDTAotCS5zZXRhdHRyCT0gc2htZW1fbm90aWZ5X2NoYW5nZSwKKwkuc2V0YXR0cgk9IHNobWVtX3NldGF0dHIsCiAJLmNoZWNrX2FjbAk9IGdlbmVyaWNfY2hlY2tfYWNsLAogI2VuZGlmCiB9OwpAQCAtMjkwOCw2ICsyOTA5LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQoreworCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2htZW1fdHJ1bmNhdGVfcmFuZ2UpOworCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKIC8qKgogICogbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0IC0gZmluZCBhIHBhZ2Ugb3IgZW50cnkgYXNzaWduZWQgdG8gdGhlIHNobWVtIGZpbGUKQEAgLTMwMjgsMyArMzAzNSwyNiBAQAogCXZtYS0+dm1fZmxhZ3MgfD0gVk1fQ0FOX05PTkxJTkVBUjsKIAlyZXR1cm4gMDsKIH0KKworLyoqCisgKiBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAgLSByZWFkIGludG8gcGFnZSBjYWNoZSwgdXNpbmcgc3BlY2lmaWVkIHBhZ2UgYWxsb2NhdGlvbiBmbGFncy4KKyAqIEBtYXBwaW5nOgl0aGUgcGFnZSdzIGFkZHJlc3Nfc3BhY2UKKyAqIEBpbmRleDoJdGhlIHBhZ2UgaW5kZXgKKyAqIEBnZnA6CXRoZSBwYWdlIGFsbG9jYXRvciBmbGFncyB0byB1c2UgaWYgYWxsb2NhdGluZworICoKKyAqIFRoaXMgYmVoYXZlcyBhcyBhIHRtcGZzICJyZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGluZGV4LCBnZnApIiwKKyAqIHdpdGggYW55IG5ldyBwYWdlIGFsbG9jYXRpb25zIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBhbGxvY2F0aW9uIGZsYWdzLgorICogQnV0IHJlYWRfY2FjaGVfcGFnZV9nZnAoKSB1c2VzIHRoZSAtPnJlYWRwYWdlKCkgbWV0aG9kOiB3aGljaCBkb2VzIG5vdAorICogc3VpdCB0bXBmcywgc2luY2UgaXQgbWF5IGhhdmUgcGFnZXMgaW4gc3dhcGNhY2hlLCBhbmQgbmVlZHMgdG8gZmluZCB0aG9zZQorICogZm9yIGl0c2VsZjsgYWx0aG91Z2ggZHJpdmVycy9ncHUvZHJtIGk5MTUgYW5kIHR0bSByZWx5IHVwb24gdGhpcyBzdXBwb3J0LgorICoKKyAqIFByb3ZpZGUgYSBzdHViIGZvciB0aG9zZSBjYWxsZXJzIHRvIHN0YXJ0IHVzaW5nIG5vdywgdGhlbiBsYXRlcgorICogZmxlc2ggaXQgb3V0IHRvIGNhbGwgc2htZW1fZ2V0cGFnZSgpIHdpdGggYWRkaXRpb25hbCBnZnAgbWFzaywgd2hlbgorICogc2htZW1fZmlsZV9zcGxpY2VfcmVhZCgpIGlzIGFkZGVkIGFuZCBzaG1lbV9yZWFkcGFnZSgpIGlzIHJlbW92ZWQuCisgKi8KK3N0cnVjdCBwYWdlICpzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCSBwZ29mZl90IGluZGV4LCBnZnBfdCBnZnApCit7CisJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaW5kZXgsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnApOwpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGJjZmE0OTguLjFlNTIzZWQgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTU3NCw3ICs1NzQsOSBAQAogICAgIHsgezAsIEJPT1RfQ1BVQ0FDSEVfRU5UUklFUywgMSwgMH0gfTsKIAogLyogaW50ZXJuYWwgY2FjaGUgb2YgY2FjaGUgZGVzY3JpcHRpb24gb2JqcyAqLworc3RhdGljIHN0cnVjdCBrbWVtX2xpc3QzICpjYWNoZV9jYWNoZV9ub2RlbGlzdHNbTUFYX05VTU5PREVTXTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSBjYWNoZV9jYWNoZSA9IHsKKwkubm9kZWxpc3RzID0gY2FjaGVfY2FjaGVfbm9kZWxpc3RzLAogCS5iYXRjaGNvdW50ID0gMSwKIAkubGltaXQgPSBCT09UX0NQVUNBQ0hFX0VOVFJJRVMsCiAJLnNoYXJlZCA9IDEsCkBAIC0xNDkyLDExICsxNDk0LDEwIEBACiAJY2FjaGVfY2FjaGUubm9kZWxpc3RzW25vZGVdID0gJmluaXRrbWVtX2xpc3QzW0NBQ0hFX0NBQ0hFICsgbm9kZV07CiAKIAkvKgotCSAqIHN0cnVjdCBrbWVtX2NhY2hlIHNpemUgZGVwZW5kcyBvbiBucl9ub2RlX2lkcywgd2hpY2gKLQkgKiBjYW4gYmUgbGVzcyB0aGFuIE1BWF9OVU1OT0RFUy4KKwkgKiBzdHJ1Y3Qga21lbV9jYWNoZSBzaXplIGRlcGVuZHMgb24gbnJfbm9kZV9pZHMgJiBucl9jcHVfaWRzCiAJICovCi0JY2FjaGVfY2FjaGUuYnVmZmVyX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3Qga21lbV9jYWNoZSwgbm9kZWxpc3RzKSArCi0JCQkJIG5yX25vZGVfaWRzICogc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzICopOworCWNhY2hlX2NhY2hlLmJ1ZmZlcl9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IGttZW1fY2FjaGUsIGFycmF5W25yX2NwdV9pZHNdKSArCisJCQkJICBucl9ub2RlX2lkcyAqIHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MyAqKTsKICNpZiBERUJVRwogCWNhY2hlX2NhY2hlLm9ial9zaXplID0gY2FjaGVfY2FjaGUuYnVmZmVyX3NpemU7CiAjZW5kaWYKQEAgLTIzMDgsNiArMjMwOSw3IEBACiAJaWYgKCFjYWNoZXApCiAJCWdvdG8gb29wczsKIAorCWNhY2hlcC0+bm9kZWxpc3RzID0gKHN0cnVjdCBrbWVtX2xpc3QzICoqKSZjYWNoZXAtPmFycmF5W25yX2NwdV9pZHNdOwogI2lmIERFQlVHCiAJY2FjaGVwLT5vYmpfc2l6ZSA9IHNpemU7CiAKQEAgLTMxNTMsMTIgKzMxNTUsMTEgQEAKIAlvYmpwICs9IG9ial9vZmZzZXQoY2FjaGVwKTsKIAlpZiAoY2FjaGVwLT5jdG9yICYmIGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikKIAkJY2FjaGVwLT5jdG9yKG9ianApOwotI2lmIEFSQ0hfU0xBQl9NSU5BTElHTgotCWlmICgodTMyKW9ianAgJiAoQVJDSF9TTEFCX01JTkFMSUdOLTEpKSB7CisJaWYgKEFSQ0hfU0xBQl9NSU5BTElHTiAmJgorCSAgICAoKHVuc2lnbmVkIGxvbmcpb2JqcCAmIChBUkNIX1NMQUJfTUlOQUxJR04tMSkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiMHglcDogbm90IGFsaWduZWQgdG8gQVJDSF9TTEFCX01JTkFMSUdOPSVkXG4iLAotCQkgICAgICAgb2JqcCwgQVJDSF9TTEFCX01JTkFMSUdOKTsKKwkJICAgICAgIG9ianAsIChpbnQpQVJDSF9TTEFCX01JTkFMSUdOKTsKIAl9Ci0jZW5kaWYKIAlyZXR1cm4gb2JqcDsKIH0KICNlbHNlCkBAIC0zNjA0LDEzICszNjA1LDE0IEBACiAgKiBSZWxlYXNlIGFuIG9iaiBiYWNrIHRvIGl0cyBjYWNoZS4gSWYgdGhlIG9iaiBoYXMgYSBjb25zdHJ1Y3RlZCBzdGF0ZSwgaXQgbXVzdAogICogYmUgaW4gdGhpcyBzdGF0ZSBfYmVmb3JlXyBpdCBpcyByZWxlYXNlZC4gIENhbGxlZCB3aXRoIGRpc2FibGVkIGludHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdm9pZCAqb2JqcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdm9pZCAqb2JqcCwKKyAgICB2b2lkICpjYWxsZXIpCiB7CiAJc3RydWN0IGFycmF5X2NhY2hlICphYyA9IGNwdV9jYWNoZV9nZXQoY2FjaGVwKTsKIAogCWNoZWNrX2lycV9vZmYoKTsKIAlrbWVtbGVha19mcmVlX3JlY3Vyc2l2ZShvYmpwLCBjYWNoZXAtPmZsYWdzKTsKLQlvYmpwID0gY2FjaGVfZnJlZV9kZWJ1Z2NoZWNrKGNhY2hlcCwgb2JqcCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlvYmpwID0gY2FjaGVfZnJlZV9kZWJ1Z2NoZWNrKGNhY2hlcCwgb2JqcCwgY2FsbGVyKTsKIAogCWttZW1jaGVja19zbGFiX2ZyZWUoY2FjaGVwLCBvYmpwLCBvYmpfc2l6ZShjYWNoZXApKTsKIApAQCAtMzgwMSw3ICszODAzLDcgQEAKIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChvYmpwLCBvYmpfc2l6ZShjYWNoZXApKTsKIAlpZiAoIShjYWNoZXAtPmZsYWdzICYgU0xBQl9ERUJVR19PQkpFQ1RTKSkKIAkJZGVidWdfY2hlY2tfbm9fb2JqX2ZyZWVkKG9ianAsIG9ial9zaXplKGNhY2hlcCkpOwotCV9fY2FjaGVfZnJlZShjYWNoZXAsIG9ianApOworCV9fY2FjaGVfZnJlZShjYWNoZXAsIG9ianAsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJdHJhY2Vfa21lbV9jYWNoZV9mcmVlKF9SRVRfSVBfLCBvYmpwKTsKQEAgLTM4MzEsNyArMzgzMyw3IEBACiAJYyA9IHZpcnRfdG9fY2FjaGUob2JqcCk7CiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQob2JqcCwgb2JqX3NpemUoYykpOwogCWRlYnVnX2NoZWNrX25vX29ial9mcmVlZChvYmpwLCBvYmpfc2l6ZShjKSk7Ci0JX19jYWNoZV9mcmVlKGMsICh2b2lkICopb2JqcCk7CisJX19jYWNoZV9mcmVlKGMsICh2b2lkICopb2JqcCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGtmcmVlKTsKZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwppbmRleCA0NmUwYWVlLi4wYWU4ODE4IDEwMDY0NAotLS0gYS9tbS9zbG9iLmMKKysrIGIvbW0vc2xvYi5jCkBAIC00ODIsNiArNDgyLDggQEAKIAlpbnQgYWxpZ24gPSBtYXgoQVJDSF9LTUFMTE9DX01JTkFMSUdOLCBBUkNIX1NMQUJfTUlOQUxJR04pOwogCXZvaWQgKnJldDsKIAorCWdmcCAmPSBnZnBfYWxsb3dlZF9tYXNrOworCiAJbG9ja2RlcF90cmFjZV9hbGxvYyhnZnApOwogCiAJaWYgKHNpemUgPCBQQUdFX1NJWkUgLSBhbGlnbikgewpAQCAtNjA4LDYgKzYxMCwxMCBAQAogewogCXZvaWQgKmI7CiAKKwlmbGFncyAmPSBnZnBfYWxsb3dlZF9tYXNrOworCisJbG9ja2RlcF90cmFjZV9hbGxvYyhmbGFncyk7CisKIAlpZiAoYy0+c2l6ZSA8IFBBR0VfU0laRSkgewogCQliID0gc2xvYl9hbGxvYyhjLT5zaXplLCBmbGFncywgYy0+YWxpZ24sIG5vZGUpOwogCQl0cmFjZV9rbWVtX2NhY2hlX2FsbG9jX25vZGUoX1JFVF9JUF8sIGIsIGMtPnNpemUsCmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggN2JlMDIyMy4uYmE4M2YzZiAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rbWVtLmg+CiAKQEAgLTE5MSw4ICsxOTIsMTIgQEAKIC8qCiAgKiBUcmFja2luZyB1c2VyIG9mIGEgc2xhYi4KICAqLworI2RlZmluZSBUUkFDS19BRERSU19DT1VOVCAxNgogc3RydWN0IHRyYWNrIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CS8qIENhbGxlZCBmcm9tIGFkZHJlc3MgKi8KKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCXVuc2lnbmVkIGxvbmcgYWRkcnNbVFJBQ0tfQUREUlNfQ09VTlRdOwkvKiBDYWxsZWQgZnJvbSBhZGRyZXNzICovCisjZW5kaWYKIAlpbnQgY3B1OwkJLyogV2FzIHJ1bm5pbmcgb24gY3B1ICovCiAJaW50IHBpZDsJCS8qIFBpZCBjb250ZXh0ICovCiAJdW5zaWduZWQgbG9uZyB3aGVuOwkvKiBXaGVuIGRpZCB0aGUgb3BlcmF0aW9uIG9jY3VyICovCkBAIC00MjAsNiArNDI1LDI0IEBACiAJc3RydWN0IHRyYWNrICpwID0gZ2V0X3RyYWNrKHMsIG9iamVjdCwgYWxsb2MpOwogCiAJaWYgKGFkZHIpIHsKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCQlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7CisJCWludCBpOworCisJCXRyYWNlLm5yX2VudHJpZXMgPSAwOworCQl0cmFjZS5tYXhfZW50cmllcyA9IFRSQUNLX0FERFJTX0NPVU5UOworCQl0cmFjZS5lbnRyaWVzID0gcC0+YWRkcnM7CisJCXRyYWNlLnNraXAgPSAzOworCQlzYXZlX3N0YWNrX3RyYWNlKCZ0cmFjZSk7CisKKwkJLyogU2VlIHJhbnQgaW4gbG9ja2RlcC5jICovCisJCWlmICh0cmFjZS5ucl9lbnRyaWVzICE9IDAgJiYKKwkJICAgIHRyYWNlLmVudHJpZXNbdHJhY2UubnJfZW50cmllcyAtIDFdID09IFVMT05HX01BWCkKKwkJCXRyYWNlLm5yX2VudHJpZXMtLTsKKworCQlmb3IgKGkgPSB0cmFjZS5ucl9lbnRyaWVzOyBpIDwgVFJBQ0tfQUREUlNfQ09VTlQ7IGkrKykKKwkJCXAtPmFkZHJzW2ldID0gMDsKKyNlbmRpZgogCQlwLT5hZGRyID0gYWRkcjsKIAkJcC0+Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCQlwLT5waWQgPSBjdXJyZW50LT5waWQ7CkBAIC00NDQsNiArNDY3LDE2IEBACiAKIAlwcmludGsoS0VSTl9FUlIgIklORk86ICVzIGluICVwUyBhZ2U9JWx1IGNwdT0ldSBwaWQ9JWRcbiIsCiAJCXMsICh2b2lkICopdC0+YWRkciwgamlmZmllcyAtIHQtPndoZW4sIHQtPmNwdSwgdC0+cGlkKTsKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBUUkFDS19BRERSU19DT1VOVDsgaSsrKQorCQkJaWYgKHQtPmFkZHJzW2ldKQorCQkJCXByaW50ayhLRVJOX0VSUiAiXHQlcFNcbiIsICh2b2lkICopdC0+YWRkcnNbaV0pOworCQkJZWxzZQorCQkJCWJyZWFrOworCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBwcmludF90cmFja2luZyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgdm9pZCAqb2JqZWN0KQpAQCAtNTU3LDEwICs1OTAsMTAgQEAKIAkJbWVtc2V0KHAgKyBzLT5vYmpzaXplLCB2YWwsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSk7CiB9CiAKLXN0YXRpYyB1OCAqY2hlY2tfYnl0ZXModTggKnN0YXJ0LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKK3N0YXRpYyB1OCAqY2hlY2tfYnl0ZXM4KHU4ICpzdGFydCwgdTggdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKIHsKIAl3aGlsZSAoYnl0ZXMpIHsKLQkJaWYgKCpzdGFydCAhPSAodTgpdmFsdWUpCisJCWlmICgqc3RhcnQgIT0gdmFsdWUpCiAJCQlyZXR1cm4gc3RhcnQ7CiAJCXN0YXJ0Kys7CiAJCWJ5dGVzLS07CkBAIC01NjgsNiArNjAxLDM4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB1OCAqY2hlY2tfYnl0ZXModTggKnN0YXJ0LCB1OCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXU2NCB2YWx1ZTY0OworCXVuc2lnbmVkIGludCB3b3JkcywgcHJlZml4OworCisJaWYgKGJ5dGVzIDw9IDE2KQorCQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgYnl0ZXMpOworCisJdmFsdWU2NCA9IHZhbHVlIHwgdmFsdWUgPDwgOCB8IHZhbHVlIDw8IDE2IHwgdmFsdWUgPDwgMjQ7CisJdmFsdWU2NCA9IHZhbHVlNjQgfCB2YWx1ZTY0IDw8IDMyOworCXByZWZpeCA9IDggLSAoKHVuc2lnbmVkIGxvbmcpc3RhcnQpICUgODsKKworCWlmIChwcmVmaXgpIHsKKwkJdTggKnIgPSBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBwcmVmaXgpOworCQlpZiAocikKKwkJCXJldHVybiByOworCQlzdGFydCArPSBwcmVmaXg7CisJCWJ5dGVzIC09IHByZWZpeDsKKwl9CisKKwl3b3JkcyA9IGJ5dGVzIC8gODsKKworCXdoaWxlICh3b3JkcykgeworCQlpZiAoKih1NjQgKilzdGFydCAhPSB2YWx1ZTY0KQorCQkJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIDgpOworCQlzdGFydCArPSA4OworCQl3b3Jkcy0tOworCX0KKworCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBieXRlcyAlIDgpOworfQorCiBzdGF0aWMgdm9pZCByZXN0b3JlX2J5dGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICptZXNzYWdlLCB1OCBkYXRhLAogCQkJCQkJdm9pZCAqZnJvbSwgdm9pZCAqdG8pCiB7CkBAIC0yMzIwLDE2ICsyMzg1LDEyIEBACiAJQlVJTERfQlVHX09OKFBFUkNQVV9EWU5BTUlDX0VBUkxZX1NJWkUgPAogCQkJU0xVQl9QQUdFX1NISUZUICogc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlX2NwdSkpOwogCi0jaWZkZWYgQ09ORklHX0NNUFhDSEdfTE9DQUwKIAkvKgotCSAqIE11c3QgYWxpZ24gdG8gZG91YmxlIHdvcmQgYm91bmRhcnkgZm9yIHRoZSBkb3VibGUgY21weGNoZyBpbnN0cnVjdGlvbnMKLQkgKiB0byB3b3JrLgorCSAqIE11c3QgYWxpZ24gdG8gZG91YmxlIHdvcmQgYm91bmRhcnkgZm9yIHRoZSBkb3VibGUgY21weGNoZworCSAqIGluc3RydWN0aW9ucyB0byB3b3JrOyBzZWUgX19wY3B1X2RvdWJsZV9jYWxsX3JldHVybl9ib29sKCkuCiAJICovCi0Jcy0+Y3B1X3NsYWIgPSBfX2FsbG9jX3BlcmNwdShzaXplb2Yoc3RydWN0IGttZW1fY2FjaGVfY3B1KSwgMiAqIHNpemVvZih2b2lkICopKTsKLSNlbHNlCi0JLyogUmVndWxhciBhbGlnbm1lbnQgaXMgc3VmZmljaWVudCAqLwotCXMtPmNwdV9zbGFiID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBrbWVtX2NhY2hlX2NwdSk7Ci0jZW5kaWYKKwlzLT5jcHVfc2xhYiA9IF9fYWxsb2NfcGVyY3B1KHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZV9jcHUpLAorCQkJCSAgICAgMiAqIHNpemVvZih2b2lkICopKTsKIAogCWlmICghcy0+Y3B1X3NsYWIpCiAJCXJldHVybiAwOwpAQCAtMjkzMiw2ICsyOTkzLDQyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGtzaXplKTsKIAorI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCitib29sIHZlcmlmeV9tZW1fbm90X2RlbGV0ZWQoY29uc3Qgdm9pZCAqeCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICpvYmplY3QgPSAodm9pZCAqKXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHJ2OworCisJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIoeCkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlwYWdlID0gdmlydF90b19oZWFkX3BhZ2UoeCk7CisJaWYgKHVubGlrZWx5KCFQYWdlU2xhYihwYWdlKSkpIHsKKwkJLyogbWF5YmUgaXQgd2FzIGZyb20gc3RhY2s/ICovCisJCXJ2ID0gdHJ1ZTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXNsYWJfbG9jayhwYWdlKTsKKwlpZiAob25fZnJlZWxpc3QocGFnZS0+c2xhYiwgcGFnZSwgb2JqZWN0KSkgeworCQlvYmplY3RfZXJyKHBhZ2UtPnNsYWIsIHBhZ2UsIG9iamVjdCwgIk9iamVjdCBpcyBvbiBmcmVlLWxpc3QiKTsKKwkJcnYgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlydiA9IHRydWU7CisJfQorCXNsYWJfdW5sb2NrKHBhZ2UpOworCitvdXRfdW5sb2NrOgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcnY7Cit9CitFWFBPUlRfU1lNQk9MKHZlcmlmeV9tZW1fbm90X2RlbGV0ZWQpOworI2VuZGlmCisKIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqeCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IGQ1MzdkMjkuLmZmOGRjMWEgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KLSNpbmNsdWRlIDxsaW51eC9zaG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgpkaWZmIC0tZ2l0IGEvbW0vdGhyYXNoLmMgYi9tbS90aHJhc2guYwppbmRleCAyMzcyZDRlLi5mYWJmMmQwIDEwMDY0NAotLS0gYS9tbS90aHJhc2guYworKysgYi9tbS90aHJhc2guYwpAQCAtMjEsMTQgKzIxLDQwIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CisKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvdm1zY2FuLmg+CisKKyNkZWZpbmUgVE9LRU5fQUdJTkdfSU5URVJWQUwJKDB4RkYpCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF90b2tlbl9sb2NrKTsKIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW07CitzdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF90b2tlbl9tZW1jZzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsX2ZhdWx0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9hZ2luZzsKKworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CisKKwltZW1jZyA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKG1tKTsKKwlpZiAobWVtY2cpCisJCWNzc19wdXQobWVtX2Nncm91cF9jc3MobWVtY2cpKTsKKworCXJldHVybiBtZW1jZzsKK30KKyNlbHNlCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgogCiB2b2lkIGdyYWJfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpbnQgY3VycmVudF9pbnRlcnZhbDsKKwl1bnNpZ25lZCBpbnQgb2xkX3ByaW8gPSBtbS0+dG9rZW5fcHJpb3JpdHk7CiAKIAlnbG9iYWxfZmF1bHRzKys7CiAKQEAgLTM4LDQwICs2NCw4MSBAQAogCQlyZXR1cm47CiAKIAkvKiBGaXJzdCBjb21lIGZpcnN0IHNlcnZlZCAqLwotCWlmIChzd2FwX3Rva2VuX21tID09IE5VTEwpIHsKLQkJbW0tPnRva2VuX3ByaW9yaXR5ID0gbW0tPnRva2VuX3ByaW9yaXR5ICsgMjsKLQkJc3dhcF90b2tlbl9tbSA9IG1tOwotCQlnb3RvIG91dDsKKwlpZiAoIXN3YXBfdG9rZW5fbW0pCisJCWdvdG8gcmVwbGFjZV90b2tlbjsKKworCWlmICgoZ2xvYmFsX2ZhdWx0cyAtIGxhc3RfYWdpbmcpID4gVE9LRU5fQUdJTkdfSU5URVJWQUwpIHsKKwkJc3dhcF90b2tlbl9tbS0+dG9rZW5fcHJpb3JpdHkgLz0gMjsKKwkJbGFzdF9hZ2luZyA9IGdsb2JhbF9mYXVsdHM7CiAJfQogCi0JaWYgKG1tICE9IHN3YXBfdG9rZW5fbW0pIHsKLQkJaWYgKGN1cnJlbnRfaW50ZXJ2YWwgPCBtbS0+bGFzdF9pbnRlcnZhbCkKLQkJCW1tLT50b2tlbl9wcmlvcml0eSsrOwotCQllbHNlIHsKLQkJCWlmIChsaWtlbHkobW0tPnRva2VuX3ByaW9yaXR5ID4gMCkpCi0JCQkJbW0tPnRva2VuX3ByaW9yaXR5LS07Ci0JCX0KLQkJLyogQ2hlY2sgaWYgd2UgZGVzZXJ2ZSB0aGUgdG9rZW4gKi8KLQkJaWYgKG1tLT50b2tlbl9wcmlvcml0eSA+IHN3YXBfdG9rZW5fbW0tPnRva2VuX3ByaW9yaXR5KSB7Ci0JCQltbS0+dG9rZW5fcHJpb3JpdHkgKz0gMjsKLQkJCXN3YXBfdG9rZW5fbW0gPSBtbTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFRva2VuIGhvbGRlciBjYW1lIGluIGFnYWluISAqLworCWlmIChtbSA9PSBzd2FwX3Rva2VuX21tKSB7CiAJCW1tLT50b2tlbl9wcmlvcml0eSArPSAyOworCQlnb3RvIHVwZGF0ZV9wcmlvcml0eTsKIAl9CiAKKwlpZiAoY3VycmVudF9pbnRlcnZhbCA8IG1tLT5sYXN0X2ludGVydmFsKQorCQltbS0+dG9rZW5fcHJpb3JpdHkrKzsKKwllbHNlIHsKKwkJaWYgKGxpa2VseShtbS0+dG9rZW5fcHJpb3JpdHkgPiAwKSkKKwkJCW1tLT50b2tlbl9wcmlvcml0eS0tOworCX0KKworCS8qIENoZWNrIGlmIHdlIGRlc2VydmUgdGhlIHRva2VuICovCisJaWYgKG1tLT50b2tlbl9wcmlvcml0eSA+IHN3YXBfdG9rZW5fbW0tPnRva2VuX3ByaW9yaXR5KQorCQlnb3RvIHJlcGxhY2VfdG9rZW47CisKK3VwZGF0ZV9wcmlvcml0eToKKwl0cmFjZV91cGRhdGVfc3dhcF90b2tlbl9wcmlvcml0eShtbSwgb2xkX3ByaW8sIHN3YXBfdG9rZW5fbW0pOworCiBvdXQ6CiAJbW0tPmZhdWx0c3RhbXAgPSBnbG9iYWxfZmF1bHRzOwogCW1tLT5sYXN0X2ludGVydmFsID0gY3VycmVudF9pbnRlcnZhbDsKIAlzcGluX3VubG9jaygmc3dhcF90b2tlbl9sb2NrKTsKKwlyZXR1cm47CisKK3JlcGxhY2VfdG9rZW46CisJbW0tPnRva2VuX3ByaW9yaXR5ICs9IDI7CisJdHJhY2VfcmVwbGFjZV9zd2FwX3Rva2VuKHN3YXBfdG9rZW5fbW0sIG1tKTsKKwlzd2FwX3Rva2VuX21tID0gbW07CisJc3dhcF90b2tlbl9tZW1jZyA9IHN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShtbSk7CisJbGFzdF9hZ2luZyA9IGdsb2JhbF9mYXVsdHM7CisJZ290byBvdXQ7CiB9CiAKIC8qIENhbGxlZCBvbiBwcm9jZXNzIGV4aXQuICovCiB2b2lkIF9fcHV0X3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3Bpbl9sb2NrKCZzd2FwX3Rva2VuX2xvY2spOwotCWlmIChsaWtlbHkobW0gPT0gc3dhcF90b2tlbl9tbSkpCisJaWYgKGxpa2VseShtbSA9PSBzd2FwX3Rva2VuX21tKSkgeworCQl0cmFjZV9wdXRfc3dhcF90b2tlbihzd2FwX3Rva2VuX21tKTsKIAkJc3dhcF90b2tlbl9tbSA9IE5VTEw7CisJCXN3YXBfdG9rZW5fbWVtY2cgPSBOVUxMOworCX0KIAlzcGluX3VubG9jaygmc3dhcF90b2tlbl9sb2NrKTsKIH0KKworc3RhdGljIGJvb2wgbWF0Y2hfbWVtY2coc3RydWN0IG1lbV9jZ3JvdXAgKmEsIHN0cnVjdCBtZW1fY2dyb3VwICpiKQoreworCWlmICghYSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFiKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZGlzYWJsZV9zd2FwX3Rva2VuKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK3sKKwkvKiBtZW1jZyByZWNsYWltIGRvbid0IGRpc2FibGUgdW5yZWxhdGVkIG1tIHRva2VuLiAqLworCWlmIChtYXRjaF9tZW1jZyhtZW1jZywgc3dhcF90b2tlbl9tZW1jZykpIHsKKwkJc3Bpbl9sb2NrKCZzd2FwX3Rva2VuX2xvY2spOworCQlpZiAobWF0Y2hfbWVtY2cobWVtY2csIHN3YXBfdG9rZW5fbWVtY2cpKSB7CisJCQl0cmFjZV9kaXNhYmxlX3N3YXBfdG9rZW4oc3dhcF90b2tlbl9tbSk7CisJCQlzd2FwX3Rva2VuX21tID0gTlVMTDsKKwkJCXN3YXBfdG9rZW5fbWVtY2cgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrKCZzd2FwX3Rva2VuX2xvY2spOworCX0KK30KZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IDNhMjlhNjEuLmUxM2YyMmUgMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMzA0LDYgKzMwNCwxMSBAQAogICogQGxzdGFydDogb2Zmc2V0IGZyb20gd2hpY2ggdG8gdHJ1bmNhdGUKICAqCiAgKiBDYWxsZWQgdW5kZXIgKGFuZCBzZXJpYWxpc2VkIGJ5KSBpbm9kZS0+aV9tdXRleC4KKyAqCisgKiBOb3RlOiBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlcmUgY2FuIGJlIGEgcGFnZSBpbiB0aGUgcHJvY2VzcyBvZgorICogZGVsZXRpb24gKGluc2lkZSBfX2RlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUoKSkgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gIFRodXMKKyAqIG1hcHBpbmctPm5ycGFnZXMgY2FuIGJlIG5vbi16ZXJvIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGV2ZW4gYWZ0ZXIKKyAqIHRydW5jYXRpb24gb2YgdGhlIHdob2xlIG1hcHBpbmcuCiAgKi8KIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBsc3RhcnQpCiB7CkBAIC02MDMsMyArNjA4LDI3IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHZtdHJ1bmNhdGUpOworCitpbnQgdm10cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgZW5kKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKworCS8qCisJICogSWYgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBpcyBub3QgZ29pbmcgdG8gcHJvdmlkZQorCSAqIGEgd2F5IHRvIHRydW5jYXRlIGEgcmFuZ2Ugb2YgYmxvY2tzIChwdW5jaCBhIGhvbGUpIC0KKwkgKiB3ZSBzaG91bGQgcmV0dXJuIGZhaWx1cmUgcmlnaHQgbm93LgorCSAqLworCWlmICghaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwlkb3duX3dyaXRlKCZpbm9kZS0+aV9hbGxvY19zZW0pOworCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCAoZW5kIC0gb2Zmc2V0KSwgMSk7CisJaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKGlub2RlLCBvZmZzZXQsIGVuZCk7CisJLyogdW5tYXAgYWdhaW4gdG8gcmVtb3ZlIHJhY2lseSBDT1dlZCBwcml2YXRlIHBhZ2VzICovCisJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQsIChlbmQgLSBvZmZzZXQpLCAxKTsKKwl1cF93cml0ZSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBmYWEwYTA4Li5kMDM2ZTU5IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMTEyNCw4ICsxMTI0LDIwIEBACiAJCQkJCW5yX2x1bXB5X2RpcnR5Kys7CiAJCQkJc2NhbisrOwogCQkJfSBlbHNlIHsKLQkJCQkvKiB0aGUgcGFnZSBpcyBmcmVlZCBhbHJlYWR5LiAqLwotCQkJCWlmICghcGFnZV9jb3VudChjdXJzb3JfcGFnZSkpCisJCQkJLyoKKwkJCQkgKiBDaGVjayBpZiB0aGUgcGFnZSBpcyBmcmVlZCBhbHJlYWR5LgorCQkJCSAqCisJCQkJICogV2UgY2FuJ3QgdXNlIHBhZ2VfY291bnQoKSBhcyB0aGF0CisJCQkJICogcmVxdWlyZXMgY29tcG91bmRfaGVhZCBhbmQgd2UgZG9uJ3QKKwkJCQkgKiBoYXZlIGEgcGluIG9uIHRoZSBwYWdlIGhlcmUuIElmIGEKKwkJCQkgKiBwYWdlIGlzIHRhaWwsIHdlIG1heSBvciBtYXkgbm90CisJCQkJICogaGF2ZSBpc29sYXRlZCB0aGUgaGVhZCwgc28gYXNzdW1lCisJCQkJICogaXQncyBub3QgZnJlZSwgaXQnZCBiZSB0cmlja3kgdG8KKwkJCQkgKiB0cmFjayB0aGUgaGVhZCBzdGF0dXMgd2l0aG91dCBhCisJCQkJICogcGFnZSBwaW4uCisJCQkJICovCisJCQkJaWYgKCFQYWdlVGFpbChjdXJzb3JfcGFnZSkgJiYKKwkJCQkgICAgIWF0b21pY19yZWFkKCZjdXJzb3JfcGFnZS0+X2NvdW50KSkKIAkJCQkJY29udGludWU7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xOTgzLDE0ICsxOTk1LDEzIEBACiAgKiBJZiBhIHpvbmUgaXMgZGVlbWVkIHRvIGJlIGZ1bGwgb2YgcGlubmVkIHBhZ2VzIHRoZW4ganVzdCBnaXZlIGl0IGEgbGlnaHQKICAqIHNjYW4gdGhlbiBnaXZlIHVwIG9uIGl0LgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaHJpbmtfem9uZXMoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAorc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVzKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwKIAkJCQkJc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCiB7CiAJc3RydWN0IHpvbmVyZWYgKno7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJdW5zaWduZWQgbG9uZyBucl9zb2Z0X3JlY2xhaW1lZDsKIAl1bnNpZ25lZCBsb25nIG5yX3NvZnRfc2Nhbm5lZDsKLQl1bnNpZ25lZCBsb25nIHRvdGFsX3NjYW5uZWQgPSAwOwogCiAJZm9yX2VhY2hfem9uZV96b25lbGlzdF9ub2RlbWFzayh6b25lLCB6LCB6b25lbGlzdCwKIAkJCQkJZ2ZwX3pvbmUoc2MtPmdmcF9tYXNrKSwgc2MtPm5vZGVtYXNrKSB7CkBAIC0yMDA1LDE5ICsyMDE2LDIzIEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUgJiYgcHJpb3JpdHkgIT0gREVGX1BSSU9SSVRZKQogCQkJCWNvbnRpbnVlOwkvKiBMZXQga3N3YXBkIHBvbGwgaXQgKi8KKwkJCS8qCisJCQkgKiBUaGlzIHN0ZWFscyBwYWdlcyBmcm9tIG1lbW9yeSBjZ3JvdXBzIG92ZXIgc29mdGxpbWl0CisJCQkgKiBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2xhaW1lZCBwYWdlcyBhbmQKKwkJCSAqIHNjYW5uZWQgcGFnZXMuIFRoaXMgd29ya3MgZm9yIGdsb2JhbCBtZW1vcnkgcHJlc3N1cmUKKwkJCSAqIGFuZCBiYWxhbmNpbmcsIG5vdCBmb3IgYSBtZW1jZydzIGxpbWl0LgorCQkJICovCisJCQlucl9zb2Z0X3NjYW5uZWQgPSAwOworCQkJbnJfc29mdF9yZWNsYWltZWQgPSBtZW1fY2dyb3VwX3NvZnRfbGltaXRfcmVjbGFpbSh6b25lLAorCQkJCQkJc2MtPm9yZGVyLCBzYy0+Z2ZwX21hc2ssCisJCQkJCQkmbnJfc29mdF9zY2FubmVkKTsKKwkJCXNjLT5ucl9yZWNsYWltZWQgKz0gbnJfc29mdF9yZWNsYWltZWQ7CisJCQlzYy0+bnJfc2Nhbm5lZCArPSBucl9zb2Z0X3NjYW5uZWQ7CisJCQkvKiBuZWVkIHNvbWUgY2hlY2sgZm9yIGF2b2lkIG1vcmUgc2hyaW5rX3pvbmUoKSAqLwogCQl9CiAKLQkJbnJfc29mdF9zY2FubmVkID0gMDsKLQkJbnJfc29mdF9yZWNsYWltZWQgPSBtZW1fY2dyb3VwX3NvZnRfbGltaXRfcmVjbGFpbSh6b25lLAotCQkJCQkJCXNjLT5vcmRlciwgc2MtPmdmcF9tYXNrLAotCQkJCQkJCSZucl9zb2Z0X3NjYW5uZWQpOwotCQlzYy0+bnJfcmVjbGFpbWVkICs9IG5yX3NvZnRfcmVjbGFpbWVkOwotCQl0b3RhbF9zY2FubmVkICs9IG5yX3NvZnRfc2Nhbm5lZDsKLQogCQlzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgc2MpOwogCX0KLQotCXJldHVybiB0b3RhbF9zY2FubmVkOwogfQogCiBzdGF0aWMgYm9vbCB6b25lX3JlY2xhaW1hYmxlKHN0cnVjdCB6b25lICp6b25lKQpAQCAtMjA4MSw4ICsyMDk2LDggQEAKIAlmb3IgKHByaW9yaXR5ID0gREVGX1BSSU9SSVRZOyBwcmlvcml0eSA+PSAwOyBwcmlvcml0eS0tKSB7CiAJCXNjLT5ucl9zY2FubmVkID0gMDsKIAkJaWYgKCFwcmlvcml0eSkKLQkJCWRpc2FibGVfc3dhcF90b2tlbigpOwotCQl0b3RhbF9zY2FubmVkICs9IHNocmlua196b25lcyhwcmlvcml0eSwgem9uZWxpc3QsIHNjKTsKKwkJCWRpc2FibGVfc3dhcF90b2tlbihzYy0+bWVtX2Nncm91cCk7CisJCXNocmlua196b25lcyhwcmlvcml0eSwgem9uZWxpc3QsIHNjKTsKIAkJLyoKIAkJICogRG9uJ3Qgc2hyaW5rIHNsYWJzIHdoZW4gcmVjbGFpbWluZyBtZW1vcnkgZnJvbQogCQkgKiBvdmVyIGxpbWl0IGNncm91cHMKQEAgLTIyOTUsNyArMjMxMCw4IEBACiAJZm9yIChpID0gMDsgaSA8PSBjbGFzc3pvbmVfaWR4OyBpKyspCiAJCXByZXNlbnRfcGFnZXMgKz0gcGdkYXQtPm5vZGVfem9uZXNbaV0ucHJlc2VudF9wYWdlczsKIAotCXJldHVybiBiYWxhbmNlZF9wYWdlcyA+IChwcmVzZW50X3BhZ2VzID4+IDIpOworCS8qIEEgc3BlY2lhbCBjYXNlIGhlcmU6IGlmIHpvbmUgaGFzIG5vIHBhZ2UsIHdlIHRoaW5rIGl0J3MgYmFsYW5jZWQgKi8KKwlyZXR1cm4gYmFsYW5jZWRfcGFnZXMgPj0gKHByZXNlbnRfcGFnZXMgPj4gMik7CiB9CiAKIC8qIGlzIGtzd2FwZCBzbGVlcGluZyBwcmVtYXR1cmVseT8gKi8KQEAgLTIzMTEsNyArMjMyNyw3IEBACiAJCXJldHVybiB0cnVlOwogCiAJLyogQ2hlY2sgdGhlIHdhdGVybWFyayBsZXZlbHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5yX3pvbmVzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IGNsYXNzem9uZV9pZHg7IGkrKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKIAogCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQpAQCAtMjMyOSw3ICsyMzQ1LDcgQEAKIAkJfQogCiAJCWlmICghem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwgaGlnaF93bWFya19wYWdlcyh6b25lKSwKLQkJCQkJCQljbGFzc3pvbmVfaWR4LCAwKSkKKwkJCQkJCQlpLCAwKSkKIAkJCWFsbF96b25lc19vayA9IGZhbHNlOwogCQllbHNlCiAJCQliYWxhbmNlZCArPSB6b25lLT5wcmVzZW50X3BhZ2VzOwpAQCAtMjQwNyw3ICsyNDIzLDcgQEAKIAogCQkvKiBUaGUgc3dhcCB0b2tlbiBnZXRzIGluIHRoZSB3YXkgb2Ygc3dhcG91dC4uLiAqLwogCQlpZiAoIXByaW9yaXR5KQotCQkJZGlzYWJsZV9zd2FwX3Rva2VuKCk7CisJCQlkaXNhYmxlX3N3YXBfdG9rZW4oTlVMTCk7CiAKIAkJYWxsX3pvbmVzX29rID0gMTsKIAkJYmFsYW5jZWQgPSAwOwpAQCAtMjQzNiw3ICsyNDUyLDYgQEAKIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwKIAkJCQkJaGlnaF93bWFya19wYWdlcyh6b25lKSwgMCwgMCkpIHsKIAkJCQllbmRfem9uZSA9IGk7Ci0JCQkJKmNsYXNzem9uZV9pZHggPSBpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yNDk1LDE4ICsyNTEwLDE4IEBACiAJCQkJS1NXQVBEX1pPTkVfQkFMQU5DRV9HQVBfUkFUSU8pOwogCQkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLAogCQkJCQloaWdoX3dtYXJrX3BhZ2VzKHpvbmUpICsgYmFsYW5jZV9nYXAsCi0JCQkJCWVuZF96b25lLCAwKSkKKwkJCQkJZW5kX3pvbmUsIDApKSB7CiAJCQkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7Ci0JCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7Ci0JCQlucl9zbGFiID0gc2hyaW5rX3NsYWIoJnNocmluaywgc2MubnJfc2Nhbm5lZCwgbHJ1X3BhZ2VzKTsKLQkJCXNjLm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKLQkJCXRvdGFsX3NjYW5uZWQgKz0gc2MubnJfc2Nhbm5lZDsKIAotCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5yX3NsYWIgPT0gMCAmJgotCQkJICAgICF6b25lX3JlY2xhaW1hYmxlKHpvbmUpKQotCQkJCXpvbmUtPmFsbF91bnJlY2xhaW1hYmxlID0gMTsKKwkJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CisJCQkJbnJfc2xhYiA9IHNocmlua19zbGFiKCZzaHJpbmssIHNjLm5yX3NjYW5uZWQsIGxydV9wYWdlcyk7CisJCQkJc2MubnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOworCQkJCXRvdGFsX3NjYW5uZWQgKz0gc2MubnJfc2Nhbm5lZDsKKworCQkJCWlmIChucl9zbGFiID09IDAgJiYgIXpvbmVfcmVjbGFpbWFibGUoem9uZSkpCisJCQkJCXpvbmUtPmFsbF91bnJlY2xhaW1hYmxlID0gMTsKKwkJCX0KKwogCQkJLyoKIAkJCSAqIElmIHdlJ3ZlIGRvbmUgYSBkZWNlbnQgYW1vdW50IG9mIHNjYW5uaW5nIGFuZAogCQkJICogdGhlIHJlY2xhaW0gcmF0aW8gaXMgbG93LCBzdGFydCBkb2luZyB3cml0ZXBhZ2UKQEAgLTI1MTYsNiArMjUzMSwxMiBAQAogCQkJICAgIHRvdGFsX3NjYW5uZWQgPiBzYy5ucl9yZWNsYWltZWQgKyBzYy5ucl9yZWNsYWltZWQgLyAyKQogCQkJCXNjLm1heV93cml0ZXBhZ2UgPSAxOwogCisJCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUpIHsKKwkJCQlpZiAoZW5kX3pvbmUgJiYgZW5kX3pvbmUgPT0gaSkKKwkJCQkJZW5kX3pvbmUtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwogCQkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLAogCQkJCQloaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLCBlbmRfem9uZSwgMCkpIHsKIAkJCQlhbGxfem9uZXNfb2sgPSAwOwpAQCAtMjY5NCw4ICsyNzE1LDggQEAKICAqLwogc3RhdGljIGludCBrc3dhcGQodm9pZCAqcCkKIHsKLQl1bnNpZ25lZCBsb25nIG9yZGVyOwotCWludCBjbGFzc3pvbmVfaWR4OworCXVuc2lnbmVkIGxvbmcgb3JkZXIsIG5ld19vcmRlcjsKKwlpbnQgY2xhc3N6b25lX2lkeCwgbmV3X2NsYXNzem9uZV9pZHg7CiAJcGdfZGF0YV90ICpwZ2RhdCA9IChwZ19kYXRhX3QqKXA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCkBAIC0yNzI1LDE3ICsyNzQ2LDIzIEBACiAJdHNrLT5mbGFncyB8PSBQRl9NRU1BTExPQyB8IFBGX1NXQVBXUklURSB8IFBGX0tTV0FQRDsKIAlzZXRfZnJlZXphYmxlKCk7CiAKLQlvcmRlciA9IDA7Ci0JY2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUyAtIDE7CisJb3JkZXIgPSBuZXdfb3JkZXIgPSAwOworCWNsYXNzem9uZV9pZHggPSBuZXdfY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5ucl96b25lcyAtIDE7CiAJZm9yICggOyA7ICkgewotCQl1bnNpZ25lZCBsb25nIG5ld19vcmRlcjsKLQkJaW50IG5ld19jbGFzc3pvbmVfaWR4OwogCQlpbnQgcmV0OwogCi0JCW5ld19vcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOwotCQluZXdfY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5jbGFzc3pvbmVfaWR4OwotCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IDA7Ci0JCXBnZGF0LT5jbGFzc3pvbmVfaWR4ID0gTUFYX05SX1pPTkVTIC0gMTsKKwkJLyoKKwkJICogSWYgdGhlIGxhc3QgYmFsYW5jZV9wZ2RhdCB3YXMgdW5zdWNjZXNzZnVsIGl0J3MgdW5saWtlbHkgYQorCQkgKiBuZXcgcmVxdWVzdCBvZiBhIHNpbWlsYXIgb3IgaGFyZGVyIHR5cGUgd2lsbCBzdWNjZWVkIHNvb24KKwkJICogc28gY29uc2lkZXIgZ29pbmcgdG8gc2xlZXAgb24gdGhlIGJhc2lzIHdlIHJlY2xhaW1lZCBhdAorCQkgKi8KKwkJaWYgKGNsYXNzem9uZV9pZHggPj0gbmV3X2NsYXNzem9uZV9pZHggJiYgb3JkZXIgPT0gbmV3X29yZGVyKSB7CisJCQluZXdfb3JkZXIgPSBwZ2RhdC0+a3N3YXBkX21heF9vcmRlcjsKKwkJCW5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7CisJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9ICAwOworCQkJcGdkYXQtPmNsYXNzem9uZV9pZHggPSBwZ2RhdC0+bnJfem9uZXMgLSAxOworCQl9CisKIAkJaWYgKG9yZGVyIDwgbmV3X29yZGVyIHx8IGNsYXNzem9uZV9pZHggPiBuZXdfY2xhc3N6b25lX2lkeCkgewogCQkJLyoKIAkJCSAqIERvbid0IHNsZWVwIGlmIHNvbWVvbmUgd2FudHMgYSBsYXJnZXIgJ29yZGVyJwpAQCAtMjc0OCw3ICsyNzc1LDcgQEAKIAkJCW9yZGVyID0gcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXI7CiAJCQljbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7CiAJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IDA7Ci0JCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUyAtIDE7CisJCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IHBnZGF0LT5ucl96b25lcyAtIDE7CiAJCX0KIAogCQlyZXQgPSB0cnlfdG9fZnJlZXplKCk7CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbi5jIGIvbmV0LzgwMjFxL3ZsYW4uYwppbmRleCBjN2E1ODFhLi45MTdlY2I5IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbi5jCisrKyBiL25ldC84MDIxcS92bGFuLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCWdycC0+bnJfdmxhbnMrKzsKIAogCWlmIChuZ3JwKSB7Ci0JCWlmIChvcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKQorCQlpZiAob3BzLT5uZG9fdmxhbl9yeF9yZWdpc3RlciAmJiAocmVhbF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSkKIAkJCW9wcy0+bmRvX3ZsYW5fcnhfcmVnaXN0ZXIocmVhbF9kZXYsIG5ncnApOwogCQlyY3VfYXNzaWduX3BvaW50ZXIocmVhbF9kZXYtPnZsZ3JwLCBuZ3JwKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKaW5kZXggNDE0OTVkYzIuLmZjYzY4NDYgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2NvcmUuYworKysgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKQEAgLTIzLDYgKzIzLDMxIEBACiAJCXJldHVybiBmYWxzZTsKIAogCXNrYi0+ZGV2ID0gdmxhbl9kZXY7CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgeworCQkvKiBPdXIgbG93ZXIgbGF5ZXIgdGhpbmtzIHRoaXMgaXMgbm90IGxvY2FsLCBsZXQncyBtYWtlIHN1cmUuCisJCSAqIFRoaXMgYWxsb3dzIHRoZSBWTEFOIHRvIGhhdmUgYSBkaWZmZXJlbnQgTUFDIHRoYW4gdGhlCisJCSAqIHVuZGVybHlpbmcgZGV2aWNlLCBhbmQgc3RpbGwgcm91dGUgY29ycmVjdGx5LiAqLworCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfZGVzdCwKKwkJCQkJdmxhbl9kZXYtPmRldl9hZGRyKSkKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwl9CisKKwlpZiAoISh2bGFuX2Rldl9pbmZvKHZsYW5fZGV2KS0+ZmxhZ3MgJiBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIpKSB7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOworCisJCS8qCisJCSAqIHZsYW5faW5zZXJ0X3RhZyBleHBlY3Qgc2tiLT5kYXRhIHBvaW50aW5nIHRvIG1hYyBoZWFkZXIuCisJCSAqIFNvIGNoYW5nZSBza2ItPmRhdGEgYmVmb3JlIGNhbGxpbmcgaXQgYW5kIGNoYW5nZSBiYWNrIHRvCisJCSAqIG9yaWdpbmFsIHBvc2l0aW9uIGxhdGVyCisJCSAqLworCQlza2JfcHVzaChza2IsIG9mZnNldCk7CisJCXNrYiA9ICpza2JwID0gdmxhbl9pbnNlcnRfdGFnKHNrYiwgc2tiLT52bGFuX3RjaSk7CisJCWlmICghc2tiKQorCQkJcmV0dXJuIGZhbHNlOworCQlza2JfcHVsbChza2IsIG9mZnNldCArIFZMQU5fSExFTik7CisJCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CisJfQorCiAJc2tiLT5wcmlvcml0eSA9IHZsYW5fZ2V0X2luZ3Jlc3NfcHJpb3JpdHkodmxhbl9kZXYsIHNrYi0+dmxhbl90Y2kpOwogCXNrYi0+dmxhbl90Y2kgPSAwOwogCkBAIC0zMSwyMiArNTYsOCBAQAogCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3N0YXRzLT5zeW5jcCk7CiAJcnhfc3RhdHMtPnJ4X3BhY2tldHMrKzsKIAlyeF9zdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0KLQlzd2l0Y2ggKHNrYi0+cGt0X3R5cGUpIHsKLQljYXNlIFBBQ0tFVF9CUk9BRENBU1Q6Ci0JCWJyZWFrOwotCWNhc2UgUEFDS0VUX01VTFRJQ0FTVDoKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQogCQlyeF9zdGF0cy0+cnhfbXVsdGljYXN0Kys7Ci0JCWJyZWFrOwotCWNhc2UgUEFDS0VUX09USEVSSE9TVDoKLQkJLyogT3VyIGxvd2VyIGxheWVyIHRoaW5rcyB0aGlzIGlzIG5vdCBsb2NhbCwgbGV0J3MgbWFrZSBzdXJlLgotCQkgKiBUaGlzIGFsbG93cyB0aGUgVkxBTiB0byBoYXZlIGEgZGlmZmVyZW50IE1BQyB0aGFuIHRoZQotCQkgKiB1bmRlcmx5aW5nIGRldmljZSwgYW5kIHN0aWxsIHJvdXRlIGNvcnJlY3RseS4gKi8KLQkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcihza2IpLT5oX2Rlc3QsCi0JCQkJCXZsYW5fZGV2LT5kZXZfYWRkcikpCi0JCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7Ci0JCWJyZWFrOwotCX0KIAl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfc3RhdHMtPnN5bmNwKTsKIAogCXJldHVybiB0cnVlOwpAQCAtODksMTggKzEwMCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTCh2bGFuX2dyb19mcmFncyk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdmxhbl9jaGVja19yZW9yZGVyX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHN0cnVjdCBza19idWZmICp2bGFuX3Jlb3JkZXJfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKHZsYW5fZGV2X2luZm8oc2tiLT5kZXYpLT5mbGFncyAmIFZMQU5fRkxBR19SRU9SREVSX0hEUikgewotCQlpZiAoc2tiX2Nvdyhza2IsIHNrYl9oZWFkcm9vbShza2IpKSA8IDApCi0JCQlza2IgPSBOVUxMOwotCQlpZiAoc2tiKSB7Ci0JCQkvKiBMaWZ0ZWQgZnJvbSBHbGViJ3MgVkxBTiBjb2RlLi4uICovCi0JCQltZW1tb3ZlKHNrYi0+ZGF0YSAtIEVUSF9ITEVOLAotCQkJCXNrYi0+ZGF0YSAtIFZMQU5fRVRIX0hMRU4sIDEyKTsKLQkJCXNrYi0+bWFjX2hlYWRlciArPSBWTEFOX0hMRU47Ci0JCX0KLQl9CisJaWYgKHNrYl9jb3coc2tiLCBza2JfaGVhZHJvb20oc2tiKSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwltZW1tb3ZlKHNrYi0+ZGF0YSAtIEVUSF9ITEVOLCBza2ItPmRhdGEgLSBWTEFOX0VUSF9ITEVOLCAyICogRVRIX0FMRU4pOworCXNrYi0+bWFjX2hlYWRlciArPSBWTEFOX0hMRU47CisJc2tiX3Jlc2V0X21hY19sZW4oc2tiKTsKIAlyZXR1cm4gc2tiOwogfQogCkBAIC0xNjEsNyArMTY3LDcgQEAKIAlza2JfcHVsbF9yY3N1bShza2IsIFZMQU5fSExFTik7CiAJdmxhbl9zZXRfZW5jYXBfcHJvdG8oc2tiLCB2aGRyKTsKIAotCXNrYiA9IHZsYW5fY2hlY2tfcmVvcmRlcl9oZWFkZXIoc2tiKTsKKwlza2IgPSB2bGFuX3Jlb3JkZXJfaGVhZGVyKHNrYik7CiAJaWYgKHVubGlrZWx5KCFza2IpKQogCQlnb3RvIGVycl9mcmVlOwogCmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9kZXYuYyBiL25ldC84MDIxcS92bGFuX2Rldi5jCmluZGV4IGYyNDdmNWIuLjZlODIxNDggMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyBiL25ldC84MDIxcS92bGFuX2Rldi5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmc3RhdHMtPnN5bmNwKTsKIAkJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAkJc3RhdHMtPnR4X2J5dGVzICs9IGxlbjsKLQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmc3RhdHMtPnN5bmNwKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzLT5zeW5jcCk7CiAJfSBlbHNlIHsKIAkJdGhpc19jcHVfaW5jKHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9wY3B1X3N0YXRzLT50eF9kcm9wcGVkKTsKIAl9CkBAIC01MjgsNyArNTI4LDExIEBACiAJCQkJCSAgKDE8PF9fTElOS19TVEFURV9ET1JNQU5UKSkpIHwKIAkJICAgICAgKDE8PF9fTElOS19TVEFURV9QUkVTRU5UKTsKIAotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX0FMTF9UWF9PRkZMT0FEUzsKKwlkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9BTExfQ1NVTSB8IE5FVElGX0ZfU0cgfAorCQkJICAgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfQUxMX1RTTyB8CisJCQkgICBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX1NDVFBfQ1NVTSB8CisJCQkgICBORVRJRl9GX0FMTF9GQ09FOworCiAJZGV2LT5mZWF0dXJlcyB8PSByZWFsX2Rldi0+dmxhbl9mZWF0dXJlcyB8IE5FVElGX0ZfTExUWDsKIAlkZXYtPmdzb19tYXhfc2l6ZSA9IHJlYWxfZGV2LT5nc29fbWF4X3NpemU7CiAKQEAgLTU4Niw5ICs1OTAsMTQgQEAKIHN0YXRpYyB1MzIgdmxhbl9kZXZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXUzMiBvbGRfZmVhdHVyZXMgPSBmZWF0dXJlczsKIAogCWZlYXR1cmVzICY9IHJlYWxfZGV2LT5mZWF0dXJlczsKIAlmZWF0dXJlcyAmPSByZWFsX2Rldi0+dmxhbl9mZWF0dXJlczsKKworCWlmIChvbGRfZmVhdHVyZXMgJiBORVRJRl9GX1NPRlRfRkVBVFVSRVMpCisJCWZlYXR1cmVzIHw9IG9sZF9mZWF0dXJlcyAmIE5FVElGX0ZfU09GVF9GRUFUVVJFUzsKKwogCWlmIChkZXZfZXRodG9vbF9nZXRfcnhfY3N1bShyZWFsX2RldikpCiAJCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOwogCWZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwppbmRleCAzMTYzMzMwLi5iY2QxNThmIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCkBAIC0zOTMsNiArMzkzLDkgQEAKIAogCWhjaV9kZXZfcHV0KGhkZXYpOwogCisJaWYgKGNvbm4tPmhhbmRsZSA9PSAwKQorCQlrZnJlZShjb25uKTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MDgsMTEgKzYxMSwxMSBAQAogCQlnb3RvIGVuY3J5cHQ7CiAKIGF1dGg6Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCkpCisJaWYgKHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPnBlbmQpKQogCQlyZXR1cm4gMDsKIAotCWhjaV9jb25uX2F1dGgoY29ubiwgc2VjX2xldmVsLCBhdXRoX3R5cGUpOwotCXJldHVybiAwOworCWlmICghaGNpX2Nvbm5fYXV0aChjb25uLCBzZWNfbGV2ZWwsIGF1dGhfdHlwZSkpCisJCXJldHVybiAwOwogCiBlbmNyeXB0OgogCWlmIChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fRU5DUllQVCkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IGYxM2RkYmYuLjc3OTMwYWEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtNDc3LDE0ICs0NzcsMTYgQEAKIAkgKiBjb21tYW5kIG90aGVyd2lzZSAqLwogCXU4IGV2ZW50c1s4XSA9IHsgMHhmZiwgMHhmZiwgMHhmYiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCi0JLyogRXZlbnRzIGZvciAxLjIgYW5kIG5ld2VyIGNvbnRyb2xsZXJzICovCi0JaWYgKGhkZXYtPmxtcF92ZXIgPiAxKSB7Ci0JCWV2ZW50c1s0XSB8PSAweDAxOyAvKiBGbG93IFNwZWNpZmljYXRpb24gQ29tcGxldGUgKi8KLQkJZXZlbnRzWzRdIHw9IDB4MDI7IC8qIElucXVpcnkgUmVzdWx0IHdpdGggUlNTSSAqLwotCQlldmVudHNbNF0gfD0gMHgwNDsgLyogUmVhZCBSZW1vdGUgRXh0ZW5kZWQgRmVhdHVyZXMgQ29tcGxldGUgKi8KLQkJZXZlbnRzWzVdIHw9IDB4MDg7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ29tcGxldGUgKi8KLQkJZXZlbnRzWzVdIHw9IDB4MTA7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ2hhbmdlZCAqLwotCX0KKwkvKiBDU1IgMS4xIGRvbmdsZXMgZG9lcyBub3QgYWNjZXB0IGFueSBiaXRmaWVsZCBzbyBkb24ndCB0cnkgdG8gc2V0CisJICogYW55IGV2ZW50IG1hc2sgZm9yIHByZSAxLjIgZGV2aWNlcyAqLworCWlmIChoZGV2LT5sbXBfdmVyIDw9IDEpCisJCXJldHVybjsKKworCWV2ZW50c1s0XSB8PSAweDAxOyAvKiBGbG93IFNwZWNpZmljYXRpb24gQ29tcGxldGUgKi8KKwlldmVudHNbNF0gfD0gMHgwMjsgLyogSW5xdWlyeSBSZXN1bHQgd2l0aCBSU1NJICovCisJZXZlbnRzWzRdIHw9IDB4MDQ7IC8qIFJlYWQgUmVtb3RlIEV4dGVuZGVkIEZlYXR1cmVzIENvbXBsZXRlICovCisJZXZlbnRzWzVdIHw9IDB4MDg7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ29tcGxldGUgKi8KKwlldmVudHNbNV0gfD0gMHgxMDsgLyogU3luY2hyb25vdXMgQ29ubmVjdGlvbiBDaGFuZ2VkICovCiAKIAlpZiAoaGRldi0+ZmVhdHVyZXNbM10gJiBMTVBfUlNTSV9JTlEpCiAJCWV2ZW50c1s0XSB8PSAweDA0OyAvKiBJbnF1aXJ5IFJlc3VsdCB3aXRoIFJTU0kgKi8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IGM0MDVhOTUuLjQzYjRjMmQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNDY0LDcgKzQ2NCw4IEBACiB7CiAJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IChzdHJ1Y3QgaGlkcF9zZXNzaW9uICopIGFyZzsKIAotCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCXdha2VfdXBfcHJvY2VzcyhzZXNzaW9uLT50YXNrKTsKIH0KIAogc3RhdGljIHZvaWQgaGlkcF9zZXRfdGltZXIoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKQEAgLTUzNSw3ICs1MzYsOCBAQAogCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmN0cmxfdHJhbnNtaXQpOwogCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOwogCi0JCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwkJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwkJd2FrZV91cF9wcm9jZXNzKGN1cnJlbnQpOwogCX0KIH0KIApAQCAtNzA2LDkgKzcwOCw4IEBACiAJYWRkX3dhaXRfcXVldWUoc2tfc2xlZXAoaW50cl9zayksICZpbnRyX3dhaXQpOwogCXNlc3Npb24tPndhaXRpbmdfZm9yX3N0YXJ0dXAgPSAwOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2Vzc2lvbi0+c3RhcnR1cF9xdWV1ZSk7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJd2hpbGUgKCFhdG9taWNfcmVhZCgmc2Vzc2lvbi0+dGVybWluYXRlKSkgewogCQlpZiAoY3RybF9zay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEIHx8CiAJCQkJaW50cl9zay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQogCQkJYnJlYWs7CkBAIC03MjYsNiArNzI3LDcgQEAKIAkJaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHNlc3Npb24pOwogCiAJCXNjaGVkdWxlKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoc2tfc2xlZXAoaW50cl9zayksICZpbnRyX3dhaXQpOwpAQCAtMTA2MCw3ICsxMDYyLDggQEAKIGVycl9hZGRfZGV2aWNlOgogCWhpZF9kZXN0cm95X2RldmljZShzZXNzaW9uLT5oaWQpOwogCXNlc3Npb24tPmhpZCA9IE5VTEw7Ci0Ja3RocmVhZF9zdG9wKHNlc3Npb24tPnRhc2spOworCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJd2FrZV91cF9wcm9jZXNzKHNlc3Npb24tPnRhc2spOwogCiB1bmxpbms6CiAJaGlkcF9kZWxfdGltZXIoc2Vzc2lvbik7CkBAIC0xMTExLDcgKzExMTQsOCBAQAogCQkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKIAkJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCk7CiAKLQkJCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwkJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJCQl3YWtlX3VwX3Byb2Nlc3Moc2Vzc2lvbi0+dGFzayk7CiAJCX0KIAl9IGVsc2UKIAkJZXJyID0gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmggYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCmluZGV4IDE5ZTk1MDAuLmFmMWJjYzggMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaApAQCAtMTQyLDYgKzE0Miw3IEBACiAJdWludCBjdHJsX210dTsKIAl1aW50IGludHJfbXR1OwogCisJYXRvbWljX3QgdGVybWluYXRlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAogCXVuc2lnbmVkIGNoYXIga2V5c1s4XTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKaW5kZXggYTg2ZjliYS4uNzcwNWUyNiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKQEAgLTYyMCw3ICs2MjAsOCBAQAogCQkJCQlzdHJ1Y3Qgc29jayAqcGFyZW50ID0gYnRfc2soc2spLT5wYXJlbnQ7CiAJCQkJCXJzcC5yZXN1bHQgPSBjcHVfdG9fbGUxNihMMkNBUF9DUl9QRU5EKTsKIAkJCQkJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KEwyQ0FQX0NTX0FVVEhPUl9QRU5EKTsKLQkJCQkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CisJCQkJCWlmIChwYXJlbnQpCisJCQkJCQlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKIAogCQkJCX0gZWxzZSB7CiAJCQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKQEAgLTkwNiw3ICs5MDcsNyBAQAogCQlpZiAoYy0+cHNtID09IHBzbSkgewogCQkJLyogRXhhY3QgbWF0Y2guICovCiAJCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgc3JjKSkgewotCQkJCXJlYWRfdW5sb2NrX2JoKCZjaGFuX2xpc3RfbG9jayk7CisJCQkJcmVhZF91bmxvY2soJmNoYW5fbGlzdF9sb2NrKTsKIAkJCQlyZXR1cm4gYzsKIAkJCX0KIApAQCAtMjMyMyw3ICsyMzI0LDcgQEAKIAogCXNrID0gY2hhbi0+c2s7CiAKLQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTkZJRykgeworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09ORklHICYmIHNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNUMikgewogCQlzdHJ1Y3QgbDJjYXBfY21kX3JlaiByZWo7CiAKIAkJcmVqLnJlYXNvbiA9IGNwdV90b19sZTE2KDB4MDAwMik7CkBAIC0yMzM0LDcgKzIzMzUsNyBAQAogCiAJLyogUmVqZWN0IGlmIGNvbmZpZyBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLwogCWxlbiA9IGNtZF9sZW4gLSBzaXplb2YoKnJlcSk7Ci0JaWYgKGNoYW4tPmNvbmZfbGVuICsgbGVuID4gc2l6ZW9mKGNoYW4tPmNvbmZfcmVxKSkgeworCWlmIChsZW4gPCAwIHx8IGNoYW4tPmNvbmZfbGVuICsgbGVuID4gc2l6ZW9mKGNoYW4tPmNvbmZfcmVxKSkgewogCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05GX1JTUCwKIAkJCQlsMmNhcF9idWlsZF9jb25mX3JzcChjaGFuLCByc3AsCiAJCQkJCUwyQ0FQX0NPTkZfUkVKRUNULCBmbGFncyksIHJzcCk7CkBAIC00MDAyLDIxICs0MDAzLDMxIEBACiAJCQl9CiAJCX0gZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QyKSB7CiAJCQlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOwotCQkJX191MTYgcmVzdWx0OworCQkJX191MTYgcmVzLCBzdGF0OwogCiAJCQlpZiAoIXN0YXR1cykgewotCQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKLQkJCQlyZXN1bHQgPSBMMkNBUF9DUl9TVUNDRVNTOworCQkJCWlmIChidF9zayhzayktPmRlZmVyX3NldHVwKSB7CisJCQkJCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKKwkJCQkJcmVzID0gTDJDQVBfQ1JfUEVORDsKKwkJCQkJc3RhdCA9IEwyQ0FQX0NTX0FVVEhPUl9QRU5EOworCQkJCQlpZiAocGFyZW50KQorCQkJCQkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQkJCQlyZXMgPSBMMkNBUF9DUl9TVUNDRVNTOworCQkJCQlzdGF0ID0gTDJDQVBfQ1NfTk9fSU5GTzsKKwkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CiAJCQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIEhaIC8gMTApOwotCQkJCXJlc3VsdCA9IEwyQ0FQX0NSX1NFQ19CTE9DSzsKKwkJCQlyZXMgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7CisJCQkJc3RhdCA9IEwyQ0FQX0NTX05PX0lORk87CiAJCQl9CiAKIAkJCXJzcC5zY2lkICAgPSBjcHVfdG9fbGUxNihjaGFuLT5kY2lkKTsKIAkJCXJzcC5kY2lkICAgPSBjcHVfdG9fbGUxNihjaGFuLT5zY2lkKTsKLQkJCXJzcC5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXN1bHQpOwotCQkJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KEwyQ0FQX0NTX05PX0lORk8pOworCQkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KHJlcyk7CisJCQlyc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdCk7CiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjaGFuLT5pZGVudCwgTDJDQVBfQ09OTl9SU1AsCiAJCQkJCQkJc2l6ZW9mKHJzcCksICZyc3ApOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCmluZGV4IDE4ZGM5ODguLjgyNDgzMDMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCkBAIC00MTMsNiArNDEzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJbWVtc2V0KCZjaW5mbywgMCwgc2l6ZW9mKGNpbmZvKSk7CiAJCWNpbmZvLmhjaV9oYW5kbGUgPSBjaGFuLT5jb25uLT5oY29uLT5oYW5kbGU7CiAJCW1lbWNweShjaW5mby5kZXZfY2xhc3MsIGNoYW4tPmNvbm4tPmhjb24tPmRldl9jbGFzcywgMyk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwppbmRleCAzODZjZmFmLi4xYjEwNzI3IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCkBAIC03ODgsNiArNzg4LDcgQEAKIAogCQlsMmNhcF9zayA9IHJmY29tbV9waShzayktPmRsYy0+c2Vzc2lvbi0+c29jay0+c2s7CiAKKwkJbWVtc2V0KCZjaW5mbywgMCwgc2l6ZW9mKGNpbmZvKSk7CiAJCWNpbmZvLmhjaV9oYW5kbGUgPSBjb25uLT5oY29uLT5oYW5kbGU7CiAJCW1lbWNweShjaW5mby5kZXZfY2xhc3MsIGNvbm4tPmhjb24tPmRldl9jbGFzcywgMyk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc2NvLmMgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCmluZGV4IDQyZmRmZmQuLmNiNGZiNzggMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc2NvLmMKKysrIGIvbmV0L2JsdWV0b290aC9zY28uYwpAQCAtMzY5LDYgKzM2OSwxNSBAQAogCiAJY2FzZSBCVF9DT05ORUNURUQ6CiAJY2FzZSBCVF9DT05GSUc6CisJCWlmIChzY29fcGkoc2spLT5jb25uKSB7CisJCQlzay0+c2tfc3RhdGUgPSBCVF9ESVNDT05OOworCQkJc2NvX3NvY2tfc2V0X3RpbWVyKHNrLCBTQ09fRElTQ09OTl9USU1FT1VUKTsKKwkJCWhjaV9jb25uX3B1dChzY29fcGkoc2spLT5jb25uLT5oY29uKTsKKwkJCXNjb19waShzayktPmNvbm4tPmhjb24gPSBOVUxMOworCQl9IGVsc2UKKwkJCXNjb19jaGFuX2RlbChzaywgRUNPTk5SRVNFVCk7CisJCWJyZWFrOworCiAJY2FzZSBCVF9DT05ORUNUOgogCWNhc2UgQlRfRElTQ09OTjoKIAkJc2NvX2NoYW5fZGVsKHNrLCBFQ09OTlJFU0VUKTsKQEAgLTgxOSw3ICs4MjgsOSBAQAogCQljb25uLT5zayA9IE5VTEw7CiAJCXNjb19waShzayktPmNvbm4gPSBOVUxMOwogCQlzY29fY29ubl91bmxvY2soY29ubik7Ci0JCWhjaV9jb25uX3B1dChjb25uLT5oY29uKTsKKworCQlpZiAoY29ubi0+aGNvbikKKwkJCWhjaV9jb25uX3B1dChjb25uLT5oY29uKTsKIAl9CiAKIAlzay0+c2tfc3RhdGUgPSBCVF9DTE9TRUQ7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCBhNmIyZjg2Li4zMmI4ZjlmIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jCisrKyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKQEAgLTQ5LDcgKzQ5LDkgQEAKIAlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpCisJCWJyX2Zsb29kX2RlbGl2ZXIoYnIsIHNrYik7CisJZWxzZSBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKIAkJaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyhkZXYpKSkgewogCQkJYnJfZmxvb2RfZGVsaXZlcihiciwgc2tiKTsKIAkJCWdvdG8gb3V0OwpAQCAtMjQzLDYgKzI0NSw3IEBACiAJCWdvdG8gb3V0OwogCiAJbnAtPmRldiA9IHAtPmRldjsKKwlzdHJsY3B5KG5wLT5kZXZfbmFtZSwgcC0+ZGV2LT5uYW1lLCBJRk5BTVNJWik7CiAKIAllcnIgPSBfX25ldHBvbGxfc2V0dXAobnApOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwppbmRleCBmM2FjMWU4Li5mMDZlZTM5IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCkBAIC02MCw3ICs2MCw3IEBACiAJYnIgPSBwLT5icjsKIAlicl9mZGJfdXBkYXRlKGJyLCBwLCBldGhfaGRyKHNrYiktPmhfc291cmNlKTsKIAotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSAmJgorCWlmICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkgJiYgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgJiYKIAkgICAgYnJfbXVsdGljYXN0X3JjdihiciwgcCwgc2tiKSkKIAkJZ290byBkcm9wOwogCkBAIC03Nyw3ICs3Nyw5IEBACiAKIAlkc3QgPSBOVUxMOwogCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKQorCQlza2IyID0gc2tiOworCWVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CiAJCW1kc3QgPSBicl9tZGJfZ2V0KGJyLCBza2IpOwogCQlpZiAobWRzdCB8fCBCUl9JTlBVVF9TS0JfQ0JfTVJPVVRFUlNfT05MWShza2IpKSB7CiAJCQlpZiAoKG1kc3QgJiYgbWRzdC0+bWdsaXN0KSB8fApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYyBiL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKaW5kZXggMmYxNGVhZi4uMmQ4NWNhNyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYworKysgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCkBAIC0xMzc5LDggKzEzNzksMTEgQEAKIAlpZiAodW5saWtlbHkoaXBfZmFzdF9jc3VtKCh1OCAqKWlwaCwgaXBoLT5paGwpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX0lHTVApCisJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JR01QKSB7CisJCWlmICgoaXBoLT5kYWRkciAmIElHTVBfTE9DQUxfR1JPVVBfTUFTSykgIT0gSUdNUF9MT0NBTF9HUk9VUCkKKwkJCUJSX0lOUFVUX1NLQl9DQihza2IpLT5tcm91dGVyc19vbmx5ID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBsZW4gfHwgbGVuIDwgaXBfaGRybGVuKHNrYikpCkBAIC0xNDI0LDcgKzE0MjcsNyBAQAogCXN3aXRjaCAoaWgtPnR5cGUpIHsKIAljYXNlIElHTVBfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDoKIAljYXNlIElHTVBWMl9IT1NUX01FTUJFUlNISVBfUkVQT1JUOgotCQlCUl9JTlBVVF9TS0JfQ0Ioc2tiMiktPm1yb3V0ZXJzX29ubHkgPSAxOworCQlCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+bXJvdXRlcnNfb25seSA9IDE7CiAJCWVyciA9IGJyX2lwNF9tdWx0aWNhc3RfYWRkX2dyb3VwKGJyLCBwb3J0LCBpaC0+Z3JvdXApOwogCQlicmVhazsKIAljYXNlIElHTVBWM19IT1NUX01FTUJFUlNISVBfUkVQT1JUOgpAQCAtMTU0Myw3ICsxNTQ2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCW1sZCA9IChzdHJ1Y3QgbWxkX21zZyAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYjIpOwotCQlCUl9JTlBVVF9TS0JfQ0Ioc2tiMiktPm1yb3V0ZXJzX29ubHkgPSAxOworCQlCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+bXJvdXRlcnNfb25seSA9IDE7CiAJCWVyciA9IGJyX2lwNl9tdWx0aWNhc3RfYWRkX2dyb3VwKGJyLCBwb3J0LCAmbWxkLT5tbGRfbWNhKTsKIAkJYnJlYWs7CiAJICAgIH0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCmluZGV4IDNmYTEyMzEuLjU2MTQ5ZWMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwpAQCAtMTA0LDEwICsxMDQsMTYgQEAKIHsKIH0KIAorc3RhdGljIHUzMiAqZmFrZV9jb3dfbWV0cmljcyhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHVuc2lnbmVkIGxvbmcgb2xkKQoreworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IGRzdF9vcHMgZmFrZV9kc3Rfb3BzID0gewogCS5mYW1pbHkgPQkJQUZfSU5FVCwKIAkucHJvdG9jb2wgPQkJY3B1X3RvX2JlMTYoRVRIX1BfSVApLAogCS51cGRhdGVfcG10dSA9CQlmYWtlX3VwZGF0ZV9wbXR1LAorCS5jb3dfbWV0cmljcyA9CQlmYWtlX2Nvd19tZXRyaWNzLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmbXV4bC5jIGIvbmV0L2NhaWYvY2ZtdXhsLmMKaW5kZXggM2E2NmI4Yy4uYzIzOTc5ZSAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2ZtdXhsLmMKKysrIGIvbmV0L2NhaWYvY2ZtdXhsLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCiAJCWlmIChjZnNydmxfcGh5aWRfbWF0Y2gobGF5ZXIsIHBoeWlkKSAmJiBsYXllci0+Y3RybGNtZCkgewogCi0JCQlpZiAoKGN0cmwgPT0gX0NBSUZfQ1RSTENNRF9QSFlJRl9GTE9XX09GRl9JTkQgfHwKKwkJCWlmICgoY3RybCA9PSBfQ0FJRl9DVFJMQ01EX1BIWUlGX0RPV05fSU5EIHx8CiAJCQkJY3RybCA9PSBDQUlGX0NUUkxDTURfUkVNT1RFX1NIVVRET1dOX0lORCkgJiYKIAkJCQkJbGF5ZXItPmlkICE9IDApIHsKIApkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2hubF9uZXQuYyBiL25ldC9jYWlmL2NobmxfbmV0LmMKaW5kZXggNjQ5ZWJhYy4uYWRiYjQyNCAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2hubF9uZXQuYworKysgYi9uZXQvY2FpZi9jaG5sX25ldC5jCkBAIC0xMzksMTcgKzEzOSwxNCBAQAogCXN0cnVjdCBjaG5sX25ldCAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X25vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCAqX3RtcDsKLQkvKiBNYXkgYmUgY2FsbGVkIHdpdGggb3Igd2l0aG91dCBSVE5MIGxvY2sgaGVsZCAqLwotCWludCBpc2xvY2tlZCA9IHJ0bmxfaXNfbG9ja2VkKCk7Ci0JaWYgKCFpc2xvY2tlZCkKLQkJcnRubF9sb2NrKCk7CisKKwlydG5sX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9ub2RlLCBfdG1wLCAmY2hubF9uZXRfbGlzdCkgewogCQlkZXYgPSBsaXN0X2VudHJ5KGxpc3Rfbm9kZSwgc3RydWN0IGNobmxfbmV0LCBsaXN0X2ZpZWxkKTsKIAkJaWYgKGRldi0+c3RhdGUgPT0gQ0FJRl9TSFVURE9XTikKIAkJCWRldl9jbG9zZShkZXYtPm5ldGRldik7CiAJfQotCWlmICghaXNsb2NrZWQpCi0JCXJ0bmxfdW5sb2NrKCk7CisJcnRubF91bmxvY2soKTsKIH0KIHN0YXRpYyBERUNMQVJFX1dPUksoY2xvc2Vfd29ya2VyLCBjbG9zZV93b3JrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvY2VwaF9mcy5jIGIvbmV0L2NlcGgvY2VwaF9mcy5jCmluZGV4IGEzYTNhMzEuLjQxNDY2Y2MgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL2NlcGhfZnMuYworKysgYi9uZXQvY2VwaC9jZXBoX2ZzLmMKQEAgLTM2LDE2ICszNiwxOSBAQAogCWlmICgoZmxhZ3MgJiBPX0RJUkVDVE9SWSkgPT0gT19ESVJFQ1RPUlkpCiAJCXJldHVybiBDRVBIX0ZJTEVfTU9ERV9QSU47CiAjZW5kaWYKLQlpZiAoKGZsYWdzICYgT19BUFBFTkQpID09IE9fQVBQRU5EKQotCQlmbGFncyB8PSBPX1dST05MWTsKIAotCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikKLQkJbW9kZSA9IENFUEhfRklMRV9NT0RFX1JEV1I7Ci0JZWxzZSBpZiAoKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSkKKwlzd2l0Y2ggKGZsYWdzICYgT19BQ0NNT0RFKSB7CisJY2FzZSBPX1dST05MWToKIAkJbW9kZSA9IENFUEhfRklMRV9NT0RFX1dSOwotCWVsc2UKKwkJYnJlYWs7CisJY2FzZSBPX1JET05MWToKIAkJbW9kZSA9IENFUEhfRklMRV9NT0RFX1JEOwotCisJCWJyZWFrOworCWNhc2UgT19SRFdSOgorCWNhc2UgT19BQ0NNT0RFOiAvKiB0aGlzIGlzIHdoYXQgdGhlIFZGUyBkb2VzICovCisJCW1vZGUgPSBDRVBIX0ZJTEVfTU9ERV9SRFdSOworCQlicmVhazsKKwl9CiAjaWZkZWYgT19MQVpZCiAJaWYgKGZsYWdzICYgT19MQVpZKQogCQltb2RlIHw9IENFUEhfRklMRV9NT0RFX0xBWlk7CmRpZmYgLS1naXQgYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMgYi9uZXQvY2VwaC9vc2RfY2xpZW50LmMKaW5kZXggNmVhMmI4OS4uNzMzMGMyNyAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvb3NkX2NsaWVudC5jCisrKyBiL25ldC9jZXBoL29zZF9jbGllbnQuYwpAQCAtNDc3LDggKzQ3Nyw5IEBACiAJY2FsY19sYXlvdXQob3NkYywgdmlubywgbGF5b3V0LCBvZmYsIHBsZW4sIHJlcSwgb3BzKTsKIAlyZXEtPnJfZmlsZV9sYXlvdXQgPSAqbGF5b3V0OyAgLyoga2VlcCBhIGNvcHkgKi8KIAotCS8qIGluIGNhc2UgaXQgZGlmZmVycyBmcm9tIG5hdHVyYWwgYWxpZ25tZW50IHRoYXQgY2FsY19sYXlvdXQKLQkgICBmaWxsZWQgaW4gZm9yIHVzICovCisJLyogaW4gY2FzZSBpdCBkaWZmZXJzIGZyb20gbmF0dXJhbCAoZmlsZSkgYWxpZ25tZW50IHRoYXQKKwkgICBjYWxjX2xheW91dCBmaWxsZWQgaW4gZm9yIHVzICovCisJcmVxLT5yX251bV9wYWdlcyA9IGNhbGNfcGFnZXNfZm9yKHBhZ2VfYWxpZ24sICpwbGVuKTsKIAlyZXEtPnJfcGFnZV9hbGlnbm1lbnQgPSBwYWdlX2FsaWduOwogCiAJY2VwaF9vc2RjX2J1aWxkX3JlcXVlc3QocmVxLCBvZmYsIHBsZW4sIG9wcywKQEAgLTExNDQsNiArMTE0NSwxMyBAQAogCQkJICAgICAgcm91bmRfamlmZmllc19yZWxhdGl2ZShkZWxheSkpOwogfQogCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9yZXF1ZXN0KHN0cnVjdCBjZXBoX29zZF9yZXF1ZXN0ICpyZXEpCit7CisJaWYgKHJlcS0+cl9zYWZlX2NhbGxiYWNrKQorCQlyZXEtPnJfc2FmZV9jYWxsYmFjayhyZXEsIE5VTEwpOworCWNvbXBsZXRlX2FsbCgmcmVxLT5yX3NhZmVfY29tcGxldGlvbik7ICAvKiBmc3luYyB3YWl0ZXIgKi8KK30KKwogLyoKICAqIGhhbmRsZSBvc2Qgb3AgcmVwbHkuICBlaXRoZXIgY2FsbCB0aGUgY2FsbGJhY2sgaWYgaXQgaXMgc3BlY2lmaWVkLAogICogb3IgZG8gdGhlIGNvbXBsZXRpb24gdG8gd2FrZSB1cCB0aGUgd2FpdGluZyB0aHJlYWQuCkBAIC0xMjI2LDExICsxMjM0LDggQEAKIAllbHNlCiAJCWNvbXBsZXRlX2FsbCgmcmVxLT5yX2NvbXBsZXRpb24pOwogCi0JaWYgKGZsYWdzICYgQ0VQSF9PU0RfRkxBR19PTkRJU0spIHsKLQkJaWYgKHJlcS0+cl9zYWZlX2NhbGxiYWNrKQotCQkJcmVxLT5yX3NhZmVfY2FsbGJhY2socmVxLCBtc2cpOwotCQljb21wbGV0ZV9hbGwoJnJlcS0+cl9zYWZlX2NvbXBsZXRpb24pOyAgLyogZnN5bmMgd2FpdGVyICovCi0JfQorCWlmIChmbGFncyAmIENFUEhfT1NEX0ZMQUdfT05ESVNLKQorCQljb21wbGV0ZV9yZXF1ZXN0KHJlcSk7CiAKIGRvbmU6CiAJZG91dCgicmVxPSVwIHJlcS0+cl9saW5nZXI9JWRcbiIsIHJlcSwgcmVxLT5yX2xpbmdlcik7CkBAIC0xNzMyLDYgKzE3MzcsNyBAQAogCQlfX2NhbmNlbF9yZXF1ZXN0KHJlcSk7CiAJCV9fdW5yZWdpc3Rlcl9yZXF1ZXN0KG9zZGMsIHJlcSk7CiAJCW11dGV4X3VubG9jaygmb3NkYy0+cmVxdWVzdF9tdXRleCk7CisJCWNvbXBsZXRlX3JlcXVlc3QocmVxKTsKIAkJZG91dCgid2FpdF9yZXF1ZXN0IHRpZCAlbGx1IGNhbmNlbGVkL3RpbWVkIG91dFxuIiwgcmVxLT5yX3RpZCk7CiAJCXJldHVybiByYzsKIAl9CkBAIC0yMDIyLDggKzIwMjgsOSBAQAogCQlpbnQgd2FudCA9IGNhbGNfcGFnZXNfZm9yKHJlcS0+cl9wYWdlX2FsaWdubWVudCwgZGF0YV9sZW4pOwogCiAJCWlmICh1bmxpa2VseShyZXEtPnJfbnVtX3BhZ2VzIDwgd2FudCkpIHsKLQkJCXByX3dhcm5pbmcoInRpZCAlbGxkIHJlcGx5ICVkID4gZXhwZWN0ZWQgJWQgcGFnZXNcbiIsCi0JCQkJICAgdGlkLCB3YW50LCBtLT5ucl9wYWdlcyk7CisJCQlwcl93YXJuaW5nKCJ0aWQgJWxsZCByZXBseSBoYXMgJWQgYnl0ZXMgJWQgcGFnZXMsIHdlIgorCQkJCSAgICIgaGFkIG9ubHkgJWQgcGFnZXMgcmVhZHlcbiIsIHRpZCwgZGF0YV9sZW4sCisJCQkJICAgd2FudCwgcmVxLT5yX251bV9wYWdlcyk7CiAJCQkqc2tpcCA9IDE7CiAJCQljZXBoX21zZ19wdXQobSk7CiAJCQltID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggYzdlMzA1ZC4uOWM1OGMxZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTIwOTYsNiArMjA5Niw3IEBACiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBkZXYtPm5ldGRldl9vcHM7CiAJaW50IHJjID0gTkVUREVWX1RYX09LOworCXVuc2lnbmVkIGludCBza2JfbGVuOwogCiAJaWYgKGxpa2VseSghc2tiLT5uZXh0KSkgewogCQl1MzIgZmVhdHVyZXM7CkBAIC0yMTQ2LDggKzIxNDcsOSBAQAogCQkJfQogCQl9CiAKKwkJc2tiX2xlbiA9IHNrYi0+bGVuOwogCQlyYyA9IG9wcy0+bmRvX3N0YXJ0X3htaXQoc2tiLCBkZXYpOwotCQl0cmFjZV9uZXRfZGV2X3htaXQoc2tiLCByYyk7CisJCXRyYWNlX25ldF9kZXZfeG1pdChza2IsIHJjLCBkZXYsIHNrYl9sZW4pOwogCQlpZiAocmMgPT0gTkVUREVWX1RYX09LKQogCQkJdHhxX3RyYW5zX3VwZGF0ZSh0eHEpOwogCQlyZXR1cm4gcmM7CkBAIC0yMTY3LDggKzIxNjksOSBAQAogCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX1hNSVRfRFNUX1JFTEVBU0UpCiAJCQlza2JfZHN0X2Ryb3AobnNrYik7CiAKKwkJc2tiX2xlbiA9IG5za2ItPmxlbjsKIAkJcmMgPSBvcHMtPm5kb19zdGFydF94bWl0KG5za2IsIGRldik7Ci0JCXRyYWNlX25ldF9kZXZfeG1pdChuc2tiLCByYyk7CisJCXRyYWNlX25ldF9kZXZfeG1pdChuc2tiLCByYywgZGV2LCBza2JfbGVuKTsKIAkJaWYgKHVubGlrZWx5KHJjICE9IE5FVERFVl9UWF9PSykpIHsKIAkJCWlmIChyYyAmIH5ORVRERVZfVFhfTUFTSykKIAkJCQlnb3RvIG91dF9rZnJlZV9nc29fc2tiOwpAQCAtMzExMSw3ICszMTE0LDcgQEAKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7Ci0Jc2tiLT5tYWNfbGVuID0gc2tiLT5uZXR3b3JrX2hlYWRlciAtIHNrYi0+bWFjX2hlYWRlcjsKKwlza2JfcmVzZXRfbWFjX2xlbihza2IpOwogCiAJcHRfcHJldiA9IE5VTEw7CiAKQEAgLTYxNzUsNiArNjE3OCwxMSBAQAogCQlvbGRzZC0+b3V0cHV0X3F1ZXVlID0gTlVMTDsKIAkJb2xkc2QtPm91dHB1dF9xdWV1ZV90YWlscCA9ICZvbGRzZC0+b3V0cHV0X3F1ZXVlOwogCX0KKwkvKiBBcHBlbmQgTkFQSSBwb2xsIGxpc3QgZnJvbSBvZmZsaW5lIENQVS4gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJm9sZHNkLT5wb2xsX2xpc3QpKSB7CisJCWxpc3Rfc3BsaWNlX2luaXQoJm9sZHNkLT5wb2xsX2xpc3QsICZzZC0+cG9sbF9saXN0KTsKKwkJcmFpc2Vfc29mdGlycV9pcnFvZmYoTkVUX1JYX1NPRlRJUlEpOworCX0KIAogCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKE5FVF9UWF9TT0ZUSVJRKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC02MjYxLDI5ICs2MjY5LDIzIEBACiAvKioKICAqCW5ldGRldl9kcml2ZXJuYW1lIC0gbmV0d29yayBkcml2ZXIgZm9yIHRoZSBkZXZpY2UKICAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCi0gKglAYnVmZmVyOiBidWZmZXIgZm9yIHJlc3VsdGluZyBuYW1lCi0gKglAbGVuOiBzaXplIG9mIGJ1ZmZlcgogICoKICAqCURldGVybWluZSBuZXR3b3JrIGRyaXZlciBmb3IgZGV2aWNlLgogICovCi1jaGFyICpuZXRkZXZfZHJpdmVybmFtZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pCitjb25zdCBjaGFyICpuZXRkZXZfZHJpdmVybmFtZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CiAJY29uc3Qgc3RydWN0IGRldmljZSAqcGFyZW50OwotCi0JaWYgKGxlbiA8PSAwIHx8ICFidWZmZXIpCi0JCXJldHVybiBidWZmZXI7Ci0JYnVmZmVyWzBdID0gMDsKKwljb25zdCBjaGFyICplbXB0eSA9ICIiOwogCiAJcGFyZW50ID0gZGV2LT5kZXYucGFyZW50OwotCiAJaWYgKCFwYXJlbnQpCi0JCXJldHVybiBidWZmZXI7CisJCXJldHVybiBlbXB0eTsKIAogCWRyaXZlciA9IHBhcmVudC0+ZHJpdmVyOwogCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5uYW1lKQotCQlzdHJsY3B5KGJ1ZmZlciwgZHJpdmVyLT5uYW1lLCBsZW4pOwotCXJldHVybiBidWZmZXI7CisJCXJldHVybiBkcml2ZXItPm5hbWU7CisJcmV0dXJuIGVtcHR5OwogfQogCiBzdGF0aWMgaW50IF9fbmV0ZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKaW5kZXggOWNjY2EwMy4uNjEzNWYzNiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHN0LmMKKysrIGIvbmV0L2NvcmUvZHN0LmMKQEAgLTE5MCw3ICsxOTAsOCBAQAogCWRzdC0+bGFzdHVzZSA9IGppZmZpZXM7CiAJZHN0LT5mbGFncyA9IGZsYWdzOwogCWRzdC0+bmV4dCA9IE5VTEw7Ci0JZHN0X2VudHJpZXNfYWRkKG9wcywgMSk7CisJaWYgKCEoZmxhZ3MgJiBEU1RfTk9DT1VOVCkpCisJCWRzdF9lbnRyaWVzX2FkZChvcHMsIDEpOwogCXJldHVybiBkc3Q7CiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9hbGxvYyk7CkBAIC0yNDMsNyArMjQ0LDggQEAKIAkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CiAJfQogCi0JZHN0X2VudHJpZXNfYWRkKGRzdC0+b3BzLCAtMSk7CisJaWYgKCEoZHN0LT5mbGFncyAmIERTVF9OT0NPVU5UKSkKKwkJZHN0X2VudHJpZXNfYWRkKGRzdC0+b3BzLCAtMSk7CiAKIAlpZiAoZHN0LT5vcHMtPmRlc3Ryb3kpCiAJCWRzdC0+b3BzLT5kZXN0cm95KGRzdCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXQtc3lzZnMuYyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCmluZGV4IDExYjk4YmMuLjMzZDJhMWYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldC1zeXNmcy5jCisrKyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCkBAIC0xMTc5LDkgKzExNzksMTQgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgY29uc3Qgdm9pZCAqbmV0X2N1cnJlbnRfbnModm9pZCkKK3N0YXRpYyB2b2lkICpuZXRfZ3JhYl9jdXJyZW50X25zKHZvaWQpCiB7Ci0JcmV0dXJuIGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKwlzdHJ1Y3QgbmV0ICpucyA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKyNpZmRlZiBDT05GSUdfTkVUX05TCisJaWYgKG5zKQorCQlhdG9taWNfaW5jKCZucy0+cGFzc2l2ZSk7CisjZW5kaWYKKwlyZXR1cm4gbnM7CiB9CiAKIHN0YXRpYyBjb25zdCB2b2lkICpuZXRfaW5pdGlhbF9ucyh2b2lkKQpAQCAtMTE5NiwyMiArMTIwMSwxMyBAQAogCiBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgbmV0X25zX3R5cGVfb3BlcmF0aW9ucyA9IHsKIAkudHlwZSA9IEtPQkpfTlNfVFlQRV9ORVQsCi0JLmN1cnJlbnRfbnMgPSBuZXRfY3VycmVudF9ucywKKwkuZ3JhYl9jdXJyZW50X25zID0gbmV0X2dyYWJfY3VycmVudF9ucywKIAkubmV0bGlua19ucyA9IG5ldF9uZXRsaW5rX25zLAogCS5pbml0aWFsX25zID0gbmV0X2luaXRpYWxfbnMsCisJLmRyb3BfbnMgPSBuZXRfZHJvcF9ucywKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChuZXRfbnNfdHlwZV9vcGVyYXRpb25zKTsKIAotc3RhdGljIHZvaWQgbmV0X2tvYmpfbnNfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Ja29ial9uc19leGl0KEtPQkpfTlNfVFlQRV9ORVQsIG5ldCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMga29ial9uZXRfb3BzID0gewotCS5leGl0ID0gbmV0X2tvYmpfbnNfZXhpdCwKLX07Ci0KLQogI2lmZGVmIENPTkZJR19IT1RQTFVHCiBzdGF0aWMgaW50IG5ldGRldl91ZXZlbnQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQogewpAQCAtMTMzOSw2ICsxMzM1LDUgQEAKIGludCBuZXRkZXZfa29iamVjdF9pbml0KHZvaWQpCiB7CiAJa29ial9uc190eXBlX3JlZ2lzdGVyKCZuZXRfbnNfdHlwZV9vcGVyYXRpb25zKTsKLQlyZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZrb2JqX25ldF9vcHMpOwogCXJldHVybiBjbGFzc19yZWdpc3RlcigmbmV0X2NsYXNzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwppbmRleCA2YzZiODZkLi5lYTQ4OWRiIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKKysrIGIvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAlMSVNUX0hFQUQobmV0X2V4aXRfbGlzdCk7CiAKIAlhdG9taWNfc2V0KCZuZXQtPmNvdW50LCAxKTsKKwlhdG9taWNfc2V0KCZuZXQtPnBhc3NpdmUsIDEpOwogCiAjaWZkZWYgTkVUTlNfUkVGQ05UX0RFQlVHCiAJYXRvbWljX3NldCgmbmV0LT51c2VfY291bnQsIDApOwpAQCAtMjEwLDYgKzIxMSwxMyBAQAogCWttZW1fY2FjaGVfZnJlZShuZXRfY2FjaGVwLCBuZXQpOwogfQogCit2b2lkIG5ldF9kcm9wX25zKHZvaWQgKnApCit7CisJc3RydWN0IG5ldCAqbnMgPSBwOworCWlmIChucyAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZucy0+cGFzc2l2ZSkpCisJCW5ldF9mcmVlKG5zKTsKK30KKwogc3RydWN0IG5ldCAqY29weV9uZXRfbnModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IG5ldCAqb2xkX25ldCkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CkBAIC0yMzAsNyArMjM4LDcgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZuZXRfbXV0ZXgpOwogCWlmIChydiA8IDApIHsKLQkJbmV0X2ZyZWUobmV0KTsKKwkJbmV0X2Ryb3BfbnMobmV0KTsKIAkJcmV0dXJuIEVSUl9QVFIocnYpOwogCX0KIAlyZXR1cm4gbmV0OwpAQCAtMjg2LDcgKzI5NCw3IEBACiAJLyogRmluYWxseSBpdCBpcyBzYWZlIHRvIGZyZWUgbXkgbmV0d29yayBuYW1lc3BhY2Ugc3RydWN0dXJlICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5ldCwgdG1wLCAmbmV0X2V4aXRfbGlzdCwgZXhpdF9saXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJm5ldC0+ZXhpdF9saXN0KTsKLQkJbmV0X2ZyZWUobmV0KTsKKwkJbmV0X2Ryb3BfbnMobmV0KTsKIAl9CiB9CiBzdGF0aWMgREVDTEFSRV9XT1JLKG5ldF9jbGVhbnVwX3dvcmssIGNsZWFudXBfbmV0KTsKQEAgLTMxMCwxOSArMzE4LDE3IEBACiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IG5ldCAqbmV0OwogCi0JbmV0ID0gRVJSX1BUUigtRUlOVkFMKTsKIAlmaWxlID0gcHJvY19uc19mZ2V0KGZkKTsKLQlpZiAoIWZpbGUpCi0JCWdvdG8gb3V0OworCWlmIChJU19FUlIoZmlsZSkpCisJCXJldHVybiBFUlJfQ0FTVChmaWxlKTsKIAogCWVpID0gUFJPQ19JKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQlpZiAoZWktPm5zX29wcyAhPSAmbmV0bnNfb3BlcmF0aW9ucykKLQkJZ290byBvdXQ7CisJaWYgKGVpLT5uc19vcHMgPT0gJm5ldG5zX29wZXJhdGlvbnMpCisJCW5ldCA9IGdldF9uZXQoZWktPm5zKTsKKwllbHNlCisJCW5ldCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAKLQluZXQgPSBnZXRfbmV0KGVpLT5ucyk7Ci1vdXQ6Ci0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7CisJZnB1dChmaWxlKTsKIAlyZXR1cm4gbmV0OwogfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRwb2xsLmMgYi9uZXQvY29yZS9uZXRwb2xsLmMKaW5kZXggMmQ3ZDZkNC4uMThkOWNiZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0cG9sbC5jCisrKyBiL25ldC9jb3JlL25ldHBvbGwuYwpAQCAtNzkyLDYgKzc5MiwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAobmRldi0+bWFzdGVyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGlzIGEgc2xhdmUgZGV2aWNlLCBhYm9ydGluZy5cbiIsCisJCSAgICAgICBucC0+bmFtZSwgbnAtPmRldl9uYW1lKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIHB1dDsKKwl9CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpIHsKIAkJdW5zaWduZWQgbG9uZyBhdG1vc3QsIGF0bGVhc3Q7CiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L25sLXBoeS5jIGIvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMKaW5kZXggZWQwZWFiMy4uMDI1NDhiMiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMKKysrIGIvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmICghYnVmKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmbmw4MDIxNTRfZmFtaWx5LCBmbGFncywKIAkJSUVFRTgwMjE1NF9MSVNUX1BIWSk7CkBAIC02NSw2ICs2NSw3IEBACiAJCQkJcGFnZXMgKiBzaXplb2YodWludDMyX3QpLCBidWYpOwogCiAJbXV0ZXhfdW5sb2NrKCZwaHktPnBpYl9sb2NrKTsKKwlrZnJlZShidWYpOwogCXJldHVybiBnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIG5sYV9wdXRfZmFpbHVyZToKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCBjYzE0NjMxLi5lZjE1MjhhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC00NjUsNiArNDY1LDExIEBACiAJaWYgKGFkZHJfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCiAJCWdvdG8gb3V0OwogCisJaWYgKGFkZHItPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQllcnIgPSAtRUFGTk9TVVBQT1JUOworCQlnb3RvIG91dDsKKwl9CisKIAljaGtfYWRkcl9yZXQgPSBpbmV0X2FkZHJfdHlwZShzb2NrX25ldChzayksIGFkZHItPnNpbl9hZGRyLnNfYWRkcik7CiAKIAkvKiBOb3Qgc3BlY2lmaWVkIGJ5IGFueSBzdGFuZGFyZCBwZXItc2UsIGhvd2V2ZXIgaXQgYnJlYWtzIHRvbwpAQCAtNjczLDYgKzY3OCw3IEBACiAKIAlsb2NrX3NvY2soc2syKTsKIAorCXNvY2tfcnBzX3JlY29yZF9mbG93KHNrMik7CiAJV0FSTl9PTighKCgxIDw8IHNrMi0+c2tfc3RhdGUpICYKIAkJICAoVENQRl9FU1RBQkxJU0hFRCB8IFRDUEZfQ0xPU0VfV0FJVCB8IFRDUEZfQ0xPU0UpKSk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfZGlhZy5jIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKaW5kZXggNmZmZTk0Yy4uMzI2N2QzOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKQEAgLTQzNyw3ICs0MzcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWlmIChjYyA9PSBsZW4pCiAJCQlyZXR1cm4gMTsKLQkJaWYgKG9wLT55ZXMgPCA0KQorCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyAmIDMpCiAJCQlyZXR1cm4gMDsKIAkJbGVuIC09IG9wLT55ZXM7CiAJCWJjICArPSBvcC0+eWVzOwpAQCAtNDQ3LDExICs0NDcsMTEgQEAKIAogc3RhdGljIGludCBpbmV0X2RpYWdfYmNfYXVkaXQoY29uc3Qgdm9pZCAqYnl0ZWNvZGUsIGludCBieXRlY29kZV9sZW4pCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYmMgPSBieXRlY29kZTsKKwljb25zdCB2b2lkICpiYyA9IGJ5dGVjb2RlOwogCWludCAgbGVuID0gYnl0ZWNvZGVfbGVuOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AgPSAoc3RydWN0IGluZXRfZGlhZ19iY19vcCAqKWJjOworCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCA9IGJjOwogCiAvL3ByaW50aygiQkM6ICVkICVkICVkIHslZH0gLyAlZFxuIiwgb3AtPmNvZGUsIG9wLT55ZXMsIG9wLT5ubywgb3BbMV0ubm8sIGxlbik7CiAJCXN3aXRjaCAob3AtPmNvZGUpIHsKQEAgLTQ2MiwyMiArNDYyLDIwIEBACiAJCWNhc2UgSU5FVF9ESUFHX0JDX1NfTEU6CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0RfR0U6CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0RfTEU6Ci0JCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyA+IGxlbiArIDQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0pNUDoKLQkJCWlmIChvcC0+bm8gPCA0IHx8IG9wLT5ubyA+IGxlbiArIDQpCisJCQlpZiAob3AtPm5vIDwgNCB8fCBvcC0+bm8gPiBsZW4gKyA0IHx8IG9wLT5ubyAmIDMpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAob3AtPm5vIDwgbGVuICYmCiAJCQkgICAgIXZhbGlkX2NjKGJ5dGVjb2RlLCBieXRlY29kZV9sZW4sIGxlbiAtIG9wLT5ubykpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKIAkJY2FzZSBJTkVUX0RJQUdfQkNfTk9QOgotCQkJaWYgKG9wLT55ZXMgPCA0IHx8IG9wLT55ZXMgPiBsZW4gKyA0KQotCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyA+IGxlbiArIDQgfHwgb3AtPnllcyAmIDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYmMgICs9IG9wLT55ZXM7CiAJCWxlbiAtPSBvcC0+eWVzOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX29wdGlvbnMuYyBiL25ldC9pcHY0L2lwX29wdGlvbnMuYwppbmRleCBjMzExOGUxLi5lYzkzMzM1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vcHRpb25zLmMKKysrIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pY21wLmg+CkBAIC0zNTAsNyArMzUxLDcgQEAKIAkJCQlnb3RvIGVycm9yOwogCQkJfQogCQkJaWYgKG9wdHB0clsyXSA8PSBvcHRsZW4pIHsKLQkJCQlfX2JlMzIgKnRpbWVwdHIgPSBOVUxMOworCQkJCXVuc2lnbmVkIGNoYXIgKnRpbWVwdHIgPSBOVUxMOwogCQkJCWlmIChvcHRwdHJbMl0rMyA+IG9wdHB0clsxXSkgewogCQkJCQlwcF9wdHIgPSBvcHRwdHIgKyAyOwogCQkJCQlnb3RvIGVycm9yOwpAQCAtMzU5LDcgKzM2MCw3IEBACiAJCQkJICAgICAgY2FzZSBJUE9QVF9UU19UU09OTFk6CiAJCQkJCW9wdC0+dHMgPSBvcHRwdHIgLSBpcGg7CiAJCQkJCWlmIChza2IpCi0JCQkJCQl0aW1lcHRyID0gKF9fYmUzMiopJm9wdHB0cltvcHRwdHJbMl0tMV07CisJCQkJCQl0aW1lcHRyID0gJm9wdHB0cltvcHRwdHJbMl0tMV07CiAJCQkJCW9wdC0+dHNfbmVlZHRpbWUgPSAxOwogCQkJCQlvcHRwdHJbMl0gKz0gNDsKIAkJCQkJYnJlYWs7CkBAIC0zNzEsNyArMzcyLDcgQEAKIAkJCQkJb3B0LT50cyA9IG9wdHB0ciAtIGlwaDsKIAkJCQkJaWYgKHJ0KSAgewogCQkJCQkJbWVtY3B5KCZvcHRwdHJbb3B0cHRyWzJdLTFdLCAmcnQtPnJ0X3NwZWNfZHN0LCA0KTsKLQkJCQkJCXRpbWVwdHIgPSAoX19iZTMyKikmb3B0cHRyW29wdHB0clsyXSszXTsKKwkJCQkJCXRpbWVwdHIgPSAmb3B0cHRyW29wdHB0clsyXSszXTsKIAkJCQkJfQogCQkJCQlvcHQtPnRzX25lZWRhZGRyID0gMTsKIAkJCQkJb3B0LT50c19uZWVkdGltZSA9IDE7CkBAIC0zODksNyArMzkwLDcgQEAKIAkJCQkJCWlmIChpbmV0X2FkZHJfdHlwZShuZXQsIGFkZHIpID09IFJUTl9VTklDQVNUKQogCQkJCQkJCWJyZWFrOwogCQkJCQkJaWYgKHNrYikKLQkJCQkJCQl0aW1lcHRyID0gKF9fYmUzMiopJm9wdHB0cltvcHRwdHJbMl0rM107CisJCQkJCQkJdGltZXB0ciA9ICZvcHRwdHJbb3B0cHRyWzJdKzNdOwogCQkJCQl9CiAJCQkJCW9wdC0+dHNfbmVlZHRpbWUgPSAxOwogCQkJCQlvcHRwdHJbMl0gKz0gODsKQEAgLTQwMywxMCArNDA0LDEwIEBACiAJCQkJfQogCQkJCWlmICh0aW1lcHRyKSB7CiAJCQkJCXN0cnVjdCB0aW1lc3BlYyB0djsKLQkJCQkJX19iZTMyICBtaWR0aW1lOworCQkJCQl1MzIgIG1pZHRpbWU7CiAJCQkJCWdldG5zdGltZW9mZGF5KCZ0dik7Ci0JCQkJCW1pZHRpbWUgPSBodG9ubCgodHYudHZfc2VjICUgODY0MDApICogTVNFQ19QRVJfU0VDICsgdHYudHZfbnNlYyAvIE5TRUNfUEVSX01TRUMpOwotCQkJCQltZW1jcHkodGltZXB0ciwgJm1pZHRpbWUsIHNpemVvZihfX2JlMzIpKTsKKwkJCQkJbWlkdGltZSA9ICh0di50dl9zZWMgJSA4NjQwMCkgKiBNU0VDX1BFUl9TRUMgKyB0di50dl9uc2VjIC8gTlNFQ19QRVJfTVNFQzsKKwkJCQkJcHV0X3VuYWxpZ25lZF9iZTMyKG1pZHRpbWUsIHRpbWVwdHIpOwogCQkJCQlvcHQtPmlzX2NoYW5nZWQgPSAxOwogCQkJCX0KIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vdXRwdXQuYyBiL25ldC9pcHY0L2lwX291dHB1dC5jCmluZGV4IDk4YWYzNjkuLjg0ZjI2ZTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC03OTksOSArNzk5LDkgQEAKIAlpbnQgY3N1bW1vZGUgPSBDSEVDS1NVTV9OT05FOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKiljb3JrLT5kc3Q7CiAKLQlleHRoZHJsZW4gPSB0cmFuc2hkcmxlbiA/IHJ0LT5kc3QuaGVhZGVyX2xlbiA6IDA7Ci0JbGVuZ3RoICs9IGV4dGhkcmxlbjsKLQl0cmFuc2hkcmxlbiArPSBleHRoZHJsZW47CisJc2tiID0gc2tiX3BlZWtfdGFpbChxdWV1ZSk7CisKKwlleHRoZHJsZW4gPSAhc2tiID8gcnQtPmRzdC5oZWFkZXJfbGVuIDogMDsKIAltdHUgPSBjb3JrLT5mcmFnc2l6ZTsKIAogCWhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT5kc3QuZGV2KTsKQEAgLTgyNSwxMiArODI1LDEwIEBACiAJICAgICFleHRoZHJsZW4pCiAJCWNzdW1tb2RlID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAotCXNrYiA9IHNrYl9wZWVrX3RhaWwocXVldWUpOwotCiAJY29yay0+bGVuZ3RoICs9IGxlbmd0aDsKIAlpZiAoKChsZW5ndGggPiBtdHUpIHx8IChza2IgJiYgc2tiX2lzX2dzbyhza2IpKSkgJiYKIAkgICAgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgJiYKLQkgICAgKHJ0LT5kc3QuZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVUZPKSkgeworCSAgICAocnQtPmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pICYmICFydC0+ZHN0LmhlYWRlcl9sZW4pIHsKIAkJZXJyID0gaXBfdWZvX2FwcGVuZF9kYXRhKHNrLCBxdWV1ZSwgZ2V0ZnJhZywgZnJvbSwgbGVuZ3RoLAogCQkJCQkgaGhfbGVuLCBmcmFnaGVhZGVybGVuLCB0cmFuc2hkcmxlbiwKIAkJCQkJIG10dSwgZmxhZ3MpOwpAQCAtODgzLDE3ICs4ODEsMTYgQEAKIAkJCWVsc2UKIAkJCQlhbGxvY2xlbiA9IGZyYWdsZW47CiAKKwkJCWFsbG9jbGVuICs9IGV4dGhkcmxlbjsKKwogCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgZ2V0cyBhZGRpdGlvbmFsIHNwYWNlIGF0IHRhaWwuCiAJCQkgKiBOb3RlLCB3aXRoIE1TR19NT1JFIHdlIG92ZXJhbGxvY2F0ZSBvbiBmcmFnbWVudHMsCiAJCQkgKiBiZWNhdXNlIHdlIGhhdmUgbm8gaWRlYSB3aGF0IGZyYWdtZW50IHdpbGwgYmUKIAkJCSAqIHRoZSBsYXN0LgogCQkJICovCi0JCQlpZiAoZGF0YWxlbiA9PSBsZW5ndGggKyBmcmFnZ2FwKSB7CisJCQlpZiAoZGF0YWxlbiA9PSBsZW5ndGggKyBmcmFnZ2FwKQogCQkJCWFsbG9jbGVuICs9IHJ0LT5kc3QudHJhaWxlcl9sZW47Ci0JCQkJLyogbWFrZSBzdXJlIG10dSBpcyBub3QgcmVhY2hlZCAqLwotCQkJCWlmIChkYXRhbGVuID4gbXR1IC0gZnJhZ2hlYWRlcmxlbiAtIHJ0LT5kc3QudHJhaWxlcl9sZW4pCi0JCQkJCWRhdGFsZW4gLT0gQUxJR04ocnQtPmRzdC50cmFpbGVyX2xlbiwgOCk7Ci0JCQl9CisKIAkJCWlmICh0cmFuc2hkcmxlbikgewogCQkJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCiAJCQkJCQlhbGxvY2xlbiArIGhoX2xlbiArIDE1LApAQCAtOTI2LDExICs5MjMsMTEgQEAKIAkJCS8qCiAJCQkgKglGaW5kIHdoZXJlIHRvIHN0YXJ0IHB1dHRpbmcgYnl0ZXMuCiAJCQkgKi8KLQkJCWRhdGEgPSBza2JfcHV0KHNrYiwgZnJhZ2xlbik7CisJCQlkYXRhID0gc2tiX3B1dChza2IsIGZyYWdsZW4gKyBleHRoZHJsZW4pOwogCQkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIGV4dGhkcmxlbik7CiAJCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSAoc2tiLT5uZXR3b3JrX2hlYWRlciArCiAJCQkJCQkgZnJhZ2hlYWRlcmxlbik7Ci0JCQlkYXRhICs9IGZyYWdoZWFkZXJsZW47CisJCQlkYXRhICs9IGZyYWdoZWFkZXJsZW4gKyBleHRoZHJsZW47CiAKIAkJCWlmIChmcmFnZ2FwKSB7CiAJCQkJc2tiLT5jc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cygKQEAgLTEwNjQsNyArMTA2MSw3IEBACiAJICovCiAJKnJ0cCA9IE5VTEw7CiAJY29yay0+ZnJhZ3NpemUgPSBpbmV0LT5wbXR1ZGlzYyA9PSBJUF9QTVRVRElTQ19QUk9CRSA/Ci0JCQkgcnQtPmRzdC5kZXYtPm10dSA6IGRzdF9tdHUocnQtPmRzdC5wYXRoKTsKKwkJCSBydC0+ZHN0LmRldi0+bXR1IDogZHN0X210dSgmcnQtPmRzdCk7CiAJY29yay0+ZHN0ID0gJnJ0LT5kc3Q7CiAJY29yay0+bGVuZ3RoID0gMDsKIAljb3JrLT50eF9mbGFncyA9IGlwYy0+dHhfZmxhZ3M7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDQ2MTRiYWIuLjJlOTdlM2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0xNyw1MSArMTcsMzUgQEAKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCXN0cnVjdCBmbG93aTQgZmw0ID0ge307Ci0JdW5zaWduZWQgbG9uZyBvcmVmZHN0OworCV9fYmUzMiBzYWRkciA9IGlwaC0+c2FkZHI7CisJX191OCBmbGFncyA9IDA7CiAJdW5zaWduZWQgaW50IGhoX2xlbjsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKIAotCXR5cGUgPSBpbmV0X2FkZHJfdHlwZShuZXQsIGlwaC0+c2FkZHIpOwotCWlmIChza2ItPnNrICYmIGluZXRfc2soc2tiLT5zayktPnRyYW5zcGFyZW50KQotCQl0eXBlID0gUlROX0xPQ0FMOwotCWlmIChhZGRyX3R5cGUgPT0gUlROX1VOU1BFQykKLQkJYWRkcl90eXBlID0gdHlwZTsKKwlpZiAoIXNrYi0+c2sgJiYgYWRkcl90eXBlICE9IFJUTl9MT0NBTCkgeworCQlpZiAoYWRkcl90eXBlID09IFJUTl9VTlNQRUMpCisJCQlhZGRyX3R5cGUgPSBpbmV0X2FkZHJfdHlwZShuZXQsIHNhZGRyKTsKKwkJaWYgKGFkZHJfdHlwZSA9PSBSVE5fTE9DQUwgfHwgYWRkcl90eXBlID09IFJUTl9VTklDQVNUKQorCQkJZmxhZ3MgfD0gRkxPV0lfRkxBR19BTllTUkM7CisJCWVsc2UKKwkJCXNhZGRyID0gMDsKKwl9CiAKIAkvKiBzb21lIG5vbi1zdGFuZGFyZCBoYWNrcyBsaWtlIGlwdF9SRUpFQ1QuYzpzZW5kX3Jlc2V0KCkgY2FuIGNhdXNlCiAJICogcGFja2V0cyB3aXRoIGZvcmVpZ24gc2FkZHIgdG8gYXBwZWFyIG9uIHRoZSBORl9JTkVUX0xPQ0FMX09VVCBob29rLgogCSAqLwotCWlmIChhZGRyX3R5cGUgPT0gUlROX0xPQ0FMKSB7Ci0JCWZsNC5kYWRkciA9IGlwaC0+ZGFkZHI7Ci0JCWlmICh0eXBlID09IFJUTl9MT0NBTCkKLQkJCWZsNC5zYWRkciA9IGlwaC0+c2FkZHI7Ci0JCWZsNC5mbG93aTRfdG9zID0gUlRfVE9TKGlwaC0+dG9zKTsKLQkJZmw0LmZsb3dpNF9vaWYgPSBza2ItPnNrID8gc2tiLT5zay0+c2tfYm91bmRfZGV2X2lmIDogMDsKLQkJZmw0LmZsb3dpNF9tYXJrID0gc2tiLT5tYXJrOwotCQlmbDQuZmxvd2k0X2ZsYWdzID0gc2tiLT5zayA/IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2tiLT5zaykgOiAwOwotCQlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0KTsKLQkJaWYgKElTX0VSUihydCkpCi0JCQlyZXR1cm4gLTE7CisJZmw0LmRhZGRyID0gaXBoLT5kYWRkcjsKKwlmbDQuc2FkZHIgPSBzYWRkcjsKKwlmbDQuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CisJZmw0LmZsb3dpNF9vaWYgPSBza2ItPnNrID8gc2tiLT5zay0+c2tfYm91bmRfZGV2X2lmIDogMDsKKwlmbDQuZmxvd2k0X21hcmsgPSBza2ItPm1hcms7CisJZmw0LmZsb3dpNF9mbGFncyA9IHNrYi0+c2sgPyBpbmV0X3NrX2Zsb3dpX2ZsYWdzKHNrYi0+c2spIDogZmxhZ3M7CisJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJmZsNCk7CisJaWYgKElTX0VSUihydCkpCisJCXJldHVybiAtMTsKIAotCQkvKiBEcm9wIG9sZCByb3V0ZS4gKi8KLQkJc2tiX2RzdF9kcm9wKHNrYik7Ci0JCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwotCX0gZWxzZSB7Ci0JCS8qIG5vbi1sb2NhbCBzcmMsIGZpbmQgdmFsaWQgaWlmIHRvIHNhdGlzZnkKLQkJICogcnAtZmlsdGVyIHdoZW4gY2FsbGluZyBpcF9yb3V0ZV9pbnB1dC4gKi8KLQkJZmw0LmRhZGRyID0gaXBoLT5zYWRkcjsKLQkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJmZsNCk7Ci0JCWlmIChJU19FUlIocnQpKQotCQkJcmV0dXJuIC0xOwotCi0JCW9yZWZkc3QgPSBza2ItPl9za2JfcmVmZHN0OwotCQlpZiAoaXBfcm91dGVfaW5wdXQoc2tiLCBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLAotCQkJCSAgIFJUX1RPUyhpcGgtPnRvcyksIHJ0LT5kc3QuZGV2KSAhPSAwKSB7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwotCQlyZWZkc3RfZHJvcChvcmVmZHN0KTsKLQl9CisJLyogRHJvcCBvbGQgcm91dGUuICovCisJc2tiX2RzdF9kcm9wKHNrYik7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAlpZiAoc2tiX2RzdChza2IpLT5lcnJvcikKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwppbmRleCBkMmMxMzExLi41YzliOWQ5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpAQCAtMjAzLDcgKzIwMyw4IEBACiAJZWxzZQogCQlwbXNnLT5vdXRkZXZfbmFtZVswXSA9ICdcMCc7CiAKLQlpZiAoZW50cnktPmluZGV2ICYmIGVudHJ5LT5za2ItPmRldikgeworCWlmIChlbnRyeS0+aW5kZXYgJiYgZW50cnktPnNrYi0+ZGV2ICYmCisJICAgIGVudHJ5LT5za2ItPm1hY19oZWFkZXIgIT0gZW50cnktPnNrYi0+bmV0d29ya19oZWFkZXIpIHsKIAkJcG1zZy0+aHdfdHlwZSA9IGVudHJ5LT5za2ItPmRldi0+dHlwZTsKIAkJcG1zZy0+aHdfYWRkcmxlbiA9IGRldl9wYXJzZV9oZWFkZXIoZW50cnktPnNrYiwKIAkJCQkJCSAgICBwbXNnLT5od19hZGRyKTsKQEAgLTQwMiw3ICs0MDMsOCBAQAogc3RhdGljIGlubGluZSB2b2lkCiBfX2lwcV9yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFncywgbmxtc2dsZW4sIHNrYmxlbjsKKwlpbnQgc3RhdHVzLCB0eXBlLCBwaWQsIGZsYWdzOworCXVuc2lnbmVkIGludCBubG1zZ2xlbiwgc2tibGVuOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCiAJc2tibGVuID0gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggNzY0NzQzOC4uMjRlNTU2ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtNTY2LDcgKzU2Niw3IEBACiAJY29uc3Qgc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqdDsKIAogCWlmICghaXBfY2hlY2tlbnRyeSgmZS0+aXApKSB7Ci0JCWR1cHJpbnRmKCJpcCBjaGVjayBmYWlsZWQgJXAgJXMuXG4iLCBlLCBwYXItPm1hdGNoLT5uYW1lKTsKKwkJZHVwcmludGYoImlwIGNoZWNrIGZhaWxlZCAlcCAlcy5cbiIsIGUsIG5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCmluZGV4IGQ2MDlhYzMuLjVjOWU5N2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJICogZXJyb3IgbWVzc2FnZXMgKFJFTEFURUQpIGFuZCBpbmZvcm1hdGlvbiByZXF1ZXN0cyAoc2VlIGJlbG93KSAqLwogCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QICYmCiAJICAgIChjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCB8fAotCSAgICAgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpCisJICAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRF9SRVBMWSkpCiAJCXJldHVybiBYVF9DT05USU5VRTsKIAogCS8qIGlwX2Nvbm50cmFja19pY21wIGd1YXJhbnRlZXMgdXMgdGhhdCB3ZSBvbmx5IGhhdmUgSUNNUF9FQ0hPLApAQCAtMzIxLDEyICszMjEsMTIgQEAKIAkJCWN0LT5tYXJrID0gaGFzaDsKIAkJCWJyZWFrOwogCQljYXNlIElQX0NUX1JFTEFURUQ6Ci0JCWNhc2UgSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWToKKwkJY2FzZSBJUF9DVF9SRUxBVEVEX1JFUExZOgogCQkJLyogRklYTUU6IHdlIGRvbid0IGhhbmRsZSBleHBlY3RhdGlvbnMgYXQgdGhlCiAJCQkgKiBtb21lbnQuICB0aGV5IGNhbiBhcnJpdmUgb24gYSBkaWZmZXJlbnQgbm9kZSB0aGFuCiAJCQkgKiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gKGUuZy4gRlRQIHBhc3NpdmUgbW9kZSkgKi8KIAkJY2FzZSBJUF9DVF9FU1RBQkxJU0hFRDoKLQkJY2FzZSBJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWToKKwkJY2FzZSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWToKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCmluZGV4IGQyZWQ5ZGMuLjk5MzExNTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC02MCw3ICs2MCw3IEBACiAJbmF0ID0gbmZjdF9uYXQoY3QpOwogCiAJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8Ci0JCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOworCQkJICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSk7CiAKIAkvKiBTb3VyY2UgYWRkcmVzcyBpcyAwLjAuMC4wIC0gbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0IHRoYXQgaXMKIAkgKiBwcm9iYWJseSBub3Qgc3VwcG9zZWQgdG8gYmUgbWFzcXVlcmFkZWQuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwppbmRleCAxZmY3OWU1Li41MWYxM2Y4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKQEAgLTQwLDcgKzQwLDYgQEAKIAlzdHJ1Y3QgaXBoZHIgKm5pcGg7CiAJY29uc3Qgc3RydWN0IHRjcGhkciAqb3RoOwogCXN0cnVjdCB0Y3BoZHIgX290Y3BoLCAqdGNwaDsKLQl1bnNpZ25lZCBpbnQgYWRkcl90eXBlOwogCiAJLyogSVAgaGVhZGVyIGNoZWNrczogZnJhZ21lbnQuICovCiAJaWYgKGlwX2hkcihvbGRza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpCkBAIC01NSw2ICs1NCw5IEBACiAJaWYgKG90aC0+cnN0KQogCQlyZXR1cm47CiAKKwlpZiAoc2tiX3J0YWJsZShvbGRza2IpLT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVCB8IFJUQ0ZfTVVMVElDQVNUKSkKKwkJcmV0dXJuOworCiAJLyogQ2hlY2sgY2hlY2tzdW0gKi8KIAlpZiAobmZfaXBfY2hlY2tzdW0ob2xkc2tiLCBob29rLCBpcF9oZHJsZW4ob2xkc2tiKSwgSVBQUk9UT19UQ1ApKQogCQlyZXR1cm47CkBAIC0xMDEsMTkgKzEwMywxMSBAQAogCW5za2ItPmNzdW1fc3RhcnQgPSAodW5zaWduZWQgY2hhciAqKXRjcGggLSBuc2tiLT5oZWFkOwogCW5za2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOwogCi0JYWRkcl90eXBlID0gUlROX1VOU1BFQzsKLQlpZiAoaG9vayAhPSBORl9JTkVUX0ZPUldBUkQKLSNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgotCSAgICB8fCAobnNrYi0+bmZfYnJpZGdlICYmIG5za2ItPm5mX2JyaWRnZS0+bWFzayAmIEJSTkZfQlJJREdFRCkKLSNlbmRpZgotCSAgICkKLQkJYWRkcl90eXBlID0gUlROX0xPQ0FMOwotCiAJLyogaXBfcm91dGVfbWVfaGFyZGVyIGV4cGVjdHMgc2tiLT5kc3QgdG8gYmUgc2V0ICovCiAJc2tiX2RzdF9zZXRfbm9yZWYobnNrYiwgc2tiX2RzdChvbGRza2IpKTsKIAogCW5za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwotCWlmIChpcF9yb3V0ZV9tZV9oYXJkZXIobnNrYiwgYWRkcl90eXBlKSkKKwlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKG5za2IsIFJUTl9VTlNQRUMpKQogCQlnb3RvIGZyZWVfbnNrYjsKIAogCW5pcGgtPnR0bAk9IGlwNF9kc3RfaG9wbGltaXQoc2tiX2RzdChuc2tiKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwppbmRleCBhZjZlOWM3Li4yYjU3ZTUyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKQEAgLTI1LDcgKzI1LDggQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBtYXRjaF9pcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmVpbmZvKQogewotCXJldHVybiAoaXBfaGRyKHNrYiktPnRvcyAmIElQVF9FQ05fSVBfTUFTSykgPT0gZWluZm8tPmlwX2VjdDsKKwlyZXR1cm4gKChpcF9oZHIoc2tiKS0+dG9zICYgSVBUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0KSBeCisJICAgICAgICEhKGVpbmZvLT5pbnZlcnQgJiBJUFRfRUNOX09QX01BVENIX0lQKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIG1hdGNoX3RjcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNzYsOCArNzcsNiBAQAogCQkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikpIHsKLQkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKLQkJCXJldHVybiBmYWxzZTsKIAkJaWYgKCFtYXRjaF90Y3Aoc2tiLCBpbmZvLCAmcGFyLT5ob3Rkcm9wKSkKIAkJCXJldHVybiBmYWxzZTsKIAl9CkBAIC05Nyw3ICs5Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikgJiYKLQkgICAgaXAtPnByb3RvICE9IElQUFJPVE9fVENQKSB7CisJICAgIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKIAkJcHJfaW5mbygiY2Fubm90IG1hdGNoIFRDUCBiaXRzIGluIHJ1bGUgZm9yIG5vbi10Y3AgcGFja2V0c1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IDVhMDNjMDIuLmRlOWRhMjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAkvKiBUaGlzIGlzIHdoZXJlIHdlIGNhbGwgdGhlIGhlbHBlcjogYXMgdGhlIHBhY2tldCBnb2VzIG91dC4gKi8KIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwotCWlmICghY3QgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkKKwlpZiAoIWN0IHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKQogCQlnb3RvIG91dDsKIAogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwpAQCAtMTIxLDcgKzEyMSw5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHRlc3RfYml0KElQU19TRVFfQURKVVNUX0JJVCwgJmN0LT5zdGF0dXMpKSB7CisJLyogYWRqdXN0IHNlcXMgZm9yIGxvb3BiYWNrIHRyYWZmaWMgb25seSBpbiBvdXRnb2luZyBkaXJlY3Rpb24gKi8KKwlpZiAodGVzdF9iaXQoSVBTX1NFUV9BREpVU1RfQklULCAmY3QtPnN0YXR1cykgJiYKKwkgICAgIW5mX2lzX2xvb3BiYWNrX3BhY2tldChza2IpKSB7CiAJCXR5cGVvZihuZl9uYXRfc2VxX2FkanVzdF9ob29rKSBzZXFfYWRqdXN0OwogCiAJCXNlcV9hZGp1c3QgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3NlcV9hZGp1c3RfaG9vayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IDc0MDRiZGUuLmFiNWIyN2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkvKiBVcGRhdGUgc2tiIHRvIHJlZmVyIHRvIHRoaXMgY29ubmVjdGlvbiAqLwogCXNrYi0+bmZjdCA9ICZuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpLT5jdF9nZW5lcmFsOwogCXNrYi0+bmZjdGluZm8gPSAqY3RpbmZvOwotCXJldHVybiAtTkZfQUNDRVBUOworCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKIC8qIFNtYWxsIGFuZCBtb2RpZmllZCB2ZXJzaW9uIG9mIGljbXBfcmN2ICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDljNzFiMjcuLjMzNDZkZTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC00MzMsNyArNDMzLDcgQEAKIAogCS8qIE11c3QgYmUgUkVMQVRFRCAqLwogCU5GX0NUX0FTU0VSVChza2ItPm5mY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKLQkJICAgICBza2ItPm5mY3RpbmZvID09IElQX0NUX1JFTEFURUQrSVBfQ1RfSVNfUkVQTFkpOworCQkgICAgIHNrYi0+bmZjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRF9SRVBMWSk7CiAKIAkvKiBSZWRpcmVjdHMgb24gbm9uLW51bGwgbmF0cyBtdXN0IGJlIGRyb3BwZWQsIGVsc2UgdGhleSdsbAogCSAgIHN0YXJ0IHRhbGtpbmcgdG8gZWFjaCBvdGhlciB3aXRob3V0IG91ciB0cmFuc2xhdGlvbiwgYW5kIGJlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYwppbmRleCA5OWNmYTI4Li5lYmM1Zjg4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJaWYgKCEocnQtPnJ0X2ZsYWdzICYgUlRDRl9MT0NBTCkgJiYKLQkJICAgIHNrYi0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVjRfQ1NVTSkgeworCQkgICAgKCFza2ItPmRldiB8fCBza2ItPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1Y0X0NTVU0pKSB7CiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJCQlza2ItPmNzdW1fc3RhcnQgPSBza2JfaGVhZHJvb20oc2tiKSArCiAJCQkJCSAgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYwppbmRleCAyMWMzMDQyLi43MzNjOWFiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYwpAQCAtNTMsNyArNTMsNyBAQAogCiAJLyogQ29ubmVjdGlvbiBtdXN0IGJlIHZhbGlkIGFuZCBuZXcuICovCiAJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8Ci0JCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOworCQkJICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSk7CiAJTkZfQ1RfQVNTRVJUKHBhci0+b3V0ICE9IE5VTEwpOwogCiAJcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBJUF9OQVRfTUFOSVBfU1JDKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKaW5kZXggNzMxN2JkZi4uNDgzYjc2ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAJc3dpdGNoIChjdGluZm8pIHsKIAljYXNlIElQX0NUX1JFTEFURUQ6Ci0JY2FzZSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZOgorCWNhc2UgSVBfQ1RfUkVMQVRFRF9SRVBMWToKIAkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKIAkJCWlmICghbmZfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24oY3QsIGN0aW5mbywKIAkJCQkJCQkgICBob29rbnVtLCBza2IpKQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJZGVmYXVsdDoKIAkJLyogRVNUQUJMSVNIRUQgKi8KIAkJTkZfQ1RfQVNTRVJUKGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRCB8fAotCQkJICAgICBjdGluZm8gPT0gKElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZKSk7CisJCQkgICAgIGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSk7CiAJfQogCiAJcmV0dXJuIG5mX25hdF9wYWNrZXQoY3QsIGN0aW5mbywgaG9va251bSwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3BpbmcuYyBiL25ldC9pcHY0L3BpbmcuYwppbmRleCA5YWFhNjcxLi4zOWI0MDNmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9waW5nLmMKKysrIGIvbmV0L2lwdjQvcGluZy5jCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3BpbmcuaD4KLSNpbmNsdWRlIDxuZXQvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC91ZHAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDUyYjBiOTUuLmFhMTNlZjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMTMxNiw2ICsxMzE2LDIzIEBACiAJOwogfQogCitzdGF0aWMgYm9vbCBwZWVyX3BtdHVfZXhwaXJlZChzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyKQoreworCXVuc2lnbmVkIGxvbmcgb3JpZyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CisKKwlyZXR1cm4gb3JpZyAmJgorCSAgICAgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG9yaWcpICYmCisJICAgICAgIGNtcHhjaGcoJnBlZXItPnBtdHVfZXhwaXJlcywgb3JpZywgMCkgPT0gb3JpZzsKK30KKworc3RhdGljIGJvb2wgcGVlcl9wbXR1X2NsZWFuZWQoc3RydWN0IGluZXRfcGVlciAqcGVlcikKK3sKKwl1bnNpZ25lZCBsb25nIG9yaWcgPSBBQ0NFU1NfT05DRShwZWVyLT5wbXR1X2V4cGlyZXMpOworCisJcmV0dXJuIG9yaWcgJiYKKwkgICAgICAgY21weGNoZygmcGVlci0+cG10dV9leHBpcmVzLCBvcmlnLCAwKSA9PSBvcmlnOworfQorCiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXB2NF9uZWdhdGl2ZV9hZHZpY2Uoc3RydWN0IGRzdF9lbnRyeSAqZHN0KQogewogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilkc3Q7CkBAIC0xMzMxLDE0ICsxMzQ4LDggQEAKIAkJCQkJCXJ0X2dlbmlkKGRldl9uZXQoZHN0LT5kZXYpKSk7CiAJCQlydF9kZWwoaGFzaCwgcnQpOwogCQkJcmV0ID0gTlVMTDsKLQkJfSBlbHNlIGlmIChydC0+cGVlciAmJgotCQkJICAgcnQtPnBlZXItPnBtdHVfZXhwaXJlcyAmJgotCQkJICAgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBydC0+cGVlci0+cG10dV9leHBpcmVzKSkgewotCQkJdW5zaWduZWQgbG9uZyBvcmlnID0gcnQtPnBlZXItPnBtdHVfZXhwaXJlczsKLQotCQkJaWYgKGNtcHhjaGcoJnJ0LT5wZWVyLT5wbXR1X2V4cGlyZXMsIG9yaWcsIDApID09IG9yaWcpCi0JCQkJZHN0X21ldHJpY19zZXQoZHN0LCBSVEFYX01UVSwKLQkJCQkJICAgICAgIHJ0LT5wZWVyLT5wbXR1X29yaWcpOworCQl9IGVsc2UgaWYgKHJ0LT5wZWVyICYmIHBlZXJfcG10dV9leHBpcmVkKHJ0LT5wZWVyKSkgeworCQkJZHN0X21ldHJpY19zZXQoZHN0LCBSVEFYX01UVSwgcnQtPnBlZXItPnBtdHVfb3JpZyk7CiAJCX0KIAl9CiAJcmV0dXJuIHJldDsKQEAgLTE1MzEsOCArMTU0MiwxMCBAQAogCiBzdGF0aWMgdm9pZCBjaGVja19wZWVyX3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyKQogewotCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IHBlZXItPnBtdHVfZXhwaXJlczsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSBBQ0NFU1NfT05DRShwZWVyLT5wbXR1X2V4cGlyZXMpOwogCisJaWYgKCFleHBpcmVzKQorCQlyZXR1cm47CiAJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGV4cGlyZXMpKSB7CiAJCXUzMiBvcmlnX2RzdF9tdHUgPSBkc3RfbXR1KGRzdCk7CiAJCWlmIChwZWVyLT5wbXR1X2xlYXJuZWQgPCBvcmlnX2RzdF9tdHUpIHsKQEAgLTE1NTUsMTAgKzE1NjgsMTEgQEAKIAkJcnRfYmluZF9wZWVyKHJ0LCBydC0+cnRfZHN0LCAxKTsKIAlwZWVyID0gcnQtPnBlZXI7CiAJaWYgKHBlZXIpIHsKKwkJdW5zaWduZWQgbG9uZyBwbXR1X2V4cGlyZXMgPSBBQ0NFU1NfT05DRShwZWVyLT5wbXR1X2V4cGlyZXMpOworCiAJCWlmIChtdHUgPCBpcF9ydF9taW5fcG10dSkKIAkJCW10dSA9IGlwX3J0X21pbl9wbXR1OwotCQlpZiAoIXBlZXItPnBtdHVfZXhwaXJlcyB8fCBtdHUgPCBwZWVyLT5wbXR1X2xlYXJuZWQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcG10dV9leHBpcmVzOworCQlpZiAoIXBtdHVfZXhwaXJlcyB8fCBtdHUgPCBwZWVyLT5wbXR1X2xlYXJuZWQpIHsKIAogCQkJcG10dV9leHBpcmVzID0gamlmZmllcyArIGlwX3J0X210dV9leHBpcmVzOwogCQkJaWYgKCFwbXR1X2V4cGlyZXMpCkBAIC0xNjEyLDEzICsxNjI2LDE0IEBACiAJCQlydF9iaW5kX3BlZXIocnQsIHJ0LT5ydF9kc3QsIDApOwogCiAJCXBlZXIgPSBydC0+cGVlcjsKLQkJaWYgKHBlZXIgJiYgcGVlci0+cG10dV9leHBpcmVzKQorCQlpZiAocGVlcikgewogCQkJY2hlY2tfcGVlcl9wbXR1KGRzdCwgcGVlcik7CiAKLQkJaWYgKHBlZXIgJiYgcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAmJgotCQkgICAgcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAhPSBydC0+cnRfZ2F0ZXdheSkgewotCQkJaWYgKGNoZWNrX3BlZXJfcmVkaXIoZHN0LCBwZWVyKSkKLQkJCQlyZXR1cm4gTlVMTDsKKwkJCWlmIChwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICYmCisJCQkgICAgcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAhPSBydC0+cnRfZ2F0ZXdheSkgeworCQkJCWlmIChjaGVja19wZWVyX3JlZGlyKGRzdCwgcGVlcikpCisJCQkJCXJldHVybiBOVUxMOworCQkJfQogCQl9CiAKIAkJcnQtPnJ0X3BlZXJfZ2VuaWQgPSBydF9wZWVyX2dlbmlkKCk7CkBAIC0xNjQ5LDE0ICsxNjY0LDggQEAKIAlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9IT1NUX1VOUkVBQ0gsIDApOwogCiAJcnQgPSBza2JfcnRhYmxlKHNrYik7Ci0JaWYgKHJ0ICYmCi0JICAgIHJ0LT5wZWVyICYmCi0JICAgIHJ0LT5wZWVyLT5wbXR1X2V4cGlyZXMpIHsKLQkJdW5zaWduZWQgbG9uZyBvcmlnID0gcnQtPnBlZXItPnBtdHVfZXhwaXJlczsKLQotCQlpZiAoY21weGNoZygmcnQtPnBlZXItPnBtdHVfZXhwaXJlcywgb3JpZywgMCkgPT0gb3JpZykKLQkJCWRzdF9tZXRyaWNfc2V0KCZydC0+ZHN0LCBSVEFYX01UVSwgcnQtPnBlZXItPnBtdHVfb3JpZyk7Ci0JfQorCWlmIChydCAmJiBydC0+cGVlciAmJiBwZWVyX3BtdHVfY2xlYW5lZChydC0+cGVlcikpCisJCWRzdF9tZXRyaWNfc2V0KCZydC0+ZHN0LCBSVEFYX01UVSwgcnQtPnBlZXItPnBtdHVfb3JpZyk7CiB9CiAKIHN0YXRpYyBpbnQgaXBfcnRfYnVnKHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xNzcwLDggKzE3NzksNyBAQAogCQkJICAgICAgIHNpemVvZih1MzIpICogUlRBWF9NQVgpOwogCQlkc3RfaW5pdF9tZXRyaWNzKCZydC0+ZHN0LCBwZWVyLT5tZXRyaWNzLCBmYWxzZSk7CiAKLQkJaWYgKHBlZXItPnBtdHVfZXhwaXJlcykKLQkJCWNoZWNrX3BlZXJfcG10dSgmcnQtPmRzdCwgcGVlcik7CisJCWNoZWNrX3BlZXJfcG10dSgmcnQtPmRzdCwgcGVlcik7CiAJCWlmIChwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICYmCiAJCSAgICBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IHJ0LT5ydF9nYXRld2F5KSB7CiAJCQlydC0+cnRfZ2F0ZXdheSA9IHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQ7CkBAIC0xODk0LDkgKzE5MDIsNyBAQAogCiAJaGFzaCA9IHJ0X2hhc2goZGFkZHIsIHNhZGRyLCBkZXYtPmlmaW5kZXgsIHJ0X2dlbmlkKGRldl9uZXQoZGV2KSkpOwogCXJ0aCA9IHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgc2tiLCBkZXYtPmlmaW5kZXgpOwotCWVyciA9IDA7Ci0JaWYgKElTX0VSUihydGgpKQotCQllcnIgPSBQVFJfRVJSKHJ0aCk7CisJcmV0dXJuIElTX0VSUihydGgpID8gUFRSX0VSUihydGgpIDogMDsKIAogZV9ub2J1ZnM6CiAJcmV0dXJuIC1FTk9CVUZTOwpAQCAtMjc3NSw3ICsyNzgxLDggQEAKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IHNrYl9ydGFibGUoc2tiKTsKIAlzdHJ1Y3QgcnRtc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JbG9uZyBleHBpcmVzOworCWxvbmcgZXhwaXJlcyA9IDA7CisJY29uc3Qgc3RydWN0IGluZXRfcGVlciAqcGVlciA9IHJ0LT5wZWVyOwogCXUzMiBpZCA9IDAsIHRzID0gMCwgdHNhZ2UgPSAwLCBlcnJvcjsKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSwgZmxhZ3MpOwpAQCAtMjgyMywxNSArMjgzMCwxNiBAQAogCQlOTEFfUFVUX0JFMzIoc2tiLCBSVEFfTUFSSywgcnQtPnJ0X21hcmspOwogCiAJZXJyb3IgPSBydC0+ZHN0LmVycm9yOwotCWV4cGlyZXMgPSAocnQtPnBlZXIgJiYgcnQtPnBlZXItPnBtdHVfZXhwaXJlcykgPwotCQlydC0+cGVlci0+cG10dV9leHBpcmVzIC0gamlmZmllcyA6IDA7Ci0JaWYgKHJ0LT5wZWVyKSB7CisJaWYgKHBlZXIpIHsKIAkJaW5ldF9wZWVyX3JlZmNoZWNrKHJ0LT5wZWVyKTsKLQkJaWQgPSBhdG9taWNfcmVhZCgmcnQtPnBlZXItPmlwX2lkX2NvdW50KSAmIDB4ZmZmZjsKLQkJaWYgKHJ0LT5wZWVyLT50Y3BfdHNfc3RhbXApIHsKLQkJCXRzID0gcnQtPnBlZXItPnRjcF90czsKLQkJCXRzYWdlID0gZ2V0X3NlY29uZHMoKSAtIHJ0LT5wZWVyLT50Y3BfdHNfc3RhbXA7CisJCWlkID0gYXRvbWljX3JlYWQoJnBlZXItPmlwX2lkX2NvdW50KSAmIDB4ZmZmZjsKKwkJaWYgKHBlZXItPnRjcF90c19zdGFtcCkgeworCQkJdHMgPSBwZWVyLT50Y3BfdHM7CisJCQl0c2FnZSA9IGdldF9zZWNvbmRzKCkgLSBwZWVyLT50Y3BfdHNfc3RhbXA7CiAJCX0KKwkJZXhwaXJlcyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CisJCWlmIChleHBpcmVzKQorCQkJZXhwaXJlcyAtPSBqaWZmaWVzOwogCX0KIAogCWlmIChydF9pc19pbnB1dF9yb3V0ZShydCkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggMDU0YTU5ZC4uNDZmZWJjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTMyMjAsNyArMzIyMCw3IEBACiB2b2lkIF9faW5pdCB0Y3BfaW5pdCh2b2lkKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJaW50IGksIG1heF9zaGFyZSwgY250OwogCXVuc2lnbmVkIGxvbmcgamlmZnkgPSBqaWZmaWVzOwogCkBAIC0zMjc3LDEzICszMjc3LDcgQEAKIAlzeXNjdGxfdGNwX21heF9vcnBoYW5zID0gY250IC8gMjsKIAlzeXNjdGxfbWF4X3N5bl9iYWNrbG9nID0gbWF4KDEyOCwgY250IC8gMjU2KTsKIAotCS8qIFNldCB0aGUgcHJlc3N1cmUgdGhyZXNob2xkIHRvIGJlIGEgZnJhY3Rpb24gb2YgZ2xvYmFsIG1lbW9yeSB0aGF0Ci0JICogaXMgdXAgdG8gMS8yIGF0IDI1NiBNQiwgZGVjcmVhc2luZyB0b3dhcmQgemVybyB3aXRoIHRoZSBhbW91bnQgb2YKLQkgKiBtZW1vcnksIHdpdGggYSBmbG9vciBvZiAxMjggcGFnZXMuCi0JICovCi0JbnJfcGFnZXMgPSB0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlczsKLQlsaW1pdCA9IG1pbihucl9wYWdlcywgMVVMPDwoMjgtUEFHRV9TSElGVCkpID4+ICgyMC1QQUdFX1NISUZUKTsKLQlsaW1pdCA9IChsaW1pdCAqIChucl9wYWdlcyA+PiAoMjAtUEFHRV9TSElGVCkpKSA+PiAoUEFHRV9TSElGVC0xMSk7CisJbGltaXQgPSBucl9mcmVlX2J1ZmZlcl9wYWdlcygpIC8gODsKIAlsaW1pdCA9IG1heChsaW1pdCwgMTI4VUwpOwogCXN5c2N0bF90Y3BfbWVtWzBdID0gbGltaXQgLyA0ICogMzsKIAlzeXNjdGxfdGNwX21lbVsxXSA9IGxpbWl0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggYTdkNjY3MS4uNzA4ZGMyMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0xNTg5LDYgKzE1ODksNyBAQAogCQkJZ290byBkaXNjYXJkOwogCiAJCWlmIChuc2sgIT0gc2spIHsKKwkJCXNvY2tfcnBzX3NhdmVfcnhoYXNoKG5zaywgc2tiLT5yeGhhc2gpOwogCQkJaWYgKHRjcF9jaGlsZF9wcm9jZXNzKHNrLCBuc2ssIHNrYikpIHsKIAkJCQlyc2sgPSBuc2s7CiAJCQkJZ290byByZXNldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggYWJjYTg3MC4uMTk4Zjc1YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTEyNDksNiArMTI0OSw5IEBACiAKIAlpZiAobm9ibG9jaykKIAkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzdGFydGluZyBvdmVyIGZvciBhIG5ldyBwYWNrZXQgKi8KKwltc2ctPm1zZ19mbGFncyAmPSB+TVNHX1RSVU5DOwogCWdvdG8gdHJ5X2FnYWluOwogfQogCkBAIC0yMjA2LDE2ICsyMjA5LDEwIEBACiAKIHZvaWQgX19pbml0IHVkcF9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcywgbGltaXQ7CisJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAogCXVkcF90YWJsZV9pbml0KCZ1ZHBfdGFibGUsICJVRFAiKTsKLQkvKiBTZXQgdGhlIHByZXNzdXJlIHRocmVzaG9sZCB1cCBieSB0aGUgc2FtZSBzdHJhdGVneSBvZiBUQ1AuIEl0IGlzIGEKLQkgKiBmcmFjdGlvbiBvZiBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgdXAgdG8gMS8yIGF0IDI1NiBNQiwgZGVjcmVhc2luZwotCSAqIHRvd2FyZCB6ZXJvIHdpdGggdGhlIGFtb3VudCBvZiBtZW1vcnksIHdpdGggYSBmbG9vciBvZiAxMjggcGFnZXMuCi0JICovCi0JbnJfcGFnZXMgPSB0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlczsKLQlsaW1pdCA9IG1pbihucl9wYWdlcywgMVVMPDwoMjgtUEFHRV9TSElGVCkpID4+ICgyMC1QQUdFX1NISUZUKTsKLQlsaW1pdCA9IChsaW1pdCAqIChucl9wYWdlcyA+PiAoMjAtUEFHRV9TSElGVCkpKSA+PiAoUEFHRV9TSElGVC0xMSk7CisJbGltaXQgPSBucl9mcmVlX2J1ZmZlcl9wYWdlcygpIC8gODsKIAlsaW1pdCA9IG1heChsaW1pdCwgMTI4VUwpOwogCXN5c2N0bF91ZHBfbWVtWzBdID0gbGltaXQgLyA0ICogMzsKIAlzeXNjdGxfdWRwX21lbVsxXSA9IGxpbWl0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMgYi9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYwppbmRleCAyZDUxODQwLi4zMjdhNjE3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYwpAQCAtMzIsNyArMzIsMTIgQEAKIAlkc3QgPSBza2JfZHN0KHNrYik7CiAJbXR1ID0gZHN0X210dShkc3QpOwogCWlmIChza2ItPmxlbiA+IG10dSkgewotCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CisJCWlmIChza2ItPnNrKQorCQkJaXBfbG9jYWxfZXJyb3Ioc2tiLT5zaywgRU1TR1NJWkUsIGlwX2hkcihza2IpLT5kYWRkciwKKwkJCQkgICAgICAgaW5ldF9zayhza2ItPnNrKS0+aW5ldF9kcG9ydCwgbXR1KTsKKwkJZWxzZQorCQkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsCisJCQkJICBJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKIAkJcmV0ID0gLUVNU0dTSVpFOwogCX0KIG91dDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IGI3OTE5ZjkuLjNiNTY2OWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtMjcyLDYgKzI3MiwxMCBAQAogCiAJaWYgKGFkZHJfbGVuIDwgU0lONl9MRU5fUkZDMjEzMykKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRkci0+c2luNl9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCiAJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmFkZHItPnNpbjZfYWRkcik7CiAJaWYgKChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUKSAmJiBzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwppbmRleCA0MTNhYjA3Li4yNDkzOTQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCkBAIC0yMDQsNyArMjA0LDggQEAKIAllbHNlCiAJCXBtc2ctPm91dGRldl9uYW1lWzBdID0gJ1wwJzsKIAotCWlmIChlbnRyeS0+aW5kZXYgJiYgZW50cnktPnNrYi0+ZGV2KSB7CisJaWYgKGVudHJ5LT5pbmRldiAmJiBlbnRyeS0+c2tiLT5kZXYgJiYKKwkgICAgZW50cnktPnNrYi0+bWFjX2hlYWRlciAhPSBlbnRyeS0+c2tiLT5uZXR3b3JrX2hlYWRlcikgewogCQlwbXNnLT5od190eXBlID0gZW50cnktPnNrYi0+ZGV2LT50eXBlOwogCQlwbXNnLT5od19hZGRybGVuID0gZGV2X3BhcnNlX2hlYWRlcihlbnRyeS0+c2tiLCBwbXNnLT5od19hZGRyKTsKIAl9CkBAIC00MDMsNyArNDA0LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19pcHFfcmN2X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCBzdGF0dXMsIHR5cGUsIHBpZCwgZmxhZ3MsIG5sbXNnbGVuLCBza2JsZW47CisJaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbmxtc2dsZW4sIHNrYmxlbjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAogCXNrYmxlbiA9IHNrYi0+bGVuOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKaW5kZXggYzhhZjU4Yi4uNDExMTA1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCS8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgaGVscGVyOiBhcyB0aGUgcGFja2V0IGdvZXMgb3V0LiAqLwogCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0JaWYgKCFjdCB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKQorCWlmICghY3QgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURURfUkVQTFkpCiAJCWdvdG8gb3V0OwogCiAJaGVscCA9IG5mY3RfaGVscChjdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwppbmRleCAxZGYzYzhiLi43YzA1ZTdlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCS8qIFVwZGF0ZSBza2IgdG8gcmVmZXIgdG8gdGhpcyBjb25uZWN0aW9uICovCiAJc2tiLT5uZmN0ID0gJm5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCktPmN0X2dlbmVyYWw7CiAJc2tiLT5uZmN0aW5mbyA9ICpjdGluZm87Ci0JcmV0dXJuIC1ORl9BQ0NFUFQ7CisJcmV0dXJuIE5GX0FDQ0VQVDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcm91dGUuYyBiL25ldC9pcHY2L3JvdXRlLmMKaW5kZXggZGUyYjFkZS4uMGVmMWYwOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcm91dGUuYworKysgYi9uZXQvaXB2Ni9yb3V0ZS5jCkBAIC0yMjgsOSArMjI4LDEwIEBACiAKIC8qIGFsbG9jYXRlIGRzdCB3aXRoIGlwNl9kc3Rfb3BzICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBydDZfaW5mbyAqaXA2X2RzdF9hbGxvYyhzdHJ1Y3QgZHN0X29wcyAqb3BzLAotCQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisJCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHJ0Nl9pbmZvICpydCA9IGRzdF9hbGxvYyhvcHMsIGRldiwgMCwgMCwgMCk7CisJc3RydWN0IHJ0Nl9pbmZvICpydCA9IGRzdF9hbGxvYyhvcHMsIGRldiwgMCwgMCwgZmxhZ3MpOwogCiAJbWVtc2V0KCZydC0+cnQ2aV90YWJsZSwgMCwgc2l6ZW9mKCpydCkgLSBzaXplb2Yoc3RydWN0IGRzdF9lbnRyeSkpOwogCkBAIC0xMDQyLDcgKzEwNDMsNyBAQAogCWlmICh1bmxpa2VseShpZGV2ID09IE5VTEwpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBkZXYpOworCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBkZXYsIDApOwogCWlmICh1bmxpa2VseShydCA9PSBOVUxMKSkgewogCQlpbjZfZGV2X3B1dChpZGV2KTsKIAkJZ290byBvdXQ7CkBAIC0xMDYyLDE0ICsxMDYzLDYgQEAKIAlkc3RfbWV0cmljX3NldCgmcnQtPmRzdCwgUlRBWF9IT1BMSU1JVCwgMjU1KTsKIAlydC0+ZHN0Lm91dHB1dCAgPSBpcDZfb3V0cHV0OwogCi0jaWYgMAkvKiB0aGVyZSdzIG5vIGNoYW5jZSB0byB1c2UgdGhlc2UgZm9yIG5kaXNjICovCi0JcnQtPmRzdC5mbGFncyAgID0gaXB2Nl9hZGRyX3R5cGUoYWRkcikgJiBJUFY2X0FERFJfVU5JQ0FTVAotCQkJCT8gRFNUX0hPU1QKLQkJCQk6IDA7Ci0JaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2RzdC5hZGRyLCBhZGRyKTsKLQlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKLSNlbmRpZgotCiAJc3Bpbl9sb2NrX2JoKCZpY21wNl9kc3RfbG9jayk7CiAJcnQtPmRzdC5uZXh0ID0gaWNtcDZfZHN0X2djX2xpc3Q7CiAJaWNtcDZfZHN0X2djX2xpc3QgPSAmcnQtPmRzdDsKQEAgLTEyMTQsNyArMTIwNyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBOVUxMKTsKKwlydCA9IGlwNl9kc3RfYWxsb2MoJm5ldC0+aXB2Ni5pcDZfZHN0X29wcywgTlVMTCwgRFNUX05PQ09VTlQpOwogCiAJaWYgKHJ0ID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTEyNDQsNyArMTIzNyw3IEBACiAJaXB2Nl9hZGRyX3ByZWZpeCgmcnQtPnJ0NmlfZHN0LmFkZHIsICZjZmctPmZjX2RzdCwgY2ZnLT5mY19kc3RfbGVuKTsKIAlydC0+cnQ2aV9kc3QucGxlbiA9IGNmZy0+ZmNfZHN0X2xlbjsKIAlpZiAocnQtPnJ0NmlfZHN0LnBsZW4gPT0gMTI4KQotCSAgICAgICBydC0+ZHN0LmZsYWdzID0gRFNUX0hPU1Q7CisJICAgICAgIHJ0LT5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CiAKICNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUwogCWlwdjZfYWRkcl9wcmVmaXgoJnJ0LT5ydDZpX3NyYy5hZGRyLCAmY2ZnLT5mY19zcmMsIGNmZy0+ZmNfc3JjX2xlbik7CkBAIC0xNzM0LDcgKzE3MjcsNyBAQAogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQob3J0LT5ydDZpX2Rldik7CiAJc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9kc3RfYWxsb2MoJm5ldC0+aXB2Ni5pcDZfZHN0X29wcywKLQkJCQkJICAgIG9ydC0+ZHN0LmRldik7CisJCQkJCSAgICBvcnQtPmRzdC5kZXYsIDApOwogCiAJaWYgKHJ0KSB7CiAJCXJ0LT5kc3QuaW5wdXQgPSBvcnQtPmRzdC5pbnB1dDsKQEAgLTIwMTMsNyArMjAwNiw3IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZGV2LT5kZXYpOwogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsCi0JCQkJCSAgICBuZXQtPmxvb3BiYWNrX2Rldik7CisJCQkJCSAgICBuZXQtPmxvb3BiYWNrX2RldiwgMCk7CiAJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAKIAlpZiAocnQgPT0gTlVMTCkgewpAQCAtMjAyNSw3ICsyMDE4LDcgQEAKIAogCWluNl9kZXZfaG9sZChpZGV2KTsKIAotCXJ0LT5kc3QuZmxhZ3MgPSBEU1RfSE9TVDsKKwlydC0+ZHN0LmZsYWdzIHw9IERTVF9IT1NUOwogCXJ0LT5kc3QuaW5wdXQgPSBpcDZfaW5wdXQ7CiAJcnQtPmRzdC5vdXRwdXQgPSBpcDZfb3V0cHV0OwogCXJ0LT5ydDZpX2lkZXYgPSBpZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggZDFmZDI4Ny4uODc1NTFjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0xNjQ0LDYgKzE2NDQsNyBAQAogCQkgKiB0aGUgbmV3IHNvY2tldC4uCiAJCSAqLwogCQlpZihuc2sgIT0gc2spIHsKKwkJCXNvY2tfcnBzX3NhdmVfcnhoYXNoKG5zaywgc2tiLT5yeGhhc2gpOwogCQkJaWYgKHRjcF9jaGlsZF9wcm9jZXNzKHNrLCBuc2ssIHNrYikpCiAJCQkJZ290byByZXNldDsKIAkJCWlmIChvcHRfc2tiKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCA0MWY4YzljLi4zMjg5ODVjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtNDUzLDggKzQ1MywxMSBAQAogCX0KIAl1bmxvY2tfc29ja19mYXN0KHNrLCBzbG93KTsKIAotCWlmIChmbGFncyAmIE1TR19ET05UV0FJVCkKKwlpZiAobm9ibG9jaykKIAkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzdGFydGluZyBvdmVyIGZvciBhIG5ldyBwYWNrZXQgKi8KKwltc2ctPm1zZ19mbGFncyAmPSB+TVNHX1RSVU5DOwogCWdvdG8gdHJ5X2FnYWluOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhcC5jIGIvbmV0L2lyZGEvaXJpYXAuYwppbmRleCAzNjQ3NzUzLi5mODc2ZWVkIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmlhcC5jCisrKyBiL25ldC9pcmRhL2lyaWFwLmMKQEAgLTg3LDYgKzg3LDggQEAKIAkJCSBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKTsKIH0KIAorc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBpcmlhc19vYmplY3RzX2tleTsKKwogLyoKICAqIEZ1bmN0aW9uIGlyaWFwX2luaXQgKHZvaWQpCiAgKgpAQCAtMTE0LDYgKzExNiw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKCZpcmlhc19vYmplY3RzLT5oYl9zcGlubG9jaywgJmlyaWFzX29iamVjdHNfa2V5LAorCQkJCSAgICJpcmlhc19vYmplY3RzIik7CisKIAkvKgogCSAqICBSZWdpc3RlciBzb21lIGRlZmF1bHQgc2VydmljZXMgZm9yIElyTE1QCiAJICovCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2RlYnVnZnMuYyBiL25ldC9sMnRwL2wydHBfZGVidWdmcy5jCmluZGV4IGI4ZGJhZTguLjc2MTMwMTMgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfZGVidWdmcy5jCisrKyBiL25ldC9sMnRwL2wydHBfZGVidWdmcy5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkgKi8KIAlwZC0+bmV0ID0gZ2V0X25ldF9uc19ieV9waWQoY3VycmVudC0+cGlkKTsKIAlpZiAoSVNfRVJSKHBkLT5uZXQpKSB7Ci0JCXJjID0gLVBUUl9FUlIocGQtPm5ldCk7CisJCXJjID0gUFRSX0VSUihwZC0+bmV0KTsKIAkJZ290byBlcnJfZnJlZV9wZDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IDQyMWVhYTYuLjU2YzI0Y2EgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtOTY1LDYgKzk2NSwxMCBAQAogCiAJbXV0ZXhfbG9jaygmc2RhdGEtPnUuaWJzcy5tdHgpOwogCisJc2RhdGEtPnUuaWJzcy5zdGF0ZSA9IElFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNIOworCW1lbXNldChzZGF0YS0+dS5pYnNzLmJzc2lkLCAwLCBFVEhfQUxFTik7CisJc2RhdGEtPnUuaWJzcy5zc2lkX2xlbiA9IDA7CisKIAlhY3RpdmVfaWJzcyA9IGllZWU4MDIxMV9zdGFfYWN0aXZlX2lic3Moc2RhdGEpOwogCiAJaWYgKCFhY3RpdmVfaWJzcyAmJiAhaXNfemVyb19ldGhlcl9hZGRyKGlmaWJzcy0+YnNzaWQpKSB7CkBAIC05OTksOCArMTAwMyw2IEBACiAJa2ZyZWVfc2tiKHNrYik7CiAKIAlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT5za2JfcXVldWUpOwotCW1lbXNldChzZGF0YS0+dS5pYnNzLmJzc2lkLCAwLCBFVEhfQUxFTik7Ci0Jc2RhdGEtPnUuaWJzcy5zc2lkX2xlbiA9IDA7CiAKIAlkZWxfdGltZXJfc3luYygmc2RhdGEtPnUuaWJzcy50aW1lcik7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKaW5kZXggMjAyNWFmNS4uMDkwYjBlYyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKKysrIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKQEAgLTc3NSw5ICs3NzUsNiBAQAogCiAJaW50IHR4X2hlYWRyb29tOyAvKiByZXF1aXJlZCBoZWFkcm9vbSBmb3IgaGFyZHdhcmUvcmFkaW90YXAgKi8KIAotCS8qIGNvdW50IGZvciBrZXlzIG5lZWRpbmcgdGFpbHJvb20gc3BhY2UgYWxsb2NhdGlvbiAqLwotCWludCBjcnlwdG9fdHhfdGFpbHJvb21fbmVlZGVkX2NudDsKLQogCS8qIFRhc2tsZXQgYW5kIHNrYiBxdWV1ZSB0byBwcm9jZXNzIGNhbGxzIGZyb20gSVJRIG1vZGUuIEFsbCBmcmFtZXMKIAkgKiBhZGRlZCB0byBza2JfcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQsIGJ1dCBmcmFtZXMgaW4KIAkgKiBza2JfcXVldWVfdW5yZWxpYWJsZSBtYXkgYmUgZHJvcHBlZCBpZiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZXNlCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWZhY2UuYyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCmluZGV4IDQ5ZDRmODYuLmRlZTMwYWUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZmFjZS5jCisrKyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCkBAIC0xMTQ1LDYgKzExNDUsMTAgQEAKIAkJCQkrIElFRUU4MDIxMV9FTkNSWVBUX0hFQURST09NOwogCW5kZXYtPm5lZWRlZF90YWlscm9vbSA9IElFRUU4MDIxMV9FTkNSWVBUX1RBSUxST09NOwogCisJcmV0ID0gZGV2X2FsbG9jX25hbWUobmRldiwgbmRldi0+bmFtZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKwogCWllZWU4MDIxMV9hc3NpZ25fcGVybV9hZGRyKGxvY2FsLCBuZGV2LCB0eXBlKTsKIAltZW1jcHkobmRldi0+ZGV2X2FkZHIsIG5kZXYtPnBlcm1fYWRkciwgRVRIX0FMRU4pOwogCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldihsb2NhbC0+aHcud2lwaHkpKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9rZXkuYyBiL25ldC9tYWM4MDIxMS9rZXkuYwppbmRleCAzMWFmZDcxMi4uZjgyNWUyZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9rZXkuYwpAQCAtMTAxLDExICsxMDEsNiBAQAogCiAJaWYgKCFyZXQpIHsKIAkJa2V5LT5mbGFncyB8PSBLRVlfRkxBR19VUExPQURFRF9UT19IQVJEV0FSRTsKLQotCQlpZiAoISgoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX01NSUMpIHx8Ci0JCSAgICAgIChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKSkKLQkJCWtleS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250LS07Ci0KIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNjEsMTAgKzE1Niw2IEBACiAJCQkgIGtleS0+Y29uZi5rZXlpZHgsIHN0YSA/IHN0YS0+YWRkciA6IGJjYXN0X2FkZHIsIHJldCk7CiAKIAlrZXktPmZsYWdzICY9IH5LRVlfRkxBR19VUExPQURFRF9UT19IQVJEV0FSRTsKLQotCWlmICghKChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykgfHwKLQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkpCi0JCWtleS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250Kys7CiB9CiAKIHZvaWQgaWVlZTgwMjExX2tleV9yZW1vdmVkKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleV9jb25mKQpAQCAtNDAzLDEwICszOTQsOCBAQAogCQlpZWVlODAyMTFfYWVzX2tleV9mcmVlKGtleS0+dS5jY21wLnRmbSk7CiAJaWYgKGtleS0+Y29uZi5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMpCiAJCWllZWU4MDIxMV9hZXNfY21hY19rZXlfZnJlZShrZXktPnUuYWVzX2NtYWMudGZtKTsKLQlpZiAoa2V5LT5sb2NhbCkgeworCWlmIChrZXktPmxvY2FsKQogCQlpZWVlODAyMTFfZGVidWdmc19rZXlfcmVtb3ZlKGtleSk7Ci0JCWtleS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250LS07Ci0JfQogCiAJa2ZyZWUoa2V5KTsKIH0KQEAgLTQ2OCw4ICs0NTcsNiBAQAogCiAJaWVlZTgwMjExX2RlYnVnZnNfa2V5X2FkZChrZXkpOwogCi0Ja2V5LT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQrKzsKLQogCXJldCA9IGllZWU4MDIxMV9rZXlfZW5hYmxlX2h3X2FjY2VsKGtleSk7CiAKIAltdXRleF91bmxvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CkBAIC01MTEsMTIgKzQ5OCw4IEBACiAKIAltdXRleF9sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwogCi0Jc2RhdGEtPmxvY2FsLT5jcnlwdG9fdHhfdGFpbHJvb21fbmVlZGVkX2NudCA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleSwgJnNkYXRhLT5rZXlfbGlzdCwgbGlzdCkgewotCQlzZGF0YS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250Kys7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrZXksICZzZGF0YS0+a2V5X2xpc3QsIGxpc3QpCiAJCWllZWU4MDIxMV9rZXlfZW5hYmxlX2h3X2FjY2VsKGtleSk7Ci0JfQogCiAJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21sbWUuYyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKaW5kZXggNGY2YjI2Ny4uZDU5NTI2NSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC0xMDg5LDYgKzEwODksNyBAQAogCQlsb2NhbC0+aHcuY29uZi5mbGFncyAmPSB+SUVFRTgwMjExX0NPTkZfUFM7CiAJCWNvbmZpZ19jaGFuZ2VkIHw9IElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUzsKIAl9CisJbG9jYWwtPnBzX3NkYXRhID0gTlVMTDsKIAogCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIGNvbmZpZ19jaGFuZ2VkKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggMjdhZjY3Mi4uNjY5ZDJlMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcW9zX3BhcmFtcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxuZXQvc2NoX2dlbmVyaWMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CkBAIC04NzgsNyArODc3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgaSsrKSB7CiAJCWxvY2FsLT5zY2hlZF9zY2FuX2llcy5pZVtpXSA9IGt6YWxsb2MoMiArCiAJCQkJCQkgICAgICBJRUVFODAyMTFfTUFYX1NTSURfTEVOICsKLQkJCQkJCSAgICAgIGxvY2FsLT5zY2FuX2llc19sZW4sCisJCQkJCQkgICAgICBsb2NhbC0+c2Nhbl9pZXNfbGVuICsKKwkJCQkJCSAgICAgIHJlcS0+aWVfbGVuLAogCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbG9jYWwtPnNjaGVkX3NjYW5faWVzLmllW2ldKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3R4LmMgYi9uZXQvbWFjODAyMTEvdHguYwppbmRleCA2NGUwZjc1Li4zMTA0Yzg0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdHguYworKysgYi9uZXQvbWFjODAyMTEvdHguYwpAQCAtMTQ4MCw3ICsxNDgwLDEyIEBACiB7CiAJaW50IHRhaWxfbmVlZCA9IDA7CiAKLQlpZiAobWF5X2VuY3J5cHQgJiYgbG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250KSB7CisJLyoKKwkgKiBUaGlzIGNvdWxkIGJlIG9wdGltaXNlZCwgZGV2aWNlcyB0aGF0IGRvIGZ1bGwgaGFyZHdhcmUKKwkgKiBjcnlwdG8gKGluY2x1ZGluZyBUS0lQIE1NSUMpIG5lZWQgbm8gdGFpbHJvb20uLi4gQnV0IHdlCisJICogaGF2ZSBubyBkcml2ZXJzIGZvciBzdWNoIGRldmljZXMgY3VycmVudGx5LgorCSAqLworCWlmIChtYXlfZW5jcnlwdCkgewogCQl0YWlsX25lZWQgPSBJRUVFODAyMTFfRU5DUllQVF9UQUlMUk9PTTsKIAkJdGFpbF9uZWVkIC09IHNrYl90YWlscm9vbShza2IpOwogCQl0YWlsX25lZWQgPSBtYXhfdChpbnQsIHRhaWxfbmVlZCwgMCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd3BhLmMgYi9uZXQvbWFjODAyMTEvd3BhLmMKaW5kZXggOWRjM2I1Zi4uOGY2YTMwMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dwYS5jCisrKyBiL25ldC9tYWM4MDIxMS93cGEuYwpAQCAtODYsNiArODYsMTEgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcngtPnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlpbnQgcXVldWUgPSByeC0+cXVldWU7CisKKwkvKiBvdGhlcndpc2UsIFRLSVAgaXMgdnVsbmVyYWJsZSB0byBUSUQgMCB2cy4gbm9uLVFvUyByZXBsYXlzICovCisJaWYgKHJ4LT5xdWV1ZSA9PSBOVU1fUlhfREFUQV9RVUVVRVMgLSAxKQorCQlxdWV1ZSA9IDA7CiAKIAkvKgogCSAqIGl0IG1ha2VzIG5vIHNlbnNlIHRvIGNoZWNrIGZvciBNSUMgZXJyb3JzIG9uIGFueXRoaW5nIG90aGVyCkBAIC0xNDgsMTMgKzE1MywxOSBAQAogCiB1cGRhdGVfaXY6CiAJLyogdXBkYXRlIElWIGluIGtleSBpbmZvcm1hdGlvbiB0byBiZSBhYmxlIHRvIGRldGVjdCByZXBsYXlzICovCi0JcngtPmtleS0+dS50a2lwLnJ4W3J4LT5xdWV1ZV0uaXYzMiA9IHJ4LT50a2lwX2l2MzI7Ci0JcngtPmtleS0+dS50a2lwLnJ4W3J4LT5xdWV1ZV0uaXYxNiA9IHJ4LT50a2lwX2l2MTY7CisJcngtPmtleS0+dS50a2lwLnJ4W3F1ZXVlXS5pdjMyID0gcngtPnRraXBfaXYzMjsKKwlyeC0+a2V5LT51LnRraXAucnhbcXVldWVdLml2MTYgPSByeC0+dGtpcF9pdjE2OwogCiAJcmV0dXJuIFJYX0NPTlRJTlVFOwogCiBtaWNfZmFpbDoKLQltYWM4MDIxMV9ldl9taWNoYWVsX21pY19mYWlsdXJlKHJ4LT5zZGF0YSwgcngtPmtleS0+Y29uZi5rZXlpZHgsCisJLyoKKwkgKiBJbiBzb21lIGNhc2VzIHRoZSBrZXkgY2FuIGJlIHVuc2V0IC0gZS5nLiBhIG11bHRpY2FzdCBwYWNrZXQsIGluCisJICogYSBkcml2ZXIgdGhhdCBzdXBwb3J0cyBIVyBlbmNyeXB0aW9uLiBTZW5kIHVwIHRoZSBrZXkgaWR4IG9ubHkgaWYKKwkgKiB0aGUga2V5IGlzIHNldC4KKwkgKi8KKwltYWM4MDIxMV9ldl9taWNoYWVsX21pY19mYWlsdXJlKHJ4LT5zZGF0YSwKKwkJCQkJcngtPmtleSA/IHJ4LT5rZXktPmNvbmYua2V5aWR4IDogLTEsCiAJCQkJCSh2b2lkICopIHNrYi0+ZGF0YSwgTlVMTCwgR0ZQX0FUT01JQyk7CiAJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7CiB9CkBAIC0yMzUsNiArMjQ2LDExIEBACiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IHJ4LT5rZXk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4LT5za2I7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOworCWludCBxdWV1ZSA9IHJ4LT5xdWV1ZTsKKworCS8qIG90aGVyd2lzZSwgVEtJUCBpcyB2dWxuZXJhYmxlIHRvIFRJRCAwIHZzLiBub24tUW9TIHJlcGxheXMgKi8KKwlpZiAocngtPnF1ZXVlID09IE5VTV9SWF9EQVRBX1FVRVVFUyAtIDEpCisJCXF1ZXVlID0gMDsKIAogCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKIApAQCAtMjU1LDcgKzI3MSw3IEBACiAJcmVzID0gaWVlZTgwMjExX3RraXBfZGVjcnlwdF9kYXRhKHJ4LT5sb2NhbC0+d2VwX3J4X3RmbSwKIAkJCQkJICBrZXksIHNrYi0+ZGF0YSArIGhkcmxlbiwKIAkJCQkJICBza2ItPmxlbiAtIGhkcmxlbiwgcngtPnN0YS0+c3RhLmFkZHIsCi0JCQkJCSAgaGRyLT5hZGRyMSwgaHdhY2NlbCwgcngtPnF1ZXVlLAorCQkJCQkgIGhkci0+YWRkcjEsIGh3YWNjZWwsIHF1ZXVlLAogCQkJCQkgICZyeC0+dGtpcF9pdjMyLAogCQkJCQkgICZyeC0+dGtpcF9pdjE2KTsKIAlpZiAocmVzICE9IFRLSVBfREVDUllQVF9PSykKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYwppbmRleCA4MDQxYmVmLi40MmFhNjRiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jCkBAIC03NjcsNyArNzY3LDcgQEAKIAlpZiAoIWF0dHJbSVBTRVRfQVRUUl9TRVROQU1FXSkgewogCQlmb3IgKGkgPSAwOyBpIDwgaXBfc2V0X21heDsgaSsrKSB7CiAJCQlpZiAoaXBfc2V0X2xpc3RbaV0gIT0gTlVMTCAmJiBpcF9zZXRfbGlzdFtpXS0+cmVmKSB7Ci0JCQkJcmV0ID0gSVBTRVRfRVJSX0JVU1k7CisJCQkJcmV0ID0gLUlQU0VUX0VSUl9CVVNZOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydG5ldC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRuZXQuYwppbmRleCA0NzQzZTU0Li41NjVhN2M1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydG5ldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0bmV0LmMKQEAgLTE0Niw4ICsxNDYsOSBAQAogewogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07Ci0Jc3RydWN0IGhhc2hfaXBwb3J0bmV0NF9lbGVtIGRhdGEgPQotCQl7IC5jaWRyID0gaC0+bmV0c1swXS5jaWRyIHx8IEhPU1RfTUFTSyB9OworCXN0cnVjdCBoYXNoX2lwcG9ydG5ldDRfZWxlbSBkYXRhID0geworCQkuY2lkciA9IGgtPm5ldHNbMF0uY2lkciA/IGgtPm5ldHNbMF0uY2lkciA6IEhPU1RfTUFTSworCX07CiAKIAlpZiAoZGF0YS5jaWRyID09IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzk0LDggKzM5NSw5IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKLQlzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ2X2VsZW0gZGF0YSA9Ci0JCXsgLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJc3RydWN0IGhhc2hfaXBwb3J0bmV0Nl9lbGVtIGRhdGEgPSB7CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXQuYwppbmRleCBjNGRiMjAyLi4yYWVlYWJjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0LmMKQEAgLTEzMSw3ICsxMzEsOSBAQAogewogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07Ci0Jc3RydWN0IGhhc2hfbmV0NF9lbGVtIGRhdGEgPSB7IC5jaWRyID0gaC0+bmV0c1swXS5jaWRyIHx8IEhPU1RfTUFTSyB9OworCXN0cnVjdCBoYXNoX25ldDRfZWxlbSBkYXRhID0geworCQkuY2lkciA9IGgtPm5ldHNbMF0uY2lkciA/IGgtPm5ldHNbMF0uY2lkciA6IEhPU1RfTUFTSworCX07CiAKIAlpZiAoZGF0YS5jaWRyID09IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjk2LDcgKzI5OCw5IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKLQlzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gZGF0YSA9IHsgLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJc3RydWN0IGhhc2hfbmV0Nl9lbGVtIGRhdGEgPSB7CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldHBvcnQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0cG9ydC5jCmluZGV4IGQyYTQwMzYuLmU1MGQ5YmIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0cG9ydC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0cG9ydC5jCkBAIC0xNDQsNyArMTQ0LDggQEAKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX25ldHBvcnQ0X2VsZW0gZGF0YSA9IHsKLQkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNTcsNyArMzU4LDggQEAKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX25ldHBvcnQ2X2VsZW0gZGF0YSA9IHsKLQkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYwppbmRleCBiZjI4YWMyLi43ODJkYjI3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKQEAgLTc3Niw4ICs3NzYsMTYgQEAKIAkJaWYgKGNwLT5jb250cm9sKQogCQkJaXBfdnNfY29udHJvbF9kZWwoY3ApOwogCi0JCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTkZDVCkKKwkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9ORkNUKSB7CiAJCQlpcF92c19jb25uX2Ryb3BfY29ubnRyYWNrKGNwKTsKKwkJCS8qIERvIG5vdCBhY2Nlc3MgY29ubnRyYWNrcyBkdXJpbmcgc3Vic3lzIGNsZWFudXAKKwkJCSAqIGJlY2F1c2UgbmZfY29ubnRyYWNrX2ZpbmRfZ2V0IGNhbiBub3QgYmUgdXNlZCBhZnRlcgorCQkJICogY29ubnRyYWNrIGNsZWFudXAgZm9yIHRoZSBuZXQuCisJCQkgKi8KKwkJCXNtcF9ybWIoKTsKKwkJCWlmIChpcHZzLT5lbmFibGUpCisJCQkJaXBfdnNfY29ubl9kcm9wX2Nvbm50cmFjayhjcCk7CisJCX0KIAogCQlpcF92c19wZV9wdXQoY3AtPnBlKTsKIAkJa2ZyZWUoY3AtPnBlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKaW5kZXggYmZhODA4Zi4uMjRjMjhkMiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCkBAIC0xNzcyLDcgKzE3NzIsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDk5LAorCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX1NSQyAtIDIsCiAJfSwKIAkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBmb3J3YXJkIHBhY2tldCB0aHJvdWdoIFZTL0RSLCBWUy9UVU4sCiAJICogb3IgVlMvTkFUKGNoYW5nZSBkZXN0aW5hdGlvbiksIHNvIHRoYXQgZmlsdGVyaW5nIHJ1bGVzIGNhbiBiZQpAQCAtMTc4Miw3ICsxNzgyLDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVCwKIAkJLmhvb2tudW0JPSBORl9JTkVUX0xPQ0FMX0lOLAotCQkucHJpb3JpdHkJPSAxMDEsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDIC0gMSwKIAl9LAogCS8qIEJlZm9yZSBpcF92c19pbiwgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KIAl7CkBAIC0xNzkwLDcgKzE3OTAsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSAtOTksCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNUICsgMSwKIAl9LAogCS8qIEFmdGVyIG1hbmdsZSwgc2NoZWR1bGUgYW5kIGZvcndhcmQgbG9jYWwgcmVxdWVzdHMgKi8KIAl7CkBAIC0xNzk4LDcgKzE3OTgsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSAtOTgsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNUICsgMiwKIAl9LAogCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcgKGJ1dCBiZWZvcmUgaXBfdnNfb3V0X2ljbXApLCBjYXRjaCBpY21wCiAJICogZGVzdGluZWQgZm9yIDAuMC4wLjAvMCwgd2hpY2ggaXMgZm9yIGluY29taW5nIElQVlMgY29ubmVjdGlvbnMgKi8KQEAgLTE4MjQsNyArMTgyNCw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQ2LAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDk5LAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX05BVF9TUkMgLSAyLAogCX0sCiAJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgZm9yd2FyZCBwYWNrZXQgdGhyb3VnaCBWUy9EUiwgVlMvVFVOLAogCSAqIG9yIFZTL05BVChjaGFuZ2UgZGVzdGluYXRpb24pLCBzbyB0aGF0IGZpbHRlcmluZyBydWxlcyBjYW4gYmUKQEAgLTE4MzQsNyArMTgzNCw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQ2LAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDEwMSwKKwkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9OQVRfU1JDIC0gMSwKIAl9LAogCS8qIEJlZm9yZSBpcF92c19pbiwgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KIAl7CkBAIC0xODQyLDcgKzE4NDIsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSAtOTksCisJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfTkFUX0RTVCArIDEsCiAJfSwKIAkvKiBBZnRlciBtYW5nbGUsIHNjaGVkdWxlIGFuZCBmb3J3YXJkIGxvY2FsIHJlcXVlc3RzICovCiAJewpAQCAtMTg1MCw3ICsxODUwLDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVDYsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IC05OCwKKwkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9OQVRfRFNUICsgMiwKIAl9LAogCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcgKGJ1dCBiZWZvcmUgaXBfdnNfb3V0X2ljbXApLCBjYXRjaCBpY21wCiAJICogZGVzdGluZWQgZm9yIDAuMC4wLjAvMCwgd2hpY2ggaXMgZm9yIGluY29taW5nIElQVlMgY29ubmVjdGlvbnMgKi8KQEAgLTE5NDUsNiArMTk0NSw3IEBACiB7CiAJRW50ZXJGdW5jdGlvbigyKTsKIAluZXRfaXB2cyhuZXQpLT5lbmFibGUgPSAwOwkvKiBEaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKi8KKwlzbXBfd21iKCk7CiAJX19pcF92c19zeW5jX2NsZWFudXAobmV0KTsKIAlMZWF2ZUZ1bmN0aW9uKDIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmluZGV4IDJlMWMxMWYuLmY3YWY4YjggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTg1MCw3ICs4NTAsNyBAQAogCiAJLyogSXQgZXhpc3RzOyB3ZSBoYXZlIChub24tZXhjbHVzaXZlKSByZWZlcmVuY2UuICovCiAJaWYgKE5GX0NUX0RJUkVDVElPTihoKSA9PSBJUF9DVF9ESVJfUkVQTFkpIHsKLQkJKmN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFk7CisJCSpjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWTsKIAkJLyogUGxlYXNlIHNldCByZXBseSBiaXQgaWYgdGhpcyBwYWNrZXQgT0sgKi8KIAkJKnNldF9yZXBseSA9IDE7CiAJfSBlbHNlIHsKQEAgLTkyMiw2ICs5MjIsOSBAQAogCQkJcmV0ID0gLXJldDsKIAkJCWdvdG8gb3V0OwogCQl9CisJCS8qIElDTVBbdjZdIHByb3RvY29sIHRyYWNrZXJzIG1heSBhc3NpZ24gb25lIGNvbm50cmFjay4gKi8KKwkJaWYgKHNrYi0+bmZjdCkKKwkJCWdvdG8gb3V0OwogCX0KIAogCWN0ID0gcmVzb2x2ZV9ub3JtYWxfY3QobmV0LCB0bXBsLCBza2IsIGRhdGFvZmYsIHBmLCBwcm90b251bSwKQEAgLTExNDMsNyArMTE0Niw3IEBACiAJLyogVGhpcyBJQ01QIGlzIGluIHJldmVyc2UgZGlyZWN0aW9uIHRvIHRoZSBwYWNrZXQgd2hpY2ggY2F1c2VkIGl0ICovCiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKIAlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJY3RpbmZvID0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZOworCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEX1JFUExZOwogCWVsc2UKIAkJY3RpbmZvID0gSVBfQ1RfUkVMQVRFRDsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYwppbmRleCBlMTdjYjdjLi42ZjU4MDFlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAKIAkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KIAlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7CisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkgewogCQlwcl9kZWJ1ZygiZnRwOiBDb25udHJhY2tpbmZvID0gJXVcbiIsIGN0aW5mbyk7CiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwppbmRleCAxOGIyY2U1Li5mMDNjMmQ0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwpAQCAtNTcxLDEwICs1NzEsOSBAQAogCWludCByZXQ7CiAKIAkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7CisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQorCiAJcHJfZGVidWcoIm5mX2N0X2gyNDU6IHNrYmxlbiA9ICV1XG4iLCBza2ItPmxlbik7CiAKIAlzcGluX2xvY2tfYmgoJm5mX2gzMjNfbG9jayk7CkBAIC0xMTI1LDEwICsxMTI0LDkgQEAKIAlpbnQgcmV0OwogCiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCi0JaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgotCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgeworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKQogCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KKwogCXByX2RlYnVnKCJuZl9jdF9xOTMxOiBza2JsZW4gPSAldVxuIiwgc2tiLT5sZW4pOwogCiAJc3Bpbl9sb2NrX2JoKCZuZl9oMzIzX2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYwppbmRleCBiMzk0YWEzLi40ZjkzOTBiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYwpAQCAtMTI1LDggKzEyNSw3IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJLyogTm90IGEgZnVsbCB0Y3AgaGVhZGVyPyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCmluZGV4IDA4ODk0NDguLjJmZDQ1NjUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTUxOSw4ICs1MTksNyBAQAogCXVfaW50MTZfdCBtc2c7CiAKIAkvKiBkb24ndCBkbyBhbnkgdHJhY2tpbmcgYmVmb3JlIHRjcCBoYW5kc2hha2UgY29tcGxldGUgKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJbmV4dGhkcl9vZmYgPSBwcm90b2ZmOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jCmluZGV4IGQ5ZTI3NzMuLjg1MDE4MjMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NhbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAljdF9zYW5lX2luZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9zYW5lX2luZm87CiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCiAJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgotCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIE5vdCBhIGZ1bGwgdGNwIGhlYWRlcj8gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKaW5kZXggY2I1YTI4NS4uOTNmYWY2YSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKQEAgLTE0MjMsNyArMTQyMyw3IEBACiAJdHlwZW9mKG5mX25hdF9zaXBfc2VxX2FkanVzdF9ob29rKSBuZl9uYXRfc2lwX3NlcV9hZGp1c3Q7CiAKIAlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAkvKiBObyBEYXRhID8gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKaW5kZXggZTBlZTAxMC4uMmU3Y2NiYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKQEAgLTQ1Niw3ICs0NTYsOCBAQAogCWlmIChza2ItPm1hcmspCiAJCU5MQV9QVVRfQkUzMihpbnN0LT5za2IsIE5GVUxBX01BUkssIGh0b25sKHNrYi0+bWFyaykpOwogCi0JaWYgKGluZGV2ICYmIHNrYi0+ZGV2KSB7CisJaWYgKGluZGV2ICYmIHNrYi0+ZGV2ICYmCisJICAgIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CiAJCXN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyBwaHc7CiAJCWludCBsZW4gPSBkZXZfcGFyc2VfaGVhZGVyKHNrYiwgcGh3Lmh3X2FkZHIpOwogCQlpZiAobGVuID4gMCkgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggYjgzMTIzZi4uZmRkMmZhZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC0zMzUsNyArMzM1LDggQEAKIAlpZiAoZW50c2tiLT5tYXJrKQogCQlOTEFfUFVUX0JFMzIoc2tiLCBORlFBX01BUkssIGh0b25sKGVudHNrYi0+bWFyaykpOwogCi0JaWYgKGluZGV2ICYmIGVudHNrYi0+ZGV2KSB7CisJaWYgKGluZGV2ICYmIGVudHNrYi0+ZGV2ICYmCisJICAgIGVudHNrYi0+bWFjX2hlYWRlciAhPSBlbnRza2ItPm5ldHdvcmtfaGVhZGVyKSB7CiAJCXN0cnVjdCBuZnFubF9tc2dfcGFja2V0X2h3IHBodzsKIAkJaW50IGxlbiA9IGRldl9wYXJzZV9oZWFkZXIoZW50c2tiLCBwaHcuaHdfYWRkcik7CiAJCWlmIChsZW4pIHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCmluZGV4IDljYzQ2MzUuLmZlMzlmN2UgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYwpAQCAtMTQzLDkgKzE0Myw5IEBACiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKIAlpZiAoY3QgJiYgIW5mX2N0X2lzX3VudHJhY2tlZChjdCkgJiYKIAkgICAgKChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCAmJgotCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9JU19SRVBMWSArIElQX0NUX0VTVEFCTElTSEVEKSB8fAorCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkgfHwKIAkgICAgIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCAmJgotCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9JU19SRVBMWSArIElQX0NUX1JFTEFURUQpKSAmJgorCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSkgJiYKIAkgICAgKGN0LT5zdGF0dXMgJiBJUFNfU1JDX05BVF9ET05FKSkgewogCiAJCWRhZGRyID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcDsKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IDkyNWY3MTUuLmMwYzNjZGEgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtNzk4LDcgKzc5OCwxMyBAQAogCQkJZ2V0bnN0aW1lb2ZkYXkoJnRzKTsKIAkJaC5oMi0+dHBfc2VjID0gdHMudHZfc2VjOwogCQloLmgyLT50cF9uc2VjID0gdHMudHZfbnNlYzsKLQkJaC5oMi0+dHBfdmxhbl90Y2kgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwkJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQkJaC5oMi0+dHBfdmxhbl90Y2kgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwkJCXN0YXR1cyB8PSBUUF9TVEFUVVNfVkxBTl9WQUxJRDsKKwkJfSBlbHNlIHsKKwkJCWguaDItPnRwX3ZsYW5fdGNpID0gMDsKKwkJfQorCQloLmgyLT50cF9wYWRkaW5nID0gMDsKIAkJaGRybGVuID0gc2l6ZW9mKCpoLmgyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE3MjUsOCArMTczMSwxMyBAQAogCQlhdXgudHBfc25hcGxlbiA9IHNrYi0+bGVuOwogCQlhdXgudHBfbWFjID0gMDsKIAkJYXV4LnRwX25ldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwotCQlhdXgudHBfdmxhbl90Y2kgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKLQorCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCQlhdXgudHBfdmxhbl90Y2kgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwkJCWF1eC50cF9zdGF0dXMgfD0gVFBfU1RBVFVTX1ZMQU5fVkFMSUQ7CisJCX0gZWxzZSB7CisJCQlhdXgudHBfdmxhbl90Y2kgPSAwOworCQl9CisJCWF1eC50cF9wYWRkaW5nID0gMDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfUEFDS0VULCBQQUNLRVRfQVVYREFUQSwgc2l6ZW9mKGF1eCksICZhdXgpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCBiMTcyMWQ3Li5iNGM2ODA5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMjUxLDkgKzI1MSw4IEBACiAJCQl9CiAKIAkJCWlmIChzb21lX3F1ZXVlX3RpbWVkb3V0KSB7Ci0JCQkJY2hhciBkcml2ZXJuYW1lWzY0XTsKIAkJCQlXQVJOX09OQ0UoMSwgS0VSTl9JTkZPICJORVRERVYgV0FUQ0hET0c6ICVzICglcyk6IHRyYW5zbWl0IHF1ZXVlICV1IHRpbWVkIG91dFxuIiwKLQkJCQkgICAgICAgZGV2LT5uYW1lLCBuZXRkZXZfZHJpdmVybmFtZShkZXYsIGRyaXZlcm5hbWUsIDY0KSwgaSk7CisJCQkJICAgICAgIGRldi0+bmFtZSwgbmV0ZGV2X2RyaXZlcm5hbWUoZGV2KSwgaSk7CiAJCQkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fdHhfdGltZW91dChkZXYpOwogCQkJfQogCQkJaWYgKCFtb2RfdGltZXIoJmRldi0+d2F0Y2hkb2dfdGltZXIsCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDUyNWY5N2MuLjRhNjI4ODggMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC00NDQsMTUgKzQ0NCw3IEBACiAKIAlhc29jLT5wZWVyLnRyYW5zcG9ydF9jb3VudCA9IDA7CiAKLQkvKiBGcmVlIGFueSBjYWNoZWQgQVNDT05GX0FDSyBjaHVuay4gKi8KLQlzY3RwX2Fzc29jX2ZyZWVfYXNjb25mX2Fja3MoYXNvYyk7Ci0KLQkvKiBGcmVlIHRoZSBBU0NPTkYgcXVldWUuICovCi0Jc2N0cF9hc3NvY19mcmVlX2FzY29uZl9xdWV1ZShhc29jKTsKLQotCS8qIEZyZWUgYW55IGNhY2hlZCBBU0NPTkYgY2h1bmsuICovCi0JaWYgKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mKQotCQlzY3RwX2NodW5rX2ZyZWUoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpOworCXNjdHBfYXNjb25mX3F1ZXVlX3RlYXJkb3duKGFzb2MpOwogCiAJLyogQVVUSCAtIEZyZWUgdGhlIGVuZHBvaW50IHNoYXJlZCBrZXlzICovCiAJc2N0cF9hdXRoX2Rlc3Ryb3lfa2V5cygmYXNvYy0+ZW5kcG9pbnRfc2hhcmVkX2tleXMpOwpAQCAtMTY0NiwzICsxNjM4LDE2IEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KKwordm9pZCBzY3RwX2FzY29uZl9xdWV1ZV90ZWFyZG93bihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwkvKiBGcmVlIGFueSBjYWNoZWQgQVNDT05GX0FDSyBjaHVuay4gKi8KKwlzY3RwX2Fzc29jX2ZyZWVfYXNjb25mX2Fja3MoYXNvYyk7CisKKwkvKiBGcmVlIHRoZSBBU0NPTkYgcXVldWUuICovCisJc2N0cF9hc3NvY19mcmVlX2FzY29uZl9xdWV1ZShhc29jKTsKKworCS8qIEZyZWUgYW55IGNhY2hlZCBBU0NPTkYgY2h1bmsuICovCisJaWYgKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mKQorCQlzY3RwX2NodW5rX2ZyZWUoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cHV0LmMgYi9uZXQvc2N0cC9vdXRwdXQuYwppbmRleCBiNGYzY2YwLi4wOGIzY2VhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRwdXQuYworKysgYi9uZXQvc2N0cC9vdXRwdXQuYwpAQCAtNTAwLDIzICs1MDAsMjAgQEAKIAkgKiBOb3RlOiBBZGxlci0zMiBpcyBubyBsb25nZXIgYXBwbGljYWJsZSwgYXMgaGFzIGJlZW4gcmVwbGFjZWQKIAkgKiBieSBDUkMzMi1DIGFzIGRlc2NyaWJlZCBpbiA8ZHJhZnQtaWV0Zi10c3Z3Zy1zY3RwY3N1bS0wMi50eHQ+LgogCSAqLwotCWlmICghc2N0cF9jaGVja3N1bV9kaXNhYmxlICYmCi0JICAgICEoZHN0LT5kZXYtPmZlYXR1cmVzICYgKE5FVElGX0ZfTk9fQ1NVTSB8IE5FVElGX0ZfU0NUUF9DU1VNKSkpIHsKLQkJX191MzIgY3JjMzIgPSBzY3RwX3N0YXJ0X2Nrc3VtKChfX3U4ICopc2gsIGNrc3VtX2J1Zl9sZW4pOworCWlmICghc2N0cF9jaGVja3N1bV9kaXNhYmxlKSB7CisJCWlmICghKGRzdC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0NUUF9DU1VNKSkgeworCQkJX191MzIgY3JjMzIgPSBzY3RwX3N0YXJ0X2Nrc3VtKChfX3U4ICopc2gsIGNrc3VtX2J1Zl9sZW4pOwogCi0JCS8qIDMpIFB1dCB0aGUgcmVzdWx0YW50IHZhbHVlIGludG8gdGhlIGNoZWNrc3VtIGZpZWxkIGluIHRoZQotCQkgKiAgICBjb21tb24gaGVhZGVyLCBhbmQgbGVhdmUgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdW5jaGFuZ2VkLgotCQkgKi8KLQkJc2gtPmNoZWNrc3VtID0gc2N0cF9lbmRfY2tzdW0oY3JjMzIpOwotCX0gZWxzZSB7Ci0JCWlmIChkc3QtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NDVFBfQ1NVTSkgeworCQkJLyogMykgUHV0IHRoZSByZXN1bHRhbnQgdmFsdWUgaW50byB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlCisJCQkgKiAgICBjb21tb24gaGVhZGVyLCBhbmQgbGVhdmUgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdW5jaGFuZ2VkLgorCQkJICovCisJCQlzaC0+Y2hlY2tzdW0gPSBzY3RwX2VuZF9ja3N1bShjcmMzMik7CisJCX0gZWxzZSB7CiAJCQkvKiBubyBuZWVkIHRvIHNlZWQgcHNldWRvIGNoZWNrc3VtIGZvciBTQ1RQICovCiAJCQluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCQkJbnNrYi0+Y3N1bV9zdGFydCA9IChza2JfdHJhbnNwb3J0X2hlYWRlcihuc2tiKSAtCiAJCQkgICAgICAgICAgICAgICAgICAgIG5za2ItPmhlYWQpOwogCQkJbnNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2N0cGhkciwgY2hlY2tzdW0pOwotCQl9IGVsc2UgewotCQkJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHF1ZXVlLmMgYi9uZXQvc2N0cC9vdXRxdWV1ZS5jCmluZGV4IDFjODhjODkuLmQwMzY4MjEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpAQCAtMTU4Miw2ICsxNTgyLDggQEAKICNlbmRpZiAvKiBTQ1RQX0RFQlVHICovCiAJaWYgKHRyYW5zcG9ydCkgewogCQlpZiAoYnl0ZXNfYWNrZWQpIHsKKwkJCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gdHJhbnNwb3J0LT5hc29jOworCiAJCQkvKiBXZSBtYXkgaGF2ZSBjb3VudGVkIERBVEEgdGhhdCB3YXMgbWlncmF0ZWQKIAkJCSAqIHRvIHRoaXMgdHJhbnNwb3J0IGR1ZSB0byBERUwtSVAgb3BlcmF0aW9uLgogCQkJICogU3VidHJhY3QgdGhvc2UgYnl0ZXMsIHNpbmNlIHRoZSB3ZXJlIG5ldmVyCkBAIC0xNjAwLDYgKzE2MDIsMTcgQEAKIAkJCXRyYW5zcG9ydC0+ZXJyb3JfY291bnQgPSAwOwogCQkJdHJhbnNwb3J0LT5hc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID0gMDsKIAorCQkJLyoKKwkJCSAqIFdoaWxlIGluIFNIVVRET1dOIFBFTkRJTkcsIHdlIG1heSBoYXZlIHN0YXJ0ZWQKKwkJCSAqIHRoZSBUNSBzaHV0ZG93biBndWFyZCB0aW1lciBhZnRlciByZWFjaGluZyB0aGUKKwkJCSAqIHJldHJhbnNtaXNzaW9uIGxpbWl0LiBTdG9wIHRoYXQgdGltZXIgYXMgc29vbgorCQkJICogYXMgdGhlIHJlY2VpdmVyIGFja25vd2xlZGdlZCBhbnkgZGF0YS4KKwkJCSAqLworCQkJaWYgKGFzb2MtPnN0YXRlID09IFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAmJgorCQkJICAgIGRlbF90aW1lcigmYXNvYy0+dGltZXJzCisJCQkJW1NDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRF0pKQorCQkJCQlzY3RwX2Fzc29jaWF0aW9uX3B1dChhc29jKTsKKwogCQkJLyogTWFyayB0aGUgZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgYXMKIAkJCSAqIGFjdGl2ZSBpZiBpdCBpcyBub3Qgc28gbWFya2VkLgogCQkJICovCkBAIC0xNjI5LDEwICsxNjQyLDE1IEBACiAJCQkgKiBBIHNlbmRlciBpcyBkb2luZyB6ZXJvIHdpbmRvdyBwcm9iaW5nIHdoZW4gdGhlCiAJCQkgKiByZWNlaXZlcidzIGFkdmVydGlzZWQgd2luZG93IGlzIHplcm8sIGFuZCB0aGVyZSBpcwogCQkJICogb25seSBvbmUgZGF0YSBjaHVuayBpbiBmbGlnaHQgdG8gdGhlIHJlY2VpdmVyLgorCQkJICoKKwkJCSAqIEFsbG93IHRoZSBhc3NvY2lhdGlvbiB0byB0aW1lb3V0IHdoaWxlIGluIFNIVVRET1dOCisJCQkgKiBQRU5ESU5HIG9yIFNIVVRET1dOIFJFQ0VJVkVEIGluIGNhc2UgdGhlIHJlY2VpdmVyCisJCQkgKiBzdGF5cyBpbiB6ZXJvIHdpbmRvdyBtb2RlIGZvcmV2ZXIuCiAJCQkgKi8KIAkJCWlmICghcS0+YXNvYy0+cGVlci5yd25kICYmCiAJCQkgICAgIWxpc3RfZW1wdHkoJnRsaXN0KSAmJgotCQkJICAgIChzYWNrX2N0c24rMiA9PSBxLT5hc29jLT5uZXh0X3RzbikpIHsKKwkJCSAgICAoc2Fja19jdHNuKzIgPT0gcS0+YXNvYy0+bmV4dF90c24pICYmCisJCQkgICAgcS0+YXNvYy0+c3RhdGUgPCBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpIHsKIAkJCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IFNBQ0sgcmVjZWl2ZWQgZm9yIHplcm8gIgogCQkJCQkJICAid2luZG93IHByb2JlOiAldVxuIiwKIAkJCQkJCSAgX19mdW5jX18sIHNhY2tfY3Rzbik7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm90b2NvbC5jIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwppbmRleCA2NzM4MGEyLi4yMDcxNzViIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm90b2NvbC5jCisrKyBiL25ldC9zY3RwL3Byb3RvY29sLmMKQEAgLTEwNTgsNyArMTA1OCw2IEBACiAJaW50IHN0YXR1cyA9IC1FSU5WQUw7CiAJdW5zaWduZWQgbG9uZyBnb2FsOwogCXVuc2lnbmVkIGxvbmcgbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlczsKIAlpbnQgbWF4X3NoYXJlOwogCWludCBvcmRlcjsKIApAQCAtMTE0OCwxNSArMTE0Nyw3IEBACiAJLyogSW5pdGlhbGl6ZSBoYW5kbGUgdXNlZCBmb3IgYXNzb2NpYXRpb24gaWRzLiAqLwogCWlkcl9pbml0KCZzY3RwX2Fzc29jc19pZCk7CiAKLQkvKiBTZXQgdGhlIHByZXNzdXJlIHRocmVzaG9sZCB0byBiZSBhIGZyYWN0aW9uIG9mIGdsb2JhbCBtZW1vcnkgdGhhdAotCSAqIGlzIHVwIHRvIDEvMiBhdCAyNTYgTUIsIGRlY3JlYXNpbmcgdG93YXJkIHplcm8gd2l0aCB0aGUgYW1vdW50IG9mCi0JICogbWVtb3J5LCB3aXRoIGEgZmxvb3Igb2YgMTI4IHBhZ2VzLgotCSAqIE5vdGUgdGhpcyBpbml0aWFsaXplcyB0aGUgZGF0YSBpbiBzY3RwdjZfcHJvdCB0b28KLQkgKiBVbmFiYXNoZWRseSBzdG9sZW4gZnJvbSB0Y3BfaW5pdAotCSAqLwotCW5yX3BhZ2VzID0gdG90YWxyYW1fcGFnZXMgLSB0b3RhbGhpZ2hfcGFnZXM7Ci0JbGltaXQgPSBtaW4obnJfcGFnZXMsIDFVTDw8KDI4LVBBR0VfU0hJRlQpKSA+PiAoMjAtUEFHRV9TSElGVCk7Ci0JbGltaXQgPSAobGltaXQgKiAobnJfcGFnZXMgPj4gKDIwLVBBR0VfU0hJRlQpKSkgPj4gKFBBR0VfU0hJRlQtMTEpOworCWxpbWl0ID0gbnJfZnJlZV9idWZmZXJfcGFnZXMoKSAvIDg7CiAJbGltaXQgPSBtYXgobGltaXQsIDEyOFVMKTsKIAlzeXNjdGxfc2N0cF9tZW1bMF0gPSBsaW1pdCAvIDQgKiAzOwogCXN5c2N0bF9zY3RwX21lbVsxXSA9IGxpbWl0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCmluZGV4IGQ2MTJjYTEuLjZlMGY4ODIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYworKysgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKQEAgLTY3MCwxMCArNjcwLDE5IEBACiAJLyogOC4zIFVwb24gdGhlIHJlY2VpcHQgb2YgdGhlIEhFQVJUQkVBVCBBQ0ssIHRoZSBzZW5kZXIgb2YgdGhlCiAJICogSEVBUlRCRUFUIHNob3VsZCBjbGVhciB0aGUgZXJyb3IgY291bnRlciBvZiB0aGUgZGVzdGluYXRpb24KIAkgKiB0cmFuc3BvcnQgYWRkcmVzcyB0byB3aGljaCB0aGUgSEVBUlRCRUFUIHdhcyBzZW50LgotCSAqIFRoZSBhc3NvY2lhdGlvbidzIG92ZXJhbGwgZXJyb3IgY291bnQgaXMgYWxzbyBjbGVhcmVkLgogCSAqLwogCXQtPmVycm9yX2NvdW50ID0gMDsKLQl0LT5hc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID0gMDsKKworCS8qCisJICogQWx0aG91Z2ggUkZDNDk2MCBzcGVjaWZpZXMgdGhhdCB0aGUgb3ZlcmFsbCBlcnJvciBjb3VudCBtdXN0CisJICogYmUgY2xlYXJlZCB3aGVuIGEgSEVBUlRCRUFUIEFDSyBpcyByZWNlaXZlZCwgd2UgbWFrZSBhbgorCSAqIGV4Y2VwdGlvbiB3aGlsZSBpbiBTSFVURE9XTiBQRU5ESU5HLiBJZiB0aGUgcGVlciBrZWVwcyBpdHMKKwkgKiB3aW5kb3cgc2h1dCBmb3JldmVyLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byB0cmFuc21pdCBvdXIKKwkgKiBvdXRzdGFuZGluZyBkYXRhIGFuZCByZWx5IG9uIHRoZSByZXRyYW5zbWlzc2lvbiBsaW1pdCBiZSByZWFjaGVkCisJICogdG8gc2h1dGRvd24gdGhlIGFzc29jaWF0aW9uLgorCSAqLworCWlmICh0LT5hc29jLT5zdGF0ZSAhPSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpCisJCXQtPmFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPSAwOwogCiAJLyogQ2xlYXIgdGhlIGhiX3NlbnQgZmxhZyB0byBzaWduYWwgdGhhdCB3ZSBoYWQgYSBnb29kCiAJICogYWNrbm93bGVkZ2VtZW50LgpAQCAtMTQzNyw2ICsxNDQ2LDEzIEBACiAJCQlzY3RwX2NtZF9zZXR1cF90Mihjb21tYW5kcywgYXNvYywgY21kLT5vYmoucHRyKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgU0NUUF9DTURfVElNRVJfU1RBUlRfT05DRToKKwkJCXRpbWVyID0gJmFzb2MtPnRpbWVyc1tjbWQtPm9iai50b107CisKKwkJCWlmICh0aW1lcl9wZW5kaW5nKHRpbWVyKSkKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCiAJCWNhc2UgU0NUUF9DTURfVElNRVJfU1RBUlQ6CiAJCQl0aW1lciA9ICZhc29jLT50aW1lcnNbY21kLT5vYmoudG9dOwogCQkJdGltZW91dCA9IGFzb2MtPnRpbWVvdXRzW2NtZC0+b2JqLnRvXTsKQEAgLTE2NzAsNiArMTY4Niw5IEBACiAJCWNhc2UgU0NUUF9DTURfU0VORF9ORVhUX0FTQ09ORjoKIAkJCXNjdHBfY21kX3NlbmRfYXNjb25mKGFzb2MpOwogCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9DTURfUFVSR0VfQVNDT05GX1FVRVVFOgorCQkJc2N0cF9hc2NvbmZfcXVldWVfdGVhcmRvd24oYXNvYyk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByX3dhcm4oIkltcG9zc2libGUgY29tbWFuZDogJXUsICVwXG4iLAogCQkJCWNtZC0+dmVyYiwgY21kLT5vYmoucHRyKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKaW5kZXggN2Y0YTRmOC4uMjQ2MTE3MSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKQEAgLTE3MTgsMTEgKzE3MTgsMjEgQEAKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKIAl9CiAKLQkvKiBGb3Igbm93LCBmYWlsIGFueSB1bnNlbnQvdW5hY2tlZCBkYXRhLiAgQ29uc2lkZXIgdGhlIG9wdGlvbmFsCi0JICogY2hvaWNlIG9mIHJlc2VuZGluZyBvZiB0aGlzIGRhdGEuCisJLyogRm9yIG5vdywgc3RvcCBwZW5kaW5nIFQzLXJ0eCBhbmQgU0FDSyB0aW1lcnMsIGZhaWwgYW55IHVuc2VudC91bmFja2VkCisJICogZGF0YS4gQ29uc2lkZXIgdGhlIG9wdGlvbmFsIGNob2ljZSBvZiByZXNlbmRpbmcgb2YgdGhpcyBkYXRhLgogCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVDNfUlRYX1RJTUVSU19TVE9QLCBTQ1RQX05VTEwoKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSykpOwogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUFVSR0VfT1VUUVVFVUUsIFNDVFBfTlVMTCgpKTsKIAorCS8qIFN0b3AgcGVuZGluZyBUNC1ydG8gdGltZXIsIHRlYXJkb3duIEFTQ09ORiBxdWV1ZSwgQVNDT05GLUFDSyBxdWV1ZQorCSAqIGFuZCBBU0NPTkYtQUNLIGNhY2hlLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1Q0X1JUTykpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUFVSR0VfQVNDT05GX1FVRVVFLCBTQ1RQX05VTEwoKSk7CisKIAlyZXBsID0gc2N0cF9tYWtlX2Nvb2tpZV9hY2sobmV3X2Fzb2MsIGNodW5rKTsKIAlpZiAoIXJlcGwpCiAJCWdvdG8gbm9tZW07CkBAIC01MTQ0LDcgKzUxNTQsNyBAQAogCSAqIFRoZSBzZW5kZXIgb2YgdGhlIFNIVVRET1dOIE1BWSBhbHNvIHN0YXJ0IGFuIG92ZXJhbGwgZ3VhcmQgdGltZXIKIAkgKiAnVDUtc2h1dGRvd24tZ3VhcmQnIHRvIGJvdW5kIHRoZSBvdmVyYWxsIHRpbWUgZm9yIHNodXRkb3duIHNlcXVlbmNlLgogCSAqLwotCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9SRVNUQVJULAogCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQpKTsKIAogCWlmIChhc29jLT5hdXRvY2xvc2UpCkBAIC01Mjg5LDE0ICs1Mjk5LDI4IEBACiAJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfVDNfUlRYX0VYUElSRURTKTsKIAogCWlmIChhc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID49IGFzb2MtPm1heF9yZXRyYW5zKSB7Ci0JCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKLQkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwotCQkvKiBDTURfQVNTT0NfRkFJTEVEIGNhbGxzIENNRF9ERUxFVEVfVENCLiAqLwotCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwotCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7Ci0JCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7Ci0JCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CisJCWlmIChhc29jLT5zdGF0ZSA9PSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpIHsKKwkJCS8qCisJCQkgKiBXZSBhcmUgaGVyZSBsaWtlbHkgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgaGFkIGl0cyByd25kCisJCQkgKiBjbG9zZWQgZm9yIGEgd2hpbGUgYW5kIHdlIGhhdmUgbm90IGJlZW4gYWJsZSB0bworCQkJICogdHJhbnNtaXQgdGhlIGxvY2FsbHkgcXVldWVkIGRhdGEgd2l0aGluIHRoZSBtYXhpbXVtCisJCQkgKiByZXRyYW5zbWlzc2lvbiBhdHRlbXB0cyBsaW1pdC4gIFN0YXJ0IHRoZSBUNQorCQkJICogc2h1dGRvd24gZ3VhcmQgdGltZXIgdG8gZ2l2ZSB0aGUgcmVjZWl2ZXIgb25lIGxhc3QKKwkJCSAqIGNoYW5jZSBhbmQgc29tZSBhZGRpdGlvbmFsIHRpbWUgdG8gcmVjb3ZlciBiZWZvcmUKKwkJCSAqIGFib3J0aW5nLgorCQkJICovCisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUQVJUX09OQ0UsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQpKTsKKwkJfSBlbHNlIHsKKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKKwkJCQkJU0NUUF9FUlJPUihFVElNRURPVVQpKTsKKwkJCS8qIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKKwkJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKKwkJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisJCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOworCQl9CiAJfQogCiAJLyogRTEpIEZvciB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBmb3Igd2hpY2ggdGhlIHRpbWVyCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKaW5kZXggMDMzOGRjNi4uN2MyMTFhNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCisrKyBiL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYwpAQCAtODI3LDcgKzgyNyw3IEBACiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCiAJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAogCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCA2NzY2OTEzLi5kM2NjZjc5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtMTM4NCw2ICsxMzg0LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKKwl1bnNpZ25lZCBpbnQgZGF0YV93YXNfdW5yZWFkOwogCiAJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfY2xvc2Uoc2s6IDB4JXAsIHRpbWVvdXQ6JWxkKVxuIiwgc2ssIHRpbWVvdXQpOwogCkBAIC0xMzkzLDYgKzEzOTQsMTAgQEAKIAogCWVwID0gc2N0cF9zayhzayktPmVwOwogCisJLyogQ2xlYW4gdXAgYW55IHNrYnMgc2l0dGluZyBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gICovCisJZGF0YV93YXNfdW5yZWFkID0gc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlkYXRhX3dhc191bnJlYWQgKz0gc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNjdHBfc2soc2spLT5wZF9sb2JieSk7CisKIAkvKiBXYWxrIGFsbCBhc3NvY2lhdGlvbnMgb24gYW4gZW5kcG9pbnQuICAqLwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZlcC0+YXNvY3MpIHsKIAkJYXNvYyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOwpAQCAtMTQxMCw3ICsxNDE1LDkgQEAKIAkJCX0KIAkJfQogCi0JCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiAhc2stPnNrX2xpbmdlcnRpbWUpIHsKKwkJaWYgKGRhdGFfd2FzX3VucmVhZCB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZhc29jLT51bHBxLmxvYmJ5KSB8fAorCQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmYXNvYy0+dWxwcS5yZWFzbSkgfHwKKwkJICAgIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiAhc2stPnNrX2xpbmdlcnRpbWUpKSB7CiAJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CiAKIAkJCWNodW5rID0gc2N0cF9tYWtlX2Fib3J0X3VzZXIoYXNvYywgTlVMTCwgMCk7CkBAIC0xNDIwLDEwICsxNDI3LDYgQEAKIAkJCXNjdHBfcHJpbWl0aXZlX1NIVVRET1dOKGFzb2MsIE5VTEwpOwogCX0KIAotCS8qIENsZWFuIHVwIGFueSBza2JzIHNpdHRpbmcgb24gdGhlIHJlY2VpdmUgcXVldWUuICAqLwotCXNjdHBfcXVldWVfcHVyZ2VfdWxwZXZlbnRzKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0Jc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNjdHBfc2soc2spLT5wZF9sb2JieSk7Ci0KIAkvKiBPbiBhIFRDUC1zdHlsZSBzb2NrZXQsIGJsb2NrIGZvciBhdCBtb3N0IGxpbmdlcl90aW1lIGlmIHNldC4gKi8KIAlpZiAoc2N0cF9zdHlsZShzaywgVENQKSAmJiB0aW1lb3V0KQogCQlzY3RwX3dhaXRfZm9yX2Nsb3NlKHNrLCB0aW1lb3V0KTsKQEAgLTIwNzMsMTAgKzIwNzYsMzMgQEAKIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2V2ZW50cyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCiAJCQkJICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogeworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKwogCWlmIChvcHRsZW4gPiBzaXplb2Yoc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZzY3RwX3NrKHNrKS0+c3Vic2NyaWJlLCBvcHR2YWwsIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBBdCB0aGUgdGltZSB3aGVuIGEgdXNlciBhcHAgc3Vic2NyaWJlcyB0byBTQ1RQX1NFTkRFUl9EUllfRVZFTlQsCisJICogaWYgdGhlcmUgaXMgbm8gZGF0YSB0byBiZSBzZW50IG9yIHJldHJhbnNtaXQsIHRoZSBzdGFjayB3aWxsCisJICogaW1tZWRpYXRlbHkgc2VuZCB1cCB0aGlzIG5vdGlmaWNhdGlvbi4KKwkgKi8KKwlpZiAoc2N0cF91bHBldmVudF90eXBlX2VuYWJsZWQoU0NUUF9TRU5ERVJfRFJZX0VWRU5ULAorCQkJCSAgICAgICAmc2N0cF9zayhzayktPnN1YnNjcmliZSkpIHsKKwkJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIDApOworCisJCWlmIChhc29jICYmIHNjdHBfb3V0cV9pc19lbXB0eSgmYXNvYy0+b3V0cXVldWUpKSB7CisJCQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9zZW5kZXJfZHJ5X2V2ZW50KGFzb2MsCisJCQkJCUdGUF9BVE9NSUMpOworCQkJaWYgKCFldmVudCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJc2N0cF91bHBxX3RhaWxfZXZlbnQoJmFzb2MtPnVscHEsIGV2ZW50KTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwppbmRleCBlNzBlNWZjLi44YTg0MDE3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTEwODEsOSArMTA4MSwxOSBAQAogfQogCiAvKiBQdXJnZSB0aGUgc2tiIGxpc3RzIGhvbGRpbmcgdWxwZXZlbnRzLiAqLwotdm9pZCBzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cyhzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQordW5zaWduZWQgaW50IHNjdHBfcXVldWVfcHVyZ2VfdWxwZXZlbnRzKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKGxpc3QpKSAhPSBOVUxMKQotCQlzY3RwX3VscGV2ZW50X2ZyZWUoc2N0cF9za2IyZXZlbnQoc2tiKSk7CisJdW5zaWduZWQgaW50IGRhdGFfdW5yZWFkID0gMDsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUobGlzdCkpICE9IE5VTEwpIHsKKwkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKworCQlpZiAoIXNjdHBfdWxwZXZlbnRfaXNfbm90aWZpY2F0aW9uKGV2ZW50KSkKKwkJCWRhdGFfdW5yZWFkICs9IHNrYi0+bGVuOworCisJCXNjdHBfdWxwZXZlbnRfZnJlZShldmVudCk7CisJfQorCisJcmV0dXJuIGRhdGFfdW5yZWFkOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCmluZGV4IDMzOWJhNjQuLjVkYWY2Y2MgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKQEAgLTU3NywxMyArNTc3LDEzIEBACiAJfQogCWlub2RlID0gJmdzc19tc2ctPmlub2RlLT52ZnNfaW5vZGU7CiAJZm9yICg7OykgewotCQlwcmVwYXJlX3RvX3dhaXQoJmdzc19tc2ctPndhaXRxdWV1ZSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXByZXBhcmVfdG9fd2FpdCgmZ3NzX21zZy0+d2FpdHF1ZXVlLCAmd2FpdCwgVEFTS19LSUxMQUJMRSk7CiAJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWlmIChnc3NfbXNnLT5jdHggIT0gTlVMTCB8fCBnc3NfbXNnLT5tc2cuZXJybm8gPCAwKSB7CiAJCQlicmVhazsKIAkJfQogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JCWlmIChzaWduYWxsZWQoKSkgeworCQlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCWVyciA9IC1FUkVTVEFSVFNZUzsKIAkJCWdvdG8gb3V0X2ludHI7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKaW5kZXggMGE5YTJlYy4uYzNiNzUzMyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjUuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19rcmI1X2VuY3R5cGVzLmg+CiAKICNpZmRlZiBSUENfREVCVUcKICMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfQVVUSApAQCAtNzUwLDcgKzc1MSw3IEBACiAJLmdtX29wcwkJPSAmZ3NzX2tlcmJlcm9zX29wcywKIAkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfa2VyYmVyb3NfcGZzKSwKIAkuZ21fcGZzCQk9IGdzc19rZXJiZXJvc19wZnMsCi0JLmdtX3VwY2FsbF9lbmN0eXBlcyA9ICIxOCwxNywxNiwyMywzLDEsMiIsCisJLmdtX3VwY2FsbF9lbmN0eXBlcyA9IEtSQjVfU1VQUE9SVEVEX0VOQ1RZUEVTLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9rZXJiZXJvc19tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2xudC5jIGIvbmV0L3N1bnJwYy9jbG50LmMKaW5kZXggYjg0ZDczOS4uOGM5MTQxNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTEwNjEsNyArMTA2MSw3IEBACiAKIAlkcHJpbnRrKCJSUEM6ICU1dSBycGNfYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLCB0YXNrLT50a19waWQpOwogCi0JaWYgKFJQQ19JU19BU1lOQyh0YXNrKSB8fCAhc2lnbmFsbGVkKCkpIHsKKwlpZiAoUlBDX0lTX0FTWU5DKHRhc2spIHx8ICFmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX2FsbG9jYXRlOwogCQlycGNfZGVsYXkodGFzaywgSFo+PjQpOwogCQlyZXR1cm47CkBAIC0xMTc1LDYgKzExNzUsOSBAQAogCQkJc3RhdHVzID0gLUVPUE5PVFNVUFA7CiAJCQlicmVhazsKIAkJfQorCQlpZiAodGFzay0+dGtfcmViaW5kX3JldHJ5ID09IDApCisJCQlicmVhazsKKwkJdGFzay0+dGtfcmViaW5kX3JldHJ5LS07CiAJCXJwY19kZWxheSh0YXNrLCAzKkhaKTsKIAkJZ290byByZXRyeV90aW1lb3V0OwogCWNhc2UgLUVUSU1FRE9VVDoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmMgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jCmluZGV4IDlhODBhOTIuLmU0NWQyZmIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJdTMyIGJpbmRfdmVyc2lvbjsKIAlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQ7CiAJc3RydWN0IHJwY19jbG50CSpycGNiX2NsbnQ7Ci0Jc3RhdGljIHN0cnVjdCBycGNiaW5kX2FyZ3MgKm1hcDsKKwlzdHJ1Y3QgcnBjYmluZF9hcmdzICptYXA7CiAJc3RydWN0IHJwY190YXNrCSpjaGlsZDsKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwogCXN0cnVjdCBzb2NrYWRkciAqc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zY2hlZC5jIGIvbmV0L3N1bnJwYy9zY2hlZC5jCmluZGV4IDZiNDNlZTcuLjQ4MTRlMjQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc2NoZWQuYworKysgYi9uZXQvc3VucnBjL3NjaGVkLmMKQEAgLTYxNiwzMCArNjE2LDI1IEBACiAJQlVHX09OKFJQQ19JU19RVUVVRUQodGFzaykpOwogCiAJZm9yICg7OykgeworCQl2b2lkICgqZG9fYWN0aW9uKShzdHJ1Y3QgcnBjX3Rhc2sgKik7CiAKIAkJLyoKLQkJICogRXhlY3V0ZSBhbnkgcGVuZGluZyBjYWxsYmFjay4KKwkJICogRXhlY3V0ZSBhbnkgcGVuZGluZyBjYWxsYmFjayBmaXJzdC4KIAkJICovCi0JCWlmICh0YXNrLT50a19jYWxsYmFjaykgewotCQkJdm9pZCAoKnNhdmVfY2FsbGJhY2spKHN0cnVjdCBycGNfdGFzayAqKTsKLQotCQkJLyoKLQkJCSAqIFdlIHNldCB0a19jYWxsYmFjayB0byBOVUxMIGJlZm9yZSBjYWxsaW5nIGl0LAotCQkJICogaW4gY2FzZSBpdCBzZXRzIHRoZSB0a19jYWxsYmFjayBmaWVsZCBpdHNlbGY6Ci0JCQkgKi8KLQkJCXNhdmVfY2FsbGJhY2sgPSB0YXNrLT50a19jYWxsYmFjazsKLQkJCXRhc2stPnRrX2NhbGxiYWNrID0gTlVMTDsKLQkJCXNhdmVfY2FsbGJhY2sodGFzayk7Ci0JCX0gZWxzZSB7CisJCWRvX2FjdGlvbiA9IHRhc2stPnRrX2NhbGxiYWNrOworCQl0YXNrLT50a19jYWxsYmFjayA9IE5VTEw7CisJCWlmIChkb19hY3Rpb24gPT0gTlVMTCkgewogCQkJLyoKIAkJCSAqIFBlcmZvcm0gdGhlIG5leHQgRlNNIHN0ZXAuCi0JCQkgKiB0a19hY3Rpb24gbWF5IGJlIE5VTEwgd2hlbiB0aGUgdGFzayBoYXMgYmVlbiBraWxsZWQKLQkJCSAqIGJ5IHNvbWVvbmUgZWxzZS4KKwkJCSAqIHRrX2FjdGlvbiBtYXkgYmUgTlVMTCBpZiB0aGUgdGFzayBoYXMgYmVlbiBraWxsZWQuCisJCQkgKiBJbiBwYXJ0aWN1bGFyLCBub3RlIHRoYXQgcnBjX2tpbGxhbGxfdGFza3MgbWF5CisJCQkgKiBkbyB0aGlzIGF0IGFueSB0aW1lLCBzbyBiZXdhcmUgd2hlbiBkZXJlZmVyZW5jaW5nLgogCQkJICovCi0JCQlpZiAodGFzay0+dGtfYWN0aW9uID09IE5VTEwpCisJCQlkb19hY3Rpb24gPSB0YXNrLT50a19hY3Rpb247CisJCQlpZiAoZG9fYWN0aW9uID09IE5VTEwpCiAJCQkJYnJlYWs7Ci0JCQl0YXNrLT50a19hY3Rpb24odGFzayk7CiAJCX0KKwkJZG9fYWN0aW9uKHRhc2spOwogCiAJCS8qCiAJCSAqIExvY2tsZXNzIGNoZWNrIGZvciB3aGV0aGVyIHRhc2sgaXMgc2xlZXBpbmcgb3Igbm90LgpAQCAtNzkyLDYgKzc4Nyw3IEBACiAJLyogSW5pdGlhbGl6ZSByZXRyeSBjb3VudGVycyAqLwogCXRhc2stPnRrX2dhcmJfcmV0cnkgPSAyOwogCXRhc2stPnRrX2NyZWRfcmV0cnkgPSAyOworCXRhc2stPnRrX3JlYmluZF9yZXRyeSA9IDI7CiAKIAl0YXNrLT50a19wcmlvcml0eSA9IHRhc2tfc2V0dXBfZGF0YS0+cHJpb3JpdHkgLSBSUENfUFJJT1JJVFlfTE9XOwogCXRhc2stPnRrX293bmVyID0gY3VycmVudC0+dGdpZDsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCmluZGV4IGMyMmVmMzQuLjg4MGRiZTIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwpAQCAtMzY2LDYgKzM2Niw3IEBACiAKIAltdXRleF9pbml0KCZyZGV2LT5tdHgpOwogCW11dGV4X2luaXQoJnJkZXYtPmRldmxpc3RfbXR4KTsKKwltdXRleF9pbml0KCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPm5ldGRldl9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmcmRldi0+YnNzX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5ic3NfbGlzdCk7CkBAIC03MDEsNiArNzAyLDcgQEAKIAlyZmtpbGxfZGVzdHJveShyZGV2LT5yZmtpbGwpOwogCW11dGV4X2Rlc3Ryb3koJnJkZXYtPm10eCk7CiAJbXV0ZXhfZGVzdHJveSgmcmRldi0+ZGV2bGlzdF9tdHgpOworCW11dGV4X2Rlc3Ryb3koJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2NhbiwgdG1wLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpCiAJCWNmZzgwMjExX3B1dF9ic3MoJnNjYW4tPnB1Yik7CiAJY2ZnODAyMTFfcmRldl9mcmVlX3dvd2xhbihyZGV2KTsKQEAgLTczNywxMiArNzM5LDE2IEBACiAJCV9fX2NmZzgwMjExX3NjYW5fZG9uZShyZGV2LCB0cnVlKTsKIAl9CiAKKwljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKworCW11dGV4X2xvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKKwogCWlmIChXQVJOX09OKHJkZXYtPnNjaGVkX3NjYW5fcmVxICYmCiAJCSAgICByZGV2LT5zY2hlZF9zY2FuX3JlcS0+ZGV2ID09IHdkZXYtPm5ldGRldikpIHsKIAkJX19jZmc4MDIxMV9zdG9wX3NjaGVkX3NjYW4ocmRldiwgZmFsc2UpOwogCX0KIAotCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCiAJbXV0ZXhfbG9jaygmcmRldi0+ZGV2bGlzdF9tdHgpOwogCXJkZXYtPm9wZW5jb3VudC0tOwpAQCAtODMwLDkgKzgzNiw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgogCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCQljZmc4MDIxMV9sb2NrX3JkZXYocmRldik7CisJCQltdXRleF9sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAJCQlfX2NmZzgwMjExX3N0b3Bfc2NoZWRfc2NhbihyZGV2LCBmYWxzZSk7Ci0JCQljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKwkJCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCiAJCQl3ZGV2X2xvY2sod2Rldik7CiAjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFQKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IDNkY2UxZjEuLmE1NzBmZjkgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtNjUsNiArNjUsOCBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBzY2FuX2RvbmVfd2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IHNjaGVkX3NjYW5fcmVzdWx0c193azsKIAorCXN0cnVjdCBtdXRleCBzY2hlZF9zY2FuX210eDsKKwogI2lmZGVmIENPTkZJR19OTDgwMjExX1RFU1RNT0RFCiAJc3RydWN0IGdlbmxfaW5mbyAqdGVzdG1vZGVfaW5mbzsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKaW5kZXggZWM4M2Y0MS4uY2VhMzM4MSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYworKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCkBAIC0zNDA2LDEyICszNDA2LDEyIEBACiAJaSA9IDA7CiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSkgewogCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSwgdG1wKSB7Ci0JCQlpZiAocmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7CisJCQlpZiAobmxhX2xlbihhdHRyKSA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9Ci0JCQltZW1jcHkocmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwgbmxhX2RhdGEoYXR0ciksIG5sYV9sZW4oYXR0cikpOwogCQkJcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4gPSBubGFfbGVuKGF0dHIpOworCQkJbWVtY3B5KHJlcXVlc3QtPnNzaWRzW2ldLnNzaWQsIG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpKTsKIAkJCWkrKzsKIAkJfQogCX0KQEAgLTM0NjEsOSArMzQ2MSw2IEBACiAJaWYgKCFpc192YWxpZF9pZV9hdHRyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChyZGV2LT5zY2hlZF9zY2FuX3JlcSkKLQkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKLQogCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fSU5URVJWQUxdKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzUwMiwxMiArMzQ5OSwyMSBAQAogCWlmIChpZV9sZW4gPiB3aXBoeS0+bWF4X3NjYW5faWVfbGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW11dGV4X2xvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKKworCWlmIChyZGV2LT5zY2hlZF9zY2FuX3JlcSkgeworCQllcnIgPSAtRUlOUFJPR1JFU1M7CisJCWdvdG8gb3V0OworCX0KKwogCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCkKIAkJCSsgc2l6ZW9mKCpyZXF1ZXN0LT5zc2lkcykgKiBuX3NzaWRzCiAJCQkrIHNpemVvZigqcmVxdWVzdC0+Y2hhbm5lbHMpICogbl9jaGFubmVscwogCQkJKyBpZV9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghcmVxdWVzdCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFyZXF1ZXN0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCWlmIChuX3NzaWRzKQogCQlyZXF1ZXN0LT5zc2lkcyA9ICh2b2lkICopJnJlcXVlc3QtPmNoYW5uZWxzW25fY2hhbm5lbHNdOwpAQCAtMzU3MiwxNCArMzU3OCwxMyBAQAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU0NBTl9TU0lEU10pIHsKIAkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU0NBTl9TU0lEU10sCiAJCQkJICAgIHRtcCkgewotCQkJaWYgKHJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuID4KLQkJCSAgICBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7CisJCQlpZiAobmxhX2xlbihhdHRyKSA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CisJCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7CiAJCQltZW1jcHkocmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwgbmxhX2RhdGEoYXR0ciksCiAJCQkgICAgICAgbmxhX2xlbihhdHRyKSk7Ci0JCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7CiAJCQlpKys7CiAJCX0KIAl9CkBAIC0zNjA2LDYgKzM2MTEsNyBAQAogb3V0X2ZyZWU6CiAJa2ZyZWUocmVxdWVzdCk7CiBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzYxMywxMiArMzYxOSwxNyBAQAogCQkJCSAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJaW50IGVycjsKIAogCWlmICghKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19TQ0hFRF9TQ0FOKSB8fAogCSAgICAhcmRldi0+b3BzLT5zY2hlZF9zY2FuX3N0b3ApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXJldHVybiBfX2NmZzgwMjExX3N0b3Bfc2NoZWRfc2NhbihyZGV2LCBmYWxzZSk7CisJbXV0ZXhfbG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOworCWVyciA9IF9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHJkZXYsIGZhbHNlKTsKKwltdXRleF91bmxvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbmw4MDIxMV9zZW5kX2JzcyhzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZmxhZ3MsCkBAIC02NDY0LDcgKzY0NzUsOCBAQAogCWlmIChhZGRyKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOwogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0tFWV9UWVBFLCBrZXlfdHlwZSk7Ci0JTkxBX1BVVF9VOChtc2csIE5MODAyMTFfQVRUUl9LRVlfSURYLCBrZXlfaWQpOworCWlmIChrZXlfaWQgIT0gLTEpCisJCU5MQV9QVVRfVTgobXNnLCBOTDgwMjExX0FUVFJfS0VZX0lEWCwga2V5X2lkKTsKIAlpZiAodHNjKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0tFWV9TRVEsIDYsIHRzYyk7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zY2FuLmMgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCmluZGV4IDczYTQ0MWQuLmFlMGMyMjUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zY2FuLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwpAQCAtMTAwLDE0ICsxMDAsMTQgQEAKIAlyZGV2ID0gY29udGFpbmVyX29mKHdrLCBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UsCiAJCQkgICAgc2NoZWRfc2Nhbl9yZXN1bHRzX3drKTsKIAotCWNmZzgwMjExX2xvY2tfcmRldihyZGV2KTsKKwltdXRleF9sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAKIAkvKiB3ZSBkb24ndCBoYXZlIHNjaGVkX3NjYW5fcmVxIGFueW1vcmUgaWYgdGhlIHNjYW4gaXMgc3RvcHBpbmcgKi8KIAlpZiAocmRldi0+c2NoZWRfc2Nhbl9yZXEpCiAJCW5sODAyMTFfc2VuZF9zY2hlZF9zY2FuX3Jlc3VsdHMocmRldiwKIAkJCQkJCXJkZXYtPnNjaGVkX3NjYW5fcmVxLT5kZXYpOwogCi0JY2ZnODAyMTFfdW5sb2NrX3JkZXYocmRldik7CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiB9CiAKIHZvaWQgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKHN0cnVjdCB3aXBoeSAqd2lwaHkpCkBAIC0xMjMsOSArMTIzLDkgQEAKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOwogCi0JY2ZnODAyMTFfbG9ja19yZGV2KHJkZXYpOworCW11dGV4X2xvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAlfX2NmZzgwMjExX3N0b3Bfc2NoZWRfc2NhbihyZGV2LCB0cnVlKTsKLQljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKwltdXRleF91bmxvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkKTsKIApAQCAtMTM1LDcgKzEzNSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCi0JQVNTRVJUX1JERVZfTE9DSyhyZGV2KTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAKIAlpZiAoIXJkZXYtPnNjaGVkX3NjYW5fcmVxKQogCQlyZXR1cm4gMDsKQEAgLTI2NywxMyArMjY3LDM1IEBACiAJcmV0dXJuIG1lbWNtcChzc2lkaWUgKyAyLCBzc2lkLCBzc2lkX2xlbikgPT0gMDsKIH0KIAorc3RhdGljIGJvb2wgaXNfbWVzaF9ic3Moc3RydWN0IGNmZzgwMjExX2JzcyAqYSkKK3sKKwljb25zdCB1OCAqaWU7CisKKwlpZiAoIVdMQU5fQ0FQQUJJTElUWV9JU19TVEFfQlNTKGEtPmNhcGFiaWxpdHkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfTUVTSF9JRCwKKwkJCSAgICAgIGEtPmluZm9ybWF0aW9uX2VsZW1lbnRzLAorCQkJICAgICAgYS0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKKwlpZiAoIWllKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfTUVTSF9DT05GSUcsCisJCQkgICAgICBhLT5pbmZvcm1hdGlvbl9lbGVtZW50cywKKwkJCSAgICAgIGEtPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7CisJaWYgKCFpZSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBib29sIGlzX21lc2goc3RydWN0IGNmZzgwMjExX2JzcyAqYSwKIAkJICAgIGNvbnN0IHU4ICptZXNoaWQsIHNpemVfdCBtZXNoaWRsZW4sCiAJCSAgICBjb25zdCB1OCAqbWVzaGNmZykKIHsKIAljb25zdCB1OCAqaWU7CiAKLQlpZiAoIVdMQU5fQ0FQQUJJTElUWV9JU19NQlNTKGEtPmNhcGFiaWxpdHkpKQorCWlmICghV0xBTl9DQVBBQklMSVRZX0lTX1NUQV9CU1MoYS0+Y2FwYWJpbGl0eSkpCiAJCXJldHVybiBmYWxzZTsKIAogCWllID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9NRVNIX0lELApAQCAtMzExLDcgKzMzMyw3IEBACiAJaWYgKGEtPmNoYW5uZWwgIT0gYi0+Y2hhbm5lbCkKIAkJcmV0dXJuIGItPmNoYW5uZWwtPmNlbnRlcl9mcmVxIC0gYS0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXE7CiAKLQlpZiAoV0xBTl9DQVBBQklMSVRZX0lTX01CU1MoYS0+Y2FwYWJpbGl0eSB8IGItPmNhcGFiaWxpdHkpKSB7CisJaWYgKGlzX21lc2hfYnNzKGEpICYmIGlzX21lc2hfYnNzKGIpKSB7CiAJCXIgPSBjbXBfaWVzKFdMQU5fRUlEX01FU0hfSUQsCiAJCQkgICAgYS0+aW5mb3JtYXRpb25fZWxlbWVudHMsCiAJCQkgICAgYS0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzLApAQCAtNDU3LDcgKzQ3OSw2IEBACiAJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpyZXMpCiB7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqZm91bmQgPSBOVUxMOwotCWNvbnN0IHU4ICptZXNoaWQsICptZXNoY2ZnOwogCiAJLyoKIAkgKiBUaGUgcmVmZXJlbmNlIHRvICJyZXMiIGlzIGRvbmF0ZWQgdG8gdGhpcyBmdW5jdGlvbi4KQEAgLTQ3MCwyMiArNDkxLDYgQEAKIAogCXJlcy0+dHMgPSBqaWZmaWVzOwogCi0JaWYgKFdMQU5fQ0FQQUJJTElUWV9JU19NQlNTKHJlcy0+cHViLmNhcGFiaWxpdHkpKSB7Ci0JCS8qIG11c3QgYmUgbWVzaCwgdmVyaWZ5ICovCi0JCW1lc2hpZCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfTUVTSF9JRCwKLQkJCQkJICByZXMtPnB1Yi5pbmZvcm1hdGlvbl9lbGVtZW50cywKLQkJCQkJICByZXMtPnB1Yi5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMpOwotCQltZXNoY2ZnID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9NRVNIX0NPTkZJRywKLQkJCQkJICAgcmVzLT5wdWIuaW5mb3JtYXRpb25fZWxlbWVudHMsCi0JCQkJCSAgIHJlcy0+cHViLmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7Ci0JCWlmICghbWVzaGlkIHx8ICFtZXNoY2ZnIHx8Ci0JCSAgICBtZXNoY2ZnWzFdICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llKSkgewotCQkJLyogYm9ndXMgbWVzaCAqLwotCQkJa3JlZl9wdXQoJnJlcy0+cmVmLCBic3NfcmVsZWFzZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQogCXNwaW5fbG9ja19iaCgmZGV2LT5ic3NfbG9jayk7CiAKIAlmb3VuZCA9IHJiX2ZpbmRfYnNzKGRldiwgcmVzKTsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCmluZGV4IDliZWMyZTguLjVjZTc0YTMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKKysrIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHZvaWQgeGZybV9wb2xpY3lfcHV0X2FmaW5mbyhzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8pOwogc3RhdGljIHZvaWQgeGZybV9pbml0X3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIHN0YXRpYyBpbnQgc3RhbGVfYnVuZGxlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7Ci1zdGF0aWMgaW50IHhmcm1fYnVuZGxlX29rKHN0cnVjdCB4ZnJtX2RzdCAqeGRzdCwgaW50IGZhbWlseSk7CitzdGF0aWMgaW50IHhmcm1fYnVuZGxlX29rKHN0cnVjdCB4ZnJtX2RzdCAqeGRzdCk7CiAKIAogc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeSAqX194ZnJtX3BvbGljeV91bmxpbmsoc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsCkBAIC0yMjQxLDcgKzIyNDEsNyBAQAogCiBzdGF0aWMgaW50IHN0YWxlX2J1bmRsZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7Ci0JcmV0dXJuICF4ZnJtX2J1bmRsZV9vaygoc3RydWN0IHhmcm1fZHN0ICopZHN0LCBBRl9VTlNQRUMpOworCXJldHVybiAheGZybV9idW5kbGVfb2soKHN0cnVjdCB4ZnJtX2RzdCAqKWRzdCk7CiB9CiAKIHZvaWQgeGZybV9kc3RfaWZkb3duKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTIzMTMsNyArMjMxMyw3IEBACiAgKiBzdGlsbCB2YWxpZC4KICAqLwogCi1zdGF0aWMgaW50IHhmcm1fYnVuZGxlX29rKHN0cnVjdCB4ZnJtX2RzdCAqZmlyc3QsIGludCBmYW1pbHkpCitzdGF0aWMgaW50IHhmcm1fYnVuZGxlX29rKHN0cnVjdCB4ZnJtX2RzdCAqZmlyc3QpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gJmZpcnN0LT51LmRzdDsKIAlzdHJ1Y3QgeGZybV9kc3QgKmxhc3Q7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3JlcGxheS5jIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwppbmRleCA0N2YxYjg2Li5iMTFlYTY5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3JlcGxheS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCQkJYml0bnIgPSBiaXRuciAmIDB4MUY7CiAJCQlyZXBsYXlfZXNuLT5ibXBbbnJdIHw9ICgxVSA8PCBiaXRucik7CiAJCX0gZWxzZSB7Ci0JCQluciA9IHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgPj4gNTsKKwkJCW5yID0gKHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgLSAxKSA+PiA1OwogCQkJZm9yIChpID0gMDsgaSA8PSBucjsgaSsrKQogCQkJCXJlcGxheV9lc24tPmJtcFtpXSA9IDA7CiAKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCQkJYml0bnIgPSBiaXRuciAmIDB4MUY7CiAJCQlyZXBsYXlfZXNuLT5ibXBbbnJdIHw9ICgxVSA8PCBiaXRucik7CiAJCX0gZWxzZSB7Ci0JCQluciA9IHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgPj4gNTsKKwkJCW5yID0gKHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgLSAxKSA+PiA1OwogCQkJZm9yIChpID0gMDsgaSA8PSBucjsgaSsrKQogCQkJCXJlcGxheV9lc24tPmJtcFtpXSA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCBkNzBmODVlLi45NDE0YjljIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3N0YXRlLmMKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC0xMzQ1LDYgKzEzNDUsOCBAQAogCQkJeGZybV9zdGF0ZV9jaGVja19leHBpcmUoeDEpOwogCiAJCWVyciA9IDA7CisJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOworCQlfX3hmcm1fc3RhdGVfcHV0KHgpOwogCX0KIAlzcGluX3VubG9ja19iaCgmeDEtPmxvY2spOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmFzbS1nZW5lcmljIGIvc2NyaXB0cy9NYWtlZmlsZS5hc20tZ2VuZXJpYwppbmRleCA0OTAxMjJjLi40MGNhZjNjIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmFzbS1nZW5lcmljCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYXNtLWdlbmVyaWMKQEAgLTE3LDYgKzE3LDcgQEAKIGNtZF93cmFwID0gZWNobyAiXCNpbmNsdWRlIDxhc20tZ2VuZXJpYy8kKi5oPiIgPiRACiAKIGFsbDogJChwYXRzdWJzdCAlLCAkKG9iaikvJSwgJChnZW5lcmljLXkpKQorCUA6CiAKICQob2JqKS8lLmg6CiAJJChjYWxsIGNtZCx3cmFwKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCmluZGV4IDg2NTdmOTkuLmIwYWEyYzYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbAorKysgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKQEAgLTE5NDMsNiArMTk0MywxMSBAQAogCQkJV0FSTigiTElOVVhfVkVSU0lPTl9DT0RFIHNob3VsZCBiZSBhdm9pZGVkLCBjb2RlIHNob3VsZCBiZSBmb3IgdGhlIHZlcnNpb24gdG8gd2hpY2ggaXQgaXMgbWVyZ2VkXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCisjIGNoZWNrIGZvciB1c2VzIG9mIHByaW50a19yYXRlbGltaXQKKwkJaWYgKCRsaW5lID1+IC9cYnByaW50a19yYXRlbGltaXRccypcKC8pIHsKKwkJCVdBUk4oIlByZWZlciBwcmludGtfcmF0ZWxpbWl0ZWQgb3IgcHJfPGxldmVsPl9yYXRlbGltaXRlZCB0byBwcmludGtfcmF0ZWxpbWl0XG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIHByaW50ayBzaG91bGQgdXNlIEtFUk5fKiBsZXZlbHMuICBOb3RlIHRoYXQgZm9sbG93IG9uIHByaW50aydzIG9uIHRoZQogIyBzYW1lIGxpbmUgZG8gbm90IG5lZWQgYSBsZXZlbCwgc28gd2UgdXNlIHRoZSBjdXJyZW50IGJsb2NrIGNvbnRleHQKICMgdG8gdHJ5IGFuZCBmaW5kIGFuZCB2YWxpZGF0ZSB0aGUgY3VycmVudCBwcmludGsuICBJbiBzdW1tYXJ5IHRoZSBjdXJyZW50CmRpZmYgLS1naXQgYS9zY3JpcHRzL2RlcG1vZC5zaCBiL3NjcmlwdHMvZGVwbW9kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNzIzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2RlcG1vZC5zaApAQCAtMCwwICsxLDUwIEBACisjIS9iaW4vc2gKKyMKKyMgQSBkZXBtb2Qgd3JhcHBlciB1c2VkIGJ5IHRoZSB0b3BsZXZlbCBNYWtlZmlsZQorCitpZiB0ZXN0ICQjIC1uZSAyOyB0aGVuCisJZWNobyAiVXNhZ2U6ICQwIC9zYmluL2RlcG1vZCA8a2VybmVscmVsZWFzZT4iID4mMgorCWV4aXQgMQorZmkKK0RFUE1PRD0kMQorS0VSTkVMUkVMRUFTRT0kMgorCitpZiAhICIkREVQTU9EIiAtViAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgbW9kdWxlLWluaXQtdG9vbHM7IHRoZW4KKwllY2hvICJXYXJuaW5nOiB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBtb2R1bGUtaW5pdC10b29scyIgPiYyCisJZWNobyAiU2VlIGh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvZG9jcy9wb3N0LWhhbGxvd2Vlbi0yLjYudHh0IiA+JjIKKwlzbGVlcCAxCitmaQorCitpZiAhIHRlc3QgLXIgU3lzdGVtLm1hcCAtYSAteCAiJERFUE1PRCI7IHRoZW4KKwlleGl0IDAKK2ZpCisjIG9sZGVyIHZlcnNpb25zIG9mIGRlcG1vZCByZXF1aXJlIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBzdGFydCB3aXRoIHRocmVlCisjIG51bWJlcnMsIHNvIHdlIGNoZWF0IHdpdGggYSBzeW1saW5rIGhlcmUKK2RlcG1vZF9oYWNrX25lZWRlZD10cnVlCit0bXBfZGlyPSQobWt0ZW1wIC1kICR7VE1QRElSOi0vdG1wfS9kZXBtb2QuWFhYWFhYKQorbWtkaXIgLXAgIiR0bXBfZGlyL2xpYi9tb2R1bGVzLyRLRVJORUxSRUxFQVNFIgoraWYgIiRERVBNT0QiIC1iICIkdG1wX2RpciIgJEtFUk5FTFJFTEVBU0UgMj4vZGV2L251bGw7IHRoZW4KKwlpZiB0ZXN0IC1lICIkdG1wX2Rpci9saWIvbW9kdWxlcy8kS0VSTkVMUkVMRUFTRS9tb2R1bGVzLmRlcCIgLW8gXAorCQktZSAiJHRtcF9kaXIvbGliL21vZHVsZXMvJEtFUk5FTFJFTEVBU0UvbW9kdWxlcy5kZXAuYmluIjsgdGhlbgorCQlkZXBtb2RfaGFja19uZWVkZWQ9ZmFsc2UKKwlmaQorZmkKK3JtIC1yZiAiJHRtcF9kaXIiCitpZiAkZGVwbW9kX2hhY2tfbmVlZGVkOyB0aGVuCisJc3ltbGluaz0iJElOU1RBTExfTU9EX1BBVEgvbGliL21vZHVsZXMvOTkuOTguJEtFUk5FTFJFTEVBU0UiCisJbG4gLXMgIiRLRVJORUxSRUxFQVNFIiAiJHN5bWxpbmsiCisJS0VSTkVMUkVMRUFTRT05OS45OC4kS0VSTkVMUkVMRUFTRQorZmkKKworc2V0IC0tIC1hZSAtRiBTeXN0ZW0ubWFwCitpZiB0ZXN0IC1uICIkSU5TVEFMTF9NT0RfUEFUSCI7IHRoZW4KKwlzZXQgLS0gIiRAIiAtYiAiJElOU1RBTExfTU9EX1BBVEgiCitmaQorIiRERVBNT0QiICIkQCIgIiRLRVJORUxSRUxFQVNFIgorcmV0PSQ/CisKK2lmICRkZXBtb2RfaGFja19uZWVkZWQ7IHRoZW4KKwlybSAtZiAiJHN5bWxpbmsiCitmaQorCitleGl0ICRyZXQKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmMKaW5kZXggYWUzYTY5OC4uM2QyZmQxNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmMKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmMKQEAgLTU5Myw3ICs1OTMsOCBAQAogCQkJc2EuYWFkLm9wID0gT1BfU0VUUFJPQ0FUVFI7CiAJCQlzYS5hYWQuaW5mbyA9IG5hbWU7CiAJCQlzYS5hYWQuZXJyb3IgPSAtRUlOVkFMOwotCQkJcmV0dXJuIGFhX2F1ZGl0KEFVRElUX0FQUEFSTU9SX0RFTklFRCwgTlVMTCwgR0ZQX0tFUk5FTCwKKwkJCXJldHVybiBhYV9hdWRpdChBVURJVF9BUFBBUk1PUl9ERU5JRUQsCisJCQkJCV9fYWFfY3VycmVudF9wcm9maWxlKCksIEdGUF9LRVJORUwsCiAJCQkJCSZzYSwgTlVMTCk7CiAJCX0KIAl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiZXhlYyIpID09IDApIHsKQEAgLTYxMSw3ICs2MTIsNyBAQAogc3RhdGljIGludCBhcHBhcm1vcl90YXNrX3NldHJsaW1pdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCXVuc2lnbmVkIGludCByZXNvdXJjZSwgc3RydWN0IHJsaW1pdCAqbmV3X3JsaW0pCiB7Ci0Jc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUgPSBhYV9jdXJyZW50X3Byb2ZpbGUoKTsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IF9fYWFfY3VycmVudF9wcm9maWxlKCk7CiAJaW50IGVycm9yID0gMDsKIAogCWlmICghdW5jb25maW5lZChwcm9maWxlKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYyBiL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYwppbmRleCBjZDFmNzc5Li4xYmU2ODI2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKKysrIGIvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCkBAIC00NzQsMTcgKzQ3NCwxMSBAQAogCS5zdWJzeXNfaWQgPSBkZXZpY2VzX3N1YnN5c19pZCwKIH07CiAKLWludCBkZXZjZ3JvdXBfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK2ludCBfX2RldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXN0cnVjdCBkZXZfY2dyb3VwICpkZXZfY2dyb3VwOwogCXN0cnVjdCBkZXZfd2hpdGVsaXN0X2l0ZW0gKndoOwogCi0JZGV2X3QgZGV2aWNlID0gaW5vZGUtPmlfcmRldjsKLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUpICYmICFTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQotCQlyZXR1cm4gMDsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAogCWRldl9jZ3JvdXAgPSB0YXNrX2RldmNncm91cChjdXJyZW50KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwppbmRleCBkMzE4NjJlLi44MjQ2NTMyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKKysrIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCkBAIC03MSw5ICs3MSw4IEBACiAgKiBUaGlzIGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZyZXNobHkgZm9ya2VkIGt0aHJlYWQgYmVmb3JlIGtlcm5lbF9leGVjdmUoKSwKICAqIHNvIHdlIGNhbiBzaW1wbHkgaW5zdGFsbCB0aGUgZGVzaXJlZCBzZXNzaW9uX2tleXJpbmcgYXQgdGhpcyBwb2ludC4KICAqLwotc3RhdGljIGludCB1bWhfa2V5c19pbml0KHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHVtaF9rZXlzX2luaXQoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKmNyZWQpCiB7Ci0Jc3RydWN0IGNyZWQgKmNyZWQgPSAoc3RydWN0IGNyZWQqKWN1cnJlbnRfY3JlZCgpOwogCXN0cnVjdCBrZXkgKmtleXJpbmcgPSBpbmZvLT5kYXRhOwogCiAJcmV0dXJuIGluc3RhbGxfc2Vzc2lvbl9rZXlyaW5nX3RvX2NyZWQoY3JlZCwga2V5cmluZyk7CkBAIC00NzAsNyArNDY5LDcgQEAKIAl9IGVsc2UgaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MpIHsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewotCQlrZXkgPSBFUlJfUFRSKHJldCk7CisJCWdvdG8gY291bGRudF9hbGxvY19rZXk7CiAJfQogCiAJa2V5X3B1dChkZXN0X2tleXJpbmcpOwpAQCAtNDgwLDYgKzQ3OSw3IEBACiBjb25zdHJ1Y3Rpb25fZmFpbGVkOgogCWtleV9uZWdhdGVfYW5kX2xpbmsoa2V5LCBrZXlfbmVnYXRpdmVfdGltZW91dCwgTlVMTCwgTlVMTCk7CiAJa2V5X3B1dChrZXkpOworY291bGRudF9hbGxvY19rZXk6CiAJa2V5X3B1dChkZXN0X2tleXJpbmcpOwogCWtsZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggYTBkMzg0NS4uMjAyMTllZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMTQ3Niw3ICsxNDc2LDYgQEAKIAkJCSAgdW5zaWduZWQgZmxhZ3MpCiB7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKLQlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgYWQ7CiAJdTMyIHNpZDsKIAogCXZhbGlkYXRlX2NyZWRzKGNyZWQpOwpAQCAtMTQ4NywxNSArMTQ4NiwyMSBAQAogCXNpZCA9IGNyZWRfc2lkKGNyZWQpOwogCWlzZWMgPSBpbm9kZS0+aV9zZWN1cml0eTsKIAotCWlmICghYWRwKSB7Ci0JCWFkcCA9ICZhZDsKLQkJQ09NTU9OX0FVRElUX0RBVEFfSU5JVCgmYWQsIElOT0RFKTsKLQkJYWQudS5pbm9kZSA9IGlub2RlOwotCX0KLQogCXJldHVybiBhdmNfaGFzX3Blcm1fZmxhZ3Moc2lkLCBpc2VjLT5zaWQsIGlzZWMtPnNjbGFzcywgcGVybXMsIGFkcCwgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGlub2RlX2hhc19wZXJtX25vYWRwKGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJdTMyIHBlcm1zLAorCQkJCXVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhZDsKKworCUNPTU1PTl9BVURJVF9EQVRBX0lOSVQoJmFkLCBJTk9ERSk7CisJYWQudS5pbm9kZSA9IGlub2RlOworCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBpbm9kZSwgcGVybXMsICZhZCwgZmxhZ3MpOworfQorCiAvKiBTYW1lIGFzIGlub2RlX2hhc19wZXJtLCBidXQgcGFzcyBleHBsaWNpdCBhdWRpdCBkYXRhIGNvbnRhaW5pbmcKICAgIHRoZSBkZW50cnkgdG8gaGVscCB0aGUgYXVkaXRpbmcgY29kZSB0byBtb3JlIGVhc2lseSBnZW5lcmF0ZSB0aGUKICAgIHBhdGhuYW1lIGlmIG5lZWRlZC4gKi8KQEAgLTIxMjIsOCArMjEyNyw4IEBACiAJCQkJCQlzdHJ1Y3QgdHR5X2ZpbGVfcHJpdmF0ZSwgbGlzdCk7CiAJCQlmaWxlID0gZmlsZV9wcml2LT5maWxlOwogCQkJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCQkJaWYgKGlub2RlX2hhc19wZXJtKGNyZWQsIGlub2RlLAotCQkJCQkgICBGSUxFX19SRUFEIHwgRklMRV9fV1JJVEUsIE5VTEwsIDApKSB7CisJCQlpZiAoaW5vZGVfaGFzX3Blcm1fbm9hZHAoY3JlZCwgaW5vZGUsCisJCQkJCSAgIEZJTEVfX1JFQUQgfCBGSUxFX19XUklURSwgMCkpIHsKIAkJCQlkcm9wX3R0eSA9IDE7CiAJCQl9CiAJCX0KQEAgLTMyMjgsNyArMzIzMyw3IEBACiAJICogbmV3IGlub2RlIGxhYmVsIG9yIG5ldyBwb2xpY3kuCiAJICogVGhpcyBjaGVjayBpcyBub3QgcmVkdW5kYW50IC0gZG8gbm90IHJlbW92ZS4KIAkgKi8KLQlyZXR1cm4gaW5vZGVfaGFzX3Blcm0oY3JlZCwgaW5vZGUsIG9wZW5fZmlsZV90b19hdihmaWxlKSwgTlVMTCwgMCk7CisJcmV0dXJuIGlub2RlX2hhc19wZXJtX25vYWRwKGNyZWQsIGlub2RlLCBvcGVuX2ZpbGVfdG9fYXYoZmlsZSksIDApOwogfQogCiAvKiB0YXNrIHNlY3VyaXR5IG9wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IDc3ZDQ0MTMuLjM1NDU5MzQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAvKiBzZWxpbnV4ZnMgcHNldWRvIGZpbGVzeXN0ZW0gZm9yIGV4cG9ydGluZyB0aGUgc2VjdXJpdHkgcG9saWN5IEFQSS4KICAgIEJhc2VkIG9uIHRoZSBwcm9jIGNvZGUgYW5kIHRoZSBmcy9uZnNkL25mc2N0bC5jIGNvZGUuICovCkBAIC03NTEsNiArNzUyLDE0IEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaGV4Y29kZV90b19pbnQoaW50IGNvZGUpIHsKKwlpZiAoY29kZSA9PSAnXDAnIHx8ICFpc3hkaWdpdChjb2RlKSkKKwkJcmV0dXJuIC0xOworCWlmIChpc2RpZ2l0KGNvZGUpKQorCQlyZXR1cm4gY29kZSAtICcwJzsKKwlyZXR1cm4gdG9sb3dlcihjb2RlKSAtICdhJyArIDEwOworfQorCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfY3JlYXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCWNoYXIgKnNjb24gPSBOVUxMLCAqdGNvbiA9IE5VTEw7CkBAIC03ODUsOCArNzk0LDM0IEBACiAJbmFyZ3MgPSBzc2NhbmYoYnVmLCAiJXMgJXMgJWh1ICVzIiwgc2NvbiwgdGNvbiwgJnRjbGFzcywgbmFtZWJ1Zik7CiAJaWYgKG5hcmdzIDwgMyB8fCBuYXJncyA+IDQpCiAJCWdvdG8gb3V0OwotCWlmIChuYXJncyA9PSA0KQorCWlmIChuYXJncyA9PSA0KSB7CisJCS8qCisJCSAqIElmIGFuZCB3aGVuIHRoZSBuYW1lIG9mIG5ldyBvYmplY3QgdG8gYmUgcXVlcmllZCBjb250YWlucworCQkgKiBlaXRoZXIgd2hpdGVzcGFjZSBvciBtdWx0aWJ5dGUgY2hhcmFjdGVycywgdGhleSBzaGFsbCBiZQorCQkgKiBlbmNvZGVkIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlLWVuY29kaW5nIHJ1bGUuCisJCSAqIElmIG5vdCBlbmNvZGVkLCB0aGUgc3NjYW5mIGxvZ2ljIHBpY2tzIHVwIG9ubHkgbGVmdC1oYWxmCisJCSAqIG9mIHRoZSBzdXBwbGllZCBuYW1lOyBzcGxpdHRlZCBieSBhIHdoaXRlc3BhY2UgdW5leHBlY3RlZGx5LgorCQkgKi8KKwkJY2hhciAgICpyLCAqdzsKKwkJaW50ICAgICBjMSwgYzI7CisKKwkJciA9IHcgPSBuYW1lYnVmOworCQlkbyB7CisJCQljMSA9ICpyKys7CisJCQlpZiAoYzEgPT0gJysnKQorCQkJCWMxID0gJyAnOworCQkJZWxzZSBpZiAoYzEgPT0gJyUnKSB7CisJCQkJaWYgKChjMSA9IGhleGNvZGVfdG9faW50KCpyKyspKSA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJCWlmICgoYzIgPSBoZXhjb2RlX3RvX2ludCgqcisrKSkgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJCQljMSA9IChjMSA8PCA0KSB8IGMyOworCQkJfQorCQkJKncrKyA9IGMxOworCQl9IHdoaWxlIChjMSAhPSAnXDAnKTsKKwogCQlvYmpuYW1lID0gbmFtZWJ1ZjsKKwl9CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7CiAJaWYgKGxlbmd0aCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwppbmRleCAxMDJlOWVjLi5kMjQ2YWNhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCkBAIC0zMjIyLDYgKzMyMjIsOSBAQAogCV9fbGUzMiBidWZbMV07CiAJaW50IHJjOwogCisJaWYgKHAtPnBvbGljeXZlcnMgPCBQT0xJQ1lEQl9WRVJTSU9OX0ZJTEVOQU1FX1RSQU5TKQorCQlyZXR1cm4gMDsKKwogCW5lbCA9IDA7CiAJcmMgPSBoYXNodGFiX21hcChwLT5maWxlbmFtZV90cmFucywgaGFzaHRhYl9jbnQsICZuZWwpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9tb3VudC5jIGIvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMKaW5kZXggMTYyYTg2NC4uOWZjMmUxNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCX0KIAlpZiAobmVlZF9kZXYpIHsKIAkJLyogR2V0IG1vdW50IHBvaW50IG9yIGRldmljZSBmaWxlLiAqLwotCQlpZiAoa2Vybl9wYXRoKGRldl9uYW1lLCBMT09LVVBfRk9MTE9XLCAmcGF0aCkpIHsKKwkJaWYgKCFkZXZfbmFtZSB8fCBrZXJuX3BhdGgoZGV2X25hbWUsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgewogCQkJZXJyb3IgPSAtRU5PRU5UOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2F0bWVsL2FiZGFjLmMgYi9zb3VuZC9hdG1lbC9hYmRhYy5jCmluZGV4IDZlMjQwOTEuLmJmZWU2MGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2F0bWVsL2FiZGFjLmMKKysrIGIvc291bmQvYXRtZWwvYWJkYWMuYwpAQCAtNTk5LDQgKzU5OSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBdG1lbCBBdWRpbyBCaXRzdHJlYW0gREFDIChBQkRBQykiKTsKLU1PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhhbnMtY2hyaXN0aWFuLmVndHZlZHRAYXRtZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9hdG1lbC9hYzk3Yy5jIGIvc291bmQvYXRtZWwvYWM5N2MuYwppbmRleCBiMzEwNzAyLi5hYzM1MjIyIDEwMDY0NAotLS0gYS9zb3VuZC9hdG1lbC9hYzk3Yy5jCisrKyBiL3NvdW5kL2F0bWVsL2FjOTdjLmMKQEAgLTExOTksNCArMTE5OSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBdG1lbCBBQzk3IGNvbnRyb2xsZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhhbnMtY2hyaXN0aWFuLmVndHZlZHRAYXRtZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21pc2MuYyBiL3NvdW5kL2NvcmUvbWlzYy5jCmluZGV4IDJjNDE4MjUuLmViOWZlMmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWlzYy5jCisrKyBiL3NvdW5kL2NvcmUvbWlzYy5jCkBAIC01OCwyNiArNTgsNiBAQAogCWVsc2UKIAkJcmV0dXJuIHBhdGg7CiB9Ci0KLS8qIHByaW50IGZpbGUgYW5kIGxpbmUgd2l0aCBhIGNlcnRhaW4gcHJpbnRrIHByZWZpeCAqLwotc3RhdGljIGludCBwcmludF9zbmRfcGZ4KHVuc2lnbmVkIGludCBsZXZlbCwgY29uc3QgY2hhciAqcGF0aCwgaW50IGxpbmUsCi0JCQkgY29uc3QgY2hhciAqZm9ybWF0KQotewotCWNvbnN0IGNoYXIgKmZpbGUgPSBzYW5pdHlfZmlsZV9uYW1lKHBhdGgpOwotCWNoYXIgdG1wW10gPSAiPDA+IjsKLQljb25zdCBjaGFyICpwZnggPSBsZXZlbCA/IEtFUk5fREVCVUcgOiBLRVJOX0RFRkFVTFQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZm9ybWF0WzBdID09ICc8JyAmJiBmb3JtYXRbMl0gPT0gJz4nKSB7Ci0JCXRtcFsxXSA9IGZvcm1hdFsxXTsKLQkJcGZ4ID0gdG1wOwotCQlyZXQgPSAxOwotCX0KLQlwcmludGsoIiVzQUxTQSAlczolZDogIiwgcGZ4LCBmaWxlLCBsaW5lKTsKLQlyZXR1cm4gcmV0OwotfQotI2Vsc2UKLSNkZWZpbmUgcHJpbnRfc25kX3BmeChsZXZlbCwgcGF0aCwgbGluZSwgZm9ybWF0KQkwCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NORF9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLKQpAQCAtODUsMTUgKzY1LDI5IEBACiAJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwotCQorI2lmZGVmIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKKwljaGFyIHZlcmJvc2VfZm10W10gPSBLRVJOX0RFRkFVTFQgIkFMU0EgJXM6JWQgJXBWIjsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwkKIAlpZiAoZGVidWcgPCBsZXZlbCkKIAkJcmV0dXJuOwogI2VuZGlmCisKIAl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCWlmIChwcmludF9zbmRfcGZ4KGxldmVsLCBwYXRoLCBsaW5lLCBmb3JtYXQpKQotCQlmb3JtYXQgKz0gMzsgLyogc2tpcCB0aGUgcHJpbnRrIGxldmVsLXByZWZpeCAqLworI2lmZGVmIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsKKwl2YWYuZm10ID0gZm9ybWF0OworCXZhZi52YSA9ICZhcmdzOworCWlmIChmb3JtYXRbMF0gPT0gJzwnICYmIGZvcm1hdFsyXSA9PSAnPicpIHsKKwkJbWVtY3B5KHZlcmJvc2VfZm10LCBmb3JtYXQsIDMpOworCQl2YWYuZm10ID0gZm9ybWF0ICsgMzsKKwl9IGVsc2UgaWYgKGxldmVsKQorCQltZW1jcHkodmVyYm9zZV9mbXQsIEtFUk5fREVCVUcsIDMpOworCXByaW50ayh2ZXJib3NlX2ZtdCwgc2FuaXR5X2ZpbGVfbmFtZShwYXRoKSwgbGluZSwgJnZhZik7CisjZWxzZQogCXZwcmludGsoZm9ybWF0LCBhcmdzKTsKKyNlbmRpZgogCXZhX2VuZChhcmdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fc25kX3ByaW50ayk7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9pc2lnaHQuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCmluZGV4IDg2ZWUxNmMuLjQ0MDAzMDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAkJaXNpZ2h0LT5wYWNrZXRfaW5kZXggPSAtMTsKIAkJcmV0dXJuOwogCX0KKwlmd19pc29fY29udGV4dF9xdWV1ZV9mbHVzaChpc2lnaHQtPmNvbnRleHQpOwogCiAJaWYgKCsraW5kZXggPj0gUVVFVUVfTEVOR1RIKQogCQlpbmRleCA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwppbmRleCAyY2E2ZjRmLi5lMzU2OWJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJocGlvY3RsLmgiCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMKaW5kZXggZmIzMTFkOC4uNWM2ZWExMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYwpAQCAtNjAsNyArNjAsNyBAQAogCSAgICBIUElfVkVSX01JTk9SKEhQSV9WRVIpICogMTAwICsgSFBJX1ZFUl9SRUxFQVNFKEhQSV9WRVIpKSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgImxpbnV4L3BjaS5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHNob3J0IGhwaV9kc3BfY29kZV9vcGVuKHUzMiBhZGFwdGVyLCBzdHJ1Y3QgZHNwX2NvZGUgKnBzX2RzcF9jb2RlLAogCXUzMiAqcG9zX2Vycm9yX2NvZGUpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKaW5kZXggZjE2YmM4YS4uZTA4MzEyMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCQkmKChzdHJ1Y3QgY3M1NTM1YXVkaW9fZG1hX2Rlc2MgKikgZG1hLT5kZXNjX2J1Zi5hcmVhKVtpXTsKIAkJZGVzYy0+YWRkciA9IGNwdV90b19sZTMyKGFkZHIpOwogCQlkZXNjLT5zaXplID0gY3B1X3RvX2xlMzIocGVyaW9kX2J5dGVzKTsKLQkJZGVzYy0+Y3RscmVzZXJ2ZWQgPSBjcHVfdG9fbGUzMihQUkRfRU9QKTsKKwkJZGVzYy0+Y3RscmVzZXJ2ZWQgPSBjcHVfdG9fbGUxNihQUkRfRU9QKTsKIAkJZGVzY19hZGRyICs9IHNpemVvZihzdHJ1Y3QgY3M1NTM1YXVkaW9fZG1hX2Rlc2MpOwogCQlhZGRyICs9IHBlcmlvZF9ieXRlczsKIAl9CkBAIC0xNTcsNyArMTU3LDcgQEAKIAlsYXN0ZGVzYyA9ICYoKHN0cnVjdCBjczU1MzVhdWRpb19kbWFfZGVzYyAqKSBkbWEtPmRlc2NfYnVmLmFyZWEpW3BlcmlvZHNdOwogCWxhc3RkZXNjLT5hZGRyID0gY3B1X3RvX2xlMzIoKHUzMikgZG1hLT5kZXNjX2J1Zi5hZGRyKTsKIAlsYXN0ZGVzYy0+c2l6ZSA9IDA7Ci0JbGFzdGRlc2MtPmN0bHJlc2VydmVkID0gY3B1X3RvX2xlMzIoUFJEX0pNUCk7CisJbGFzdGRlc2MtPmN0bHJlc2VydmVkID0gY3B1X3RvX2xlMTYoUFJEX0pNUCk7CiAJam1wcHJkX2FkZHIgPSBjcHVfdG9fbGUzMihsYXN0ZGVzYy0+YWRkciArCiAJCQkJICAoc2l6ZW9mKHN0cnVjdCBjczU1MzVhdWRpb19kbWFfZGVzYykqcGVyaW9kcykpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCmluZGV4IDVlNjE5YTguLjE1ZjAxNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCkBAIC0xNDQwLDYgKzE0NDAsMTQgQEAKIAkgLmNhMDEwMl9jaGlwID0gMSwKIAkgLnNwazcxID0gMSwKIAkgLmVtdV9tb2RlbCA9IEVNVV9NT0RFTF9FTVUwNDA0fSwgLyogRU1VIDA0MDQgKi8KKwkvKiBFTVUwNDA0IFBDSWUgKi8KKwl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwOCwgLnN1YnN5c3RlbSA9IDB4NDAwNTExMDIsCisJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkUtbXUgMDQwNCBQQ0llIFtNQUVNODk4NF0iLAorCSAuaWQgPSAiRU1VMDQwNCIsCisJIC5lbXUxMGsyX2NoaXAgPSAxLAorCSAuY2EwMTA4X2NoaXAgPSAxLAorCSAuc3BrNzEgPSAxLAorCSAuZW11X21vZGVsID0gRU1VX01PREVMX0VNVTA0MDR9LCAvKiBFTVUgMDQwNCBQQ0llIHZlcl8wMyAqLwogCS8qIE5vdGUgdGhhdCBhbGwgRS1tdSBjYXJkcyByZXF1aXJlIGtlcm5lbCAyLjYgb3IgbmV3ZXIuICovCiAJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDgsCiAJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIlNCIEF1ZGlneSAyIFZhbHVlIFtVbmtub3duXSIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZm04MDEuYyBiL3NvdW5kL3BjaS9mbTgwMS5jCmluZGV4IGVhY2Q0OTAuLmE3ZWM3MDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9mbTgwMS5jCisrKyBiL3NvdW5kL3BjaS9mbTgwMS5jCkBAIC0xMjM0LDkgKzEyMzQsMTIgQEAKIAlzcHJpbnRmKGNoaXAtPnRlYS5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKHBjaSkpOwogCWlmICgodGVhNTc1eF90dW5lciAmIFRVTkVSX1RZUEVfTUFTSykgPiAwICYmCiAJICAgICh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA8IDQpIHsKLQkJaWYgKHNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSkpCisJCWlmIChzbmRfdGVhNTc1eF9pbml0KCZjaGlwLT50ZWEpKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJURUE1NzV4IHJhZGlvIG5vdCBmb3VuZFxuIik7Ci0JfSBlbHNlIGlmICgodGVhNTc1eF90dW5lciAmIFRVTkVSX1RZUEVfTUFTSykgPT0gMCkKKwkJCXNuZF9mbTgwMV9mcmVlKGNoaXApOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA9PSAwKSB7CiAJCS8qIGF1dG9kZXRlY3QgdHVuZXIgY29ubmVjdGlvbiAqLwogCQlmb3IgKHRlYTU3NXhfdHVuZXIgPSAxOyB0ZWE1NzV4X3R1bmVyIDw9IDM7IHRlYTU3NXhfdHVuZXIrKykgewogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IHRlYTU3NXhfdHVuZXI7CkBAIC0xMjQ2LDYgKzEyNDksMTIgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQorCQlpZiAodGVhNTc1eF90dW5lciA9PSA0KSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJURUE1NzV4IHJhZGlvIG5vdCBmb3VuZFxuIik7CisJCQlzbmRfZm04MDFfZnJlZShjaGlwKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQogCXN0cmxjcHkoY2hpcC0+dGVhLmNhcmQsIHNuZF9mbTgwMV90ZWE1NzV4X2dwaW9zWyh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSAtIDFdLm5hbWUsIHNpemVvZihjaGlwLT50ZWEuY2FyZCkpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaAppbmRleCBmMWRlMWJhLi41NWYwNjQ3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCkBAIC01MCw3ICs1MCwxMiBAQAogaW50IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbmlkKTsKIHZvaWQgc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogI2Vsc2UKLSNkZWZpbmUgc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoLi4uKQkJMAotI2RlZmluZSBzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZSguLi4pCitzdGF0aWMgaW5saW5lIGludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKK30KICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9lbGQuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCmluZGV4IGIwNWY3YmUuLmUzZTg1MzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jCkBAIC0yOTQsNyArMjk0LDcgQEAKIAkJc25kX3ByaW50ZChLRVJOX0lORk8gIkhETUk6IG91dCBvZiByYW5nZSBNTkwgJWRcbiIsIG1ubCk7CiAJCWdvdG8gb3V0X2ZhaWw7CiAJfSBlbHNlCi0JCXN0cmxjcHkoZS0+bW9uaXRvcl9uYW1lLCBidWYgKyBFTERfRklYRURfQllURVMsIG1ubCk7CisJCXN0cmxjcHkoZS0+bW9uaXRvcl9uYW1lLCBidWYgKyBFTERfRklYRURfQllURVMsIG1ubCArIDEpOwogCiAJZm9yIChpID0gMDsgaSA8IGUtPnNhZF9jb3VudDsgaSsrKSB7CiAJCWlmIChFTERfRklYRURfQllURVMgKyBtbmwgKyAzICogKGkgKyAxKSA+IHNpemUpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IDY5NmFjMjUuLmQ2OTRlOWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtNTA2LDkgKzUwNiwxMSBAQAogCQkJCWhkYV9uaWRfdCBocCkKIHsKIAlzdHJ1Y3QgYWQxOTh4X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBmcm9udCwgMCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsCisJaWYgKHNuZF9oZGFfcXVlcnlfcGluX2NhcHMoY29kZWMsIGZyb250KSAmIEFDX1BJTkNBUF9FQVBEKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBmcm9udCwgMCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsCiAJCQkgICAgIXNwZWMtPmludl9lYXBkID8gMHgwMCA6IDB4MDIpOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGhwLCAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKKwlpZiAoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgaHApICYgQUNfUElOQ0FQX0VBUEQpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGhwLCAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKIAkJCSAgICAhc3BlYy0+aW52X2VhcGQgPyAweDAwIDogMHgwMik7CiB9CiAKQEAgLTUyNCw2ICs1MjYsMTAgQEAKIAljYXNlIDB4MTFkNDE4NGE6CiAJY2FzZSAweDExZDQxOTRhOgogCWNhc2UgMHgxMWQ0MTk0YjoKKwljYXNlIDB4MTFkNDE5ODg6CisJY2FzZSAweDExZDQxOThiOgorCWNhc2UgMHgxMWQ0OTg5YToKKwljYXNlIDB4MTFkNDk4OWI6CiAJCWFkMTk4eF9wb3dlcl9lYXBkX3dyaXRlKGNvZGVjLCAweDEyLCAweDExKTsKIAkJYnJlYWs7CiAJY2FzZSAweDExZDQxOTgxOgpAQCAtNTMzLDEyICs1MzksNiBAQAogCWNhc2UgMHgxMWQ0MTk4NjoKIAkJYWQxOTh4X3Bvd2VyX2VhcGRfd3JpdGUoY29kZWMsIDB4MWIsIDB4MWEpOwogCQlicmVhazsKLQljYXNlIDB4MTFkNDE5ODg6Ci0JY2FzZSAweDExZDQxOThiOgotCWNhc2UgMHgxMWQ0OTg5YToKLQljYXNlIDB4MTFkNDk4OWI6Ci0JCWFkMTk4eF9wb3dlcl9lYXBkX3dyaXRlKGNvZGVjLCAweDI5LCAweDIyKTsKLQkJYnJlYWs7CiAJfQogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKaW5kZXggM2U2YjlhOC4uN2JiYzVmMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwpAQCAtMzA3NCw2ICszMDc0LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDY2X2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTRjLCAiQWNlciBBc3BpcmUgMzgzMFRHIiwgQ1hUNTA2Nl9BVVRPKSwKIAlTTkRfUENJX1FVSVJLX01BU0soMHgxMDI1LCAweGZmMDAsIDB4MDQwMCwgIkFjZXIiLCBDWFQ1MDY2X0lERUFQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyZDgsICJEZWxsIFZvc3RybyIsIENYVDUwNjZfREVMTF9WT1NUUk8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyZjUsICJEZWxsIFZvc3RybyAzMjAiLCBDWFQ1MDY2X0lERUFQQUQpLApAQCAtMzEwMiw2ICszMTAzLDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzOGFmLCAiTGVub3ZvIEc1NjAiLCBDWFQ1MDY2X0FTVVMpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM5MzgsICJMZW5vdm8gRzU2NSIsIENYVDUwNjZfQVVUTyksCiAJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxN2FhLCAiTGVub3ZvIiwgQ1hUNTA2Nl9JREVBUEFEKSwgLyogRmFsbGJhY2sgZm9yIExlbm92b3Mgd2l0aG91dCBkb2NrIG1pYyAqLworCVNORF9QQ0lfUVVJUksoMHgxYjBhLCAweDIwOTIsICJDeWJlcnBvd2VyUEMgR2FtZXIgWHBsb3JlciBONTcwMDEiLCBDWFQ1MDY2X0FVVE8pLAogCXt9CiB9OwogCkBAIC00Mzg4LDYgKzQzOTAsOCBAQAogCSAgLnBhdGNoID0gcGF0Y2hfY3h0NTA2NiB9LAogCXsgLmlkID0gMHgxNGYxNTA2OSwgLm5hbWUgPSAiQ1gyMDU4NSIsCiAJICAucGF0Y2ggPSBwYXRjaF9jeHQ1MDY2IH0sCisJeyAuaWQgPSAweDE0ZjE1MDZjLCAubmFtZSA9ICJDWDIwNTg4IiwKKwkgIC5wYXRjaCA9IHBhdGNoX2N4dDUwNjYgfSwKIAl7IC5pZCA9IDB4MTRmMTUwNmUsIC5uYW1lID0gIkNYMjA1OTAiLAogCSAgLnBhdGNoID0gcGF0Y2hfY3h0NTA2NiB9LAogCXsgLmlkID0gMHgxNGYxNTA5NywgLm5hbWUgPSAiQ1gyMDYzMSIsCkBAIC00NDE2LDYgKzQ0MjAsNyBAQAogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDY3Iik7CiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNjgiKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2OSIpOworTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDZjIik7CiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNmUiKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA5NyIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDk4Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IDdhNGUxMDAuLmI0OGZiNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC0xMTQxLDYgKzExNDEsMTMgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgb247CiAKKwkvKiBDb250cm9sIEhQIHBpbnMvYW1wcyBkZXBlbmRpbmcgb24gbWFzdGVyX211dGUgc3RhdGU7CisJICogaW4gZ2VuZXJhbCwgSFAgcGlucy9hbXBzIGNvbnRyb2wgc2hvdWxkIGJlIGVuYWJsZWQgaW4gYWxsIGNhc2VzLAorCSAqIGJ1dCBjdXJyZW50bHkgc2V0IG9ubHkgZm9yIG1hc3Rlcl9tdXRlLCBqdXN0IHRvIGJlIHNhZmUKKwkgKi8KKwlkb19hdXRvbXV0ZShjb2RlYywgQVJSQVlfU0laRShzcGVjLT5hdXRvY2ZnLmhwX3BpbnMpLAorCQkgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zLCBzcGVjLT5tYXN0ZXJfbXV0ZSwgdHJ1ZSk7CisKIAlpZiAoIXNwZWMtPmF1dG9tdXRlKQogCQlvbiA9IDA7CiAJZWxzZQpAQCAtMjcwOCwxNyArMjcxNSwzMCBAQAogCiBzdGF0aWMgaW50IGFsY19jYXBfZ2V0cHV0X2NhbGxlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wsCi0JCQkJIGdldHB1dF9jYWxsX3QgZnVuYykKKwkJCQkgZ2V0cHV0X2NhbGxfdCBmdW5jLCBib29sIGNoZWNrX2FkY19zd2l0Y2gpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKLQlpbnQgZXJyOworCWludCBpLCBlcnIgPSAwOwogCiAJbXV0ZXhfbG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwotCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hZGNfbmlkc1thZGNfaWR4XSwKLQkJCQkJCSAgICAgIDMsIDAsIEhEQV9JTlBVVCk7Ci0JZXJyID0gZnVuYyhrY29udHJvbCwgdWNvbnRyb2wpOworCWlmIChjaGVja19hZGNfc3dpdGNoICYmIHNwZWMtPmR1YWxfYWRjX3N3aXRjaCkgeworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBpKyspIHsKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0KKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzW2ldLAorCQkJCQkJICAgIDMsIDAsIEhEQV9JTlBVVCk7CisJCQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJaSA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9CisJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzW2ldLAorCQkJCQkgICAgMywgMCwgSERBX0lOUFVUKTsKKwkJZXJyID0gZnVuYyhrY29udHJvbCwgdWNvbnRyb2wpOworCX0KKyBlcnJvcjoKIAltdXRleF91bmxvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjcyNywxNCArMjc0NywxNCBAQAogCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJcmV0dXJuIGFsY19jYXBfZ2V0cHV0X2NhbGxlcihrY29udHJvbCwgdWNvbnRyb2wsCi0JCQkJICAgICBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfZ2V0KTsKKwkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9nZXQsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCBhbGNfY2FwX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9wdXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dCwgdHJ1ZSk7CiB9CiAKIC8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KQEAgLTI3NDQsMTQgKzI3NjQsMTQgQEAKIAkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJcmV0dXJuIGFsY19jYXBfZ2V0cHV0X2NhbGxlcihrY29udHJvbCwgdWNvbnRyb2wsCi0JCQkJICAgICBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfZ2V0KTsKKwkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCBhbGNfY2FwX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJcmV0dXJuIGFsY19jYXBfZ2V0cHV0X2NhbGxlcihrY29udHJvbCwgdWNvbnRyb2wsCi0JCQkJICAgICBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfcHV0KTsKKwkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9wdXQsIHRydWUpOwogfQogCiAjZGVmaW5lIF9ERUZJTkVfQ0FQTUlYKG51bSkgXApAQCAtNDg3Niw3ICs0ODk2LDYgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHhlMzA5LCAiVUxJIiwgQUxDODgwXzNTVF9ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweGUzMTAsICJVTEkiLCBBTEM4ODBfM1NUKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzOSwgMHgxMjM0LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmEwOSwgIkhQIiwgQUxDODgwXzVTVCksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBiMywgIkFTVVMgVzFWIiwgQUxDODgwX0FTVVNfVzFWKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGMyLCAiQVNVUyBXNkEiLCBBTEM4ODBfQVNVU19ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYzMsICJBU1VTIFd4eCIsIEFMQzg4MF9BU1VTX0RJRyksCkBAIC02MjAxLDExICs2MjIwLDYgQEAKIC8qIHVwZGF0ZSBIUCwgbGluZSBhbmQgbW9ubyBvdXQgcGlucyBhY2NvcmRpbmcgdG8gdGhlIG1hc3RlciBzd2l0Y2ggKi8KIHN0YXRpYyB2b2lkIGFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0JLyogY2hhbmdlIEhQIHBpbnMgKi8KLQlkb19hdXRvbXV0ZShjb2RlYywgQVJSQVlfU0laRShzcGVjLT5hdXRvY2ZnLmhwX3BpbnMpLAotCQkgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zLCBzcGVjLT5tYXN0ZXJfbXV0ZSwgdHJ1ZSk7CiAJdXBkYXRlX3NwZWFrZXJzKGNvZGVjKTsKIH0KIApAQCAtMTE5MjQsNyArMTE5MzgsNyBAQAogICogIDB4MWIgPSBwb3J0IHJlcGxpY2F0b3IgaGVhZHBob25lIG91dAogICovCiAKLSNkZWZpbmUgQUxDX0hQX0VWRU5UCTB4MzcKKyNkZWZpbmUgQUxDX0hQX0VWRU5UCUFMQzg4MF9IUF9FVkVOVAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9mdWppdHN1X3Vuc29sX3ZlcmJzW10gPSB7CiAJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LApAQCAtMTI1OTgsNiArMTI2MTIsNyBAQAogICovCiBlbnVtIHsKIAlQSU5GSVhfRlNDX0gyNzAsCisJUElORklYX0hQX1oyMDAsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19maXh1cCBhbGMyNjJfZml4dXBzW10gPSB7CkBAIC0xMjYxMCw5ICsxMjYyNSwxNyBAQAogCQkJeyB9CiAJCX0KIAl9LAorCVtQSU5GSVhfSFBfWjIwMF0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE2LCAweDk5MTMwMTIwIH0sIC8qIGludGVybmFsIHNwZWFrZXIgKi8KKwkJCXsgfQorCQl9CisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjJfZml4dXBfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MTcwYiwgIkhQIFoyMDAiLCBQSU5GSVhfSFBfWjIwMCksCiAJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTE0NywgIkZTQyBDZWxzaXVzIEgyNzAiLCBQSU5GSVhfRlNDX0gyNzApLAogCXt9CiB9OwpAQCAtMTI3MjksNiArMTI3NTIsOCBAQAogCQkJICAgQUxDMjYyX0hQX0JQQyksCiAJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDE1MDAsICJIUCB6IHNlcmllcyIsCiAJCQkgICBBTEMyNjJfSFBfQlBDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNzBiLCAiSFAgWjIwMCIsCisJCQkgICBBTEMyNjJfQVVUTyksCiAJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDE3MDAsICJIUCB4dyBzZXJpZXMiLAogCQkJICAgQUxDMjYyX0hQX0JQQyksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwMCwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XTCksCkBAIC0xMzMxNCw5ICsxMzMzOSw4IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwZjsKIAlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKIAlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7CiAJc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKIAlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTI7CkBAIC0xMzg2MCw2ICsxMzg4NCw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE1YiwgIkFjZXIgQXNwaXJlIE9uZSIsCiAJCQkJCQlBTEMyNjhfQUNFUl9BU1BJUkVfT05FKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMjUzLCAiRGVsbCBPRU0iLCBBTEMyNjhfREVMTCksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJiMCwgIkRlbGwgSW5zcGlyb24gOTEwIiwgQUxDMjY4X0FVVE8pLAogCVNORF9QQ0lfUVVJUktfTUFTSygweDEwMjgsIDB4ZmZmMCwgMHgwMmIwLAogCQkJIkRlbGwgSW5zcGlyb24gTWluaTkvVm9zdHJvIEE5MCIsIEFMQzI2OF9ERUxMKSwKIAkvKiBhbG1vc3QgY29tcGF0aWJsZSB3aXRoIHRvc2hpYmEgYnV0IHdpdGggb3B0aW9uYWwgZGlnaXRhbCBvdXRzOwpAQCAtMTM4NzAsNyArMTM4OTUsNiBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDUsICJBU1VTIFc3SiIsIEFMQzI2OF8zU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMTcwLCAweDAwNDAsICJaRVBUTyIsIEFMQzI2OF9aRVBUTyksCiAJU05EX1BDSV9RVUlSSygweDE0YzAsIDB4MDAyNSwgIkNPTVBBTCBJRkw5MC9KRkwtOTIiLCBBTEMyNjhfVE9TSElCQSksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDc2MywgIkRpdmVyc2UgKENQUjIwMDApIiwgQUxDMjY4X0FDRVIpLAogCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3NzEsICJRdWFudGEgSUwxIiwgQUxDMjY3X1FVQU5UQV9JTDEpLAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKaW5kZXggNjA1Yzk5ZS4uZjQzYmIwZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC03NDUsMTIgKzc0NSwyMyBAQAogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAl1bnNpZ25lZCBpbnQgcGluc2VsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwl1bnNpZ25lZCBpbnQgcGFybTAsIHBhcm0xOwogCS8qIEdldCBJbmRlcGVuZGVudCBNb2RlIGluZGV4IG9mIGhlYWRwaG9uZSBwaW4gd2lkZ2V0ICovCiAJc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSA9IHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGVfaW5kZXggPT0gcGluc2VsCiAJCT8gMSA6IDA7Ci0JaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxNzE4UykKKwlpZiAoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MThTKSB7CiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKIAkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIHBpbnNlbCA/IDIgOiAwKTsKKwkJLyogU2V0IGNvcnJlY3QgbXV0ZSBzd2l0Y2ggZm9yIE1XMyAqLworCQlwYXJtMCA9IHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUgPworCQkJICAgICAgIEFNUF9JTl9VTk1VVEUoMCkgOiBBTVBfSU5fTVVURSgwKTsKKwkJcGFybTEgPSBzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlID8KKwkJCSAgICAgICBBTVBfSU5fTVVURSgxKSA6IEFNUF9JTl9VTk1VVEUoMSk7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MWIsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIHBhcm0wKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxYiwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgcGFybTEpOworCX0KIAllbHNlCiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKIAkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIHBpbnNlbCk7CkBAIC04MzIsMTAgKzg0MywxMyBAQAogCWtuZXctPnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCBuaWQ7CiAJa25ldy0+cHJpdmF0ZV92YWx1ZSA9IG5pZDsKIAotCWtuZXcgPSB2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX2hwX21peGVyWzFdKTsKLQlpZiAoa25ldyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlrbmV3LT5zdWJkZXZpY2UgPSBzaWRlX211dGVfY2hhbm5lbChzcGVjKTsKKwluaWQgPSBzaWRlX211dGVfY2hhbm5lbChzcGVjKTsKKwlpZiAobmlkKSB7CisJCWtuZXcgPSB2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX2hwX21peGVyWzFdKTsKKwkJaWYgKGtuZXcgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlrbmV3LT5zdWJkZXZpY2UgPSBuaWQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC00MjgwLDkgKzQyOTQsNiBAQAogCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCiAJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKIAl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg1KX0sCi0KLQkvKiBTZXR1cCBkZWZhdWx0IGlucHV0IG9mIEZyb250IEhQIHRvIE1XOSAqLwotCXsweDI4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKIAkvKiBQVzkgUFcxMCBPdXRwdXQgZW5hYmxlICovCiAJezB4MmQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgQUNfUElOQ1RMX09VVF9FTn0sCiAJezB4MmUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgQUNfUElOQ1RMX09VVF9FTn0sCkBAIC00MjkxLDEwICs0MzAyLDEwIEBACiAJLyogRW5hYmxlIEJvb3N0IFZvbHVtZSBiYWNrZG9vciAqLwogCXsweDEsIDB4Zjg4LCAweDh9LAogCS8qIE1XMC8xLzIvMy80OiB1bi1tdXRlIGluZGV4IDAgKEFPV3gpLCBtdXRlIGluZGV4IDEgKE1XOSkgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCiAJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKQEAgLTQzMDQsOCArNDMxNSw2IEBACiAJLyogc2V0IE1VWDEgPSAyIChBT1c0KSwgTVVYMiA9IDEgKEFPVzMpICovCiAJezB4MzQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDJ9LAogCXsweDM1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKLQkvKiBVbm11dGUgTVc0J3MgaW5kZXggMCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7IH0KIH07CiAKQEAgLTQ0NTMsNiArNDQ2MiwxOSBAQAogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIGlmIChpID09IEFVVE9fU0VRX0ZST05UKSB7CisJCQkvKiBhZGQgY29udHJvbCB0byBtaXhlciBpbmRleCAwICovCisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgNSwKKwkJCQkJCQkJICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjEsIDMsIDUsCisJCQkJCQkJCSAgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQkJLyogRnJvbnQgKi8KIAkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7CiAJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMgYi9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKaW5kZXggMzRiMjQyOC4uMjY5MmU1YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2xvbGEvbG9sYS5jCisrKyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJbG9sYV9zZXR1cF9hbGxfYW5hbG9nX2dhaW5zKGNoaXAsIFBMQVksIGZhbHNlKTsgLyogb3V0cHV0LCB1cGRhdGUgKi8KIH0KIAotc3RhdGljIGludCBsb2xhX3BhcnNlX3RyZWUoc3RydWN0IGxvbGEgKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsb2xhX3BhcnNlX3RyZWUoc3RydWN0IGxvbGEgKmNoaXApCiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgbmlkLCBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwppbmRleCA5NDk2OTFhLi5jOGU0MDJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKQEAgLTUyMSw2ICs1MjEsNyBAQAogI2RlZmluZSBIRFNQTV9ETUFfQVJFQV9LSUxPQllURVMgKEhEU1BNX0RNQV9BUkVBX0JZVEVTLzEwMjQpCiAKIC8qIHJldmlzaW9ucyA+PSAyMzAgaW5kaWNhdGUgQUVTMzIgY2FyZCAqLworI2RlZmluZSBIRFNQTV9NQURJX09MRF9SRVYJMjA3CiAjZGVmaW5lIEhEU1BNX01BRElfUkVWCQkyMTAKICNkZWZpbmUgSERTUE1fUkFZREFUX1JFVgkyMTEKICNkZWZpbmUgSERTUE1fQUlPX1JFVgkJMjEyCkBAIC04OTUsMTEgKzg5NiwxMSBAQAogCXVuc2lnbmVkIGNoYXIgbWF4X2NoYW5uZWxzX2luOwogCXVuc2lnbmVkIGNoYXIgbWF4X2NoYW5uZWxzX291dDsKIAotCWNoYXIgKmNoYW5uZWxfbWFwX2luOwotCWNoYXIgKmNoYW5uZWxfbWFwX291dDsKKwlzaWduZWQgY2hhciAqY2hhbm5lbF9tYXBfaW47CisJc2lnbmVkIGNoYXIgKmNoYW5uZWxfbWFwX291dDsKIAotCWNoYXIgKmNoYW5uZWxfbWFwX2luX3NzLCAqY2hhbm5lbF9tYXBfaW5fZHMsICpjaGFubmVsX21hcF9pbl9xczsKLQljaGFyICpjaGFubmVsX21hcF9vdXRfc3MsICpjaGFubmVsX21hcF9vdXRfZHMsICpjaGFubmVsX21hcF9vdXRfcXM7CisJc2lnbmVkIGNoYXIgKmNoYW5uZWxfbWFwX2luX3NzLCAqY2hhbm5lbF9tYXBfaW5fZHMsICpjaGFubmVsX21hcF9pbl9xczsKKwlzaWduZWQgY2hhciAqY2hhbm5lbF9tYXBfb3V0X3NzLCAqY2hhbm5lbF9tYXBfb3V0X2RzLCAqY2hhbm5lbF9tYXBfb3V0X3FzOwogCiAJY2hhciAqKnBvcnRfbmFtZXNfaW47CiAJY2hhciAqKnBvcnRfbmFtZXNfb3V0OwpAQCAtMTE0Myw3ICsxMTQ0LDcgQEAKIAogCQkvKiBpZiB3b3JkY2xvY2sgaGFzIHN5bmNlZCBmcmVxIGFuZCB3b3JkY2xvY2sgaXMgdmFsaWQgKi8KIAkJaWYgKChzdGF0dXMyICYgSERTUE1fd2NMb2NrKSAhPSAwICYmCi0JCQkJKHN0YXR1cyAmIEhEU1BNX1NlbFN5bmNSZWYwKSA9PSAwKSB7CisJCQkJKHN0YXR1czIgJiBIRFNQTV9TZWxTeW5jUmVmMCkgPT0gMCkgewogCiAJCQlyYXRlX2JpdHMgPSBzdGF0dXMyICYgSERTUE1fd2NGcmVxTWFzazsKIApAQCAtMTYzOSwxMiArMTY0MCwxNCBAQAogCQl9CiAJfQogCWhtaWRpLT5wZW5kaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobWlkaS0+bG9jaywgZmxhZ3MpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhtaWRpLT5oZHNwbS0+bG9jaywgZmxhZ3MpOwogCWhtaWRpLT5oZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBobWlkaS0+aWU7CiAJaGRzcG1fd3JpdGUoaG1pZGktPmhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsCiAJCSAgICBobWlkaS0+aGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhtaWRpLT5oZHNwbS0+bG9jaywgZmxhZ3MpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmhtaWRpLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHNuZF9oZHNwbV9taWRpX291dHB1dF93cml0ZSAoaG1pZGkpOwogfQogCkBAIC02Mzc3LDYgKzYzODAsNyBAQAogCiAJc3dpdGNoIChoZHNwbS0+ZmlybXdhcmVfcmV2KSB7CiAJY2FzZSBIRFNQTV9NQURJX1JFVjoKKwljYXNlIEhEU1BNX01BRElfT0xEX1JFVjoKIAkJaGRzcG0tPmlvX3R5cGUgPSBNQURJOwogCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBNQURJIjsKIAkJaGRzcG0tPm1pZGlQb3J0cyA9IDM7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwppbmRleCA3ZmJmYTA1Li5lZGE5NTViIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKQEAgLTg0OCw5ICs4NDgsMTAgQEAKIAlpZiAoSVNfRVJSKHNzYykpCiAJCXByX3dhcm4oIlVuYWJsZSB0byBwYXJlbnQgQVNvQyBTU0MgREFJIG9uIFNTQzogJWxkXG4iLAogCQkJUFRSX0VSUihzc2MpKTsKLQllbHNlCisJZWxzZSB7CiAJCXNzY19wZGV2LT5kZXYucGFyZW50ID0gJihzc2MtPnBkZXYtPmRldik7Ci0Jc3NjX2ZyZWUoc3NjKTsKKwkJc3NjX2ZyZWUoc3NjKTsKKwl9CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNzY19wZGV2KTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE4MzYuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE4MzYuYwppbmRleCBlYTQ5NTFjLi5mNzlkMTY1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQxODM2LmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTgzNi5jCkBAIC03NSw3ICs3NSw3IEBACiAJCS5jcHVfZGFpX25hbWUgPSAiYmZpbi10ZG0uMCIsCiAJCS5jb2RlY19kYWlfbmFtZSA9ICJhZDE4MzYtaGlmaSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gImJmaW4tdGRtLXBjbS1hdWRpbyIsCi0JCS5jb2RlY19uYW1lID0gImFkMTgzNi4wIiwKKwkJLmNvZGVjX25hbWUgPSAic3BpMC40IiwKIAkJLm9wcyA9ICZiZjV4eF9hZDE4MzZfb3BzLAogCX0sCiAJewpAQCAtODQsNyArODQsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gImJmaW4tdGRtLjEiLAogCQkuY29kZWNfZGFpX25hbWUgPSAiYWQxODM2LWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJiZmluLXRkbS1wY20tYXVkaW8iLAotCQkuY29kZWNfbmFtZSA9ICJhZDE4MzYuMCIsCisJCS5jb2RlY19uYW1lID0gInNwaTAuNCIsCiAJCS5vcHMgPSAmYmY1eHhfYWQxODM2X29wcywKIAl9LAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLXBjbS5jCmluZGV4IGI1MTAxZWYuLmYxZmQ5NWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYwpAQCAtMTM4LDExICsxMzgsMjAgQEAKIAlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQlkaWZmID0gc3BvcnRfY3Vycl9vZmZzZXRfdHgoc3BvcnQpOwotCQlmcmFtZXMgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkaWZmKTsKIAl9IGVsc2UgewogCQlkaWZmID0gc3BvcnRfY3Vycl9vZmZzZXRfcngoc3BvcnQpOwotCQlmcmFtZXMgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkaWZmKTsKIAl9CisKKwkvKgorCSAqIFRYIGF0IGxlYXN0IGNhbiByZXBvcnQgb25lIGZyYW1lIGJleW9uZCB0aGUgZW5kIG9mIHRoZQorCSAqIGJ1ZmZlciBpZiB3ZSBoaXQgdGhlIHdyYXBhcm91bmQgY2FzZSAtIGNsYW1wIHRvIHdpdGhpbiB0aGUKKwkgKiBidWZmZXIgYXMgdGhlIEFMU0EgQVBJcyByZXF1aXJlLgorCSAqLworCWlmIChkaWZmID09IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pKQorCQlkaWZmID0gMDsKKworCWZyYW1lcyA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRpZmYpOworCiAJcmV0dXJuIGZyYW1lczsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKaW5kZXggYWI2M2Q1Mi4uNzU0YzQ5NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCkBAIC0xNDUsMjIgKzE0NSwyMiBAQAogCS8qIGJpdCBzaXplICovCiAJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCQl3b3JkX2xlbiA9IDM7CisJCXdvcmRfbGVuID0gQUQxODM2X1dPUkRfTEVOXzE2OwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKLQkJd29yZF9sZW4gPSAxOworCQl3b3JkX2xlbiA9IEFEMTgzNl9XT1JEX0xFTl8yMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl3b3JkX2xlbiA9IDA7CisJCXdvcmRfbGVuID0gQUQxODM2X1dPUkRfTEVOXzI0OwogCQlicmVhazsKIAl9CiAKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBRDE4MzZfREFDX0NUUkwxLAotCQlBRDE4MzZfREFDX1dPUkRfTEVOX01BU0ssIHdvcmRfbGVuKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBRDE4MzZfREFDX0NUUkwxLCBBRDE4MzZfREFDX1dPUkRfTEVOX01BU0ssCisJCXdvcmRfbGVuIDw8IEFEMTgzNl9EQUNfV09SRF9MRU5fT0ZGU0VUKTsKIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTgzNl9BRENfQ1RSTDIsCi0JCUFEMTgzNl9BRENfV09SRF9MRU5fTUFTSywgd29yZF9sZW4pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTgzNl9BRENfQ1RSTDIsIEFEMTgzNl9BRENfV09SRF9MRU5fTUFTSywKKwkJd29yZF9sZW4gPDwgQUQxODM2X0FEQ19XT1JEX09GRlNFVCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmggYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5oCmluZGV4IDg0NTU5NjcuLjlkNmEzZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBBRDE4MzZfREFDX1NFUkZNVF9QQ0syNTYgICAgICAgKDB4NCA8PCA1KQogI2RlZmluZSBBRDE4MzZfREFDX1NFUkZNVF9QQ0sxMjggICAgICAgKDB4NSA8PCA1KQogI2RlZmluZSBBRDE4MzZfREFDX1dPUkRfTEVOX01BU0sgICAgICAgMHgxOAorI2RlZmluZSBBRDE4MzZfREFDX1dPUkRfTEVOX09GRlNFVCAgICAgMwogCiAjZGVmaW5lIEFEMTgzNl9EQUNfQ1RSTDIgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEFEMTgzNl9EQUNMMV9NVVRFICAgICAgICAgICAgICAwCkBAIC01MSw2ICs1Miw3IEBACiAjZGVmaW5lIEFEMTgzNl9BRENMMl9NVVRFIAkJMgogI2RlZmluZSBBRDE4MzZfQURDUjJfTVVURSAJCTMKICNkZWZpbmUgQUQxODM2X0FEQ19XT1JEX0xFTl9NQVNLICAgICAgIDB4MzAKKyNkZWZpbmUgQUQxODM2X0FEQ19XT1JEX09GRlNFVCAgICAgICAgIDUKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfTUFTSwkgICAgICAgKDcgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfUENLMjU2ICAgICAgICgweDQgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfUENLMTI4ICAgICAgICgweDUgPDwgNikKQEAgLTYwLDQgKzYyLDggQEAKIAogI2RlZmluZSBBRDE4MzZfTlVNX1JFR1MgICAgICAgICAgICAgICAgMTYKIAorI2RlZmluZSBBRDE4MzZfV09SRF9MRU5fMjQgMHgwCisjZGVmaW5lIEFEMTgzNl9XT1JEX0xFTl8yMCAweDEKKyNkZWZpbmUgQUQxODM2X1dPUkRfTEVOXzE2IDB4MgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCmluZGV4IDRiZTA1NzAuLjY1ZjQ2MDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFBXX01HTVQyLCBNUywgZGF0YSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDIsIE1TIHwgTUNLTyB8IFBNUExMLCBkYXRhKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNRF9DVEwxLCBCQ0tPX01BU0ssIGJja28pOwogCiAJLyogZm9ybWF0IHR5cGUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKaW5kZXggZjhjNjYzZC4uZDY4ZWE1MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKQEAgLTI2MiwxNCArMjYyLDE0IEBACiB9CiAKIC8qIExpbmUgZGlzY2lwbGluZSAucmVjZWl2ZV9idWYoKSAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2MjUzX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCB2MjUzX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0dHktPmRpc2NfZGF0YTsKIAlzdHJ1Y3QgY3gyMDQ0Ml9wcml2ICpjeDIwNDQyOwogCiAJaWYgKCFjb2RlYykKLQkJcmV0dXJuIGNvdW50OworCQlyZXR1cm47CiAKIAljeDIwNDQyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKQEAgLTI4MSw4ICsyODEsNiBAQAogCQljb2RlYy0+aHdfd3JpdGUgPSAoaHdfd3JpdGVfdCl0dHktPm9wcy0+d3JpdGU7CiAJCWNvZGVjLT5jYXJkLT5wb3BfdGltZSA9IDE7CiAJfQotCi0JcmV0dXJuIGNvdW50OwogfQogCiAvKiBMaW5lIGRpc2NpcGxpbmUgLndyaXRlX3dha2V1cCgpICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKaW5kZXggZTJhNzYwOC4uNzg1OWJkYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYwpAQCAtMTYxLDEwICsxNjEsMTggQEAKIAkJZGV2X2RiZygmYWljMjYtPnNwaS0+ZGV2LCAiYmFkIGZvcm1hdFxuIik7IHJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIENvbmZpZ3VyZSBQTEwgKi8KKwkvKioKKwkgKiBDb25maWd1cmUgUExMCisJICogZnNyZWYgPSAobWNsayAqIFBMTE0pIC8gMjA0OAorCSAqIHdoZXJlIFBMTE0gPSBKLkREREQgKEREREQgcmVnaXN0ZXIgcmFuZ2VzIGZyb20gMCB0byA5OTk5LCBkZWNpbWFsKQorCSAqLwogCXB2YWwgPSAxOwotCWp2YWwgPSAoZnNyZWYgPT0gNDQxMDApID8gNyA6IDg7Ci0JZHZhbCA9IChmc3JlZiA9PSA0NDEwMCkgPyA1MjY0IDogMTkyMDsKKwkvKiBjb21wdXRlIEogcG9ydGlvbiBvZiBtdWx0aXBsaWVyICovCisJanZhbCA9IGZzcmVmIC8gKGFpYzI2LT5tY2xrIC8gMjA0OCk7CisJLyogY29tcHV0ZSBmcmFjdGlvbmFsIEREREQgY29tcG9uZW50IG9mIG11bHRpcGxpZXIgKi8KKwlkdmFsID0gZnNyZWYgLSAoanZhbCAqIChhaWMyNi0+bWNsayAvIDIwNDgpKTsKKwlkdmFsID0gKDEwMDAwICogZHZhbCkgLyAoYWljMjYtPm1jbGsgLyAyMDQ4KTsKKwlkZXZfZGJnKCZhaWMyNi0+c3BpLT5kZXYsICJTZXR0aW5nIFBMTE0gdG8gJWQuJTA0ZFxuIiwganZhbCwgZHZhbCk7CiAJcXZhbCA9IDA7CiAJcmVnID0gMHg4MDAwIHwgcXZhbCA8PCAxMSB8IHB2YWwgPDwgOCB8IGp2YWwgPDwgMjsKIAlhaWMyNl9yZWdfd3JpdGUoY29kZWMsIEFJQzI2X1JFR19QTExfUFJPRzEsIHJlZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKaW5kZXggYzNkOTZmYy4uNzg5NDUzZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYwpAQCAtMTExNCwxMiArMTExNCwxOSBAQAogCiAJCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCiAJCWNvZGVjLT5jYWNoZV9vbmx5ID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljM3hfcmVnKTsgaSsrKQorCQlmb3IgKGkgPSBBSUMzWF9TQU1QTEVfUkFURV9TRUxfUkVHOyBpIDwgQVJSQVlfU0laRShhaWMzeF9yZWcpOyBpKyspCiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCBjYWNoZVtpXSk7CiAJCWlmIChhaWMzeC0+bW9kZWwgPT0gQUlDM1hfTU9ERUxfMzAwNykKIAkJCWFpYzN4X2luaXRfMzAwNyhjb2RlYyk7CiAJCWNvZGVjLT5jYWNoZV9zeW5jID0gMDsKIAl9IGVsc2UgeworCQkvKgorCQkgKiBEbyBzb2Z0IHJlc2V0IHRvIHRoaXMgY29kZWMgaW5zdGFuY2UgaW4gb3JkZXIgdG8gY2xlYXIKKwkJICogcG9zc2libGUgVkREIGxlYWthZ2UgY3VycmVudHMgaW4gY2FzZSB0aGUgc3VwcGx5IHJlZ3VsYXRvcnMKKwkJICogcmVtYWluIG9uCisJCSAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzWF9SRVNFVCwgU09GVF9SRVNFVCk7CisJCWNvZGVjLT5jYWNoZV9zeW5jID0gMTsKIAkJYWljM3gtPnBvd2VyID0gMDsKIAkJLyogSFcgd3JpdGVzIGFyZSBuZWVkbGVzcyB3aGVuIGJpYXMgaXMgb2ZmICovCiAJCWNvZGVjLT5jYWNoZV9vbmx5ID0gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IDJkYzk2NGIuLjc2YjQzNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtMTc1LDYgKzE3NSw3IEBACiBTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCB3bTg3MzFfaW5zZWxfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fU1VQUExZKCJBQ1RJVkUiLFdNODczMV9BQ1RJVkUsIDAsIDAsIE5VTEwsIDApLAogU05EX1NPQ19EQVBNX1NVUFBMWSgiT1NDIiwgV004NzMxX1BXUiwgNSwgMSwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBNaXhlciIsIFdNODczMV9QV1IsIDQsIDEsCiAJJndtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHNbMF0sCkBAIC0yMDQsNiArMjA1LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtODczMV9pbnRlcmNvbltdID0gewogCXsiREFDIiwgTlVMTCwgIk9TQyIsIHdtODczMV9jaGVja19vc2N9LAogCXsiQURDIiwgTlVMTCwgIk9TQyIsIHdtODczMV9jaGVja19vc2N9LAorCXsiREFDIiwgTlVMTCwgIkFDVElWRSJ9LAorCXsiQURDIiwgTlVMTCwgIkFDVElWRSJ9LAogCiAJLyogb3V0cHV0IG1peGVyICovCiAJeyJPdXRwdXQgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIkxpbmUgSW5wdXQifSwKQEAgLTMxNSwyOSArMzE4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bTg3MzFfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCi0JLyogc2V0IGFjdGl2ZSAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MDAwMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd204NzMxX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0KLQkvKiBkZWFjdGl2YXRlICovCi0JaWYgKCFjb2RlYy0+YWN0aXZlKSB7Ci0JCXVkZWxheSg1MCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MCk7Ci0JfQotfQotCiBzdGF0aWMgaW50IHdtODczMV9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwpAQCAtNDgwLDcgKzQ2MCw2IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9QV1IsIHJlZyB8IDB4MDA0MCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004NzMxX0FDVElWRSwgMHgwKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgV004NzMxX1BXUiwgMHhmZmZmKTsKIAkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODczMS0+c3VwcGxpZXMpLAogCQkJCSAgICAgICB3bTg3MzEtPnN1cHBsaWVzKTsKQEAgLTQ5Niw5ICs0NzUsNyBAQAogCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB3bTg3MzFfZGFpX29wcyA9IHsKLQkucHJlcGFyZQk9IHdtODczMV9wY21fcHJlcGFyZSwKIAkuaHdfcGFyYW1zCT0gd204NzMxX2h3X3BhcmFtcywKLQkuc2h1dGRvd24JPSB3bTg3MzFfc2h1dGRvd24sCiAJLmRpZ2l0YWxfbXV0ZQk9IHdtODczMV9tdXRlLAogCS5zZXRfc3lzY2xrCT0gd204NzMxX3NldF9kYWlfc3lzY2xrLAogCS5zZXRfZm10CT0gd204NzMxX3NldF9kYWlfZm10LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggNjc4NTY4OC4uOWE1ZTY3YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC02ODAsMjAgKzY4MCwyNSBAQAogI2RlZmluZSBXTTg4MDRfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBcCiAJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKIAorI2RlZmluZSBXTTg4MDRfUkFURVMgKFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfNjQwMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMCkKKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgd204ODA0X2RhaSA9IHsKIAkubmFtZSA9ICJ3bTg4MDQtc3BkaWYiLAogCS5wbGF5YmFjayA9IHsKIAkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKIAkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJLnJhdGVzID0gV004ODA0X1JBVEVTLAogCQkuZm9ybWF0cyA9IFdNODgwNF9GT1JNQVRTLAogCX0sCiAJLmNhcHR1cmUgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKIAkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJLnJhdGVzID0gV004ODA0X1JBVEVTLAogCQkuZm9ybWF0cyA9IFdNODgwNF9GT1JNQVRTLAogCX0sCiAJLm9wcyA9ICZ3bTg4MDRfZGFpX29wcywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTE1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkxNS5jCmluZGV4IGEwYjFhNzIuLmUyYWI0ZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTE1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MTUuYwpAQCAtMTgzOSw3ICsxODM5LDcgQEAKIAlpbnQgb2xkOwogCiAJLyogRGlzYWJsZSBTWVNDTEsgd2hpbGUgd2UgcmVjb25maWd1cmUgKi8KLQlvbGQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkxNV9BSUZfQ0xPQ0tJTkdfMSk7CisJb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MTVfQUlGX0NMT0NLSU5HXzEpICYgV004OTE1X1NZU0NMS19FTkE7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTE1X0FJRl9DTE9DS0lOR18xLAogCQkJICAgIFdNODkxNV9TWVNDTEtfRU5BLCAwKTsKIApAQCAtMjAzOCw2ICsyMDM4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTTg5MTVfRkxMX01DTEsyOgogCQlyZWcgPSAxOworCQlicmVhazsKIAljYXNlIFdNODkxNV9GTExfREFDTFJDTEsxOgogCQlyZWcgPSAyOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCmluZGV4IGY5MGFlNDIuLjVlMDVlZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwpAQCAtMTk5OSwxMiArMTk5OSwxMiBAQAogCQlyZXR1cm4gMDsKIAogCS8qIElmIHRoZSBsZWZ0IFBHQSBpcyBlbmFibGVkIGhpdCB0aGF0IFZVIGJpdC4uLiAqLwotCWlmIChyZWdfY2FjaGVbV004OTYyX1BXUl9NR01UXzJdICYgV004OTYyX0hQT1VUTF9QR0FfRU5BKQorCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9QV1JfTUdNVF8yKSAmIFdNODk2Ml9IUE9VVExfUEdBX0VOQSkKIAkJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9IUE9VVExfVk9MVU1FLAogCQkJCSAgICAgcmVnX2NhY2hlW1dNODk2Ml9IUE9VVExfVk9MVU1FXSk7CiAKIAkvKiAuLi5vdGhlcndpc2UgdGhlIHJpZ2h0LiAgVGhlIFZVIGlzIHN0ZXJlby4gKi8KLQlpZiAocmVnX2NhY2hlW1dNODk2Ml9QV1JfTUdNVF8yXSAmIFdNODk2Ml9IUE9VVFJfUEdBX0VOQSkKKwlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjJfUFdSX01HTVRfMikgJiBXTTg5NjJfSFBPVVRSX1BHQV9FTkEpCiAJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfSFBPVVRSX1ZPTFVNRSwKIAkJCQkgICAgIHJlZ19jYWNoZVtXTTg5NjJfSFBPVVRSX1ZPTFVNRV0pOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwppbmRleCAzYzJlZTFiLi42YWYyM2QwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKaW5kZXggOTcwYTk1Yy4uODMwMTRhNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCkBAIC0xMTkwLDcgKzExOTAsNiBAQAogU05EX1NPQ19EQVBNX0lOUFVUKCJETUlDMkRBVCIpLAogU05EX1NPQ19EQVBNX0lOUFVUKCJDbG9jayIpLAogCi1TTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUyIsIFdNODk5NF9NSUNCSUFTLCAyLCAwKSwKIFNORF9TT0NfREFQTV9TVVBQTFlfUygiTUlDQklBUyBTdXBwbHkiLCAxLCBTTkRfU09DX05PUE0sIDAsIDAsIG1pY2JpYXNfZXYsCiAJCSAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKIApAQCAtMTUwOSw4ICsxNTA4LDEwIEBACiAJeyAiQUlGMkRBQ0RBVCIsIE5VTEwsICJBSUYxREFDREFUIiB9LAogCXsgIkFJRjFBRENEQVQiLCBOVUxMLCAiQUlGMkFEQ0RBVCIgfSwKIAl7ICJBSUYyQURDREFUIiwgTlVMTCwgIkFJRjFBRENEQVQiIH0sCi0JeyAiTUlDQklBUyIsIE5VTEwsICJDTEtfU1lTIiB9LAotCXsgIk1JQ0JJQVMiLCBOVUxMLCAiTUlDQklBUyBTdXBwbHkiIH0sCisJeyAiTUlDQklBUzEiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJNSUNCSUFTIFN1cHBseSIgfSwKKwl7ICJNSUNCSUFTMiIsIE5VTEwsICJDTEtfU1lTIiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIk1JQ0JJQVMgU3VwcGx5IiB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd204OTk0X2ludGVyY29uW10gPSB7CkBAIC0xNzEzLDYgKzE3MTQsOCBAQAogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfRkxMMV9DT05UUk9MXzEgKyByZWdfb2Zmc2V0LAogCQkJCSAgICBXTTg5OTRfRkxMMV9FTkEgfCBXTTg5OTRfRkxMMV9GUkFDLAogCQkJCSAgICByZWcpOworCisJCW1zbGVlcCg1KTsKIAl9CiAKIAl3bTg5OTQtPmZsbFtpZF0uaW4gPSBmcmVxX2luOwpAQCAtMjc2MSw3ICsyNzY0LDcgQEAKIAlyZXBvcnQgPSBTTkRfSkFDS19NSUNST1BIT05FOwogCiAJLyogRXZlcnl0aGluZyBlbHNlIGlzIGJ1dHRvbnM7IGp1c3QgYXNzaWduIHNsb3RzICovCi0JaWYgKHN0YXR1cyAmIDB4MWMwKQorCWlmIChzdGF0dXMgJiAweDFjKQogCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzA7CiAKIGRvbmU6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jCmluZGV4IGU1NWIyOTguLjllMzcwZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jCkBAIC0yMTUsMjMgKzIxNSwyMyBAQAogU09DX1NJTkdMRV9UTFYoIklOMUwgVm9sdW1lIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8xXzJfVk9MVU1FLCAwLCAzMSwgMCwKIAkgICAgICAgaW5wZ2FfdGx2KSwKIFNPQ19TSU5HTEUoIklOMUwgU3dpdGNoIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8xXzJfVk9MVU1FLCA3LCAxLCAxKSwKLVNPQ19TSU5HTEUoIklOMUwgWkMgU3dpdGNoIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8xXzJfVk9MVU1FLCA3LCAxLCAwKSwKK1NPQ19TSU5HTEUoIklOMUwgWkMgU3dpdGNoIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8xXzJfVk9MVU1FLCA2LCAxLCAwKSwKIAogU09DX1NJTkdMRV9UTFYoIklOMVIgVm9sdW1lIiwgV004OTkzX1JJR0hUX0xJTkVfSU5QVVRfMV8yX1ZPTFVNRSwgMCwgMzEsIDAsCiAJICAgICAgIGlucGdhX3RsdiksCiBTT0NfU0lOR0xFKCJJTjFSIFN3aXRjaCIsIFdNODk5M19SSUdIVF9MSU5FX0lOUFVUXzFfMl9WT0xVTUUsIDcsIDEsIDEpLAotU09DX1NJTkdMRSgiSU4xUiBaQyBTd2l0Y2giLCBXTTg5OTNfUklHSFRfTElORV9JTlBVVF8xXzJfVk9MVU1FLCA3LCAxLCAwKSwKK1NPQ19TSU5HTEUoIklOMVIgWkMgU3dpdGNoIiwgV004OTkzX1JJR0hUX0xJTkVfSU5QVVRfMV8yX1ZPTFVNRSwgNiwgMSwgMCksCiAKIAogU09DX1NJTkdMRV9UTFYoIklOMkwgVm9sdW1lIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8zXzRfVk9MVU1FLCAwLCAzMSwgMCwKIAkgICAgICAgaW5wZ2FfdGx2KSwKIFNPQ19TSU5HTEUoIklOMkwgU3dpdGNoIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8zXzRfVk9MVU1FLCA3LCAxLCAxKSwKLVNPQ19TSU5HTEUoIklOMkwgWkMgU3dpdGNoIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8zXzRfVk9MVU1FLCA3LCAxLCAwKSwKK1NPQ19TSU5HTEUoIklOMkwgWkMgU3dpdGNoIiwgV004OTkzX0xFRlRfTElORV9JTlBVVF8zXzRfVk9MVU1FLCA2LCAxLCAwKSwKIAogU09DX1NJTkdMRV9UTFYoIklOMlIgVm9sdW1lIiwgV004OTkzX1JJR0hUX0xJTkVfSU5QVVRfM180X1ZPTFVNRSwgMCwgMzEsIDAsCiAJICAgICAgIGlucGdhX3RsdiksCiBTT0NfU0lOR0xFKCJJTjJSIFN3aXRjaCIsIFdNODk5M19SSUdIVF9MSU5FX0lOUFVUXzNfNF9WT0xVTUUsIDcsIDEsIDEpLAotU09DX1NJTkdMRSgiSU4yUiBaQyBTd2l0Y2giLCBXTTg5OTNfUklHSFRfTElORV9JTlBVVF8zXzRfVk9MVU1FLCA3LCAxLCAwKSwKK1NPQ19TSU5HTEUoIklOMlIgWkMgU3dpdGNoIiwgV004OTkzX1JJR0hUX0xJTkVfSU5QVVRfM180X1ZPTFVNRSwgNiwgMSwgMCksCiAKIFNPQ19TSU5HTEVfVExWKCJNSVhJTkwgSU4yTCBWb2x1bWUiLCBXTTg5OTNfSU5QVVRfTUlYRVIzLCA3LCAxLCAwLAogCSAgICAgICBpbm1peF9zd190bHYpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfZG1hLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYwppbmRleCAxNWRhYzBmLi42NjgwYzBiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJICogc2hvdWxkIGFsbG9jYXRlIGEgRE1BIGJ1ZmZlciBvbmx5IGZvciB0aGUgc3RyZWFtcyB0aGF0IGFyZSB2YWxpZC4KIAkgKi8KIAotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1swXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGNhcmQtPmRldiwKIAkJCWZzbF9kbWFfaGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heCwKIAkJCSZwY20tPnN0cmVhbXNbMF0uc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKQEAgLTMyMCwxMyArMzIwLDEzIEBACiAJCX0KIAl9CiAKLQlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1sxXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGNhcmQtPmRldiwKIAkJCWZzbF9kbWFfaGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heCwKIAkJCSZwY20tPnN0cmVhbXNbMV0uc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKIAkJaWYgKHJldCkgewotCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZwY20tPnN0cmVhbXNbMF0uc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKIAkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FuJ3QgYWxsb2MgY2FwdHVyZSBkbWEgYnVmZmVyXG4iKTsKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmcGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtNDQ5LDcgKzQ0OSw4IEBACiAJZG1hX3ByaXZhdGUtPmxkX2J1Zl9waHlzID0gbGRfYnVmX3BoeXM7CiAJZG1hX3ByaXZhdGUtPmRtYV9idWZfcGh5cyA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hZGRyOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoZG1hX3ByaXZhdGUtPmlycSwgZnNsX2RtYV9pc3IsIDAsICJETUEiLCBkbWFfcHJpdmF0ZSk7CisJcmV0ID0gcmVxdWVzdF9pcnEoZG1hX3ByaXZhdGUtPmlycSwgZnNsX2RtYV9pc3IsIDAsICJmc2xkbWEtYXVkaW8iLAorCQkJICBkbWFfcHJpdmF0ZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImNhbid0IHJlZ2lzdGVyIElTUiBmb3IgSVJRICV1IChyZXQ9JWkpXG4iLAogCQkJZG1hX3ByaXZhdGUtPmlycSwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvS2NvbmZpZyBiL3NvdW5kL3NvYy9pbXgvS2NvbmZpZwppbmRleCBkOGYxMzBkLi5iYjY5OWJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L0tjb25maWcKKysrIGIvc291bmQvc29jL2lteC9LY29uZmlnCkBAIC0xMSw5ICsxMSw2IEBACiAKIGlmIFNORF9JTVhfU09DCiAKLWNvbmZpZyBTTkRfTVhDX1NPQ19TU0kKLQl0cmlzdGF0ZQotCiBjb25maWcgU05EX01YQ19TT0NfRklRCiAJdHJpc3RhdGUKIApAQCAtMjQsNyArMjEsNiBAQAogCXRyaXN0YXRlICJBdWRpbyBvbiB0aGUgdGhlIGkuTVgzMUFEUyB3aXRoIFdNMTEzMy1FVjEgZml0dGVkIgogCWRlcGVuZHMgb24gTUFDSF9NWDMxQURTX1dNMTEzM19FVjEgJiYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IFNORF9TT0NfV004MzUwCi0Jc2VsZWN0IFNORF9NWENfU09DX1NTSQogCXNlbGVjdCBTTkRfTVhDX1NPQ19GSVEKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgYXVkaW8gb24gdGhlIGkuTVgzMUFEUyB3aXRoIHRoZSBXTTExMzMtRVYxCkBAIC0zNCw3ICszMCw2IEBACiAJdHJpc3RhdGUgIlNvQyBhdWRpbyBzdXBwb3J0IGZvciBWaXNzdHJpbSBNMTAgYm9hcmRzIgogCWRlcGVuZHMgb24gTUFDSF9JTVgyN19WSVNTVFJJTV9NMTAKIAlzZWxlY3QgU05EX1NPQ19UVkwzMjBBSUMzMlg0Ci0Jc2VsZWN0IFNORF9NWENfU09DX1NTSQogCXNlbGVjdCBTTkRfTVhDX1NPQ19NWDIKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFZpc3N0cmltIFNNMTAKQEAgLTQ0LDcgKzM5LDYgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFBoeXRlYyBwaHlDT1JFIChhbmQgcGh5Q0FSRCkgYm9hcmRzIgogCWRlcGVuZHMgb24gTUFDSF9QQ00wNDMgfHwgTUFDSF9QQ0ExMDAKIAlzZWxlY3QgU05EX1NPQ19XTTk3MTIKLQlzZWxlY3QgU05EX01YQ19TT0NfU1NJCiAJc2VsZWN0IFNORF9NWENfU09DX0ZJUQogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gUGh5dGVjIHBoeUNPUkUKQEAgLTU3LDcgKzUxLDYgQEAKIAkJfHwgTUFDSF9FVUtSRUFfTUJJTVhTRDM1X0JBU0VCT0FSRCBcCiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0Q1MV9CQVNFQk9BUkQKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMwotCXNlbGVjdCBTTkRfTVhDX1NPQ19TU0kKIAlzZWxlY3QgU05EX01YQ19TT0NfRklRCiAJaGVscAogCSAgRW5hYmxlIEkyUyBiYXNlZCBhY2Nlc3MgdG8gdGhlIFRMVjMyMEFJQzIzQiBjb2RlYyBhdHRhY2hlZApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9pbXgtcGNtLWRtYS1teDIuYyBiL3NvdW5kL3NvYy9pbXgvaW14LXBjbS1kbWEtbXgyLmMKaW5kZXggYWFiNzc2NS4uNDE3M2IzZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC9pbXgtcGNtLWRtYS1teDIuYworKysgYi9zb3VuZC9zb2MvaW14L2lteC1wY20tZG1hLW14Mi5jCkBAIC0zMzcsMyArMzM3LDUgQEAKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW14X3BjbV9kcml2ZXIpOwogfQogbW9kdWxlX2V4aXQoc25kX2lteF9wY21fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlteC1wY20tYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5jIGIvc291bmQvc29jL2lteC9pbXgtc3NpLmMKaW5kZXggNWIxM2ZlYy4uNjFmY2ViMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC9pbXgtc3NpLmMKKysrIGIvc291bmQvc29jL2lteC9pbXgtc3NpLmMKQEAgLTc3NCw0ICs3NzQsNCBAQAogTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWCBJMlMvYWM5NyBTb0MgSW50ZXJmYWNlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KK01PRFVMRV9BTElBUygicGxhdGZvcm06aW14LXNzaSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwppbmRleCAyY2UwYjJkLi5mYWIyMGE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYworKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwpAQCAtOTUsMTQgKzk1LDE0IEBACiAJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQogCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCmluZGV4IGZmYTA5YjMuLjk5MmE3MzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlpZiAoIWkycykKIAkJcmV0dXJuIGZhbHNlOwogCi0JYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKTsKKwlhY3RpdmUgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNDT04pOwogCiAJaWYgKGlzX3NlY29uZGFyeShpMnMpKQogCQlhY3RpdmUgJj0gQ09OX1RYU0RNQV9BQ1RJVkU7CkBAIC0yMjMsNyArMjIzLDcgQEAKIAlpZiAoIWkycykKIAkJcmV0dXJuIGZhbHNlOwogCi0JYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKSAmIENPTl9SWERNQV9BQ1RJVkU7CisJYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTQ09OKSAmIENPTl9SWERNQV9BQ1RJVkU7CiAKIAlyZXR1cm4gYWN0aXZlID8gdHJ1ZSA6IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYyBiL3NvdW5kL3NvYy9zaC9mc2ktYWs0NjQyLmMKaW5kZXggZDZmNDcwMy4uNzcwYTcxYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jCkBAIC05Nyw3ICs5Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaV9hX2FrNDY0MiA9IHsKIAkubmFtZQkJPSAiQUs0NjQyIiwKLQkuY2FyZAkJPSAiRlNJQSAoQUs0NjQyKSIsCisJLmNhcmQJCT0gIkZTSUEtQUs0NjQyIiwKIAkuY3B1X2RhaQk9ICJmc2lhLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpLjAiLApAQCAtMTA2LDcgKzEwNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaV9iX2FrNDY0MiA9IHsKIAkubmFtZQkJPSAiQUs0NjQyIiwKLQkuY2FyZAkJPSAiRlNJQiAoQUs0NjQyKSIsCisJLmNhcmQJCT0gIkZTSUItQUs0NjQyIiwKIAkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpLjAiLApAQCAtMTE1LDcgKzExNSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaV9hX2FrNDY0MyA9IHsKIAkubmFtZQkJPSAiQUs0NjQzIiwKLQkuY2FyZAkJPSAiRlNJQSAoQUs0NjQzKSIsCisJLmNhcmQJCT0gIkZTSUEtQUs0NjQzIiwKIAkuY3B1X2RhaQk9ICJmc2lhLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEzIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpLjAiLApAQCAtMTI0LDcgKzEyNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaV9iX2FrNDY0MyA9IHsKIAkubmFtZQkJPSAiQUs0NjQzIiwKLQkuY2FyZAkJPSAiRlNJQiAoQUs0NjQzKSIsCisJLmNhcmQJCT0gIkZTSUItQUs0NjQzIiwKIAkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEzIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpLjAiLApAQCAtMTMzLDcgKzEzMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaTJfYV9hazQ2NDIgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MiIsCi0JLmNhcmQJCT0gIkZTSTJBIChBSzQ2NDIpIiwKKwkuY2FyZAkJPSAiRlNJMkEtQUs0NjQyIiwKIAkuY3B1X2RhaQk9ICJmc2lhLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCkBAIC0xNDIsNyArMTQyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpMl9iX2FrNDY0MiA9IHsKIAkubmFtZQkJPSAiQUs0NjQyIiwKLQkuY2FyZAkJPSAiRlNJMkIgKEFLNDY0MikiLAorCS5jYXJkCQk9ICJGU0kyQi1BSzQ2NDIiLAogCS5jcHVfZGFpCT0gImZzaWItZGFpIiwKIAkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTIiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2kyX2FfYWs0NjQzID0gewogCS5uYW1lCQk9ICJBSzQ2NDMiLAotCS5jYXJkCQk9ICJGU0kyQSAoQUs0NjQzKSIsCisJLmNhcmQJCT0gIkZTSTJBLUFLNDY0MyIsCiAJLmNwdV9kYWkJPSAiZnNpYS1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMyIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLApAQCAtMTYwLDcgKzE2MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaTJfYl9hazQ2NDMgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MyIsCi0JLmNhcmQJCT0gIkZTSTJCIChBSzQ2NDMpIiwKKwkuY2FyZAkJPSAiRlNJMkItQUs0NjQzIiwKIAkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEzIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvZnNpLWRhNzIxMC5jIGIvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYwppbmRleCBkYmFmZDdhLi41OTU1M2ZkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZnNpLWRhNzIxMC5jCisrKyBiL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKQEAgLTQyLDcgKzQyLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGZzaV9zb2NfY2FyZCA9IHsKLQkubmFtZQkJPSAiRlNJIChEQTcyMTApIiwKKwkubmFtZQkJPSAiRlNJLURBNzIxMCIsCiAJLmRhaV9saW5rCT0gJmZzaV9kYTcyMTBfZGFpLAogCS5udW1fbGlua3MJPSAxLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2ktaGRtaS5jIGIvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKaW5kZXggOTcxOTk4NS4uZDNkOWZkOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKQEAgLTgzLDEzICs4MywxMyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9oZG1pX2RhdGEgZnNpMl9hX2hkbWkgPSB7CiAJLmNwdV9kYWkJPSAiZnNpYS1kYWkiLAotCS5jYXJkCQk9ICJGU0kyQSAoU0ggTU9CSUxFIEhETUkpIiwKKwkuY2FyZAkJPSAiRlNJMkEtSERNSSIsCiAJLmlkCQk9IEZTSV9QT1JUX0EsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZzaV9oZG1pX2RhdGEgZnNpMl9iX2hkbWkgPSB7CiAJLmNwdV9kYWkJPSAiZnNpYi1kYWkiLAotCS5jYXJkCQk9ICJGU0kyQiAoU0ggTU9CSUxFIEhETUkpIiwKKwkuY2FyZAkJPSAiRlNJMkItSERNSSIsCiAJLmlkCQk9IEZTSV9QT1JUX0IsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNhY2hlLmMgYi9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKaW5kZXggMDZiN2I4MS4uMDM5Yjk1MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jYWNoZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY2FjaGUuYwpAQCAtNDA5LDkgKzQwOSw2IEBACiAJY29kZWMtPmJ1bGtfd3JpdGVfcmF3ID0gc25kX3NvY19od19idWxrX3dyaXRlX3JhdzsKIAogCXN3aXRjaCAoY29udHJvbCkgewotCWNhc2UgU05EX1NPQ19DVVNUT006Ci0JCWJyZWFrOwotCiAJY2FzZSBTTkRfU09DX0kyQzoKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IChkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiAJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKQEAgLTQ2Niw2ICs0NjMsOSBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jX2dldF9jYWNoZV92YWwoY29uc3Qgdm9pZCAqYmFzZSwgdW5zaWduZWQgaW50IGlkeCwKIAkJdW5zaWduZWQgaW50IHdvcmRfc2l6ZSkKIHsKKwlpZiAoIWJhc2UpCisJCXJldHVybiAtMTsKKwogCXN3aXRjaCAod29yZF9zaXplKSB7CiAJY2FzZSAxOiB7CiAJCWNvbnN0IHU4ICpjYWNoZSA9IGJhc2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IGQ3NTA0M2UuLmIxOTRiZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0xOTI5LDggKzE5MjksOSBAQAogCQkgIiVzIiwgY2FyZC0+bmFtZSk7CiAJc25wcmludGYoY2FyZC0+c25kX2NhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+c25kX2NhcmQtPmxvbmduYW1lKSwKIAkJICIlcyIsIGNhcmQtPmxvbmdfbmFtZSA/IGNhcmQtPmxvbmdfbmFtZSA6IGNhcmQtPm5hbWUpOwotCXNucHJpbnRmKGNhcmQtPnNuZF9jYXJkLT5kcml2ZXIsIHNpemVvZihjYXJkLT5zbmRfY2FyZC0+ZHJpdmVyKSwKLQkJICIlcyIsIGNhcmQtPmRyaXZlcl9uYW1lID8gY2FyZC0+ZHJpdmVyX25hbWUgOiBjYXJkLT5uYW1lKTsKKwlpZiAoY2FyZC0+ZHJpdmVyX25hbWUpCisJCXN0cmxjcHkoY2FyZC0+c25kX2NhcmQtPmRyaXZlciwgY2FyZC0+ZHJpdmVyX25hbWUsCisJCQlzaXplb2YoY2FyZC0+c25kX2NhcmQtPmRyaXZlcikpOwogCiAJaWYgKGNhcmQtPmxhdGVfcHJvYmUpIHsKIAkJcmV0ID0gY2FyZC0+bGF0ZV9wcm9iZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggOTk5YmIwOC4uMzJhYjdmYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTMyNSw2ICszMjUsNyBAQAogfQogCiBzdGF0aWMgaW50IGRhcG1faXNfc2hhcmVkX2tjb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqa2NvbnRyb2x3LAogCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbF9uZXcsCiAJc3RydWN0IHNuZF9rY29udHJvbCAqKmtjb250cm9sKQogewpAQCAtMzM0LDYgKzMzNSw4IEBACiAJKmtjb250cm9sID0gTlVMTDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmRhcG0tPmNhcmQtPndpZGdldHMsIGxpc3QpIHsKKwkJaWYgKHcgPT0ga2NvbnRyb2x3IHx8IHctPmRhcG0gIT0ga2NvbnRyb2x3LT5kYXBtKQorCQkJY29udGludWU7CiAJCWZvciAoaSA9IDA7IGkgPCB3LT5udW1fa2NvbnRyb2xzOyBpKyspIHsKIAkJCWlmICgmdy0+a2NvbnRyb2xfbmV3c1tpXSA9PSBrY29udHJvbF9uZXcpIHsKIAkJCQlpZiAody0+a2NvbnRyb2xzKQpAQCAtMzQ3LDkgKzM1MCw5IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtaXhlciBjb250cm9sICovCi1zdGF0aWMgaW50IGRhcG1fbmV3X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3N0YXRpYyBpbnQgZGFwbV9uZXdfbWl4ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKIAlpbnQgaSwgcmV0ID0gMDsKIAlzaXplX3QgbmFtZV9sZW4sIHByZWZpeF9sZW47CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwpAQCAtNDQ3LDkgKzQ1MCw5IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtdXggY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQorc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQtPnNuZF9jYXJkOwpAQCAtNDY4LDcgKzQ3MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNoYXJlZCA9IGRhcG1faXNfc2hhcmVkX2tjb250cm9sKGRhcG0sICZ3LT5rY29udHJvbF9uZXdzWzBdLAorCXNoYXJlZCA9IGRhcG1faXNfc2hhcmVkX2tjb250cm9sKGRhcG0sIHcsICZ3LT5rY29udHJvbF9uZXdzWzBdLAogCQkJCQkgJmtjb250cm9sKTsKIAlpZiAoa2NvbnRyb2wpIHsKIAkJd2xpc3QgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwpAQCAtNTMyLDggKzUzNSw3IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSB2b2x1bWUgY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQorc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CiAJaWYgKHctPm51bV9rY29udHJvbHMpCiAJCWRldl9lcnIody0+ZGFwbS0+ZGV2LApAQCAtMTgyMywxMyArMTgyNSwxMyBAQAogCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgogCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7Ci0JCQlkYXBtX25ld19taXhlcihkYXBtLCB3KTsKKwkJCWRhcG1fbmV3X21peGVyKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX211eDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfbXV4KGRhcG0sIHcpOworCQkJZGFwbV9uZXdfbXV4KHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKIAkJY2FzZSBzbmRfc29jX2RhcG1fYWlmX291dDoKQEAgLTE4NDIsNyArMTg0NCw3IEBACiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKIAkJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfcGdhKGRhcG0sIHcpOworCQkJZGFwbV9uZXdfcGdhKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgogCQljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfaTJzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfaTJzLmMKaW5kZXggNmI4MTdlMi4uOTVmMDNjMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2kycy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9pMnMuYwpAQCAtMjIyLDEyICsyMjIsMTggQEAKIAlpZiAoaTJzY2xvY2sgJSAoMiAqIHNyYXRlKSkKIAkJcmVnIHw9IFRFR1JBX0kyU19USU1JTkdfTk9OX1NZTV9FTkFCTEU7CiAKKwlpZiAoIWkycy0+Y2xrX3JlZnMpCisJCWNsa19lbmFibGUoaTJzLT5jbGtfaTJzKTsKKwogCXRlZ3JhX2kyc193cml0ZShpMnMsIFRFR1JBX0kyU19USU1JTkcsIHJlZyk7CiAKIAl0ZWdyYV9pMnNfd3JpdGUoaTJzLCBURUdSQV9JMlNfRklGT19TQ1IsCiAJCVRFR1JBX0kyU19GSUZPX1NDUl9GSUZPMl9BVE5fTFZMX0ZPVVJfU0xPVFMgfAogCQlURUdSQV9JMlNfRklGT19TQ1JfRklGTzFfQVROX0xWTF9GT1VSX1NMT1RTKTsKIAorCWlmICghaTJzLT5jbGtfcmVmcykKKwkJY2xrX2Rpc2FibGUoaTJzLT5jbGtfaTJzKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zcGkvYXQ3M2MyMTMuYyBiL3NvdW5kL3NwaS9hdDczYzIxMy5jCmluZGV4IDMzN2EwMDIuLjRkZDA1MWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwaS9hdDczYzIxMy5jCisrKyBiL3NvdW5kL3NwaS9hdDczYzIxMy5jCkBAIC0xMTI0LDYgKzExMjQsNiBAQAogfQogbW9kdWxlX2V4aXQoYXQ3M2MyMTNfZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhjZWd0dmVkdEBhdG1lbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxlZ3R2ZWR0QHNhbWZ1bmRldC5ubz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU291bmQgZHJpdmVyIGZvciBBVDczQzIxMyB3aXRoIEF0bWVsIFNTQyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMgYi9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYwppbmRleCBkNDdiZWZmLi4xZTNhZTMzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYworKysgYi9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYwpAQCAtMjI3LDYgKzIyNyw3IEBACiAJcmV0ID0gdXNiNmZpcmVfZndfaWhleF9pbml0KGZ3LCByZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJlYyk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3IgdmFsaWRhdGluZyBlenVzYiAiCiAJCQkJImZpcm13YXJlICVzLlxuIiwgZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKQEAgLTI2OSw3ICsyNzAsNiBAQAogCWRhdGEgPSAweDAwOyAvKiByZXN1bWUgZXp1c2IgY3B1ICovCiAJcmV0ID0gdXNiNmZpcmVfZndfZXp1c2Jfd3JpdGUoZGV2aWNlLCAweGEwLCAweGU2MDAsICZkYXRhLCAxKTsKIAlpZiAocmV0IDwgMCkgewotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgIgogCQkJCSJmaXJtd2FyZSAlczogZW5kIG1lc3NhZ2UuXG4iLCBmd25hbWUpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL3BjbS5jIGIvc291bmQvdXNiLzZmaXJlL3BjbS5jCmluZGV4IGIxMzdiMjUuLmQxNDRjZGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9wY20uYworKysgYi9zb3VuZC91c2IvNmZpcmUvcGNtLmMKQEAgLTM5NSwxMiArMzk1LDEyIEBACiAJYWxzYV9ydC0+aHcgPSBwY21faHc7CiAKIAlpZiAoYWxzYV9zdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWlmIChydC0+cmF0ZSA+PSAwKQorCQlpZiAocnQtPnJhdGUgPCBBUlJBWV9TSVpFKHJhdGVzKSkKIAkJCWFsc2FfcnQtPmh3LnJhdGVzID0gcmF0ZXNfYWxzYWlkW3J0LT5yYXRlXTsKIAkJYWxzYV9ydC0+aHcuY2hhbm5lbHNfbWF4ID0gT1VUX05fQ0hBTk5FTFM7CiAJCXN1YiA9ICZydC0+cGxheWJhY2s7CiAJfSBlbHNlIGlmIChhbHNhX3N1Yi0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQlpZiAocnQtPnJhdGUgPj0gMCkKKwkJaWYgKHJ0LT5yYXRlIDwgQVJSQVlfU0laRShyYXRlcykpCiAJCQlhbHNhX3J0LT5ody5yYXRlcyA9IHJhdGVzX2Fsc2FpZFtydC0+cmF0ZV07CiAJCWFsc2FfcnQtPmh3LmNoYW5uZWxzX21heCA9IElOX05fQ0hBTk5FTFM7CiAJCXN1YiA9ICZydC0+Y2FwdHVyZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9xdWlya3MuYyBiL3NvdW5kL3VzYi9xdWlya3MuYwppbmRleCAyZTk2OWNiLi4wOTBlMTkzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL3F1aXJrcy5jCkBAIC00MDMsNyArNDAzLDcgQEAKIHN0YXRpYyBpbnQgc25kX3VzYl9jbTYyMDZfYm9vdF9xdWlyayhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQogewogCWludCBlcnIsIHJlZzsKLQlpbnQgdmFsW10gPSB7MHgyMDBjLCAweDMwMDAsIDB4ZjgwMCwgMHgxNDNmLCAweDAwMDAsIDB4MzAwMH07CisJaW50IHZhbFtdID0gezB4MjAwNCwgMHgzMDAwLCAweGY4MDAsIDB4MTQzZiwgMHgwMDAwLCAweDMwMDB9OwogCiAJZm9yIChyZWcgPSAwOyByZWcgPCBBUlJBWV9TSVpFKHZhbCk7IHJlZysrKSB7CiAJCWVyciA9IHNuZF91c2JfY20xMDZfd3JpdGVfaW50X3JlZyhkZXYsIHJlZywgdmFsW3JlZ10pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKaW5kZXggMDMyYmE2My4uOTQwMjU3YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NYWtlZmlsZQorKysgYi90b29scy9wZXJmL01ha2VmaWxlCkBAIC02MzMsNyArNjMzLDcgQEAKIAogU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCiAKLUxJQlMgPSAtV2wsLS13aG9sZS1hcmNoaXZlICQoUEVSRkxJQlMpIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgJChFWFRMSUJTKQorTElCUyA9IC1XbCwtLXdob2xlLWFyY2hpdmUgJChQRVJGTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAtV2wsLS1zdGFydC1ncm91cCAkKEVYVExJQlMpIC1XbCwtLWVuZC1ncm91cAogCiBBTExfQ0ZMQUdTICs9ICQoQkFTSUNfQ0ZMQUdTKQogQUxMX0NGTEFHUyArPSAkKEFSQ0hfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKaW5kZXggYjY3MTg2Mi4uMmRhOTE2MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCkBAIC00NzQsNyArNDc0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbnJfZXZlbnRzW25zeXNjYWxsc10sCiAJCSAgICAgZXhwZWN0ZWRfbnJfZXZlbnRzW25zeXNjYWxsc10sIGksIGo7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2Vsc1tuc3lzY2FsbHNdLCAqZXZzZWw7Ci0JaW50IHNhbXBsZV9zaXplID0gcGVyZl9zYW1wbGVfc2l6ZShhdHRyLnNhbXBsZV90eXBlKTsKKwlpbnQgc2FtcGxlX3NpemUgPSBfX3BlcmZfZXZzZWxfX3NhbXBsZV9zaXplKGF0dHIuc2FtcGxlX3R5cGUpOwogCiAJZm9yIChpID0gMDsgaSA8IG5zeXNjYWxsczsgKytpKSB7CiAJCWNoYXIgbmFtZVs2NF07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTiBiL3Rvb2xzL3BlcmYvdXRpbC9QRVJGLVZFUlNJT04tR0VOCmluZGV4IDI2ZDRkM2YuLmFkNzMzMDAgMTAwNzU1Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9QRVJGLVZFUlNJT04tR0VOCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9QRVJGLVZFUlNJT04tR0VOCkBAIC0yMywxMiArMjMsNyBAQAogdGhlbgogCVZOPSQoZWNobyAiJFZOIiB8IHNlZCAtZSAncy8tLy4vZycpOwogZWxzZQotCWV2YWwgJChncmVwICdeVkVSU0lPTltbOnNwYWNlOl1dKj0nIC4uLy4uL01ha2VmaWxlfHRyIC1kICcgJykKLQlldmFsICQoZ3JlcCAnXlBBVENITEVWRUxbWzpzcGFjZTpdXSo9JyAuLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCi0JZXZhbCAkKGdyZXAgJ15TVUJMRVZFTFtbOnNwYWNlOl1dKj0nIC4uLy4uL01ha2VmaWxlfHRyIC1kICcgJykKLQlldmFsICQoZ3JlcCAnXkVYVFJBVkVSU0lPTltbOnNwYWNlOl1dKj0nIC4uLy4uL01ha2VmaWxlfHRyIC1kICcgJykKLQotCVZOPSIke1ZFUlNJT059LiR7UEFUQ0hMRVZFTH0uJHtTVUJMRVZFTH0ke0VYVFJBVkVSU0lPTn0iCisJVk49JChNQUtFRkxBR1M9IG1ha2UgLXNDIC4uLy4uIGtlcm5lbHZlcnNpb24pCiBmaQogCiBWTj0kKGV4cHIgIiRWTiIgOiB2KidcKC4qXCknKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvZXZlbnQuYwppbmRleCAwZmU5YWRmLi4zYzFiOGE2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZlbnQuYwpAQCAtMzUsMjIgKzM1LDYgQEAKIAlyZXR1cm4gcGVyZl9ldmVudF9fbmFtZXNbaWRdOwogfQogCi1pbnQgcGVyZl9zYW1wbGVfc2l6ZSh1NjQgc2FtcGxlX3R5cGUpCi17Ci0JdTY0IG1hc2sgPSBzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX01BU0s7Ci0JaW50IHNpemUgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaWYgKG1hc2sgJiAoMVVMTCA8PCBpKSkKLQkJCXNpemUrKzsKLQl9Ci0KLQlzaXplICo9IHNpemVvZih1NjQpOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGVyZl9zYW1wbGUgc3ludGhfc2FtcGxlID0gewogCS5waWQJICAgPSAtMSwKIAkudGlkCSAgID0gLTEsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCmluZGV4IGMwODMzMjguLjFkN2Y2NjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCkBAIC04Miw4ICs4Miw2IEBACiAJc3RydWN0IGlwX2NhbGxjaGFpbiAqY2FsbGNoYWluOwogfTsKIAotaW50IHBlcmZfc2FtcGxlX3NpemUodTY0IHNhbXBsZV90eXBlKTsKLQogI2RlZmluZSBCVUlMRF9JRF9TSVpFIDIwCiAKIHN0cnVjdCBidWlsZF9pZF9ldmVudCB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMgYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKaW5kZXggNTBhYTM0OC4uYjAyMWVhOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgImV2bGlzdC5oIgogI2luY2x1ZGUgImV2c2VsLmgiCiAjaW5jbHVkZSAidXRpbC5oIgotI2luY2x1ZGUgImRlYnVnLmgiCiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCkBAIC0yNTcsMTkgKzI1NiwxNSBAQAogCXJldHVybiBldmxpc3QtPm1tYXAgIT0gTlVMTCA/IDAgOiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW50IF9fcGVyZl9ldmxpc3RfX21tYXAoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKK3N0YXRpYyBpbnQgX19wZXJmX2V2bGlzdF9fbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKIAkJCSAgICAgICBpbnQgaWR4LCBpbnQgcHJvdCwgaW50IG1hc2ssIGludCBmZCkKIHsKIAlldmxpc3QtPm1tYXBbaWR4XS5wcmV2ID0gMDsKIAlldmxpc3QtPm1tYXBbaWR4XS5tYXNrID0gbWFzazsKIAlldmxpc3QtPm1tYXBbaWR4XS5iYXNlID0gbW1hcChOVUxMLCBldmxpc3QtPm1tYXBfbGVuLCBwcm90LAogCQkJCSAgICAgIE1BUF9TSEFSRUQsIGZkLCAwKTsKLQlpZiAoZXZsaXN0LT5tbWFwW2lkeF0uYmFzZSA9PSBNQVBfRkFJTEVEKSB7Ci0JCWlmIChldmxpc3QtPmNwdXMtPm1hcFtpZHhdID09IC0xICYmIGV2c2VsLT5hdHRyLmluaGVyaXQpCi0JCQl1aV9fd2FybmluZygiSW5oZXJpdCBpcyBub3QgYWxsb3dlZCBvbiBwZXItdGFzayAiCi0JCQkJICAgICJldmVudHMgdXNpbmcgbW1hcC5cbiIpOworCWlmIChldmxpc3QtPm1tYXBbaWR4XS5iYXNlID09IE1BUF9GQUlMRUQpCiAJCXJldHVybiAtMTsKLQl9CiAKIAlwZXJmX2V2bGlzdF9fYWRkX3BvbGxmZChldmxpc3QsIGZkKTsKIAlyZXR1cm4gMDsKQEAgLTI4OSw3ICsyODQsNyBAQAogCiAJCQkJaWYgKG91dHB1dCA9PSAtMSkgewogCQkJCQlvdXRwdXQgPSBmZDsKLQkJCQkJaWYgKF9fcGVyZl9ldmxpc3RfX21tYXAoZXZsaXN0LCBldnNlbCwgY3B1LAorCQkJCQlpZiAoX19wZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIGNwdSwKIAkJCQkJCQkJcHJvdCwgbWFzaywgb3V0cHV0KSA8IDApCiAJCQkJCQlnb3RvIG91dF91bm1hcDsKIAkJCQl9IGVsc2UgewpAQCAtMzI5LDcgKzMyNCw3IEBACiAKIAkJCWlmIChvdXRwdXQgPT0gLTEpIHsKIAkJCQlvdXRwdXQgPSBmZDsKLQkJCQlpZiAoX19wZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIGV2c2VsLCB0aHJlYWQsCisJCQkJaWYgKF9fcGVyZl9ldmxpc3RfX21tYXAoZXZsaXN0LCB0aHJlYWQsCiAJCQkJCQkJcHJvdCwgbWFzaywgb3V0cHV0KSA8IDApCiAJCQkJCWdvdG8gb3V0X3VubWFwOwogCQkJfSBlbHNlIHsKQEAgLTQ2MCwzMyArNDU1LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXU2NCBwZXJmX2V2bGlzdF9fc2FtcGxlX3R5cGUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCitib29sIHBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfdHlwZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKIHsKLQlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zOwotCXU2NCB0eXBlID0gMDsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zLCAqZmlyc3Q7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgewotCQlpZiAoIXR5cGUpCi0JCQl0eXBlID0gcG9zLT5hdHRyLnNhbXBsZV90eXBlOwotCQllbHNlIGlmICh0eXBlICE9IHBvcy0+YXR0ci5zYW1wbGVfdHlwZSkKLQkJCWRpZSgibm9uIG1hdGNoaW5nIHNhbXBsZV90eXBlIik7CisJcG9zID0gZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHBvcywgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgeworCQlpZiAoZmlyc3QtPmF0dHIuc2FtcGxlX3R5cGUgIT0gcG9zLT5hdHRyLnNhbXBsZV90eXBlKQorCQkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiB0eXBlOworCXJldHVybiB0cnVlOworfQorCit1NjQgcGVyZl9ldmxpc3RfX3NhbXBsZV90eXBlKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpmaXJzdDsKKworCWZpcnN0ID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCXJldHVybiBmaXJzdC0+YXR0ci5zYW1wbGVfdHlwZTsKK30KKworYm9vbCBwZXJmX2V2bGlzdF9fdmFsaWRfc2FtcGxlX2lkX2FsbChjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zLCAqZmlyc3Q7CisKKwlwb3MgPSBmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocG9zLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7CisJCWlmIChmaXJzdC0+YXR0ci5zYW1wbGVfaWRfYWxsICE9IHBvcy0+YXR0ci5zYW1wbGVfaWRfYWxsKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOwogfQogCiBib29sIHBlcmZfZXZsaXN0X19zYW1wbGVfaWRfYWxsKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQogewotCWJvb2wgdmFsdWUgPSBmYWxzZSwgZmlyc3QgPSB0cnVlOwotCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CisJc3RydWN0IHBlcmZfZXZzZWwgKmZpcnN0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKLQkJaWYgKGZpcnN0KSB7Ci0JCQl2YWx1ZSA9IHBvcy0+YXR0ci5zYW1wbGVfaWRfYWxsOwotCQkJZmlyc3QgPSBmYWxzZTsKLQkJfSBlbHNlIGlmICh2YWx1ZSAhPSBwb3MtPmF0dHIuc2FtcGxlX2lkX2FsbCkKLQkJCWRpZSgibm9uIG1hdGNoaW5nIHNhbXBsZV9pZF9hbGwiKTsKLQl9Ci0KLQlyZXR1cm4gdmFsdWU7CisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisJcmV0dXJuIGZpcnN0LT5hdHRyLnNhbXBsZV9pZF9hbGw7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmggYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKaW5kZXggMGExZWYxZi4uYjJiODYyMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaApAQCAtNjYsNyArNjYsOSBAQAogdm9pZCBwZXJmX2V2bGlzdF9fZGVsZXRlX21hcHMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwogaW50IHBlcmZfZXZsaXN0X19zZXRfZmlsdGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiAKLXU2NCBwZXJmX2V2bGlzdF9fc2FtcGxlX3R5cGUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwotYm9vbCBwZXJmX2V2bGlzdF9fc2FtcGxlX2lkX2FsbChjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7Cit1NjQgcGVyZl9ldmxpc3RfX3NhbXBsZV90eXBlKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKK2Jvb2wgcGVyZl9ldmxpc3RfX3NhbXBsZV9pZF9hbGwoY29uc3QgY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwogCitib29sIHBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfdHlwZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7Citib29sIHBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfaWRfYWxsKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKICNlbmRpZiAvKiBfX1BFUkZfRVZMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKaW5kZXggY2NhMjllZC4uMDIzOWViOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKQEAgLTE1LDYgKzE1LDIyIEBACiAKICNkZWZpbmUgRkQoZSwgeCwgeSkgKCooaW50ICopeHlhcnJheV9fZW50cnkoZS0+ZmQsIHgsIHkpKQogCitpbnQgX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZSh1NjQgc2FtcGxlX3R5cGUpCit7CisJdTY0IG1hc2sgPSBzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX01BU0s7CisJaW50IHNpemUgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJaWYgKG1hc2sgJiAoMVVMTCA8PCBpKSkKKwkJCXNpemUrKzsKKwl9CisKKwlzaXplICo9IHNpemVvZih1NjQpOworCisJcmV0dXJuIHNpemU7Cit9CisKIHZvaWQgcGVyZl9ldnNlbF9faW5pdChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIGludCBpZHgpCiB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCmluZGV4IGY3OWJiMmMuLjdlOTM2NmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCkBAIC0xNDksNCArMTQ5LDExIEBACiAJcmV0dXJuIF9fcGVyZl9ldnNlbF9fcmVhZChldnNlbCwgbmNwdXMsIG50aHJlYWRzLCB0cnVlKTsKIH0KIAoraW50IF9fcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUodTY0IHNhbXBsZV90eXBlKTsKKworc3RhdGljIGlubGluZSBpbnQgcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQoreworCXJldHVybiBfX3BlcmZfZXZzZWxfX3NhbXBsZV9zaXplKGV2c2VsLT5hdHRyLnNhbXBsZV90eXBlKTsKK30KKwogI2VuZGlmIC8qIF9fUEVSRl9FVlNFTF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMgYi90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMKaW5kZXggNjk0MzZiMy4uYTlhYzA1MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYwpAQCAtNjc0LDcgKzY3NCw3IEBACiAJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAmcGV2bGlzdC0+ZXZsaXN0OwogCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50OwogCWludCBzYW1wbGVfaWRfYWxsID0gMSwgY3B1OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2FtcGxlX2lkX2FsbCIsIE5VTEwsIE5VTEx9OworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiY3B1IiwgInNhbXBsZV9pZF9hbGwiLCBOVUxMLCBOVUxMfTsKIAlpbnQgZXJyOwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaXxpIiwga3dsaXN0LApAQCAtNjkyLDE2ICs2OTIsMTQgQEAKIAogCQlmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKIAkJZXJyID0gcGVyZl9ldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50LCBmaXJzdC0+YXR0ci5zYW1wbGVfdHlwZSwKLQkJCQkJICAgICAgIHBlcmZfc2FtcGxlX3NpemUoZmlyc3QtPmF0dHIuc2FtcGxlX3R5cGUpLAorCQkJCQkgICAgICAgcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUoZmlyc3QpLAogCQkJCQkgICAgICAgc2FtcGxlX2lkX2FsbCwgJnBldmVudC0+c2FtcGxlKTsKLQkJaWYgKGVycikgewotCQkJcHJfZXJyKCJDYW4ndCBwYXJzZSBzYW1wbGUsIGVyciA9ICVkXG4iLCBlcnIpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQorCQlpZiAoZXJyKQorCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PU0Vycm9yLAorCQkJCQkgICAgInBlcmY6IGNhbid0IHBhcnNlIHNhbXBsZSwgZXJyPSVkIiwgZXJyKTsKIAkJcmV0dXJuIHB5ZXZlbnQ7CiAJfQotZW5kOgorCiAJUHlfSU5DUkVGKFB5X05vbmUpOwogCXJldHVybiBQeV9Ob25lOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKaW5kZXggNjQ1MDBmYy4uZjVhOGZiZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYworKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCkBAIC01OCw2ICs1OCwxNiBAQAogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKKwlpZiAoIXBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfdHlwZShzZWxmLT5ldmxpc3QpKSB7CisJCXByX2Vycigibm9uIG1hdGNoaW5nIHNhbXBsZV90eXBlIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmICghcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV9pZF9hbGwoc2VsZi0+ZXZsaXN0KSkgeworCQlwcl9lcnIoIm5vbiBtYXRjaGluZyBzYW1wbGVfaWRfYWxsIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKwogCXNlbGYtPnNpemUgPSBpbnB1dF9zdGF0LnN0X3NpemU7CiAJcmV0dXJuIDA7CiAKQEAgLTk3LDcgKzEwNyw3IEBACiB2b2lkIHBlcmZfc2Vzc2lvbl9fdXBkYXRlX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpCiB7CiAJc2VsZi0+c2FtcGxlX3R5cGUgPSBwZXJmX2V2bGlzdF9fc2FtcGxlX3R5cGUoc2VsZi0+ZXZsaXN0KTsKLQlzZWxmLT5zYW1wbGVfc2l6ZSA9IHBlcmZfc2FtcGxlX3NpemUoc2VsZi0+c2FtcGxlX3R5cGUpOworCXNlbGYtPnNhbXBsZV9zaXplID0gX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZShzZWxmLT5zYW1wbGVfdHlwZSk7CiAJc2VsZi0+c2FtcGxlX2lkX2FsbCA9IHBlcmZfZXZsaXN0X19zYW1wbGVfaWRfYWxsKHNlbGYtPmV2bGlzdCk7CiAJcGVyZl9zZXNzaW9uX19pZF9oZWFkZXJfc2l6ZShzZWxmKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggMWU4ODQ4NS4uMGE3ZWQ1YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKQEAgLTIxODcsNiArMjE4Nyw3IEBACiAJeyAiVEFTS0xFVF9TT0ZUSVJRIiwgNiB9LAogCXsgIlNDSEVEX1NPRlRJUlEiLCA3IH0sCiAJeyAiSFJUSU1FUl9TT0ZUSVJRIiwgOCB9LAorCXsgIlJDVV9TT0ZUSVJRIiwgOSB9LAogCiAJeyAiSFJUSU1FUl9OT1JFU1RBUlQiLCAwIH0sCiAJeyAiSFJUSU1FUl9SRVNUQVJUIiwgMSB9LApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbCBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwKaW5kZXggMWZkMjliMi4uY2VmMjhlNiAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbAorKysgYi90b29scy90ZXN0aW5nL2t0ZXN0L2t0ZXN0LnBsCkBAIC03ODgsNyArNzg4LDcgQEAKIAogc3ViIHJlYm9vdF90byB7CiAgICAgaWYgKCRyZWJvb3RfdHlwZSBlcSAiZ3J1YiIpIHsKLQlydW5fc3NoICInKGVjaG8gXCJzYXZlZGVmYXVsdCAtLWRlZmF1bHQ9JGdydWJfbnVtYmVyIC0tb25jZVwiIHwgZ3J1YiAtLWJhdGNoOyByZWJvb3QpJyI7CisJcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaCAmJiByZWJvb3QpJyI7CiAJcmV0dXJuOwogICAgIH0KIApAQCAtMTQ4MCw3ICsxNDgwLDcgQEAKIAlvciBkb2RpZSAiRmFpbGVkIHRvIHJlYWQgJGNvbmZpZyI7CiAKICAgICB3aGlsZSAoPElOPikgewotCWlmICgvXiguKj8oQ09ORklHXFMqKSg9Lip8IGlzIG5vdCBzZXQpKS8pIHsKKwlpZiAoL14oKENPTkZJR1xTKik9LiopLykgewogCSAgICAkY29uZmlnX2lnbm9yZXskMn0gPSAkMTsKIAl9CiAgICAgfQpAQCAtMTYzOCw3ICsxNjM4LDcgQEAKIAlpZiAoISRmb3VuZCkgewogCSAgICAjIHRyeSB0aGUgb3RoZXIgaGFsZgogCSAgICBkb3ByaW50ICJUb3AgaGFsZiBwcm9kdWNlZCBubyBzZXQgY29uZmlncywgdHJ5aW5nIGJvdHRvbSBoYWxmXG4iOwotCSAgICBAdG9waGFsZiA9IEBzdGFydF9saXN0WyRoYWxmIC4uICQjc3RhcnRfbGlzdF07CisJICAgIEB0b3BoYWxmID0gQHN0YXJ0X2xpc3RbJGhhbGYgKyAxIC4uICQjc3RhcnRfbGlzdF07CiAJICAgIGNyZWF0ZV9jb25maWcgQHRvcGhhbGY7CiAJICAgIHJlYWRfY3VycmVudF9jb25maWcgXCVjdXJyZW50X2NvbmZpZzsKIAkgICAgZm9yZWFjaCBteSAkY29uZmlnIChAdG9waGFsZikgewpAQCAtMTY5MCw3ICsxNjkwLDcgQEAKIAkjIHJlbW92ZSBoYWxmIHRoZSBjb25maWdzIHdlIGFyZSBsb29raW5nIGF0IGFuZCBzZWUgaWYKIAkjIHRoZXkgYXJlIGdvb2QuCiAJJGhhbGYgPSBpbnQoJCNzdGFydF9saXN0IC8gMik7Ci0gICAgfSB3aGlsZSAoJGhhbGYgPiAwKTsKKyAgICB9IHdoaWxlICgkI3N0YXJ0X2xpc3QgPiAwKTsKIAogICAgICMgd2UgZm91bmQgYSBzaW5nbGUgY29uZmlnLCB0cnkgaXQgYWdhaW4gdW5sZXNzIHdlIGFyZSBydW5uaW5nIG1hbnVhbGx5CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZpcnRpby92aXJ0aW9fdGVzdC5jIGIvdG9vbHMvdmlydGlvL3ZpcnRpb190ZXN0LmMKaW5kZXggZGYwYzZkMi4uNzRkMzMzMSAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL3ZpcnRpb190ZXN0LmMKKysrIGIvdG9vbHMvdmlydGlvL3ZpcnRpb190ZXN0LmMKQEAgLTE5OCw2ICsxOTgsMTQgQEAKIAkJLnZhbCA9ICdoJywKIAl9LAogCXsKKwkJLm5hbWUgPSAiZXZlbnQtaWR4IiwKKwkJLnZhbCA9ICdFJywKKwl9LAorCXsKKwkJLm5hbWUgPSAibm8tZXZlbnQtaWR4IiwKKwkJLnZhbCA9ICdlJywKKwl9LAorCXsKIAkJLm5hbWUgPSAiaW5kaXJlY3QiLAogCQkudmFsID0gJ0knLAogCX0sCkBAIC0yMTEsMTMgKzIxOSwxNyBAQAogCiBzdGF0aWMgdm9pZCBoZWxwKCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB2aXJ0aW9fdGVzdCBbLS1oZWxwXSBbLS1uby1pbmRpcmVjdF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHZpcnRpb190ZXN0IFstLWhlbHBdIgorCQkiIFstLW5vLWluZGlyZWN0XSIKKwkJIiBbLS1uby1ldmVudC1pZHhdIgorCQkiXG4iKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXN0cnVjdCB2ZGV2X2luZm8gZGV2OwotCXVuc2lnbmVkIGxvbmcgbG9uZyBmZWF0dXJlcyA9IDFVTEwgPDwgVklSVElPX1JJTkdfRl9JTkRJUkVDVF9ERVNDOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmZWF0dXJlcyA9ICgxVUxMIDw8IFZJUlRJT19SSU5HX0ZfSU5ESVJFQ1RfREVTQykgfAorCQkoMVVMTCA8PCBWSVJUSU9fUklOR19GX0VWRU5UX0lEWCk7CiAJaW50IG87CiAKIAlmb3IgKDs7KSB7CkBAIC0yMjgsNiArMjQwLDkgQEAKIAkJY2FzZSAnPyc6CiAJCQloZWxwKCk7CiAJCQlleGl0KDIpOworCQljYXNlICdlJzoKKwkJCWZlYXR1cmVzICY9IH4oMVVMTCA8PCBWSVJUSU9fUklOR19GX0VWRU5UX0lEWCk7CisJCQlicmVhazsKIAkJY2FzZSAnaCc6CiAJCQloZWxwKCk7CiAJCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCAyMmNkYjk2Li45NmViYzA2IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTQ2NywxMiArNDY3LDggQEAKIAkJaWYgKCFrdm0tPmJ1c2VzW2ldKQogCQkJZ290byBvdXRfZXJyOwogCX0KKwogCXNwaW5fbG9ja19pbml0KCZrdm0tPm1tdV9sb2NrKTsKLQotCXIgPSBrdm1faW5pdF9tbXVfbm90aWZpZXIoa3ZtKTsKLQlpZiAocikKLQkJZ290byBvdXRfZXJyOwotCiAJa3ZtLT5tbSA9IGN1cnJlbnQtPm1tOwogCWF0b21pY19pbmMoJmt2bS0+bW0tPm1tX2NvdW50KTsKIAlrdm1fZXZlbnRmZF9pbml0KGt2bSk7CkBAIC00ODAsNiArNDc2LDExIEBACiAJbXV0ZXhfaW5pdCgma3ZtLT5pcnFfbG9jayk7CiAJbXV0ZXhfaW5pdCgma3ZtLT5zbG90c19sb2NrKTsKIAlhdG9taWNfc2V0KCZrdm0tPnVzZXJzX2NvdW50LCAxKTsKKworCXIgPSBrdm1faW5pdF9tbXVfbm90aWZpZXIoa3ZtKTsKKwlpZiAocikKKwkJZ290byBvdXRfZXJyOworCiAJcmF3X3NwaW5fbG9jaygma3ZtX2xvY2spOwogCWxpc3RfYWRkKCZrdm0tPnZtX2xpc3QsICZ2bV9saXN0KTsKIAlyYXdfc3Bpbl91bmxvY2soJmt2bV9sb2NrKTsKQEAgLTY1MSw3ICs2NTIsOSBAQAogCS8qIFdlIGNhbiByZWFkIHRoZSBndWVzdCBtZW1vcnkgd2l0aCBfX3h4eF91c2VyKCkgbGF0ZXIgb24uICovCiAJaWYgKHVzZXJfYWxsb2MgJiYKIAkgICAgKChtZW0tPnVzZXJzcGFjZV9hZGRyICYgKFBBR0VfU0laRSAtIDEpKSB8fAotCSAgICAgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG1lbS0+dXNlcnNwYWNlX2FkZHIsIG1lbS0+bWVtb3J5X3NpemUpKSkKKwkgICAgICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLAorCQkJKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpbWVtLT51c2Vyc3BhY2VfYWRkciwKKwkJCW1lbS0+bWVtb3J5X3NpemUpKSkKIAkJZ290byBvdXQ7CiAJaWYgKG1lbS0+c2xvdCA+PSBLVk1fTUVNT1JZX1NMT1RTICsgS1ZNX1BSSVZBVEVfTUVNX1NMT1RTKQogCQlnb3RvIG91dDsK